diff options
-rw-r--r-- | drivers/net/ethernet/intel/ice/ice_sched.c | 23 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ice/ice_status.h | 1 |
2 files changed, 24 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_sched.c b/drivers/net/ethernet/intel/ice/ice_sched.c index f355f59d8b64..56049739a250 100644 --- a/drivers/net/ethernet/intel/ice/ice_sched.c +++ b/drivers/net/ethernet/intel/ice/ice_sched.c | |||
@@ -1616,6 +1616,23 @@ ice_sched_rm_agg_vsi_info(struct ice_port_info *pi, u16 vsi_handle) | |||
1616 | } | 1616 | } |
1617 | 1617 | ||
1618 | /** | 1618 | /** |
1619 | * ice_sched_is_leaf_node_present - check for a leaf node in the sub-tree | ||
1620 | * @node: pointer to the sub-tree node | ||
1621 | * | ||
1622 | * This function checks for a leaf node presence in a given sub-tree node. | ||
1623 | */ | ||
1624 | static bool ice_sched_is_leaf_node_present(struct ice_sched_node *node) | ||
1625 | { | ||
1626 | u8 i; | ||
1627 | |||
1628 | for (i = 0; i < node->num_children; i++) | ||
1629 | if (ice_sched_is_leaf_node_present(node->children[i])) | ||
1630 | return true; | ||
1631 | /* check for a leaf node */ | ||
1632 | return (node->info.data.elem_type == ICE_AQC_ELEM_TYPE_LEAF); | ||
1633 | } | ||
1634 | |||
1635 | /** | ||
1619 | * ice_sched_rm_vsi_cfg - remove the VSI and its children nodes | 1636 | * ice_sched_rm_vsi_cfg - remove the VSI and its children nodes |
1620 | * @pi: port information structure | 1637 | * @pi: port information structure |
1621 | * @vsi_handle: software VSI handle | 1638 | * @vsi_handle: software VSI handle |
@@ -1649,6 +1666,12 @@ ice_sched_rm_vsi_cfg(struct ice_port_info *pi, u16 vsi_handle, u8 owner) | |||
1649 | if (!vsi_node) | 1666 | if (!vsi_node) |
1650 | continue; | 1667 | continue; |
1651 | 1668 | ||
1669 | if (ice_sched_is_leaf_node_present(vsi_node)) { | ||
1670 | ice_debug(pi->hw, ICE_DBG_SCHED, | ||
1671 | "VSI has leaf nodes in TC %d\n", i); | ||
1672 | status = ICE_ERR_IN_USE; | ||
1673 | goto exit_sched_rm_vsi_cfg; | ||
1674 | } | ||
1652 | while (j < vsi_node->num_children) { | 1675 | while (j < vsi_node->num_children) { |
1653 | if (vsi_node->children[j]->owner == owner) { | 1676 | if (vsi_node->children[j]->owner == owner) { |
1654 | ice_free_sched_node(pi, vsi_node->children[j]); | 1677 | ice_free_sched_node(pi, vsi_node->children[j]); |
diff --git a/drivers/net/ethernet/intel/ice/ice_status.h b/drivers/net/ethernet/intel/ice/ice_status.h index f49f299ddf2c..683f48824a29 100644 --- a/drivers/net/ethernet/intel/ice/ice_status.h +++ b/drivers/net/ethernet/intel/ice/ice_status.h | |||
@@ -22,6 +22,7 @@ enum ice_status { | |||
22 | ICE_ERR_OUT_OF_RANGE = -13, | 22 | ICE_ERR_OUT_OF_RANGE = -13, |
23 | ICE_ERR_ALREADY_EXISTS = -14, | 23 | ICE_ERR_ALREADY_EXISTS = -14, |
24 | ICE_ERR_DOES_NOT_EXIST = -15, | 24 | ICE_ERR_DOES_NOT_EXIST = -15, |
25 | ICE_ERR_IN_USE = -16, | ||
25 | ICE_ERR_MAX_LIMIT = -17, | 26 | ICE_ERR_MAX_LIMIT = -17, |
26 | ICE_ERR_RESET_ONGOING = -18, | 27 | ICE_ERR_RESET_ONGOING = -18, |
27 | ICE_ERR_BUF_TOO_SHORT = -52, | 28 | ICE_ERR_BUF_TOO_SHORT = -52, |