diff mbox

[LEDE-DEV] ar71xx: add support for RB-941-2nD

Message ID 20170104220438.057BA120082@vps.slashirt.org
State Accepted
Headers show

Commit Message

Thibaut Jan. 4, 2017, 10:04 p.m. UTC
From e55aa1ddff1563d582b456807f20c0457fcaed77 Mon Sep 17 00:00:00 2001
From: Thibaut VARENE <hacks@slashdirt.org>
Date: Wed, 4 Jan 2017 22:44:54 +0100
Subject: [PATCH] ar71xx: add support for RB-941-2nD

Add full support for Mikrotik RB-941-2nD (hAP lite)

Original patch by Sergey Sergeev <adron@yapic.net> and
more information is available here:
https://wiki.openwrt.org/toh/mikrotik/rb941_2nd
I updated and adapted the patch to apply cleanly to LEDE trunk
and added proper numbering for the switch ports (matching case
labels).
Tested working on actual hardware with the information
provided in the above webpage. Sysupgrade works.

Signed-off-by: Thibaut VARENE <hacks@slashdirt.org>
---
 target/linux/ar71xx/base-files/etc/board.d/01_leds |   3 +
 .../linux/ar71xx/base-files/etc/board.d/02_network |   4 +
 target/linux/ar71xx/base-files/etc/diag.sh         |   2 +-
 target/linux/ar71xx/base-files/lib/ar71xx.sh       |   3 +
 .../ar71xx/base-files/lib/upgrade/platform.sh      |  29 +++-
 target/linux/ar71xx/config-4.4                     |   1 +
 .../ar71xx/files/arch/mips/ath79/Kconfig.openwrt   |  10 ++
 target/linux/ar71xx/files/arch/mips/ath79/Makefile |   1 +
 .../ar71xx/files/arch/mips/ath79/mach-rb941.c      | 174 +++++++++++++++++++++
 .../linux/ar71xx/files/arch/mips/ath79/machtypes.h |   1 +
 target/linux/ar71xx/image/legacy.mk                |  23 +++
 .../linux/ar71xx/mikrotik/profiles/03-norflash.mk  |  16 ++
 12 files changed, 263 insertions(+), 4 deletions(-)
 create mode 100644 target/linux/ar71xx/files/arch/mips/ath79/mach-rb941.c
 create mode 100644 target/linux/ar71xx/mikrotik/profiles/03-norflash.mk

Comments

Felix Fietkau Jan. 9, 2017, 7:18 p.m. UTC | #1
On 2017-01-04 23:04, "Thibaut VARENE
<hacks@slashdirt.org>"@vps.slashdirt.org wrote:
> From e55aa1ddff1563d582b456807f20c0457fcaed77 Mon Sep 17 00:00:00 2001
> From: Thibaut VARENE <hacks@slashdirt.org>
> Date: Wed, 4 Jan 2017 22:44:54 +0100
> Subject: [PATCH] ar71xx: add support for RB-941-2nD
> 
> Add full support for Mikrotik RB-941-2nD (hAP lite)
> 
> Original patch by Sergey Sergeev <adron@yapic.net> and
> more information is available here:
> https://wiki.openwrt.org/toh/mikrotik/rb941_2nd
> I updated and adapted the patch to apply cleanly to LEDE trunk
> and added proper numbering for the switch ports (matching case
> labels).
> Tested working on actual hardware with the information
> provided in the above webpage. Sysupgrade works.
> 
> Signed-off-by: Thibaut VARENE <hacks@slashdirt.org>
I've pushed a modified version of your patch to my staging tree, please
check if it's still correct.

Thanks,

