ar71xx: add support for TP-Link TL-WR942N v1
authorSerg Studzinskii <serguzhg@gmail.com>
Wed, 8 Mar 2017 20:10:05 +0000 (22:10 +0200)
committerPiotr Dymacz <pepe2k@gmail.com>
Sun, 11 Jun 2017 19:32:17 +0000 (21:32 +0200)
TP-Link TL-WR942N v1 is a 2.4 GHz single-band N450 router, based on
Qualcomm/Atheros QCA9561.

Specification:

- 775/650/258 MHz (CPU/DDR/AHB)
- 128 MB of RAM (DDR2)
- 16 MB of FLASH (SPI NOR)
- 3T3R 2.4 GHz
- 5x 10/100 Mbps Ethernet
- 2x USB 2.0
- 11x LED (most are controlled by 74HC595)
- 2x button
- UART header on PCB*

* Serial console is disabled in OEM non-beta firmwares and corresponding
  GPIO pins 14 and 15 are assigned to control USB1 and USB2 LEDs by
  production (non-beta) U-Boot and firmware.

Currently not working:

1. USB1 and USB2 LEDs if UART RX and TX pins are assigned to their GPIOs
   by some U-Boot versions.

Flash instruction under vendor GUI:

1. Download "lede-ar71xx-generic-tl-wr942n-v1-squashfs-factory.bin".
2. Go to WEB interface and perform usual firmware upgrade.

FLash instruction under U-Boot recovery mode (doesn't work in beta
firmware):

1. Setup PC with static IP "192.168.0.66/24" and tftp server.
2. Change "*-factory" image filename to "WR942v1_recovery.bin" and make
   it available to download from your tftp server.
3. Press "reset" button and power up the router, wait till "WPS" LED
   turns on.

Flash instruction under U-Boot, using UART (can be done only with
preinstalled UART-enabled U-Boot version!):

1. Use "tpl" to stop autobooting and obtain U-Boot CLI access.
2. Setup ip addresses for U-Boot and your tftp server.
3. Issue below commands:
   tftp 0x81000000 lede-ar71xx-generic-tl-wr942n-v1-sysupgrade.bin
   erase 0x9f020000 +$filesize
   cp.b 0x81000000 0x9f020000 $filesize
   reset

Signed-off-by: Serg Studzinskii <serguzhg@gmail.com>
[minor code style fixes, extended commit message]
Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>
15 files changed:
target/linux/ar71xx/base-files/etc/board.d/01_leds
target/linux/ar71xx/base-files/etc/board.d/02_network
target/linux/ar71xx/base-files/etc/diag.sh
target/linux/ar71xx/base-files/lib/ar71xx.sh
target/linux/ar71xx/base-files/lib/upgrade/platform.sh
target/linux/ar71xx/config-4.4
target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
target/linux/ar71xx/files/arch/mips/ath79/Makefile
target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr942n-v1.c [new file with mode: 0644]
target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
target/linux/ar71xx/files/arch/mips/ath79/nvram.c
target/linux/ar71xx/image/tp-link.mk
target/linux/ar71xx/mikrotik/config-default
target/linux/ar71xx/nand/config-default
tools/firmware-utils/src/tplink-safeloader.c

index 2f9ae8b10e3186f6a77e6a0f11b2f553857f24e9..be6dfcc9688d2c231d4f5dbaf3b7587a1dc33417 100755 (executable)
@@ -745,6 +745,16 @@ tl-wr840n-v3)
        ucidef_set_led_switch "lan" "LAN" "tp-link:green:lan" "switch0" "0x1E"
        ucidef_set_led_wlan "wlan" "WLAN" "tp-link:green:wlan" "phy0tpt"
        ;;
