@ -45,9 +45,12 @@ static void dtsec_configure_serdes(struct fm_eth *priv)
qsgmii_loop :
/* SGMII IF mode + AN enable only for 1G SGMII, not for 2.5G */
value = PHY_SGMII_IF_MODE_SGMII ;
if ( ! sgmii_2500 )
value | = PHY_SGMII_IF_MODE_AN ;
if ( sgmii_2500 )
value = PHY_SGMII_CR_PHY_RESET |
PHY_SGMII_IF_SPEED_GIGABIT |
PHY_SGMII_IF_MODE_SGMII ;
else
value = PHY_SGMII_IF_MODE_SGMII | PHY_SGMII_IF_MODE_AN ;
memac_mdio_write ( & bus , i , MDIO_DEVAD_NONE , 0x14 , value ) ;
@ -55,15 +58,24 @@ qsgmii_loop:
value = PHY_SGMII_DEV_ABILITY_SGMII ;
memac_mdio_write ( & bus , i , MDIO_DEVAD_NONE , 0x4 , value ) ;
/* Adjust link timer for SGMII -
1.6 ms in units of 8 ns = 2 * 10 ^ 5 = 0x30d40 */
memac_mdio_write ( & bus , i , MDIO_DEVAD_NONE , 0x13 , 0x3 ) ;
memac_mdio_write ( & bus , i , MDIO_DEVAD_NONE , 0x12 , 0xd40 ) ;
if ( sgmii_2500 ) {
/* Adjust link timer for 2.5G SGMII,
* 1.6 ms in units of 3.2 ns :
* 1.6 ms / 3.2 ns = 5 * 10 ^ 5 = 0x7a120 .
*/
memac_mdio_write ( & bus , i , MDIO_DEVAD_NONE , 0x13 , 0x0007 ) ;
memac_mdio_write ( & bus , i , MDIO_DEVAD_NONE , 0x12 , 0xa120 ) ;
} else {
/* Adjust link timer for SGMII,
* 1.6 ms in units of 8 ns :
* 1.6 ms / 8 ns = 2 * 10 ^ 5 = 0x30d40 .
*/
memac_mdio_write ( & bus , i , MDIO_DEVAD_NONE , 0x13 , 0x0003 ) ;
memac_mdio_write ( & bus , i , MDIO_DEVAD_NONE , 0x12 , 0x0d40 ) ;
}
/* Restart AN */
value = PHY_SGMII_CR_DEF_VAL ;
if ( ! sgmii_2500 )
value | = PHY_SGMII_CR_RESET_AN ;
value = PHY_SGMII_CR_DEF_VAL | PHY_SGMII_CR_RESET_AN ;
memac_mdio_write ( & bus , i , MDIO_DEVAD_NONE , 0 , value ) ;
if ( ( priv - > enet_if = = PHY_INTERFACE_MODE_QSGMII ) & & ( i < 3 ) ) {
@ -391,6 +403,7 @@ static int fm_eth_startup(struct fm_eth *fm_eth)
/* For some reason we need to set SPEED_100 */
if ( ( ( fm_eth - > enet_if = = PHY_INTERFACE_MODE_SGMII ) | |
( fm_eth - > enet_if = = PHY_INTERFACE_MODE_SGMII_2500 ) | |
( fm_eth - > enet_if = = PHY_INTERFACE_MODE_QSGMII ) ) & &
mac - > set_if_mode )
mac - > set_if_mode ( mac , fm_eth - > enet_if , SPEED_100 ) ;