diff options
| -rw-r--r-- | drivers/ide/pci/piix.c | 37 |
1 files changed, 34 insertions, 3 deletions
diff --git a/drivers/ide/pci/piix.c b/drivers/ide/pci/piix.c index 1547c37f3332..2e0b29ef596a 100644 --- a/drivers/ide/pci/piix.c +++ b/drivers/ide/pci/piix.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/drivers/ide/pci/piix.c Version 0.47 February 8, 2007 | 2 | * linux/drivers/ide/pci/piix.c Version 0.50 Jun 10, 2007 |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 1998-1999 Andrzej Krzysztofowicz, Author and Maintainer | 4 | * Copyright (C) 1998-1999 Andrzej Krzysztofowicz, Author and Maintainer |
| 5 | * Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org> | 5 | * Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org> |
| @@ -394,12 +394,43 @@ 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 | struct ich_laptop { | ||
| 398 | u16 device; | ||
| 399 | u16 subvendor; | ||
| 400 | u16 subdevice; | ||
| 401 | }; | ||
| 402 | |||
| 403 | /* | ||
| 404 | * List of laptops that use short cables rather than 80 wire | ||
| 405 | */ | ||
| 406 | |||
| 407 | static const struct ich_laptop ich_laptop[] = { | ||
| 408 | /* devid, subvendor, subdev */ | ||
| 409 | { 0x27DF, 0x0005, 0x0280 }, /* ICH7 on Acer 5602WLMi */ | ||
| 410 | { 0x27DF, 0x1025, 0x0110 }, /* ICH7 on Acer 3682WLMi */ | ||
| 411 | { 0x27DF, 0x1043, 0x1267 }, /* ICH7 on Asus W5F */ | ||
| 412 | { 0x24CA, 0x1025, 0x0061 }, /* ICH4 on Acer Aspire 2023WLMi */ | ||
| 413 | /* end marker */ | ||
| 414 | { 0, } | ||
| 415 | }; | ||
| 416 | |||
| 397 | static u8 __devinit piix_cable_detect(ide_hwif_t *hwif) | 417 | static u8 __devinit piix_cable_detect(ide_hwif_t *hwif) |
| 398 | { | 418 | { |
| 399 | struct pci_dev *dev = hwif->pci_dev; | 419 | struct pci_dev *pdev = hwif->pci_dev; |
| 420 | const struct ich_laptop *lap = &ich_laptop[0]; | ||
| 400 | u8 reg54h = 0, mask = hwif->channel ? 0xc0 : 0x30; | 421 | u8 reg54h = 0, mask = hwif->channel ? 0xc0 : 0x30; |
| 401 | 422 | ||
| 402 | pci_read_config_byte(dev, 0x54, ®54h); | 423 | /* check for specials */ |
| 424 | while (lap->device) { | ||
| 425 | if (lap->device == pdev->device && | ||
| 426 | lap->subvendor == pdev->subsystem_vendor && | ||
| 427 | lap->subdevice == pdev->subsystem_device) { | ||
| 428 | return ATA_CBL_PATA40_SHORT; | ||
| 429 | } | ||
| 430 | lap++; | ||
| 431 | } | ||
| 432 | |||
| 433 | pci_read_config_byte(pdev, 0x54, ®54h); | ||
| 403 | 434 | ||
| 404 | return (reg54h & mask) ? ATA_CBL_PATA80 : ATA_CBL_PATA40; | 435 | return (reg54h & mask) ? ATA_CBL_PATA80 : ATA_CBL_PATA40; |
| 405 | } | 436 | } |
