]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[smsc95xx] Fetch MAC from device tree for Raspberry Pi
authorMichael Brown <mcb30@ipxe.org>
Fri, 19 Jul 2019 16:43:39 +0000 (17:43 +0100)
committerMichael Brown <mcb30@ipxe.org>
Fri, 19 Jul 2019 16:44:27 +0000 (17:44 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/net/smsc95xx.c

index 9b09657db3aca8e78ccb8c819e34a7bb38a898d6..4ac3f42f0228579b4afe74b06556aa3173b78160 100644 (file)
@@ -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
@@ -158,6 +159,32 @@ static int smsc95xx_vm3_fetch_mac ( struct smscusb_device *smscusb ) {
        return 0;
 }
 
+/**
+ * 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
  *
@@ -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;