- Felix
Thibaut Jan. 9, 2017, 8:55 p.m. UTC | #2
> Le 9 janv. 2017 à 20:18, Felix Fietkau <nbd@nbd.name> a écrit :
> 
> On 2017-01-04 23:04, "Thibaut VARENE
> <hacks@slashdirt.org>"@vps.slashdirt.org wrote:
>> From e55aa1ddff1563d582b456807f20c0457fcaed77 Mon Sep 17 00:00:00 2001
>> From: Thibaut VARENE <hacks@slashdirt.org>
>> Date: Wed, 4 Jan 2017 22:44:54 +0100
>> Subject: [PATCH] ar71xx: add support for RB-941-2nD
>> 
>> Add full support for Mikrotik RB-941-2nD (hAP lite)
>> 
>> Original patch by Sergey Sergeev <adron@yapic.net> and
>> more information is available here:
>> https://wiki.openwrt.org/toh/mikrotik/rb941_2nd
>> I updated and adapted the patch to apply cleanly to LEDE trunk
>> and added proper numbering for the switch ports (matching case
>> labels).
>> Tested working on actual hardware with the information
>> provided in the above webpage. Sysupgrade works.
>> 
>> Signed-off-by: Thibaut VARENE <hacks@slashdirt.org>
> I've pushed a modified version of your patch to my staging tree, please
> check if it's still correct.

I can confirm it builds fine with the .config I used to build my last image. As for proper testing I will only be able to do it in a couple weeks as I’m currently away from home…

Cheers,
Thibaut
diff mbox

Patch

diff --git a/target/linux/ar71xx/base-files/etc/board.d/01_leds b/target/linux/ar71xx/base-files/etc/board.d/01_leds
index c6dcf36..75b5142 100755
--- a/target/linux/ar71xx/base-files/etc/board.d/01_leds
+++ b/target/linux/ar71xx/base-files/etc/board.d/01_leds
@@ -199,6 +199,9 @@  rb-750)
 	ucidef_set_led_switch "port4" "port4" "rb750:green:port4" "switch0" "0x04"
 	ucidef_set_led_switch "port5" "port5" "rb750:green:port5" "switch0" "0x02"
 	;;
+rb-941-2nd)
+	ucidef_set_led_timer "act" "act" "rb:green:act" "1000" "1000"
+	;;
 rb-2011l|\
 rb-2011uas|\
 rb-2011uias|\
diff --git a/target/linux/ar71xx/base-files/etc/board.d/02_network b/target/linux/ar71xx/base-files/etc/board.d/02_network
index 8acd214..6fd9601 100755
--- a/target/linux/ar71xx/base-files/etc/board.d/02_network
+++ b/target/linux/ar71xx/base-files/etc/board.d/02_network
@@ -237,6 +237,10 @@  ar71xx_setup_interfaces()
 	dap-2695-a1)
 		ucidef_add_switch "switch0" "0@eth0" "2:lan" "3:wan" "6@eth1"
 		;;
+	rb-941-2nd)
+		ucidef_add_switch "switch0" \
+			"0@eth0" "1:lan:4" "2:lan:3" "3:lan:2" "4:wan:1"
+	;;
 	db120|\
 	rb-2011l|\
 	rb-2011uas|\
diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh
index d060ccf..75c6c9a 100644
--- a/target/linux/ar71xx/base-files/etc/diag.sh
+++ b/target/linux/ar71xx/base-files/etc/diag.sh
@@ -288,7 +288,7 @@  get_status_led() {
 	rb-912uag-5hpnd)
 		status_led="rb:green:user"
 		;;
-	rb-951ui-2hnd)
+	rb-951ui-2hnd | rb-941-2nd)
 		status_led="rb:green:act"
 		;;
 	rb-sxt2n|\
diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh
index 3241100..527112b 100755
--- a/target/linux/ar71xx/base-files/lib/ar71xx.sh
+++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh
@@ -827,6 +827,9 @@  ar71xx_board_detect() {
 	*"RouterBOARD 912UAG-5HPnD")
 		name="rb-912uag-5hpnd"
 		;;
+	*"RouterBOARD 941-2nD")
+		name="rb-941-2nd"
+		;;
 	*"RouterBOARD 951G-2HnD")
 		name="rb-951g-2hnd"
 		;;
diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
index 570aa68..5847125 100755
--- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
@@ -11,6 +11,8 @@  RAMFS_COPY_DATA=/lib/ar71xx.sh
 CI_BLKSZ=65536
 CI_LDADR=0x80060000
 
