net: phy: mdio-octeon: Cleanup module loading dependencies
authorAndrew Lunn <andrew@lunn.ch>
Tue, 7 Jul 2020 01:49:39 +0000 (03:49 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 7 Jul 2020 19:47:11 +0000 (12:47 -0700)
To ensure that the octeon MDIO driver has been loaded, the Cavium
ethernet drivers reference a dummy symbol in the MDIO driver. This
forces it to be loaded first. And this symbol has not been cleanly
implemented, resulting in warnings when build W=1 C=1.

Since device tree is being used, and a phandle points to the PHY on
the MDIO bus, we can make use of deferred probing. If the PHY fails to
connect, it should be because the MDIO bus driver has not loaded
yet. Return -EPROBE_DEFER so it will be tried again later.

Additionally, add a MODULE_SOFTDEP() to give user space a hint as to
what order it should load the modules.

v2:
s/octoen/octeon/
Add MODULE_SOFTDEP()

Cc: Sunil Goutham <sgoutham@marvell.com>
Cc: Robert Richter <rrichter@marvell.com>
Cc: Chris Packham <chris.packham@alliedtelesis.co.nz>
Tested-by: Chris Packham <chris.packham@alliedtelesis.co.nz>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/cavium/octeon/octeon_mgmt.c
drivers/net/phy/mdio-octeon.c
drivers/staging/octeon/ethernet-mdio.c
drivers/staging/octeon/ethernet-mdio.h
drivers/staging/octeon/ethernet.c

index cbaa1924afbe1486a5bcc401bb55b682d1126dd7..3e17ce0d231455ef6a75fd089d8bbd24febda8b9 100644 (file)
@@ -961,7 +961,7 @@ static int octeon_mgmt_init_phy(struct net_device *netdev)
                                PHY_INTERFACE_MODE_MII);
 
        if (!phydev)
-               return -ENODEV;
+               return -EPROBE_DEFER;
 
        return 0;
 }
@@ -1554,12 +1554,8 @@ static struct platform_driver octeon_mgmt_driver = {
        .remove         = octeon_mgmt_remove,
 };
 
-extern void octeon_mdiobus_force_mod_depencency(void);
-
 static int __init octeon_mgmt_mod_init(void)
 {
-       /* Force our mdiobus driver module to be loaded first. */
-       octeon_mdiobus_force_mod_depencency();
        return platform_driver_register(&octeon_mgmt_driver);
 }
 
@@ -1571,6 +1567,7 @@ static void __exit octeon_mgmt_mod_exit(void)
 module_init(octeon_mgmt_mod_init);
 module_exit(octeon_mgmt_mod_exit);
 
+MODULE_SOFTDEP("pre: mdio-cavium");
 MODULE_DESCRIPTION(DRV_DESCRIPTION);
 MODULE_AUTHOR("David Daney");
 MODULE_LICENSE("GPL");
index a2f93948db975388a6dcbff56dc1b042a77299ed..d1e1009d51afe5e0de6a7ff58b37f89a2d6e7e6f 100644 (file)
@@ -108,12 +108,6 @@ static struct platform_driver octeon_mdiobus_driver = {
        .remove         = octeon_mdiobus_remove,
 };
 
-void octeon_mdiobus_force_mod_depencency(void)
-{
-       /* Let ethernet drivers force us to be loaded.  */
-}
-EXPORT_SYMBOL(octeon_mdiobus_force_mod_depencency);
-
 module_platform_driver(octeon_mdiobus_driver);
 
 MODULE_DESCRIPTION("Cavium OCTEON MDIO bus driver");
index c798672d61b2706883a9fad854eb3817171ce126..cfb673a52b257e68af4512fe0afd756fc5da50f5 100644 (file)
@@ -163,7 +163,7 @@ int cvm_oct_phy_setup_device(struct net_device *dev)
        of_node_put(phy_node);
 
        if (!phydev)
-               return -ENODEV;
+               return -EPROBE_DEFER;
 
        priv->last_link = 0;
        phy_start(phydev);
index e3771d48c49b87b51938d18cf700bf85f5d1b6a6..7f6716e3fad41aed695915a43449a21a28f40ac3 100644 (file)
@@ -22,7 +22,5 @@
 
 extern const struct ethtool_ops cvm_oct_ethtool_ops;
 
-void octeon_mdiobus_force_mod_depencency(void);
-
 int cvm_oct_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
 int cvm_oct_phy_setup_device(struct net_device *dev);
index f42c3816ce491393c0b4fdc91521b4d405567c48..204f0b1e27397e692974491a1b7b166a4bba9153 100644 (file)
@@ -689,8 +689,6 @@ static int cvm_oct_probe(struct platform_device *pdev)
        mtu_overhead += VLAN_HLEN;
 #endif
 
-       octeon_mdiobus_force_mod_depencency();
-
        pip = pdev->dev.of_node;
        if (!pip) {
                pr_err("Error: No 'pip' in /aliases\n");
@@ -987,6 +985,7 @@ static struct platform_driver cvm_oct_driver = {
 
 module_platform_driver(cvm_oct_driver);
 
+MODULE_SOFTDEP("pre: mdio-cavium");
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Cavium Networks <support@caviumnetworks.com>");
 MODULE_DESCRIPTION("Cavium Networks Octeon ethernet driver.");