forked from luck/tmp_suning_uos_patched
i40e: start up in VEPA mode by default
The patch fixes a bug in the default configuration which prevented a software bridge loaded on the PF interface from working correctly because broadcast packets are incorrectly looped back. Fix the general case, by loading the driver in VEPA mode Until a VF or VMDq VSI is added. This way loopback on the Main VSI is turned off until needed and can resolve the issue of unnecessary reflection for users that do not have VF or VMDq VSIs setup. The driver must now coordinate the loopback setting for the Flow Director (FDIR) VSI to make sure it is in sync with the current VEB or VEPA mode setting. The user can still switch bridge modes from the bridge commands and choose to be in VEPA mode with VF VSIs. Because of hardware requirements, the call to switch to VEB mode when no VF/VMDqs are present will be rejected. NOTE: This patch uses BIT_ULL as that is preferred going forward, a followup patch in the lower priority queue to net-next will fix up the remaining 1 << usages. Change-ID: Ib121ddb18fe4b3c4f52e9deda6fcbeb9105683d1 Signed-off-by: Anjali Singhai Jain <anjali.singhai@intel.com> Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com> Tested-by: Jim Young <james.m.young@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
30520831f0
commit
fc60861e9b
|
@ -317,6 +317,7 @@ struct i40e_pf {
|
|||
#endif
|
||||
#define I40E_FLAG_PORT_ID_VALID (u64)(1 << 28)
|
||||
#define I40E_FLAG_DCB_CAPABLE (u64)(1 << 29)
|
||||
#define I40E_FLAG_VEB_MODE_ENABLED BIT_ULL(40)
|
||||
|
||||
/* tracks features that get auto disabled by errors */
|
||||
u64 auto_disable_flags;
|
||||
|
|
|
@ -1021,6 +1021,15 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
|
|||
goto command_write_done;
|
||||
}
|
||||
|
||||
/* By default we are in VEPA mode, if this is the first VF/VMDq
|
||||
* VSI to be added switch to VEB mode.
|
||||
*/
|
||||
if (!(pf->flags & I40E_FLAG_VEB_MODE_ENABLED)) {
|
||||
pf->flags |= I40E_FLAG_VEB_MODE_ENABLED;
|
||||
i40e_do_reset_safe(pf,
|
||||
BIT_ULL(__I40E_PF_RESET_REQUESTED));
|
||||
}
|
||||
|
||||
vsi = i40e_vsi_setup(pf, I40E_VSI_VMDQ2, vsi_seid, 0);
|
||||
if (vsi)
|
||||
dev_info(&pf->pdev->dev, "added VSI %d to relay %d\n",
|
||||
|
|
|
@ -6097,6 +6097,10 @@ static int i40e_reconstitute_veb(struct i40e_veb *veb)
|
|||
if (ret)
|
||||
goto end_reconstitute;
|
||||
|
||||
if (pf->flags & I40E_FLAG_VEB_MODE_ENABLED)
|
||||
veb->bridge_mode = BRIDGE_MODE_VEB;
|
||||
else
|
||||
veb->bridge_mode = BRIDGE_MODE_VEPA;
|
||||
i40e_config_bridge_mode(veb);
|
||||
|
||||
/* create the remaining VSIs attached to this VEB */
|
||||
|
@ -8031,7 +8035,12 @@ static int i40e_ndo_bridge_setlink(struct net_device *dev,
|
|||
} else if (mode != veb->bridge_mode) {
|
||||
/* Existing HW bridge but different mode needs reset */
|
||||
veb->bridge_mode = mode;
|
||||
i40e_do_reset(pf, (1 << __I40E_PF_RESET_REQUESTED));
|
||||
/* TODO: If no VFs or VMDq VSIs, disallow VEB mode */
|
||||
if (mode == BRIDGE_MODE_VEB)
|
||||
pf->flags |= I40E_FLAG_VEB_MODE_ENABLED;
|
||||
else
|
||||
pf->flags &= ~I40E_FLAG_VEB_MODE_ENABLED;
|
||||
i40e_do_reset(pf, BIT_ULL(__I40E_PF_RESET_REQUESTED));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -8343,11 +8352,12 @@ static int i40e_add_vsi(struct i40e_vsi *vsi)
|
|||
ctxt.uplink_seid = vsi->uplink_seid;
|
||||
ctxt.connection_type = I40E_AQ_VSI_CONN_TYPE_NORMAL;
|
||||
ctxt.flags = I40E_AQ_VSI_TYPE_PF;
|
||||
if (i40e_is_vsi_uplink_mode_veb(vsi)) {
|
||||
if ((pf->flags & I40E_FLAG_VEB_MODE_ENABLED) &&
|
||||
(i40e_is_vsi_uplink_mode_veb(vsi))) {
|
||||
ctxt.info.valid_sections |=
|
||||
cpu_to_le16(I40E_AQ_VSI_PROP_SWITCH_VALID);
|
||||
cpu_to_le16(I40E_AQ_VSI_PROP_SWITCH_VALID);
|
||||
ctxt.info.switch_id =
|
||||
cpu_to_le16(I40E_AQ_VSI_SW_ID_FLAG_ALLOW_LB);
|
||||
cpu_to_le16(I40E_AQ_VSI_SW_ID_FLAG_ALLOW_LB);
|
||||
}
|
||||
i40e_vsi_setup_queue_map(vsi, &ctxt, enabled_tc, true);
|
||||
break;
|
||||
|
@ -8746,6 +8756,9 @@ struct i40e_vsi *i40e_vsi_setup(struct i40e_pf *pf, u8 type,
|
|||
__func__);
|
||||
return NULL;
|
||||
}
|
||||
/* We come up by default in VEPA mode */
|
||||
veb->bridge_mode = BRIDGE_MODE_VEPA;
|
||||
pf->flags &= ~I40E_FLAG_VEB_MODE_ENABLED;
|
||||
i40e_config_bridge_mode(veb);
|
||||
}
|
||||
for (i = 0; i < I40E_MAX_VEB && !veb; i++) {
|
||||
|
|
|
@ -1018,11 +1018,19 @@ int i40e_pci_sriov_configure(struct pci_dev *pdev, int num_vfs)
|
|||
{
|
||||
struct i40e_pf *pf = pci_get_drvdata(pdev);
|
||||
|
||||
if (num_vfs)
|
||||
if (num_vfs) {
|
||||
if (!(pf->flags & I40E_FLAG_VEB_MODE_ENABLED)) {
|
||||
pf->flags |= I40E_FLAG_VEB_MODE_ENABLED;
|
||||
i40e_do_reset_safe(pf,
|
||||
BIT_ULL(__I40E_PF_RESET_REQUESTED));
|
||||
}
|
||||
return i40e_pci_sriov_enable(pdev, num_vfs);
|
||||
}
|
||||
|
||||
if (!pci_vfs_assigned(pf->pdev)) {
|
||||
i40e_free_vfs(pf);
|
||||
pf->flags &= ~I40E_FLAG_VEB_MODE_ENABLED;
|
||||
i40e_do_reset_safe(pf, BIT_ULL(__I40E_PF_RESET_REQUESTED));
|
||||
} else {
|
||||
dev_warn(&pdev->dev, "Unable to free VFs because some are assigned to VMs.\n");
|
||||
return -EINVAL;
|
||||
|
|
Loading…
Reference in New Issue
Block a user