@@ -4871,6 +4871,7 @@ static int mvpp22_gop_init(struct mvpp2_port *port)
4871
4871
break ;
4872
4872
case PHY_INTERFACE_MODE_SGMII :
4873
4873
case PHY_INTERFACE_MODE_1000BASEX :
4874
+ case PHY_INTERFACE_MODE_2500BASEX :
4874
4875
mvpp22_gop_init_sgmii (port );
4875
4876
break ;
4876
4877
case PHY_INTERFACE_MODE_10GKR :
@@ -4909,7 +4910,8 @@ static void mvpp22_gop_unmask_irq(struct mvpp2_port *port)
4909
4910
4910
4911
if (phy_interface_mode_is_rgmii (port -> phy_interface ) ||
4911
4912
port -> phy_interface == PHY_INTERFACE_MODE_SGMII ||
4912
- port -> phy_interface == PHY_INTERFACE_MODE_1000BASEX ) {
4913
+ port -> phy_interface == PHY_INTERFACE_MODE_1000BASEX ||
4914
+ port -> phy_interface == PHY_INTERFACE_MODE_2500BASEX ) {
4913
4915
/* Enable the GMAC link status irq for this port */
4914
4916
val = readl (port -> base + MVPP22_GMAC_INT_SUM_MASK );
4915
4917
val |= MVPP22_GMAC_INT_SUM_MASK_LINK_STAT ;
@@ -4940,7 +4942,8 @@ static void mvpp22_gop_mask_irq(struct mvpp2_port *port)
4940
4942
4941
4943
if (phy_interface_mode_is_rgmii (port -> phy_interface ) ||
4942
4944
port -> phy_interface == PHY_INTERFACE_MODE_SGMII ||
4943
- port -> phy_interface == PHY_INTERFACE_MODE_1000BASEX ) {
4945
+ port -> phy_interface == PHY_INTERFACE_MODE_1000BASEX ||
4946
+ port -> phy_interface == PHY_INTERFACE_MODE_2500BASEX ) {
4944
4947
val = readl (port -> base + MVPP22_GMAC_INT_SUM_MASK );
4945
4948
val &= ~MVPP22_GMAC_INT_SUM_MASK_LINK_STAT ;
4946
4949
writel (val , port -> base + MVPP22_GMAC_INT_SUM_MASK );
@@ -4953,7 +4956,8 @@ static void mvpp22_gop_setup_irq(struct mvpp2_port *port)
4953
4956
4954
4957
if (phy_interface_mode_is_rgmii (port -> phy_interface ) ||
4955
4958
port -> phy_interface == PHY_INTERFACE_MODE_SGMII ||
4956
- port -> phy_interface == PHY_INTERFACE_MODE_1000BASEX ) {
4959
+ port -> phy_interface == PHY_INTERFACE_MODE_1000BASEX ||
4960
+ port -> phy_interface == PHY_INTERFACE_MODE_2500BASEX ) {
4957
4961
val = readl (port -> base + MVPP22_GMAC_INT_MASK );
4958
4962
val |= MVPP22_GMAC_INT_MASK_LINK_STAT ;
4959
4963
writel (val , port -> base + MVPP22_GMAC_INT_MASK );
@@ -4968,6 +4972,16 @@ static void mvpp22_gop_setup_irq(struct mvpp2_port *port)
4968
4972
mvpp22_gop_unmask_irq (port );
4969
4973
}
4970
4974
4975
+ /* Sets the PHY mode of the COMPHY (which configures the serdes lanes).
4976
+ *
4977
+ * The PHY mode used by the PPv2 driver comes from the network subsystem, while
4978
+ * the one given to the COMPHY comes from the generic PHY subsystem. Hence they
4979
+ * differ.
4980
+ *
4981
+ * The COMPHY configures the serdes lanes regardless of the actual use of the
4982
+ * lanes by the physical layer. This is why configurations like
4983
+ * "PPv2 (2500BaseX) - COMPHY (2500SGMII)" are valid.
4984
+ */
4971
4985
static int mvpp22_comphy_init (struct mvpp2_port * port )
4972
4986
{
4973
4987
enum phy_mode mode ;
@@ -4981,6 +4995,9 @@ static int mvpp22_comphy_init(struct mvpp2_port *port)
4981
4995
case PHY_INTERFACE_MODE_1000BASEX :
4982
4996
mode = PHY_MODE_SGMII ;
4983
4997
break ;
4998
+ case PHY_INTERFACE_MODE_2500BASEX :
4999
+ mode = PHY_MODE_2500SGMII ;
5000
+ break ;
4984
5001
case PHY_INTERFACE_MODE_10GKR :
4985
5002
mode = PHY_MODE_10GKR ;
4986
5003
break ;
@@ -5062,7 +5079,8 @@ static void mvpp2_port_loopback_set(struct mvpp2_port *port,
5062
5079
val &= ~MVPP2_GMAC_GMII_LB_EN_MASK ;
5063
5080
5064
5081
if (port -> phy_interface == PHY_INTERFACE_MODE_SGMII ||
5065
- port -> phy_interface == PHY_INTERFACE_MODE_1000BASEX )
5082
+ port -> phy_interface == PHY_INTERFACE_MODE_1000BASEX ||
5083
+ port -> phy_interface == PHY_INTERFACE_MODE_2500BASEX )
5066
5084
val |= MVPP2_GMAC_PCS_LB_EN_MASK ;
5067
5085
else
5068
5086
val &= ~MVPP2_GMAC_PCS_LB_EN_MASK ;
@@ -6273,7 +6291,8 @@ static irqreturn_t mvpp2_link_status_isr(int irq, void *dev_id)
6273
6291
}
6274
6292
} else if (phy_interface_mode_is_rgmii (port -> phy_interface ) ||
6275
6293
port -> phy_interface == PHY_INTERFACE_MODE_SGMII ||
6276
- port -> phy_interface == PHY_INTERFACE_MODE_1000BASEX ) {
6294
+ port -> phy_interface == PHY_INTERFACE_MODE_1000BASEX ||
6295
+ port -> phy_interface == PHY_INTERFACE_MODE_2500BASEX ) {
6277
6296
val = readl (port -> base + MVPP22_GMAC_INT_STAT );
6278
6297
if (val & MVPP22_GMAC_INT_STAT_LINK ) {
6279
6298
event = true;
@@ -8056,8 +8075,10 @@ static void mvpp2_phylink_validate(struct net_device *dev,
8056
8075
phylink_set (mask , 10000b aseT_Full );
8057
8076
/* Fall-through */
8058
8077
case PHY_INTERFACE_MODE_1000BASEX :
8078
+ case PHY_INTERFACE_MODE_2500BASEX :
8059
8079
phylink_set (mask , 1000b aseT_Full );
8060
8080
phylink_set (mask , 1000b aseX_Full );
8081
+ phylink_set (mask , 2500b aseX_Full );
8061
8082
}
8062
8083
8063
8084
bitmap_and (supported , supported , mask , __ETHTOOL_LINK_MODE_MASK_NBITS );
@@ -8100,6 +8121,9 @@ static void mvpp2_gmac_link_state(struct mvpp2_port *port,
8100
8121
case PHY_INTERFACE_MODE_1000BASEX :
8101
8122
state -> speed = SPEED_1000 ;
8102
8123
break ;
8124
+ case PHY_INTERFACE_MODE_2500BASEX :
8125
+ state -> speed = SPEED_2500 ;
8126
+ break ;
8103
8127
default :
8104
8128
if (val & MVPP2_GMAC_STATUS0_GMII_SPEED )
8105
8129
state -> speed = SPEED_1000 ;
@@ -8199,11 +8223,12 @@ static void mvpp2_gmac_config(struct mvpp2_port *port, unsigned int mode,
8199
8223
ctrl0 &= ~MVPP2_GMAC_PORT_TYPE_MASK ;
8200
8224
ctrl2 &= ~(MVPP2_GMAC_PORT_RESET_MASK | MVPP2_GMAC_PCS_ENABLE_MASK );
8201
8225
8202
- if (state -> interface == PHY_INTERFACE_MODE_1000BASEX ) {
8203
- /* 1000BaseX port cannot negotiate speed nor can it negotiate
8204
- * duplex: they are always operating with a fixed speed of
8205
- * 1000Mbps in full duplex, so force 1000 speed and full duplex
8206
- * here.
8226
+ if (state -> interface == PHY_INTERFACE_MODE_1000BASEX ||
8227
+ state -> interface == PHY_INTERFACE_MODE_2500BASEX ) {
8228
+ /* 1000BaseX and 2500BaseX ports cannot negotiate speed nor can
8229
+ * they negotiate duplex: they are always operating with a fixed
8230
+ * speed of 1000/2500Mbps in full duplex, so force 1000/2500
8231
+ * speed and full duplex here.
8207
8232
*/
8208
8233
ctrl0 |= MVPP2_GMAC_PORT_TYPE_MASK ;
8209
8234
an |= MVPP2_GMAC_CONFIG_GMII_SPEED |
@@ -8220,7 +8245,8 @@ static void mvpp2_gmac_config(struct mvpp2_port *port, unsigned int mode,
8220
8245
an |= MVPP2_GMAC_FC_ADV_ASM_EN ;
8221
8246
8222
8247
if (state -> interface == PHY_INTERFACE_MODE_SGMII ||
8223
- state -> interface == PHY_INTERFACE_MODE_1000BASEX ) {
8248
+ state -> interface == PHY_INTERFACE_MODE_1000BASEX ||
8249
+ state -> interface == PHY_INTERFACE_MODE_2500BASEX ) {
8224
8250
an |= MVPP2_GMAC_IN_BAND_AUTONEG ;
8225
8251
ctrl2 |= MVPP2_GMAC_INBAND_AN_MASK | MVPP2_GMAC_PCS_ENABLE_MASK ;
8226
8252
@@ -8286,7 +8312,8 @@ static void mvpp2_mac_config(struct net_device *dev, unsigned int mode,
8286
8312
mvpp2_xlg_config (port , mode , state );
8287
8313
else if (phy_interface_mode_is_rgmii (state -> interface ) ||
8288
8314
state -> interface == PHY_INTERFACE_MODE_SGMII ||
8289
- state -> interface == PHY_INTERFACE_MODE_1000BASEX )
8315
+ state -> interface == PHY_INTERFACE_MODE_1000BASEX ||
8316
+ state -> interface == PHY_INTERFACE_MODE_2500BASEX )
8290
8317
mvpp2_gmac_config (port , mode , state );
8291
8318
8292
8319
if (port -> priv -> hw_version == MVPP21 && port -> flags & MVPP2_F_LOOPBACK )
0 commit comments