From nobody Wed Dec 17 15:37: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 9554C1991A3; Tue, 16 Jul 2024 11:37:30 +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=1721129852; cv=none; b=uAhjz6uGVBDyyrvXX8R/5nkAPQG8v/Ulqe7Hbq0z9Mb7CUh7jZmraTESq1MnvlEhGgr+WQW8caMdkGqQ0rwiHxu6MpgGIE7QQqZQqKLAmCJ5IPsYAFRwzvRdUE2kRVUVp5UPhl8XOWuZTyCvIe3+caXiSLNC6yztCIs9OeichLo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1721129852; c=relaxed/simple; bh=DTZVF0TD9HzA4HAWJQ/BniAtqJDgRFsJo+Gj0EbFxwo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=IkhgG0iwZgO+seZSsgw9bUO6EjouPsqJ+EBk0/IhTc36x0JHgAdBpCTGpLCehorfE/r16BgqF1dMhiiHdHmP8LJlyCSgcCCOkAxAKzDsU0JGdcCbfcJPvSjY0+Jk8FA5iE93S+iycYBlI4/eP8giXTKwYLc1x8S9MXNQZ2SfL8A= 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=azTzTkSY; 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="azTzTkSY" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1721129850; x=1752665850; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=DTZVF0TD9HzA4HAWJQ/BniAtqJDgRFsJo+Gj0EbFxwo=; b=azTzTkSYy1Fd3uaTYXmDKxa1/FCXwOH5hPP5oxWrGDystl4KnqgnquJM pXe/bAzkTqhE48QSix2xZpOZ82jOlnTByeXkMwRlOJvhrQie7xEWT2sJ8 T6dUx1ZLD98hmY409uHJrw7c6vj1jKT7E2ZTLgOuBTTy4B8Ck9hpDpH+D diOtWJ+4HhADiiEnnBUSVfijA7yCBlkERLwtMQkZ2LST/rTvfKQz7kidl ZGnrw9VrYK3e/SFMBVU0kRgnfi5D7CEqIQbjcvYUnLlNM3hSILJ2C2xeo qucN7ElvujXzJg6QH8juMSxmdkx73NOyZvndmhkHGOBJ8D4chwuR5nBBk A==; X-CSE-ConnectionGUID: wiqq30pxTLCqYtWfMI+eUQ== X-CSE-MsgGUID: V5AJQY9YQRWj84vjSaqIhw== X-IronPort-AV: E=Sophos;i="6.09,211,1716274800"; d="scan'208";a="196701709" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa6.microchip.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 16 Jul 2024 04:37:27 -0700 Received: from chn-vm-ex03.mchp-main.com (10.10.85.151) 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; Tue, 16 Jul 2024 04:37:20 -0700 Received: from HYD-DK-UNGSW21.microchip.com (10.10.85.11) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server id 15.1.2507.35 via Frontend Transport; Tue, 16 Jul 2024 04:37:16 -0700 From: Raju Lakkaraju To: CC: , , , , , , , , , , , , Subject: [PATCH net-next V2 1/4] net: lan743x: Create separate PCS power reset function Date: Tue, 16 Jul 2024 17:03:46 +0530 Message-ID: <20240716113349.25527-2-Raju.Lakkaraju@microchip.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240716113349.25527-1-Raju.Lakkaraju@microchip.com> References: <20240716113349.25527-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. Signed-off-by: Raju Lakkaraju Reviewed-by: Andrew Lunn --- Change List: =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D V1 -> V2: - No changes 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 Wed Dec 17 15:37: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 57113195FD1; Tue, 16 Jul 2024 11:37:54 +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=1721129876; cv=none; b=LXywtKTOK5f1w/ejvH4lNgJiZ27TDtYj8K7pLUd6u1ttlMEG+PaLeEiYsniCZE92flp6s25OySoFW3/KDaiUX8EUFZKw5THVxG0OrnfdTyfn+9tPtkK7mL/TsdTjDus+Qfi1E7n6a/bCE4NW0jvZsQ3tePFrfiY27eFA8A5XGHw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1721129876; c=relaxed/simple; bh=t7aaLQUyfDA+p5vRSl1NJUfN0pLTnLyMeltQG2AN4vY=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=UjuOP9iaoxRUjNx3wN7MOe900Rqs934etDis6JjAEACJ/8rvIRUXpeeDBKQM/i2O9Z0xsSvBJiHoy/93w8pDk7guKQPCZVrh5AqN1v7Urooiqz/rPo23ZavTENfzG9sl9ym4lq10ULedQcjO8PQVcALhgSde2whsTagwcRnedrE= 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=rMa4drYb; 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="rMa4drYb" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1721129874; x=1752665874; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=t7aaLQUyfDA+p5vRSl1NJUfN0pLTnLyMeltQG2AN4vY=; b=rMa4drYbiD9m5+5RI3F9mOInBY4m4i/k3NLjHIUbohtFLCepxz14Z9Pv KzNUohLWlpialAlItmB8znsRQEykirN2GOFzpmCy013g9iZb48bhtGmfC 1w1avivZZ8c6GdgYREnJ/DWVn81p+net9Wc8n0V0UKZIXFjoNeQhM4i8S ALOcax57ovRHn+jvyYHiH1aPnsfeLkyCSXPLv46K+dH7j7Tlvnsk7tQRd PRp97N3b5/hX1UgaIgWsGIOJKcss2Vpmbp1orKu0Es5KE0gqkzKrgDTPp TazlMcbaGc/mnTBIYxWSVgJk4rQ0Kypt1m8RxC5LZIyYBgypK8RxgjI/E w==; X-CSE-ConnectionGUID: cfaeIL7IRUGLMl9e3xGUlQ== X-CSE-MsgGUID: fQYrUahfRP2If+8ifDi5JQ== X-IronPort-AV: E=Sophos;i="6.09,211,1716274800"; d="scan'208";a="32002840" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa1.microchip.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 16 Jul 2024 04:37:53 -0700 Received: from chn-vm-ex03.mchp-main.com (10.10.85.151) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Tue, 16 Jul 2024 04:37:25 -0700 Received: from HYD-DK-UNGSW21.microchip.com (10.10.85.11) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server id 15.1.2507.35 via Frontend Transport; Tue, 16 Jul 2024 04:37:21 -0700 From: Raju Lakkaraju To: CC: , , , , , , , , , , , , Subject: [PATCH net-next V2 2/4] net: lan743x: Create separate Link Speed Duplex state function Date: Tue, 16 Jul 2024 17:03:47 +0530 Message-ID: <20240716113349.25527-3-Raju.Lakkaraju@microchip.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240716113349.25527-1-Raju.Lakkaraju@microchip.com> References: <20240716113349.25527-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. Signed-off-by: Raju Lakkaraju Reviewed-by: Andrew Lunn --- Change List: = =20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D = =20 V1 -> V2: = =20 - No changes = =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 Wed Dec 17 15:37: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 CBBC4198A29; Tue, 16 Jul 2024 11:37:55 +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=1721129879; cv=none; b=LaDIfujkYBMoavVIe64b56Mla42Co5I/0bZkLB94PNeS3AZBWTkvivmnVMl5bIW5bkaJ2DcwbSA23h+SJVR9EtweKlZAa19scbgO3j1tQN1KpVGcEyd/33RHSkbYUBRF5/4AKdRdkkiEgpuKCGejG7WhnVNMDdNct9NC08WzQb0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1721129879; c=relaxed/simple; bh=CY+/hh3yggzWimKTUcksLXCjXtWJQXmCRqqIpcscJVY=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=IRnQ9n1A0WxgUgZrKMp4vftn6KFYVAhI+dQzQcyySUGYrRmFbRNX+bdHNYksLxySoW0WxI9uIapDxG1tVZ+gBVMgbFVZWX4HtPIbWJPTz6+5IgOPAJu1iI277MrILFwP6OGsIc+Haq//PHW8fuxsoh+xwdGhFWXFiqeg6raXatg= 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=afg7j0EW; 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="afg7j0EW" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1721129875; x=1752665875; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=CY+/hh3yggzWimKTUcksLXCjXtWJQXmCRqqIpcscJVY=; b=afg7j0EW6rM0lLzQo2BGAN+x1mHCFCPjjwh4Adj+VEQSqfmaqY5ZcKRq jJ9roZMXYaX1uCly9I/15if/IuRZD+CZP9lAxvl+vItxAyVZJP27Ec79S 4fzKVJ0WtUOWYuoOGk8t4EvXavCAHm88a8b4rAZJrphARGkB5GCMHXuKP n1Sa9Vjohq3a9Qa6XRK/3/V109uZebYha8FPD2HW8YdWu2n/nY8TBGjHC 73p8lhL8qgTStoJ4xG37ELEAGfCFolNMDrEBEKNwbGrl6ku0v0G0FvOMV Nm4zImvgDBUv2qWWfuNCphAvO8nXQwJrBB5BC3bNcfzFyHvu77ucmdOCX w==; X-CSE-ConnectionGUID: cfaeIL7IRUGLMl9e3xGUlQ== X-CSE-MsgGUID: ZdwJxT9eS9WIW/5ggYW1rQ== X-IronPort-AV: E=Sophos;i="6.09,211,1716274800"; d="scan'208";a="32002846" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa1.microchip.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 16 Jul 2024 04:37:54 -0700 Received: from chn-vm-ex03.mchp-main.com (10.10.85.151) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Tue, 16 Jul 2024 04:37:30 -0700 Received: from HYD-DK-UNGSW21.microchip.com (10.10.85.11) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server id 15.1.2507.35 via Frontend Transport; Tue, 16 Jul 2024 04:37:26 -0700 From: Raju Lakkaraju To: CC: , , , , , , , , , , , , Subject: [PATCH net-next V2 3/4] net: lan743x: Migrate phylib to phylink Date: Tue, 16 Jul 2024 17:03:48 +0530 Message-ID: <20240716113349.25527-4-Raju.Lakkaraju@microchip.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240716113349.25527-1-Raju.Lakkaraju@microchip.com> References: <20240716113349.25527-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. Fixed phy support is still used together with phylink since we need to supp= ort dynamic fallback when a phy is not found over mdio. While phylink's FIXED m= ode supports fixed phys that, it's dynamic and requires device tree entries whi= ch are most of the time not present for LAN743x devices Signed-off-by: Raju Lakkaraju --- Change List: = =20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D = =20 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 | 574 +++++++++++------- drivers/net/ethernet/microchip/lan743x_main.h | 3 + 3 files changed, 355 insertions(+), 227 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..9f958fb27bd8 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; -} =20 -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; - } - } - - 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,319 @@ 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(to_net_dev(config->dev)); +} + +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 int lan743x_phylink_create(struct net_device *netdev) +{ + struct lan743x_adapter *adapter =3D netdev_priv(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 | MAC_2500FD; + + 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); + 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: + __set_bit(PHY_INTERFACE_MODE_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); + if (IS_ERR(dn)) + return false; + + return true; +} + +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 fixed_phy_status fphy_status =3D { + .link =3D 1, + .speed =3D SPEED_1000, + .duplex =3D DUPLEX_FULL, + }; + 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) { + if (((adapter->csr.id_rev & ID_REV_ID_MASK_) =3D=3D + ID_REV_ID_LAN7431_) || adapter->is_pci11x1x) { + phydev =3D fixed_phy_register(PHY_POLL, + &fphy_status, + NULL); + if (IS_ERR(phydev)) { + netdev_err(dev, "No PHY/fixed_PHY found\n"); + return PTR_ERR(phydev); + } + } else { + netdev_err(dev, "no PHY found\n"); + return -ENXIO; + } + } + + /* attach the mac to the phy */ + ret =3D phylink_connect_phy(adapter->phylink, phydev); + 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 +3196,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 +3219,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; + goto close_phylink; =20 ret =3D lan743x_ptp_open(adapter); if (ret) - goto close_phy; + goto close_phylink; =20 lan743x_rfe_open(adapter); =20 @@ -3162,10 +3266,8 @@ static int lan743x_netdev_open(struct net_device *ne= tdev) } lan743x_ptp_close(adapter); =20 -close_phy: - lan743x_phy_close(adapter); - -close_mac: +close_phylink: + lan743x_phylink_disconnect(adapter); lan743x_mac_close(adapter); =20 close_intr: @@ -3192,11 +3294,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 +3406,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 +3630,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->netdev); + 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 @@ -3709,6 +3828,7 @@ static int lan743x_pm_suspend(struct device *dev) =20 lan743x_pcidev_shutdown(pdev); =20 + rtnl_lock(); /* clear all wakes */ lan743x_csr_write(adapter, MAC_WUCSR, 0); lan743x_csr_write(adapter, MAC_WUCSR2, 0); @@ -3728,6 +3848,7 @@ static int lan743x_pm_suspend(struct device *dev) HW_CFG_RST_PROTECT_); lan743x_csr_write(adapter, HW_CFG, data); } + rtnl_unlock(); =20 /* Host sets PME_En, put D3hot */ return pci_prepare_to_sleep(pdev); @@ -3745,6 +3866,7 @@ static int lan743x_pm_resume(struct device *dev) pci_restore_state(pdev); pci_save_state(pdev); =20 + rtnl_lock(); /* Restore HW_CFG that was saved during pm suspend */ if (adapter->is_pci11x1x) lan743x_csr_write(adapter, HW_CFG, adapter->hw_cfg); @@ -3754,6 +3876,7 @@ static int lan743x_pm_resume(struct device *dev) netif_err(adapter, probe, adapter->netdev, "lan743x_hardware_init returned %d\n", ret); lan743x_pci_cleanup(adapter); + rtnl_unlock(); return ret; } =20 @@ -3789,6 +3912,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 Wed Dec 17 15:37: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 5060B198857; Tue, 16 Jul 2024 11:37:56 +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=1721129878; cv=none; b=dIKoqJ3yA74UDQQIc+1WMvksVzSmN4gwoOM52CgWNHDUFMiGkqorxJqIOySxG3AoCRJAJag/R5KdIgHXeWmyI/Ie8pQYWd4/QiL3AVQHwMaBeVd290U76Mht8ZF6y76r7UMKsD/CI8B8NQ54KjZLDwBYAq6bB1bie+Y5ax2S1Wk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1721129878; c=relaxed/simple; bh=xUnUMlUWDf1KmmCsMCJr89D3W9fr3ciE/oq41kkHucg=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=mRdLu/sY1RYe+SZDox0Xahjjo+fQouOexBXsqG1x8NNP7ng1ZdQ8tlheiLBYlGi29AZaB5LE/BS3fsIK5lLxQKx7C21GMS6Ayr2WKICsasBiJFz7xcXwo/PJDFsjqvSp/cK1LGA+ljN4YMuR2Eew2NsJynLDlSeDcx0+ZdIPPJA= 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=GZlVBzWs; 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="GZlVBzWs" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1721129876; x=1752665876; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=xUnUMlUWDf1KmmCsMCJr89D3W9fr3ciE/oq41kkHucg=; b=GZlVBzWseHxSK8vDKDtFTRRS0qmJ8/SL1wfGAaLcQWaO7yEIpt5o07vx EfXWUI6iMuO1K5uIhgdLE/KuiXVNrvkruTzKyJHYvjgCAypR/b/i/tEpB en9RDdB5oQaF6rDy4CMlV78+cIFdPtkc2ty4xwwimzA6+ws/01kIdVUKG I7+AXwo4WEr5LX5q8ue7SY8lLx/+JNRO2dDCTwTsSehro+x0rwbbgQy9+ C9KG7f+BiEzYNSWrboyTLFK4wNU3P66tBivSTBQUX4BudUgirK7JAqBO6 Cam781c+Rm481PYrpG5rkbFDOuouDnsBLc8akC52+LDBGfkztEVYl2cft w==; X-CSE-ConnectionGUID: cfaeIL7IRUGLMl9e3xGUlQ== X-CSE-MsgGUID: 4LSU1cQjSF+hLYLVjjPdkg== X-IronPort-AV: E=Sophos;i="6.09,211,1716274800"; d="scan'208";a="32002847" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa1.microchip.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 16 Jul 2024 04:37:54 -0700 Received: from chn-vm-ex03.mchp-main.com (10.10.85.151) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Tue, 16 Jul 2024 04:37:36 -0700 Received: from HYD-DK-UNGSW21.microchip.com (10.10.85.11) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server id 15.1.2507.35 via Frontend Transport; Tue, 16 Jul 2024 04:37:31 -0700 From: Raju Lakkaraju To: CC: , , , , , , , , , , , , Subject: [PATCH net-next V2 4/4] net: lan743x: Add support to ethtool phylink get and set settings Date: Tue, 16 Jul 2024 17:03:49 +0530 Message-ID: <20240716113349.25527-5-Raju.Lakkaraju@microchip.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240716113349.25527-1-Raju.Lakkaraju@microchip.com> References: <20240716113349.25527-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 V1 -> V2: = =20 - Fix the phylink changes = =20 =20 .../net/ethernet/microchip/lan743x_ethtool.c | 118 ++++++------------ drivers/net/ethernet/microchip/lan743x_main.c | 25 ++++ drivers/net/ethernet/microchip/lan743x_main.h | 4 + 3 files changed, 67 insertions(+), 80 deletions(-) diff --git a/drivers/net/ethernet/microchip/lan743x_ethtool.c b/drivers/net= /ethernet/microchip/lan743x_ethtool.c index 3a63ec091413..a649ea7442a4 100644 --- a/drivers/net/ethernet/microchip/lan743x_ethtool.c +++ b/drivers/net/ethernet/microchip/lan743x_ethtool.c @@ -1058,61 +1058,48 @@ 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; - - if (!phydev) - return -EIO; - if (!phydev->drv) { - netif_err(adapter, drv, adapter->netdev, - "Missing PHY Driver\n"); - return -EIO; - } =20 - ret =3D phy_ethtool_get_eee(phydev, eee); - if (ret < 0) - return ret; - - 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; - } + eee->tx_lpi_timer =3D lan743x_csr_read(adapter, + MAC_EEE_TX_LPI_REQ_DLY_CNT); + eee->eee_enabled =3D adapter->eee_enabled; + eee->eee_active =3D adapter->eee_active; + eee->tx_lpi_enabled =3D adapter->tx_lpi_enabled; =20 - return 0; + return phylink_ethtool_get_eee(adapter->phylink, eee); } =20 static int lan743x_ethtool_set_eee(struct net_device *netdev, struct ethtool_keee *eee) { - 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; - } + if (eee->tx_lpi_enabled) + lan743x_csr_write(adapter, MAC_EEE_TX_LPI_REQ_DLY_CNT, + eee->tx_lpi_timer); + else + lan743x_csr_write(adapter, MAC_EEE_TX_LPI_REQ_DLY_CNT, 0); =20 - if (eee->eee_enabled) { - buf =3D (u32)eee->tx_lpi_timer; - lan743x_csr_write(adapter, MAC_EEE_TX_LPI_REQ_DLY_CNT, buf); - } + adapter->eee_enabled =3D eee->eee_enabled; + adapter->tx_lpi_enabled =3D eee->tx_lpi_enabled; + lan743x_set_eee(adapter, eee->tx_lpi_enabled && eee->eee_enabled); =20 - return phy_ethtool_set_eee(phydev, eee); + return phylink_ethtool_set_eee(adapter->phylink, eee); +} + +static int lan743x_ethtool_set_link_ksettings(struct net_device *netdev, + const struct ethtool_link_ksettings *cmd) +{ + struct lan743x_adapter *adapter =3D netdev_priv(netdev); + + return phylink_ethtool_ksettings_set(adapter->phylink, cmd); +} + +static int lan743x_ethtool_get_link_ksettings(struct net_device *netdev, + struct ethtool_link_ksettings *cmd) +{ + struct lan743x_adapter *adapter =3D netdev_priv(netdev); + + return phylink_ethtool_ksettings_get(adapter->phylink, cmd); } =20 #ifdef CONFIG_PM @@ -1124,8 +1111,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 +1152,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 +1341,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 +1375,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 9f958fb27bd8..40ef64fa7e5f 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_set_eee(struct lan743x_adapter *adapter, bool enable) +{ + u32 lpi_ctl1; + + lpi_ctl1 =3D lan743x_csr_read(adapter, MAC_CR); + if (enable) + lpi_ctl1 |=3D MAC_CR_EEE_EN_; + else + lpi_ctl1 &=3D ~MAC_CR_EEE_EN_; + lan743x_csr_write(adapter, MAC_CR, lpi_ctl1); +} + static void lan743x_phylink_mac_config(struct phylink_config *config, unsigned int link_an_mode, const struct phylink_link_state *state) @@ -3013,7 +3025,12 @@ 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)); + adapter->eee_active =3D false; + lan743x_set_eee(adapter, false); } =20 static void lan743x_phylink_mac_link_up(struct phylink_config *config, @@ -3056,6 +3073,14 @@ static void lan743x_phylink_mac_link_up(struct phyli= nk_config *config, cap & FLOW_CTRL_RX); =20 netif_tx_wake_all_queues(to_net_dev(config->dev)); + + if (phydev && adapter->eee_enabled) { + bool enable; + + adapter->eee_active =3D phy_init_eee(phydev, false) >=3D 0; + enable =3D adapter->eee_active && adapter->tx_lpi_enabled; + lan743x_set_eee(adapter, enable); + } } =20 static const struct phylink_mac_ops lan743x_phylink_mac_ops =3D { diff --git a/drivers/net/ethernet/microchip/lan743x_main.h b/drivers/net/et= hernet/microchip/lan743x_main.h index 7f73d66854be..79f21789eb32 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.h +++ b/drivers/net/ethernet/microchip/lan743x_main.h @@ -1086,6 +1086,9 @@ struct lan743x_adapter { phy_interface_t phy_interface; struct phylink *phylink; struct phylink_config phylink_config; + bool eee_enabled; + bool eee_active; + bool tx_lpi_enabled; }; =20 #define LAN743X_COMPONENT_FLAG_RX(channel) BIT(20 + (channel)) @@ -1206,5 +1209,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_set_eee(struct lan743x_adapter *adapter, bool enable); =20 #endif /* _LAN743X_H */ --=20 2.34.1