[SCSI] bfa: Modify ISR to process pending completions
authorKrishna Gudipati <kgudipat@brocade.com>
Wed, 14 Mar 2012 00:38:15 +0000 (17:38 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Wed, 28 Mar 2012 08:50:34 +0000 (09:50 +0100)
Made changes to the driver ISR to process any pending completions even if
the RME bit is not set in the interrupt status register.

Signed-off-by: Krishna Gudipati <kgudipat@brocade.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/bfa/bfa_core.c

index 4bd546b..035c9d5 100644 (file)
@@ -231,16 +231,19 @@ bfa_reqq_resume(struct bfa_s *bfa, int qid)
        }
 }
 
-static inline void
+bfa_boolean_t
 bfa_isr_rspq(struct bfa_s *bfa, int qid)
 {
        struct bfi_msg_s *m;
        u32     pi, ci;
        struct list_head *waitq;
+       bfa_boolean_t ret;
 
        ci = bfa_rspq_ci(bfa, qid);
        pi = bfa_rspq_pi(bfa, qid);
 
+       ret = (ci != pi);
+
        while (ci != pi) {
                m = bfa_rspq_elem(bfa, qid, ci);
                WARN_ON(m->mhdr.msg_class >= BFI_MC_MAX);
@@ -260,6 +263,8 @@ bfa_isr_rspq(struct bfa_s *bfa, int qid)
        waitq = bfa_reqq(bfa, qid);
        if (!list_empty(waitq))
                bfa_reqq_resume(bfa, qid);
+
+       return ret;
 }
 
 static inline void
@@ -320,6 +325,7 @@ bfa_intx(struct bfa_s *bfa)
 {
        u32 intr, qintr;
        int queue;
+       bfa_boolean_t rspq_comp = BFA_FALSE;
 
        intr = readl(bfa->iocfc.bfa_regs.intr_status);
 
@@ -332,11 +338,12 @@ bfa_intx(struct bfa_s *bfa)
         */
        if (bfa->queue_process) {
                for (queue = 0; queue < BFI_IOC_MAX_CQS; queue++)
-                       bfa_isr_rspq(bfa, queue);
+                       if (bfa_isr_rspq(bfa, queue))
+                               rspq_comp = BFA_TRUE;
        }
 
        if (!intr)
-               return BFA_TRUE;
+               return (qintr | rspq_comp) ? BFA_TRUE : BFA_FALSE;
 
        /*
         * CPE completion queue interrupt