Commit c2a39d98 authored by Yunsheng Lin's avatar Yunsheng Lin Committed by David S. Miller

net: hns3: do reinitialization while mqprio configuration changed

When user changes the mqprio configuration, enet need to be
uninited and inited besides down'ed and up'ed, because the queue
num may change when the TC num changes.

Also, it is more suitable to do the down/unint/init/up operation
in hclge module using hclge_notify_client, because this config
change may affect PF and its VF.
Signed-off-by: default avatarYunsheng Lin <linyunsheng@huawei.com>
Signed-off-by: default avatarPeng Li <lipeng321@huawei.com>
Signed-off-by: default avatarHuazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 350fda0a
...@@ -1482,7 +1482,6 @@ static int hns3_setup_tc(struct net_device *netdev, void *type_data) ...@@ -1482,7 +1482,6 @@ static int hns3_setup_tc(struct net_device *netdev, void *type_data)
u8 tc = mqprio_qopt->qopt.num_tc; u8 tc = mqprio_qopt->qopt.num_tc;
u16 mode = mqprio_qopt->mode; u16 mode = mqprio_qopt->mode;
u8 hw = mqprio_qopt->qopt.hw; u8 hw = mqprio_qopt->qopt.hw;
bool if_running;
int ret; int ret;
if (!((hw == TC_MQPRIO_HW_OFFLOAD_TCS && if (!((hw == TC_MQPRIO_HW_OFFLOAD_TCS &&
...@@ -1495,24 +1494,12 @@ static int hns3_setup_tc(struct net_device *netdev, void *type_data) ...@@ -1495,24 +1494,12 @@ static int hns3_setup_tc(struct net_device *netdev, void *type_data)
if (!netdev) if (!netdev)
return -EINVAL; return -EINVAL;
if_running = netif_running(netdev);
if (if_running) {
hns3_nic_net_stop(netdev);
msleep(100);
}
ret = (kinfo->dcb_ops && kinfo->dcb_ops->setup_tc) ? ret = (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, prio_tc) : -EOPNOTSUPP;
if (ret) if (ret)
goto out;
ret = hns3_nic_set_real_num_queue(netdev);
out:
if (if_running)
hns3_nic_net_open(netdev);
return ret; return ret;
return hns3_nic_set_real_num_queue(netdev);
} }
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,
......
...@@ -370,13 +370,26 @@ static int hclge_setup_tc(struct hnae3_handle *h, u8 tc, u8 *prio_tc) ...@@ -370,13 +370,26 @@ static int hclge_setup_tc(struct hnae3_handle *h, u8 tc, u8 *prio_tc)
if (ret) if (ret)
return -EINVAL; return -EINVAL;
ret = hclge_notify_client(hdev, HNAE3_DOWN_CLIENT);
if (ret)
return ret;
ret = hclge_notify_client(hdev, HNAE3_UNINIT_CLIENT);
if (ret)
return ret;
hclge_tm_schd_info_update(hdev, tc); hclge_tm_schd_info_update(hdev, tc);
hclge_tm_prio_tc_info_update(hdev, prio_tc); hclge_tm_prio_tc_info_update(hdev, prio_tc);
ret = hclge_tm_init_hw(hdev, false); ret = hclge_tm_init_hw(hdev, false);
if (ret) if (ret) {
if (hclge_notify_client(hdev, HNAE3_INIT_CLIENT))
return ret; return ret;
hclge_notify_client(hdev, HNAE3_UP_CLIENT);
return ret;
}
hdev->flag &= ~HCLGE_FLAG_DCB_ENABLE; hdev->flag &= ~HCLGE_FLAG_DCB_ENABLE;
if (tc > 1) if (tc > 1)
...@@ -384,7 +397,11 @@ static int hclge_setup_tc(struct hnae3_handle *h, u8 tc, u8 *prio_tc) ...@@ -384,7 +397,11 @@ static int hclge_setup_tc(struct hnae3_handle *h, u8 tc, u8 *prio_tc)
else else
hdev->flag &= ~HCLGE_FLAG_MQPRIO_ENABLE; hdev->flag &= ~HCLGE_FLAG_MQPRIO_ENABLE;
return 0; ret = hclge_notify_client(hdev, HNAE3_INIT_CLIENT);
if (ret)
return ret;
return hclge_notify_client(hdev, HNAE3_UP_CLIENT);
} }
static const struct hnae3_dcb_ops hns3_dcb_ops = { static const struct hnae3_dcb_ops hns3_dcb_ops = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment