net: aquantia: Simplify dependencies between pci modules
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>
This commit is contained in:
parent
4cbc9f92f9
commit
5b97b0d10e
|
@ -11,39 +11,35 @@
|
|||
|
||||
#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);
|
||||
|
|
|
@ -14,4 +14,6 @@
|
|||
|
||||
#include "aq_common.h"
|
||||
|
||||
struct net_device *aq_ndev_alloc(void);
|
||||
|
||||
#endif /* AQ_MAIN_H */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue