> -----Original Message----- > From: Wang, Haiyue <haiyue.w...@intel.com> > Sent: Monday, May 24, 2021 9:24 AM > To: dev@dpdk.org > Cc: Zhang, Qi Z <qi.z.zh...@intel.com>; Wang, Liang-min <liang- > min.w...@intel.com>; david.march...@redhat.com; Wang, Haiyue > <haiyue.w...@intel.com>; Xing, Beilei <beilei.x...@intel.com> > Subject: [PATCH v7 3/3] net/i40e: enable PCI bus master after reset > > 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.w...@intel.com> > --- > drivers/net/i40e/i40e_ethdev_vf.c | 13 ++++++++++++- > 1 file changed, 12 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/i40e/i40e_ethdev_vf.c > b/drivers/net/i40e/i40e_ethdev_vf.c > index cb898bdb68..385ebedcd3 100644 > --- a/drivers/net/i40e/i40e_ethdev_vf.c > +++ b/drivers/net/i40e/i40e_ethdev_vf.c > @@ -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; > @@ -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; > @@ -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) @@ -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); > -- > 2.31.1 Acked-by: Beilei Xing <beilei.x...@intel.com>