@@ -252,6 +252,54 @@ static void xgbe_kx_1000_mode(struct xgbe_prv_data *pdata)
252
252
pdata -> phy_if .phy_impl .set_mode (pdata , XGBE_MODE_KX_1000 );
253
253
}
254
254
255
+ static void xgbe_sfi_mode (struct xgbe_prv_data * pdata )
256
+ {
257
+ /* Disable KR training */
258
+ xgbe_an73_disable_kr_training (pdata );
259
+
260
+ /* Set MAC to 10G speed */
261
+ pdata -> hw_if .set_speed (pdata , SPEED_10000 );
262
+
263
+ /* Call PHY implementation support to complete rate change */
264
+ pdata -> phy_if .phy_impl .set_mode (pdata , XGBE_MODE_SFI );
265
+ }
266
+
267
+ static void xgbe_x_mode (struct xgbe_prv_data * pdata )
268
+ {
269
+ /* Disable KR training */
270
+ xgbe_an73_disable_kr_training (pdata );
271
+
272
+ /* Set MAC to 1G speed */
273
+ pdata -> hw_if .set_speed (pdata , SPEED_1000 );
274
+
275
+ /* Call PHY implementation support to complete rate change */
276
+ pdata -> phy_if .phy_impl .set_mode (pdata , XGBE_MODE_X );
277
+ }
278
+
279
+ static void xgbe_sgmii_1000_mode (struct xgbe_prv_data * pdata )
280
+ {
281
+ /* Disable KR training */
282
+ xgbe_an73_disable_kr_training (pdata );
283
+
284
+ /* Set MAC to 1G speed */
285
+ pdata -> hw_if .set_speed (pdata , SPEED_1000 );
286
+
287
+ /* Call PHY implementation support to complete rate change */
288
+ pdata -> phy_if .phy_impl .set_mode (pdata , XGBE_MODE_SGMII_1000 );
289
+ }
290
+
291
+ static void xgbe_sgmii_100_mode (struct xgbe_prv_data * pdata )
292
+ {
293
+ /* Disable KR training */
294
+ xgbe_an73_disable_kr_training (pdata );
295
+
296
+ /* Set MAC to 1G speed */
297
+ pdata -> hw_if .set_speed (pdata , SPEED_1000 );
298
+
299
+ /* Call PHY implementation support to complete rate change */
300
+ pdata -> phy_if .phy_impl .set_mode (pdata , XGBE_MODE_SGMII_100 );
301
+ }
302
+
255
303
static enum xgbe_mode xgbe_cur_mode (struct xgbe_prv_data * pdata )
256
304
{
257
305
return pdata -> phy_if .phy_impl .cur_mode (pdata );
@@ -275,6 +323,18 @@ static void xgbe_change_mode(struct xgbe_prv_data *pdata,
275
323
case XGBE_MODE_KR :
276
324
xgbe_kr_mode (pdata );
277
325
break ;
326
+ case XGBE_MODE_SGMII_100 :
327
+ xgbe_sgmii_100_mode (pdata );
328
+ break ;
329
+ case XGBE_MODE_SGMII_1000 :
330
+ xgbe_sgmii_1000_mode (pdata );
331
+ break ;
332
+ case XGBE_MODE_X :
333
+ xgbe_x_mode (pdata );
334
+ break ;
335
+ case XGBE_MODE_SFI :
336
+ xgbe_sfi_mode (pdata );
337
+ break ;
278
338
case XGBE_MODE_UNKNOWN :
279
339
break ;
280
340
default :
@@ -972,6 +1032,8 @@ static const char *xgbe_phy_fc_string(struct xgbe_prv_data *pdata)
972
1032
static const char * xgbe_phy_speed_string (int speed )
973
1033
{
974
1034
switch (speed ) {
1035
+ case SPEED_100 :
1036
+ return "100Mbps" ;
975
1037
case SPEED_1000 :
976
1038
return "1Gbps" ;
977
1039
case SPEED_2500 :
@@ -1057,6 +1119,10 @@ static int xgbe_phy_config_fixed(struct xgbe_prv_data *pdata)
1057
1119
case XGBE_MODE_KX_1000 :
1058
1120
case XGBE_MODE_KX_2500 :
1059
1121
case XGBE_MODE_KR :
1122
+ case XGBE_MODE_SGMII_100 :
1123
+ case XGBE_MODE_SGMII_1000 :
1124
+ case XGBE_MODE_X :
1125
+ case XGBE_MODE_SFI :
1060
1126
break ;
1061
1127
case XGBE_MODE_UNKNOWN :
1062
1128
default :
@@ -1074,9 +1140,15 @@ static int xgbe_phy_config_fixed(struct xgbe_prv_data *pdata)
1074
1140
1075
1141
static int __xgbe_phy_config_aneg (struct xgbe_prv_data * pdata )
1076
1142
{
1143
+ int ret ;
1144
+
1077
1145
set_bit (XGBE_LINK_INIT , & pdata -> dev_state );
1078
1146
pdata -> link_check = jiffies ;
1079
1147
1148
+ ret = pdata -> phy_if .phy_impl .an_config (pdata );
1149
+ if (ret )
1150
+ return ret ;
1151
+
1080
1152
if (pdata -> phy .autoneg != AUTONEG_ENABLE )
1081
1153
return xgbe_phy_config_fixed (pdata );
1082
1154
@@ -1092,6 +1164,14 @@ static int __xgbe_phy_config_aneg(struct xgbe_prv_data *pdata)
1092
1164
xgbe_set_mode (pdata , XGBE_MODE_KX_2500 );
1093
1165
} else if (xgbe_use_mode (pdata , XGBE_MODE_KX_1000 )) {
1094
1166
xgbe_set_mode (pdata , XGBE_MODE_KX_1000 );
1167
+ } else if (xgbe_use_mode (pdata , XGBE_MODE_SFI )) {
1168
+ xgbe_set_mode (pdata , XGBE_MODE_SFI );
1169
+ } else if (xgbe_use_mode (pdata , XGBE_MODE_X )) {
1170
+ xgbe_set_mode (pdata , XGBE_MODE_X );
1171
+ } else if (xgbe_use_mode (pdata , XGBE_MODE_SGMII_1000 )) {
1172
+ xgbe_set_mode (pdata , XGBE_MODE_SGMII_1000 );
1173
+ } else if (xgbe_use_mode (pdata , XGBE_MODE_SGMII_100 )) {
1174
+ xgbe_set_mode (pdata , XGBE_MODE_SGMII_100 );
1095
1175
} else {
1096
1176
enable_irq (pdata -> an_irq );
1097
1177
return - EINVAL ;
@@ -1167,13 +1247,19 @@ static void xgbe_phy_status_result(struct xgbe_prv_data *pdata)
1167
1247
mode = xgbe_phy_status_aneg (pdata );
1168
1248
1169
1249
switch (mode ) {
1250
+ case XGBE_MODE_SGMII_100 :
1251
+ pdata -> phy .speed = SPEED_100 ;
1252
+ break ;
1253
+ case XGBE_MODE_X :
1170
1254
case XGBE_MODE_KX_1000 :
1255
+ case XGBE_MODE_SGMII_1000 :
1171
1256
pdata -> phy .speed = SPEED_1000 ;
1172
1257
break ;
1173
1258
case XGBE_MODE_KX_2500 :
1174
1259
pdata -> phy .speed = SPEED_2500 ;
1175
1260
break ;
1176
1261
case XGBE_MODE_KR :
1262
+ case XGBE_MODE_SFI :
1177
1263
pdata -> phy .speed = SPEED_10000 ;
1178
1264
break ;
1179
1265
case XGBE_MODE_UNKNOWN :
@@ -1189,6 +1275,7 @@ static void xgbe_phy_status_result(struct xgbe_prv_data *pdata)
1189
1275
static void xgbe_phy_status (struct xgbe_prv_data * pdata )
1190
1276
{
1191
1277
unsigned int link_aneg ;
1278
+ int an_restart ;
1192
1279
1193
1280
if (test_bit (XGBE_LINK_ERR , & pdata -> dev_state )) {
1194
1281
netif_carrier_off (pdata -> netdev );
@@ -1199,7 +1286,13 @@ static void xgbe_phy_status(struct xgbe_prv_data *pdata)
1199
1286
1200
1287
link_aneg = (pdata -> phy .autoneg == AUTONEG_ENABLE );
1201
1288
1202
- pdata -> phy .link = pdata -> phy_if .phy_impl .link_status (pdata );
1289
+ pdata -> phy .link = pdata -> phy_if .phy_impl .link_status (pdata ,
1290
+ & an_restart );
1291
+ if (an_restart ) {
1292
+ xgbe_phy_config_aneg (pdata );
1293
+ return ;
1294
+ }
1295
+
1203
1296
if (pdata -> phy .link ) {
1204
1297
if (link_aneg && !xgbe_phy_aneg_done (pdata )) {
1205
1298
xgbe_check_link_timeout (pdata );
@@ -1284,6 +1377,14 @@ static int xgbe_phy_start(struct xgbe_prv_data *pdata)
1284
1377
xgbe_kx_2500_mode (pdata );
1285
1378
} else if (xgbe_use_mode (pdata , XGBE_MODE_KX_1000 )) {
1286
1379
xgbe_kx_1000_mode (pdata );
1380
+ } else if (xgbe_use_mode (pdata , XGBE_MODE_SFI )) {
1381
+ xgbe_sfi_mode (pdata );
1382
+ } else if (xgbe_use_mode (pdata , XGBE_MODE_X )) {
1383
+ xgbe_x_mode (pdata );
1384
+ } else if (xgbe_use_mode (pdata , XGBE_MODE_SGMII_1000 )) {
1385
+ xgbe_sgmii_1000_mode (pdata );
1386
+ } else if (xgbe_use_mode (pdata , XGBE_MODE_SGMII_100 )) {
1387
+ xgbe_sgmii_100_mode (pdata );
1287
1388
} else {
1288
1389
ret = - EINVAL ;
1289
1390
goto err_irq ;
@@ -1367,10 +1468,16 @@ static int xgbe_phy_best_advertised_speed(struct xgbe_prv_data *pdata)
1367
1468
{
1368
1469
if (pdata -> phy .advertising & ADVERTISED_10000baseKR_Full )
1369
1470
return SPEED_10000 ;
1471
+ else if (pdata -> phy .advertising & ADVERTISED_10000baseT_Full )
1472
+ return SPEED_10000 ;
1370
1473
else if (pdata -> phy .advertising & ADVERTISED_2500baseX_Full )
1371
1474
return SPEED_2500 ;
1372
1475
else if (pdata -> phy .advertising & ADVERTISED_1000baseKX_Full )
1373
1476
return SPEED_1000 ;
1477
+ else if (pdata -> phy .advertising & ADVERTISED_1000baseT_Full )
1478
+ return SPEED_1000 ;
1479
+ else if (pdata -> phy .advertising & ADVERTISED_100baseT_Full )
1480
+ return SPEED_100 ;
1374
1481
1375
1482
return SPEED_UNKNOWN ;
1376
1483
}
0 commit comments