Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6bed0118 authored by Johan Hovold's avatar Johan Hovold Committed by David S. Miller
Browse files

net: ethernet: ti: davinci_emac: fix device reference leak



Make sure to drop the references taken by bus_find_device() before
returning from emac_dev_open().

Note that phy_connect still takes a reference to the phy device.

Fixes: 5d69e007 ("net: davinci_emac: switch to new mdio")
Cc: Mugunthan V N <mugunthanvnm@ti.com>
Cc: Grygorii Strashko <grygorii.strashko@ti.com>
Cc: linux-omap@vger.kernel.org
Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c7262aaa
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -1410,6 +1410,7 @@ static int emac_dev_open(struct net_device *ndev)
	int i = 0;
	struct emac_priv *priv = netdev_priv(ndev);
	struct phy_device *phydev = NULL;
	struct device *phy = NULL;

	ret = pm_runtime_get_sync(&priv->pdev->dev);
	if (ret < 0) {
@@ -1488,19 +1489,20 @@ static int emac_dev_open(struct net_device *ndev)

	/* use the first phy on the bus if pdata did not give us a phy id */
	if (!phydev && !priv->phy_id) {
		struct device *phy;

		phy = bus_find_device(&mdio_bus_type, NULL, NULL,
				      match_first_device);
		if (phy)
		if (phy) {
			priv->phy_id = dev_name(phy);
			if (!priv->phy_id || !*priv->phy_id)
				put_device(phy);
		}
	}

	if (!phydev && priv->phy_id && *priv->phy_id) {
		phydev = phy_connect(ndev, priv->phy_id,
				     &emac_adjust_link,
				     PHY_INTERFACE_MODE_MII);

		put_device(phy);	/* reference taken by bus_find_device */
		if (IS_ERR(phydev)) {
			dev_err(emac_dev, "could not connect to phy %s\n",
				priv->phy_id);