提交 75eeec2f 编写于 作者: R Roland Dreier 提交者: Linus Torvalds

[PATCH] 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: NRoland Dreier <rolandd@cisco.com>
Signed-off-by: NAndrew Morton <akpm@osdl.org>
Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
上级 8d3b3591
...@@ -396,20 +396,21 @@ static irqreturn_t mthca_tavor_interrupt(int irq, void *dev_ptr, struct pt_regs ...@@ -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,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册