Skip to content

Commit

Permalink
[SCSI] bfa: Modify ISR to process pending completions
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Krishna Gudipati authored and James Bottomley committed Mar 28, 2012
1 parent acea241 commit 1f67096
Showing 1 changed file with 10 additions and 3 deletions.
13 changes: 10 additions & 3 deletions drivers/scsi/bfa/bfa_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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
Expand Down Expand Up @@ -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);

Expand All @@ -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
Expand Down

0 comments on commit 1f67096

Please sign in to comment.