summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikael Pettersson <mikpe@it.uu.se>2008-05-17 18:47:35 +0200
committerJeff Garzik <jgarzik@redhat.com>2008-05-19 17:30:47 -0400
commita13db78e2209ebfe1898207f53c353ed836d4a53 (patch)
tree6e20091316cf2742825ef3f17e8069391657b6f0
parent07633b5d0723ce2ec31262e1096dcf61311bf078 (diff)
downloadlinux-a13db78e2209ebfe1898207f53c353ed836d4a53.tar.gz
linux-a13db78e2209ebfe1898207f53c353ed836d4a53.tar.bz2
linux-a13db78e2209ebfe1898207f53c353ed836d4a53.zip
sata_promise: fix irq clearing buglets
This patch fixes two bugs in sata_promise's irq status clearing paths: 1. When clearing the irq status for a specific port, the driver read the global SEQMASK register. This is wrong because that clears the irq status for _all_ ports. 2. pdc_thaw() incorrectly added the PDC_INT_SEQMASK host register offset to a per-port ata engine base address. This resulted in it reading the unrelated PDC_PKT_SUBMIT register, which did not have the desired irq status clearing effect. In both cases the fix is to read from the port's Command/Status register. This also matches what Promise's own driver does. Signed-off-by: Mikael Pettersson <mikpe@it.uu.se> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
-rw-r--r--drivers/ata/sata_promise.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c
index 5a10dc5048ad..f5ea06bbde75 100644
--- a/drivers/ata/sata_promise.c
+++ b/drivers/ata/sata_promise.c
@@ -663,7 +663,7 @@ static void pdc_thaw(struct ata_port *ap)
u32 tmp;
/* clear IRQ */
- readl(mmio + PDC_INT_SEQMASK);
+ readl(mmio + PDC_COMMAND);
/* turn IRQ back on */
tmp = readl(mmio + PDC_CTLSTAT);
@@ -781,10 +781,9 @@ static inline unsigned int pdc_host_intr(struct ata_port *ap,
static void pdc_irq_clear(struct ata_port *ap)
{
- struct ata_host *host = ap->host;
- void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
+ void __iomem *mmio = ap->ioaddr.cmd_addr;
- readl(mmio + PDC_INT_SEQMASK);
+ readl(mmio + PDC_COMMAND);
}
static irqreturn_t pdc_interrupt(int irq, void *dev_instance)