]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
net: hns3: do reinitialization while mqprio configuration changed
authorYunsheng Lin <linyunsheng@huawei.com>
Sat, 26 Jan 2019 16:49:16 +0000 (00:49 +0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 26 Jan 2019 17:33:30 +0000 (09:33 -0800)
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: Yunsheng Lin <linyunsheng@huawei.com>
Signed-off-by: Peng Li <lipeng321@huawei.com>
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c

index 322af28ab4b58b755ab2c9aff01e16626440587b..927a980fc211056384222565c130b2a869e7e32e 100644 (file)
@@ -1482,7 +1482,6 @@ static int hns3_setup_tc(struct net_device *netdev, void *type_data)
        u8 tc = mqprio_qopt->qopt.num_tc;
        u16 mode = mqprio_qopt->mode;
        u8 hw = mqprio_qopt->qopt.hw;
-       bool if_running;
        int ret;
 
        if (!((hw == TC_MQPRIO_HW_OFFLOAD_TCS &&
@@ -1495,24 +1494,12 @@ static int hns3_setup_tc(struct net_device *netdev, void *type_data)
        if (!netdev)
                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) ?
                kinfo->dcb_ops->setup_tc(h, tc, prio_tc) : -EOPNOTSUPP;
        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,
index 90b566e8e454049136f40b377a08987b0b4eb5a8..6c387b21f882622bb705b4cbb03b6c2bc9894ba9 100644 (file)
@@ -370,12 +370,25 @@ static int hclge_setup_tc(struct hnae3_handle *h, u8 tc, u8 *prio_tc)
        if (ret)
                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_prio_tc_info_update(hdev, prio_tc);
 
        ret = hclge_tm_init_hw(hdev, false);
-       if (ret)
+       if (ret) {
+               if (hclge_notify_client(hdev, HNAE3_INIT_CLIENT))
+                       return ret;
+
+               hclge_notify_client(hdev, HNAE3_UP_CLIENT);
                return ret;
+       }
 
        hdev->flag &= ~HCLGE_FLAG_DCB_ENABLE;
 
@@ -384,7 +397,11 @@ static int hclge_setup_tc(struct hnae3_handle *h, u8 tc, u8 *prio_tc)
        else
                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 = {