diff options
author | Yuval Mintz <yuvalmin@broadcom.com> | 2014-02-12 11:19:56 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-02-12 19:15:42 -0500 |
commit | 230bb0f33672b5fad1c485ca82789f427fc1b253 (patch) | |
tree | 4fbf9c5645eae4ae9b6d769d061b376d6dc2bae6 | |
parent | 0155a27cda683641d29e04e0fbea44afbd302fff (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.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 18 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c | 8 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 28 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c | 17 |
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 */ |
1405 | enum { | 1405 | enum 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 | ||
4784 | int bnx2x_suspend(struct pci_dev *pdev, pm_message_t state) | 4780 | int 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 | |||
4906 | void 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 | } | ||
4916 | EXPORT_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); | |||
1324 | int bnx2x_drain_tx_queues(struct bnx2x *bp); | 1324 | int bnx2x_drain_tx_queues(struct bnx2x *bp); |
1325 | void bnx2x_squeeze_objects(struct bnx2x *bp); | 1325 | void bnx2x_squeeze_objects(struct bnx2x *bp); |
1326 | 1326 | ||
1327 | void 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 | ||
717 | void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state) | 716 | void 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 | ||
3917 | static void bnx2x_attn_int_deasserted0(struct bnx2x *bp, u32 attn) | 3914 | static 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: | |||
983 | op_done: | 983 | op_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 | ||
3824 | void __iomem *bnx2x_vf_doorbells(struct bnx2x *bp) | 3817 | void __iomem *bnx2x_vf_doorbells(struct bnx2x *bp) |