+PLATFORM_DO_UPGRADE_COMBINED_SEPARATE_MTD=0
+
 platform_find_partitions() {
 	local first dev size erasesize name
 	while read dev size erasesize name; do
@@ -40,6 +42,13 @@  platform_find_kernelpart() {
 	done
 }
 
+platform_find_rootfspart() {
+	local part
+	for part in "${1%:*}" "${1#*:}"; do
+		[ "$part" != "$2" ] && echo "$part"; break
+	done
+}
+
 platform_do_upgrade_combined() {
 	local partitions=$(platform_find_partitions)
 	local kernelpart=$(platform_find_kernelpart "${partitions#*:}")
@@ -53,13 +62,22 @@  platform_do_upgrade_combined() {
 	   [ ${root_blocks:-0} -gt 0 ] && \
 	   [ ${erase_size:-0} -gt 0 ];
 	then
+		local rootfspart=$(platform_find_rootfspart "$partitions" "$kernelpart")
 		local append=""
 		[ -f "$CONF_TAR" -a "$SAVE_CONFIG" -eq 1 ] && append="-j $CONF_TAR"
 
-		( dd if="$1" bs=$CI_BLKSZ skip=1 count=$kern_blocks 2>/dev/null; \
-		  dd if="$1" bs=$CI_BLKSZ skip=$((1+$kern_blocks)) count=$root_blocks 2>/dev/null ) | \
-			mtd -r $append -F$kernelpart:$kern_length:$CI_LDADR,rootfs write - $partitions
+		if [ "$PLATFORM_DO_UPGRADE_COMBINED_SEPARATE_MTD" -ne 1 ]; then
+		    ( dd if="$1" bs=$CI_BLKSZ skip=1 count=$kern_blocks 2>/dev/null; \
+		      dd if="$1" bs=$CI_BLKSZ skip=$((1+$kern_blocks)) count=$root_blocks 2>/dev/null ) | \
+			    mtd -r $append -F$kernelpart:$kern_length:$CI_LDADR,rootfs write - $partitions
+		elif [ -n "$rootfspart" ]; then
+		    dd if="$1" bs=$CI_BLKSZ skip=1 count=$kern_blocks 2>/dev/null | \
+			    mtd write - $kernelpart
+		    dd if="$1" bs=$CI_BLKSZ skip=$((1+$kern_blocks)) count=$root_blocks 2>/dev/null | \
+			    mtd -r $append write - $rootfspart
+		fi
 	fi
+	PLATFORM_DO_UPGRADE_COMBINED_SEPARATE_MTD=0
 }
 
 tplink_get_image_hwid() {
@@ -308,6 +326,7 @@  platform_check_image() {
 	ls-sr71|\
 	pb42|\
 	pb44|\
+	rb-941-2nd|\
 	routerstation-pro|\
 	routerstation|\
 	wp543|\
@@ -586,6 +605,10 @@  platform_do_upgrade() {
 	local board=$(ar71xx_board_name)
 
 	case "$board" in
+	rb-941-2nd)
+		PLATFORM_DO_UPGRADE_COMBINED_SEPARATE_MTD=1
+		platform_do_upgrade_combined "$ARGV"
+		;;
 	all0258n)
 		platform_do_upgrade_allnet "0x9f050000" "$ARGV"
 		;;
diff --git a/target/linux/ar71xx/config-4.4 b/target/linux/ar71xx/config-4.4
index 4b2f736..a79d53e 100644
--- a/target/linux/ar71xx/config-4.4
+++ b/target/linux/ar71xx/config-4.4
@@ -143,6 +143,7 @@  CONFIG_ATH79_MACH_R6100=y
 # CONFIG_ATH79_MACH_RB750 is not set
 # CONFIG_ATH79_MACH_RB91X is not set
 # CONFIG_ATH79_MACH_RB922 is not set
+# CONFIG_ATH79_MACH_RB941 is not set
 # CONFIG_ATH79_MACH_RB95X is not set
 # CONFIG_ATH79_MACH_RBSXTLITE is not set
 CONFIG_ATH79_MACH_RE450=y
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
index 21d6b51..b38c30a 100644
--- a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
+++ b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
@@ -860,6 +860,16 @@  config ATH79_MACH_RB922
 	select ATH79_ROUTERBOOT
 	select RLE_DECOMPRESS
 
+config ATH79_MACH_RB941
+	bool "MikroTik RouterBOARD 941-2nd support"
+	select SOC_QCA953X
+	select ATH79_DEV_ETH
+	select ATH79_DEV_GPIO_BUTTONS
+	select ATH79_DEV_LEDS_GPIO
+	select ATH79_DEV_M25P80
+	select ATH79_DEV_WMAC
+	select ATH79_ROUTERBOOT
+
 config ATH79_MACH_RB95X
        bool "MikroTik RouterBOARD 95X support"
        select SOC_AR934X
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Makefile b/target/linux/ar71xx/files/arch/mips/ath79/Makefile
index 6384c06..03bbe21 100644
--- a/target/linux/ar71xx/files/arch/mips/ath79/Makefile
+++ b/target/linux/ar71xx/files/arch/mips/ath79/Makefile
@@ -147,6 +147,7 @@  obj-$(CONFIG_ATH79_MACH_RB4XX)			+= mach-rb4xx.o
 obj-$(CONFIG_ATH79_MACH_RB750)			+= mach-rb750.o
 obj-$(CONFIG_ATH79_MACH_RB91X)			+= mach-rb91x.o
 obj-$(CONFIG_ATH79_MACH_RB922)			+= mach-rb922.o
+obj-$(CONFIG_ATH79_MACH_RB941)			+= mach-rb941.o
 obj-$(CONFIG_ATH79_MACH_RB95X)			+= mach-rb95x.o
 obj-$(CONFIG_ATH79_MACH_RBSXTLITE)		+= mach-rbsxtlite.o
 obj-$(CONFIG_ATH79_MACH_RE450)			+= mach-re450.o
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-rb941.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-rb941.c
new file mode 100644
index 0000000..5a8c7c0
--- /dev/null
+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-rb941.c
@@ -0,0 +1,174 @@ 
+/*
+ *  MikroTik RouterBOARD 941-2nD support
+ *
+ *  Copyright (C) 2016 Sergey Sergeev <adron@yapic.net>
+ *
+ *  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/export.h>
+#include <linux/pci.h>
+#include <linux/ath9k_platform.h>
+#include <linux/platform_device.h>
+#include <linux/phy.h>
+#include <linux/ar8216_platform.h>
+#include <linux/rle.h>
+#include <linux/routerboot.h>
+#include <linux/gpio.h>
+
+#include <linux/mtd/mtd.h>
+//#include <linux/mtd/nand.h>
+#include <linux/mtd/partitions.h>
+
+#include <asm/mach-ath79/ar71xx_regs.h>
+#include <asm/mach-ath79/ath79.h>
+#include <asm/mach-ath79/irq.h>
+
+#include "common.h"
+#include "dev-ap9x-pci.h"
+#include "dev-eth.h"
+#include "dev-spi.h"
+#include "dev-gpio-buttons.h"
+#include "dev-leds-gpio.h"
+#include "dev-m25p80.h"
+//#include "dev-usb.h"
+#include "dev-wmac.h"
+#include "machtypes.h"
+#include "routerboot.h"
+
+#define RB941_GPIO_LED_ACT      14
+#define RB941_GPIO_BTN_RESET    16
+
+#define RB941_KEYS_POLL_INTERVAL 20 /* msecs */
+#define RB941_KEYS_DEBOUNCE_INTERVAL (3 * RB941_KEYS_POLL_INTERVAL)
+
+#define RB_ROUTERBOOT_OFFSET    0x0000
+#define RB_ROUTERBOOT_SIZE      0xe000
+#define RB_HARD_CFG_OFFSET      0xe000
+#define RB_HARD_CFG_SIZE        0x1000
+#define RB_BIOS_OFFSET          0xf000
+#define RB_BIOS_SIZE            0x1000
+#define RB_ROUTERBOOT2_OFFSET   0x10000
+#define RB_ROUTERBOOT2_SIZE     0xf000
+#define RB_SOFT_CFG_OFFSET      0x1f000
+#define RB_SOFT_CFG_SIZE        0x1000
+#define RB_ROOTFS_OFFSET        0x20000
+#define RB_ROOTFS_SIZE          0x9e0000
+#define RB_KERNEL_OFFSET        0xa00000
+#define RB_KERNEL_SIZE          MTDPART_SIZ_FULL
+
+void __init rb941_wlan_init(void)
+{
+    char *art_buf;
+    u8 wlan_mac[ETH_ALEN];
+
+    art_buf = rb_get_wlan_data();
+    if (art_buf == NULL)
+            return;
+
+    ath79_init_mac(wlan_mac, ath79_mac_base, 11);
+    ath79_register_wmac(art_buf + 0x1000, wlan_mac);
+
+    kfree(art_buf);
+}
+
+static struct mtd_partition rb941_spi_partitions[] = {
+    {
+            .name = "routerboot",
+            .offset = RB_ROUTERBOOT_OFFSET,
+            .mask_flags = MTD_WRITEABLE,
+            .size = RB_ROUTERBOOT_SIZE,
+    }, {
+            .name = "hard_config",
+            .offset = RB_HARD_CFG_OFFSET,
+            .size = RB_HARD_CFG_SIZE,
+            .mask_flags = MTD_WRITEABLE,
+    }, {
+            .name = "bios",
+            .offset = RB_BIOS_OFFSET,
+            .size = RB_BIOS_SIZE,
+            .mask_flags = MTD_WRITEABLE,
+    }, {
+            .name = "routerboot2",
+            .offset = RB_ROUTERBOOT2_OFFSET,
+            .size = RB_ROUTERBOOT2_SIZE,
+            .mask_flags = MTD_WRITEABLE,
+    }, {
+            .name = "soft_config",
+            .offset = RB_SOFT_CFG_OFFSET,
+            .size = RB_SOFT_CFG_SIZE,
+            .mask_flags = MTD_WRITEABLE,
+    }, {
+            .name = "rootfs",
+            .offset = RB_ROOTFS_OFFSET,
+            .size = RB_ROOTFS_SIZE,
+    }, {
+            .name = "kernel",
+            .offset = RB_KERNEL_OFFSET,
+            .size = RB_KERNEL_SIZE,
+    }
+};
+
+static struct flash_platform_data rb941_spi_flash_data = {
+    .parts          = rb941_spi_partitions,
+    .nr_parts       = ARRAY_SIZE(rb941_spi_partitions),
+};
+
+static struct gpio_led rb941_leds[] __initdata = {
+    {
+        .name = "rb:green:act",
+        .gpio = RB941_GPIO_LED_ACT,
+        .active_low = 1,
+    },
+};
+
+static struct gpio_keys_button rb941_gpio_keys[] __initdata = {
+    {
+        .desc = "Reset button",
+        .type = EV_KEY,
+        .code = KEY_RESTART,
+        .debounce_interval = RB941_KEYS_DEBOUNCE_INTERVAL,
+        .gpio = RB941_GPIO_BTN_RESET,
+        .active_low = 1,
+    },
+};
+
+static void __init rb941_setup(void)
+{
+    const struct rb_info *info;
+    //try to get rb_info data
+    info = rb_init_info((void *)(KSEG1ADDR(AR71XX_SPI_BASE)), 0x20000);
+    if (!info){
+        pr_err("%s: Can't get rb_info data from flash!\n", __func__);
+        //return -EINVAL; //Not critical ... continue!
+    }
+    ath79_setup_ar934x_eth_cfg(AR934X_ETH_CFG_SW_ONLY_MODE);
+    ath79_register_m25p80(&rb941_spi_flash_data);
+    ath79_register_mdio(0, 0x0);
+
+    /* WAN. We have no WAN. Only LAN. */
+    /*ath79_switch_data.phy4_mii_en = 1;
+    ath79_switch_data.phy_poll_mask = BIT(4);
+    ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
+    ath79_eth0_data.phy_mask = BIT(4);
+    ath79_init_mac(ath79_eth0_data.mac_addr, ath79_mac_base, 0);
+    ath79_register_eth(0); */
+
+    /* LAN */
+    ath79_init_mac(ath79_eth1_data.mac_addr, ath79_mac_base, 0);
+    ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII;
+    ath79_register_eth(1);
+
+    //ath79_register_usb();
+
+    rb941_wlan_init();
+
+    ath79_register_leds_gpio(-1, ARRAY_SIZE(rb941_leds), rb941_leds);
+    ath79_register_gpio_keys_polled(-1, RB941_KEYS_POLL_INTERVAL,
+                                    ARRAY_SIZE(rb941_gpio_keys),
+                                    rb941_gpio_keys);
+}
+
+MIPS_MACHINE(ATH79_MACH_RB_941, "H951L", "MikroTik RouterBOARD 941-2nD", rb941_setup);
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
index d18a71c..f64031a 100644
--- a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
+++ b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
@@ -162,6 +162,7 @@  enum ath79_mach_type {
 	ATH79_MACH_RB_751,			/* MikroTik RouterBOARD 751 */
 	ATH79_MACH_RB_751G,			/* Mikrotik RouterBOARD 751G */
 	ATH79_MACH_RB_922GS,			/* Mikrotik RouterBOARD 911/922GS boards */
+	ATH79_MACH_RB_941,			/* MikroTik RouterBOARD 941-2nD */
 	ATH79_MACH_RB_951G,			/* Mikrotik RouterBOARD 951G */
 	ATH79_MACH_RB_951U,			/* Mikrotik RouterBOARD 951Ui-2HnD */
 	ATH79_MACH_RB_SXTLITE2ND,		/* Mikrotik RouterBOARD SXT Lite 2nD */
diff --git a/target/linux/ar71xx/image/legacy.mk b/target/linux/ar71xx/image/legacy.mk
index 3259016..b64d79e 100644
--- a/target/linux/ar71xx/image/legacy.mk
+++ b/target/linux/ar71xx/image/legacy.mk
@@ -847,6 +847,29 @@  define Image/Build/Zcomax
 	fi
 endef
 
+ifeq ($(SUBTARGET),mikrotik)
+
+define Device/rb-nor-flash-16M
+  DEVICE_PROFILE := MikrotikDefault MikrotikNorFlash
+  BLOCKSIZE := 64k
+  IMAGE_SIZE := 16000k
+  KERNEL2MINOR_ARGS := -s 1024 -e
+  LOADER_TYPE := elf
+  KERNEL_INSTALL := 1
+  KERNEL := kernel-bin | lzma | loader-kernel | kernel2minor $$(KERNEL2MINOR_ARGS)
+  KERNEL_INITRAMFS := kernel-bin | lzma | loader-kernel
+  IMAGES := sysupgrade.bin
+  IMAGE/sysupgrade.bin = append-rootfs | pad-rootfs | combined-image | check-size $$$$(IMAGE_SIZE)
+endef
+
+define Device/rb-941-2nd
+$(Device/rb-nor-flash-16M)
+  BOARDNAME:= rb-941-2nd
+endef
+TARGET_DEVICES += rb-941-2nd
+
+endif # ifeq ($(SUBTARGET),mikrotik)
+
 
 # $(1): template name to be defined.
 # $(2): squashfs suffix to be used.
diff --git a/target/linux/ar71xx/mikrotik/profiles/03-norflash.mk b/target/linux/ar71xx/mikrotik/profiles/03-norflash.mk
new file mode 100644
index 0000000..aa5c891
--- /dev/null
+++ b/target/linux/ar71xx/mikrotik/profiles/03-norflash.mk
@@ -0,0 +1,16 @@ 
+#
+# Copyright (C) 2009 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+define Profile/MikrotikNorFlash
+	NAME:=NorFlash Profile
+	PACKAGES:=kmod-ath9k
+endef
+
+define Profile/MikrotikNorFlash/Description
+	Package set optimized for the Mikrotik's boards with single NOR flash(16MB or more).
+endef
+$(eval $(call Profile,MikrotikNorFlash))