forked from Minki/linux
Merge branch 'hns3-fixes'
Huazhong Tan says: ==================== net: hns3: fixes for -net This series includes several bugfixes for the HNS3 ethernet driver. [patch 1] fixes an "tc qdisc del" failure. [patch 2] fixes SW & HW VLAN table not consistent issue. [patch 3] fixes a RMW issue related to VLAN filter switch. [patch 4] clears port based VLAN when uploading PF. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
e4792ffe97
@ -46,6 +46,7 @@ enum HCLGE_MBX_OPCODE {
|
||||
HCLGE_MBX_PUSH_VLAN_INFO, /* (PF -> VF) push port base vlan */
|
||||
HCLGE_MBX_GET_MEDIA_TYPE, /* (VF -> PF) get media type */
|
||||
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_PUSH_LINK_STATUS, /* (M7 -> PF) get port link status */
|
||||
|
@ -1711,7 +1711,7 @@ static int hns3_setup_tc(struct net_device *netdev, void *type_data)
|
||||
netif_dbg(h, drv, netdev, "setup tc: num_tc=%u\n", tc);
|
||||
|
||||
return (kinfo->dcb_ops && kinfo->dcb_ops->setup_tc) ?
|
||||
kinfo->dcb_ops->setup_tc(h, tc, prio_tc) : -EOPNOTSUPP;
|
||||
kinfo->dcb_ops->setup_tc(h, tc ? tc : 1, prio_tc) : -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static int hns3_nic_setup_tc(struct net_device *dev, enum tc_setup_type type,
|
||||
|
@ -7745,16 +7745,27 @@ static int hclge_set_vlan_filter_ctrl(struct hclge_dev *hdev, u8 vlan_type,
|
||||
struct hclge_desc desc;
|
||||
int ret;
|
||||
|
||||
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_VLAN_FILTER_CTRL, false);
|
||||
|
||||
/* read current vlan filter parameter */
|
||||
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_VLAN_FILTER_CTRL, true);
|
||||
req = (struct hclge_vlan_filter_ctrl_cmd *)desc.data;
|
||||
req->vlan_type = vlan_type;
|
||||
req->vlan_fe = filter_en ? fe_type : 0;
|
||||
req->vf_id = vf_id;
|
||||
|
||||
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
if (ret) {
|
||||
dev_err(&hdev->pdev->dev,
|
||||
"failed to get vlan filter config, ret = %d.\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* modify and write new config parameter */
|
||||
hclge_cmd_reuse_desc(&desc, false);
|
||||
req->vlan_fe = filter_en ?
|
||||
(req->vlan_fe | fe_type) : (req->vlan_fe & ~fe_type);
|
||||
|
||||
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
if (ret)
|
||||
dev_err(&hdev->pdev->dev, "set vlan filter fail, ret =%d.\n",
|
||||
dev_err(&hdev->pdev->dev, "failed to set vlan filter, ret = %d.\n",
|
||||
ret);
|
||||
|
||||
return ret;
|
||||
@ -8272,6 +8283,7 @@ void hclge_rm_vport_all_vlan_table(struct hclge_vport *vport, bool is_del_list)
|
||||
kfree(vlan);
|
||||
}
|
||||
}
|
||||
clear_bit(vport->vport_id, hdev->vf_vlan_full);
|
||||
}
|
||||
|
||||
void hclge_uninit_vport_vlan_table(struct hclge_dev *hdev)
|
||||
@ -8488,6 +8500,28 @@ static int hclge_set_vf_vlan_filter(struct hnae3_handle *handle, int vfid,
|
||||
}
|
||||
}
|
||||
|
||||
static void hclge_clear_vf_vlan(struct hclge_dev *hdev)
|
||||
{
|
||||
struct hclge_vlan_info *vlan_info;
|
||||
struct hclge_vport *vport;
|
||||
int ret;
|
||||
int vf;
|
||||
|
||||
/* clear port base vlan for all vf */
|
||||
for (vf = HCLGE_VF_VPORT_START_NUM; vf < hdev->num_alloc_vport; vf++) {
|
||||
vport = &hdev->vport[vf];
|
||||
vlan_info = &vport->port_base_vlan_cfg.vlan_info;
|
||||
|
||||
ret = hclge_set_vlan_filter_hw(hdev, htons(ETH_P_8021Q),
|
||||
vport->vport_id,
|
||||
vlan_info->vlan_tag, true);
|
||||
if (ret)
|
||||
dev_err(&hdev->pdev->dev,
|
||||
"failed to clear vf vlan for vf%d, ret = %d\n",
|
||||
vf - HCLGE_VF_VPORT_START_NUM, ret);
|
||||
}
|
||||
}
|
||||
|
||||
int hclge_set_vlan_filter(struct hnae3_handle *handle, __be16 proto,
|
||||
u16 vlan_id, bool is_kill)
|
||||
{
|
||||
@ -9897,6 +9931,7 @@ static void hclge_uninit_ae_dev(struct hnae3_ae_dev *ae_dev)
|
||||
struct hclge_mac *mac = &hdev->hw.mac;
|
||||
|
||||
hclge_reset_vf_rate(hdev);
|
||||
hclge_clear_vf_vlan(hdev);
|
||||
hclge_misc_affinity_teardown(hdev);
|
||||
hclge_state_uninit(hdev);
|
||||
|
||||
|
@ -799,6 +799,7 @@ void hclge_mbx_handler(struct hclge_dev *hdev)
|
||||
hclge_get_link_mode(vport, req);
|
||||
break;
|
||||
case HCLGE_MBX_GET_VF_FLR_STATUS:
|
||||
case HCLGE_MBX_VF_UNINIT:
|
||||
hclge_rm_vport_all_mac_table(vport, true,
|
||||
HCLGE_MAC_ADDR_UC);
|
||||
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_send_mbx_msg(hdev, HCLGE_MBX_VF_UNINIT, 0, NULL, 0,
|
||||
false, NULL, 0);
|
||||
|
||||
if (test_bit(HCLGEVF_STATE_IRQ_INITED, &hdev->state)) {
|
||||
hclgevf_misc_irq_uninit(hdev);
|
||||
hclgevf_uninit_msi(hdev);
|
||||
|
Loading…
Reference in New Issue
Block a user