From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 44F57A0548; Sat, 10 Jul 2021 03:59:31 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id EF29E41753; Sat, 10 Jul 2021 03:59:22 +0200 (CEST) Received: from szxga03-in.huawei.com (szxga03-in.huawei.com [45.249.212.189]) by mails.dpdk.org (Postfix) with ESMTP id DC80F40DDB for ; Sat, 10 Jul 2021 03:59:18 +0200 (CEST) Received: from dggeme756-chm.china.huawei.com (unknown [172.30.72.53]) by szxga03-in.huawei.com (SkyGuard) with ESMTP id 4GMClJ4YHFz76dh for ; Sat, 10 Jul 2021 09:54:52 +0800 (CST) Received: from localhost.localdomain (10.69.192.56) by dggeme756-chm.china.huawei.com (10.3.19.102) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2176.2; Sat, 10 Jul 2021 09:59:16 +0800 From: "Min Hu (Connor)" To: CC: , Date: Sat, 10 Jul 2021 09:58:33 +0800 Message-ID: <1625882314-60656-3-git-send-email-humin29@huawei.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1625882314-60656-1-git-send-email-humin29@huawei.com> References: <1623553508-5478-1-git-send-email-humin29@huawei.com> <1625882314-60656-1-git-send-email-humin29@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.69.192.56] X-ClientProxiedBy: dggems704-chm.china.huawei.com (10.3.19.181) To dggeme756-chm.china.huawei.com (10.3.19.102) X-CFilter-Loop: Reflected Subject: [dpdk-dev] [PATCH v2 2/3] net/hns3: support for VF modify VLAN filter state X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Chengchang Tang Since the HW limitation for VF, the VLAN filter is default enabled, and is not allowed to be closed. Now, the limitation has been removed in Kunpeng930 network engine, so this patch add support for VF to modify the VLAN filter state. A capabilities bit is added to differentiate between different platforms and achieve compatibility. When the VF runs on an incomatible platform or an incompatible kernel-mode driver version is used, the VF behavior is the same as that before. Signed-off-by: Chengchang Tang Signed-off-by: Min Hu (Connor) --- drivers/net/hns3/hns3_cmd.h | 9 ++++++++ drivers/net/hns3/hns3_ethdev.h | 4 ++++ drivers/net/hns3/hns3_ethdev_vf.c | 48 ++++++++++++++++++++++++++++++++++++--- drivers/net/hns3/hns3_mbx.h | 1 + 4 files changed, 59 insertions(+), 3 deletions(-) diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h index 0c9b8fc..88683df 100644 --- a/drivers/net/hns3/hns3_cmd.h +++ b/drivers/net/hns3/hns3_cmd.h @@ -325,6 +325,15 @@ enum HNS3_CAPS_BITS { HNS3_CAPS_TM_B = 17, }; +/* Capabilities of VF dependent on the PF */ +enum HNS3VF_CAPS_BITS { + /* + * The following capability index definitions must be the same as those + * in kernel side PF. + */ + HNS3VF_CAPS_VLAN_FLT_MOD_B = 0, +}; + enum HNS3_API_CAP_BITS { HNS3_API_CAP_FLEX_RSS_TBL_B, }; diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h index a9a199a..729e1c3 100644 --- a/drivers/net/hns3/hns3_ethdev.h +++ b/drivers/net/hns3/hns3_ethdev.h @@ -870,6 +870,7 @@ enum { HNS3_DEV_SUPPORT_OUTER_UDP_CKSUM_B, HNS3_DEV_SUPPORT_RAS_IMP_B, HNS3_DEV_SUPPORT_TM_B, + HNS3_DEV_SUPPORT_VF_VLAN_FLT_MOD_B, }; #define hns3_dev_dcb_supported(hw) \ @@ -909,6 +910,9 @@ enum { #define hns3_dev_tm_supported(hw) \ hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_TM_B) +#define hns3_dev_vf_vlan_flt_supported(hw) \ + hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_VF_VLAN_FLT_MOD_B) + #define HNS3_DEV_PRIVATE_TO_HW(adapter) \ (&((struct hns3_adapter *)adapter)->hw) #define HNS3_DEV_PRIVATE_TO_PF(adapter) \ diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c index dc95e71..8f3be64 100644 --- a/drivers/net/hns3/hns3_ethdev_vf.c +++ b/drivers/net/hns3/hns3_ethdev_vf.c @@ -1408,6 +1408,14 @@ hns3vf_get_queue_depth(struct hns3_hw *hw) return 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); +} + static int hns3vf_get_num_tc(struct hns3_hw *hw) { @@ -1440,7 +1448,7 @@ hns3vf_get_basic_info(struct hns3_hw *hw) hw->hw_tc_map = basic_info->hw_tc_map; hw->num_tc = hns3vf_get_num_tc(hw); hw->pf_vf_if_version = basic_info->pf_vf_if_version; - + hns3vf_update_caps(hw, basic_info->caps); return 0; } @@ -1611,6 +1619,26 @@ hns3vf_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on) } static int +hns3vf_en_vlan_filter(struct hns3_hw *hw, bool enable) +{ + uint8_t msg_data; + int ret; + + if (!hns3_dev_vf_vlan_flt_supported(hw)) + return 0; + + msg_data = enable ? 1 : 0; + ret = hns3_send_mbx_msg(hw, HNS3_MBX_SET_VLAN, + HNS3_MBX_ENABLE_VLAN_FILTER, &msg_data, + sizeof(msg_data), true, NULL, 0); + if (ret) + hns3_err(hw, "%s vlan filter failed, ret = %d.", + enable ? "enable" : "disable", ret); + + return ret; +} + +static int hns3vf_en_hw_strip_rxvtag(struct hns3_hw *hw, bool enable) { uint8_t msg_data; @@ -1641,6 +1669,19 @@ hns3vf_vlan_offload_set(struct rte_eth_dev *dev, int mask) } tmp_mask = (unsigned int)mask; + + if (tmp_mask & ETH_VLAN_FILTER_MASK) { + rte_spinlock_lock(&hw->lock); + /* Enable or disable VLAN filter */ + if (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_VLAN_FILTER) + ret = hns3vf_en_vlan_filter(hw, true); + else + ret = hns3vf_en_vlan_filter(hw, false); + rte_spinlock_unlock(&hw->lock); + if (ret) + return ret; + } + /* Vlan stripping setting */ if (tmp_mask & ETH_VLAN_STRIP_MASK) { rte_spinlock_lock(&hw->lock); @@ -1738,9 +1779,10 @@ hns3vf_dev_configure_vlan(struct rte_eth_dev *dev) } /* Apply vlan offload setting */ - ret = hns3vf_vlan_offload_set(dev, ETH_VLAN_STRIP_MASK); + ret = hns3vf_vlan_offload_set(dev, ETH_VLAN_STRIP_MASK | + ETH_VLAN_FILTER_MASK); if (ret) - hns3_err(hw, "dev config vlan offload failed, ret =%d", ret); + hns3_err(hw, "dev config vlan offload failed, ret = %d.", ret); return ret; } diff --git a/drivers/net/hns3/hns3_mbx.h b/drivers/net/hns3/hns3_mbx.h index f07dbe3..f868e33 100644 --- a/drivers/net/hns3/hns3_mbx.h +++ b/drivers/net/hns3/hns3_mbx.h @@ -71,6 +71,7 @@ enum hns3_mbx_vlan_cfg_subcode { HNS3_MBX_VLAN_TX_OFF_CFG, /* set tx side vlan offload */ HNS3_MBX_VLAN_RX_OFF_CFG, /* set rx side vlan offload */ HNS3_MBX_GET_PORT_BASE_VLAN_STATE = 4, /* get port based vlan state */ + HNS3_MBX_ENABLE_VLAN_FILTER, /* set vlan filter state */ }; enum hns3_mbx_tbl_cfg_subcode { -- 2.7.4