[39/39] net/ice: fix DCF reset

Message ID 20220407105706.18889-40-kevinx.liu@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Qi Zhang
Headers
Series support full function of DCF |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK
ci/iol-intel-Functional success Functional Testing PASS
ci/intel-Testing success Testing PASS
ci/iol-mellanox-Performance success Performance Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/github-robot: build success github build: passed
ci/iol-abi-testing success Testing PASS
ci/iol-aarch64-unit-testing success Testing PASS
ci/iol-aarch64-compile-testing success Testing PASS
ci/iol-x86_64-compile-testing success Testing PASS
ci/iol-x86_64-unit-testing success Testing PASS

Commit Message

Kevin Liu April 7, 2022, 10:57 a.m. UTC
  After the PF triggers the VF reset, before the VF PMD can perform
any operations on the hardware, it must reinitialize the all resources.

This patch adds a flag to indicate whether the VF has been reset by
PF, and update the DCF resetting operations according to this flag.

Fixes: 1a86f4dbdf42 ("net/ice: support DCF device reset")

Signed-off-by: Alvin Zhang <alvinx.zhang@intel.com>
Signed-off-by: Kevin Liu <kevinx.liu@intel.com>
---
 drivers/net/ice/base/ice_common.c |  4 +++-
 drivers/net/ice/ice_dcf.c         |  2 +-
 drivers/net/ice/ice_dcf_ethdev.c  | 17 ++++++++++++++++-
 drivers/net/ice/ice_dcf_parent.c  |  3 +++
 4 files changed, 23 insertions(+), 3 deletions(-)
  

Patch

diff --git a/drivers/net/ice/base/ice_common.c b/drivers/net/ice/base/ice_common.c
index 5d5ce894ff..530e766abf 100644
--- a/drivers/net/ice/base/ice_common.c
+++ b/drivers/net/ice/base/ice_common.c
@@ -779,6 +779,7 @@  enum ice_status ice_init_fltr_mgmt_struct(struct ice_hw *hw)
 	status = ice_init_def_sw_recp(hw, &hw->switch_info->recp_list);
 	if (status) {
 		ice_free(hw, hw->switch_info);
+		hw->switch_info = NULL;
 		return status;
 	}
 	return ICE_SUCCESS;
@@ -848,7 +849,6 @@  ice_cleanup_fltr_mgmt_single(struct ice_hw *hw, struct ice_switch_info *sw)
 	ice_rm_sw_replay_rule_info(hw, sw);
 	ice_free(hw, sw->buildin_recipes);
 	ice_free(hw, sw->recp_list);
-	ice_free(hw, sw);
 }
 
 /**
@@ -858,6 +858,8 @@  ice_cleanup_fltr_mgmt_single(struct ice_hw *hw, struct ice_switch_info *sw)
 void ice_cleanup_fltr_mgmt_struct(struct ice_hw *hw)
 {
 	ice_cleanup_fltr_mgmt_single(hw, hw->switch_info);
+	ice_free(hw, hw->switch_info);
+	hw->switch_info = NULL;
 }
 
 /**
diff --git a/drivers/net/ice/ice_dcf.c b/drivers/net/ice/ice_dcf.c
index 6b210176a0..dfd6d5ff64 100644
--- a/drivers/net/ice/ice_dcf.c
+++ b/drivers/net/ice/ice_dcf.c
@@ -1430,7 +1430,7 @@  ice_dcf_cap_reset(struct rte_eth_dev *eth_dev, struct ice_dcf_hw *hw)
 	int ret;
 
 	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
-	struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = pci_dev->intr_handle;
 
 	ice_dcf_disable_irq0(hw);
 	rte_intr_disable(intr_handle);
diff --git a/drivers/net/ice/ice_dcf_ethdev.c b/drivers/net/ice/ice_dcf_ethdev.c
index b5381cdfc4..e09570cd40 100644
--- a/drivers/net/ice/ice_dcf_ethdev.c
+++ b/drivers/net/ice/ice_dcf_ethdev.c
@@ -1005,6 +1005,15 @@  dcf_add_del_mc_addr_list(struct ice_dcf_hw *hw,
 	uint32_t i;
 	int len, err = 0;
 
+	if (hw->resetting) {
+		if (!add)
+			return 0;
+
+		PMD_DRV_LOG(ERR,
+			    "fail to add multicast MACs for VF resetting");
+		return -EIO;
+	}
+
 	len = sizeof(struct virtchnl_ether_addr_list);
 	len += sizeof(struct virtchnl_ether_addr) * mc_addrs_num;
 
@@ -1643,7 +1652,13 @@  ice_dcf_dev_close(struct rte_eth_dev *dev)
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
 		return 0;
 
-	(void)ice_dcf_dev_stop(dev);
+	if (adapter->parent.pf.adapter_stopped)
+		(void)ice_dcf_dev_stop(dev);
+
+	if (adapter->real_hw.resetting) {
+		ice_dcf_uninit_hw(dev, &adapter->real_hw);
+		ice_dcf_init_hw(dev, &adapter->real_hw);
+	}
 
 	ice_free_queues(dev);
 
diff --git a/drivers/net/ice/ice_dcf_parent.c b/drivers/net/ice/ice_dcf_parent.c
index 2aa69c7368..2a936bd2c1 100644
--- a/drivers/net/ice/ice_dcf_parent.c
+++ b/drivers/net/ice/ice_dcf_parent.c
@@ -243,6 +243,9 @@  ice_dcf_handle_pf_event_msg(struct ice_dcf_hw *dcf_hw,
 	case VIRTCHNL_EVENT_RESET_IMPENDING:
 		PMD_DRV_LOG(DEBUG, "VIRTCHNL_EVENT_RESET_IMPENDING event");
 		dcf_hw->resetting = true;
+		rte_eth_dev_callback_process(dcf_hw->eth_dev,
+					     RTE_ETH_EVENT_INTR_RESET,
+					     NULL);
 		break;
 	case VIRTCHNL_EVENT_LINK_CHANGE:
 		PMD_DRV_LOG(DEBUG, "VIRTCHNL_EVENT_LINK_CHANGE event");