aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Chan <mchan@broadcom.com>2012-12-05 05:10:14 -0500
committerDavid S. Miller <davem@davemloft.net>2012-12-05 16:01:28 -0500
commitcaa9e931fe40c9ffad4d951555675417ab074ea5 (patch)
tree5aa9d6099db3b5a28f525dac74bdcf40be33284e
parent0e1efe9d5e10921f1e2152b108e013605fca3c9f (diff)
cnic: Reset iSCSI EQ during shutdown.
Without the reset, reloading the cnic driver can cause the iSCSI Event Queue to be out of sync with the driver and cause intermittent crash. Signed-off-by: Michael Chan <mchan@broadcom.com> Acked-by: Ariel Elior <ariele@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_defs.h5
-rw-r--r--drivers/net/ethernet/broadcom/cnic.c19
2 files changed, 24 insertions, 0 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_defs.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_defs.h
index 620fe939ecfd..60a83ad10370 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_defs.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_defs.h
@@ -23,6 +23,11 @@
23 (IRO[159].base + ((funcId) * IRO[159].m1)) 23 (IRO[159].base + ((funcId) * IRO[159].m1))
24#define CSTORM_FUNC_EN_OFFSET(funcId) \ 24#define CSTORM_FUNC_EN_OFFSET(funcId) \
25 (IRO[149].base + ((funcId) * IRO[149].m1)) 25 (IRO[149].base + ((funcId) * IRO[149].m1))
26#define CSTORM_HC_SYNC_LINE_INDEX_E1X_OFFSET(hcIndex, sbId) \
27 (IRO[139].base + ((hcIndex) * IRO[139].m1) + ((sbId) * IRO[139].m2))
28#define CSTORM_HC_SYNC_LINE_INDEX_E2_OFFSET(hcIndex, sbId) \
29 (IRO[138].base + (((hcIndex)>>2) * IRO[138].m1) + (((hcIndex)&3) \
30 * IRO[138].m2) + ((sbId) * IRO[138].m3))
26#define CSTORM_IGU_MODE_OFFSET (IRO[157].base) 31#define CSTORM_IGU_MODE_OFFSET (IRO[157].base)
27#define CSTORM_ISCSI_CQ_SIZE_OFFSET(pfId) \ 32#define CSTORM_ISCSI_CQ_SIZE_OFFSET(pfId) \
28 (IRO[316].base + ((pfId) * IRO[316].m1)) 33 (IRO[316].base + ((pfId) * IRO[316].m1))
diff --git a/drivers/net/ethernet/broadcom/cnic.c b/drivers/net/ethernet/broadcom/cnic.c
index 3b825f422090..5437e2aa97b5 100644
--- a/drivers/net/ethernet/broadcom/cnic.c
+++ b/drivers/net/ethernet/broadcom/cnic.c
@@ -5344,8 +5344,27 @@ static void cnic_stop_bnx2_hw(struct cnic_dev *dev)
5344static void cnic_stop_bnx2x_hw(struct cnic_dev *dev) 5344static void cnic_stop_bnx2x_hw(struct cnic_dev *dev)
5345{ 5345{
5346 struct cnic_local *cp = dev->cnic_priv; 5346 struct cnic_local *cp = dev->cnic_priv;
5347 u32 hc_index = HC_INDEX_ISCSI_EQ_CONS;
5348 u32 sb_id = cp->status_blk_num;
5349 u32 idx_off, syn_off;
5347 5350
5348 cnic_free_irq(dev); 5351 cnic_free_irq(dev);
5352
5353 if (BNX2X_CHIP_IS_E2_PLUS(cp->chip_id)) {
5354 idx_off = offsetof(struct hc_status_block_e2, index_values) +
5355 (hc_index * sizeof(u16));
5356
5357 syn_off = CSTORM_HC_SYNC_LINE_INDEX_E2_OFFSET(hc_index, sb_id);
5358 } else {
5359 idx_off = offsetof(struct hc_status_block_e1x, index_values) +
5360 (hc_index * sizeof(u16));
5361
5362 syn_off = CSTORM_HC_SYNC_LINE_INDEX_E1X_OFFSET(hc_index, sb_id);
5363 }
5364 CNIC_WR16(dev, BAR_CSTRORM_INTMEM + syn_off, 0);
5365 CNIC_WR16(dev, BAR_CSTRORM_INTMEM + CSTORM_STATUS_BLOCK_OFFSET(sb_id) +
5366 idx_off, 0);
5367
5349 *cp->kcq1.hw_prod_idx_ptr = 0; 5368 *cp->kcq1.hw_prod_idx_ptr = 0;
5350 CNIC_WR(dev, BAR_CSTRORM_INTMEM + 5369 CNIC_WR(dev, BAR_CSTRORM_INTMEM +
5351 CSTORM_ISCSI_EQ_CONS_OFFSET(cp->pfid, 0), 0); 5370 CSTORM_ISCSI_EQ_CONS_OFFSET(cp->pfid, 0), 0);