diff options
| author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-06-11 14:31:43 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-06-11 14:31:43 -0400 |
| commit | bb3d2dd72302ea3eefcc6738cdd39ed5864b62f8 (patch) | |
| tree | 94aea714ae4b2b39e05aeb32d0dffccc8a15a8a8 | |
| parent | d5a169c87967981d06616c3c99408bc40ec9f618 (diff) | |
| parent | c1183a3345f2e553fa0907a453cbb311c7e1698c (diff) | |
Merge master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6:
ide: Add the MCP73/77 support to PATA driver
Add the PATA controller device ID to pci_ids.h for MCP73/MCP77.
hpt366: disallow Ultra133 for HPT374
ide: generic IDE PCI driver, add another device exception
ide: HPA detect from resume
it821x: RAID mode fixes
serverworks: fix CSB6 tuning logic
serverworks: remove crappy code
| -rw-r--r-- | drivers/ide/ide-disk.c | 12 | ||||
| -rw-r--r-- | drivers/ide/ide-probe.c | 12 | ||||
| -rw-r--r-- | drivers/ide/ide.c | 9 | ||||
| -rw-r--r-- | drivers/ide/pci/amd74xx.c | 12 | ||||
| -rw-r--r-- | drivers/ide/pci/generic.c | 37 | ||||
| -rw-r--r-- | drivers/ide/pci/hpt366.c | 8 | ||||
| -rw-r--r-- | drivers/ide/pci/it821x.c | 34 | ||||
| -rw-r--r-- | drivers/ide/pci/serverworks.c | 51 | ||||
| -rw-r--r-- | include/linux/ide.h | 1 | ||||
| -rw-r--r-- | include/linux/pci_ids.h | 2 |
10 files changed, 115 insertions, 63 deletions
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 7fff773f2df7..dc2175c81f5e 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c | |||
| @@ -1037,6 +1037,17 @@ static void ide_disk_release(struct kref *kref) | |||
| 1037 | 1037 | ||
| 1038 | static int ide_disk_probe(ide_drive_t *drive); | 1038 | static int ide_disk_probe(ide_drive_t *drive); |
| 1039 | 1039 | ||
| 1040 | /* | ||
| 1041 | * On HPA drives the capacity needs to be | ||
| 1042 | * reinitilized on resume otherwise the disk | ||
| 1043 | * can not be used and a hard reset is required | ||
| 1044 | */ | ||
| 1045 | static void ide_disk_resume(ide_drive_t *drive) | ||
| 1046 | { | ||
| 1047 | if (idedisk_supports_hpa(drive->id)) | ||
| 1048 | init_idedisk_capacity(drive); | ||
| 1049 | } | ||
| 1050 | |||
| 1040 | static void ide_device_shutdown(ide_drive_t *drive) | 1051 | static void ide_device_shutdown(ide_drive_t *drive) |
| 1041 | { | 1052 | { |
| 1042 | #ifdef CONFIG_ALPHA | 1053 | #ifdef CONFIG_ALPHA |
| @@ -1071,6 +1082,7 @@ static ide_driver_t idedisk_driver = { | |||
| 1071 | }, | 1082 | }, |
| 1072 | .probe = ide_disk_probe, | 1083 | .probe = ide_disk_probe, |
| 1073 | .remove = ide_disk_remove, | 1084 | .remove = ide_disk_remove, |
| 1085 | .resume = ide_disk_resume, | ||
| 1074 | .shutdown = ide_device_shutdown, | 1086 | .shutdown = ide_device_shutdown, |
| 1075 | .version = IDEDISK_VERSION, | 1087 | .version = IDEDISK_VERSION, |
| 1076 | .media = ide_disk, | 1088 | .media = ide_disk, |
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 3cebed77f55d..41bfa4d21ab6 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
| @@ -717,7 +717,7 @@ EXPORT_SYMBOL_GPL(ide_undecoded_slave); | |||
| 717 | * This routine only knows how to look for drive units 0 and 1 | 717 | * This routine only knows how to look for drive units 0 and 1 |
| 718 | * on an interface, so any setting of MAX_DRIVES > 2 won't work here. | 718 | * on an interface, so any setting of MAX_DRIVES > 2 won't work here. |
| 719 | */ | 719 | */ |
| 720 | static void probe_hwif(ide_hwif_t *hwif) | 720 | static void probe_hwif(ide_hwif_t *hwif, void (*fixup)(ide_hwif_t *hwif)) |
| 721 | { | 721 | { |
| 722 | unsigned int unit; | 722 | unsigned int unit; |
| 723 | unsigned long flags; | 723 | unsigned long flags; |
| @@ -820,6 +820,9 @@ static void probe_hwif(ide_hwif_t *hwif) | |||
| 820 | return; | 820 | return; |
| 821 | } | 821 | } |
| 822 | 822 | ||
| 823 | if (fixup) | ||
| 824 | fixup(hwif); | ||
| 825 | |||
| 823 | for (unit = 0; unit < MAX_DRIVES; ++unit) { | 826 | for (unit = 0; unit < MAX_DRIVES; ++unit) { |
| 824 | ide_drive_t *drive = &hwif->drives[unit]; | 827 | ide_drive_t *drive = &hwif->drives[unit]; |
| 825 | 828 | ||
| @@ -874,10 +877,7 @@ static int hwif_init(ide_hwif_t *hwif); | |||
| 874 | 877 | ||
| 875 | int probe_hwif_init_with_fixup(ide_hwif_t *hwif, void (*fixup)(ide_hwif_t *hwif)) | 878 | int probe_hwif_init_with_fixup(ide_hwif_t *hwif, void (*fixup)(ide_hwif_t *hwif)) |
| 876 | { | 879 | { |
| 877 | probe_hwif(hwif); | 880 | probe_hwif(hwif, fixup); |
| 878 | |||
| 879 | if (fixup) | ||
| 880 | fixup(hwif); | ||
| 881 | 881 | ||
| 882 | if (!hwif_init(hwif)) { | 882 | if (!hwif_init(hwif)) { |
| 883 | printk(KERN_INFO "%s: failed to initialize IDE interface\n", | 883 | printk(KERN_INFO "%s: failed to initialize IDE interface\n", |
| @@ -1404,7 +1404,7 @@ int ideprobe_init (void) | |||
| 1404 | 1404 | ||
| 1405 | for (index = 0; index < MAX_HWIFS; ++index) | 1405 | for (index = 0; index < MAX_HWIFS; ++index) |
| 1406 | if (probe[index]) | 1406 | if (probe[index]) |
| 1407 | probe_hwif(&ide_hwifs[index]); | 1407 | probe_hwif(&ide_hwifs[index], NULL); |
| 1408 | for (index = 0; index < MAX_HWIFS; ++index) | 1408 | for (index = 0; index < MAX_HWIFS; ++index) |
| 1409 | if (probe[index]) | 1409 | if (probe[index]) |
| 1410 | hwif_init(&ide_hwifs[index]); | 1410 | hwif_init(&ide_hwifs[index]); |
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 6002713a20a1..0af0d1614f75 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
| @@ -1010,9 +1010,11 @@ static int generic_ide_resume(struct device *dev) | |||
| 1010 | { | 1010 | { |
| 1011 | ide_drive_t *drive = dev->driver_data; | 1011 | ide_drive_t *drive = dev->driver_data; |
| 1012 | ide_hwif_t *hwif = HWIF(drive); | 1012 | ide_hwif_t *hwif = HWIF(drive); |
| 1013 | ide_driver_t *drv = to_ide_driver(dev->driver); | ||
| 1013 | struct request rq; | 1014 | struct request rq; |
| 1014 | struct request_pm_state rqpm; | 1015 | struct request_pm_state rqpm; |
| 1015 | ide_task_t args; | 1016 | ide_task_t args; |
| 1017 | int err; | ||
| 1016 | 1018 | ||
| 1017 | /* Call ACPI _STM only once */ | 1019 | /* Call ACPI _STM only once */ |
| 1018 | if (!(drive->dn % 2)) | 1020 | if (!(drive->dn % 2)) |
| @@ -1029,7 +1031,12 @@ static int generic_ide_resume(struct device *dev) | |||
| 1029 | rqpm.pm_step = ide_pm_state_start_resume; | 1031 | rqpm.pm_step = ide_pm_state_start_resume; |
| 1030 | rqpm.pm_state = PM_EVENT_ON; | 1032 | rqpm.pm_state = PM_EVENT_ON; |
| 1031 | 1033 | ||
| 1032 | return ide_do_drive_cmd(drive, &rq, ide_head_wait); | 1034 | err = ide_do_drive_cmd(drive, &rq, ide_head_wait); |
| 1035 | |||
| 1036 | if (err == 0 && drv && drv->resume) | ||
| 1037 | drv->resume(drive); | ||
| 1038 | |||
| 1039 | return err; | ||
| 1033 | } | 1040 | } |
| 1034 | 1041 | ||
| 1035 | int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device *bdev, | 1042 | int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device *bdev, |
diff --git a/drivers/ide/pci/amd74xx.c b/drivers/ide/pci/amd74xx.c index becb1a5648b0..9db1be826e80 100644 --- a/drivers/ide/pci/amd74xx.c +++ b/drivers/ide/pci/amd74xx.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Version 2.13 | 2 | * Version 2.15 |
| 3 | * | 3 | * |
| 4 | * AMD 755/756/766/8111 and nVidia nForce/2/2s/3/3s/CK804/MCP04 | 4 | * AMD 755/756/766/8111 and nVidia nForce/2/2s/3/3s/CK804/MCP04 |
| 5 | * IDE driver for Linux. | 5 | * IDE driver for Linux. |
| @@ -76,6 +76,8 @@ static struct amd_ide_chip { | |||
| 76 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE, 0x50, AMD_UDMA_133 }, | 76 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE, 0x50, AMD_UDMA_133 }, |
| 77 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE, 0x50, AMD_UDMA_133 }, | 77 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE, 0x50, AMD_UDMA_133 }, |
| 78 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE, 0x50, AMD_UDMA_133 }, | 78 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE, 0x50, AMD_UDMA_133 }, |
| 79 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_IDE, 0x50, AMD_UDMA_133 }, | ||
| 80 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE, 0x50, AMD_UDMA_133 }, | ||
| 79 | { PCI_DEVICE_ID_AMD_CS5536_IDE, 0x40, AMD_UDMA_100 }, | 81 | { PCI_DEVICE_ID_AMD_CS5536_IDE, 0x40, AMD_UDMA_100 }, |
| 80 | { 0 } | 82 | { 0 } |
| 81 | }; | 83 | }; |
| @@ -494,7 +496,9 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = { | |||
| 494 | /* 17 */ DECLARE_NV_DEV("NFORCE-MCP61"), | 496 | /* 17 */ DECLARE_NV_DEV("NFORCE-MCP61"), |
| 495 | /* 18 */ DECLARE_NV_DEV("NFORCE-MCP65"), | 497 | /* 18 */ DECLARE_NV_DEV("NFORCE-MCP65"), |
| 496 | /* 19 */ DECLARE_NV_DEV("NFORCE-MCP67"), | 498 | /* 19 */ DECLARE_NV_DEV("NFORCE-MCP67"), |
| 497 | /* 20 */ DECLARE_AMD_DEV("AMD5536"), | 499 | /* 20 */ DECLARE_NV_DEV("NFORCE-MCP73"), |
| 500 | /* 21 */ DECLARE_NV_DEV("NFORCE-MCP77"), | ||
| 501 | /* 22 */ DECLARE_AMD_DEV("AMD5536"), | ||
| 498 | }; | 502 | }; |
| 499 | 503 | ||
| 500 | static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id) | 504 | static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id) |
| @@ -534,7 +538,9 @@ static struct pci_device_id amd74xx_pci_tbl[] = { | |||
| 534 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 17 }, | 538 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 17 }, |
| 535 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 18 }, | 539 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 18 }, |
| 536 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 19 }, | 540 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 19 }, |
| 537 | { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 20 }, | 541 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 20 }, |
| 542 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 21 }, | ||
| 543 | { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 22 }, | ||
| 538 | { 0, }, | 544 | { 0, }, |
| 539 | }; | 545 | }; |
| 540 | MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl); | 546 | MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl); |
diff --git a/drivers/ide/pci/generic.c b/drivers/ide/pci/generic.c index f2c5a141ca10..0d51a11e81da 100644 --- a/drivers/ide/pci/generic.c +++ b/drivers/ide/pci/generic.c | |||
| @@ -198,32 +198,41 @@ static ide_pci_device_t generic_chipsets[] __devinitdata = { | |||
| 198 | static int __devinit generic_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 198 | static int __devinit generic_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
| 199 | { | 199 | { |
| 200 | ide_pci_device_t *d = &generic_chipsets[id->driver_data]; | 200 | ide_pci_device_t *d = &generic_chipsets[id->driver_data]; |
| 201 | u16 command; | ||
| 202 | int ret = -ENODEV; | 201 | int ret = -ENODEV; |
| 203 | 202 | ||
| 204 | /* Don't use the generic entry unless instructed to do so */ | 203 | /* Don't use the generic entry unless instructed to do so */ |
| 205 | if (id->driver_data == 0 && ide_generic_all == 0) | 204 | if (id->driver_data == 0 && ide_generic_all == 0) |
| 206 | goto out; | 205 | goto out; |
| 207 | 206 | ||
| 208 | if (dev->vendor == PCI_VENDOR_ID_UMC && | 207 | switch (dev->vendor) { |
| 209 | dev->device == PCI_DEVICE_ID_UMC_UM8886A && | 208 | case PCI_VENDOR_ID_UMC: |
| 210 | (!(PCI_FUNC(dev->devfn) & 1))) | 209 | if (dev->device == PCI_DEVICE_ID_UMC_UM8886A && |
| 211 | goto out; /* UM8886A/BF pair */ | 210 | !(PCI_FUNC(dev->devfn) & 1)) |
| 212 | 211 | goto out; /* UM8886A/BF pair */ | |
| 213 | if (dev->vendor == PCI_VENDOR_ID_OPTI && | 212 | break; |
| 214 | dev->device == PCI_DEVICE_ID_OPTI_82C558 && | 213 | case PCI_VENDOR_ID_OPTI: |
| 215 | (!(PCI_FUNC(dev->devfn) & 1))) | 214 | if (dev->device == PCI_DEVICE_ID_OPTI_82C558 && |
| 216 | goto out; | 215 | !(PCI_FUNC(dev->devfn) & 1)) |
| 217 | 216 | goto out; | |
| 218 | if (dev->vendor == PCI_VENDOR_ID_JMICRON) { | 217 | break; |
| 219 | if (dev->device != PCI_DEVICE_ID_JMICRON_JMB368 && PCI_FUNC(dev->devfn) != 1) | 218 | case PCI_VENDOR_ID_JMICRON: |
| 219 | if (dev->device != PCI_DEVICE_ID_JMICRON_JMB368 && | ||
| 220 | PCI_FUNC(dev->devfn) != 1) | ||
| 221 | goto out; | ||
| 222 | break; | ||
| 223 | case PCI_VENDOR_ID_NS: | ||
| 224 | if (dev->device == PCI_DEVICE_ID_NS_87410 && | ||
| 225 | (dev->class >> 8) != PCI_CLASS_STORAGE_IDE) | ||
| 220 | goto out; | 226 | goto out; |
| 227 | break; | ||
| 221 | } | 228 | } |
| 222 | 229 | ||
| 223 | if (dev->vendor != PCI_VENDOR_ID_JMICRON) { | 230 | if (dev->vendor != PCI_VENDOR_ID_JMICRON) { |
| 231 | u16 command; | ||
| 224 | pci_read_config_word(dev, PCI_COMMAND, &command); | 232 | pci_read_config_word(dev, PCI_COMMAND, &command); |
| 225 | if (!(command & PCI_COMMAND_IO)) { | 233 | if (!(command & PCI_COMMAND_IO)) { |
| 226 | printk(KERN_INFO "Skipping disabled %s IDE controller.\n", d->name); | 234 | printk(KERN_INFO "Skipping disabled %s IDE " |
| 235 | "controller.\n", d->name); | ||
| 227 | goto out; | 236 | goto out; |
| 228 | } | 237 | } |
| 229 | } | 238 | } |
diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c index fcbc5605b38e..ce8a5449a574 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.03 May 4, 2007 | 2 | * linux/drivers/ide/pci/hpt366.c Version 1.04 Jun 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. |
| @@ -106,7 +106,8 @@ | |||
| 106 | * switch to calculating PCI clock frequency based on the chip's base DPLL | 106 | * switch to calculating PCI clock frequency based on the chip's base DPLL |
| 107 | * frequency | 107 | * frequency |
| 108 | * - switch to using the DPLL clock and enable UltraATA/133 mode by default on | 108 | * - switch to using the DPLL clock and enable UltraATA/133 mode by default on |
| 109 | * anything newer than HPT370/A | 109 | * anything newer than HPT370/A (except HPT374 that is not capable of this |
| 110 | * mode according to the manual) | ||
| 110 | * - fold PCI clock detection and DPLL setup code into init_chipset_hpt366(), | 111 | * - fold PCI clock detection and DPLL setup code into init_chipset_hpt366(), |
| 111 | * also fixing the interchanged 25/40 MHz PCI clock cases for HPT36x chips; | 112 | * also fixing the interchanged 25/40 MHz PCI clock cases for HPT36x chips; |
| 112 | * unify HPT36x/37x timing setup code and the speedproc handlers by joining | 113 | * unify HPT36x/37x timing setup code and the speedproc handlers by joining |
| @@ -365,7 +366,6 @@ static u32 sixty_six_base_hpt37x[] = { | |||
| 365 | }; | 366 | }; |
| 366 | 367 | ||
| 367 | #define HPT366_DEBUG_DRIVE_INFO 0 | 368 | #define HPT366_DEBUG_DRIVE_INFO 0 |
| 368 | #define HPT374_ALLOW_ATA133_6 1 | ||
| 369 | #define HPT371_ALLOW_ATA133_6 1 | 369 | #define HPT371_ALLOW_ATA133_6 1 |
| 370 | #define HPT302_ALLOW_ATA133_6 1 | 370 | #define HPT302_ALLOW_ATA133_6 1 |
| 371 | #define HPT372_ALLOW_ATA133_6 1 | 371 | #define HPT372_ALLOW_ATA133_6 1 |
| @@ -450,7 +450,7 @@ static struct hpt_info hpt370a __devinitdata = { | |||
| 450 | 450 | ||
| 451 | static struct hpt_info hpt374 __devinitdata = { | 451 | static struct hpt_info hpt374 __devinitdata = { |
| 452 | .chip_type = HPT374, | 452 | .chip_type = HPT374, |
| 453 | .max_mode = HPT374_ALLOW_ATA133_6 ? 4 : 3, | 453 | .max_mode = 3, |
| 454 | .dpll_clk = 48, | 454 | .dpll_clk = 48, |
| 455 | .settings = hpt37x_settings | 455 | .settings = hpt37x_settings |
| 456 | }; | 456 | }; |
diff --git a/drivers/ide/pci/it821x.c b/drivers/ide/pci/it821x.c index 5faaff87d580..4bd4bf02e917 100644 --- a/drivers/ide/pci/it821x.c +++ b/drivers/ide/pci/it821x.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | 1 | ||
| 2 | /* | 2 | /* |
| 3 | * linux/drivers/ide/pci/it821x.c Version 0.10 Mar 10 2007 | 3 | * linux/drivers/ide/pci/it821x.c Version 0.15 Jun 2 2007 |
| 4 | * | 4 | * |
| 5 | * Copyright (C) 2004 Red Hat <alan@redhat.com> | 5 | * Copyright (C) 2004 Red Hat <alan@redhat.com> |
| 6 | * Copyright (C) 2007 Bartlomiej Zolnierkiewicz | 6 | * Copyright (C) 2007 Bartlomiej Zolnierkiewicz |
| @@ -262,7 +262,7 @@ static int it821x_tunepio(ide_drive_t *drive, u8 set_pio) | |||
| 262 | } | 262 | } |
| 263 | 263 | ||
| 264 | if (itdev->smart) | 264 | if (itdev->smart) |
| 265 | goto set_drive_speed; | 265 | return 0; |
| 266 | 266 | ||
| 267 | /* We prefer 66Mhz clock for PIO 0-3, don't care for PIO4 */ | 267 | /* We prefer 66Mhz clock for PIO 0-3, don't care for PIO4 */ |
| 268 | itdev->want[unit][1] = pio_want[set_pio]; | 268 | itdev->want[unit][1] = pio_want[set_pio]; |
| @@ -271,7 +271,6 @@ static int it821x_tunepio(ide_drive_t *drive, u8 set_pio) | |||
| 271 | it821x_clock_strategy(drive); | 271 | it821x_clock_strategy(drive); |
| 272 | it821x_program(drive, itdev->pio[unit]); | 272 | it821x_program(drive, itdev->pio[unit]); |
| 273 | 273 | ||
| 274 | set_drive_speed: | ||
| 275 | return ide_config_drive_speed(drive, XFER_PIO_0 + set_pio); | 274 | return ide_config_drive_speed(drive, XFER_PIO_0 + set_pio); |
| 276 | } | 275 | } |
| 277 | 276 | ||
| @@ -455,12 +454,12 @@ static int it821x_tune_chipset (ide_drive_t *drive, byte xferspeed) | |||
| 455 | default: | 454 | default: |
| 456 | return 1; | 455 | return 1; |
| 457 | } | 456 | } |
| 457 | |||
| 458 | return ide_config_drive_speed(drive, speed); | ||
| 458 | } | 459 | } |
| 459 | /* | 460 | |
| 460 | * In smart mode the clocking is done by the host controller | 461 | /* don't touch anything in the smart mode */ |
| 461 | * snooping the mode we picked. The rest of it is not our problem | 462 | return 0; |
| 462 | */ | ||
| 463 | return ide_config_drive_speed(drive, speed); | ||
| 464 | } | 463 | } |
| 465 | 464 | ||
| 466 | /** | 465 | /** |
| @@ -559,17 +558,10 @@ static void __devinit it821x_fixups(ide_hwif_t *hwif) | |||
| 559 | if(idbits[129] != 1) | 558 | if(idbits[129] != 1) |
| 560 | printk("(%dK stripe)", idbits[146]); | 559 | printk("(%dK stripe)", idbits[146]); |
| 561 | printk(".\n"); | 560 | printk(".\n"); |
| 562 | /* Now the core code will have wrongly decided no DMA | ||
| 563 | so we need to fix this */ | ||
| 564 | hwif->dma_off_quietly(drive); | ||
| 565 | #ifdef CONFIG_IDEDMA_ONLYDISK | ||
| 566 | if (drive->media == ide_disk) | ||
| 567 | #endif | ||
| 568 | ide_set_dma(drive); | ||
| 569 | } else { | 561 | } else { |
| 570 | /* Non RAID volume. Fixups to stop the core code | 562 | /* Non RAID volume. Fixups to stop the core code |
| 571 | doing unsupported things */ | 563 | doing unsupported things */ |
| 572 | id->field_valid &= 1; | 564 | id->field_valid &= 3; |
| 573 | id->queue_depth = 0; | 565 | id->queue_depth = 0; |
| 574 | id->command_set_1 = 0; | 566 | id->command_set_1 = 0; |
| 575 | id->command_set_2 &= 0xC400; | 567 | id->command_set_2 &= 0xC400; |
| @@ -584,6 +576,16 @@ static void __devinit it821x_fixups(ide_hwif_t *hwif) | |||
| 584 | printk(KERN_INFO "%s: Performing identify fixups.\n", | 576 | printk(KERN_INFO "%s: Performing identify fixups.\n", |
| 585 | drive->name); | 577 | drive->name); |
| 586 | } | 578 | } |
| 579 | |||
| 580 | /* | ||
| 581 | * Set MWDMA0 mode as enabled/support - just to tell | ||
| 582 | * IDE core that DMA is supported (it821x hardware | ||
| 583 | * takes care of DMA mode programming). | ||
| 584 | */ | ||
| 585 | if (id->capability & 1) { | ||
| 586 | id->dma_mword |= 0x0101; | ||
| 587 | drive->current_speed = XFER_MW_DMA_0; | ||
| 588 | } | ||
| 587 | } | 589 | } |
| 588 | 590 | ||
| 589 | } | 591 | } |
diff --git a/drivers/ide/pci/serverworks.c b/drivers/ide/pci/serverworks.c index 47bcd91c9b5f..d9c4fd1ae996 100644 --- a/drivers/ide/pci/serverworks.c +++ b/drivers/ide/pci/serverworks.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/drivers/ide/pci/serverworks.c Version 0.9 Mar 4 2007 | 2 | * linux/drivers/ide/pci/serverworks.c Version 0.11 Jun 2 2007 |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 1998-2000 Michel Aubry | 4 | * Copyright (C) 1998-2000 Michel Aubry |
| 5 | * Copyright (C) 1998-2000 Andrzej Krzysztofowicz | 5 | * Copyright (C) 1998-2000 Andrzej Krzysztofowicz |
| @@ -170,42 +170,55 @@ static int svwks_tune_chipset (ide_drive_t *drive, u8 xferspeed) | |||
| 170 | if (!drive->init_speed) { | 170 | if (!drive->init_speed) { |
| 171 | u8 dma_stat = inb(hwif->dma_status); | 171 | u8 dma_stat = inb(hwif->dma_status); |
| 172 | 172 | ||
| 173 | dma_pio: | ||
| 174 | if (((ultra_enable << (7-drive->dn) & 0x80) == 0x80) && | 173 | if (((ultra_enable << (7-drive->dn) & 0x80) == 0x80) && |
| 175 | ((dma_stat & (1<<(5+unit))) == (1<<(5+unit)))) { | 174 | ((dma_stat & (1<<(5+unit))) == (1<<(5+unit)))) { |
| 176 | drive->current_speed = drive->init_speed = XFER_UDMA_0 + udma_modes[(ultra_timing >> (4*unit)) & ~(0xF0)]; | 175 | drive->current_speed = drive->init_speed = XFER_UDMA_0 + udma_modes[(ultra_timing >> (4*unit)) & ~(0xF0)]; |
| 177 | return 0; | 176 | return 0; |
| 178 | } else if ((dma_timing) && | 177 | } else if ((dma_timing) && |
| 179 | ((dma_stat&(1<<(5+unit)))==(1<<(5+unit)))) { | 178 | ((dma_stat&(1<<(5+unit)))==(1<<(5+unit)))) { |
| 180 | u8 dmaspeed = dma_timing; | 179 | u8 dmaspeed; |
| 181 | 180 | ||
| 182 | dma_timing &= ~0xFFU; | 181 | switch (dma_timing & 0x77) { |
| 183 | if ((dmaspeed & 0x20) == 0x20) | 182 | case 0x20: |
| 184 | dmaspeed = XFER_MW_DMA_2; | 183 | dmaspeed = XFER_MW_DMA_2; |
| 185 | else if ((dmaspeed & 0x21) == 0x21) | 184 | break; |
| 185 | case 0x21: | ||
| 186 | dmaspeed = XFER_MW_DMA_1; | 186 | dmaspeed = XFER_MW_DMA_1; |
| 187 | else if ((dmaspeed & 0x77) == 0x77) | 187 | break; |
| 188 | case 0x77: | ||
| 188 | dmaspeed = XFER_MW_DMA_0; | 189 | dmaspeed = XFER_MW_DMA_0; |
| 189 | else | 190 | break; |
| 191 | default: | ||
| 190 | goto dma_pio; | 192 | goto dma_pio; |
| 193 | } | ||
| 194 | |||
| 191 | drive->current_speed = drive->init_speed = dmaspeed; | 195 | drive->current_speed = drive->init_speed = dmaspeed; |
| 192 | return 0; | 196 | return 0; |
| 193 | } else if (pio_timing) { | 197 | } |
| 194 | u8 piospeed = pio_timing; | 198 | dma_pio: |
| 199 | if (pio_timing) { | ||
| 200 | u8 piospeed; | ||
| 195 | 201 | ||
| 196 | pio_timing &= ~0xFFU; | 202 | switch (pio_timing & 0x7f) { |
| 197 | if ((piospeed & 0x20) == 0x20) | 203 | case 0x20: |
| 198 | piospeed = XFER_PIO_4; | 204 | piospeed = XFER_PIO_4; |
| 199 | else if ((piospeed & 0x22) == 0x22) | 205 | break; |
| 206 | case 0x22: | ||
| 200 | piospeed = XFER_PIO_3; | 207 | piospeed = XFER_PIO_3; |
| 201 | else if ((piospeed & 0x34) == 0x34) | 208 | break; |
| 209 | case 0x34: | ||
| 202 | piospeed = XFER_PIO_2; | 210 | piospeed = XFER_PIO_2; |
| 203 | else if ((piospeed & 0x47) == 0x47) | 211 | break; |
| 212 | case 0x47: | ||
| 204 | piospeed = XFER_PIO_1; | 213 | piospeed = XFER_PIO_1; |
| 205 | else if ((piospeed & 0x5d) == 0x5d) | 214 | break; |
| 215 | case 0x5d: | ||
| 206 | piospeed = XFER_PIO_0; | 216 | piospeed = XFER_PIO_0; |
| 207 | else | 217 | break; |
| 218 | default: | ||
| 208 | goto oem_setup_failed; | 219 | goto oem_setup_failed; |
| 220 | } | ||
| 221 | |||
| 209 | drive->current_speed = drive->init_speed = piospeed; | 222 | drive->current_speed = drive->init_speed = piospeed; |
| 210 | return 0; | 223 | return 0; |
| 211 | } | 224 | } |
| @@ -214,8 +227,8 @@ dma_pio: | |||
| 214 | 227 | ||
| 215 | oem_setup_failed: | 228 | oem_setup_failed: |
| 216 | 229 | ||
| 217 | pio_timing &= ~0xFFU; | 230 | pio_timing = 0; |
| 218 | dma_timing &= ~0xFFU; | 231 | dma_timing = 0; |
| 219 | ultra_timing &= ~(0x0F << (4*unit)); | 232 | ultra_timing &= ~(0x0F << (4*unit)); |
| 220 | ultra_enable &= ~(0x01 << drive->dn); | 233 | ultra_enable &= ~(0x01 << drive->dn); |
| 221 | csb5_pio &= ~(0x0F << (4*drive->dn)); | 234 | csb5_pio &= ~(0x0F << (4*drive->dn)); |
diff --git a/include/linux/ide.h b/include/linux/ide.h index 07aba87d369d..1e365acdd369 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
| @@ -1001,6 +1001,7 @@ struct ide_driver_s { | |||
| 1001 | struct device_driver gen_driver; | 1001 | struct device_driver gen_driver; |
| 1002 | int (*probe)(ide_drive_t *); | 1002 | int (*probe)(ide_drive_t *); |
| 1003 | void (*remove)(ide_drive_t *); | 1003 | void (*remove)(ide_drive_t *); |
| 1004 | void (*resume)(ide_drive_t *); | ||
| 1004 | void (*shutdown)(ide_drive_t *); | 1005 | void (*shutdown)(ide_drive_t *); |
| 1005 | #ifdef CONFIG_IDE_PROC_FS | 1006 | #ifdef CONFIG_IDE_PROC_FS |
| 1006 | ide_proc_entry_t *proc; | 1007 | ide_proc_entry_t *proc; |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 6a115cffea34..9a03b47da603 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
| @@ -1233,6 +1233,8 @@ | |||
| 1233 | #define PCI_DEVICE_ID_NVIDIA_NVENET_26 0x054E | 1233 | #define PCI_DEVICE_ID_NVIDIA_NVENET_26 0x054E |
| 1234 | #define PCI_DEVICE_ID_NVIDIA_NVENET_27 0x054F | 1234 | #define PCI_DEVICE_ID_NVIDIA_NVENET_27 0x054F |
| 1235 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE 0x0560 | 1235 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE 0x0560 |
| 1236 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_IDE 0x056C | ||
| 1237 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE 0x0759 | ||
| 1236 | 1238 | ||
| 1237 | #define PCI_VENDOR_ID_IMS 0x10e0 | 1239 | #define PCI_VENDOR_ID_IMS 0x10e0 |
| 1238 | #define PCI_DEVICE_ID_IMS_TT128 0x9128 | 1240 | #define PCI_DEVICE_ID_IMS_TT128 0x9128 |
