@@ -1806,10 +1806,16 @@ static int mv88e6xxx_setup_egress_floods(struct mv88e6xxx_chip *chip, int port)
1806
1806
static int mv88e6xxx_serdes_power (struct mv88e6xxx_chip * chip , int port ,
1807
1807
bool on )
1808
1808
{
1809
- if (chip -> info -> ops -> serdes_power )
1810
- return chip -> info -> ops -> serdes_power (chip , port , on );
1809
+ int err = 0 ;
1811
1810
1812
- return 0 ;
1811
+ if (chip -> info -> ops -> serdes_power ) {
1812
+ err = chip -> info -> ops -> serdes_power (chip , port , on );
1813
+ if (err )
1814
+ dev_err (chip -> dev ,
1815
+ "Failed to change SERDES power: %d\n" , err );
1816
+ }
1817
+
1818
+ return err ;
1813
1819
}
1814
1820
1815
1821
static int mv88e6xxx_setup_port (struct mv88e6xxx_chip * chip , int port )
@@ -1862,12 +1868,15 @@ static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port)
1862
1868
if (err )
1863
1869
return err ;
1864
1870
1865
- /* If this port is connected to a SerDes, make sure the SerDes is
1866
- * powered up.
1871
+ /* Enable the SERDES interface for DSA and CPU ports. Normal
1872
+ * ports SERDES are enabled when the port is enabled, thus
1873
+ * saving a bit of power.
1867
1874
*/
1868
- err = mv88e6xxx_serdes_power (chip , port , true);
1869
- if (err )
1870
- return err ;
1875
+ if ((dsa_is_cpu_port (ds , port ) || dsa_is_dsa_port (ds , port ))) {
1876
+ err = mv88e6xxx_serdes_power (chip , port , true);
1877
+ if (err )
1878
+ return err ;
1879
+ }
1871
1880
1872
1881
/* Port Control 2: don't force a good FCS, set the maximum frame size to
1873
1882
* 10240 bytes, disable 802.1q tags checking, don't discard tagged or
@@ -1969,6 +1978,29 @@ static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port)
1969
1978
return mv88e6xxx_port_write (chip , port , PORT_DEFAULT_VLAN , 0x0000 );
1970
1979
}
1971
1980
1981
+ static int mv88e6xxx_port_enable (struct dsa_switch * ds , int port ,
1982
+ struct phy_device * phydev )
1983
+ {
1984
+ struct mv88e6xxx_chip * chip = ds -> priv ;
1985
+ int err = 0 ;
1986
+
1987
+ mutex_lock (& chip -> reg_lock );
1988
+ mv88e6xxx_serdes_power (chip , port , true);
1989
+ mutex_unlock (& chip -> reg_lock );
1990
+
1991
+ return err ;
1992
+ }
1993
+
1994
+ static void mv88e6xxx_port_disable (struct dsa_switch * ds , int port ,
1995
+ struct phy_device * phydev )
1996
+ {
1997
+ struct mv88e6xxx_chip * chip = ds -> priv ;
1998
+
1999
+ mutex_lock (& chip -> reg_lock );
2000
+ mv88e6xxx_serdes_power (chip , port , false);
2001
+ mutex_unlock (& chip -> reg_lock );
2002
+ }
2003
+
1972
2004
static int mv88e6xxx_g1_set_switch_mac (struct mv88e6xxx_chip * chip , u8 * addr )
1973
2005
{
1974
2006
int err ;
@@ -3809,6 +3841,8 @@ static const struct dsa_switch_ops mv88e6xxx_switch_ops = {
3809
3841
.get_strings = mv88e6xxx_get_strings ,
3810
3842
.get_ethtool_stats = mv88e6xxx_get_ethtool_stats ,
3811
3843
.get_sset_count = mv88e6xxx_get_sset_count ,
3844
+ .port_enable = mv88e6xxx_port_enable ,
3845
+ .port_disable = mv88e6xxx_port_disable ,
3812
3846
.set_eee = mv88e6xxx_set_eee ,
3813
3847
.get_eee = mv88e6xxx_get_eee ,
3814
3848
.get_eeprom_len = mv88e6xxx_get_eeprom_len ,
0 commit comments