[PATCH v3 1/6] net/hns3: fix VF fail to config queue TC
Dengdui Huang
huangdengdui at huawei.com
Tue Jul 1 11:09:59 CEST 2025
From: Chengwen Feng <fengchengwen at huawei.com>
The VF cannot configure the mapping of queue to TC by directly writing
the register. Instead, the mapping must be modified by using firmware
command.
Fixes: bba636698316 ("net/hns3: support Rx/Tx and related operations")
Cc: stable at dpdk.org
Signed-off-by: Chengwen Feng <fengchengwen at huawei.com>
Signed-off-by: Dengdui Huang <huangdengdui at huawei.com>
---
drivers/net/hns3/hns3_cmd.h | 8 ++++++++
drivers/net/hns3/hns3_rxtx.c | 26 +++++++++++++++++++++-----
2 files changed, 29 insertions(+), 5 deletions(-)
diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h
index 4d707c13b2..e21a2b652f 100644
--- a/drivers/net/hns3/hns3_cmd.h
+++ b/drivers/net/hns3/hns3_cmd.h
@@ -178,6 +178,7 @@ enum hns3_opcode_type {
/* TQP commands */
HNS3_OPC_QUERY_TX_STATUS = 0x0B03,
+ HNS3_OPC_TQP_TX_QUEUE_TC = 0x0B04,
HNS3_OPC_QUERY_RX_STATUS = 0x0B13,
HNS3_OPC_CFG_COM_TQP_QUEUE = 0x0B20,
HNS3_OPC_RESET_TQP_QUEUE = 0x0B22,
@@ -970,6 +971,13 @@ struct hns3_reset_tqp_queue_cmd {
uint8_t rsv[19];
};
+struct hns3vf_tx_ring_tc_cmd {
+ uint16_t tqp_id;
+ uint16_t rsv1;
+ uint8_t tc_id;
+ uint8_t rsv2[19];
+};
+
#define HNS3_CFG_RESET_MAC_B 3
#define HNS3_CFG_RESET_FUNC_B 7
#define HNS3_CFG_RESET_RCB_B 1
diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c
index f9fde3948a..785e06db9c 100644
--- a/drivers/net/hns3/hns3_rxtx.c
+++ b/drivers/net/hns3/hns3_rxtx.c
@@ -1180,12 +1180,14 @@ hns3_init_txq(struct hns3_tx_queue *txq)
hns3_init_tx_queue_hw(txq);
}
-static void
+static int
hns3_init_tx_ring_tc(struct hns3_adapter *hns)
{
+ struct hns3_cmd_desc desc;
+ struct hns3vf_tx_ring_tc_cmd *req = (struct hns3vf_tx_ring_tc_cmd *)desc.data;
struct hns3_hw *hw = &hns->hw;
struct hns3_tx_queue *txq;
- int i, num;
+ int i, num, ret;
for (i = 0; i < HNS3_MAX_TC_NUM; i++) {
struct hns3_tc_queue_info *tc_queue = &hw->tc_queue[i];
@@ -1200,9 +1202,24 @@ hns3_init_tx_ring_tc(struct hns3_adapter *hns)
if (txq == NULL)
continue;
- hns3_write_dev(txq, HNS3_RING_TX_TC_REG, tc_queue->tc);
+ if (!hns->is_vf) {
+ hns3_write_dev(txq, HNS3_RING_TX_TC_REG, tc_queue->tc);
+ continue;
+ }
+
+ hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_TQP_TX_QUEUE_TC, false);
+ req->tqp_id = rte_cpu_to_le_16(num);
+ req->tc_id = tc_queue->tc;
+ ret = hns3_cmd_send(hw, &desc, 1);
+ if (ret != 0) {
+ hns3_err(hw, "config Tx queue (%u)'s TC failed! ret = %d.",
+ num, ret);
+ return ret;
+ }
}
}
+
+ return 0;
}
static int
@@ -1278,9 +1295,8 @@ hns3_init_tx_queues(struct hns3_adapter *hns)
txq = (struct hns3_tx_queue *)hw->fkq_data.tx_queues[i];
hns3_init_txq(txq);
}
- hns3_init_tx_ring_tc(hns);
- return 0;
+ return hns3_init_tx_ring_tc(hns);
}
/*
--
2.33.0
More information about the dev
mailing list