From: Qi Zhang Date: Thu, 29 Aug 2019 02:36:00 +0000 (+0800) Subject: net/ice/base: correct argument port info X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=03ac4b8d1151de62c2d2be5d5e6881e4d9649126;p=dpdk.git net/ice/base: correct argument port info correct argument pi(port_info) passed in function ice_sched_get_first_node(), otherwise it will return the incorrect node. functions ice_sched_get_agg_node and ice_sched_cfg_sibl_node_prio: change argument from hw to pi for it to align to correct port. Moved saving tc node bw info from hardware structure(hw) to port info structure(pi). This change allows multiple ports to save and replay the information correctly. Signed-off-by: Tarun Singh Signed-off-by: Paul M Stillwell Jr Signed-off-by: Qi Zhang Acked-by: Xiaolong Ye --- diff --git a/drivers/net/ice/base/ice_common.c b/drivers/net/ice/base/ice_common.c index 0356537a41..b4f0b964db 100644 --- a/drivers/net/ice/base/ice_common.c +++ b/drivers/net/ice/base/ice_common.c @@ -4158,7 +4158,7 @@ static enum ice_status ice_replay_pre_init(struct ice_hw *hw) &sw->recp_list[i].filt_replay_rules); ice_sched_replay_agg_vsi_preinit(hw); - return ice_sched_replay_tc_node_bw(hw); + return ice_sched_replay_tc_node_bw(hw->port_info); } /** diff --git a/drivers/net/ice/base/ice_common.h b/drivers/net/ice/base/ice_common.h index c5170f7059..4ecfa6b9bd 100644 --- a/drivers/net/ice/base/ice_common.h +++ b/drivers/net/ice/base/ice_common.h @@ -184,7 +184,7 @@ enum ice_status ice_replay_vsi(struct ice_hw *hw, u16 vsi_handle); void ice_replay_post(struct ice_hw *hw); void ice_sched_replay_agg_vsi_preinit(struct ice_hw *hw); void ice_sched_replay_agg(struct ice_hw *hw); -enum ice_status ice_sched_replay_tc_node_bw(struct ice_hw *hw); +enum ice_status ice_sched_replay_tc_node_bw(struct ice_port_info *pi); enum ice_status ice_replay_vsi_agg(struct ice_hw *hw, u16 vsi_handle); enum ice_status ice_sched_replay_q_bw(struct ice_port_info *pi, struct ice_q_ctx *q_ctx); diff --git a/drivers/net/ice/base/ice_sched.c b/drivers/net/ice/base/ice_sched.c index 2d80af7319..d16f256c95 100644 --- a/drivers/net/ice/base/ice_sched.c +++ b/drivers/net/ice/base/ice_sched.c @@ -1480,7 +1480,7 @@ ice_sched_get_vsi_node(struct ice_port_info *pi, struct ice_sched_node *tc_node, /** * ice_sched_get_agg_node - Get an aggregator node based on aggregator ID - * @hw: pointer to the HW struct + * @pi: pointer to the port information structure * @tc_node: pointer to the TC node * @agg_id: aggregator ID * @@ -1488,14 +1488,17 @@ ice_sched_get_vsi_node(struct ice_port_info *pi, struct ice_sched_node *tc_node, * a given TC branch */ static struct ice_sched_node * -ice_sched_get_agg_node(struct ice_hw *hw, struct ice_sched_node *tc_node, +ice_sched_get_agg_node(struct ice_port_info *pi, struct ice_sched_node *tc_node, u32 agg_id) { struct ice_sched_node *node; + struct ice_hw *hw = pi->hw; u8 agg_layer; + if (!hw) + return NULL; agg_layer = ice_sched_get_agg_layer(hw); - node = ice_sched_get_first_node(hw->port_info, tc_node, agg_layer); + node = ice_sched_get_first_node(pi, tc_node, agg_layer); /* Check whether it already exists */ while (node) { @@ -2251,7 +2254,7 @@ ice_sched_move_vsi_to_agg(struct ice_port_info *pi, u16 vsi_handle, u32 agg_id, if (!tc_node) return ICE_ERR_CFG; - agg_node = ice_sched_get_agg_node(pi->hw, tc_node, agg_id); + agg_node = ice_sched_get_agg_node(pi, tc_node, agg_id); if (!agg_node) return ICE_ERR_DOES_NOT_EXIST; @@ -2388,7 +2391,7 @@ ice_sched_rm_agg_cfg(struct ice_port_info *pi, u32 agg_id, u8 tc) if (!tc_node) return ICE_ERR_CFG; - agg_node = ice_sched_get_agg_node(hw, tc_node, agg_id); + agg_node = ice_sched_get_agg_node(pi, tc_node, agg_id); if (!agg_node) return ICE_ERR_DOES_NOT_EXIST; @@ -2497,7 +2500,7 @@ ice_sched_add_agg_cfg(struct ice_port_info *pi, u32 agg_id, u8 tc) if (!tc_node) return ICE_ERR_CFG; - agg_node = ice_sched_get_agg_node(hw, tc_node, agg_id); + agg_node = ice_sched_get_agg_node(pi, tc_node, agg_id); /* Does Agg node already exist ? */ if (agg_node) return status; @@ -3445,7 +3448,6 @@ ice_cfg_vsi_q_priority(struct ice_port_info *pi, u16 num_qs, u32 *q_ids, u8 *q_prio) { enum ice_status status = ICE_ERR_PARAM; - struct ice_hw *hw = pi->hw; u16 i; ice_acquire_lock(&pi->sched_lock); @@ -3460,7 +3462,7 @@ ice_cfg_vsi_q_priority(struct ice_port_info *pi, u16 num_qs, u32 *q_ids, break; } /* Configure Priority */ - status = ice_sched_cfg_sibl_node_prio(hw, node, q_prio[i]); + status = ice_sched_cfg_sibl_node_prio(pi, node, q_prio[i]); if (status) break; } @@ -3508,7 +3510,7 @@ ice_cfg_agg_vsi_priority_per_tc(struct ice_port_info *pi, u32 agg_id, if (!tc_node) goto exit_agg_priority_per_tc; - agg_node = ice_sched_get_agg_node(hw, tc_node, agg_id); + agg_node = ice_sched_get_agg_node(pi, tc_node, agg_id); if (!agg_node) goto exit_agg_priority_per_tc; @@ -3542,7 +3544,7 @@ ice_cfg_agg_vsi_priority_per_tc(struct ice_port_info *pi, u32 agg_id, if (ice_sched_find_node_in_subtree(hw, agg_node, vsi_node)) { /* Configure Priority */ - status = ice_sched_cfg_sibl_node_prio(hw, vsi_node, + status = ice_sched_cfg_sibl_node_prio(pi, vsi_node, node_prio[i]); if (status) break; @@ -3654,7 +3656,7 @@ ice_cfg_agg_bw_alloc(struct ice_port_info *pi, u32 agg_id, u8 ena_tcmap, if (!tc_node) continue; - agg_node = ice_sched_get_agg_node(hw, tc_node, agg_id); + agg_node = ice_sched_get_agg_node(pi, tc_node, agg_id); if (!agg_node) continue; @@ -4453,19 +4455,17 @@ static enum ice_status ice_sched_save_tc_node_bw(struct ice_port_info *pi, u8 tc, enum ice_rl_type rl_type, u32 bw) { - struct ice_hw *hw = pi->hw; - if (tc >= ICE_MAX_TRAFFIC_CLASS) return ICE_ERR_PARAM; switch (rl_type) { case ICE_MIN_BW: - ice_set_clear_cir_bw(&hw->tc_node_bw_t_info[tc], bw); + ice_set_clear_cir_bw(&pi->tc_node_bw_t_info[tc], bw); break; case ICE_MAX_BW: - ice_set_clear_eir_bw(&hw->tc_node_bw_t_info[tc], bw); + ice_set_clear_eir_bw(&pi->tc_node_bw_t_info[tc], bw); break; case ICE_SHARED_BW: - ice_set_clear_shared_bw(&hw->tc_node_bw_t_info[tc], bw); + ice_set_clear_shared_bw(&pi->tc_node_bw_t_info[tc], bw); break; default: return ICE_ERR_PARAM; @@ -4552,17 +4552,15 @@ static enum ice_status ice_sched_save_tc_node_bw_alloc(struct ice_port_info *pi, u8 tc, enum ice_rl_type rl_type, u16 bw_alloc) { - struct ice_hw *hw = pi->hw; - if (tc >= ICE_MAX_TRAFFIC_CLASS) return ICE_ERR_PARAM; switch (rl_type) { case ICE_MIN_BW: - ice_set_clear_cir_bw_alloc(&hw->tc_node_bw_t_info[tc], + ice_set_clear_cir_bw_alloc(&pi->tc_node_bw_t_info[tc], bw_alloc); break; case ICE_MAX_BW: - ice_set_clear_eir_bw_alloc(&hw->tc_node_bw_t_info[tc], + ice_set_clear_eir_bw_alloc(&pi->tc_node_bw_t_info[tc], bw_alloc); break; default: @@ -4710,7 +4708,7 @@ ice_sched_get_node_by_id_type(struct ice_port_info *pi, u32 id, tc_node = ice_sched_get_tc_node(pi, tc); if (tc_node) - node = ice_sched_get_agg_node(pi->hw, tc_node, id); + node = ice_sched_get_agg_node(pi, tc_node, id); break; } @@ -4921,7 +4919,7 @@ ice_sched_validate_agg_srl_node(struct ice_port_info *pi, u32 agg_id) if (!tc_node) continue; - agg_node = ice_sched_get_agg_node(pi->hw, tc_node, agg_id); + agg_node = ice_sched_get_agg_node(pi, tc_node, agg_id); if (!agg_node) continue; /* SRL bandwidth layer selection */ @@ -4992,7 +4990,7 @@ ice_sched_set_agg_bw_shared_lmt(struct ice_port_info *pi, u32 agg_id, u32 bw) if (!tc_node) continue; - agg_node = ice_sched_get_agg_node(pi->hw, tc_node, agg_id); + agg_node = ice_sched_get_agg_node(pi, tc_node, agg_id); if (!agg_node) continue; @@ -5017,7 +5015,7 @@ exit_agg_bw_shared_lmt: /** * ice_sched_cfg_sibl_node_prio - configure node sibling priority - * @hw: pointer to the HW struct + * @pi: port information structure * @node: sched node to configure * @priority: sibling priority * @@ -5025,13 +5023,16 @@ exit_agg_bw_shared_lmt: * function needs to be called with scheduler lock held. */ enum ice_status -ice_sched_cfg_sibl_node_prio(struct ice_hw *hw, struct ice_sched_node *node, - u8 priority) +ice_sched_cfg_sibl_node_prio(struct ice_port_info *pi, + struct ice_sched_node *node, u8 priority) { struct ice_aqc_txsched_elem_data buf; struct ice_aqc_txsched_elem *data; + struct ice_hw *hw = pi->hw; enum ice_status status; + if (!hw) + return ICE_ERR_PARAM; buf = node->info; data = &buf.data; data->valid_sections |= ICE_AQC_ELEM_VALID_GENERIC; @@ -5198,7 +5199,7 @@ ice_sched_replay_agg_bw(struct ice_hw *hw, struct ice_sched_agg_info *agg_info) status = ICE_ERR_PARAM; break; } - agg_node = ice_sched_get_agg_node(hw, tc_node, + agg_node = ice_sched_get_agg_node(hw->port_info, tc_node, agg_info->agg_id); if (!agg_node) { status = ICE_ERR_PARAM; @@ -5310,26 +5311,27 @@ void ice_sched_replay_agg_vsi_preinit(struct ice_hw *hw) /** * ice_sched_replay_tc_node_bw - replay TC node(s) BW - * @hw: pointer to the HW struct + * @pi: port information structure * - * This function replay TC nodes. The caller needs to hold the scheduler lock. + * This function replay TC nodes. */ enum ice_status -ice_sched_replay_tc_node_bw(struct ice_hw *hw) +ice_sched_replay_tc_node_bw(struct ice_port_info *pi) { - struct ice_port_info *pi = hw->port_info; enum ice_status status = ICE_SUCCESS; u8 tc; + if (!pi->hw) + return ICE_ERR_PARAM; ice_acquire_lock(&pi->sched_lock); ice_for_each_traffic_class(tc) { struct ice_sched_node *tc_node; - tc_node = ice_sched_get_tc_node(hw->port_info, tc); + tc_node = ice_sched_get_tc_node(pi, tc); if (!tc_node) continue; /* TC not present */ - status = ice_sched_replay_node_bw(hw, tc_node, - &hw->tc_node_bw_t_info[tc]); + status = ice_sched_replay_node_bw(pi->hw, tc_node, + &pi->tc_node_bw_t_info[tc]); if (status) break; } diff --git a/drivers/net/ice/base/ice_sched.h b/drivers/net/ice/base/ice_sched.h index 38f8f93d20..932ae075f6 100644 --- a/drivers/net/ice/base/ice_sched.h +++ b/drivers/net/ice/base/ice_sched.h @@ -183,6 +183,6 @@ ice_sched_set_vsi_bw_shared_lmt(struct ice_port_info *pi, u16 vsi_handle, enum ice_status ice_sched_set_agg_bw_shared_lmt(struct ice_port_info *pi, u32 agg_id, u32 bw); enum ice_status -ice_sched_cfg_sibl_node_prio(struct ice_hw *hw, struct ice_sched_node *node, - u8 priority); +ice_sched_cfg_sibl_node_prio(struct ice_port_info *pi, + struct ice_sched_node *node, u8 priority); #endif /* _ICE_SCHED_H_ */ diff --git a/drivers/net/ice/base/ice_type.h b/drivers/net/ice/base/ice_type.h index 88846e0422..d8cb8eecda 100644 --- a/drivers/net/ice/base/ice_type.h +++ b/drivers/net/ice/base/ice_type.h @@ -674,6 +674,7 @@ struct ice_port_info { sib_head[ICE_MAX_TRAFFIC_CLASS][ICE_AQC_TOPO_MAX_LEVEL_NUM]; /* List contain profile ID(s) and other params per layer */ struct LIST_HEAD_TYPE rl_prof_list[ICE_AQC_TOPO_MAX_LEVEL_NUM]; + struct ice_bw_type_info tc_node_bw_t_info[ICE_MAX_TRAFFIC_CLASS]; struct ice_dcbx_cfg local_dcbx_cfg; /* Oper/Local Cfg */ /* DCBX info */ struct ice_dcbx_cfg remote_dcbx_cfg; /* Peer Cfg */ @@ -742,7 +743,6 @@ struct ice_hw { u8 sw_entry_point_layer; u16 max_children[ICE_AQC_TOPO_MAX_LEVEL_NUM]; struct LIST_HEAD_TYPE agg_list; /* lists all aggregator */ - struct ice_bw_type_info tc_node_bw_t_info[ICE_MAX_TRAFFIC_CLASS]; struct ice_vsi_ctx *vsi_ctx[ICE_MAX_VSI]; u8 evb_veb; /* true for VEB, false for VEPA */ u8 reset_ongoing; /* true if HW is in reset, false otherwise */