mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-03-04 10:38:20 +00:00
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>
This commit is contained in:
parent
07633b5d07
commit
a13db78e22
@ -663,7 +663,7 @@ static void pdc_thaw(struct ata_port *ap)
|
|||||||
u32 tmp;
|
u32 tmp;
|
||||||
|
|
||||||
/* clear IRQ */
|
/* clear IRQ */
|
||||||
readl(mmio + PDC_INT_SEQMASK);
|
readl(mmio + PDC_COMMAND);
|
||||||
|
|
||||||
/* turn IRQ back on */
|
/* turn IRQ back on */
|
||||||
tmp = readl(mmio + PDC_CTLSTAT);
|
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)
|
static void pdc_irq_clear(struct ata_port *ap)
|
||||||
{
|
{
|
||||||
struct ata_host *host = ap->host;
|
void __iomem *mmio = ap->ioaddr.cmd_addr;
|
||||||
void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
|
|
||||||
|
|
||||||
readl(mmio + PDC_INT_SEQMASK);
|
readl(mmio + PDC_COMMAND);
|
||||||
}
|
}
|
||||||
|
|
||||||
static irqreturn_t pdc_interrupt(int irq, void *dev_instance)
|
static irqreturn_t pdc_interrupt(int irq, void *dev_instance)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user