diff options
| -rw-r--r-- | drivers/ide/pci/via82cxxx.c | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/drivers/ide/pci/via82cxxx.c b/drivers/ide/pci/via82cxxx.c index ae88e9f65921..d21dd2e7eeb3 100644 --- a/drivers/ide/pci/via82cxxx.c +++ b/drivers/ide/pci/via82cxxx.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * | 2 | * |
| 3 | * Version 3.40 | 3 | * Version 3.45 |
| 4 | * | 4 | * |
| 5 | * VIA IDE driver for Linux. Supported southbridges: | 5 | * VIA IDE driver for Linux. Supported southbridges: |
| 6 | * | 6 | * |
| @@ -34,6 +34,8 @@ | |||
| 34 | #include <linux/pci.h> | 34 | #include <linux/pci.h> |
| 35 | #include <linux/init.h> | 35 | #include <linux/init.h> |
| 36 | #include <linux/ide.h> | 36 | #include <linux/ide.h> |
| 37 | #include <linux/dmi.h> | ||
| 38 | |||
| 37 | #include <asm/io.h> | 39 | #include <asm/io.h> |
| 38 | 40 | ||
| 39 | #ifdef CONFIG_PPC_CHRP | 41 | #ifdef CONFIG_PPC_CHRP |
| @@ -415,6 +417,42 @@ static unsigned int __devinit init_chipset_via82cxxx(struct pci_dev *dev, const | |||
| 415 | return 0; | 417 | return 0; |
| 416 | } | 418 | } |
| 417 | 419 | ||
| 420 | /* | ||
| 421 | * Cable special cases | ||
| 422 | */ | ||
| 423 | |||
| 424 | static struct dmi_system_id cable_dmi_table[] = { | ||
| 425 | { | ||
| 426 | .ident = "Acer Ferrari 3400", | ||
| 427 | .matches = { | ||
| 428 | DMI_MATCH(DMI_BOARD_VENDOR, "Acer,Inc."), | ||
| 429 | DMI_MATCH(DMI_BOARD_NAME, "Ferrari 3400"), | ||
| 430 | }, | ||
| 431 | }, | ||
| 432 | { } | ||
| 433 | }; | ||
| 434 | |||
| 435 | static int via_cable_override(void) | ||
| 436 | { | ||
| 437 | /* Systems by DMI */ | ||
| 438 | if (dmi_check_system(cable_dmi_table)) | ||
| 439 | return 1; | ||
| 440 | return 0; | ||
| 441 | } | ||
| 442 | |||
| 443 | static u8 __devinit via82cxxx_cable_detect(ide_hwif_t *hwif) | ||
| 444 | { | ||
| 445 | struct via82cxxx_dev *vdev = pci_get_drvdata(hwif->pci_dev); | ||
| 446 | |||
| 447 | if (via_cable_override()) | ||
| 448 | return ATA_CBL_PATA40_SHORT; | ||
| 449 | |||
| 450 | if ((vdev->via_80w >> hwif->channel) & 1) | ||
| 451 | return ATA_CBL_PATA80; | ||
| 452 | else | ||
| 453 | return ATA_CBL_PATA40; | ||
| 454 | } | ||
| 455 | |||
| 418 | static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif) | 456 | static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif) |
| 419 | { | 457 | { |
| 420 | struct via82cxxx_dev *vdev = pci_get_drvdata(hwif->pci_dev); | 458 | struct via82cxxx_dev *vdev = pci_get_drvdata(hwif->pci_dev); |
| @@ -448,12 +486,8 @@ static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif) | |||
| 448 | hwif->mwdma_mask = 0x07; | 486 | hwif->mwdma_mask = 0x07; |
| 449 | hwif->swdma_mask = 0x07; | 487 | hwif->swdma_mask = 0x07; |
| 450 | 488 | ||
| 451 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) { | 489 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) |
| 452 | if ((vdev->via_80w >> hwif->channel) & 1) | 490 | hwif->cbl = via82cxxx_cable_detect(hwif); |
| 453 | hwif->cbl = ATA_CBL_PATA80; | ||
| 454 | else | ||
| 455 | hwif->cbl = ATA_CBL_PATA40; | ||
| 456 | } | ||
| 457 | 491 | ||
| 458 | hwif->ide_dma_check = &via82cxxx_ide_dma_check; | 492 | hwif->ide_dma_check = &via82cxxx_ide_dma_check; |
| 459 | if (!noautodma) | 493 | if (!noautodma) |
