Commit 99669259 authored by Maxime Bizon's avatar Maxime Bizon Committed by David S. Miller
Browse files

net: mdio: fix owner field for mdio buses registered using device-tree



Bus ownership is wrong when using of_mdiobus_register() to register an mdio
bus. That function is not inline, so when it calls mdiobus_register() the wrong
THIS_MODULE value is captured.

Signed-off-by: default avatarMaxime Bizon <mbizon@freebox.fr>
Fixes: 90eff909 ("net: phy: Allow splitting MDIO bus/device support from PHYs")
[florian: fix kdoc, added Fixes tag]
Signed-off-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Reviewed-by: default avatarSimon Horman <simon.horman@corigine.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4203d840
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -139,21 +139,23 @@ bool of_mdiobus_child_is_phy(struct device_node *child)
EXPORT_SYMBOL(of_mdiobus_child_is_phy);

/**
 * of_mdiobus_register - Register mii_bus and create PHYs from the device tree
 * __of_mdiobus_register - Register mii_bus and create PHYs from the device tree
 * @mdio: pointer to mii_bus structure
 * @np: pointer to device_node of MDIO bus.
 * @owner: module owning the @mdio object.
 *
 * This function registers the mii_bus structure and registers a phy_device
 * for each child node of @np.
 */
int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
int __of_mdiobus_register(struct mii_bus *mdio, struct device_node *np,
			  struct module *owner)
{
	struct device_node *child;
	bool scanphys = false;
	int addr, rc;

	if (!np)
		return mdiobus_register(mdio);
		return __mdiobus_register(mdio, owner);

	/* Do not continue if the node is disabled */
	if (!of_device_is_available(np))
@@ -172,7 +174,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
	of_property_read_u32(np, "reset-post-delay-us", &mdio->reset_post_delay_us);

	/* Register the MDIO bus */
	rc = mdiobus_register(mdio);
	rc = __mdiobus_register(mdio, owner);
	if (rc)
		return rc;

@@ -236,7 +238,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
	mdiobus_unregister(mdio);
	return rc;
}
EXPORT_SYMBOL(of_mdiobus_register);
EXPORT_SYMBOL(__of_mdiobus_register);

/**
 * of_mdio_find_device - Given a device tree node, find the mdio_device
+6 −5
Original line number Diff line number Diff line
@@ -98,13 +98,14 @@ EXPORT_SYMBOL(__devm_mdiobus_register);

#if IS_ENABLED(CONFIG_OF_MDIO)
/**
 * devm_of_mdiobus_register - Resource managed variant of of_mdiobus_register()
 * __devm_of_mdiobus_register - Resource managed variant of of_mdiobus_register()
 * @dev:	Device to register mii_bus for
 * @mdio:	MII bus structure to register
 * @np:		Device node to parse
 * @owner:	Owning module
 */
int devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio,
			     struct device_node *np)
int __devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio,
			       struct device_node *np, struct module *owner)
{
	struct mdiobus_devres *dr;
	int ret;
@@ -117,7 +118,7 @@ int devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio,
	if (!dr)
		return -ENOMEM;

	ret = of_mdiobus_register(mdio, np);
	ret = __of_mdiobus_register(mdio, np, owner);
	if (ret) {
		devres_free(dr);
		return ret;
@@ -127,7 +128,7 @@ int devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio,
	devres_add(dev, dr);
	return 0;
}
EXPORT_SYMBOL(devm_of_mdiobus_register);
EXPORT_SYMBOL(__devm_of_mdiobus_register);
#endif /* CONFIG_OF_MDIO */

MODULE_LICENSE("GPL");
+19 −3
Original line number Diff line number Diff line
@@ -14,9 +14,25 @@

#if IS_ENABLED(CONFIG_OF_MDIO)
bool of_mdiobus_child_is_phy(struct device_node *child);
int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np);
int devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio,
			     struct device_node *np);
int __of_mdiobus_register(struct mii_bus *mdio, struct device_node *np,
			  struct module *owner);

static inline int of_mdiobus_register(struct mii_bus *mdio,
				      struct device_node *np)
{
	return __of_mdiobus_register(mdio, np, THIS_MODULE);
}

int __devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio,
			       struct device_node *np, struct module *owner);

static inline int devm_of_mdiobus_register(struct device *dev,
					   struct mii_bus *mdio,
					   struct device_node *np)
{
	return __devm_of_mdiobus_register(dev, mdio, np, THIS_MODULE);
}

struct mdio_device *of_mdio_find_device(struct device_node *np);
struct phy_device *of_phy_find_device(struct device_node *phy_np);
struct phy_device *