summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2019-07-19 20:15:33 +0200
committerMichael Brown2019-07-19 20:15:33 +0200
commitf4cc5834efe1b8fd366ec35cc016cd23527e2f42 (patch)
tree4b0a66f93c0db1fba59f1cda7127e440d77e29c2
parent[build] Add named configuration for Raspberry Pi (diff)
downloadipxe-f4cc5834efe1b8fd366ec35cc016cd23527e2f42.tar.gz
ipxe-f4cc5834efe1b8fd366ec35cc016cd23527e2f42.tar.xz
ipxe-f4cc5834efe1b8fd366ec35cc016cd23527e2f42.zip
[smscusb] Fetch MAC from device tree for Raspberry Pi Model B+
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/drivers/net/lan78xx.c4
-rw-r--r--src/drivers/net/smsc95xx.c31
-rw-r--r--src/drivers/net/smscusb.c34
-rw-r--r--src/drivers/net/smscusb.h1
4 files changed, 41 insertions, 29 deletions
diff --git a/src/drivers/net/lan78xx.c b/src/drivers/net/lan78xx.c
index 3f705203..a8cf5740 100644
--- a/src/drivers/net/lan78xx.c
+++ b/src/drivers/net/lan78xx.c
@@ -97,6 +97,10 @@ static int lan78xx_fetch_mac ( struct smscusb_device *smscusb ) {
if ( ( rc = smscusb_otp_fetch_mac ( smscusb, LAN78XX_OTP_BASE ) ) == 0 )
return 0;
+ /* Read MAC address from device tree, if present */
+ if ( ( rc = smscusb_fdt_fetch_mac ( smscusb ) ) == 0 )
+ return 0;
+
/* Otherwise, generate a random MAC address */
eth_random_addr ( netdev->hw_addr );
DBGC ( smscusb, "LAN78XX %p using random MAC %s\n",
diff --git a/src/drivers/net/smsc95xx.c b/src/drivers/net/smsc95xx.c
index 4ac3f42f..3ec49584 100644
--- a/src/drivers/net/smsc95xx.c
+++ b/src/drivers/net/smsc95xx.c
@@ -33,7 +33,6 @@ 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
@@ -160,32 +159,6 @@ 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
@@ -200,8 +173,8 @@ 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 )
+ /* Read MAC address from device tree, if present */
+ if ( ( rc = smscusb_fdt_fetch_mac ( smscusb ) ) == 0 )
return 0;
/* Construct MAC address for Honeywell VM3, if applicable */
diff --git a/src/drivers/net/smscusb.c b/src/drivers/net/smscusb.c
index 538d338c..c639c58c 100644
--- a/src/drivers/net/smscusb.c
+++ b/src/drivers/net/smscusb.c
@@ -30,6 +30,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <ipxe/usbnet.h>
#include <ipxe/ethernet.h>
#include <ipxe/profile.h>
+#include <ipxe/fdt.h>
#include "smscusb.h"
/** @file
@@ -441,6 +442,39 @@ int smscusb_otp_fetch_mac ( struct smscusb_device *smscusb,
/******************************************************************************
*
+ * Device tree
+ *
+ ******************************************************************************
+ */
+
+/**
+ * Fetch MAC address from device tree
+ *
+ * @v smscusb SMSC USB device
+ * @ret rc Return status code
+ */
+int smscusb_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, "SMSCUSB %p using FDT MAC %s\n",
+ smscusb, eth_ntoa ( netdev->hw_addr ) );
+ return 0;
+}
+
+/******************************************************************************
+ *
* MII access
*
******************************************************************************
diff --git a/src/drivers/net/smscusb.h b/src/drivers/net/smscusb.h
index b5d9ad3f..e866bb74 100644
--- a/src/drivers/net/smscusb.h
+++ b/src/drivers/net/smscusb.h
@@ -287,6 +287,7 @@ extern int smscusb_eeprom_fetch_mac ( struct smscusb_device *smscusb,
unsigned int e2p_base );
extern int smscusb_otp_fetch_mac ( struct smscusb_device *smscusb,
unsigned int otp_base );
+extern int smscusb_fdt_fetch_mac ( struct smscusb_device *smscusb );
extern int smscusb_mii_check_link ( struct smscusb_device *smscusb );
extern int smscusb_mii_open ( struct smscusb_device *smscusb,
unsigned int phy_mask, unsigned int intrs );