X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fice%2Fice_dcf_sched.c;h=a231c1e60b2b47f349479792337a9dad5840c7d2;hb=7f89f41860d64a4880197d35a47df05e7d56a6b1;hp=1e16654d9054c26bdbde2327be353084e2dd3792;hpb=931ee54072b143e973d861509c30af8928f30324;p=dpdk.git diff --git a/drivers/net/ice/ice_dcf_sched.c b/drivers/net/ice/ice_dcf_sched.c index 1e16654d90..a231c1e60b 100644 --- a/drivers/net/ice/ice_dcf_sched.c +++ b/drivers/net/ice/ice_dcf_sched.c @@ -32,6 +32,9 @@ const struct rte_tm_ops ice_dcf_tm_ops = { .node_delete = ice_dcf_node_delete, }; +#define ICE_DCF_SCHED_TC_NODE 0xffff +#define ICE_DCF_VFID 0 + void ice_dcf_tm_conf_init(struct rte_eth_dev *dev) { @@ -709,6 +712,32 @@ ice_dcf_replay_vf_bw(struct ice_dcf_hw *hw, uint16_t vf_id) return ICE_SUCCESS; } +int +ice_dcf_clear_bw(struct ice_dcf_hw *hw) +{ + uint16_t vf_id; + uint32_t tc; + int ret, size; + + size = sizeof(struct virtchnl_dcf_bw_cfg_list) + + sizeof(struct virtchnl_dcf_bw_cfg) * + (hw->tm_conf.nb_tc_node - 1); + + for (vf_id = 0; vf_id < hw->num_vfs; vf_id++) { + for (tc = 0; tc < hw->tm_conf.nb_tc_node; tc++) { + hw->qos_bw_cfg[vf_id]->cfg[tc].shaper.peak = 0; + hw->qos_bw_cfg[vf_id]->cfg[tc].shaper.committed = 0; + } + ret = ice_dcf_set_vf_bw(hw, hw->qos_bw_cfg[vf_id], size); + if (ret) { + PMD_DRV_LOG(DEBUG, "VF %u BW clear failed", vf_id); + return ICE_ERR_CFG; + } + } + + return ICE_SUCCESS; +} + static int ice_dcf_hierarchy_commit(struct rte_eth_dev *dev, int clear_on_fail, __rte_unused struct rte_tm_error *error) @@ -725,6 +754,13 @@ static int ice_dcf_hierarchy_commit(struct rte_eth_dev *dev, uint8_t num_elem = 0; int i, ret_val; + /* check if port is stopped */ + if (!adapter->parent.pf.adapter_stopped) { + PMD_DRV_LOG(ERR, "Please stop port first"); + ret_val = ICE_ERR_NOT_READY; + goto err; + } + ret_val = ice_dcf_commit_check(hw); if (ret_val) goto fail_clear; @@ -748,7 +784,6 @@ static int ice_dcf_hierarchy_commit(struct rte_eth_dev *dev, cir_total = 0; /* init tc bw configuration */ -#define ICE_DCF_SCHED_TC_NODE 0xffff tc_bw->vf_id = ICE_DCF_SCHED_TC_NODE; tc_bw->node_type = VIRTCHNL_DCF_TARGET_TC_BW; tc_bw->num_elem = hw->tm_conf.nb_tc_node; @@ -805,7 +840,7 @@ static int ice_dcf_hierarchy_commit(struct rte_eth_dev *dev, goto fail_clear; } /* store the bandwidth information for replay */ - ice_memcpy(hw->qos_bw_cfg[vf_id], vf_bw, sizeof(*vf_bw), + ice_memcpy(hw->qos_bw_cfg[vf_id], vf_bw, size, ICE_NONDMA_TO_NONDMA); ice_memset(vf_bw, 0, size, ICE_NONDMA_MEM); } @@ -825,6 +860,15 @@ static int ice_dcf_hierarchy_commit(struct rte_eth_dev *dev, if (ret_val) goto fail_clear; + /* store TC node bw configuration */ + hw->qos_bw_cfg[ICE_DCF_VFID] = rte_zmalloc("tc_bw_cfg", size, 0); + if (!hw->qos_bw_cfg[ICE_DCF_VFID]) { + ret_val = ICE_ERR_NO_MEMORY; + goto fail_clear; + } + ice_memcpy(hw->qos_bw_cfg[ICE_DCF_VFID], tc_bw, size, + ICE_NONDMA_TO_NONDMA); + hw->tm_conf.committed = true; return ret_val; @@ -834,5 +878,6 @@ fail_clear: ice_dcf_tm_conf_uninit(dev); ice_dcf_tm_conf_init(dev); } +err: return ret_val; }