18
18
#include "ksz9477_reg.h"
19
19
#include "ksz_common.h"
20
20
21
+ /* Used with variable features to indicate capabilities. */
22
+ #define GBIT_SUPPORT BIT(0)
23
+ #define NEW_XMII BIT(1)
24
+ #define IS_9893 BIT(2)
25
+
21
26
static const struct {
22
27
int index ;
23
28
char string [ETH_GSTRING_LEN ];
@@ -328,7 +333,12 @@ static void ksz9477_port_init_cnt(struct ksz_device *dev, int port)
328
333
static enum dsa_tag_protocol ksz9477_get_tag_protocol (struct dsa_switch * ds ,
329
334
int port )
330
335
{
331
- return DSA_TAG_PROTO_KSZ9477 ;
336
+ enum dsa_tag_protocol proto = DSA_TAG_PROTO_KSZ9477 ;
337
+ struct ksz_device * dev = ds -> priv ;
338
+
339
+ if (dev -> features & IS_9893 )
340
+ proto = DSA_TAG_PROTO_KSZ9893 ;
341
+ return proto ;
332
342
}
333
343
334
344
static int ksz9477_phy_read16 (struct dsa_switch * ds , int addr , int reg )
@@ -389,6 +399,10 @@ static int ksz9477_phy_write16(struct dsa_switch *ds, int addr, int reg,
389
399
/* No real PHY after this. */
390
400
if (addr >= dev -> phy_port_cnt )
391
401
return 0 ;
402
+
403
+ /* No gigabit support. Do not write to this register. */
404
+ if (!(dev -> features & GBIT_SUPPORT ) && reg == MII_CTRL1000 )
405
+ return 0 ;
392
406
ksz_pwrite16 (dev , addr , 0x100 + (reg << 1 ), val );
393
407
394
408
return 0 ;
@@ -998,11 +1012,156 @@ static void ksz9477_port_mirror_del(struct dsa_switch *ds, int port,
998
1012
static void ksz9477_phy_setup (struct ksz_device * dev , int port ,
999
1013
struct phy_device * phy )
1000
1014
{
1001
- if (port < dev -> phy_port_cnt ) {
1002
- /* The MAC actually cannot run in 1000 half-duplex mode. */
1015
+ /* Only apply to port with PHY. */
1016
+ if (port >= dev -> phy_port_cnt )
1017
+ return ;
1018
+
1019
+ /* The MAC actually cannot run in 1000 half-duplex mode. */
1020
+ phy_remove_link_mode (phy ,
1021
+ ETHTOOL_LINK_MODE_1000baseT_Half_BIT );
1022
+
1023
+ /* PHY does not support gigabit. */
1024
+ if (!(dev -> features & GBIT_SUPPORT ))
1003
1025
phy_remove_link_mode (phy ,
1004
- ETHTOOL_LINK_MODE_1000baseT_Half_BIT );
1026
+ ETHTOOL_LINK_MODE_1000baseT_Full_BIT );
1027
+ }
1028
+
1029
+ static bool ksz9477_get_gbit (struct ksz_device * dev , u8 data )
1030
+ {
1031
+ bool gbit ;
1032
+
1033
+ if (dev -> features & NEW_XMII )
1034
+ gbit = !(data & PORT_MII_NOT_1GBIT );
1035
+ else
1036
+ gbit = !!(data & PORT_MII_1000MBIT_S1 );
1037
+ return gbit ;
1038
+ }
1039
+
1040
+ static void ksz9477_set_gbit (struct ksz_device * dev , bool gbit , u8 * data )
1041
+ {
1042
+ if (dev -> features & NEW_XMII ) {
1043
+ if (gbit )
1044
+ * data &= ~PORT_MII_NOT_1GBIT ;
1045
+ else
1046
+ * data |= PORT_MII_NOT_1GBIT ;
1047
+ } else {
1048
+ if (gbit )
1049
+ * data |= PORT_MII_1000MBIT_S1 ;
1050
+ else
1051
+ * data &= ~PORT_MII_1000MBIT_S1 ;
1052
+ }
1053
+ }
1054
+
1055
+ static int ksz9477_get_xmii (struct ksz_device * dev , u8 data )
1056
+ {
1057
+ int mode ;
1058
+
1059
+ if (dev -> features & NEW_XMII ) {
1060
+ switch (data & PORT_MII_SEL_M ) {
1061
+ case PORT_MII_SEL :
1062
+ mode = 0 ;
1063
+ break ;
1064
+ case PORT_RMII_SEL :
1065
+ mode = 1 ;
1066
+ break ;
1067
+ case PORT_GMII_SEL :
1068
+ mode = 2 ;
1069
+ break ;
1070
+ default :
1071
+ mode = 3 ;
1072
+ }
1073
+ } else {
1074
+ switch (data & PORT_MII_SEL_M ) {
1075
+ case PORT_MII_SEL_S1 :
1076
+ mode = 0 ;
1077
+ break ;
1078
+ case PORT_RMII_SEL_S1 :
1079
+ mode = 1 ;
1080
+ break ;
1081
+ case PORT_GMII_SEL_S1 :
1082
+ mode = 2 ;
1083
+ break ;
1084
+ default :
1085
+ mode = 3 ;
1086
+ }
1087
+ }
1088
+ return mode ;
1089
+ }
1090
+
1091
+ static void ksz9477_set_xmii (struct ksz_device * dev , int mode , u8 * data )
1092
+ {
1093
+ u8 xmii ;
1094
+
1095
+ if (dev -> features & NEW_XMII ) {
1096
+ switch (mode ) {
1097
+ case 0 :
1098
+ xmii = PORT_MII_SEL ;
1099
+ break ;
1100
+ case 1 :
1101
+ xmii = PORT_RMII_SEL ;
1102
+ break ;
1103
+ case 2 :
1104
+ xmii = PORT_GMII_SEL ;
1105
+ break ;
1106
+ default :
1107
+ xmii = PORT_RGMII_SEL ;
1108
+ break ;
1109
+ }
1110
+ } else {
1111
+ switch (mode ) {
1112
+ case 0 :
1113
+ xmii = PORT_MII_SEL_S1 ;
1114
+ break ;
1115
+ case 1 :
1116
+ xmii = PORT_RMII_SEL_S1 ;
1117
+ break ;
1118
+ case 2 :
1119
+ xmii = PORT_GMII_SEL_S1 ;
1120
+ break ;
1121
+ default :
1122
+ xmii = PORT_RGMII_SEL_S1 ;
1123
+ break ;
1124
+ }
1125
+ }
1126
+ * data &= ~PORT_MII_SEL_M ;
1127
+ * data |= xmii ;
1128
+ }
1129
+
1130
+ static phy_interface_t ksz9477_get_interface (struct ksz_device * dev , int port )
1131
+ {
1132
+ phy_interface_t interface ;
1133
+ bool gbit ;
1134
+ int mode ;
1135
+ u8 data8 ;
1136
+
1137
+ if (port < dev -> phy_port_cnt )
1138
+ return PHY_INTERFACE_MODE_NA ;
1139
+ ksz_pread8 (dev , port , REG_PORT_XMII_CTRL_1 , & data8 );
1140
+ gbit = ksz9477_get_gbit (dev , data8 );
1141
+ mode = ksz9477_get_xmii (dev , data8 );
1142
+ switch (mode ) {
1143
+ case 2 :
1144
+ interface = PHY_INTERFACE_MODE_GMII ;
1145
+ if (gbit )
1146
+ break ;
1147
+ case 0 :
1148
+ interface = PHY_INTERFACE_MODE_MII ;
1149
+ break ;
1150
+ case 1 :
1151
+ interface = PHY_INTERFACE_MODE_RMII ;
1152
+ break ;
1153
+ default :
1154
+ interface = PHY_INTERFACE_MODE_RGMII ;
1155
+ if (data8 & PORT_RGMII_ID_EG_ENABLE )
1156
+ interface = PHY_INTERFACE_MODE_RGMII_TXID ;
1157
+ if (data8 & PORT_RGMII_ID_IG_ENABLE ) {
1158
+ interface = PHY_INTERFACE_MODE_RGMII_RXID ;
1159
+ if (data8 & PORT_RGMII_ID_EG_ENABLE )
1160
+ interface = PHY_INTERFACE_MODE_RGMII_ID ;
1161
+ }
1162
+ break ;
1005
1163
}
1164
+ return interface ;
1006
1165
}
1007
1166
1008
1167
static void ksz9477_port_setup (struct ksz_device * dev , int port , bool cpu_port )
@@ -1051,24 +1210,25 @@ static void ksz9477_port_setup(struct ksz_device *dev, int port, bool cpu_port)
1051
1210
1052
1211
/* configure MAC to 1G & RGMII mode */
1053
1212
ksz_pread8 (dev , port , REG_PORT_XMII_CTRL_1 , & data8 );
1054
- data8 &= ~PORT_MII_NOT_1GBIT ;
1055
- data8 &= ~PORT_MII_SEL_M ;
1056
1213
switch (dev -> interface ) {
1057
1214
case PHY_INTERFACE_MODE_MII :
1058
- data8 |= PORT_MII_NOT_1GBIT ;
1059
- data8 |= PORT_MII_SEL ;
1215
+ ksz9477_set_xmii ( dev , 0 , & data8 ) ;
1216
+ ksz9477_set_gbit ( dev , false, & data8 ) ;
1060
1217
p -> phydev .speed = SPEED_100 ;
1061
1218
break ;
1062
1219
case PHY_INTERFACE_MODE_RMII :
1063
- data8 |= PORT_MII_NOT_1GBIT ;
1064
- data8 |= PORT_RMII_SEL ;
1220
+ ksz9477_set_xmii ( dev , 1 , & data8 ) ;
1221
+ ksz9477_set_gbit ( dev , false, & data8 ) ;
1065
1222
p -> phydev .speed = SPEED_100 ;
1066
1223
break ;
1067
1224
case PHY_INTERFACE_MODE_GMII :
1068
- data8 |= PORT_GMII_SEL ;
1225
+ ksz9477_set_xmii (dev , 2 , & data8 );
1226
+ ksz9477_set_gbit (dev , true, & data8 );
1069
1227
p -> phydev .speed = SPEED_1000 ;
1070
1228
break ;
1071
1229
default :
1230
+ ksz9477_set_xmii (dev , 3 , & data8 );
1231
+ ksz9477_set_gbit (dev , true, & data8 );
1072
1232
data8 &= ~PORT_RGMII_ID_IG_ENABLE ;
1073
1233
data8 &= ~PORT_RGMII_ID_EG_ENABLE ;
1074
1234
if (dev -> interface == PHY_INTERFACE_MODE_RGMII_ID ||
@@ -1077,7 +1237,6 @@ static void ksz9477_port_setup(struct ksz_device *dev, int port, bool cpu_port)
1077
1237
if (dev -> interface == PHY_INTERFACE_MODE_RGMII_ID ||
1078
1238
dev -> interface == PHY_INTERFACE_MODE_RGMII_TXID )
1079
1239
data8 |= PORT_RGMII_ID_EG_ENABLE ;
1080
- data8 |= PORT_RGMII_SEL ;
1081
1240
p -> phydev .speed = SPEED_1000 ;
1082
1241
break ;
1083
1242
}
@@ -1115,10 +1274,25 @@ static void ksz9477_config_cpu_port(struct dsa_switch *ds)
1115
1274
1116
1275
for (i = 0 ; i < dev -> port_cnt ; i ++ ) {
1117
1276
if (dsa_is_cpu_port (ds , i ) && (dev -> cpu_ports & (1 << i ))) {
1277
+ phy_interface_t interface ;
1278
+
1118
1279
dev -> cpu_port = i ;
1119
1280
dev -> host_mask = (1 << dev -> cpu_port );
1120
1281
dev -> port_mask |= dev -> host_mask ;
1121
1282
1283
+ /* Read from XMII register to determine host port
1284
+ * interface. If set specifically in device tree
1285
+ * note the difference to help debugging.
1286
+ */
1287
+ interface = ksz9477_get_interface (dev , i );
1288
+ if (!dev -> interface )
1289
+ dev -> interface = interface ;
1290
+ if (interface && interface != dev -> interface )
1291
+ dev_info (dev -> dev ,
1292
+ "use %s instead of %s\n" ,
1293
+ phy_modes (dev -> interface ),
1294
+ phy_modes (interface ));
1295
+
1122
1296
/* enable cpu port */
1123
1297
ksz9477_port_setup (dev , i , true);
1124
1298
p = & dev -> ports [dev -> cpu_port ];
@@ -1172,6 +1346,9 @@ static int ksz9477_setup(struct dsa_switch *ds)
1172
1346
ksz9477_cfg32 (dev , REG_SW_QM_CTRL__4 , UNICAST_VLAN_BOUNDARY ,
1173
1347
true);
1174
1348
1349
+ /* Do not work correctly with tail tagging. */
1350
+ ksz_cfg (dev , REG_SW_MAC_CTRL_0 , SW_CHECK_LENGTH , false);
1351
+
1175
1352
/* accept packet up to 2000bytes */
1176
1353
ksz_cfg (dev , REG_SW_MAC_CTRL_1 , SW_LEGAL_PACKET_DISABLE , true);
1177
1354
@@ -1230,6 +1407,8 @@ static u32 ksz9477_get_port_addr(int port, int offset)
1230
1407
static int ksz9477_switch_detect (struct ksz_device * dev )
1231
1408
{
1232
1409
u8 data8 ;
1410
+ u8 id_hi ;
1411
+ u8 id_lo ;
1233
1412
u32 id32 ;
1234
1413
int ret ;
1235
1414
@@ -1245,13 +1424,42 @@ static int ksz9477_switch_detect(struct ksz_device *dev)
1245
1424
1246
1425
/* read chip id */
1247
1426
ret = ksz_read32 (dev , REG_CHIP_ID0__1 , & id32 );
1427
+ if (ret )
1428
+ return ret ;
1429
+ ret = ksz_read8 (dev , REG_GLOBAL_OPTIONS , & data8 );
1248
1430
if (ret )
1249
1431
return ret ;
1250
1432
1251
1433
/* Number of ports can be reduced depending on chip. */
1252
1434
dev -> mib_port_cnt = TOTAL_PORT_NUM ;
1253
1435
dev -> phy_port_cnt = 5 ;
1254
1436
1437
+ /* Default capability is gigabit capable. */
1438
+ dev -> features = GBIT_SUPPORT ;
1439
+
1440
+ id_hi = (u8 )(id32 >> 16 );
1441
+ id_lo = (u8 )(id32 >> 8 );
1442
+ if ((id_lo & 0xf ) == 3 ) {
1443
+ /* Chip is from KSZ9893 design. */
1444
+ dev -> features |= IS_9893 ;
1445
+
1446
+ /* Chip does not support gigabit. */
1447
+ if (data8 & SW_QW_ABLE )
1448
+ dev -> features &= ~GBIT_SUPPORT ;
1449
+ dev -> mib_port_cnt = 3 ;
1450
+ dev -> phy_port_cnt = 2 ;
1451
+ } else {
1452
+ /* Chip uses new XMII register definitions. */
1453
+ dev -> features |= NEW_XMII ;
1454
+
1455
+ /* Chip does not support gigabit. */
1456
+ if (!(data8 & SW_GIGABIT_ABLE ))
1457
+ dev -> features &= ~GBIT_SUPPORT ;
1458
+ }
1459
+
1460
+ /* Change chip id to known ones so it can be matched against them. */
1461
+ id32 = (id_hi << 16 ) | (id_lo << 8 );
1462
+
1255
1463
dev -> chip_id = id32 ;
1256
1464
1257
1465
return 0 ;
@@ -1286,6 +1494,15 @@ static const struct ksz_chip_data ksz9477_switch_chips[] = {
1286
1494
.cpu_ports = 0x7F , /* can be configured as cpu port */
1287
1495
.port_cnt = 7 , /* total physical port count */
1288
1496
},
1497
+ {
1498
+ .chip_id = 0x00989300 ,
1499
+ .dev_name = "KSZ9893" ,
1500
+ .num_vlans = 4096 ,
1501
+ .num_alus = 4096 ,
1502
+ .num_statics = 16 ,
1503
+ .cpu_ports = 0x07 , /* can be configured as cpu port */
1504
+ .port_cnt = 3 , /* total port count */
1505
+ },
1289
1506
};
1290
1507
1291
1508
static int ksz9477_switch_init (struct ksz_device * dev )
@@ -1333,7 +1550,6 @@ static int ksz9477_switch_init(struct ksz_device *dev)
1333
1550
if (!dev -> ports [i ].mib .counters )
1334
1551
return - ENOMEM ;
1335
1552
}
1336
- dev -> interface = PHY_INTERFACE_MODE_RGMII_TXID ;
1337
1553
1338
1554
return 0 ;
1339
1555
}
0 commit comments