@@ -1208,6 +1208,50 @@ mv88e6xxx_port_vlan_prepare(struct dsa_switch *ds, int port,
1208
1208
return 0 ;
1209
1209
}
1210
1210
1211
+ static int mv88e6xxx_port_db_load_purge (struct mv88e6xxx_chip * chip , int port ,
1212
+ const unsigned char * addr , u16 vid ,
1213
+ u8 state )
1214
+ {
1215
+ struct mv88e6xxx_vtu_entry vlan ;
1216
+ struct mv88e6xxx_atu_entry entry ;
1217
+ int err ;
1218
+
1219
+ /* Null VLAN ID corresponds to the port private database */
1220
+ if (vid == 0 )
1221
+ err = mv88e6xxx_port_get_fid (chip , port , & vlan .fid );
1222
+ else
1223
+ err = mv88e6xxx_vtu_get (chip , vid , & vlan , false);
1224
+ if (err )
1225
+ return err ;
1226
+
1227
+ entry .state = MV88E6XXX_G1_ATU_DATA_STATE_UNUSED ;
1228
+ ether_addr_copy (entry .mac , addr );
1229
+ eth_addr_dec (entry .mac );
1230
+
1231
+ err = mv88e6xxx_g1_atu_getnext (chip , vlan .fid , & entry );
1232
+ if (err )
1233
+ return err ;
1234
+
1235
+ /* Initialize a fresh ATU entry if it isn't found */
1236
+ if (entry .state == MV88E6XXX_G1_ATU_DATA_STATE_UNUSED ||
1237
+ !ether_addr_equal (entry .mac , addr )) {
1238
+ memset (& entry , 0 , sizeof (entry ));
1239
+ ether_addr_copy (entry .mac , addr );
1240
+ }
1241
+
1242
+ /* Purge the ATU entry only if no port is using it anymore */
1243
+ if (state == MV88E6XXX_G1_ATU_DATA_STATE_UNUSED ) {
1244
+ entry .portvec &= ~BIT (port );
1245
+ if (!entry .portvec )
1246
+ entry .state = MV88E6XXX_G1_ATU_DATA_STATE_UNUSED ;
1247
+ } else {
1248
+ entry .portvec |= BIT (port );
1249
+ entry .state = state ;
1250
+ }
1251
+
1252
+ return mv88e6xxx_g1_atu_loadpurge (chip , vlan .fid , & entry );
1253
+ }
1254
+
1211
1255
static int _mv88e6xxx_port_vlan_add (struct mv88e6xxx_chip * chip , int port ,
1212
1256
u16 vid , u8 member )
1213
1257
{
@@ -1324,50 +1368,6 @@ static int mv88e6xxx_port_vlan_del(struct dsa_switch *ds, int port,
1324
1368
return err ;
1325
1369
}
1326
1370
1327
- static int mv88e6xxx_port_db_load_purge (struct mv88e6xxx_chip * chip , int port ,
1328
- const unsigned char * addr , u16 vid ,
1329
- u8 state )
1330
- {
1331
- struct mv88e6xxx_vtu_entry vlan ;
1332
- struct mv88e6xxx_atu_entry entry ;
1333
- int err ;
1334
-
1335
- /* Null VLAN ID corresponds to the port private database */
1336
- if (vid == 0 )
1337
- err = mv88e6xxx_port_get_fid (chip , port , & vlan .fid );
1338
- else
1339
- err = mv88e6xxx_vtu_get (chip , vid , & vlan , false);
1340
- if (err )
1341
- return err ;
1342
-
1343
- entry .state = MV88E6XXX_G1_ATU_DATA_STATE_UNUSED ;
1344
- ether_addr_copy (entry .mac , addr );
1345
- eth_addr_dec (entry .mac );
1346
-
1347
- err = mv88e6xxx_g1_atu_getnext (chip , vlan .fid , & entry );
1348
- if (err )
1349
- return err ;
1350
-
1351
- /* Initialize a fresh ATU entry if it isn't found */
1352
- if (entry .state == MV88E6XXX_G1_ATU_DATA_STATE_UNUSED ||
1353
- !ether_addr_equal (entry .mac , addr )) {
1354
- memset (& entry , 0 , sizeof (entry ));
1355
- ether_addr_copy (entry .mac , addr );
1356
- }
1357
-
1358
- /* Purge the ATU entry only if no port is using it anymore */
1359
- if (state == MV88E6XXX_G1_ATU_DATA_STATE_UNUSED ) {
1360
- entry .portvec &= ~BIT (port );
1361
- if (!entry .portvec )
1362
- entry .state = MV88E6XXX_G1_ATU_DATA_STATE_UNUSED ;
1363
- } else {
1364
- entry .portvec |= BIT (port );
1365
- entry .state = state ;
1366
- }
1367
-
1368
- return mv88e6xxx_g1_atu_loadpurge (chip , vlan .fid , & entry );
1369
- }
1370
-
1371
1371
static int mv88e6xxx_port_fdb_add (struct dsa_switch * ds , int port ,
1372
1372
const unsigned char * addr , u16 vid )
1373
1373
{
0 commit comments