This patch adds support for the Meraki MR24 Access point to the apm821xx target. More info on the device can be found at https://wiki.openwrt.org/toh/meraki/mr24
Signed-off-by: Chris Blake <chrisrblak...@gmail.com> --- .../linux/apm821xx/base-files/etc/board.d/01_leds | 25 ++ .../apm821xx/base-files/etc/board.d/02_network | 5 +- target/linux/apm821xx/base-files/etc/diag.sh | 37 ++ target/linux/apm821xx/base-files/lib/apm821xx.sh | 39 ++ .../lib/preinit/05_set_iface_mac_apm821xx | 17 + .../apm821xx/base-files/lib/upgrade/merakinand.sh | 65 ++++ .../apm821xx/base-files/lib/upgrade/platform.sh | 55 +++ target/linux/apm821xx/dts/MR24.dts | 433 +++++++++++++++++++++ target/linux/apm821xx/image/Makefile | 57 +++ .../700-powerpc_ibm_phy_add_ar8035.patch | 41 ++ .../800-ppc4xx-rng-fix-crash-during-init.patch | 117 ++++++ target/linux/apm821xx/profiles/meraki.mk | 17 + tools/firmware-utils/src/mkmerakifw.c | 10 + 13 files changed, 917 insertions(+), 1 deletion(-) create mode 100755 target/linux/apm821xx/base-files/etc/board.d/01_leds create mode 100755 target/linux/apm821xx/base-files/etc/diag.sh create mode 100755 target/linux/apm821xx/base-files/lib/apm821xx.sh create mode 100644 target/linux/apm821xx/base-files/lib/preinit/05_set_iface_mac_apm821xx create mode 100755 target/linux/apm821xx/base-files/lib/upgrade/merakinand.sh create mode 100755 target/linux/apm821xx/base-files/lib/upgrade/platform.sh create mode 100644 target/linux/apm821xx/dts/MR24.dts create mode 100644 target/linux/apm821xx/patches-4.4/700-powerpc_ibm_phy_add_ar8035.patch create mode 100644 target/linux/apm821xx/patches-4.4/800-ppc4xx-rng-fix-crash-during-init.patch create mode 100644 target/linux/apm821xx/profiles/meraki.mk diff --git a/target/linux/apm821xx/base-files/etc/board.d/01_leds b/target/linux/apm821xx/base-files/etc/board.d/01_leds new file mode 100755 index 0000000..a94871f --- /dev/null +++ b/target/linux/apm821xx/base-files/etc/board.d/01_leds @@ -0,0 +1,25 @@ +#!/bin/sh +# +# Copyright (C) 2016 OpenWrt.org +# + +. /lib/functions/uci-defaults.sh +. /lib/apm821xx.sh + +board_config_update + +board=$(apm821xx_board_name) + +case "$board" in +mr24) + ucidef_set_led_netdev "wan" "WAN" "mr24:green:wan" "eth0" + ucidef_set_led_wlan "wlan1" "WLAN1" "mr24:green:wifi1" "phy0assoc" + ucidef_set_led_wlan "wlan2" "WLAN2" "mr24:green:wifi2" "phy0assoc" + ucidef_set_led_wlan "wlan3" "WLAN3" "mr24:green:wifi3" "phy0assoc" + ucidef_set_led_wlan "wlan4" "WLAN4" "mr24:green:wifi4" "phy0tpt" + ;; +esac + +board_config_flush + +exit 0 diff --git a/target/linux/apm821xx/base-files/etc/board.d/02_network b/target/linux/apm821xx/base-files/etc/board.d/02_network index a4e5ab4..9738b4e 100755 --- a/target/linux/apm821xx/base-files/etc/board.d/02_network +++ b/target/linux/apm821xx/base-files/etc/board.d/02_network @@ -11,7 +11,10 @@ board_config_update board=$(apm821xx_board_name) -case "$board" +case "$board" in +mr24) + ucidef_set_interface_lan "eth0" + ;; *) ucidef_set_interfaces_lan_wan "eth0" "eth1" ;; diff --git a/target/linux/apm821xx/base-files/etc/diag.sh b/target/linux/apm821xx/base-files/etc/diag.sh new file mode 100755 index 0000000..787d0e1 --- /dev/null +++ b/target/linux/apm821xx/base-files/etc/diag.sh @@ -0,0 +1,37 @@ +#!/bin/sh +# +# Copyright (C) 2016 OpenWrt.org +# + +. /lib/functions/leds.sh +. /lib/apm821xx.sh + +get_status_led() { + case $(apm821xx_board_name) in + mr24) + status_led="mr24:green:power" + ;; + esac +} + +set_state() { + get_status_led + + case "$1" in + preinit) + status_led_blink_preinit + ;; + + failsafe) + status_led_blink_failsafe + ;; + + preinit_regular) + status_led_blink_preinit_regular + ;; + + done) + status_led_on + ;; + esac +} diff --git a/target/linux/apm821xx/base-files/lib/apm821xx.sh b/target/linux/apm821xx/base-files/lib/apm821xx.sh new file mode 100755 index 0000000..cfb1536 --- /dev/null +++ b/target/linux/apm821xx/base-files/lib/apm821xx.sh @@ -0,0 +1,39 @@ +#!/bin/sh +# +# Copyright (C) 2016 OpenWrt.org +# + +APM821XX_BOARD_NAME= +APM821XX_MODEL= + +apm821xx_board_detect() { + local model + local name + + model=$(awk 'BEGIN{FS="[ \t]+:[ \t]"} /model/ {print $2}' /proc/cpuinfo) + + case "$model" in + *"Meraki MR24 Access Point") + name="mr24" + ;; + esac + + [ -z "$name" ] && name="unknown" + + [ -z "$APM821XX_BOARD_NAME" ] && APM821XX_BOARD_NAME="$name" + [ -z "$APM821XX_MODEL" ] && APM821XX_MODEL="$model" + + [ -e "/tmp/sysinfo/" ] || mkdir -p "/tmp/sysinfo/" + + echo "$APM821XX_BOARD_NAME" > /tmp/sysinfo/board_name + echo "$APM821XX_MODEL" > /tmp/sysinfo/model +} + +apm821xx_board_name() { + local name + + [ -f /tmp/sysinfo/board_name ] && name=$(cat /tmp/sysinfo/board_name) + [ -z "$name" ] && name="unknown" + + echo "$name" +} diff --git a/target/linux/apm821xx/base-files/lib/preinit/05_set_iface_mac_apm821xx b/target/linux/apm821xx/base-files/lib/preinit/05_set_iface_mac_apm821xx new file mode 100644 index 0000000..773a761 --- /dev/null +++ b/target/linux/apm821xx/base-files/lib/preinit/05_set_iface_mac_apm821xx @@ -0,0 +1,17 @@ +#!/bin/sh +# +# Copyright (C) 2016 OpenWrt.org +# + +. /lib/apm821xx.sh + +preinit_set_mac_address() { + case $(apm821xx_board_name) in + mr24) + mac_lan=$(mtd_get_mac_binary_ubi board-config 102) + [ -n "$mac_lan" ] && ifconfig eth0 hw ether "$mac_lan" + ;; + esac +} + +boot_hook_add preinit_main preinit_set_mac_address diff --git a/target/linux/apm821xx/base-files/lib/upgrade/merakinand.sh b/target/linux/apm821xx/base-files/lib/upgrade/merakinand.sh new file mode 100755 index 0000000..5861d97 --- /dev/null +++ b/target/linux/apm821xx/base-files/lib/upgrade/merakinand.sh @@ -0,0 +1,65 @@ +#!/bin/sh +# +# Copyright (C) 2016 Chris Blake <chrisrblak...@gmail.com> +# +# Custom upgrade script for Meraki NAND devices (ex. MR24) +# Based on merakinand.sh from the ar71xx target +# +. /lib/apm821xx.sh +. /lib/functions.sh + +merakinand_do_kernel_check() { + local board_name="$1" + local tar_file="$2" + local image_magic_word=`(tar xf $tar_file sysupgrade-$board_name/kernel -O 2>/dev/null | dd bs=1 count=4 skip=0 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"')` + + # What is our kernel magic string? + case "$board_name" in + "mr24") + [ "$image_magic_word" == "8e73ed8a" ] && { + echo "pass" && return 0 + } + ;; + esac + + exit 1 +} + +merakinand_do_platform_check() { + local board_name="$1" + local tar_file="$2" + local control_length=`(tar xf $tar_file sysupgrade-$board_name/CONTROL -O | wc -c) 2> /dev/null` + local file_type="$(identify_tar $2 sysupgrade-$board_name/root)" + local kernel_magic="$(merakinand_do_kernel_check $1 $2)" + + case "$board_name" in + "mr24") + [ "$control_length" = 0 -o "$file_type" != "squashfs" -o "$kernel_magic" != "pass" ] && { + echo "Invalid sysupgrade file for $board_name" + return 1 + } + ;; + *) + echo "Unsupported device $board_name"; + return 1 + ;; + esac + + return 0 +} + +merakinand_do_upgrade() { + local tar_file="$1" + local board_name="$(cat /tmp/sysinfo/board_name)" + + # Do we need to do any platform tweaks? + case "$board_name" in + "mr24") + nand_do_upgrade $1 + ;; + *) + echo "Unsupported device $board_name"; + exit 1 + ;; + esac +} diff --git a/target/linux/apm821xx/base-files/lib/upgrade/platform.sh b/target/linux/apm821xx/base-files/lib/upgrade/platform.sh new file mode 100755 index 0000000..f927a79 --- /dev/null +++ b/target/linux/apm821xx/base-files/lib/upgrade/platform.sh @@ -0,0 +1,55 @@ +# +# Copyright (C) 2016 OpenWrt.org +# + +. /lib/apm821xx.sh + +PART_NAME=firmware +RAMFS_COPY_DATA=/lib/apm821xx.sh + +platform_check_image() { + local board=$(apm821xx_board_name) + + [ "$#" -gt 1 ] && return 1 + + case "$board" in + mr24) + merakinand_do_platform_check $board $1 + return $?; + ;; + + esac + + echo "Sysupgrade is not yet supported on $board." + return 1 +} + +platform_pre_upgrade() { + local board=$(apm821xx_board_name) + + case "$board" in + mr24) + merakinand_do_upgrade "$1" + ;; + esac +} + +platform_do_upgrade() { + local board=$(apm821xx_board_name) + + case "$board" in + *) + default_do_upgrade "$ARGV" + ;; + esac +} + +disable_watchdog() { + killall watchdog + ( ps | grep -v 'grep' | grep '/dev/watchdog' ) && { + echo 'Could not disable watchdog' + return 1 + } +} + +append sysupgrade_pre_upgrade disable_watchdog diff --git a/target/linux/apm821xx/dts/MR24.dts b/target/linux/apm821xx/dts/MR24.dts new file mode 100644 index 0000000..7abf9a6 --- /dev/null +++ b/target/linux/apm821xx/dts/MR24.dts @@ -0,0 +1,433 @@ +/* + * Device Tree Source for Meraki MR24 (Ikarem) + * + * Copyright (C) 2016 Chris Blake <chrisrblak...@gmail.com> + * + * Based on Cisco Meraki GPL Release r23-20150601 MR24 DTS + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without + * any warranty of any kind, whether express or implied. + */ + +/dts-v1/; + +/ { + #address-cells = <2>; + #size-cells = <1>; + model = "Meraki MR24 Access Point"; + compatible = "apm,bluestone"; + dcr-parent = <&{/cpus/cpu@0}>; + + aliases { + ethernet0 = &EMAC0; + serial0 = &UART0; + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + cpu@0 { + device_type = "cpu"; + model = "PowerPC,apm821xx"; + reg = <0x00000000>; + clock-frequency = <0>; /* Filled in by U-Boot */ + timebase-frequency = <0>; /* Filled in by U-Boot */ + i-cache-line-size = <32>; + d-cache-line-size = <32>; + i-cache-size = <32768>; + d-cache-size = <32768>; + dcr-controller; + dcr-access-method = "native"; + next-level-cache = <&L2C0>; + }; + }; + + memory { + device_type = "memory"; + reg = <0x00000000 0x00000000 0x00000000>; /* Filled in by U-Boot */ + }; + + UIC0: interrupt-controller0 { + compatible = "ibm,uic"; + interrupt-controller; + cell-index = <0>; + dcr-reg = <0x0c0 0x009>; + #address-cells = <0>; + #size-cells = <0>; + #interrupt-cells = <2>; + }; + + UIC1: interrupt-controller1 { + compatible = "ibm,uic"; + interrupt-controller; + cell-index = <1>; + dcr-reg = <0x0d0 0x009>; + #address-cells = <0>; + #size-cells = <0>; + #interrupt-cells = <2>; + interrupts = <0x1e 0x4 0x1f 0x4>; /* cascade */ + interrupt-parent = <&UIC0>; + }; + + UIC2: interrupt-controller2 { + compatible = "ibm,uic"; + interrupt-controller; + cell-index = <2>; + dcr-reg = <0x0e0 0x009>; + #address-cells = <0>; + #size-cells = <0>; + #interrupt-cells = <2>; + interrupts = <0xa 0x4 0xb 0x4>; /* cascade */ + interrupt-parent = <&UIC0>; + }; + + UIC3: interrupt-controller3 { + compatible = "ibm,uic"; + interrupt-controller; + cell-index = <3>; + dcr-reg = <0x0f0 0x009>; + #address-cells = <0>; + #size-cells = <0>; + #interrupt-cells = <2>; + interrupts = <0x10 0x4 0x11 0x4>; /* cascade */ + interrupt-parent = <&UIC0>; + }; + + /* KPH check the following */ + OCM: ocm@400040000 { + compatible = "ibm,ocm"; + status = "okay"; + cell-index = <1>; + /* configured in U-Boot */ + reg = <4 0x00040000 0x8000>; /* 32K */ + }; + + SDR0: sdr { + compatible = "ibm,sdr-apm821xx"; + dcr-reg = <0x00e 0x002>; + }; + + CPR0: cpr { + compatible = "ibm,cpr-apm821xx"; + dcr-reg = <0x00c 0x002>; + }; + + L2C0: l2c { + compatible = "ibm,l2-cache-apm82181", "ibm,l2-cache"; + dcr-reg = <0x020 0x008 + 0x030 0x008>; + cache-line-size = <32>; + cache-size = <262144>; + interrupt-parent = <&UIC1>; + interrupts = <11 1>; + }; + + /* kph check the below */ + CPM0: cpm { + compatible = "ibm,cpm-apm821xx", "ibm,cpm"; + cell-index = <0>; + dcr-reg = <0x160 0x003>; + pm-cpu = <0x02000000>; + pm-doze = <0x302570F0>; + pm-nap = <0x302570F0>; + pm-deepsleep = <0x302570F0>; + pm-iic-device = <&IIC0>; + pm-emac-device = <&EMAC0>; + }; + + plb { + compatible = "ibm,plb4"; + #address-cells = <2>; + #size-cells = <1>; + ranges; + clock-frequency = <0>; /* Filled in by U-Boot */ + + SDRAM0: sdram { + compatible = "ibm,sdram-apm821xx"; + dcr-reg = <0x010 0x002>; + }; + + /* kph check the below */ + CRYPTO: crypto@180000 { + compatible = "amcc,ppc460ex-crypto", "amcc,ppc4xx-crypto"; + reg = <4 0x00180000 0x80400>; + interrupt-parent = <&UIC0>; + interrupts = <0x1d 0x4>; + }; + + /* kph check the below */ + PKA: pka@114000 { + device_type = "pka"; + compatible = "ppc4xx-pka", "amcc,ppc4xx-pka"; + reg = <4 0x00114000 0x4000>; + interrupt-parent = <&UIC0>; + interrupts = <0x14 0x2>; + }; + + /* kph check the below */ + TRNG: trng@110000 { + compatible = "ppc4xx-trng", "amcc,ppc460ex-rng"; + reg = <4 0x00110000 0x50>; + interrupt-parent = <&UIC1>; + interrupts = <0x3 0x2>; + }; + + MAL0: mcmal { + compatible = "ibm,mcmal2"; + descriptor-memory = "ocm"; + dcr-reg = <0x180 0x062>; + num-tx-chans = <1>; + num-rx-chans = <1>; + #address-cells = <0>; + #size-cells = <0>; + interrupt-parent = <&UIC2>; + interrupts = < /*TXEOB*/ 0x6 0x4 + /*RXEOB*/ 0x7 0x4 + /*SERR*/ 0x3 0x4 + /*TXDE*/ 0x4 0x4 + /*RXDE*/ 0x5 0x4>; + }; + + POB0: opb { + compatible = "ibm,opb"; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0xb0000000 0x00000004 0xb0000000 0x50000000>; + clock-frequency = <0>; /* Filled in by U-Boot */ + + EBC0: ebc { + compatible = "ibm,ebc"; + dcr-reg = <0x012 0x002>; + #address-cells = <2>; + #size-cells = <1>; + clock-frequency = <0>; /* Filled in by U-Boot */ + /* ranges property is supplied by U-Boot */ + ranges = < 0x00000003 0x00000000 0xe0000000 0x8000000>; + interrupts = <0x6 0x4>; + interrupt-parent = <&UIC1>; + + /* Ikarem has 32MB of NAND */ + ndfc@1,0 { + compatible = "ibm,ndfc"; + reg = <00000003 00000000 00000400>; + ccr = <0x00001000>; + bank-settings = <0x80002222>; + #address-cells = <1>; + #size-cells = <1>; + /* 32 MiB NAND Flash */ + nand { + #address-cells = <1>; + #size-cells = <1>; + partition@0 { + label = "u-boot"; + reg = <0x00000000 0x00170000>; + read-only; + }; + partition@170000 { + label = "oops"; + reg = <0x00170000 0x00010000>; + }; + partition@180000 { + label = "ubi"; + reg = <0x00180000 0x01e80000>; + }; + }; + }; + }; + + UART0: serial@ef600400 { + device_type = "serial"; + compatible = "ns16550"; + reg = <0xef600400 0x00000008>; + virtual-reg = <0xef600400>; + clock-frequency = <0>; /* Filled in by U-Boot */ + current-speed = <0>; /* Filled in by U-Boot */ + interrupt-parent = <&UIC0>; + interrupts = <0x1 0x4>; + }; + + GPIO0: gpio@ef600b00 { + compatible = "ibm,ppc4xx-gpio"; + reg = <0xef600b00 0x00000048>; + #gpio-cells = <2>; + gpio-controller; + }; + + gpio-leds { + compatible = "gpio-leds"; + power-green { + label = "mr24:green:power"; + gpios = <&GPIO0 18 1>; + }; + power-orange { + label = "mr24:orange:power"; + gpios = <&GPIO0 19 1>; + }; + lan { + label = "mr24:green:wan"; + gpios = <&GPIO0 17 1>; + }; + ssi-0 { + label = "mr24:green:wifi1"; + gpios = <&GPIO0 23 1>; + }; + ssi-1 { + label = "mr24:green:wifi2"; + gpios = <&GPIO0 22 1>; + }; + ssi-2 { + label = "mr24:green:wifi3"; + gpios = <&GPIO0 21 1>; + }; + ssi-3 { + label = "mr24:green:wifi4"; + gpios = <&GPIO0 20 1>; + }; + }; + + gpio_keys_polled { + compatible = "gpio-keys-polled"; + #address-cells = <1>; + #size-cells = <0>; + poll-interval = <60>; /* 3 * 20 = 60ms */ + autorepeat; + button@1 { + label = "Reset button"; + linux,code = <0x198>; /* KEY_RESTART */ + gpios = <&GPIO0 16 1>; + }; + }; + + IIC0: i2c@ef600700 { + compatible = "ibm,iic"; + reg = <0xef600700 0x00000014>; + interrupt-parent = <&UIC0>; + interrupts = <0x2 0x4>; + #address-cells = <1>; + #size-cells = <0>; + /* Boot ROM is at 0x52-0x53, do not touch */ + /* Unknown chip at 0x6e, not sure what it is */ + }; + + IIC1: i2c@ef600800 { + compatible = "ibm,iic"; + reg = <0xef600800 0x00000014>; + interrupt-parent = <&UIC0>; + interrupts = <0x3 0x4>; + }; + + RGMII0: emac-rgmii@ef601500 { + compatible = "ibm,rgmii"; + reg = <0xef601500 0x00000008>; + has-mdio; + }; + + TAH0: emac-tah@ef601350 { + compatible = "ibm,tah"; + reg = <0xef601350 0x00000030>; + }; + + EMAC0: ethernet@ef600c00 { + device_type = "network"; + compatible = "ibm,emac-apm821xx", "ibm,emac4sync"; + interrupt-parent = <&EMAC0>; + interrupts = <0x0 0x1>; + #interrupt-cells = <1>; + #address-cells = <0>; + #size-cells = <0>; + interrupt-map = </*Status*/ 0x0 &UIC2 0x10 0x4 + /*Wake*/ 0x1 &UIC2 0x14 0x4>; + reg = <0xef600c00 0x000000c4>; + local-mac-address = [000000000000]; /* Filled in by U-Boot */ + mal-device = <&MAL0>; + mal-tx-channel = <0>; + mal-rx-channel = <0>; + cell-index = <0>; + max-frame-size = <9000>; + rx-fifo-size = <16384>; + tx-fifo-size = <2048>; + phy-mode = "rgmii"; + phy-map = <0x00000000>; + rgmii-device = <&RGMII0>; + rgmii-channel = <0>; + tah-device = <&TAH0>; + tah-channel = <0>; + has-inverted-stacr-oc; + has-new-stacr-staopc; + }; + }; + + PCIE0: pciex@d00000000 { + device_type = "pci"; + #interrupt-cells = <1>; + #size-cells = <2>; + #address-cells = <3>; + compatible = "ibm,plb-pciex-apm821xx", "ibm,plb-pciex"; + primary; + port = <0x0>; /* port number */ + reg = <0x0000000d 0x00000000 0x20000000 /* Config space access */ + 0x0000000c 0x08010000 0x00001000>; /* Registers */ + dcr-reg = <0x100 0x020>; + sdr-base = <0x300>; + + /* Outbound ranges, one memory and one IO, + * later cannot be changed + */ + ranges = <0x02000000 0x00000000 0x80000000 0x0000000e 0x00000000 0x00000000 0x80000000 + 0x02000000 0x00000000 0x00000000 0x0000000f 0x00000000 0x00000000 0x00100000 + 0x01000000 0x00000000 0x00000000 0x0000000f 0x80000000 0x00000000 0x00010000>; + + /* Inbound 2GB range starting at 0 */ + dma-ranges = <0x42000000 0x0 0x0 0x0 0x0 0x0 0x80000000>; + + /* This drives busses 40 to 0x7f */ + bus-range = <0x40 0x7f>; + + /* Legacy interrupts (note the weird polarity, the bridge seems + * to invert PCIe legacy interrupts). + * We are de-swizzling here because the numbers are actually for + * port of the root complex virtual P2P bridge. But I want + * to avoid putting a node for it in the tree, so the numbers + * below are basically de-swizzled numbers. + * The real slot is on idsel 0, so the swizzling is 1:1 + */ + interrupt-map-mask = <0x0 0x0 0x0 0x7>; + interrupt-map = < + 0x0 0x0 0x0 0x1 &UIC3 0xc 0x4 /* swizzled int A */ + 0x0 0x0 0x0 0x2 &UIC3 0xd 0x4 /* swizzled int B */ + 0x0 0x0 0x0 0x3 &UIC3 0xe 0x4 /* swizzled int C */ + 0x0 0x0 0x0 0x4 &UIC3 0xf 0x4 /* swizzled int D */>; + }; + + MSI: ppc4xx-msi@C10000000 { + compatible = "amcc,ppc4xx-msi", "ppc4xx-msi"; + reg = < 0xC 0x10000000 0x100 + 0xC 0x10000000 0x100>; + sdr-base = <0x36C>; + msi-data = <0x00004440>; + msi-mask = <0x0000ffe0>; + interrupts =<0 1 2 3 4 5 6 7>; + interrupt-parent = <&MSI>; + #interrupt-cells = <1>; + #address-cells = <0>; + #size-cells = <0>; + msi-available-ranges = <0x0 0x100>; + interrupt-map = < + 0 &UIC3 0x18 1 + 1 &UIC3 0x19 1 + 2 &UIC3 0x1A 1 + 3 &UIC3 0x1B 1 + 4 &UIC3 0x1C 1 + 5 &UIC3 0x1D 1 + 6 &UIC3 0x1E 1 + 7 &UIC3 0x1F 1 + >; + }; + }; + + chosen { + linux,stdout-path = "/plb/opb/serial@ef600400"; + }; +}; diff --git a/target/linux/apm821xx/image/Makefile b/target/linux/apm821xx/image/Makefile index a9608e7..69f9fb7 100644 --- a/target/linux/apm821xx/image/Makefile +++ b/target/linux/apm821xx/image/Makefile @@ -11,6 +11,46 @@ IMAGE_PROFILE:=$(if $(PROFILE),$(PROFILE),Default) DEVICE_VARS += DTS IMAGE_SIZE +define Image/cpiogz + ( cd $(TARGET_DIR); find . | cpio -o -H newc | gzip -9n >$(KDIR_TMP)/$(IMG_PREFIX)-rootfs.cpio.gz ) +endef + +define Build/copy-file + cat "$(1)" > "$@" +endef + +define Build/MerakiAdd-dtb + $(call Image/BuildDTB,../dts/$(DTS).dts,$@.dtb) + ( \ + dd if=$@.dtb bs=$(DTB_SIZE) conv=sync; \ + dd if=$@ bs=$(BLOCKSIZE) conv=sync; \ + ) > $@.new + @mv $@.new $@ +endef + +define Build/MerakiAdd-initramfs + $(call Image/cpiogz) + + -$(STAGING_DIR_HOST)/bin/mkimage -A $(LINUX_KARCH) -O linux -T ramdisk \ + -C gzip -n "$(PROFILE) OpenWRT rootfs" \ + -d $(KDIR_TMP)/$(IMG_PREFIX)-rootfs.cpio.gz \ + $(KDIR_TMP)/$(IMG_PREFIX)-uramdisk.image.gz + + ( \ + dd if=$@ bs=1k conv=sync; \ + dd if=$(KDIR_TMP)/$(IMG_PREFIX)-uramdisk.image.gz bs=$(BLOCKSIZE) conv=sync; \ + ) > $@.new + @mv $@.new $@ +endef + +define Build/MerakiNAND + -$(STAGING_DIR_HOST)/bin/mkmerakifw \ + -B $(BOARDNAME) -s \ + -i $@ \ + -o $@.new + @cp $@.new $@ +endef + define Device/Default BOARDNAME := DEVICE_PROFILE = $$(BOARDNAME) @@ -21,4 +61,21 @@ define Device/Default endef TARGET_DEVICES += Default +define Device/mr24 + BOARDNAME = MR24 + BLOCKSIZE := 64k + IMAGES := sysupgrade.tar + DTS := MR24 + DTB_SIZE := 63k + KERNEL_SIZE := 2048k + IMAGE_SIZE := 8191k + KERNEL_ENTRY := 0x00000000 + KERNEL_LOADADDR := 0x00000000 + KERNEL := kernel-bin | gzip | uImage gzip | MerakiAdd-dtb | MerakiNAND + KERNEL_INITRAMFS := copy-file $(KDIR)/vmlinux | gzip | uImage gzip | MerakiAdd-dtb | pad-to 2047k | MerakiAdd-initramfs | MerakiNAND + IMAGE/sysupgrade.tar := sysupgrade-nand + +endef +TARGET_DEVICES += mr24 + $(eval $(call BuildImage)) diff --git a/target/linux/apm821xx/patches-4.4/700-powerpc_ibm_phy_add_ar8035.patch b/target/linux/apm821xx/patches-4.4/700-powerpc_ibm_phy_add_ar8035.patch new file mode 100644 index 0000000..b0c1eeb --- /dev/null +++ b/target/linux/apm821xx/patches-4.4/700-powerpc_ibm_phy_add_ar8035.patch @@ -0,0 +1,41 @@ +--- a/drivers/net/ethernet/ibm/emac/phy.c ++++ b/drivers/net/ethernet/ibm/emac/phy.c +@@ -470,12 +470,38 @@ static struct mii_phy_def m88e1112_phy_d + .ops = &m88e1112_phy_ops, + }; + ++static int ar8035_init(struct mii_phy *phy) ++{ ++ phy_write(phy, 0x1d, 0x5); /* Address debug register 5 */ ++ phy_write(phy, 0x1e, 0x2d47); /* ?? Value copied from u-boot */ ++ phy_write(phy, 0x1d, 0xb); /* Address hib ctrl */ ++ phy_write(phy, 0x1e, 0xbc20); /* Another poorly documented register */ ++ ++ return 0; ++} ++ ++static struct mii_phy_ops ar8035_phy_ops = { ++ .init = ar8035_init, ++ .setup_aneg = genmii_setup_aneg, ++ .setup_forced = genmii_setup_forced, ++ .poll_link = genmii_poll_link, ++ .read_link = genmii_read_link, ++}; ++ ++static struct mii_phy_def ar8035_phy_def = { ++ .phy_id = 0x004dd070, ++ .phy_id_mask = 0xfffffff0, ++ .name = "Atheros 8035 Gigabit Ethernet", ++ .ops = &ar8035_phy_ops, ++}; ++ + static struct mii_phy_def *mii_phy_table[] = { + &et1011c_phy_def, + &cis8201_phy_def, + &bcm5248_phy_def, + &m88e1111_phy_def, + &m88e1112_phy_def, ++ &ar8035_phy_def, + &genmii_phy_def, + NULL + }; diff --git a/target/linux/apm821xx/patches-4.4/800-ppc4xx-rng-fix-crash-during-init.patch b/target/linux/apm821xx/patches-4.4/800-ppc4xx-rng-fix-crash-during-init.patch new file mode 100644 index 0000000..6eed32f --- /dev/null +++ b/target/linux/apm821xx/patches-4.4/800-ppc4xx-rng-fix-crash-during-init.patch @@ -0,0 +1,117 @@ +From 2159e200fcb68f88a94b1d5570d6000c100133a8 Mon Sep 17 00:00:00 2001 +From: Christian Lamparter <chunk...@googlemail.com> +Date: Fri, 25 Mar 2016 19:00:05 +0100 +Subject: [PATCH] ppc4xx-rng: fix crash during init + +This patch fixes a crash that happens in the ppc4xx-rng driver +when accessing the main crypto core to enable the true random +number generator. + +Signed-off-by: Christian Lamparter <chunk...@googlemail.com> +--- + drivers/char/hw_random/ppc4xx-rng.c | 42 --------------------------------- + drivers/crypto/amcc/crypto4xx_core.c | 1 + + drivers/crypto/amcc/crypto4xx_reg_def.h | 1 + + 3 files changed, 2 insertions(+), 42 deletions(-) + +diff --git a/drivers/char/hw_random/ppc4xx-rng.c b/drivers/char/hw_random/ppc4xx-rng.c +index c0db438..a9a8a29 100644 +--- a/drivers/char/hw_random/ppc4xx-rng.c ++++ b/drivers/char/hw_random/ppc4xx-rng.c +@@ -17,9 +17,6 @@ + #include <linux/of_platform.h> + #include <asm/io.h> + +-#define PPC4XX_TRNG_DEV_CTRL 0x60080 +- +-#define PPC4XX_TRNGE 0x00020000 + #define PPC4XX_TRNG_CTRL 0x0008 + #define PPC4XX_TRNG_CTRL_DALM 0x20 + #define PPC4XX_TRNG_STAT 0x0004 +@@ -51,40 +48,6 @@ static int ppc4xx_rng_data_read(struct hwrng *rng, u32 *data) + return 4; + } + +-static int ppc4xx_rng_enable(int enable) +-{ +- struct device_node *ctrl; +- void __iomem *ctrl_reg; +- int err = 0; +- u32 val; +- +- /* Find the main crypto device node and map it to turn the TRNG on */ +- ctrl = of_find_compatible_node(NULL, NULL, "amcc,ppc4xx-crypto"); +- if (!ctrl) +- return -ENODEV; +- +- ctrl_reg = of_iomap(ctrl, 0); +- if (!ctrl_reg) { +- err = -ENODEV; +- goto out; +- } +- +- val = in_le32(ctrl_reg + PPC4XX_TRNG_DEV_CTRL); +- +- if (enable) +- val |= PPC4XX_TRNGE; +- else +- val = val & ~PPC4XX_TRNGE; +- +- out_le32(ctrl_reg + PPC4XX_TRNG_DEV_CTRL, val); +- iounmap(ctrl_reg); +- +-out: +- of_node_put(ctrl); +- +- return err; +-} +- + static struct hwrng ppc4xx_rng = { + .name = MODULE_NAME, + .data_present = ppc4xx_rng_data_present, +@@ -100,10 +63,6 @@ static int ppc4xx_rng_probe(struct platform_device *dev) + if (!rng_regs) + return -ENODEV; + +- err = ppc4xx_rng_enable(1); +- if (err) +- return err; +- + out_le32(rng_regs + PPC4XX_TRNG_CTRL, PPC4XX_TRNG_CTRL_DALM); + ppc4xx_rng.priv = (unsigned long) rng_regs; + +@@ -117,7 +76,6 @@ static int ppc4xx_rng_remove(struct platform_device *dev) + void __iomem *rng_regs = (void __iomem *) ppc4xx_rng.priv; + + hwrng_unregister(&ppc4xx_rng); +- ppc4xx_rng_enable(0); + iounmap(rng_regs); + + return 0; +diff --git a/drivers/crypto/amcc/crypto4xx_core.c b/drivers/crypto/amcc/crypto4xx_core.c +index 62134c8..cb0b262 100644 +--- a/drivers/crypto/amcc/crypto4xx_core.c ++++ b/drivers/crypto/amcc/crypto4xx_core.c +@@ -90,6 +90,7 @@ static void crypto4xx_hw_init(struct crypto4xx_device *dev) + writel(ring_ctrl.w, dev->ce_base + CRYPTO4XX_RING_CTRL); + device_ctrl = readl(dev->ce_base + CRYPTO4XX_DEVICE_CTRL); + device_ctrl |= PPC4XX_DC_3DES_EN; ++ device_ctrl |= PPC4XX_TRNGE; + writel(device_ctrl, dev->ce_base + CRYPTO4XX_DEVICE_CTRL); + writel(dev->gdr_pa, dev->ce_base + CRYPTO4XX_GATH_RING_BASE); + writel(dev->sdr_pa, dev->ce_base + CRYPTO4XX_SCAT_RING_BASE); +diff --git a/drivers/crypto/amcc/crypto4xx_reg_def.h b/drivers/crypto/amcc/crypto4xx_reg_def.h +index 5f5fbc0..914efc6 100644 +--- a/drivers/crypto/amcc/crypto4xx_reg_def.h ++++ b/drivers/crypto/amcc/crypto4xx_reg_def.h +@@ -124,6 +124,7 @@ + #define PPC4XX_BYTE_ORDER 0x22222 + #define PPC4XX_INTERRUPT_CLR 0x3ffff + #define PPC4XX_PRNG_CTRL_AUTO_EN 0x3 ++#define PPC4XX_TRNGE 0x00020000 + #define PPC4XX_DC_3DES_EN 1 + #define PPC4XX_INT_DESCR_CNT 4 + #define PPC4XX_INT_TIMEOUT_CNT 0 +-- +2.8.0.rc3 + diff --git a/target/linux/apm821xx/profiles/meraki.mk b/target/linux/apm821xx/profiles/meraki.mk new file mode 100644 index 0000000..c22a485 --- /dev/null +++ b/target/linux/apm821xx/profiles/meraki.mk @@ -0,0 +1,17 @@ +# +# Copyright (C) 2016 Chris Blake (chrisrblak...@gmail.com) +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +define Profile/MR24 + NAME:=Meraki MR24 + PACKAGES:=kmod-spi-gpio kmod-gpio-button-hotplug swconfig kmod-ath9k +endef + +define Profile/MR24/description + Package set optimized for the Cisco Meraki MR24 Access Point. +endef + +$(eval $(call Profile,MR24)) diff --git a/tools/firmware-utils/src/mkmerakifw.c b/tools/firmware-utils/src/mkmerakifw.c index 241bb33..61b81c6 100644 --- a/tools/firmware-utils/src/mkmerakifw.c +++ b/tools/firmware-utils/src/mkmerakifw.c @@ -62,6 +62,16 @@ static const struct board_info boards[] = { 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09}, }, { + .id = "mr24", + .description = "Meraki MR24 Access Point", + .magic = 0x8e73ed8a, + .imagelen = 0x00800000, + .statichash = {0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff}, + }, { + /* terminating entry */ } }; -- 2.1.4 _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel