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:
@@ -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 */
|
||||||
|
@@ -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);
|
netif_dbg(h, drv, netdev, "setup tc: num_tc=%u\n", tc);
|
||||||
|
|
||||||
return (kinfo->dcb_ops && kinfo->dcb_ops->setup_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,
|
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;
|
struct hclge_desc desc;
|
||||||
int ret;
|
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 = (struct hclge_vlan_filter_ctrl_cmd *)desc.data;
|
||||||
req->vlan_type = vlan_type;
|
req->vlan_type = vlan_type;
|
||||||
req->vlan_fe = filter_en ? fe_type : 0;
|
|
||||||
req->vf_id = vf_id;
|
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);
|
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||||
if (ret)
|
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);
|
ret);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -8272,6 +8283,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)
|
||||||
@@ -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,
|
int hclge_set_vlan_filter(struct hnae3_handle *handle, __be16 proto,
|
||||||
u16 vlan_id, bool is_kill)
|
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;
|
struct hclge_mac *mac = &hdev->hw.mac;
|
||||||
|
|
||||||
hclge_reset_vf_rate(hdev);
|
hclge_reset_vf_rate(hdev);
|
||||||
|
hclge_clear_vf_vlan(hdev);
|
||||||
hclge_misc_affinity_teardown(hdev);
|
hclge_misc_affinity_teardown(hdev);
|
||||||
hclge_state_uninit(hdev);
|
hclge_state_uninit(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);
|
||||||
|
Reference in New Issue
Block a user