Hi Russell. I've tested my WoL patch reworked with the phylink_speed_(up|down) functions on a LS421DE device and it works quite fine.
I'll sent another patch when this one got merged. Thank you. Daniel El mié., 24 jun. 2020 a las 12:06, Russell King (<rmk+ker...@armlinux.org.uk>) escribió: > > Add an interface for the phy_speed_(up|down) functions when a driver > makes use of phylink. These pass the call through to phylib when we > have a normal PHY attached (i.o.w., not a PHY on a SFP module.) > > Signed-off-by: Russell King <rmk+ker...@armlinux.org.uk> > --- > This is to support the work by Daniel González Cabanelas for mvneta WoL, > but at the present time, this has no users (hence no patch 2). I hope > mvneta WoL support can be revived soon with the aid of this patch. > (Resent with Daniel's name fixed.) > > drivers/net/phy/phylink.c | 48 +++++++++++++++++++++++++++++++++++++++ > include/linux/phylink.h | 2 ++ > 2 files changed, 50 insertions(+) > > diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c > index 7ce787c227b3..7cda1646bbf7 100644 > --- a/drivers/net/phy/phylink.c > +++ b/drivers/net/phy/phylink.c > @@ -1826,6 +1826,54 @@ int phylink_mii_ioctl(struct phylink *pl, struct ifreq > *ifr, int cmd) > } > EXPORT_SYMBOL_GPL(phylink_mii_ioctl); > > +/** > + * phylink_speed_down() - set the non-SFP PHY to lowest speed supported by > both > + * link partners > + * @pl: a pointer to a &struct phylink returned from phylink_create() > + * @sync: perform action synchronously > + * > + * If we have a PHY that is not part of a SFP module, then set the speed > + * as described in the phy_speed_down() function. Please see this function > + * for a description of the @sync parameter. > + * > + * Returns zero if there is no PHY, otherwise as per phy_speed_down(). > + */ > +int phylink_speed_down(struct phylink *pl, bool sync) > +{ > + int ret = 0; > + > + ASSERT_RTNL(); > + > + if (!pl->sfp_bus && pl->phydev) > + ret = phy_speed_down(pl->phydev, sync); > + > + return ret; > +} > +EXPORT_SYMBOL_GPL(phylink_speed_down); > + > +/** > + * phylink_speed_up() - restore the advertised speeds prior to the call to > + * phylink_speed_down() > + * @pl: a pointer to a &struct phylink returned from phylink_create() > + * > + * If we have a PHY that is not part of a SFP module, then restore the > + * PHY speeds as per phy_speed_up(). > + * > + * Returns zero if there is no PHY, otherwise as per phy_speed_up(). > + */ > +int phylink_speed_up(struct phylink *pl) > +{ > + int ret = 0; > + > + ASSERT_RTNL(); > + > + if (!pl->sfp_bus && pl->phydev) > + ret = phy_speed_up(pl->phydev); > + > + return ret; > +} > +EXPORT_SYMBOL_GPL(phylink_speed_up); > + > static void phylink_sfp_attach(void *upstream, struct sfp_bus *bus) > { > struct phylink *pl = upstream; > diff --git a/include/linux/phylink.h b/include/linux/phylink.h > index cc5b452a184e..b32b8b45421b 100644 > --- a/include/linux/phylink.h > +++ b/include/linux/phylink.h > @@ -392,6 +392,8 @@ int phylink_init_eee(struct phylink *, bool); > int phylink_ethtool_get_eee(struct phylink *, struct ethtool_eee *); > int phylink_ethtool_set_eee(struct phylink *, struct ethtool_eee *); > int phylink_mii_ioctl(struct phylink *, struct ifreq *, int); > +int phylink_speed_down(struct phylink *pl, bool sync); > +int phylink_speed_up(struct phylink *pl); > > #define phylink_zero(bm) \ > bitmap_zero(bm, __ETHTOOL_LINK_MODE_MASK_NBITS) > -- > 2.20.1 >