net/ice/base: enable VSI queue context
[dpdk.git] / drivers / net / ice / base / ice_common.c
index 015db11..f5cbd47 100644 (file)
@@ -365,22 +365,22 @@ static void ice_init_flex_flags(struct ice_hw *hw, enum ice_rxdid prof_id)
         */
        case ICE_RXDID_FLEX_NIC:
        case ICE_RXDID_FLEX_NIC_2:
-               ICE_PROG_FLG_ENTRY(hw, prof_id, ICE_RXFLG_PKT_FRG,
-                                  ICE_RXFLG_UDP_GRE, ICE_RXFLG_PKT_DSI,
-                                  ICE_RXFLG_FIN, idx++);
+               ICE_PROG_FLG_ENTRY(hw, prof_id, ICE_FLG_PKT_FRG,
+                                  ICE_FLG_UDP_GRE, ICE_FLG_PKT_DSI,
+                                  ICE_FLG_FIN, idx++);
                /* flex flag 1 is not used for flexi-flag programming, skipping
                 * these four FLG64 bits.
                 */
-               ICE_PROG_FLG_ENTRY(hw, prof_id, ICE_RXFLG_SYN, ICE_RXFLG_RST,
-                                  ICE_RXFLG_PKT_DSI, ICE_RXFLG_PKT_DSI, idx++);
-               ICE_PROG_FLG_ENTRY(hw, prof_id, ICE_RXFLG_PKT_DSI,
-                                  ICE_RXFLG_PKT_DSI, ICE_RXFLG_EVLAN_x8100,
-                                  ICE_RXFLG_EVLAN_x9100, idx++);
-               ICE_PROG_FLG_ENTRY(hw, prof_id, ICE_RXFLG_VLAN_x8100,
-                                  ICE_RXFLG_TNL_VLAN, ICE_RXFLG_TNL_MAC,
-                                  ICE_RXFLG_TNL0, idx++);
-               ICE_PROG_FLG_ENTRY(hw, prof_id, ICE_RXFLG_TNL1, ICE_RXFLG_TNL2,
-                                  ICE_RXFLG_PKT_DSI, ICE_RXFLG_PKT_DSI, idx);
+               ICE_PROG_FLG_ENTRY(hw, prof_id, ICE_FLG_SYN, ICE_FLG_RST,
+                                  ICE_FLG_PKT_DSI, ICE_FLG_PKT_DSI, idx++);
+               ICE_PROG_FLG_ENTRY(hw, prof_id, ICE_FLG_PKT_DSI,
+                                  ICE_FLG_PKT_DSI, ICE_FLG_EVLAN_x8100,
+                                  ICE_FLG_EVLAN_x9100, idx++);
+               ICE_PROG_FLG_ENTRY(hw, prof_id, ICE_FLG_VLAN_x8100,
+                                  ICE_FLG_TNL_VLAN, ICE_FLG_TNL_MAC,
+                                  ICE_FLG_TNL0, idx++);
+               ICE_PROG_FLG_ENTRY(hw, prof_id, ICE_FLG_TNL1, ICE_FLG_TNL2,
+                                  ICE_FLG_PKT_DSI, ICE_FLG_PKT_DSI, idx);
                break;
 
        default:
