[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