mirror of
				https://github.com/openwrt/openwrt.git
				synced 2025-11-04 08:17:24 +08:00 
			
		
		
		
	generic: backport support for Aeonsemi AS21xxx PHY
Backport support for Aeonsemi AS121xxx PHY. The PHY require dedicated firmware to be loaded to correctly work and support a big family of Aeonsemi PHY that provide from 1G to 10G speed. Automatically refresh all affected patch and file (rtl PHY). Link: https://github.com/openwrt/openwrt/pull/19816 Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
This commit is contained in:
		@ -557,6 +557,23 @@ endef
 | 
			
		||||
$(eval $(call KernelPackage,phy-vitesse))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
define KernelPackage/phy-aeonsemi-as21xxx
 | 
			
		||||
  SUBMENU:=$(NETWORK_DEVICES_MENU)
 | 
			
		||||
  TITLE:=Aeonsemi AS21xxx 10G Ethernet PHY
 | 
			
		||||
  DEPENDS:=+aeonsemi-as21xxx-firmware +kmod-libphy
 | 
			
		||||
  KCONFIG:=CONFIG_AS21XXX_PHY
 | 
			
		||||
  FILES:= \
 | 
			
		||||
   $(LINUX_DIR)/drivers/net/phy/as21xxx.ko
 | 
			
		||||
  AUTOLOAD:=$(call AutoLoad,18,as21xxx)
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define KernelPackage/phy-aeonsemi-as21x1x/description
 | 
			
		||||
  Kernel modules for Aeonsemi AS21x1x 10G Ethernet PHY
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
$(eval $(call KernelPackage,phy-aeonsemi-as21xxx))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
define KernelPackage/phy-airoha-en8811h
 | 
			
		||||
  SUBMENU:=$(NETWORK_DEVICES_MENU)
 | 
			
		||||
  TITLE:=Airoha EN8811H 2.5G Ethernet PHY
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,303 @@
 | 
			
		||||
From 31afd6bc55cc0093c3e5b0a368319e423d4de8ea Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Christian Marangi <ansuelsmth@gmail.com>
 | 
			
		||||
Date: Sat, 17 May 2025 22:13:45 +0200
 | 
			
		||||
Subject: [PATCH] net: phy: pass PHY driver to .match_phy_device OP
 | 
			
		||||
 | 
			
		||||
Pass PHY driver pointer to .match_phy_device OP in addition to phydev.
 | 
			
		||||
Having access to the PHY driver struct might be useful to check the
 | 
			
		||||
PHY ID of the driver is being matched for in case the PHY ID scanned in
 | 
			
		||||
the phydev is not consistent.
 | 
			
		||||
 | 
			
		||||
A scenario for this is a PHY that change PHY ID after a firmware is
 | 
			
		||||
loaded, in such case, the PHY ID stored in PHY device struct is not
 | 
			
		||||
valid anymore and PHY will manually scan the ID in the match_phy_device
 | 
			
		||||
function.
 | 
			
		||||
 | 
			
		||||
Having the PHY driver info is also useful for those PHY driver that
 | 
			
		||||
implement multiple simple .match_phy_device OP to match specific MMD PHY
 | 
			
		||||
ID. With this extra info if the parsing logic is the same, the matching
 | 
			
		||||
function can be generalized by using the phy_id in the PHY driver
 | 
			
		||||
instead of hardcoding.
 | 
			
		||||
 | 
			
		||||
Rust wrapper callback is updated to align to the new match_phy_device
 | 
			
		||||
arguments.
 | 
			
		||||
 | 
			
		||||
Suggested-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
 | 
			
		||||
Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
 | 
			
		||||
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
 | 
			
		||||
Reviewed-by: Benno Lossin <lossin@kernel.org> # for Rust
 | 
			
		||||
Reviewed-by: FUJITA Tomonori <fujita.tomonori@gmail.com>
 | 
			
		||||
Link: https://patch.msgid.link/20250517201353.5137-2-ansuelsmth@gmail.com
 | 
			
		||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
 | 
			
		||||
---
 | 
			
		||||
 drivers/net/phy/bcm87xx.c              |  6 ++++--
 | 
			
		||||
 drivers/net/phy/icplus.c               |  6 ++++--
 | 
			
		||||
 drivers/net/phy/marvell10g.c           | 12 ++++++++----
 | 
			
		||||
 drivers/net/phy/micrel.c               |  6 ++++--
 | 
			
		||||
 drivers/net/phy/nxp-c45-tja11xx.c      | 12 ++++++++----
 | 
			
		||||
 drivers/net/phy/nxp-tja11xx.c          |  6 ++++--
 | 
			
		||||
 drivers/net/phy/phy_device.c           |  2 +-
 | 
			
		||||
 drivers/net/phy/realtek/realtek_main.c | 27 +++++++++++++++++---------
 | 
			
		||||
 drivers/net/phy/teranetics.c           |  3 ++-
 | 
			
		||||
 include/linux/phy.h                    |  3 ++-
 | 
			
		||||
 rust/kernel/net/phy.rs                 |  1 +
 | 
			
		||||
 11 files changed, 56 insertions(+), 28 deletions(-)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/phy/bcm87xx.c
 | 
			
		||||
+++ b/drivers/net/phy/bcm87xx.c
 | 
			
		||||
@@ -185,12 +185,14 @@ static irqreturn_t bcm87xx_handle_interr
 | 
			
		||||
 	return IRQ_HANDLED;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int bcm8706_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int bcm8706_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				    const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return phydev->c45_ids.device_ids[4] == PHY_ID_BCM8706;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int bcm8727_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int bcm8727_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				    const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return phydev->c45_ids.device_ids[4] == PHY_ID_BCM8727;
 | 
			
		||||
 }
 | 
			
		||||
--- a/drivers/net/phy/icplus.c
 | 
			
		||||
+++ b/drivers/net/phy/icplus.c
 | 
			
		||||
@@ -520,12 +520,14 @@ static int ip101a_g_match_phy_device(str
 | 
			
		||||
 	return ip101a == !ret;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int ip101a_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int ip101a_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				   const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return ip101a_g_match_phy_device(phydev, true);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int ip101g_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int ip101g_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				   const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return ip101a_g_match_phy_device(phydev, false);
 | 
			
		||||
 }
 | 
			
		||||
--- a/drivers/net/phy/marvell10g.c
 | 
			
		||||
+++ b/drivers/net/phy/marvell10g.c
 | 
			
		||||
