Was flashed on WRT350Nv2, booted and is running for several days.
Closes #7405
Thank you maddes for your patch.
SVN-Revision: 21682
SUBTARGETS=generic harddisk
CFLAGS=-Os -pipe -march=armv5t -mtune=xscale -funit-at-a-time
-LINUX_VERSION:=2.6.32.14
+LINUX_VERSION:=2.6.34
include $(INCLUDE_DIR)/target.mk
--- /dev/null
+--- a/arch/arm/kernel/setup.c
++++ b/arch/arm/kernel/setup.c
+@@ -629,7 +629,7 @@ __tagtable(ATAG_REVISION, parse_tag_revi
+
+ static int __init parse_tag_cmdline(const struct tag *tag)
+ {
+- strlcpy(default_command_line, tag->u.cmdline.cmdline, COMMAND_LINE_SIZE);
++// strlcpy(default_command_line, tag->u.cmdline.cmdline, COMMAND_LINE_SIZE);
+ return 0;
+ }
+
--- /dev/null
+--- a/drivers/mtd/chips/cfi_cmdset_0002.c
++++ b/drivers/mtd/chips/cfi_cmdset_0002.c
+@@ -374,8 +374,9 @@ struct mtd_info *cfi_cmdset_0002(struct
+
+ cfi_fixup_major_minor(cfi, extp);
+
+- if (extp->MajorVersion < '0' || extp->MajorVersion > '3' ||
+- (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
++ if ((extp->MajorVersion != '0' && extp->MinorVersion != '0') &&
++ (extp->MajorVersion < '0' || extp->MajorVersion > '3' ||
++ (extp->MinorVersion < '0' || extp->MinorVersion > '4'))) {
+ if (cfi->mfr == MANUFACTURER_SAMSUNG &&
+ (extp->MajorVersion == '3' && extp->MinorVersion == '3')) {
+ printk(KERN_NOTICE " Newer Samsung flash detected, "
--- /dev/null
+--- a/arch/arm/mach-orion5x/wrt350n-v2-setup.c
++++ b/arch/arm/mach-orion5x/wrt350n-v2-setup.c
+@@ -15,6 +15,9 @@
+ #include <linux/mtd/physmap.h>
+ #include <linux/mv643xx_eth.h>
+ #include <linux/ethtool.h>
++#include <linux/leds.h>
++#include <linux/gpio_keys.h>
++#include <linux/input.h>
+ #include <net/dsa.h>
+ #include <asm/mach-types.h>
+ #include <asm/gpio.h>
+@@ -24,6 +27,80 @@
+ #include "common.h"
+ #include "mpp.h"
+
++/*
++ * LEDs attached to GPIO
++ */
++static struct gpio_led wrt350n_v2_led_pins[] = {
++ {
++ .name = "wrt350nv2:green:power",
++ .gpio = 0,
++ .active_low = 1,
++ }, {
++ .name = "wrt350nv2:green:security",
++ .gpio = 1,
++ .active_low = 1,
++ }, {
++ .name = "wrt350nv2:orange:power",
++ .gpio = 5,
++ .active_low = 1,
++ }, {
++ .name = "wrt350nv2:green:usb",
++ .gpio = 6,
++ .active_low = 1,
++ }, {
++ .name = "wrt350nv2:green:wireless",
++ .gpio = 7,
++ .active_low = 1,
++ },
++};
++
++static struct gpio_led_platform_data wrt350n_v2_led_data = {
++ .leds = wrt350n_v2_led_pins,
++ .num_leds = ARRAY_SIZE(wrt350n_v2_led_pins),
++};
++
++static struct platform_device wrt350n_v2_leds = {
++ .name = "leds-gpio",
++ .id = -1,
++ .dev = {
++ .platform_data = &wrt350n_v2_led_data,
++ },
++};
++
++/*
++ * Buttons attached to GPIO
++ */
++static struct gpio_keys_button wrt350n_v2_buttons[] = {
++ {
++ .code = KEY_RESTART,
++ .gpio = 3,
++ .desc = "Reset Button",
++ .active_low = 1,
++ }, {
++ .code = KEY_WLAN,
++ .gpio = 2,
++ .desc = "WPS Button",
++ .active_low = 1,
++ },
++};
++
++static struct gpio_keys_platform_data wrt350n_v2_button_data = {
++ .buttons = wrt350n_v2_buttons,
++ .nbuttons = ARRAY_SIZE(wrt350n_v2_buttons),
++};
++
++static struct platform_device wrt350n_v2_button_device = {
++ .name = "gpio-keys",
++ .id = -1,
++ .num_resources = 0,
++ .dev = {
++ .platform_data = &wrt350n_v2_button_data,
++ },
++};
++
++/*
++ * General setup
++ */
+ static struct orion5x_mpp_mode wrt350n_v2_mpp_modes[] __initdata = {
+ { 0, MPP_GPIO }, /* Power LED green (0=on) */
+ { 1, MPP_GPIO }, /* Security LED (0=on) */
+@@ -140,6 +217,8 @@ static void __init wrt350n_v2_init(void)
+ orion5x_setup_dev_boot_win(WRT350N_V2_NOR_BOOT_BASE,
+ WRT350N_V2_NOR_BOOT_SIZE);
+ platform_device_register(&wrt350n_v2_nor_flash);
++ platform_device_register(&wrt350n_v2_button_device);
++ platform_device_register(&wrt350n_v2_leds);
+ }
+
+ static int __init wrt350n_v2_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
--- /dev/null
+--- a/arch/arm/mach-orion5x/wrt350n-v2-setup.c
++++ b/arch/arm/mach-orion5x/wrt350n-v2-setup.c
+@@ -135,11 +135,11 @@ static struct mtd_partition wrt350n_v2_n
+ {
+ .name = "kernel",
+ .offset = 0x00000000,
+- .size = 0x00760000,
++ .size = 0x00100000, // change to kernel mtd size here (1/3)
+ }, {
+ .name = "rootfs",
+- .offset = 0x001a0000,
+- .size = 0x005c0000,
++ .offset = 0x00100000, // change to kernel mtd size here (2/3)
++ .size = 0x00650000, // adopt to kernel mtd size here (3/3) = 0x00750000 - <kernel mtd size>
+ }, {
+ .name = "lang",
+ .offset = 0x00760000,
+@@ -152,6 +152,14 @@ static struct mtd_partition wrt350n_v2_n
+ .name = "u-boot",
+ .offset = 0x007c0000,
+ .size = 0x00040000,
++ }, {
++ .name = "eRcOmM_do_not_touch",
++ .offset = 0x00750000,
++ .size = 0x00010000, // erasesize
++ }, {
++ .name = "image", // for sysupgrade
++ .offset = 0x00000000,
++ .size = 0x00750000,
+ },
+ };
+
--- /dev/null
+--- a/arch/arm/mach-orion5x/wnr854t-setup.c
++++ b/arch/arm/mach-orion5x/wnr854t-setup.c
+@@ -67,6 +67,10 @@ static struct mtd_partition wnr854t_nor_
+ .name = "uboot",
+ .offset = 0x00760000,
+ .size = 0x00040000,
++ }, {
++ .name = "image", // for sysupgrade
++ .offset = 0x00000000,
++ .size = 0x00760000,
+ },
+ };
+
--- /dev/null
+--- a/arch/arm/mach-orion5x/Kconfig
++++ b/arch/arm/mach-orion5x/Kconfig
+@@ -16,6 +16,13 @@ config MACH_RD88F5182
+ Say 'Y' here if you want your kernel to support the
+ Marvell Orion-NAS (88F5182) RD2
+
++config MACH_DT2
++ bool "Freecom DataTank Gateway"
++ select I2C_BOARDINFO
++ help
++ Say 'Y' here if you want your kernel to support the
++ Freecom DataTank Gateway
++
+ config MACH_KUROBOX_PRO
+ bool "KuroBox Pro"
+ select I2C_BOARDINFO
+--- a/arch/arm/mach-orion5x/Makefile
++++ b/arch/arm/mach-orion5x/Makefile
+@@ -20,3 +20,4 @@ obj-$(CONFIG_MACH_WNR854T) += wnr854t-se
+ obj-$(CONFIG_MACH_RD88F5181L_GE) += rd88f5181l-ge-setup.o
+ obj-$(CONFIG_MACH_RD88F5181L_FXO) += rd88f5181l-fxo-setup.o
+ obj-$(CONFIG_MACH_RD88F6183AP_GE) += rd88f6183ap-ge-setup.o
++obj-$(CONFIG_MACH_DT2) += dt2-setup.o
--- /dev/null
+--- a/include/linux/skbuff.h
++++ b/include/linux/skbuff.h
+@@ -332,7 +332,7 @@ struct sk_buff {
+ * want to keep them across layers you have to do a skb_clone()
+ * first. This is owned by whoever has the skb queued ATM.
+ */
+- char cb[48];
++ char cb[48] __attribute__((aligned(8)));
+ #if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
+ void *cb_next;
+ #endif
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
-@@ -629,7 +629,7 @@ __tagtable(ATAG_REVISION, parse_tag_revi
+@@ -595,7 +595,7 @@ __tagtable(ATAG_REVISION, parse_tag_revi
static int __init parse_tag_cmdline(const struct tag *tag)
{
+++ /dev/null
---- a/arch/arm/mach-orion5x/wrt350n-v2-setup.c
-+++ b/arch/arm/mach-orion5x/wrt350n-v2-setup.c
-@@ -15,6 +15,9 @@
- #include <linux/mtd/physmap.h>
- #include <linux/mv643xx_eth.h>
- #include <linux/ethtool.h>
-+#include <linux/leds.h>
-+#include <linux/gpio_keys.h>
-+#include <linux/input.h>
- #include <net/dsa.h>
- #include <asm/mach-types.h>
- #include <asm/gpio.h>
-@@ -24,6 +27,80 @@
- #include "common.h"
- #include "mpp.h"
-
-+/*
-+ * LEDs attached to GPIO
-+ */
-+static struct gpio_led wrt350n_v2_led_pins[] = {
-+ {
-+ .name = "wrt350nv2:green:power",
-+ .gpio = 0,
-+ .active_low = 1,
-+ }, {
-+ .name = "wrt350nv2:green:security",
-+ .gpio = 1,
-+ .active_low = 1,
-+ }, {
-+ .name = "wrt350nv2:orange:power",
-+ .gpio = 5,
-+ .active_low = 1,
-+ }, {
-+ .name = "wrt350nv2:green:usb",
-+ .gpio = 6,
-+ .active_low = 1,
-+ }, {
-+ .name = "wrt350nv2:green:wireless",
-+ .gpio = 7,
-+ .active_low = 1,
-+ },
-+};
-+
-+static struct gpio_led_platform_data wrt350n_v2_led_data = {
-+ .leds = wrt350n_v2_led_pins,
-+ .num_leds = ARRAY_SIZE(wrt350n_v2_led_pins),
-+};
-+
-+static struct platform_device wrt350n_v2_leds = {
-+ .name = "leds-gpio",
-+ .id = -1,
-+ .dev = {
-+ .platform_data = &wrt350n_v2_led_data,
-+ },
-+};
-+
-+/*
-+ * Buttons attached to GPIO
-+ */
-+static struct gpio_keys_button wrt350n_v2_buttons[] = {
-+ {
-+ .code = KEY_RESTART,
-+ .gpio = 3,
-+ .desc = "Reset Button",
-+ .active_low = 1,
-+ }, {
-+ .code = KEY_WLAN,
-+ .gpio = 2,
-+ .desc = "WPS Button",
-+ .active_low = 1,
-+ },
-+};
-+
-+static struct gpio_keys_platform_data wrt350n_v2_button_data = {
-+ .buttons = wrt350n_v2_buttons,
-+ .nbuttons = ARRAY_SIZE(wrt350n_v2_buttons),
-+};
-+
-+static struct platform_device wrt350n_v2_button_device = {
-+ .name = "gpio-keys",
-+ .id = -1,
-+ .num_resources = 0,
-+ .dev = {
-+ .platform_data = &wrt350n_v2_button_data,
-+ },
-+};
-+
-+/*
-+ * General setup
-+ */
- static struct orion5x_mpp_mode wrt350n_v2_mpp_modes[] __initdata = {
- { 0, MPP_GPIO }, /* Power LED green (0=on) */
- { 1, MPP_GPIO }, /* Security LED (0=on) */
-@@ -140,6 +217,8 @@ static void __init wrt350n_v2_init(void)
- orion5x_setup_dev_boot_win(WRT350N_V2_NOR_BOOT_BASE,
- WRT350N_V2_NOR_BOOT_SIZE);
- platform_device_register(&wrt350n_v2_nor_flash);
-+ platform_device_register(&wrt350n_v2_button_device);
-+ platform_device_register(&wrt350n_v2_leds);
- }
-
- static int __init wrt350n_v2_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
select I2C_BOARDINFO
--- a/arch/arm/mach-orion5x/Makefile
+++ b/arch/arm/mach-orion5x/Makefile
-@@ -20,3 +20,4 @@ obj-$(CONFIG_MACH_WNR854T) += wnr854t-se
+@@ -21,3 +21,4 @@ obj-$(CONFIG_MACH_WNR854T) += wnr854t-se
obj-$(CONFIG_MACH_RD88F5181L_GE) += rd88f5181l-ge-setup.o
obj-$(CONFIG_MACH_RD88F5181L_FXO) += rd88f5181l-fxo-setup.o
obj-$(CONFIG_MACH_RD88F6183AP_GE) += rd88f6183ap-ge-setup.o
+++ /dev/null
---- a/include/linux/skbuff.h
-+++ b/include/linux/skbuff.h
-@@ -332,7 +332,7 @@ struct sk_buff {
- * want to keep them across layers you have to do a skb_clone()
- * first. This is owned by whoever has the skb queued ATM.
- */
-- char cb[48];
-+ char cb[48] __attribute__((aligned(8)));
- #if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
- void *cb_next;
- #endif