+tl-wr942n-v1)
+       ucidef_set_led_switch "lan1" "LAN1" "$board:green:lan1" "switch0" "0x04"
+       ucidef_set_led_switch "lan2" "LAN2" "$board:green:lan2" "switch0" "0x08"
+       ucidef_set_led_switch "lan3" "LAN3" "$board:green:lan3" "switch0" "0x10"
+       ucidef_set_led_switch "lan4" "LAN4" "$board:green:lan4" "switch0" "0x02"
+       ucidef_set_led_netdev "wan" "WAN" "$board:green:wan" "eth0"
+       ucidef_set_led_wlan "wlan" "WLAN" "$board:green:wlan" "phy0tpt"
+       ucidef_set_led_usbdev "usb1" "USB1" "$board:green:usb1" "1-1.2"
+       ucidef_set_led_usbdev "usb2" "USB2" "$board:green:usb2" "1-1.1"
+       ;;
 tl-wr1043nd|\
 tl-wr1043nd-v2)
        ucidef_set_led_usbdev "usb" "USB" "tp-link:green:usb" "1-1"
index 0dc8bf31a8d5d09b517105dcf7dc1d07553cdef4..b805487977698b9ddf0d4ee69f9a50969c28d20f 100755 (executable)
@@ -411,7 +411,8 @@ ar71xx_setup_interfaces()
        tl-mr3420-v2|\
        tl-wr841n-v8|\
        tl-wr842n-v2|\
-       tl-wr941nd-v5)
+       tl-wr941nd-v5|\
+       tl-wr942n-v1)
                ucidef_set_interfaces_lan_wan "eth1.1" "eth0"
                ucidef_add_switch "switch0" \
                        "0@eth1" "1:lan:4" "2:lan:1" "3:lan:2" "4:lan:3"
index ae43351c6a3d24000c89a0d23e77ebfe4034a2d1..369abde9d49e84f616363d19bc2496ca04ccf07a 100644 (file)
@@ -36,6 +36,7 @@ get_status_led() {
        db120|\
        dr344|\
        tew-632brp|\
+       tl-wr942n-v1|\
        wpj344|\
        zbt-we1526)
                status_led="$board:green:status"
index e781c6ee7e8793baee335e8840b76edc4927df87..5660d3eaa910b32c381a2fcb79a9a25e239ffc59 100755 (executable)
@@ -1166,6 +1166,9 @@ ar71xx_board_detect() {
        *"TL-WR941ND")
                name="tl-wr941nd"
                ;;
+       *"TL-WR942N v1")
+               name="tl-wr942n-v1"
+               ;;
        *"Tube2H")
                name="tube2h"
                ;;
