Commit 230bb0f3 authored by Yuval Mintz's avatar Yuval Mintz Committed by David S. Miller

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: default avatarYuval Mintz <yuvalmin@broadcom.com>
Signed-off-by: default avatarAriel Elior <ariele@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0155a27c
...@@ -1402,7 +1402,7 @@ struct bnx2x_fw_stats_data { ...@@ -1402,7 +1402,7 @@ struct bnx2x_fw_stats_data {
}; };
/* Public slow path states */ /* Public slow path states */
enum { enum sp_rtnl_flag {
BNX2X_SP_RTNL_SETUP_TC, BNX2X_SP_RTNL_SETUP_TC,
BNX2X_SP_RTNL_TX_TIMEOUT, BNX2X_SP_RTNL_TX_TIMEOUT,
BNX2X_SP_RTNL_FAN_FAILURE, BNX2X_SP_RTNL_FAN_FAILURE,
......
...@@ -4773,12 +4773,8 @@ void bnx2x_tx_timeout(struct net_device *dev) ...@@ -4773,12 +4773,8 @@ void bnx2x_tx_timeout(struct net_device *dev)
bnx2x_panic(); bnx2x_panic();
#endif #endif
smp_mb__before_clear_bit();
set_bit(BNX2X_SP_RTNL_TX_TIMEOUT, &bp->sp_rtnl_state);
smp_mb__after_clear_bit();
/* This allows the netif to be shutdown gracefully before resetting */ /* This allows the netif to be shutdown gracefully before resetting */
schedule_delayed_work(&bp->sp_rtnl_task, 0); bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_TX_TIMEOUT, 0);
} }
int bnx2x_suspend(struct pci_dev *pdev, pm_message_t state) 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,3 +4902,15 @@ void bnx2x_update_coalesce_sb_index(struct bnx2x *bp, u8 fw_sb_id,
disable = disable ? 1 : (usec ? 0 : 1); disable = disable ? 1 : (usec ? 0 : 1);
storm_memset_hc_disable(bp, port, fw_sb_id, sb_index, disable); storm_memset_hc_disable(bp, port, fw_sb_id, sb_index, disable);
} }
void bnx2x_schedule_sp_rtnl(struct bnx2x *bp, enum sp_rtnl_flag flag,
u32 verbose)
{
smp_mb__before_clear_bit();
set_bit(flag, &bp->sp_rtnl_state);
smp_mb__after_clear_bit();
DP((BNX2X_MSG_SP | verbose), "Scheduling sp_rtnl task [Flag: %d]\n",
flag);
schedule_delayed_work(&bp->sp_rtnl_task, 0);
}
EXPORT_SYMBOL(bnx2x_schedule_sp_rtnl);
...@@ -1324,4 +1324,7 @@ void bnx2x_fill_fw_str(struct bnx2x *bp, char *buf, size_t buf_len); ...@@ -1324,4 +1324,7 @@ void bnx2x_fill_fw_str(struct bnx2x *bp, char *buf, size_t buf_len);
int bnx2x_drain_tx_queues(struct bnx2x *bp); int bnx2x_drain_tx_queues(struct bnx2x *bp);
void bnx2x_squeeze_objects(struct bnx2x *bp); void bnx2x_squeeze_objects(struct bnx2x *bp);
void bnx2x_schedule_sp_rtnl(struct bnx2x*, enum sp_rtnl_flag,
u32 verbose);
#endif /* BNX2X_CMN_H */ #endif /* BNX2X_CMN_H */
...@@ -710,8 +710,7 @@ static inline void bnx2x_dcbx_update_tc_mapping(struct bnx2x *bp) ...@@ -710,8 +710,7 @@ static inline void bnx2x_dcbx_update_tc_mapping(struct bnx2x *bp)
* as we are handling an attention on a work queue which must be * as we are handling an attention on a work queue which must be
* flushed at some rtnl-locked contexts (e.g. if down) * flushed at some rtnl-locked contexts (e.g. if down)
*/ */
if (!test_and_set_bit(BNX2X_SP_RTNL_SETUP_TC, &bp->sp_rtnl_state)) bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_SETUP_TC, 0);
schedule_delayed_work(&bp->sp_rtnl_task, 0);
} }
void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state) 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,10 +763,7 @@ void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state)
if (IS_MF(bp)) if (IS_MF(bp))
bnx2x_link_sync_notify(bp); bnx2x_link_sync_notify(bp);
set_bit(BNX2X_SP_RTNL_TX_STOP, &bp->sp_rtnl_state); bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_TX_STOP, 0);
schedule_delayed_work(&bp->sp_rtnl_task, 0);
return; return;
} }
case BNX2X_DCBX_STATE_TX_PAUSED: case BNX2X_DCBX_STATE_TX_PAUSED:
......
...@@ -3908,10 +3908,7 @@ static void bnx2x_fan_failure(struct bnx2x *bp) ...@@ -3908,10 +3908,7 @@ static void bnx2x_fan_failure(struct bnx2x *bp)
* This is due to some boards consuming sufficient power when driver is * This is due to some boards consuming sufficient power when driver is
* up to overheat if fan fails. * up to overheat if fan fails.
*/ */
smp_mb__before_clear_bit(); bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_FAN_FAILURE, 0);
set_bit(BNX2X_SP_RTNL_FAN_FAILURE, &bp->sp_rtnl_state);
smp_mb__after_clear_bit();
schedule_delayed_work(&bp->sp_rtnl_task, 0);
} }
static void bnx2x_attn_int_deasserted0(struct bnx2x *bp, u32 attn) static void bnx2x_attn_int_deasserted0(struct bnx2x *bp, u32 attn)
...@@ -5303,6 +5300,8 @@ static void bnx2x_eq_int(struct bnx2x *bp) ...@@ -5303,6 +5300,8 @@ static void bnx2x_eq_int(struct bnx2x *bp)
break; break;
} else { } else {
int cmd = BNX2X_SP_RTNL_AFEX_F_UPDATE;
DP(BNX2X_MSG_SP | BNX2X_MSG_MCP, DP(BNX2X_MSG_SP | BNX2X_MSG_MCP,
"AFEX: ramrod completed FUNCTION_UPDATE\n"); "AFEX: ramrod completed FUNCTION_UPDATE\n");
f_obj->complete_cmd(bp, f_obj, f_obj->complete_cmd(bp, f_obj,
...@@ -5312,12 +5311,7 @@ static void bnx2x_eq_int(struct bnx2x *bp) ...@@ -5312,12 +5311,7 @@ static void bnx2x_eq_int(struct bnx2x *bp)
* sp_rtnl task as all Queue SP operations * sp_rtnl task as all Queue SP operations
* should run under rtnl_lock. * should run under rtnl_lock.
*/ */
smp_mb__before_clear_bit(); bnx2x_schedule_sp_rtnl(bp, cmd, 0);
set_bit(BNX2X_SP_RTNL_AFEX_F_UPDATE,
&bp->sp_rtnl_state);
smp_mb__after_clear_bit();
schedule_delayed_work(&bp->sp_rtnl_task, 0);
} }
goto next_spqe; goto next_spqe;
...@@ -12082,11 +12076,8 @@ static void bnx2x_set_rx_mode(struct net_device *dev) ...@@ -12082,11 +12076,8 @@ static void bnx2x_set_rx_mode(struct net_device *dev)
return; return;
} else { } else {
/* Schedule an SP task to handle rest of change */ /* Schedule an SP task to handle rest of change */
DP(NETIF_MSG_IFUP, "Scheduling an Rx mode change\n"); bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_RX_MODE,
smp_mb__before_clear_bit(); NETIF_MSG_IFUP);
set_bit(BNX2X_SP_RTNL_RX_MODE, &bp->sp_rtnl_state);
smp_mb__after_clear_bit();
schedule_delayed_work(&bp->sp_rtnl_task, 0);
} }
} }
...@@ -12119,11 +12110,8 @@ void bnx2x_set_rx_mode_inner(struct bnx2x *bp) ...@@ -12119,11 +12110,8 @@ void bnx2x_set_rx_mode_inner(struct bnx2x *bp)
/* configuring mcast to a vf involves sleeping (when we /* configuring mcast to a vf involves sleeping (when we
* wait for the pf's response). * wait for the pf's response).
*/ */
smp_mb__before_clear_bit(); bnx2x_schedule_sp_rtnl(bp,
set_bit(BNX2X_SP_RTNL_VFPF_MCAST, BNX2X_SP_RTNL_VFPF_MCAST, 0);
&bp->sp_rtnl_state);
smp_mb__after_clear_bit();
schedule_delayed_work(&bp->sp_rtnl_task, 0);
} }
} }
......
...@@ -983,11 +983,8 @@ static void bnx2x_vfop_qsetup(struct bnx2x *bp, struct bnx2x_virtf *vf) ...@@ -983,11 +983,8 @@ static void bnx2x_vfop_qsetup(struct bnx2x *bp, struct bnx2x_virtf *vf)
op_done: op_done:
case BNX2X_VFOP_QSETUP_DONE: case BNX2X_VFOP_QSETUP_DONE:
vf->cfg_flags |= VF_CFG_VLAN; vf->cfg_flags |= VF_CFG_VLAN;
smp_mb__before_clear_bit(); bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_HYPERVISOR_VLAN,
set_bit(BNX2X_SP_RTNL_HYPERVISOR_VLAN, BNX2X_MSG_IOV);
&bp->sp_rtnl_state);
smp_mb__after_clear_bit();
schedule_delayed_work(&bp->sp_rtnl_task, 0);
bnx2x_vfop_end(bp, vf, vfop); bnx2x_vfop_end(bp, vf, vfop);
return; return;
default: default:
...@@ -3812,13 +3809,9 @@ void bnx2x_timer_sriov(struct bnx2x *bp) ...@@ -3812,13 +3809,9 @@ void bnx2x_timer_sriov(struct bnx2x *bp)
bnx2x_sample_bulletin(bp); bnx2x_sample_bulletin(bp);
/* if channel is down we need to self destruct */ /* if channel is down we need to self destruct */
if (bp->old_bulletin.valid_bitmap & 1 << CHANNEL_DOWN) { if (bp->old_bulletin.valid_bitmap & 1 << CHANNEL_DOWN)
smp_mb__before_clear_bit(); bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_VFPF_CHANNEL_DOWN,
set_bit(BNX2X_SP_RTNL_VFPF_CHANNEL_DOWN, BNX2X_MSG_IOV);
&bp->sp_rtnl_state);
smp_mb__after_clear_bit();
schedule_delayed_work(&bp->sp_rtnl_task, 0);
}
} }
void __iomem *bnx2x_vf_doorbells(struct bnx2x *bp) void __iomem *bnx2x_vf_doorbells(struct bnx2x *bp)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment