diff options
author | David S. Miller <davem@davemloft.net> | 2013-11-18 15:45:51 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-11-18 15:45:51 -0500 |
commit | 4861292f730d7c461758575e2557e285a1d4521e (patch) | |
tree | a79003d656cd9b1692d0d78307b56c86ff01cce6 | |
parent | eca42aaf898c31db1fd04850fb4dc584c9184c49 (diff) | |
parent | 6ffa39f2f59e4555239cc23a3488ad789b557166 (diff) |
Merge branch 'bnx2x'
Yuval Mintz says:
====================
bnx2x: Bug fixes patch series
This series contains several fixes, relating either to SR-IOV flows
or to critical sections protected by the rtnl lock.
Please consider applying these patches to `net'.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c | 5 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 17 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h | 11 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c | 2 |
6 files changed, 28 insertions, 12 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h index 4e01c57d8c8d..a1f66e2c9a86 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | |||
@@ -1376,7 +1376,6 @@ enum { | |||
1376 | BNX2X_SP_RTNL_RX_MODE, | 1376 | BNX2X_SP_RTNL_RX_MODE, |
1377 | BNX2X_SP_RTNL_HYPERVISOR_VLAN, | 1377 | BNX2X_SP_RTNL_HYPERVISOR_VLAN, |
1378 | BNX2X_SP_RTNL_TX_STOP, | 1378 | BNX2X_SP_RTNL_TX_STOP, |
1379 | BNX2X_SP_RTNL_TX_RESUME, | ||
1380 | }; | 1379 | }; |
1381 | 1380 | ||
1382 | struct bnx2x_prev_path_list { | 1381 | struct bnx2x_prev_path_list { |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index dcafbda3e5be..ec96130533cc 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
@@ -2959,6 +2959,10 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link) | |||
2959 | 2959 | ||
2960 | bp->port.pmf = 0; | 2960 | bp->port.pmf = 0; |
2961 | 2961 | ||
2962 | /* clear pending work in rtnl task */ | ||
2963 | bp->sp_rtnl_state = 0; | ||
2964 | smp_mb(); | ||
2965 | |||
2962 | /* Free SKBs, SGEs, TPA pool and driver internals */ | 2966 | /* Free SKBs, SGEs, TPA pool and driver internals */ |
2963 | bnx2x_free_skbs(bp); | 2967 | bnx2x_free_skbs(bp); |
2964 | if (CNIC_LOADED(bp)) | 2968 | if (CNIC_LOADED(bp)) |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c index fcf2761d8828..fdace204b054 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c | |||
@@ -778,11 +778,6 @@ void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state) | |||
778 | 778 | ||
779 | /* ets may affect cmng configuration: reinit it in hw */ | 779 | /* ets may affect cmng configuration: reinit it in hw */ |
780 | bnx2x_set_local_cmng(bp); | 780 | bnx2x_set_local_cmng(bp); |
781 | |||
782 | set_bit(BNX2X_SP_RTNL_TX_RESUME, &bp->sp_rtnl_state); | ||
783 | |||
784 | schedule_delayed_work(&bp->sp_rtnl_task, 0); | ||
785 | |||
786 | return; | 781 | return; |
787 | case BNX2X_DCBX_STATE_TX_RELEASED: | 782 | case BNX2X_DCBX_STATE_TX_RELEASED: |
788 | DP(BNX2X_MSG_DCB, "BNX2X_DCBX_STATE_TX_RELEASED\n"); | 783 | DP(BNX2X_MSG_DCB, "BNX2X_DCBX_STATE_TX_RELEASED\n"); |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index bb2f20291509..8eb6469813c5 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
@@ -577,7 +577,9 @@ void bnx2x_write_dmae(struct bnx2x *bp, dma_addr_t dma_addr, u32 dst_addr, | |||
577 | rc = bnx2x_issue_dmae_with_comp(bp, &dmae, bnx2x_sp(bp, wb_comp)); | 577 | rc = bnx2x_issue_dmae_with_comp(bp, &dmae, bnx2x_sp(bp, wb_comp)); |
578 | if (rc) { | 578 | if (rc) { |
579 | BNX2X_ERR("DMAE returned failure %d\n", rc); | 579 | BNX2X_ERR("DMAE returned failure %d\n", rc); |
580 | #ifdef BNX2X_STOP_ON_ERROR | ||
580 | bnx2x_panic(); | 581 | bnx2x_panic(); |
582 | #endif | ||
581 | } | 583 | } |
582 | } | 584 | } |
583 | 585 | ||
@@ -614,7 +616,9 @@ void bnx2x_read_dmae(struct bnx2x *bp, u32 src_addr, u32 len32) | |||
614 | rc = bnx2x_issue_dmae_with_comp(bp, &dmae, bnx2x_sp(bp, wb_comp)); | 616 | rc = bnx2x_issue_dmae_with_comp(bp, &dmae, bnx2x_sp(bp, wb_comp)); |
615 | if (rc) { | 617 | if (rc) { |
616 | BNX2X_ERR("DMAE returned failure %d\n", rc); | 618 | BNX2X_ERR("DMAE returned failure %d\n", rc); |
619 | #ifdef BNX2X_STOP_ON_ERROR | ||
617 | bnx2x_panic(); | 620 | bnx2x_panic(); |
621 | #endif | ||
618 | } | 622 | } |
619 | } | 623 | } |
620 | 624 | ||
@@ -5231,18 +5235,18 @@ static void bnx2x_eq_int(struct bnx2x *bp) | |||
5231 | 5235 | ||
5232 | case EVENT_RING_OPCODE_STOP_TRAFFIC: | 5236 | case EVENT_RING_OPCODE_STOP_TRAFFIC: |
5233 | DP(BNX2X_MSG_SP | BNX2X_MSG_DCB, "got STOP TRAFFIC\n"); | 5237 | DP(BNX2X_MSG_SP | BNX2X_MSG_DCB, "got STOP TRAFFIC\n"); |
5238 | bnx2x_dcbx_set_params(bp, BNX2X_DCBX_STATE_TX_PAUSED); | ||
5234 | if (f_obj->complete_cmd(bp, f_obj, | 5239 | if (f_obj->complete_cmd(bp, f_obj, |
5235 | BNX2X_F_CMD_TX_STOP)) | 5240 | BNX2X_F_CMD_TX_STOP)) |
5236 | break; | 5241 | break; |
5237 | bnx2x_dcbx_set_params(bp, BNX2X_DCBX_STATE_TX_PAUSED); | ||
5238 | goto next_spqe; | 5242 | goto next_spqe; |
5239 | 5243 | ||
5240 | case EVENT_RING_OPCODE_START_TRAFFIC: | 5244 | case EVENT_RING_OPCODE_START_TRAFFIC: |
5241 | DP(BNX2X_MSG_SP | BNX2X_MSG_DCB, "got START TRAFFIC\n"); | 5245 | DP(BNX2X_MSG_SP | BNX2X_MSG_DCB, "got START TRAFFIC\n"); |
5246 | bnx2x_dcbx_set_params(bp, BNX2X_DCBX_STATE_TX_RELEASED); | ||
5242 | if (f_obj->complete_cmd(bp, f_obj, | 5247 | if (f_obj->complete_cmd(bp, f_obj, |
5243 | BNX2X_F_CMD_TX_START)) | 5248 | BNX2X_F_CMD_TX_START)) |
5244 | break; | 5249 | break; |
5245 | bnx2x_dcbx_set_params(bp, BNX2X_DCBX_STATE_TX_RELEASED); | ||
5246 | goto next_spqe; | 5250 | goto next_spqe; |
5247 | 5251 | ||
5248 | case EVENT_RING_OPCODE_FUNCTION_UPDATE: | 5252 | case EVENT_RING_OPCODE_FUNCTION_UPDATE: |
@@ -9352,6 +9356,10 @@ static int bnx2x_process_kill(struct bnx2x *bp, bool global) | |||
9352 | bnx2x_process_kill_chip_reset(bp, global); | 9356 | bnx2x_process_kill_chip_reset(bp, global); |
9353 | barrier(); | 9357 | barrier(); |
9354 | 9358 | ||
9359 | /* clear errors in PGB */ | ||
9360 | if (!CHIP_IS_E1x(bp)) | ||
9361 | REG_WR(bp, PGLUE_B_REG_LATCHED_ERRORS_CLR, 0x7f); | ||
9362 | |||
9355 | /* Recover after reset: */ | 9363 | /* Recover after reset: */ |
9356 | /* MCP */ | 9364 | /* MCP */ |
9357 | if (global && bnx2x_reset_mcp_comp(bp, val)) | 9365 | if (global && bnx2x_reset_mcp_comp(bp, val)) |
@@ -9706,11 +9714,10 @@ sp_rtnl_not_reset: | |||
9706 | &bp->sp_rtnl_state)) | 9714 | &bp->sp_rtnl_state)) |
9707 | bnx2x_pf_set_vfs_vlan(bp); | 9715 | bnx2x_pf_set_vfs_vlan(bp); |
9708 | 9716 | ||
9709 | if (test_and_clear_bit(BNX2X_SP_RTNL_TX_STOP, &bp->sp_rtnl_state)) | 9717 | if (test_and_clear_bit(BNX2X_SP_RTNL_TX_STOP, &bp->sp_rtnl_state)) { |
9710 | bnx2x_dcbx_stop_hw_tx(bp); | 9718 | bnx2x_dcbx_stop_hw_tx(bp); |
9711 | |||
9712 | if (test_and_clear_bit(BNX2X_SP_RTNL_TX_RESUME, &bp->sp_rtnl_state)) | ||
9713 | bnx2x_dcbx_resume_hw_tx(bp); | 9719 | bnx2x_dcbx_resume_hw_tx(bp); |
9720 | } | ||
9714 | 9721 | ||
9715 | /* work which needs rtnl lock not-taken (as it takes the lock itself and | 9722 | /* work which needs rtnl lock not-taken (as it takes the lock itself and |
9716 | * can be called from other contexts as well) | 9723 | * can be called from other contexts as well) |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h index 5ecf267dc4cc..3efbb35267c8 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h | |||
@@ -2864,6 +2864,17 @@ | |||
2864 | #define PGLUE_B_REG_INTERNAL_PFID_ENABLE_TARGET_READ 0x9430 | 2864 | #define PGLUE_B_REG_INTERNAL_PFID_ENABLE_TARGET_READ 0x9430 |
2865 | #define PGLUE_B_REG_INTERNAL_PFID_ENABLE_TARGET_WRITE 0x9434 | 2865 | #define PGLUE_B_REG_INTERNAL_PFID_ENABLE_TARGET_WRITE 0x9434 |
2866 | #define PGLUE_B_REG_INTERNAL_VFID_ENABLE 0x9438 | 2866 | #define PGLUE_B_REG_INTERNAL_VFID_ENABLE 0x9438 |
2867 | /* [W 7] Writing 1 to each bit in this register clears a corresponding error | ||
2868 | * details register and enables logging new error details. Bit 0 - clears | ||
2869 | * INCORRECT_RCV_DETAILS; Bit 1 - clears RX_ERR_DETAILS; Bit 2 - clears | ||
2870 | * TX_ERR_WR_ADD_31_0 TX_ERR_WR_ADD_63_32 TX_ERR_WR_DETAILS | ||
2871 | * TX_ERR_WR_DETAILS2 TX_ERR_RD_ADD_31_0 TX_ERR_RD_ADD_63_32 | ||
2872 | * TX_ERR_RD_DETAILS TX_ERR_RD_DETAILS2 TX_ERR_WR_DETAILS_ICPL; Bit 3 - | ||
2873 | * clears VF_LENGTH_VIOLATION_DETAILS. Bit 4 - clears | ||
2874 | * VF_GRC_SPACE_VIOLATION_DETAILS. Bit 5 - clears RX_TCPL_ERR_DETAILS. Bit 6 | ||
2875 | * - clears TCPL_IN_TWO_RCBS_DETAILS. */ | ||
2876 | #define PGLUE_B_REG_LATCHED_ERRORS_CLR 0x943c | ||
2877 | |||
2867 | /* [R 9] Interrupt register #0 read */ | 2878 | /* [R 9] Interrupt register #0 read */ |
2868 | #define PGLUE_B_REG_PGLUE_B_INT_STS 0x9298 | 2879 | #define PGLUE_B_REG_PGLUE_B_INT_STS 0x9298 |
2869 | /* [RC 9] Interrupt register #0 read clear */ | 2880 | /* [RC 9] Interrupt register #0 read clear */ |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c index 9199adf32d33..efa8a151d789 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c | |||
@@ -152,7 +152,7 @@ static int bnx2x_send_msg2pf(struct bnx2x *bp, u8 *done, dma_addr_t msg_mapping) | |||
152 | if (bp->old_bulletin.valid_bitmap & 1 << CHANNEL_DOWN) { | 152 | if (bp->old_bulletin.valid_bitmap & 1 << CHANNEL_DOWN) { |
153 | DP(BNX2X_MSG_IOV, "detecting channel down. Aborting message\n"); | 153 | DP(BNX2X_MSG_IOV, "detecting channel down. Aborting message\n"); |
154 | *done = PFVF_STATUS_SUCCESS; | 154 | *done = PFVF_STATUS_SUCCESS; |
155 | return 0; | 155 | return -EINVAL; |
156 | } | 156 | } |
157 | 157 | ||
158 | /* Write message address */ | 158 | /* Write message address */ |