Lines Matching refs:vsi
19 static struct irdma_ws_node *irdma_alloc_node(struct irdma_sc_vsi *vsi, in irdma_alloc_node() argument
34 node_index = irdma_alloc_ws_node_id(vsi->dev); in irdma_alloc_node()
43 node->vsi_index = vsi->vsi_idx; in irdma_alloc_node()
47 node->traffic_class = vsi->qos[user_pri].traffic_class; in irdma_alloc_node()
49 node->rel_bw = vsi->qos[user_pri].rel_bw; in irdma_alloc_node()
53 node->lan_qs_handle = vsi->qos[user_pri].lan_qos_handle; in irdma_alloc_node()
71 static void irdma_free_node(struct irdma_sc_vsi *vsi, in irdma_free_node() argument
77 irdma_free_ws_node_id(vsi->dev, node->index); in irdma_free_node()
91 irdma_ws_cqp_cmd(struct irdma_sc_vsi *vsi, struct irdma_ws_node *node, u8 cmd) in irdma_ws_cqp_cmd() argument
96 node_info.vsi = node->vsi_index; in irdma_ws_cqp_cmd()
107 if (irdma_cqp_ws_node_cmd(vsi->dev, cmd, &node_info)) { in irdma_ws_cqp_cmd()
108 ibdev_dbg(to_ibdev(vsi->dev), "WS: CQP WS CMD failed\n"); in irdma_ws_cqp_cmd()
114 vsi->qos[node->user_pri].qs_handle = node_info.qs_handle; in irdma_ws_cqp_cmd()
157 static bool irdma_tc_in_use(struct irdma_sc_vsi *vsi, u8 user_pri) in irdma_tc_in_use() argument
161 mutex_lock(&vsi->qos[user_pri].qos_mutex); in irdma_tc_in_use()
162 if (!list_empty(&vsi->qos[user_pri].qplist)) { in irdma_tc_in_use()
163 mutex_unlock(&vsi->qos[user_pri].qos_mutex); in irdma_tc_in_use()
171 if (vsi->qos[i].traffic_class == vsi->qos[user_pri].traffic_class && in irdma_tc_in_use()
172 !list_empty(&vsi->qos[i].qplist)) { in irdma_tc_in_use()
173 mutex_unlock(&vsi->qos[user_pri].qos_mutex); in irdma_tc_in_use()
177 mutex_unlock(&vsi->qos[user_pri].qos_mutex); in irdma_tc_in_use()
187 static void irdma_remove_leaf(struct irdma_sc_vsi *vsi, u8 user_pri) in irdma_remove_leaf() argument
193 traffic_class = vsi->qos[user_pri].traffic_class; in irdma_remove_leaf()
195 if (vsi->qos[i].traffic_class == traffic_class) in irdma_remove_leaf()
196 vsi->qos[i].valid = false; in irdma_remove_leaf()
198 ws_tree_root = vsi->dev->ws_tree_root; in irdma_remove_leaf()
202 vsi_node = ws_find_node(ws_tree_root, vsi->vsi_idx, in irdma_remove_leaf()
208 vsi->qos[user_pri].traffic_class, in irdma_remove_leaf()
213 irdma_ws_cqp_cmd(vsi, tc_node, IRDMA_OP_WS_DELETE_NODE); in irdma_remove_leaf()
214 vsi->unregister_qset(vsi, tc_node); in irdma_remove_leaf()
216 irdma_free_node(vsi, tc_node); in irdma_remove_leaf()
219 irdma_ws_cqp_cmd(vsi, vsi_node, IRDMA_OP_WS_DELETE_NODE); in irdma_remove_leaf()
221 irdma_free_node(vsi, vsi_node); in irdma_remove_leaf()
224 irdma_ws_cqp_cmd(vsi, ws_tree_root, in irdma_remove_leaf()
226 irdma_free_node(vsi, ws_tree_root); in irdma_remove_leaf()
227 vsi->dev->ws_tree_root = NULL; in irdma_remove_leaf()
237 enum irdma_status_code irdma_ws_add(struct irdma_sc_vsi *vsi, u8 user_pri) in irdma_ws_add() argument
246 mutex_lock(&vsi->dev->ws_mutex); in irdma_ws_add()
247 if (vsi->tc_change_pending) { in irdma_ws_add()
252 if (vsi->qos[user_pri].valid) in irdma_ws_add()
255 ws_tree_root = vsi->dev->ws_tree_root; in irdma_ws_add()
257 ibdev_dbg(to_ibdev(vsi->dev), "WS: Creating root node\n"); in irdma_ws_add()
258 ws_tree_root = irdma_alloc_node(vsi, user_pri, in irdma_ws_add()
265 ret = irdma_ws_cqp_cmd(vsi, ws_tree_root, IRDMA_OP_WS_ADD_NODE); in irdma_ws_add()
267 irdma_free_node(vsi, ws_tree_root); in irdma_ws_add()
271 vsi->dev->ws_tree_root = ws_tree_root; in irdma_ws_add()
275 vsi_node = ws_find_node(ws_tree_root, vsi->vsi_idx, in irdma_ws_add()
280 ibdev_dbg(to_ibdev(vsi->dev), in irdma_ws_add()
282 vsi->vsi_idx); in irdma_ws_add()
283 vsi_node = irdma_alloc_node(vsi, user_pri, WS_NODE_TYPE_PARENT, in irdma_ws_add()
290 ret = irdma_ws_cqp_cmd(vsi, vsi_node, IRDMA_OP_WS_ADD_NODE); in irdma_ws_add()
292 irdma_free_node(vsi, vsi_node); in irdma_ws_add()
299 ibdev_dbg(to_ibdev(vsi->dev), in irdma_ws_add()
301 vsi_node->index, vsi->vsi_idx); in irdma_ws_add()
302 traffic_class = vsi->qos[user_pri].traffic_class; in irdma_ws_add()
307 ibdev_dbg(to_ibdev(vsi->dev), in irdma_ws_add()
309 vsi->vsi_idx, traffic_class); in irdma_ws_add()
310 tc_node = irdma_alloc_node(vsi, user_pri, WS_NODE_TYPE_LEAF, in irdma_ws_add()
317 ret = irdma_ws_cqp_cmd(vsi, tc_node, IRDMA_OP_WS_ADD_NODE); in irdma_ws_add()
319 irdma_free_node(vsi, tc_node); in irdma_ws_add()
327 ret = vsi->register_qset(vsi, tc_node); in irdma_ws_add()
332 ret = irdma_ws_cqp_cmd(vsi, tc_node, IRDMA_OP_WS_MODIFY_NODE); in irdma_ws_add()
334 vsi->unregister_qset(vsi, tc_node); in irdma_ws_add()
338 ibdev_dbg(to_ibdev(vsi->dev), in irdma_ws_add()
340 tc_node->index, vsi->vsi_idx, traffic_class); in irdma_ws_add()
346 if (vsi->qos[i].traffic_class == traffic_class) { in irdma_ws_add()
347 vsi->qos[i].qs_handle = tc_node->qs_handle; in irdma_ws_add()
348 vsi->qos[i].lan_qos_handle = tc_node->lan_qs_handle; in irdma_ws_add()
349 vsi->qos[i].l2_sched_node_id = tc_node->l2_sched_node_id; in irdma_ws_add()
350 vsi->qos[i].valid = true; in irdma_ws_add()
356 irdma_ws_cqp_cmd(vsi, tc_node, IRDMA_OP_WS_DELETE_NODE); in irdma_ws_add()
358 irdma_free_node(vsi, tc_node); in irdma_ws_add()
361 if (irdma_ws_cqp_cmd(vsi, vsi_node, IRDMA_OP_WS_DELETE_NODE)) in irdma_ws_add()
364 irdma_free_node(vsi, vsi_node); in irdma_ws_add()
370 irdma_ws_cqp_cmd(vsi, ws_tree_root, IRDMA_OP_WS_DELETE_NODE); in irdma_ws_add()
371 vsi->dev->ws_tree_root = NULL; in irdma_ws_add()
372 irdma_free_node(vsi, ws_tree_root); in irdma_ws_add()
376 mutex_unlock(&vsi->dev->ws_mutex); in irdma_ws_add()
385 void irdma_ws_remove(struct irdma_sc_vsi *vsi, u8 user_pri) in irdma_ws_remove() argument
387 mutex_lock(&vsi->dev->ws_mutex); in irdma_ws_remove()
388 if (irdma_tc_in_use(vsi, user_pri)) in irdma_ws_remove()
390 irdma_remove_leaf(vsi, user_pri); in irdma_ws_remove()
392 mutex_unlock(&vsi->dev->ws_mutex); in irdma_ws_remove()
399 void irdma_ws_reset(struct irdma_sc_vsi *vsi) in irdma_ws_reset() argument
403 mutex_lock(&vsi->dev->ws_mutex); in irdma_ws_reset()
405 irdma_remove_leaf(vsi, i); in irdma_ws_reset()
406 mutex_unlock(&vsi->dev->ws_mutex); in irdma_ws_reset()