Commit 9be1d6f8 authored by Anirudh Venkataramanan's avatar Anirudh Venkataramanan Committed by Jeff Kirsher

ice: Move aggregator list into ice_hw instance

The aggregator list needs to be preserved for use after a reset. This
patch moves it out of the port_info instance and into the ice_hw instance.
Signed-off-by: default avatarTarun Singh <tarun.k.singh@intel.com>
Signed-off-by: default avatarAnirudh Venkataramanan <anirudh.venkataramanan@intel.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 03f7a986
...@@ -750,6 +750,7 @@ enum ice_status ice_init_hw(struct ice_hw *hw) ...@@ -750,6 +750,7 @@ enum ice_status ice_init_hw(struct ice_hw *hw)
status = ICE_ERR_CFG; status = ICE_ERR_CFG;
goto err_unroll_sched; goto err_unroll_sched;
} }
INIT_LIST_HEAD(&hw->agg_list);
status = ice_init_fltr_mgmt_struct(hw); status = ice_init_fltr_mgmt_struct(hw);
if (status) if (status)
...@@ -800,6 +801,7 @@ void ice_deinit_hw(struct ice_hw *hw) ...@@ -800,6 +801,7 @@ void ice_deinit_hw(struct ice_hw *hw)
ice_cleanup_fltr_mgmt_struct(hw); ice_cleanup_fltr_mgmt_struct(hw);
ice_sched_cleanup_all(hw); ice_sched_cleanup_all(hw);
ice_sched_clear_agg(hw);
if (hw->port_info) { if (hw->port_info) {
devm_kfree(ice_hw_to_dev(hw), hw->port_info); devm_kfree(ice_hw_to_dev(hw), hw->port_info);
......
...@@ -561,23 +561,18 @@ ice_sched_suspend_resume_elems(struct ice_hw *hw, u8 num_nodes, u32 *node_teids, ...@@ -561,23 +561,18 @@ ice_sched_suspend_resume_elems(struct ice_hw *hw, u8 num_nodes, u32 *node_teids,
} }
/** /**
* ice_sched_clear_tx_topo - clears the schduler tree nodes * ice_sched_clear_agg - clears the agg related information
* @pi: port information structure * @hw: pointer to the hardware structure
* *
* This function removes all the nodes from HW as well as from SW DB. * This function removes agg list and free up agg related memory
* previously allocated.
*/ */
static void ice_sched_clear_tx_topo(struct ice_port_info *pi) void ice_sched_clear_agg(struct ice_hw *hw)
{ {
struct ice_sched_agg_info *agg_info; struct ice_sched_agg_info *agg_info;
struct ice_sched_agg_info *atmp; struct ice_sched_agg_info *atmp;
struct ice_hw *hw;
if (!pi)
return;
hw = pi->hw; list_for_each_entry_safe(agg_info, atmp, &hw->agg_list, list_entry) {
list_for_each_entry_safe(agg_info, atmp, &pi->agg_list, list_entry) {
struct ice_sched_agg_vsi_info *agg_vsi_info; struct ice_sched_agg_vsi_info *agg_vsi_info;
struct ice_sched_agg_vsi_info *vtmp; struct ice_sched_agg_vsi_info *vtmp;
...@@ -586,8 +581,21 @@ static void ice_sched_clear_tx_topo(struct ice_port_info *pi) ...@@ -586,8 +581,21 @@ static void ice_sched_clear_tx_topo(struct ice_port_info *pi)
list_del(&agg_vsi_info->list_entry); list_del(&agg_vsi_info->list_entry);
devm_kfree(ice_hw_to_dev(hw), agg_vsi_info); devm_kfree(ice_hw_to_dev(hw), agg_vsi_info);
} }
list_del(&agg_info->list_entry);
devm_kfree(ice_hw_to_dev(hw), agg_info);
} }
}
/**
* ice_sched_clear_tx_topo - clears the scheduler tree nodes
* @pi: port information structure
*
* This function removes all the nodes from HW as well as from SW DB.
*/
static void ice_sched_clear_tx_topo(struct ice_port_info *pi)
{
if (!pi)
return;
if (pi->root) { if (pi->root) {
ice_free_sched_node(pi, pi->root); ice_free_sched_node(pi, pi->root);
pi->root = NULL; pi->root = NULL;
...@@ -1005,7 +1013,6 @@ enum ice_status ice_sched_init_port(struct ice_port_info *pi) ...@@ -1005,7 +1013,6 @@ enum ice_status ice_sched_init_port(struct ice_port_info *pi)
/* initialize the port for handling the scheduler tree */ /* initialize the port for handling the scheduler tree */
pi->port_state = ICE_SCHED_PORT_STATE_READY; pi->port_state = ICE_SCHED_PORT_STATE_READY;
mutex_init(&pi->sched_lock); mutex_init(&pi->sched_lock);
INIT_LIST_HEAD(&pi->agg_list);
err_init_port: err_init_port:
if (status && pi->root) { if (status && pi->root) {
...@@ -1588,7 +1595,8 @@ ice_sched_rm_agg_vsi_info(struct ice_port_info *pi, u16 vsi_handle) ...@@ -1588,7 +1595,8 @@ ice_sched_rm_agg_vsi_info(struct ice_port_info *pi, u16 vsi_handle)
struct ice_sched_agg_info *agg_info; struct ice_sched_agg_info *agg_info;
struct ice_sched_agg_info *atmp; struct ice_sched_agg_info *atmp;
list_for_each_entry_safe(agg_info, atmp, &pi->agg_list, list_entry) { list_for_each_entry_safe(agg_info, atmp, &pi->hw->agg_list,
list_entry) {
struct ice_sched_agg_vsi_info *agg_vsi_info; struct ice_sched_agg_vsi_info *agg_vsi_info;
struct ice_sched_agg_vsi_info *vtmp; struct ice_sched_agg_vsi_info *vtmp;
......
...@@ -28,6 +28,8 @@ enum ice_status ice_sched_init_port(struct ice_port_info *pi); ...@@ -28,6 +28,8 @@ enum ice_status ice_sched_init_port(struct ice_port_info *pi);
enum ice_status ice_sched_query_res_alloc(struct ice_hw *hw); enum ice_status ice_sched_query_res_alloc(struct ice_hw *hw);
void ice_sched_clear_port(struct ice_port_info *pi); void ice_sched_clear_port(struct ice_port_info *pi);
void ice_sched_cleanup_all(struct ice_hw *hw); void ice_sched_cleanup_all(struct ice_hw *hw);
void ice_sched_clear_agg(struct ice_hw *hw);
struct ice_sched_node * struct ice_sched_node *
ice_sched_find_node_by_teid(struct ice_sched_node *start_node, u32 teid); ice_sched_find_node_by_teid(struct ice_sched_node *start_node, u32 teid);
enum ice_status enum ice_status
......
...@@ -272,7 +272,6 @@ struct ice_port_info { ...@@ -272,7 +272,6 @@ struct ice_port_info {
struct ice_mac_info mac; struct ice_mac_info mac;
struct ice_phy_info phy; struct ice_phy_info phy;
struct mutex sched_lock; /* protect access to TXSched tree */ struct mutex sched_lock; /* protect access to TXSched tree */
struct list_head agg_list; /* lists all aggregator */
u8 lport; u8 lport;
#define ICE_LPORT_MASK 0xff #define ICE_LPORT_MASK 0xff
u8 is_vf; u8 is_vf;
...@@ -326,6 +325,7 @@ struct ice_hw { ...@@ -326,6 +325,7 @@ struct ice_hw {
u8 max_cgds; u8 max_cgds;
u8 sw_entry_point_layer; u8 sw_entry_point_layer;
u16 max_children[ICE_AQC_TOPO_MAX_LEVEL_NUM]; u16 max_children[ICE_AQC_TOPO_MAX_LEVEL_NUM];
struct list_head agg_list; /* lists all aggregator */
struct ice_vsi_ctx *vsi_ctx[ICE_MAX_VSI]; struct ice_vsi_ctx *vsi_ctx[ICE_MAX_VSI];
u8 evb_veb; /* true for VEB, false for VEPA */ u8 evb_veb; /* true for VEB, false for VEPA */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment