Received: by 2002:a05:6358:7058:b0:131:369:b2a3 with SMTP id 24csp9546547rwp; Thu, 20 Jul 2023 06:35:12 -0700 (PDT) X-Google-Smtp-Source: APBJJlF+Qezoe3NEjnDhOUSkzV5PhCQCJMK2eYTTI5VcGrrd5mqAYbgTtX0BK8LyY4YQCjx9XslZ X-Received: by 2002:aa7:c413:0:b0:51e:17d:a1c3 with SMTP id j19-20020aa7c413000000b0051e017da1c3mr4841717edq.32.1689860112228; Thu, 20 Jul 2023 06:35:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689860112; cv=none; d=google.com; s=arc-20160816; b=hrfW5deY50glgurcHqWqHIDv7/bT2EZGAY/PfcWyc5f29XOu0OXttK/dLoio/Qx3yO XNjof1HthQQCmEkv/B6jFBsBKqL3xBzZU20kD46EKhRmGDZPRABCulrcduu3F3RBLlvr cWQJIoerWxcEUVc/jGI5T/TBBxmauxdP4aF4ZUvZwMnIQWQmCkAqj09oov7Tq7wJ3dSd Wbv/zlufxzfahFcQtoAEl5RmPRHXsc6ZTV5KH4GYFaynWx3V0GWMAhi1OFAZx65iyLLL bHD+9S0pqI54Bq7jNbf+jkwJYYoGNEHowuvDGIVrJ4VSweWgMooucWkwKPcwOF0nyxYU AIkg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=UON8e0Nx6tQWZfxEWG/jy42PPmhApqkkx0HAiMYNwS0=; fh=d9XFsL0QiW7mB0yy/Dn7n/CVmKRQqLnFoPiaUGJewck=; b=MAxMKytNwI9vgR8bndCbTxOhprl+79lqvVwkSEa4aqy9mEQsmwFD4RaVemZYxe8UR/ s8QlIsL3vp4gZNHpQ3apnFsWqQdx4a22PE7mM5uDQzV86/KpvOpoU0w+vHaEm3gn4EsX ZbUNquN8dAWlGGJKQcFGymTvlXmZpKKSm8Ae9doZWu8bd4Z0l+N68Lpi1SZpVWvzaumr rKwteGvf1b0MHYsaJ7Ur6qNmf6RS7BPM6WukXWtQ5TmOSlNtGNXgXQ6j5ksQw0cVKH4w Q4Kikx47NVqW5U1sBnhBkd0BdDtlX1G163ek9JE3+pHBr2gE35EwnzI8t0fQnm3fle4o uXlQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id v16-20020aa7cd50000000b0051e0ef8936asi798015edw.291.2023.07.20.06.34.48; Thu, 20 Jul 2023 06:35:12 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231889AbjGTN0b (ORCPT + 99 others); Thu, 20 Jul 2023 09:26:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44938 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231347AbjGTN0Y (ORCPT ); Thu, 20 Jul 2023 09:26:24 -0400 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DD5A41FC8 for ; Thu, 20 Jul 2023 06:26:17 -0700 (PDT) Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qMTfL-0007aH-QE; Thu, 20 Jul 2023 15:25:59 +0200 Received: from [2a0a:edc0:0:1101:1d::ac] (helo=dude04.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtp (Exim 4.94.2) (envelope-from ) id 1qMTfK-000qc5-2T; Thu, 20 Jul 2023 15:25:58 +0200 Received: from ore by dude04.red.stw.pengutronix.de with local (Exim 4.96) (envelope-from ) id 1qMTfJ-000EzP-0v; Thu, 20 Jul 2023 15:25:57 +0200 From: Oleksij Rempel To: "David S. Miller" , Andrew Lunn , Eric Dumazet , Florian Fainelli , Jakub Kicinski , Paolo Abeni , Vladimir Oltean , Woojung Huh , Arun Ramadoss , Conor Dooley , Krzysztof Kozlowski , Rob Herring Cc: Oleksij Rempel , kernel@pengutronix.de, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, UNGLinuxDriver@microchip.com, "Russell King (Oracle)" , devicetree@vger.kernel.org Subject: [PATCH net-next v1 3/6] net: dsa: microchip: ksz9477: add Wake on LAN support Date: Thu, 20 Jul 2023 15:25:53 +0200 Message-Id: <20230720132556.57562-4-o.rempel@pengutronix.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230720132556.57562-1-o.rempel@pengutronix.de> References: <20230720132556.57562-1-o.rempel@pengutronix.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: ore@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add WoL support for KSZ9477 family of switches. This code was tested on KSZ8563 chip and supports only wake on Magic Packet for now. Other parts needed for fully operational WoL support are in the followup patches. Signed-off-by: Oleksij Rempel --- drivers/net/dsa/microchip/ksz9477.c | 71 ++++++++++++++++++++++++++ drivers/net/dsa/microchip/ksz9477.h | 4 ++ drivers/net/dsa/microchip/ksz_common.c | 41 +++++++++++++++ 3 files changed, 116 insertions(+) diff --git a/drivers/net/dsa/microchip/ksz9477.c b/drivers/net/dsa/microchip/ksz9477.c index ce5fb3ea26dfa..56c8fb9f0379a 100644 --- a/drivers/net/dsa/microchip/ksz9477.c +++ b/drivers/net/dsa/microchip/ksz9477.c @@ -56,6 +56,74 @@ int ksz9477_change_mtu(struct ksz_device *dev, int port, int mtu) REG_SW_MTU_MASK, frame_size); } +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) + dev_dbg(dev->dev, "Wake event on port %d due to: %s %s %s\n", + port, + pme_status & PME_WOL_MAGICPKT ? "\"Magic Packet\"" : "", + pme_status & PME_WOL_LINKUP ? "\"Link Up\"" : "", + pme_status & PME_WOL_ENERGY ? "\"Enery detect\"" : ""); + + return ksz_pwrite8(dev, port, REG_PORT_PME_STATUS, pme_status); +} + +void ksz9477_get_wol(struct ksz_device *dev, int port, + struct ethtool_wolinfo *wol) +{ + u8 pme_ctrl, pme_conf; + int ret; + + ret = ksz_read8(dev, REG_SW_PME_CTRL, &pme_conf); + if (ret) + return; + + if (!(pme_conf & PME_ENABLE)) + return; + + wol->supported = WAKE_MAGIC; + + ret = ksz_pread8(dev, port, REG_PORT_PME_CTRL, &pme_ctrl); + if (ret) + return; + + if (pme_ctrl & PME_WOL_MAGICPKT) + wol->wolopts |= WAKE_MAGIC; +} + +int ksz9477_set_wol(struct ksz_device *dev, int port, + struct ethtool_wolinfo *wol) +{ + u8 pme_conf, pme_ctrl = 0; + int ret; + + if (wol->wolopts & ~WAKE_MAGIC) + return -EINVAL; + + ret = ksz_read8(dev, REG_SW_PME_CTRL, &pme_conf); + if (ret) + return ret; + + if (!(pme_conf & PME_ENABLE)) + return -EOPNOTSUPP; + + ret = ksz9477_handle_wake_reason(dev, port); + if (ret) + return ret; + + if (wol->wolopts & WAKE_MAGIC) + pme_ctrl |= PME_WOL_MAGICPKT; + + return ksz_pwrite8(dev, port, REG_PORT_PME_CTRL, pme_ctrl); +} + static int ksz9477_wait_vlan_ctrl_ready(struct ksz_device *dev) { unsigned int val; @@ -1004,6 +1072,9 @@ void ksz9477_port_setup(struct ksz_device *dev, int port, bool cpu_port) /* clear pending interrupts */ if (dev->info->internal_phy[port]) ksz_pread16(dev, port, REG_PORT_PHY_INT_ENABLE, &data16); + + /* clear pending wake flags */ + ksz9477_handle_wake_reason(dev, port); } void ksz9477_config_cpu_port(struct dsa_switch *ds) diff --git a/drivers/net/dsa/microchip/ksz9477.h b/drivers/net/dsa/microchip/ksz9477.h index 27171482d0556..f972b6e7f1d12 100644 --- a/drivers/net/dsa/microchip/ksz9477.h +++ b/drivers/net/dsa/microchip/ksz9477.h @@ -58,6 +58,10 @@ int ksz9477_dsa_init(struct ksz_device *dev); int ksz9477_switch_init(struct ksz_device *dev); void ksz9477_switch_exit(struct ksz_device *dev); void ksz9477_port_queue_split(struct ksz_device *dev, int port); +void ksz9477_get_wol(struct ksz_device *dev, int port, + struct ethtool_wolinfo *wol); +int ksz9477_set_wol(struct ksz_device *dev, int port, + struct ethtool_wolinfo *wol); int ksz9477_port_acl_init(struct ksz_device *dev, int port); int ksz9477_cls_flower_add(struct dsa_switch *ds, int port, diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/microchip/ksz_common.c index 87e363fb300fe..eb67bb520934d 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c @@ -2819,6 +2819,45 @@ static int ksz_cls_flower_del(struct dsa_switch *ds, int port, return -EOPNOTSUPP; } +static void ksz_get_wol(struct dsa_switch *ds, int port, + struct ethtool_wolinfo *wol) +{ + struct ksz_device *dev = ds->priv; + + memset(wol, 0, sizeof(*wol)); + + switch (dev->chip_id) { + case KSZ8563_CHIP_ID: + case KSZ9477_CHIP_ID: + case KSZ9563_CHIP_ID: + case KSZ9567_CHIP_ID: + case KSZ9893_CHIP_ID: + case KSZ9896_CHIP_ID: + case KSZ9897_CHIP_ID: + ksz9477_get_wol(dev, port, wol); + return; + } +} + +static int ksz_set_wol(struct dsa_switch *ds, int port, + struct ethtool_wolinfo *wol) +{ + struct ksz_device *dev = ds->priv; + + switch (dev->chip_id) { + case KSZ8563_CHIP_ID: + case KSZ9477_CHIP_ID: + case KSZ9563_CHIP_ID: + case KSZ9567_CHIP_ID: + case KSZ9893_CHIP_ID: + case KSZ9896_CHIP_ID: + case KSZ9897_CHIP_ID: + return ksz9477_set_wol(dev, port, wol); + } + + return -EOPNOTSUPP; +} + static void ksz_set_xmii(struct ksz_device *dev, int port, phy_interface_t interface) { @@ -3497,6 +3536,8 @@ static const struct dsa_switch_ops ksz_switch_ops = { .set_mac_eee = ksz_set_mac_eee, .cls_flower_add = ksz_cls_flower_add, .cls_flower_del = ksz_cls_flower_del, + .get_wol = ksz_get_wol, + .set_wol = ksz_set_wol, }; struct ksz_device *ksz_switch_alloc(struct device *base, void *priv) -- 2.39.2