Skip to content

Commit c14db20

Browse files
Yuval Mintzdavem330
authored andcommitted
bnx2x: Correct default Tx switching behaviour
With this patch bnx2x will configure the PF to perform Tx switching on out-going traffic as soon as SR-IOV is dynamically enabled and de-activate it when it is disabled. This will allow VFs to communicate with their parent PFs. Signed-off-by: Yuval Mintz <[email protected]> Signed-off-by: Ariel Elior <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 08c93cd commit c14db20

File tree

5 files changed

+75
-1
lines changed

5 files changed

+75
-1
lines changed

drivers/net/ethernet/broadcom/bnx2x/bnx2x.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1566,6 +1566,7 @@ struct bnx2x {
15661566
#define NO_ISCSI_FLAG (1 << 14)
15671567
#define NO_FCOE_FLAG (1 << 15)
15681568
#define BC_SUPPORTS_PFC_STATS (1 << 17)
1569+
#define TX_SWITCHING (1 << 18)
15691570
#define BC_SUPPORTS_FCOE_FEATURES (1 << 19)
15701571
#define USING_SINGLE_MSIX_FLAG (1 << 20)
15711572
#define BC_SUPPORTS_DCBX_MSG_NON_PMF (1 << 21)

drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3007,6 +3007,9 @@ static unsigned long bnx2x_get_common_flags(struct bnx2x *bp,
30073007
if (zero_stats)
30083008
__set_bit(BNX2X_Q_FLG_ZERO_STATS, &flags);
30093009

3010+
if (bp->flags & TX_SWITCHING)
3011+
__set_bit(BNX2X_Q_FLG_TX_SWITCH, &flags);
3012+
30103013
__set_bit(BNX2X_Q_FLG_PCSUM_ON_PKT, &flags);
30113014
__set_bit(BNX2X_Q_FLG_TUN_INC_INNER_IP_ID, &flags);
30123015

drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4728,6 +4728,13 @@ static void bnx2x_q_fill_update_data(struct bnx2x *bp,
47284728
test_bit(BNX2X_Q_UPDATE_SILENT_VLAN_REM, &params->update_flags);
47294729
data->silent_vlan_value = cpu_to_le16(params->silent_removal_value);
47304730
data->silent_vlan_mask = cpu_to_le16(params->silent_removal_mask);
4731+
4732+
/* tx switching */
4733+
data->tx_switching_flg =
4734+
test_bit(BNX2X_Q_UPDATE_TX_SWITCHING, &params->update_flags);
4735+
data->tx_switching_change_flg =
4736+
test_bit(BNX2X_Q_UPDATE_TX_SWITCHING_CHNG,
4737+
&params->update_flags);
47314738
}
47324739

47334740
static inline int bnx2x_q_send_update(struct bnx2x *bp,

drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -767,7 +767,9 @@ enum {
767767
BNX2X_Q_UPDATE_DEF_VLAN_EN,
768768
BNX2X_Q_UPDATE_DEF_VLAN_EN_CHNG,
769769
BNX2X_Q_UPDATE_SILENT_VLAN_REM_CHNG,
770-
BNX2X_Q_UPDATE_SILENT_VLAN_REM
770+
BNX2X_Q_UPDATE_SILENT_VLAN_REM,
771+
BNX2X_Q_UPDATE_TX_SWITCHING_CHNG,
772+
BNX2X_Q_UPDATE_TX_SWITCHING
771773
};
772774

773775
/* Allowed Queue states */

drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3130,6 +3130,60 @@ void bnx2x_unlock_vf_pf_channel(struct bnx2x *bp, struct bnx2x_virtf *vf,
31303130
vf->abs_vfid, vf->op_current);
31313131
}
31323132

3133+
static int bnx2x_set_pf_tx_switching(struct bnx2x *bp, bool enable)
3134+
{
3135+
struct bnx2x_queue_state_params q_params;
3136+
u32 prev_flags;
3137+
int i, rc;
3138+
3139+
/* Verify changes are needed and record current Tx switching state */
3140+
prev_flags = bp->flags;
3141+
if (enable)
3142+
bp->flags |= TX_SWITCHING;
3143+
else
3144+
bp->flags &= ~TX_SWITCHING;
3145+
if (prev_flags == bp->flags)
3146+
return 0;
3147+
3148+
/* Verify state enables the sending of queue ramrods */
3149+
if ((bp->state != BNX2X_STATE_OPEN) ||
3150+
(bnx2x_get_q_logical_state(bp,
3151+
&bnx2x_sp_obj(bp, &bp->fp[0]).q_obj) !=
3152+
BNX2X_Q_LOGICAL_STATE_ACTIVE))
3153+
return 0;
3154+
3155+
/* send q. update ramrod to configure Tx switching */
3156+
memset(&q_params, 0, sizeof(q_params));
3157+
__set_bit(RAMROD_COMP_WAIT, &q_params.ramrod_flags);
3158+
q_params.cmd = BNX2X_Q_CMD_UPDATE;
3159+
__set_bit(BNX2X_Q_UPDATE_TX_SWITCHING_CHNG,
3160+
&q_params.params.update.update_flags);
3161+
if (enable)
3162+
__set_bit(BNX2X_Q_UPDATE_TX_SWITCHING,
3163+
&q_params.params.update.update_flags);
3164+
else
3165+
__clear_bit(BNX2X_Q_UPDATE_TX_SWITCHING,
3166+
&q_params.params.update.update_flags);
3167+
3168+
/* send the ramrod on all the queues of the PF */
3169+
for_each_eth_queue(bp, i) {
3170+
struct bnx2x_fastpath *fp = &bp->fp[i];
3171+
3172+
/* Set the appropriate Queue object */
3173+
q_params.q_obj = &bnx2x_sp_obj(bp, fp).q_obj;
3174+
3175+
/* Update the Queue state */
3176+
rc = bnx2x_queue_state_change(bp, &q_params);
3177+
if (rc) {
3178+
BNX2X_ERR("Failed to configure Tx switching\n");
3179+
return rc;
3180+
}
3181+
}
3182+
3183+
DP(BNX2X_MSG_IOV, "%s Tx Switching\n", enable ? "Enabled" : "Disabled");
3184+
return 0;
3185+
}
3186+
31333187
int bnx2x_sriov_configure(struct pci_dev *dev, int num_vfs_param)
31343188
{
31353189
struct bnx2x *bp = netdev_priv(pci_get_drvdata(dev));
@@ -3157,12 +3211,14 @@ int bnx2x_sriov_configure(struct pci_dev *dev, int num_vfs_param)
31573211

31583212
bp->requested_nr_virtfn = num_vfs_param;
31593213
if (num_vfs_param == 0) {
3214+
bnx2x_set_pf_tx_switching(bp, false);
31603215
pci_disable_sriov(dev);
31613216
return 0;
31623217
} else {
31633218
return bnx2x_enable_sriov(bp);
31643219
}
31653220
}
3221+
31663222
#define IGU_ENTRY_SIZE 4
31673223

31683224
int bnx2x_enable_sriov(struct bnx2x *bp)
@@ -3240,6 +3296,11 @@ int bnx2x_enable_sriov(struct bnx2x *bp)
32403296
*/
32413297
DP(BNX2X_MSG_IOV, "about to call enable sriov\n");
32423298
bnx2x_disable_sriov(bp);
3299+
3300+
rc = bnx2x_set_pf_tx_switching(bp, true);
3301+
if (rc)
3302+
return rc;
3303+
32433304
rc = pci_enable_sriov(bp->pdev, req_vfs);
32443305
if (rc) {
32453306
BNX2X_ERR("pci_enable_sriov failed with %d\n", rc);

0 commit comments

Comments
 (0)