On Mon, Oct 23, 2023 at 11:33:38AM +0200, Oleksij Rempel wrote: > Add WoL support for KSZ9477 family of switches. This code was tested on > KSZ8563 chip. > > KSZ9477 family of switches supports multiple PHY events: > - wake on Link Up > - wake on Energy Detect. > Since current UAPI can't differentiate between this PHY events, map all > of them to WAKE_PHY. > > Signed-off-by: Oleksij Rempel <o.rempel@xxxxxxxxxxxxxx> > Reviewed-by: Andrew Lunn <andrew@xxxxxxx> > Reviewed-by: Florian Fainelli <florian.fainelli@xxxxxxxxxxxx> > --- > drivers/net/dsa/microchip/ksz9477.c | 100 +++++++++++++++++++++++++ > drivers/net/dsa/microchip/ksz9477.h | 4 + > drivers/net/dsa/microchip/ksz_common.c | 24 ++++++ > drivers/net/dsa/microchip/ksz_common.h | 4 + > 4 files changed, 132 insertions(+) > > diff --git a/drivers/net/dsa/microchip/ksz9477.c b/drivers/net/dsa/microchip/ksz9477.c > index cde8ef33d029..036dfaddb32a 100644 > --- a/drivers/net/dsa/microchip/ksz9477.c > +++ b/drivers/net/dsa/microchip/ksz9477.c > @@ -56,6 +56,103 @@ int ksz9477_change_mtu(struct ksz_device *dev, int port, int mtu) > REG_SW_MTU_MASK, frame_size); > } > > +/** > + * ksz9477_handle_wake_reason - Handle wake reason on a specified port. > + * @dev: The device structure. > + * @port: The port number. > + * > + * This function reads the PME (Power Management Event) status register of a > + * specified port to determine the wake reason. If there is no wake event, it > + * returns early. Otherwise, it logs the wake reason which could be due to a > + * "Magic Packet", "Link Up", or "Energy Detect" event. The PME status register > + * is then cleared to acknowledge the handling of the wake event. > + * > + * Return: 0 on success, or an error code on failure. > + */ > +static int ksz9477_handle_wake_reason(struct ksz_device *dev, int port) > +{ > + u8 pme_status; > + int ret; > + > + ret = ksz_pread8(dev, port, REG_PORT_PME_STATUS, &pme_status); > + if (ret) > + return ret; > + > + if (!pme_status) > + return 0; > + > + dev_dbg(dev->dev, "Wake event on port %d due to:%s%s\n", port, > + pme_status & PME_WOL_LINKUP ? " \"Link Up\"" : "", > + pme_status & PME_WOL_ENERGY ? " \"Enery detect\"" : ""); nit: Energy > + > + return ksz_pwrite8(dev, port, REG_PORT_PME_STATUS, pme_status); > +} ...