| 
									
										
										
										
											2025-04-30 00:02:32 +02:00
										 |  |  | From 853e80369cfceb2331bf34f251ba11c6602cc67f Mon Sep 17 00:00:00 2001 | 
					
						
							|  |  |  | From: Heiner Kallweit <hkallweit1@gmail.com> | 
					
						
							|  |  |  | Date: Thu, 13 Feb 2025 20:15:42 +0100 | 
					
						
							|  |  |  | Subject: [PATCH] r8169: add PHY c45 ops for MDIO_MMD_VENDOR2 registers | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The integrated PHYs on chip versions from RTL8168g allow to address | 
					
						
							|  |  |  | MDIO_MMD_VEND2 registers. All c22 standard registers are mapped to | 
					
						
							|  |  |  | MDIO_MMD_VEND2 registers. So far the paging mechanism is used to | 
					
						
							|  |  |  | address PHY registers. Add support for c45 ops to address MDIO_MMD_VEND2 | 
					
						
							|  |  |  | registers directly, w/o the paging. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> | 
					
						
							|  |  |  | Reviewed-by: Andrew Lunn <andrew@lunn.ch> | 
					
						
							|  |  |  | Link: https://patch.msgid.link/d6f97eaa-0f13-468f-89cb-75a41087bc4a@gmail.com | 
					
						
							|  |  |  | Signed-off-by: Jakub Kicinski <kuba@kernel.org> | 
					
						
							|  |  |  | ---
 | 
					
						
							|  |  |  |  drivers/net/ethernet/realtek/r8169_main.c | 32 +++++++++++++++++++++++ | 
					
						
							|  |  |  |  1 file changed, 32 insertions(+) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | --- a/drivers/net/ethernet/realtek/r8169_main.c
 | 
					
						
							|  |  |  | +++ b/drivers/net/ethernet/realtek/r8169_main.c
 | 
					
						
							| 
									
										
										
										
											2025-10-24 23:56:59 +08:00
										 |  |  | @@ -5209,6 +5209,33 @@ static int r8169_mdio_write_reg(struct m
 | 
					
						
							| 
									
										
										
										
											2025-04-30 00:02:32 +02:00
										 |  |  |  	return 0; | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +static int r8169_mdio_read_reg_c45(struct mii_bus *mii_bus, int addr,
 | 
					
						
							|  |  |  | +				   int devnum, int regnum)
 | 
					
						
							|  |  |  | +{
 | 
					
						
							|  |  |  | +	struct rtl8169_private *tp = mii_bus->priv;
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +	if (addr > 0)
 | 
					
						
							|  |  |  | +		return -ENODEV;
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +	if (devnum == MDIO_MMD_VEND2 && regnum > MDIO_STAT2)
 | 
					
						
							|  |  |  | +		return r8168_phy_ocp_read(tp, regnum);
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +	return 0;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +static int r8169_mdio_write_reg_c45(struct mii_bus *mii_bus, int addr,
 | 
					
						
							|  |  |  | +				    int devnum, int regnum, u16 val)
 | 
					
						
							|  |  |  | +{
 | 
					
						
							|  |  |  | +	struct rtl8169_private *tp = mii_bus->priv;
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +	if (addr > 0 || devnum != MDIO_MMD_VEND2 || regnum <= MDIO_STAT2)
 | 
					
						
							|  |  |  | +		return -ENODEV;
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +	r8168_phy_ocp_write(tp, regnum, val);
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +	return 0;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  static int r8169_mdio_register(struct rtl8169_private *tp) | 
					
						
							|  |  |  |  { | 
					
						
							|  |  |  |  	struct pci_dev *pdev = tp->pci_dev; | 
					
						
							| 
									
										
										
										
											2025-10-24 23:56:59 +08:00
										 |  |  | @@ -5239,6 +5266,11 @@ static int r8169_mdio_register(struct rt
 | 
					
						
							| 
									
										
										
										
											2025-04-30 00:02:32 +02:00
										 |  |  |  	new_bus->read = r8169_mdio_read_reg; | 
					
						
							|  |  |  |  	new_bus->write = r8169_mdio_write_reg; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +	if (tp->mac_version >= RTL_GIGA_MAC_VER_40) {
 | 
					
						
							|  |  |  | +		new_bus->read_c45 = r8169_mdio_read_reg_c45;
 | 
					
						
							|  |  |  | +		new_bus->write_c45 = r8169_mdio_write_reg_c45;
 | 
					
						
							|  |  |  | +	}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  	ret = devm_mdiobus_register(&pdev->dev, new_bus); | 
					
						
							|  |  |  |  	if (ret) | 
					
						
							|  |  |  |  		return ret; |