@@ -2093,9 +2093,9 @@ static int _mv88e6xxx_atu_load(struct mv88e6xxx_chip *chip,
2093
2093
return _mv88e6xxx_atu_cmd (chip , entry -> fid , GLOBAL_ATU_OP_LOAD_DB );
2094
2094
}
2095
2095
2096
- static int _mv88e6xxx_port_fdb_load (struct mv88e6xxx_chip * chip , int port ,
2097
- const unsigned char * addr , u16 vid ,
2098
- u8 state )
2096
+ static int mv88e6xxx_port_db_load_purge (struct mv88e6xxx_chip * chip , int port ,
2097
+ const unsigned char * addr , u16 vid ,
2098
+ u8 state )
2099
2099
{
2100
2100
struct mv88e6xxx_atu_entry entry = { 0 };
2101
2101
struct mv88e6xxx_vtu_stu_entry vlan ;
@@ -2134,30 +2134,27 @@ static void mv88e6xxx_port_fdb_add(struct dsa_switch *ds, int port,
2134
2134
const struct switchdev_obj_port_fdb * fdb ,
2135
2135
struct switchdev_trans * trans )
2136
2136
{
2137
- int state = is_multicast_ether_addr (fdb -> addr ) ?
2138
- GLOBAL_ATU_DATA_STATE_MC_STATIC :
2139
- GLOBAL_ATU_DATA_STATE_UC_STATIC ;
2140
2137
struct mv88e6xxx_chip * chip = ds_to_priv (ds );
2141
2138
2142
2139
mutex_lock (& chip -> reg_lock );
2143
- if (_mv88e6xxx_port_fdb_load (chip , port , fdb -> addr , fdb -> vid , state ))
2144
- netdev_err ( ds -> ports [ port ]. netdev ,
2145
- "failed to load MAC address\n" );
2140
+ if (mv88e6xxx_port_db_load_purge (chip , port , fdb -> addr , fdb -> vid ,
2141
+ GLOBAL_ATU_DATA_STATE_UC_STATIC ))
2142
+ netdev_err ( ds -> ports [ port ]. netdev , "failed to load unicast MAC address\n" );
2146
2143
mutex_unlock (& chip -> reg_lock );
2147
2144
}
2148
2145
2149
2146
static int mv88e6xxx_port_fdb_del (struct dsa_switch * ds , int port ,
2150
2147
const struct switchdev_obj_port_fdb * fdb )
2151
2148
{
2152
2149
struct mv88e6xxx_chip * chip = ds_to_priv (ds );
2153
- int ret ;
2150
+ int err ;
2154
2151
2155
2152
mutex_lock (& chip -> reg_lock );
2156
- ret = _mv88e6xxx_port_fdb_load (chip , port , fdb -> addr , fdb -> vid ,
2157
- GLOBAL_ATU_DATA_STATE_UNUSED );
2153
+ err = mv88e6xxx_port_db_load_purge (chip , port , fdb -> addr , fdb -> vid ,
2154
+ GLOBAL_ATU_DATA_STATE_UNUSED );
2158
2155
mutex_unlock (& chip -> reg_lock );
2159
2156
2160
- return ret ;
2157
+ return err ;
2161
2158
}
2162
2159
2163
2160
static int _mv88e6xxx_atu_getnext (struct mv88e6xxx_chip * chip , u16 fid ,
@@ -2205,10 +2202,10 @@ static int _mv88e6xxx_atu_getnext(struct mv88e6xxx_chip *chip, u16 fid,
2205
2202
return 0 ;
2206
2203
}
2207
2204
2208
- static int _mv88e6xxx_port_fdb_dump_one (struct mv88e6xxx_chip * chip ,
2209
- u16 fid , u16 vid , int port ,
2210
- struct switchdev_obj_port_fdb * fdb ,
2211
- int (* cb )(struct switchdev_obj * obj ))
2205
+ static int mv88e6xxx_port_db_dump_fid (struct mv88e6xxx_chip * chip ,
2206
+ u16 fid , u16 vid , int port ,
2207
+ struct switchdev_obj * obj ,
2208
+ int (* cb )(struct switchdev_obj * obj ))
2212
2209
{
2213
2210
struct mv88e6xxx_atu_entry addr = {
2214
2211
.mac = { 0xff , 0xff , 0xff , 0xff , 0xff , 0xff },
@@ -2222,72 +2219,89 @@ static int _mv88e6xxx_port_fdb_dump_one(struct mv88e6xxx_chip *chip,
2222
2219
do {
2223
2220
err = _mv88e6xxx_atu_getnext (chip , fid , & addr );
2224
2221
if (err )
2225
- break ;
2222
+ return err ;
2226
2223
2227
2224
if (addr .state == GLOBAL_ATU_DATA_STATE_UNUSED )
2228
2225
break ;
2229
2226
2230
- if (! addr .trunk && addr .portv_trunkid & BIT (port )) {
2231
- bool is_static = addr . state ==
2232
- ( is_multicast_ether_addr ( addr . mac ) ?
2233
- GLOBAL_ATU_DATA_STATE_MC_STATIC :
2234
- GLOBAL_ATU_DATA_STATE_UC_STATIC ) ;
2227
+ if (addr .trunk || ( addr .portv_trunkid & BIT (port )) == 0 )
2228
+ continue ;
2229
+
2230
+ if ( obj -> id == SWITCHDEV_OBJ_ID_PORT_FDB ) {
2231
+ struct switchdev_obj_port_fdb * fdb ;
2235
2232
2233
+ if (!is_unicast_ether_addr (addr .mac ))
2234
+ continue ;
2235
+
2236
+ fdb = SWITCHDEV_OBJ_PORT_FDB (obj );
2236
2237
fdb -> vid = vid ;
2237
2238
ether_addr_copy (fdb -> addr , addr .mac );
2238
- fdb -> ndm_state = is_static ? NUD_NOARP : NUD_REACHABLE ;
2239
-
2240
- err = cb (& fdb -> obj );
2241
- if (err )
2242
- break ;
2239
+ if (addr .state == GLOBAL_ATU_DATA_STATE_UC_STATIC )
2240
+ fdb -> ndm_state = NUD_NOARP ;
2241
+ else
2242
+ fdb -> ndm_state = NUD_REACHABLE ;
2243
+ } else {
2244
+ return - EOPNOTSUPP ;
2243
2245
}
2246
+
2247
+ err = cb (obj );
2248
+ if (err )
2249
+ return err ;
2244
2250
} while (!is_broadcast_ether_addr (addr .mac ));
2245
2251
2246
2252
return err ;
2247
2253
}
2248
2254
2249
- static int mv88e6xxx_port_fdb_dump (struct dsa_switch * ds , int port ,
2250
- struct switchdev_obj_port_fdb * fdb ,
2251
- int (* cb )(struct switchdev_obj * obj ))
2255
+ static int mv88e6xxx_port_db_dump (struct mv88e6xxx_chip * chip , int port ,
2256
+ struct switchdev_obj * obj ,
2257
+ int (* cb )(struct switchdev_obj * obj ))
2252
2258
{
2253
- struct mv88e6xxx_chip * chip = ds_to_priv (ds );
2254
2259
struct mv88e6xxx_vtu_stu_entry vlan = {
2255
2260
.vid = GLOBAL_VTU_VID_MASK , /* all ones */
2256
2261
};
2257
2262
u16 fid ;
2258
2263
int err ;
2259
2264
2260
- mutex_lock (& chip -> reg_lock );
2261
-
2262
2265
/* Dump port's default Filtering Information Database (VLAN ID 0) */
2263
2266
err = _mv88e6xxx_port_fid_get (chip , port , & fid );
2264
2267
if (err )
2265
- goto unlock ;
2268
+ return err ;
2266
2269
2267
- err = _mv88e6xxx_port_fdb_dump_one (chip , fid , 0 , port , fdb , cb );
2270
+ err = mv88e6xxx_port_db_dump_fid (chip , fid , 0 , port , obj , cb );
2268
2271
if (err )
2269
- goto unlock ;
2272
+ return err ;
2270
2273
2271
2274
/* Dump VLANs' Filtering Information Databases */
2272
2275
err = _mv88e6xxx_vtu_vid_write (chip , vlan .vid );
2273
2276
if (err )
2274
- goto unlock ;
2277
+ return err ;
2275
2278
2276
2279
do {
2277
2280
err = _mv88e6xxx_vtu_getnext (chip , & vlan );
2278
2281
if (err )
2279
- break ;
2282
+ return err ;
2280
2283
2281
2284
if (!vlan .valid )
2282
2285
break ;
2283
2286
2284
- err = _mv88e6xxx_port_fdb_dump_one (chip , vlan .fid , vlan .vid ,
2285
- port , fdb , cb );
2287
+ err = mv88e6xxx_port_db_dump_fid (chip , vlan .fid , vlan .vid , port ,
2288
+ obj , cb );
2286
2289
if (err )
2287
- break ;
2290
+ return err ;
2288
2291
} while (vlan .vid < GLOBAL_VTU_VID_MASK );
2289
2292
2290
- unlock :
2293
+ return err ;
2294
+ }
2295
+
2296
+ static int mv88e6xxx_port_fdb_dump (struct dsa_switch * ds , int port ,
2297
+ struct switchdev_obj_port_fdb * fdb ,
2298
+ int (* cb )(struct switchdev_obj * obj ))
2299
+ {
2300
+ struct mv88e6xxx_chip * chip = ds_to_priv (ds );
2301
+ int err ;
2302
+
2303
+ mutex_lock (& chip -> reg_lock );
2304
+ err = mv88e6xxx_port_db_dump (chip , port , & fdb -> obj , cb );
2291
2305
mutex_unlock (& chip -> reg_lock );
2292
2306
2293
2307
return err ;
0 commit comments