[PATCH net-next v6 11/12] net: airoha: Support multiple LAN/WAN interfaces for hw MAC address configuration
Benjamin Larsson
benjamin.larsson at genexis.eu
Wed May 13 05:26:07 PDT 2026
On 12/05/2026 22:58, Lorenzo Bianconi wrote:
> 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 <madhur.agrawal at airoha.com>
>>> Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
>>> ---
>>> 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()?
Ok with me.
MvH
Benjamin Larsson
>
> Regards,
> Lorenzo
>
>> MvH
>>
>> Benjamin Larsson
>>
More information about the Linux-mediatek
mailing list