From ccabe4a1b447e9bc7efd0a7eb19e843bc46702b1 Mon Sep 17 00:00:00 2001
From: Gabor Juhos <juhosg@openwrt.org>
Date: Sun, 9 Sep 2012 14:05:28 +0000
Subject: [PATCH] ar71xx: add RouterBoot related helper routines

SVN-Revision: 33347
---
 target/linux/ar71xx/config-3.3                |   1 +
 .../ar71xx/files/arch/mips/ath79/routerboot.c | 100 ++++++++++++++++++
 .../ar71xx/files/arch/mips/ath79/routerboot.h |  26 +++++
 .../602-MIPS-ath79-add-openwrt-stuff.patch    |   8 +-
 .../610-MIPS-ath79-openwrt-machines.patch     |   6 +-
 .../patches-3.3/611-TEW-712BR-support.patch   |   2 +-
 .../patches-3.3/612-ALL0315N-support.patch    |   2 +-
 .../patches-3.3/613-RB2011-support.patch      |  18 ++--
 8 files changed, 145 insertions(+), 18 deletions(-)
 create mode 100644 target/linux/ar71xx/files/arch/mips/ath79/routerboot.c
 create mode 100644 target/linux/ar71xx/files/arch/mips/ath79/routerboot.h

diff --git a/target/linux/ar71xx/config-3.3 b/target/linux/ar71xx/config-3.3
index a13fded6e3..fd113addd1 100644
--- a/target/linux/ar71xx/config-3.3
+++ b/target/linux/ar71xx/config-3.3
@@ -83,6 +83,7 @@ CONFIG_ATH79_MACH_WZR_HP_G450H=y
 CONFIG_ATH79_MACH_ZCN_1523H=y
 CONFIG_ATH79_NVRAM=y
 CONFIG_ATH79_PCI_ATH9K_FIXUP=y
+# CONFIG_ATH79_ROUTERBOOT is not set
 # CONFIG_ATH79_WDT is not set
 CONFIG_BCMA_POSSIBLE=y
 CONFIG_CC_OPTIMIZE_FOR_SIZE=y
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/routerboot.c b/target/linux/ar71xx/files/arch/mips/ath79/routerboot.c
new file mode 100644
index 0000000000..3c6f9aaeb3
--- /dev/null
+++ b/target/linux/ar71xx/files/arch/mips/ath79/routerboot.c
@@ -0,0 +1,100 @@
+/*
+ *  RouterBoot helper routines
+ *
+ *  Copyright (C) 2012 Gabor Juhos <juhosg@openwrt.org>
+ *
+ *  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/kernel.h>
+#include <linux/errno.h>
+#include <linux/routerboot.h>
+
+#include "routerboot.h"
+
+static u32 get_u32(void *buf)
+{
+	u8 *p = buf;
+
+	return ((u32) p[3] + ((u32) p[2] << 8) + ((u32) p[1] << 16) +
+	       ((u32) p[0] << 24));
+}
+
+static u16 get_u16(void *buf)
+{
+	u8 *p = buf;
+
+	return (u16) p[1] + ((u16) p[0] << 8);
+}
+
+__init int
+routerboot_find_tag(u8 *buf, unsigned int buflen, u16 tag_id,
+		    u8 **tag_data, u16 *tag_len)
+{
+	uint32_t magic;
+	int ret;
+
+	if (buflen < 4)
+		return -EINVAL;
+
+	magic = get_u32(buf);
+	switch (magic) {
+	case RB_MAGIC_HARD:
+		/* skip magic value */
+		buf += 4;
+		buflen -= 4;
+		break;
+
+	case RB_MAGIC_SOFT:
+		if (buflen < 8)
+			return -EINVAL;
+
+		/* skip magic and CRC value */
+		buf += 8;
+		buflen -= 8;
+
+		break;
+
+	default:
+		return -EINVAL;
+	}
+
+	ret = -ENOENT;
+	while (buflen > 2) {
+		u16 id;
+		u16 len;
+
+		len = get_u16(buf);
+		buf += 2;
+		buflen -= 2;
+
+		if (buflen < 2)
+			break;
+
+		id = get_u16(buf);
+		buf += 2;
+		buflen -= 2;
+
+		if (id == RB_ID_TERMINATOR)
+			break;
+
+		if (buflen < len)
+			break;
+
+		if (id == tag_id) {
+			if (tag_len)
+				*tag_len = len;
+			if (tag_data)
+				*tag_data = buf;
+			ret = 0;
+			break;
+		}
+
+		buf += len;
+		buflen -= len;
+	}
+
+	return ret;
+}
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/routerboot.h b/target/linux/ar71xx/files/arch/mips/ath79/routerboot.h
new file mode 100644
index 0000000000..9a4dde59ec
--- /dev/null
+++ b/target/linux/ar71xx/files/arch/mips/ath79/routerboot.h
@@ -0,0 +1,26 @@
+/*
+ *  RouterBoot definitions
+ *
+ *  Copyright (C) 2012 Gabor Juhos <juhosg@openwrt.org>
+ *
+ *  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.
+ */
+
+#ifndef _ATH79_ROUTERBOOT_H_
+#define _ATH79_ROUTERBOOT_H_
+
+#ifdef CONFIG_ATH79_ROUTERBOOT
+int routerboot_find_tag(u8 *buf, unsigned int buflen, u16 tag_id,
+			u8 **tag_data, u16 *tag_len);
+#else
+static inline int
+routerboot_find_tag(u8 *buf, unsigned int buflen, u16 tag_id,
+		    u8 **tag_data, u16 *tag_len)
+{
+	return -ENOENT;
+}
+#endif
+
+#endif /* _ATH79_ROUTERBOOT_H_ */
diff --git a/target/linux/ar71xx/patches-3.3/602-MIPS-ath79-add-openwrt-stuff.patch b/target/linux/ar71xx/patches-3.3/602-MIPS-ath79-add-openwrt-stuff.patch
index 85256e77ee..3c96819df4 100644
--- a/target/linux/ar71xx/patches-3.3/602-MIPS-ath79-add-openwrt-stuff.patch
+++ b/target/linux/ar71xx/patches-3.3/602-MIPS-ath79-add-openwrt-stuff.patch
@@ -21,7 +21,7 @@
  config PCI_AR724X
  	def_bool n
  
