Re: [RFC 08/11] net: phy: Allow mdio buses to auto-probe c45 devices

From: Russell King - ARM Linux admin
Date: Mon May 25 2020 - 04:25:20 EST


On Sun, May 24, 2020 at 11:28:52PM -0500, Jeremy Linton wrote:
> Hi,
>
> On 5/24/20 9:44 AM, Andrew Lunn wrote:
> > > +++ b/include/linux/phy.h
> > > @@ -275,6 +275,11 @@ struct mii_bus {
> > > int reset_delay_us;
> > > /* RESET GPIO descriptor pointer */
> > > struct gpio_desc *reset_gpiod;
> > > + /* bus capabilities, used for probing */
> > > + enum {
> > > + MDIOBUS_C22_ONLY = 0,
> > > + MDIOBUS_C45_FIRST,
> > > + } probe_capabilities;
> > > };
> >
> >
> > I'm not so keen on _FIRST. It suggest _LAST would also be valid. But
> > that then suggests this is not a bus property, but a PHY property, and
> > some PHYs might need _FIRST and other phys need _LAST, and then you
> > have a bus which has both sorts of PHY on it, and you have a problem.
> >
> > So i think it would be better to have
> >
> > enum {
> > MDIOBUS_UNKNOWN = 0,
> > MDIOBUS_C22,
> > MDIOBUS_C45,
> > MDIOBUS_C45_C22,
> > } bus_capabilities;
> >
> > Describe just what the bus master can support.
>
> Yes, the naming is reasonable and I will update it in the next patch. I went
> around a bit myself with this naming early on, and the problem I saw was
> that a C45 capable master, can have C45 electrical phy's that only respond
> to c22 requests (AFAIK).

If you have a master that can only generate clause 45 cycles, and
someone is daft enough to connect a clause 22 only PHY to it, the
result is hardware that doesn't work - there's no getting around
that. The MDIO interface can't generate the appropriate cycles to
access the clause 22 PHY. So, this is not something we need care
about.

> So the MDIOBUS_C45 (I think I was calling it
> C45_ONLY) is an invalid selection. Not, that it wouldn't be helpful to have
> a C45_ONLY case, but that the assumption is that you wouldn't try and probe
> c22 registers, which I thought was a mistake.

MDIOBUS_C45 means "I can generate clause 45 cycles".
MDIOBUS_C22 means "I can generate clause 22 cycles".
MDIOBUS_C45_C22 means "I can generate both clause 45 and clause 22
cycles."

Notice carefully the values these end up with - MDIOBUS_C22 = BIT(0),
MDIOBUS_C45 = BIT(1), MDIOBUS_C45_C22 = BIT(0) | BIT(1). I suspect
that was no coincidence in Andrew's suggestion.

--
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTC for 0.8m (est. 1762m) line in suburbia: sync at 13.1Mbps down 424kbps up