linux-3.0: fix BeagleBoard-xM eth mac using die id
authorJason Kridner <jdk@ti.com>
Fri, 16 Sep 2011 18:48:46 +0000 (14:48 -0400)
committerJason Kridner <jdk@ti.com>
Fri, 16 Sep 2011 22:05:57 +0000 (18:05 -0400)
Signed-off-by: Jason Kridner <jdk@ti.com>
Cc: Joel A Fernandes <agnel.joel@gmail.com>
Cc: Koen Kooi <koen@dominion.thruhere.net>
recipes-kernel/linux/linux-3.0/beagle/0007-OMAP2-add-cpu-id-register-to-MAC-address-helper.patch [new file with mode: 0644]
recipes-kernel/linux/linux-3.0/beagle/0008-HACK-OMAP2-BeagleBoard-Fix-up-random-or-missing-MAC-.patch [new file with mode: 0644]
recipes-kernel/linux/linux_3.0.bb

diff --git a/recipes-kernel/linux/linux-3.0/beagle/0007-OMAP2-add-cpu-id-register-to-MAC-address-helper.patch b/recipes-kernel/linux/linux-3.0/beagle/0007-OMAP2-add-cpu-id-register-to-MAC-address-helper.patch
new file mode 100644 (file)
index 0000000..74e16bb
--- /dev/null
@@ -0,0 +1,89 @@
+From ab46a513a2600654c6c02805be2b88b5203bae82 Mon Sep 17 00:00:00 2001
+From: Andy Green <andy@warmcat.com>
+Date: Thu, 24 Mar 2011 21:27:29 +0000
+Subject: [PATCH 7/8] OMAP2+: add cpu id register to MAC address helper
+
+Introduce a generic helper function that can set a MAC address using
+data from the OMAP unique CPU ID register.
+
+For comparison purposes this produces a MAC address of
+
+  2e:40:70:f0:12:06
+
+for the ethernet device on my Panda.
+
+Note that this patch requires the fix patch for CPU ID register
+indexes previously posted to linux-omap, otherwise the CPU ID is
+misread on Panda by the existing function to do it.  This patch
+is already on linux-omap.
+
+"OMAP2+:Common CPU DIE ID reading code reads wrong registers for OMAP4430"
+http://git.kernel.org/?p=linux/kernel/git/tmlind/linux-omap-2.6.git;a=commit;h=b235e007831dbf57710e59cd4a120e2f374eecb9
+
+Signed-off-by: Andy Green <andy.green@linaro.org>
+---
+ arch/arm/mach-omap2/id.c              |   39 +++++++++++++++++++++++++++++++++
+ arch/arm/mach-omap2/include/mach/id.h |    1 +
+ 2 files changed, 40 insertions(+), 0 deletions(-)
+
+diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c
+index b6ed78a..de993f1 100644
+--- a/arch/arm/mach-omap2/id.c
++++ b/arch/arm/mach-omap2/id.c
+@@ -567,3 +567,42 @@ void __init omap2_set_globals_tap(struct omap_globals *omap2_globals)
+       else
+               tap_prod_id = 0x0208;
+ }
++
++/*
++ * this uses the unique per-cpu info from the cpu fuses set at factory to
++ * generate a 6-byte MAC address.  Two bits in the generated code are used
++ * to elaborate the generated address into four, so it can be used on multiple
++ * network interfaces.
++ */
++
++void omap2_die_id_to_ethernet_mac(u8 *mac, int subtype)
++{
++      struct omap_die_id odi;
++      u32 tap = read_tap_reg(OMAP_TAP_IDCODE);
++
++      omap_get_die_id(&odi);
++
++      mac[0] = odi.id_2;
++      mac[1] = odi.id_2 >> 8;
++      mac[2] = odi.id_1;
++      mac[3] = odi.id_1 >> 8;
++      mac[4] = odi.id_1 >> 16;
++      mac[5] = odi.id_1 >> 24;
++
++      /* XOR other chip-specific data with ID */
++
++      tap ^= odi.id_3;
++
++      mac[0] ^= tap;
++      mac[1] ^= tap >> 8;
++      mac[2] ^= tap >> 16;
++      mac[3] ^= tap >> 24;
++
++      /* allow four MACs from this same basic data */
++
++      mac[1] = (mac[1] & ~0xc0) | ((subtype & 3) << 6);
++
++      /* mark it as not multicast and outside official 80211 MAC namespace */
++
++      mac[0] = (mac[0] & ~1) | 2;
++}
+diff --git a/arch/arm/mach-omap2/include/mach/id.h b/arch/arm/mach-omap2/include/mach/id.h
+index 02ed3aa..373313a 100644
+--- a/arch/arm/mach-omap2/include/mach/id.h
++++ b/arch/arm/mach-omap2/include/mach/id.h
+@@ -18,5 +18,6 @@ struct omap_die_id {
+ };
+ void omap_get_die_id(struct omap_die_id *odi);
++void omap2_die_id_to_ethernet_mac(u8 *mac, int subtype);
+ #endif
+-- 
+1.7.4.1
+
diff --git a/recipes-kernel/linux/linux-3.0/beagle/0008-HACK-OMAP2-BeagleBoard-Fix-up-random-or-missing-MAC-.patch b/recipes-kernel/linux/linux-3.0/beagle/0008-HACK-OMAP2-BeagleBoard-Fix-up-random-or-missing-MAC-.patch
new file mode 100644 (file)
index 0000000..210c38c
--- /dev/null
@@ -0,0 +1,156 @@
+From 67f39ef3d73d377b13dbf34bd5170d94f00cc2c2 Mon Sep 17 00:00:00 2001
+From: Jason Kridner <jdk@ti.com>
+Date: Thu, 15 Sep 2011 18:23:02 -0400
+Subject: [PATCH 8/8] HACK: OMAP2+: BeagleBoard: Fix up random or missing MAC addresses for eth0 and wlan0
+
+This was borrowed from the Panda implementation at http://patches.linaro.org/777/
+
+This patch registers a network device notifier callback to set the mac
+addresses for the onboard network assets of the BeagleBoard correctly, despite the
+drivers involved have used a random or all-zeros MAC address.
+
+The technique was suggested by Alan Cox on lkml.
+
+It works by device path so it corrects the MAC addresses even if the
+drivers are in modules loaded in an order that changes their interface
+name from usual (eg, the onboard module might be "wlan1" if there is a
+USB wireless stick plugged in and its module is inserted first.)
+
+Cc: Andy Green <andy@warmcat.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c |   90 +++++++++++++++++++++++++++++++
+ 1 files changed, 90 insertions(+), 0 deletions(-)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 5e1d9f9..9712099 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -33,6 +33,8 @@
+ #include <linux/regulator/machine.h>
+ #include <linux/i2c/twl.h>
++#include <linux/netdevice.h>
++#include <linux/if_ether.h>
+ #include <mach/hardware.h>
+ #include <asm/mach-types.h>
+@@ -42,6 +44,7 @@
+ #include <plat/board.h>
+ #include <plat/common.h>
++#include <mach/id.h>
+ #include <video/omapdss.h>
+ #include <video/omap-panel-generic-dpi.h>
+ #include <plat/gpmc.h>
+@@ -91,6 +94,90 @@ static struct {
+       .usr_button_gpio = 4,
+ };
++/*
++ * This device path represents the onboard USB <-> Ethernet bridge
++ * on the BeagleBoard-xM which needs a random or all-zeros
++ * mac address replaced with a per-cpu stable generated one
++ */
++
++static const char * const xm_fixup_mac_device_paths[] = {
++      "usb1/1-2/1-2.1/1-2.1:1.0",
++};
++
++static int beagle_device_path_need_mac(struct device *dev)
++{
++      const char **try = (const char **) xm_fixup_mac_device_paths;
++      const char *path;
++      int count = ARRAY_SIZE(xm_fixup_mac_device_paths);
++      const char *p;
++      int len;
++      struct device *devn;
++
++      while (count--) {
++
++              p = *try + strlen(*try);
++              devn = dev;
++
++              while (devn) {
++
++                      path = dev_name(devn);
++                      len = strlen(path);
++
++                      if ((p - *try) < len) {
++                              devn = NULL;
++                              continue;
++                      }
++
++                      p -= len;
++
++                      if (strncmp(path, p, len)) {
++                              devn = NULL;
++                              continue;
++                      }
++
++                      devn = devn->parent;
++                      if (p == *try)
++                              return count;
++
++                      if (devn != NULL && (p - *try) < 2)
++                              devn = NULL;
++
++                      p--;
++                      if (devn != NULL && *p != '/')
++                              devn = NULL;
++              }
++
++              try++;
++      }
++
++      return -ENOENT;
++}
++
++static int omap_beagle_netdev_event(struct notifier_block *this,
++                                               unsigned long event, void *ptr)
++{
++      struct net_device *dev = ptr;
++      struct sockaddr sa;
++      int n;
++
++      if (event != NETDEV_REGISTER)
++              return NOTIFY_DONE;
++
++      n = beagle_device_path_need_mac(dev->dev.parent);
++      if (n >= 0) {
++              sa.sa_family = dev->type;
++              omap2_die_id_to_ethernet_mac(sa.sa_data, n);
++              dev->netdev_ops->ndo_set_mac_address(dev, &sa);
++      }
++
++      return NOTIFY_DONE;
++}
++
++static struct notifier_block omap_beagle_netdev_notifier = {
++      .notifier_call = omap_beagle_netdev_event,
++      .priority = 1,
++};
++
+ static struct gpio omap3_beagle_rev_gpios[] __initdata = {
+       { 171, GPIOF_IN, "rev_id_0"    },
+       { 172, GPIOF_IN, "rev_id_1" },
+@@ -146,14 +233,17 @@ static void __init omap3_beagle_init_rev(void)
+               printk(KERN_INFO "OMAP3 Beagle Rev: xM Ax/Bx\n");
+               omap3_beagle_version = OMAP3BEAGLE_BOARD_XM;
+               beagle_config.usb_pwr_level = GPIOF_OUT_INIT_HIGH;
++              register_netdevice_notifier(&omap_beagle_netdev_notifier);
+               break;
+       case 2:
+               printk(KERN_INFO "OMAP3 Beagle Rev: xM C\n");
+               omap3_beagle_version = OMAP3BEAGLE_BOARD_XMC;
++              register_netdevice_notifier(&omap_beagle_netdev_notifier);
+               break;
+       default:
+               printk(KERN_INFO "OMAP3 Beagle Rev: unknown %hd\n", beagle_rev);
+               omap3_beagle_version = OMAP3BEAGLE_BOARD_UNKN;
++              register_netdevice_notifier(&omap_beagle_netdev_notifier);
+       }
+ }
+-- 
+1.7.4.1
+
index 40e7ea5e92a91f79b702227068f424f27c604b02..f42af2f08359e7fb24617b38aa7241091578cacb 100644 (file)
@@ -10,7 +10,7 @@ PV = "3.0.4"
 SRCREV_pn-${PN} = "04aa37b5f943920017ad094e776cd5514b1a9246"
 
 # The main PR is now using MACHINE_KERNEL_PR, for omap3 see conf/machine/include/omap3.inc
-MACHINE_KERNEL_PR_append = "c"
+MACHINE_KERNEL_PR_append = "d"
 
 FILESPATH =. "${FILE_DIRNAME}/linux-3.0:${FILE_DIRNAME}/linux-3.0/${MACHINE}:"
 
@@ -190,6 +190,8 @@ SRC_URI += "git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-3.0.y.git
             file://beagle/0004-OMAP3-beagle-HACK-add-in-1GHz-OPP.patch \
             file://beagle/0005-omap3-Add-basic-support-for-720MHz-part.patch \
             file://beagle/0006-omap-mmc-Adjust-dto-to-eliminate-timeout-errors.patch \
+            file://beagle/0007-OMAP2-add-cpu-id-register-to-MAC-address-helper.patch \
+            file://beagle/0008-HACK-OMAP2-BeagleBoard-Fix-up-random-or-missing-MAC-.patch \
             file://madc/0001-Enabling-Hwmon-driver-for-twl4030-madc.patch \
             file://madc/0002-mfd-twl-core-enable-madc-clock.patch \
             \