From patchwork Mon Jan 30 08:07:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oleksij Rempel X-Patchwork-Id: 50173 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp2061818wrn; Mon, 30 Jan 2023 00:08:31 -0800 (PST) X-Google-Smtp-Source: AK7set8Ohn9rVIu7UpSXWf3PKWKwij5JTSOvfuz67H3r7xIH7PLmARWJ7EuFHqLNsL1lSgHNWvdU X-Received: by 2002:a05:6402:3455:b0:4a2:4274:588f with SMTP id l21-20020a056402345500b004a24274588fmr4319941edc.24.1675066110979; Mon, 30 Jan 2023 00:08:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1675066110; cv=none; d=google.com; s=arc-20160816; b=L5Ya6yhkk1mRZ6aG4xVDfjOx+j6Wo9f+1wUQGF9NyBo8HfIBLrhEm5W7dqTfbwGWTd TfDykdGp94UkYXN2a/i/FH05qoSWywhlScEejBsDJCPirRiVFvAqGMGCeVyq9AOH6MJ5 RBG9QqOvcRNf0UFJLmAsl3eKl7eaNtj9ee2m3RsTKYLDtYZRUk44mzGFOW7W8jl/6Mmw IvVyP3/ukDMdz35VPRZ/ULOPJPqdgCZAnanZmoS8j+ej4yrg2ALlv0dy7YMdbLf6fkky eKwD5zOIcKgnU9w4iAIVs6f4yI9lgYkeOE6vkI6Ibme0F658V15+SjNZveLxO1wRif+9 T1xg== 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=Eyu7OGmS0PeH6ZMYI0PnhNjTAC4G2r5GmaoqV5VIhlA=; b=yu6jwZ/XmfyHPIVINxIcQ9oOBhc5BgV7axv/+1Mnob/LvDteqy87VSpiCQzf9UVns3 EAmZ/4LRhmYcTy2oYbAt37aSd5BxsbLiw2h1vi8hFoECPnnGswaHfAwzymkwLShOP66w KUdnaSRTPCMvkjzF6WsjfOAMMPfAmw0LSpS2dWe71wBEqK22pp1YDwqpqo8IP2tkdCG8 +n4zIV+WwREUlXIA6Nf6o18Rb82ISAxVeZLyQ9OCtFrfdhuBma1LH9cytImBd5Fwwbf8 OV4WdDroFMm1oFYKr8lWuDB9fNLtM7G0V08s/PBQjC5zKIYekc8p9vpu4S2apZg/kSMh IP9w== 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 Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id eu3-20020a170907298300b0086ea1c7ae21si16477492ejc.54.2023.01.30.00.08.07; Mon, 30 Jan 2023 00:08:30 -0800 (PST) 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 S235759AbjA3IHs (ORCPT + 99 others); Mon, 30 Jan 2023 03:07:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59994 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235583AbjA3IHc (ORCPT ); Mon, 30 Jan 2023 03:07:32 -0500 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 B02922943E for ; Mon, 30 Jan 2023 00:07:29 -0800 (PST) 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 1pMPCB-0003fB-2a; Mon, 30 Jan 2023 09:07:19 +0100 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 1pMPCA-001PwE-QD; Mon, 30 Jan 2023 09:07:17 +0100 Received: from ore by dude04.red.stw.pengutronix.de with local (Exim 4.94.2) (envelope-from ) id 1pMPC7-000aKS-Mo; Mon, 30 Jan 2023 09:07:15 +0100 From: Oleksij Rempel To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vivien Didelot , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Oleksij Rempel , kernel@pengutronix.de, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, Arun.Ramadoss@microchip.com Subject: [PATCH net-next v3 10/15] net: phy: at803x: implement ethtool access to SmartEEE functionality Date: Mon, 30 Jan 2023 09:07:09 +0100 Message-Id: <20230130080714.139492-11-o.rempel@pengutronix.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230130080714.139492-1-o.rempel@pengutronix.de> References: <20230130080714.139492-1-o.rempel@pengutronix.de> MIME-Version: 1.0 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 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 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1756434122061530960?= X-GMAIL-MSGID: =?utf-8?q?1756434122061530960?= If AR8035 PHY is used with a MAC without EEE support (iMX6, etc), then we need to process ethtool_eee::tx_lpi_timer and tx_lpi_enabled by the PHY driver. So, add get/set_eee support for this functionality. Signed-off-by: Oleksij Rempel --- drivers/net/phy/at803x.c | 109 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 104 insertions(+), 5 deletions(-) diff --git a/drivers/net/phy/at803x.c b/drivers/net/phy/at803x.c index 22f4458274aa..9eb4439b0afc 100644 --- a/drivers/net/phy/at803x.c +++ b/drivers/net/phy/at803x.c @@ -166,8 +166,18 @@ #define AT803X_MMD3_SMARTEEE_CTL1 0x805b #define AT803X_MMD3_SMARTEEE_CTL2 0x805c +#define AT803X_MMD3_SMARTEEE_LPI_TIME_LOW GENMASK(15, 0) +#define AT803X_MMD3_SMARTEEE_LPI_TIME_15_0 GENMASK(15, 0) #define AT803X_MMD3_SMARTEEE_CTL3 0x805d #define AT803X_MMD3_SMARTEEE_CTL3_LPI_EN BIT(8) +#define AT803X_MMD3_SMARTEEE_LPI_TIME_HIGH GENMASK(7, 0) +#define AT803X_MMD3_SMARTEEE_LPI_TIME_23_16 GENMASK(23, 16) +/* Tx LPI timer resolution */ +#define AT803X_MMD3_SMARTEEE_LPI_TIME_RESOL_NS 163840 +#define AT803X_MMD3_SMARTEEE_LPI_TIME_MAX_US \ + ((GENMASK(23, 0) * AT803X_MMD3_SMARTEEE_LPI_TIME_RESOL_NS) / \ + NSEC_PER_USEC) +#define AT803X_MMD3_SMARTEEE_LPI_TIME_DEF_US 335544 #define ATH9331_PHY_ID 0x004dd041 #define ATH8030_PHY_ID 0x004dd076 @@ -951,17 +961,26 @@ static int at803x_get_features(struct phy_device *phydev) return 0; } -static int at803x_smarteee_config(struct phy_device *phydev) +static int at803x_smarteee_config(struct phy_device *phydev, bool enable, + u32 tx_lpi_timer_us) { struct at803x_priv *priv = phydev->priv; + u64 tx_lpi_timer_raw; + u64 tx_lpi_timer_ns; u16 mask = 0, val = 0; int ret; - if (priv->flags & AT803X_DISABLE_SMARTEEE) + if (priv->flags & AT803X_DISABLE_SMARTEEE || !enable) return phy_modify_mmd(phydev, MDIO_MMD_PCS, AT803X_MMD3_SMARTEEE_CTL3, AT803X_MMD3_SMARTEEE_CTL3_LPI_EN, 0); + if (tx_lpi_timer_us > AT803X_MMD3_SMARTEEE_LPI_TIME_MAX_US) { + phydev_err(phydev, "Max LPI timer is %lu microsecs\n", + AT803X_MMD3_SMARTEEE_LPI_TIME_MAX_US); + return -EINVAL; + } + if (priv->smarteee_lpi_tw_1g) { mask |= 0xff00; val |= priv->smarteee_lpi_tw_1g << 8; @@ -978,9 +997,27 @@ static int at803x_smarteee_config(struct phy_device *phydev) if (ret) return ret; + tx_lpi_timer_ns = tx_lpi_timer_us * NSEC_PER_USEC; + tx_lpi_timer_raw = + DIV_ROUND_CLOSEST_ULL(tx_lpi_timer_ns, + AT803X_MMD3_SMARTEEE_LPI_TIME_RESOL_NS); + val = FIELD_PREP(AT803X_MMD3_SMARTEEE_LPI_TIME_LOW, + FIELD_GET(AT803X_MMD3_SMARTEEE_LPI_TIME_15_0, + tx_lpi_timer_raw)); + + ret = phy_write_mmd(phydev, MDIO_MMD_PCS, AT803X_MMD3_SMARTEEE_CTL2, + val); + if (ret) + return ret; + + val = AT803X_MMD3_SMARTEEE_CTL3_LPI_EN | + FIELD_PREP(AT803X_MMD3_SMARTEEE_LPI_TIME_HIGH, + FIELD_GET(AT803X_MMD3_SMARTEEE_LPI_TIME_23_16, + tx_lpi_timer_raw)); + return phy_modify_mmd(phydev, MDIO_MMD_PCS, AT803X_MMD3_SMARTEEE_CTL3, - AT803X_MMD3_SMARTEEE_CTL3_LPI_EN, - AT803X_MMD3_SMARTEEE_CTL3_LPI_EN); + AT803X_MMD3_SMARTEEE_CTL3_LPI_EN | + AT803X_MMD3_SMARTEEE_LPI_TIME_HIGH, val); } static int at803x_clk_out_config(struct phy_device *phydev) @@ -1067,7 +1104,8 @@ static int at803x_config_init(struct phy_device *phydev) if (ret < 0) return ret; - ret = at803x_smarteee_config(phydev); + ret = at803x_smarteee_config(phydev, true, + AT803X_MMD3_SMARTEEE_LPI_TIME_DEF_US); if (ret < 0) return ret; @@ -1612,6 +1650,65 @@ static int at803x_cable_test_start(struct phy_device *phydev) return 0; } +static int at803x_get_eee(struct phy_device *phydev, struct ethtool_eee *data) +{ + struct at803x_priv *priv = phydev->priv; + u32 tx_timer_raw; + u64 tx_timer_ns; + int ret; + + /* If SmartEEE is not enabled, it is expected that tx_lpi_* fields + * are processed by the MAC driver. + */ + if (priv->flags & AT803X_DISABLE_SMARTEEE) + return genphy_c45_ethtool_get_eee(phydev, data); + + ret = phy_read_mmd(phydev, MDIO_MMD_PCS, + AT803X_MMD3_SMARTEEE_CTL2); + tx_timer_raw = FIELD_PREP(AT803X_MMD3_SMARTEEE_LPI_TIME_15_0, + FIELD_GET(AT803X_MMD3_SMARTEEE_LPI_TIME_LOW, + ret)); + if (ret < 0) + return ret; + + ret = phy_read_mmd(phydev, MDIO_MMD_PCS, + AT803X_MMD3_SMARTEEE_CTL3); + if (ret < 0) + return ret; + + tx_timer_raw |= FIELD_PREP(AT803X_MMD3_SMARTEEE_LPI_TIME_23_16, + FIELD_GET(AT803X_MMD3_SMARTEEE_LPI_TIME_HIGH, + ret)); + tx_timer_ns = tx_timer_raw * AT803X_MMD3_SMARTEEE_LPI_TIME_RESOL_NS; + data->tx_lpi_timer = DIV_ROUND_CLOSEST_ULL(tx_timer_ns, NSEC_PER_USEC); + + data->tx_lpi_enabled = !!(ret & AT803X_MMD3_SMARTEEE_CTL3_LPI_EN); + + return genphy_c45_ethtool_get_eee(phydev, data); +} + +static int at803x_set_eee(struct phy_device *phydev, struct ethtool_eee *data) +{ + struct at803x_priv *priv = phydev->priv; + int ret; + + /* If SmartEEE is not enabled, it is expected that tx_lpi_* fields + * are processed by the MAC driver. + */ + if (priv->flags & AT803X_DISABLE_SMARTEEE) + return genphy_c45_ethtool_set_eee(phydev, data); + + /* Changing Tx LPI on/off or Tx LPI timer settings + * do not require link reset. + */ + ret = at803x_smarteee_config(phydev, data->tx_lpi_enabled, + data->tx_lpi_timer); + if (ret) + return ret; + + return genphy_c45_ethtool_set_eee(phydev, data); +} + static int qca83xx_config_init(struct phy_device *phydev) { u8 switch_revision; @@ -2038,6 +2135,8 @@ static struct phy_driver at803x_driver[] = { .set_tunable = at803x_set_tunable, .cable_test_start = at803x_cable_test_start, .cable_test_get_status = at803x_cable_test_get_status, + .get_eee = at803x_get_eee, + .set_eee = at803x_set_eee, }, { /* Qualcomm Atheros AR8030 */ .phy_id = ATH8030_PHY_ID,