X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fice%2Fice_dcf_parent.c;h=04078345eb0c305899e36227230ef86034d7a968;hb=39e4a2577fd05199f53182b7c8509aeed40dc07f;hp=c8e433239bf68a8516235e5cc3452f0215c38d5d;hpb=9383cb1ae117d90b0b936d100a2d6a4715255891;p=dpdk.git diff --git a/drivers/net/ice/ice_dcf_parent.c b/drivers/net/ice/ice_dcf_parent.c index c8e433239b..04078345eb 100644 --- a/drivers/net/ice/ice_dcf_parent.c +++ b/drivers/net/ice/ice_dcf_parent.c @@ -121,6 +121,8 @@ ice_dcf_vsi_update_service_handler(void *param) struct ice_dcf_hw *hw = reset_param->dcf_hw; struct ice_dcf_adapter *adapter; + pthread_detach(pthread_self()); + rte_delay_us(ICE_DCF_VSI_UPDATE_SERVICE_INTERVAL); rte_spinlock_lock(&vsi_update_lock); @@ -141,6 +143,9 @@ ice_dcf_vsi_update_service_handler(void *param) } } + if (hw->tm_conf.committed) + ice_dcf_replay_vf_bw(hw, reset_param->vf_id); + rte_spinlock_unlock(&vsi_update_lock); free(param); @@ -176,6 +181,44 @@ start_vsi_reset_thread(struct ice_dcf_hw *dcf_hw, bool vfr, uint16_t vf_id) } } +static uint32_t +ice_dcf_convert_link_speed(enum virtchnl_link_speed virt_link_speed) +{ + uint32_t speed; + + switch (virt_link_speed) { + case VIRTCHNL_LINK_SPEED_100MB: + speed = 100; + break; + case VIRTCHNL_LINK_SPEED_1GB: + speed = 1000; + break; + case VIRTCHNL_LINK_SPEED_10GB: + speed = 10000; + break; + case VIRTCHNL_LINK_SPEED_40GB: + speed = 40000; + break; + case VIRTCHNL_LINK_SPEED_20GB: + speed = 20000; + break; + case VIRTCHNL_LINK_SPEED_25GB: + speed = 25000; + break; + case VIRTCHNL_LINK_SPEED_2_5GB: + speed = 2500; + break; + case VIRTCHNL_LINK_SPEED_5GB: + speed = 5000; + break; + default: + speed = 0; + break; + } + + return speed; +} + void ice_dcf_handle_pf_event_msg(struct ice_dcf_hw *dcf_hw, uint8_t *msg, uint16_t msglen) @@ -191,9 +234,23 @@ 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"); start_vsi_reset_thread(dcf_hw, false, 0); + dcf_hw->resetting = true; break; case VIRTCHNL_EVENT_LINK_CHANGE: PMD_DRV_LOG(DEBUG, "VIRTCHNL_EVENT_LINK_CHANGE event"); + dcf_hw->link_up = pf_msg->event_data.link_event.link_status; + if (dcf_hw->vf_res->vf_cap_flags & + VIRTCHNL_VF_CAP_ADV_LINK_SPEED) { + dcf_hw->link_speed = + pf_msg->event_data.link_event_adv.link_speed; + } else { + enum virtchnl_link_speed speed; + speed = pf_msg->event_data.link_event.link_speed; + dcf_hw->link_speed = ice_dcf_convert_link_speed(speed); + } + ice_dcf_link_update(dcf_hw->eth_dev, 0); + rte_eth_dev_callback_process(dcf_hw->eth_dev, + RTE_ETH_EVENT_INTR_LSC, NULL); break; case VIRTCHNL_EVENT_PF_DRIVER_CLOSE: PMD_DRV_LOG(DEBUG, "VIRTCHNL_EVENT_PF_DRIVER_CLOSE event"); @@ -211,6 +268,29 @@ ice_dcf_handle_pf_event_msg(struct ice_dcf_hw *dcf_hw, } } +static int +ice_dcf_query_port_ets(struct ice_hw *parent_hw, struct ice_dcf_hw *real_hw) +{ + int ret; + + real_hw->ets_config = (struct ice_aqc_port_ets_elem *) + ice_malloc(real_hw, sizeof(*real_hw->ets_config)); + if (!real_hw->ets_config) + return ICE_ERR_NO_MEMORY; + + ret = ice_aq_query_port_ets(parent_hw->port_info, + real_hw->ets_config, sizeof(*real_hw->ets_config), + NULL); + if (ret) { + PMD_DRV_LOG(ERR, "DCF Query Port ETS failed"); + rte_free(real_hw->ets_config); + real_hw->ets_config = NULL; + return ret; + } + + return ICE_SUCCESS; +} + static int ice_dcf_init_parent_hw(struct ice_hw *hw) { @@ -278,6 +358,7 @@ err_unroll_fltr_mgmt_struct: err_unroll_alloc: ice_free(hw, hw->port_info); hw->port_info = NULL; + hw->switch_info = NULL; return status; } @@ -291,18 +372,20 @@ static void ice_dcf_uninit_parent_hw(struct ice_hw *hw) ice_free(hw, hw->port_info); hw->port_info = NULL; + hw->switch_info = NULL; ice_clear_all_vsi_ctx(hw); } static int -ice_dcf_request_pkg_name(struct ice_hw *hw, char *pkg_name) +ice_dcf_load_pkg(struct ice_adapter *adapter) { struct ice_dcf_adapter *dcf_adapter = - container_of(hw, struct ice_dcf_adapter, parent.hw); + container_of(&adapter->hw, struct ice_dcf_adapter, parent.hw); struct virtchnl_pkg_info pkg_info; struct dcf_virtchnl_cmd vc_cmd; - uint64_t dsn; + bool use_dsn; + uint64_t dsn = 0; vc_cmd.v_op = VIRTCHNL_OP_DCF_GET_PKG_INFO; vc_cmd.req_msglen = 0; @@ -310,90 +393,11 @@ ice_dcf_request_pkg_name(struct ice_hw *hw, char *pkg_name) vc_cmd.rsp_buflen = sizeof(pkg_info); vc_cmd.rsp_msgbuf = (uint8_t *)&pkg_info; - if (ice_dcf_execute_virtchnl_cmd(&dcf_adapter->real_hw, &vc_cmd)) - goto pkg_file_direct; - - rte_memcpy(&dsn, pkg_info.dsn, sizeof(dsn)); - - snprintf(pkg_name, ICE_MAX_PKG_FILENAME_SIZE, - ICE_PKG_FILE_SEARCH_PATH_UPDATES "ice-%016llx.pkg", - (unsigned long long)dsn); - if (!ice_access(pkg_name, 0)) - return 0; - - snprintf(pkg_name, ICE_MAX_PKG_FILENAME_SIZE, - ICE_PKG_FILE_SEARCH_PATH_DEFAULT "ice-%016llx.pkg", - (unsigned long long)dsn); - if (!ice_access(pkg_name, 0)) - return 0; - -pkg_file_direct: - snprintf(pkg_name, - ICE_MAX_PKG_FILENAME_SIZE, "%s", ICE_PKG_FILE_UPDATES); - if (!ice_access(pkg_name, 0)) - return 0; - - snprintf(pkg_name, - ICE_MAX_PKG_FILENAME_SIZE, "%s", ICE_PKG_FILE_DEFAULT); - if (!ice_access(pkg_name, 0)) - return 0; - - return -1; -} - -static int -ice_dcf_load_pkg(struct ice_hw *hw) -{ - char pkg_name[ICE_MAX_PKG_FILENAME_SIZE]; - uint8_t *pkg_buf; - uint32_t buf_len; - struct stat st; - FILE *fp; - int err; - - if (ice_dcf_request_pkg_name(hw, pkg_name)) { - PMD_INIT_LOG(ERR, "Failed to locate the package file"); - return -ENOENT; - } - - PMD_INIT_LOG(DEBUG, "DDP package name: %s", pkg_name); + use_dsn = ice_dcf_execute_virtchnl_cmd(&dcf_adapter->real_hw, &vc_cmd) == 0; + if (use_dsn) + rte_memcpy(&dsn, pkg_info.dsn, sizeof(dsn)); - err = stat(pkg_name, &st); - if (err) { - PMD_INIT_LOG(ERR, "Failed to get file status"); - return err; - } - - buf_len = st.st_size; - pkg_buf = rte_malloc(NULL, buf_len, 0); - if (!pkg_buf) { - PMD_INIT_LOG(ERR, "failed to allocate buffer of size %u for package", - buf_len); - return -1; - } - - fp = fopen(pkg_name, "rb"); - if (!fp) { - PMD_INIT_LOG(ERR, "failed to open file: %s", pkg_name); - err = -1; - goto ret; - } - - err = fread(pkg_buf, buf_len, 1, fp); - fclose(fp); - if (err != 1) { - PMD_INIT_LOG(ERR, "failed to read package data"); - err = -1; - goto ret; - } - - err = ice_copy_and_init_pkg(hw, pkg_buf, buf_len); - if (err) - PMD_INIT_LOG(ERR, "ice_copy_and_init_hw failed: %d", err); - -ret: - rte_free(pkg_buf); - return err; + return ice_load_pkg(adapter, use_dsn, dsn); } int @@ -406,7 +410,6 @@ ice_dcf_init_parent_adapter(struct rte_eth_dev *eth_dev) const struct rte_ether_addr *mac; int err; - parent_adapter->eth_dev = eth_dev; parent_adapter->pf.adapter = parent_adapter; parent_adapter->pf.dev_data = eth_dev->data; /* create a dummy main_vsi */ @@ -434,13 +437,21 @@ ice_dcf_init_parent_adapter(struct rte_eth_dev *eth_dev) return err; } - err = ice_dcf_load_pkg(parent_hw); + if (hw->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_QOS) { + err = ice_dcf_query_port_ets(parent_hw, hw); + if (err) { + PMD_INIT_LOG(ERR, "failed to query port ets with error %d", + err); + goto uninit_hw; + } + } + + err = ice_dcf_load_pkg(parent_adapter); if (err) { PMD_INIT_LOG(ERR, "failed to load package with error %d", err); goto uninit_hw; } - parent_adapter->active_pkg_type = ice_load_pkg_type(parent_hw); parent_adapter->pf.main_vsi->idx = hw->num_vfs; ice_dcf_update_pf_vsi_map(parent_hw, @@ -477,6 +488,8 @@ ice_dcf_uninit_parent_adapter(struct rte_eth_dev *eth_dev) struct ice_hw *parent_hw = &parent_adapter->hw; eth_dev->data->mac_addrs = NULL; + rte_free(parent_adapter->pf.main_vsi); + parent_adapter->pf.main_vsi = NULL; ice_flow_uninit(parent_adapter); ice_dcf_uninit_parent_hw(parent_hw);