forked from Minki/linux
[IB] mthca: Always re-arm EQs in mthca_tavor_interrupt()
We should always re-arm an event queue's interrupt in mthca_tavor_interrupt() if the corresponding bit is set in the event cause register (ECR), even if we didn't find any entries in the EQ. If we don't, then there's a window where we miss an EQ entry and then get stuck because we don't get another EQ event. Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
parent
2cc78eb52b
commit
c8e0ca683d
@ -396,20 +396,21 @@ static irqreturn_t mthca_tavor_interrupt(int irq, void *dev_ptr, struct pt_regs
|
|||||||
writel(dev->eq_table.clr_mask, dev->eq_table.clr_int);
|
writel(dev->eq_table.clr_mask, dev->eq_table.clr_int);
|
||||||
|
|
||||||
ecr = readl(dev->eq_regs.tavor.ecr_base + 4);
|
ecr = readl(dev->eq_regs.tavor.ecr_base + 4);
|
||||||
if (ecr) {
|
if (!ecr)
|
||||||
writel(ecr, dev->eq_regs.tavor.ecr_base +
|
return IRQ_NONE;
|
||||||
MTHCA_ECR_CLR_BASE - MTHCA_ECR_BASE + 4);
|
|
||||||
|
|
||||||
for (i = 0; i < MTHCA_NUM_EQ; ++i)
|
writel(ecr, dev->eq_regs.tavor.ecr_base +
|
||||||
if (ecr & dev->eq_table.eq[i].eqn_mask &&
|
MTHCA_ECR_CLR_BASE - MTHCA_ECR_BASE + 4);
|
||||||
mthca_eq_int(dev, &dev->eq_table.eq[i])) {
|
|
||||||
|
for (i = 0; i < MTHCA_NUM_EQ; ++i)
|
||||||
|
if (ecr & dev->eq_table.eq[i].eqn_mask) {
|
||||||
|
if (mthca_eq_int(dev, &dev->eq_table.eq[i]))
|
||||||
tavor_set_eq_ci(dev, &dev->eq_table.eq[i],
|
tavor_set_eq_ci(dev, &dev->eq_table.eq[i],
|
||||||
dev->eq_table.eq[i].cons_index);
|
dev->eq_table.eq[i].cons_index);
|
||||||
tavor_eq_req_not(dev, dev->eq_table.eq[i].eqn);
|
tavor_eq_req_not(dev, dev->eq_table.eq[i].eqn);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return IRQ_RETVAL(ecr);
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static irqreturn_t mthca_tavor_msi_x_interrupt(int irq, void *eq_ptr,
|
static irqreturn_t mthca_tavor_msi_x_interrupt(int irq, void *eq_ptr,
|
||||||
|
Loading…
Reference in New Issue
Block a user