[OpenWrt-Devel] [PATCH 5/6] [kernel] ath79: fix random wireless MAC address for WNR2000v3

Michal Cieslakiewicz michal.cieslakiewicz at wp.pl
Wed Jan 20 18:13:07 EST 2016


From: Michal Cieslakiewicz <michal.cieslakiewicz at wp.pl>

This patch calculates and assigns permanent hardware MAC to wireless interface
for Netgear WNR2000v3 during system startup. WLAN MAC follows Ethernet
interface addresses.

Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz at wp.pl>

---

ath9k module assigns random MAC address to wireless interface every time system
boots as ART partition area in flash where it looks for valid MAC is apparently
empty (filled with 0xff). There is also a platform-defined MAC area that ath9k
can read but it is not used by default. This patch makes use of that
infrastructure.

Random WLAN MAC address fix provided here generates missing address in a simple
way: 5 first bytes are taken from any eth{0,1} (they are equal) and last byte is
calculated as +1 to bigger octet of eth{0,1}. Finally, if result is 0x00 it is
incremented by one to avoid byte-boundary conflict (max(0xff,0x00) is 0xff).
This in turn causes all three interfaces (eth1, eth0, wlan0) to follow
increased-by-one numbering scheme.

This patch is an addition to existing patch set for ath79, so please apply
'ath79: all LEDs and buttons for Netgear WNR2000v3' and all its prerequisites
first.


 mach-wnr2000-v3.c |   30 ++++++++++++++++++++++++------
 1 file changed, 24 insertions(+), 6 deletions(-)


diff -pruN a/openwrt/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c b/openwrt/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c
--- a/openwrt/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c	2016-01-20 19:52:14.591735329 +0100
+++ b/openwrt/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c	2016-01-20 19:52:14.821721748 +0100
@@ -266,7 +266,7 @@ static struct gpio_keys_button wnr2000v3
 	}
 };
 
-static void __init wnr_common_setup(void)
+static void __init wnr_common_setup(u8 *wmac_addr)
 {
 	u8 *art = (u8 *) KSEG1ADDR(0x1fff0000);
 
@@ -285,12 +285,15 @@ static void __init wnr_common_setup(void
 	ath79_register_eth(1);
 
 	ath79_register_m25p80(NULL);
-	ap91_pci_init(art + WNR2000V3_PCIE_CALDATA_OFFSET, NULL);
+	ap91_pci_init(art + WNR2000V3_PCIE_CALDATA_OFFSET, wmac_addr);
 }
 
 static void __init wnr2000v3_setup(void)
 {
-	wnr_common_setup();
+	u8 *art = (u8 *) KSEG1ADDR(0x1fff0000);
+	u8 wlan_mac_addr[6];
+	u8 *eth0_mac_addr = (u8 *) (art + WNR2000V3_MAC0_OFFSET);
+	u8 *eth1_mac_addr = (u8 *) (art + WNR2000V3_MAC1_OFFSET);
 
 	/*
 	 * Disable JTAG to use all AR724X GPIO LEDs.
@@ -312,6 +315,21 @@ static void __init wnr2000v3_setup(void)
 				  AR724X_GPIO_FUNC_ETH_SWITCH_LED4_EN |
 				  BIT(20));
 
+	/*
+	 * For WNR2000v3 ART flash area used for wlan MAC is usually empty (0xff)
+	 * so ath9k driver uses random MAC instead each time module is loaded.
+	 * To fix that, assign permanent wlan MAC equal to ethN's MAC plus 1,
+	 * so network interfaces get sequential addresses.
+	 */
+	memcpy(wlan_mac_addr, eth0_mac_addr, sizeof(wlan_mac_addr));
+	wlan_mac_addr[5] = (eth0_mac_addr[5] > eth1_mac_addr[5] ?
+			   eth0_mac_addr[5] : eth1_mac_addr[5]) + 1;
+
+	/* avoid potential conflict in case: max(0xff,0x00)+1==0x00 */
+	if (!wlan_mac_addr[5]) wlan_mac_addr[5] = 1;
+
+	wnr_common_setup(wlan_mac_addr);
+
 	ath79_register_leds_gpio(-1, ARRAY_SIZE(wnr2000v3_leds_gpio),
 				 wnr2000v3_leds_gpio);
 
@@ -336,7 +354,7 @@ MIPS_MACHINE(ATH79_MACH_WNR2000_V3, "WNR
 
 static void __init wnr612v2_setup(void)
 {
-	wnr_common_setup();
+	wnr_common_setup(NULL);
 
 	ath79_register_leds_gpio(-1, ARRAY_SIZE(wnr612v2_leds_gpio),
 				 wnr612v2_leds_gpio);
@@ -346,7 +364,7 @@ MIPS_MACHINE(ATH79_MACH_WNR612_V2, "WNR6
 
 static void __init wnr1000v2_setup(void)
 {
-	wnr_common_setup();
+	wnr_common_setup(NULL);
 
 	ath79_register_leds_gpio(-1, ARRAY_SIZE(wnr1000v2_leds_gpio),
 				 wnr1000v2_leds_gpio);
@@ -364,7 +382,7 @@ static void __init wpn824n_setup(void)
 				  AR724X_GPIO_FUNC_ETH_SWITCH_LED4_EN |
 				  AR724X_GPIO_FUNC_CLK_OBS3_EN);
 
-	wnr_common_setup();
+	wnr_common_setup(NULL);
 
 	ath79_register_leds_gpio(-1, ARRAY_SIZE(wpn824n_leds_gpio),
 				 wpn824n_leds_gpio);
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list