From nobody Sun Feb 8 11:44:05 2026 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 B68E31A00C9; Tue, 30 Jul 2024 14:10:06 +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=1722348608; cv=none; b=BIkQzR1C/FuKr0kq+GvtujA+vK2lOgklmiwYQLL+fTnh4UGzA8HS4Srk60RPPJ1Zc4XUqGYXS2wH0RSstp1OfopOoqdVsjYIaUS09g3StQt4MT8UwubGepzzznuV+ZmQg1l80u3I9nvwDnorr3PiWbm8VRfNReUAeEDBykJPXxc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722348608; c=relaxed/simple; bh=KzfqhmS8FIygSg5eeXP75nm95AbYuX6rNKCsxtWaRww=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ezvwhSkHzJIY8Wykeu3t01Db+YYrh2kD+rD58JOggSyM4QFwBFPFQKE/BdNqSDSH+cp1EHHdLuDzyeOuS83hsccf174CYlTxLMWZqCjwPndIpLKvHSPjPD+y2SSxttiWw/E7bIBXz3ETEwfGL14KUv/FX8zi2tteO5SY8J3k8/g= 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=FMc+yYQV; 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="FMc+yYQV" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1722348607; x=1753884607; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=KzfqhmS8FIygSg5eeXP75nm95AbYuX6rNKCsxtWaRww=; b=FMc+yYQVwPjnX4oFdRe2QThLQ9AZ9hpAr0CjDNVTPE0eICv8WWJs/sG4 nlFlT3IEXY2EkYHundnnlRofpzFTe7G/63skxIpsUpHkveXzPGpCbvLXY ynCBV87zy1g3esuYnBnuN0byEiKhDXDsf/BFGVOBYgaMVnmeTmesVE1WS rD7nw2+sp1+KjEtPi1A7zXu83t2WuFJ0GU6CVJp6uRnUro83xaDkfhJKS nZksNOiz66gbXBr1vsAt1A0LaB6rdyu5GB+B1G3Pa+nsfF8Z+WyT4Bpc/ bSCxIYfvvnRi7Hxu6QoTyPaKc0v4DBjUUtSHWrLEbscpWu9FgdtvUvcP5 w==; X-CSE-ConnectionGUID: pJjtUho7TD2Gsi4T6qZB0A== X-CSE-MsgGUID: xgHq1b6NQquAia1SOVSnBA== X-IronPort-AV: E=Sophos;i="6.09,248,1716274800"; d="scan'208";a="260769373" 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; 30 Jul 2024 07:09:57 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Tue, 30 Jul 2024 07:09:45 -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; Tue, 30 Jul 2024 07:09:40 -0700 From: Raju Lakkaraju To: CC: , , , , , , , , , , , , Subject: [PATCH net-next V3 1/4] net: lan743x: Create separate PCS power reset function Date: Tue, 30 Jul 2024 19:36:16 +0530 Message-ID: <20240730140619.80650-2-Raju.Lakkaraju@microchip.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240730140619.80650-1-Raju.Lakkaraju@microchip.com> References: <20240730140619.80650-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 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 Sun Feb 8 11:44:05 2026 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 5FCB31A0AEF; Tue, 30 Jul 2024 14:10:07 +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=1722348609; cv=none; b=e1asyOqJQbA9/tolXGbTtirdMvKznyymFb1AkWhRSySucSd9rDWBpBH7Iwe0JM347JcLSTvP3vq1vmCwZEWfJKr2tra/8O1eMyzBvjuuPwTqeWwSnLOXLxe5dh+AqoBLg/SvLWPk3VKKSNb1c6N1Cx2QuMAc0EAFPkjt45k85fQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722348609; c=relaxed/simple; bh=q92kTsiCAO+HesV4LSgSax01SMh8pA6Gjpg4zm0PmkM=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=tBSaYfok2dQDCuSFi8q+YeLU8AV5kBag9cKLhi+SpWPEpWNyeANd4vL2s2zLkzx6icGNX8wn0BcG9EFNAac63FjBId7sZVSFCqvpNiWgHdUq/67JNStECoDzel3gAIdkv8di0Qo0nqOkHm65/w+byEvR87lcfKNK8rSnnruw6U4= 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=ZnJs5Imu; 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="ZnJs5Imu" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1722348607; x=1753884607; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=q92kTsiCAO+HesV4LSgSax01SMh8pA6Gjpg4zm0PmkM=; b=ZnJs5ImuaUzDyZNPGSQ5OEcHOhhxoyoELJlRaN972cL1TdVAEshpUAGM udfMO5d0lv7oopVUXdAnzp28PIsN7CHC/oWTOOepzOxwjbaPOGuYapTmi p8fZOPHR8/piYBYSa8OY5WW0vn3i/elkgHJTwx5U2EXYvuzrE6a7qYJJA HgVyTFFSuJm0M/3we2DXBdeGGH/0dlIODLLzfI3nk3kmtONdMh2jXtduG 9XCvrXYirLhx9Hx1vxP4N1Z/ERGyrSc+/YaCwOOfu1PCi7TDJwP4Qnh5r F6RqOFTusZK9BXXWTPT99iKSbX3nrKhPLtwlIPYHoGESnO3bj4wXzZoPS A==; X-CSE-ConnectionGUID: pJjtUho7TD2Gsi4T6qZB0A== X-CSE-MsgGUID: ZmEpBAh9SEuk49DejQce7A== X-IronPort-AV: E=Sophos;i="6.09,248,1716274800"; d="scan'208";a="260769375" 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; 30 Jul 2024 07:09:58 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Tue, 30 Jul 2024 07:09:50 -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; Tue, 30 Jul 2024 07:09:45 -0700 From: Raju Lakkaraju To: CC: , , , , , , , , , , , , Subject: [PATCH net-next V3 2/4] net: lan743x: Create separate Link Speed Duplex state function Date: Tue, 30 Jul 2024 19:36:17 +0530 Message-ID: <20240730140619.80650-3-Raju.Lakkaraju@microchip.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240730140619.80650-1-Raju.Lakkaraju@microchip.com> References: <20240730140619.80650-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 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 Sun Feb 8 11:44:05 2026 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 BFCB21A0B12; Tue, 30 Jul 2024 14:10:08 +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=1722348610; cv=none; b=MEi8IzvRb760cI5Fxj7XO0uHIaobnbqO1CiOlHiqPy9FLqC3crx9XEN32nb0J0n1/B+KzW8rK4Tg0jEWfvWpb4OIzSdjYQ7yQR2iukWSy81/V5DxEXLH6Cb5R0WXTSHIQKIZIHDLRmfKD70Ha1n4YYijsYi1kFQJ8YZrIesj4eA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722348610; c=relaxed/simple; bh=BiKvYD2RNIfB5rlcjOlknWR/ucnN8CzfQ3scbF4Ha5c=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=kWX4wPgd3DGvKu43sgq5JR/7+4BAPOtoNXS++IXYeQG/iRxqYx9kMFoOFoSpjGCPz1N+L5x6bCuNPc8ce8V4ESYNjwF5yiOAIZ6yU0QAuNfDmWWtem1yARW8d7hEazJF9MvZlLqGCNmWM6tAzXVNtYrX/fcoPE01hwJ6VVPx23Q= 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=AEAjqyRF; 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="AEAjqyRF" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1722348609; x=1753884609; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=BiKvYD2RNIfB5rlcjOlknWR/ucnN8CzfQ3scbF4Ha5c=; b=AEAjqyRFhAXoh4EQkKcETyA9q/t0sRpH+oUwTOkb5ahOMCNHqrlQGQuX 8lF1WPnL+DdwN8flqlXIUF4GEUod8Ns1wpAX6le/hPZETcYGLgrOCMwuk 0VpQEs4yZHQB0EGXDuAoDusQJeX1Freh/aJYp8bWE41jdye9Pk8mprFTQ 7eCq1xAN9Y/zFSxtG+ic8OyYTdxIeuhR9m8LhyJYnjNMkmaPctwovjY06 wBpBsAIBN+r8CvYb2SwIkG8niG2XY3a9/uFBsczPZw9LmH8zBQG8sMhnD Fu05fzidXEYCRKc4gc2Dm52wrB7CVneZSH8hIFFjaxHDwWOKwQz92y9uz g==; X-CSE-ConnectionGUID: pJjtUho7TD2Gsi4T6qZB0A== X-CSE-MsgGUID: s33paKr0RxWpv9tMmwSUVw== X-IronPort-AV: E=Sophos;i="6.09,248,1716274800"; d="scan'208";a="260769379" 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; 30 Jul 2024 07:09:58 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Tue, 30 Jul 2024 07:09:55 -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; Tue, 30 Jul 2024 07:09:51 -0700 From: Raju Lakkaraju To: CC: , , , , , , , , , , , , Subject: [PATCH net-next V3 3/4] net: lan743x: Migrate phylib to phylink Date: Tue, 30 Jul 2024 19:36:18 +0530 Message-ID: <20240730140619.80650-4-Raju.Lakkaraju@microchip.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240730140619.80650-1-Raju.Lakkaraju@microchip.com> References: <20240730140619.80650-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 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 | 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..845a48ca497d 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,322 @@ 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 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); + __set_bit(PHY_INTERFACE_MODE_RGMII_ID, + adapter->phylink_config.supported_interfaces); + __set_bit(PHY_INTERFACE_MODE_RGMII_RXID, + adapter->phylink_config.supported_interfaces); + __set_bit(PHY_INTERFACE_MODE_RGMII_TXID, + 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 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 +3199,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 +3222,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 +3269,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 +3297,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 +3409,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 +3633,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 @@ -3781,6 +3903,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 +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 Sun Feb 8 11:44:05 2026 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 BD0531A2553; Tue, 30 Jul 2024 14:10:41 +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=1722348643; cv=none; b=RHiUxcphTYYzjRWBd2rBDXfEd4MsNVo9sb9ZPEeyhdZHPZ4QGriytitkc2KWWsPXjTzVd67SVM/et+csSlowPMVh2+P6WbRcjTF6PtG4j56zjpuwIoAC2/n2VkUjJpErs6qLwHnYggQBLzqZq3TW3CPdf2JRAJ4hYtxtn2thEKw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722348643; c=relaxed/simple; bh=4xxPQHBSi86OK6zgmSazJdF+rZWQU6XktkH2/RdwNvQ=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=GcomEz9jblnA+HQJO94dxQ/TNv+IpoyJZRfiuaf6Bm1YGZy7JkSwTB+NvHpBQQsZMgBUIWm1Hex64h9skE7twMYY9246EYfZr/pH/SOfdNWxmEXWxgCJFxx3wv1jpFK3H9D3IJJosxg89pa/cICSGB6OIFb2IW/qll07W/UklH0= 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=KReWhPLQ; 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="KReWhPLQ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1722348642; x=1753884642; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=4xxPQHBSi86OK6zgmSazJdF+rZWQU6XktkH2/RdwNvQ=; b=KReWhPLQLEbG1c6qZj8zvSfHWoh93L47gGqG9a01gYpQVm870DlDNnVG VnrXvcIpihrDrbB0W1d33guFT7bu8733NlPhRnWs3IvMJIfD41nmTYc22 7a8L5/1Ua+FIDtzY4+PWnLdE9OpOvN1W66Yx1i+/5SVbvcuVHeqOBupa6 R7VSJ9/ui37B6aihh/Vltc1fpWgSTHitfHQb6Y5Tqf7ExlFVYnK9eBpZD EsRnmOcL5RPfflX9/p6W0FDKLZ02pF/XcTCZPrqthAMrL17VqqP3cUIPO T0QTeWiArKXHImm5eg4vpT4THcq2Syj2+T56zu26k8+aEdeUdiLgoiv3h Q==; X-CSE-ConnectionGUID: J8tPDb4ITRCjvHEJZo5AIQ== X-CSE-MsgGUID: qy6zFgx6TaGiLSmGM/5EtQ== X-IronPort-AV: E=Sophos;i="6.09,248,1716274800"; d="scan'208";a="29866447" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa3.microchip.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 30 Jul 2024 07:10:41 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Tue, 30 Jul 2024 07:10:00 -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; Tue, 30 Jul 2024 07:09:56 -0700 From: Raju Lakkaraju To: CC: , , , , , , , , , , , , Subject: [PATCH net-next V3 4/4] net: lan743x: Add support to ethtool phylink get and set settings Date: Tue, 30 Jul 2024 19:36:19 +0530 Message-ID: <20240730140619.80650-5-Raju.Lakkaraju@microchip.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240730140619.80650-1-Raju.Lakkaraju@microchip.com> References: <20240730140619.80650-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 V2 -> V3: - No change 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 845a48ca497d..dc46686529a2 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, @@ -3055,6 +3072,14 @@ static void lan743x_phylink_mac_link_up(struct phyli= nk_config *config, cap & FLOW_CTRL_TX, cap & FLOW_CTRL_RX); =20 + 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); + } + 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..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