aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/ice/ice_sched.c
diff options
context:
space:
mode:
authorAnirudh Venkataramanan <anirudh.venkataramanan@intel.com>2018-09-19 20:23:09 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2018-09-27 11:20:15 -0400
commit56daee6c5add8e1cd0b56a575f0e7ae490ea8e2f (patch)
treed46759941979e872ea926acc12363e609f646633 /drivers/net/ethernet/intel/ice/ice_sched.c
parentf31028bfd7b1e94b8d3ad685e7c71bcd15fa4316 (diff)
ice: Query the Tx scheduler node before adding it
Query the Tx scheduler tree node information from FW before adding it to the driver's software database. This will keep the node information current in driver. 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>
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_sched.c')
-rw-r--r--drivers/net/ethernet/intel/ice/ice_sched.c67
1 files changed, 66 insertions, 1 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_sched.c b/drivers/net/ethernet/intel/ice/ice_sched.c
index 9b7b50554952..9c4f408f222d 100644
--- a/drivers/net/ethernet/intel/ice/ice_sched.c
+++ b/drivers/net/ethernet/intel/ice/ice_sched.c
@@ -85,6 +85,62 @@ ice_sched_find_node_by_teid(struct ice_sched_node *start_node, u32 teid)
85} 85}
86 86
87/** 87/**
88 * ice_aq_query_sched_elems - query scheduler elements
89 * @hw: pointer to the hw struct
90 * @elems_req: number of elements to query
91 * @buf: pointer to buffer
92 * @buf_size: buffer size in bytes
93 * @elems_ret: returns total number of elements returned
94 * @cd: pointer to command details structure or NULL
95 *
96 * Query scheduling elements (0x0404)
97 */
98static enum ice_status
99ice_aq_query_sched_elems(struct ice_hw *hw, u16 elems_req,
100 struct ice_aqc_get_elem *buf, u16 buf_size,
101 u16 *elems_ret, struct ice_sq_cd *cd)
102{
103 struct ice_aqc_get_cfg_elem *cmd;
104 struct ice_aq_desc desc;
105 enum ice_status status;
106
107 cmd = &desc.params.get_update_elem;
108 ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_get_sched_elems);
109 cmd->num_elem_req = cpu_to_le16(elems_req);
110 desc.flags |= cpu_to_le16(ICE_AQ_FLAG_RD);
111 status = ice_aq_send_cmd(hw, &desc, buf, buf_size, cd);
112 if (!status && elems_ret)
113 *elems_ret = le16_to_cpu(cmd->num_elem_resp);
114
115 return status;
116}
117
118/**
119 * ice_sched_query_elem - query element information from hw
120 * @hw: pointer to the hw struct
121 * @node_teid: node teid to be queried
122 * @buf: buffer to element information
123 *
124 * This function queries HW element information
125 */
126static enum ice_status
127ice_sched_query_elem(struct ice_hw *hw, u32 node_teid,
128 struct ice_aqc_get_elem *buf)
129{
130 u16 buf_size, num_elem_ret = 0;
131 enum ice_status status;
132
133 buf_size = sizeof(*buf);
134 memset(buf, 0, buf_size);
135 buf->generic[0].node_teid = cpu_to_le32(node_teid);
136 status = ice_aq_query_sched_elems(hw, 1, buf, buf_size, &num_elem_ret,
137 NULL);
138 if (status || num_elem_ret != 1)
139 ice_debug(hw, ICE_DBG_SCHED, "query element failed\n");
140 return status;
141}
142
143/**
88 * ice_sched_add_node - Insert the Tx scheduler node in SW DB 144 * ice_sched_add_node - Insert the Tx scheduler node in SW DB
89 * @pi: port information structure 145 * @pi: port information structure
90 * @layer: Scheduler layer of the node 146 * @layer: Scheduler layer of the node
@@ -97,7 +153,9 @@ ice_sched_add_node(struct ice_port_info *pi, u8 layer,
97 struct ice_aqc_txsched_elem_data *info) 153 struct ice_aqc_txsched_elem_data *info)
98{ 154{
99 struct ice_sched_node *parent; 155 struct ice_sched_node *parent;
156 struct ice_aqc_get_elem elem;
100 struct ice_sched_node *node; 157 struct ice_sched_node *node;
158 enum ice_status status;
101 struct ice_hw *hw; 159 struct ice_hw *hw;
102 160
103 if (!pi) 161 if (!pi)
@@ -115,6 +173,13 @@ ice_sched_add_node(struct ice_port_info *pi, u8 layer,
115 return ICE_ERR_PARAM; 173 return ICE_ERR_PARAM;
116 } 174 }
117 175
176 /* query the current node information from FW before additing it
177 * to the SW DB
178 */
179 status = ice_sched_query_elem(hw, le32_to_cpu(info->node_teid), &elem);
180 if (status)
181 return status;
182
118 node = devm_kzalloc(ice_hw_to_dev(hw), sizeof(*node), GFP_KERNEL); 183 node = devm_kzalloc(ice_hw_to_dev(hw), sizeof(*node), GFP_KERNEL);
119 if (!node) 184 if (!node)
120 return ICE_ERR_NO_MEMORY; 185 return ICE_ERR_NO_MEMORY;
@@ -133,7 +198,7 @@ ice_sched_add_node(struct ice_port_info *pi, u8 layer,
133 node->parent = parent; 198 node->parent = parent;
134 node->tx_sched_layer = layer; 199 node->tx_sched_layer = layer;
135 parent->children[parent->num_children++] = node; 200 parent->children[parent->num_children++] = node;
136 memcpy(&node->info, info, sizeof(*info)); 201 memcpy(&node->info, &elem.generic[0], sizeof(node->info));
137 return 0; 202 return 0;
138} 203}
139 204