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