aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ixp4xx/patches-3.3/132-wrt300nv2_mac_fix.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/ixp4xx/patches-3.3/132-wrt300nv2_mac_fix.patch')
-rw-r--r--target/linux/ixp4xx/patches-3.3/132-wrt300nv2_mac_fix.patch72
1 files changed, 72 insertions, 0 deletions
diff --git a/target/linux/ixp4xx/patches-3.3/132-wrt300nv2_mac_fix.patch b/target/linux/ixp4xx/patches-3.3/132-wrt300nv2_mac_fix.patch
new file mode 100644
index 000000000..381cc5b75
--- /dev/null
+++ b/target/linux/ixp4xx/patches-3.3/132-wrt300nv2_mac_fix.patch
@@ -0,0 +1,72 @@
+--- 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,
+ }, {
+@@ -110,6 +113,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);
+@@ -119,6 +126,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