net: aquantia: Simplify dependencies between pci modules
authorIgor Russkikh <igor.russkikh@aquantia.com>
Mon, 15 Jan 2018 13:41:18 +0000 (16:41 +0300)
committerDavid S. Miller <davem@davemloft.net>
Tue, 16 Jan 2018 19:40:00 +0000 (14:40 -0500)
Eliminate useless passing of net_device_ops and ethtools_ops through
deep chain of calls.
Move all pci related code into aq_pci_func module.

Signed-off-by: Igor Russkikh <igor.russkikh@aquantia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/aquantia/atlantic/aq_main.c
drivers/net/ethernet/aquantia/atlantic/aq_main.h
drivers/net/ethernet/aquantia/atlantic/aq_nic.c
drivers/net/ethernet/aquantia/atlantic/aq_nic.h
drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c
drivers/net/ethernet/aquantia/atlantic/aq_pci_func.h

index 1b0399c..c2c1eb5 100644 (file)
 
 #include "aq_main.h"
 #include "aq_nic.h"
+#include "aq_nic_internal.h"
 #include "aq_pci_func.h"
 #include "aq_ethtool.h"
-#include "hw_atl/hw_atl_a0.h"
-#include "hw_atl/hw_atl_b0.h"
 
 #include <linux/netdevice.h>
 #include <linux/module.h>
 
-static const struct pci_device_id aq_pci_tbl[] = {
-       { PCI_VDEVICE(AQUANTIA, HW_ATL_DEVICE_ID_0001), },
-       { PCI_VDEVICE(AQUANTIA, HW_ATL_DEVICE_ID_D100), },
-       { PCI_VDEVICE(AQUANTIA, HW_ATL_DEVICE_ID_D107), },
-       { PCI_VDEVICE(AQUANTIA, HW_ATL_DEVICE_ID_D108), },
-       { PCI_VDEVICE(AQUANTIA, HW_ATL_DEVICE_ID_D109), },
-       {}
-};
-
-MODULE_DEVICE_TABLE(pci, aq_pci_tbl);
-
 MODULE_LICENSE("GPL v2");
 MODULE_VERSION(AQ_CFG_DRV_VERSION);
 MODULE_AUTHOR(AQ_CFG_DRV_AUTHOR);
 MODULE_DESCRIPTION(AQ_CFG_DRV_DESC);
 
-static const struct aq_hw_ops *aq_pci_probe_get_hw_ops_by_id(struct pci_dev *pdev)
+static const struct net_device_ops aq_ndev_ops;
+
+struct net_device *aq_ndev_alloc(void)
 {
-       const struct aq_hw_ops *ops = NULL;
+       struct net_device *ndev = NULL;
+       struct aq_nic_s *aq_nic = NULL;
 
-       ops = hw_atl_a0_get_ops_by_id(pdev);
-       if (!ops)
-               ops = hw_atl_b0_get_ops_by_id(pdev);
+       ndev = alloc_etherdev_mq(sizeof(struct aq_nic_s), AQ_CFG_VECS_MAX);
+       if (!ndev)
+               return NULL;
 
-       return ops;
+       aq_nic = netdev_priv(ndev);
+       aq_nic->ndev = ndev;
+       ndev->netdev_ops = &aq_ndev_ops;
+       ndev->ethtool_ops = &aq_ethtool_ops;
+
+       return ndev;
 }
 
 static int aq_ndev_open(struct net_device *ndev)
@@ -170,66 +166,3 @@ static const struct net_device_ops aq_ndev_ops = {
        .ndo_set_mac_address = aq_ndev_set_mac_address,
        .ndo_set_features = aq_ndev_set_features
 };
-
-static int aq_pci_probe(struct pci_dev *pdev,
-                       const struct pci_device_id *pci_id)
-{
-       const struct aq_hw_ops *aq_hw_ops = NULL;
-       struct aq_pci_func_s *aq_pci_func = NULL;
-       int err = 0;
-
-       err = pci_enable_device(pdev);
-       if (err < 0)
-               goto err_exit;
-       aq_hw_ops = aq_pci_probe_get_hw_ops_by_id(pdev);
-       aq_pci_func = aq_pci_func_alloc(aq_hw_ops, pdev,
-                                       &aq_ndev_ops, &aq_ethtool_ops);
-       if (!aq_pci_func) {
-               err = -ENOMEM;
-               goto err_exit;
-       }
-       err = aq_pci_func_init(aq_pci_func);
-       if (err < 0)
-               goto err_exit;
-
-err_exit:
-       if (err < 0) {
-               if (aq_pci_func)
-                       aq_pci_func_free(aq_pci_func);
-       }
-       return err;
-}
-
-static void aq_pci_remove(struct pci_dev *pdev)
-{
-       struct aq_pci_func_s *aq_pci_func = pci_get_drvdata(pdev);
-
-       aq_pci_func_deinit(aq_pci_func);
-       aq_pci_func_free(aq_pci_func);
-}
-
-static int aq_pci_suspend(struct pci_dev *pdev, pm_message_t pm_msg)
-{
-       struct aq_pci_func_s *aq_pci_func = pci_get_drvdata(pdev);
-
-       return aq_pci_func_change_pm_state(aq_pci_func, &pm_msg);
-}
-
-static int aq_pci_resume(struct pci_dev *pdev)
-{
-       struct aq_pci_func_s *aq_pci_func = pci_get_drvdata(pdev);
-       pm_message_t pm_msg = PMSG_RESTORE;
-
-       return aq_pci_func_change_pm_state(aq_pci_func, &pm_msg);
-}
-
-static struct pci_driver aq_pci_ops = {
-       .name = AQ_CFG_DRV_NAME,
-       .id_table = aq_pci_tbl,
-       .probe = aq_pci_probe,
-       .remove = aq_pci_remove,
-       .suspend = aq_pci_suspend,
-       .resume = aq_pci_resume,
-};
-
-module_pci_driver(aq_pci_ops);
index 9748e7e..ce92152 100644 (file)
@@ -14,4 +14,6 @@
 
 #include "aq_common.h"
 