-@@ -125,4 +139,10 @@ config ATH79_DEV_WMAC
+@@ -125,4 +139,13 @@ config ATH79_DEV_WMAC
  	depends on (SOC_AR913X || SOC_AR933X || SOC_AR934X || SOC_QCA955X)
  	def_bool n
  
@@ -30,11 +30,14 @@
 +
 +config ATH79_PCI_ATH9K_FIXUP
 +	def_bool n
++
++config ATH79_ROUTERBOOT
++	def_bool n
 +
  endif
 --- a/arch/mips/ath79/Makefile
 +++ b/arch/mips/ath79/Makefile
-@@ -17,13 +17,23 @@ obj-$(CONFIG_PCI)			+= pci.o
+@@ -17,13 +17,24 @@ obj-$(CONFIG_PCI)			+= pci.o
  # Devices
  #
  obj-y					+= dev-common.o
@@ -53,6 +56,7 @@
 +#
 +obj-$(CONFIG_ATH79_NVRAM)		+= nvram.o
 +obj-$(CONFIG_ATH79_PCI_ATH9K_FIXUP)	+= pci-ath9k-fixup.o
++obj-$(CONFIG_ATH79_ROUTERBOOT)		+= routerboot.o
 +
 +#
  # Machines
diff --git a/target/linux/ar71xx/patches-3.3/610-MIPS-ath79-openwrt-machines.patch b/target/linux/ar71xx/patches-3.3/610-MIPS-ath79-openwrt-machines.patch
index 0efdee15af..97e957f2dc 100644
--- a/target/linux/ar71xx/patches-3.3/610-MIPS-ath79-openwrt-machines.patch
+++ b/target/linux/ar71xx/patches-3.3/610-MIPS-ath79-openwrt-machines.patch
@@ -670,8 +670,8 @@
  	def_bool n
  
  config ATH79_DEV_GPIO_BUTTONS
-@@ -153,4 +667,7 @@ config ATH79_NVRAM
- config ATH79_PCI_ATH9K_FIXUP
+@@ -156,4 +670,7 @@ config ATH79_PCI_ATH9K_FIXUP
+ config ATH79_ROUTERBOOT
  	def_bool n
  
 +config PCI_AR724X
@@ -680,7 +680,7 @@
  endif
 --- a/arch/mips/ath79/Makefile
 +++ b/arch/mips/ath79/Makefile
-@@ -36,9 +36,62 @@ obj-$(CONFIG_ATH79_PCI_ATH9K_FIXUP)	+= p
+@@ -37,9 +37,62 @@ obj-$(CONFIG_ATH79_ROUTERBOOT)		+= route
  #
  # Machines
  #
diff --git a/target/linux/ar71xx/patches-3.3/611-TEW-712BR-support.patch b/target/linux/ar71xx/patches-3.3/611-TEW-712BR-support.patch
index 94a056aa51..b8c227e4ca 100644
--- a/target/linux/ar71xx/patches-3.3/611-TEW-712BR-support.patch
+++ b/target/linux/ar71xx/patches-3.3/611-TEW-712BR-support.patch
@@ -19,7 +19,7 @@
  	select SOC_AR71XX
 --- a/arch/mips/ath79/Makefile
 +++ b/arch/mips/ath79/Makefile
