Re: [PATCH] smsc95xx: Add support for automated PHY address detection

From: Andrew Lunn <andrew@lunn.ch>
Date: 2018-12-23 10:23:29
Also in: linux-usb

quoted
+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;
+	}
This would be so much easier if the driver used the core mdio/phy
code. Just set mdio->phy_mask to ~BIT(0) and then use
phy_find_first().

Anyway, net is closed at the moment, so please repost in three weeks
time.

	Andrew
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help