From: Chengwen Feng <fengcheng...@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: sta...@dpdk.org

Signed-off-by: Chengwen Feng <fengcheng...@huawei.com>
Signed-off-by: Dengdui Huang <huangdeng...@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

Reply via email to