Changeset 03362fbd in mainline for uspace/srv/bd/ata_bd/ata_bd.c
- Timestamp:
- 2013-02-09T23:14:45Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 22dfd38
- Parents:
- b5d2e57 (diff), 005b765 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - File:
-
- 1 edited
-
uspace/srv/bd/ata_bd/ata_bd.c (modified) (49 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/ata_bd/ata_bd.c
rb5d2e57 r03362fbd 49 49 50 50 #include <stdio.h> 51 #include <libarch/ddi.h>52 51 #include <ddi.h> 53 #include <ipc/bd.h>54 52 #include <async.h> 55 53 #include <as.h> 54 #include <bd_srv.h> 56 55 #include <fibril_synch.h> 57 56 #include <stdint.h> … … 61 60 #include <inttypes.h> 62 61 #include <errno.h> 63 #include < bool.h>62 #include <stdbool.h> 64 63 #include <byteorder.h> 65 64 #include <task.h> … … 98 97 99 98 /** Per-disk state. */ 100 static disk_t disk[MAX_DISKS];99 static disk_t ata_disk[MAX_DISKS]; 101 100 102 101 static void print_syntax(void); 103 102 static int ata_bd_init(void); 104 103 static void ata_bd_connection(ipc_callid_t iid, ipc_call_t *icall, void *); 105 static int ata_bd_read_blocks(int disk_id, uint64_t ba, size_t cnt, 104 105 static int ata_bd_open(bd_srvs_t *, bd_srv_t *); 106 static int ata_bd_close(bd_srv_t *); 107 static int ata_bd_read_blocks(bd_srv_t *, uint64_t ba, size_t cnt, void *buf, 108 size_t); 109 static int ata_bd_read_toc(bd_srv_t *, uint8_t session, void *buf, size_t); 110 static int ata_bd_write_blocks(bd_srv_t *, uint64_t ba, size_t cnt, 111 const void *buf, size_t); 112 static int ata_bd_get_block_size(bd_srv_t *, size_t *); 113 static int ata_bd_get_num_blocks(bd_srv_t *, aoff64_t *); 114 115 static int ata_rcmd_read(disk_t *disk, uint64_t ba, size_t cnt, 106 116 void *buf); 107 static int ata_bd_write_blocks(int disk_id, uint64_t ba, size_t cnt, 108 const void *buf); 109 static int ata_rcmd_read(int disk_id, uint64_t ba, size_t cnt, 110 void *buf); 111 static int ata_rcmd_write(int disk_id, uint64_t ba, size_t cnt, 117 static int ata_rcmd_write(disk_t *disk, uint64_t ba, size_t cnt, 112 118 const void *buf); 113 119 static int disk_init(disk_t *d, int disk_id); 114 static int drive_identify( int drive_id, void *buf);115 static int identify_pkt_dev( int dev_idx, void *buf);116 static int ata_cmd_packet( int dev_idx, const void *cpkt, size_t cpkt_size,120 static int drive_identify(disk_t *disk, void *buf); 121 static int identify_pkt_dev(disk_t *disk, void *buf); 122 static int ata_cmd_packet(disk_t *disk, const void *cpkt, size_t cpkt_size, 117 123 void *obuf, size_t obuf_size); 118 static int ata_pcmd_inquiry( int dev_idx, void *obuf, size_t obuf_size);119 static int ata_pcmd_read_12( int dev_idx, uint64_t ba, size_t cnt,124 static int ata_pcmd_inquiry(disk_t *disk, void *obuf, size_t obuf_size); 125 static int ata_pcmd_read_12(disk_t *disk, uint64_t ba, size_t cnt, 120 126 void *obuf, size_t obuf_size); 121 static int ata_pcmd_read_toc( int dev_idx, uint8_t ses,127 static int ata_pcmd_read_toc(disk_t *disk, uint8_t ses, 122 128 void *obuf, size_t obuf_size); 123 129 static void disk_print_summary(disk_t *d); … … 126 132 static int wait_status(unsigned set, unsigned n_reset, uint8_t *pstatus, 127 133 unsigned timeout); 134 135 static bd_ops_t ata_bd_ops = { 136 .open = ata_bd_open, 137 .close = ata_bd_close, 138 .read_blocks = ata_bd_read_blocks, 139 .read_toc = ata_bd_read_toc, 140 .write_blocks = ata_bd_write_blocks, 141 .get_block_size = ata_bd_get_block_size, 142 .get_num_blocks = ata_bd_get_num_blocks 143 }; 144 145 static disk_t *bd_srv_disk(bd_srv_t *bd) 146 { 147 return (disk_t *)bd->srvs->sarg; 148 } 149 150 static int disk_dev_idx(disk_t *disk) 151 { 152 return (disk->disk_id & 1); 153 } 128 154 129 155 int main(int argc, char **argv) … … 161 187 fflush(stdout); 162 188 163 rc = disk_init(& disk[i], i);189 rc = disk_init(&ata_disk[i], i); 164 190 165 191 if (rc == EOK) { 166 disk_print_summary(& disk[i]);192 disk_print_summary(&ata_disk[i]); 167 193 } else { 168 194 printf("Not found.\n"); … … 174 200 for (i = 0; i < MAX_DISKS; i++) { 175 201 /* Skip unattached drives. */ 176 if ( disk[i].present == false)202 if (ata_disk[i].present == false) 177 203 continue; 178 204 179 205 snprintf(name, 16, "%s/ata%udisk%d", NAMESPACE, ctl_num, i); 180 rc = loc_service_register(name, & disk[i].service_id);206 rc = loc_service_register(name, &ata_disk[i].service_id); 181 207 if (rc != EOK) { 182 208 printf(NAME ": Unable to register device %s.\n", name); … … 217 243 case am_chs: 218 244 printf("CHS %u cylinders, %u heads, %u sectors", 219 d isk->geom.cylinders, disk->geom.heads,220 d isk->geom.sectors);245 d->geom.cylinders, d->geom.heads, 246 d->geom.sectors); 221 247 break; 222 248 case am_lba28: … … 273 299 static void ata_bd_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg) 274 300 { 275 void *fs_va = NULL;276 ipc_callid_t callid;277 ipc_call_t call;278 sysarg_t method;279 301 service_id_t dsid; 280 size_t comm_size; /**< Size of the communication area. */ 281 unsigned int flags; 282 int retval; 283 uint64_t ba; 284 size_t cnt; 285 int disk_id, i; 302 int i; 303 disk_t *disk; 286 304 287 305 /* Get the device service ID. */ … … 289 307 290 308 /* Determine which disk device is the client connecting to. */ 291 disk _id = -1;309 disk = NULL; 292 310 for (i = 0; i < MAX_DISKS; i++) 293 if ( disk[i].service_id == dsid)294 disk _id = i;295 296 if (disk _id < 0 || disk[disk_id].present == false) {311 if (ata_disk[i].service_id == dsid) 312 disk = &ata_disk[i]; 313 314 if (disk == NULL || disk->present == false) { 297 315 async_answer_0(iid, EINVAL); 298 316 return; 299 317 } 300 318 301 /* Answer the IPC_M_CONNECT_ME_TO call. */ 302 async_answer_0(iid, EOK); 303 304 if (!async_share_out_receive(&callid, &comm_size, &flags)) { 305 async_answer_0(callid, EHANGUP); 306 return; 307 } 308 309 (void) async_share_out_finalize(callid, &fs_va); 310 if (fs_va == AS_MAP_FAILED) { 311 async_answer_0(callid, EHANGUP); 312 return; 313 } 314 315 while (true) { 316 callid = async_get_call(&call); 317 method = IPC_GET_IMETHOD(call); 318 319 if (!method) { 320 /* The other side has hung up. */ 321 async_answer_0(callid, EOK); 322 return; 323 } 324 325 switch (method) { 326 case BD_READ_BLOCKS: 327 ba = MERGE_LOUP32(IPC_GET_ARG1(call), 328 IPC_GET_ARG2(call)); 329 cnt = IPC_GET_ARG3(call); 330 if (cnt * disk[disk_id].block_size > comm_size) { 331 retval = ELIMIT; 332 break; 333 } 334 retval = ata_bd_read_blocks(disk_id, ba, cnt, fs_va); 335 break; 336 case BD_WRITE_BLOCKS: 337 ba = MERGE_LOUP32(IPC_GET_ARG1(call), 338 IPC_GET_ARG2(call)); 339 cnt = IPC_GET_ARG3(call); 340 if (cnt * disk[disk_id].block_size > comm_size) { 341 retval = ELIMIT; 342 break; 343 } 344 retval = ata_bd_write_blocks(disk_id, ba, cnt, fs_va); 345 break; 346 case BD_GET_BLOCK_SIZE: 347 async_answer_1(callid, EOK, disk[disk_id].block_size); 348 continue; 349 case BD_GET_NUM_BLOCKS: 350 async_answer_2(callid, EOK, LOWER32(disk[disk_id].blocks), 351 UPPER32(disk[disk_id].blocks)); 352 continue; 353 case BD_READ_TOC: 354 cnt = IPC_GET_ARG1(call); 355 if (disk[disk_id].dev_type == ata_pkt_dev) 356 retval = ata_pcmd_read_toc(disk_id, cnt, fs_va, 357 disk[disk_id].block_size); 358 else 359 retval = EINVAL; 360 break; 361 default: 362 retval = EINVAL; 363 break; 364 } 365 async_answer_0(callid, retval); 366 } 319 bd_conn(iid, icall, &disk->bds); 367 320 } 368 321 … … 384 337 unsigned i; 385 338 339 d->disk_id = disk_id; 386 340 d->present = false; 387 341 fibril_mutex_initialize(&d->lock); 388 342 343 bd_srvs_init(&d->bds); 344 d->bds.ops = &ata_bd_ops; 345 d->bds.sarg = d; 346 389 347 /* Try identify command. */ 390 rc = drive_identify(d isk_id, &idata);348 rc = drive_identify(d, &idata); 391 349 if (rc == EOK) { 392 350 /* Success. It's a register (non-packet) device. */ … … 408 366 409 367 if (bc == PDEV_SIGNATURE_BC) { 410 rc = identify_pkt_dev(d isk_id, &idata);368 rc = identify_pkt_dev(d, &idata); 411 369 if (rc == EOK) { 412 370 /* We have a packet device. */ … … 492 450 if (d->dev_type == ata_pkt_dev) { 493 451 /* Send inquiry. */ 494 rc = ata_pcmd_inquiry( 0, &inq_data, sizeof(inq_data));452 rc = ata_pcmd_inquiry(d, &inq_data, sizeof(inq_data)); 495 453 if (rc != EOK) { 496 454 printf("Device inquiry failed.\n"); … … 514 472 } 515 473 474 static int ata_bd_open(bd_srvs_t *bds, bd_srv_t *bd) 475 { 476 return EOK; 477 } 478 479 static int ata_bd_close(bd_srv_t *bd) 480 { 481 return EOK; 482 } 483 516 484 /** Read multiple blocks from the device. */ 517 static int ata_bd_read_blocks(int disk_id, uint64_t ba, size_t cnt, 518 void *buf) { 519 485 static int ata_bd_read_blocks(bd_srv_t *bd, uint64_t ba, size_t cnt, 486 void *buf, size_t size) 487 { 488 disk_t *disk = bd_srv_disk(bd); 520 489 int rc; 521 490 491 if (size < cnt * disk->block_size) 492 return EINVAL; 493 522 494 while (cnt > 0) { 523 if (disk[disk_id].dev_type == ata_reg_dev) 524 rc = ata_rcmd_read(disk_id, ba, 1, buf); 525 else 526 rc = ata_pcmd_read_12(disk_id, ba, 1, buf, 527 disk[disk_id].block_size); 495 if (disk->dev_type == ata_reg_dev) { 496 rc = ata_rcmd_read(disk, ba, 1, buf); 497 } else { 498 rc = ata_pcmd_read_12(disk, ba, 1, buf, 499 disk->block_size); 500 } 528 501 529 502 if (rc != EOK) … … 532 505 ++ba; 533 506 --cnt; 534 buf += disk[disk_id].block_size; 535 } 536 537 return EOK; 507 buf += disk->block_size; 508 } 509 510 return EOK; 511 } 512 513 /** Read TOC from device. */ 514 static int ata_bd_read_toc(bd_srv_t *bd, uint8_t session, void *buf, size_t size) 515 { 516 disk_t *disk = bd_srv_disk(bd); 517 518 return ata_pcmd_read_toc(disk, session, buf, size); 538 519 } 539 520 540 521 /** Write multiple blocks to the device. */ 541 static int ata_bd_write_blocks(int disk_id, uint64_t ba, size_t cnt, 542 const void *buf) { 543 522 static int ata_bd_write_blocks(bd_srv_t *bd, uint64_t ba, size_t cnt, 523 const void *buf, size_t size) 524 { 525 disk_t *disk = bd_srv_disk(bd); 544 526 int rc; 545 527 546 if (disk [disk_id].dev_type != ata_reg_dev)528 if (disk->dev_type != ata_reg_dev) 547 529 return ENOTSUP; 548 530 531 if (size < cnt * disk->block_size) 532 return EINVAL; 533 549 534 while (cnt > 0) { 550 rc = ata_rcmd_write(disk _id, ba, 1, buf);535 rc = ata_rcmd_write(disk, ba, 1, buf); 551 536 if (rc != EOK) 552 537 return rc; … … 554 539 ++ba; 555 540 --cnt; 556 buf += disk[disk_id].block_size; 557 } 558 541 buf += disk->block_size; 542 } 543 544 return EOK; 545 } 546 547 /** Get device block size. */ 548 static int ata_bd_get_block_size(bd_srv_t *bd, size_t *rbsize) 549 { 550 disk_t *disk = bd_srv_disk(bd); 551 552 *rbsize = disk->block_size; 553 return EOK; 554 } 555 556 /** Get device number of blocks. */ 557 static int ata_bd_get_num_blocks(bd_srv_t *bd, aoff64_t *rnb) 558 { 559 disk_t *disk = bd_srv_disk(bd); 560 561 *rnb = disk->blocks; 559 562 return EOK; 560 563 } … … 565 568 * whether an ATA device is present and if so, to determine its parameters. 566 569 * 567 * @param disk _id Device ID, 0 or 1.570 * @param disk Disk 568 571 * @param buf Pointer to a 512-byte buffer. 569 572 * … … 571 574 * not present). EIO if device responds with error. 572 575 */ 573 static int drive_identify( int disk_id, void *buf)576 static int drive_identify(disk_t *disk, void *buf) 574 577 { 575 578 uint16_t data; … … 578 581 size_t i; 579 582 580 drv_head = ((disk_ id!= 0) ? DHR_DRV : 0);583 drv_head = ((disk_dev_idx(disk) != 0) ? DHR_DRV : 0); 581 584 582 585 if (wait_status(0, ~SR_BSY, NULL, TIMEOUT_PROBE) != EOK) … … 624 627 * whether an ATAPI device is present and if so, to determine its parameters. 625 628 * 626 * @param d ev_idx Device index, 0 or 1.629 * @param disk Disk 627 630 * @param buf Pointer to a 512-byte buffer. 628 631 */ 629 static int identify_pkt_dev( int dev_idx, void *buf)632 static int identify_pkt_dev(disk_t *disk, void *buf) 630 633 { 631 634 uint16_t data; … … 634 637 size_t i; 635 638 636 drv_head = ((d ev_idx!= 0) ? DHR_DRV : 0);639 drv_head = ((disk_dev_idx(disk) != 0) ? DHR_DRV : 0); 637 640 638 641 if (wait_status(0, ~SR_BSY, NULL, TIMEOUT_PROBE) != EOK) … … 669 672 * Only data-in commands are supported (e.g. inquiry, read). 670 673 * 671 * @param d ev_idx Device index (0 or 1)674 * @param disk Disk 672 675 * @param obuf Buffer for storing data read from device 673 676 * @param obuf_size Size of obuf in bytes … … 675 678 * @return EOK on success, EIO on error. 676 679 */ 677 static int ata_cmd_packet( int dev_idx, const void *cpkt, size_t cpkt_size,680 static int ata_cmd_packet(disk_t *disk, const void *cpkt, size_t cpkt_size, 678 681 void *obuf, size_t obuf_size) 679 682 { … … 681 684 uint8_t status; 682 685 uint8_t drv_head; 683 disk_t *d;684 686 size_t data_size; 685 687 uint16_t val; 686 688 687 d = &disk[dev_idx]; 688 fibril_mutex_lock(&d->lock); 689 fibril_mutex_lock(&disk->lock); 689 690 690 691 /* New value for Drive/Head register */ 691 692 drv_head = 692 ((d ev_idx!= 0) ? DHR_DRV : 0);693 ((disk_dev_idx(disk) != 0) ? DHR_DRV : 0); 693 694 694 695 if (wait_status(0, ~SR_BSY, NULL, TIMEOUT_PROBE) != EOK) { 695 fibril_mutex_unlock(&d ->lock);696 fibril_mutex_unlock(&disk->lock); 696 697 return EIO; 697 698 } … … 700 701 701 702 if (wait_status(0, ~(SR_BSY|SR_DRQ), NULL, TIMEOUT_BSY) != EOK) { 702 fibril_mutex_unlock(&d ->lock);703 fibril_mutex_unlock(&disk->lock); 703 704 return EIO; 704 705 } … … 711 712 712 713 if (wait_status(SR_DRQ, ~SR_BSY, &status, TIMEOUT_BSY) != EOK) { 713 fibril_mutex_unlock(&d ->lock);714 fibril_mutex_unlock(&disk->lock); 714 715 return EIO; 715 716 } … … 720 721 721 722 if (wait_status(0, ~SR_BSY, &status, TIMEOUT_BSY) != EOK) { 722 fibril_mutex_unlock(&d ->lock);723 fibril_mutex_unlock(&disk->lock); 723 724 return EIO; 724 725 } 725 726 726 727 if ((status & SR_DRQ) == 0) { 727 fibril_mutex_unlock(&d ->lock);728 fibril_mutex_unlock(&disk->lock); 728 729 return EIO; 729 730 } … … 736 737 if (data_size > obuf_size) { 737 738 /* Output buffer is too small to store data. */ 738 fibril_mutex_unlock(&d ->lock);739 fibril_mutex_unlock(&disk->lock); 739 740 return EIO; 740 741 } … … 747 748 748 749 if (status & SR_ERR) { 749 fibril_mutex_unlock(&d ->lock);750 return EIO; 751 } 752 753 fibril_mutex_unlock(&d ->lock);750 fibril_mutex_unlock(&disk->lock); 751 return EIO; 752 } 753 754 fibril_mutex_unlock(&disk->lock); 754 755 755 756 return EOK; … … 758 759 /** Issue ATAPI Inquiry. 759 760 * 760 * @param d ev_idx Device index (0 or 1)761 * @param disk Disk 761 762 * @param obuf Buffer for storing inquiry data read from device 762 763 * @param obuf_size Size of obuf in bytes … … 764 765 * @return EOK on success, EIO on error. 765 766 */ 766 static int ata_pcmd_inquiry( int dev_idx, void *obuf, size_t obuf_size)767 static int ata_pcmd_inquiry(disk_t *disk, void *obuf, size_t obuf_size) 767 768 { 768 769 ata_pcmd_inquiry_t cp; … … 774 775 cp.alloc_len = min(obuf_size, 0xff); /* Allocation length */ 775 776 776 rc = ata_cmd_packet( 0, &cp, sizeof(cp), obuf, obuf_size);777 rc = ata_cmd_packet(disk, &cp, sizeof(cp), obuf, obuf_size); 777 778 if (rc != EOK) 778 779 return rc; … … 786 787 * function will fail. 787 788 * 788 * @param d ev_idx Device index (0 or 1)789 * @param disk Disk 789 790 * @param ba Starting block address 790 791 * @param cnt Number of blocks to read … … 794 795 * @return EOK on success, EIO on error. 795 796 */ 796 static int ata_pcmd_read_12( int dev_idx, uint64_t ba, size_t cnt,797 static int ata_pcmd_read_12(disk_t *disk, uint64_t ba, size_t cnt, 797 798 void *obuf, size_t obuf_size) 798 799 { … … 809 810 cp.nblocks = host2uint32_t_be(cnt); 810 811 811 rc = ata_cmd_packet( 0, &cp, sizeof(cp), obuf, obuf_size);812 rc = ata_cmd_packet(disk, &cp, sizeof(cp), obuf, obuf_size); 812 813 if (rc != EOK) 813 814 return rc; … … 826 827 * function will fail. 827 828 * 828 * @param d ev_idx Device index (0 or 1)829 * @param disk Disk 829 830 * @param session Starting session 830 831 * @param obuf Buffer for storing inquiry data read from device … … 833 834 * @return EOK on success, EIO on error. 834 835 */ 835 static int ata_pcmd_read_toc( int dev_idx, uint8_t session, void *obuf,836 static int ata_pcmd_read_toc(disk_t *disk, uint8_t session, void *obuf, 836 837 size_t obuf_size) 837 838 { … … 857 858 /** Read a physical from the device. 858 859 * 859 * @param disk _id Device index (0 or 1)860 * @param disk Disk 860 861 * @param ba Address the first block. 861 862 * @param cnt Number of blocks to transfer. … … 864 865 * @return EOK on success, EIO on error. 865 866 */ 866 static int ata_rcmd_read( int disk_id, uint64_t ba, size_t blk_cnt,867 static int ata_rcmd_read(disk_t *disk, uint64_t ba, size_t blk_cnt, 867 868 void *buf) 868 869 { … … 871 872 uint8_t status; 872 873 uint8_t drv_head; 873 disk_t *d;874 874 block_coord_t bc; 875 875 876 d = &disk[disk_id];877 878 876 /* Silence warning. */ 879 877 memset(&bc, 0, sizeof(bc)); 880 878 881 879 /* Compute block coordinates. */ 882 if (coord_calc(d , ba, &bc) != EOK)880 if (coord_calc(disk, ba, &bc) != EOK) 883 881 return EINVAL; 884 882 885 883 /* New value for Drive/Head register */ 886 884 drv_head = 887 ((disk_ id!= 0) ? DHR_DRV : 0) |888 ((d ->amode != am_chs) ? DHR_LBA : 0) |885 ((disk_dev_idx(disk) != 0) ? DHR_DRV : 0) | 886 ((disk->amode != am_chs) ? DHR_LBA : 0) | 889 887 (bc.h & 0x0f); 890 888 891 fibril_mutex_lock(&d ->lock);889 fibril_mutex_lock(&disk->lock); 892 890 893 891 /* Program a Read Sectors operation. */ 894 892 895 893 if (wait_status(0, ~SR_BSY, NULL, TIMEOUT_BSY) != EOK) { 896 fibril_mutex_unlock(&d ->lock);894 fibril_mutex_unlock(&disk->lock); 897 895 return EIO; 898 896 } … … 901 899 902 900 if (wait_status(SR_DRDY, ~SR_BSY, NULL, TIMEOUT_DRDY) != EOK) { 903 fibril_mutex_unlock(&d ->lock);901 fibril_mutex_unlock(&disk->lock); 904 902 return EIO; 905 903 } … … 908 906 coord_sc_program(&bc, 1); 909 907 910 pio_write_8(&cmd->command, d ->amode == am_lba48 ?908 pio_write_8(&cmd->command, disk->amode == am_lba48 ? 911 909 CMD_READ_SECTORS_EXT : CMD_READ_SECTORS); 912 910 913 911 if (wait_status(0, ~SR_BSY, &status, TIMEOUT_BSY) != EOK) { 914 fibril_mutex_unlock(&d ->lock);912 fibril_mutex_unlock(&disk->lock); 915 913 return EIO; 916 914 } … … 919 917 /* Read data from the device buffer. */ 920 918 921 for (i = 0; i < disk [disk_id].block_size / 2; i++) {919 for (i = 0; i < disk->block_size / 2; i++) { 922 920 data = pio_read_16(&cmd->data_port); 923 921 ((uint16_t *) buf)[i] = data; … … 928 926 return EIO; 929 927 930 fibril_mutex_unlock(&d ->lock);928 fibril_mutex_unlock(&disk->lock); 931 929 return EOK; 932 930 } … … 934 932 /** Write a physical block to the device. 935 933 * 936 * @param disk _id Device index (0 or 1)934 * @param disk Disk 937 935 * @param ba Address of the first block. 938 936 * @param cnt Number of blocks to transfer. … … 941 939 * @return EOK on success, EIO on error. 942 940 */ 943 static int ata_rcmd_write( int disk_id, uint64_t ba, size_t cnt,941 static int ata_rcmd_write(disk_t *disk, uint64_t ba, size_t cnt, 944 942 const void *buf) 945 943 { … … 947 945 uint8_t status; 948 946 uint8_t drv_head; 949 disk_t *d;950 947 block_coord_t bc; 951 948 952 d = &disk[disk_id];953 954 949 /* Silence warning. */ 955 950 memset(&bc, 0, sizeof(bc)); 956 951 957 952 /* Compute block coordinates. */ 958 if (coord_calc(d , ba, &bc) != EOK)953 if (coord_calc(disk, ba, &bc) != EOK) 959 954 return EINVAL; 960 955 961 956 /* New value for Drive/Head register */ 962 957 drv_head = 963 ((disk_ id!= 0) ? DHR_DRV : 0) |964 ((d ->amode != am_chs) ? DHR_LBA : 0) |958 ((disk_dev_idx(disk) != 0) ? DHR_DRV : 0) | 959 ((disk->amode != am_chs) ? DHR_LBA : 0) | 965 960 (bc.h & 0x0f); 966 961 967 fibril_mutex_lock(&d ->lock);962 fibril_mutex_lock(&disk->lock); 968 963 969 964 /* Program a Write Sectors operation. */ 970 965 971 966 if (wait_status(0, ~SR_BSY, NULL, TIMEOUT_BSY) != EOK) { 972 fibril_mutex_unlock(&d ->lock);967 fibril_mutex_unlock(&disk->lock); 973 968 return EIO; 974 969 } … … 977 972 978 973 if (wait_status(SR_DRDY, ~SR_BSY, NULL, TIMEOUT_DRDY) != EOK) { 979 fibril_mutex_unlock(&d ->lock);974 fibril_mutex_unlock(&disk->lock); 980 975 return EIO; 981 976 } … … 984 979 coord_sc_program(&bc, 1); 985 980 986 pio_write_8(&cmd->command, d ->amode == am_lba48 ?981 pio_write_8(&cmd->command, disk->amode == am_lba48 ? 987 982 CMD_WRITE_SECTORS_EXT : CMD_WRITE_SECTORS); 988 983 989 984 if (wait_status(0, ~SR_BSY, &status, TIMEOUT_BSY) != EOK) { 990 fibril_mutex_unlock(&d ->lock);985 fibril_mutex_unlock(&disk->lock); 991 986 return EIO; 992 987 } … … 995 990 /* Write data to the device buffer. */ 996 991 997 for (i = 0; i < disk [disk_id].block_size / 2; i++) {992 for (i = 0; i < disk->block_size / 2; i++) { 998 993 pio_write_16(&cmd->data_port, ((uint16_t *) buf)[i]); 999 994 } 1000 995 } 1001 996 1002 fibril_mutex_unlock(&d ->lock);997 fibril_mutex_unlock(&disk->lock); 1003 998 1004 999 if (status & SR_ERR)
Note:
See TracChangeset
for help on using the changeset viewer.
