net/i40e: fix VF initialization error

In igb_uio, FLR is issued during open device file. i40evf is trying
to initialize admin queue when driver probe, while the FLR is not
done by host driver. That will cause initialization fail.

This patch is adding the checking if VF reset is done before
adimin queue initialization.

Fixes: b58eedfc7d ("igb_uio: issue FLR during open and release of device file")
Cc: stable@dpdk.org

Signed-off-by: Jingjing Wu <jingjing.wu@intel.com>
This commit is contained in:
Jingjing Wu 2017-10-10 06:08:30 +08:00 committed by Ferruh Yigit
parent 8fa9c312e1
commit 8cacf78469

View File

@ -1111,10 +1111,30 @@ i40evf_enable_irq0(struct i40e_hw *hw)
}
static int
i40evf_reset_vf(struct i40e_hw *hw)
i40evf_check_vf_reset_done(struct i40e_hw *hw)
{
int i, reset;
for (i = 0; i < MAX_RESET_WAIT_CNT; i++) {
reset = I40E_READ_REG(hw, I40E_VFGEN_RSTAT) &
I40E_VFGEN_RSTAT_VFR_STATE_MASK;
reset = reset >> I40E_VFGEN_RSTAT_VFR_STATE_SHIFT;
if (reset == VIRTCHNL_VFR_VFACTIVE ||
reset == VIRTCHNL_VFR_COMPLETED)
break;
rte_delay_ms(50);
}
if (i >= MAX_RESET_WAIT_CNT)
return -1;
return 0;
}
static int
i40evf_reset_vf(struct i40e_hw *hw)
{
int ret;
if (i40e_vf_reset(hw) != I40E_SUCCESS) {
PMD_INIT_LOG(ERR, "Reset VF NIC failed");
return -1;
@ -1130,19 +1150,10 @@ i40evf_reset_vf(struct i40e_hw *hw)
*/
rte_delay_ms(200);
for (i = 0; i < MAX_RESET_WAIT_CNT; i++) {
reset = rd32(hw, I40E_VFGEN_RSTAT) &
I40E_VFGEN_RSTAT_VFR_STATE_MASK;
reset = reset >> I40E_VFGEN_RSTAT_VFR_STATE_SHIFT;
if (VIRTCHNL_VFR_COMPLETED == reset || VIRTCHNL_VFR_VFACTIVE == reset)
break;
else
rte_delay_ms(50);
}
if (i >= MAX_RESET_WAIT_CNT) {
PMD_INIT_LOG(ERR, "Reset VF NIC failed");
return -1;
ret = i40evf_check_vf_reset_done(hw);
if (ret) {
PMD_INIT_LOG(ERR, "VF is still resetting");
return ret;
}
return 0;
@ -1165,6 +1176,10 @@ i40evf_init_vf(struct rte_eth_dev *dev)
goto err;
}
err = i40evf_check_vf_reset_done(hw);
if (err)
goto err;
i40e_init_adminq_parameter(hw);
err = i40e_init_adminq(hw);
if (err) {
@ -1189,6 +1204,7 @@ i40evf_init_vf(struct rte_eth_dev *dev)
PMD_INIT_LOG(ERR, "init_adminq failed");
goto err;
}
vf->aq_resp = rte_zmalloc("vf_aq_resp", I40E_AQ_BUF_SZ, 0);
if (!vf->aq_resp) {
PMD_INIT_LOG(ERR, "unable to allocate vf_aq_resp memory");