|  | @@ -33,6 +33,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 | 
		
	
		
			
			| 33 | 33 |  #include <ipxe/profile.h>
 | 
		
	
		
			
			| 34 | 34 |  #include <ipxe/base16.h>
 | 
		
	
		
			
			| 35 | 35 |  #include <ipxe/smbios.h>
 | 
		
	
		
			
			|  | 36 | +#include <ipxe/fdt.h>
 | 
		
	
		
			
			| 36 | 37 |  #include "smsc95xx.h"
 | 
		
	
		
			
			| 37 | 38 |  
 | 
		
	
		
			
			| 38 | 39 |  /** @file
 | 
		
	
	
		
			
			|  | @@ -158,6 +159,32 @@ static int smsc95xx_vm3_fetch_mac ( struct smscusb_device *smscusb ) {
 | 
		
	
		
			
			| 158 | 159 |  	return 0;
 | 
		
	
		
			
			| 159 | 160 |  }
 | 
		
	
		
			
			| 160 | 161 |  
 | 
		
	
		
			
			|  | 162 | +/**
 | 
		
	
		
			
			|  | 163 | + * Fetch MAC address from device tree
 | 
		
	
		
			
			|  | 164 | + *
 | 
		
	
		
			
			|  | 165 | + * @v smscusb		SMSC USB device
 | 
		
	
		
			
			|  | 166 | + * @ret rc		Return status code
 | 
		
	
		
			
			|  | 167 | + */
 | 
		
	
		
			
			|  | 168 | +static int smsc95xx_fdt_fetch_mac ( struct smscusb_device *smscusb ) {
 | 
		
	
		
			
			|  | 169 | +	struct net_device *netdev = smscusb->netdev;
 | 
		
	
		
			
			|  | 170 | +	unsigned int offset;
 | 
		
	
		
			
			|  | 171 | +	int rc;
 | 
		
	
		
			
			|  | 172 | +
 | 
		
	
		
			
			|  | 173 | +	/* Look for "ethernet[0]" alias */
 | 
		
	
		
			
			|  | 174 | +	if ( ( rc = fdt_alias ( "ethernet", &offset ) != 0 ) &&
 | 
		
	
		
			
			|  | 175 | +	     ( rc = fdt_alias ( "ethernet0", &offset ) != 0 ) ) {
 | 
		
	
		
			
			|  | 176 | +		return rc;
 | 
		
	
		
			
			|  | 177 | +	}
 | 
		
	
		
			
			|  | 178 | +
 | 
		
	
		
			
			|  | 179 | +	/* Fetch MAC address */
 | 
		
	
		
			
			|  | 180 | +	if ( ( rc = fdt_mac ( offset, netdev ) ) != 0 )
 | 
		
	
		
			
			|  | 181 | +		return rc;
 | 
		
	
		
			
			|  | 182 | +
 | 
		
	
		
			
			|  | 183 | +	DBGC ( smscusb, "SMSC95XX %p using FDT MAC %s\n",
 | 
		
	
		
			
			|  | 184 | +	       smscusb, eth_ntoa ( netdev->hw_addr ) );
 | 
		
	
		
			
			|  | 185 | +	return 0;
 | 
		
	
		
			
			|  | 186 | +}
 | 
		
	
		
			
			|  | 187 | +
 | 
		
	
		
			
			| 161 | 188 |  /**
 | 
		
	
		
			
			| 162 | 189 |   * Fetch MAC address
 | 
		
	
		
			
			| 163 | 190 |   *
 | 
		
	
	
		
			
			|  | @@ -173,6 +200,10 @@ static int smsc95xx_fetch_mac ( struct smscusb_device *smscusb ) {
 | 
		
	
		
			
			| 173 | 200 |  					       SMSC95XX_E2P_BASE ) ) == 0 )
 | 
		
	
		
			
			| 174 | 201 |  		return 0;
 | 
		
	
		
			
			| 175 | 202 |  
 | 
		
	
		
			
			|  | 203 | +	/* Read MAC address from device tree */
 | 
		
	
		
			
			|  | 204 | +	if ( ( rc = smsc95xx_fdt_fetch_mac ( smscusb ) ) == 0 )
 | 
		
	
		
			
			|  | 205 | +		return 0;
 | 
		
	
		
			
			|  | 206 | +
 | 
		
	
		
			
			| 176 | 207 |  	/* Construct MAC address for Honeywell VM3, if applicable */
 | 
		
	
		
			
			| 177 | 208 |  	if ( ( rc = smsc95xx_vm3_fetch_mac ( smscusb ) ) == 0 )
 | 
		
	
		
			
			| 178 | 209 |  		return 0;
 |