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
689714static 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