aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYuval Mintz <yuvalmin@broadcom.com>2014-02-12 11:19:56 -0500
committerDavid S. Miller <davem@davemloft.net>2014-02-12 19:15:42 -0500
commit230bb0f33672b5fad1c485ca82789f427fc1b253 (patch)
tree4fbf9c5645eae4ae9b6d769d061b376d6dc2bae6
parent0155a27cda683641d29e04e0fbea44afbd302fff (diff)
bnx2x: (semantic) revise scheduling of sp_rtnl
This removes the various points where the driver use bit operations in order to schedule the sp_rtnl_task from the code, adding a single utility function that does it instead. Signed-off-by: Yuval Mintz <yuvalmin@broadcom.com> Signed-off-by: Ariel Elior <ariele@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x.h2
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c18
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h3
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c8
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c28
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c17
6 files changed, 32 insertions, 44 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
index c871d19ab6e1..21fdd1b869db 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
@@ -1402,7 +1402,7 @@ struct bnx2x_fw_stats_data {
1402}; 1402};
1403 1403
1404/* Public slow path states */ 1404/* Public slow path states */
1405enum { 1405enum sp_rtnl_flag {
1406 BNX2X_SP_RTNL_SETUP_TC, 1406 BNX2X_SP_RTNL_SETUP_TC,
1407 BNX2X_SP_RTNL_TX_TIMEOUT, 1407 BNX2X_SP_RTNL_TX_TIMEOUT,
1408 BNX2X_SP_RTNL_FAN_FAILURE, 1408 BNX2X_SP_RTNL_FAN_FAILURE,
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
index 9d7419e0390b..9ded3dbb7678 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
@@ -4773,12 +4773,8 @@ void bnx2x_tx_timeout(struct net_device *dev)
4773 bnx2x_panic(); 4773 bnx2x_panic();
4774#endif 4774#endif
4775 4775
4776 smp_mb__before_clear_bit();
4777 set_bit(BNX2X_SP_RTNL_TX_TIMEOUT, &bp->sp_rtnl_state);
4778 smp_mb__after_clear_bit();
4779
4780 /* This allows the netif to be shutdown gracefully before resetting */ 4776 /* This allows the netif to be shutdown gracefully before resetting */
4781 schedule_delayed_work(&bp->sp_rtnl_task, 0); 4777 bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_TX_TIMEOUT, 0);
4782} 4778}
4783 4779
4784int bnx2x_suspend(struct pci_dev *pdev, pm_message_t state) 4780int bnx2x_suspend(struct pci_dev *pdev, pm_message_t state)
@@ -4906,3 +4902,15 @@ void bnx2x_update_coalesce_sb_index(struct bnx2x *bp, u8 fw_sb_id,
4906 disable = disable ? 1 : (usec ? 0 : 1); 4902 disable = disable ? 1 : (usec ? 0 : 1);
4907 storm_memset_hc_disable(bp, port, fw_sb_id, sb_index, disable); 4903 storm_memset_hc_disable(bp, port, fw_sb_id, sb_index, disable);
4908} 4904}
4905
4906void bnx2x_schedule_sp_rtnl(struct bnx2x *bp, enum sp_rtnl_flag flag,
4907 u32 verbose)
4908{
4909 smp_mb__before_clear_bit();
4910 set_bit(flag, &bp->sp_rtnl_state);
4911 smp_mb__after_clear_bit();
4912 DP((BNX2X_MSG_SP | verbose), "Scheduling sp_rtnl task [Flag: %d]\n",
4913 flag);
4914 schedule_delayed_work(&bp->sp_rtnl_task, 0);
4915}
4916EXPORT_SYMBOL(bnx2x_schedule_sp_rtnl);
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h
index bfc58d488bb5..5135cc7f7b6f 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h
@@ -1324,4 +1324,7 @@ void bnx2x_fill_fw_str(struct bnx2x *bp, char *buf, size_t buf_len);
1324int bnx2x_drain_tx_queues(struct bnx2x *bp); 1324int bnx2x_drain_tx_queues(struct bnx2x *bp);
1325void bnx2x_squeeze_objects(struct bnx2x *bp); 1325void bnx2x_squeeze_objects(struct bnx2x *bp);
1326 1326
1327void bnx2x_schedule_sp_rtnl(struct bnx2x*, enum sp_rtnl_flag,
1328 u32 verbose);
1329
1327#endif /* BNX2X_CMN_H */ 1330#endif /* BNX2X_CMN_H */
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c
index fdace204b054..97ea5421dd96 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c
@@ -710,8 +710,7 @@ static inline void bnx2x_dcbx_update_tc_mapping(struct bnx2x *bp)
710 * as we are handling an attention on a work queue which must be 710 * as we are handling an attention on a work queue which must be
711 * flushed at some rtnl-locked contexts (e.g. if down) 711 * flushed at some rtnl-locked contexts (e.g. if down)
712 */ 712 */
713 if (!test_and_set_bit(BNX2X_SP_RTNL_SETUP_TC, &bp->sp_rtnl_state)) 713 bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_SETUP_TC, 0);
714 schedule_delayed_work(&bp->sp_rtnl_task, 0);
715} 714}
716 715
717void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state) 716void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state)
@@ -764,10 +763,7 @@ void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state)
764 if (IS_MF(bp)) 763 if (IS_MF(bp))
765 bnx2x_link_sync_notify(bp); 764 bnx2x_link_sync_notify(bp);
766 765
767 set_bit(BNX2X_SP_RTNL_TX_STOP, &bp->sp_rtnl_state); 766 bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_TX_STOP, 0);
768
769 schedule_delayed_work(&bp->sp_rtnl_task, 0);
770
771 return; 767 return;
772 } 768 }
773 case BNX2X_DCBX_STATE_TX_PAUSED: 769 case BNX2X_DCBX_STATE_TX_PAUSED:
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
index da4f75e5cf07..84439152e499 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
@@ -3908,10 +3908,7 @@ static void bnx2x_fan_failure(struct bnx2x *bp)
3908 * This is due to some boards consuming sufficient power when driver is 3908 * This is due to some boards consuming sufficient power when driver is
3909 * up to overheat if fan fails. 3909 * up to overheat if fan fails.
3910 */ 3910 */
3911 smp_mb__before_clear_bit(); 3911 bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_FAN_FAILURE, 0);
3912 set_bit(BNX2X_SP_RTNL_FAN_FAILURE, &bp->sp_rtnl_state);
3913 smp_mb__after_clear_bit();
3914 schedule_delayed_work(&bp->sp_rtnl_task, 0);
3915} 3912}
3916 3913
3917static void bnx2x_attn_int_deasserted0(struct bnx2x *bp, u32 attn) 3914static void bnx2x_attn_int_deasserted0(struct bnx2x *bp, u32 attn)
@@ -5303,6 +5300,8 @@ static void bnx2x_eq_int(struct bnx2x *bp)
5303 break; 5300 break;
5304 5301
5305 } else { 5302 } else {
5303 int cmd = BNX2X_SP_RTNL_AFEX_F_UPDATE;
5304
5306 DP(BNX2X_MSG_SP | BNX2X_MSG_MCP, 5305 DP(BNX2X_MSG_SP | BNX2X_MSG_MCP,
5307 "AFEX: ramrod completed FUNCTION_UPDATE\n"); 5306 "AFEX: ramrod completed FUNCTION_UPDATE\n");
5308 f_obj->complete_cmd(bp, f_obj, 5307 f_obj->complete_cmd(bp, f_obj,
@@ -5312,12 +5311,7 @@ static void bnx2x_eq_int(struct bnx2x *bp)
5312 * sp_rtnl task as all Queue SP operations 5311 * sp_rtnl task as all Queue SP operations
5313 * should run under rtnl_lock. 5312 * should run under rtnl_lock.
5314 */ 5313 */
5315 smp_mb__before_clear_bit(); 5314 bnx2x_schedule_sp_rtnl(bp, cmd, 0);
5316 set_bit(BNX2X_SP_RTNL_AFEX_F_UPDATE,
5317 &bp->sp_rtnl_state);
5318 smp_mb__after_clear_bit();
5319
5320 schedule_delayed_work(&bp->sp_rtnl_task, 0);
5321 } 5315 }
5322 5316
5323 goto next_spqe; 5317 goto next_spqe;
@@ -12082,11 +12076,8 @@ static void bnx2x_set_rx_mode(struct net_device *dev)
12082 return; 12076 return;
12083 } else { 12077 } else {
12084 /* Schedule an SP task to handle rest of change */ 12078 /* Schedule an SP task to handle rest of change */
12085 DP(NETIF_MSG_IFUP, "Scheduling an Rx mode change\n"); 12079 bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_RX_MODE,
12086 smp_mb__before_clear_bit(); 12080 NETIF_MSG_IFUP);
12087 set_bit(BNX2X_SP_RTNL_RX_MODE, &bp->sp_rtnl_state);
12088 smp_mb__after_clear_bit();
12089 schedule_delayed_work(&bp->sp_rtnl_task, 0);
12090 } 12081 }
12091} 12082}
12092 12083
@@ -12119,11 +12110,8 @@ void bnx2x_set_rx_mode_inner(struct bnx2x *bp)
12119 /* configuring mcast to a vf involves sleeping (when we 12110 /* configuring mcast to a vf involves sleeping (when we
12120 * wait for the pf's response). 12111 * wait for the pf's response).
12121 */ 12112 */
12122 smp_mb__before_clear_bit(); 12113 bnx2x_schedule_sp_rtnl(bp,
12123 set_bit(BNX2X_SP_RTNL_VFPF_MCAST, 12114 BNX2X_SP_RTNL_VFPF_MCAST, 0);
12124 &bp->sp_rtnl_state);
12125 smp_mb__after_clear_bit();
12126 schedule_delayed_work(&bp->sp_rtnl_task, 0);
12127 } 12115 }
12128 } 12116 }
12129 12117
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
index bf001602bbb6..98b53671a652 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
@@ -983,11 +983,8 @@ op_err:
983op_done: 983op_done:
984 case BNX2X_VFOP_QSETUP_DONE: 984 case BNX2X_VFOP_QSETUP_DONE:
985 vf->cfg_flags |= VF_CFG_VLAN; 985 vf->cfg_flags |= VF_CFG_VLAN;
986 smp_mb__before_clear_bit(); 986 bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_HYPERVISOR_VLAN,
987 set_bit(BNX2X_SP_RTNL_HYPERVISOR_VLAN, 987 BNX2X_MSG_IOV);
988 &bp->sp_rtnl_state);
989 smp_mb__after_clear_bit();
990 schedule_delayed_work(&bp->sp_rtnl_task, 0);
991 bnx2x_vfop_end(bp, vf, vfop); 988 bnx2x_vfop_end(bp, vf, vfop);
992 return; 989 return;
993 default: 990 default:
@@ -3812,13 +3809,9 @@ void bnx2x_timer_sriov(struct bnx2x *bp)
3812 bnx2x_sample_bulletin(bp); 3809 bnx2x_sample_bulletin(bp);
3813 3810
3814 /* if channel is down we need to self destruct */ 3811 /* if channel is down we need to self destruct */
3815 if (bp->old_bulletin.valid_bitmap & 1 << CHANNEL_DOWN) { 3812 if (bp->old_bulletin.valid_bitmap & 1 << CHANNEL_DOWN)
3816 smp_mb__before_clear_bit(); 3813 bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_VFPF_CHANNEL_DOWN,
3817 set_bit(BNX2X_SP_RTNL_VFPF_CHANNEL_DOWN, 3814 BNX2X_MSG_IOV);
3818 &bp->sp_rtnl_state);
3819 smp_mb__after_clear_bit();
3820 schedule_delayed_work(&bp->sp_rtnl_task, 0);
3821 }
3822} 3815}
3823 3816
3824void __iomem *bnx2x_vf_doorbells(struct bnx2x *bp) 3817void __iomem *bnx2x_vf_doorbells(struct bnx2x *bp)