Hi, sorry for the delay. patch no longer applies please rebase it and send it again
John On 27/04/2015 09:27, Caleb James DeLisle wrote: > I noticed the patch was not applying to the recent master so I reworked it to > add a new patch to the patchset against the kernel rather than patching the > patch > which was ugly (and proved to be brittle). > > This patch has a checkpatch.pl issue but it's trailing whitespace in the > patch which > it adds and it's not from me. > > As stated before, there's no way to locate the new larger kernel where the > old one > was so upgrading from factory firmware without uart is basically a > non-starter but > sysupgrade works (*worked, I will write a confirmation email as soon as I have > double-checked the rework of the patch but nothing functional was changed.) > > Finally I didn't send this as a reply because I'm new to mailing patches and > paranoid about breaking an inline patch. > > Thanks, > Caleb > > > Signed-off-by: Caleb James DeLisle <c...@cjdns.fr> > > diff --git a/target/linux/ar71xx/base-files/etc/diag.sh > b/target/linux/ar71xx/base-files/etc/diag.sh > index d702d45..f268fe4 100644 > --- a/target/linux/ar71xx/base-files/etc/diag.sh > +++ b/target/linux/ar71xx/base-files/etc/diag.sh > @@ -305,6 +305,9 @@ get_status_led() { > wrt400n) > status_led="wrt400n:blue:wps" > ;; > + wap4410n) > + status_led="wrt4410n:green:power" > + ;; > wrt160nl) > status_led="wrt160nl:blue:wps" > ;; > diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network > b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network > index f5c6865..7f163d6 100644 > --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network > +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network > @@ -338,6 +338,7 @@ tl-wa901nd-v3 |\ > tl-wr703n |\ > tube2h |\ > wndap360 |\ > +wap4410n |\ > mynet-rext |\ > wp543) > ucidef_set_interface_lan "eth0" > diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh > b/target/linux/ar71xx/base-files/lib/ar71xx.sh > index 645c5d9..a64a3bd 100755 > --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh > +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh > @@ -849,6 +849,9 @@ ar71xx_board_detect() { > *WRT400N) > name="wrt400n" > ;; > + *WAP4410N) > + name="wap4410n" > + ;; > *"WZR-450HP2") > name="wzr-450hp2" > ;; > diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh > b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh > index a8cec91..33d3a58 100755 > --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh > +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh > @@ -228,6 +228,7 @@ platform_check_image() { > rocket-m-xw | \ > nanostation-m-xw | \ > rw2458n | \ > + wap4410n | \ > wndap360 | \ > wzr-hp-g300nh2 | \ > wzr-hp-g300nh | \ > diff --git a/target/linux/ar71xx/config-3.18 b/target/linux/ar71xx/config-3.18 > index 36b8bb6..87b8162 100644 > --- a/target/linux/ar71xx/config-3.18 > +++ b/target/linux/ar71xx/config-3.18 > @@ -140,6 +140,7 @@ CONFIG_ATH79_MACH_WPJ344=y > CONFIG_ATH79_MACH_WPJ558=y > CONFIG_ATH79_MACH_WRT160NL=y > CONFIG_ATH79_MACH_WRT400N=y > +CONFIG_ATH79_MACH_WAP4410N=y > CONFIG_ATH79_MACH_WZR_450HP2=y > CONFIG_ATH79_MACH_WZR_HP_AG300H=y > CONFIG_ATH79_MACH_WZR_HP_G300NH=y > diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-wap4410n.c > b/target/linux/ar71xx/files/arch/mips/ath79/mach-wap4410n.c > new file mode 100644 > index 0000000..15bd12b > --- /dev/null > +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-wap4410n.c > @@ -0,0 +1,279 @@ > +/* > + * Cisco WAP4410N board support > + * > + * Copyright (C) 2014 Caleb James DeLisle <c...@cjdns.fr> > + * > + * 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, or (at your option) any later version. > + */ > +#include <linux/platform_device.h> > +#include <linux/mtd/mtd.h> > +#include <linux/mtd/partitions.h> > +#include <linux/mtd/physmap.h> > +#include <linux/nxp_74hc153.h> > + > +#include <asm/mach-ath79/ath79.h> > + > +#include "dev-eth.h" > +#include "dev-gpio-buttons.h" > +#include "dev-leds-gpio.h" > +#include "dev-usb.h" > +#include "dev-wmac.h" > +#include "machtypes.h" > + > +/* -------------- begin flash device -------------- */ > + > +#define FLASH_BASE 0xbf000000 > + > +/* where the actual art data is within the art partition. */ > +#define ART_DATA_OFFSET 0x1000 > + > +/* If changed, make sure to change image/Makefile too! */ > +#define KERN_SIZE 0x190000 > + > +/* Flash layout: u-boot/include/upgrade.h in cisco's GPL dump */ > +#define FLASH_SIZE (0x800000) > +#define BOOT_SIZE (0x40000) > +#define NVRAM_SIZE (0x10000) > +#define ART_SIZE (0x10000) > +#define ENV_SIZE (0x10000) > + > +#define NODE_INFO_OFFSET (BOOT_SIZE - 0x90) > +struct wap4410n_node_info { > + /** Serial number written on back of device. */ > + char serial_no[16]; > + > + /** Internal to Sercomm (?), France = { domain: 0x80, country: 0x00 } */ > + uint8_t domain; > + uint8_t country; > + > + /** written on the board, eg: 13 */ > + uint8_t hw_ver; > + > + uint8_t zero0[5]; > + > + /** ASCII numeric digits */ > + char wps_pin[8]; > + > + uint8_t zero1[16]; > + > + uint8_t mac_addr[6]; > + > + uint8_t zero2[3]; > + > + /** 31734572436f4d6d -> "1sErCoMm" does not seem to be checked. */ > + char magic_1sErCoMm[8]; > + > + /** 00010000 (offset 0x41, completely unaligned) */ > + uint8_t unknown0[4]; > + > + /** Used by upslug2 protocol */ > + uint8_t hardware_id[32]; > + > + /** 0000240800008000000000030000200400000008 */ > + uint8_t unknown1[20]; > + > + /** 734572436f4d6d -> "sErCoMm" */ > + uint8_t magic_sErCoMm[7]; > + > + uint8_t zero3[16]; > +}; > + > +#define UPGRADE_INFO_OFFSET 0x7dfff0 > +struct wap4410n_upgrade_info { > + /** Stock WAP4410: 2408 */ > + uint16_t product_id; > + > + /** Always 8000 */ > + uint16_t protocol; > + > + /** 2007 -> v2.0.7.x */ > + uint16_t fw_version; > + > + /** 90f7 same value as NSLU2 */ > + uint16_t unknown0; > + > + /** bootloader checks this and will "soft brick" if it's not correct. */ > + uint8_t eRcOmM[6]; > + > + uint8_t pad[2]; > +}; > + > +/* > + * An instruction in the bootloader which checks that 0x7dfff8 == "eRcOmM" > and > + * bricks if it's not. > + * If this instruction is overwritten with a zero, you get 64k of extra > space. > + * 2406 0006 1440 000a 8fbc 0020 <-- unpatched > + * 2406 0006 0000 0000 8fbc 0020 <-- patched > + */ > +#define SERCOMM_CHECK_LAST_INSN 0x24060006 > +#define SERCOMM_CHECK_INSN_OFFSET 0x19e08 > +#define SERCOMM_CHECK_NEXT_INSN 0x8fbc0020 > + > + > +/* Little bit of arithmatic on the flash layout. */ > +#define NVRAM_OFFSET BOOT_SIZE > +#define KERN_OFFSET (NVRAM_OFFSET + NVRAM_SIZE) > +#define ROOT_OFFSET (KERN_OFFSET + KERN_SIZE) > +#define ART_OFFSET (FLASH_SIZE - ART_SIZE) > +#define ENV_OFFSET (ART_OFFSET - ENV_SIZE) > +/* rootfs is whatever is left. */ > +#define ROOT_SIZE (ENV_OFFSET - ROOT_OFFSET) > + > +#define PART(b, s, n, f) { .name = n, .offset = b, .size = s, .mask_flags = > f } > +static struct mtd_partition wap4410n_flash_partitions[] = { > + PART(0x00000000, BOOT_SIZE, "u-boot", MTD_WRITEABLE), > + PART(NVRAM_OFFSET, NVRAM_SIZE, "u-boot-env", MTD_WRITEABLE), > + PART(KERN_OFFSET, KERN_SIZE, "kernel", 0), > + PART(ROOT_OFFSET, ROOT_SIZE, "rootfs", 0), > + PART(ENV_OFFSET, ENV_SIZE, "sercomm", MTD_WRITEABLE), > + PART(ART_OFFSET, ART_SIZE, "art", MTD_WRITEABLE), > + > + /* Pseudo-partition over whole upgradable space, used by sysupgrade. */ > + PART(KERN_OFFSET, KERN_SIZE + ROOT_SIZE, "firmware", 0) > +}; > +#undef PART > + > +static struct physmap_flash_data wap4410n_flash_data = { > + .width = 2, > + .parts = wap4410n_flash_partitions, > + .nr_parts = ARRAY_SIZE(wap4410n_flash_partitions), > +}; > + > +static struct resource wap4410n_flash_resources[] = { > + [0] = { > + .start = FLASH_BASE, > + .end = FLASH_BASE + FLASH_SIZE - 1, > + .flags = IORESOURCE_MEM, > + }, > +}; > + > +static struct platform_device wap4410n_flash_device = { > + .name = "physmap-flash", > + .id = -1, > + .resource = wap4410n_flash_resources, > + .num_resources = ARRAY_SIZE(wap4410n_flash_resources), > + .dev = { .platform_data = &wap4410n_flash_data } > +}; > + > + > +static void __init wap4410n_flash_reg(void) > +{ > + uint32_t *insn = (uint32_t *) (FLASH_BASE + SERCOMM_CHECK_INSN_OFFSET); > + int i; > + if (SERCOMM_CHECK_LAST_INSN != insn[-1] || > + SERCOMM_CHECK_NEXT_INSN != insn[1]) { > + printk(KERN_INFO "Unrecognized bootloader, costs 64k storage"); > + } else if (insn[0]) { > + printk(KERN_INFO "eRcOmM check at %p in uboot, costs 64k > storage", > + (void *)insn); > + } else { > + printk(KERN_INFO "eRcOmM check at %p patched, gain 64k storage", > + (void *)insn); > + wap4410n_flash_partitions[3].size += > + wap4410n_flash_partitions[4].size; > + wap4410n_flash_data.nr_parts--; > + for (i = 4; i < wap4410n_flash_data.nr_parts; i++) { > + memcpy(&wap4410n_flash_partitions[i], > + &wap4410n_flash_partitions[i + 1], > + sizeof(struct mtd_partition)); > + } > + } > + platform_device_register(&wap4410n_flash_device); > +} > + > +/* -------------- end flash device -------------- */ > + > + > +/* -------------------- GPIO -------------------- */ > + > +#define LED_WIRELESS 0 > +#define LED_POWER 1 > +#define KEYS_POLL_INTERVAL 20 /* msecs */ > +#define KEYS_DEBOUNE_INTERVAL (3 * KEYS_POLL_INTERVAL) > + > +/* 2 lights are gpio, other 2 are hardwired. */ > +static struct gpio_led wap4410n_leds_gpio[] __initdata = { > + { > + .name = "wrt4410n:green:power", > + .gpio = LED_POWER, > + .active_low = 1, > + }, > + { > + .name = "wrt4410n:green:wireless", > + .gpio = LED_WIRELESS, > + .active_low = 1, > + }, > +}; > + > +static struct gpio_keys_button wap4410n_gpio_keys[] __initdata = { > + { > + .desc = "reset", > + .type = EV_KEY, > + .code = KEY_RESTART, > + .debounce_interval = KEYS_DEBOUNE_INTERVAL, > + .gpio = 21, > + .active_low = 1, > + } > +}; > + > +static void __init wap4410n_gpio_reg(void) > +{ > + ath79_register_gpio_keys_polled( > + -1, > + KEYS_POLL_INTERVAL, > + ARRAY_SIZE(wap4410n_gpio_keys), > + wap4410n_gpio_keys > + ); > + ath79_register_leds_gpio( > + -1, > + ARRAY_SIZE(wap4410n_leds_gpio), > + wap4410n_leds_gpio > + ); > +} > + > +/* -------------------- end GPIO -------------------- */ > + > +/** Never called, just for build time verification. */ > +static void wap4410n_build_verify(void) > +{ > + BUILD_BUG_ON((KERN_SIZE / 0x10000 * 0x10000) != KERN_SIZE); > + BUILD_BUG_ON(sizeof(struct wap4410n_upgrade_info) != 16); > + BUILD_BUG_ON(sizeof(struct wap4410n_node_info) != 0x90); > +} > + > +static void __init wap4410n_setup(void) > +{ > + struct wap4410n_node_info *ni = (struct wap4410n_node_info *) > + (FLASH_BASE + NODE_INFO_OFFSET); > + uint8_t *art = (uint8_t *) > + (FLASH_BASE + FLASH_SIZE - ART_SIZE + ART_DATA_OFFSET); > + > + ath79_init_mac(ath79_eth0_data.mac_addr, ni->mac_addr, 0); > + > + ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII; > + /* TODO: SPEED_1000 causes a silent failure, testing needed. */ > + ath79_eth0_data.speed = SPEED_100; > + ath79_eth0_data.duplex = DUPLEX_FULL; > + ath79_register_eth(0); > + > + ath79_register_usb(); > + > + wap4410n_flash_reg(); > + > + ath79_register_wmac(art, ni->mac_addr); > + > + wap4410n_gpio_reg(); > + > + /* silence compiler warning */ > + if (0) > + wap4410n_build_verify(); > +} > + > +MIPS_MACHINE( > + ATH79_MACH_WAP4410N, > + "WAP4410N", > + "Linksys WAP4410N", > + wap4410n_setup > +); > diff --git a/target/linux/ar71xx/generic/profiles/linksys.mk > b/target/linux/ar71xx/generic/profiles/linksys.mk > index bedf3a3..0a7a897 100644 > --- a/target/linux/ar71xx/generic/profiles/linksys.mk > +++ b/target/linux/ar71xx/generic/profiles/linksys.mk > @@ -23,5 +23,15 @@ define Profile/WRT400N/Description > Package set optimized for the Linksys WRT400N. > endef > > +define Profile/WAP4410N > + NAME:=Linksys WAP4410N > + PACKAGES:= > +endef > + > +define Profile/WAP4410N/Description > + Package set optimized for the Linksys WAP4410N. > +endef > + > $(eval $(call Profile,WRT160NL)) > $(eval $(call Profile,WRT400N)) > +$(eval $(call Profile,WAP4410N)) > diff --git a/target/linux/ar71xx/image/Makefile > b/target/linux/ar71xx/image/Makefile > index e4f6c71..cc81a0a 100644 > --- a/target/linux/ar71xx/image/Makefile > +++ b/target/linux/ar71xx/image/Makefile > @@ -538,6 +538,8 @@ define Image/Build/WRT400N > fi > endef > > +Image/Build/WAP4410N/buildkernel=$(call MkuImageGzip,$(2),$(3)) > +Image/Build/WAP4410N=$(call Sysupgrade/KRuImage,$(1),$(2),1638400,6356992) > > define Image/Build/CameoAP94/buildkernel > $(call MkuImageLzma,$(2),$(3) $(4)) > @@ -1551,6 +1553,7 @@ $(eval $(call > SingleProfile,WHRHPG300N,64kraw,WHRHPGN,whr-hp-gn,WHR-HP-GN,ttyS0, > $(eval $(call > SingleProfile,WHRHPG300N,64kraw,WLAEAG300N,wlae-ag300n,WLAE-AG300N,ttyS0,115200,$$(whrhpg300n_mtdlayout),WLAE-AG300N)) > > $(eval $(call > SingleProfile,WRT400N,64k,WRT400N,wrt400n,WRT400N,ttyS0,115200)) > +$(eval $(call > SingleProfile,WAP4410N,64k,WAP4410N,wap4410n,WAP4410N,ttyS0,115200)) > > $(eval $(call > SingleProfile,WZRHP128K,128kraw,WZRHPG300NH,wzr-hp-g300nh,WZR-HP-G300NH,ttyS0,115200,WZR-HP-G300NH)) > $(eval $(call > SingleProfile,WZRHP64K,64kraw,WZRHPG300NH2,wzr-hp-g300nh2,WZR-HP-G300NH2,ttyS0,115200,WZR-HP-G300NH2)) > diff --git > a/target/linux/ar71xx/patches-3.18/904-MIPS-ath79-linksys-wap4410n-support.patch > > b/target/linux/ar71xx/patches-3.18/904-MIPS-ath79-linksys-wap4410n-support.patch > new file mode 100644 > index 0000000..a6fd82f > --- /dev/null > +++ > b/target/linux/ar71xx/patches-3.18/904-MIPS-ath79-linksys-wap4410n-support.patch > @@ -0,0 +1,38 @@ > +--- a/arch/mips/ath79/Kconfig > ++++ b/arch/mips/ath79/Kconfig > +@@ -523,6 +523,15 @@ config ATH79_MACH_WRT400N > + select ATH79_DEV_LEDS_GPIO > + select ATH79_DEV_M25P80 > + > ++config ATH79_MACH_WAP4410N > ++ bool "Linksys WAP4410N board support" > ++ select SOC_AR913X > ++ select ATH79_DEV_ETH > ++ select ATH79_DEV_GPIO_BUTTONS > ++ select ATH79_DEV_LEDS_GPIO > ++ select ATH79_DEV_USB > ++ select ATH79_DEV_WMAC > ++ > + config ATH79_MACH_R6100 > + bool "NETGEAR R6100 board support" > + select SOC_AR934X > +--- a/arch/mips/ath79/Makefile > ++++ b/arch/mips/ath79/Makefile > +@@ -149,6 +149,7 @@ obj-$(CONFIG_ATH79_MACH_WPJ344) += mach- > + obj-$(CONFIG_ATH79_MACH_WPJ558) += mach-wpj558.o > + obj-$(CONFIG_ATH79_MACH_WRT160NL) += mach-wrt160nl.o > + obj-$(CONFIG_ATH79_MACH_WRT400N) += mach-wrt400n.o > ++obj-$(CONFIG_ATH79_MACH_WAP4410N) += mach-wap4410n.o > + obj-$(CONFIG_ATH79_MACH_WZR_HP_G300NH) += mach-wzr-hp-g300nh.o > + obj-$(CONFIG_ATH79_MACH_WZR_HP_G300NH2) += mach-wzr-hp-g300nh2.o > + obj-$(CONFIG_ATH79_MACH_WZR_HP_AG300H) += mach-wzr-hp-ag300h.o > +--- a/arch/mips/ath79/machtypes.h > ++++ b/arch/mips/ath79/machtypes.h > +@@ -198,6 +198,7 @@ enum ath79_mach_type { > + ATH79_MACH_WPJ558, /* Compex WPJ558 */ > + ATH79_MACH_WRT160NL, /* Linksys WRT160NL */ > + ATH79_MACH_WRT400N, /* Linksys WRT400N */ > ++ ATH79_MACH_WAP4410N, /* Linksys WAP4410N */ > + ATH79_MACH_WZR_HP_AG300H, /* Buffalo WZR-HP-AG300H */ > + ATH79_MACH_WZR_HP_G300NH, /* Buffalo WZR-HP-G300NH */ > + ATH79_MACH_WZR_HP_G300NH2, /* Buffalo WZR-HP-G300NH2 */ > _______________________________________________ > openwrt-devel mailing list > openwrt-devel@lists.openwrt.org > https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel > _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel