i40e: Add new update VSI flow to accommodate FW fix with VSI Loopback mode
authorAnjali Singhai Jain <anjali.singhai@intel.com>
Thu, 13 Nov 2014 03:06:14 +0000 (03:06 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sat, 6 Dec 2014 12:26:33 +0000 (04:26 -0800)
All VSIs on a VEB should either have loopback enabled or disabled, a
mixed mode is not supported for a VEB. Since our driver supports multiple
VSIs per PF that need to talk to each other make sure to enable Loopback
for the PF and FDIR VSI as well.

Also, we now have to explicitly enable Loopback mode otherwise we fail
VSI creation for VMDq and VF VSIs.

Change-ID: Ib68c3ea4aeb730ac9468f930610de456efbe5b20
Signed-off-by: Anjali Singhai Jain <anjali.singhai@intel.com>
Tested-by: Jim Young <jamesx.m.young@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40e/i40e_main.c
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h

index 2f4be2500660c611c20f0e3b2b29c528d74adb38..9aa2491ba7adc6890abec8ffa0d867b86ba7f575 100644 (file)
@@ -7797,6 +7797,10 @@ static int i40e_add_vsi(struct i40e_vsi *vsi)
                ctxt.uplink_seid = vsi->uplink_seid;
                ctxt.connection_type = 0x1;     /* regular data port */
                ctxt.flags = I40E_AQ_VSI_TYPE_PF;
+               ctxt.info.valid_sections |=
+                               cpu_to_le16(I40E_AQ_VSI_PROP_SWITCH_VALID);
+               ctxt.info.switch_id =
+                               cpu_to_le16(I40E_AQ_VSI_SW_ID_FLAG_ALLOW_LB);
                i40e_vsi_setup_queue_map(vsi, &ctxt, enabled_tc, true);
                break;
 
@@ -8182,7 +8186,15 @@ struct i40e_vsi *i40e_vsi_setup(struct i40e_pf *pf, u8 type,
                else if ((vsi->flags & I40E_VSI_FLAG_VEB_OWNER) == 0)
                        veb = i40e_veb_setup(pf, 0, vsi->uplink_seid, vsi->seid,
                                             vsi->tc_config.enabled_tc);
-
+               if (veb) {
+                       if (vsi->seid != pf->vsi[pf->lan_vsi]->seid) {
+                               dev_info(&vsi->back->pdev->dev,
+                                        "%s: New VSI creation error, uplink seid of LAN VSI expected.\n",
+                                        __func__);
+                               return NULL;
+                       }
+                       i40e_enable_pf_switch_lb(pf);
+               }
                for (i = 0; i < I40E_MAX_VEB && !veb; i++) {
                        if (pf->veb[i] && pf->veb[i]->seid == vsi->uplink_seid)
                                veb = pf->veb[i];
index 668d860275d6ae2ed03312485893b56edddfe8b1..5bae89550657c19e9c5eeae08b13615c9744f158 100644 (file)
@@ -707,7 +707,6 @@ complete_reset:
        wr32(hw, I40E_VFGEN_RSTAT1(vf->vf_id), I40E_VFR_VFACTIVE);
        i40e_flush(hw);
 }
-#ifdef CONFIG_PCI_IOV
 
 /**
  * i40e_enable_pf_switch_lb
@@ -715,7 +714,7 @@ complete_reset:
  *
  * enable switch loop back or die - no point in a return value
  **/
-static void i40e_enable_pf_switch_lb(struct i40e_pf *pf)
+void i40e_enable_pf_switch_lb(struct i40e_pf *pf)
 {
        struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
        struct i40e_vsi_context ctxt;
@@ -742,7 +741,6 @@ static void i40e_enable_pf_switch_lb(struct i40e_pf *pf)
                         __func__, vsi->back->hw.aq.asq_last_status);
        }
 }
-#endif
 
 /**
  * i40e_disable_pf_switch_lb
index 0adc61e1052db9dabdcbea3d8930ec709e1868ef..9452f5247cffb7f03803aee6230b93be6873ccf9 100644 (file)
@@ -126,5 +126,6 @@ int i40e_ndo_set_vf_spoofchk(struct net_device *netdev, int vf_id, bool enable);
 
 void i40e_vc_notify_link_state(struct i40e_pf *pf);
 void i40e_vc_notify_reset(struct i40e_pf *pf);
+void i40e_enable_pf_switch_lb(struct i40e_pf *pf);
 
 #endif /* _I40E_VIRTCHNL_PF_H_ */