]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
ice: Move aggregator list into ice_hw instance
authorAnirudh Venkataramanan <anirudh.venkataramanan@intel.com>
Wed, 19 Dec 2018 18:03:28 +0000 (10:03 -0800)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Tue, 15 Jan 2019 19:21:13 +0000 (11:21 -0800)
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: Tarun Singh <tarun.k.singh@intel.com>
Signed-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ice/ice_common.c
drivers/net/ethernet/intel/ice/ice_sched.c
drivers/net/ethernet/intel/ice/ice_sched.h
drivers/net/ethernet/intel/ice/ice_type.h

index 2bcd8230d35ebc6dbde573ae74ea6031f0558702..19695749f90357af0dfaddbdc250dc40927a93e6 100644 (file)
@@ -750,6 +750,7 @@ enum ice_status ice_init_hw(struct ice_hw *hw)
                status = ICE_ERR_CFG;
                goto err_unroll_sched;
        }
+       INIT_LIST_HEAD(&hw->agg_list);
 
        status = ice_init_fltr_mgmt_struct(hw);
        if (status)
@@ -800,6 +801,7 @@ void ice_deinit_hw(struct ice_hw *hw)
        ice_cleanup_fltr_mgmt_struct(hw);
 
        ice_sched_cleanup_all(hw);
+       ice_sched_clear_agg(hw);
 
        if (hw->port_info) {
                devm_kfree(ice_hw_to_dev(hw), hw->port_info);
index 99d51990bd54b847c41100acc3d8d0991047f7f4..fb38e8be1e2e521213cdc325df834ce0637b3254 100644 (file)
@@ -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
- * @pi: port information structure
+ * ice_sched_clear_agg - clears the agg related information
+ * @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 *atmp;
-       struct ice_hw *hw;
-
-       if (!pi)
-               return;
 
-       hw = pi->hw;
-
-       list_for_each_entry_safe(agg_info, atmp, &pi->agg_list, list_entry) {
+       list_for_each_entry_safe(agg_info, atmp, &hw->agg_list, list_entry) {
                struct ice_sched_agg_vsi_info *agg_vsi_info;
                struct ice_sched_agg_vsi_info *vtmp;
 
@@ -586,8 +581,21 @@ static void ice_sched_clear_tx_topo(struct ice_port_info *pi)
                        list_del(&agg_vsi_info->list_entry);
                        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) {
                ice_free_sched_node(pi, pi->root);
                pi->root = NULL;
@@ -1005,7 +1013,6 @@ enum ice_status ice_sched_init_port(struct ice_port_info *pi)
        /* initialize the port for handling the scheduler tree */
        pi->port_state = ICE_SCHED_PORT_STATE_READY;
        mutex_init(&pi->sched_lock);
-       INIT_LIST_HEAD(&pi->agg_list);
 
 err_init_port:
        if (status && pi->root) {
@@ -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 *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 *vtmp;
 
index da5b4c166da89ee329972c0f0a834e22cb3b2c31..bee8221ad146b43530c8add9320ab062366e3e8a 100644 (file)
@@ -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);
 void ice_sched_clear_port(struct ice_port_info *pi);
 void ice_sched_cleanup_all(struct ice_hw *hw);
+void ice_sched_clear_agg(struct ice_hw *hw);
+
 struct ice_sched_node *
 ice_sched_find_node_by_teid(struct ice_sched_node *start_node, u32 teid);
 enum ice_status
index 0ea42810421571e98f681893e8447d56d8da1cfd..a078e2c9887198a5ad5e185b131af6a3e81aaada 100644 (file)
@@ -272,7 +272,6 @@ struct ice_port_info {
        struct ice_mac_info mac;
        struct ice_phy_info phy;
        struct mutex sched_lock;        /* protect access to TXSched tree */
-       struct list_head agg_list;      /* lists all aggregator */
        u8 lport;
 #define ICE_LPORT_MASK         0xff
        u8 is_vf;
@@ -326,6 +325,7 @@ struct ice_hw {
        u8 max_cgds;
        u8 sw_entry_point_layer;
        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];
        u8 evb_veb;             /* true for VEB, false for VEPA */