On May 12, Benjamin Larsson wrote: > Hi. > > On 11/05/2026 12:49, Lorenzo Bianconi wrote: > > The EN7581 and AN7583 SoCs provide registers to configure hardware LAN/WAN > > MAC addresses, used to determine whether received traffic is destined for > > this host or should be forwarded to another device. > > The SoC hardware design assumes all interfaces configured as LAN (or WAN) > > share a common upper MAC address, which is programmed into the > > REG_FE_{LAN,WAN}_MAC_H register. The lower bytes of 'local' addresses can > > be expressed as a range via the REG_FE_MAC_LMIN and REG_FE_MAC_LMAX > > registers. > > Previously, only a single interface was considered when programming these > > registers. Extend the logic to derive the correct minimum and maximum > > values for REG_FE_MAC_LMIN/REG_FE_MAC_LMAX when two or more interfaces are > > configured as LAN or WAN. > > > > Tested-by: Madhur Agrawal > > Signed-off-by: Lorenzo Bianconi > > --- > > drivers/net/ethernet/airoha/airoha_eth.c | 75 +++++++++++++++++++++++++++----- > > drivers/net/ethernet/airoha/airoha_eth.h | 2 +- > > drivers/net/ethernet/airoha/airoha_ppe.c | 4 +- > > 3 files changed, 66 insertions(+), 15 deletions(-) > > > > diff --git a/drivers/net/ethernet/airoha/airoha_eth.c b/drivers/net/ethernet/airoha/airoha_eth.c > > index 16c0ff9999da..533ffe20f833 100644 > > --- a/drivers/net/ethernet/airoha/airoha_eth.c > > +++ b/drivers/net/ethernet/airoha/airoha_eth.c > > @@ -71,20 +71,67 @@ static void airoha_qdma_irq_disable(struct airoha_irq_bank *irq_bank, > > airoha_qdma_set_irqmask(irq_bank, index, mask, 0); > > } > > -static void airoha_set_macaddr(struct airoha_gdm_dev *dev, const u8 *addr) > > +static int airoha_set_macaddr(struct airoha_gdm_dev *dev, const u8 *addr) > > { > > struct airoha_eth *eth = dev->eth; > > - u32 val, reg; > > + u8 ref_addr[ETH_ALEN] = {}; > > + u32 reg, val, lmin, lmax; > > + int i; > > + > > + lmin = (addr[3] << 16) | (addr[4] << 8) | addr[5]; > > + lmax = lmin; > > + > > + for (i = 0; i < ARRAY_SIZE(eth->ports); i++) { > > + struct airoha_gdm_port *port = eth->ports[i]; > > + int j; > > + > > + if (!port) > > + continue; > > + > > + for (j = 0; j < ARRAY_SIZE(port->devs); j++) { > > + struct airoha_gdm_dev *iter_dev; > > + struct net_device *netdev; > > + > > + iter_dev = port->devs[j]; > > + if (!iter_dev || iter_dev == dev) > > + continue; > > + > > + if (airoha_is_lan_gdm_dev(iter_dev) != > > + airoha_is_lan_gdm_dev(dev)) > > + continue; > > + > > + netdev = iter_dev->dev; > > + if (netdev->reg_state != NETREG_REGISTERED) > > + continue; > > + > > + ether_addr_copy(ref_addr, netdev->dev_addr); > > + val = (netdev->dev_addr[3] << 16) | > > + (netdev->dev_addr[4] << 8) | netdev->dev_addr[5]; > > + if (val < lmin) > > + lmin = val; > > + if (val > lmax) > > + lmax = val; > > + } > > + } > > + > > + if (!is_zero_ether_addr(ref_addr) && memcmp(ref_addr, addr, 3)) { > > + /* According to the HW design, hw mac address MS bits > > + * must be the same for each net_device with the same > > + * LAN/WAN configuration. > > + */ > > + return -EINVAL; > > + } > > Maybe this information should be relayed to the user somehow? netdev_err()? Regards, Lorenzo > > MvH > > Benjamin Larsson >