On 1/29/2015 9:42 AM, Jingjing Wu wrote: > This patch enables PF's internal switch by setting ALLOWLOOPBACK > flag when VEB is created. With this patch, traffic from PF can be > switched on the VEB. > > Signed-off-by: Jingjing Wu <jingjing.wu at intel.com> > --- > lib/librte_pmd_i40e/i40e_ethdev.c | 36 ++++++++++++++++++++++++++++++++++++ > 1 file changed, 36 insertions(+) > > diff --git a/lib/librte_pmd_i40e/i40e_ethdev.c > b/lib/librte_pmd_i40e/i40e_ethdev.c > index fe758c2..94fd36c 100644 > --- a/lib/librte_pmd_i40e/i40e_ethdev.c > +++ b/lib/librte_pmd_i40e/i40e_ethdev.c > @@ -2854,6 +2854,40 @@ i40e_vsi_dump_bw_config(struct i40e_vsi *vsi) > return 0; > } > > +/* > + * i40e_enable_pf_lb > + * @pf: pointer to the pf structure > + * > + * allow loopback on pf > + */ > +static inline void > +i40e_enable_pf_lb(struct i40e_pf *pf) > +{ > + struct i40e_hw *hw = I40E_PF_TO_HW(pf); > + struct i40e_vsi_context ctxt; > + int ret; > + > + memset(&ctxt, 0, sizeof(ctxt)); > + ctxt.seid = pf->main_vsi_seid; > + ctxt.pf_num = hw->pf_id; > + ret = i40e_aq_get_vsi_params(hw, &ctxt, NULL); > + if (ret) { > + PMD_DRV_LOG(ERR, "couldn't get pf vsi config, err %d, aq_err > %d", > + ret, hw->aq.asq_last_status); > + return; > + } > + ctxt.flags = I40E_AQ_VSI_TYPE_PF; > + ctxt.info.valid_sections = > + rte_cpu_to_le_16(I40E_AQ_VSI_PROP_SWITCH_VALID);
Here does it need to be "|=" ? As ctxt.infowill be filled in i40e_aq_get_vsi_params(), I don't know if it has other issue for override this filled by "=". Thanks, Michael > + ctxt.info.switch_id |= > + rte_cpu_to_le_16(I40E_AQ_VSI_SW_ID_FLAG_ALLOW_LB); > + > + ret = i40e_aq_update_vsi_params(hw, &ctxt, NULL); > + if (ret) > + PMD_DRV_LOG(ERR, "update vsi switch failed, aq_err=%d\n", > + hw->aq.asq_last_status); > +} > + > /* Setup a VSI */ > struct i40e_vsi * > i40e_vsi_setup(struct i40e_pf *pf, > @@ -2889,6 +2923,8 @@ i40e_vsi_setup(struct i40e_pf *pf, > PMD_DRV_LOG(ERR, "VEB setup failed"); > return NULL; > } > + /* set ALLOWLOOPBACk on pf, when veb is created */ > + i40e_enable_pf_lb(pf); > } > > vsi = rte_zmalloc("i40e_vsi", sizeof(struct i40e_vsi), 0);