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