From: Chengwen Feng <fengcheng...@huawei.com>

The VF multi-TCs feature depends on firmware and PF driver, the
capability was set when:
1) Firmware report VF multi-TCs flag.
2) PF driver report VF multi-TCs flag.
3) PF driver support query multi-TCs info mailbox message.

Signed-off-by: Chengwen Feng <fengcheng...@huawei.com>
Signed-off-by: Dengdui Huang <huangdeng...@huawei.com>
---
 drivers/net/hns3/hns3_cmd.c       |  5 ++++-
 drivers/net/hns3/hns3_cmd.h       |  2 ++
 drivers/net/hns3/hns3_dump.c      |  3 ++-
 drivers/net/hns3/hns3_ethdev.h    |  1 +
 drivers/net/hns3/hns3_ethdev_vf.c | 33 +++++++++++++++++++++++++++++++
 drivers/net/hns3/hns3_mbx.h       |  7 +++++++
 6 files changed, 49 insertions(+), 2 deletions(-)

diff --git a/drivers/net/hns3/hns3_cmd.c b/drivers/net/hns3/hns3_cmd.c
index 398b75384e..ad4ef9e189 100644
--- a/drivers/net/hns3/hns3_cmd.c
+++ b/drivers/net/hns3/hns3_cmd.c
@@ -482,7 +482,8 @@ static void
 hns3_parse_capability(struct hns3_hw *hw,
                      struct hns3_query_version_cmd *cmd)
 {
-       uint32_t caps = rte_le_to_cpu_32(cmd->caps[0]);
+       uint64_t caps = ((uint64_t)rte_le_to_cpu_32(cmd->caps[1]) << 32) |
+                       rte_le_to_cpu_32(cmd->caps[0]);
 
        if (hns3_get_bit(caps, HNS3_CAPS_FD_QUEUE_REGION_B))
                hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_FD_QUEUE_REGION_B,
@@ -524,6 +525,8 @@ hns3_parse_capability(struct hns3_hw *hw,
                hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_FC_AUTO_B, 1);
        if (hns3_get_bit(caps, HNS3_CAPS_GRO_B))
                hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_GRO_B, 1);
+       if (hns3_get_bit(caps, HNS3_CAPS_VF_MULTI_TCS_B))
+               hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_VF_MULTI_TCS_B, 
1);
 }
 
 static uint32_t
diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h
index e21a2b652f..2a2ec155ea 100644
--- a/drivers/net/hns3/hns3_cmd.h
+++ b/drivers/net/hns3/hns3_cmd.h
@@ -326,6 +326,7 @@ enum HNS3_CAPS_BITS {
        HNS3_CAPS_TM_B = 19,
        HNS3_CAPS_GRO_B = 20,
        HNS3_CAPS_FC_AUTO_B = 30,
+       HNS3_CAPS_VF_MULTI_TCS_B = 34,
 };
 
 /* Capabilities of VF dependent on the PF */
@@ -335,6 +336,7 @@ enum HNS3VF_CAPS_BITS {
         * in kernel side PF.
         */
        HNS3VF_CAPS_VLAN_FLT_MOD_B = 0,
+       HNS3VF_CAPS_MULTI_TCS_B = 1,
 };
 
 enum HNS3_API_CAP_BITS {
diff --git a/drivers/net/hns3/hns3_dump.c b/drivers/net/hns3/hns3_dump.c
index 63c6b4ef2c..678279e2ac 100644
--- a/drivers/net/hns3/hns3_dump.c
+++ b/drivers/net/hns3/hns3_dump.c
@@ -105,7 +105,8 @@ hns3_get_dev_feature_capability(FILE *file, struct hns3_hw 
*hw)
                {HNS3_DEV_SUPPORT_TM_B, "TM"},
                {HNS3_DEV_SUPPORT_VF_VLAN_FLT_MOD_B, "VF VLAN FILTER MOD"},
                {HNS3_DEV_SUPPORT_FC_AUTO_B, "FC AUTO"},
-               {HNS3_DEV_SUPPORT_GRO_B, "GRO"}
+               {HNS3_DEV_SUPPORT_GRO_B, "GRO"},
+               {HNS3_DEV_SUPPORT_VF_MULTI_TCS_B, "VF MULTI TCS"},
        };
        uint32_t i;
 
diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h
index d7a55c134f..d602bfa02f 100644
--- a/drivers/net/hns3/hns3_ethdev.h
+++ b/drivers/net/hns3/hns3_ethdev.h
@@ -916,6 +916,7 @@ enum hns3_dev_cap {
        HNS3_DEV_SUPPORT_VF_VLAN_FLT_MOD_B,
        HNS3_DEV_SUPPORT_FC_AUTO_B,
        HNS3_DEV_SUPPORT_GRO_B,
+       HNS3_DEV_SUPPORT_VF_MULTI_TCS_B,
 };
 
 #define hns3_dev_get_support(hw, _name) \
diff --git a/drivers/net/hns3/hns3_ethdev_vf.c 
b/drivers/net/hns3/hns3_ethdev_vf.c
index 632409c5d0..41d8252540 100644
--- a/drivers/net/hns3/hns3_ethdev_vf.c
+++ b/drivers/net/hns3/hns3_ethdev_vf.c
@@ -815,12 +815,45 @@ hns3vf_get_queue_info(struct hns3_hw *hw)
        return hns3vf_check_tqp_info(hw);
 }
 
+static void
+hns3vf_update_multi_tcs_cap(struct hns3_hw *hw, uint32_t pf_multi_tcs_bit)
+{
+       uint8_t resp_msg[HNS3_MBX_MAX_RESP_DATA_SIZE];
+       struct hns3_vf_to_pf_msg req;
+       int ret;
+
+       if (!hns3_dev_get_support(hw, VF_MULTI_TCS))
+               return;
+
+       if (pf_multi_tcs_bit == 0) {
+               /*
+                * Early PF driver versions may don't report
+                * HNS3VF_CAPS_MULTI_TCS_B when VF query basic info, so clear
+                * the corresponding capability bit.
+                */
+               hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_VF_MULTI_TCS_B, 
0);
+               return;
+       }
+
+       /*
+        * Early PF driver versions may also report HNS3VF_CAPS_MULTI_TCS_B
+        * when VF query basic info, but they don't support query TC info
+        * mailbox message, so clear the corresponding capability bit.
+        */
+       hns3vf_mbx_setup(&req, HNS3_MBX_GET_TC, HNS3_MBX_GET_PRIO_MAP);
+       ret = hns3vf_mbx_send(hw, &req, true, resp_msg, sizeof(resp_msg));
+       if (ret)
+               hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_VF_MULTI_TCS_B, 
0);
+}
+
 static void
 hns3vf_update_caps(struct hns3_hw *hw, uint32_t caps)
 {
        if (hns3_get_bit(caps, HNS3VF_CAPS_VLAN_FLT_MOD_B))
                hns3_set_bit(hw->capability,
                                HNS3_DEV_SUPPORT_VF_VLAN_FLT_MOD_B, 1);
+
+       hns3vf_update_multi_tcs_cap(hw, hns3_get_bit(caps, 
HNS3VF_CAPS_MULTI_TCS_B));
 }
 
 static int
diff --git a/drivers/net/hns3/hns3_mbx.h b/drivers/net/hns3/hns3_mbx.h
index 651c6b9023..eec3dd2c7e 100644
--- a/drivers/net/hns3/hns3_mbx.h
+++ b/drivers/net/hns3/hns3_mbx.h
@@ -48,6 +48,9 @@ enum HNS3_MBX_OPCODE {
 
        HNS3_MBX_HANDLE_VF_TBL = 38,    /* (VF -> PF) store/clear hw cfg tbl */
        HNS3_MBX_GET_RING_VECTOR_MAP,   /* (VF -> PF) get ring-to-vector map */
+
+       HNS3_MBX_GET_TC = 47,           /* (VF -> PF) get tc info of PF 
configured */
+
        HNS3_MBX_PUSH_LINK_STATUS = 201, /* (IMP -> PF) get port link status */
 };
 
@@ -59,6 +62,10 @@ struct hns3_basic_info {
        uint32_t caps;
 };
 
+enum hns3_mbx_get_tc_subcode {
+       HNS3_MBX_GET_PRIO_MAP = 0, /* query priority to tc map */
+};
+
 /* below are per-VF mac-vlan subcodes */
 enum hns3_mbx_mac_vlan_subcode {
        HNS3_MBX_MAC_VLAN_UC_MODIFY = 0,        /* modify UC mac addr */
-- 
2.33.0

Reply via email to