]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/ata/libahci.c
Merge tag 'powerpc-4.4-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
[karo-tx-linux.git] / drivers / ata / libahci.c
index d256a66158be838bb7b312dcda96f6ecad97e332..096064cd6c52b1b0f72bf710d1a56893bd6bff9c 100644 (file)
@@ -1117,6 +1117,7 @@ static void ahci_port_init(struct device *dev, struct ata_port *ap,
                           int port_no, void __iomem *mmio,
                           void __iomem *port_mmio)
 {
+       struct ahci_host_priv *hpriv = ap->host->private_data;
        const char *emsg = NULL;
        int rc;
        u32 tmp;
@@ -1138,6 +1139,12 @@ static void ahci_port_init(struct device *dev, struct ata_port *ap,
                writel(tmp, port_mmio + PORT_IRQ_STAT);
 
        writel(1 << port_no, mmio + HOST_IRQ_STAT);
+
+       /* mark esata ports */
+       tmp = readl(port_mmio + PORT_CMD);
+       if ((tmp & PORT_CMD_HPCP) ||
+           ((tmp & PORT_CMD_ESP) && (hpriv->cap & HOST_CAP_SXS)))
+               ap->pflags |= ATA_PFLAG_EXTERNAL;
 }
 
 void ahci_init_controller(struct ata_host *host)
@@ -2486,28 +2493,13 @@ static int ahci_host_activate_multi_irqs(struct ata_host *host, int irq,
 
                rc = devm_request_threaded_irq(host->dev, irq + i,
                                               ahci_multi_irqs_intr,
-                                              ahci_port_thread_fn, IRQF_SHARED,
+                                              ahci_port_thread_fn, 0,
                                               pp->irq_desc, host->ports[i]);
                if (rc)
-                       goto out_free_irqs;
-       }
-
-       for (i = 0; i < host->n_ports; i++)
+                       return rc;
                ata_port_desc(host->ports[i], "irq %d", irq + i);
-
-       rc = ata_host_register(host, sht);
-       if (rc)
-               goto out_free_all_irqs;
-
-       return 0;
-
-out_free_all_irqs:
-       i = host->n_ports;
-out_free_irqs:
-       for (i--; i >= 0; i--)
-               devm_free_irq(host->dev, irq + i, host->ports[i]);
-
-       return rc;
+       }
+       return ata_host_register(host, sht);
 }
 
 /**