ChangeSet 1.1537.6.6, 2005/02/17 20:12:36-05:00, [EMAIL PROTECTED]

        [libata] add ->bmdma_{stop,status} hooks
        
        The timeout/error handling path was assuming that the hardware in
        question was PCI IDE BMDMA-like, which is incorrect in a few cases.
        
        Turn direct function calls into two new hooks.



 drivers/scsi/ata_piix.c    |    4 +++
 drivers/scsi/libata-core.c |   52 ++++++++++++++++++++++++++++++++++++++-------
 drivers/scsi/sata_nv.c     |    2 +
 drivers/scsi/sata_sil.c    |    2 +
 drivers/scsi/sata_sis.c    |    2 +
 drivers/scsi/sata_svw.c    |    2 +
 drivers/scsi/sata_uli.c    |    2 +
 drivers/scsi/sata_via.c    |    3 ++
 drivers/scsi/sata_vsc.c    |    2 +
 include/linux/libata.h     |   45 ++++----------------------------------
 10 files changed, 69 insertions(+), 47 deletions(-)


diff -Nru a/drivers/scsi/ata_piix.c b/drivers/scsi/ata_piix.c
--- a/drivers/scsi/ata_piix.c   2005-03-04 12:02:20 -08:00
+++ b/drivers/scsi/ata_piix.c   2005-03-04 12:02:20 -08:00
@@ -139,6 +139,8 @@
 
        .bmdma_setup            = ata_bmdma_setup,
        .bmdma_start            = ata_bmdma_start,
+       .bmdma_stop             = ata_bmdma_stop,
+       .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
 
@@ -164,6 +166,8 @@
 
        .bmdma_setup            = ata_bmdma_setup,
        .bmdma_start            = ata_bmdma_start,
+       .bmdma_stop             = ata_bmdma_stop,
+       .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
 
diff -Nru a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
--- a/drivers/scsi/libata-core.c        2005-03-04 12:02:20 -08:00
+++ b/drivers/scsi/libata-core.c        2005-03-04 12:02:20 -08:00
@@ -2601,10 +2601,10 @@
 
        case ATA_PROT_DMA:
        case ATA_PROT_ATAPI_DMA:
-               host_stat = ata_bmdma_status(ap);
+               host_stat = ap->ops->bmdma_status(ap);
 
                /* before we do anything else, clear DMA-Start bit */
-               ata_bmdma_stop(ap);
+               ap->ops->bmdma_stop(ap);
 
                /* fall through */
 
@@ -2613,7 +2613,7 @@
                drv_stat = ata_chk_status(ap);
 
                /* ack bmdma irq events */
-               ata_bmdma_ack_irq(ap);
+               ap->ops->irq_clear(ap);
 
                printk(KERN_ERR "ata%u: command 0x%x timeout, stat 0x%x 
host_stat 0x%x\n",
                       ap->id, qc->tf.command, drv_stat, host_stat);
