linux-usb.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Marek Vasut <marex@denx.de>
To: linux-usb@vger.kernel.org
Cc: Marek Vasut <marex@denx.de>,
	"David S . Miller" <davem@davemloft.net>,
	Nisar Sayed <Nisar.Sayed@microchip.com>,
	Woojung Huh <Woojung.Huh@microchip.com>
Subject: smsc95xx: Add support for automated PHY address detection
Date: Tue, 11 Sep 2018 12:12:23 +0200	[thread overview]
Message-ID: <20180911101223.4217-1-marex@denx.de> (raw)

The SMSC95xx chip can use either the internal PHY or an external one.
Currently, the driver hard-codes support for the internal PHY only.

This patch reads out the HW_CFG register to determine whether external
PHY is attached or not. If an external PHY is not attached, the driver
falls back to internal PHY with fixed PHY address 0x1.

If an external PHY is attached, the driver scans the entire address
range of the MDIO bus to determine whether there is a valid external
PHY attached. The scanning happens from the end of the address range,
since some PHYs also respond to address 0, which is considered a MDIO
broadcast address by them. We want to obtain their real MDIO address
instead.

Signed-off-by: Marek Vasut <marex@denx.de>
Cc: David S. Miller <davem@davemloft.net>
Cc: Nisar Sayed <Nisar.Sayed@microchip.com>
Cc: Woojung Huh <Woojung.Huh@microchip.com>
---
 drivers/net/usb/smsc95xx.c | 42 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 41 insertions(+), 1 deletion(-)

diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
index 06b4d290784d..014bb71ce8a8 100644
--- a/drivers/net/usb/smsc95xx.c
+++ b/drivers/net/usb/smsc95xx.c
@@ -983,6 +983,40 @@ static int smsc95xx_start_rx_path(struct usbnet *dev, int in_pm)
 	return __smsc95xx_write_reg(dev, MAC_CR, pdata->mac_cr, in_pm);
 }
 
+static int smsc95xx_phy_address(struct usbnet *dev)
+{
+	u32 read_buf;
+	int ret, id1, id2, phyad;
+
+	ret = smsc95xx_read_reg(dev, HW_CFG, &read_buf);
+	if (ret < 0)
+		return ret;
+
+	/* Check if using external PHY, if not, use internal PHY address */
+	if (!(read_buf & HW_CFG_PSEL_))
+		return SMSC95XX_INTERNAL_PHY_ID;
+
+	/*
+	 * Detect external PHY address. Here we probe the MDIO bus from
+	 * the highest address, since some PHYs respond also on address
+	 * zero, which they consider MDIO broadcast address. We really
+	 * want to get their proper address instead though, so we scan
+	 * address zero last.
+	 */
+	for (phyad = 0x1f; phyad >= 0; phyad--) {
+		id1 = smsc95xx_mdio_read(dev->net, phyad, MII_PHYSID1);
+		id2 = smsc95xx_mdio_read(dev->net, phyad, MII_PHYSID2);
+		/* Check for valid response from the PHY */
+		if (id1 > 0 && id2 > 0 && id1 != 0x7fff && id2 != 0xffff)
+			return phyad;
+	}
+
+	/* No PHY found. */
+	netdev_warn(dev->net, "cannot detect any PHY");
+
+	return -ENODEV;
+}
+
 static int smsc95xx_phy_initialize(struct usbnet *dev)
 {
 	int bmcr, ret, timeout = 0;
@@ -993,7 +1027,13 @@ static int smsc95xx_phy_initialize(struct usbnet *dev)
 	dev->mii.mdio_write = smsc95xx_mdio_write;
 	dev->mii.phy_id_mask = 0x1f;
 	dev->mii.reg_num_mask = 0x1f;
-	dev->mii.phy_id = SMSC95XX_INTERNAL_PHY_ID;
+
+	/* Determine PHY address */
+	ret = smsc95xx_phy_address(dev);
+	if (ret)
+		return ret;
+
+	dev->mii.phy_id = ret;
 
 	/* reset phy and wait for reset to complete */
 	smsc95xx_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET);

             reply	other threads:[~2018-09-11 10:12 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-11 10:12 Marek Vasut [this message]
  -- strict thread matches above, loose matches on Subject: below --
2018-12-23  9:30 smsc95xx: Add support for automated PHY address detection Marek Vasut
2018-12-23 10:23 Andrew Lunn
2018-12-23 10:43 Marek Vasut
2018-12-23 10:56 Andrew Lunn
2018-12-23 10:59 Marek Vasut

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180911101223.4217-1-marex@denx.de \
    --to=marex@denx.de \
    --cc=Nisar.Sayed@microchip.com \
    --cc=Woojung.Huh@microchip.com \
    --cc=davem@davemloft.net \
    --cc=linux-usb@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).