mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-30 08:02:30 +00:00
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:
parent
2d8dbb04c6
commit
33d5e332b9
3 changed files with 72 additions and 12 deletions
|
@ -15,6 +15,7 @@ if STMMAC_ETH
|
|||
config STMMAC_PLATFORM
|
||||
bool "STMMAC Platform bus support"
|
||||
depends on STMMAC_ETH
|
||||
default y
|
||||
---help---
|
||||
This selects the platform specific bus support for
|
||||
the stmmac device driver. This is the driver used
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/clk.h>
|
||||
#include <linux/stmmac.h>
|
||||
#include <linux/phy.h>
|
||||
#include <linux/pci.h>
|
||||
#include "common.h"
|
||||
#ifdef CONFIG_STMMAC_TIMER
|
||||
#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 const struct stmmac_desc_ops enh_desc_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_restore(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;
|
||||
}
|
||||
#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/slab.h>
|
||||
#include <linux/prefetch.h>
|
||||
#include <linux/pci.h>
|
||||
#ifdef CONFIG_STMMAC_DEBUG_FS
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
@ -2094,25 +2093,29 @@ int stmmac_restore(struct net_device *ndev)
|
|||
}
|
||||
#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)
|
||||
{
|
||||
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) {
|
||||
err = pci_register_driver(&stmmac_pci_driver);
|
||||
if (err)
|
||||
platform_driver_unregister(&stmmac_pltfr_driver);
|
||||
if ((err_pci) && (err_plt)) {
|
||||
pr_err("stmmac: driver registration failed\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return err;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit stmmac_exit(void)
|
||||
{
|
||||
pci_unregister_driver(&stmmac_pci_driver);
|
||||
platform_driver_unregister(&stmmac_pltfr_driver);
|
||||
stmmac_unregister_platform();
|
||||
stmmac_unregister_pci();
|
||||
}
|
||||
|
||||
module_init(stmmac_init);
|
||||
|
|
Loading…
Reference in a new issue