@@ -3042,7 +3042,43 @@
 
 void ata_bmdma_irq_clear(struct ata_port *ap)
 {
-       ata_bmdma_ack_irq(ap);
+    if (ap->flags & ATA_FLAG_MMIO) {
+        void __iomem *mmio = ((void __iomem *) ap->ioaddr.bmdma_addr) + 
ATA_DMA_STATUS;
+        writeb(readb(mmio), mmio);
+    } else {
+        unsigned long addr = ap->ioaddr.bmdma_addr + ATA_DMA_STATUS;
+        outb(inb(addr), addr);
+    }
+
+}
+
+u8 ata_bmdma_status(struct ata_port *ap)
+{
+       u8 host_stat;
+       if (ap->flags & ATA_FLAG_MMIO) {
+               void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr;
+               host_stat = readb(mmio + ATA_DMA_STATUS);
+       } else
+       host_stat = inb(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
+       return host_stat;
+}
+
+void ata_bmdma_stop(struct ata_port *ap)
+{
+       if (ap->flags & ATA_FLAG_MMIO) {
+               void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr;
+
+               /* clear start/stop bit */
+               writeb(readb(mmio + ATA_DMA_CMD) & ~ATA_DMA_START,
+                       mmio + ATA_DMA_CMD);
+       } else {
+               /* clear start/stop bit */
+               outb(inb(ap->ioaddr.bmdma_addr + ATA_DMA_CMD) & ~ATA_DMA_START,
+                       ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
+       }
+
+       /* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */
+       ata_altstatus(ap);        /* dummy read */
 }
 
 /**
@@ -3072,7 +3108,7 @@
        case ATA_PROT_ATAPI_DMA:
        case ATA_PROT_ATAPI:
                /* check status of DMA engine */
-               host_stat = ata_bmdma_status(ap);
+               host_stat = ap->ops->bmdma_status(ap);
                VPRINTK("ata%u: host_stat 0x%X\n", ap->id, host_stat);
 
                /* if it's not our irq... */
@@ -3080,7 +3116,7 @@
                        goto idle_irq;
 
                /* before we do anything else, clear DMA-Start bit */
-               ata_bmdma_stop(ap);
+               ap->ops->bmdma_stop(ap);
 
                /* fall through */
 
@@ -3099,7 +3135,7 @@
                        ap->id, qc->tf.protocol, status);
 
                /* ack bmdma irq events */
-               ata_bmdma_ack_irq(ap);
+               ap->ops->irq_clear(ap);
 
                /* complete taskfile transaction */
                ata_qc_complete(qc, status);
@@ -3936,6 +3972,8 @@
 EXPORT_SYMBOL_GPL(ata_bmdma_setup);
 EXPORT_SYMBOL_GPL(ata_bmdma_start);
 EXPORT_SYMBOL_GPL(ata_bmdma_irq_clear);
+EXPORT_SYMBOL_GPL(ata_bmdma_status);
+EXPORT_SYMBOL_GPL(ata_bmdma_stop);
 EXPORT_SYMBOL_GPL(ata_port_probe);
 EXPORT_SYMBOL_GPL(sata_phy_reset);
 EXPORT_SYMBOL_GPL(__sata_phy_reset);
diff -Nru a/drivers/scsi/sata_nv.c b/drivers/scsi/sata_nv.c
--- a/drivers/scsi/sata_nv.c    2005-03-04 12:02:20 -08:00
+++ b/drivers/scsi/sata_nv.c    2005-03-04 12:02:20 -08:00
@@ -218,6 +218,8 @@
        .phy_reset              = sata_phy_reset,
        .bmdma_setup            = ata_bmdma_setup,
        .bmdma_start            = ata_bmdma_start,
+       .bmdma_stop             = ata_bmdma_stop,
+       .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
        .eng_timeout            = ata_eng_timeout,
diff -Nru a/drivers/scsi/sata_sil.c b/drivers/scsi/sata_sil.c
--- a/drivers/scsi/sata_sil.c   2005-03-04 12:02:20 -08:00
+++ b/drivers/scsi/sata_sil.c   2005-03-04 12:02:20 -08:00
@@ -140,6 +140,8 @@
        .post_set_mode          = sil_post_set_mode,
        .bmdma_setup            = ata_bmdma_setup,
        .bmdma_start            = ata_bmdma_start,
+       .bmdma_stop             = ata_bmdma_stop,
+       .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
        .eng_timeout            = ata_eng_timeout,
diff -Nru a/drivers/scsi/sata_sis.c b/drivers/scsi/sata_sis.c
--- a/drivers/scsi/sata_sis.c   2005-03-04 12:02:20 -08:00
+++ b/drivers/scsi/sata_sis.c   2005-03-04 12:02:20 -08:00
@@ -103,6 +103,8 @@
        .phy_reset              = sata_phy_reset,
        .bmdma_setup            = ata_bmdma_setup,
        .bmdma_start            = ata_bmdma_start,
+       .bmdma_stop             = ata_bmdma_stop,
+       .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
        .eng_timeout            = ata_eng_timeout,
diff -Nru a/drivers/scsi/sata_svw.c b/drivers/scsi/sata_svw.c
--- a/drivers/scsi/sata_svw.c   2005-03-04 12:02:20 -08:00
+++ b/drivers/scsi/sata_svw.c   2005-03-04 12:02:20 -08:00
@@ -302,6 +302,8 @@
        .phy_reset              = sata_phy_reset,
        .bmdma_setup            = k2_bmdma_setup_mmio,
        .bmdma_start            = k2_bmdma_start_mmio,
+       .bmdma_stop             = ata_bmdma_stop,
+       .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
        .eng_timeout            = ata_eng_timeout,
diff -Nru a/drivers/scsi/sata_uli.c b/drivers/scsi/sata_uli.c
--- a/drivers/scsi/sata_uli.c   2005-03-04 12:02:20 -08:00
+++ b/drivers/scsi/sata_uli.c   2005-03-04 12:02:20 -08:00
@@ -98,6 +98,8 @@
 
        .bmdma_setup            = ata_bmdma_setup,
        .bmdma_start            = ata_bmdma_start,
+       .bmdma_stop             = ata_bmdma_stop,
+       .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
 
diff -Nru a/drivers/scsi/sata_via.c b/drivers/scsi/sata_via.c
--- a/drivers/scsi/sata_via.c   2005-03-04 12:02:20 -08:00
+++ b/drivers/scsi/sata_via.c   2005-03-04 12:02:20 -08:00
@@ -118,6 +118,9 @@
 
        .bmdma_setup            = ata_bmdma_setup,
        .bmdma_start            = ata_bmdma_start,
+       .bmdma_stop             = ata_bmdma_stop,
+       .bmdma_status           = ata_bmdma_status,
+
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
 
diff -Nru a/drivers/scsi/sata_vsc.c b/drivers/scsi/sata_vsc.c
--- a/drivers/scsi/sata_vsc.c   2005-03-04 12:02:20 -08:00
+++ b/drivers/scsi/sata_vsc.c   2005-03-04 12:02:20 -08:00
@@ -218,6 +218,8 @@
        .phy_reset              = sata_phy_reset,
        .bmdma_setup            = ata_bmdma_setup,
        .bmdma_start            = ata_bmdma_start,
+       .bmdma_stop             = ata_bmdma_stop,
+       .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
        .eng_timeout            = ata_eng_timeout,
diff -Nru a/include/linux/libata.h b/include/linux/libata.h
--- a/include/linux/libata.h    2005-03-04 12:02:20 -08:00
+++ b/include/linux/libata.h    2005-03-04 12:02:20 -08:00
@@ -361,6 +361,9 @@
        void (*port_stop) (struct ata_port *ap);
 
        void (*host_stop) (struct ata_host_set *host_set);
+
+       void (*bmdma_stop) (struct ata_port *ap);
+       u8   (*bmdma_status) (struct ata_port *ap);
 };
 
 struct ata_port_info {
@@ -416,6 +419,8 @@
                              unsigned int ofs, unsigned int len);
 extern void ata_bmdma_setup (struct ata_queued_cmd *qc);
 extern void ata_bmdma_start (struct ata_queued_cmd *qc);
