]> git.ipfire.org Git - people/arne_f/ipfire-3.x.git/blobdiff - kernel/patches/arm-smsc-support-reading-mac-address-from-device-tree.patch
kernel: Update to Linux 3.2.
[people/arne_f/ipfire-3.x.git] / kernel / patches / arm-smsc-support-reading-mac-address-from-device-tree.patch
diff --git a/kernel/patches/arm-smsc-support-reading-mac-address-from-device-tree.patch b/kernel/patches/arm-smsc-support-reading-mac-address-from-device-tree.patch
new file mode 100644 (file)
index 0000000..a36c683
--- /dev/null
@@ -0,0 +1,92 @@
+From 0b608345e114681f66ca0a3cf9d9434728da62ce Mon Sep 17 00:00:00 2001
+From: Ken Cox <ken@coxcampers.net>
+Date: Thu, 23 Jun 2011 10:36:43 -0500
+Subject: [PATCH] Support reading mac address from device tree.
+
+If CONFIG_OF is enabled, we will try to read the mac address from the device tree.  This enables us the ability to have a "static" mac address on arm boards such as the pandaboard and beagleboard which generate random mac addresses.
+---
+ drivers/net/usb/smsc75xx.c |   17 +++++++++++++++++
+ drivers/net/usb/smsc95xx.c |   18 +++++++++++++++++-
+ 2 files changed, 34 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/net/usb/smsc75xx.c b/drivers/net/usb/smsc75xx.c
+index 753ee6e..ac0a200 100644
+--- a/drivers/net/usb/smsc75xx.c
++++ b/drivers/net/usb/smsc75xx.c
+@@ -29,6 +29,7 @@
+ #include <linux/crc32.h>
+ #include <linux/usb/usbnet.h>
+ #include <linux/slab.h>
++#include <linux/of_device.h>
+ #include "smsc75xx.h"
+ #define SMSC_CHIPNAME                 "smsc75xx"
+@@ -658,6 +659,22 @@ static int smsc75xx_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
+ static void smsc75xx_init_mac_address(struct usbnet *dev)
+ {
++      void *address;
++#ifdef CONFIG_OF
++      struct device_node *np;
++
++      /* try the device tree */
++      np = of_find_node_by_name(NULL, "smsc75xx");
++      if (np) {
++              address = of_get_property(np, "local-mac-address", NULL);
++              if (address) {
++                      memcpy(dev->net->dev_addr, address, ETH_ALEN);
++                      netif_dbg(dev, ifup, dev->net, "MAC address read from device tree\n");
++                      return;
++              }
++      }
++#endif
++
+       /* try reading mac address from EEPROM */
+       if (smsc75xx_read_eeprom(dev, EEPROM_MAC_OFFSET, ETH_ALEN,
+                       dev->net->dev_addr) == 0) {
+diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
+index bc86f4b..c83942d 100644
+--- a/drivers/net/usb/smsc95xx.c
++++ b/drivers/net/usb/smsc95xx.c
+@@ -29,6 +29,7 @@
+ #include <linux/crc32.h>
+ #include <linux/usb/usbnet.h>
+ #include <linux/slab.h>
++#include <linux/of_device.h>
+ #include "smsc95xx.h"
+ #define SMSC_CHIPNAME                 "smsc95xx"
+@@ -639,6 +640,22 @@ static int smsc95xx_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
+ static void smsc95xx_init_mac_address(struct usbnet *dev)
+ {
++      void *address;
++#ifdef CONFIG_OF
++      struct device_node *np;
++
++      /* try the device tree */
++      np = of_find_node_by_name(NULL, "smsc95xx");
++      if (np) {
++              address = of_get_property(np, "local-mac-address", NULL);
++              if (address) {
++                      memcpy(dev->net->dev_addr, address, ETH_ALEN);
++                      netif_dbg(dev, ifup, dev->net, "MAC address read from device tree\n");
++                      return;
++              }
++      }
++#endif
++
+       /* try reading mac address from EEPROM */
+       if (smsc95xx_read_eeprom(dev, EEPROM_MAC_OFFSET, ETH_ALEN,
+                       dev->net->dev_addr) == 0) {
+@@ -648,7 +665,6 @@ static void smsc95xx_init_mac_address(struct usbnet *dev)
+                       return;
+               }
+       }
+-
+       /* no eeprom, or eeprom values are invalid. generate random MAC */
+       random_ether_addr(dev->net->dev_addr);
+       netif_dbg(dev, ifup, dev->net, "MAC address set to random_ether_addr\n");
+-- 
+1.7.2.3
+