@@ -175,6 +175,7 @@ static int dsa_slave_open(struct net_device *dev)
175
175
{
176
176
struct net_device * master = dsa_slave_to_master (dev );
177
177
struct dsa_port * dp = dsa_slave_to_port (dev );
178
+ struct dsa_switch * ds = dp -> ds ;
178
179
int err ;
179
180
180
181
err = dev_open (master , NULL );
@@ -183,10 +184,16 @@ static int dsa_slave_open(struct net_device *dev)
183
184
goto out ;
184
185
}
185
186
187
+ if (dsa_switch_supports_uc_filtering (ds )) {
188
+ err = dsa_port_standalone_host_fdb_add (dp , dev -> dev_addr , 0 );
189
+ if (err )
190
+ goto out ;
191
+ }
192
+
186
193
if (!ether_addr_equal (dev -> dev_addr , master -> dev_addr )) {
187
194
err = dev_uc_add (master , dev -> dev_addr );
188
195
if (err < 0 )
189
- goto out ;
196
+ goto del_host_addr ;
190
197
}
191
198
192
199
err = dsa_port_enable_rt (dp , dev -> phydev );
@@ -198,6 +205,9 @@ static int dsa_slave_open(struct net_device *dev)
198
205
del_unicast :
199
206
if (!ether_addr_equal (dev -> dev_addr , master -> dev_addr ))
200
207
dev_uc_del (master , dev -> dev_addr );
208
+ del_host_addr :
209
+ if (dsa_switch_supports_uc_filtering (ds ))
210
+ dsa_port_standalone_host_fdb_del (dp , dev -> dev_addr , 0 );
201
211
out :
202
212
return err ;
203
213
}
@@ -206,12 +216,16 @@ static int dsa_slave_close(struct net_device *dev)
206
216
{
207
217
struct net_device * master = dsa_slave_to_master (dev );
208
218
struct dsa_port * dp = dsa_slave_to_port (dev );
219
+ struct dsa_switch * ds = dp -> ds ;
209
220
210
221
dsa_port_disable_rt (dp );
211
222
212
223
if (!ether_addr_equal (dev -> dev_addr , master -> dev_addr ))
213
224
dev_uc_del (master , dev -> dev_addr );
214
225
226
+ if (dsa_switch_supports_uc_filtering (ds ))
227
+ dsa_port_standalone_host_fdb_del (dp , dev -> dev_addr , 0 );
228
+
215
229
return 0 ;
216
230
}
217
231
@@ -244,24 +258,41 @@ static void dsa_slave_set_rx_mode(struct net_device *dev)
244
258
static int dsa_slave_set_mac_address (struct net_device * dev , void * a )
245
259
{
246
260
struct net_device * master = dsa_slave_to_master (dev );
261
+ struct dsa_port * dp = dsa_slave_to_port (dev );
262
+ struct dsa_switch * ds = dp -> ds ;
247
263
struct sockaddr * addr = a ;
248
264
int err ;
249
265
250
266
if (!is_valid_ether_addr (addr -> sa_data ))
251
267
return - EADDRNOTAVAIL ;
252
268
269
+ if (dsa_switch_supports_uc_filtering (ds )) {
270
+ err = dsa_port_standalone_host_fdb_add (dp , addr -> sa_data , 0 );
271
+ if (err )
272
+ return err ;
273
+ }
274
+
253
275
if (!ether_addr_equal (addr -> sa_data , master -> dev_addr )) {
254
276
err = dev_uc_add (master , addr -> sa_data );
255
277
if (err < 0 )
256
- return err ;
278
+ goto del_unicast ;
257
279
}
258
280
259
281
if (!ether_addr_equal (dev -> dev_addr , master -> dev_addr ))
260
282
dev_uc_del (master , dev -> dev_addr );
261
283
284
+ if (dsa_switch_supports_uc_filtering (ds ))
285
+ dsa_port_standalone_host_fdb_del (dp , dev -> dev_addr , 0 );
286
+
262
287
eth_hw_addr_set (dev , addr -> sa_data );
263
288
264
289
return 0 ;
290
+
291
+ del_unicast :
292
+ if (dsa_switch_supports_uc_filtering (ds ))
293
+ dsa_port_standalone_host_fdb_del (dp , addr -> sa_data , 0 );
294
+
295
+ return err ;
265
296
}
266
297
267
298
struct dsa_slave_dump_ctx {
0 commit comments