@@ -40,6 +40,11 @@ enum prestera_cmd_type_t {
40
40
PRESTERA_CMD_TYPE_RXTX_INIT = 0x800 ,
41
41
PRESTERA_CMD_TYPE_RXTX_PORT_INIT = 0x801 ,
42
42
43
+ PRESTERA_CMD_TYPE_LAG_MEMBER_ADD = 0x900 ,
44
+ PRESTERA_CMD_TYPE_LAG_MEMBER_DELETE = 0x901 ,
45
+ PRESTERA_CMD_TYPE_LAG_MEMBER_ENABLE = 0x902 ,
46
+ PRESTERA_CMD_TYPE_LAG_MEMBER_DISABLE = 0x903 ,
47
+
43
48
PRESTERA_CMD_TYPE_STP_PORT_SET = 0x1000 ,
44
49
45
50
PRESTERA_CMD_TYPE_ACK = 0x10000 ,
@@ -133,6 +138,12 @@ enum {
133
138
PRESTERA_FC_SYMM_ASYMM ,
134
139
};
135
140
141
+ enum {
142
+ PRESTERA_HW_FDB_ENTRY_TYPE_REG_PORT = 0 ,
143
+ PRESTERA_HW_FDB_ENTRY_TYPE_LAG = 1 ,
144
+ PRESTERA_HW_FDB_ENTRY_TYPE_MAX = 2 ,
145
+ };
146
+
136
147
struct prestera_fw_event_handler {
137
148
struct list_head list ;
138
149
struct rcu_head rcu ;
@@ -174,6 +185,8 @@ struct prestera_msg_switch_init_resp {
174
185
u32 port_count ;
175
186
u32 mtu_max ;
176
187
u8 switch_id ;
188
+ u8 lag_max ;
189
+ u8 lag_member_max ;
177
190
};
178
191
179
192
struct prestera_msg_port_autoneg_param {
@@ -261,8 +274,13 @@ struct prestera_msg_vlan_req {
261
274
struct prestera_msg_fdb_req {
262
275
struct prestera_msg_cmd cmd ;
263
276
u8 dest_type ;
264
- u32 port ;
265
- u32 dev ;
277
+ union {
278
+ struct {
279
+ u32 port ;
280
+ u32 dev ;
281
+ };
282
+ u16 lag_id ;
283
+ } dest ;
266
284
u8 mac [ETH_ALEN ];
267
285
u16 vid ;
268
286
u8 dynamic ;
@@ -305,6 +323,13 @@ struct prestera_msg_rxtx_port_req {
305
323
u32 dev ;
306
324
};
307
325
326
+ struct prestera_msg_lag_req {
327
+ struct prestera_msg_cmd cmd ;
328
+ u32 port ;
329
+ u32 dev ;
330
+ u16 lag_id ;
331
+ };
332
+
308
333
struct prestera_msg_event {
309
334
u16 type ;
310
335
u16 id ;
@@ -327,7 +352,10 @@ union prestera_msg_event_fdb_param {
327
352
struct prestera_msg_event_fdb {
328
353
struct prestera_msg_event id ;
329
354
u8 dest_type ;
330
- u32 port_id ;
355
+ union {
356
+ u32 port_id ;
357
+ u16 lag_id ;
358
+ } dest ;
331
359
u32 vid ;
332
360
union prestera_msg_event_fdb_param param ;
333
361
};
@@ -398,7 +426,19 @@ static int prestera_fw_parse_fdb_evt(void *msg, struct prestera_event *evt)
398
426
{
399
427
struct prestera_msg_event_fdb * hw_evt = msg ;
400
428
401
- evt -> fdb_evt .port_id = hw_evt -> port_id ;
429
+ switch (hw_evt -> dest_type ) {
430
+ case PRESTERA_HW_FDB_ENTRY_TYPE_REG_PORT :
431
+ evt -> fdb_evt .type = PRESTERA_FDB_ENTRY_TYPE_REG_PORT ;
432
+ evt -> fdb_evt .dest .port_id = hw_evt -> dest .port_id ;
433
+ break ;
434
+ case PRESTERA_HW_FDB_ENTRY_TYPE_LAG :
435
+ evt -> fdb_evt .type = PRESTERA_FDB_ENTRY_TYPE_LAG ;
436
+ evt -> fdb_evt .dest .lag_id = hw_evt -> dest .lag_id ;
437
+ break ;
438
+ default :
439
+ return - EINVAL ;
440
+ }
441
+
402
442
evt -> fdb_evt .vid = hw_evt -> vid ;
403
443
404
444
ether_addr_copy (evt -> fdb_evt .data .mac , hw_evt -> param .mac );
@@ -543,6 +583,8 @@ int prestera_hw_switch_init(struct prestera_switch *sw)
543
583
sw -> mtu_min = PRESTERA_MIN_MTU ;
544
584
sw -> mtu_max = resp .mtu_max ;
545
585
sw -> id = resp .switch_id ;
586
+ sw -> lag_member_max = resp .lag_member_max ;
587
+ sw -> lag_max = resp .lag_max ;
546
588
547
589
return 0 ;
548
590
}
@@ -1150,8 +1192,10 @@ int prestera_hw_fdb_add(struct prestera_port *port, const unsigned char *mac,
1150
1192
u16 vid , bool dynamic )
1151
1193
{
1152
1194
struct prestera_msg_fdb_req req = {
1153
- .port = port -> hw_id ,
1154
- .dev = port -> dev_id ,
1195
+ .dest = {
1196
+ .dev = port -> dev_id ,
1197
+ .port = port -> hw_id ,
1198
+ },
1155
1199
.vid = vid ,
1156
1200
.dynamic = dynamic ,
1157
1201
};
@@ -1166,8 +1210,10 @@ int prestera_hw_fdb_del(struct prestera_port *port, const unsigned char *mac,
1166
1210
u16 vid )
1167
1211
{
1168
1212
struct prestera_msg_fdb_req req = {
1169
- .port = port -> hw_id ,
1170
- .dev = port -> dev_id ,
1213
+ .dest = {
1214
+ .dev = port -> dev_id ,
1215
+ .port = port -> hw_id ,
1216
+ },
1171
1217
.vid = vid ,
1172
1218
};
1173
1219
@@ -1177,11 +1223,48 @@ int prestera_hw_fdb_del(struct prestera_port *port, const unsigned char *mac,
1177
1223
& req .cmd , sizeof (req ));
1178
1224
}
1179
1225
1226
+ int prestera_hw_lag_fdb_add (struct prestera_switch * sw , u16 lag_id ,
1227
+ const unsigned char * mac , u16 vid , bool dynamic )
1228
+ {
1229
+ struct prestera_msg_fdb_req req = {
1230
+ .dest_type = PRESTERA_HW_FDB_ENTRY_TYPE_LAG ,
1231
+ .dest = {
1232
+ .lag_id = lag_id ,
1233
+ },
1234
+ .vid = vid ,
1235
+ .dynamic = dynamic ,
1236
+ };
1237
+
1238
+ ether_addr_copy (req .mac , mac );
1239
+
1240
+ return prestera_cmd (sw , PRESTERA_CMD_TYPE_FDB_ADD ,
1241
+ & req .cmd , sizeof (req ));
1242
+ }
1243
+
1244
+ int prestera_hw_lag_fdb_del (struct prestera_switch * sw , u16 lag_id ,
1245
+ const unsigned char * mac , u16 vid )
1246
+ {
1247
+ struct prestera_msg_fdb_req req = {
1248
+ .dest_type = PRESTERA_HW_FDB_ENTRY_TYPE_LAG ,
1249
+ .dest = {
1250
+ .lag_id = lag_id ,
1251
+ },
1252
+ .vid = vid ,
1253
+ };
1254
+
1255
+ ether_addr_copy (req .mac , mac );
1256
+
1257
+ return prestera_cmd (sw , PRESTERA_CMD_TYPE_FDB_DELETE ,
1258
+ & req .cmd , sizeof (req ));
1259
+ }
1260
+
1180
1261
int prestera_hw_fdb_flush_port (struct prestera_port * port , u32 mode )
1181
1262
{
1182
1263
struct prestera_msg_fdb_req req = {
1183
- .port = port -> hw_id ,
1184
- .dev = port -> dev_id ,
1264
+ .dest = {
1265
+ .dev = port -> dev_id ,
1266
+ .port = port -> hw_id ,
1267
+ },
1185
1268
.flush_mode = mode ,
1186
1269
};
1187
1270
@@ -1204,8 +1287,10 @@ int prestera_hw_fdb_flush_port_vlan(struct prestera_port *port, u16 vid,
1204
1287
u32 mode )
1205
1288
{
1206
1289
struct prestera_msg_fdb_req req = {
1207
- .port = port -> hw_id ,
1208
- .dev = port -> dev_id ,
1290
+ .dest = {
1291
+ .dev = port -> dev_id ,
1292
+ .port = port -> hw_id ,
1293
+ },
1209
1294
.vid = vid ,
1210
1295
.flush_mode = mode ,
1211
1296
};
@@ -1214,6 +1299,37 @@ int prestera_hw_fdb_flush_port_vlan(struct prestera_port *port, u16 vid,
1214
1299
& req .cmd , sizeof (req ));
1215
1300
}
1216
1301
1302
+ int prestera_hw_fdb_flush_lag (struct prestera_switch * sw , u16 lag_id ,
1303
+ u32 mode )
1304
+ {
1305
+ struct prestera_msg_fdb_req req = {
1306
+ .dest_type = PRESTERA_HW_FDB_ENTRY_TYPE_LAG ,
1307
+ .dest = {
1308
+ .lag_id = lag_id ,
1309
+ },
1310
+ .flush_mode = mode ,
1311
+ };
1312
+
1313
+ return prestera_cmd (sw , PRESTERA_CMD_TYPE_FDB_FLUSH_PORT ,
1314
+ & req .cmd , sizeof (req ));
1315
+ }
1316
+
1317
+ int prestera_hw_fdb_flush_lag_vlan (struct prestera_switch * sw ,
1318
+ u16 lag_id , u16 vid , u32 mode )
1319
+ {
1320
+ struct prestera_msg_fdb_req req = {
1321
+ .dest_type = PRESTERA_HW_FDB_ENTRY_TYPE_LAG ,
1322
+ .dest = {
1323
+ .lag_id = lag_id ,
1324
+ },
1325
+ .vid = vid ,
1326
+ .flush_mode = mode ,
1327
+ };
1328
+
1329
+ return prestera_cmd (sw , PRESTERA_CMD_TYPE_FDB_FLUSH_PORT_VLAN ,
1330
+ & req .cmd , sizeof (req ));
1331
+ }
1332
+
1217
1333
int prestera_hw_bridge_create (struct prestera_switch * sw , u16 * bridge_id )
1218
1334
{
1219
1335
struct prestera_msg_bridge_resp resp ;
@@ -1295,6 +1411,46 @@ int prestera_hw_rxtx_port_init(struct prestera_port *port)
1295
1411
& req .cmd , sizeof (req ));
1296
1412
}
1297
1413
1414
+ int prestera_hw_lag_member_add (struct prestera_port * port , u16 lag_id )
1415
+ {
1416
+ struct prestera_msg_lag_req req = {
1417
+ .port = port -> hw_id ,
1418
+ .dev = port -> dev_id ,
1419
+ .lag_id = lag_id ,
1420
+ };
1421
+
1422
+ return prestera_cmd (port -> sw , PRESTERA_CMD_TYPE_LAG_MEMBER_ADD ,
1423
+ & req .cmd , sizeof (req ));
1424
+ }
1425
+
1426
+ int prestera_hw_lag_member_del (struct prestera_port * port , u16 lag_id )
1427
+ {
1428
+ struct prestera_msg_lag_req req = {
1429
+ .port = port -> hw_id ,
1430
+ .dev = port -> dev_id ,
1431
+ .lag_id = lag_id ,
1432
+ };
1433
+
1434
+ return prestera_cmd (port -> sw , PRESTERA_CMD_TYPE_LAG_MEMBER_DELETE ,
1435
+ & req .cmd , sizeof (req ));
1436
+ }
1437
+
1438
+ int prestera_hw_lag_member_enable (struct prestera_port * port , u16 lag_id ,
1439
+ bool enable )
1440
+ {
1441
+ struct prestera_msg_lag_req req = {
1442
+ .port = port -> hw_id ,
1443
+ .dev = port -> dev_id ,
1444
+ .lag_id = lag_id ,
1445
+ };
1446
+ u32 cmd ;
1447
+
1448
+ cmd = enable ? PRESTERA_CMD_TYPE_LAG_MEMBER_ENABLE :
1449
+ PRESTERA_CMD_TYPE_LAG_MEMBER_DISABLE ;
1450
+
1451
+ return prestera_cmd (port -> sw , cmd , & req .cmd , sizeof (req ));
1452
+ }
1453
+
1298
1454
int prestera_hw_event_handler_register (struct prestera_switch * sw ,
1299
1455
enum prestera_event_type type ,
1300
1456
prestera_event_cb_t fn ,
0 commit comments