diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2007-07-09 17:17:58 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2007-07-09 17:17:58 -0400 |
commit | 49521f97ccd3c2bf6e71a91cea8fe65d170fa4fb (patch) | |
tree | f61c34da6092f2f1a97a78da567afc59ad40850b /drivers/ide/pci | |
parent | 75b1d97535327d0428c6bffd9d5407e65546fd5d (diff) |
ide: add short cables support
This patch allows users to override both host and device side cable detection
with "ideX=ata66" kernel parameter. Thanks to this it should be now possible
to use UDMA > 2 modes on systems (laptops mainly) which use short 40-pin cable
instead of 80-pin one.
Next patches add automatic detection of some systems using short cables.
Changes:
* Rename hwif->udma_four to hwif->cbl and make it u8.
* Convert all existing users accordingly (use ATA_CBL_* defines while at it).
* Add ATA_CBL_PATA40_SHORT support to ide-iops.c:eighty_ninty_three().
* Use ATA_CBL_PATA40_SHORT for "ideX=ata66" kernel parameter.
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Reviewed-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Diffstat (limited to 'drivers/ide/pci')
-rw-r--r-- | drivers/ide/pci/aec62xx.c | 5 | ||||
-rw-r--r-- | drivers/ide/pci/alim15x3.c | 9 | ||||
-rw-r--r-- | drivers/ide/pci/amd74xx.c | 9 | ||||
-rw-r--r-- | drivers/ide/pci/atiixp.c | 5 | ||||
-rw-r--r-- | drivers/ide/pci/cmd64x.c | 10 | ||||
-rw-r--r-- | drivers/ide/pci/cs5535.c | 6 | ||||
-rw-r--r-- | drivers/ide/pci/hpt366.c | 4 | ||||
-rw-r--r-- | drivers/ide/pci/it8213.c | 8 | ||||
-rw-r--r-- | drivers/ide/pci/it821x.c | 9 | ||||
-rw-r--r-- | drivers/ide/pci/jmicron.c | 20 | ||||
-rw-r--r-- | drivers/ide/pci/pdc202xx_new.c | 9 | ||||
-rw-r--r-- | drivers/ide/pci/pdc202xx_old.c | 9 | ||||
-rw-r--r-- | drivers/ide/pci/piix.c | 8 | ||||
-rw-r--r-- | drivers/ide/pci/scc_pata.c | 2 | ||||
-rw-r--r-- | drivers/ide/pci/serverworks.c | 26 | ||||
-rw-r--r-- | drivers/ide/pci/siimage.c | 18 | ||||
-rw-r--r-- | drivers/ide/pci/sis5513.c | 9 | ||||
-rw-r--r-- | drivers/ide/pci/slc90e66.c | 5 | ||||
-rw-r--r-- | drivers/ide/pci/tc86c001.c | 4 | ||||
-rw-r--r-- | drivers/ide/pci/via82cxxx.c | 9 |
20 files changed, 104 insertions, 80 deletions
diff --git a/drivers/ide/pci/aec62xx.c b/drivers/ide/pci/aec62xx.c index 794ac40ec90f..e5d09367627e 100644 --- a/drivers/ide/pci/aec62xx.c +++ b/drivers/ide/pci/aec62xx.c | |||
@@ -234,11 +234,12 @@ static void __devinit init_hwif_aec62xx(ide_hwif_t *hwif) | |||
234 | pci_read_config_byte (dev, 0x54, ®54); | 234 | pci_read_config_byte (dev, 0x54, ®54); |
235 | pci_write_config_byte(dev, 0x54, (reg54 & ~mask)); | 235 | pci_write_config_byte(dev, 0x54, (reg54 & ~mask)); |
236 | spin_unlock_irqrestore(&ide_lock, flags); | 236 | spin_unlock_irqrestore(&ide_lock, flags); |
237 | } else if (!hwif->udma_four) { | 237 | } else if (hwif->cbl != ATA_CBL_PATA40_SHORT) { |
238 | u8 ata66 = 0, mask = hwif->channel ? 0x02 : 0x01; | 238 | u8 ata66 = 0, mask = hwif->channel ? 0x02 : 0x01; |
239 | 239 | ||
240 | pci_read_config_byte(hwif->pci_dev, 0x49, &ata66); | 240 | pci_read_config_byte(hwif->pci_dev, 0x49, &ata66); |
241 | hwif->udma_four = (ata66 & mask) ? 0 : 1; | 241 | |
242 | hwif->cbl = (ata66 & mask) ? ATA_CBL_PATA40 : ATA_CBL_PATA80; | ||
242 | } | 243 | } |
243 | 244 | ||
244 | if (!noautodma) | 245 | if (!noautodma) |
diff --git a/drivers/ide/pci/alim15x3.c b/drivers/ide/pci/alim15x3.c index 27525ec2e19a..d52c54bb6a78 100644 --- a/drivers/ide/pci/alim15x3.c +++ b/drivers/ide/pci/alim15x3.c | |||
@@ -594,7 +594,7 @@ out: | |||
594 | * FIXME: frobs bits that are not defined on newer ALi devicea | 594 | * FIXME: frobs bits that are not defined on newer ALi devicea |
595 | */ | 595 | */ |
596 | 596 | ||
597 | static unsigned int __devinit ata66_ali15x3 (ide_hwif_t *hwif) | 597 | static u8 __devinit ata66_ali15x3(ide_hwif_t *hwif) |
598 | { | 598 | { |
599 | struct pci_dev *dev = hwif->pci_dev; | 599 | struct pci_dev *dev = hwif->pci_dev; |
600 | unsigned int ata66 = 0; | 600 | unsigned int ata66 = 0; |
@@ -657,7 +657,7 @@ static unsigned int __devinit ata66_ali15x3 (ide_hwif_t *hwif) | |||
657 | 657 | ||
658 | local_irq_restore(flags); | 658 | local_irq_restore(flags); |
659 | 659 | ||
660 | return(ata66); | 660 | return ata66 ? ATA_CBL_PATA80 : ATA_CBL_PATA40; |
661 | } | 661 | } |
662 | 662 | ||
663 | /** | 663 | /** |
@@ -708,8 +708,9 @@ static void __devinit init_hwif_common_ali15x3 (ide_hwif_t *hwif) | |||
708 | hwif->dma_setup = &ali15x3_dma_setup; | 708 | hwif->dma_setup = &ali15x3_dma_setup; |
709 | if (!noautodma) | 709 | if (!noautodma) |
710 | hwif->autodma = 1; | 710 | hwif->autodma = 1; |
711 | if (!(hwif->udma_four)) | 711 | |
712 | hwif->udma_four = ata66_ali15x3(hwif); | 712 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) |
713 | hwif->cbl = ata66_ali15x3(hwif); | ||
713 | } | 714 | } |
714 | hwif->drives[0].autodma = hwif->autodma; | 715 | hwif->drives[0].autodma = hwif->autodma; |
715 | hwif->drives[1].autodma = hwif->autodma; | 716 | hwif->drives[1].autodma = hwif->autodma; |
diff --git a/drivers/ide/pci/amd74xx.c b/drivers/ide/pci/amd74xx.c index a7443f15b27a..84ed30cdb324 100644 --- a/drivers/ide/pci/amd74xx.c +++ b/drivers/ide/pci/amd74xx.c | |||
@@ -431,8 +431,13 @@ static void __devinit init_hwif_amd74xx(ide_hwif_t *hwif) | |||
431 | if ((amd_config->flags & AMD_BAD_SWDMA) == 0) | 431 | if ((amd_config->flags & AMD_BAD_SWDMA) == 0) |
432 | hwif->swdma_mask = 0x07; | 432 | hwif->swdma_mask = 0x07; |
433 | 433 | ||
434 | if (!hwif->udma_four) | 434 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) { |
435 | hwif->udma_four = (amd_80w >> hwif->channel) & 1; | 435 | if ((amd_80w >> hwif->channel) & 1) |
436 | hwif->cbl = ATA_CBL_PATA80; | ||
437 | else | ||
438 | hwif->cbl = ATA_CBL_PATA40; | ||
439 | } | ||
440 | |||
436 | hwif->ide_dma_check = &amd74xx_ide_dma_check; | 441 | hwif->ide_dma_check = &amd74xx_ide_dma_check; |
437 | if (!noautodma) | 442 | if (!noautodma) |
438 | hwif->autodma = 1; | 443 | hwif->autodma = 1; |
diff --git a/drivers/ide/pci/atiixp.c b/drivers/ide/pci/atiixp.c index 8ab33faf6f76..2761510309b3 100644 --- a/drivers/ide/pci/atiixp.c +++ b/drivers/ide/pci/atiixp.c | |||
@@ -264,10 +264,11 @@ static void __devinit init_hwif_atiixp(ide_hwif_t *hwif) | |||
264 | hwif->swdma_mask = 0x04; | 264 | hwif->swdma_mask = 0x04; |
265 | 265 | ||
266 | pci_read_config_byte(pdev, ATIIXP_IDE_UDMA_MODE + ch, &udma_mode); | 266 | pci_read_config_byte(pdev, ATIIXP_IDE_UDMA_MODE + ch, &udma_mode); |
267 | |||
267 | if ((udma_mode & 0x07) >= 0x04 || (udma_mode & 0x70) >= 0x40) | 268 | if ((udma_mode & 0x07) >= 0x04 || (udma_mode & 0x70) >= 0x40) |
268 | hwif->udma_four = 1; | 269 | hwif->cbl = ATA_CBL_PATA80; |
269 | else | 270 | else |
270 | hwif->udma_four = 0; | 271 | hwif->cbl = ATA_CBL_PATA40; |
271 | 272 | ||
272 | hwif->dma_host_on = &atiixp_dma_host_on; | 273 | hwif->dma_host_on = &atiixp_dma_host_on; |
273 | hwif->dma_host_off = &atiixp_dma_host_off; | 274 | hwif->dma_host_off = &atiixp_dma_host_off; |
diff --git a/drivers/ide/pci/cmd64x.c b/drivers/ide/pci/cmd64x.c index b0aa7d03b8a5..8631b6c8aa15 100644 --- a/drivers/ide/pci/cmd64x.c +++ b/drivers/ide/pci/cmd64x.c | |||
@@ -517,7 +517,7 @@ static unsigned int __devinit init_chipset_cmd64x(struct pci_dev *dev, const cha | |||
517 | return 0; | 517 | return 0; |
518 | } | 518 | } |
519 | 519 | ||
520 | static unsigned int __devinit ata66_cmd64x(ide_hwif_t *hwif) | 520 | static u8 __devinit ata66_cmd64x(ide_hwif_t *hwif) |
521 | { | 521 | { |
522 | struct pci_dev *dev = hwif->pci_dev; | 522 | struct pci_dev *dev = hwif->pci_dev; |
523 | u8 bmidecsr = 0, mask = hwif->channel ? 0x02 : 0x01; | 523 | u8 bmidecsr = 0, mask = hwif->channel ? 0x02 : 0x01; |
@@ -526,9 +526,9 @@ static unsigned int __devinit ata66_cmd64x(ide_hwif_t *hwif) | |||
526 | case PCI_DEVICE_ID_CMD_648: | 526 | case PCI_DEVICE_ID_CMD_648: |
527 | case PCI_DEVICE_ID_CMD_649: | 527 | case PCI_DEVICE_ID_CMD_649: |
528 | pci_read_config_byte(dev, BMIDECSR, &bmidecsr); | 528 | pci_read_config_byte(dev, BMIDECSR, &bmidecsr); |
529 | return (bmidecsr & mask) ? 1 : 0; | 529 | return (bmidecsr & mask) ? ATA_CBL_PATA80 : ATA_CBL_PATA40; |
530 | default: | 530 | default: |
531 | return 0; | 531 | return ATA_CBL_PATA40; |
532 | } | 532 | } |
533 | } | 533 | } |
534 | 534 | ||
@@ -568,8 +568,8 @@ static void __devinit init_hwif_cmd64x(ide_hwif_t *hwif) | |||
568 | 568 | ||
569 | hwif->ide_dma_check = &cmd64x_config_drive_for_dma; | 569 | hwif->ide_dma_check = &cmd64x_config_drive_for_dma; |
570 | 570 | ||
571 | if (!hwif->udma_four) | 571 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) |
572 | hwif->udma_four = ata66_cmd64x(hwif); | 572 | hwif->cbl = ata66_cmd64x(hwif); |
573 | 573 | ||
574 | switch (dev->device) { | 574 | switch (dev->device) { |
575 | case PCI_DEVICE_ID_CMD_648: | 575 | case PCI_DEVICE_ID_CMD_648: |
diff --git a/drivers/ide/pci/cs5535.c b/drivers/ide/pci/cs5535.c index 41925c47ef05..10f61f38243c 100644 --- a/drivers/ide/pci/cs5535.c +++ b/drivers/ide/pci/cs5535.c | |||
@@ -187,7 +187,8 @@ static u8 __devinit cs5535_cable_detect(struct pci_dev *dev) | |||
187 | 187 | ||
188 | /* if a 80 wire cable was detected */ | 188 | /* if a 80 wire cable was detected */ |
189 | pci_read_config_byte(dev, CS5535_CABLE_DETECT, &bit); | 189 | pci_read_config_byte(dev, CS5535_CABLE_DETECT, &bit); |
190 | return (bit & 1); | 190 | |
191 | return (bit & 1) ? ATA_CBL_PATA80 : ATA_CBL_PATA40; | ||
191 | } | 192 | } |
192 | 193 | ||
193 | /**** | 194 | /**** |
@@ -212,8 +213,7 @@ static void __devinit init_hwif_cs5535(ide_hwif_t *hwif) | |||
212 | hwif->ultra_mask = 0x1F; | 213 | hwif->ultra_mask = 0x1F; |
213 | hwif->mwdma_mask = 0x07; | 214 | hwif->mwdma_mask = 0x07; |
214 | 215 | ||
215 | 216 | hwif->cbl = cs5535_cable_detect(hwif->pci_dev); | |
216 | hwif->udma_four = cs5535_cable_detect(hwif->pci_dev); | ||
217 | 217 | ||
218 | if (!noautodma) | 218 | if (!noautodma) |
219 | hwif->autodma = 1; | 219 | hwif->autodma = 1; |
diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c index ce363c923613..4b6bae8eee82 100644 --- a/drivers/ide/pci/hpt366.c +++ b/drivers/ide/pci/hpt366.c | |||
@@ -1330,8 +1330,8 @@ static void __devinit init_hwif_hpt366(ide_hwif_t *hwif) | |||
1330 | } else | 1330 | } else |
1331 | pci_read_config_byte (dev, 0x5a, &scr1); | 1331 | pci_read_config_byte (dev, 0x5a, &scr1); |
1332 | 1332 | ||
1333 | if (!hwif->udma_four) | 1333 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) |
1334 | hwif->udma_four = (scr1 & ata66) ? 0 : 1; | 1334 | hwif->cbl = (scr1 & ata66) ? ATA_CBL_PATA40 : ATA_CBL_PATA80; |
1335 | 1335 | ||
1336 | hwif->ide_dma_check = &hpt366_config_drive_xfer_rate; | 1336 | hwif->ide_dma_check = &hpt366_config_drive_xfer_rate; |
1337 | 1337 | ||
diff --git a/drivers/ide/pci/it8213.c b/drivers/ide/pci/it8213.c index c04a02687b95..ff48c23e571e 100644 --- a/drivers/ide/pci/it8213.c +++ b/drivers/ide/pci/it8213.c | |||
@@ -231,7 +231,7 @@ static int it8213_config_drive_for_dma (ide_drive_t *drive) | |||
231 | 231 | ||
232 | static void __devinit init_hwif_it8213(ide_hwif_t *hwif) | 232 | static void __devinit init_hwif_it8213(ide_hwif_t *hwif) |
233 | { | 233 | { |
234 | u8 reg42h = 0, ata66 = 0; | 234 | u8 reg42h = 0; |
235 | 235 | ||
236 | hwif->speedproc = &it8213_tune_chipset; | 236 | hwif->speedproc = &it8213_tune_chipset; |
237 | hwif->tuneproc = &it8213_tuneproc; | 237 | hwif->tuneproc = &it8213_tuneproc; |
@@ -250,11 +250,11 @@ static void __devinit init_hwif_it8213(ide_hwif_t *hwif) | |||
250 | hwif->swdma_mask = 0x04; | 250 | hwif->swdma_mask = 0x04; |
251 | 251 | ||
252 | pci_read_config_byte(hwif->pci_dev, 0x42, ®42h); | 252 | pci_read_config_byte(hwif->pci_dev, 0x42, ®42h); |
253 | ata66 = (reg42h & 0x02) ? 0 : 1; | ||
254 | 253 | ||
255 | hwif->ide_dma_check = &it8213_config_drive_for_dma; | 254 | hwif->ide_dma_check = &it8213_config_drive_for_dma; |
256 | if (!(hwif->udma_four)) | 255 | |
257 | hwif->udma_four = ata66; | 256 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) |
257 | hwif->cbl = (reg42h & 0x02) ? ATA_CBL_PATA40 : ATA_CBL_PATA80; | ||
258 | 258 | ||
259 | /* | 259 | /* |
260 | * The BIOS often doesn't set up DMA on this controller | 260 | * The BIOS often doesn't set up DMA on this controller |
diff --git a/drivers/ide/pci/it821x.c b/drivers/ide/pci/it821x.c index 3aeb7f1b7916..8197b653ba1e 100644 --- a/drivers/ide/pci/it821x.c +++ b/drivers/ide/pci/it821x.c | |||
@@ -491,10 +491,10 @@ static int it821x_config_drive_for_dma (ide_drive_t *drive) | |||
491 | * the needed logic onboard. | 491 | * the needed logic onboard. |
492 | */ | 492 | */ |
493 | 493 | ||
494 | static unsigned int __devinit ata66_it821x(ide_hwif_t *hwif) | 494 | static u8 __devinit ata66_it821x(ide_hwif_t *hwif) |
495 | { | 495 | { |
496 | /* The reference driver also only does disk side */ | 496 | /* The reference driver also only does disk side */ |
497 | return 1; | 497 | return ATA_CBL_PATA80; |
498 | } | 498 | } |
499 | 499 | ||
500 | /** | 500 | /** |
@@ -662,8 +662,9 @@ static void __devinit init_hwif_it821x(ide_hwif_t *hwif) | |||
662 | hwif->mwdma_mask = 0x07; | 662 | hwif->mwdma_mask = 0x07; |
663 | 663 | ||
664 | hwif->ide_dma_check = &it821x_config_drive_for_dma; | 664 | hwif->ide_dma_check = &it821x_config_drive_for_dma; |
665 | if (!(hwif->udma_four)) | 665 | |
666 | hwif->udma_four = ata66_it821x(hwif); | 666 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) |
667 | hwif->cbl = ata66_it821x(hwif); | ||
667 | 668 | ||
668 | /* | 669 | /* |
669 | * The BIOS often doesn't set up DMA on this controller | 670 | * The BIOS often doesn't set up DMA on this controller |
diff --git a/drivers/ide/pci/jmicron.c b/drivers/ide/pci/jmicron.c index 76ed25147229..a6008f63e71e 100644 --- a/drivers/ide/pci/jmicron.c +++ b/drivers/ide/pci/jmicron.c | |||
@@ -25,10 +25,10 @@ typedef enum { | |||
25 | * ata66_jmicron - Cable check | 25 | * ata66_jmicron - Cable check |
26 | * @hwif: IDE port | 26 | * @hwif: IDE port |
27 | * | 27 | * |
28 | * Return 1 if the cable is 80pin | 28 | * Returns the cable type. |
29 | */ | 29 | */ |
30 | 30 | ||
31 | static int __devinit ata66_jmicron(ide_hwif_t *hwif) | 31 | static u8 __devinit ata66_jmicron(ide_hwif_t *hwif) |
32 | { | 32 | { |
33 | struct pci_dev *pdev = hwif->pci_dev; | 33 | struct pci_dev *pdev = hwif->pci_dev; |
34 | 34 | ||
@@ -70,16 +70,17 @@ static int __devinit ata66_jmicron(ide_hwif_t *hwif) | |||
70 | { | 70 | { |
71 | case PORT_PATA0: | 71 | case PORT_PATA0: |
72 | if (control & (1 << 3)) /* 40/80 pin primary */ | 72 | if (control & (1 << 3)) /* 40/80 pin primary */ |
73 | return 0; | 73 | return ATA_CBL_PATA40; |
74 | return 1; | 74 | return ATA_CBL_PATA80; |
75 | case PORT_PATA1: | 75 | case PORT_PATA1: |
76 | if (control5 & (1 << 19)) /* 40/80 pin secondary */ | 76 | if (control5 & (1 << 19)) /* 40/80 pin secondary */ |
77 | return 0; | 77 | return ATA_CBL_PATA40; |
78 | return 1; | 78 | return ATA_CBL_PATA80; |
79 | case PORT_SATA: | 79 | case PORT_SATA: |
80 | break; | 80 | break; |
81 | } | 81 | } |
82 | return 1; /* Avoid bogus "control reaches end of non-void function" */ | 82 | /* Avoid bogus "control reaches end of non-void function" */ |
83 | return ATA_CBL_PATA80; | ||
83 | } | 84 | } |
84 | 85 | ||
85 | static void jmicron_tuneproc (ide_drive_t *drive, byte mode_wanted) | 86 | static void jmicron_tuneproc (ide_drive_t *drive, byte mode_wanted) |
@@ -159,8 +160,9 @@ static void __devinit init_hwif_jmicron(ide_hwif_t *hwif) | |||
159 | hwif->mwdma_mask = 0x07; | 160 | hwif->mwdma_mask = 0x07; |
160 | 161 | ||
161 | hwif->ide_dma_check = &jmicron_config_drive_for_dma; | 162 | hwif->ide_dma_check = &jmicron_config_drive_for_dma; |
162 | if (!(hwif->udma_four)) | 163 | |
163 | hwif->udma_four = ata66_jmicron(hwif); | 164 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) |
165 | hwif->cbl = ata66_jmicron(hwif); | ||
164 | 166 | ||
165 | hwif->autodma = 1; | 167 | hwif->autodma = 1; |
166 | hwif->drives[0].autodma = hwif->autodma; | 168 | hwif->drives[0].autodma = hwif->autodma; |
diff --git a/drivers/ide/pci/pdc202xx_new.c b/drivers/ide/pci/pdc202xx_new.c index 0765dce6948e..ee5020df005d 100644 --- a/drivers/ide/pci/pdc202xx_new.c +++ b/drivers/ide/pci/pdc202xx_new.c | |||
@@ -225,7 +225,10 @@ static void pdcnew_tune_drive(ide_drive_t *drive, u8 pio) | |||
225 | 225 | ||
226 | static u8 pdcnew_cable_detect(ide_hwif_t *hwif) | 226 | static u8 pdcnew_cable_detect(ide_hwif_t *hwif) |
227 | { | 227 | { |
228 | return get_indexed_reg(hwif, 0x0b) & 0x04; | 228 | if (get_indexed_reg(hwif, 0x0b) & 0x04) |
229 | return ATA_CBL_PATA40; | ||
230 | else | ||
231 | return ATA_CBL_PATA80; | ||
229 | } | 232 | } |
230 | 233 | ||
231 | static int pdcnew_config_drive_xfer_rate(ide_drive_t *drive) | 234 | static int pdcnew_config_drive_xfer_rate(ide_drive_t *drive) |
@@ -509,8 +512,8 @@ static void __devinit init_hwif_pdc202new(ide_hwif_t *hwif) | |||
509 | 512 | ||
510 | hwif->ide_dma_check = &pdcnew_config_drive_xfer_rate; | 513 | hwif->ide_dma_check = &pdcnew_config_drive_xfer_rate; |
511 | 514 | ||
512 | if (!hwif->udma_four) | 515 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) |
513 | hwif->udma_four = pdcnew_cable_detect(hwif) ? 0 : 1; | 516 | hwif->cbl = pdcnew_cable_detect(hwif); |
514 | 517 | ||
515 | if (!noautodma) | 518 | if (!noautodma) |
516 | hwif->autodma = 1; | 519 | hwif->autodma = 1; |
diff --git a/drivers/ide/pci/pdc202xx_old.c b/drivers/ide/pci/pdc202xx_old.c index ae628b86e18a..41ac4a94959f 100644 --- a/drivers/ide/pci/pdc202xx_old.c +++ b/drivers/ide/pci/pdc202xx_old.c | |||
@@ -152,8 +152,10 @@ static void pdc202xx_tune_drive(ide_drive_t *drive, u8 pio) | |||
152 | static u8 pdc202xx_old_cable_detect (ide_hwif_t *hwif) | 152 | static u8 pdc202xx_old_cable_detect (ide_hwif_t *hwif) |
153 | { | 153 | { |
154 | u16 CIS = 0, mask = (hwif->channel) ? (1<<11) : (1<<10); | 154 | u16 CIS = 0, mask = (hwif->channel) ? (1<<11) : (1<<10); |
155 | |||
155 | pci_read_config_word(hwif->pci_dev, 0x50, &CIS); | 156 | pci_read_config_word(hwif->pci_dev, 0x50, &CIS); |
156 | return (CIS & mask) ? 1 : 0; | 157 | |
158 | return (CIS & mask) ? ATA_CBL_PATA40 : ATA_CBL_PATA80; | ||
157 | } | 159 | } |
158 | 160 | ||
159 | /* | 161 | /* |
@@ -357,8 +359,9 @@ static void __devinit init_hwif_pdc202xx(ide_hwif_t *hwif) | |||
357 | hwif->dma_timeout = &pdc202xx_dma_timeout; | 359 | hwif->dma_timeout = &pdc202xx_dma_timeout; |
358 | 360 | ||
359 | if (hwif->pci_dev->device != PCI_DEVICE_ID_PROMISE_20246) { | 361 | if (hwif->pci_dev->device != PCI_DEVICE_ID_PROMISE_20246) { |
360 | if (!(hwif->udma_four)) | 362 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) |
361 | hwif->udma_four = (pdc202xx_old_cable_detect(hwif)) ? 0 : 1; | 363 | hwif->cbl = pdc202xx_old_cable_detect(hwif); |
364 | |||
362 | hwif->dma_start = &pdc202xx_old_ide_dma_start; | 365 | hwif->dma_start = &pdc202xx_old_ide_dma_start; |
363 | hwif->ide_dma_end = &pdc202xx_old_ide_dma_end; | 366 | hwif->ide_dma_end = &pdc202xx_old_ide_dma_end; |
364 | } | 367 | } |
diff --git a/drivers/ide/pci/piix.c b/drivers/ide/pci/piix.c index 8b219dd63024..1547c37f3332 100644 --- a/drivers/ide/pci/piix.c +++ b/drivers/ide/pci/piix.c | |||
@@ -394,14 +394,14 @@ static void piix_dma_clear_irq(ide_drive_t *drive) | |||
394 | hwif->OUTB(dma_stat, hwif->dma_status); | 394 | hwif->OUTB(dma_stat, hwif->dma_status); |
395 | } | 395 | } |
396 | 396 | ||
397 | static int __devinit piix_cable_detect(ide_hwif_t *hwif) | 397 | static u8 __devinit piix_cable_detect(ide_hwif_t *hwif) |
398 | { | 398 | { |
399 | struct pci_dev *dev = hwif->pci_dev; | 399 | struct pci_dev *dev = hwif->pci_dev; |
400 | u8 reg54h = 0, mask = hwif->channel ? 0xc0 : 0x30; | 400 | u8 reg54h = 0, mask = hwif->channel ? 0xc0 : 0x30; |
401 | 401 | ||
402 | pci_read_config_byte(dev, 0x54, ®54h); | 402 | pci_read_config_byte(dev, 0x54, ®54h); |
403 | 403 | ||
404 | return (reg54h & mask) ? 1 : 0; | 404 | return (reg54h & mask) ? ATA_CBL_PATA80 : ATA_CBL_PATA40; |
405 | } | 405 | } |
406 | 406 | ||
407 | /** | 407 | /** |
@@ -444,8 +444,8 @@ static void __devinit init_hwif_piix(ide_hwif_t *hwif) | |||
444 | hwif->swdma_mask = 0x04; | 444 | hwif->swdma_mask = 0x04; |
445 | 445 | ||
446 | if (hwif->ultra_mask & 0x78) { | 446 | if (hwif->ultra_mask & 0x78) { |
447 | if (!hwif->udma_four) | 447 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) |
448 | hwif->udma_four = piix_cable_detect(hwif); | 448 | hwif->cbl = piix_cable_detect(hwif); |
449 | } | 449 | } |
450 | 450 | ||
451 | if (no_piix_dma) | 451 | if (no_piix_dma) |
diff --git a/drivers/ide/pci/scc_pata.c b/drivers/ide/pci/scc_pata.c index 55bc0a32e34f..7b87488e3daa 100644 --- a/drivers/ide/pci/scc_pata.c +++ b/drivers/ide/pci/scc_pata.c | |||
@@ -716,7 +716,7 @@ static void __devinit init_hwif_scc(ide_hwif_t *hwif) | |||
716 | hwif->atapi_dma = 1; | 716 | hwif->atapi_dma = 1; |
717 | 717 | ||
718 | /* we support 80c cable only. */ | 718 | /* we support 80c cable only. */ |
719 | hwif->udma_four = 1; | 719 | hwif->cbl = ATA_CBL_PATA80; |
720 | 720 | ||
721 | hwif->autodma = 0; | 721 | hwif->autodma = 0; |
722 | if (!noautodma) | 722 | if (!noautodma) |
diff --git a/drivers/ide/pci/serverworks.c b/drivers/ide/pci/serverworks.c index 09a7aedf63ac..1371b5bf6bf0 100644 --- a/drivers/ide/pci/serverworks.c +++ b/drivers/ide/pci/serverworks.c | |||
@@ -329,9 +329,9 @@ static unsigned int __devinit init_chipset_svwks (struct pci_dev *dev, const cha | |||
329 | return dev->irq; | 329 | return dev->irq; |
330 | } | 330 | } |
331 | 331 | ||
332 | static unsigned int __devinit ata66_svwks_svwks (ide_hwif_t *hwif) | 332 | static u8 __devinit ata66_svwks_svwks(ide_hwif_t *hwif) |
333 | { | 333 | { |
334 | return 1; | 334 | return ATA_CBL_PATA80; |
335 | } | 335 | } |
336 | 336 | ||
337 | /* On Dell PowerEdge servers with a CSB5/CSB6, the top two bits | 337 | /* On Dell PowerEdge servers with a CSB5/CSB6, the top two bits |
@@ -341,7 +341,7 @@ static unsigned int __devinit ata66_svwks_svwks (ide_hwif_t *hwif) | |||
341 | * Bit 14 clear = primary IDE channel does not have 80-pin cable. | 341 | * Bit 14 clear = primary IDE channel does not have 80-pin cable. |
342 | * Bit 14 set = primary IDE channel has 80-pin cable. | 342 | * Bit 14 set = primary IDE channel has 80-pin cable. |
343 | */ | 343 | */ |
344 | static unsigned int __devinit ata66_svwks_dell (ide_hwif_t *hwif) | 344 | static u8 __devinit ata66_svwks_dell(ide_hwif_t *hwif) |
345 | { | 345 | { |
346 | struct pci_dev *dev = hwif->pci_dev; | 346 | struct pci_dev *dev = hwif->pci_dev; |
347 | if (dev->subsystem_vendor == PCI_VENDOR_ID_DELL && | 347 | if (dev->subsystem_vendor == PCI_VENDOR_ID_DELL && |
@@ -349,8 +349,8 @@ static unsigned int __devinit ata66_svwks_dell (ide_hwif_t *hwif) | |||
349 | (dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB5IDE || | 349 | (dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB5IDE || |
350 | dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE)) | 350 | dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE)) |
351 | return ((1 << (hwif->channel + 14)) & | 351 | return ((1 << (hwif->channel + 14)) & |
352 | dev->subsystem_device) ? 1 : 0; | 352 | dev->subsystem_device) ? ATA_CBL_PATA80 : ATA_CBL_PATA40; |
353 | return 0; | 353 | return ATA_CBL_PATA40; |
354 | } | 354 | } |
355 | 355 | ||
356 | /* Sun Cobalt Alpine hardware avoids the 80-pin cable | 356 | /* Sun Cobalt Alpine hardware avoids the 80-pin cable |
@@ -359,18 +359,18 @@ static unsigned int __devinit ata66_svwks_dell (ide_hwif_t *hwif) | |||
359 | * | 359 | * |
360 | * WARNING: this only works on Alpine hardware! | 360 | * WARNING: this only works on Alpine hardware! |
361 | */ | 361 | */ |
362 | static unsigned int __devinit ata66_svwks_cobalt (ide_hwif_t *hwif) | 362 | static u8 __devinit ata66_svwks_cobalt(ide_hwif_t *hwif) |
363 | { | 363 | { |
364 | struct pci_dev *dev = hwif->pci_dev; | 364 | struct pci_dev *dev = hwif->pci_dev; |
365 | if (dev->subsystem_vendor == PCI_VENDOR_ID_SUN && | 365 | if (dev->subsystem_vendor == PCI_VENDOR_ID_SUN && |
366 | dev->vendor == PCI_VENDOR_ID_SERVERWORKS && | 366 | dev->vendor == PCI_VENDOR_ID_SERVERWORKS && |
367 | dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB5IDE) | 367 | dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB5IDE) |
368 | return ((1 << (hwif->channel + 14)) & | 368 | return ((1 << (hwif->channel + 14)) & |
369 | dev->subsystem_device) ? 1 : 0; | 369 | dev->subsystem_device) ? ATA_CBL_PATA80 : ATA_CBL_PATA40; |
370 | return 0; | 370 | return ATA_CBL_PATA40; |
371 | } | 371 | } |
372 | 372 | ||
373 | static unsigned int __devinit ata66_svwks (ide_hwif_t *hwif) | 373 | static u8 __devinit ata66_svwks(ide_hwif_t *hwif) |
374 | { | 374 | { |
375 | struct pci_dev *dev = hwif->pci_dev; | 375 | struct pci_dev *dev = hwif->pci_dev; |
376 | 376 | ||
@@ -389,9 +389,9 @@ static unsigned int __devinit ata66_svwks (ide_hwif_t *hwif) | |||
389 | /* Per Specified Design by OEM, and ASIC Architect */ | 389 | /* Per Specified Design by OEM, and ASIC Architect */ |
390 | if ((dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE) || | 390 | if ((dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE) || |
391 | (dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2)) | 391 | (dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2)) |
392 | return 1; | 392 | return ATA_CBL_PATA80; |
393 | 393 | ||
394 | return 0; | 394 | return ATA_CBL_PATA40; |
395 | } | 395 | } |
396 | 396 | ||
397 | static void __devinit init_hwif_svwks (ide_hwif_t *hwif) | 397 | static void __devinit init_hwif_svwks (ide_hwif_t *hwif) |
@@ -422,8 +422,8 @@ static void __devinit init_hwif_svwks (ide_hwif_t *hwif) | |||
422 | 422 | ||
423 | hwif->ide_dma_check = &svwks_config_drive_xfer_rate; | 423 | hwif->ide_dma_check = &svwks_config_drive_xfer_rate; |
424 | if (hwif->pci_dev->device != PCI_DEVICE_ID_SERVERWORKS_OSB4IDE) { | 424 | if (hwif->pci_dev->device != PCI_DEVICE_ID_SERVERWORKS_OSB4IDE) { |
425 | if (!hwif->udma_four) | 425 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) |
426 | hwif->udma_four = ata66_svwks(hwif); | 426 | hwif->cbl = ata66_svwks(hwif); |
427 | } | 427 | } |
428 | if (!noautodma) | 428 | if (!noautodma) |
429 | hwif->autodma = 1; | 429 | hwif->autodma = 1; |
diff --git a/drivers/ide/pci/siimage.c b/drivers/ide/pci/siimage.c index 1a4444e7226a..1c3e35487893 100644 --- a/drivers/ide/pci/siimage.c +++ b/drivers/ide/pci/siimage.c | |||
@@ -933,16 +933,17 @@ static void __devinit init_iops_siimage(ide_hwif_t *hwif) | |||
933 | * interface. | 933 | * interface. |
934 | */ | 934 | */ |
935 | 935 | ||
936 | static unsigned int __devinit ata66_siimage(ide_hwif_t *hwif) | 936 | static u8 __devinit ata66_siimage(ide_hwif_t *hwif) |
937 | { | 937 | { |
938 | unsigned long addr = siimage_selreg(hwif, 0); | 938 | unsigned long addr = siimage_selreg(hwif, 0); |
939 | if (pci_get_drvdata(hwif->pci_dev) == NULL) { | 939 | u8 ata66 = 0; |
940 | u8 ata66 = 0; | 940 | |
941 | if (pci_get_drvdata(hwif->pci_dev) == NULL) | ||
941 | pci_read_config_byte(hwif->pci_dev, addr, &ata66); | 942 | pci_read_config_byte(hwif->pci_dev, addr, &ata66); |
942 | return (ata66 & 0x01) ? 1 : 0; | 943 | else |
943 | } | 944 | ata66 = hwif->INB(addr); |
944 | 945 | ||
945 | return (hwif->INB(addr) & 0x01) ? 1 : 0; | 946 | return (ata66 & 0x01) ? ATA_CBL_PATA80 : ATA_CBL_PATA40; |
946 | } | 947 | } |
947 | 948 | ||
948 | /** | 949 | /** |
@@ -988,8 +989,9 @@ static void __devinit init_hwif_siimage(ide_hwif_t *hwif) | |||
988 | hwif->atapi_dma = 1; | 989 | hwif->atapi_dma = 1; |
989 | 990 | ||
990 | hwif->ide_dma_check = &siimage_config_drive_for_dma; | 991 | hwif->ide_dma_check = &siimage_config_drive_for_dma; |
991 | if (!(hwif->udma_four)) | 992 | |
992 | hwif->udma_four = ata66_siimage(hwif); | 993 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) |
994 | hwif->cbl = ata66_siimage(hwif); | ||
993 | 995 | ||
994 | if (hwif->mmio) { | 996 | if (hwif->mmio) { |
995 | hwif->ide_dma_test_irq = &siimage_mmio_ide_dma_test_irq; | 997 | hwif->ide_dma_test_irq = &siimage_mmio_ide_dma_test_irq; |
diff --git a/drivers/ide/pci/sis5513.c b/drivers/ide/pci/sis5513.c index ec0adad9ef61..4457c9d379f6 100644 --- a/drivers/ide/pci/sis5513.c +++ b/drivers/ide/pci/sis5513.c | |||
@@ -796,7 +796,7 @@ static unsigned int __devinit init_chipset_sis5513 (struct pci_dev *dev, const c | |||
796 | return 0; | 796 | return 0; |
797 | } | 797 | } |
798 | 798 | ||
799 | static unsigned int __devinit ata66_sis5513 (ide_hwif_t *hwif) | 799 | static u8 __devinit ata66_sis5513(ide_hwif_t *hwif) |
800 | { | 800 | { |
801 | u8 ata66 = 0; | 801 | u8 ata66 = 0; |
802 | 802 | ||
@@ -811,7 +811,8 @@ static unsigned int __devinit ata66_sis5513 (ide_hwif_t *hwif) | |||
811 | pci_read_config_byte(hwif->pci_dev, 0x48, ®48h); | 811 | pci_read_config_byte(hwif->pci_dev, 0x48, ®48h); |
812 | ata66 = (reg48h & mask) ? 0 : 1; | 812 | ata66 = (reg48h & mask) ? 0 : 1; |
813 | } | 813 | } |
814 | return ata66; | 814 | |
815 | return ata66 ? ATA_CBL_PATA80 : ATA_CBL_PATA40; | ||
815 | } | 816 | } |
816 | 817 | ||
817 | static void __devinit init_hwif_sis5513 (ide_hwif_t *hwif) | 818 | static void __devinit init_hwif_sis5513 (ide_hwif_t *hwif) |
@@ -841,8 +842,8 @@ static void __devinit init_hwif_sis5513 (ide_hwif_t *hwif) | |||
841 | if (!chipset_family) | 842 | if (!chipset_family) |
842 | return; | 843 | return; |
843 | 844 | ||
844 | if (!(hwif->udma_four)) | 845 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) |
845 | hwif->udma_four = ata66_sis5513(hwif); | 846 | hwif->cbl = ata66_sis5513(hwif); |
846 | 847 | ||
847 | if (chipset_family > ATA_16) { | 848 | if (chipset_family > ATA_16) { |
848 | hwif->ide_dma_check = &sis5513_config_xfer_rate; | 849 | hwif->ide_dma_check = &sis5513_config_xfer_rate; |
diff --git a/drivers/ide/pci/slc90e66.c b/drivers/ide/pci/slc90e66.c index c40f291f91e0..575dbbd8b482 100644 --- a/drivers/ide/pci/slc90e66.c +++ b/drivers/ide/pci/slc90e66.c | |||
@@ -199,10 +199,9 @@ static void __devinit init_hwif_slc90e66 (ide_hwif_t *hwif) | |||
199 | hwif->mwdma_mask = 0x06; | 199 | hwif->mwdma_mask = 0x06; |
200 | hwif->swdma_mask = 0x04; | 200 | hwif->swdma_mask = 0x04; |
201 | 201 | ||
202 | if (!hwif->udma_four) { | 202 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) |
203 | /* bit[0(1)]: 0:80, 1:40 */ | 203 | /* bit[0(1)]: 0:80, 1:40 */ |
204 | hwif->udma_four = (reg47 & mask) ? 0 : 1; | 204 | hwif->cbl = (reg47 & mask) ? ATA_CBL_PATA40 : ATA_CBL_PATA80; |
205 | } | ||
206 | 205 | ||
207 | hwif->ide_dma_check = &slc90e66_config_drive_xfer_rate; | 206 | hwif->ide_dma_check = &slc90e66_config_drive_xfer_rate; |
208 | 207 | ||
diff --git a/drivers/ide/pci/tc86c001.c b/drivers/ide/pci/tc86c001.c index cee619bb2eaf..8de1f8e22494 100644 --- a/drivers/ide/pci/tc86c001.c +++ b/drivers/ide/pci/tc86c001.c | |||
@@ -220,13 +220,13 @@ static void __devinit init_hwif_tc86c001(ide_hwif_t *hwif) | |||
220 | hwif->ide_dma_check = &tc86c001_config_drive_xfer_rate; | 220 | hwif->ide_dma_check = &tc86c001_config_drive_xfer_rate; |
221 | hwif->dma_start = &tc86c001_dma_start; | 221 | hwif->dma_start = &tc86c001_dma_start; |
222 | 222 | ||
223 | if (!hwif->udma_four) { | 223 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) { |
224 | /* | 224 | /* |
225 | * System Control 1 Register bit 13 (PDIAGN): | 225 | * System Control 1 Register bit 13 (PDIAGN): |
226 | * 0=80-pin cable, 1=40-pin cable | 226 | * 0=80-pin cable, 1=40-pin cable |
227 | */ | 227 | */ |
228 | scr1 = hwif->INW(sc_base + 0x00); | 228 | scr1 = hwif->INW(sc_base + 0x00); |
229 | hwif->udma_four = (scr1 & 0x2000) ? 0 : 1; | 229 | hwif->cbl = (scr1 & 0x2000) ? ATA_CBL_PATA40 : ATA_CBL_PATA80; |
230 | } | 230 | } |
231 | 231 | ||
232 | if (!noautodma) | 232 | if (!noautodma) |
diff --git a/drivers/ide/pci/via82cxxx.c b/drivers/ide/pci/via82cxxx.c index 49bd1c645fb2..ae88e9f65921 100644 --- a/drivers/ide/pci/via82cxxx.c +++ b/drivers/ide/pci/via82cxxx.c | |||
@@ -448,8 +448,13 @@ static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif) | |||
448 | hwif->mwdma_mask = 0x07; | 448 | hwif->mwdma_mask = 0x07; |
449 | hwif->swdma_mask = 0x07; | 449 | hwif->swdma_mask = 0x07; |
450 | 450 | ||
451 | if (!hwif->udma_four) | 451 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) { |
452 | hwif->udma_four = (vdev->via_80w >> hwif->channel) & 1; | 452 | if ((vdev->via_80w >> hwif->channel) & 1) |
453 | hwif->cbl = ATA_CBL_PATA80; | ||
454 | else | ||
455 | hwif->cbl = ATA_CBL_PATA40; | ||
456 | } | ||
457 | |||
453 | hwif->ide_dma_check = &via82cxxx_ide_dma_check; | 458 | hwif->ide_dma_check = &via82cxxx_ide_dma_check; |
454 | if (!noautodma) | 459 | if (!noautodma) |
455 | hwif->autodma = 1; | 460 | hwif->autodma = 1; |