Message ID | 20150508223557.26673.76301.stgit@jbrandeb-cp2.jf.intel.com |
---|---|
State | Accepted |
Delegated to: | Jeff Kirsher |
Headers | show |
On Fri, 2015-05-08 at 15:35 -0700, Jesse Brandeburg wrote: > From: Anjali Singhai Jain <anjali.singhai@intel.com> > > 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> > --- > drivers/net/ethernet/intel/i40e/i40e.h | 1 + > drivers/net/ethernet/intel/i40e/i40e_debugfs.c | 9 +++++++++ > drivers/net/ethernet/intel/i40e/i40e_main.c | 21 > ++++++++++++++++---- > drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 10 +++++++++- > 4 files changed, 36 insertions(+), 5 deletions(-) Applied to my net-queue tree
> -----Original Message----- > From: Intel-wired-lan [mailto:intel-wired-lan-bounces@lists.osuosl.org] On > Behalf Of Jesse Brandeburg > Sent: Friday, May 08, 2015 3:36 PM > To: intel-wired-lan@lists.osuosl.org > Subject: [Intel-wired-lan] [net PATCH 2/2] i40e: start up in VEPA mode by > default > > From: Anjali Singhai Jain <anjali.singhai@intel.com> > > 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> > --- > drivers/net/ethernet/intel/i40e/i40e.h | 1 + > drivers/net/ethernet/intel/i40e/i40e_debugfs.c | 9 +++++++++ > drivers/net/ethernet/intel/i40e/i40e_main.c | 21 ++++++++++++++++- > --- > drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 10 +++++++++- > 4 files changed, 36 insertions(+), 5 deletions(-) > Tested-by: Jim Young <james.m.young@intel.com> Tested with sriov turned on, and sriov enabled in the bios, bridging works.
diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h index 33c35d3..e946d75 100644 --- a/drivers/net/ethernet/intel/i40e/i40e.h +++ b/drivers/net/ethernet/intel/i40e/i40e.h @@ -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; diff --git a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c index 34170ea..da0faf4 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c +++ b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c @@ -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", diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index a54c144..853eb2f 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -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++) { diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c index 78d1c4f..4e9376d 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c @@ -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;