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