index 16701f64ca97ced7723d4dc966f8351f30df749e..e14f8f3e49e53853bb722b20b50bfd232a7b8169 100755 (executable)
@@ -271,6 +271,7 @@ platform_check_image() {
        tew-712br|\
        tew-732br|\
        tew-823dru|\
+       tl-wr942n-v1|\
        unifi-outdoor|\
        unifiac-lite|\
        unifiac-pro|\
index 43a487d20e67adc8ed0f4a879bc1f544399bd8a4..df1108d9046c62b65d29e4f36a5f621496193e32 100644 (file)
@@ -209,6 +209,7 @@ CONFIG_ATH79_MACH_TL_WR841N_V9=y
 CONFIG_ATH79_MACH_TL_WR941ND=y
 CONFIG_ATH79_MACH_TL_WR941ND_V6=y
 CONFIG_ATH79_MACH_TL_WR940N_V4=y
+CONFIG_ATH79_MACH_TL_WR942N_V1=y
 CONFIG_ATH79_MACH_TUBE2H=y
 CONFIG_ATH79_MACH_UBNT=y
 CONFIG_ATH79_MACH_UBNT_UNIFIAC=y
index c18eec557d82167c1eb6f82014732797b4bc5500..ae64c6e92eaf8b7b203ac4b9d5bacb776dac4cd0 100644 (file)
@@ -1695,6 +1695,17 @@ config ATH79_MACH_TL_WR940N_V4
        select ATH79_DEV_M25P80
        select ATH79_DEV_WMAC
 
+config ATH79_MACH_TL_WR942N_V1
+       bool "TP-LINK TL-WR942N v1 support"
+       select SOC_QCA956X
+       select ATH79_DEV_ETH
+       select ATH79_DEV_GPIO_BUTTONS
+       select ATH79_DEV_LEDS_GPIO
+       select ATH79_DEV_M25P80
+       select ATH79_DEV_USB
+       select ATH79_DEV_WMAC
+       select ATH79_NVRAM
+
 config ATH79_MACH_TL_WR1041N_V2
        bool "TP-LINK TL-WR1041N v2 support"
        select SOC_AR934X
index 55c5a2a939381827d198fff93a871cc535bebbed..bf5515b4f346d537aba7b44121c5670b5a90cb60 100644 (file)
@@ -214,6 +214,7 @@ obj-$(CONFIG_ATH79_MACH_TL_WR841N_V9)               += mach-tl-wr841n-v9.o
 obj-$(CONFIG_ATH79_MACH_TL_WR941ND)            += mach-tl-wr941nd.o
 obj-$(CONFIG_ATH79_MACH_TL_WR941ND_V6)         += mach-tl-wr941nd-v6.o
 obj-$(CONFIG_ATH79_MACH_TL_WR940N_V4)          += mach-tl-wr940n-v4.o
+obj-$(CONFIG_ATH79_MACH_TL_WR942N_V1)          += mach-tl-wr942n-v1.o
 obj-$(CONFIG_ATH79_MACH_TUBE2H)                        += mach-tube2h.o
 obj-$(CONFIG_ATH79_MACH_UBNT)                  += mach-ubnt.o
 obj-$(CONFIG_ATH79_MACH_UBNT_UNIFIAC)          += mach-ubnt-unifiac.o
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr942n-v1.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr942n-v1.c
new file mode 100644 (file)
index 0000000..7291040
--- /dev/null
@@ -0,0 +1,279 @@
+/*
+ *  TP-Link TL-WR942N(RU) v1 board support
+ *
+ *  Copyright (C) 2017 Sergey Studzinski <serguzhg@gmail.com>
+ *  Thanks to Henryk Heisig <hyniu@o2.pl>
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License version 2 as published
+ *  by the Free Software Foundation.
+ */
+
+#include <linux/platform_device.h>
+#include <linux/ath9k_platform.h>
+#include <asm/mach-ath79/ar71xx_regs.h>
+#include <linux/gpio.h>
+#include <linux/init.h>
+#include <linux/spi/spi_gpio.h>
+#include <linux/spi/74x164.h>
+
+#include "common.h"
+#include "dev-m25p80.h"
+#include "machtypes.h"
+#include "dev-eth.h"
+#include "dev-gpio-buttons.h"
+#include "dev-leds-gpio.h"
+#include "dev-spi.h"
+#include "dev-usb.h"
+#include "dev-wmac.h"
+#include "nvram.h"
+
+#define TL_WR942N_V1_KEYS_POLL_INTERVAL                20
+#define TL_WR942N_V1_KEYS_DEBOUNCE_INTERVAL    \
+                                       (3 * TL_WR942N_V1_KEYS_POLL_INTERVAL)
+
+#define TL_WR942N_V1_GPIO_BTN_RESET            1
+#define TL_WR942N_V1_GPIO_BTN_RFKILL           2
+
+#define TL_WR942N_V1_GPIO_UART_TX              4
+#define TL_WR942N_V1_GPIO_UART_RX              5
+
+#define TL_WR942N_V1_GPIO_LED_USB2             14
+#define TL_WR942N_V1_GPIO_LED_USB1             15
+
+#define TL_WR942N_V1_GPIO_SHIFT_OE             16
+#define TL_WR942N_V1_GPIO_SHIFT_SER            17
+#define TL_WR942N_V1_GPIO_SHIFT_SRCLK          18
+#define TL_WR942N_V1_GPIO_SHIFT_SRCLR          19
+#define TL_WR942N_V1_GPIO_SHIFT_RCLK           20
+#define TL_WR942N_V1_GPIO_LED_WPS              21
+#define TL_WR942N_V1_GPIO_LED_STATUS           22
+
+#define TL_WR942N_V1_74HC_GPIO_BASE            QCA956X_GPIO_COUNT
+#define TL_WR942N_V1_74HC_GPIO_LED_LAN4                23
+#define TL_WR942N_V1_74HC_GPIO_LED_LAN3                24
+#define TL_WR942N_V1_74HC_GPIO_LED_LAN2                25
+#define TL_WR942N_V1_74HC_GPIO_LED_LAN1                26
+#define TL_WR942N_V1_74HC_GPIO_LED_WAN_GREEN   27
+#define TL_WR942N_V1_74HC_GPIO_LED_WAN_AMBER   28
+#define TL_WR942N_V1_74HC_GPIO_LED_WLAN                29
+#define TL_WR942N_V1_74HC_GPIO_HUB_RESET       30 /* from u-boot sources */
+
+#define TL_WR942N_V1_SSR_BIT_0                 0
+#define TL_WR942N_V1_SSR_BIT_1                 1
+#define TL_WR942N_V1_SSR_BIT_2                 2
+#define TL_WR942N_V1_SSR_BIT_3                 3
+#define TL_WR942N_V1_SSR_BIT_4                 4
+#define TL_WR942N_V1_SSR_BIT_5                 5
+#define TL_WR942N_V1_SSR_BIT_6                 6
+#define TL_WR942N_V1_SSR_BIT_7                 7
+
+#define TL_WR942N_V1_WMAC_CALDATA_OFFSET       0x1000
+#define TL_WR942N_V1_DEFAULT_MAC_ADDR          0x1fe40008
+#define TL_WR942N_V1_DEFAULT_MAC_SIZE          0x200
+
+#define GPIO_IN_ENABLE0_UART_SIN_LSB           8
+#define GPIO_IN_ENABLE0_UART_SIN_MASK          0x0000ff00
+
+static struct gpio_led tl_wr942n_v1_leds_gpio[] __initdata = {
+       {
+               .name           = "tl-wr942n-v1:green:status",
+               .gpio           = TL_WR942N_V1_GPIO_LED_STATUS,
+               .active_low     = 1,
+       }, {
+               .name           = "tl-wr942n-v1:green:wlan",
+               .gpio           = TL_WR942N_V1_74HC_GPIO_LED_WLAN,
+               .active_low     = 1,
+       }, {
+               .name           = "tl-wr942n-v1:green:lan1",
+               .gpio           = TL_WR942N_V1_74HC_GPIO_LED_LAN1,
+               .active_low     = 1,
+       }, {
+               .name           = "tl-wr942n-v1:green:lan2",
+               .gpio           = TL_WR942N_V1_74HC_GPIO_LED_LAN2,
+               .active_low     = 1,
+       }, {
+               .name           = "tl-wr942n-v1:green:lan3",
+               .gpio           = TL_WR942N_V1_74HC_GPIO_LED_LAN3,
+               .active_low     = 1,
+       }, {
+               .name           = "tl-wr942n-v1:green:lan4",
+               .gpio           = TL_WR942N_V1_74HC_GPIO_LED_LAN4,
+               .active_low     = 1,
+       }, {
+               .name           = "tl-wr942n-v1:green:wan",
+               .gpio           = TL_WR942N_V1_74HC_GPIO_LED_WAN_GREEN,
+               .active_low     = 1,
+       }, {
+               .name           = "tl-wr942n-v1:amber:wan",
+               .gpio           = TL_WR942N_V1_74HC_GPIO_LED_WAN_AMBER,
+               .active_low     = 1,
+       }, {
+               .name           = "tl-wr942n-v1:green:wps",
+               .gpio           = TL_WR942N_V1_GPIO_LED_WPS,
+               .active_low     = 1,
+       }, {
+               .name           = "tl-wr942n-v1:green:usb1",
+               .gpio           = TL_WR942N_V1_GPIO_LED_USB1,
+               .active_low     = 1,
+       }, {
+               .name           = "tl-wr942n-v1:green:usb2",
+               .gpio           = TL_WR942N_V1_GPIO_LED_USB2,
+               .active_low     = 1,
+       },
+};
+
+static struct gpio_keys_button tl_wr942n_v1_gpio_keys[] __initdata = {
+       {
+               .desc                   = "Reset button",
+               .type                   = EV_KEY,
+               .code                   = KEY_RESTART,
+               .debounce_interval      = TL_WR942N_V1_KEYS_DEBOUNCE_INTERVAL,
+               .gpio                   = TL_WR942N_V1_GPIO_BTN_RESET,
+               .active_low             = 1,
+       }, {
+               .desc                   = "RFKILL button",
+               .type                   = EV_KEY,
+               .code                   = KEY_RFKILL,
+               .debounce_interval      = TL_WR942N_V1_KEYS_DEBOUNCE_INTERVAL,
+               .gpio                   = TL_WR942N_V1_GPIO_BTN_RFKILL,
+               .active_low             = 1,
+       },
+};
+
+static struct spi_gpio_platform_data tl_wr942n_v1_spi_data = {
+       .sck            = TL_WR942N_V1_GPIO_SHIFT_SRCLK,
+       .miso           = SPI_GPIO_NO_MISO,
+       .mosi           = TL_WR942N_V1_GPIO_SHIFT_SER,
+       .num_chipselect = 1,
+};
+
+static u8 tl_wr942n_v1_ssr_initdata[] __initdata = {
+       BIT(TL_WR942N_V1_SSR_BIT_7) |
+       BIT(TL_WR942N_V1_SSR_BIT_6) |
+       BIT(TL_WR942N_V1_SSR_BIT_5) |
+       BIT(TL_WR942N_V1_SSR_BIT_4) |
+       BIT(TL_WR942N_V1_SSR_BIT_3) |
+       BIT(TL_WR942N_V1_SSR_BIT_2) |
+       BIT(TL_WR942N_V1_SSR_BIT_1) |
+       BIT(TL_WR942N_V1_SSR_BIT_0)
+};
+
+static struct gen_74x164_chip_platform_data tl_wr942n_v1_ssr_data = {
+       .base           = TL_WR942N_V1_74HC_GPIO_BASE,
+       .num_registers  = ARRAY_SIZE(tl_wr942n_v1_ssr_initdata),
+       .init_data      = tl_wr942n_v1_ssr_initdata,
+};
+
+static struct platform_device tl_wr942n_v1_spi_device = {
+       .name           = "spi_gpio",
+       .id             = 1,
+       .dev = {
+               .platform_data = &tl_wr942n_v1_spi_data,
+       },
+};
+
+static struct spi_board_info tl_wr942n_v1_spi_info[] = {
+       {
+               .bus_num                = 1,
+               .chip_select            = 0,
+               .max_speed_hz           = 10000000,
+               .modalias               = "74x164",
+               .platform_data          = &tl_wr942n_v1_ssr_data,
+               .controller_data        = (void *) TL_WR942N_V1_GPIO_SHIFT_RCLK,
+       },
+};
+
+static void tl_wr942n_v1_get_mac(const char *name, char *mac)
+{
+       u8 *nvram = (u8 *) KSEG1ADDR(TL_WR942N_V1_DEFAULT_MAC_ADDR);
+       int err;
+
+       err = ath79_nvram_parse_mac_addr(nvram, TL_WR942N_V1_DEFAULT_MAC_SIZE,
+                                        name, mac);
+
+       if (err)
+               pr_err("no MAC address found for %s\n", name);
+}
+
+static void __init tl_wr942n_v1_setup(void)
+{
+       u8 *art = (u8 *) KSEG1ADDR(0x1fff0000);
+       u8 tmpmac[ETH_ALEN];
+       void __iomem *base;
+       u32 t;
+
+       ath79_register_m25p80(NULL);
+
+       spi_register_board_info(tl_wr942n_v1_spi_info,
+                               ARRAY_SIZE(tl_wr942n_v1_spi_info));
+       platform_device_register(&tl_wr942n_v1_spi_device);
+
+       /* Check inherited UART RX GPIO definition */
+       base = ioremap(AR71XX_GPIO_BASE, AR71XX_GPIO_SIZE);
+
+       t = __raw_readl(base + QCA956X_GPIO_REG_IN_ENABLE0);
+       if (((t & GPIO_IN_ENABLE0_UART_SIN_MASK)
+            >> GPIO_IN_ENABLE0_UART_SIN_LSB) == TL_WR942N_V1_GPIO_LED_USB1) {
+               pr_warn("Active UART detected on USBLED's GPIOs!\n");
+
+               tl_wr942n_v1_leds_gpio[9].gpio = TL_WR942N_V1_GPIO_UART_TX;
+               tl_wr942n_v1_leds_gpio[10].gpio = TL_WR942N_V1_GPIO_UART_RX;
+       }
+
+       ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wr942n_v1_leds_gpio),
+                                tl_wr942n_v1_leds_gpio);
+
+       ath79_register_gpio_keys_polled(-1, TL_WR942N_V1_KEYS_POLL_INTERVAL,
+                                       ARRAY_SIZE(tl_wr942n_v1_gpio_keys),
+                                       tl_wr942n_v1_gpio_keys);
+
+       tl_wr942n_v1_get_mac("MAC:", tmpmac);
+
+       /* swap PHYs */
+       ath79_setup_qca956x_eth_cfg(QCA956X_ETH_CFG_SW_PHY_SWAP |
+                                   QCA956X_ETH_CFG_SW_PHY_ADDR_SWAP);
+
+       ath79_register_mdio(0, 0x0);
+       ath79_register_mdio(1, 0x0);
+
+       /* WAN port */
+       ath79_init_mac(ath79_eth0_data.mac_addr, tmpmac, 1);
+       ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
+       ath79_eth0_data.speed = SPEED_100;
+       ath79_eth0_data.duplex = DUPLEX_FULL;
+
+       /* swaped PHYs */
+       ath79_eth0_data.phy_mask = BIT(0);
+       ath79_register_eth(0);
+
+       /* LAN ports */
+       ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII;
+       ath79_init_mac(ath79_eth1_data.mac_addr, tmpmac, 0);
+       ath79_eth1_data.speed = SPEED_1000;
+       ath79_eth1_data.duplex = DUPLEX_FULL;
+
+       /* swaped PHYs */
+       ath79_switch_data.phy_poll_mask |= BIT(0);
+       ath79_switch_data.phy4_mii_en = 1;
+       ath79_register_eth(1);
+
+       ath79_register_wmac(art + TL_WR942N_V1_WMAC_CALDATA_OFFSET, tmpmac);
+
+       ath79_register_usb();
+
+       gpio_request_one(TL_WR942N_V1_74HC_GPIO_HUB_RESET,
+                        GPIOF_OUT_INIT_HIGH | GPIOF_EXPORT_DIR_FIXED,
+                        "USB power");
+
+       gpio_request_one(TL_WR942N_V1_GPIO_SHIFT_OE,
+                        GPIOF_OUT_INIT_LOW | GPIOF_EXPORT_DIR_FIXED,
+                        "LED control");
+
+       gpio_request_one(TL_WR942N_V1_GPIO_SHIFT_SRCLR,
+                        GPIOF_OUT_INIT_HIGH | GPIOF_EXPORT_DIR_FIXED,
+                        "LED reset");
+}
+
+MIPS_MACHINE(ATH79_MACH_TL_WR942N_V1, "TL-WR942N-V1", "TP-LINK TL-WR942N v1",
+            tl_wr942n_v1_setup);
index 0d05086a1c36ed0f32b4d738dd9e6b9683f03de6..46d250d47d40288c1bf5b2e5df6f004f4b25d707 100644 (file)
@@ -262,6 +262,7 @@ enum ath79_mach_type {
        ATH79_MACH_TL_WR941ND_V5,               /* TP-LINK TL-WR941ND v5 */
        ATH79_MACH_TL_WR941ND_V6,               /* TP-LINK TL-WR941ND v6 */
        ATH79_MACH_TL_WR940N_V4,                /* TP-LINK TL-WR940N v4 */
+       ATH79_MACH_TL_WR942N_V1,                /* TP-LINK TL-WR942N v1 */
        ATH79_MACH_TUBE2H,                      /* Alfa Network Tube2H */
        ATH79_MACH_UBNT_AIRGW,                  /* Ubiquiti AirGateway */
        ATH79_MACH_UBNT_AIRGWP,                 /* Ubiquiti AirGateway Pro */
index e55af5abe223b403dd3f8c795038a27f9297d47e..a1de55fb19937c9cb67c40731e456b88d9f18337 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/errno.h>
 #include <linux/init.h>
 #include <linux/string.h>
+#include <linux/etherdevice.h>
 
 #include "nvram.h"
 
@@ -67,7 +68,11 @@ int ath79_nvram_parse_mac_addr(const char *nvram, unsigned nvram_len,
        t = sscanf(mac_str, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
                   &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]);
 
-       if (t != 6) {
+       if (t != ETH_ALEN)
+               t = sscanf(mac_str, "%02hhx-%02hhx-%02hhx-%02hhx-%02hhx-%02hhx",
+                       &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]);
+
+       if (t != ETH_ALEN) {
                ret = -EINVAL;
                goto free;
        }
index 5ac641bf361d3ea8c2c76e4a08b2fa1229c41b6e..d9c7982e8c1ed9afdf9c42cf187c5738b7edfb99 100644 (file)
@@ -873,6 +873,21 @@ define Device/tl-wr941nd-v6-cn
 endef
 TARGET_DEVICES += tl-wr941nd-v2 tl-wr941nd-v3 tl-wr941nd-v4 tl-wr941nd-v5 tl-wr941nd-v6 tl-wr941nd-v6-cn tl-wr940n-v4
 
+define Device/tl-wr942n-v1
+  DEVICE_TITLE := TP-LINK TL-WR942N v1
+  DEVICE_PACKAGES := kmod-usb-core kmod-usb2 kmod-usb-ledtrig-usbport
+  BOARDNAME := TL-WR942N-V1
+  TPLINK_BOARD_NAME := TLWR942NV1
+  DEVICE_PROFILE := TLWR942
+  IMAGE_SIZE := 14464k
+  KERNEL := kernel-bin | patch-cmdline | lzma | uImageArcher lzma
+  IMAGES := sysupgrade.bin factory.bin
+  IMAGE/sysupgrade.bin := append-rootfs | tplink-safeloader sysupgrade
+  IMAGE/factory.bin := append-rootfs | tplink-safeloader factory
+  MTDPARTS := spi0.0:128k(u-boot)ro,1344k(kernel),13120k(rootfs),64k(product-info)ro,64k(partition-table)ro,256k(oem-config)ro,1344k(oem-vars)ro,64k(ART)ro,14464k@0x20000(firmware)
+endef
+TARGET_DEVICES += tl-wr942n-v1
+
 define Device/tl-wr1041n-v2
   $(Device/tplink-4mlzma)
   DEVICE_TITLE := TP-LINK TL-WR1041N v2
index 5c665801fe63f6c9e25c2ccca37160649da26c0e..748252ce480038de271d9274b1c1934682c767a1 100644 (file)
@@ -172,6 +172,7 @@ CONFIG_ATH79_MACH_RBSXTLITE=y
 # CONFIG_ATH79_MACH_TL_WR940N_V4 is not set
 # CONFIG_ATH79_MACH_TL_WR941ND is not set
 # CONFIG_ATH79_MACH_TL_WR941ND_V6 is not set
+# CONFIG_ATH79_MACH_TL_WR942N_V1 is not set
 # CONFIG_ATH79_MACH_TUBE2H is not set
 # CONFIG_ATH79_MACH_UBNT is not set
 # CONFIG_ATH79_MACH_UBNT_UNIFIAC is not set
index cc2b25c1af07df67ce6141c1c92d0fdfe181f079..7ae42fe8b98a2d06186b6748954d82bcca9e391b 100644 (file)
@@ -160,6 +160,7 @@ CONFIG_ATH79_MACH_RAMBUTAN=y
 # CONFIG_ATH79_MACH_TL_WR940N_V4 is not set
 # CONFIG_ATH79_MACH_TL_WR941ND is not set
 # CONFIG_ATH79_MACH_TL_WR941ND_V6 is not set
+# CONFIG_ATH79_MACH_TL_WR942N_V1 is not set
 # CONFIG_ATH79_MACH_TUBE2H is not set
 # CONFIG_ATH79_MACH_UBNT is not set
 # CONFIG_ATH79_MACH_UBNT_UNIFIAC is not set
index 9c9efc369c23e068687d37122aa8b4879a49d096..31b374f523277dd40f6cfd5104eb3d902cb95e1c 100644 (file)
@@ -553,6 +553,43 @@ static struct device_info boards[] = {
                .last_sysupgrade_partition = "file-system"
        },
 
+       /** Firmware layout for the TL-WR942N V1 */
+       {
+               .id     = "TLWR942NV1",
+               .vendor = "",
+               .support_list =
+                       "SupportList:\r\n"
+                       "{product_name:TL-WR942N,product_ver:1.0.0,special_id:00000000}\r\n"
+                       "{product_name:TL-WR942N,product_ver:1.0.0,special_id:52550000}\r\n",
+               .support_trail = '\x00',
+               .soft_ver = NULL,
+
+               .partitions = {
+                       {"fs-uboot", 0x00000, 0x20000},
+                       {"os-image", 0x20000, 0x150000},
+                       {"file-system", 0x170000, 0xcd0000},
+                       {"default-mac", 0xe40000, 0x00200},
+                       {"pin", 0xe40200, 0x00200},
+                       {"product-info", 0xe40400, 0x0fc00},
+                       {"partition-table", 0xe50000, 0x10000},
+                       {"soft-version", 0xe60000, 0x10000},
+                       {"support-list", 0xe70000, 0x10000},
+                       {"profile", 0xe80000, 0x10000},
+                       {"default-config", 0xe90000, 0x10000},
+                       {"user-config", 0xea0000, 0x40000},
+                       {"qos-db", 0xee0000, 0x40000},
+                       {"certificate", 0xf20000, 0x10000},
+                       {"usb-config", 0xfb0000, 0x10000},
+                       {"log", 0xfc0000, 0x20000},
+                       {"radio-bk", 0xfe0000, 0x10000},
+                       {"radio", 0xff0000, 0x10000},
+                       {NULL, 0, 0}
+               },
+
+               .first_sysupgrade_partition = "os-image",
+               .last_sysupgrade_partition = "file-system",
+       },
+
        /** Firmware layout for the RE450 */
        {
                .id = "RE450",