diff options
Diffstat (limited to 'drivers/ide')
| -rw-r--r-- | drivers/ide/Kconfig | 6 | ||||
| -rw-r--r-- | drivers/ide/ide-cd.c | 35 | ||||
| -rw-r--r-- | drivers/ide/ide-disk.c | 33 | ||||
| -rw-r--r-- | drivers/ide/ide-dma.c | 66 | ||||
| -rw-r--r-- | drivers/ide/ide-io.c | 3 | ||||
| -rw-r--r-- | drivers/ide/ide-iops.c | 3 | ||||
| -rw-r--r-- | drivers/ide/ide-lib.c | 55 | ||||
| -rw-r--r-- | drivers/ide/ide-probe.c | 21 | ||||
| -rw-r--r-- | drivers/ide/ide.c | 30 | ||||
| -rw-r--r-- | drivers/ide/pci/hpt366.c | 71 | ||||
| -rw-r--r-- | drivers/ide/pci/pdc202xx_new.c | 3 | ||||
| -rw-r--r-- | drivers/ide/setup-pci.c | 31 |
12 files changed, 179 insertions, 178 deletions
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index 45b22282f149..fb06555708a8 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
| @@ -390,7 +390,7 @@ config IDEPCI_PCIBUS_ORDER | |||
| 390 | 390 | ||
| 391 | # TODO: split it on per host driver config options (or module parameters) | 391 | # TODO: split it on per host driver config options (or module parameters) |
| 392 | config BLK_DEV_OFFBOARD | 392 | config BLK_DEV_OFFBOARD |
| 393 | bool "Boot off-board chipsets first support" | 393 | bool "Boot off-board chipsets first support (DEPRECATED)" |
| 394 | depends on BLK_DEV_IDEPCI && (BLK_DEV_AEC62XX || BLK_DEV_GENERIC || BLK_DEV_HPT34X || BLK_DEV_HPT366 || BLK_DEV_PDC202XX_NEW || BLK_DEV_PDC202XX_OLD || BLK_DEV_TC86C001) | 394 | depends on BLK_DEV_IDEPCI && (BLK_DEV_AEC62XX || BLK_DEV_GENERIC || BLK_DEV_HPT34X || BLK_DEV_HPT366 || BLK_DEV_PDC202XX_NEW || BLK_DEV_PDC202XX_OLD || BLK_DEV_TC86C001) |
| 395 | help | 395 | help |
| 396 | Normally, IDE controllers built into the motherboard (on-board | 396 | Normally, IDE controllers built into the motherboard (on-board |
| @@ -410,6 +410,10 @@ config BLK_DEV_OFFBOARD | |||
| 410 | Note that, if you do this, the order of the hd* devices will be | 410 | Note that, if you do this, the order of the hd* devices will be |
| 411 | rearranged which may require modification of fstab and other files. | 411 | rearranged which may require modification of fstab and other files. |
| 412 | 412 | ||
| 413 | Please also note that this method of assuring stable naming of | ||
| 414 | IDE devices is unreliable and use other means for achieving it | ||
| 415 | (i.e. udev). | ||
| 416 | |||
| 413 | If in doubt, say N. | 417 | If in doubt, say N. |
| 414 | 418 | ||
| 415 | config BLK_DEV_GENERIC | 419 | config BLK_DEV_GENERIC |
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 57a5f63d6ae3..92ac658dac33 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
| @@ -1650,31 +1650,6 @@ static int cdrom_write_check_ireason(ide_drive_t *drive, int len, int ireason) | |||
| 1650 | return 1; | 1650 | return 1; |
| 1651 | } | 1651 | } |
| 1652 | 1652 | ||
| 1653 | static void post_transform_command(struct request *req) | ||
| 1654 | { | ||
| 1655 | u8 *c = req->cmd; | ||
| 1656 | char *ibuf; | ||
| 1657 | |||
| 1658 | if (!blk_pc_request(req)) | ||
| 1659 | return; | ||
| 1660 | |||
| 1661 | if (req->bio) | ||
| 1662 | ibuf = bio_data(req->bio); | ||
| 1663 | else | ||
| 1664 | ibuf = req->data; | ||
| 1665 | |||
| 1666 | if (!ibuf) | ||
| 1667 | return; | ||
| 1668 | |||
| 1669 | /* | ||
| 1670 | * set ansi-revision and response data as atapi | ||
| 1671 | */ | ||
| 1672 | if (c[0] == GPCMD_INQUIRY) { | ||
| 1673 | ibuf[2] |= 2; | ||
| 1674 | ibuf[3] = (ibuf[3] & 0xf0) | 2; | ||
| 1675 | } | ||
| 1676 | } | ||
| 1677 | |||
| 1678 | typedef void (xfer_func_t)(ide_drive_t *, void *, u32); | 1653 | typedef void (xfer_func_t)(ide_drive_t *, void *, u32); |
| 1679 | 1654 | ||
| 1680 | /* | 1655 | /* |
| @@ -1810,9 +1785,6 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) | |||
| 1810 | return ide_started; | 1785 | return ide_started; |
| 1811 | 1786 | ||
| 1812 | end_request: | 1787 | end_request: |
| 1813 | if (!rq->data_len) | ||
| 1814 | post_transform_command(rq); | ||
| 1815 | |||
| 1816 | spin_lock_irqsave(&ide_lock, flags); | 1788 | spin_lock_irqsave(&ide_lock, flags); |
| 1817 | blkdev_dequeue_request(rq); | 1789 | blkdev_dequeue_request(rq); |
| 1818 | end_that_request_last(rq, 1); | 1790 | end_that_request_last(rq, 1); |
| @@ -3049,12 +3021,7 @@ int ide_cdrom_probe_capabilities (ide_drive_t *drive) | |||
| 3049 | else | 3021 | else |
| 3050 | printk(" drive"); | 3022 | printk(" drive"); |
| 3051 | 3023 | ||
| 3052 | printk(", %dkB Cache", be16_to_cpu(cap.buffer_size)); | 3024 | printk(KERN_CONT ", %dkB Cache\n", be16_to_cpu(cap.buffer_size)); |
| 3053 | |||
| 3054 | if (drive->using_dma) | ||
| 3055 | ide_dma_verbose(drive); | ||
| 3056 | |||
| 3057 | printk("\n"); | ||
| 3058 | 3025 | ||
| 3059 | return nslots; | 3026 | return nslots; |
| 3060 | } | 3027 | } |
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 00123d99527a..b1781908e1f2 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c | |||
| @@ -13,32 +13,6 @@ | |||
| 13 | * and Andre Hedrick <andre@linux-ide.org> | 13 | * and Andre Hedrick <andre@linux-ide.org> |
| 14 | * | 14 | * |
| 15 | * This is the IDE/ATA disk driver, as evolved from hd.c and ide.c. | 15 | * This is the IDE/ATA disk driver, as evolved from hd.c and ide.c. |
| 16 | * | ||
| 17 | * Version 1.00 move disk only code from ide.c to ide-disk.c | ||
| 18 | * support optional byte-swapping of all data | ||
| 19 | * Version 1.01 fix previous byte-swapping code | ||
| 20 | * Version 1.02 remove ", LBA" from drive identification msgs | ||
| 21 | * Version 1.03 fix display of id->buf_size for big-endian | ||
| 22 | * Version 1.04 add /proc configurable settings and S.M.A.R.T support | ||
| 23 | * Version 1.05 add capacity support for ATA3 >= 8GB | ||
| 24 | * Version 1.06 get boot-up messages to show full cyl count | ||
| 25 | * Version 1.07 disable door-locking if it fails | ||
| 26 | * Version 1.08 fixed CHS/LBA translations for ATA4 > 8GB, | ||
| 27 | * process of adding new ATA4 compliance. | ||
| 28 | * fixed problems in allowing fdisk to see | ||
| 29 | * the entire disk. | ||
| 30 | * Version 1.09 added increment of rq->sector in ide_multwrite | ||
| 31 | * added UDMA 3/4 reporting | ||
| 32 | * Version 1.10 request queue changes, Ultra DMA 100 | ||
| 33 | * Version 1.11 added 48-bit lba | ||
| 34 | * Version 1.12 adding taskfile io access method | ||
| 35 | * Version 1.13 added standby and flush-cache for notifier | ||
| 36 | * Version 1.14 added acoustic-wcache | ||
| 37 | * Version 1.15 convert all calls to ide_raw_taskfile | ||
| 38 | * since args will return register content. | ||
| 39 | * Version 1.16 added suspend-resume-checkpower | ||
| 40 | * Version 1.17 do flush on standby, do flush on ATA < ATA6 | ||
| 41 | * fix wcache setup. | ||
| 42 | */ | 16 | */ |
| 43 | 17 | ||
| 44 | #define IDEDISK_VERSION "1.18" | 18 | #define IDEDISK_VERSION "1.18" |
| @@ -961,11 +935,8 @@ static void idedisk_setup (ide_drive_t *drive) | |||
| 961 | if (id->buf_size) | 935 | if (id->buf_size) |
| 962 | printk (" w/%dKiB Cache", id->buf_size/2); | 936 | printk (" w/%dKiB Cache", id->buf_size/2); |
| 963 | 937 | ||
| 964 | printk(", CHS=%d/%d/%d", | 938 | printk(KERN_CONT ", CHS=%d/%d/%d\n", |
| 965 | drive->bios_cyl, drive->bios_head, drive->bios_sect); | 939 | drive->bios_cyl, drive->bios_head, drive->bios_sect); |
| 966 | if (drive->using_dma) | ||
| 967 | ide_dma_verbose(drive); | ||
| 968 | printk("\n"); | ||
| 969 | 940 | ||
| 970 | /* write cache enabled? */ | 941 | /* write cache enabled? */ |
| 971 | if ((id->csfo & 1) || (id->cfs_enable_1 & (1 << 5))) | 942 | if ((id->csfo & 1) || (id->cfs_enable_1 & (1 << 5))) |
diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c index 0d795a1678c7..4703837bf1fc 100644 --- a/drivers/ide/ide-dma.c +++ b/drivers/ide/ide-dma.c | |||
| @@ -611,12 +611,6 @@ static int __ide_dma_test_irq(ide_drive_t *drive) | |||
| 611 | ide_hwif_t *hwif = HWIF(drive); | 611 | ide_hwif_t *hwif = HWIF(drive); |
| 612 | u8 dma_stat = hwif->INB(hwif->dma_status); | 612 | u8 dma_stat = hwif->INB(hwif->dma_status); |
| 613 | 613 | ||
| 614 | #if 0 /* do not set unless you know what you are doing */ | ||
| 615 | if (dma_stat & 4) { | ||
| 616 | u8 stat = hwif->INB(IDE_STATUS_REG); | ||
| 617 | hwif->OUTB(hwif->dma_status, dma_stat & 0xE4); | ||
| 618 | } | ||
| 619 | #endif | ||
| 620 | /* return 1 if INTR asserted */ | 614 | /* return 1 if INTR asserted */ |
| 621 | if ((dma_stat & 4) == 4) | 615 | if ((dma_stat & 4) == 4) |
| 622 | return 1; | 616 | return 1; |
| @@ -753,10 +747,12 @@ u8 ide_find_dma_mode(ide_drive_t *drive, u8 req_mode) | |||
| 753 | mode = XFER_MW_DMA_1; | 747 | mode = XFER_MW_DMA_1; |
| 754 | } | 748 | } |
| 755 | 749 | ||
| 756 | printk(KERN_DEBUG "%s: %s mode selected\n", drive->name, | 750 | mode = min(mode, req_mode); |
| 751 | |||
| 752 | printk(KERN_INFO "%s: %s mode selected\n", drive->name, | ||
| 757 | mode ? ide_xfer_verbose(mode) : "no DMA"); | 753 | mode ? ide_xfer_verbose(mode) : "no DMA"); |
| 758 | 754 | ||
| 759 | return min(mode, req_mode); | 755 | return mode; |
| 760 | } | 756 | } |
| 761 | 757 | ||
| 762 | EXPORT_SYMBOL_GPL(ide_find_dma_mode); | 758 | EXPORT_SYMBOL_GPL(ide_find_dma_mode); |
| @@ -772,6 +768,9 @@ static int ide_tune_dma(ide_drive_t *drive) | |||
| 772 | if (__ide_dma_bad_drive(drive)) | 768 | if (__ide_dma_bad_drive(drive)) |
| 773 | return 0; | 769 | return 0; |
| 774 | 770 | ||
| 771 | if (ide_id_dma_bug(drive)) | ||
| 772 | return 0; | ||
| 773 | |||
| 775 | if (drive->hwif->host_flags & IDE_HFLAG_TRUST_BIOS_FOR_DMA) | 774 | if (drive->hwif->host_flags & IDE_HFLAG_TRUST_BIOS_FOR_DMA) |
| 776 | return config_drive_for_dma(drive); | 775 | return config_drive_for_dma(drive); |
| 777 | 776 | ||
| @@ -806,58 +805,23 @@ static int ide_dma_check(ide_drive_t *drive) | |||
| 806 | return vdma ? 0 : -1; | 805 | return vdma ? 0 : -1; |
| 807 | } | 806 | } |
| 808 | 807 | ||
| 809 | void ide_dma_verbose(ide_drive_t *drive) | 808 | int ide_id_dma_bug(ide_drive_t *drive) |
| 810 | { | 809 | { |
| 811 | struct hd_driveid *id = drive->id; | 810 | struct hd_driveid *id = drive->id; |
| 812 | ide_hwif_t *hwif = HWIF(drive); | ||
| 813 | 811 | ||
| 814 | if (id->field_valid & 4) { | 812 | if (id->field_valid & 4) { |
| 815 | if ((id->dma_ultra >> 8) && (id->dma_mword >> 8)) | 813 | if ((id->dma_ultra >> 8) && (id->dma_mword >> 8)) |
| 816 | goto bug_dma_off; | 814 | goto err_out; |
| 817 | if (id->dma_ultra & ((id->dma_ultra >> 8) & hwif->ultra_mask)) { | ||
| 818 | if (((id->dma_ultra >> 11) & 0x1F) && | ||
| 819 | eighty_ninty_three(drive)) { | ||
| 820 | if ((id->dma_ultra >> 15) & 1) { | ||
| 821 | printk(", UDMA(mode 7)"); | ||
| 822 | } else if ((id->dma_ultra >> 14) & 1) { | ||
| 823 | printk(", UDMA(133)"); | ||
| 824 | } else if ((id->dma_ultra >> 13) & 1) { | ||
| 825 | printk(", UDMA(100)"); | ||
| 826 | } else if ((id->dma_ultra >> 12) & 1) { | ||
| 827 | printk(", UDMA(66)"); | ||
| 828 | } else if ((id->dma_ultra >> 11) & 1) { | ||
| 829 | printk(", UDMA(44)"); | ||
| 830 | } else | ||
| 831 | goto mode_two; | ||
| 832 | } else { | ||
| 833 | mode_two: | ||
| 834 | if ((id->dma_ultra >> 10) & 1) { | ||
| 835 | printk(", UDMA(33)"); | ||
| 836 | } else if ((id->dma_ultra >> 9) & 1) { | ||
| 837 | printk(", UDMA(25)"); | ||
| 838 | } else if ((id->dma_ultra >> 8) & 1) { | ||
| 839 | printk(", UDMA(16)"); | ||
| 840 | } | ||
| 841 | } | ||
| 842 | } else { | ||
| 843 | printk(", (U)DMA"); /* Can be BIOS-enabled! */ | ||
| 844 | } | ||
| 845 | } else if (id->field_valid & 2) { | 815 | } else if (id->field_valid & 2) { |
| 846 | if ((id->dma_mword >> 8) && (id->dma_1word >> 8)) | 816 | if ((id->dma_mword >> 8) && (id->dma_1word >> 8)) |
| 847 | goto bug_dma_off; | 817 | goto err_out; |
| 848 | printk(", DMA"); | ||
| 849 | } else if (id->field_valid & 1) { | ||
| 850 | goto bug_dma_off; | ||
| 851 | } | 818 | } |
| 852 | return; | 819 | return 0; |
| 853 | bug_dma_off: | 820 | err_out: |
| 854 | printk(", BUG DMA OFF"); | 821 | printk(KERN_ERR "%s: bad DMA info in identify block\n", drive->name); |
| 855 | hwif->dma_off_quietly(drive); | 822 | return 1; |
| 856 | return; | ||
| 857 | } | 823 | } |
| 858 | 824 | ||
| 859 | EXPORT_SYMBOL(ide_dma_verbose); | ||
| 860 | |||
| 861 | int ide_set_dma(ide_drive_t *drive) | 825 | int ide_set_dma(ide_drive_t *drive) |
| 862 | { | 826 | { |
| 863 | ide_hwif_t *hwif = drive->hwif; | 827 | ide_hwif_t *hwif = drive->hwif; |
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index db22d1ff4e55..bef781fec500 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c | |||
| @@ -970,7 +970,8 @@ static void ide_check_pm_state(ide_drive_t *drive, struct request *rq) | |||
| 970 | if (rc) | 970 | if (rc) |
| 971 | printk(KERN_WARNING "%s: bus not ready on wakeup\n", drive->name); | 971 | printk(KERN_WARNING "%s: bus not ready on wakeup\n", drive->name); |
| 972 | SELECT_DRIVE(drive); | 972 | SELECT_DRIVE(drive); |
| 973 | HWIF(drive)->OUTB(8, HWIF(drive)->io_ports[IDE_CONTROL_OFFSET]); | 973 | if (IDE_CONTROL_REG) |
| 974 | HWIF(drive)->OUTB(drive->ctl, IDE_CONTROL_REG); | ||
| 974 | rc = ide_wait_not_busy(HWIF(drive), 100000); | 975 | rc = ide_wait_not_busy(HWIF(drive), 100000); |
| 975 | if (rc) | 976 | if (rc) |
| 976 | printk(KERN_WARNING "%s: drive not ready on wakeup\n", drive->name); | 977 | printk(KERN_WARNING "%s: drive not ready on wakeup\n", drive->name); |
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 5c3256180ae5..cef405ddaf0e 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c | |||
| @@ -748,6 +748,9 @@ int ide_driveid_update(ide_drive_t *drive) | |||
| 748 | drive->id->dma_1word = id->dma_1word; | 748 | drive->id->dma_1word = id->dma_1word; |
| 749 | /* anything more ? */ | 749 | /* anything more ? */ |
| 750 | kfree(id); | 750 | kfree(id); |
| 751 | |||
| 752 | if (drive->using_dma && ide_id_dma_bug(drive)) | ||
| 753 | ide_dma_off(drive); | ||
| 751 | } | 754 | } |
| 752 | 755 | ||
| 753 | return 1; | 756 | return 1; |
diff --git a/drivers/ide/ide-lib.c b/drivers/ide/ide-lib.c index 1609b8604f56..062d3bcb2471 100644 --- a/drivers/ide/ide-lib.c +++ b/drivers/ide/ide-lib.c | |||
| @@ -29,41 +29,44 @@ | |||
| 29 | * Add common non I/O op stuff here. Make sure it has proper | 29 | * Add common non I/O op stuff here. Make sure it has proper |
| 30 | * kernel-doc function headers or your patch will be rejected | 30 | * kernel-doc function headers or your patch will be rejected |
| 31 | */ | 31 | */ |
| 32 | 32 | ||
| 33 | static const char *udma_str[] = | ||
| 34 | { "UDMA/16", "UDMA/25", "UDMA/33", "UDMA/44", | ||
| 35 | "UDMA/66", "UDMA/100", "UDMA/133", "UDMA7" }; | ||
| 36 | static const char *mwdma_str[] = | ||
| 37 | { "MWDMA0", "MWDMA1", "MWDMA2" }; | ||
| 38 | static const char *swdma_str[] = | ||
| 39 | { "SWDMA0", "SWDMA1", "SWDMA2" }; | ||
| 40 | static const char *pio_str[] = | ||
| 41 | { "PIO0", "PIO1", "PIO2", "PIO3", "PIO4", "PIO5" }; | ||
| 33 | 42 | ||
| 34 | /** | 43 | /** |
| 35 | * ide_xfer_verbose - return IDE mode names | 44 | * ide_xfer_verbose - return IDE mode names |
| 36 | * @xfer_rate: rate to name | 45 | * @mode: transfer mode |
| 37 | * | 46 | * |
| 38 | * Returns a constant string giving the name of the mode | 47 | * Returns a constant string giving the name of the mode |
| 39 | * requested. | 48 | * requested. |
| 40 | */ | 49 | */ |
| 41 | 50 | ||
| 42 | char *ide_xfer_verbose (u8 xfer_rate) | 51 | const char *ide_xfer_verbose(u8 mode) |
| 43 | { | 52 | { |
| 44 | switch(xfer_rate) { | 53 | const char *s; |
| 45 | case XFER_UDMA_7: return("UDMA 7"); | 54 | u8 i = mode & 0xf; |
| 46 | case XFER_UDMA_6: return("UDMA 6"); | 55 | |
| 47 | case XFER_UDMA_5: return("UDMA 5"); | 56 | if (mode >= XFER_UDMA_0 && mode <= XFER_UDMA_7) |
| 48 | case XFER_UDMA_4: return("UDMA 4"); | 57 | s = udma_str[i]; |
| 49 | case XFER_UDMA_3: return("UDMA 3"); | 58 | else if (mode >= XFER_MW_DMA_0 && mode <= XFER_MW_DMA_2) |
| 50 | case XFER_UDMA_2: return("UDMA 2"); | 59 | s = mwdma_str[i]; |
| 51 | case XFER_UDMA_1: return("UDMA 1"); | 60 | else if (mode >= XFER_SW_DMA_0 && mode <= XFER_SW_DMA_2) |
| 52 | case XFER_UDMA_0: return("UDMA 0"); | 61 | s = swdma_str[i]; |
| 53 | case XFER_MW_DMA_2: return("MW DMA 2"); | 62 | else if (mode >= XFER_PIO_0 && mode <= XFER_PIO_5) |
| 54 | case XFER_MW_DMA_1: return("MW DMA 1"); | 63 | s = pio_str[i & 0x7]; |
| 55 | case XFER_MW_DMA_0: return("MW DMA 0"); | 64 | else if (mode == XFER_PIO_SLOW) |
| 56 | case XFER_SW_DMA_2: return("SW DMA 2"); | 65 | s = "PIO SLOW"; |
| 57 | case XFER_SW_DMA_1: return("SW DMA 1"); | 66 | else |
| 58 | case XFER_SW_DMA_0: return("SW DMA 0"); | 67 | s = "XFER ERROR"; |
| 59 | case XFER_PIO_4: return("PIO 4"); | 68 | |
| 60 | case XFER_PIO_3: return("PIO 3"); | 69 | return s; |
| 61 | case XFER_PIO_2: return("PIO 2"); | ||
| 62 | case XFER_PIO_1: return("PIO 1"); | ||
| 63 | case XFER_PIO_0: return("PIO 0"); | ||
| 64 | case XFER_PIO_SLOW: return("PIO SLOW"); | ||
| 65 | default: return("XFER ERROR"); | ||
| 66 | } | ||
| 67 | } | 70 | } |
| 68 | 71 | ||
| 69 | EXPORT_SYMBOL(ide_xfer_verbose); | 72 | EXPORT_SYMBOL(ide_xfer_verbose); |
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index ee848c705995..2994523be7bf 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
| @@ -13,22 +13,8 @@ | |||
| 13 | * | 13 | * |
| 14 | * This is the IDE probe module, as evolved from hd.c and ide.c. | 14 | * This is the IDE probe module, as evolved from hd.c and ide.c. |
| 15 | * | 15 | * |
| 16 | * Version 1.00 move drive probing code from ide.c to ide-probe.c | 16 | * -- increase WAIT_PIDENTIFY to avoid CD-ROM locking at boot |
| 17 | * Version 1.01 fix compilation problem for m68k | 17 | * by Andrea Arcangeli |
| 18 | * Version 1.02 increase WAIT_PIDENTIFY to avoid CD-ROM locking at boot | ||
| 19 | * by Andrea Arcangeli | ||
| 20 | * Version 1.03 fix for (hwif->chipset == ide_4drives) | ||
| 21 | * Version 1.04 fixed buggy treatments of known flash memory cards | ||
| 22 | * | ||
| 23 | * Version 1.05 fix for (hwif->chipset == ide_pdc4030) | ||
| 24 | * added ide6/7/8/9 | ||
| 25 | * allowed for secondary flash card to be detectable | ||
| 26 | * with new flag : drive->ata_flash : 1; | ||
| 27 | * Version 1.06 stream line request queue and prep for cascade project. | ||
| 28 | * Version 1.07 max_sect <= 255; slower disks would get behind and | ||
| 29 | * then fall over when they get to 256. Paul G. | ||
| 30 | * Version 1.10 Update set for new IDE. drive->id is now always | ||
| 31 | * valid after probe time even with noprobe | ||
| 32 | */ | 18 | */ |
| 33 | 19 | ||
| 34 | #include <linux/module.h> | 20 | #include <linux/module.h> |
| @@ -667,7 +653,8 @@ static int wait_hwif_ready(ide_hwif_t *hwif) | |||
| 667 | /* Ignore disks that we will not probe for later. */ | 653 | /* Ignore disks that we will not probe for later. */ |
| 668 | if (!drive->noprobe || drive->present) { | 654 | if (!drive->noprobe || drive->present) { |
| 669 | SELECT_DRIVE(drive); | 655 | SELECT_DRIVE(drive); |
| 670 | hwif->OUTB(8, hwif->io_ports[IDE_CONTROL_OFFSET]); | 656 | if (IDE_CONTROL_REG) |
| 657 | hwif->OUTB(drive->ctl, IDE_CONTROL_REG); | ||
| 671 | mdelay(2); | 658 | mdelay(2); |
| 672 | rc = ide_wait_not_busy(hwif, 35000); | 659 | rc = ide_wait_not_busy(hwif, 35000); |
| 673 | if (rc) | 660 | if (rc) |
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 674a65c1a130..54943da6e4e5 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
| @@ -800,11 +800,17 @@ int set_io_32bit(ide_drive_t *drive, int arg) | |||
| 800 | if (arg < 0 || arg > 1 + (SUPPORT_VLB_SYNC << 1)) | 800 | if (arg < 0 || arg > 1 + (SUPPORT_VLB_SYNC << 1)) |
| 801 | return -EINVAL; | 801 | return -EINVAL; |
| 802 | 802 | ||
| 803 | if (ide_spin_wait_hwgroup(drive)) | ||
| 804 | return -EBUSY; | ||
| 805 | |||
| 803 | drive->io_32bit = arg; | 806 | drive->io_32bit = arg; |
| 804 | #ifdef CONFIG_BLK_DEV_DTC2278 | 807 | #ifdef CONFIG_BLK_DEV_DTC2278 |
| 805 | if (HWIF(drive)->chipset == ide_dtc2278) | 808 | if (HWIF(drive)->chipset == ide_dtc2278) |
| 806 | HWIF(drive)->drives[!drive->select.b.unit].io_32bit = arg; | 809 | HWIF(drive)->drives[!drive->select.b.unit].io_32bit = arg; |
| 807 | #endif /* CONFIG_BLK_DEV_DTC2278 */ | 810 | #endif /* CONFIG_BLK_DEV_DTC2278 */ |
| 811 | |||
| 812 | spin_unlock_irq(&ide_lock); | ||
| 813 | |||
| 808 | return 0; | 814 | return 0; |
| 809 | } | 815 | } |
| 810 | 816 | ||
| @@ -1670,10 +1676,34 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, | |||
| 1670 | return sprintf(buf, "ide:m-%s\n", media_string(drive)); | 1676 | return sprintf(buf, "ide:m-%s\n", media_string(drive)); |
| 1671 | } | 1677 | } |
| 1672 | 1678 | ||
| 1679 | static ssize_t model_show(struct device *dev, struct device_attribute *attr, | ||
| 1680 | char *buf) | ||
| 1681 | { | ||
| 1682 | ide_drive_t *drive = to_ide_device(dev); | ||
| 1683 | return sprintf(buf, "%s\n", drive->id->model); | ||
| 1684 | } | ||
| 1685 | |||
| 1686 | static ssize_t firmware_show(struct device *dev, struct device_attribute *attr, | ||
| 1687 | char *buf) | ||
| 1688 | { | ||
| 1689 | ide_drive_t *drive = to_ide_device(dev); | ||
| 1690 | return sprintf(buf, "%s\n", drive->id->fw_rev); | ||
| 1691 | } | ||
| 1692 | |||
| 1693 | static ssize_t serial_show(struct device *dev, struct device_attribute *attr, | ||
| 1694 | char *buf) | ||
| 1695 | { | ||
| 1696 | ide_drive_t *drive = to_ide_device(dev); | ||
| 1697 | return sprintf(buf, "%s\n", drive->id->serial_no); | ||
| 1698 | } | ||
| 1699 | |||
| 1673 | static struct device_attribute ide_dev_attrs[] = { | 1700 | static struct device_attribute ide_dev_attrs[] = { |
| 1674 | __ATTR_RO(media), | 1701 | __ATTR_RO(media), |
| 1675 | __ATTR_RO(drivename), | 1702 | __ATTR_RO(drivename), |
| 1676 | __ATTR_RO(modalias), | 1703 | __ATTR_RO(modalias), |
| 1704 | __ATTR_RO(model), | ||
| 1705 | __ATTR_RO(firmware), | ||
| 1706 | __ATTR(serial, 0400, serial_show, NULL), | ||
| 1677 | __ATTR_NULL | 1707 | __ATTR_NULL |
| 1678 | }; | 1708 | }; |
| 1679 | 1709 | ||
diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c index 5682895d36d9..9fce25bdec8a 100644 --- a/drivers/ide/pci/hpt366.c +++ b/drivers/ide/pci/hpt366.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/drivers/ide/pci/hpt366.c Version 1.21 Oct 23, 2007 | 2 | * linux/drivers/ide/pci/hpt366.c Version 1.22 Dec 4, 2007 |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 1999-2003 Andre Hedrick <andre@linux-ide.org> | 4 | * Copyright (C) 1999-2003 Andre Hedrick <andre@linux-ide.org> |
| 5 | * Portions Copyright (C) 2001 Sun Microsystems, Inc. | 5 | * Portions Copyright (C) 2001 Sun Microsystems, Inc. |
| @@ -310,6 +310,8 @@ static u32 twenty_five_base_hpt36x[] = { | |||
| 310 | /* XFER_PIO_0 */ 0xc0d08585 | 310 | /* XFER_PIO_0 */ 0xc0d08585 |
| 311 | }; | 311 | }; |
| 312 | 312 | ||
| 313 | #if 0 | ||
| 314 | /* These are the timing tables from the HighPoint open source drivers... */ | ||
| 313 | static u32 thirty_three_base_hpt37x[] = { | 315 | static u32 thirty_three_base_hpt37x[] = { |
| 314 | /* XFER_UDMA_6 */ 0x12446231, /* 0x12646231 ?? */ | 316 | /* XFER_UDMA_6 */ 0x12446231, /* 0x12646231 ?? */ |
| 315 | /* XFER_UDMA_5 */ 0x12446231, | 317 | /* XFER_UDMA_5 */ 0x12446231, |
| @@ -369,6 +371,73 @@ static u32 sixty_six_base_hpt37x[] = { | |||
| 369 | /* XFER_PIO_1 */ 0x0d029d26, | 371 | /* XFER_PIO_1 */ 0x0d029d26, |
| 370 | /* XFER_PIO_0 */ 0x0d029d5e | 372 | /* XFER_PIO_0 */ 0x0d029d5e |
| 371 | }; | 373 | }; |
| 374 | #else | ||
| 375 | /* | ||
| 376 | * The following are the new timing tables with PIO mode data/taskfile transfer | ||
| 377 | * overclocking fixed... | ||
| 378 | */ | ||
| 379 | |||
| 380 | /* This table is taken from the HPT370 data manual rev. 1.02 */ | ||
| 381 | static u32 thirty_three_base_hpt37x[] = { | ||
| 382 | /* XFER_UDMA_6 */ 0x16455031, /* 0x16655031 ?? */ | ||
| 383 | /* XFER_UDMA_5 */ 0x16455031, | ||
| 384 | /* XFER_UDMA_4 */ 0x16455031, | ||
| 385 | /* XFER_UDMA_3 */ 0x166d5031, | ||
| 386 | /* XFER_UDMA_2 */ 0x16495031, | ||
| 387 | /* XFER_UDMA_1 */ 0x164d5033, | ||
| 388 | /* XFER_UDMA_0 */ 0x16515097, | ||
| 389 | |||
| 390 | /* XFER_MW_DMA_2 */ 0x26515031, | ||
| 391 | /* XFER_MW_DMA_1 */ 0x26515033, | ||
| 392 | /* XFER_MW_DMA_0 */ 0x26515097, | ||
| 393 | |||
| 394 | /* XFER_PIO_4 */ 0x06515021, | ||
| 395 | /* XFER_PIO_3 */ 0x06515022, | ||
| 396 | /* XFER_PIO_2 */ 0x06515033, | ||
| 397 | /* XFER_PIO_1 */ 0x06915065, | ||
| 398 | /* XFER_PIO_0 */ 0x06d1508a | ||
| 399 | }; | ||
| 400 | |||
| 401 | static u32 fifty_base_hpt37x[] = { | ||
| 402 | /* XFER_UDMA_6 */ 0x1a861842, | ||
| 403 | /* XFER_UDMA_5 */ 0x1a861842, | ||
| 404 | /* XFER_UDMA_4 */ 0x1aae1842, | ||
| 405 | /* XFER_UDMA_3 */ 0x1a8e1842, | ||
| 406 | /* XFER_UDMA_2 */ 0x1a0e1842, | ||
| 407 | /* XFER_UDMA_1 */ 0x1a161854, | ||
| 408 | /* XFER_UDMA_0 */ 0x1a1a18ea, | ||
| 409 | |||
| 410 | /* XFER_MW_DMA_2 */ 0x2a821842, | ||
| 411 | /* XFER_MW_DMA_1 */ 0x2a821854, | ||
| 412 | /* XFER_MW_DMA_0 */ 0x2a8218ea, | ||
| 413 | |||
| 414 | /* XFER_PIO_4 */ 0x0a821842, | ||
| 415 | /* XFER_PIO_3 */ 0x0a821843, | ||
| 416 | /* XFER_PIO_2 */ 0x0a821855, | ||
| 417 | /* XFER_PIO_1 */ 0x0ac218a8, | ||
| 418 | /* XFER_PIO_0 */ 0x0b02190c | ||
| 419 | }; | ||
| 420 | |||
| 421 | static u32 sixty_six_base_hpt37x[] = { | ||
| 422 | /* XFER_UDMA_6 */ 0x1c86fe62, | ||
| 423 | /* XFER_UDMA_5 */ 0x1caefe62, /* 0x1c8afe62 */ | ||
| 424 | /* XFER_UDMA_4 */ 0x1c8afe62, | ||
| 425 | /* XFER_UDMA_3 */ 0x1c8efe62, | ||
| 426 | /* XFER_UDMA_2 */ 0x1c92fe62, | ||
| 427 | /* XFER_UDMA_1 */ 0x1c9afe62, | ||
| 428 | /* XFER_UDMA_0 */ 0x1c82fe62, | ||
| 429 | |||
| 430 | /* XFER_MW_DMA_2 */ 0x2c82fe62, | ||
| 431 | /* XFER_MW_DMA_1 */ 0x2c82fe66, | ||
| 432 | /* XFER_MW_DMA_0 */ 0x2c82ff2e, | ||
| 433 | |||
| 434 | /* XFER_PIO_4 */ 0x0c82fe62, | ||
| 435 | /* XFER_PIO_3 */ 0x0c82fe84, | ||
| 436 | /* XFER_PIO_2 */ 0x0c82fea6, | ||
| 437 | /* XFER_PIO_1 */ 0x0d02ff26, | ||
| 438 | /* XFER_PIO_0 */ 0x0d42ff7f | ||
| 439 | }; | ||
| 440 | #endif | ||
| 372 | 441 | ||
| 373 | #define HPT366_DEBUG_DRIVE_INFO 0 | 442 | #define HPT366_DEBUG_DRIVE_INFO 0 |
| 374 | #define HPT371_ALLOW_ATA133_6 1 | 443 | #define HPT371_ALLOW_ATA133_6 1 |
diff --git a/drivers/ide/pci/pdc202xx_new.c b/drivers/ide/pci/pdc202xx_new.c index 4234efeba606..2b4f44e45a1a 100644 --- a/drivers/ide/pci/pdc202xx_new.c +++ b/drivers/ide/pci/pdc202xx_new.c | |||
| @@ -482,8 +482,9 @@ static struct pci_dev * __devinit pdc20270_get_dev2(struct pci_dev *dev) | |||
| 482 | { | 482 | { |
| 483 | struct pci_dev *dev2; | 483 | struct pci_dev *dev2; |
| 484 | 484 | ||
| 485 | dev2 = pci_get_slot(dev->bus, PCI_DEVFN(PCI_SLOT(dev->devfn) + 2, | 485 | dev2 = pci_get_slot(dev->bus, PCI_DEVFN(PCI_SLOT(dev->devfn) + 1, |
| 486 | PCI_FUNC(dev->devfn))); | 486 | PCI_FUNC(dev->devfn))); |
| 487 | |||
| 487 | if (dev2 && | 488 | if (dev2 && |
| 488 | dev2->vendor == dev->vendor && | 489 | dev2->vendor == dev->vendor && |
| 489 | dev2->device == dev->device) { | 490 | dev2->device == dev->device) { |
diff --git a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c index 25fd09053220..d2cd5a3d38f8 100644 --- a/drivers/ide/setup-pci.c +++ b/drivers/ide/setup-pci.c | |||
| @@ -704,7 +704,7 @@ EXPORT_SYMBOL_GPL(ide_setup_pci_devices); | |||
| 704 | /* | 704 | /* |
| 705 | * Module interfaces | 705 | * Module interfaces |
| 706 | */ | 706 | */ |
| 707 | 707 | ||
| 708 | static int pre_init = 1; /* Before first ordered IDE scan */ | 708 | static int pre_init = 1; /* Before first ordered IDE scan */ |
| 709 | static LIST_HEAD(ide_pci_drivers); | 709 | static LIST_HEAD(ide_pci_drivers); |
| 710 | 710 | ||
| @@ -714,7 +714,7 @@ static LIST_HEAD(ide_pci_drivers); | |||
| 714 | * @module: owner module of the driver | 714 | * @module: owner module of the driver |
| 715 | * | 715 | * |
| 716 | * Registers a driver with the IDE layer. The IDE layer arranges that | 716 | * Registers a driver with the IDE layer. The IDE layer arranges that |
| 717 | * boot time setup is done in the expected device order and then | 717 | * boot time setup is done in the expected device order and then |
| 718 | * hands the controllers off to the core PCI code to do the rest of | 718 | * hands the controllers off to the core PCI code to do the rest of |
| 719 | * the work. | 719 | * the work. |
| 720 | * | 720 | * |
| @@ -724,13 +724,12 @@ static LIST_HEAD(ide_pci_drivers); | |||
| 724 | int __ide_pci_register_driver(struct pci_driver *driver, struct module *module, | 724 | int __ide_pci_register_driver(struct pci_driver *driver, struct module *module, |
| 725 | const char *mod_name) | 725 | const char *mod_name) |
| 726 | { | 726 | { |
| 727 | if(!pre_init) | 727 | if (!pre_init) |
| 728 | return __pci_register_driver(driver, module, mod_name); | 728 | return __pci_register_driver(driver, module, mod_name); |
| 729 | driver->driver.owner = module; | 729 | driver->driver.owner = module; |
| 730 | list_add_tail(&driver->node, &ide_pci_drivers); | 730 | list_add_tail(&driver->node, &ide_pci_drivers); |
| 731 | return 0; | 731 | return 0; |
| 732 | } | 732 | } |
| 733 | |||
| 734 | EXPORT_SYMBOL_GPL(__ide_pci_register_driver); | 733 | EXPORT_SYMBOL_GPL(__ide_pci_register_driver); |
| 735 | 734 | ||
| 736 | /** | 735 | /** |
| @@ -741,17 +740,18 @@ EXPORT_SYMBOL_GPL(__ide_pci_register_driver); | |||
| 741 | * This is only used during boot up to get the ordering correct. After | 740 | * This is only used during boot up to get the ordering correct. After |
| 742 | * boot up the pci layer takes over the job. | 741 | * boot up the pci layer takes over the job. |
| 743 | */ | 742 | */ |
| 744 | 743 | ||
| 745 | static int __init ide_scan_pcidev(struct pci_dev *dev) | 744 | static int __init ide_scan_pcidev(struct pci_dev *dev) |
| 746 | { | 745 | { |
| 747 | struct list_head *l; | 746 | struct list_head *l; |
| 748 | struct pci_driver *d; | 747 | struct pci_driver *d; |
| 749 | 748 | ||
| 750 | list_for_each(l, &ide_pci_drivers) { | 749 | list_for_each(l, &ide_pci_drivers) { |
| 751 | d = list_entry(l, struct pci_driver, node); | 750 | d = list_entry(l, struct pci_driver, node); |
| 752 | if (d->id_table) { | 751 | if (d->id_table) { |
| 753 | const struct pci_device_id *id = pci_match_id(d->id_table, | 752 | const struct pci_device_id *id = |
| 754 | dev); | 753 | pci_match_id(d->id_table, dev); |
| 754 | |||
| 755 | if (id != NULL && d->probe(dev, id) >= 0) { | 755 | if (id != NULL && d->probe(dev, id) >= 0) { |
| 756 | dev->driver = d; | 756 | dev->driver = d; |
| 757 | pci_dev_get(dev); | 757 | pci_dev_get(dev); |
| @@ -779,13 +779,13 @@ void __init ide_scan_pcibus (int scan_direction) | |||
| 779 | 779 | ||
| 780 | pre_init = 0; | 780 | pre_init = 0; |
| 781 | if (!scan_direction) | 781 | if (!scan_direction) |
| 782 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) | 782 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev))) |
| 783 | ide_scan_pcidev(dev); | 783 | ide_scan_pcidev(dev); |
| 784 | else | 784 | else |
| 785 | while ((dev = pci_get_device_reverse(PCI_ANY_ID, PCI_ANY_ID, dev)) | 785 | while ((dev = pci_get_device_reverse(PCI_ANY_ID, PCI_ANY_ID, |
| 786 | != NULL) | 786 | dev))) |
| 787 | ide_scan_pcidev(dev); | 787 | ide_scan_pcidev(dev); |
| 788 | 788 | ||
| 789 | /* | 789 | /* |
| 790 | * Hand the drivers over to the PCI layer now we | 790 | * Hand the drivers over to the PCI layer now we |
| 791 | * are post init. | 791 | * are post init. |
| @@ -794,9 +794,10 @@ void __init ide_scan_pcibus (int scan_direction) | |||
| 794 | list_for_each_safe(l, n, &ide_pci_drivers) { | 794 | list_for_each_safe(l, n, &ide_pci_drivers) { |
| 795 | list_del(l); | 795 | list_del(l); |
| 796 | d = list_entry(l, struct pci_driver, node); | 796 | d = list_entry(l, struct pci_driver, node); |
| 797 | if (__pci_register_driver(d, d->driver.owner, d->driver.mod_name)) | 797 | if (__pci_register_driver(d, d->driver.owner, |
| 798 | printk(KERN_ERR "%s: failed to register driver for %s\n", | 798 | d->driver.mod_name)) |
| 799 | __FUNCTION__, d->driver.mod_name); | 799 | printk(KERN_ERR "%s: failed to register %s driver\n", |
| 800 | __FUNCTION__, d->driver.mod_name); | ||
| 800 | } | 801 | } |
| 801 | } | 802 | } |
| 802 | #endif | 803 | #endif |
