Skip to content

Commit

Permalink
net: dsa: notify drivers of MAC address changes on user ports
Browse files Browse the repository at this point in the history
In some cases, drivers may need to veto the changing of a MAC address on
a user port. Such is the case with KSZ9477 when it offloads a HSR device,
because it programs the MAC address of multiple ports to a shared
hardware register. Those ports need to have equal MAC addresses for the
lifetime of the HSR offload.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: Lukasz Majewski <lukma@denx.de>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
  • Loading branch information
Vladimir Oltean authored and Paolo Abeni committed Oct 3, 2023
1 parent fefe5dc commit 6715042
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 0 deletions.
10 changes: 10 additions & 0 deletions include/net/dsa.h
Original file line number Diff line number Diff line change
Expand Up @@ -969,6 +969,16 @@ struct dsa_switch_ops {
struct phy_device *phy);
void (*port_disable)(struct dsa_switch *ds, int port);


/*
* Notification for MAC address changes on user ports. Drivers can
* currently only veto operations. They should not use the method to
* program the hardware, since the operation is not rolled back in case
* of other errors.
*/
int (*port_set_mac_address)(struct dsa_switch *ds, int port,
const unsigned char *addr);

/*
* Compatibility between device trees defining multiple CPU ports and
* drivers which are not OK to use by default the numerically smallest
Expand Down
7 changes: 7 additions & 0 deletions net/dsa/slave.c
Original file line number Diff line number Diff line change
Expand Up @@ -457,6 +457,13 @@ static int dsa_slave_set_mac_address(struct net_device *dev, void *a)
if (!is_valid_ether_addr(addr->sa_data))
return -EADDRNOTAVAIL;

if (ds->ops->port_set_mac_address) {
err = ds->ops->port_set_mac_address(ds, dp->index,
addr->sa_data);
if (err)
return err;
}

/* If the port is down, the address isn't synced yet to hardware or
* to the DSA master, so there is nothing to change.
*/
Expand Down

0 comments on commit 6715042

Please sign in to comment.