Subversion Repositories HelenOS

Rev

Rev 4532 | Rev 4557 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4532 Rev 4545
Line 70... Line 70...
70
 
70
 
71
static disk_t disk[MAX_DISKS];
71
static disk_t disk[MAX_DISKS];
72
 
72
 
73
static int ata_bd_init(void);
73
static int ata_bd_init(void);
74
static void ata_bd_connection(ipc_callid_t iid, ipc_call_t *icall);
74
static void ata_bd_connection(ipc_callid_t iid, ipc_call_t *icall);
75
static int ata_bd_rdwr(int disk_id, ipcarg_t method, off_t offset, off_t size,
75
static int ata_bd_rdwr(int disk_id, ipcarg_t method, off_t offset, size_t size,
76
    void *buf);
76
    void *buf);
77
static int ata_bd_read_block(int disk_id, uint64_t blk_idx, size_t blk_cnt,
77
static int ata_bd_read_block(int disk_id, uint64_t blk_idx, size_t blk_cnt,
78
    void *buf);
78
    void *buf);
79
static int ata_bd_write_block(int disk_id, uint64_t blk_idx, size_t blk_cnt,
79
static int ata_bd_write_block(int disk_id, uint64_t blk_idx, size_t blk_cnt,
80
    const void *buf);
80
    const void *buf);
Line 144... Line 144...
144
 
144
 
145
static int drive_identify(int disk_id, disk_t *d)
145
static int drive_identify(int disk_id, disk_t *d)
146
{
146
{
147
    uint16_t data;
147
    uint16_t data;
148
    uint8_t status;
148
    uint8_t status;
149
    int i;
149
    size_t i;
150
 
150
 
151
    printf("Identify drive %d\n", disk_id);
151
    printf("Identify drive %d\n", disk_id);
152
    pio_write_8(&cmd->drive_head, ((disk_id != 0) ? DHR_DRV : 0));
152
    pio_write_8(&cmd->drive_head, ((disk_id != 0) ? DHR_DRV : 0));
153
    async_usleep(100);
153
    async_usleep(100);
154
    pio_write_8(&cmd->command, CMD_IDENTIFY_DRIVE);
154
    pio_write_8(&cmd->command, CMD_IDENTIFY_DRIVE);
Line 232... Line 232...
232
    ipcarg_t method;
232
    ipcarg_t method;
233
    dev_handle_t dh;
233
    dev_handle_t dh;
234
    int flags;
234
    int flags;
235
    int retval;
235
    int retval;
236
    off_t idx;
236
    off_t idx;
237
    off_t size;
237
    size_t size;
238
    int disk_id, i;
238
    int disk_id, i;
239
 
239
 
240
    /* Get the device handle. */
240
    /* Get the device handle. */
241
    dh = IPC_GET_ARG1(*icall);
241
    dh = IPC_GET_ARG1(*icall);
242
 
242
 
Line 292... Line 292...
292
        }
292
        }
293
        ipc_answer_0(callid, retval);
293
        ipc_answer_0(callid, retval);
294
    }
294
    }
295
}
295
}
296
 
296
 
297
static int ata_bd_rdwr(int disk_id, ipcarg_t method, off_t blk_idx, off_t size,
297
static int ata_bd_rdwr(int disk_id, ipcarg_t method, off_t blk_idx, size_t size,
298
    void *buf)
298
    void *buf)
299
{
299
{
300
    int rc;
300
    int rc;
301
    off_t now;
301
    size_t now;
302
 
302
 
303
    while (size > 0) {
303
    while (size > 0) {
304
        now = size < block_size ? size : (off_t) block_size;
304
        now = size < block_size ? size : block_size;
305
        if (now != block_size)
305
        if (now != block_size)
306
            return EINVAL;
306
            return EINVAL;
307
 
307
 
308
        if (method == BD_READ_BLOCK)
308
        if (method == BD_READ_BLOCK)
309
            rc = ata_bd_read_block(disk_id, blk_idx, 1, buf);
309
            rc = ata_bd_read_block(disk_id, blk_idx, 1, buf);