Re: [PATCH net-next v7 4/9] net: dsa: microchip: ksz9477: add Wake on LAN support

From: Simon Horman
Date: Wed Oct 25 2023 - 16:10:28 EST


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);
> +}

...