via82cxxx: fix SATA cable detection
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Mon, 18 Jan 2010 07:19:53 +0000 (07:19 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 19 Jan 2010 09:41:58 +0000 (01:41 -0800)
Add VIA_SATA_PATA flag for cx700, vx800 and vx855 chipsets
(the first port is SATA).

Based on commits 7585eb1, bfce5e0 and e4d866c for pata_via
host driver.

Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/ide/via82cxxx.c

index 29f3be3..11b3e71 100644 (file)
@@ -54,6 +54,7 @@
 #define VIA_NO_UNMASK          0x08 /* Doesn't work with IRQ unmasking on */
 #define VIA_BAD_ID             0x10 /* Has wrong vendor ID (0x1107) */
 #define VIA_BAD_AST            0x20 /* Don't touch Address Setup Timing */
+#define VIA_SATA_PATA          0x80 /* SATA/PATA combined configuration */
 
 enum {
        VIA_IDFLAG_SINGLE = (1 << 1), /* single channel controller */
@@ -71,9 +72,9 @@ static struct via_isa_bridge {
        u8 udma_mask;
        u8 flags;
 } via_isa_bridges[] = {
-       { "vx855",      PCI_DEVICE_ID_VIA_VX855,    0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST },
-       { "vx800",      PCI_DEVICE_ID_VIA_VX800,    0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST },
-       { "cx700",      PCI_DEVICE_ID_VIA_CX700,    0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST },
+       { "vx855",      PCI_DEVICE_ID_VIA_VX855,    0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST | VIA_SATA_PATA },
+       { "vx800",      PCI_DEVICE_ID_VIA_VX800,    0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST | VIA_SATA_PATA },
+       { "cx700",      PCI_DEVICE_ID_VIA_CX700,    0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST | VIA_SATA_PATA },
        { "vt8237s",    PCI_DEVICE_ID_VIA_8237S,    0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST },
        { "vt6410",     PCI_DEVICE_ID_VIA_6410,     0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST },
        { "vt8251",     PCI_DEVICE_ID_VIA_8251,     0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST },
@@ -366,6 +367,9 @@ static u8 via82cxxx_cable_detect(ide_hwif_t *hwif)
        if (via_cable_override(pdev))
                return ATA_CBL_PATA40_SHORT;
 
+       if ((vdev->via_config->flags & VIA_SATA_PATA) && hwif->channel == 0)
+               return ATA_CBL_SATA;
+
        if ((vdev->via_80w >> hwif->channel) & 1)
                return ATA_CBL_PATA80;
        else