73 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
--- a/arch/arm/mach-ixp4xx/wrt300nv2-setup.c
 | 
						|
+++ b/arch/arm/mach-ixp4xx/wrt300nv2-setup.c
 | 
						|
@@ -3,6 +3,7 @@
 | 
						|
  *
 | 
						|
  * Board setup for the Linksys WRT300N v2
 | 
						|
  *
 | 
						|
+ * Copyright (C) 2010 Alexandros C. Couloumbis <alex@ozo.com>
 | 
						|
  * Copyright (C) 2007 Imre Kaloz <Kaloz@openwrt.org>
 | 
						|
  *
 | 
						|
  * based on coyote-setup.c:
 | 
						|
@@ -18,6 +19,7 @@
 | 
						|
 #include <linux/tty.h>
 | 
						|
 #include <linux/serial_8250.h>
 | 
						|
 #include <linux/slab.h>
 | 
						|
+#include <linux/etherdevice.h>
 | 
						|
 
 | 
						|
 #include <asm/types.h>
 | 
						|
 #include <asm/setup.h>
 | 
						|
@@ -79,7 +81,8 @@ static struct platform_device wrt300nv2_
 | 
						|
 /* Built-in 10/100 Ethernet MAC interfaces */
 | 
						|
 static struct eth_plat_info wrt300nv2_plat_eth[] = {
 | 
						|
 	{
 | 
						|
-		.phy		= -1,
 | 
						|
+		.phy		= IXP4XX_ETH_PHY_MAX_ADDR,
 | 
						|
+		.phy_mask	= 0x0F0000,
 | 
						|
 		.rxq		= 3,
 | 
						|
 		.txreadyq	= 20,
 | 
						|
 	}, {
 | 
						|
@@ -112,6 +115,10 @@ static struct platform_device *wrt300nv2
 | 
						|
 
 | 
						|
 static void __init wrt300nv2_init(void)
 | 
						|
 {
 | 
						|
+	uint8_t __iomem *f;
 | 
						|
+	int offset = 0;
 | 
						|
+	int i;
 | 
						|
+
 | 
						|
 	ixp4xx_sys_init();
 | 
						|
 
 | 
						|
 	wrt300nv2_flash_resource.start = IXP4XX_EXP_BUS_BASE(0);
 | 
						|
@@ -121,6 +128,32 @@ static void __init wrt300nv2_init(void)
 | 
						|
 	*IXP4XX_EXP_CS1 = *IXP4XX_EXP_CS0;
 | 
						|
 
 | 
						|
 	platform_add_devices(wrt300nv2_devices, ARRAY_SIZE(wrt300nv2_devices));
 | 
						|
+
 | 
						|
+	f = ioremap(IXP4XX_EXP_BUS_BASE(0), 0x60000);
 | 
						|
+
 | 
						|
+	if (f) {
 | 
						|
+		for (i = 0; i < 6; i++) {
 | 
						|
+#ifdef __ARMEB__
 | 
						|
+			wrt300nv2_plat_eth[0].hwaddr[i] = readb(f + 0x5FFA0 + i);
 | 
						|
+			if (i == 5)
 | 
						|
+				offset = 1;
 | 
						|
+			wrt300nv2_plat_eth[1].hwaddr[i] = (wrt300nv2_plat_eth[0].hwaddr[i] + offset);
 | 
						|
+#else
 | 
						|
+			wrt300nv2_plat_eth[0].hwaddr[i] = readb(f + 0x5FFA0 + (i^3));
 | 
						|
+			if (i == 5)
 | 
						|
+				offset = 1;
 | 
						|
+			wrt300nv2_plat_eth[1].hwaddr[i] = (wrt300nv2_plat_eth[0].hwaddr[i] + offset);
 | 
						|
+#endif
 | 
						|
+		}
 | 
						|
+		iounmap(f);
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	if (!(is_valid_ether_addr(wrt300nv2_plat_eth[0].hwaddr)))
 | 
						|
+		random_ether_addr(wrt300nv2_plat_eth[0].hwaddr);
 | 
						|
+	if (!(is_valid_ether_addr(wrt300nv2_plat_eth[1].hwaddr))) {
 | 
						|
+		memcpy(wrt300nv2_plat_eth[1].hwaddr, wrt300nv2_plat_eth[0].hwaddr, ETH_ALEN);
 | 
						|
+		wrt300nv2_plat_eth[1].hwaddr[5] = (wrt300nv2_plat_eth[0].hwaddr[5] + 1);
 | 
						|
+	}
 | 
						|
 }
 | 
						|
 
 | 
						|
 #ifdef CONFIG_MACH_WRT300NV2
 |