forked from Minki/linux
net: hns3: fix VF VLAN table entries inconsistent issue
Currently, if VF is loaded on the host side, the host doesn't
clear the VF's VLAN table entries when VF removing. In this
case, when doing reset and disabling sriov at the same time the
VLAN device over VF will be removed, but the VLAN table entries
in hardware are remained.
This patch fixes it by asking PF to clear the VLAN table entries for
VF when VF is removing. It also clears the VLAN table full bit
after VF VLAN table entries being cleared.
Fixes: c6075b1934
("net: hns3: Record VF vlan tables")
Signed-off-by: Jian Shen <shenjian15@huawei.com>
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5eb01ddfcf
commit
23b4201dea
@ -46,6 +46,7 @@ enum HCLGE_MBX_OPCODE {
|
|||||||
HCLGE_MBX_PUSH_VLAN_INFO, /* (PF -> VF) push port base vlan */
|
HCLGE_MBX_PUSH_VLAN_INFO, /* (PF -> VF) push port base vlan */
|
||||||
HCLGE_MBX_GET_MEDIA_TYPE, /* (VF -> PF) get media type */
|
HCLGE_MBX_GET_MEDIA_TYPE, /* (VF -> PF) get media type */
|
||||||
HCLGE_MBX_PUSH_PROMISC_INFO, /* (PF -> VF) push vf promisc info */
|
HCLGE_MBX_PUSH_PROMISC_INFO, /* (PF -> VF) push vf promisc info */
|
||||||
|
HCLGE_MBX_VF_UNINIT, /* (VF -> PF) vf is unintializing */
|
||||||
|
|
||||||
HCLGE_MBX_GET_VF_FLR_STATUS = 200, /* (M7 -> PF) get vf flr status */
|
HCLGE_MBX_GET_VF_FLR_STATUS = 200, /* (M7 -> PF) get vf flr status */
|
||||||
HCLGE_MBX_PUSH_LINK_STATUS, /* (M7 -> PF) get port link status */
|
HCLGE_MBX_PUSH_LINK_STATUS, /* (M7 -> PF) get port link status */
|
||||||
|
@ -8272,6 +8272,7 @@ void hclge_rm_vport_all_vlan_table(struct hclge_vport *vport, bool is_del_list)
|
|||||||
kfree(vlan);
|
kfree(vlan);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
clear_bit(vport->vport_id, hdev->vf_vlan_full);
|
||||||
}
|
}
|
||||||
|
|
||||||
void hclge_uninit_vport_vlan_table(struct hclge_dev *hdev)
|
void hclge_uninit_vport_vlan_table(struct hclge_dev *hdev)
|
||||||
|
@ -799,6 +799,7 @@ void hclge_mbx_handler(struct hclge_dev *hdev)
|
|||||||
hclge_get_link_mode(vport, req);
|
hclge_get_link_mode(vport, req);
|
||||||
break;
|
break;
|
||||||
case HCLGE_MBX_GET_VF_FLR_STATUS:
|
case HCLGE_MBX_GET_VF_FLR_STATUS:
|
||||||
|
case HCLGE_MBX_VF_UNINIT:
|
||||||
hclge_rm_vport_all_mac_table(vport, true,
|
hclge_rm_vport_all_mac_table(vport, true,
|
||||||
HCLGE_MAC_ADDR_UC);
|
HCLGE_MAC_ADDR_UC);
|
||||||
hclge_rm_vport_all_mac_table(vport, true,
|
hclge_rm_vport_all_mac_table(vport, true,
|
||||||
|
@ -2803,6 +2803,9 @@ static void hclgevf_uninit_hdev(struct hclgevf_dev *hdev)
|
|||||||
{
|
{
|
||||||
hclgevf_state_uninit(hdev);
|
hclgevf_state_uninit(hdev);
|
||||||
|
|
||||||
|
hclgevf_send_mbx_msg(hdev, HCLGE_MBX_VF_UNINIT, 0, NULL, 0,
|
||||||
|
false, NULL, 0);
|
||||||
|
|
||||||
if (test_bit(HCLGEVF_STATE_IRQ_INITED, &hdev->state)) {
|
if (test_bit(HCLGEVF_STATE_IRQ_INITED, &hdev->state)) {
|
||||||
hclgevf_misc_irq_uninit(hdev);
|
hclgevf_misc_irq_uninit(hdev);
|
||||||
hclgevf_uninit_msi(hdev);
|
hclgevf_uninit_msi(hdev);
|
||||||
|
Loading…
Reference in New Issue
Block a user