mirror of
https://github.com/torvalds/linux.git
synced 2024-12-28 22:02:28 +00:00
net: hns3: Add egress/ingress vlan filter for revision 0x21
In revision 0x21, hw supports both ingress and egress vlan filter. This patch adds support for it. Signed-off-by: Zhongzhu Liu <liuzhongzhu@huawei.com> Signed-off-by: Jian Shen <shenjian15@huawei.com> Signed-off-by: Salil Mehta <salil.mehta@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
1f6db58973
commit
64d114f0a7
@ -5523,7 +5523,7 @@ static int hclge_do_ioctl(struct hnae3_handle *handle, struct ifreq *ifr,
|
||||
}
|
||||
|
||||
static int hclge_set_vlan_filter_ctrl(struct hclge_dev *hdev, u8 vlan_type,
|
||||
bool filter_en)
|
||||
u8 fe_type, bool filter_en)
|
||||
{
|
||||
struct hclge_vlan_filter_ctrl_cmd *req;
|
||||
struct hclge_desc desc;
|
||||
@ -5533,7 +5533,7 @@ static int hclge_set_vlan_filter_ctrl(struct hclge_dev *hdev, u8 vlan_type,
|
||||
|
||||
req = (struct hclge_vlan_filter_ctrl_cmd *)desc.data;
|
||||
req->vlan_type = vlan_type;
|
||||
req->vlan_fe = filter_en;
|
||||
req->vlan_fe = filter_en ? fe_type : 0;
|
||||
|
||||
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
if (ret)
|
||||
@ -5545,13 +5545,30 @@ static int hclge_set_vlan_filter_ctrl(struct hclge_dev *hdev, u8 vlan_type,
|
||||
|
||||
#define HCLGE_FILTER_TYPE_VF 0
|
||||
#define HCLGE_FILTER_TYPE_PORT 1
|
||||
#define HCLGE_FILTER_FE_EGRESS_V1_B BIT(0)
|
||||
#define HCLGE_FILTER_FE_NIC_INGRESS_B BIT(0)
|
||||
#define HCLGE_FILTER_FE_NIC_EGRESS_B BIT(1)
|
||||
#define HCLGE_FILTER_FE_ROCE_INGRESS_B BIT(2)
|
||||
#define HCLGE_FILTER_FE_ROCE_EGRESS_B BIT(3)
|
||||
#define HCLGE_FILTER_FE_EGRESS (HCLGE_FILTER_FE_NIC_EGRESS_B \
|
||||
| HCLGE_FILTER_FE_ROCE_EGRESS_B)
|
||||
#define HCLGE_FILTER_FE_INGRESS (HCLGE_FILTER_FE_NIC_INGRESS_B \
|
||||
| HCLGE_FILTER_FE_ROCE_INGRESS_B)
|
||||
|
||||
static void hclge_enable_vlan_filter(struct hnae3_handle *handle, bool enable)
|
||||
{
|
||||
struct hclge_vport *vport = hclge_get_vport(handle);
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
|
||||
hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_VF, enable);
|
||||
if (hdev->pdev->revision >= 0x21) {
|
||||
hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_VF,
|
||||
HCLGE_FILTER_FE_EGRESS, enable);
|
||||
hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_PORT,
|
||||
HCLGE_FILTER_FE_INGRESS, enable);
|
||||
} else {
|
||||
hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_VF,
|
||||
HCLGE_FILTER_FE_EGRESS_V1_B, enable);
|
||||
}
|
||||
}
|
||||
|
||||
static int hclge_set_vf_vlan_common(struct hclge_dev *hdev, int vfid,
|
||||
@ -5853,13 +5870,23 @@ static int hclge_init_vlan_config(struct hclge_dev *hdev)
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_VF, true);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (hdev->pdev->revision >= 0x21) {
|
||||
ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_VF,
|
||||
HCLGE_FILTER_FE_EGRESS, true);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_PORT, true);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_PORT,
|
||||
HCLGE_FILTER_FE_INGRESS, true);
|
||||
if (ret)
|
||||
return ret;
|
||||
} else {
|
||||
ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_VF,
|
||||
HCLGE_FILTER_FE_EGRESS_V1_B,
|
||||
true);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
hdev->vlan_type_cfg.rx_in_fst_vlan_type = HCLGE_DEF_VLAN_TYPE;
|
||||
hdev->vlan_type_cfg.rx_in_sec_vlan_type = HCLGE_DEF_VLAN_TYPE;
|
||||
|
Loading…
Reference in New Issue
Block a user