]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
net: hns3: Add support for IFF_ALLMULTI flag
authorPeng Li <lipeng321@huawei.com>
Fri, 1 Jun 2018 16:52:02 +0000 (17:52 +0100)
committerKhalid Elmously <khalid.elmously@canonical.com>
Wed, 6 Jun 2018 18:41:25 +0000 (14:41 -0400)
BugLink: https://bugs.launchpad.net/bugs/1768670
This patch adds support for IFF_ALLMULTI flag to HNS3 PF and VF
driver.

Signed-off-by: Peng Li <lipeng321@huawei.com>
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3b75c3df599d0068b382ef1f22396dc5d48c5a74 linux-next)
Signed-off-by: dann frazier <dann.frazier@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
drivers/net/ethernet/hisilicon/hns3/hnae3.h
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c

index f250c592a2185e08f01f61cfa874d9934cddc9de..e8244a51ce71b8d3aa11bd2e6fa32edad51ab886 100644 (file)
@@ -316,7 +316,8 @@ struct hnae3_ae_ops {
        int (*set_loopback)(struct hnae3_handle *handle,
                            enum hnae3_loop loop_mode, bool en);
 
-       void (*set_promisc_mode)(struct hnae3_handle *handle, u32 en);
+       void (*set_promisc_mode)(struct hnae3_handle *handle, bool en_uc_pmc,
+                                bool en_mc_pmc);
        int (*set_mtu)(struct hnae3_handle *handle, int new_mtu);
 
        void (*get_pauseparam)(struct hnae3_handle *handle,
index 05290129793fe79b90cc057d564593be39d6af66..0a6876a9b6d4b9ee330a0f4bfe1fd683d79c08ef 100644 (file)
@@ -415,9 +415,11 @@ static void hns3_nic_set_rx_mode(struct net_device *netdev)
 
        if (h->ae_algo->ops->set_promisc_mode) {
                if (netdev->flags & IFF_PROMISC)
-                       h->ae_algo->ops->set_promisc_mode(h, 1);
+                       h->ae_algo->ops->set_promisc_mode(h, true, true);
+               else if (netdev->flags & IFF_ALLMULTI)
+                       h->ae_algo->ops->set_promisc_mode(h, false, true);
                else
-                       h->ae_algo->ops->set_promisc_mode(h, 0);
+                       h->ae_algo->ops->set_promisc_mode(h, false, false);
        }
        if (__dev_uc_sync(netdev, hns3_nic_uc_sync, hns3_nic_uc_unsync))
                netdev_err(netdev, "sync uc address fail\n");
index 8f8cc241365698c2709e499022dc41cf69358c20..40c0425b4023bd98a1ca2d926efc02fe5d378155 100644 (file)
@@ -95,7 +95,7 @@ static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop, bool en)
        if (ret)
                return ret;
 
-       h->ae_algo->ops->set_promisc_mode(h, en);
+       h->ae_algo->ops->set_promisc_mode(h, en, en);
 
        return ret;
 }
index 4ca53189d48d8a65d6592034fb8117115713a9ed..18027bc543c152781ebfff7a7651eb204a17d9d4 100644 (file)
@@ -3580,13 +3580,15 @@ void hclge_promisc_param_init(struct hclge_promisc_param *param, bool en_uc,
        param->vf_id = vport_id;
 }
 
-static void hclge_set_promisc_mode(struct hnae3_handle *handle, u32 en)
+static void hclge_set_promisc_mode(struct hnae3_handle *handle, bool en_uc_pmc,
+                                  bool en_mc_pmc)
 {
        struct hclge_vport *vport = hclge_get_vport(handle);
        struct hclge_dev *hdev = vport->back;
        struct hclge_promisc_param param;
 
-       hclge_promisc_param_init(&param, en, en, true, vport->vport_id);
+       hclge_promisc_param_init(&param, en_uc_pmc, en_mc_pmc, true,
+                                vport->vport_id);
        hclge_cmd_set_promisc_mode(hdev, &param);
 }
 
index 31f3d9a43d8d1977d8db391b9c21500e545d9e9b..d299805c430bd326251e1d1cc53e81b4dddb79b1 100644 (file)
@@ -190,11 +190,12 @@ static int hclge_map_unmap_ring_to_vf_vector(struct hclge_vport *vport, bool en,
 static int hclge_set_vf_promisc_mode(struct hclge_vport *vport,
                                     struct hclge_mbx_vf_to_pf_cmd *req)
 {
-       bool en = req->msg[1] ? true : false;
+       bool en_uc = req->msg[1] ? true : false;
+       bool en_mc = req->msg[2] ? true : false;
        struct hclge_promisc_param param;
 
        /* always enable broadcast promisc bit */
-       hclge_promisc_param_init(&param, en, en, true, vport->vport_id);
+       hclge_promisc_param_init(&param, en_uc, en_mc, true, vport->vport_id);
        return hclge_cmd_set_promisc_mode(vport->back, &param);
 }
 
index 266cdcba506e36680982e48963142add03961487..e28e0db0db5f449d5c0bfda1c5b6ddb6626dd4d1 100644 (file)
@@ -654,7 +654,8 @@ static int hclgevf_put_vector(struct hnae3_handle *handle, int vector)
        return 0;
 }
 
-static int hclgevf_cmd_set_promisc_mode(struct hclgevf_dev *hdev, u32 en)
+static int hclgevf_cmd_set_promisc_mode(struct hclgevf_dev *hdev,
+                                       bool en_uc_pmc, bool en_mc_pmc)
 {
        struct hclge_mbx_vf_to_pf_cmd *req;
        struct hclgevf_desc desc;
@@ -664,7 +665,8 @@ static int hclgevf_cmd_set_promisc_mode(struct hclgevf_dev *hdev, u32 en)
 
        hclgevf_cmd_setup_basic_desc(&desc, HCLGEVF_OPC_MBX_VF_TO_PF, false);
        req->msg[0] = HCLGE_MBX_SET_PROMISC_MODE;
-       req->msg[1] = en;
+       req->msg[1] = en_uc_pmc ? 1 : 0;
+       req->msg[2] = en_mc_pmc ? 1 : 0;
 
        status = hclgevf_cmd_send(&hdev->hw, &desc, 1);
        if (status)
@@ -674,11 +676,12 @@ static int hclgevf_cmd_set_promisc_mode(struct hclgevf_dev *hdev, u32 en)
        return status;
 }
 
-static void hclgevf_set_promisc_mode(struct hnae3_handle *handle, u32 en)
+static void hclgevf_set_promisc_mode(struct hnae3_handle *handle,
+                                    bool en_uc_pmc, bool en_mc_pmc)
 {
        struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
 
-       hclgevf_cmd_set_promisc_mode(hdev, en);
+       hclgevf_cmd_set_promisc_mode(hdev, en_uc_pmc, en_mc_pmc);
 }
 
 static int hclgevf_tqp_enable(struct hclgevf_dev *hdev, int tqp_id,