summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2019-07-19 18:43:39 +0200
committerMichael Brown2019-07-19 18:44:27 +0200
commit83e0f9f377246ba99f61e24a9074122d86ec3f20 (patch)
tree447b201fd611e004c57b5ef64ce11290b2c2cc22
parent[efi] Register a device tree if provided by the platform firmware (diff)
downloadipxe-83e0f9f377246ba99f61e24a9074122d86ec3f20.tar.gz
ipxe-83e0f9f377246ba99f61e24a9074122d86ec3f20.tar.xz
ipxe-83e0f9f377246ba99f61e24a9074122d86ec3f20.zip
[smsc95xx] Fetch MAC from device tree for Raspberry Pi
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/drivers/net/smsc95xx.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/drivers/net/smsc95xx.c b/src/drivers/net/smsc95xx.c
index 9b09657d..4ac3f42f 100644
--- a/src/drivers/net/smsc95xx.c
+++ b/src/drivers/net/smsc95xx.c
@@ -33,6 +33,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <ipxe/profile.h>
#include <ipxe/base16.h>
#include <ipxe/smbios.h>
+#include <ipxe/fdt.h>
#include "smsc95xx.h"
/** @file
@@ -159,6 +160,32 @@ static int smsc95xx_vm3_fetch_mac ( struct smscusb_device *smscusb ) {
}
/**
+ * Fetch MAC address from device tree
+ *
+ * @v smscusb SMSC USB device
+ * @ret rc Return status code
+ */
+static int smsc95xx_fdt_fetch_mac ( struct smscusb_device *smscusb ) {
+ struct net_device *netdev = smscusb->netdev;
+ unsigned int offset;
+ int rc;
+
+ /* Look for "ethernet[0]" alias */
+ if ( ( rc = fdt_alias ( "ethernet", &offset ) != 0 ) &&
+ ( rc = fdt_alias ( "ethernet0", &offset ) != 0 ) ) {
+ return rc;
+ }
+
+ /* Fetch MAC address */
+ if ( ( rc = fdt_mac ( offset, netdev ) ) != 0 )
+ return rc;
+
+ DBGC ( smscusb, "SMSC95XX %p using FDT MAC %s\n",
+ smscusb, eth_ntoa ( netdev->hw_addr ) );
+ return 0;
+}
+
+/**
* Fetch MAC address
*
* @v smscusb SMSC USB device
@@ -173,6 +200,10 @@ static int smsc95xx_fetch_mac ( struct smscusb_device *smscusb ) {
SMSC95XX_E2P_BASE ) ) == 0 )
return 0;
+ /* Read MAC address from device tree */
+ if ( ( rc = smsc95xx_fdt_fetch_mac ( smscusb ) ) == 0 )
+ return 0;
+
/* Construct MAC address for Honeywell VM3, if applicable */
if ( ( rc = smsc95xx_vm3_fetch_mac ( smscusb ) ) == 0 )
return 0;