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); |