Skip to content

Commit

Permalink
cnic: Fix lost interrupt on bnx2x
Browse files Browse the repository at this point in the history
We service 2 queues (kcq1 and kcq2) in cnic_service_bnx2x_bh().  If
the status block index has changed when servicing the kcq2, we must
go back and check kcq1.  The latest status block index will be used
to acknowledge the interrupt, and without looping back to check kcq1,
we may miss events on kcq1.

Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Michael Chan authored and David S. Miller committed Mar 2, 2011
1 parent 107c3f4 commit 0197b08
Showing 1 changed file with 17 additions and 8 deletions.
25 changes: 17 additions & 8 deletions drivers/net/cnic.c
Original file line number Diff line number Diff line change
Expand Up @@ -2914,26 +2914,35 @@ static void cnic_service_bnx2x_bh(unsigned long data)
{
struct cnic_dev *dev = (struct cnic_dev *) data;
struct cnic_local *cp = dev->cnic_priv;
u32 status_idx;
u32 status_idx, new_status_idx;

if (unlikely(!test_bit(CNIC_F_CNIC_UP, &dev->flags)))
return;

status_idx = cnic_service_bnx2x_kcq(dev, &cp->kcq1);
while (1) {
status_idx = cnic_service_bnx2x_kcq(dev, &cp->kcq1);

CNIC_WR16(dev, cp->kcq1.io_addr, cp->kcq1.sw_prod_idx + MAX_KCQ_IDX);
CNIC_WR16(dev, cp->kcq1.io_addr,
cp->kcq1.sw_prod_idx + MAX_KCQ_IDX);

if (BNX2X_CHIP_IS_E2(cp->chip_id)) {
status_idx = cnic_service_bnx2x_kcq(dev, &cp->kcq2);
if (!BNX2X_CHIP_IS_E2(cp->chip_id)) {
cnic_ack_bnx2x_int(dev, cp->bnx2x_igu_sb_id, USTORM_ID,
status_idx, IGU_INT_ENABLE, 1);
break;
}

new_status_idx = cnic_service_bnx2x_kcq(dev, &cp->kcq2);

if (new_status_idx != status_idx)
continue;

CNIC_WR16(dev, cp->kcq2.io_addr, cp->kcq2.sw_prod_idx +
MAX_KCQ_IDX);

cnic_ack_igu_sb(dev, cp->bnx2x_igu_sb_id, IGU_SEG_ACCESS_DEF,
status_idx, IGU_INT_ENABLE, 1);
} else {
cnic_ack_bnx2x_int(dev, cp->bnx2x_igu_sb_id, USTORM_ID,
status_idx, IGU_INT_ENABLE, 1);

break;
}
}

Expand Down

0 comments on commit 0197b08

Please sign in to comment.