]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/ata/ahci.c
libata: Add a per-host flag to opt-in into parallel port probes
[linux-2.6-omap-h63xx.git] / drivers / ata / ahci.c
index a67b8e7c712dce78b371a5b5d0d1b39c33cb9e47..96039671e3b9e6aac939833554fc95291609d6d1 100644 (file)
@@ -105,7 +105,7 @@ enum {
        board_ahci_ign_iferr    = 2,
        board_ahci_sb600        = 3,
        board_ahci_mv           = 4,
-       board_ahci_sb700        = 5,
+       board_ahci_sb700        = 5, /* for SB700 and SB800 */
        board_ahci_mcp65        = 6,
        board_ahci_nopmp        = 7,
 
@@ -439,7 +439,7 @@ static const struct ata_port_info ahci_port_info[] = {
                .udma_mask      = ATA_UDMA6,
                .port_ops       = &ahci_ops,
        },
-       /* board_ahci_sb700 */
+       /* board_ahci_sb700, for SB700 and SB800 */
        {
                AHCI_HFLAGS     (AHCI_HFLAG_IGN_SERR_INTERNAL),
                .flags          = AHCI_FLAG_COMMON,
@@ -1119,14 +1119,14 @@ static void ahci_start_port(struct ata_port *ap)
 
        /* turn on LEDs */
        if (ap->flags & ATA_FLAG_EM) {
-               ata_port_for_each_link(link, ap) {
+               ata_for_each_link(link, ap, EDGE) {
                        emp = &pp->em_priv[link->pmp];
                        ahci_transmit_led_message(ap, emp->led_state, 4);
                }
        }
 
        if (ap->flags & ATA_FLAG_SW_ACTIVITY)
-               ata_port_for_each_link(link, ap)
+               ata_for_each_link(link, ap, EDGE)
                        ahci_init_sw_activity(link);
 
 }
@@ -1361,7 +1361,7 @@ static ssize_t ahci_led_show(struct ata_port *ap, char *buf)
        struct ahci_em_priv *emp;
        int rc = 0;
 
-       ata_port_for_each_link(link, ap) {
+       ata_for_each_link(link, ap, EDGE) {
                emp = &pp->em_priv[link->pmp];
                rc += sprintf(buf, "%lx\n", emp->led_state);
        }
@@ -1941,7 +1941,7 @@ static void ahci_error_intr(struct ata_port *ap, u32 irq_stat)
        u32 serror;
 
        /* determine active link */
-       ata_port_for_each_link(link, ap)
+       ata_for_each_link(link, ap, EDGE)
                if (ata_link_active(link))
                        break;
        if (!link)
@@ -2446,6 +2446,8 @@ static void ahci_print_info(struct ata_host *host)
                speed_s = "1.5";
        else if (speed == 2)
                speed_s = "3";
+       else if (speed == 3)
+               speed_s = "6";
        else
                speed_s = "?";
 
@@ -2610,6 +2612,10 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
            (pdev->revision == 0xa1 || pdev->revision == 0xa2))
                hpriv->flags |= AHCI_HFLAG_NO_MSI;
 
+       /* SB800 does NOT need the workaround to ignore SERR_INTERNAL */
+       if (board_id == board_ahci_sb700 && pdev->revision >= 0x40)
+               hpriv->flags &= ~AHCI_HFLAG_IGN_SERR_INTERNAL;
+
        if ((hpriv->flags & AHCI_HFLAG_NO_MSI) || pci_enable_msi(pdev))
                pci_intx(pdev, 1);
 
@@ -2654,6 +2660,9 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        host->iomap = pcim_iomap_table(pdev);
        host->private_data = hpriv;
 
+       if (!(hpriv->cap & HOST_CAP_SSS))
+               host->flags |= ATA_HOST_PARALLEL_SCAN;
+
        if (pi.flags & ATA_FLAG_EM)
                ahci_reset_em(host);