Changes in uspace/srv/bd/ata_bd/ata_bd.c [a44abb3e:4802dd7] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/ata_bd/ata_bd.c
ra44abb3e r4802dd7 104 104 static void ata_bd_connection(ipc_callid_t iid, ipc_call_t *icall, void *); 105 105 106 static int ata_bd_open(bd_srv s_t *, bd_srv_t *);106 static int ata_bd_open(bd_srv_t *); 107 107 static int ata_bd_close(bd_srv_t *); 108 108 static int ata_bd_read_blocks(bd_srv_t *, uint64_t ba, size_t cnt, void *buf, … … 114 114 static int ata_bd_get_num_blocks(bd_srv_t *, aoff64_t *); 115 115 116 static int ata_rcmd_read( disk_t *disk, uint64_t ba, size_t cnt,116 static int ata_rcmd_read(int disk_id, uint64_t ba, size_t cnt, 117 117 void *buf); 118 static int ata_rcmd_write( disk_t *disk, uint64_t ba, size_t cnt,118 static int ata_rcmd_write(int disk_id, uint64_t ba, size_t cnt, 119 119 const void *buf); 120 120 static int disk_init(disk_t *d, int disk_id); 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,121 static int drive_identify(int drive_id, void *buf); 122 static int identify_pkt_dev(int dev_idx, void *buf); 123 static int ata_cmd_packet(int dev_idx, const void *cpkt, size_t cpkt_size, 124 124 void *obuf, size_t obuf_size); 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,125 static int ata_pcmd_inquiry(int dev_idx, void *obuf, size_t obuf_size); 126 static int ata_pcmd_read_12(int dev_idx, uint64_t ba, size_t cnt, 127 127 void *obuf, size_t obuf_size); 128 static int ata_pcmd_read_toc( disk_t *disk, uint8_t ses,128 static int ata_pcmd_read_toc(int dev_idx, uint8_t ses, 129 129 void *obuf, size_t obuf_size); 130 130 static void disk_print_summary(disk_t *d); … … 146 146 static disk_t *bd_srv_disk(bd_srv_t *bd) 147 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); 148 return (disk_t *)bd->arg; 154 149 } 155 150 … … 301 296 { 302 297 service_id_t dsid; 303 int i; 304 disk_t *disk; 298 int disk_id, i; 305 299 306 300 /* Get the device service ID. */ … … 308 302 309 303 /* Determine which disk device is the client connecting to. */ 310 disk = NULL;304 disk_id = -1; 311 305 for (i = 0; i < MAX_DISKS; i++) 312 306 if (ata_disk[i].service_id == dsid) 313 disk = &ata_disk[i];314 315 if (disk == NULL || disk->present == false) {307 disk_id = i; 308 309 if (disk_id < 0 || ata_disk[disk_id].present == false) { 316 310 async_answer_0(iid, EINVAL); 317 311 return; 318 312 } 319 313 320 bd_conn(iid, icall, & disk->bds);314 bd_conn(iid, icall, &ata_disk[disk_id].bd); 321 315 } 322 316 … … 342 336 fibril_mutex_initialize(&d->lock); 343 337 344 bd_srv s_init(&d->bds);345 d->bd s.ops = &ata_bd_ops;346 d->bd s.sarg = d;338 bd_srv_init(&d->bd); 339 d->bd.ops = &ata_bd_ops; 340 d->bd.arg = d; 347 341 348 342 /* Try identify command. */ 349 rc = drive_identify(d , &idata);343 rc = drive_identify(disk_id, &idata); 350 344 if (rc == EOK) { 351 345 /* Success. It's a register (non-packet) device. */ … … 367 361 368 362 if (bc == PDEV_SIGNATURE_BC) { 369 rc = identify_pkt_dev(d , &idata);363 rc = identify_pkt_dev(disk_id, &idata); 370 364 if (rc == EOK) { 371 365 /* We have a packet device. */ … … 451 445 if (d->dev_type == ata_pkt_dev) { 452 446 /* Send inquiry. */ 453 rc = ata_pcmd_inquiry( d, &inq_data, sizeof(inq_data));447 rc = ata_pcmd_inquiry(0, &inq_data, sizeof(inq_data)); 454 448 if (rc != EOK) { 455 449 printf("Device inquiry failed.\n"); … … 473 467 } 474 468 475 static int ata_bd_open(bd_srv s_t *bds, bd_srv_t *bd)469 static int ata_bd_open(bd_srv_t *bd) 476 470 { 477 471 return EOK; … … 494 488 495 489 while (cnt > 0) { 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,490 if (disk->dev_type == ata_reg_dev) 491 rc = ata_rcmd_read(disk->disk_id, ba, 1, buf); 492 else 493 rc = ata_pcmd_read_12(disk->disk_id, ba, 1, buf, 500 494 disk->block_size); 501 }502 495 503 496 if (rc != EOK) … … 517 510 disk_t *disk = bd_srv_disk(bd); 518 511 519 return ata_pcmd_read_toc(disk , session, buf, size);512 return ata_pcmd_read_toc(disk->disk_id, session, buf, size); 520 513 } 521 514 … … 534 527 535 528 while (cnt > 0) { 536 rc = ata_rcmd_write(disk , ba, 1, buf);529 rc = ata_rcmd_write(disk->disk_id, ba, 1, buf); 537 530 if (rc != EOK) 538 531 return rc; … … 569 562 * whether an ATA device is present and if so, to determine its parameters. 570 563 * 571 * @param disk Disk564 * @param disk_id Device ID, 0 or 1. 572 565 * @param buf Pointer to a 512-byte buffer. 573 566 * … … 575 568 * not present). EIO if device responds with error. 576 569 */ 577 static int drive_identify( disk_t *disk, void *buf)570 static int drive_identify(int disk_id, void *buf) 578 571 { 579 572 uint16_t data; … … 582 575 size_t i; 583 576 584 drv_head = ((disk_ dev_idx(disk)!= 0) ? DHR_DRV : 0);577 drv_head = ((disk_id != 0) ? DHR_DRV : 0); 585 578 586 579 if (wait_status(0, ~SR_BSY, NULL, TIMEOUT_PROBE) != EOK) … … 628 621 * whether an ATAPI device is present and if so, to determine its parameters. 629 622 * 630 * @param d isk Disk623 * @param dev_idx Device index, 0 or 1. 631 624 * @param buf Pointer to a 512-byte buffer. 632 625 */ 633 static int identify_pkt_dev( disk_t *disk, void *buf)626 static int identify_pkt_dev(int dev_idx, void *buf) 634 627 { 635 628 uint16_t data; … … 638 631 size_t i; 639 632 640 drv_head = ((d isk_dev_idx(disk)!= 0) ? DHR_DRV : 0);633 drv_head = ((dev_idx != 0) ? DHR_DRV : 0); 641 634 642 635 if (wait_status(0, ~SR_BSY, NULL, TIMEOUT_PROBE) != EOK) … … 673 666 * Only data-in commands are supported (e.g. inquiry, read). 674 667 * 675 * @param d isk Disk668 * @param dev_idx Device index (0 or 1) 676 669 * @param obuf Buffer for storing data read from device 677 670 * @param obuf_size Size of obuf in bytes … … 679 672 * @return EOK on success, EIO on error. 680 673 */ 681 static int ata_cmd_packet( disk_t *disk, const void *cpkt, size_t cpkt_size,674 static int ata_cmd_packet(int dev_idx, const void *cpkt, size_t cpkt_size, 682 675 void *obuf, size_t obuf_size) 683 676 { … … 685 678 uint8_t status; 686 679 uint8_t drv_head; 680 disk_t *d; 687 681 size_t data_size; 688 682 uint16_t val; 689 683 690 fibril_mutex_lock(&disk->lock); 684 d = &ata_disk[dev_idx]; 685 fibril_mutex_lock(&d->lock); 691 686 692 687 /* New value for Drive/Head register */ 693 688 drv_head = 694 ((d isk_dev_idx(disk)!= 0) ? DHR_DRV : 0);689 ((dev_idx != 0) ? DHR_DRV : 0); 695 690 696 691 if (wait_status(0, ~SR_BSY, NULL, TIMEOUT_PROBE) != EOK) { 697 fibril_mutex_unlock(&d isk->lock);692 fibril_mutex_unlock(&d->lock); 698 693 return EIO; 699 694 } … … 702 697 703 698 if (wait_status(0, ~(SR_BSY|SR_DRQ), NULL, TIMEOUT_BSY) != EOK) { 704 fibril_mutex_unlock(&d isk->lock);699 fibril_mutex_unlock(&d->lock); 705 700 return EIO; 706 701 } … … 713 708 714 709 if (wait_status(SR_DRQ, ~SR_BSY, &status, TIMEOUT_BSY) != EOK) { 715 fibril_mutex_unlock(&d isk->lock);710 fibril_mutex_unlock(&d->lock); 716 711 return EIO; 717 712 } … … 722 717 723 718 if (wait_status(0, ~SR_BSY, &status, TIMEOUT_BSY) != EOK) { 724 fibril_mutex_unlock(&d isk->lock);719 fibril_mutex_unlock(&d->lock); 725 720 return EIO; 726 721 } 727 722 728 723 if ((status & SR_DRQ) == 0) { 729 fibril_mutex_unlock(&d isk->lock);724 fibril_mutex_unlock(&d->lock); 730 725 return EIO; 731 726 } … … 738 733 if (data_size > obuf_size) { 739 734 /* Output buffer is too small to store data. */ 740 fibril_mutex_unlock(&d isk->lock);735 fibril_mutex_unlock(&d->lock); 741 736 return EIO; 742 737 } … … 749 744 750 745 if (status & SR_ERR) { 751 fibril_mutex_unlock(&d isk->lock);752 return EIO; 753 } 754 755 fibril_mutex_unlock(&d isk->lock);746 fibril_mutex_unlock(&d->lock); 747 return EIO; 748 } 749 750 fibril_mutex_unlock(&d->lock); 756 751 757 752 return EOK; … … 760 755 /** Issue ATAPI Inquiry. 761 756 * 762 * @param d isk Disk757 * @param dev_idx Device index (0 or 1) 763 758 * @param obuf Buffer for storing inquiry data read from device 764 759 * @param obuf_size Size of obuf in bytes … … 766 761 * @return EOK on success, EIO on error. 767 762 */ 768 static int ata_pcmd_inquiry( disk_t *disk, void *obuf, size_t obuf_size)763 static int ata_pcmd_inquiry(int dev_idx, void *obuf, size_t obuf_size) 769 764 { 770 765 ata_pcmd_inquiry_t cp; … … 776 771 cp.alloc_len = min(obuf_size, 0xff); /* Allocation length */ 777 772 778 rc = ata_cmd_packet( disk, &cp, sizeof(cp), obuf, obuf_size);773 rc = ata_cmd_packet(0, &cp, sizeof(cp), obuf, obuf_size); 779 774 if (rc != EOK) 780 775 return rc; … … 788 783 * function will fail. 789 784 * 790 * @param d isk Disk785 * @param dev_idx Device index (0 or 1) 791 786 * @param ba Starting block address 792 787 * @param cnt Number of blocks to read … … 796 791 * @return EOK on success, EIO on error. 797 792 */ 798 static int ata_pcmd_read_12( disk_t *disk, uint64_t ba, size_t cnt,793 static int ata_pcmd_read_12(int dev_idx, uint64_t ba, size_t cnt, 799 794 void *obuf, size_t obuf_size) 800 795 { … … 811 806 cp.nblocks = host2uint32_t_be(cnt); 812 807 813 rc = ata_cmd_packet( disk, &cp, sizeof(cp), obuf, obuf_size);808 rc = ata_cmd_packet(0, &cp, sizeof(cp), obuf, obuf_size); 814 809 if (rc != EOK) 815 810 return rc; … … 828 823 * function will fail. 829 824 * 830 * @param d isk Disk825 * @param dev_idx Device index (0 or 1) 831 826 * @param session Starting session 832 827 * @param obuf Buffer for storing inquiry data read from device … … 835 830 * @return EOK on success, EIO on error. 836 831 */ 837 static int ata_pcmd_read_toc( disk_t *disk, uint8_t session, void *obuf,832 static int ata_pcmd_read_toc(int dev_idx, uint8_t session, void *obuf, 838 833 size_t obuf_size) 839 834 { … … 859 854 /** Read a physical from the device. 860 855 * 861 * @param disk Disk856 * @param disk_id Device index (0 or 1) 862 857 * @param ba Address the first block. 863 858 * @param cnt Number of blocks to transfer. … … 866 861 * @return EOK on success, EIO on error. 867 862 */ 868 static int ata_rcmd_read( disk_t *disk, uint64_t ba, size_t blk_cnt,863 static int ata_rcmd_read(int disk_id, uint64_t ba, size_t blk_cnt, 869 864 void *buf) 870 865 { … … 873 868 uint8_t status; 874 869 uint8_t drv_head; 870 disk_t *d; 875 871 block_coord_t bc; 876 872 873 d = &ata_disk[disk_id]; 874 877 875 /* Silence warning. */ 878 876 memset(&bc, 0, sizeof(bc)); 879 877 880 878 /* Compute block coordinates. */ 881 if (coord_calc(d isk, ba, &bc) != EOK)879 if (coord_calc(d, ba, &bc) != EOK) 882 880 return EINVAL; 883 881 884 882 /* New value for Drive/Head register */ 885 883 drv_head = 886 ((disk_ dev_idx(disk)!= 0) ? DHR_DRV : 0) |887 ((d isk->amode != am_chs) ? DHR_LBA : 0) |884 ((disk_id != 0) ? DHR_DRV : 0) | 885 ((d->amode != am_chs) ? DHR_LBA : 0) | 888 886 (bc.h & 0x0f); 889 887 890 fibril_mutex_lock(&d isk->lock);888 fibril_mutex_lock(&d->lock); 891 889 892 890 /* Program a Read Sectors operation. */ 893 891 894 892 if (wait_status(0, ~SR_BSY, NULL, TIMEOUT_BSY) != EOK) { 895 fibril_mutex_unlock(&d isk->lock);893 fibril_mutex_unlock(&d->lock); 896 894 return EIO; 897 895 } … … 900 898 901 899 if (wait_status(SR_DRDY, ~SR_BSY, NULL, TIMEOUT_DRDY) != EOK) { 902 fibril_mutex_unlock(&d isk->lock);900 fibril_mutex_unlock(&d->lock); 903 901 return EIO; 904 902 } … … 907 905 coord_sc_program(&bc, 1); 908 906 909 pio_write_8(&cmd->command, d isk->amode == am_lba48 ?907 pio_write_8(&cmd->command, d->amode == am_lba48 ? 910 908 CMD_READ_SECTORS_EXT : CMD_READ_SECTORS); 911 909 912 910 if (wait_status(0, ~SR_BSY, &status, TIMEOUT_BSY) != EOK) { 913 fibril_mutex_unlock(&d isk->lock);911 fibril_mutex_unlock(&d->lock); 914 912 return EIO; 915 913 } … … 918 916 /* Read data from the device buffer. */ 919 917 920 for (i = 0; i < disk->block_size / 2; i++) {918 for (i = 0; i < ata_disk[disk_id].block_size / 2; i++) { 921 919 data = pio_read_16(&cmd->data_port); 922 920 ((uint16_t *) buf)[i] = data; … … 927 925 return EIO; 928 926 929 fibril_mutex_unlock(&d isk->lock);927 fibril_mutex_unlock(&d->lock); 930 928 return EOK; 931 929 } … … 933 931 /** Write a physical block to the device. 934 932 * 935 * @param disk Disk933 * @param disk_id Device index (0 or 1) 936 934 * @param ba Address of the first block. 937 935 * @param cnt Number of blocks to transfer. … … 940 938 * @return EOK on success, EIO on error. 941 939 */ 942 static int ata_rcmd_write( disk_t *disk, uint64_t ba, size_t cnt,940 static int ata_rcmd_write(int disk_id, uint64_t ba, size_t cnt, 943 941 const void *buf) 944 942 { … … 946 944 uint8_t status; 947 945 uint8_t drv_head; 946 disk_t *d; 948 947 block_coord_t bc; 949 948 949 d = &ata_disk[disk_id]; 950 950 951 /* Silence warning. */ 951 952 memset(&bc, 0, sizeof(bc)); 952 953 953 954 /* Compute block coordinates. */ 954 if (coord_calc(d isk, ba, &bc) != EOK)955 if (coord_calc(d, ba, &bc) != EOK) 955 956 return EINVAL; 956 957 957 958 /* New value for Drive/Head register */ 958 959 drv_head = 959 ((disk_ dev_idx(disk)!= 0) ? DHR_DRV : 0) |960 ((d isk->amode != am_chs) ? DHR_LBA : 0) |960 ((disk_id != 0) ? DHR_DRV : 0) | 961 ((d->amode != am_chs) ? DHR_LBA : 0) | 961 962 (bc.h & 0x0f); 962 963 963 fibril_mutex_lock(&d isk->lock);964 fibril_mutex_lock(&d->lock); 964 965 965 966 /* Program a Write Sectors operation. */ 966 967 967 968 if (wait_status(0, ~SR_BSY, NULL, TIMEOUT_BSY) != EOK) { 968 fibril_mutex_unlock(&d isk->lock);969 fibril_mutex_unlock(&d->lock); 969 970 return EIO; 970 971 } … … 973 974 974 975 if (wait_status(SR_DRDY, ~SR_BSY, NULL, TIMEOUT_DRDY) != EOK) { 975 fibril_mutex_unlock(&d isk->lock);976 fibril_mutex_unlock(&d->lock); 976 977 return EIO; 977 978 } … … 980 981 coord_sc_program(&bc, 1); 981 982 982 pio_write_8(&cmd->command, d isk->amode == am_lba48 ?983 pio_write_8(&cmd->command, d->amode == am_lba48 ? 983 984 CMD_WRITE_SECTORS_EXT : CMD_WRITE_SECTORS); 984 985 985 986 if (wait_status(0, ~SR_BSY, &status, TIMEOUT_BSY) != EOK) { 986 fibril_mutex_unlock(&d isk->lock);987 fibril_mutex_unlock(&d->lock); 987 988 return EIO; 988 989 } … … 991 992 /* Write data to the device buffer. */ 992 993 993 for (i = 0; i < d isk->block_size / 2; i++) {994 for (i = 0; i < d->block_size / 2; i++) { 994 995 pio_write_16(&cmd->data_port, ((uint16_t *) buf)[i]); 995 996 } 996 997 } 997 998 998 fibril_mutex_unlock(&d isk->lock);999 fibril_mutex_unlock(&d->lock); 999 1000 1000 1001 if (status & SR_ERR)
Note:
See TracChangeset
for help on using the changeset viewer.