diff options
| author | Michael Chan <mchan@broadcom.com> | 2006-03-27 23:14:53 -0800 | 
|---|---|---|
| committer | David S. Miller <davem@sunset.davemloft.net> | 2006-03-28 17:02:35 -0800 | 
| commit | 008652b337364ee994a0cd71d88a0fe9f00fc7ca (patch) | |
| tree | 1a92b594cf22327ac92484e37129d86bac6f663c | |
| parent | ca9ba4471c1203bb6e759b76e83167fec54fe590 (diff) | |
[TG3]: Fix probe failure due to invalid MAC address
Some older bootcode in some devices may report 0 MAC address in
SRAM when booting up from low power state. This patch fixes the
problem by checking for a valid MAC address in SRAM and falling back
to NVRAM if necessary.
Thanks to walt <wa1ter@myrealbox.com> for reporting the problem
and helping to debug it.
Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | drivers/net/tg3.c | 50 | 
1 files changed, 28 insertions, 22 deletions
| diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index b5473325bff..c41dbb0e8f1 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c @@ -10531,6 +10531,7 @@ static int __devinit tg3_get_device_address(struct tg3 *tp)  {  	struct net_device *dev = tp->dev;  	u32 hi, lo, mac_offset; +	int addr_ok = 0;  #ifdef CONFIG_SPARC64  	if (!tg3_get_macaddr_sparc(tp)) @@ -10560,29 +10561,34 @@ static int __devinit tg3_get_device_address(struct tg3 *tp)  		dev->dev_addr[3] = (lo >> 16) & 0xff;  		dev->dev_addr[4] = (lo >>  8) & 0xff;  		dev->dev_addr[5] = (lo >>  0) & 0xff; -	} -	/* Next, try NVRAM. */ -	else if (!(tp->tg3_flags & TG3_FLG2_SUN_570X) && -		 !tg3_nvram_read(tp, mac_offset + 0, &hi) && -		 !tg3_nvram_read(tp, mac_offset + 4, &lo)) { -		dev->dev_addr[0] = ((hi >> 16) & 0xff); -		dev->dev_addr[1] = ((hi >> 24) & 0xff); -		dev->dev_addr[2] = ((lo >>  0) & 0xff); -		dev->dev_addr[3] = ((lo >>  8) & 0xff); -		dev->dev_addr[4] = ((lo >> 16) & 0xff); -		dev->dev_addr[5] = ((lo >> 24) & 0xff); -	} -	/* Finally just fetch it out of the MAC control regs. */ -	else { -		hi = tr32(MAC_ADDR_0_HIGH); -		lo = tr32(MAC_ADDR_0_LOW); -		dev->dev_addr[5] = lo & 0xff; -		dev->dev_addr[4] = (lo >> 8) & 0xff; -		dev->dev_addr[3] = (lo >> 16) & 0xff; -		dev->dev_addr[2] = (lo >> 24) & 0xff; -		dev->dev_addr[1] = hi & 0xff; -		dev->dev_addr[0] = (hi >> 8) & 0xff; +		/* Some old bootcode may report a 0 MAC address in SRAM */ +		addr_ok = is_valid_ether_addr(&dev->dev_addr[0]); +	} +	if (!addr_ok) { +		/* Next, try NVRAM. */ +		if (!(tp->tg3_flags & TG3_FLG2_SUN_570X) && +		    !tg3_nvram_read(tp, mac_offset + 0, &hi) && +		    !tg3_nvram_read(tp, mac_offset + 4, &lo)) { +			dev->dev_addr[0] = ((hi >> 16) & 0xff); +			dev->dev_addr[1] = ((hi >> 24) & 0xff); +			dev->dev_addr[2] = ((lo >>  0) & 0xff); +			dev->dev_addr[3] = ((lo >>  8) & 0xff); +			dev->dev_addr[4] = ((lo >> 16) & 0xff); +			dev->dev_addr[5] = ((lo >> 24) & 0xff); +		} +		/* Finally just fetch it out of the MAC control regs. */ +		else { +			hi = tr32(MAC_ADDR_0_HIGH); +			lo = tr32(MAC_ADDR_0_LOW); + +			dev->dev_addr[5] = lo & 0xff; +			dev->dev_addr[4] = (lo >> 8) & 0xff; +			dev->dev_addr[3] = (lo >> 16) & 0xff; +			dev->dev_addr[2] = (lo >> 24) & 0xff; +			dev->dev_addr[1] = hi & 0xff; +			dev->dev_addr[0] = (hi >> 8) & 0xff; +		}  	}  	if (!is_valid_ether_addr(&dev->dev_addr[0])) { | 
