Skip to content

Commit

Permalink
sata_promise: fix irq clearing buglets
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Mikael Pettersson authored and Jeff Garzik committed May 19, 2008
1 parent 07633b5 commit a13db78
Showing 1 changed file with 3 additions and 4 deletions.
7 changes: 3 additions & 4 deletions drivers/ata/sata_promise.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit a13db78

Please sign in to comment.