X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fice%2Fice_dcf.c;h=c9c01a14e34956947004389cd3ae9ec9c01c37e2;hb=1bb4a528c41f4af4847bd3d58cc2b2b9f1ec9a27;hp=e3fb591373d91780878f844633bcf91f71f552ad;hpb=a7db3afce75346832059d8bfe54a8f81945fb213;p=dpdk.git diff --git a/drivers/net/ice/ice_dcf.c b/drivers/net/ice/ice_dcf.c index e3fb591373..c9c01a14e3 100644 --- a/drivers/net/ice/ice_dcf.c +++ b/drivers/net/ice/ice_dcf.c @@ -337,6 +337,9 @@ ice_dcf_mode_disable(struct ice_dcf_hw *hw) { int err; + if (hw->resetting) + return 0; + err = ice_dcf_send_cmd_req_no_irq(hw, VIRTCHNL_OP_DCF_DISABLE, NULL, 0); if (err) { @@ -531,15 +534,26 @@ int ice_dcf_handle_vsi_update_event(struct ice_dcf_hw *hw) { struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(hw->eth_dev); - int err = 0; + int i = 0; + int err = -1; rte_spinlock_lock(&hw->vc_cmd_send_lock); rte_intr_disable(&pci_dev->intr_handle); ice_dcf_disable_irq0(hw); - if (ice_dcf_get_vf_resource(hw) || ice_dcf_get_vf_vsi_map(hw) < 0) - err = -1; + for (;;) { + if (ice_dcf_get_vf_resource(hw) == 0 && + ice_dcf_get_vf_vsi_map(hw) >= 0) { + err = 0; + break; + } + + if (++i >= ICE_DCF_ARQ_MAX_RETRIES) + break; + + rte_delay_ms(ICE_DCF_ARQ_CHECK_TIME); + } rte_intr_enable(&pci_dev->intr_handle); ice_dcf_enable_irq0(hw); @@ -721,11 +735,25 @@ ice_dcf_uninit_hw(struct rte_eth_dev *eth_dev, struct ice_dcf_hw *hw) iavf_shutdown_adminq(&hw->avf); rte_free(hw->arq_buf); + hw->arq_buf = NULL; + rte_free(hw->vf_vsi_map); + hw->vf_vsi_map = NULL; + rte_free(hw->vf_res); + hw->vf_res = NULL; + rte_free(hw->rss_lut); + hw->rss_lut = NULL; + rte_free(hw->rss_key); + hw->rss_key = NULL; + rte_free(hw->qos_bw_cfg); + hw->qos_bw_cfg = NULL; + + rte_free(hw->ets_config); + hw->ets_config = NULL; } static int @@ -1009,6 +1037,9 @@ ice_dcf_disable_queues(struct ice_dcf_hw *hw) struct dcf_virtchnl_cmd args; int err; + if (hw->resetting) + return 0; + memset(&queue_select, 0, sizeof(queue_select)); queue_select.vsi_id = hw->vsi_res->vsi_id; @@ -1063,6 +1094,14 @@ ice_dcf_add_del_all_mac_addr(struct ice_dcf_hw *hw, bool add) struct dcf_virtchnl_cmd args; int len, err = 0; + if (hw->resetting) { + if (!add) + return 0; + + PMD_DRV_LOG(ERR, "fail to add all MACs for VF resetting"); + return -EIO; + } + len = sizeof(struct virtchnl_ether_addr_list); addr = hw->eth_dev->data->mac_addrs; len += sizeof(struct virtchnl_ether_addr);