Message ID | 20160127014125.4ec37e24@kosmio |
---|---|
State | Superseded |
Headers | show |
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Michal schrieb am 27.01.2016 um 01:41: > From: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl> > > Fix for invalid/random WLAN MAC address in WNR2000v3. Permanent platform MAC > is calculated and assigned during system startup. WLAN MAC follows wired > Ethernet interface addresses. > > Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl> Acked-by: Hartmut Knaack <knaack.h@gmx.de> > --- I've put some comments inline. The subject should also be more like: ar71xx: WNR2000v3: fix for random WLAN MAC. > .../ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c | 30 +++++++++++++++++----- > 1 file changed, 24 insertions(+), 6 deletions(-) > > diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c > index 205c2e7..ee6b449 100644 > --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c > +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c > @@ -181,7 +181,7 @@ static struct gpio_keys_button wnr2000v3_gpio_keys[] __initdata = { > } > }; > > -static void __init wnr_common_setup(void) > +static void __init wnr_common_setup(u8 *wmac_addr) > { > u8 *art = (u8 *) KSEG1ADDR(0x1fff0000); > > @@ -200,12 +200,30 @@ 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); > + > + /* > + * 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; This could benefit from the max macro http://lxr.free-electrons.com/source/include/linux/kernel.h#L727 > + > + /* Avoid potential conflict in case: max(0xff,0x00)+1==0x00 */ > + if (!wlan_mac_addr[5]) wlan_mac_addr[5] = 1; Please put the second part in a new line. > + > + wnr_common_setup(wlan_mac_addr); > > ath79_register_leds_gpio(-1, ARRAY_SIZE(wnr2000v3_leds_gpio), > wnr2000v3_leds_gpio); > @@ -219,7 +237,7 @@ MIPS_MACHINE(ATH79_MACH_WNR2000_V3, "WNR2000V3", "NETGEAR WNR2000 V3", wnr2000v3 > > 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); > @@ -229,7 +247,7 @@ MIPS_MACHINE(ATH79_MACH_WNR612_V2, "WNR612V2", "NETGEAR WNR612 V2", wnr612v2_set > > 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); > @@ -247,7 +265,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); > -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJWrQNRAAoJEANoShj6yJFIZYkP+gKbiHX8jozsojxWzmhFyjiQ v1Tzr64/QABNtAOnHbMgYaVNdqdDGKKdHAOZG9PYQmiBxKGXe4Rk3ESyRvljFgDJ g9ntn/ZwL8thxSZmYz2IDw6+tD5N9qOIhzDwekhmT6v3Z50fI6yxbkpNeaad1iu+ +zEyrM9rR6P3bH9JAUGHEWqqRp47WDR9E/AaisRymNJm00os0/69+MXi7Ky4DGHo uXBckLgsA7ynyrFwwoK8q932byPSl6F5aA5ATBARBEbNfn5mvzVXspzbDMOvydva NvItIKd4qM295dkRGI+dFZRJTjbIAQBPomOzb7K8imSoa+Xwxz0tcHNMUJB3WnX6 YxgWg1Fy3TSmHQbfUUgvf1TgLqYZriz1bW21tO2s5rBPV++NAb6+5VzSaxI4LK6w wPBHaPbhV8QlppYnET5OWYJsblVnYpoXYzjfcXizNtqMPdVxmsOKg4O8YFfgnYqj 10+Q8WbgBRaMbQHTqTbn7FKHTt5yDG8tSG2dGRu6wYTRc3iGlsjXtslFPs2ToFJD xabvr7T8VSbW7yABVyg6xIawzUen8Gns9xXL25bVMsHKJsPL4Y07f4t69/XwzqaW 3XBGya0VPd34FPolXu8P3MxRaGS98MTgJjjG485KopZLlh7HyF3f9kIc6w+1YvCj oI6VOu1YOGj4z09wWjYU =ALoI -----END PGP SIGNATURE-----
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c index 205c2e7..ee6b449 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c @@ -181,7 +181,7 @@ static struct gpio_keys_button wnr2000v3_gpio_keys[] __initdata = { } }; -static void __init wnr_common_setup(void) +static void __init wnr_common_setup(u8 *wmac_addr) { u8 *art = (u8 *) KSEG1ADDR(0x1fff0000); @@ -200,12 +200,30 @@ 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); + + /* + * 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); @@ -219,7 +237,7 @@ MIPS_MACHINE(ATH79_MACH_WNR2000_V3, "WNR2000V3", "NETGEAR WNR2000 V3", wnr2000v3 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); @@ -229,7 +247,7 @@ MIPS_MACHINE(ATH79_MACH_WNR612_V2, "WNR612V2", "NETGEAR WNR612 V2", wnr612v2_set 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); @@ -247,7 +265,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);