VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / drivers / scsi / sata_promise.c
index 268b2c3..a2eefb6 100644 (file)
@@ -74,18 +74,19 @@ struct pdc_port_priv {
 static u32 pdc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg);
 static void pdc_sata_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
 static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
-static void pdc_dma_setup(struct ata_queued_cmd *qc);
 static void pdc_dma_start(struct ata_queued_cmd *qc);
 static irqreturn_t pdc_interrupt (int irq, void *dev_instance, struct pt_regs *regs);
 static void pdc_eng_timeout(struct ata_port *ap);
 static int pdc_port_start(struct ata_port *ap);
 static void pdc_port_stop(struct ata_port *ap);
 static void pdc_phy_reset(struct ata_port *ap);
-static void pdc_fill_sg(struct ata_queued_cmd *qc);
+static void pdc_qc_prep(struct ata_queued_cmd *qc);
 static void pdc_tf_load_mmio(struct ata_port *ap, struct ata_taskfile *tf);
 static void pdc_exec_command_mmio(struct ata_port *ap, struct ata_taskfile *tf);
 static inline void pdc_dma_complete (struct ata_port *ap,
                                      struct ata_queued_cmd *qc, int have_err);
+static void pdc_irq_clear(struct ata_port *ap);
+static int pdc_qc_issue_prot(struct ata_queued_cmd *qc);
 
 static Scsi_Host_Template pdc_sata_sht = {
        .module                 = THIS_MODULE,
@@ -112,11 +113,11 @@ static struct ata_port_operations pdc_sata_ops = {
        .check_status           = ata_check_status_mmio,
        .exec_command           = pdc_exec_command_mmio,
        .phy_reset              = pdc_phy_reset,
-       .bmdma_setup            = pdc_dma_setup,
-       .bmdma_start            = pdc_dma_start,
-       .fill_sg                = pdc_fill_sg,
+       .qc_prep                = pdc_qc_prep,
+       .qc_issue               = pdc_qc_issue_prot,
        .eng_timeout            = pdc_eng_timeout,
        .irq_handler            = pdc_interrupt,
+       .irq_clear              = pdc_irq_clear,
        .scr_read               = pdc_sata_scr_read,
        .scr_write              = pdc_sata_scr_write,
        .port_start             = pdc_port_start,
@@ -261,14 +262,14 @@ static void pdc_sata_scr_write (struct ata_port *ap, unsigned int sc_reg,
        writel(val, (void *) ap->ioaddr.scr_addr + (sc_reg * 4));
 }
 
-static void pdc_fill_sg(struct ata_queued_cmd *qc)
+static void pdc_qc_prep(struct ata_queued_cmd *qc)
 {
        struct pdc_port_priv *pp = qc->ap->private_data;
        unsigned int i;
 
        VPRINTK("ENTER\n");
 
-       ata_fill_sg(qc);
+       ata_qc_prep(qc);
 
        i = pdc_pkt_header(&qc->tf, qc->ap->prd_dma,  qc->dev->devno, pp->pkt);
 
@@ -378,6 +379,14 @@ static inline unsigned int pdc_host_intr( struct ata_port *ap,
         return handled;
 }
 
+static void pdc_irq_clear(struct ata_port *ap)
+{
+       struct ata_host_set *host_set = ap->host_set;
+       void *mmio = host_set->mmio_base;
+
+       readl(mmio + PDC_INT_SEQMASK);
+}
+
 static irqreturn_t pdc_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
 {
        struct ata_host_set *host_set = dev_instance;
@@ -431,13 +440,7 @@ static irqreturn_t pdc_interrupt (int irq, void *dev_instance, struct pt_regs *r
        return IRQ_RETVAL(handled);
 }
 
-static void pdc_dma_setup(struct ata_queued_cmd *qc)
-{
-       /* nothing for now.  later, we will call standard
-        * code in libata-core for ATAPI here */
-}
-
-static void pdc_dma_start(struct ata_queued_cmd *qc)
+static inline void pdc_dma_start(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
        struct pdc_port_priv *pp = ap->private_data;
@@ -455,17 +458,35 @@ static void pdc_dma_start(struct ata_queued_cmd *qc)
        readl((void *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT); /* flush */
 }
 
+static int pdc_qc_issue_prot(struct ata_queued_cmd *qc)
+{
+       switch (qc->tf.protocol) {
+       case ATA_PROT_DMA:
+               pdc_dma_start(qc);
+               return 0;
+
+       case ATA_PROT_ATAPI_DMA:
+               BUG();
+               break;
+
+       default:
+               break;
+       }
+
+       return ata_qc_issue_prot(qc);
+}
+
 static void pdc_tf_load_mmio(struct ata_port *ap, struct ata_taskfile *tf)
 {
-       if (tf->protocol != ATA_PROT_DMA)
-               ata_tf_load_mmio(ap, tf);
+       WARN_ON (tf->protocol == ATA_PROT_DMA);
+       ata_tf_load_mmio(ap, tf);
 }
 
 
 static void pdc_exec_command_mmio(struct ata_port *ap, struct ata_taskfile *tf)
 {
-       if (tf->protocol != ATA_PROT_DMA)
-               ata_exec_command_mmio(ap, tf);
+       WARN_ON (tf->protocol == ATA_PROT_DMA);
+       ata_exec_command_mmio(ap, tf);
 }