@@ -399,17 +399,17 @@ static void ice_init_flex_flags(struct ice_hw *hw, enum ice_rxdid prof_id)
  */
 static void ice_init_flex_flds(struct ice_hw *hw, enum ice_rxdid prof_id)
 {
-       enum ice_flex_rx_mdid mdid;
+       enum ice_flex_mdid mdid;
 
        switch (prof_id) {
        case ICE_RXDID_FLEX_NIC:
        case ICE_RXDID_FLEX_NIC_2:
-               ICE_PROG_FLEX_ENTRY(hw, prof_id, ICE_RX_MDID_HASH_LOW, 0);
-               ICE_PROG_FLEX_ENTRY(hw, prof_id, ICE_RX_MDID_HASH_HIGH, 1);
-               ICE_PROG_FLEX_ENTRY(hw, prof_id, ICE_RX_MDID_FLOW_ID_LOWER, 2);
+               ICE_PROG_FLEX_ENTRY(hw, prof_id, ICE_MDID_RX_HASH_LOW, 0);
+               ICE_PROG_FLEX_ENTRY(hw, prof_id, ICE_MDID_RX_HASH_HIGH, 1);
+               ICE_PROG_FLEX_ENTRY(hw, prof_id, ICE_MDID_FLOW_ID_LOWER, 2);
 
                mdid = (prof_id == ICE_RXDID_FLEX_NIC_2) ?
-                       ICE_RX_MDID_SRC_VSI : ICE_RX_MDID_FLOW_ID_HIGH;
+                       ICE_MDID_SRC_VSI : ICE_MDID_FLOW_ID_HIGH;
 
                ICE_PROG_FLEX_ENTRY(hw, prof_id, mdid, 3);
 
@@ -938,6 +938,7 @@ void ice_deinit_hw(struct ice_hw *hw)
 
        ice_sched_cleanup_all(hw);
        ice_sched_clear_agg(hw);
+       ice_free_seg(hw);
 
        if (hw->port_info) {
                ice_free(hw, hw->port_info);
@@ -3510,11 +3511,36 @@ ice_get_ctx(u8 *src_ctx, u8 *dest_ctx, struct ice_ctx_ele *ce_info)
        return ICE_SUCCESS;
 }
 
+/**
+ * ice_get_lan_q_ctx - get the LAN queue context for the given VSI and TC
+ * @hw: pointer to the HW struct
+ * @vsi_handle: software VSI handle
+ * @tc: TC number
+ * @q_handle: software queue handle
+ */
+static struct ice_q_ctx *
+ice_get_lan_q_ctx(struct ice_hw *hw, u16 vsi_handle, u8 tc, u16 q_handle)
+{
+       struct ice_vsi_ctx *vsi;
+       struct ice_q_ctx *q_ctx;
+
+       vsi = ice_get_vsi_ctx(hw, vsi_handle);
+       if (!vsi)
+               return NULL;
+       if (q_handle >= vsi->num_lan_q_entries[tc])
+               return NULL;
+       if (!vsi->lan_q_ctx[tc])
+               return NULL;
+       q_ctx = vsi->lan_q_ctx[tc];
+       return &q_ctx[q_handle];
+}
+
 /**
  * ice_ena_vsi_txq
  * @pi: port information structure
  * @vsi_handle: software VSI handle
  * @tc: TC number
+ * @q_handle: software queue handle
  * @num_qgrps: Number of added queue groups
  * @buf: list of queue groups to be added
  * @buf_size: size of buffer for indirect command
@@ -3523,12 +3549,13 @@ ice_get_ctx(u8 *src_ctx, u8 *dest_ctx, struct ice_ctx_ele *ce_info)
  * This function adds one LAN queue
  */
 enum ice_status
-ice_ena_vsi_txq(struct ice_port_info *pi, u16 vsi_handle, u8 tc, u8 num_qgrps,
-               struct ice_aqc_add_tx_qgrp *buf, u16 buf_size,
+ice_ena_vsi_txq(struct ice_port_info *pi, u16 vsi_handle, u8 tc, u16 q_handle,
+               u8 num_qgrps, struct ice_aqc_add_tx_qgrp *buf, u16 buf_size,
                struct ice_sq_cd *cd)
 {
        struct ice_aqc_txsched_elem_data node = { 0 };
        struct ice_sched_node *parent;
+       struct ice_q_ctx *q_ctx;
        enum ice_status status;
        struct ice_hw *hw;
 
@@ -3545,6 +3572,14 @@ ice_ena_vsi_txq(struct ice_port_info *pi, u16 vsi_handle, u8 tc, u8 num_qgrps,
 
        ice_acquire_lock(&pi->sched_lock);
 
+       q_ctx = ice_get_lan_q_ctx(hw, vsi_handle, tc, q_handle);
+       if (!q_ctx) {
+               ice_debug(hw, ICE_DBG_SCHED, "Enaq: invalid queue handle %d\n",
+                         q_handle);
+               status = ICE_ERR_PARAM;
+               goto ena_txq_exit;
+       }
+
        /* find a parent node */
        parent = ice_sched_get_free_qparent(pi, vsi_handle, tc,
                                            ICE_SCHED_NODE_OWNER_LAN);
@@ -3579,6 +3614,7 @@ ice_ena_vsi_txq(struct ice_port_info *pi, u16 vsi_handle, u8 tc, u8 num_qgrps,
 
        node.node_teid = buf->txqs[0].q_teid;
        node.data.elem_type = ICE_AQC_ELEM_TYPE_LEAF;
+       q_ctx->q_handle = q_handle;
 
        /* add a leaf node into schduler tree queue layer */
        status = ice_sched_add_node(pi, hw->num_tx_sched_layers - 1, &node);
@@ -3591,7 +3627,10 @@ ena_txq_exit:
 /**
  * ice_dis_vsi_txq
  * @pi: port information structure
+ * @vsi_handle: software VSI handle
+ * @tc: TC number
  * @num_queues: number of queues
+ * @q_handles: pointer to software queue handle array
  * @q_ids: pointer to the q_id array
  * @q_teids: pointer to queue node teids
  * @rst_src: if called due to reset, specifies the reset source
@@ -3601,12 +3640,14 @@ ena_txq_exit:
  * This function removes queues and their corresponding nodes in SW DB
  */
 enum ice_status
-ice_dis_vsi_txq(struct ice_port_info *pi, u8 num_queues, u16 *q_ids,
-               u32 *q_teids, enum ice_disq_rst_src rst_src, u16 vmvf_num,
+ice_dis_vsi_txq(struct ice_port_info *pi, u16 vsi_handle, u8 tc, u8 num_queues,
+               u16 *q_handles, u16 *q_ids, u32 *q_teids,
+               enum ice_disq_rst_src rst_src, u16 vmvf_num,
                struct ice_sq_cd *cd)
 {
        enum ice_status status = ICE_ERR_DOES_NOT_EXIST;
        struct ice_aqc_dis_txq_item qg_list;
+       struct ice_q_ctx *q_ctx;
        u16 i;
 
        if (!pi || pi->port_state != ICE_SCHED_PORT_STATE_READY)
@@ -3629,6 +3670,17 @@ ice_dis_vsi_txq(struct ice_port_info *pi, u8 num_queues, u16 *q_ids,
                node = ice_sched_find_node_by_teid(pi->root, q_teids[i]);
                if (!node)
                        continue;
+               q_ctx = ice_get_lan_q_ctx(pi->hw, vsi_handle, tc, q_handles[i]);
+               if (!q_ctx) {
+                       ice_debug(pi->hw, ICE_DBG_SCHED, "invalid queue handle%d\n",
+                                 q_handles[i]);
+                       continue;
+               }
+               if (q_ctx->q_handle != q_handles[i]) {
+                       ice_debug(pi->hw, ICE_DBG_SCHED, "Err:handles %d %d\n",
+                                 q_ctx->q_handle, q_handles[i]);
+                       continue;
+               }
                qg_list.parent_teid = node->info.parent_teid;
                qg_list.num_qs = 1;
                qg_list.q_id[0] = CPU_TO_LE16(q_ids[i]);
@@ -3639,6 +3691,7 @@ ice_dis_vsi_txq(struct ice_port_info *pi, u8 num_queues, u16 *q_ids,
                if (status != ICE_SUCCESS)
                        break;
                ice_free_sched_node(pi, node);
+               q_ctx->q_handle = ICE_INVAL_Q_HANDLE;
        }
        ice_release_lock(&pi->sched_lock);
        return status;