Skip to content

Commit 081c9c0

Browse files
dangowrtPaolo Abeni
authored andcommitted
net: phy: realtek: read duplex and gbit master from PHYSR register
The PHYSR MMD register is present and defined equally for all RTL82xx Ethernet PHYs. Read duplex and Gbit master bits from rtlgen_decode_speed() and rename it to rtlgen_decode_physr(). Signed-off-by: Daniel Golle <daniel@makrotopia.org> Link: https://patch.msgid.link/b9a76341da851a18c985bc4774fa295babec79bb.1728565530.git.daniel@makrotopia.org Signed-off-by: Paolo Abeni <pabeni@redhat.com>
1 parent 53bac83 commit 081c9c0

File tree

1 file changed

+33
-8
lines changed

1 file changed

+33
-8
lines changed

drivers/net/phy/realtek.c

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,18 @@
8080

8181
#define RTL822X_VND2_GANLPAR 0xa414
8282

83-
#define RTL822X_VND2_PHYSR 0xa434
84-
8583
#define RTL8366RB_POWER_SAVE 0x15
8684
#define RTL8366RB_POWER_SAVE_ON BIT(12)
8785

8886
#define RTL9000A_GINMR 0x14
8987
#define RTL9000A_GINMR_LINK_STATUS BIT(4)
9088

91-
#define RTLGEN_SPEED_MASK 0x0630
89+
#define RTL_VND2_PHYSR 0xa434
90+
#define RTL_VND2_PHYSR_DUPLEX BIT(3)
91+
#define RTL_VND2_PHYSR_SPEEDL GENMASK(5, 4)
92+
#define RTL_VND2_PHYSR_SPEEDH GENMASK(10, 9)
93+
#define RTL_VND2_PHYSR_MASTER BIT(11)
94+
#define RTL_VND2_PHYSR_SPEED_MASK (RTL_VND2_PHYSR_SPEEDL | RTL_VND2_PHYSR_SPEEDH)
9295

9396
#define RTL_GENERIC_PHYID 0x001cc800
9497
#define RTL_8211FVD_PHYID 0x001cc878
@@ -660,9 +663,18 @@ static int rtl8366rb_config_init(struct phy_device *phydev)
660663
}
661664

662665
/* get actual speed to cover the downshift case */
663-
static void rtlgen_decode_speed(struct phy_device *phydev, int val)
666+
static void rtlgen_decode_physr(struct phy_device *phydev, int val)
664667
{
665-
switch (val & RTLGEN_SPEED_MASK) {
668+
/* bit 3
669+
* 0: Half Duplex
670+
* 1: Full Duplex
671+
*/
672+
if (val & RTL_VND2_PHYSR_DUPLEX)
673+
phydev->duplex = DUPLEX_FULL;
674+
else
675+
phydev->duplex = DUPLEX_HALF;
676+
677+
switch (val & RTL_VND2_PHYSR_SPEED_MASK) {
666678
case 0x0000:
667679
phydev->speed = SPEED_10;
668680
break;
@@ -684,6 +696,19 @@ static void rtlgen_decode_speed(struct phy_device *phydev, int val)
684696
default:
685697
break;
686698
}
699+
700+
/* bit 11
701+
* 0: Slave Mode
702+
* 1: Master Mode
703+
*/
704+
if (phydev->speed >= 1000) {
705+
if (val & RTL_VND2_PHYSR_MASTER)
706+
phydev->master_slave_state = MASTER_SLAVE_STATE_MASTER;
707+
else
708+
phydev->master_slave_state = MASTER_SLAVE_STATE_SLAVE;
709+
} else {
710+
phydev->master_slave_state = MASTER_SLAVE_STATE_UNSUPPORTED;
711+
}
687712
}
688713

689714
static int rtlgen_read_status(struct phy_device *phydev)
@@ -701,7 +726,7 @@ static int rtlgen_read_status(struct phy_device *phydev)
701726
if (val < 0)
702727
return val;
703728

704-
rtlgen_decode_speed(phydev, val);
729+
rtlgen_decode_physr(phydev, val);
705730

706731
return 0;
707732
}
@@ -1007,11 +1032,11 @@ static int rtl822x_c45_read_status(struct phy_device *phydev)
10071032
return 0;
10081033

10091034
/* Read actual speed from vendor register. */
1010-
val = phy_read_mmd(phydev, MDIO_MMD_VEND2, RTL822X_VND2_PHYSR);
1035+
val = phy_read_mmd(phydev, MDIO_MMD_VEND2, RTL_VND2_PHYSR);
10111036
if (val < 0)
10121037
return val;
10131038

1014-
rtlgen_decode_speed(phydev, val);
1039+
rtlgen_decode_physr(phydev, val);
10151040

10161041
return 0;
10171042
}

0 commit comments

Comments
 (0)