[PATCH] ib: mthca: Always re-arm EQs in mthca_tavor_interrupt()
authorRoland Dreier <rolandd@cisco.com>
Sun, 23 Oct 2005 19:57:19 +0000 (12:57 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Sun, 23 Oct 2005 23:38:39 +0000 (16:38 -0700)
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>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/infiniband/hw/mthca/mthca_eq.c

index c81fa8e..8dfafda 100644 (file)
@@ -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);
 
        ecr = readl(dev->eq_regs.tavor.ecr_base + 4);
-       if (ecr) {
-               writel(ecr, dev->eq_regs.tavor.ecr_base +
-                      MTHCA_ECR_CLR_BASE - MTHCA_ECR_BASE + 4);
+       if (!ecr)
+               return IRQ_NONE;
 
-               for (i = 0; i < MTHCA_NUM_EQ; ++i)
-                       if (ecr & dev->eq_table.eq[i].eqn_mask &&
-                           mthca_eq_int(dev, &dev->eq_table.eq[i])) {
+       writel(ecr, dev->eq_regs.tavor.ecr_base +
+              MTHCA_ECR_CLR_BASE - MTHCA_ECR_BASE + 4);
+
+       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],
                                                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,