+struct net_device *aq_ndev_alloc(void);
+
 #endif /* AQ_MAIN_H */
index f210e62..00b0ad9 100644 (file)
@@ -15,6 +15,7 @@
 #include "aq_hw.h"
 #include "aq_pci_func.h"
 #include "aq_nic_internal.h"
+#include "aq_main.h"
 
 #include <linux/moduleparam.h>
 #include <linux/netdevice.h>
@@ -205,14 +206,7 @@ static void aq_nic_polling_timer_cb(struct timer_list *t)
                AQ_CFG_POLLING_TIMER_INTERVAL);
 }
 
-static struct net_device *aq_nic_ndev_alloc(void)
-{
-       return alloc_etherdev_mq(sizeof(struct aq_nic_s), AQ_CFG_VECS_MAX);
-}
-
-struct aq_nic_s *aq_nic_alloc_cold(const struct net_device_ops *ndev_ops,
-                                  const struct ethtool_ops *et_ops,
-                                  struct pci_dev *pdev,
+struct aq_nic_s *aq_nic_alloc_cold(struct pci_dev *pdev,
                                   struct aq_pci_func_s *aq_pci_func,
                                   unsigned int port,
                                   const struct aq_hw_ops *aq_hw_ops)
@@ -221,7 +215,7 @@ struct aq_nic_s *aq_nic_alloc_cold(const struct net_device_ops *ndev_ops,
        struct aq_nic_s *self = NULL;
        int err = 0;
 
-       ndev = aq_nic_ndev_alloc();
+       ndev = aq_ndev_alloc();
        if (!ndev) {
                err = -ENOMEM;
                goto err_exit;
@@ -229,9 +223,6 @@ struct aq_nic_s *aq_nic_alloc_cold(const struct net_device_ops *ndev_ops,
 
        self = netdev_priv(ndev);
 
-       ndev->netdev_ops = ndev_ops;
-       ndev->ethtool_ops = et_ops;
-
        SET_NETDEV_DEV(ndev, &pdev->dev);
 
        ndev->if_port = port;
index 715b53c..cd00faf 100644 (file)
@@ -70,9 +70,7 @@ struct aq_nic_cfg_s {
 #define AQ_NIC_TCVEC2RING(_NIC_, _TC_, _VEC_) \
        ((_TC_) * AQ_CFG_TCS_MAX + (_VEC_))
 
-struct aq_nic_s *aq_nic_alloc_cold(const struct net_device_ops *ndev_ops,
-                                  const struct ethtool_ops *et_ops,
-                                  struct pci_dev *pdev,
+struct aq_nic_s *aq_nic_alloc_cold(struct pci_dev *pdev,
                                   struct aq_pci_func_s *aq_pci_func,
                                   unsigned int port,
                                   const struct aq_hw_ops *aq_hw_ops);
index bc85809..78ef7d2 100644 (file)
@@ -9,11 +9,15 @@
 
 /* File aq_pci_func.c: Definition of PCI functions. */
 
+#include <linux/interrupt.h>
+#include <linux/module.h>
+
 #include "aq_pci_func.h"
 #include "aq_nic.h"
 #include "aq_vec.h"
 #include "aq_hw.h"
-#include <linux/interrupt.h>
+#include "hw_atl/hw_atl_a0.h"
+#include "hw_atl/hw_atl_b0.h"
 
 struct aq_pci_func_s {
        struct pci_dev *pdev;
@@ -29,10 +33,30 @@ struct aq_pci_func_s {
        struct aq_hw_caps_s aq_hw_caps;
 };
 
+static const struct pci_device_id aq_pci_tbl[] = {
+       { PCI_VDEVICE(AQUANTIA, HW_ATL_DEVICE_ID_0001), },
+       { PCI_VDEVICE(AQUANTIA, HW_ATL_DEVICE_ID_D100), },
+       { PCI_VDEVICE(AQUANTIA, HW_ATL_DEVICE_ID_D107), },
+       { PCI_VDEVICE(AQUANTIA, HW_ATL_DEVICE_ID_D108), },
+       { PCI_VDEVICE(AQUANTIA, HW_ATL_DEVICE_ID_D109), },
+       {}
+};
+
+MODULE_DEVICE_TABLE(pci, aq_pci_tbl);
+
+static const struct aq_hw_ops *aq_pci_probe_get_hw_ops_by_id(struct pci_dev *pdev)
+{
+       const struct aq_hw_ops *ops = NULL;
+
+       ops = hw_atl_a0_get_ops_by_id(pdev);
+       if (!ops)
+               ops = hw_atl_b0_get_ops_by_id(pdev);
+
+       return ops;
+}
+
 struct aq_pci_func_s *aq_pci_func_alloc(const struct aq_hw_ops *aq_hw_ops,
-                                       struct pci_dev *pdev,
-                                       const struct net_device_ops *ndev_ops,
-                                       const struct ethtool_ops *eth_ops)
+                                       struct pci_dev *pdev)
 {
        struct aq_pci_func_s *self = NULL;
        int err = 0;
@@ -59,8 +83,7 @@ struct aq_pci_func_s *aq_pci_func_alloc(const struct aq_hw_ops *aq_hw_ops,
        self->ports = self->aq_hw_caps.ports;
 
        for (port = 0; port < self->ports; ++port) {
-               struct aq_nic_s *aq_nic = aq_nic_alloc_cold(ndev_ops, eth_ops,
-                                                           pdev, self,
+               struct aq_nic_s *aq_nic = aq_nic_alloc_cold(pdev, self,
                                                            port, aq_hw_ops);
 
                if (!aq_nic) {
@@ -297,3 +320,65 @@ int aq_pci_func_change_pm_state(struct aq_pci_func_s *self,
 err_exit:
        return err;
 }
+
+static int aq_pci_probe(struct pci_dev *pdev,
+                       const struct pci_device_id *pci_id)
+{
+       const struct aq_hw_ops *aq_hw_ops = NULL;
+       struct aq_pci_func_s *aq_pci_func = NULL;
+       int err = 0;
+
+       err = pci_enable_device(pdev);
+       if (err < 0)
+               goto err_exit;
+       aq_hw_ops = aq_pci_probe_get_hw_ops_by_id(pdev);
+       aq_pci_func = aq_pci_func_alloc(aq_hw_ops, pdev);
+       if (!aq_pci_func) {
+               err = -ENOMEM;
+               goto err_exit;
+       }
+       err = aq_pci_func_init(aq_pci_func);
+       if (err < 0)
+               goto err_exit;
+
+err_exit:
+       if (err < 0) {
+               if (aq_pci_func)
+                       aq_pci_func_free(aq_pci_func);
+       }
+       return err;
+}
+
+static void aq_pci_remove(struct pci_dev *pdev)
+{
+       struct aq_pci_func_s *aq_pci_func = pci_get_drvdata(pdev);
+
+       aq_pci_func_deinit(aq_pci_func);
+       aq_pci_func_free(aq_pci_func);
+}
+
+static int aq_pci_suspend(struct pci_dev *pdev, pm_message_t pm_msg)
+{
+       struct aq_pci_func_s *aq_pci_func = pci_get_drvdata(pdev);
+
+       return aq_pci_func_change_pm_state(aq_pci_func, &pm_msg);
+}
+
+static int aq_pci_resume(struct pci_dev *pdev)
+{
+       struct aq_pci_func_s *aq_pci_func = pci_get_drvdata(pdev);
+       pm_message_t pm_msg = PMSG_RESTORE;
+
+       return aq_pci_func_change_pm_state(aq_pci_func, &pm_msg);
+}
+
+static struct pci_driver aq_pci_ops = {
+       .name = AQ_CFG_DRV_NAME,
+       .id_table = aq_pci_tbl,
+       .probe = aq_pci_probe,
+       .remove = aq_pci_remove,
+       .suspend = aq_pci_suspend,
+       .resume = aq_pci_resume,
+};
+
+module_pci_driver(aq_pci_ops);
index 8446522..5f100ea 100644 (file)
@@ -16,9 +16,7 @@
 #include "aq_nic.h"
 
 struct aq_pci_func_s *aq_pci_func_alloc(const struct aq_hw_ops *hw_ops,
-                                       struct pci_dev *pdev,
-                                       const struct net_device_ops *ndev_ops,
-                                       const struct ethtool_ops *eth_ops);
+                                       struct pci_dev *pdev);
 int aq_pci_func_init(struct aq_pci_func_s *self);
 int aq_pci_func_alloc_irq(struct aq_pci_func_s *self, unsigned int i,
                          char *name, void *aq_vec,