On 1/29/2015 2:27 PM, Wu, Jingjing wrote: > Hi, Michael > >> -----Original Message----- >> From: Qiu, Michael >> Sent: Thursday, January 29, 2015 2:06 PM >> To: Wu, Jingjing; dev at dpdk.org >> Subject: Re: [dpdk-dev] [PATCH 2/2] i40e: enable internal switch of pf >> >> On 1/29/2015 12:57 PM, Wu, Jingjing wrote: >>> Hi, Michael >>> >>>> -----Original Message----- >>>> From: Qiu, Michael >>>> Sent: Thursday, January 29, 2015 9:56 AM >>>> To: Wu, Jingjing; dev at dpdk.org >>>> Subject: Re: [dpdk-dev] [PATCH 2/2] i40e: enable internal switch of >>>> pf >>>> >>>> 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 >>> You can look at the following lines. What we called is >> i40e_aq_update_vsi_params. >>> So we need only set the flag we want to update. >> Sorry, I make a mistake, what I mean is: >> >> 1. ret = i40e_aq_get_vsi_params(hw, &ctxt, NULL); >> here will fill the the field ctxt.info of struct i40e_vsi_context ctxt >> right? >> So ctxt.info is get from other place. >> >> 2. Then: >> >> + ctxt.info.valid_sections = >> + rte_cpu_to_le_16(I40E_AQ_VSI_PROP_SWITCH_VALID); >> >> Has been override by assignment a value, so I just confuse whether it has >> some issue. >> >> If I'm wrong, please ignore. >> >> >> Thanks, >> Michael >> > I get your idea now. Some elements in ctxt is meaningless and not set when > getting, and others are meaningful when > updating. The valid_sections is only meaningful when setting. If one flag in > valid_section is set, it means the > hw need to process corresponding section.
OK, as it meaningless, I agree with you. Thanks, Michael >>> Thanks >>> Jingjing >>> >>>>> + 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); >