-@@ -67,6 +67,7 @@ obj-$(CONFIG_ATH79_MACH_RB750)		+= mach-
+@@ -68,6 +68,7 @@ obj-$(CONFIG_ATH79_MACH_RB750)		+= mach-
  obj-$(CONFIG_ATH79_MACH_RW2458N)	+= mach-rw2458n.o
  obj-$(CONFIG_ATH79_MACH_TEW_632BRP)	+= mach-tew-632brp.o
  obj-$(CONFIG_ATH79_MACH_TEW_673GRU)	+= mach-tew-673gru.o
diff --git a/target/linux/ar71xx/patches-3.3/612-ALL0315N-support.patch b/target/linux/ar71xx/patches-3.3/612-ALL0315N-support.patch
index bc4e6695e8..fafb112400 100644
--- a/target/linux/ar71xx/patches-3.3/612-ALL0315N-support.patch
+++ b/target/linux/ar71xx/patches-3.3/612-ALL0315N-support.patch
@@ -18,7 +18,7 @@
  	select SOC_AR724X
 --- a/arch/mips/ath79/Makefile
 +++ b/arch/mips/ath79/Makefile
-@@ -39,6 +39,7 @@ obj-$(CONFIG_ATH79_PCI_ATH9K_FIXUP)	+= p
+@@ -40,6 +40,7 @@ obj-$(CONFIG_ATH79_ROUTERBOOT)		+= route
  obj-$(CONFIG_ATH79_MACH_ALFA_AP96)	+= mach-alfa-ap96.o
  obj-$(CONFIG_ATH79_MACH_ALFA_NX)	+= mach-alfa-nx.o
  obj-$(CONFIG_ATH79_MACH_ALL0258N)	+= mach-all0258n.o
diff --git a/target/linux/ar71xx/patches-3.3/613-RB2011-support.patch b/target/linux/ar71xx/patches-3.3/613-RB2011-support.patch
index ee16710306..6622b4d96e 100644
--- a/target/linux/ar71xx/patches-3.3/613-RB2011-support.patch
+++ b/target/linux/ar71xx/patches-3.3/613-RB2011-support.patch
@@ -1,8 +1,8 @@
 --- a/arch/mips/ath79/Kconfig
 +++ b/arch/mips/ath79/Kconfig
-@@ -333,6 +333,11 @@ config ATH79_MACH_RB750
- 	select ATH79_DEV_AP9X_PCI if PCI
+@@ -334,6 +334,11 @@ config ATH79_MACH_RB750
  	select ATH79_DEV_USB
+ 	select RLE_DECOMPRESS
  
 +config ATH79_MACH_RB2011
 +	bool "MikroTik RouterBOARD 2011 support"
@@ -22,11 +22,9 @@
  	ATH79_MACH_RW2458N,		/* Redwave RW2458N */
  	ATH79_MACH_TEW_632BRP,		/* TRENDnet TEW-632BRP */
  	ATH79_MACH_TEW_673GRU,		/* TRENDnet TEW-673GRU */
-Index: linux-3.3.8/arch/mips/ath79/Makefile
-===================================================================
---- linux-3.3.8.orig/arch/mips/ath79/Makefile
-+++ linux-3.3.8/arch/mips/ath79/Makefile
-@@ -65,6 +65,7 @@ obj-$(CONFIG_ATH79_MACH_PB44)		+= mach-p
+--- a/arch/mips/ath79/Makefile
++++ b/arch/mips/ath79/Makefile
+@@ -66,6 +66,7 @@ obj-$(CONFIG_ATH79_MACH_PB44)		+= mach-p
  obj-$(CONFIG_ATH79_MACH_PB92)		+= mach-pb92.o
  obj-$(CONFIG_ATH79_MACH_RB4XX)		+= mach-rb4xx.o
  obj-$(CONFIG_ATH79_MACH_RB750)		+= mach-rb750.o
@@ -34,10 +32,8 @@ Index: linux-3.3.8/arch/mips/ath79/Makefile
  obj-$(CONFIG_ATH79_MACH_RW2458N)	+= mach-rw2458n.o
  obj-$(CONFIG_ATH79_MACH_TEW_632BRP)	+= mach-tew-632brp.o
  obj-$(CONFIG_ATH79_MACH_TEW_673GRU)	+= mach-tew-673gru.o
-Index: linux-3.3.8/arch/mips/ath79/prom.c
-===================================================================
---- linux-3.3.8.orig/arch/mips/ath79/prom.c
-+++ linux-3.3.8/arch/mips/ath79/prom.c
+--- a/arch/mips/ath79/prom.c
++++ b/arch/mips/ath79/prom.c
 @@ -181,7 +181,8 @@ void __init prom_init(void)
  		}
  	}
-- 
GitLab