[libata] fix oops on non-DMA bmdma hardware
authorJeff Garzik <jeff@garzik.org>
Wed, 22 Mar 2006 02:31:22 +0000 (21:31 -0500)
committerJeff Garzik <jeff@garzik.org>
Wed, 22 Mar 2006 02:31:22 +0000 (21:31 -0500)
Alan noted: "bmdma may be zero but the bmdma_irq_clear function gets
called even in this case during pure PIO operation. Check we have a
bmdma before we use it."

I fixed this by adding a check for zero.  While was I there, I fixed the
non-standard indentation of the small function's code.

Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/scsi/libata-core.c

index 673ddf611d0eda46e56724702c5e3f00c8e0ced1..c8d2201b126fe06f2609500c411f05a0cd84bda2 100644 (file)
@@ -4202,14 +4202,17 @@ void ata_bmdma_setup(struct ata_queued_cmd *qc)
 
 void ata_bmdma_irq_clear(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);
-    }
+       if (!ap->ioaddr.bmdma_addr)
+               return;
 
+       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);
+       }
 }