aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ata')
-rw-r--r--drivers/ata/pata_sis.c32
1 files changed, 30 insertions, 2 deletions
diff --git a/drivers/ata/pata_sis.c b/drivers/ata/pata_sis.c
index c434c4ef4e4b..d9486fcd59f2 100644
--- a/drivers/ata/pata_sis.c
+++ b/drivers/ata/pata_sis.c
@@ -43,6 +43,34 @@ struct sis_chipset {
43 up code later */ 43 up code later */
44}; 44};
45 45
46struct sis_laptop {
47 u16 device;
48 u16 subvendor;
49 u16 subdevice;
50};
51
52static const struct sis_laptop sis_laptop[] = {
53 /* devid, subvendor, subdev */
54 { 0x5513, 0x1043, 0x1107 }, /* ASUS A6K */
55 /* end marker */
56 { 0, }
57};
58
59static int sis_short_ata40(struct pci_dev *dev)
60{
61 const struct sis_laptop *lap = &sis_laptop[0];
62
63 while (lap->device) {
64 if (lap->device == dev->device &&
65 lap->subvendor == dev->subsystem_vendor &&
66 lap->subdevice == dev->subsystem_device)
67 return 1;
68 lap++;
69 }
70
71 return 0;
72}
73
46/** 74/**
47 * sis_port_base - return PCI configuration base for dev 75 * sis_port_base - return PCI configuration base for dev
48 * @adev: device 76 * @adev: device
@@ -79,7 +107,7 @@ static int sis_133_pre_reset(struct ata_port *ap)
79 107
80 /* The top bit of this register is the cable detect bit */ 108 /* The top bit of this register is the cable detect bit */
81 pci_read_config_word(pdev, 0x50 + 2 * ap->port_no, &tmp); 109 pci_read_config_word(pdev, 0x50 + 2 * ap->port_no, &tmp);
82 if (tmp & 0x8000) 110 if ((tmp & 0x8000) && !sis_short_ata40(pdev))
83 ap->cbl = ATA_CBL_PATA40; 111 ap->cbl = ATA_CBL_PATA40;
84 else 112 else
85 ap->cbl = ATA_CBL_PATA80; 113 ap->cbl = ATA_CBL_PATA80;
@@ -127,7 +155,7 @@ static int sis_66_pre_reset(struct ata_port *ap)
127 /* Older chips keep cable detect in bits 4/5 of reg 0x48 */ 155 /* Older chips keep cable detect in bits 4/5 of reg 0x48 */
128 pci_read_config_byte(pdev, 0x48, &tmp); 156 pci_read_config_byte(pdev, 0x48, &tmp);
129 tmp >>= ap->port_no; 157 tmp >>= ap->port_no;
130 if (tmp & 0x10) 158 if ((tmp & 0x10) && !sis_short_ata40(pdev))
131 ap->cbl = ATA_CBL_PATA40; 159 ap->cbl = ATA_CBL_PATA40;
132 else 160 else
133 ap->cbl = ATA_CBL_PATA80; 161 ap->cbl = ATA_CBL_PATA80;