[libata sata_promise] Add PATA cable detection.
authorJeff Garzik <jeff@garzik.org>
Wed, 24 May 2006 05:43:25 +0000 (01:43 -0400)
committerJeff Garzik <jeff@garzik.org>
Wed, 24 May 2006 05:43:25 +0000 (01:43 -0400)
Original patch from Phillip Jordan <phillip.m.jordan@gmail.com>
Cleanups and fixes by me.

drivers/scsi/sata_promise.c

index bb000438cb6c0a578aed45cd1a85ab6b415a838e..285ab0263d91a874c9c5a0bd74f9403a3d5b06ed 100644 (file)
@@ -364,12 +364,23 @@ static void pdc_sata_phy_reset(struct ata_port *ap)
        sata_phy_reset(ap);
 }
 
-static void pdc_pata_phy_reset(struct ata_port *ap)
+static void pdc_pata_cbl_detect(struct ata_port *ap)
 {
-       /* FIXME: add cable detect.  Don't assume 40-pin cable */
-       ap->cbl = ATA_CBL_PATA40;
-       ap->udma_mask &= ATA_UDMA_MASK_40C;
+       u8 tmp;
+       void __iomem *mmio = (void *) ap->ioaddr.cmd_addr + PDC_CTLSTAT + 0x03;
+
+       tmp = readb(mmio);
+
+       if (tmp & 0x01) {
+               ap->cbl = ATA_CBL_PATA40;
+               ap->udma_mask &= ATA_UDMA_MASK_40C;
+       } else
+               ap->cbl = ATA_CBL_PATA80;
+}
 
+static void pdc_pata_phy_reset(struct ata_port *ap)
+{
+       pdc_pata_cbl_detect(ap);
        pdc_reset_port(ap);
        ata_port_probe(ap);
        ata_bus_reset(ap);