Re: git: 142cba958b7a - main - bge: read MAC from loader hint for boards without NVRAM/EEPROM

From: Ronald Klop <ronald-lists_at_klop.ws>
Date: Thu, 02 Jul 2026 08:33:01 UTC



Op zondag 14 juni 2026 22:57:26 (+02:00) schreef Adrian Chadd:

 > The branch main has been updated by adrian:
 > 
 > URL: 
https://cgit.FreeBSD.org/src/commit/?id=142cba958b7a6dd11e4257740db03d335475ede8
 
> 
 > commit 142cba958b7a6dd11e4257740db03d335475ede8
 > Author:     Abdelkader Boudih <freebsd@seuros.com>
 > AuthorDate: 2026-06-14 20:55:33 +0000
 > Commit:     Adrian Chadd <adrian@FreeBSD.org>
 > CommitDate: 2026-06-14 20:56:59 +0000
 > 
 >     bge: read MAC from loader hint for boards without NVRAM/EEPROM
 >     
 >     BCM57766 on Apple T2 Macs (Macmini8,1) has no dedicated EEPROM and 
the
 >     chip firmware handshake fails (the T2 intercepts PCI config space),
 >     leaving the SRAM mailbox unpopulated.  All four existing MAC 
retrieval
 >     paths (SRAM mailbox, NVRAM, EEPROM, firmware stub) fail, causing bge 
to
 >     abort attach with "failed to read station address".
 >     
 >     Work around this with two changes:
 >     
 >       1. Tolerate EEPROM read failure on BCM57766.  The chip is 
copper-only
 >          so hwcfg=0 is correct; skip the fatal error that aborts attach
 >          before bge_get_eaddr() is ever called.
 >     
 >       2. Implement bge_get_eaddr_fw() to read a "hint.bge.N.mac" string
 >          (e.g. "f0:18:98:f4:1e:2f") from loader(8) tunable / kenv.
 >     
 >     This is a workaround until the T2 BCE API is understood well enough 
to
 >     either poke the chip firmware into completing its handshake or read 
the
 >     MAC from the T2 directly.
 >     
 >     Reviewed by:    adrian
 >     Differential Revision:  https://reviews.freebsd.org/D57090
 > ---
 >  sys/dev/bge/if_bge.c | 42 ++++++++++++++++++++++++++++++++++++------
 >  1 file changed, 36 insertions(+), 6 deletions(-)
 > 
 > diff --git a/sys/dev/bge/if_bge.c b/sys/dev/bge/if_bge.c
 > index 3551f10b2ae3..1fbf8bfb7e93 100644
 > --- a/sys/dev/bge/if_bge.c
 > +++ b/sys/dev/bge/if_bge.c
 > @@ -3766,11 +3766,19 @@ bge_attach(device_t dev)
 >  	    (sc->bge_asicrev != BGE_ASICREV_BCM5906)) {
 >  		if (bge_read_eeprom(sc, (caddr_t)&hwcfg, BGE_EE_HWCFG_OFFSET,
 >  		    sizeof(hwcfg))) {
 > -			device_printf(sc->bge_dev, "failed to read EEPROM\n");
 > -			error = ENXIO;
 > -			goto fail;
 > -		}
 > -		hwcfg = ntohl(hwcfg);
 > +			/*
 > +			 * BCM57766 on Apple T2 Macs has no dedicated EEPROM;
 > +			 * the chip is copper-only so hwcfg=0 is correct.
 > +			 */
 > +			if (sc->bge_asicrev != BGE_ASICREV_BCM57766) {
 > +				device_printf(sc->bge_dev,
 > +				    "failed to read EEPROM\n");
 > +				error = ENXIO;
 > +				goto fail;
 > +			}
 > +			hwcfg = 0;
 > +		} else
 > +			hwcfg = ntohl(hwcfg);
 >  	}
 >  
 >  	/* The SysKonnect SK-9D41 is a 1000baseSX card. */
 > @@ -6677,7 +6685,29 @@ bge_sysctl_mem_read(SYSCTL_HANDLER_ARGS)
 >  static int
 >  bge_get_eaddr_fw(struct bge_softc *sc, uint8_t ether_addr[])
 >  {
 > -	return (1);
 > +	const char *mac_str;
 > +	unsigned int o[ETHER_ADDR_LEN];
 > +	char trail;
 > +	int i, n, unit;
 > +
 > +	unit = device_get_unit(sc->bge_dev);
 > +	if (resource_string_value("bge", unit, "mac", &mac_str) != 0)
 > +		return (1);
 > +
 > +	/* Parse and validate; trailing-char check rejects garbage. */
 > +	n = sscanf(mac_str, "%x:%x:%x:%x:%x:%x%c",
 > +	    &o[0], &o[1], &o[2], &o[3], &o[4], &o[5], &trail);
 > +	if (n != 6)
 > +		return (1);
 > +	for (i = 0; i < ETHER_ADDR_LEN; i++) {
 > +		if (o[i] > 0xff)
 > +			return (1);
 > +		ether_addr[i] = (uint8_t)o[i];
 > +	}
 > +	if (ETHER_IS_MULTICAST(ether_addr) ||
 > +	    ETHER_IS_ZERO(ether_addr))
 > +		return (1);
 > +	return (0);
 >  }
 >  
 >  static int
 > 
 > 


If no hint is set you can also fall back to ether_gen_addr(9). Or the 
undocumented ether_gen_addr_byname().

sys/net/if_ethersubr.c:ether_gen_addr_byname(const char *nameunit, struct 
ether_addr *hwaddr)
sys/net/if_ethersubr.c:ether_gen_addr(struct ifnet *ifp, struct ether_addr 
*hwaddr)

Regards,
Ronald.