@@ -4870,6 +4870,7 @@ static int mvpp22_gop_init(struct mvpp2_port *port)
4870
4870
mvpp22_gop_init_rgmii (port );
4871
4871
break ;
4872
4872
case PHY_INTERFACE_MODE_SGMII :
4873
+ case PHY_INTERFACE_MODE_1000BASEX :
4873
4874
mvpp22_gop_init_sgmii (port );
4874
4875
break ;
4875
4876
case PHY_INTERFACE_MODE_10GKR :
@@ -4907,7 +4908,8 @@ static void mvpp22_gop_unmask_irq(struct mvpp2_port *port)
4907
4908
u32 val ;
4908
4909
4909
4910
if (phy_interface_mode_is_rgmii (port -> phy_interface ) ||
4910
- port -> phy_interface == PHY_INTERFACE_MODE_SGMII ) {
4911
+ port -> phy_interface == PHY_INTERFACE_MODE_SGMII ||
4912
+ port -> phy_interface == PHY_INTERFACE_MODE_1000BASEX ) {
4911
4913
/* Enable the GMAC link status irq for this port */
4912
4914
val = readl (port -> base + MVPP22_GMAC_INT_SUM_MASK );
4913
4915
val |= MVPP22_GMAC_INT_SUM_MASK_LINK_STAT ;
@@ -4937,7 +4939,8 @@ static void mvpp22_gop_mask_irq(struct mvpp2_port *port)
4937
4939
}
4938
4940
4939
4941
if (phy_interface_mode_is_rgmii (port -> phy_interface ) ||
4940
- port -> phy_interface == PHY_INTERFACE_MODE_SGMII ) {
4942
+ port -> phy_interface == PHY_INTERFACE_MODE_SGMII ||
4943
+ port -> phy_interface == PHY_INTERFACE_MODE_1000BASEX ) {
4941
4944
val = readl (port -> base + MVPP22_GMAC_INT_SUM_MASK );
4942
4945
val &= ~MVPP22_GMAC_INT_SUM_MASK_LINK_STAT ;
4943
4946
writel (val , port -> base + MVPP22_GMAC_INT_SUM_MASK );
@@ -4949,7 +4952,8 @@ static void mvpp22_gop_setup_irq(struct mvpp2_port *port)
4949
4952
u32 val ;
4950
4953
4951
4954
if (phy_interface_mode_is_rgmii (port -> phy_interface ) ||
4952
- port -> phy_interface == PHY_INTERFACE_MODE_SGMII ) {
4955
+ port -> phy_interface == PHY_INTERFACE_MODE_SGMII ||
4956
+ port -> phy_interface == PHY_INTERFACE_MODE_1000BASEX ) {
4953
4957
val = readl (port -> base + MVPP22_GMAC_INT_MASK );
4954
4958
val |= MVPP22_GMAC_INT_MASK_LINK_STAT ;
4955
4959
writel (val , port -> base + MVPP22_GMAC_INT_MASK );
@@ -4974,6 +4978,7 @@ static int mvpp22_comphy_init(struct mvpp2_port *port)
4974
4978
4975
4979
switch (port -> phy_interface ) {
4976
4980
case PHY_INTERFACE_MODE_SGMII :
4981
+ case PHY_INTERFACE_MODE_1000BASEX :
4977
4982
mode = PHY_MODE_SGMII ;
4978
4983
break ;
4979
4984
case PHY_INTERFACE_MODE_10GKR :
@@ -5056,7 +5061,8 @@ static void mvpp2_port_loopback_set(struct mvpp2_port *port,
5056
5061
else
5057
5062
val &= ~MVPP2_GMAC_GMII_LB_EN_MASK ;
5058
5063
5059
- if (port -> phy_interface == PHY_INTERFACE_MODE_SGMII )
5064
+ if (port -> phy_interface == PHY_INTERFACE_MODE_SGMII ||
5065
+ port -> phy_interface == PHY_INTERFACE_MODE_1000BASEX )
5060
5066
val |= MVPP2_GMAC_PCS_LB_EN_MASK ;
5061
5067
else
5062
5068
val &= ~MVPP2_GMAC_PCS_LB_EN_MASK ;
@@ -6266,7 +6272,8 @@ static irqreturn_t mvpp2_link_status_isr(int irq, void *dev_id)
6266
6272
link = true;
6267
6273
}
6268
6274
} else if (phy_interface_mode_is_rgmii (port -> phy_interface ) ||
6269
- port -> phy_interface == PHY_INTERFACE_MODE_SGMII ) {
6275
+ port -> phy_interface == PHY_INTERFACE_MODE_SGMII ||
6276
+ port -> phy_interface == PHY_INTERFACE_MODE_1000BASEX ) {
6270
6277
val = readl (port -> base + MVPP22_GMAC_INT_STAT );
6271
6278
if (val & MVPP22_GMAC_INT_STAT_LINK ) {
6272
6279
event = true;
@@ -8032,20 +8039,25 @@ static void mvpp2_phylink_validate(struct net_device *dev,
8032
8039
phylink_set (mask , Pause );
8033
8040
phylink_set (mask , Asym_Pause );
8034
8041
8035
- phylink_set (mask , 10b aseT_Half );
8036
- phylink_set (mask , 10b aseT_Full );
8037
- phylink_set (mask , 100b aseT_Half );
8038
- phylink_set (mask , 100b aseT_Full );
8039
- phylink_set (mask , 1000b aseT_Full );
8040
- phylink_set (mask , 10000b aseT_Full );
8041
-
8042
- if (state -> interface == PHY_INTERFACE_MODE_10GKR ) {
8042
+ switch (state -> interface ) {
8043
+ case PHY_INTERFACE_MODE_10GKR :
8043
8044
phylink_set (mask , 10000b aseCR_Full );
8044
8045
phylink_set (mask , 10000b aseSR_Full );
8045
8046
phylink_set (mask , 10000b aseLR_Full );
8046
8047
phylink_set (mask , 10000b aseLRM_Full );
8047
8048
phylink_set (mask , 10000b aseER_Full );
8048
8049
phylink_set (mask , 10000b aseKR_Full );
8050
+ /* Fall-through */
8051
+ default :
8052
+ phylink_set (mask , 10b aseT_Half );
8053
+ phylink_set (mask , 10b aseT_Full );
8054
+ phylink_set (mask , 100b aseT_Half );
8055
+ phylink_set (mask , 100b aseT_Full );
8056
+ phylink_set (mask , 10000b aseT_Full );
8057
+ /* Fall-through */
8058
+ case PHY_INTERFACE_MODE_1000BASEX :
8059
+ phylink_set (mask , 1000b aseT_Full );
8060
+ phylink_set (mask , 1000b aseX_Full );
8049
8061
}
8050
8062
8051
8063
bitmap_and (supported , supported , mask , __ETHTOOL_LINK_MODE_MASK_NBITS );
@@ -8084,12 +8096,18 @@ static void mvpp2_gmac_link_state(struct mvpp2_port *port,
8084
8096
state -> link = !!(val & MVPP2_GMAC_STATUS0_LINK_UP );
8085
8097
state -> duplex = !!(val & MVPP2_GMAC_STATUS0_FULL_DUPLEX );
8086
8098
8087
- if (val & MVPP2_GMAC_STATUS0_GMII_SPEED )
8099
+ switch (port -> phy_interface ) {
8100
+ case PHY_INTERFACE_MODE_1000BASEX :
8088
8101
state -> speed = SPEED_1000 ;
8089
- else if (val & MVPP2_GMAC_STATUS0_MII_SPEED )
8090
- state -> speed = SPEED_100 ;
8091
- else
8092
- state -> speed = SPEED_10 ;
8102
+ break ;
8103
+ default :
8104
+ if (val & MVPP2_GMAC_STATUS0_GMII_SPEED )
8105
+ state -> speed = SPEED_1000 ;
8106
+ else if (val & MVPP2_GMAC_STATUS0_MII_SPEED )
8107
+ state -> speed = SPEED_100 ;
8108
+ else
8109
+ state -> speed = SPEED_10 ;
8110
+ }
8093
8111
8094
8112
state -> pause = 0 ;
8095
8113
if (val & MVPP2_GMAC_STATUS0_RX_PAUSE )
@@ -8181,8 +8199,18 @@ static void mvpp2_gmac_config(struct mvpp2_port *port, unsigned int mode,
8181
8199
ctrl0 &= ~MVPP2_GMAC_PORT_TYPE_MASK ;
8182
8200
ctrl2 &= ~(MVPP2_GMAC_PORT_RESET_MASK | MVPP2_GMAC_PCS_ENABLE_MASK );
8183
8201
8184
- if (!phy_interface_mode_is_rgmii (state -> interface ))
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.
8207
+ */
8208
+ ctrl0 |= MVPP2_GMAC_PORT_TYPE_MASK ;
8209
+ an |= MVPP2_GMAC_CONFIG_GMII_SPEED |
8210
+ MVPP2_GMAC_CONFIG_FULL_DUPLEX ;
8211
+ } else if (!phy_interface_mode_is_rgmii (state -> interface )) {
8185
8212
an |= MVPP2_GMAC_AN_SPEED_EN | MVPP2_GMAC_FLOW_CTRL_AUTONEG ;
8213
+ }
8186
8214
8187
8215
if (state -> duplex )
8188
8216
an |= MVPP2_GMAC_CONFIG_FULL_DUPLEX ;
@@ -8191,7 +8219,8 @@ static void mvpp2_gmac_config(struct mvpp2_port *port, unsigned int mode,
8191
8219
if (phylink_test (state -> advertising , Asym_Pause ))
8192
8220
an |= MVPP2_GMAC_FC_ADV_ASM_EN ;
8193
8221
8194
- if (state -> interface == PHY_INTERFACE_MODE_SGMII ) {
8222
+ if (state -> interface == PHY_INTERFACE_MODE_SGMII ||
8223
+ state -> interface == PHY_INTERFACE_MODE_1000BASEX ) {
8195
8224
an |= MVPP2_GMAC_IN_BAND_AUTONEG ;
8196
8225
ctrl2 |= MVPP2_GMAC_INBAND_AN_MASK | MVPP2_GMAC_PCS_ENABLE_MASK ;
8197
8226
@@ -8256,7 +8285,8 @@ static void mvpp2_mac_config(struct net_device *dev, unsigned int mode,
8256
8285
if (state -> interface == PHY_INTERFACE_MODE_10GKR )
8257
8286
mvpp2_xlg_config (port , mode , state );
8258
8287
else if (phy_interface_mode_is_rgmii (state -> interface ) ||
8259
- state -> interface == PHY_INTERFACE_MODE_SGMII )
8288
+ state -> interface == PHY_INTERFACE_MODE_SGMII ||
8289
+ state -> interface == PHY_INTERFACE_MODE_1000BASEX )
8260
8290
mvpp2_gmac_config (port , mode , state );
8261
8291
8262
8292
if (port -> priv -> hw_version == MVPP21 && port -> flags & MVPP2_F_LOOPBACK )
0 commit comments