loop over remote link interrupt status to prevent race condition

This commit is contained in:
Ralph Metzler 2015-09-20 01:45:11 +02:00
parent 0393ab4db4
commit dd78dae68b
1 changed files with 7 additions and 9 deletions

View File

@ -4465,15 +4465,13 @@ static void gtl_irq_handler(unsigned long priv)
struct ddb *dev = link->dev;
u32 s, off = 32 * link->nr, tag = DDB_LINK_TAG(link->nr);
s = ddbreadl(dev, tag | INTERRUPT_STATUS);
//printk("gtl_irq %08x = %08x\n", tag | INTERRUPT_STATUS, s);
if (!s)
return;
ddbwritel(dev, s, tag | INTERRUPT_ACK);
LINK_IRQ_HANDLE(0);
LINK_IRQ_HANDLE(1);
LINK_IRQ_HANDLE(2);
LINK_IRQ_HANDLE(3);
while ((s = ddbreadl(dev, tag | INTERRUPT_STATUS))) {
ddbwritel(dev, s, tag | INTERRUPT_ACK);
LINK_IRQ_HANDLE(0);
LINK_IRQ_HANDLE(1);
LINK_IRQ_HANDLE(2);
LINK_IRQ_HANDLE(3);
}
#else
printk("gtlirq\n");
tasklet_schedule(&link->tasklet);