stmmac: fix driver built w/ w/o both pci and platf modules
The commit ba27ec66ff
fixes the Kconfig of the
driver when built as module allowing to select/unselect
the PCI and Platform modules that are not anymore mutually
exclusive. This patch fixes and guarantees that the driver
builds on all the platforms w/ w/o PCI and when select/unselect
the two stmmac supports. In case of there are some problems
on both the configuration and the pci/pltf registration the
module_init will fail.
v2: set the CONFIG_STMMAC_PLATFORM enabled by default.
I've just noticed that this can actually help on
some configurations that don't enable any STMMAC
options by default (e.g. SPEAr).
v3: change printk level when do not register the driver.
Reported-by: Fengguang Wu <wfg@linux.intel.com>
Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
2d8dbb04c6
commit
33d5e332b9
@@ -15,6 +15,7 @@ if STMMAC_ETH
|
|||||||
config STMMAC_PLATFORM
|
config STMMAC_PLATFORM
|
||||||
bool "STMMAC Platform bus support"
|
bool "STMMAC Platform bus support"
|
||||||
depends on STMMAC_ETH
|
depends on STMMAC_ETH
|
||||||
|
default y
|
||||||
---help---
|
---help---
|
||||||
This selects the platform specific bus support for
|
This selects the platform specific bus support for
|
||||||
the stmmac device driver. This is the driver used
|
the stmmac device driver. This is the driver used
|
||||||
|
@@ -26,6 +26,7 @@
|
|||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
#include <linux/stmmac.h>
|
#include <linux/stmmac.h>
|
||||||
#include <linux/phy.h>
|
#include <linux/phy.h>
|
||||||
|
#include <linux/pci.h>
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#ifdef CONFIG_STMMAC_TIMER
|
#ifdef CONFIG_STMMAC_TIMER
|
||||||
#include "stmmac_timer.h"
|
#include "stmmac_timer.h"
|
||||||
@@ -95,8 +96,6 @@ extern int stmmac_mdio_register(struct net_device *ndev);
|
|||||||
extern void stmmac_set_ethtool_ops(struct net_device *netdev);
|
extern void stmmac_set_ethtool_ops(struct net_device *netdev);
|
||||||
extern const struct stmmac_desc_ops enh_desc_ops;
|
extern const struct stmmac_desc_ops enh_desc_ops;
|
||||||
extern const struct stmmac_desc_ops ndesc_ops;
|
extern const struct stmmac_desc_ops ndesc_ops;
|
||||||
extern struct pci_driver stmmac_pci_driver;
|
|
||||||
extern struct platform_driver stmmac_pltfr_driver;
|
|
||||||
int stmmac_freeze(struct net_device *ndev);
|
int stmmac_freeze(struct net_device *ndev);
|
||||||
int stmmac_restore(struct net_device *ndev);
|
int stmmac_restore(struct net_device *ndev);
|
||||||
int stmmac_resume(struct net_device *ndev);
|
int stmmac_resume(struct net_device *ndev);
|
||||||
@@ -144,3 +143,60 @@ static inline int stmmac_clk_get(struct stmmac_priv *priv)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_HAVE_CLK */
|
#endif /* CONFIG_HAVE_CLK */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_STMMAC_PLATFORM
|
||||||
|
extern struct platform_driver stmmac_pltfr_driver;
|
||||||
|
static inline int stmmac_register_platform(void)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = platform_driver_register(&stmmac_pltfr_driver);
|
||||||
|
if (err)
|
||||||
|
pr_err("stmmac: failed to register the platform driver\n");
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
static inline void stmmac_unregister_platform(void)
|
||||||
|
{
|
||||||
|
platform_driver_register(&stmmac_pltfr_driver);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline int stmmac_register_platform(void)
|
||||||
|
{
|
||||||
|
pr_debug("stmmac: do not register the platf driver\n");
|
||||||
|
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
static inline void stmmac_unregister_platform(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_STMMAC_PLATFORM */
|
||||||
|
|
||||||
|
#ifdef CONFIG_STMMAC_PCI
|
||||||
|
extern struct pci_driver stmmac_pci_driver;
|
||||||
|
static inline int stmmac_register_pci(void)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = pci_register_driver(&stmmac_pci_driver);
|
||||||
|
if (err)
|
||||||
|
pr_err("stmmac: failed to register the PCI driver\n");
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
static inline void stmmac_unregister_pci(void)
|
||||||
|
{
|
||||||
|
pci_unregister_driver(&stmmac_pci_driver);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline int stmmac_register_pci(void)
|
||||||
|
{
|
||||||
|
pr_debug("stmmac: do not register the PCI driver\n");
|
||||||
|
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
static inline void stmmac_unregister_pci(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_STMMAC_PCI */
|
||||||
|
@@ -42,7 +42,6 @@
|
|||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/prefetch.h>
|
#include <linux/prefetch.h>
|
||||||
#include <linux/pci.h>
|
|
||||||
#ifdef CONFIG_STMMAC_DEBUG_FS
|
#ifdef CONFIG_STMMAC_DEBUG_FS
|
||||||
#include <linux/debugfs.h>
|
#include <linux/debugfs.h>
|
||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
@@ -2094,25 +2093,29 @@ int stmmac_restore(struct net_device *ndev)
|
|||||||
}
|
}
|
||||||
#endif /* CONFIG_PM */
|
#endif /* CONFIG_PM */
|
||||||
|
|
||||||
|
/* Driver can be configured w/ and w/ both PCI and Platf drivers
|
||||||
|
* depending on the configuration selected.
|
||||||
|
*/
|
||||||
static int __init stmmac_init(void)
|
static int __init stmmac_init(void)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err_plt = 0;
|
||||||
|
int err_pci = 0;
|
||||||
|
|
||||||
err = platform_driver_register(&stmmac_pltfr_driver);
|
err_plt = stmmac_register_platform();
|
||||||
|
err_pci = stmmac_register_pci();
|
||||||
|
|
||||||
if (!err) {
|
if ((err_pci) && (err_plt)) {
|
||||||
err = pci_register_driver(&stmmac_pci_driver);
|
pr_err("stmmac: driver registration failed\n");
|
||||||
if (err)
|
return -EINVAL;
|
||||||
platform_driver_unregister(&stmmac_pltfr_driver);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit stmmac_exit(void)
|
static void __exit stmmac_exit(void)
|
||||||
{
|
{
|
||||||
pci_unregister_driver(&stmmac_pci_driver);
|
stmmac_unregister_platform();
|
||||||
platform_driver_unregister(&stmmac_pltfr_driver);
|
stmmac_unregister_pci();
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(stmmac_init);
|
module_init(stmmac_init);
|
||||||
|
Reference in New Issue
Block a user