]> err.no Git - linux-2.6/blobdiff - drivers/ata/sata_sil24.c
Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/usb-2.6
[linux-2.6] / drivers / ata / sata_sil24.c
index 2d7cf326458717d0729c272334ba039a4eb708ac..5aa288d2fb867fb2130a0ced4b599cb61f0afeaa 100644 (file)
@@ -100,10 +100,14 @@ enum {
         */
        PORT_REGS_SIZE          = 0x2000,
 
-       PORT_LRAM               = 0x0000, /* 31 LRAM slots and PM regs */
+       PORT_LRAM               = 0x0000, /* 31 LRAM slots and PMP regs */
        PORT_LRAM_SLOT_SZ       = 0x0080, /* 32 bytes PRB + 2 SGE, ACT... */
 
-       PORT_PM                 = 0x0f80, /* 8 bytes PM * 16 (128 bytes) */
+       PORT_PMP                = 0x0f80, /* 8 bytes PMP * 16 (128 bytes) */
+       PORT_PMP_STATUS         = 0x0000, /* port device status offset */
+       PORT_PMP_QACTIVE        = 0x0004, /* port device QActive offset */
+       PORT_PMP_SIZE           = 0x0008, /* 8 bytes per PMP */
+
                /* 32 bit regs */
        PORT_CTRL_STAT          = 0x1000, /* write: ctrl-set, read: stat */
        PORT_CTRL_CLR           = 0x1004, /* write: ctrl-clear */
@@ -126,6 +130,7 @@ enum {
        PORT_PHY_CFG            = 0x1050,
        PORT_SLOT_STAT          = 0x1800,
        PORT_CMD_ACTIVATE       = 0x1c00, /* 64 bit cmd activate * 31 (248 bytes) */
+       PORT_CONTEXT            = 0x1e04,
        PORT_EXEC_DIAG          = 0x1e00, /* 32bit exec diag * 16 (64 bytes, 0-10 used on 3124) */
        PORT_PSD_DIAG           = 0x1e40, /* 32bit psd diag * 16 (64 bytes, 0-8 used on 3124) */
        PORT_SCONTROL           = 0x1f00,
@@ -139,9 +144,9 @@ enum {
        PORT_CS_INIT            = (1 << 2), /* port initialize */
        PORT_CS_IRQ_WOC         = (1 << 3), /* interrupt write one to clear */
        PORT_CS_CDB16           = (1 << 5), /* 0=12b cdb, 1=16b cdb */
-       PORT_CS_RESUME          = (1 << 6), /* port resume */
+       PORT_CS_PMP_RESUME      = (1 << 6), /* PMP resume */
        PORT_CS_32BIT_ACTV      = (1 << 10), /* 32-bit activation */
-       PORT_CS_PM_EN           = (1 << 13), /* port multiplier enable */
+       PORT_CS_PMP_EN          = (1 << 13), /* port multiplier enable */
        PORT_CS_RDY             = (1 << 31), /* port ready to accept commands */
 
        /* PORT_IRQ_STAT/ENABLE_SET/CLR */
@@ -316,7 +321,7 @@ struct sil24_port_priv {
        struct ata_taskfile tf;                 /* Cached taskfile registers */
 };
 
-/* ap->host_set->private_data */
+/* ap->host->private_data */
 struct sil24_host_priv {
        void __iomem *host_base;        /* global controller control (128 bytes @BAR0) */
        void __iomem *port_base;        /* port registers (4 * 8192 bytes @BAR2) */
@@ -330,25 +335,26 @@ static void sil24_tf_read(struct ata_port *ap, struct ata_taskfile *tf);
 static void sil24_qc_prep(struct ata_queued_cmd *qc);
 static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc);
 static void sil24_irq_clear(struct ata_port *ap);
-static irqreturn_t sil24_interrupt(int irq, void *dev_instance, struct pt_regs *regs);
+static irqreturn_t sil24_interrupt(int irq, void *dev_instance);
 static void sil24_freeze(struct ata_port *ap);
 static void sil24_thaw(struct ata_port *ap);
 static void sil24_error_handler(struct ata_port *ap);
 static void sil24_post_internal_cmd(struct ata_queued_cmd *qc);
 static int sil24_port_start(struct ata_port *ap);
 static void sil24_port_stop(struct ata_port *ap);
-static void sil24_host_stop(struct ata_host_set *host_set);
+static void sil24_host_stop(struct ata_host *host);
 static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
 #ifdef CONFIG_PM
 static int sil24_pci_device_resume(struct pci_dev *pdev);
 #endif
 
 static const struct pci_device_id sil24_pci_tbl[] = {
-       { 0x1095, 0x3124, PCI_ANY_ID, PCI_ANY_ID, 0, 0, BID_SIL3124 },
-       { 0x8086, 0x3124, PCI_ANY_ID, PCI_ANY_ID, 0, 0, BID_SIL3124 },
-       { 0x1095, 0x3132, PCI_ANY_ID, PCI_ANY_ID, 0, 0, BID_SIL3132 },
-       { 0x1095, 0x3131, PCI_ANY_ID, PCI_ANY_ID, 0, 0, BID_SIL3131 },
-       { 0x1095, 0x3531, PCI_ANY_ID, PCI_ANY_ID, 0, 0, BID_SIL3131 },
+       { PCI_VDEVICE(CMD, 0x3124), BID_SIL3124 },
+       { PCI_VDEVICE(INTEL, 0x3124), BID_SIL3124 },
+       { PCI_VDEVICE(CMD, 0x3132), BID_SIL3132 },
+       { PCI_VDEVICE(CMD, 0x3131), BID_SIL3131 },
+       { PCI_VDEVICE(CMD, 0x3531), BID_SIL3131 },
+
        { } /* terminate list */
 };
 
@@ -415,7 +421,7 @@ static const struct ata_port_operations sil24_ops = {
 };
 
 /*
- * Use bits 30-31 of host_flags to encode available port numbers.
+ * Use bits 30-31 of port_flags to encode available port numbers.
  * Current maxium is 4.
  */
 #define SIL24_NPORTS2FLAG(nports)      ((((unsigned)(nports) - 1) & 0x3) << 30)
@@ -425,7 +431,7 @@ static struct ata_port_info sil24_port_info[] = {
        /* sil_3124 */
        {
                .sht            = &sil24_sht,
-               .host_flags     = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(4) |
+               .flags          = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(4) |
                                  SIL24_FLAG_PCIX_IRQ_WOC,
                .pio_mask       = 0x1f,                 /* pio0-4 */
                .mwdma_mask     = 0x07,                 /* mwdma0-2 */
@@ -435,7 +441,7 @@ static struct ata_port_info sil24_port_info[] = {
        /* sil_3132 */
        {
                .sht            = &sil24_sht,
-               .host_flags     = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(2),
+               .flags          = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(2),
                .pio_mask       = 0x1f,                 /* pio0-4 */
                .mwdma_mask     = 0x07,                 /* mwdma0-2 */
                .udma_mask      = 0x3f,                 /* udma0-5 */
@@ -444,7 +450,7 @@ static struct ata_port_info sil24_port_info[] = {
        /* sil_3131/sil_3531 */
        {
                .sht            = &sil24_sht,
-               .host_flags     = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(1),
+               .flags          = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(1),
                .pio_mask       = 0x1f,                 /* pio0-4 */
                .mwdma_mask     = 0x07,                 /* mwdma0-2 */
                .udma_mask      = 0x3f,                 /* udma0-5 */
@@ -561,7 +567,7 @@ static int sil24_softreset(struct ata_port *ap, unsigned int *class)
 
        /* do SRST */
        prb->ctrl = cpu_to_le16(PRB_CTRL_SRST);
-       prb->fis[1] = 0; /* no PM yet */
+       prb->fis[1] = 0; /* no PMP yet */
 
        writel((u32)paddr, port + PORT_CMD_ACTIVATE);
        writel((u64)paddr >> 32, port + PORT_CMD_ACTIVATE + 4);
@@ -869,10 +875,10 @@ static inline void sil24_host_intr(struct ata_port *ap)
                        slot_stat, ap->active_tag, ap->sactive);
 }
 
-static irqreturn_t sil24_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
+static irqreturn_t sil24_interrupt(int irq, void *dev_instance)
 {
-       struct ata_host_set *host_set = dev_instance;
-       struct sil24_host_priv *hpriv = host_set->private_data;
+       struct ata_host *host = dev_instance;
+       struct sil24_host_priv *hpriv = host->private_data;
        unsigned handled = 0;
        u32 status;
        int i;
@@ -888,20 +894,20 @@ static irqreturn_t sil24_interrupt(int irq, void *dev_instance, struct pt_regs *
        if (!(status & IRQ_STAT_4PORTS))
                goto out;
 
-       spin_lock(&host_set->lock);
+       spin_lock(&host->lock);
 
-       for (i = 0; i < host_set->n_ports; i++)
+       for (i = 0; i < host->n_ports; i++)
                if (status & (1 << i)) {
-                       struct ata_port *ap = host_set->ports[i];
+                       struct ata_port *ap = host->ports[i];
                        if (ap && !(ap->flags & ATA_FLAG_DISABLED)) {
-                               sil24_host_intr(host_set->ports[i]);
+                               sil24_host_intr(host->ports[i]);
                                handled++;
                        } else
                                printk(KERN_ERR DRV_NAME
                                       ": interrupt from disabled port %d\n", i);
                }
 
-       spin_unlock(&host_set->lock);
+       spin_unlock(&host->lock);
  out:
        return IRQ_RETVAL(handled);
 }
@@ -941,7 +947,7 @@ static inline void sil24_cblk_free(struct sil24_port_priv *pp, struct device *de
 
 static int sil24_port_start(struct ata_port *ap)
 {
-       struct device *dev = ap->host_set->dev;
+       struct device *dev = ap->host->dev;
        struct sil24_port_priv *pp;
        union sil24_cmd_block *cb;
        size_t cb_size = sizeof(*cb) * SIL24_MAX_CMDS;
@@ -980,7 +986,7 @@ err_out:
 
 static void sil24_port_stop(struct ata_port *ap)
 {
-       struct device *dev = ap->host_set->dev;
+       struct device *dev = ap->host->dev;
        struct sil24_port_priv *pp = ap->private_data;
 
        sil24_cblk_free(pp, dev);
@@ -988,10 +994,10 @@ static void sil24_port_stop(struct ata_port *ap)
        kfree(pp);
 }
 
-static void sil24_host_stop(struct ata_host_set *host_set)
+static void sil24_host_stop(struct ata_host *host)
 {
-       struct sil24_host_priv *hpriv = host_set->private_data;
-       struct pci_dev *pdev = to_pci_dev(host_set->dev);
+       struct sil24_host_priv *hpriv = host->private_data;
+       struct pci_dev *pdev = to_pci_dev(host->dev);
 
        pci_iounmap(pdev, hpriv->host_base);
        pci_iounmap(pdev, hpriv->port_base);
@@ -999,7 +1005,7 @@ static void sil24_host_stop(struct ata_host_set *host_set)
 }
 
 static void sil24_init_controller(struct pci_dev *pdev, int n_ports,
-                                 unsigned long host_flags,
+                                 unsigned long port_flags,
                                  void __iomem *host_base,
                                  void __iomem *port_base)
 {
@@ -1032,7 +1038,7 @@ static void sil24_init_controller(struct pci_dev *pdev, int n_ports,
                }
 
                /* Configure IRQ WoC */
-               if (host_flags & SIL24_FLAG_PCIX_IRQ_WOC)
+               if (port_flags & SIL24_FLAG_PCIX_IRQ_WOC)
                        writel(PORT_CS_IRQ_WOC, port + PORT_CTRL_STAT);
                else
                        writel(PORT_CS_IRQ_WOC, port + PORT_CTRL_CLR);
@@ -1049,7 +1055,8 @@ static void sil24_init_controller(struct pci_dev *pdev, int n_ports,
                writel(PORT_CS_32BIT_ACTV, port + PORT_CTRL_CLR);
 
                /* Clear port multiplier enable and resume bits */
-               writel(PORT_CS_PM_EN | PORT_CS_RESUME, port + PORT_CTRL_CLR);
+               writel(PORT_CS_PMP_EN | PORT_CS_PMP_RESUME,
+                      port + PORT_CTRL_CLR);
        }
 
        /* Turn on interrupts */
@@ -1101,12 +1108,12 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        INIT_LIST_HEAD(&probe_ent->node);
 
        probe_ent->sht          = pinfo->sht;
-       probe_ent->host_flags   = pinfo->host_flags;
+       probe_ent->port_flags   = pinfo->flags;
        probe_ent->pio_mask     = pinfo->pio_mask;
        probe_ent->mwdma_mask   = pinfo->mwdma_mask;
        probe_ent->udma_mask    = pinfo->udma_mask;
        probe_ent->port_ops     = pinfo->port_ops;
-       probe_ent->n_ports      = SIL24_FLAG2NPORTS(pinfo->host_flags);
+       probe_ent->n_ports      = SIL24_FLAG2NPORTS(pinfo->flags);
 
        probe_ent->irq = pdev->irq;
        probe_ent->irq_flags = IRQF_SHARED;
@@ -1144,14 +1151,14 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        }
 
        /* Apply workaround for completion IRQ loss on PCI-X errata */
-       if (probe_ent->host_flags & SIL24_FLAG_PCIX_IRQ_WOC) {
+       if (probe_ent->port_flags & SIL24_FLAG_PCIX_IRQ_WOC) {
                tmp = readl(host_base + HOST_CTRL);
                if (tmp & (HOST_CTRL_TRDY | HOST_CTRL_STOP | HOST_CTRL_DEVSEL))
                        dev_printk(KERN_INFO, &pdev->dev,
                                   "Applying completion IRQ loss on PCI-X "
                                   "errata fix\n");
                else
-                       probe_ent->host_flags &= ~SIL24_FLAG_PCIX_IRQ_WOC;
+                       probe_ent->port_flags &= ~SIL24_FLAG_PCIX_IRQ_WOC;
        }
 
        for (i = 0; i < probe_ent->n_ports; i++) {
@@ -1164,7 +1171,7 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                ata_std_ports(&probe_ent->port[i]);
        }
 
-       sil24_init_controller(pdev, probe_ent->n_ports, probe_ent->host_flags,
+       sil24_init_controller(pdev, probe_ent->n_ports, probe_ent->port_flags,
                              host_base, port_base);
 
        pci_set_master(pdev);
@@ -1191,19 +1198,18 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 #ifdef CONFIG_PM
 static int sil24_pci_device_resume(struct pci_dev *pdev)
 {
-       struct ata_host_set *host_set = dev_get_drvdata(&pdev->dev);
-       struct sil24_host_priv *hpriv = host_set->private_data;
+       struct ata_host *host = dev_get_drvdata(&pdev->dev);
+       struct sil24_host_priv *hpriv = host->private_data;
 
        ata_pci_device_do_resume(pdev);
 
        if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND)
                writel(HOST_CTRL_GLOBAL_RST, hpriv->host_base + HOST_CTRL);
 
-       sil24_init_controller(pdev, host_set->n_ports,
-                             host_set->ports[0]->flags,
+       sil24_init_controller(pdev, host->n_ports, host->ports[0]->flags,
                              hpriv->host_base, hpriv->port_base);
 
-       ata_host_set_resume(host_set);
+       ata_host_resume(host);
 
        return 0;
 }