net/ice/base: enable VSI queue context
The patch added to retrieve the queue context and update the queue handle for lan queues. Signed-off-by: Victor Raj <victor.raj@intel.com> Signed-off-by: Paul M Stillwell Jr <paul.m.stillwell.jr@intel.com> Signed-off-by: Qi Zhang <qi.z.zhang@intel.com> Reviewed-by: Qiming Yang <qiming.yang@intel.com> Reviewed-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
This commit is contained in:
parent
29a0c11489
commit
98afdf10b9
@ -3511,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
|
||||
@ -3524,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;
|
||||
|
||||
@ -3546,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);
|
||||
@ -3580,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);
|
||||
@ -3592,7 +3627,10 @@ ice_ena_vsi_txq(struct ice_port_info *pi, u16 vsi_handle, u8 tc, u8 num_qgrps,
|
||||
/**
|
||||
* 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
|
||||
@ -3602,12 +3640,14 @@ ice_ena_vsi_txq(struct ice_port_info *pi, u16 vsi_handle, u8 tc, u8 num_qgrps,
|
||||
* 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)
|
||||
@ -3630,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]);
|
||||
@ -3640,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;
|
||||
|
@ -157,15 +157,16 @@ ice_aq_set_port_id_led(struct ice_port_info *pi, bool is_orig_mode,
|
||||
enum ice_status
|
||||
ice_get_ctx(u8 *src_ctx, u8 *dest_ctx, struct ice_ctx_ele *ce_info);
|
||||
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,
|
||||
struct ice_sq_cd *cmd_details);
|
||||
ice_dis_vsi_txq(struct ice_port_info *pi, u16 vsi_handle, u8 tc, u8 num_queues,
|
||||
u16 *q_handle, u16 *q_ids, u32 *q_teids,
|
||||
enum ice_disq_rst_src rst_src, u16 vmvf_num,
|
||||
struct ice_sq_cd *cd);
|
||||
enum ice_status
|
||||
ice_cfg_vsi_lan(struct ice_port_info *pi, u16 vsi_handle, u8 tc_bitmap,
|
||||
u16 *max_lanqs);
|
||||
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);
|
||||
enum ice_status ice_replay_vsi(struct ice_hw *hw, u16 vsi_handle);
|
||||
void ice_replay_post(struct ice_hw *hw);
|
||||
|
@ -460,8 +460,9 @@ ice_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id)
|
||||
/* Init the Tx tail register*/
|
||||
ICE_PCI_REG_WRITE(txq->qtx_tail, 0);
|
||||
|
||||
err = ice_ena_vsi_txq(hw->port_info, vsi->idx, 0, 1, &txq_elem,
|
||||
sizeof(txq_elem), NULL);
|
||||
/* Fix me, we assume TC always 0 here */
|
||||
err = ice_ena_vsi_txq(hw->port_info, vsi->idx, 0, tx_queue_id, 1,
|
||||
&txq_elem, sizeof(txq_elem), NULL);
|
||||
if (err) {
|
||||
PMD_DRV_LOG(ERR, "Failed to add lan txq");
|
||||
return -EIO;
|
||||
@ -540,9 +541,12 @@ ice_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id)
|
||||
{
|
||||
struct ice_tx_queue *txq;
|
||||
struct ice_hw *hw = ICE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
|
||||
struct ice_vsi *vsi = pf->main_vsi;
|
||||
enum ice_status status;
|
||||
uint16_t q_ids[1];
|
||||
uint32_t q_teids[1];
|
||||
uint16_t q_handle = tx_queue_id;
|
||||
|
||||
if (tx_queue_id >= dev->data->nb_tx_queues) {
|
||||
PMD_DRV_LOG(ERR, "TX queue %u is out of range %u",
|
||||
@ -560,8 +564,9 @@ ice_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id)
|
||||
q_ids[0] = txq->reg_idx;
|
||||
q_teids[0] = txq->q_teid;
|
||||
|
||||
status = ice_dis_vsi_txq(hw->port_info, 1, q_ids, q_teids,
|
||||
ICE_NO_RESET, 0, NULL);
|
||||
/* Fix me, we assume TC always 0 here */
|
||||
status = ice_dis_vsi_txq(hw->port_info, vsi->idx, 0, 1, &q_handle,
|
||||
q_ids, q_teids, ICE_NO_RESET, 0, NULL);
|
||||
if (status != ICE_SUCCESS) {
|
||||
PMD_DRV_LOG(DEBUG, "Failed to disable Lan Tx queue");
|
||||
return -EINVAL;
|
||||
|
Loading…
Reference in New Issue
Block a user