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 --- |