Skip to contentSkip to conversation

RFC: Custom PHY device detection functions

PATCH Felix Fietkau 2 participants 3 messages Jun 4, 2008 – Jun 5, 2008

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

Hi,

I'm working on Linux on small consumer grade wireless routers. Many of these have switches that connect directly to the Ethernet controller through MII/MDIO. These typically support 6-8 ports, one of which connects to the CPU. I am working on supporting some of these with PHY drivers, which I will submit for review when they're ready. Most of these devices can be detected with the regular PHY ID and mask, but unfortunately there are some that lay out their registers a bit differently and thus need custom detection.
I worked around this with the following patch, that allows drivers to do their own detection, but I'm not sure if this is suitable for inclusion in the PHY layer or if there is a different way to solve this.
Any ideas?

- Felix

drivers/net/phy/mdio_bus.c +3 -0
@@ -132,6 +132,9 @@
 	struct phy_device *phydev = to_phy_device(dev);
 	struct phy_driver *phydrv = to_phy_driver(drv);
 
+	if (phydrv->detect)
+		return (phydrv->detect(phydev->bus, phydev->addr));
+
 	return ((phydrv->phy_id & phydrv->phy_id_mask) ==
 		(phydev->phy_id & phydrv->phy_id_mask));
 }
include/linux/phy.h +5 -0
@@ -325,6 +325,11 @@
 	u32 features;
 	u32 flags;
 
+	/* Called during discovery to test if the
+	 * device can attach to the bus, even if
+	 * phy id and mask do not match */
+	bool (*detect)(struct mii_bus *bus, int addr);
+
 	/* Called to initialize the PHY,
 	 * including after a reset */
 	int (*config_init)(struct phy_device *phydev);
#1 lore raw
Quoted 4 lines · Felix Fietkau

I'm working on Linux on small consumer grade wireless routers. Many of these have switches that connect directly to the Ethernet controller through MII/MDIO. These typically support 6-8 ports, one of which connects to the CPU. I am working on supporting some of these with PHY drivers, which I will

Quoted 8 lines

submit for review when they're ready.
Most of these devices can be detected with the regular PHY ID and mask, but unfortunately there are some that lay out their registers a bit differently and thus need custom detection.
I worked around this with the following patch, that allows drivers to do their own detection, but I'm not sure if this is suitable for inclusion in the PHY layer or if there is a different way to solve this.
Any ideas?

If the phy uses non-standard registers, isn't it too late after the phy layer has already read the phy_id?

If not, could you use the existing probe function? Set phy_id_mask to 0 and have the probe function return ENODEV if it's the wrong device. I think the driver layer will go through all matching drivers, calling each one's probe function, until one of them claims the device.

Quoted 36 lines

- Felix

drivers/net/phy/mdio_bus.c +3 -0
@@ -132,6 +132,9 @@
 	 struct phy_device *phydev = to_phy_device(dev);
 	 struct phy_driver *phydrv = to_phy_driver(drv);
 
+	if (phydrv->detect)
+		return (phydrv->detect(phydev->bus, phydev->addr));
+
 	 return ((phydrv->phy_id & phydrv->phy_id_mask) ==
 		(phydev->phy_id & phydrv->phy_id_mask));
 }
include/linux/phy.h +5 -1
@@ -325,6 +325,11 @@
 	 u32 features;
 	 u32 flags;
 
+	/* Called during discovery to test if the
+	 * device can attach to the bus, even if
+	 * phy id and mask do not match */
+	bool (*detect)(struct mii_bus *bus, int addr);
+
 	 /* Called to initialize the PHY,
 	 * including after a reset */
 	 int (*config_init)(struct phy_device *phydev);
 
--

To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#2 lore raw
Quoted 8 lines · Trent Piepho
Quoted 4 lines · Felix Fietkau

I'm working on Linux on small consumer grade wireless routers. Many of these have switches that connect directly to the Ethernet controller through MII/MDIO. These typically support 6-8 ports, one of which connects to the CPU. I am working on supporting some of these with PHY drivers, which I will submit for review when they're ready. Most of these devices can be detected with the regular PHY ID and mask, but unfortunately there are some that lay out their registers a bit differently and thus need custom detection.
I worked around this with the following patch, that allows drivers to do their own detection, but I'm not sure if this is suitable for inclusion in the PHY layer or if there is a different way to solve this.
Any ideas?

If the phy uses non-standard registers, isn't it too late after the phy layer has already read the phy_id?

Reading phy_id does not cause any problems, it just doesn't give us anything base detection on.

Quoted 4 lines

If not, could you use the existing probe function? Set phy_id_mask to 0 and have the probe function return ENODEV if it's the wrong device. I think the driver layer will go through all matching drivers, calling each one's probe function, until one of them claims the device.

Thanks, I'll try that.

- Felix