From nobody Thu Dec 18 15:32:00 2025 Received: from esa.microchip.iphmx.com (esa.microchip.iphmx.com [68.232.154.123]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B1247161311; Thu, 29 Aug 2024 05:56:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=68.232.154.123 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724910987; cv=none; b=VxVKE9grb1BYhuFBWVu9Q8n/md1ACxJ4iY4tQP03kimizGawbMytswEMZQVuyQIGszFFewhQjHRIH2FsmwKB48CrKkhFrlfnIAs6VUM1KARChB8p5CI1XA/s7B+uuCgUzEHPK5lChJzpqLrnPCRdrfs3WgsxVMXe0vfcI9qVMy0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724910987; c=relaxed/simple; bh=YdBrZxHdBahscSw6EW/xiRHXsEWL/k9PsI1ofj+B+J0=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=SmlT//hL91uTLJHMMhXAI0t7IL9MqLXTLYni18aMPNHniknk4KlJG251hdLjBEPoH1hTNPZFtxCw4oXRDJkEXw3C/1+pPDkylw1SPZGnWKCAlhxAAxYI2cqbJLFf+UqDapE7qCo4fzgeKo0r8DebXQ0J65dHVYLiOXg6Tv2r8ZQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com; spf=pass smtp.mailfrom=microchip.com; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b=k/5V2Gi3; arc=none smtp.client-ip=68.232.154.123 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=microchip.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="k/5V2Gi3" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1724910985; x=1756446985; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=YdBrZxHdBahscSw6EW/xiRHXsEWL/k9PsI1ofj+B+J0=; b=k/5V2Gi3UnyqkZBGZ3mXVX5Be01fPb4nSr2C5DoWxJGJmei53ODx0QVw 33yiCiMeoGTUuRSHeunwCwN2h+xbmEyUaOR+sYQS22K61OydMGWo6DjUs Vdep2v/fjgW+9BLl3tFWX2l+a/AO2/PrhJvKnWZ5FUWKhgdOGbGlxUVKU 8zS+4e4fO62uHfUwnu6RvyYYDgjOAD5oJCYnnxKBN0ZN0fRdBiGwmiXbW 5v53pS3aUpNRdxwtSTnInvvA4Jna3/0yuHeexsg+ADH7pfu+SyaJTxM+b uNmyDn2Rtxz6/VP7RiEcuoGkrOCgq2YTp+DsER2zYSgcI6P+/A4AezGf4 Q==; X-CSE-ConnectionGUID: djzvXQheSJmlEkJDxQRq3A== X-CSE-MsgGUID: oGIzLZSKRNWtHv+lL8SuuA== X-IronPort-AV: E=Sophos;i="6.10,184,1719903600"; d="scan'208";a="30971356" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa4.microchip.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 28 Aug 2024 22:56:24 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex02.mchp-main.com (10.10.85.144) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Wed, 28 Aug 2024 22:55:25 -0700 Received: from HYD-DK-UNGSW21.microchip.com (10.10.85.11) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server id 15.1.2507.35 via Frontend Transport; Wed, 28 Aug 2024 22:55:21 -0700 From: Raju Lakkaraju To: CC: , , , , , , , , , , , , Subject: [PATCH net-next V4 1/5] net: phylink: Add phylink_set_fixed_link() to configure fixed link state in phylink Date: Thu, 29 Aug 2024 11:21:28 +0530 Message-ID: <20240829055132.79638-2-Raju.Lakkaraju@microchip.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240829055132.79638-1-Raju.Lakkaraju@microchip.com> References: <20240829055132.79638-1-Raju.Lakkaraju@microchip.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Russell King The function allows for the configuration of a fixed link state for a given phylink instance. This addition is particularly useful for network devices = that operate with a fixed link configuration, where the link parameters do not c= hange dynamically. By using `phylink_set_fixed_link()`, drivers can easily set up the fixed link state during initialization or configuration changes. Signed-off-by: Russell King Signed-off-by: Raju Lakkaraju Reviewed-by: Andrew Lunn --- Change List: =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D V0 -> V1: - Change phylink fixed-link function header's string from "Returns" to = =20 "Returns:"=20 - Add fixed-link patch along with this series. = =20 Note: Note: This code was developed by Mr.Russell King = =20 Ref: = =20 https://lore.kernel.org/netdev/LV8PR11MB8700C786F5F1C274C73036CC9F8E2@L= V8PR11MB8700.namprd11.prod.outlook.com/T/#me943adf54f1ea082edf294aba448fa00= 3a116815 drivers/net/phy/phylink.c | 42 +++++++++++++++++++++++++++++++++++++++ include/linux/phylink.h | 2 ++ 2 files changed, 44 insertions(+) diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c index ab4e9fc03017..4309317de3d1 100644 --- a/drivers/net/phy/phylink.c +++ b/drivers/net/phy/phylink.c @@ -1635,6 +1635,48 @@ static int phylink_register_sfp(struct phylink *pl, return ret; } =20 +/** + * phylink_set_fixed_link() - set the fixed link + * @pl: a pointer to a &struct phylink returned from phylink_create() + * @state: a pointer to a struct phylink_link_state. + * + * This function is used when the link parameters are known and do not cha= nge, + * making it suitable for certain types of network connections. + * + * Returns: zero on success or negative error code. + */ +int phylink_set_fixed_link(struct phylink *pl, + const struct phylink_link_state *state) +{ + const struct phy_setting *s; + unsigned long *adv; + + if (pl->cfg_link_an_mode !=3D MLO_AN_PHY || !state || + !test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) + return -EINVAL; + + s =3D phy_lookup_setting(state->speed, state->duplex, + pl->supported, true); + if (!s) + return -EINVAL; + + adv =3D pl->link_config.advertising; + linkmode_zero(adv); + linkmode_set_bit(s->bit, adv); + linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, adv); + + pl->link_config.speed =3D state->speed; + pl->link_config.duplex =3D state->duplex; + pl->link_config.link =3D 1; + pl->link_config.an_complete =3D 1; + + pl->cfg_link_an_mode =3D MLO_AN_FIXED; + pl->cur_link_an_mode =3D pl->cfg_link_an_mode; + + return 0; +} +EXPORT_SYMBOL_GPL(phylink_set_fixed_link); + /** * phylink_create() - create a phylink instance * @config: a pointer to the target &struct phylink_config diff --git a/include/linux/phylink.h b/include/linux/phylink.h index 2381e07429a2..5c01048860c4 100644 --- a/include/linux/phylink.h +++ b/include/linux/phylink.h @@ -598,6 +598,8 @@ int phylink_fwnode_phy_connect(struct phylink *pl, const struct fwnode_handle *fwnode, u32 flags); void phylink_disconnect_phy(struct phylink *); +int phylink_set_fixed_link(struct phylink *, + const struct phylink_link_state *); =20 void phylink_mac_change(struct phylink *, bool up); void phylink_pcs_change(struct phylink_pcs *, bool up); --=20 2.34.1 From nobody Thu Dec 18 15:32:00 2025 Received: from esa.microchip.iphmx.com (esa.microchip.iphmx.com [68.232.153.233]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A191114885B; Thu, 29 Aug 2024 05:56:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=68.232.153.233 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724910964; cv=none; b=LeqjQr8LSC+Vke7VMKEGla93oDZ4J2FVap7UlR1HL+sRzo861UvOworK7n1R2YmpNqyrU4ZlIQPU+gWBuxpFmcf/buyzx45FXva2gW/aWAsVmwHbKaH601q/LDJwMIDJZkE6MB56LW8iuysnnf16nT7FUNDQnq7Dby+ZLmSSxTo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724910964; c=relaxed/simple; bh=9teBeLbG752fvmqwVne8I2h161HrNP0yCk9bUOtHgzI=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=K8gn8ZqFVUXF2xFqc29K5ay/1hD6T8vB8LkrJElvdGWXkSsAIEw0PCmYXQG3DTexajWLI3CHIY1KtoEf5A5Bpq+1NBJLpFW8eR54hmOJGVqpxQf3vm3CcJ6mZN3Jxaex4Vc+NKiSrnAivpJ6iRLYHzHKz538PEdS/sjpDHaEsQ8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com; spf=pass smtp.mailfrom=microchip.com; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b=t+GdHGU7; arc=none smtp.client-ip=68.232.153.233 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=microchip.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="t+GdHGU7" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1724910962; x=1756446962; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=9teBeLbG752fvmqwVne8I2h161HrNP0yCk9bUOtHgzI=; b=t+GdHGU7U+sgrQDOPehaZrqIf28/UZG3k5OMe0m6ImiSszsqko9i2CZ+ uNmF9QmCs/juGQlrHPP00yI6fXvswd+a6x/ol9M5x1rlziddxYXEgBWP4 JCGRAlhPgc/GoH0g1/XpvilH8dQsRxlrKgqcqJoMUGCSs4tkDb0LiFIGk 6p+5b4navXkAuntMplLTC2XBWHbhKWRe/DpaXmMeD+HA9Nb8/KeroqdfZ JNFqD66Q4iQjivXEZp8kdwMaH6DU2xXMB/9NeTx28ns5Afw5SgySPE2W8 YkJClLry68r1xxdBdY5Mz7hHCc3XPyoDdHrDE6GCE9GCZ2er9XpDilAnJ Q==; X-CSE-ConnectionGUID: 2MQclz5sT/+LITt4o2qSTg== X-CSE-MsgGUID: wPXtoDLHTluDukSsFfV9Fg== X-IronPort-AV: E=Sophos;i="6.10,184,1719903600"; d="scan'208";a="261978659" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa5.microchip.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 28 Aug 2024 22:55:59 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex02.mchp-main.com (10.10.85.144) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Wed, 28 Aug 2024 22:55:31 -0700 Received: from HYD-DK-UNGSW21.microchip.com (10.10.85.11) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server id 15.1.2507.35 via Frontend Transport; Wed, 28 Aug 2024 22:55:25 -0700 From: Raju Lakkaraju To: CC: , , , , , , , , , , , , Subject: [PATCH net-next V4 2/5] net: lan743x: Create separate PCS power reset function Date: Thu, 29 Aug 2024 11:21:29 +0530 Message-ID: <20240829055132.79638-3-Raju.Lakkaraju@microchip.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240829055132.79638-1-Raju.Lakkaraju@microchip.com> References: <20240829055132.79638-1-Raju.Lakkaraju@microchip.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Create separate PCS power reset function from lan743x_sgmii_config () to use as subroutine. Reviewed-by: Andrew Lunn Signed-off-by: Raju Lakkaraju --- Change List: =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D V3 -> V4: - No change V2 -> V3: - No change V1 -> V2: - No change drivers/net/ethernet/microchip/lan743x_main.c | 55 ++++++++++--------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/et= hernet/microchip/lan743x_main.c index e418539565b1..ce1e104adc20 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.c +++ b/drivers/net/ethernet/microchip/lan743x_main.c @@ -1147,12 +1147,39 @@ static int lan743x_pcs_seq_state(struct lan743x_ada= pter *adapter, u8 state) return 0; } =20 +static int lan743x_pcs_power_reset(struct lan743x_adapter *adapter) +{ + int mii_ctl; + int ret; + + /* SGMII/1000/2500BASE-X PCS power down */ + mii_ctl =3D lan743x_sgmii_read(adapter, MDIO_MMD_VEND2, MII_BMCR); + if (mii_ctl < 0) + return mii_ctl; + + mii_ctl |=3D BMCR_PDOWN; + ret =3D lan743x_sgmii_write(adapter, MDIO_MMD_VEND2, MII_BMCR, mii_ctl); + if (ret < 0) + return ret; + + ret =3D lan743x_pcs_seq_state(adapter, PCS_POWER_STATE_DOWN); + if (ret < 0) + return ret; + + /* SGMII/1000/2500BASE-X PCS power up */ + mii_ctl &=3D ~BMCR_PDOWN; + ret =3D lan743x_sgmii_write(adapter, MDIO_MMD_VEND2, MII_BMCR, mii_ctl); + if (ret < 0) + return ret; + + return lan743x_pcs_seq_state(adapter, PCS_POWER_STATE_UP); +} + static int lan743x_sgmii_config(struct lan743x_adapter *adapter) { struct net_device *netdev =3D adapter->netdev; struct phy_device *phydev =3D netdev->phydev; enum lan743x_sgmii_lsd lsd =3D POWER_DOWN; - int mii_ctl; bool status; int ret; =20 @@ -1209,31 +1236,7 @@ static int lan743x_sgmii_config(struct lan743x_adapt= er *adapter) netif_dbg(adapter, drv, adapter->netdev, "SGMII 1G mode enable\n"); =20 - /* SGMII/1000/2500BASE-X PCS power down */ - mii_ctl =3D lan743x_sgmii_read(adapter, MDIO_MMD_VEND2, MII_BMCR); - if (mii_ctl < 0) - return mii_ctl; - - mii_ctl |=3D BMCR_PDOWN; - ret =3D lan743x_sgmii_write(adapter, MDIO_MMD_VEND2, MII_BMCR, mii_ctl); - if (ret < 0) - return ret; - - ret =3D lan743x_pcs_seq_state(adapter, PCS_POWER_STATE_DOWN); - if (ret < 0) - return ret; - - /* SGMII/1000/2500BASE-X PCS power up */ - mii_ctl &=3D ~BMCR_PDOWN; - ret =3D lan743x_sgmii_write(adapter, MDIO_MMD_VEND2, MII_BMCR, mii_ctl); - if (ret < 0) - return ret; - - ret =3D lan743x_pcs_seq_state(adapter, PCS_POWER_STATE_UP); - if (ret < 0) - return ret; - - return 0; + return lan743x_pcs_power_reset(adapter); } =20 static void lan743x_mac_set_address(struct lan743x_adapter *adapter, --=20 2.34.1 From nobody Thu Dec 18 15:32:00 2025 Received: from esa.microchip.iphmx.com (esa.microchip.iphmx.com [68.232.153.233]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 34C3414A614; Thu, 29 Aug 2024 05:56:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=68.232.153.233 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724910964; cv=none; b=H/pWdhM0omeHR495Ca7JiH2mYZ/P/BA+HqJSbnX2YVuT9Y1eBLzL203X2FSBlcWR/7yufzIoLL5M769GVhHAfaTkN2vNjKwk6LLCtD9l3KPGy1I0Z7F5uC8Nj2VnbT/9XxR3KgqdM8RNTypbSG6LGlHXAPoRFue/7rSd35NaVqw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724910964; c=relaxed/simple; bh=sg6IqIT3QcAqXFdlSqjApvkm1f7yjny/b+aThUtqubI=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=hxX+9drkBrircKbR0CBrlMGG2LXtW/SdOhTV0ers8oyJOs721x5K3TCKX89gqxj39Y/LmdHMxvuZybpLVkMLrk2YCisW4n5XWp6Nvz/8BLFKcNcDtTNJVDUsXibMTzvMQpVKgXe0fo9TVlCcZ6mdV3mmY0CUGmtB0l0El9tHCEc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com; spf=pass smtp.mailfrom=microchip.com; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b=dmpII/D4; arc=none smtp.client-ip=68.232.153.233 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=microchip.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="dmpII/D4" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1724910963; x=1756446963; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=sg6IqIT3QcAqXFdlSqjApvkm1f7yjny/b+aThUtqubI=; b=dmpII/D4+iUVCdOQP/HFFPILyiQMPIioxhMe6JNk6a2RRr0rcywHp7Ga XI9IPmKDos6HC0D7+hXqRh3LVgRaFN7+cG8vIuGsEGUCqCl+RQlFeMjOK lpxXDMGpZGtpuu1Y7R1GMc7MiNL8K/3v2KWZuV+k+Whb3ZIMLRyD4Uc4l +ZpyD4Io70vGLPkK3FXESP+S/dMZzYopdtvAr5d7fqNVjWR6+nvV1Ekli runiseHXlGOmVq6qI9aZ3vqyYTm/0WBkOW8G2dFNP8JWhAdgOFUvgyZgp DoKah73fvRFNKg9OfukbzxVNAG6qnwUrKrvqzzBuLfDCXZaPIEgI5OsJw A==; X-CSE-ConnectionGUID: 2MQclz5sT/+LITt4o2qSTg== X-CSE-MsgGUID: 8ihwvZtzSge1nZwS2spPmw== X-IronPort-AV: E=Sophos;i="6.10,184,1719903600"; d="scan'208";a="261978660" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa5.microchip.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 28 Aug 2024 22:56:00 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex02.mchp-main.com (10.10.85.144) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Wed, 28 Aug 2024 22:55:36 -0700 Received: from HYD-DK-UNGSW21.microchip.com (10.10.85.11) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server id 15.1.2507.35 via Frontend Transport; Wed, 28 Aug 2024 22:55:31 -0700 From: Raju Lakkaraju To: CC: , , , , , , , , , , , , Subject: [PATCH net-next V4 3/5] net: lan743x: Create separate Link Speed Duplex state function Date: Thu, 29 Aug 2024 11:21:30 +0530 Message-ID: <20240829055132.79638-4-Raju.Lakkaraju@microchip.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240829055132.79638-1-Raju.Lakkaraju@microchip.com> References: <20240829055132.79638-1-Raju.Lakkaraju@microchip.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Create separate Link Speed Duplex (LSD) update state function from lan743x_sgmii_config () to use as subroutine. Reviewed-by: Andrew Lunn Signed-off-by: Raju Lakkaraju --- Change List: = =20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D = =20 V3 -> V4: - No change V2 -> V3: - No change V1 -> V2: = =20 - No change = =20 =20 drivers/net/ethernet/microchip/lan743x_main.c | 75 +++++++++++-------- 1 file changed, 45 insertions(+), 30 deletions(-) diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/et= hernet/microchip/lan743x_main.c index ce1e104adc20..b4a4c2840a83 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.c +++ b/drivers/net/ethernet/microchip/lan743x_main.c @@ -992,6 +992,42 @@ static int lan743x_sgmii_write(struct lan743x_adapter = *adapter, return ret; } =20 +static int lan743x_get_lsd(int speed, int duplex, u8 mss) +{ + int lsd; + + switch (speed) { + case SPEED_2500: + if (mss =3D=3D MASTER_SLAVE_STATE_SLAVE) + lsd =3D LINK_2500_SLAVE; + else + lsd =3D LINK_2500_MASTER; + break; + case SPEED_1000: + if (mss =3D=3D MASTER_SLAVE_STATE_SLAVE) + lsd =3D LINK_1000_SLAVE; + else + lsd =3D LINK_1000_MASTER; + break; + case SPEED_100: + if (duplex =3D=3D DUPLEX_FULL) + lsd =3D LINK_100FD; + else + lsd =3D LINK_100HD; + break; + case SPEED_10: + if (duplex =3D=3D DUPLEX_FULL) + lsd =3D LINK_10FD; + else + lsd =3D LINK_10HD; + break; + default: + lsd =3D -EINVAL; + } + + return lsd; +} + static int lan743x_sgmii_mpll_set(struct lan743x_adapter *adapter, u16 baud) { @@ -1179,42 +1215,21 @@ static int lan743x_sgmii_config(struct lan743x_adap= ter *adapter) { struct net_device *netdev =3D adapter->netdev; struct phy_device *phydev =3D netdev->phydev; - enum lan743x_sgmii_lsd lsd =3D POWER_DOWN; bool status; int ret; =20 - switch (phydev->speed) { - case SPEED_2500: - if (phydev->master_slave_state =3D=3D MASTER_SLAVE_STATE_MASTER) - lsd =3D LINK_2500_MASTER; - else - lsd =3D LINK_2500_SLAVE; - break; - case SPEED_1000: - if (phydev->master_slave_state =3D=3D MASTER_SLAVE_STATE_MASTER) - lsd =3D LINK_1000_MASTER; - else - lsd =3D LINK_1000_SLAVE; - break; - case SPEED_100: - if (phydev->duplex) - lsd =3D LINK_100FD; - else - lsd =3D LINK_100HD; - break; - case SPEED_10: - if (phydev->duplex) - lsd =3D LINK_10FD; - else - lsd =3D LINK_10HD; - break; - default: + ret =3D lan743x_get_lsd(phydev->speed, phydev->duplex, + phydev->master_slave_state); + if (ret < 0) { netif_err(adapter, drv, adapter->netdev, - "Invalid speed %d\n", phydev->speed); - return -EINVAL; + "error %d link-speed-duplex(LSD) invalid\n", ret); + return ret; } =20 - adapter->sgmii_lsd =3D lsd; + adapter->sgmii_lsd =3D ret; + netif_dbg(adapter, drv, adapter->netdev, + "Link Speed Duplex (lsd) : 0x%X\n", adapter->sgmii_lsd); + ret =3D lan743x_sgmii_aneg_update(adapter); if (ret < 0) { netif_err(adapter, drv, adapter->netdev, --=20 2.34.1 From nobody Thu Dec 18 15:32:00 2025 Received: from esa.microchip.iphmx.com (esa.microchip.iphmx.com [68.232.153.233]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7B2BA14EC5D; Thu, 29 Aug 2024 05:56:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=68.232.153.233 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724910966; cv=none; b=C8F3WFCr1nIU7pMY44m156ml/JQJQMkz96O4WyJfTNsOtvebIXERVc3zcE78c7v2CYj6W8drCyiTnw0r+zN0VW0vzMnOInE7e8qLunM8raSlW3VA70BWgpAn/fA6VR55AuietBDJQKBgZRiJ65srtunDgCVwhLFEnU1VOI6839w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724910966; c=relaxed/simple; bh=edEdCCAZtD0WOroumycbnXtVwzRb7i5enLvb6qOTwiY=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=UB/cYqz+n6N995LjMItrjtpfzd142f7KaJTmMsfDUPb8+VdH4HFrGpbKuSjVSz45qWHx7KC66rKiPY9ioJwAb6gYhbBQoKHL2mJdfCbv9qL+i/tAQSiwfo9etFcaRxyphadnYawpMJj8b+pWxzSrbVU1YBVNU2NDX0TIPA9qOHo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com; spf=pass smtp.mailfrom=microchip.com; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b=x80mFvCN; arc=none smtp.client-ip=68.232.153.233 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=microchip.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="x80mFvCN" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1724910964; x=1756446964; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=edEdCCAZtD0WOroumycbnXtVwzRb7i5enLvb6qOTwiY=; b=x80mFvCNLHomi3IbrFRdMZza1jrz2kVq8UV8XIiTyqyj1eSGDZsHf48z ZB2IdbqGb8N+qNcgsL4eB2cHXfiHAa7/ezShGXlC7lTyDvVavVJEVx7Ys eFi3sVRCc8XUwdjrP6t8hTKY5PvhWyknFMsts/EZln5rPFYuWHsM+JuNY 6GcaRxr4Uk3ggy9e2NtjYSzqAkULoexVqxx93CVTD3HPcE8Mdz+rjbAsy GaerkJD6kSQs0gbGhxedyqcKsvg4wAq6j4oOvqKfYEJWlN9+VCYJrxzXa C9m4sa9nQ5f8b+HBjejOqB527+HITEJTUU1GusEqaSa1lUoSiCMPFC47s w==; X-CSE-ConnectionGUID: 2MQclz5sT/+LITt4o2qSTg== X-CSE-MsgGUID: K5PVPhOGSLuOfvvYjMWD5w== X-IronPort-AV: E=Sophos;i="6.10,184,1719903600"; d="scan'208";a="261978661" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa5.microchip.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 28 Aug 2024 22:56:00 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex02.mchp-main.com (10.10.85.144) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Wed, 28 Aug 2024 22:55:41 -0700 Received: from HYD-DK-UNGSW21.microchip.com (10.10.85.11) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server id 15.1.2507.35 via Frontend Transport; Wed, 28 Aug 2024 22:55:36 -0700 From: Raju Lakkaraju To: CC: , , , , , , , , , , , , Subject: [PATCH net-next V4 4/5] net: lan743x: Migrate phylib to phylink Date: Thu, 29 Aug 2024 11:21:31 +0530 Message-ID: <20240829055132.79638-5-Raju.Lakkaraju@microchip.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240829055132.79638-1-Raju.Lakkaraju@microchip.com> References: <20240829055132.79638-1-Raju.Lakkaraju@microchip.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Migrate phy support from phylib to phylink. Signed-off-by: Raju Lakkaraju --- Change List: = =20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D = =20 V3 -> V4: = =20 - Add the Fixed-link by include the Russell King patch - Change lan743x_phylink_create( ) argument from netdev to adapter V2 -> V3: = =20 - Remove the unwanted parens in each of these if() sub-blocks = =20 - Replace "to_net_dev(config->dev)" with "netdev". = =20 - Add GMII_ID/RGMII_TXID/RGMII_RXID in supported_interfaces = =20 - Fix the lan743x_phy_handle_exists( ) return type V1 -> V2: = =20 - Split the PHYLINK and SFP changes in 2 different patch series = =20 =20 drivers/net/ethernet/microchip/Kconfig | 5 +- drivers/net/ethernet/microchip/lan743x_main.c | 599 +++++++++++------- drivers/net/ethernet/microchip/lan743x_main.h | 3 + 3 files changed, 382 insertions(+), 225 deletions(-) diff --git a/drivers/net/ethernet/microchip/Kconfig b/drivers/net/ethernet/= microchip/Kconfig index 43ba71e82260..4b7a0433b7e5 100644 --- a/drivers/net/ethernet/microchip/Kconfig +++ b/drivers/net/ethernet/microchip/Kconfig @@ -46,12 +46,13 @@ config LAN743X tristate "LAN743x support" depends on PCI depends on PTP_1588_CLOCK_OPTIONAL - select PHYLIB select FIXED_PHY select CRC16 select CRC32 + select PHYLINK help - Support for the Microchip LAN743x PCI Express Gigabit Ethernet chip + Support for the Microchip LAN743x and PCI11x1x families of PCI + Express Ethernet devices =20 To compile this driver as a module, choose M here. The module will be called lan743x. diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/et= hernet/microchip/lan743x_main.c index b4a4c2840a83..91e74e231251 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.c +++ b/drivers/net/ethernet/microchip/lan743x_main.c @@ -15,6 +15,7 @@ #include #include #include +#include #include "lan743x_main.h" #include "lan743x_ethtool.h" =20 @@ -1077,26 +1078,7 @@ static int lan743x_sgmii_2_5G_mode_set(struct lan743= x_adapter *adapter, VR_MII_BAUD_RATE_1P25GBPS); } =20 -static int lan743x_is_sgmii_2_5G_mode(struct lan743x_adapter *adapter, - bool *status) -{ - int ret; - - ret =3D lan743x_sgmii_read(adapter, MDIO_MMD_VEND2, - VR_MII_GEN2_4_MPLL_CTRL1); - if (ret < 0) - return ret; - - if (ret =3D=3D VR_MII_MPLL_MULTIPLIER_125 || - ret =3D=3D VR_MII_MPLL_MULTIPLIER_50) - *status =3D true; - else - *status =3D false; - - return 0; -} - -static int lan743x_sgmii_aneg_update(struct lan743x_adapter *adapter) +static int lan743x_serdes_clock_and_aneg_update(struct lan743x_adapter *ad= apter) { enum lan743x_sgmii_lsd lsd =3D adapter->sgmii_lsd; int mii_ctrl; @@ -1211,49 +1193,6 @@ static int lan743x_pcs_power_reset(struct lan743x_ad= apter *adapter) return lan743x_pcs_seq_state(adapter, PCS_POWER_STATE_UP); } =20 -static int lan743x_sgmii_config(struct lan743x_adapter *adapter) -{ - struct net_device *netdev =3D adapter->netdev; - struct phy_device *phydev =3D netdev->phydev; - bool status; - int ret; - - ret =3D lan743x_get_lsd(phydev->speed, phydev->duplex, - phydev->master_slave_state); - if (ret < 0) { - netif_err(adapter, drv, adapter->netdev, - "error %d link-speed-duplex(LSD) invalid\n", ret); - return ret; - } - - adapter->sgmii_lsd =3D ret; - netif_dbg(adapter, drv, adapter->netdev, - "Link Speed Duplex (lsd) : 0x%X\n", adapter->sgmii_lsd); - - ret =3D lan743x_sgmii_aneg_update(adapter); - if (ret < 0) { - netif_err(adapter, drv, adapter->netdev, - "error %d SGMII cfg failed\n", ret); - return ret; - } - - ret =3D lan743x_is_sgmii_2_5G_mode(adapter, &status); - if (ret < 0) { - netif_err(adapter, drv, adapter->netdev, - "error %d SGMII get mode failed\n", ret); - return ret; - } - - if (status) - netif_dbg(adapter, drv, adapter->netdev, - "SGMII 2.5G mode enable\n"); - else - netif_dbg(adapter, drv, adapter->netdev, - "SGMII 1G mode enable\n"); - - return lan743x_pcs_power_reset(adapter); -} - static void lan743x_mac_set_address(struct lan743x_adapter *adapter, u8 *addr) { @@ -1407,103 +1346,11 @@ static int lan743x_phy_reset(struct lan743x_adapte= r *adapter) 50000, 1000000); } =20 -static void lan743x_phy_update_flowcontrol(struct lan743x_adapter *adapter, - u16 local_adv, u16 remote_adv) -{ - struct lan743x_phy *phy =3D &adapter->phy; - u8 cap; - - if (phy->fc_autoneg) - cap =3D mii_resolve_flowctrl_fdx(local_adv, remote_adv); - else - cap =3D phy->fc_request_control; - - lan743x_mac_flow_ctrl_set_enables(adapter, - cap & FLOW_CTRL_TX, - cap & FLOW_CTRL_RX); -} - static int lan743x_phy_init(struct lan743x_adapter *adapter) { return lan743x_phy_reset(adapter); } =20 -static void lan743x_phy_link_status_change(struct net_device *netdev) -{ - struct lan743x_adapter *adapter =3D netdev_priv(netdev); - struct phy_device *phydev =3D netdev->phydev; - u32 data; - - phy_print_status(phydev); - if (phydev->state =3D=3D PHY_RUNNING) { - int remote_advertisement =3D 0; - int local_advertisement =3D 0; - - data =3D lan743x_csr_read(adapter, MAC_CR); - - /* set duplex mode */ - if (phydev->duplex) - data |=3D MAC_CR_DPX_; - else - data &=3D ~MAC_CR_DPX_; - - /* set bus speed */ - switch (phydev->speed) { - case SPEED_10: - data &=3D ~MAC_CR_CFG_H_; - data &=3D ~MAC_CR_CFG_L_; - break; - case SPEED_100: - data &=3D ~MAC_CR_CFG_H_; - data |=3D MAC_CR_CFG_L_; - break; - case SPEED_1000: - data |=3D MAC_CR_CFG_H_; - data &=3D ~MAC_CR_CFG_L_; - break; - case SPEED_2500: - data |=3D MAC_CR_CFG_H_; - data |=3D MAC_CR_CFG_L_; - break; - } - lan743x_csr_write(adapter, MAC_CR, data); - - local_advertisement =3D - linkmode_adv_to_mii_adv_t(phydev->advertising); - remote_advertisement =3D - linkmode_adv_to_mii_adv_t(phydev->lp_advertising); - - lan743x_phy_update_flowcontrol(adapter, local_advertisement, - remote_advertisement); - lan743x_ptp_update_latency(adapter, phydev->speed); - if (phydev->interface =3D=3D PHY_INTERFACE_MODE_SGMII || - phydev->interface =3D=3D PHY_INTERFACE_MODE_1000BASEX || - phydev->interface =3D=3D PHY_INTERFACE_MODE_2500BASEX) - lan743x_sgmii_config(adapter); - - data =3D lan743x_csr_read(adapter, MAC_CR); - if (phydev->enable_tx_lpi) - data |=3D MAC_CR_EEE_EN_; - else - data &=3D ~MAC_CR_EEE_EN_; - lan743x_csr_write(adapter, MAC_CR, data); - } -} - -static void lan743x_phy_close(struct lan743x_adapter *adapter) -{ - struct net_device *netdev =3D adapter->netdev; - struct phy_device *phydev =3D netdev->phydev; - - phy_stop(netdev->phydev); - phy_disconnect(netdev->phydev); - - /* using phydev here as phy_disconnect NULLs netdev->phydev */ - if (phy_is_pseudo_fixed_link(phydev)) - fixed_phy_unregister(phydev); - -} - static void lan743x_phy_interface_select(struct lan743x_adapter *adapter) { u32 id_rev; @@ -1520,65 +1367,9 @@ static void lan743x_phy_interface_select(struct lan7= 43x_adapter *adapter) adapter->phy_interface =3D PHY_INTERFACE_MODE_MII; else adapter->phy_interface =3D PHY_INTERFACE_MODE_RGMII; -} - -static int lan743x_phy_open(struct lan743x_adapter *adapter) -{ - struct net_device *netdev =3D adapter->netdev; - struct lan743x_phy *phy =3D &adapter->phy; - struct fixed_phy_status fphy_status =3D { - .link =3D 1, - .speed =3D SPEED_1000, - .duplex =3D DUPLEX_FULL, - }; - struct phy_device *phydev; - int ret =3D -EIO; - - /* try devicetree phy, or fixed link */ - phydev =3D of_phy_get_and_connect(netdev, adapter->pdev->dev.of_node, - lan743x_phy_link_status_change); - - if (!phydev) { - /* try internal phy */ - phydev =3D phy_find_first(adapter->mdiobus); - if (!phydev) { - if ((adapter->csr.id_rev & ID_REV_ID_MASK_) =3D=3D - ID_REV_ID_LAN7431_) { - phydev =3D fixed_phy_register(PHY_POLL, - &fphy_status, NULL); - if (IS_ERR(phydev)) { - netdev_err(netdev, "No PHY/fixed_PHY found\n"); - return PTR_ERR(phydev); - } - } else { - goto return_error; - } - } =20 - lan743x_phy_interface_select(adapter); - - ret =3D phy_connect_direct(netdev, phydev, - lan743x_phy_link_status_change, - adapter->phy_interface); - if (ret) - goto return_error; - } - - /* MAC doesn't support 1000T Half */ - phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_1000baseT_Half_BIT); - - /* support both flow controls */ - phy_support_asym_pause(phydev); - phy->fc_request_control =3D (FLOW_CTRL_RX | FLOW_CTRL_TX); - phy->fc_autoneg =3D phydev->autoneg; - - phy_start(phydev); - phy_start_aneg(phydev); - phy_attached_info(phydev); - return 0; - -return_error: - return ret; + netif_dbg(adapter, drv, adapter->netdev, + "selected phy interface: 0x%X\n", adapter->phy_interface); } =20 static void lan743x_rfe_open(struct lan743x_adapter *adapter) @@ -3079,6 +2870,350 @@ static int lan743x_rx_open(struct lan743x_rx *rx) return ret; } =20 +static int lan743x_phylink_sgmii_config(struct lan743x_adapter *adapter) +{ + u32 sgmii_ctl; + int ret; + + ret =3D lan743x_get_lsd(SPEED_1000, DUPLEX_FULL, + MASTER_SLAVE_STATE_MASTER); + if (ret < 0) { + netif_err(adapter, drv, adapter->netdev, + "error %d link-speed-duplex(LSD) invalid\n", ret); + return ret; + } + + adapter->sgmii_lsd =3D ret; + netif_dbg(adapter, drv, adapter->netdev, + "Link Speed Duplex (lsd) : 0x%X\n", adapter->sgmii_lsd); + + /* LINK_STATUS_SOURCE from the External PHY via SGMII */ + sgmii_ctl =3D lan743x_csr_read(adapter, SGMII_CTL); + sgmii_ctl &=3D ~SGMII_CTL_LINK_STATUS_SOURCE_; + lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl); + + ret =3D lan743x_serdes_clock_and_aneg_update(adapter); + if (ret < 0) { + netif_err(adapter, drv, adapter->netdev, + "error %d sgmii aneg update failed\n", ret); + return ret; + } + + return lan743x_pcs_power_reset(adapter); +} + +static int lan743x_phylink_1000basex_config(struct lan743x_adapter *adapte= r) +{ + u32 sgmii_ctl; + int ret; + + ret =3D lan743x_get_lsd(SPEED_1000, DUPLEX_FULL, + MASTER_SLAVE_STATE_MASTER); + if (ret < 0) { + netif_err(adapter, drv, adapter->netdev, + "error %d link-speed-duplex(LSD) invalid\n", ret); + return ret; + } + + adapter->sgmii_lsd =3D ret; + netif_dbg(adapter, drv, adapter->netdev, + "Link Speed Duplex (lsd) : 0x%X\n", adapter->sgmii_lsd); + + /* LINK_STATUS_SOURCE from 1000BASE-X PCS link status */ + sgmii_ctl =3D lan743x_csr_read(adapter, SGMII_CTL); + sgmii_ctl |=3D SGMII_CTL_LINK_STATUS_SOURCE_; + lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl); + + ret =3D lan743x_serdes_clock_and_aneg_update(adapter); + if (ret < 0) { + netif_err(adapter, drv, adapter->netdev, + "error %d 1000basex aneg update failed\n", ret); + return ret; + } + + return lan743x_pcs_power_reset(adapter); +} + +static int lan743x_phylink_2500basex_config(struct lan743x_adapter *adapte= r) +{ + u32 sgmii_ctl; + int ret; + + ret =3D lan743x_get_lsd(SPEED_2500, DUPLEX_FULL, + MASTER_SLAVE_STATE_MASTER); + if (ret < 0) { + netif_err(adapter, drv, adapter->netdev, + "error %d link-speed-duplex(LSD) invalid\n", ret); + return ret; + } + + adapter->sgmii_lsd =3D ret; + netif_dbg(adapter, drv, adapter->netdev, + "Link Speed Duplex (lsd) : 0x%X\n", adapter->sgmii_lsd); + + /* LINK_STATUS_SOURCE from 2500BASE-X PCS link status */ + sgmii_ctl =3D lan743x_csr_read(adapter, SGMII_CTL); + sgmii_ctl |=3D SGMII_CTL_LINK_STATUS_SOURCE_; + lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl); + + ret =3D lan743x_serdes_clock_and_aneg_update(adapter); + if (ret < 0) { + netif_err(adapter, drv, adapter->netdev, + "error %d 2500basex aneg update failed\n", ret); + return ret; + } + + return lan743x_pcs_power_reset(adapter); +} + +static void lan743x_phylink_mac_config(struct phylink_config *config, + unsigned int link_an_mode, + const struct phylink_link_state *state) +{ + struct net_device *netdev =3D to_net_dev(config->dev); + struct lan743x_adapter *adapter =3D netdev_priv(netdev); + int ret; + + switch (state->interface) { + case PHY_INTERFACE_MODE_2500BASEX: + ret =3D lan743x_phylink_2500basex_config(adapter); + if (ret < 0) + netif_err(adapter, drv, adapter->netdev, + "2500BASEX config failed. Error %d\n", ret); + else + netif_dbg(adapter, drv, adapter->netdev, + "2500BASEX mode selected and configured\n"); + break; + case PHY_INTERFACE_MODE_1000BASEX: + ret =3D lan743x_phylink_1000basex_config(adapter); + if (ret < 0) + netif_err(adapter, drv, adapter->netdev, + "1000BASEX config failed. Error %d\n", ret); + else + netif_dbg(adapter, drv, adapter->netdev, + "1000BASEX mode selected and configured\n"); + break; + case PHY_INTERFACE_MODE_SGMII: + ret =3D lan743x_phylink_sgmii_config(adapter); + if (ret < 0) + netif_err(adapter, drv, adapter->netdev, + "SGMII config failed. Error %d\n", ret); + else + netif_dbg(adapter, drv, adapter->netdev, + "SGMII mode selected and configured\n"); + break; + default: + netif_dbg(adapter, drv, adapter->netdev, + "RGMII/GMII/MII(0x%X) mode enable\n", state->interface); + break; + } +} + +static void lan743x_phylink_mac_link_down(struct phylink_config *config, + unsigned int link_an_mode, + phy_interface_t interface) +{ + netif_tx_stop_all_queues(to_net_dev(config->dev)); +} + +static void lan743x_phylink_mac_link_up(struct phylink_config *config, + struct phy_device *phydev, + unsigned int link_an_mode, + phy_interface_t interface, + int speed, int duplex, + bool tx_pause, bool rx_pause) +{ + struct net_device *netdev =3D to_net_dev(config->dev); + struct lan743x_adapter *adapter =3D netdev_priv(netdev); + int mac_cr; + u8 cap; + + mac_cr =3D lan743x_csr_read(adapter, MAC_CR); + /* Pre-initialize register bits. + * Resulting value corresponds to SPEED_10 + */ + mac_cr &=3D ~(MAC_CR_CFG_H_ | MAC_CR_CFG_L_); + if (speed =3D=3D SPEED_2500) + mac_cr |=3D MAC_CR_CFG_H_ | MAC_CR_CFG_L_; + else if (speed =3D=3D SPEED_1000) + mac_cr |=3D MAC_CR_CFG_H_; + else if (speed =3D=3D SPEED_100) + mac_cr |=3D MAC_CR_CFG_L_; + + lan743x_csr_write(adapter, MAC_CR, mac_cr); + + lan743x_ptp_update_latency(adapter, speed); + + /* Flow Control operation */ + cap =3D 0; + if (tx_pause) + cap |=3D FLOW_CTRL_TX; + if (rx_pause) + cap |=3D FLOW_CTRL_RX; + + lan743x_mac_flow_ctrl_set_enables(adapter, + cap & FLOW_CTRL_TX, + cap & FLOW_CTRL_RX); + + netif_tx_wake_all_queues(netdev); +} + +static const struct phylink_mac_ops lan743x_phylink_mac_ops =3D { + .mac_config =3D lan743x_phylink_mac_config, + .mac_link_down =3D lan743x_phylink_mac_link_down, + .mac_link_up =3D lan743x_phylink_mac_link_up, +}; + +static struct { + unsigned long mask; + int speed; + int duplex; +} lan743x_mac_caps_params[] =3D { + { MAC_2500FD, SPEED_2500, DUPLEX_FULL }, + { MAC_1000FD, SPEED_1000, DUPLEX_FULL }, + { MAC_100FD, SPEED_100, DUPLEX_FULL }, + { MAC_10FD, SPEED_10, DUPLEX_FULL }, + { MAC_100HD, SPEED_100, DUPLEX_HALF }, + { MAC_10HD, SPEED_10, DUPLEX_HALF }, +}; + +static int lan743x_find_max_speed(unsigned long caps, int *speed, int *dup= lex) +{ + int i; + + *speed =3D SPEED_UNKNOWN; + *duplex =3D DUPLEX_UNKNOWN; + for (i =3D 0; i < ARRAY_SIZE(lan743x_mac_caps_params); i++) { + if (caps & lan743x_mac_caps_params[i].mask) { + *speed =3D lan743x_mac_caps_params[i].speed; + *duplex =3D lan743x_mac_caps_params[i].duplex; + break; + } + } + + return *speed =3D=3D SPEED_UNKNOWN ? -EINVAL : 0; +} + +static int lan743x_phylink_create(struct lan743x_adapter *adapter) +{ + struct net_device *netdev =3D adapter->netdev; + struct phylink *pl; + + adapter->phylink_config.dev =3D &netdev->dev; + adapter->phylink_config.type =3D PHYLINK_NETDEV; + adapter->phylink_config.mac_managed_pm =3D false; + + adapter->phylink_config.mac_capabilities =3D MAC_ASYM_PAUSE | + MAC_SYM_PAUSE | MAC_10 | MAC_100 | MAC_1000FD; + + lan743x_phy_interface_select(adapter); + + switch (adapter->phy_interface) { + case PHY_INTERFACE_MODE_SGMII: + __set_bit(PHY_INTERFACE_MODE_SGMII, + adapter->phylink_config.supported_interfaces); + __set_bit(PHY_INTERFACE_MODE_1000BASEX, + adapter->phylink_config.supported_interfaces); + __set_bit(PHY_INTERFACE_MODE_2500BASEX, + adapter->phylink_config.supported_interfaces); + adapter->phylink_config.mac_capabilities |=3D MAC_2500FD; + break; + case PHY_INTERFACE_MODE_GMII: + __set_bit(PHY_INTERFACE_MODE_GMII, + adapter->phylink_config.supported_interfaces); + break; + case PHY_INTERFACE_MODE_MII: + __set_bit(PHY_INTERFACE_MODE_MII, + adapter->phylink_config.supported_interfaces); + break; + default: + phy_interface_set_rgmii(adapter->phylink_config.supported_interfaces); + } + + pl =3D phylink_create(&adapter->phylink_config, NULL, + adapter->phy_interface, &lan743x_phylink_mac_ops); + + if (IS_ERR(pl)) { + netdev_err(netdev, "Could not create phylink (%pe)\n", pl); + return PTR_ERR(pl); + } + + adapter->phylink =3D pl; + netdev_dbg(netdev, "lan743x phylink created"); + + return 0; +} + +static bool lan743x_phy_handle_exists(struct device_node *dn) +{ + dn =3D of_parse_phandle(dn, "phy-handle", 0); + of_node_put(dn); + return dn !=3D NULL; +} + +static int lan743x_phylink_connect(struct lan743x_adapter *adapter) +{ + struct device_node *dn =3D adapter->pdev->dev.of_node; + struct net_device *dev =3D adapter->netdev; + struct phy_device *phydev; + int ret; + + if (dn) + ret =3D phylink_of_phy_connect(adapter->phylink, dn, 0); + + if (!dn || (ret && !lan743x_phy_handle_exists(dn))) { + phydev =3D phy_find_first(adapter->mdiobus); + if (phydev) { + /* attach the mac to the phy */ + ret =3D phylink_connect_phy(adapter->phylink, phydev); + } else if (((adapter->csr.id_rev & ID_REV_ID_MASK_) =3D=3D + ID_REV_ID_LAN7431_) || adapter->is_pci11x1x) { + struct phylink_link_state state; + unsigned long caps; + + caps =3D adapter->phylink_config.mac_capabilities; + ret =3D lan743x_find_max_speed(caps, &state.speed, + &state.duplex); + if (ret) { + netdev_err(dev, "find unknown speed (%d)\n", + ret); + return ret; + } + + ret =3D phylink_set_fixed_link(adapter->phylink, &state); + if (ret) { + netdev_err(dev, "Could not set fixed link\n"); + return ret; + } + } else { + netdev_err(dev, "no PHY found\n"); + return -ENXIO; + } + } + + if (ret) { + netdev_err(dev, "Could not attach PHY (%d)\n", ret); + return ret; + } + + phylink_start(adapter->phylink); + + return 0; +} + +static void lan743x_phylink_disconnect(struct lan743x_adapter *adapter) +{ + struct net_device *netdev =3D adapter->netdev; + struct phy_device *phydev =3D netdev->phydev; + + phylink_stop(adapter->phylink); + phylink_disconnect_phy(adapter->phylink); + + if (phydev) + if (phy_is_pseudo_fixed_link(phydev)) + fixed_phy_unregister(phydev); +} + static int lan743x_netdev_close(struct net_device *netdev) { struct lan743x_adapter *adapter =3D netdev_priv(netdev); @@ -3092,7 +3227,7 @@ static int lan743x_netdev_close(struct net_device *ne= tdev) =20 lan743x_ptp_close(adapter); =20 - lan743x_phy_close(adapter); + lan743x_phylink_disconnect(adapter); =20 lan743x_mac_close(adapter); =20 @@ -3115,13 +3250,13 @@ static int lan743x_netdev_open(struct net_device *n= etdev) if (ret) goto close_intr; =20 - ret =3D lan743x_phy_open(adapter); + ret =3D lan743x_phylink_connect(adapter); if (ret) goto close_mac; =20 ret =3D lan743x_ptp_open(adapter); if (ret) - goto close_phy; + goto close_mac; =20 lan743x_rfe_open(adapter); =20 @@ -3161,9 +3296,8 @@ static int lan743x_netdev_open(struct net_device *net= dev) lan743x_rx_close(&adapter->rx[index]); } lan743x_ptp_close(adapter); - -close_phy: - lan743x_phy_close(adapter); + if (adapter->phylink) + lan743x_phylink_disconnect(adapter); =20 close_mac: lan743x_mac_close(adapter); @@ -3192,11 +3326,14 @@ static netdev_tx_t lan743x_netdev_xmit_frame(struct= sk_buff *skb, static int lan743x_netdev_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) { + struct lan743x_adapter *adapter =3D netdev_priv(netdev); + if (!netif_running(netdev)) return -EINVAL; if (cmd =3D=3D SIOCSHWTSTAMP) return lan743x_ptp_ioctl(netdev, ifr, cmd); - return phy_mii_ioctl(netdev->phydev, ifr, cmd); + + return phylink_mii_ioctl(adapter->phylink, ifr, cmd); } =20 static void lan743x_netdev_set_multicast(struct net_device *netdev) @@ -3301,10 +3438,17 @@ static void lan743x_mdiobus_cleanup(struct lan743x_= adapter *adapter) mdiobus_unregister(adapter->mdiobus); } =20 +static void lan743x_destroy_phylink(struct lan743x_adapter *adapter) +{ + phylink_destroy(adapter->phylink); + adapter->phylink =3D NULL; +} + static void lan743x_full_cleanup(struct lan743x_adapter *adapter) { unregister_netdev(adapter->netdev); =20 + lan743x_destroy_phylink(adapter); lan743x_mdiobus_cleanup(adapter); lan743x_hardware_cleanup(adapter); lan743x_pci_cleanup(adapter); @@ -3518,14 +3662,21 @@ static int lan743x_pcidev_probe(struct pci_dev *pde= v, NETIF_F_HW_CSUM | NETIF_F_RXCSUM; adapter->netdev->hw_features =3D adapter->netdev->features; =20 - /* carrier off reporting is important to ethtool even BEFORE open */ - netif_carrier_off(netdev); + ret =3D lan743x_phylink_create(adapter); + if (ret < 0) { + netif_err(adapter, probe, netdev, + "failed to setup phylink (%d)\n", ret); + goto cleanup_mdiobus; + } =20 ret =3D register_netdev(adapter->netdev); if (ret < 0) - goto cleanup_mdiobus; + goto cleanup_phylink; return 0; =20 +cleanup_phylink: + lan743x_destroy_phylink(adapter); + cleanup_mdiobus: lan743x_mdiobus_cleanup(adapter); =20 @@ -3781,6 +3932,7 @@ static int lan743x_pm_resume(struct device *dev) MAC_WK_SRC_WK_FR_SAVED_; lan743x_csr_write(adapter, MAC_WK_SRC, data); =20 + rtnl_lock(); /* open netdev when netdev is at running state while resume. * For instance, it is true when system wakesup after pm-suspend * However, it is false when system wakes up after suspend GUI menu @@ -3789,6 +3941,7 @@ static int lan743x_pm_resume(struct device *dev) lan743x_netdev_open(netdev); =20 netif_device_attach(netdev); + rtnl_unlock(); =20 return 0; } diff --git a/drivers/net/ethernet/microchip/lan743x_main.h b/drivers/net/et= hernet/microchip/lan743x_main.h index 3b2585a384e2..7f73d66854be 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.h +++ b/drivers/net/ethernet/microchip/lan743x_main.h @@ -5,6 +5,7 @@ #define _LAN743X_H =20 #include +#include #include "lan743x_ptp.h" =20 #define DRIVER_AUTHOR "Bryan Whitehead " @@ -1083,6 +1084,8 @@ struct lan743x_adapter { u32 flags; u32 hw_cfg; phy_interface_t phy_interface; + struct phylink *phylink; + struct phylink_config phylink_config; }; =20 #define LAN743X_COMPONENT_FLAG_RX(channel) BIT(20 + (channel)) --=20 2.34.1 From nobody Thu Dec 18 15:32:00 2025 Received: from esa.microchip.iphmx.com (esa.microchip.iphmx.com [68.232.154.123]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 411DF14B96B; Thu, 29 Aug 2024 05:56:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=68.232.154.123 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724910985; cv=none; b=SrO6JKW3JKFiYUhbPrwsihPU5zwuGW0ow7gK6XULN7s1OhFpCswLcsjRk1Y95dvci/joFa7MqeZ0+6eATcD8uxWdipYqcU10FXhyGM+dE25qfLLl6f9Faz/pQ8VpKCYSc8yMfDWBQXnay5BDRx1QvA5pm8CQIBkkexhWqvbIy1w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724910985; c=relaxed/simple; bh=cw/BYcOiJlwss0j8ZGlMCUaXf/1vQpLWbZscjXoqqR4=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=CeBqDF+v83OLUMNS06L37dcHrGDXxFjTp1fOct8ihvUp0fKhWNOzhSsz1HXS6EkXIAItfSlO47XiNYsAiGhpXxtnuaI4dvjqdi6EvF/V2hwHykKI89+QQgSxmRc/DYqYkCiZL2M2iHkBsxHz3Ioxt0YIu6I9uAVfZvRgo4+Yh94= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com; spf=pass smtp.mailfrom=microchip.com; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b=06ZlPsrv; arc=none smtp.client-ip=68.232.154.123 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=microchip.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="06ZlPsrv" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1724910983; x=1756446983; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=cw/BYcOiJlwss0j8ZGlMCUaXf/1vQpLWbZscjXoqqR4=; b=06ZlPsrvyC3IkdRBv2qudkMk0tHhUC7MRbPG9RpwHLd7WzehtCYgiqR/ OZ0qAVbEon01fjlB+zWUG8FOollVUafT04nw9slSD++Vxes4Z35Rv8Ox0 pUfo1cxHfJU2aB4yh3GKmPklKeKDtwgW6nlUv79sPGqX+STPxp/Csapg1 6YBCDsKhDJx3mQWF+esfd4JrcKtAPEgJQgzGX9hy4mEaxvqek1W3ASI34 mcogGjUr6pKc4UvTUI321R+QHmiVS8QbQlZS/DGr7v9VDpMgaSnUBGn5T Dpb6plfclxYybTwrWDkC5V3GtqR1vUFcN36BPUyipI976QXTCcu5vRgVS Q==; X-CSE-ConnectionGUID: OqQ8UWHzRieRXsYt6b8OmA== X-CSE-MsgGUID: FB9RCfzeROiLzjHvHs4bVQ== X-IronPort-AV: E=Sophos;i="6.10,184,1719903600"; d="scan'208";a="30971353" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa4.microchip.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 28 Aug 2024 22:56:21 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex01.mchp-main.com (10.10.85.143) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Wed, 28 Aug 2024 22:55:44 -0700 Received: from HYD-DK-UNGSW21.microchip.com (10.10.85.11) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server id 15.1.2507.35 via Frontend Transport; Wed, 28 Aug 2024 22:55:42 -0700 From: Raju Lakkaraju To: CC: , , , , , , , , , , , , Subject: [PATCH net-next V4 5/5] net: lan743x: Add support to ethtool phylink get and set settings Date: Thu, 29 Aug 2024 11:21:32 +0530 Message-ID: <20240829055132.79638-6-Raju.Lakkaraju@microchip.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240829055132.79638-1-Raju.Lakkaraju@microchip.com> References: <20240829055132.79638-1-Raju.Lakkaraju@microchip.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add support to ethtool phylink functions: - get/set settings like speed, duplex etc - get/set the wake-on-lan (WOL) - get/set the energy-efficient ethernet (EEE) - get/set the pause Signed-off-by: Raju Lakkaraju --- Change List: = =20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D = =20 V3 -> V4: - Remove the EEE private variables from LAN743x adapter strcture and fix = the =20 EEE's set/get functions - Change lan743x_set_eee( ) to lan743x_mac_eee_enable( ) - Fix the EEE's tx lpi counter update V2 -> V3: - No change V1 -> V2: = =20 - Fix the phylink changes = =20 =20 .../net/ethernet/microchip/lan743x_ethtool.c | 117 ++++++------------ drivers/net/ethernet/microchip/lan743x_main.c | 20 +++ drivers/net/ethernet/microchip/lan743x_main.h | 1 + 3 files changed, 59 insertions(+), 79 deletions(-) diff --git a/drivers/net/ethernet/microchip/lan743x_ethtool.c b/drivers/net= /ethernet/microchip/lan743x_ethtool.c index 3a63ec091413..b15b52d53e84 100644 --- a/drivers/net/ethernet/microchip/lan743x_ethtool.c +++ b/drivers/net/ethernet/microchip/lan743x_ethtool.c @@ -1058,61 +1058,49 @@ static int lan743x_ethtool_get_eee(struct net_devic= e *netdev, struct ethtool_keee *eee) { struct lan743x_adapter *adapter =3D netdev_priv(netdev); - struct phy_device *phydev =3D netdev->phydev; - u32 buf; - int ret; =20 - if (!phydev) - return -EIO; - if (!phydev->drv) { - netif_err(adapter, drv, adapter->netdev, - "Missing PHY Driver\n"); - return -EIO; - } + eee->tx_lpi_timer =3D lan743x_csr_read(adapter, + MAC_EEE_TX_LPI_REQ_DLY_CNT); =20 - ret =3D phy_ethtool_get_eee(phydev, eee); - if (ret < 0) - return ret; + return phylink_ethtool_get_eee(adapter->phylink, eee); +} =20 - buf =3D lan743x_csr_read(adapter, MAC_CR); - if (buf & MAC_CR_EEE_EN_) { - /* EEE_TX_LPI_REQ_DLY & tx_lpi_timer are same uSec unit */ - buf =3D lan743x_csr_read(adapter, MAC_EEE_TX_LPI_REQ_DLY_CNT); - eee->tx_lpi_timer =3D buf; - } else { - eee->tx_lpi_timer =3D 0; +static int lan743x_ethtool_set_eee(struct net_device *netdev, + struct ethtool_keee *eee) +{ + struct lan743x_adapter *adapter =3D netdev_priv(netdev); + u32 tx_lpi_timer; + + tx_lpi_timer =3D lan743x_csr_read(adapter, MAC_EEE_TX_LPI_REQ_DLY_CNT); + if (tx_lpi_timer !=3D eee->tx_lpi_timer) { + /* Software should only change this field when Energy Efficient + * Ethernet Enable (EEEEN) is cleared. + * This function will trigger an autonegotiation restart and + * that eee will be reenabled during link up if eee was + * negotiated. + */ + lan743x_mac_eee_enable(adapter, false); + lan743x_csr_write(adapter, MAC_EEE_TX_LPI_REQ_DLY_CNT, + eee->tx_lpi_timer); } =20 - return 0; + return phylink_ethtool_set_eee(adapter->phylink, eee); } =20 -static int lan743x_ethtool_set_eee(struct net_device *netdev, - struct ethtool_keee *eee) +static int lan743x_ethtool_set_link_ksettings(struct net_device *netdev, + const struct ethtool_link_ksettings *cmd) { - struct lan743x_adapter *adapter; - struct phy_device *phydev; - u32 buf =3D 0; + struct lan743x_adapter *adapter =3D netdev_priv(netdev); =20 - if (!netdev) - return -EINVAL; - adapter =3D netdev_priv(netdev); - if (!adapter) - return -EINVAL; - phydev =3D netdev->phydev; - if (!phydev) - return -EIO; - if (!phydev->drv) { - netif_err(adapter, drv, adapter->netdev, - "Missing PHY Driver\n"); - return -EIO; - } + return phylink_ethtool_ksettings_set(adapter->phylink, cmd); +} =20 - if (eee->eee_enabled) { - buf =3D (u32)eee->tx_lpi_timer; - lan743x_csr_write(adapter, MAC_EEE_TX_LPI_REQ_DLY_CNT, buf); - } +static int lan743x_ethtool_get_link_ksettings(struct net_device *netdev, + struct ethtool_link_ksettings *cmd) +{ + struct lan743x_adapter *adapter =3D netdev_priv(netdev); =20 - return phy_ethtool_set_eee(phydev, eee); + return phylink_ethtool_ksettings_get(adapter->phylink, cmd); } =20 #ifdef CONFIG_PM @@ -1124,8 +1112,7 @@ static void lan743x_ethtool_get_wol(struct net_device= *netdev, wol->supported =3D 0; wol->wolopts =3D 0; =20 - if (netdev->phydev) - phy_ethtool_get_wol(netdev->phydev, wol); + phylink_ethtool_get_wol(adapter->phylink, wol); =20 if (wol->supported !=3D adapter->phy_wol_supported) netif_warn(adapter, drv, adapter->netdev, @@ -1166,7 +1153,7 @@ static int lan743x_ethtool_set_wol(struct net_device = *netdev, !(adapter->phy_wol_supported & WAKE_MAGICSECURE)) phy_wol.wolopts &=3D ~WAKE_MAGIC; =20 - ret =3D phy_ethtool_set_wol(netdev->phydev, &phy_wol); + ret =3D phylink_ethtool_set_wol(adapter->phylink, wol); if (ret && (ret !=3D -EOPNOTSUPP)) return ret; =20 @@ -1355,44 +1342,16 @@ static void lan743x_get_pauseparam(struct net_devic= e *dev, struct ethtool_pauseparam *pause) { struct lan743x_adapter *adapter =3D netdev_priv(dev); - struct lan743x_phy *phy =3D &adapter->phy; =20 - if (phy->fc_request_control & FLOW_CTRL_TX) - pause->tx_pause =3D 1; - if (phy->fc_request_control & FLOW_CTRL_RX) - pause->rx_pause =3D 1; - pause->autoneg =3D phy->fc_autoneg; + phylink_ethtool_get_pauseparam(adapter->phylink, pause); } =20 static int lan743x_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *pause) { struct lan743x_adapter *adapter =3D netdev_priv(dev); - struct phy_device *phydev =3D dev->phydev; - struct lan743x_phy *phy =3D &adapter->phy; =20 - if (!phydev) - return -ENODEV; - - if (!phy_validate_pause(phydev, pause)) - return -EINVAL; - - phy->fc_request_control =3D 0; - if (pause->rx_pause) - phy->fc_request_control |=3D FLOW_CTRL_RX; - - if (pause->tx_pause) - phy->fc_request_control |=3D FLOW_CTRL_TX; - - phy->fc_autoneg =3D pause->autoneg; - - if (pause->autoneg =3D=3D AUTONEG_DISABLE) - lan743x_mac_flow_ctrl_set_enables(adapter, pause->tx_pause, - pause->rx_pause); - else - phy_set_asym_pause(phydev, pause->rx_pause, pause->tx_pause); - - return 0; + return phylink_ethtool_set_pauseparam(adapter->phylink, pause); } =20 const struct ethtool_ops lan743x_ethtool_ops =3D { @@ -1417,8 +1376,8 @@ const struct ethtool_ops lan743x_ethtool_ops =3D { .get_ts_info =3D lan743x_ethtool_get_ts_info, .get_eee =3D lan743x_ethtool_get_eee, .set_eee =3D lan743x_ethtool_set_eee, - .get_link_ksettings =3D phy_ethtool_get_link_ksettings, - .set_link_ksettings =3D phy_ethtool_set_link_ksettings, + .get_link_ksettings =3D lan743x_ethtool_get_link_ksettings, + .set_link_ksettings =3D lan743x_ethtool_set_link_ksettings, .get_regs_len =3D lan743x_get_regs_len, .get_regs =3D lan743x_get_regs, .get_pauseparam =3D lan743x_get_pauseparam, diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/et= hernet/microchip/lan743x_main.c index 91e74e231251..9c18e025a28d 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.c +++ b/drivers/net/ethernet/microchip/lan743x_main.c @@ -2966,6 +2966,18 @@ static int lan743x_phylink_2500basex_config(struct l= an743x_adapter *adapter) return lan743x_pcs_power_reset(adapter); } =20 +void lan743x_mac_eee_enable(struct lan743x_adapter *adapter, bool enable) +{ + u32 mac_cr; + + mac_cr =3D lan743x_csr_read(adapter, MAC_CR); + if (enable) + mac_cr |=3D MAC_CR_EEE_EN_; + else + mac_cr &=3D ~MAC_CR_EEE_EN_; + lan743x_csr_write(adapter, MAC_CR, mac_cr); +} + static void lan743x_phylink_mac_config(struct phylink_config *config, unsigned int link_an_mode, const struct phylink_link_state *state) @@ -3013,7 +3025,11 @@ static void lan743x_phylink_mac_link_down(struct phy= link_config *config, unsigned int link_an_mode, phy_interface_t interface) { + struct net_device *netdev =3D to_net_dev(config->dev); + struct lan743x_adapter *adapter =3D netdev_priv(netdev); + netif_tx_stop_all_queues(to_net_dev(config->dev)); + lan743x_mac_eee_enable(adapter, false); } =20 static void lan743x_phylink_mac_link_up(struct phylink_config *config, @@ -3055,6 +3071,10 @@ static void lan743x_phylink_mac_link_up(struct phyli= nk_config *config, cap & FLOW_CTRL_TX, cap & FLOW_CTRL_RX); =20 + if (phydev) + lan743x_mac_eee_enable(adapter, phydev->enable_tx_lpi && + phydev->eee_enabled); + netif_tx_wake_all_queues(netdev); } =20 diff --git a/drivers/net/ethernet/microchip/lan743x_main.h b/drivers/net/et= hernet/microchip/lan743x_main.h index 7f73d66854be..8ef897c114d3 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.h +++ b/drivers/net/ethernet/microchip/lan743x_main.h @@ -1206,5 +1206,6 @@ void lan743x_hs_syslock_release(struct lan743x_adapte= r *adapter); void lan743x_mac_flow_ctrl_set_enables(struct lan743x_adapter *adapter, bool tx_enable, bool rx_enable); int lan743x_sgmii_read(struct lan743x_adapter *adapter, u8 mmd, u16 addr); +void lan743x_mac_eee_enable(struct lan743x_adapter *adapter, bool enable); =20 #endif /* _LAN743X_H */ --=20 2.34.1