@@ -683,7 +683,8 @@ int mv88e6393x_serdes_get_lane(struct mv88e6xxx_chip *chip, int port)
683683 cmode == MV88E6XXX_PORT_STS_CMODE_SGMII ||
684684 cmode == MV88E6XXX_PORT_STS_CMODE_2500BASEX ||
685685 cmode == MV88E6393X_PORT_STS_CMODE_5GBASER ||
686- cmode == MV88E6393X_PORT_STS_CMODE_10GBASER )
686+ cmode == MV88E6393X_PORT_STS_CMODE_10GBASER ||
687+ cmode == MV88E6393X_PORT_STS_CMODE_USXGMII )
687688 lane = port ;
688689
689690 return lane ;
@@ -984,7 +985,42 @@ static int mv88e6393x_serdes_pcs_get_state_10g(struct mv88e6xxx_chip *chip,
984985 state -> speed = SPEED_10000 ;
985986 state -> duplex = DUPLEX_FULL ;
986987 }
988+ return 0 ;
989+ }
990+
991+ /* USXGMII registers for Marvell switch 88e639x are undocumented and this function is based
992+ * on some educated guesses. It appears that there are no status bits related to
993+ * autonegotiation complete or flow control.
994+ */
995+ static int mv88e639x_serdes_pcs_get_state_usxgmii (struct mv88e6xxx_chip * chip ,
996+ int port , int lane ,
997+ struct phylink_link_state * state )
998+ {
999+ u16 status , lp_status ;
1000+ int err ;
9871001
1002+ err = mv88e6390_serdes_read (chip , lane , MDIO_MMD_PHYXS ,
1003+ MV88E6390_USXGMII_PHY_STATUS , & status );
1004+ if (err ) {
1005+ dev_err (chip -> dev , "can't read Serdes USXGMII PHY status: %d\n" , err );
1006+ return err ;
1007+ }
1008+ dev_dbg (chip -> dev , "USXGMII PHY status: 0x%x\n" , status );
1009+
1010+ state -> link = !!(status & MDIO_USXGMII_LINK );
1011+ state -> an_complete = state -> link ;
1012+
1013+ if (state -> link ) {
1014+ err = mv88e6390_serdes_read (chip , lane , MDIO_MMD_PHYXS ,
1015+ MV88E6390_USXGMII_LP_STATUS , & lp_status );
1016+ if (err ) {
1017+ dev_err (chip -> dev , "can't read Serdes USXGMII LP status: %d\n" , err );
1018+ return err ;
1019+ }
1020+ dev_dbg (chip -> dev , "USXGMII LP status: 0x%x\n" , lp_status );
1021+ /* lp_status appears to include the "link" bit as per USXGMII spec. */
1022+ phylink_decode_usxgmii_word (state , lp_status );
1023+ }
9881024 return 0 ;
9891025}
9901026
@@ -1020,6 +1056,9 @@ int mv88e6393x_serdes_pcs_get_state(struct mv88e6xxx_chip *chip, int port,
10201056 case PHY_INTERFACE_MODE_10GBASER :
10211057 return mv88e6393x_serdes_pcs_get_state_10g (chip , port , lane ,
10221058 state );
1059+ case PHY_INTERFACE_MODE_USXGMII :
1060+ return mv88e639x_serdes_pcs_get_state_usxgmii (chip , port , lane ,
1061+ state );
10231062
10241063 default :
10251064 return - EOPNOTSUPP ;
@@ -1173,6 +1212,7 @@ int mv88e6393x_serdes_irq_enable(struct mv88e6xxx_chip *chip, int port,
11731212 return mv88e6390_serdes_irq_enable_sgmii (chip , lane , enable );
11741213 case MV88E6393X_PORT_STS_CMODE_5GBASER :
11751214 case MV88E6393X_PORT_STS_CMODE_10GBASER :
1215+ case MV88E6393X_PORT_STS_CMODE_USXGMII :
11761216 return mv88e6393x_serdes_irq_enable_10g (chip , lane , enable );
11771217 }
11781218
@@ -1213,6 +1253,7 @@ irqreturn_t mv88e6393x_serdes_irq_status(struct mv88e6xxx_chip *chip, int port,
12131253 break ;
12141254 case MV88E6393X_PORT_STS_CMODE_5GBASER :
12151255 case MV88E6393X_PORT_STS_CMODE_10GBASER :
1256+ case MV88E6393X_PORT_STS_CMODE_USXGMII :
12161257 err = mv88e6393x_serdes_irq_status_10g (chip , lane , & status );
12171258 if (err )
12181259 return err ;
@@ -1477,7 +1518,8 @@ static int mv88e6393x_serdes_erratum_5_2(struct mv88e6xxx_chip *chip, int lane,
14771518 * to SERDES operating in 10G mode. These registers only apply to 10G
14781519 * operation and have no effect on other speeds.
14791520 */
1480- if (cmode != MV88E6393X_PORT_STS_CMODE_10GBASER )
1521+ if (cmode != MV88E6393X_PORT_STS_CMODE_10GBASER &&
1522+ cmode != MV88E6393X_PORT_STS_CMODE_USXGMII )
14811523 return 0 ;
14821524
14831525 for (i = 0 ; i < ARRAY_SIZE (fixes ); ++ i ) {
@@ -1582,6 +1624,7 @@ int mv88e6393x_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,
15821624 break ;
15831625 case MV88E6393X_PORT_STS_CMODE_5GBASER :
15841626 case MV88E6393X_PORT_STS_CMODE_10GBASER :
1627+ case MV88E6393X_PORT_STS_CMODE_USXGMII :
15851628 err = mv88e6390_serdes_power_10g (chip , lane , on );
15861629 break ;
15871630 default :
0 commit comments