net: phy: realtek: Add functions to read PHY's extended registers
According to the datasheet to access the extended registers we have to: 1. Write Register 31 Data = 0x0XYZ (Page 0xXYZ) 2. Read/Write the target Register Data 3. Write Register 31 Data = 0x0000 or 0xa42 (switch back to IEEE Standard Registers) Hook the missing functions so that we can use the `mdio rx/wx` command to easily access the extended registers. Signed-off-by: Carlo Caione <ccaione@baylibre.com> Acked-by: Joe Hershberger <joe.hershberger@ni.com>
This commit is contained in:
		
							parent
							
								
									9043c4e0fc
								
							
						
					
					
						commit
						e57c9fdb04
					
				|  | @ -57,6 +57,33 @@ | ||||||
| #define MIIM_RTL8211F_TX_DELAY		0x100 | #define MIIM_RTL8211F_TX_DELAY		0x100 | ||||||
| #define MIIM_RTL8211F_LCR		0x10 | #define MIIM_RTL8211F_LCR		0x10 | ||||||
| 
 | 
 | ||||||
|  | static int rtl8211f_phy_extread(struct phy_device *phydev, int addr, | ||||||
|  | 				int devaddr, int regnum) | ||||||
|  | { | ||||||
|  | 	int oldpage = phy_read(phydev, MDIO_DEVAD_NONE, | ||||||
|  | 			       MIIM_RTL8211F_PAGE_SELECT); | ||||||
|  | 	int val; | ||||||
|  | 
 | ||||||
|  | 	phy_write(phydev, MDIO_DEVAD_NONE, MIIM_RTL8211F_PAGE_SELECT, devaddr); | ||||||
|  | 	val = phy_read(phydev, MDIO_DEVAD_NONE, regnum); | ||||||
|  | 	phy_write(phydev, MDIO_DEVAD_NONE, MIIM_RTL8211F_PAGE_SELECT, oldpage); | ||||||
|  | 
 | ||||||
|  | 	return val; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int rtl8211f_phy_extwrite(struct phy_device *phydev, int addr, | ||||||
|  | 				 int devaddr, int regnum, u16 val) | ||||||
|  | { | ||||||
|  | 	int oldpage = phy_read(phydev, MDIO_DEVAD_NONE, | ||||||
|  | 			       MIIM_RTL8211F_PAGE_SELECT); | ||||||
|  | 
 | ||||||
|  | 	phy_write(phydev, MDIO_DEVAD_NONE, MIIM_RTL8211F_PAGE_SELECT, devaddr); | ||||||
|  | 	phy_write(phydev, MDIO_DEVAD_NONE, regnum, val); | ||||||
|  | 	phy_write(phydev, MDIO_DEVAD_NONE, MIIM_RTL8211F_PAGE_SELECT, oldpage); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static int rtl8211b_probe(struct phy_device *phydev) | static int rtl8211b_probe(struct phy_device *phydev) | ||||||
| { | { | ||||||
| #ifdef CONFIG_RTL8211X_PHY_FORCE_MASTER | #ifdef CONFIG_RTL8211X_PHY_FORCE_MASTER | ||||||
|  | @ -336,6 +363,8 @@ static struct phy_driver RTL8211F_driver = { | ||||||
| 	.config = &rtl8211f_config, | 	.config = &rtl8211f_config, | ||||||
| 	.startup = &rtl8211f_startup, | 	.startup = &rtl8211f_startup, | ||||||
| 	.shutdown = &genphy_shutdown, | 	.shutdown = &genphy_shutdown, | ||||||
|  | 	.readext = &rtl8211f_phy_extread, | ||||||
|  | 	.writeext = &rtl8211f_phy_extwrite, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| int phy_realtek_init(void) | int phy_realtek_init(void) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue