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, | 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_vlan_filter_ctrl_cmd *req; | ||||||
| 	struct hclge_desc desc; | 	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 = (struct hclge_vlan_filter_ctrl_cmd *)desc.data; | ||||||
| 	req->vlan_type = vlan_type; | 	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); | 	ret = hclge_cmd_send(&hdev->hw, &desc, 1); | ||||||
| 	if (ret) | 	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_VF		0 | ||||||
| #define HCLGE_FILTER_TYPE_PORT		1 | #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) | static void hclge_enable_vlan_filter(struct hnae3_handle *handle, bool enable) | ||||||
| { | { | ||||||
| 	struct hclge_vport *vport = hclge_get_vport(handle); | 	struct hclge_vport *vport = hclge_get_vport(handle); | ||||||
| 	struct hclge_dev *hdev = vport->back; | 	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, | 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 ret; | ||||||
| 	int i; | 	int i; | ||||||
| 
 | 
 | ||||||
| 	ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_VF, true); | 	if (hdev->pdev->revision >= 0x21) { | ||||||
|  | 		ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_VF, | ||||||
|  | 						 HCLGE_FILTER_FE_EGRESS, true); | ||||||
| 		if (ret) | 		if (ret) | ||||||
| 			return ret; | 			return ret; | ||||||
| 
 | 
 | ||||||
| 	ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_PORT, true); | 		ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_PORT, | ||||||
|  | 						 HCLGE_FILTER_FE_INGRESS, true); | ||||||
| 		if (ret) | 		if (ret) | ||||||
| 			return 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_fst_vlan_type = HCLGE_DEF_VLAN_TYPE; | ||||||
| 	hdev->vlan_type_cfg.rx_in_sec_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