+extern void ata_bmdma_stop(struct ata_port *ap);
+extern u8   ata_bmdma_status(struct ata_port *ap);
 extern void ata_bmdma_irq_clear(struct ata_port *ap);
 extern void ata_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat);
 extern void ata_eng_timeout(struct ata_port *ap);
@@ -592,46 +597,6 @@
 static inline unsigned int sata_dev_present(struct ata_port *ap)
 {
        return ((scr_read(ap, SCR_STATUS) & 0xf) == 0x3) ? 1 : 0;
-}
-
-static inline void ata_bmdma_stop(struct ata_port *ap)
-{
-       if (ap->flags & ATA_FLAG_MMIO) {
-               void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr;
-
-               /* clear start/stop bit */
-               writeb(readb(mmio + ATA_DMA_CMD) & ~ATA_DMA_START,
-                     mmio + ATA_DMA_CMD);
-       } else {
-               /* clear start/stop bit */
-               outb(inb(ap->ioaddr.bmdma_addr + ATA_DMA_CMD) & ~ATA_DMA_START,
-                   ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
-       }
-
-       /* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */
-       ata_altstatus(ap);            /* dummy read */
-}
-
-static inline void ata_bmdma_ack_irq(struct ata_port *ap)
-{
-       if (ap->flags & ATA_FLAG_MMIO) {
-               void __iomem *mmio = ((void __iomem *) ap->ioaddr.bmdma_addr) + 
ATA_DMA_STATUS;
-               writeb(readb(mmio), mmio);
-       } else {
-               unsigned long addr = ap->ioaddr.bmdma_addr + ATA_DMA_STATUS;
-               outb(inb(addr), addr);
-       }
-}
-
-static inline u8 ata_bmdma_status(struct ata_port *ap)
-{
-       u8 host_stat;
-       if (ap->flags & ATA_FLAG_MMIO) {
-               void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr;
-               host_stat = readb(mmio + ATA_DMA_STATUS);
-       } else
-               host_stat = inb(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
-       return host_stat;
 }
 
 static inline int ata_try_flush_cache(struct ata_device *dev)
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-24" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to