slave.c (6fb8661c8f97bb062d2ecc7a57591d38e6c4f8c8) slave.c (e2d0576f0c009acdba63e1d763276743ff3788cc)
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * net/dsa/slave.c - Slave device handling
4 * Copyright (c) 2008-2009 Marvell Semiconductor
5 */
6
7#include <linux/list.h>
8#include <linux/etherdevice.h>

--- 291 unchanged lines hidden (view full) ---

300 struct dsa_port *dp = dsa_slave_to_port(dev);
301 struct dsa_switch *ds = dp->ds;
302 struct sockaddr *addr = a;
303 int err;
304
305 if (!is_valid_ether_addr(addr->sa_data))
306 return -EADDRNOTAVAIL;
307
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * net/dsa/slave.c - Slave device handling
4 * Copyright (c) 2008-2009 Marvell Semiconductor
5 */
6
7#include <linux/list.h>
8#include <linux/etherdevice.h>

--- 291 unchanged lines hidden (view full) ---

300 struct dsa_port *dp = dsa_slave_to_port(dev);
301 struct dsa_switch *ds = dp->ds;
302 struct sockaddr *addr = a;
303 int err;
304
305 if (!is_valid_ether_addr(addr->sa_data))
306 return -EADDRNOTAVAIL;
307
308 /* If the port is down, the address isn't synced yet to hardware or
309 * to the DSA master, so there is nothing to change.
310 */
311 if (!(dev->flags & IFF_UP))
312 goto out_change_dev_addr;
313
308 if (dsa_switch_supports_uc_filtering(ds)) {
309 err = dsa_port_standalone_host_fdb_add(dp, addr->sa_data, 0);
310 if (err)
311 return err;
312 }
313
314 if (!ether_addr_equal(addr->sa_data, master->dev_addr)) {
315 err = dev_uc_add(master, addr->sa_data);
316 if (err < 0)
317 goto del_unicast;
318 }
319
320 if (!ether_addr_equal(dev->dev_addr, master->dev_addr))
321 dev_uc_del(master, dev->dev_addr);
322
323 if (dsa_switch_supports_uc_filtering(ds))
324 dsa_port_standalone_host_fdb_del(dp, dev->dev_addr, 0);
325
314 if (dsa_switch_supports_uc_filtering(ds)) {
315 err = dsa_port_standalone_host_fdb_add(dp, addr->sa_data, 0);
316 if (err)
317 return err;
318 }
319
320 if (!ether_addr_equal(addr->sa_data, master->dev_addr)) {
321 err = dev_uc_add(master, addr->sa_data);
322 if (err < 0)
323 goto del_unicast;
324 }
325
326 if (!ether_addr_equal(dev->dev_addr, master->dev_addr))
327 dev_uc_del(master, dev->dev_addr);
328
329 if (dsa_switch_supports_uc_filtering(ds))
330 dsa_port_standalone_host_fdb_del(dp, dev->dev_addr, 0);
331
332out_change_dev_addr:
326 eth_hw_addr_set(dev, addr->sa_data);
327
328 return 0;
329
330del_unicast:
331 if (dsa_switch_supports_uc_filtering(ds))
332 dsa_port_standalone_host_fdb_del(dp, addr->sa_data, 0);
333

--- 2452 unchanged lines hidden ---
333 eth_hw_addr_set(dev, addr->sa_data);
334
335 return 0;
336
337del_unicast:
338 if (dsa_switch_supports_uc_filtering(ds))
339 dsa_port_standalone_host_fdb_del(dp, addr->sa_data, 0);
340

--- 2452 unchanged lines hidden ---