OMAP3: Beagle: set mac addr from dieid

TODO: share dieid<-->mac addr code between
OMAP3 and OMAP4

Signed-off-by: John Rigby <john.rigby@linaro.org>
diff --git a/arch/arm/cpu/armv7/omap3/sys_info.c b/arch/arm/cpu/armv7/omap3/sys_info.c
index 3c80113..10808e5 100644
--- a/arch/arm/cpu/armv7/omap3/sys_info.c
+++ b/arch/arm/cpu/armv7/omap3/sys_info.c
@@ -79,6 +79,8 @@
 	printf("Die ID #%s\n", uid_s);
 }
 
+
+
 /******************************************
  * get_cpu_type(void) - extract cpu info
  ******************************************/
@@ -366,3 +368,36 @@
 	return 0;
 }
 #endif	/* CONFIG_DISPLAY_CPUINFO */
+
+void omap3_die_id_to_ethernet_mac(u8 *mac, int subtype)
+{
+	struct ctrl_id *id_base = (struct ctrl_id *)OMAP34XX_ID_L4_IO_BASE;
+	u32 idcode;
+	u32 id[4];
+
+	idcode = readl(&id_base->idcode);
+	id[0] = readl(&id_base->die_id_0);
+	id[1] = readl(&id_base->die_id_1);
+	id[2] = readl(&id_base->die_id_2);
+	id[3] = readl(&id_base->die_id_3);
+
+	mac[0] = id[2];
+	mac[1] = id[2] >> 8;
+	mac[2] = id[1];
+	mac[3] = id[1] >> 8;
+	mac[4] = id[1] >> 16;
+	mac[5] = id[1] >> 24;
+	/* XOR other chip-specific data with ID */
+	idcode ^= id[3];
+
+	mac[0] ^= idcode;
+	mac[1] ^= idcode >> 8;
+	mac[2] ^= idcode >> 16;
+	mac[3] ^= idcode >> 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/include/asm/arch-omap3/sys_proto.h b/arch/arm/include/asm/arch-omap3/sys_proto.h
index 9e52b12..f48b17a 100644
--- a/arch/arm/include/asm/arch-omap3/sys_proto.h
+++ b/arch/arm/include/asm/arch-omap3/sys_proto.h
@@ -75,4 +75,5 @@
 void do_omap3_emu_romcode_call(u32 service_id, u32 parameters);
 void omap3_gp_romcode_call(u32 service_id, u32 parameter);
 u32 warm_reset(void);
+void omap3_die_id_to_ethernet_mac(u8 *, int);
 #endif
diff --git a/board/ti/beagle/beagle.c b/board/ti/beagle/beagle.c
index 6175e1d..4e80d64 100644
--- a/board/ti/beagle/beagle.c
+++ b/board/ti/beagle/beagle.c
@@ -100,6 +100,29 @@
 }
 
 /*
+ * Beagle-xM has a usb nic with no ethernet rom so generate a macaddr
+ * from the SOC die-id and set the usbethaddr env var to that
+ * value.
+ */
+int board_eth_init(bd_t *bis)
+{
+	u8 macaddr[6];
+	char usbethaddr[20];
+
+	/*
+	 * NB: The 1 here has been found to generate an address
+	 * consistent with the kernel.
+	 */
+	omap3_die_id_to_ethernet_mac(macaddr, 1);
+	sprintf (usbethaddr, "%02X:%02X:%02X:%02X:%02X:%02X",
+		 macaddr[0], macaddr[1],
+		 macaddr[2], macaddr[3],
+		 macaddr[4], macaddr[5]) ;
+	setenv ("usbethaddr", usbethaddr);
+	return 0;
+}
+
+/*
  * Routine: get_board_revision
  * Description: Detect if we are running on a Beagle revision Ax/Bx,
  *		C1/2/3, C4 or xM. This can be done by reading