mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-03 22:44:27 -05:00 
			
		
		
		
	Add support for Methode DM7052 NBASE-T module to OpenWRT. These patches are taken from my "phy" branch, and will be sent for the next kernel merge window. Signed-off-by: Russell King <linux@armlinux.org.uk> [jonas.gorski: move patches to pending, refresh patches] Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
		
			
				
	
	
		
			75 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From c9de73988a35c6c85810a992954ac568cca503e5 Mon Sep 17 00:00:00 2001
 | 
						|
From: Russell King <rmk+kernel@armlinux.org.uk>
 | 
						|
Date: Wed, 2 Oct 2019 10:31:10 +0100
 | 
						|
Subject: [PATCH 648/660] net: mdio-i2c: add support for Clause 45 accesses
 | 
						|
 | 
						|
Some SFP+ modules have PHYs on them just like SFP modules do, except
 | 
						|
they are Clause 45 PHYs.  The I2C protocol used to access them is
 | 
						|
modified slightly in order to send the device address and 16-bit
 | 
						|
register index.
 | 
						|
 | 
						|
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
 | 
						|
---
 | 
						|
 drivers/net/phy/mdio-i2c.c | 28 ++++++++++++++++++++--------
 | 
						|
 1 file changed, 20 insertions(+), 8 deletions(-)
 | 
						|
 | 
						|
--- a/drivers/net/phy/mdio-i2c.c
 | 
						|
+++ b/drivers/net/phy/mdio-i2c.c
 | 
						|
@@ -36,17 +36,24 @@ static int i2c_mii_read(struct mii_bus *
 | 
						|
 {
 | 
						|
 	struct i2c_adapter *i2c = bus->priv;
 | 
						|
 	struct i2c_msg msgs[2];
 | 
						|
-	u8 data[2], dev_addr = reg;
 | 
						|
+	u8 addr[3], data[2], *p;
 | 
						|
 	int bus_addr, ret;
 | 
						|
 
 | 
						|
 	if (!i2c_mii_valid_phy_id(phy_id))
 | 
						|
 		return 0xffff;
 | 
						|
 
 | 
						|
+	p = addr;
 | 
						|
+	if (reg & MII_ADDR_C45) {
 | 
						|
+		*p++ = 0x20 | ((reg >> 16) & 31);
 | 
						|
+		*p++ = reg >> 8;
 | 
						|
+	}
 | 
						|
+	*p++ = reg;
 | 
						|
+
 | 
						|
 	bus_addr = i2c_mii_phy_addr(phy_id);
 | 
						|
 	msgs[0].addr = bus_addr;
 | 
						|
 	msgs[0].flags = 0;
 | 
						|
-	msgs[0].len = 1;
 | 
						|
-	msgs[0].buf = &dev_addr;
 | 
						|
+	msgs[0].len = p - addr;
 | 
						|
+	msgs[0].buf = addr;
 | 
						|
 	msgs[1].addr = bus_addr;
 | 
						|
 	msgs[1].flags = I2C_M_RD;
 | 
						|
 	msgs[1].len = sizeof(data);
 | 
						|
@@ -64,18 +71,23 @@ static int i2c_mii_write(struct mii_bus
 | 
						|
 	struct i2c_adapter *i2c = bus->priv;
 | 
						|
 	struct i2c_msg msg;
 | 
						|
 	int ret;
 | 
						|
-	u8 data[3];
 | 
						|
+	u8 data[5], *p;
 | 
						|
 
 | 
						|
 	if (!i2c_mii_valid_phy_id(phy_id))
 | 
						|
 		return 0;
 | 
						|
 
 | 
						|
-	data[0] = reg;
 | 
						|
-	data[1] = val >> 8;
 | 
						|
-	data[2] = val;
 | 
						|
+	p = data;
 | 
						|
+	if (reg & MII_ADDR_C45) {
 | 
						|
+		*p++ = (reg >> 16) & 31;
 | 
						|
+		*p++ = reg >> 8;
 | 
						|
+	}
 | 
						|
+	*p++ = reg;
 | 
						|
+	*p++ = val >> 8;
 | 
						|
+	*p++ = val;
 | 
						|
 
 | 
						|
 	msg.addr = i2c_mii_phy_addr(phy_id);
 | 
						|
 	msg.flags = 0;
 | 
						|
-	msg.len = 3;
 | 
						|
+	msg.len = p - data;
 | 
						|
 	msg.buf = data;
 | 
						|
 
 | 
						|
 	ret = i2c_transfer(i2c, &msg, 1);
 |