Skip to content

Commit

Permalink
net/i40e: enable PCI bus master after reset
Browse files Browse the repository at this point in the history
The VF reset can be triggered by the PF reset event, then the PCI bus
master will be cleared, the VF will be not allowed to issue any Memory
or I/O Requests.

So after the reset event is detected, always enable the PCI bus master.
And if failed, the device or system may be in an invalid state, so keep
the VF reset state to mark it as I/O error.

Signed-off-by: Haiyue Wang <haiyue.wang@intel.com>
Acked-by: Beilei Xing <beilei.xing@intel.com>
  • Loading branch information
haiyuewa authored and david-marchand committed Jun 4, 2021
1 parent 0c6b1bf commit 469d5c0
Showing 1 changed file with 12 additions and 1 deletion.
13 changes: 12 additions & 1 deletion drivers/net/i40e/i40e_ethdev_vf.c
Original file line number Diff line number Diff line change
Expand Up @@ -1213,7 +1213,6 @@ i40evf_check_vf_reset_done(struct rte_eth_dev *dev)
if (i >= MAX_RESET_WAIT_CNT)
return -1;

vf->vf_reset = false;
vf->pend_msg &= ~PFMSG_RESET_IMPENDING;

return 0;
Expand Down Expand Up @@ -1392,6 +1391,7 @@ i40evf_handle_pf_event(struct rte_eth_dev *dev, uint8_t *msg,
switch (pf_msg->event) {
case VIRTCHNL_EVENT_RESET_IMPENDING:
PMD_DRV_LOG(DEBUG, "VIRTCHNL_EVENT_RESET_IMPENDING event");
vf->vf_reset = true;
rte_eth_dev_callback_process(dev,
RTE_ETH_EVENT_INTR_RESET, NULL);
break;
Expand Down Expand Up @@ -2468,6 +2468,7 @@ i40evf_dev_close(struct rte_eth_dev *dev)
{
struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
int ret;

if (rte_eal_process_type() != RTE_PROC_PRIMARY)
Expand All @@ -2490,6 +2491,16 @@ i40evf_dev_close(struct rte_eth_dev *dev)
i40e_shutdown_adminq(hw);
i40evf_disable_irq0(hw);

/*
* If the VF is reset via VFLR, the device will be knocked out of bus
* master mode, and the driver will fail to recover from the reset. Fix
* this by enabling bus mastering after every reset. In a non-VFLR case,
* the bus master bit will not be disabled, and this call will have no
* effect.
*/
if (vf->vf_reset && !rte_pci_set_bus_master(pci_dev, true))
vf->vf_reset = false;

rte_free(vf->vf_res);
vf->vf_res = NULL;
rte_free(vf->aq_resp);
Expand Down

0 comments on commit 469d5c0

Please sign in to comment.