@@ -1284,7 +1284,8 @@ static int mv3310_get_number_of_ports(st
 | 
			
		||||
 	return ret + 1;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int mv3310_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int mv3310_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				   const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	if ((phydev->c45_ids.device_ids[MDIO_MMD_PMAPMD] &
 | 
			
		||||
 	     MARVELL_PHY_ID_MASK) != MARVELL_PHY_ID_88X3310)
 | 
			
		||||
@@ -1293,7 +1294,8 @@ static int mv3310_match_phy_device(struc
 | 
			
		||||
 	return mv3310_get_number_of_ports(phydev) == 1;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int mv3340_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int mv3340_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				   const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	if ((phydev->c45_ids.device_ids[MDIO_MMD_PMAPMD] &
 | 
			
		||||
 	     MARVELL_PHY_ID_MASK) != MARVELL_PHY_ID_88X3310)
 | 
			
		||||
@@ -1317,12 +1319,14 @@ static int mv211x_match_phy_device(struc
 | 
			
		||||
 	return !!(val & MDIO_PCS_SPEED_5G) == has_5g;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int mv2110_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int mv2110_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				   const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return mv211x_match_phy_device(phydev, true);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int mv2111_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int mv2111_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				   const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return mv211x_match_phy_device(phydev, false);
 | 
			
		||||
 }
 | 
			
		||||
--- a/drivers/net/phy/micrel.c
 | 
			
		||||
+++ b/drivers/net/phy/micrel.c
 | 
			
		||||
@@ -768,7 +768,8 @@ static int ksz8051_ksz8795_match_phy_dev
 | 
			
		||||
 		return !ret;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int ksz8051_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int ksz8051_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				    const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return ksz8051_ksz8795_match_phy_device(phydev, true);
 | 
			
		||||
 }
 | 
			
		||||
@@ -888,7 +889,8 @@ static int ksz8061_config_init(struct ph
 | 
			
		||||
 	return kszphy_config_init(phydev);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int ksz8795_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int ksz8795_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				    const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return ksz8051_ksz8795_match_phy_device(phydev, false);
 | 
			
		||||
 }
 | 
			
		||||
--- a/drivers/net/phy/nxp-c45-tja11xx.c
 | 
			
		||||
+++ b/drivers/net/phy/nxp-c45-tja11xx.c
 | 
			
		||||
@@ -1944,13 +1944,15 @@ static int nxp_c45_macsec_ability(struct
 | 
			
		||||
 	return macsec_ability;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int tja1103_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int tja1103_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				    const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return phy_id_compare(phydev->phy_id, PHY_ID_TJA_1103, PHY_ID_MASK) &&
 | 
			
		||||
 	       !nxp_c45_macsec_ability(phydev);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int tja1104_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int tja1104_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				    const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return phy_id_compare(phydev->phy_id, PHY_ID_TJA_1103, PHY_ID_MASK) &&
 | 
			
		||||
 	       nxp_c45_macsec_ability(phydev);
 | 
			
		||||
--- a/drivers/net/phy/nxp-tja11xx.c
 | 
			
		||||
+++ b/drivers/net/phy/nxp-tja11xx.c
 | 
			
		||||
@@ -646,12 +646,14 @@ static int tja1102_match_phy_device(stru
 | 
			
		||||
 	return !ret;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int tja1102_p0_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int tja1102_p0_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				       const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return tja1102_match_phy_device(phydev, true);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int tja1102_p1_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int tja1102_p1_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				       const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return tja1102_match_phy_device(phydev, false);
 | 
			
		||||
 }
 | 
			
		||||
--- a/drivers/net/phy/phy_device.c
 | 
			
		||||
+++ b/drivers/net/phy/phy_device.c
 | 
			
		||||
@@ -600,7 +600,7 @@ static int phy_bus_match(struct device *
 | 
			
		||||
 		return 0;
 | 
			
		||||
 
 | 
			
		||||
 	if (phydrv->match_phy_device)
 | 
			
		||||
-		return phydrv->match_phy_device(phydev);
 | 
			
		||||
+		return phydrv->match_phy_device(phydev, phydrv);
 | 
			
		||||
 
 | 
			
		||||
 	if (phydev->is_c45) {
 | 
			
		||||
 		for (i = 1; i < num_ids; i++) {
 | 
			
		||||
--- a/drivers/net/phy/realtek/realtek_main.c
 | 
			
		||||
+++ b/drivers/net/phy/realtek/realtek_main.c
 | 
			
		||||
@@ -1343,13 +1343,15 @@ static bool rtlgen_supports_mmd(struct p
 | 
			
		||||
 	return val > 0;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int rtlgen_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int rtlgen_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				   const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return phydev->phy_id == RTL_GENERIC_PHYID &&
 | 
			
		||||
 	       !rtlgen_supports_2_5gbps(phydev);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int rtl8226_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int rtl8226_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				    const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return phydev->phy_id == RTL_GENERIC_PHYID &&
 | 
			
		||||
 	       rtlgen_supports_2_5gbps(phydev) &&
 | 
			
		||||
@@ -1365,32 +1367,38 @@ static int rtlgen_is_c45_match(struct ph
 | 
			
		||||
 		return !is_c45 && (id == phydev->phy_id);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int rtl8221b_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int rtl8221b_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				     const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return phydev->phy_id == RTL_8221B && rtlgen_supports_mmd(phydev);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int rtl8221b_vb_cg_c22_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int rtl8221b_vb_cg_c22_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+					       const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return rtlgen_is_c45_match(phydev, RTL_8221B_VB_CG, false);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int rtl8221b_vb_cg_c45_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int rtl8221b_vb_cg_c45_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+					       const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return rtlgen_is_c45_match(phydev, RTL_8221B_VB_CG, true);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int rtl8221b_vn_cg_c22_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int rtl8221b_vn_cg_c22_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+					       const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return rtlgen_is_c45_match(phydev, RTL_8221B_VN_CG, false);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int rtl8221b_vn_cg_c45_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int rtl8221b_vn_cg_c45_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+					       const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return rtlgen_is_c45_match(phydev, RTL_8221B_VN_CG, true);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int rtl_internal_nbaset_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int rtl_internal_nbaset_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+						const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	if (phydev->is_c45)
 | 
			
		||||
 		return false;
 | 
			
		||||
@@ -1409,7 +1417,8 @@ static int rtl_internal_nbaset_match_phy
 | 
			
		||||
 	return rtlgen_supports_2_5gbps(phydev) && !rtlgen_supports_mmd(phydev);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int rtl8251b_c45_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int rtl8251b_c45_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+					 const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return rtlgen_is_c45_match(phydev, RTL_8251B, true);
 | 
			
		||||
 }
 | 
			
		||||
--- a/drivers/net/phy/teranetics.c
 | 
			
		||||
+++ b/drivers/net/phy/teranetics.c
 | 
			
		||||
@@ -67,7 +67,8 @@ static int teranetics_read_status(struct
 | 
			
		||||
 	return 0;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int teranetics_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int teranetics_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				       const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return phydev->c45_ids.device_ids[3] == PHY_ID_TN2020;
 | 
			
		||||
 }
 | 
			
		||||
--- a/include/linux/phy.h
 | 
			
		||||
+++ b/include/linux/phy.h
 | 
			
		||||
@@ -1004,7 +1004,8 @@ struct phy_driver {
 | 
			
		||||
 	 * driver for the given phydev.	 If NULL, matching is based on
 | 
			
		||||
 	 * phy_id and phy_id_mask.
 | 
			
		||||
 	 */
 | 
			
		||||
-	int (*match_phy_device)(struct phy_device *phydev);
 | 
			
		||||
+	int (*match_phy_device)(struct phy_device *phydev,
 | 
			
		||||
+				const struct phy_driver *phydrv);
 | 
			
		||||
 
 | 
			
		||||
 	/**
 | 
			
		||||
 	 * @set_wol: Some devices (e.g. qnap TS-119P II) require PHY
 | 
			
		||||
--- a/rust/kernel/net/phy.rs
 | 
			
		||||
+++ b/rust/kernel/net/phy.rs
 | 
			
		||||
@@ -421,6 +421,7 @@ impl<T: Driver> Adapter<T> {
 | 
			
		||||
     /// `phydev` must be passed by the corresponding callback in `phy_driver`.
 | 
			
		||||
     unsafe extern "C" fn match_phy_device_callback(
 | 
			
		||||
         phydev: *mut bindings::phy_device,
 | 
			
		||||
+        _phydrv: *const bindings::phy_driver,
 | 
			
		||||
     ) -> crate::ffi::c_int {
 | 
			
		||||
         // SAFETY: This callback is called only in contexts
 | 
			
		||||
         // where we hold `phy_device->lock`, so the accessors on
 | 
			
		||||
@ -0,0 +1,109 @@
 | 
			
		||||
From d6c45707ac84c2d9f274ece1cea4dddb97996bde Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Christian Marangi <ansuelsmth@gmail.com>
 | 
			
		||||
Date: Sat, 17 May 2025 22:13:48 +0200
 | 
			
		||||
Subject: [PATCH 4/5] net: phy: introduce genphy_match_phy_device()
 | 
			
		||||
 | 
			
		||||
Introduce new API, genphy_match_phy_device(), to provide a way to check
 | 
			
		||||
to match a PHY driver for a PHY device based on the info stored in the
 | 
			
		||||
PHY device struct.
 | 
			
		||||
 | 
			
		||||
The function generalize the logic used in phy_bus_match() to check the
 | 
			
		||||
PHY ID whether if C45 or C22 ID should be used for matching.
 | 
			
		||||
 | 
			
		||||
This is useful for custom .match_phy_device function that wants to use
 | 
			
		||||
the generic logic under some condition. (example a PHY is already setup
 | 
			
		||||
and provide the correct PHY ID)
 | 
			
		||||
 | 
			
		||||
Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
 | 
			
		||||
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
 | 
			
		||||
Link: https://patch.msgid.link/20250517201353.5137-5-ansuelsmth@gmail.com
 | 
			
		||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
 | 
			
		||||
---
 | 
			
		||||
 drivers/net/phy/phy_device.c | 52 +++++++++++++++++++++++++-----------
 | 
			
		||||
 include/linux/phy.h          |  3 +++
 | 
			
		||||
 2 files changed, 40 insertions(+), 15 deletions(-)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/phy/phy_device.c
 | 
			
		||||
+++ b/drivers/net/phy/phy_device.c
 | 
			
		||||
@@ -589,20 +589,26 @@ static int phy_scan_fixups(struct phy_de
 | 
			
		||||
 	return 0;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int phy_bus_match(struct device *dev, const struct device_driver *drv)
 | 
			
		||||
+/**
 | 
			
		||||
+ * genphy_match_phy_device - match a PHY device with a PHY driver
 | 
			
		||||
+ * @phydev: target phy_device struct
 | 
			
		||||
+ * @phydrv: target phy_driver struct
 | 
			
		||||
+ *
 | 
			
		||||
+ * Description: Checks whether the given PHY device matches the specified
 | 
			
		||||
+ * PHY driver. For Clause 45 PHYs, iterates over the available device
 | 
			
		||||
+ * identifiers and compares them against the driver's expected PHY ID,
 | 
			
		||||
+ * applying the provided mask. For Clause 22 PHYs, a direct ID comparison
 | 
			
		||||
+ * is performed.
 | 
			
		||||
+ *
 | 
			
		||||
+ * Return: 1 if the PHY device matches the driver, 0 otherwise.
 | 
			
		||||
+ */
 | 
			
		||||
+int genphy_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+			    const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
-	struct phy_device *phydev = to_phy_device(dev);
 | 
			
		||||
-	const struct phy_driver *phydrv = to_phy_driver(drv);
 | 
			
		||||
-	const int num_ids = ARRAY_SIZE(phydev->c45_ids.device_ids);
 | 
			
		||||
-	int i;
 | 
			
		||||
-
 | 
			
		||||
-	if (!(phydrv->mdiodrv.flags & MDIO_DEVICE_IS_PHY))
 | 
			
		||||
-		return 0;
 | 
			
		||||
-
 | 
			
		||||
-	if (phydrv->match_phy_device)
 | 
			
		||||
-		return phydrv->match_phy_device(phydev, phydrv);
 | 
			
		||||
-
 | 
			
		||||
 	if (phydev->is_c45) {
 | 
			
		||||
+		const int num_ids = ARRAY_SIZE(phydev->c45_ids.device_ids);
 | 
			
		||||
+		int i;
 | 
			
		||||
+
 | 
			
		||||
 		for (i = 1; i < num_ids; i++) {
 | 
			
		||||
 			if (phydev->c45_ids.device_ids[i] == 0xffffffff)
 | 
			
		||||
 				continue;
 | 
			
		||||
@@ -611,11 +617,27 @@ static int phy_bus_match(struct device *
 | 
			
		||||
 					   phydrv->phy_id, phydrv->phy_id_mask))
 | 
			
		||||
 				return 1;
 | 
			
		||||
 		}
 | 
			
		||||
+
 | 
			
		||||
 		return 0;
 | 
			
		||||
-	} else {
 | 
			
		||||
-		return phy_id_compare(phydev->phy_id, phydrv->phy_id,
 | 
			
		||||
-				      phydrv->phy_id_mask);
 | 
			
		||||
 	}
 | 
			
		||||
+
 | 
			
		||||
+	return phy_id_compare(phydev->phy_id, phydrv->phy_id,
 | 
			
		||||
+			      phydrv->phy_id_mask);
 | 
			
		||||
+}
 | 
			
		||||
+EXPORT_SYMBOL_GPL(genphy_match_phy_device);
 | 
			
		||||
+
 | 
			
		||||
+static int phy_bus_match(struct device *dev, const struct device_driver *drv)
 | 
			
		||||
+{
 | 
			
		||||
+	struct phy_device *phydev = to_phy_device(dev);
 | 
			
		||||
+	const struct phy_driver *phydrv = to_phy_driver(drv);
 | 
			
		||||
+
 | 
			
		||||
+	if (!(phydrv->mdiodrv.flags & MDIO_DEVICE_IS_PHY))
 | 
			
		||||
+		return 0;
 | 
			
		||||
+
 | 
			
		||||
+	if (phydrv->match_phy_device)
 | 
			
		||||
+		return phydrv->match_phy_device(phydev, phydrv);
 | 
			
		||||
+
 | 
			
		||||
+	return genphy_match_phy_device(phydev, phydrv);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static ssize_t
 | 
			
		||||
--- a/include/linux/phy.h
 | 
			
		||||
+++ b/include/linux/phy.h
 | 
			
		||||
@@ -1906,6 +1906,9 @@ char *phy_attached_info_irq(struct phy_d
 | 
			
		||||
 	__malloc;
 | 
			
		||||
 void phy_attached_info(struct phy_device *phydev);
 | 
			
		||||
 
 | 
			
		||||
+int genphy_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+			    const struct phy_driver *phydrv);
 | 
			
		||||
+
 | 
			
		||||
 /* Clause 22 PHY */
 | 
			
		||||
 int genphy_read_abilities(struct phy_device *phydev);
 | 
			
		||||
 int genphy_setup_forced(struct phy_device *phydev);
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -0,0 +1,273 @@
 | 
			
		||||
From 31afd6bc55cc0093c3e5b0a368319e423d4de8ea Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Christian Marangi <ansuelsmth@gmail.com>
 | 
			
		||||
Date: Sat, 17 May 2025 22:13:45 +0200
 | 
			
		||||
Subject: [PATCH 1/5] net: phy: pass PHY driver to .match_phy_device OP
 | 
			
		||||
 | 
			
		||||
Pass PHY driver pointer to .match_phy_device OP in addition to phydev.
 | 
			
		||||
Having access to the PHY driver struct might be useful to check the
 | 
			
		||||
PHY ID of the driver is being matched for in case the PHY ID scanned in
 | 
			
		||||
the phydev is not consistent.
 | 
			
		||||
 | 
			
		||||
A scenario for this is a PHY that change PHY ID after a firmware is
 | 
			
		||||
loaded, in such case, the PHY ID stored in PHY device struct is not
 | 
			
		||||
valid anymore and PHY will manually scan the ID in the match_phy_device
 | 
			
		||||
function.
 | 
			
		||||
 | 
			
		||||
Having the PHY driver info is also useful for those PHY driver that
 | 
			
		||||
implement multiple simple .match_phy_device OP to match specific MMD PHY
 | 
			
		||||
ID. With this extra info if the parsing logic is the same, the matching
 | 
			
		||||
function can be generalized by using the phy_id in the PHY driver
 | 
			
		||||
instead of hardcoding.
 | 
			
		||||
 | 
			
		||||
Rust wrapper callback is updated to align to the new match_phy_device
 | 
			
		||||
arguments.
 | 
			
		||||
 | 
			
		||||
Suggested-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
 | 
			
		||||
Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
 | 
			
		||||
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
 | 
			
		||||
Reviewed-by: Benno Lossin <lossin@kernel.org> # for Rust
 | 
			
		||||
Reviewed-by: FUJITA Tomonori <fujita.tomonori@gmail.com>
 | 
			
		||||
Link: https://patch.msgid.link/20250517201353.5137-2-ansuelsmth@gmail.com
 | 
			
		||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
 | 
			
		||||
---
 | 
			
		||||
 drivers/net/phy/bcm87xx.c              |  6 ++++--
 | 
			
		||||
 drivers/net/phy/icplus.c               |  6 ++++--
 | 
			
		||||
 drivers/net/phy/marvell10g.c           | 12 ++++++++----
 | 
			
		||||
 drivers/net/phy/micrel.c               |  6 ++++--
 | 
			
		||||
 drivers/net/phy/nxp-c45-tja11xx.c      | 12 ++++++++----
 | 
			
		||||
 drivers/net/phy/nxp-tja11xx.c          |  6 ++++--
 | 
			
		||||
 drivers/net/phy/phy_device.c           |  2 +-
 | 
			
		||||
 drivers/net/phy/realtek/realtek_main.c | 27 +++++++++++++++++---------
 | 
			
		||||
 drivers/net/phy/teranetics.c           |  3 ++-
 | 
			
		||||
 include/linux/phy.h                    |  3 ++-
 | 
			
		||||
 rust/kernel/net/phy.rs                 |  1 +
 | 
			
		||||
 11 files changed, 56 insertions(+), 28 deletions(-)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/phy/bcm87xx.c
 | 
			
		||||
+++ b/drivers/net/phy/bcm87xx.c
 | 
			
		||||
@@ -185,12 +185,14 @@ static irqreturn_t bcm87xx_handle_interr
 | 
			
		||||
 	return IRQ_HANDLED;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int bcm8706_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int bcm8706_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				    const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return phydev->c45_ids.device_ids[4] == PHY_ID_BCM8706;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int bcm8727_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int bcm8727_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				    const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return phydev->c45_ids.device_ids[4] == PHY_ID_BCM8727;
 | 
			
		||||
 }
 | 
			
		||||
--- a/drivers/net/phy/icplus.c
 | 
			
		||||
+++ b/drivers/net/phy/icplus.c
 | 
			
		||||
@@ -520,12 +520,14 @@ static int ip101a_g_match_phy_device(str
 | 
			
		||||
 	return ip101a == !ret;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int ip101a_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int ip101a_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				   const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return ip101a_g_match_phy_device(phydev, true);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int ip101g_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int ip101g_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				   const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return ip101a_g_match_phy_device(phydev, false);
 | 
			
		||||
 }
 | 
			
		||||
--- a/drivers/net/phy/marvell10g.c
 | 
			
		||||
+++ b/drivers/net/phy/marvell10g.c
 | 
			
		||||
@@ -1221,7 +1221,8 @@ static int mv3310_get_number_of_ports(st
 | 
			
		||||
 	return ret + 1;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int mv3310_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int mv3310_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				   const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	if ((phydev->c45_ids.device_ids[MDIO_MMD_PMAPMD] &
 | 
			
		||||
 	     MARVELL_PHY_ID_MASK) != MARVELL_PHY_ID_88X3310)
 | 
			
		||||
@@ -1230,7 +1231,8 @@ static int mv3310_match_phy_device(struc
 | 
			
		||||
 	return mv3310_get_number_of_ports(phydev) == 1;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int mv3340_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int mv3340_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				   const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	if ((phydev->c45_ids.device_ids[MDIO_MMD_PMAPMD] &
 | 
			
		||||
 	     MARVELL_PHY_ID_MASK) != MARVELL_PHY_ID_88X3310)
 | 
			
		||||
@@ -1254,12 +1256,14 @@ static int mv211x_match_phy_device(struc
 | 
			
		||||
 	return !!(val & MDIO_PCS_SPEED_5G) == has_5g;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int mv2110_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int mv2110_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				   const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return mv211x_match_phy_device(phydev, true);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int mv2111_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int mv2111_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				   const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return mv211x_match_phy_device(phydev, false);
 | 
			
		||||
 }
 | 
			
		||||
--- a/drivers/net/phy/micrel.c
 | 
			
		||||
+++ b/drivers/net/phy/micrel.c
 | 
			
		||||
@@ -670,7 +670,8 @@ static int ksz8051_ksz8795_match_phy_dev
 | 
			
		||||
 		return !ret;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int ksz8051_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int ksz8051_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				    const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return ksz8051_ksz8795_match_phy_device(phydev, true);
 | 
			
		||||
 }
 | 
			
		||||
@@ -790,7 +791,8 @@ static int ksz8061_config_init(struct ph
 | 
			
		||||
 	return kszphy_config_init(phydev);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int ksz8795_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int ksz8795_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				    const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return ksz8051_ksz8795_match_phy_device(phydev, false);
 | 
			
		||||
 }
 | 
			
		||||
--- a/drivers/net/phy/nxp-tja11xx.c
 | 
			
		||||
+++ b/drivers/net/phy/nxp-tja11xx.c
 | 
			
		||||
@@ -648,12 +648,14 @@ static int tja1102_match_phy_device(stru
 | 
			
		||||
 	return !ret;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int tja1102_p0_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int tja1102_p0_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				       const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return tja1102_match_phy_device(phydev, true);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int tja1102_p1_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int tja1102_p1_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				       const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return tja1102_match_phy_device(phydev, false);
 | 
			
		||||
 }
 | 
			
		||||
--- a/drivers/net/phy/phy_device.c
 | 
			
		||||
+++ b/drivers/net/phy/phy_device.c
 | 
			
		||||
@@ -533,7 +533,7 @@ static int phy_bus_match(struct device *
 | 
			
		||||
 		return 0;
 | 
			
		||||
 
 | 
			
		||||
 	if (phydrv->match_phy_device)
 | 
			
		||||
-		return phydrv->match_phy_device(phydev);
 | 
			
		||||
+		return phydrv->match_phy_device(phydev, phydrv);
 | 
			
		||||
 
 | 
			
		||||
 	if (phydev->is_c45) {
 | 
			
		||||
 		for (i = 1; i < num_ids; i++) {
 | 
			
		||||
--- a/drivers/net/phy/realtek/realtek_main.c
 | 
			
		||||
+++ b/drivers/net/phy/realtek/realtek_main.c
 | 
			
		||||
@@ -1315,13 +1315,15 @@ static bool rtlgen_supports_mmd(struct p
 | 
			
		||||
 	return val > 0;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int rtlgen_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int rtlgen_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				   const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return phydev->phy_id == RTL_GENERIC_PHYID &&
 | 
			
		||||
 	       !rtlgen_supports_2_5gbps(phydev);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int rtl8226_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int rtl8226_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				    const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return phydev->phy_id == RTL_GENERIC_PHYID &&
 | 
			
		||||
 	       rtlgen_supports_2_5gbps(phydev) &&
 | 
			
		||||
@@ -1337,32 +1339,38 @@ static int rtlgen_is_c45_match(struct ph
 | 
			
		||||
 		return !is_c45 && (id == phydev->phy_id);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int rtl8221b_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int rtl8221b_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				     const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return phydev->phy_id == RTL_8221B && rtlgen_supports_mmd(phydev);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int rtl8221b_vb_cg_c22_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int rtl8221b_vb_cg_c22_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+					       const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return rtlgen_is_c45_match(phydev, RTL_8221B_VB_CG, false);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int rtl8221b_vb_cg_c45_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int rtl8221b_vb_cg_c45_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+					       const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return rtlgen_is_c45_match(phydev, RTL_8221B_VB_CG, true);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int rtl8221b_vn_cg_c22_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int rtl8221b_vn_cg_c22_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+					       const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return rtlgen_is_c45_match(phydev, RTL_8221B_VN_CG, false);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int rtl8221b_vn_cg_c45_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int rtl8221b_vn_cg_c45_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+					       const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return rtlgen_is_c45_match(phydev, RTL_8221B_VN_CG, true);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int rtl_internal_nbaset_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int rtl_internal_nbaset_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+						const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	if (phydev->is_c45)
 | 
			
		||||
 		return false;
 | 
			
		||||
@@ -1381,7 +1389,8 @@ static int rtl_internal_nbaset_match_phy
 | 
			
		||||
 	return rtlgen_supports_2_5gbps(phydev) && !rtlgen_supports_mmd(phydev);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int rtl8251b_c45_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int rtl8251b_c45_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+					 const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return rtlgen_is_c45_match(phydev, RTL_8251B, true);
 | 
			
		||||
 }
 | 
			
		||||
--- a/drivers/net/phy/teranetics.c
 | 
			
		||||
+++ b/drivers/net/phy/teranetics.c
 | 
			
		||||
@@ -67,7 +67,8 @@ static int teranetics_read_status(struct
 | 
			
		||||
 	return 0;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int teranetics_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
+static int teranetics_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+				       const struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
 	return phydev->c45_ids.device_ids[3] == PHY_ID_TN2020;
 | 
			
		||||
 }
 | 
			
		||||
--- a/include/linux/phy.h
 | 
			
		||||
+++ b/include/linux/phy.h
 | 
			
		||||
@@ -972,7 +972,8 @@ struct phy_driver {
 | 
			
		||||
 	 * driver for the given phydev.	 If NULL, matching is based on
 | 
			
		||||
 	 * phy_id and phy_id_mask.
 | 
			
		||||
 	 */
 | 
			
		||||
-	int (*match_phy_device)(struct phy_device *phydev);
 | 
			
		||||
+	int (*match_phy_device)(struct phy_device *phydev,
 | 
			
		||||
+				const struct phy_driver *phydrv);
 | 
			
		||||
 
 | 
			
		||||
 	/**
 | 
			
		||||
 	 * @set_wol: Some devices (e.g. qnap TS-119P II) require PHY
 | 
			
		||||
@ -0,0 +1,109 @@
 | 
			
		||||
From d6c45707ac84c2d9f274ece1cea4dddb97996bde Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Christian Marangi <ansuelsmth@gmail.com>
 | 
			
		||||
Date: Sat, 17 May 2025 22:13:48 +0200
 | 
			
		||||
Subject: [PATCH 4/5] net: phy: introduce genphy_match_phy_device()
 | 
			
		||||
 | 
			
		||||
Introduce new API, genphy_match_phy_device(), to provide a way to check
 | 
			
		||||
to match a PHY driver for a PHY device based on the info stored in the
 | 
			
		||||
PHY device struct.
 | 
			
		||||
 | 
			
		||||
The function generalize the logic used in phy_bus_match() to check the
 | 
			
		||||
PHY ID whether if C45 or C22 ID should be used for matching.
 | 
			
		||||
 | 
			
		||||
This is useful for custom .match_phy_device function that wants to use
 | 
			
		||||
the generic logic under some condition. (example a PHY is already setup
 | 
			
		||||
and provide the correct PHY ID)
 | 
			
		||||
 | 
			
		||||
Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
 | 
			
		||||
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
 | 
			
		||||
Link: https://patch.msgid.link/20250517201353.5137-5-ansuelsmth@gmail.com
 | 
			
		||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
 | 
			
		||||
---
 | 
			
		||||
 drivers/net/phy/phy_device.c | 52 +++++++++++++++++++++++++-----------
 | 
			
		||||
 include/linux/phy.h          |  3 +++
 | 
			
		||||
 2 files changed, 40 insertions(+), 15 deletions(-)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/phy/phy_device.c
 | 
			
		||||
+++ b/drivers/net/phy/phy_device.c
 | 
			
		||||
@@ -522,20 +522,26 @@ static int phy_scan_fixups(struct phy_de
 | 
			
		||||
 	return 0;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static int phy_bus_match(struct device *dev, struct device_driver *drv)
 | 
			
		||||
+/**
 | 
			
		||||
+ * genphy_match_phy_device - match a PHY device with a PHY driver
 | 
			
		||||
+ * @phydev: target phy_device struct
 | 
			
		||||
+ * @phydrv: target phy_driver struct
 | 
			
		||||
+ *
 | 
			
		||||
+ * Description: Checks whether the given PHY device matches the specified
 | 
			
		||||
+ * PHY driver. For Clause 45 PHYs, iterates over the available device
 | 
			
		||||
+ * identifiers and compares them against the driver's expected PHY ID,
 | 
			
		||||
+ * applying the provided mask. For Clause 22 PHYs, a direct ID comparison
 | 
			
		||||
+ * is performed.
 | 
			
		||||
+ *
 | 
			
		||||
+ * Return: 1 if the PHY device matches the driver, 0 otherwise.
 | 
			
		||||
+ */
 | 
			
		||||
+int genphy_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+			    struct phy_driver *phydrv)
 | 
			
		||||
 {
 | 
			
		||||
-	struct phy_device *phydev = to_phy_device(dev);
 | 
			
		||||
-	struct phy_driver *phydrv = to_phy_driver(drv);
 | 
			
		||||
-	const int num_ids = ARRAY_SIZE(phydev->c45_ids.device_ids);
 | 
			
		||||
-	int i;
 | 
			
		||||
-
 | 
			
		||||
-	if (!(phydrv->mdiodrv.flags & MDIO_DEVICE_IS_PHY))
 | 
			
		||||
-		return 0;
 | 
			
		||||
-
 | 
			
		||||
-	if (phydrv->match_phy_device)
 | 
			
		||||
-		return phydrv->match_phy_device(phydev, phydrv);
 | 
			
		||||
-
 | 
			
		||||
 	if (phydev->is_c45) {
 | 
			
		||||
+		const int num_ids = ARRAY_SIZE(phydev->c45_ids.device_ids);
 | 
			
		||||
+		int i;
 | 
			
		||||
+
 | 
			
		||||
 		for (i = 1; i < num_ids; i++) {
 | 
			
		||||
 			if (phydev->c45_ids.device_ids[i] == 0xffffffff)
 | 
			
		||||
 				continue;
 | 
			
		||||
@@ -544,11 +550,27 @@ static int phy_bus_match(struct device *
 | 
			
		||||
 					   phydrv->phy_id, phydrv->phy_id_mask))
 | 
			
		||||
 				return 1;
 | 
			
		||||
 		}
 | 
			
		||||
+
 | 
			
		||||
 		return 0;
 | 
			
		||||
-	} else {
 | 
			
		||||
-		return phy_id_compare(phydev->phy_id, phydrv->phy_id,
 | 
			
		||||
-				      phydrv->phy_id_mask);
 | 
			
		||||
 	}
 | 
			
		||||
+
 | 
			
		||||
+	return phy_id_compare(phydev->phy_id, phydrv->phy_id,
 | 
			
		||||
+			      phydrv->phy_id_mask);
 | 
			
		||||
+}
 | 
			
		||||
+EXPORT_SYMBOL_GPL(genphy_match_phy_device);
 | 
			
		||||
+
 | 
			
		||||
+static int phy_bus_match(struct device *dev, struct device_driver *drv)
 | 
			
		||||
+{
 | 
			
		||||
+	struct phy_device *phydev = to_phy_device(dev);
 | 
			
		||||
+	struct phy_driver *phydrv = to_phy_driver(drv);
 | 
			
		||||
+
 | 
			
		||||
+	if (!(phydrv->mdiodrv.flags & MDIO_DEVICE_IS_PHY))
 | 
			
		||||
+		return 0;
 | 
			
		||||
+
 | 
			
		||||
+	if (phydrv->match_phy_device)
 | 
			
		||||
+		return phydrv->match_phy_device(phydev, phydrv);
 | 
			
		||||
+
 | 
			
		||||
+	return genphy_match_phy_device(phydev, phydrv);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static ssize_t
 | 
			
		||||
--- a/include/linux/phy.h
 | 
			
		||||
+++ b/include/linux/phy.h
 | 
			
		||||
@@ -1812,6 +1812,9 @@ char *phy_attached_info_irq(struct phy_d
 | 
			
		||||
 	__malloc;
 | 
			
		||||
 void phy_attached_info(struct phy_device *phydev);
 | 
			
		||||
 
 | 
			
		||||
+int genphy_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
+			    struct phy_driver *phydrv);
 | 
			
		||||
+
 | 
			
		||||
 /* Clause 22 PHY */
 | 
			
		||||
 int genphy_read_abilities(struct phy_device *phydev);
 | 
			
		||||
 int genphy_setup_forced(struct phy_device *phydev);
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -27,9 +27,9 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/phy/Kconfig
 | 
			
		||||
+++ b/drivers/net/phy/Kconfig
 | 
			
		||||
@@ -68,6 +68,11 @@ config SFP
 | 
			
		||||
 
 | 
			
		||||
 comment "MII PHY device drivers"
 | 
			
		||||
@@ -80,6 +80,11 @@ config AS21XXX_PHY
 | 
			
		||||
 	  AS21210PB1 that all register with the PHY ID 0x7500 0x7500
 | 
			
		||||
 	  before the firmware is loaded.
 | 
			
		||||
 
 | 
			
		||||
+config AIR_EN8811H_PHY
 | 
			
		||||
+	tristate "Airoha EN8811H 2.5 Gigabit PHY"
 | 
			
		||||
@ -48,7 +48,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
 | 
			
		||||
+obj-$(CONFIG_AIR_EN8811H_PHY)   += air_en8811h.o
 | 
			
		||||
 obj-$(CONFIG_AMD_PHY)		+= amd.o
 | 
			
		||||
 obj-$(CONFIG_AQUANTIA_PHY)	+= aquantia/
 | 
			
		||||
 obj-$(CONFIG_AX88796B_PHY)	+= ax88796b.o
 | 
			
		||||
 obj-$(CONFIG_AS21XXX_PHY)	+= as21xxx.o
 | 
			
		||||
--- /dev/null
 | 
			
		||||
+++ b/drivers/net/phy/air_en8811h.c
 | 
			
		||||
@@ -0,0 +1,1086 @@
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@ Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/phy/Kconfig
 | 
			
		||||
+++ b/drivers/net/phy/Kconfig
 | 
			
		||||
@@ -74,9 +74,9 @@ config AIR_EN8811H_PHY
 | 
			
		||||
@@ -86,9 +86,9 @@ config AIR_EN8811H_PHY
 | 
			
		||||
 	  Currently supports the Airoha EN8811H PHY.
 | 
			
		||||
 
 | 
			
		||||
 config AMD_PHY
 | 
			
		||||
 | 
			
		||||
@ -28,7 +28,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/phy/phy_device.c
 | 
			
		||||
+++ b/drivers/net/phy/phy_device.c
 | 
			
		||||
@@ -3204,6 +3204,7 @@ static int of_phy_led(struct phy_device
 | 
			
		||||
@@ -3226,6 +3226,7 @@ static int of_phy_led(struct phy_device
 | 
			
		||||
 	struct device *dev = &phydev->mdio.dev;
 | 
			
		||||
 	struct led_init_data init_data = {};
 | 
			
		||||
 	struct led_classdev *cdev;
 | 
			
		||||
@ -36,7 +36,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
 | 
			
		||||
 	struct phy_led *phyled;
 | 
			
		||||
 	u32 index;
 | 
			
		||||
 	int err;
 | 
			
		||||
@@ -3221,6 +3222,21 @@ static int of_phy_led(struct phy_device
 | 
			
		||||
@@ -3243,6 +3244,21 @@ static int of_phy_led(struct phy_device
 | 
			
		||||
 	if (index > U8_MAX)
 | 
			
		||||
 		return -EINVAL;
 | 
			
		||||
 
 | 
			
		||||
@ -76,7 +76,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
 | 
			
		||||
 /**
 | 
			
		||||
  * struct phy_driver - Driver structure for a particular PHY type
 | 
			
		||||
  *
 | 
			
		||||
@@ -1143,6 +1152,19 @@ struct phy_driver {
 | 
			
		||||
@@ -1144,6 +1153,19 @@ struct phy_driver {
 | 
			
		||||
 	int (*led_hw_control_get)(struct phy_device *dev, u8 index,
 | 
			
		||||
 				  unsigned long *rules);
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
@ -19,7 +19,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/phy/phy_device.c
 | 
			
		||||
+++ b/drivers/net/phy/phy_device.c
 | 
			
		||||
@@ -3222,11 +3222,17 @@ static int of_phy_led(struct phy_device
 | 
			
		||||
@@ -3244,11 +3244,17 @@ static int of_phy_led(struct phy_device
 | 
			
		||||
 	if (index > U8_MAX)
 | 
			
		||||
 		return -EINVAL;
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
@ -30,7 +30,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/phy/phy_device.c
 | 
			
		||||
+++ b/drivers/net/phy/phy_device.c
 | 
			
		||||
@@ -1247,6 +1247,8 @@ int phy_init_hw(struct phy_device *phyde
 | 
			
		||||
@@ -1269,6 +1269,8 @@ int phy_init_hw(struct phy_device *phyde
 | 
			
		||||
 	if (ret < 0)
 | 
			
		||||
 		return ret;
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
@ -458,6 +458,7 @@ CONFIG_ARM_MODULE_PLTS=y
 | 
			
		||||
# CONFIG_ARM_TIMER_SP804 is not set
 | 
			
		||||
# CONFIG_ARM_UNWIND is not set
 | 
			
		||||
# CONFIG_ARM_VIRT_EXT is not set
 | 
			
		||||
# CONFIG_AS21XXX_PHY is not set
 | 
			
		||||
# CONFIG_AS3935 is not set
 | 
			
		||||
# CONFIG_AS73211 is not set
 | 
			
		||||
# CONFIG_ASM9260_TIMER is not set
 | 
			
		||||
 | 
			
		||||
@ -440,6 +440,7 @@ CONFIG_ARM_MODULE_PLTS=y
 | 
			
		||||
# CONFIG_ARM_TIMER_SP804 is not set
 | 
			
		||||
# CONFIG_ARM_UNWIND is not set
 | 
			
		||||
# CONFIG_ARM_VIRT_EXT is not set
 | 
			
		||||
# CONFIG_AS21XXX_PHY is not set
 | 
			
		||||
# CONFIG_AS3935 is not set
 | 
			
		||||
# CONFIG_AS73211 is not set
 | 
			
		||||
# CONFIG_ASM9260_TIMER is not set
 | 
			
		||||
 | 
			
		||||
@ -92,7 +92,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
+
 | 
			
		||||
 comment "MII PHY device drivers"
 | 
			
		||||
 
 | 
			
		||||
 config AIR_EN8811H_PHY
 | 
			
		||||
 config AS21XXX_PHY
 | 
			
		||||
--- a/drivers/net/phy/Makefile
 | 
			
		||||
+++ b/drivers/net/phy/Makefile
 | 
			
		||||
@@ -27,6 +27,21 @@ libphy-$(CONFIG_OPEN_ALLIANCE_HELPERS) +
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
--- a/drivers/net/phy/Kconfig
 | 
			
		||||
+++ b/drivers/net/phy/Kconfig
 | 
			
		||||
@@ -419,6 +419,8 @@ config QSEMI_PHY
 | 
			
		||||
@@ -431,6 +431,8 @@ config QSEMI_PHY
 | 
			
		||||
 
 | 
			
		||||
 source "drivers/net/phy/realtek/Kconfig"
 | 
			
		||||
 
 | 
			
		||||
@ -11,7 +11,7 @@
 | 
			
		||||
 	help
 | 
			
		||||
--- a/drivers/net/phy/Makefile
 | 
			
		||||
+++ b/drivers/net/phy/Makefile
 | 
			
		||||
@@ -110,6 +110,7 @@ obj-$(CONFIG_NXP_TJA11XX_PHY)	+= nxp-tja
 | 
			
		||||
@@ -111,6 +111,7 @@ obj-$(CONFIG_NXP_TJA11XX_PHY)	+= nxp-tja
 | 
			
		||||
 obj-y				+= qcom/
 | 
			
		||||
 obj-$(CONFIG_QSEMI_PHY)		+= qsemi.o
 | 
			
		||||
 obj-$(CONFIG_REALTEK_PHY)	+= realtek/
 | 
			
		||||
 | 
			
		||||
@ -92,7 +92,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
+
 | 
			
		||||
 comment "MII PHY device drivers"
 | 
			
		||||
 
 | 
			
		||||
 config AIR_EN8811H_PHY
 | 
			
		||||
 config AS21XXX_PHY
 | 
			
		||||
--- a/drivers/net/phy/Makefile
 | 
			
		||||
+++ b/drivers/net/phy/Makefile
 | 
			
		||||
@@ -26,6 +26,21 @@ libphy-$(CONFIG_LED_TRIGGER_PHY)	+= phy_
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
--- a/drivers/net/phy/Kconfig
 | 
			
		||||
+++ b/drivers/net/phy/Kconfig
 | 
			
		||||
@@ -406,6 +406,8 @@ config QSEMI_PHY
 | 
			
		||||
@@ -418,6 +418,8 @@ config QSEMI_PHY
 | 
			
		||||
 
 | 
			
		||||
 source "drivers/net/phy/realtek/Kconfig"
 | 
			
		||||
 
 | 
			
		||||
@ -11,7 +11,7 @@
 | 
			
		||||
 	help
 | 
			
		||||
--- a/drivers/net/phy/Makefile
 | 
			
		||||
+++ b/drivers/net/phy/Makefile
 | 
			
		||||
@@ -100,6 +100,7 @@ obj-$(CONFIG_NXP_TJA11XX_PHY)	+= nxp-tja
 | 
			
		||||
@@ -101,6 +101,7 @@ obj-$(CONFIG_NXP_TJA11XX_PHY)	+= nxp-tja
 | 
			
		||||
 obj-y				+= qcom/
 | 
			
		||||
 obj-$(CONFIG_QSEMI_PHY)		+= qsemi.o
 | 
			
		||||
 obj-$(CONFIG_REALTEK_PHY)	+= realtek/
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/phy/phy_device.c
 | 
			
		||||
+++ b/drivers/net/phy/phy_device.c
 | 
			
		||||
@@ -2015,6 +2015,9 @@ void phy_detach(struct phy_device *phyde
 | 
			
		||||
@@ -2037,6 +2037,9 @@ void phy_detach(struct phy_device *phyde
 | 
			
		||||
 		phydev->devlink = NULL;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
@ -15,7 +15,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/phy/realtek/realtek_main.c
 | 
			
		||||
+++ b/drivers/net/phy/realtek/realtek_main.c
 | 
			
		||||
@@ -1666,6 +1666,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1675,6 +1675,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		.name		= "RTL8226 2.5Gbps PHY",
 | 
			
		||||
 		.match_phy_device = rtl8226_match_phy_device,
 | 
			
		||||
@ -23,7 +23,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 		.get_features	= rtl822x_get_features,
 | 
			
		||||
 		.config_aneg	= rtl822x_config_aneg,
 | 
			
		||||
 		.read_status	= rtl822x_read_status,
 | 
			
		||||
@@ -1676,6 +1677,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1685,6 +1686,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		.match_phy_device = rtl8221b_match_phy_device,
 | 
			
		||||
 		.name		= "RTL8226B_RTL8221B 2.5Gbps PHY",
 | 
			
		||||
@ -31,7 +31,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 		.get_features	= rtl822x_get_features,
 | 
			
		||||
 		.config_aneg	= rtl822x_config_aneg,
 | 
			
		||||
 		.config_init    = rtl822xb_config_init,
 | 
			
		||||
@@ -1698,6 +1700,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1707,6 +1709,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		PHY_ID_MATCH_EXACT(0x001cc848),
 | 
			
		||||
 		.name           = "RTL8226B-CG_RTL8221B-CG 2.5Gbps PHY",
 | 
			
		||||
@ -39,7 +39,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 		.get_features   = rtl822x_get_features,
 | 
			
		||||
 		.config_aneg    = rtl822x_config_aneg,
 | 
			
		||||
 		.config_init    = rtl822xb_config_init,
 | 
			
		||||
@@ -1710,6 +1713,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1719,6 +1722,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		.match_phy_device = rtl8221b_vb_cg_c22_match_phy_device,
 | 
			
		||||
 		.name           = "RTL8221B-VB-CG 2.5Gbps PHY (C22)",
 | 
			
		||||
@ -47,7 +47,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 		.probe		= rtl822x_probe,
 | 
			
		||||
 		.get_features   = rtl822x_get_features,
 | 
			
		||||
 		.config_aneg    = rtl822x_config_aneg,
 | 
			
		||||
@@ -1723,6 +1727,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1732,6 +1736,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		.match_phy_device = rtl8221b_vb_cg_c45_match_phy_device,
 | 
			
		||||
 		.name           = "RTL8221B-VB-CG 2.5Gbps PHY (C45)",
 | 
			
		||||
@ -55,7 +55,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 		.probe		= rtl822x_probe,
 | 
			
		||||
 		.config_init    = rtl822xb_config_init,
 | 
			
		||||
 		.get_rate_matching = rtl822xb_get_rate_matching,
 | 
			
		||||
@@ -1734,6 +1739,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1743,6 +1748,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		.match_phy_device = rtl8221b_vn_cg_c22_match_phy_device,
 | 
			
		||||
 		.name           = "RTL8221B-VM-CG 2.5Gbps PHY (C22)",
 | 
			
		||||
@ -63,7 +63,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 		.probe		= rtl822x_probe,
 | 
			
		||||
 		.get_features   = rtl822x_get_features,
 | 
			
		||||
 		.config_aneg    = rtl822x_config_aneg,
 | 
			
		||||
@@ -1747,6 +1753,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1756,6 +1762,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		.match_phy_device = rtl8221b_vn_cg_c45_match_phy_device,
 | 
			
		||||
 		.name           = "RTL8221B-VN-CG 2.5Gbps PHY (C45)",
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
Signed-off-by: Mieczyslaw Nalewaj <namiltd@yahoo.com>
 | 
			
		||||
--- a/drivers/net/phy/realtek/realtek_main.c
 | 
			
		||||
+++ b/drivers/net/phy/realtek/realtek_main.c
 | 
			
		||||
@@ -1398,10 +1398,32 @@ static int rtl8226_match_phy_device(stru
 | 
			
		||||
@@ -1400,10 +1400,32 @@ static int rtl8226_match_phy_device(stru
 | 
			
		||||
 static int rtlgen_is_c45_match(struct phy_device *phydev, unsigned int id,
 | 
			
		||||
 			       bool is_c45)
 | 
			
		||||
 {
 | 
			
		||||
@ -49,4 +49,4 @@ Signed-off-by: Mieczyslaw Nalewaj <namiltd@yahoo.com>
 | 
			
		||||
+	}
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static int rtl8221b_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
 static int rtl8221b_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
 | 
			
		||||
@ -12,7 +12,7 @@ Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/phy/realtek/realtek_main.c
 | 
			
		||||
+++ b/drivers/net/phy/realtek/realtek_main.c
 | 
			
		||||
@@ -1610,6 +1610,51 @@ static irqreturn_t rtl9000a_handle_inter
 | 
			
		||||
@@ -1619,6 +1619,51 @@ static irqreturn_t rtl9000a_handle_inter
 | 
			
		||||
 	return IRQ_HANDLED;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@ -64,7 +64,7 @@ Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>
 | 
			
		||||
 static struct phy_driver realtek_drvs[] = {
 | 
			
		||||
 	{
 | 
			
		||||
 		PHY_ID_MATCH_EXACT(0x00008201),
 | 
			
		||||
@@ -1774,6 +1819,8 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1783,6 +1828,8 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		.match_phy_device = rtl8221b_vb_cg_c22_match_phy_device,
 | 
			
		||||
 		.name           = "RTL8221B-VB-CG 2.5Gbps PHY (C22)",
 | 
			
		||||
@ -73,7 +73,7 @@ Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>
 | 
			
		||||
 		.soft_reset     = genphy_soft_reset,
 | 
			
		||||
 		.probe		= rtl822x_probe,
 | 
			
		||||
 		.get_features   = rtl822x_get_features,
 | 
			
		||||
@@ -1788,6 +1835,8 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1797,6 +1844,8 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		.match_phy_device = rtl8221b_vb_cg_c45_match_phy_device,
 | 
			
		||||
 		.name           = "RTL8221B-VB-CG 2.5Gbps PHY (C45)",
 | 
			
		||||
@ -82,7 +82,7 @@ Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>
 | 
			
		||||
 		.soft_reset     = rtl822x_c45_soft_reset,
 | 
			
		||||
 		.probe		= rtl822x_probe,
 | 
			
		||||
 		.config_init    = rtl822xb_config_init,
 | 
			
		||||
@@ -1800,6 +1849,8 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1809,6 +1858,8 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		.match_phy_device = rtl8221b_vn_cg_c22_match_phy_device,
 | 
			
		||||
 		.name           = "RTL8221B-VM-CG 2.5Gbps PHY (C22)",
 | 
			
		||||
@ -91,7 +91,7 @@ Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>
 | 
			
		||||
 		.soft_reset     = genphy_soft_reset,
 | 
			
		||||
 		.probe		= rtl822x_probe,
 | 
			
		||||
 		.get_features   = rtl822x_get_features,
 | 
			
		||||
@@ -1814,6 +1865,8 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1823,6 +1874,8 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		.match_phy_device = rtl8221b_vn_cg_c45_match_phy_device,
 | 
			
		||||
 		.name           = "RTL8221B-VN-CG 2.5Gbps PHY (C45)",
 | 
			
		||||
 | 
			
		||||
@ -38,7 +38,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 static int rtl822xb_get_rate_matching(struct phy_device *phydev,
 | 
			
		||||
 				      phy_interface_t iface)
 | 
			
		||||
 {
 | 
			
		||||
@@ -1842,7 +1858,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1851,7 +1867,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 		.handle_interrupt = rtl8221b_handle_interrupt,
 | 
			
		||||
 		.soft_reset     = rtl822x_c45_soft_reset,
 | 
			
		||||
 		.probe		= rtl822x_probe,
 | 
			
		||||
@ -47,7 +47,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 		.get_rate_matching = rtl822xb_get_rate_matching,
 | 
			
		||||
 		.get_features   = rtl822x_c45_get_features,
 | 
			
		||||
 		.config_aneg    = rtl822x_c45_config_aneg,
 | 
			
		||||
@@ -1872,7 +1888,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1881,7 +1897,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 		.handle_interrupt = rtl8221b_handle_interrupt,
 | 
			
		||||
 		.soft_reset     = rtl822x_c45_soft_reset,
 | 
			
		||||
 		.probe		= rtl822x_probe,
 | 
			
		||||
 | 
			
		||||
@ -24,7 +24,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/phy/Kconfig
 | 
			
		||||
+++ b/drivers/net/phy/Kconfig
 | 
			
		||||
@@ -139,7 +139,7 @@ config BROADCOM_PHY
 | 
			
		||||
@@ -151,7 +151,7 @@ config BROADCOM_PHY
 | 
			
		||||
 	tristate "Broadcom 54XX PHYs"
 | 
			
		||||
 	select BCM_NET_PHYLIB
 | 
			
		||||
 	select BCM_NET_PHYPTP if NETWORK_PHY_TIMESTAMPING
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/phy/phy_device.c
 | 
			
		||||
+++ b/drivers/net/phy/phy_device.c
 | 
			
		||||
@@ -1912,6 +1912,9 @@ void phy_detach(struct phy_device *phyde
 | 
			
		||||
@@ -1934,6 +1934,9 @@ void phy_detach(struct phy_device *phyde
 | 
			
		||||
 		phydev->devlink = NULL;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
@ -15,7 +15,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/phy/realtek/realtek_main.c
 | 
			
		||||
+++ b/drivers/net/phy/realtek/realtek_main.c
 | 
			
		||||
@@ -1638,6 +1638,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1647,6 +1647,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		.name		= "RTL8226 2.5Gbps PHY",
 | 
			
		||||
 		.match_phy_device = rtl8226_match_phy_device,
 | 
			
		||||
@ -23,7 +23,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 		.get_features	= rtl822x_get_features,
 | 
			
		||||
 		.config_aneg	= rtl822x_config_aneg,
 | 
			
		||||
 		.read_status	= rtl822x_read_status,
 | 
			
		||||
@@ -1648,6 +1649,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1657,6 +1658,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		.match_phy_device = rtl8221b_match_phy_device,
 | 
			
		||||
 		.name		= "RTL8226B_RTL8221B 2.5Gbps PHY",
 | 
			
		||||
@ -31,7 +31,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 		.get_features	= rtl822x_get_features,
 | 
			
		||||
 		.config_aneg	= rtl822x_config_aneg,
 | 
			
		||||
 		.config_init    = rtl822xb_config_init,
 | 
			
		||||
@@ -1660,6 +1662,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1669,6 +1671,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		PHY_ID_MATCH_EXACT(0x001cc838),
 | 
			
		||||
 		.name           = "RTL8226-CG 2.5Gbps PHY",
 | 
			
		||||
@ -39,7 +39,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 		.get_features   = rtl822x_get_features,
 | 
			
		||||
 		.config_aneg    = rtl822x_config_aneg,
 | 
			
		||||
 		.read_status    = rtl822x_read_status,
 | 
			
		||||
@@ -1670,6 +1673,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1679,6 +1682,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		PHY_ID_MATCH_EXACT(0x001cc848),
 | 
			
		||||
 		.name           = "RTL8226B-CG_RTL8221B-CG 2.5Gbps PHY",
 | 
			
		||||
@ -47,7 +47,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 		.get_features   = rtl822x_get_features,
 | 
			
		||||
 		.config_aneg    = rtl822x_config_aneg,
 | 
			
		||||
 		.config_init    = rtl822xb_config_init,
 | 
			
		||||
@@ -1682,6 +1686,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1691,6 +1695,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		.match_phy_device = rtl8221b_vb_cg_c22_match_phy_device,
 | 
			
		||||
 		.name           = "RTL8221B-VB-CG 2.5Gbps PHY (C22)",
 | 
			
		||||
@ -55,7 +55,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 		.probe		= rtl822x_probe,
 | 
			
		||||
 		.get_features   = rtl822x_get_features,
 | 
			
		||||
 		.config_aneg    = rtl822x_config_aneg,
 | 
			
		||||
@@ -1695,6 +1700,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1704,6 +1709,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		.match_phy_device = rtl8221b_vb_cg_c45_match_phy_device,
 | 
			
		||||
 		.name           = "RTL8221B-VB-CG 2.5Gbps PHY (C45)",
 | 
			
		||||
@ -63,7 +63,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 		.probe		= rtl822x_probe,
 | 
			
		||||
 		.config_init    = rtl822xb_config_init,
 | 
			
		||||
 		.get_rate_matching = rtl822xb_get_rate_matching,
 | 
			
		||||
@@ -1706,6 +1712,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1715,6 +1721,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		.match_phy_device = rtl8221b_vn_cg_c22_match_phy_device,
 | 
			
		||||
 		.name           = "RTL8221B-VM-CG 2.5Gbps PHY (C22)",
 | 
			
		||||
@ -71,7 +71,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 		.probe		= rtl822x_probe,
 | 
			
		||||
 		.get_features   = rtl822x_get_features,
 | 
			
		||||
 		.config_aneg    = rtl822x_config_aneg,
 | 
			
		||||
@@ -1719,6 +1726,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1728,6 +1735,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		.match_phy_device = rtl8221b_vn_cg_c45_match_phy_device,
 | 
			
		||||
 		.name           = "RTL8221B-VN-CG 2.5Gbps PHY (C45)",
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
Signed-off-by: Mieczyslaw Nalewaj <namiltd@yahoo.com>
 | 
			
		||||
--- a/drivers/net/phy/realtek/realtek_main.c
 | 
			
		||||
+++ b/drivers/net/phy/realtek/realtek_main.c
 | 
			
		||||
@@ -1368,10 +1368,32 @@ static int rtl8226_match_phy_device(stru
 | 
			
		||||
@@ -1370,10 +1370,32 @@ static int rtl8226_match_phy_device(stru
 | 
			
		||||
 static int rtlgen_is_c45_match(struct phy_device *phydev, unsigned int id,
 | 
			
		||||
 			       bool is_c45)
 | 
			
		||||
 {
 | 
			
		||||
@ -49,4 +49,4 @@ Signed-off-by: Mieczyslaw Nalewaj <namiltd@yahoo.com>
 | 
			
		||||
+	}
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static int rtl8221b_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
 static int rtl8221b_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
 | 
			
		||||
@ -12,7 +12,7 @@ Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/phy/realtek/realtek_main.c
 | 
			
		||||
+++ b/drivers/net/phy/realtek/realtek_main.c
 | 
			
		||||
@@ -1580,6 +1580,51 @@ static irqreturn_t rtl9000a_handle_inter
 | 
			
		||||
@@ -1589,6 +1589,51 @@ static irqreturn_t rtl9000a_handle_inter
 | 
			
		||||
 	return IRQ_HANDLED;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@ -64,7 +64,7 @@ Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>
 | 
			
		||||
 static struct phy_driver realtek_drvs[] = {
 | 
			
		||||
 	{
 | 
			
		||||
 		PHY_ID_MATCH_EXACT(0x00008201),
 | 
			
		||||
@@ -1745,6 +1790,8 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1754,6 +1799,8 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		.match_phy_device = rtl8221b_vb_cg_c22_match_phy_device,
 | 
			
		||||
 		.name           = "RTL8221B-VB-CG 2.5Gbps PHY (C22)",
 | 
			
		||||
@ -73,7 +73,7 @@ Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>
 | 
			
		||||
 		.soft_reset     = genphy_soft_reset,
 | 
			
		||||
 		.probe		= rtl822x_probe,
 | 
			
		||||
 		.get_features   = rtl822x_get_features,
 | 
			
		||||
@@ -1759,6 +1806,8 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1768,6 +1815,8 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		.match_phy_device = rtl8221b_vb_cg_c45_match_phy_device,
 | 
			
		||||
 		.name           = "RTL8221B-VB-CG 2.5Gbps PHY (C45)",
 | 
			
		||||
@ -82,7 +82,7 @@ Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>
 | 
			
		||||
 		.soft_reset     = genphy_soft_reset,
 | 
			
		||||
 		.probe		= rtl822x_probe,
 | 
			
		||||
 		.config_init    = rtl822xb_config_init,
 | 
			
		||||
@@ -1771,6 +1820,8 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1780,6 +1829,8 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		.match_phy_device = rtl8221b_vn_cg_c22_match_phy_device,
 | 
			
		||||
 		.name           = "RTL8221B-VM-CG 2.5Gbps PHY (C22)",
 | 
			
		||||
@ -91,7 +91,7 @@ Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>
 | 
			
		||||
 		.soft_reset     = genphy_soft_reset,
 | 
			
		||||
 		.probe		= rtl822x_probe,
 | 
			
		||||
 		.get_features   = rtl822x_get_features,
 | 
			
		||||
@@ -1785,6 +1836,8 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1794,6 +1845,8 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 	}, {
 | 
			
		||||
 		.match_phy_device = rtl8221b_vn_cg_c45_match_phy_device,
 | 
			
		||||
 		.name           = "RTL8221B-VN-CG 2.5Gbps PHY (C45)",
 | 
			
		||||
 | 
			
		||||
@ -38,7 +38,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 static int rtl822xb_get_rate_matching(struct phy_device *phydev,
 | 
			
		||||
 				      phy_interface_t iface)
 | 
			
		||||
 {
 | 
			
		||||
@@ -1813,7 +1829,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1822,7 +1838,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 		.handle_interrupt = rtl8221b_handle_interrupt,
 | 
			
		||||
 		.soft_reset     = genphy_soft_reset,
 | 
			
		||||
 		.probe		= rtl822x_probe,
 | 
			
		||||
@ -47,7 +47,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 		.get_rate_matching = rtl822xb_get_rate_matching,
 | 
			
		||||
 		.get_features   = rtl822x_c45_get_features,
 | 
			
		||||
 		.config_aneg    = rtl822x_c45_config_aneg,
 | 
			
		||||
@@ -1843,7 +1859,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
@@ -1852,7 +1868,7 @@ static struct phy_driver realtek_drvs[]
 | 
			
		||||
 		.handle_interrupt = rtl8221b_handle_interrupt,
 | 
			
		||||
 		.soft_reset     = genphy_soft_reset,
 | 
			
		||||
 		.probe		= rtl822x_probe,
 | 
			
		||||
 | 
			
		||||
@ -24,7 +24,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/phy/Kconfig
 | 
			
		||||
+++ b/drivers/net/phy/Kconfig
 | 
			
		||||
@@ -113,7 +113,7 @@ config BROADCOM_PHY
 | 
			
		||||
@@ -125,7 +125,7 @@ config BROADCOM_PHY
 | 
			
		||||
 	tristate "Broadcom 54XX PHYs"
 | 
			
		||||
 	select BCM_NET_PHYLIB
 | 
			
		||||
 	select BCM_NET_PHYPTP if NETWORK_PHY_TIMESTAMPING
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
--- a/drivers/net/phy/Kconfig
 | 
			
		||||
+++ b/drivers/net/phy/Kconfig
 | 
			
		||||
@@ -431,6 +431,12 @@ config ROCKCHIP_PHY
 | 
			
		||||
@@ -443,6 +443,12 @@ config ROCKCHIP_PHY
 | 
			
		||||
 	help
 | 
			
		||||
 	  Currently supports the integrated Ethernet PHY.
 | 
			
		||||
 
 | 
			
		||||
@ -15,7 +15,7 @@
 | 
			
		||||
 	select CRC16
 | 
			
		||||
--- a/drivers/net/phy/Makefile
 | 
			
		||||
+++ b/drivers/net/phy/Makefile
 | 
			
		||||
@@ -113,6 +113,7 @@ obj-$(CONFIG_REALTEK_PHY)	+= realtek/
 | 
			
		||||
@@ -114,6 +114,7 @@ obj-$(CONFIG_REALTEK_PHY)	+= realtek/
 | 
			
		||||
 obj-y				+= rtl8261n/
 | 
			
		||||
 obj-$(CONFIG_RENESAS_PHY)	+= uPD60620.o
 | 
			
		||||
 obj-$(CONFIG_ROCKCHIP_PHY)	+= rockchip.o
 | 
			
		||||
 | 
			
		||||
@ -14,9 +14,9 @@ Signed-off-by: Robert Marko <robert.marko@sartura.hr>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/phy/Kconfig
 | 
			
		||||
+++ b/drivers/net/phy/Kconfig
 | 
			
		||||
@@ -153,6 +153,11 @@ endif # RTL8366_SMI
 | 
			
		||||
 
 | 
			
		||||
 comment "MII PHY device drivers"
 | 
			
		||||
@@ -165,6 +165,11 @@ config AS21XXX_PHY
 | 
			
		||||
 	  AS21210PB1 that all register with the PHY ID 0x7500 0x7500
 | 
			
		||||
 	  before the firmware is loaded.
 | 
			
		||||
 
 | 
			
		||||
+config AIROHA_EN8801SC_PHY
 | 
			
		||||
+	tristate "Airoha EN8801SC Gigabit PHY"
 | 
			
		||||
 | 
			
		||||
@ -254,7 +254,7 @@ Christian Marangi (9):
 | 
			
		||||
 obj-$(CONFIG_MDIO_BCM_UNIMAC)		+= mdio-bcm-unimac.o
 | 
			
		||||
--- a/drivers/net/phy/Kconfig
 | 
			
		||||
+++ b/drivers/net/phy/Kconfig
 | 
			
		||||
@@ -158,6 +158,11 @@ config AIROHA_EN8801SC_PHY
 | 
			
		||||
@@ -170,6 +170,11 @@ config AIROHA_EN8801SC_PHY
 | 
			
		||||
 	help
 | 
			
		||||
 	  Currently supports the Airoha EN8801SC PHY.
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
@ -880,7 +880,7 @@ publishing the in-band capabilities from the BCM84881 PHY driver.
 | 
			
		||||
 	 * @get_rate_matching: Get the supported type of rate matching for a
 | 
			
		||||
 	 * particular phy interface. This is used by phy consumers to determine
 | 
			
		||||
 	 * whether to advertise lower-speed modes for that interface. It is
 | 
			
		||||
@@ -1839,6 +1870,9 @@ int phy_config_aneg(struct phy_device *p
 | 
			
		||||
@@ -1840,6 +1871,9 @@ int phy_config_aneg(struct phy_device *p
 | 
			
		||||
 int _phy_start_aneg(struct phy_device *phydev);
 | 
			
		||||
 int phy_start_aneg(struct phy_device *phydev);
 | 
			
		||||
 int phy_aneg_done(struct phy_device *phydev);
 | 
			
		||||
 | 
			
		||||
@ -223,12 +223,14 @@ static int rtl821x_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
	return PHY_IS_RTL8214FB;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int rtl8218b_ext_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
static int rtl8218b_ext_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
					 const struct phy_driver *phydrv)
 | 
			
		||||
{
 | 
			
		||||
	return rtl821x_match_phy_device(phydev) == PHY_IS_RTL8218B_E;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int rtl8214fc_match_phy_device(struct phy_device *phydev)
 | 
			
		||||
static int rtl8214fc_match_phy_device(struct phy_device *phydev,
 | 
			
		||||
				      const struct phy_driver *phydrv)
 | 
			
		||||
{
 | 
			
		||||
	return rtl821x_match_phy_device(phydev) == PHY_IS_RTL8214FC;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -21,7 +21,7 @@ Submitted-by: John Crispin <john@phrozen.org>
 | 
			
		||||
 | 
			
		||||
--- a/include/linux/phy.h
 | 
			
		||||
+++ b/include/linux/phy.h
 | 
			
		||||
@@ -1226,6 +1226,8 @@ struct phy_driver {
 | 
			
		||||
@@ -1227,6 +1227,8 @@ struct phy_driver {
 | 
			
		||||
 	 */
 | 
			
		||||
 	int (*led_polarity_set)(struct phy_device *dev, int index,
 | 
			
		||||
 				unsigned long modes);
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,7 @@ Submitted-by: Birger Koblitz <mail@birger-koblitz.de>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/phy/Kconfig
 | 
			
		||||
+++ b/drivers/net/phy/Kconfig
 | 
			
		||||
@@ -422,6 +422,12 @@ source "drivers/net/phy/realtek/Kconfig"
 | 
			
		||||
@@ -434,6 +434,12 @@ source "drivers/net/phy/realtek/Kconfig"
 | 
			
		||||
 
 | 
			
		||||
 source "drivers/net/phy/rtl8261n/Kconfig"
 | 
			
		||||
 
 | 
			
		||||
@ -29,7 +29,7 @@ Submitted-by: Birger Koblitz <mail@birger-koblitz.de>
 | 
			
		||||
 	help
 | 
			
		||||
--- a/drivers/net/phy/Makefile
 | 
			
		||||
+++ b/drivers/net/phy/Makefile
 | 
			
		||||
@@ -111,6 +111,7 @@ obj-y				+= qcom/
 | 
			
		||||
@@ -112,6 +112,7 @@ obj-y				+= qcom/
 | 
			
		||||
 obj-$(CONFIG_QSEMI_PHY)		+= qsemi.o
 | 
			
		||||
 obj-$(CONFIG_REALTEK_PHY)	+= realtek/
 | 
			
		||||
 obj-y				+= rtl8261n/
 | 
			
		||||
 | 
			
		||||
@ -170,7 +170,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
 | 
			
		||||
 	/* This is optional functionality. If not supported, we may get an error
 | 
			
		||||
--- a/include/linux/phy.h
 | 
			
		||||
+++ b/include/linux/phy.h
 | 
			
		||||
@@ -1893,6 +1893,7 @@ int genphy_c45_an_config_aneg(struct phy
 | 
			
		||||
@@ -1897,6 +1897,7 @@ int genphy_c45_an_config_aneg(struct phy
 | 
			
		||||
 int genphy_c45_an_disable_aneg(struct phy_device *phydev);
 | 
			
		||||
 int genphy_c45_read_mdix(struct phy_device *phydev);
 | 
			
		||||
 int genphy_c45_pma_read_abilities(struct phy_device *phydev);
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,7 @@ Signed-off-by: haoming.chen <haoming.chen@siflower.com.cn>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/phy/Kconfig
 | 
			
		||||
+++ b/drivers/net/phy/Kconfig
 | 
			
		||||
@@ -484,3 +484,8 @@ endif # PHYLIB
 | 
			
		||||
@@ -481,3 +481,8 @@ endif # PHYLIB
 | 
			
		||||
 config MICREL_KS8995MA
 | 
			
		||||
 	tristate "Micrel KS8995MA 5-ports 10/100 managed Ethernet switch"
 | 
			
		||||
 	depends on SPI
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user