diff --git a/patches/0017-ipq807x-add-the-Qualcomm-AX-target-support.patch b/patches/0017-ipq807x-add-the-Qualcomm-AX-target-support.patch index 5fcaf9920..cd6037ca1 100644 --- a/patches/0017-ipq807x-add-the-Qualcomm-AX-target-support.patch +++ b/patches/0017-ipq807x-add-the-Qualcomm-AX-target-support.patch @@ -1,25 +1,14868 @@ -From ba5c41500dfb7c7ccb0fa6d83f3bf7dd57b936a1 Mon Sep 17 00:00:00 2001 +From 67a6b38fa419294a243219e1d99ac0f8e89daef4 Mon Sep 17 00:00:00 2001 From: John Crispin -Date: Mon, 27 Sep 2021 09:59:01 +0200 -Subject: [PATCH] foo +Date: Sat, 18 Jul 2020 08:53:44 +0200 +Subject: [PATCH 01/30] ipq807x: add the Qualcomm AX target support +Signed-off-by: John Crispin --- - .../ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) + config/Config-kernel.in | 9 + + include/image.mk | 6 +- + include/kernel-version.mk | 2 +- + package/boot/uboot-envtools/files/ipq807x | 37 + + .../etc/hotplug.d/firmware/11-ath10k-caldata | 5 + + target/linux/ipq807x/109-logspam.patch | 24 + + target/linux/ipq807x/Makefile | 22 + + .../ipq807x/base-files/etc/board.d/01_leds | 36 + + .../ipq807x/base-files/etc/board.d/02_network | 78 + + .../etc/hotplug.d/firmware/10-ath11k-caldata | 92 + + .../ipq807x/base-files/etc/init.d/aq_phy | 15 + + .../ipq807x/base-files/etc/init.d/bootcount | 12 + + .../linux/ipq807x/base-files/etc/init.d/wdt | 14 + + ...G4_v5.4.B-AQR_CIG_WIFI_ID44715_VER1673.cld | Bin 0 -> 391170 bytes + .../base-files/lib/upgrade/platform.sh | 66 + + target/linux/ipq807x/config-4.4 | 828 +++++++++ + .../arm/boot/dts/qcom-ipq6018-cig-wf188.dts | 18 + + .../arm/boot/dts/qcom-ipq6018-cig-wf188n.dts | 18 + + .../boot/dts/qcom-ipq6018-edgecore-eap101.dts | 18 + + .../boot/dts/qcom-ipq6018-miwifi-ax1800.dts | 18 + + .../arch/arm/boot/dts/qcom-ipq807x-eap102.dts | 26 + + .../arch/arm/boot/dts/qcom-ipq807x-eap106.dts | 26 + + .../arch/arm/boot/dts/qcom-ipq807x-ex227.dts | 26 + + .../arch/arm/boot/dts/qcom-ipq807x-ex447.dts | 26 + + .../boot/dts/qcom-ipq807x-sercomm-wallaby.dts | 26 + + .../arch/arm/boot/dts/qcom-ipq807x-wf194c.dts | 26 + + .../dts/qcom/qcom-ipq6018-miwifi-ax1800.dts | 419 +++++ + .../boot/dts/qcom/qcom-ipq807x-eap102.dts | 918 ++++++++++ + target/linux/ipq807x/image/Makefile | 26 + + target/linux/ipq807x/image/ipq60xx.mk | 47 + + target/linux/ipq807x/image/ipq807x.mk | 81 + + target/linux/ipq807x/ipq60xx/config-default | 122 ++ + .../linux/ipq807x/ipq60xx/profiles/default.mk | 9 + + target/linux/ipq807x/ipq60xx/target.mk | 8 + + target/linux/ipq807x/ipq807x/config-default | 78 + + .../linux/ipq807x/ipq807x/profiles/default.mk | 9 + + target/linux/ipq807x/ipq807x/target.mk | 7 + + target/linux/ipq807x/modules.mk | 61 + + .../linux/ipq807x/patches/100-qrtr-ns.patch | 976 +++++++++++ + .../linux/ipq807x/patches/101-squashfs.patch | 16 + + .../linux/ipq807x/patches/102-cig-wf188.patch | 869 ++++++++++ + .../ipq807x/patches/103-sercomm-wallaby.patch | 816 +++++++++ + target/linux/ipq807x/patches/104-wf194c.patch | 816 +++++++++ + .../patches/105-fix-dtc-gcc10-build.patch | 11 + + target/linux/ipq807x/patches/106-eap101.patch | 993 +++++++++++ + .../linux/ipq807x/patches/108-log-spam.patch | 37 + + target/linux/ipq807x/patches/109-tplink.patch | 1518 +++++++++++++++++ + .../ipq807x/patches/110-add-esmt-nand.patch | 37 + + target/linux/ipq807x/patches/111-eap106.patch | 765 +++++++++ + target/linux/ipq807x/patches/112-pstore.patch | 147 ++ + 50 files changed, 10258 insertions(+), 2 deletions(-) + create mode 100644 package/boot/uboot-envtools/files/ipq807x + create mode 100644 target/linux/ipq807x/109-logspam.patch + create mode 100644 target/linux/ipq807x/Makefile + create mode 100755 target/linux/ipq807x/base-files/etc/board.d/01_leds + create mode 100755 target/linux/ipq807x/base-files/etc/board.d/02_network + create mode 100755 target/linux/ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata + create mode 100755 target/linux/ipq807x/base-files/etc/init.d/aq_phy + create mode 100755 target/linux/ipq807x/base-files/etc/init.d/bootcount + create mode 100755 target/linux/ipq807x/base-files/etc/init.d/wdt + create mode 100644 target/linux/ipq807x/base-files/lib/firmware/AQR-G4_v5.4.B-AQR_CIG_WIFI_ID44715_VER1673.cld + create mode 100755 target/linux/ipq807x/base-files/lib/upgrade/platform.sh + create mode 100644 target/linux/ipq807x/config-4.4 + create mode 100644 target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq6018-cig-wf188.dts + create mode 100644 target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq6018-cig-wf188n.dts + create mode 100644 target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq6018-edgecore-eap101.dts + create mode 100644 target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq6018-miwifi-ax1800.dts + create mode 100644 target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-eap102.dts + create mode 100644 target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-eap106.dts + create mode 100644 target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-ex227.dts + create mode 100644 target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-ex447.dts + create mode 100644 target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-sercomm-wallaby.dts + create mode 100644 target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-wf194c.dts + create mode 100755 target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq6018-miwifi-ax1800.dts + create mode 100755 target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq807x-eap102.dts + create mode 100644 target/linux/ipq807x/image/Makefile + create mode 100644 target/linux/ipq807x/image/ipq60xx.mk + create mode 100644 target/linux/ipq807x/image/ipq807x.mk + create mode 100644 target/linux/ipq807x/ipq60xx/config-default + create mode 100644 target/linux/ipq807x/ipq60xx/profiles/default.mk + create mode 100644 target/linux/ipq807x/ipq60xx/target.mk + create mode 100644 target/linux/ipq807x/ipq807x/config-default + create mode 100644 target/linux/ipq807x/ipq807x/profiles/default.mk + create mode 100644 target/linux/ipq807x/ipq807x/target.mk + create mode 100644 target/linux/ipq807x/modules.mk + create mode 100644 target/linux/ipq807x/patches/100-qrtr-ns.patch + create mode 100644 target/linux/ipq807x/patches/101-squashfs.patch + create mode 100644 target/linux/ipq807x/patches/102-cig-wf188.patch + create mode 100644 target/linux/ipq807x/patches/103-sercomm-wallaby.patch + create mode 100644 target/linux/ipq807x/patches/104-wf194c.patch + create mode 100644 target/linux/ipq807x/patches/105-fix-dtc-gcc10-build.patch + create mode 100644 target/linux/ipq807x/patches/106-eap101.patch + create mode 100644 target/linux/ipq807x/patches/108-log-spam.patch + create mode 100644 target/linux/ipq807x/patches/109-tplink.patch + create mode 100644 target/linux/ipq807x/patches/110-add-esmt-nand.patch + create mode 100644 target/linux/ipq807x/patches/111-eap106.patch + create mode 100644 target/linux/ipq807x/patches/112-pstore.patch -diff --git a/target/linux/ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata b/target/linux/ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata -index e8dfc85403..2b768e2f9b 100755 ---- a/target/linux/ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata -+++ b/target/linux/ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata -@@ -47,7 +47,7 @@ case "$FIRMWARE" in - tplink,ex227|\ - tplink,ex447|\ - sercomm,wallaby) -- caldata_extract "0:ART" 0x1000 0x10000 -+ caldata_extract "0:ART" 0x1000 0x20000 +diff --git a/config/Config-kernel.in b/config/Config-kernel.in +index f71114b5da..4a85d83118 100644 +--- a/config/Config-kernel.in ++++ b/config/Config-kernel.in +@@ -2,6 +2,15 @@ + # + # Copyright (C) 2006-2014 OpenWrt.org + ++config KERNEL_IPQ_MEM_PROFILE ++ int "Different memory profile " ++ range 0 1024 ++ default 512 ++ depends on TARGET_ipq807x ++ help ++ This option select memory profile to be used,which defines ++ the reserved memory configuration used in device tree. ++ + config KERNEL_BUILD_USER + string "Custom Kernel Build User Name" + default "builder" if BUILDBOT +diff --git a/include/image.mk b/include/image.mk +index 6fc02a3f6b..92b23321b1 100644 +--- a/include/image.mk ++++ b/include/image.mk +@@ -179,6 +179,10 @@ define Image/pad-root-squashfs + $(call Image/pad-to,$(KDIR)/root.squashfs,$(if $(1),$(1),$(ROOTFS_PARTSIZE))) + endef + ++ifeq ($(CONFIG_IPQ_MEM_PROFILE),512) ++DTC_CFLAGS = -D __IPQ_MEM_PROFILE_512_MB__ ++endif ++ + # $(1) source dts file + # $(2) target dtb file + # $(3) extra CPP flags +@@ -188,7 +192,7 @@ define Image/BuildDTB + -I$(DTS_DIR) \ + -I$(DTS_DIR)/include \ + -I$(LINUX_DIR)/include/ \ +- -undef -D__DTS__ $(3) \ ++ -undef -D__DTS__ $(DTC_CFLAGS) $(3) \ + -o $(2).tmp $(1) + $(LINUX_DIR)/scripts/dtc/dtc -O dtb \ + -i$(dir $(1)) $(DTC_FLAGS) $(4) \ +diff --git a/include/kernel-version.mk b/include/kernel-version.mk +index 3c109c13c8..dff01895be 100644 +--- a/include/kernel-version.mk ++++ b/include/kernel-version.mk +@@ -11,7 +11,7 @@ LINUX_VERSION-4.14 = .193 + LINUX_VERSION-5.4 = .142 + LINUX_VERSION-5.10 = .27 + +-LINUX_KERNEL_HASH-4.4.60 = 2cd8df6f1ac6a5329c5a286ec9b5956215977221a1b731597ed169fff74a9659 ++LINUX_KERNEL_HASH-4.4.60 = e7f2f47acf17497d6ffd713eda65c025b3df0bce09faa8c04712bf1b3cfc9fdb + LINUX_KERNEL_HASH-4.14.193 = 0b0fb41d4430e1a42738b341cbfd2f41951aa5cd02acabbd53f076119c8b9f03 + LINUX_KERNEL_HASH-5.4.142 = 99785728968564ba27c7e552d024b560072dcbc885540912eabb5c021e231451 + LINUX_KERNEL_HASH-5.10.27 = d99dc9662951299c53a0a8d8c8d0a72a16ff861d20e927c0f9b14f63282d69d9 +diff --git a/package/boot/uboot-envtools/files/ipq807x b/package/boot/uboot-envtools/files/ipq807x +new file mode 100644 +index 0000000000..6c429f1852 +--- /dev/null ++++ b/package/boot/uboot-envtools/files/ipq807x +@@ -0,0 +1,37 @@ ++[ -e /etc/config/ubootenv ] && exit 0 ++ ++touch /etc/config/ubootenv ++ ++. /lib/uboot-envtools.sh ++. /lib/functions.sh ++ ++board=$(board_name) ++ ++ubootenv_mtdinfo () { ++ UBOOTENV_PART=$(cat /proc/mtd | grep APPSBLENV) ++ mtd_dev=$(echo $UBOOTENV_PART | awk '{print $1}' | sed 's/:$//') ++ mtd_size=$(echo $UBOOTENV_PART | awk '{print "0x"$2}') ++ mtd_erase=$(echo $UBOOTENV_PART | awk '{print "0x"$3}') ++ nor_flash=$(find /sys/bus/spi/devices/*/mtd -name ${mtd_dev}) ++ ++ if [ -n "$nor_flash" ]; then ++ ubootenv_size=$mtd_size ++ else ++ # size is fixed to 0x40000 in u-boot ++ ubootenv_size=0x40000 ++ fi ++ ++ sectors=$(( $ubootenv_size / $mtd_erase )) ++ echo /dev/$mtd_dev 0x0 $ubootenv_size $mtd_erase $sectors ++} ++ ++case "$board" in ++*) ++ ubootenv_add_uci_config $(ubootenv_mtdinfo) ++ ;; ++esac ++ ++config_load ubootenv ++config_foreach ubootenv_add_app_config ubootenv ++ ++exit 0 +diff --git a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +index b12c9af9a7..b7ee73b12e 100644 +--- a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata ++++ b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +@@ -265,6 +265,11 @@ case "$FIRMWARE" in + caldata_extract "ART" 0x5000 0x2f20 + ath10k_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) -1) ;; ++ tp-link,ap2220 |\ ++ tp-link,ec420-g1) ++ ath10kcal_extract "0:ART" 4096 12064 ++ ath10kcal_patch_mac_crc $(macaddr_add "$(get_tip mac_address)" 9) #2.4G, wlan1 ++ ;; esac ;; + *) +diff --git a/target/linux/ipq807x/109-logspam.patch b/target/linux/ipq807x/109-logspam.patch +new file mode 100644 +index 0000000000..79ee61dc77 +--- /dev/null ++++ b/target/linux/ipq807x/109-logspam.patch +@@ -0,0 +1,24 @@ ++Index: linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/drivers/clk/qcom/clk-branch.c ++=================================================================== ++--- linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce.orig/drivers/clk/qcom/clk-branch.c +++++ linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/drivers/clk/qcom/clk-branch.c ++@@ -75,7 +75,7 @@ static int clk_branch_wait(const struct ++ bool (check_halt)(const struct clk_branch *, bool)) ++ { ++ bool voted = br->halt_check & BRANCH_VOTED; ++- const char *name = clk_hw_get_name(&br->clkr.hw); +++ //const char *name = clk_hw_get_name(&br->clkr.hw); ++ ++ /* Skip checking halt bit if the clock is in hardware gated mode */ ++ if (clk_branch_in_hwcg_mode(br)) ++@@ -93,8 +93,8 @@ static int clk_branch_wait(const struct ++ return 0; ++ udelay(1); ++ } ++- WARN(1, "%s status stuck at 'o%s'", name, ++- enabling ? "ff" : "n"); +++/* WARN(1, "%s status stuck at 'o%s'", name, +++ enabling ? "ff" : "n");*/ ++ return -EBUSY; ++ } ++ return 0; +diff --git a/target/linux/ipq807x/Makefile b/target/linux/ipq807x/Makefile +new file mode 100644 +index 0000000000..97c770df4a +--- /dev/null ++++ b/target/linux/ipq807x/Makefile +@@ -0,0 +1,22 @@ ++include $(TOPDIR)/rules.mk ++ ++ARCH:=arm ++BOARD:=ipq807x ++BOARDNAME:=Qualcomm Atheros AX ++SUBTARGETS:=ipq807x ipq60xx ++FEATURES:=squashfs ramdisk nand pcie usb ++KERNELNAME:=Image dtbs ++CPU_TYPE:=cortex-a7 ++ ++KERNEL_PATCHVER:=4.4 ++KERNEL_NAME_SUFFIX=-qsdk-11f09717303ecd83c3a64e9efe23f25921dc1016 ++ ++include $(INCLUDE_DIR)/target.mk ++DEFAULT_PACKAGES += kmod-qca-nss-dp kmod-qca-ssdk swconfig \ ++ kmod-qca-nss-drv \ ++ kmod-usb-phy-ipq807x kmod-usb-dwc3-of-simple \ ++ kmod-ath11k-ahb kmod-qrtr_mproc wpad \ ++ kmod-gpio-button-hotplug \ ++ qca-thermald-10.4 qca-ssdk-shell kmod-qca-nss-drv-bridge-mgr ++ ++$(eval $(call BuildTarget)) +diff --git a/target/linux/ipq807x/base-files/etc/board.d/01_leds b/target/linux/ipq807x/base-files/etc/board.d/01_leds +new file mode 100755 +index 0000000000..0bfa04d614 +--- /dev/null ++++ b/target/linux/ipq807x/base-files/etc/board.d/01_leds +@@ -0,0 +1,36 @@ ++#!/bin/sh ++ ++. /lib/functions/uci-defaults.sh ++ ++board_config_update ++ ++board=$(board_name) ++ ++case "$board" in ++sercomm,wallaby|\ ++cig,wf188n|\ ++cig,wf194c) ++ ucidef_set_led_netdev "wan" "WAN" "green:wan" "eth0" "tx rx link" ++ ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wifi5" "phy0tpt" ++ ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wifi2" "phy1tpt" ++ ;; ++esac ++ ++case "$board" in ++edgecore,eap101) ++ ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wifi5" "phy0tpt" ++ ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wifi2" "phy1tpt" ++ ucidef_set_led_netdev "lan1" "lan1" "green:lan1" "eth1" ++ ucidef_set_led_netdev "lan2" "lan2" "green:lan2" "eth2" ++ ucidef_set_led_netdev "poe" "poe" "green:wan" "eth0" ++ ;; ++edgecore,eap102) ++ ucidef_set_led_netdev "poe" "poe" "green:wan" "eth0" ++ ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wifi5" "phy0tpt" ++ ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wifi2" "phy1tpt" ++ ;; ++esac ++ ++board_config_flush ++ ++exit 0 +diff --git a/target/linux/ipq807x/base-files/etc/board.d/02_network b/target/linux/ipq807x/base-files/etc/board.d/02_network +new file mode 100755 +index 0000000000..ee9973f7a8 +--- /dev/null ++++ b/target/linux/ipq807x/base-files/etc/board.d/02_network +@@ -0,0 +1,78 @@ ++#!/bin/sh ++ ++. /lib/functions.sh ++. /lib/functions/uci-defaults.sh ++. /lib/functions/system.sh ++ ++qcom_setup_interfaces() ++{ ++ local board="$1" ++ ucidef_add_switch "switch0" ++ ucidef_add_switch_attr "switch0" "enable" "false" ++ ucidef_add_switch_attr "switch0" "reset" "false" ++ ++ case $board in ++ cig,wf188|\ ++ tplink,ex227|\ ++ tplink,ex447) ++ ucidef_set_interface_wan "eth0" ++ ucidef_set_interface_lan "" ++ ;; ++ qcom,ipq6018-cp01|\ ++ qcom,ipq807x-hk01) ++ ucidef_set_interface_lan "eth0 eth1 eth2 eth3 eth4" ++ ucidef_set_interface_wan "eth5" ++ ;; ++ cig,wf194c|\ ++ sercomm,wallaby) ++ ucidef_set_interface_lan "eth0" ++ ucidef_set_interface_wan "eth1" ++ ;; ++ edgecore,eap101) ++ ucidef_set_interface_lan "eth1 eth2" ++ ucidef_set_interface_wan "eth0" ++ ;; ++ edgecore,eap102|\ ++ edgecore,eap106|\ ++ cig,wf188n) ++ ucidef_set_interface_lan "eth1" ++ ucidef_set_interface_wan "eth0" ++ ;; ++ qcom,ipq807x-hk14) ++ ucidef_set_interface_lan "eth0 eth1 eth2 eth3" ++ ucidef_set_interface_wan "eth4" ++ ;; ++ esac ++} ++ ++qcom_setup_macs() ++{ ++ local board="$1" ++ ++ case $board in ++ cig,wf194c) ++ mac=$(grep BaseMacAddress= /dev/mtd14 | cut -dx -f2) ++ wan_mac=$(macaddr_canonicalize $mac) ++ lan_mac=$(macaddr_add "$wan_mac" 1) ++ ucidef_set_network_device_mac eth0 $lan_mac ++ ucidef_set_network_device_mac eth1 $wan_mac ++ ip link set eth0 address $lan_mac ++ ip link set eth1 address $wan_mac ++ ;; ++ *) ++ wan_mac=$(cat /sys/class/net/eth0/address) ++ lan_mac=$(macaddr_add "$wan_mac" 1) ++ ;; ++ esac ++ [ -n "$lan_mac" ] && ucidef_set_interface_macaddr "lan" $lan_mac ++ [ -n "$wan_mac" ] && ucidef_set_interface_macaddr "wan" $wan_mac ++} ++ ++board_config_update ++board=$(board_name) ++ucidef_set_bridge_device bridge ++qcom_setup_interfaces $board ++qcom_setup_macs $board ++board_config_flush ++ ++exit 0 +diff --git a/target/linux/ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata b/target/linux/ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata +new file mode 100755 +index 0000000000..e64ea1a105 +--- /dev/null ++++ b/target/linux/ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata +@@ -0,0 +1,92 @@ ++#!/bin/sh ++ ++[ -e /lib/firmware/$FIRMWARE ] && exit 0 ++ ++. /lib/functions.sh ++. /lib/functions/system.sh ++ ++ath11k_generate_macs() { ++ touch /lib/firmware/ath11k-macs ++ eth=$(cat /sys/class/net/eth0/address) ++ mac1=$(macaddr_add $eth 2) ++ mac2=$(macaddr_add $eth 10) ++ mac3=$(macaddr_add $eth 18) ++ echo -ne \\x${mac1//:/\\x} >> /lib/firmware/ath11k-macs ++ echo -ne \\x${mac2//:/\\x} >> /lib/firmware/ath11k-macs ++ echo -ne \\x${mac3//:/\\x} >> /lib/firmware/ath11k-macs ++} ++ ++caldata_die() { ++ echo "caldata: " "$*" ++ exit 1 ++} ++ ++caldata_extract() { ++ local part=$1 ++ local offset=$(($2)) ++ local count=$(($3)) ++ local mtd ++ ++ mtd=$(find_mtd_chardev $part) ++ [ -n "$mtd" ] || caldata_die "no mtd device found for partition $part" ++ ++ dd if=$mtd of=/lib/firmware/$FIRMWARE iflag=skip_bytes bs=$count skip=$offset count=1 2>/dev/null || \ ++ caldata_die "failed to extract calibration data from $mtd" ++} ++ ++board=$(board_name) ++ ++case "$FIRMWARE" in ++"ath11k/IPQ8074/hw2.0/caldata.bin") ++ case "$board" in ++ cig,wf194c|\ ++ edgecore,eap102 |\ ++ edgecore,eap106 |\ ++ qcom,ipq807x-hk01|\ ++ qcom,ipq807x-hk14|\ ++ tplink,ex227|\ ++ tplink,ex447|\ ++ sercomm,wallaby) ++ caldata_extract "0:ART" 0x1000 0x20000 ++ ;; ++ esac ++ ;; ++"ath11k/IPQ6018/hw1.0/caldata.bin") ++ case "$board" in ++ cig,wf188|\ ++ cig,wf188n|\ ++ edgecore,eap101|\ ++ qcom,ipq6018-cp01|\ ++ xiaomi,ax1800) ++ caldata_extract "0:ART" 0x1000 0x20000 ++ ;; ++ esac ++ ;; ++ath11k/QCN9074/hw1.0/caldata_1.bin) ++ case "$board" in ++ qcom,ipq807x-hk14) ++ caldata_extract "0:ART" 0x26800 0x20000 ++ ;; ++ esac ++ ;; ++ath11k/QCN9074/hw1.0/caldata_2.bin) ++ case "$board" in ++ qcom,ipq807x-hk14) ++ caldata_extract "0:ART" 0x4C000 0x20000 ++ ;; ++ esac ++ ;; ++ath11k-macs) ++ case "$board" in ++ edgecore,eap101|\ ++ edgecore,eap102|\ ++ edgecore,eap106|\ ++ cig,wf188n) ++ ath11k_generate_macs ++ ;; ++ esac ++ ;; ++*) ++ exit 1 ++ ;; ++esac +diff --git a/target/linux/ipq807x/base-files/etc/init.d/aq_phy b/target/linux/ipq807x/base-files/etc/init.d/aq_phy +new file mode 100755 +index 0000000000..41a52ccc2d +--- /dev/null ++++ b/target/linux/ipq807x/base-files/etc/init.d/aq_phy +@@ -0,0 +1,15 @@ ++#!/bin/sh /etc/rc.common ++ ++START=30 ++ ++boot() { ++ . /lib/functions.sh ++ ++ case "$(board_name)" in ++ cig,wf194c) ++ aq-fw-download /lib/firmware/AQR-G4_v5.4.B-AQR_CIG_WIFI_ID44715_VER1673.cld miireg 0 > /dev/null ++ sleep 1 ++ ssdk_sh debug phy set 0 0x4004c441 0x8 ++ ;; ++ esac ++} +diff --git a/target/linux/ipq807x/base-files/etc/init.d/bootcount b/target/linux/ipq807x/base-files/etc/init.d/bootcount +new file mode 100755 +index 0000000000..a24f27353e +--- /dev/null ++++ b/target/linux/ipq807x/base-files/etc/init.d/bootcount +@@ -0,0 +1,12 @@ ++#!/bin/sh /etc/rc.common ++ ++START=99 ++ ++boot() { ++ case "$(board_name)" in ++ edgecore,eap101|\ ++ edgecore,eap102) ++ fw_setenv bootcount 0 ++ ;; ++ esac ++} +diff --git a/target/linux/ipq807x/base-files/etc/init.d/wdt b/target/linux/ipq807x/base-files/etc/init.d/wdt +new file mode 100755 +index 0000000000..75de36a347 +--- /dev/null ++++ b/target/linux/ipq807x/base-files/etc/init.d/wdt +@@ -0,0 +1,14 @@ ++#!/bin/sh /etc/rc.common ++ ++START=10 ++ ++boot() { ++ . /lib/functions.sh ++ ++ case "$(board_name)" in ++ cig,wf188|\ ++ cig,wf188n) ++ watchdog -t 5 /dev/watchdog1 ++ ;; ++ esac ++} +diff --git a/target/linux/ipq807x/base-files/lib/firmware/AQR-G4_v5.4.B-AQR_CIG_WIFI_ID44715_VER1673.cld b/target/linux/ipq807x/base-files/lib/firmware/AQR-G4_v5.4.B-AQR_CIG_WIFI_ID44715_VER1673.cld +new file mode 100644 +index 0000000000000000000000000000000000000000..4a5a76cd34f390a2f6de2911cf91a74c42774602 +GIT binary patch +literal 391170 +zcmeFZdstJ~);GGcvPeiW#RM>N)kPqv2pB*SyfsitMYJ2Kq}6U)hz1pHYpuI#H*J$> +zDJtDNL|Z{^caoZNsnjI4-q1Egi#Kc`y?B9O2t+`U##HOw^^Fy@d%xc~@Atgt-RC>s +z`2!!Hm3bX=%- +zU>Jd61cnh9Mqn6$VFZQ|7)D?ifnfxO5g0~b7=d8~h7lM>U>Jd61cnh9Mqn6$VFZQ| +z7)D?ifnfxO5g0~b7=d8~h7lM>U>Jd61cnh9Mqn6$VFZQ|7)D?ifnfxO5g0~b7=d8~ +zh7lM>U>Jd61pdzcOlBQT7>FapB}3?nd% +zz%T;C2>kCuz@NnU7=evH#>8yQxo*agA8hF}|NC0}{~6`)a`->zknSAGtsHFfe}lL0 +zIQ*YEq?;qT#lfchH|n3x!P+?di#cR}j^u8RRGE{f$tl$3tTz1@**OiBIb=U)bsI-= +zmm~dvledFYSi@O;@W05;IbZvZ9P)aOR1_Y?EC14eJTQ +zt_ETHAWRn|A+f0YgJf?IS%gL18=QY{u;~6EV!ngt74ysd|7TXEOY$%ho9Xe8SYC?t +z!2aOXYcp0$CocQVnzjH9hFT*h?{W)m9V=z;JJ@elK9buR!2)hx4d4sUQ +zAi>$eq_cyPD|D+-XMjiPZ+Urd=1H?MtXYD*1sT=?!NjbI1vJx3^5Rnd-_52dmFs=o~VMtVSyQZulmHG^sVIn5Hgyrt4#+_X35MIlZg;DxdgNS!9 +z%wNB9P_<$ZD4+=2(^#a3CIIzS#e-TMwj+e6UovQ3I;fJ(ib3IVik_FA6oDiu +zgZzvX&hg*8OiHGxFp(aG=*q2SlQEr_PF_XFAn)Uy7?!L@cy=Q2NJ=W9 +zVA({>Qy|EjpCL7pN000-(A|1WM_Qo5vh*laS8dIX#&kD*bm-V)It%oOU_}BQX|+^H +z$y8OD48vsVN1lxW+4x6qBo3~gLN?DI!mucQFz-#tvZwbgd!|FO$(Xm@C|vImUc9-p +zTpv4Fm_q7O_=N?eu7JNmKw57}TW?96xAHulzv1^{sCHbSD8l^t`_eH +z;g&uvAhSqe43@0J^0EcI1(Ij>ClHYyghzT{J|!11L`7JB5i=*M0Y65FcVKCP@+4`B +znk-i*aJQsPn+`Nmo3LYk=a>z|Cqz!v!ld$~dHBcMMj%!^{*btie(`5$bcLn&O~n$^ +z*An|#hUVBt2UoZY9XvV;;fN_rjVgWEnj#55PR`g!l7*3;y!%q&C^AoL#W+%{vJx95 +zmBy=d*Hli=O{e4*2#{pG?HqgcWwoT-MV70M`IF?$^M^+APHy?8ce?-iMnBUxO54dt +zty`^<3$|k;S}C<8&4s}P6_GRX+m-;{vA9{iDeT+(iD|Pe=N@@dtXQc4T3P*95<8+# +zU^lRh<=DX#foY>vcHtIeVB7UI>3H@}6mJ~sM+zgQg{8k29+!l7kmoiwe@9_8N8ixg +zlUCGWp;GLUUOJ${Zt7cgH-Xbu(=F3;F4HVq0@IVFlAKXrCr*Afk{5lc=lm@Hli&C` +zuPa5zA6W;jrtfX0K^HbC@R)8o8%gU`bpz^cM7+J18qZJn>jiOdd4!mlNI=GsWft17 +zKtZ~VHeD@XX}TvBP7E-qtynnSKC}!nWCcYKE`7|4iAK%zjBO?%jZ>QnT+Ra3IlpmV +z2k<6e`tJM;_PC?OnRCe}9y#-Fl5?%5O)jilV9K&35Xu5ldR2YSuNR8O_=@(@MMY3_ +zz)B;UOwxp3cA1`o($X_(Pl4*X-^s59q7ziBTlvpEp7^i!aj1u~1DzmOC#T~zll@R2 +z>n#dHc-dM?H(=G7Zs~M4o4aTPKt7KVuj27Y_&)cA{eHACMS7&Sq{8iEr4?4dK(e}$ +zo}Kf661+z +z?lA1x{qJaQK9-d%{m}XVj7dSKgRJ~!yFSu$Mr}%QL5_oYa(@8t*Ev5vJCl9#7;)(* +z*AI`Z4y);$&E#-l4gqPp*$Sd^2}I?5qmZ|EPUExFN1ks)ASa0ekQd+wCNdrIg|Hz8 +zP^5I8&GgmAc|0e~v(5k~Ks82+Pml9fT&Vw-g +zI_JA*XRyzMFq{CUBzZSmcUw)HeR7j-b1*?}B= +zPi~&KJ@m_a(%b9MTR!iWv|IV?(A4NrdcXS*VgvpC=hP4l^*6k?F$8-`AZmF;&+ZYC +zo~cvtgUNgpNOyMT2yD`mzWam&!%Qhw=%>kai*=cjn3)UTm>x}Bx%Yb`X)gmJ^YvWmDvcmaNEt79w&aUlLsLG*~MVfmQTfVWzGy +zFUk7sexbC$nk5ZK6 +z&!iR1R=oHZOyaXmezzwgPSKo!jLZR5&Vc@z0dw|%GhcAzYss{YTMEYWbZ=T$XKzdA +z<@o6gR^5b+L&}|=KN;A^fy{`4apHK@jDam`wLkX8^nu^kk7-p4lMEy${vOw~GR}6~^8wkbI19L0lYoV3NY%Rpvdam73osMe#L3au{&CH4j55oGQtV=K_Gl+5R +zTHDoYtF| +ze=uD@u6PFj1_}LmT)p~nb=fNq`l1*+uC-NO1FWC$J^mSb%J5TwAKISRTvLyKFY52t +zV*ODqy$ulA9@OH++?%wD2Dt>yedPpuNIOFkZKnHV8Y6t^v}ICLC#aHK_ +zd6je?*lNByN0Sjdo8CnNUEvy>e9w=JDwKMq^y-kW&zqiM5;OAmM1m5q7BCj2Jh2pq +zv^CTrrMDz`xANpolCK_{$+-431GI5rwMqhZbg|FQrA^z(O$n@>DMS2ZV2ha&xm}X% +z{aB8Dd>l()MS4CDy2Fc|HYL&%9-Eh9^_9aaewy>9oQZ{}$ib>DSeN3B^c+~*?@P%% +zK|x~vcZ|`BaR-+E3~6hajEO0kCmuoanr9dj3(9<(W17c&lI?09?K&@An?Y`5$i}mF +zpR|4;m{z`=xjtxx-}2}Uqt>Ua5GNn!Z?%e&+cIWbB~#U@x>}O%~2%NFfN;N +z8!8;wbln%@WsO#hKd{M}Om_j$D+A{UU?!2QRlX^JT><9%F2>oemeH_Yl +zB7*e7@8dZ^x`LqX3@qx{)dt+Si%dESzwQNz#y3NbF;z#dp5xZ}Bd%g?VgoK-4{LSU8r=z(8HYqyr`wiC0WUbHww;M0%jv +zvQ%+C$B;SOUC5cqb*lsCar1TW*w1W~HHdiKvX@2TFC@Hsvdd9oS+M%dL)q*oEZjEkXGaa@=IpWQJ>@wKGoo_^C+6poNPD5+&y1Jme@Xkd!ZOJc*`FAid% +z62wzbxW4qNWe+AEo78|uyd*YFjo>1lcmb;cSA>rdZkdQ6>i&2va2f{1J0ek>B6E!X +zH6K|;08JJbcZIoM3Wr9;^TPq+za;n)6H)=ewF$B#{))E(EuWF5BUa%TY$*Mgu;xfi +z|H@T!;nlXns|dBW-ZTnc0Bobyp_aU(eK2L83A1_Nf4GqieC&Daw8#G9sLfkTsE5nLEDeG +zA^Kfg%L52o5L4MGfPfw0VA(ziGyVwM5N7`ow}R0N6-O|YEp%bm2;A91J_$4a2-`r-Kw(L +z<|r7saPgFI7%EQ13d9wUNo6rG6lRP}ePKHX_QyWD8A(thrNWt++nGP&qy>8Ary(mh*wV*t0!mN>qqxsdu^UV{}{iTg1E-0DJ^nd +zxA3_jVNj6br?BEM4lN*VPHMIvCd?FgZFhvf^3}HAgyno%gcSa%75PviT)bv1>fe!! +zXG^IjcRy(vnmc79G1d$!dpcD%jcQJ(Sm{)D8dWxxYEGqCFtesmWs@m-PNh)B*kJpa +z2f~>xt}}OqooCS;G+i+b_@_IsSOs$Gj^en}IX-y}SFD5tLlfW96fAym@=Pv_^mD04 +z-&ASz?rP!;HrxQD`$0^Ua26Sey_i +z8_XWHxhlbCK^$k17D_06BL +zGl${+h9V8zA_(fvg(GOV_`tALSpC!7_tU_)t;+E|K +zg#|jV94{VED4w0XcaGbW)bzLh%D?p=LUqVgZ>>oWY^vxleYLe-ZPD#M13oF6_|3o} +z{agf71%$;JF^|jJBCO(6yd4|orv-I$+P^q@QSsy#6kjD3hs|%m(M03-Q&AjDu!mD% +z`peF+6w?C%i>pcVxQK~H7p?7A^e0KrSWg~c%w)@cB#!xk4bDI#E;8JIjnqxuD0`Zv +zU)67187O@IVHpqWh$#-@ix*3Z!?@zi;Nma>v>FZi(Hwdh6wlFGs2+rD-dIp$7yLlg +zM|03LNSHge`5pzbO9sl0KSW1BljM%g{vA?4-g2SVP`@%Ttw>rs0d1UG!gdz~`yx%5 +z{U=KT%G1rc{nm1csh(dqVRJgW#NQUmwVul;E)970DzELC{?fZOA2Jg_s`~KKe#s!& +zk2l}dF_*h%n?Sc<~kTuxGY|NQj+j<=22h*!C^uC7WIO9Ey0 +z<|8E6QQ6rH#Xd>P5q)xh1P{%1AC}M^<)V1Rc_Xo37&b$jffXh6gFcYQZiFuiH$-dd +zqLy7HUbxCYJQUh89T8~ +zVI%|pmC|dAZiZ*M{zSKKzTIb;Sb11)5Crq;A+8-)$zI{Fshs?ID6XluKO4v3?LmYt +z>-jm)WD;0xmLPUPfT1aPtN9$^z}*%sn~$jlT*OiSJ)tbtJc1DnS!3&s!| +z5r(ELOH-Z$FF65f-BuLg{sIG6ab{G+Ioi|sDP4LuX3=>-)aU9?_BjY~mBitvKhcNo +zBc#|NsW_;&^_fk5r~-{Jek=i=45HN1%dT3w=cvOT6`mZe^W5V*ukrQ!`^=mBB<~WE +zLZY>GkG&`qoU_1PAw_!Ssla2Gxli&c;dJmNzY?yZu)IM!x9cB$kOhg-USG8Caa3}J +zjzX4Vy9BkAHhM*=;2n@u5)w6GEf=&_3!L==6UEn2qDxMruc1i2wr|y44aHYd +zqdq^`wWqBKiXSm||}C`osV@9_{$ +zO3(^hqDInlUQpU$ZREq!SbDVd9qS<9Ge|<*D@u0B)11wMuJ`(&7z~k3GzHqQb`sVf +zh*k#-8fk42ta>;!c=o8!rnmZF4TP%DQM)|ZB2P*n0Kn34ZM0IVi}65Ls`<3jISf9u +z3@uTDURX3jd`BR=6ppws*_vO)isy`Q-xA0cg(D7~uo9Gt_sk}ak`xjJeJ>MWtWxY@7pYAhDVD!bM5<}5wh3wwMbHx}tTiB0dDX8Lbb$--nWr6idFrFPp$rNYw%swzLB2c7Q +zA<^IMg(-yQ8dpeQX*?%rj-nukhd8i??WFZL1e6=x+~SkSi?h0{*RvwAF&_N0R3 +zia!Y!e=SgaVN3HlU6kz=8>+NUp@YAn(=Um{%r3t0wMcPj9iDfF+_j*Nz{Ih +zFFq2YZ-#j31IXU$5JTzXPoifXibElKYwt0pFV}u9L~$_05R)zL#q~#@6tbTSc7GkB +zKm5;lg!`)yw8i{&?>Ryp^Q<=JnQG?dAot05v!&Otbj~>fy)A~wK8WN(WT&Dz-mo;s +z5cOxpfe@5i947@_4133_{@$yN5s1cDYBX7;6*EOkk%7w0Y{Pcteb|HcofkPZ-Zbfd)NhY{$jN=LZO`R^p)^b4ipqydO{;tDQ7^exeYR%ayV*II^#&n)J^qE#Kx8QUky>_@ +z)F}yJ-=qW{tCgw^)_p|?zeq^nG`CPqOM7b&&T?W%lzp1A$3)wU777;!pt1U*-maH> +zThC^w3VT~G0VAV9QGsZA90FHN42YJi=*6}ddaafWP#T~dov)0bxfOAh`!*W??hl-*qZZzHrdRpZ0>dPoq3C7H{90|)0!Y`su2(82tLN9d +zq6#4Ddffn0WIuP*Ui1?5$z9^#l-6sBdRZ7psH0vqv@w)FPgZKOv~ymx&spe-lF?OG +zeFopk)Lw7ANx3;@b-7?j??a+@l_}z#-eYWU)JtfL>rd}Ol4X?+zG|^jU9<=S_E17x!gw(iQsVLm}1#xhYI5|igDPvndCbUH_EW1v;aGilhf^jk( +zg?n~w6W)y$o)LMYUJ$-6LNArQ4~EaUT^V#!F;lehI@8|>;e`mz4}`EZ0+hi-)>;f9 +zpl>O9W!$a_P|Oxf&tpsMHpE%BideQ1)_q}r6f_tCMasY^LTH4&=oN3&qS9a~#m|g- +z#p)!a${0_%09LosK3H$))d+x4D8>8yORpKg%(m;cTQ%dhK`M0hk4Chybc$W9K>IU6)k4b2C#9df9V=w32}#b_Vo;izD#>I3_fXs +zMshUeBw0=`J?bS&IC>vVjVqZ4F+;RcQ%{pKK(f6|Ks{SB9p#seg#C)*75}|+4iUfb +zaG1jjX=_Kci#^1aD9f%GgmN4Hn9 +zdsl!yEZYhjnxU~I?^|X2+)y0`QX7+K`Z@y^@~JCwVaUU?H&IXsMUr1wbq(8^*HI^5 +z8+_r_YbZAxdYR1Xe?(V{NdsXSy^?(p2)_i*6!uDX4Fq$Cq!DphC6vZR2*-3lvsWp^ +zd0`dt0xc`Diw=amI?7x0N;Vwb(fg#|*Km^Fydn|l#)AV7){`gupb3lvPe+K?2tYOI +z=UnkEt72->a>jC20=IBkMl&pMIAR@mK0^G4Kv?gu&$wdFxPp$lA540Y@uJ^5+`JbF +zx(pln9au6_yjmc<#HwOcaWuP$Y)Iyi9ztUx3^A#t1NNA-)lR}QD6l&C)_Ojy>mW@{ +zu~$kj7n%rZqrl@!rtP|=X^`2Ja3#+~7&xXmdSv`!VkJ&R;TBKX^iFnyOB +zg=j_Th{>zgq-}IZCg^XvQRE?S(@nRK=Z844;fndAub|2C?AVEGTskGnZu7chr@tPX +z``4}x_l+BF_1XKvG+yyaQWz9s5C#4|ZM0S%m`wn1@N3=0Z|%3rz8sGxRC`OoEiBte +zc||ileN{I_Jp*&h-TX3w)L*GYDIzJ)n$W}a3ibQTjrsJ-H|@( +zhk8gOE;Nz8FOU8`xzga=MmG0S7roHW +zo^@UlR7=W#OSf%&3|(21!ZmD)t{YSFBdRd22lC1^!Y +zt*b6kpLi%+e+B3a@il~<0hoHd1A!41 +ztj;tW)qpYtTqQf{9>8Ff?6Lr35vHTtEb_oIC3Oc!A=25~fFI8tLU!37`UgB1M6(R? +zc&$8vwf=v}I?ZTbdm8SfTL$vlxNSQ=B3d_+n`z7yvqD(QsTD(jRNH-=*h_ZWe4N-y +zcER|faLul5Fb1rbDY|;eHW#Fgb^f}|1!)WasH^qW)t2m3`|7Gob~VqZs_-2vf;6>+ +z?97kAH42yJ(%mS_{iBxGSIb+n)8(t>D%oWN>XFuS+iXxSdkrWFZdH{ivaCo0_hinra|$p-mca8N6_leMC`YSBCmIECQy +znS5T&SN{2O0WENeAs;LmaR?v%*Cz=HA+Q2GV(;c6?y2NsxYbH1#$pw5rLIU%rftUj +zSa*?_Zrm=u)%qqe_0?b(@t}B2fMU-mRg_yfEn1nPX=Y$z!e96K#+lrzV8iKqpjm~R +zxy7M)a}*XkVWH*pL*ZXX#OBN_UUu_p9}ch0MLLJaj`h03SZWb +z*YuC@ibUW6k;C3JsM$%Obgi5Zr+PM#$RY|tVJE*}phX5bpLL1qVz@8hXe1bCU6}iB +zR_`YQJ=HVgEQ%K!CaFcD`f{~ggwm^nvwwh5L2t|{klhE=l3*kk^z=M+->8V`jP!l?24=ZEF=Df%>uKA +zYy6pA1yVWf;0FIDdyloAG{~o&+~D6<+0*I^SAO3E=o?n3b`xIFbO?G^s9mBN5OA&V +zd6D8R6JXO!fb~&209$HUNPOj$<+$=gKcW9k7D+ +zezkW$-h6`6rC6Jf56M|^;3(K&$o8rRY?ssgJ4`ei47R&) +zmIEg+a0TrKm8!>*lypUXPLDczqw!FDEw0lA%SsB17WW|b{IZ@5c~7!!M%&Xp7mJ{n +zAx3in_S;##k(oA;psq4Df(M^cR$V2cZtqSsUP`H(FTRvw7YV>wduTq|Vlv%yFNuJ% +z#SuvV*B<1CmlPu!vDszJ)U}g +zHUm>-_bBN!5V5adZo4g9)_F{y*<-%njas1lC6hKpm)SA%te#pNZJ>t{ua0j19*c-S +z9bMLf)dr%OH6P;HF&MPnfV*P#{Q|{kMwI|$BQ|V)Y+PjVw3QM5cLLGGCU+vx}m_9d>zC@jGEqX1uqH-%CtX+VrtE0;*u_mhf5RR_G +z>^Y3rMZk1oCYX{$c&MAB~t?Re$%A4IM0|IW` +z=sr2pzX72Oo1@F##dgePqx%-<(_gW+>)l<~yP-yJOpoYF^5hXi_Nlg}Qa +zA;?p2AqZ%S3Ha9zv?!>>l<=K?xadnH~OL$KODV-i#I=y +zu}t6xsKw8*b#B6WZrkbT=I7vWN%0B0;t~pbyc!t4p=5K!r!p^SYw^-X+MAA_{P2y4 +zd3}acmhi!T!};Bu4VF80uUt^}6sE`?RhI+;qgvCg9|j5LQ+x;~Q3)3; +z5uEdNqu}Pp8G>xlo$9dBFoa+4w=_#I^i)-Txd_dL9kcR>jb(SJQ%M&rPYO2Qq{kmL +zi#-PP2>R4Hz;|BV1_m_f7+5|a&%RV++{i~^hm!B$Ln;PND(Ptzu1I9Sq~f6sTDicO +zz<|?+l@~-d91VGilr7O>QG|F$%9&)ONXODZCQhbN55u0k5$Pp;nv7s7i%TcF +z?_nL&zzmJZoiW$JMFA1h+|Pw{#AR=Xv34Jt1PbCA01i%wb7?M_Y~g$Jj{aAAjzc<%5GCO{mshI?s7b0tZ&J_ +z8(roF8&bUo^UVTtP&ZJr$Etj`1_W*UF58P$wRl@VH*B`*@TL*n2hX6YjjO}iE;e1)607Px!&iOe^6HcxI40f#V8iHZ_r2HTc4@%nbA~)kTbdS{sy#aK +z;H&$dB5iND$F0w)oaXu9FDR`We~`2eT# +z*ZuwY#ptrrR8=wxgM-P~bOwyj)kL7~lgv0ZjLK~A4K~6JC`M1MLXG{{Z%Uc +zDwnQ~4g+!^c7<$X*+j7+c`>&<83kh@Qn;&sj8Me!Ym>!uxbgL3GmWxd=Q6};AW+AE +zPZgtBj2mZhBj)C4H)Nt$4_PiopWHS2#u-;14qldi+(?YlwPwxub8Cw=yNa4Izyf#f +zV1IP>ZpvMhlD!S?gsZSOUUQ+ppkg!`Gzr{xM+(EkcTp>9@xjJoW}@V +z1Dqo~-Z4XRJkPL9h5oEx;Bqr2wN<%J;qP$I&&A6YVCZGta~m_|qfszRh_x+s-FVKG +zk>~2lrkT->tFE4}`4C)G2<(LkCexlPD{)pX_W57&vPGCd9&B|G!Uh^A*SMXgL552n +z4Po!NT^`S#LP`LTKuY#B3=xXiY~fFS!g{|u__+59>XKw^Kldg+xn1YnB-kvdj;c74 +zykfLLn_nFjUT?_Hce5qJIa%%sw(#oHD7-4_l%Qf46tHOX!y7I6`L#*mS-As{VAtmN +zXTWlrpU+}o&YOa}8EF~2x9@&iwG4Xr0m9i2Mzqwp+b2~lirXe%F*-LT?z8-o(UBgD +zC|Jk~<82jQ7#BP78N=BJ!nc!SUz!m+J>4J@7OzZwFiroWi+0@4M^%JeUOz +zo$`a@@#dx2=ezLi_b}hligw&it(;a#@^QQ5^2rdejnk{)D655ExQPHir?Q1qf8mR& +zh(ceqP)SHz_<2KF`@W@1ZY6Y&qnGJu1z{=|6fPm4Zs`R$m!s2$%+zIiXu*88OPipR +zi&6}t$%TI>bOu85jlDSPwWfKgSix#y_W(=tq;Lzebpiox4f;{9IT|z +zIK`FTuF`JJF01S=Usm4-jTpw!J_}0%T(Ds1ZcNs>C%f{W_vSCK$zvsrd^ivU%|#b` +z)dCZLJX@`OUKT=VwF^Ez%=FdXsngw5)(Z^sScoQ%+a)org&Gi*)DrG1!IC<{{o6=M +zJz-20O1>bB&S1&j$qF$W*eg?0pKpB^#pv~2=8`V-zR|hvB@Q{H5Z;iyh}m{a-Df3{B(pDZU9XBL1WsZ6~%ZO +z;mnfM%41k*lraQOK*hQit8AbJsK~Ci0A0Ph3w(_*AMEq7*$lK-T1Yrp3QMBCw97o9 +z3muitCmenXbE1BImpQNtwMa7w2ca<0^A0AwOEk6g5FA{Bs*w!xOD{XG&;sbWHKco{ +zHiuD&m;LJ_AET3?HA8|AhzW +zrtssJH^-lNBM3`Gr(^}mZB(&gW3E$x=z6gGm>vpr?{>(ADIuu3vW~aC+QKwrg1!u2y +zGB|4ss|C^)!D_(2o&?V@?E!|Jj7~p{##96XLvfmrZrxtK?BURqOnQa +zo#bJiYvO3hh(FIpSr6V1p8y7D}QYjZocT;u>nHc2P0p^3 +zPDB1$XaaG=s{s~ZOy|2U0d?&A-h&LQozTD)!sD<~(bp*GblBL^M~rkB<`0ZL>mX%( +zG?KnrI!SnyCH7|vx3ExXanLAUzwEVOtv26#`l0MkLbxhcYT=+ksJS}y}N8r}T0WzSRM#s4A!K&UI#sk82}*J4^2`)g`Z +z(v2ji7v?w|d3+1&JE@i@mA2EdZwS!NnokH&NJGgMQF2~62!rozM4nV>hcN>@lbe3H +z4BH2&2i^9KSu#jE-Rt8N@3?I4fGl(X04knHUn|~6W5xQ4l6^KH+b{s&9i^K0QFefI +z-Zh9dQn0RrC&5Bx*HgS}vUlNvvf>EE^7`~k6+U`Jp#ITi^B0%l_Qwl}6>$je=~dzE +z6(jU_F2g#3_PPraWm_Kk?mK5-O}j2bhqdu~`nyVR{)&!TCW01EP1ZTtC4QQALN+tt +zAOx-uvM)!RgupFAHg*K!45VvCQ+ikUnf^}5W(#ja;8Q|&cogEa)J-!eZd3ofr80qT +zY??v*J5?1Ztmm>>|eKu9@Q@{aWZp&KA>f4UYWgH9JE +zSwxczB7jQ*m*!w0H@OI@mM|p|QWbqa$&^B`2Cahv6C8X=2@R+jc)Xh>&@>99jijUz +zG&NZhPn@hL93w%@E3KDJF&QT1WH{Z`&-LW)<1ew##BU-Zr +z$}CdnGY4U3VckXOs(~rE222j|#UA9|z6ytC1R4)%&@t%V$vAdRJkI)s^6?6)N%sk1 +zJx1&Z7k8k2_mF~yxs +zB#QK$jJrmQ0jxiI)n$twLlwp;i58s_?t+%;OD`KICnCHe1zvWKr=LX8>l9qqc{(I|qm^Dc?VNE% +zt6XyW>_{7}*2bbAFeJ<}zhO?&szh|e2m#*aKWDGiMu +z;zS*-0-~mWSY6R-yL^^i{uIWM!Xw%$+*wX`1z%PwE0xNdYWYkjjZE2j>XQ+6`AjGY +zeiV6nw%s@X!8|_)5-fg)1>UxHe?9xMxwcarlc@K*Y;Nl`Mknft%Vy#-LZ{z8z2$U? +z;mr7hJAXqv&Ddq5<^g)!Om&Ji4-5v(4PTv7p?Tnwhayb%dndU@r(9<$9}NNyd~Rl} +zAD8z!2BF#Xa-12A!877zlGQO}VHRH!vk}s&=nT<9EYJ5w3JAft6!mnH`MSaaQ~FNzTssot>pO6a31xwd%ch4z0P6*%x>!A9iyS|67_Pz`jY>M_sgY^B-URy +zR^;}Mz@0pJ?=*g@*5(zz4mS#+hFZMZI~JUmoga)0QTkXkpY5y)1G@(@tHYE}*rEB+ +zTRYWpuMc%e8@E~=f?49;*x@e)0}l#Y!ZBOiUo0hSEB4ys)|}`08RFh@B20C#)9IsI +zd7$%72waDOqIW}_KDvOKu^muTc>lN;Fn@bzQA6h&qRuqYT%v&~3wy4Ck!v~F)ISkKXF!pq(1h$p$)e3aA8HSb0 +z>`{z1ZD*IZv*y^dHM1rh63iHRa3rs?ptD>=dp|^n1nX8F)H6Hb9yB9Szqu1Mgcwh3 +z?xV~fbk;QTn&3O58s1pIL;be*JJ0X@kfp}DHg(o~lYL`jXU$V0{ld;FL3uJ*_mXM` +zToBk%g_m8Vnx5}GB(lP;O_co$)%JGh`7pffC#p~2bP~e9-Bjgw-VxEhG*R>SROOqU +znw?fz&TqBJhXhhEuNy(Tg7In<-n(%~1d0=Ad`C5{>}*>Jtl+GPSk25aXk=eQD@De7b`sV82r}d0gcC_n|;Py)H1yQ{3XcM^8 +z?!oRPo0PPF!gnppDtzT~mB_FM^GOKnZOS~MvuT1)yz)W3VlO232?}AS^D7}8WH=pG +z;j10xq8k;CLVEoBz*^$>%ga_#m64t1$j+L>@6}8nt$3d&0&f!Cbfz*lBtF1Uy}Wu&TjfS$^am8MrX~pc`B^4CJpK9 +zpAcbXQF#E(*;b#NoZ*|=Y4i4cgnyq%3Z4(Z<;IH+xEUq|`wzyHvI?nlmCpmfK6v4E +zi21sM#g1wT%^@0eFU;&D08Qysnb!@xS(dnhzqo;=<0CT +zU;aLO40Yp@qvl(j6+x*kI+RHho&i`E5M;M +z5v}(H*jTBlZ(D1N&dwk#@$X>{y>nc#Aqr}O5;#I8k^97lP+rT`G;Z_bCDh1o-E +z1pW3}{E*UX9f-a@X0CK-<5Y0n3&PqG6(~G)KF57&qR*b$YH-(4wV6qq9ToQw(Nyj@ +z#5}mgKRjz|%E@iNf#I83o?m)T_k~2cRYG64&D@+X9vioqYaAQrAkJ}*`JqMb55mfW +z8gTd%IL3+uAI&s4(N~;HM)! +zrLBo55SShpL3h=+&(A-mrG3O~oaPRzZecsC4X!V9Il;H^g!6;Tl=&V7k54vI_Q8iV41 +zd3^3wacLNB*bTL*pF7mtjs)}Uq2^{g#5)oe)6Myb`JqqT1W!A_|D#EuTNg(_>&Bn? +z`k6ivMI+pQOAwC$PK+bs;P0LI(YzdE&b?>+i;tI~c8uW>ySKmrQe(2=@!PKvC_uqa +zqEDU0qa*b34*Hdf;_nF^CHe`DxjeMW__u_XdVQ=To`?SI{xG3pC*8KO6{ihVx^u>$ +zh{yJ+d6WaO(r7zH{98sLYMrRZsN0bp*@$>A6ImVA7ni*K}(?rBH@kbHHlAsHj +zc@F-?%(BZ=@rLbi#I}qx)Lkpx-NSrV4<*l>4W|2aV{~X=CTx29GhwNv{W&njKM2e# +z7L7#dD9)nO9cI+Qp+Omwe!RtS?@O+jqyM%;95zzn;-6x`N!n?KyO)1Kpu4o~qQKb4 +zuYDi +z=F~fQWo<{{GHiVMi=i#aa65yE%_+#sTc9a0l^1Mgzo=NqEc{oy4A^15@ +z=2ljBl!w-)hnMr}>(Z6V1)D>k5Fe7s`IQ}2Q)c@WUkolERV5BD53jBk)5S))zw(Fq +z8D3X6CGUhOebt0NAMy)tG?^A0h6iC_|H0F{2Ao`mx$jeYWk>BCg=-Y~uY3T@WZo@O +zdJ}AFi@)N%M9fcGxvoRCuA`2lRGQh#C$!uYzneIdyGHks@ts5oT#GvRJ8Z~F?C2Kr +z{&sN6z1HD=IbkLj2GVS3pGla&!-Yeu#+y`2&+Tq@#K6gq*u6^#p#MGg1OjKWAdQ)Q +z>#=V%>E({h^V7y3 +z?xQ)1*8BPlTKkoDfC?r}w7Ub&6NfBm(8WL*&f}84YKJ2E(T^5J<&B?QVN*@%P!{kP +zM$w5&9>oUEiWN;inu+Mk*xDr&y&OQu5c}ydyl#GjpH09uYC-u5bOzFRixQq-!wu5V +zp|UWa=&dXq(J=fi(GLzY8d&aR(4V{O*9frKz=e=wi+t8s%^&+*psOJjH>i_} +z!@{Nai-Kv!ZLy!6&VXM_>^}|{3yXh>kz*YNB27eJI6eR>mRfm_rRm$Cm8GRw2R>e +zI&eKCmr1wURkzxw29DXHK5!@$!7#Tht@O6<)c$^$K!Lv7O=KKwx=}FPOQ7lZwHs6Z +zgCSoO!auB@*hMsOZhiqGy6$BRm9`0&4EcmItb6r(&=72Zu8Vo +zn*m~3oW8kTobPK8@+#!?pFg4d8#R)ymMPLmbFzxF1|TdFDU*)2lTk4h>exV5tZ2wD +zL6cUZ5Xn43l1dD@Oe%hh4GPUa{s_e+>!`fR8);aW60H@SFyp}qgMwHOeAwvQ&F3$< +z^PaSA9-t2b^?TaEhcIMi|C6sKw=YlE-u7vG*Qf2ac-u8<3jb>5>OsXU;g1jLHo{cjvqT$k)wzrkGt4};YV-Y%(D|N<5 +z2I(?zPvtRTYfPc<=t_|lXEynGS=rupdyQnD +zD?!hure)ec(|q5!6roWe^d_3t4tf$y%B72V;T0BG7X?#9Ze=NT%6zqq%*@;VzjMw) +zyzlSr_xpU5Ju~ynGtWHp%*->-%sivWOI}-(kk+2agl$hAoo4KRPR-3&tV +z%tS~VMprvod=Fy$tY7D}sr&$E`>~VxO8C_b9~9(Vr%gmi>^9%kWPfps3D5kv2%7|5 +z$t0$BUwOk +ztRWLYYMBkF{#msKMxIktq}=iWg8R|xlUbeiXkrsP8Uk_Q{j%9+=q!WpBQm8^{Ly^z +zj}B+xnX4Vu$LKcXX&{os3Nl5Jo>$>mKy@Rw>gmqLk|P1QXbDC*qb4A+S~W)!8EZ8} +zFn|EQr5;xQgRGuVAD09UA1 +z{W0eiYRs0CHocfRDPT^H>NFOflk`HFi}BiY1ms@8U7$|`NG=3I&qU&na3_|xYG-Q8 +zhBK?k?GC=(Y|H5=OJcqvH#>wjbJ<*Hc0;;w)>WJ_H8p=)W8C}<#&`R3`IGRK%BVJ+^YVbWq;@@i9H-`6B_&B-Gq0@uy~22aTAEhy*FZnNFD@F^2N? +zIht@JK<2HT@;hKcwMyo#ykX_c0>~OEuRM}iowV7>L$p5jk0&4p|8wm8WO>d(^V8EK +z>`8N(Qnymecrm)Xprkb&y5(N;gTVd7AqC{Q4%^NS=8EVv+ZJ||RWNtR>JHXvE-PWe +z9{bjJ{kLjo1*5HgH;0LM>RZig-+FKRRs~6~!VTX1(YS^6QBIkG(clX0-~%5Ql_jny +zWNTdWQ_C`_C=bb^BIw_FW^M-@JYbisVQoV;58@GuFCAKk)5S$3yK1)qjM7WtID#Ef2&+GBH&@Pw2fZ0 +z_O?<~_E(#;6N4Igz^!#$`C%!Q^L^eHXw%;G+dHzpo6qg@fm +zsIA9xgi=?Pce$E>-&Gk1s>`+FTaeKF1sFzO#z(>mRet!krT(;-?>d-8z~(Qu#O8BM +z=;lJ3PY2~$O$WxpH4bb#OI@WSHvNbcKd%E~Rl#Li&r!*$@$Ep@#79CMolAt)SYe$u +z;U^Ui5r&`cEc#(!>JLl9eo#TI_#LQl;^e;W~i-J;)@2GR<> +zDL307@p!Cwe?Vz=W4O4%m2g;pDaR`=oMl9r +zq+f?Ezny91-!@k&Ia4?{b^!No2vhl5M8EwzxR(aQSqHOF>>36^Ji4GT$iHA$l4S!c +z#R?aP!DR~4Ul%V7lh&eqTR)uA^zwmOp~go}o56kqD7QYmtRogwNpovddI!BhCw*r< +z*>RvSa7SLY&mc>2AbQstZ^LevKCYSxm-S-`NNG)@tL;c(vzZBHlvb)9O8E&oDm_HO +z=9x2hMDL$pQlx1vQrU~t6-7ST9UccN=T$rBoo=7kJWpkxr>>aiW6hhFJx>EYBVFF> +zvQ`V9LPF3lm@^M`L_Q-Nik*eC8f(dQ=5wY$H&Mea_2zO^T#*OkwUaORtny%=?N{zu +z8OTKPN=5$UwU3Nk`^a?DB&L7Fh^LB9QA}(lMHnGeO5;G1f(!8ys`^=`k2$&)v~tNK +zxr~Wi_FPM0?1AW|x;=-E&_WE5CD#42D +zZp=XUDtN!>tL-}tS!ZcK>t&-+G3A75ieq*NF4H^D|04tnQUQDa;`GO%k+nL+!Q)cpRyY1a}-XeXpw28c#Y;TXmSxd%GoP*5#7A<)j +ztmT)PNm08EpF5fH{KIBa*v`DpE;W;_?K8DPhM5$gQfru*%wm3)nHj@oQDRo%j}Yj? +zuZt62h#MCt1XJR_WyDQ!{NH<|NlA|2Z)lh?LMB7jx7!Z1@e9r5rFQJE +z@Qci3LwlrFTx=#UqG%q!>p_=@_;nzGrazB(5gFD|dKa2427j`)9ha;aCZ3&SR;v`` +z896wfooI#$#m118K*>I8X6I|!1zPcIjm0pSETZTiHIs!vD?VZ-3wmlMK4f+TDl9>R +z$vj&5d1jJIE1zm6b9+F9@n*HJg3LfVSU6A^XC~7C!>qz2JJw95xZ%dLW6c=0o&kT@ +z7OABehPU;Od(@uAm&S4WKrKWhHsFI@5B#V +zPjhZ(h}KO5A7>_a+HCi=QD!MSrdV4JP74gJlJ4>hYJ734FNDVogWQ@Kn(QD-I +zqD(QyOv>D4@*z~*vl;S{yG%CNOx|y^Mb)Njc^s^Jz1On91XA#DdF2(s~e!_e^9K5DQ@7?4IVm3%7>C(+rvC +zMl9Shkx6YfBdzK{;kJn+wb?ed^8HXg`dOKVJlJM?kd``2{KJ%6;v(ZvB=2V?W8Fpa +zH%(-8Pm#j!CNdmF@?cY;^`Y!VCU4q23bU9? +z`)@Wjk)W13T%t=OC~)9Y8rMcCu{&r9*IJ@|$hB5mY^(5xi6~?O`d5M-#b*Z6J +zDGsCeiAvGi`M+y~jjH@D!1*#pDt3nkeLR98zqUd=e=})|bRA4d?JeC7EyY-Ujs+uC +z_QH=ZHKT4f<-zci7mR$Emo6=J^A#P`RD(TeW%vxzk0m;c!$ +zzMv8RALTEUOx(M(L_^W#pNys65H)-%gFo{abjq4m+tzd9B@=AIr(NWqt+qGMv6oC( +zFJL?_R%SQc(NzYOU~g)Hc}V +z^;?;kizZUiYCC>T=rWP_TWxF32^UO4p$6ZW +zr@t|gUG(>YiOtjSXxMOe9L^dE6MV@I#A7HND4sBpZSuDtd%`5Vsu6QE#mX+wJje&9 +zMRmuhlxc-7Eu0OGf;C(?qY-$Bx`wQF^HFe^$kVO1rzJj$^`>H_Wko3ArBt8KH0Q_)_cmoPKG=PObWabXJNy +z(@NJ8Vjb?%TTfqyUbn1O{HKYmXtgao#~kHrd*dywe3gmPK*4KzqvyAZM@*o@Hiv>& +z_r@=7x_Mc5t+-Q*2yQHy)%t-OLDaVrd$>;QlX17hV}-bGv3 +zZK1e6Tp~@TbnYM8YEz!W06mcZ%p_9nM5bkwa;kw}Fbo}fu0s4oyYmrlSupo}0DL3p +zruuM`9w$+)!lR&~INK5yDF(zY*6@L`cvM4k-g8m7SP%-u-;@2^1(&yMKO_qMdJ^N< +zw?HR9G?s2Um#c(TuF^z{v{3LAe@5}#L@gKX!v%YBOO=)palAGbUNp6_aL7kdPv>7p +zZlQ?+M#JZ85Vy1+xpz*S2~xU}x25FTk4#iTC3D5o26?qFjMNsDOj&oR*bOnEozlp)0UYMb} +zut;@bv+BY-LoNua3kN1$xTX5Teh7yvw|8$YnV&cb8hALr!Dj_c< +zVVf%9169IjszWeeZC|@Ndw$`xiVIg&T^RuhQdurBCVwrL +z;Y$vm6UX>T`!|*6u!-{@e-6?(`iJJ9`_Z|QkH1;oT-^1dAuoB&nvqMEOu|{O%uMMZ +z?sly4^m*OZ^#PfgLty@t9mEu;k~dob1P5Wbud&J(XFW14l3jFtKwd^+xvRhecopDr +zsJQ`SIm1M%t%FBV&zv(T-QUHAog26n{kaW6 +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 +zBlot#@w+1Tx+3?QLMSYSz(JUl03{E18Pb(r# +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 +zBu#r@jr!EZcTdg8zFb)5Tb0I +zb4lh5py-a--4B`vo~;yqaWTOT4NN}>*h@AgG*abnD6FYqMDMlIV85=CEsbODOc?vrjxH*7J!TT`|LA9T6 +z5WKDD!7efiumGl07?@^-ee|@mv=$$}km8As9pPS^llgQk^TXX$AANfcTN+Cq +zJw@%Hu;=cLC8?*Vf6((v;RBpUAhSNcLGUPI1ox}AWk~;V +zKCcx8RMg#Ld?WT8D9f3p5r=y-p40k|MnxzMHF%jT*0#%Y{@fL$((_P~E~DS@k*A(( +zYD{|I)b@*6?>3!Wfcp^5f!eMg(>tDP7|tj&AMK*fSzfOZW*cvk%Hca7Ha@5JP*mEY +zsv9GYdtGLL1oY~tlE?{{U +zj0wxP=6WcW*8pt!nTW;3d|2+iLK*dHBRngqZ2xL1S64>xV~lQ=j5j)?$ln{eaX!pI*kl-- +z;Hc8rJ>Wm_rb_Wf;OQTS{5YJta#6tzX_xi&;}7Cpr-q~s<=%+>c+1nXNeN+OAHWtx +zlV|(zt2h@_npE(8ks#uR_n$gsmSXhqop8vY|KtFpa)!UYZ~DxGJ8sartC~v`Q_7XO +z_bD#cHC=izf3^_nt=oZ9KM=?SBgXFlItzt)-yA+IN%y3;?MPE>;It&hdxHn#Jt}aP +z_wwLTo=@$aspaxK9ydkgZH}6L*6yc>*~66h0Rk=-_w7$nD=rOhk75S=P=$N$rEw)1 +zg&eO?lrvRce5jXcl1*rez}5BV=bN4yaNMsXj<8C;r84N6Q7 +z<3eJ&A(6>Je)b>+ryuN3zeCSJJiVl +z5x{Ryl?3`!*awxQVwF@F2qFXUm}hosAdLKEYLg|{+#J-88Pu&D#Hg-ao1}H&G9<7x +zuPm|$Q4bRKm2X!B1>&P(hiSrs}Ki`oobP +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 +zE(#a+0$_ax~K6fe7n(qZgN +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 +zFa>r+absC?LBe0 +z`cE}ohD-G2lGV)3*Mi^!VCOA)20C2Je#up7ny{D4KJP-@d8%7}TFbZemcxW`seW9B +zhFj~+WvjRf+??C_hn)MvTDGkx_nO|^AJht`X>QQ--^(6D_xn-TRW9Z>%40}zE&D@n +zd8pUhwRFmp8b+@Bf1_cvj73=9gC(z4>~fb29Ir??go}OgX1e+1kRoM%ZF2Lgz9;T~ +zrCCVtDQ$JF_+?+*E9CMzd*l8Wn)$^&SQgg`Z8V2W%X|q3-`a}<^?0<_Hok_r!yl0% +z0k<=Q3mVQD23r!t$?RI&XnFEFgk&HXG=c{a#3(Ycb{wWb@pFXa +z@*b+SalkEnh8S7z8Nme)wnT@M(eAuT@e_*bJ{hr+r6CYCT*Aaw^yEWSJbDDwI`KeH +zT>h_?;4osWWll0UbI*S)=Nuwo5m+NEB@?vclgO_dlisxe}mvtz{IclGe?KY1c`anflQ +zK9GrSs>YJE)h-B9P?{1+vt8ID1<7f`vJ3D18He_M*KT_kjU{gFq1(2Nw%t2+_MLx&E3`{e$iLMC +zCk4qHcA@Cs;EH58F~0}yzxKoZaa^)q8qH)8NvBMn`7b}F(<$3bIrJ;j?6r_)Q&n +zP8M@ZLPri+Y!^2I1m#L)7`ViNmgI2qxZU>%BAnr4f`|Y-)$S%CZ*$z`QiIia4y>y4wWSB&kxPhbO5pz!ox-DvAbd&g^JOPs- +zc7DB_Z-JUb*`>uM{{kodl7V*N|4E4?!fvyo7RUUih(OWfw#Vt;P>t4@1dc8(`l5$+i +z4>|dzhR$o?V^7?Fkx{%i0~qo{jga0WpSSM0=gEsT;)3412)a+b|7`acB)!5!T +z#@rDf?i07C#`gL#$j0nGaqrhigAPCI{}cD_0aa9MAMge?s4ylVp$WpUVaEFj(8^mK +zAhS~I2x+BVjuJzfbyB;XJe068HMIilqGrX~Fd#Q!LCRf$O0B5WZkBm6Ys$*X%)FL- +zzh}+944w17=e&P>-}leVtlxT`XFcm#_ciO{!PJaFYUb_g(#x}*Nvyn+KMoFbu&2YH +zm2`^C2%+L_DLpTBqVy=&6VWDQXMLwJl}HLr5(q^R9Fudfu0@ou +zgZXSN`RG$f88aR$J4F?%T}=>SW{sQIsbA~M8?Zr6r|7?>2r^+)n&*0?Q@O@X=9ae< +zsfIjom6uM$H_1K5y|v`^&P7uPNn`r-3 +zb!oEdG}|jGX18=2lZ6iaLuw6g>NF+^r&+H5(rHW-PIiMSUNM~_u2jyo5B$`O5o%_t +zP%%1kZXmn5lfMR0+LbErB$0pa)Xfm6&5iud&L#=HwMk|=!9TVVB_4$I8kM>Ua{okw)MrG{J;)eHa5&- +zAEZ-gC;x5-bXR>?uX(Nhom}3DqaG7f5C?biLp#s_#1pZ|54~vpJNd_urNAursdd(8y2u-k?eh +z&7`U9pe7fsS%^tfF5FtMnrL5 +zu_laurQ#>*oPX}ZP2z8b)pe7zYtCn$JhaXun|>s)H62=CAx*eeb!dJ5C_BGHS}SDl +z?Jaxn|0)|lLf8Wxy1yx#T#Gw&zdy>pw?mpPWFPJ=`|!V!eaK%_`|~>VKq1D=H|C)2 +zwhqnik$uSD#BS+O0(_X@&FC;p6--{f3)L{Yu|v0c=-6c)eB=&H`u?u4VTS&z!Xibb@SlamlS1NYk$+Hr63oo8lw*vqtaOnko&KeTF5E1SN4#`wfJue_=wB$TKZ>FDi(-tqkUeo63x>An +zcj2`D&lT3UgA6O(p#M{0K^-*hF1=(NQkcDi+dHtH>m}uof-Mm2_njuwW6Ea=JHJyf +zJ*6E~*x8-L6g@`&RAHxg^3yw|b{;ODjP +zpf2Lce%Og(X&m#!M~q;;-D!NPh#c>+&sRG|fA#}!9AU@9JE@==`@LBDp`Ebwl8ha4 +z%D9|$|1|A6ciI|1t2YG4?b(r3*dF9>Gmfh%YdThq +z4R+z`mX`y|oj>6BTc!5*K0)T5VVo<+Y?EKqR|YoTGc@nDorSOMTopd)h468#YiD^; +z2zj;|E3i>}=<&q+Z8+Bj2v)%KC|FuRp68W(czSMdCNe^+^gO|0yPT1H<%K}GZpykA +zwsmK5m8_o;yM*@@x5riO+)WaJph+Q?4~ofsZlNZGUZUp4yJJtLe6*ekZDz +zi*?MQbif&InQN2l>P{*rpoI2=pvQhNve$~hr-J3WtiR~ +zQI-aLk=}kH9lN!$74S&)ax8zwu;oZ?ZuBzxJSex@Kk>sc|IyRxaegHo_m6l$uKsx7 +zy6^Z+JLTfix=L9&EQ0j>2POZUz;$o&8E$`=C!KPkS#GbT9F66V6(VDr*wv!YC|d+X +zblAQXZ$smE6^QX$TrX20rp^;i%4aBl#Seb5VMkYON5>)Ddx=|;XQ7zx{Y*y5!uEn4 +z?cQ$r%`ih%T*VL7hxsciSs(nJHih+UzQg5H8!L1Em(RWedbduEMf+a9bND +zQI;ymV-cnmMZDAJla!2$BQnzMX?}fE#-(D7rhIk2SV<2%OBc`Y*9MBzTX$rt1^7ry +zD4e&z-sh`+QlIWqkNVFEK*e;0q;!`(>L2u5&m8|d`e2a|y|8E%{Ak-Qv{BoyXl`4H +zwQ<+%P=ZIYYj)(`Z-Y$7T$fxR3hdm{T;H93?5Z7ne=EA(*$VQ&7@EtTxWmwt=(WYg +z587}NflJ19zamEu6 +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 +zy}2%g> +zk!z{ifoF!=ne%N*uD#%q(A-C;3%xX3z}cOmE}C!4yOMOPA5H<_hp$*=gB3oB9rm1q +z$FX9eGL&D|h}A>D>W7nD*Mb!iO+6JYAXl9r8+Cc2k5K4sZ$9c`7S2LYT1~ec+i&SoT2s=)M>e +z*VU8J>+i`;DXo!oD9=@da$!bV+J`Kk3u*aJzKAv1s7Fi49*o +zND`^l^POPVb1qQ2w7i(wfnWj4?KPX^FP%v0<*_p6KtT=>5e#QjD>;2d7PB +z-$dZ(gKkiJuV>{TTlUpqF4i-n3Luuo#VGIgOby576@&Db)a+>w6FuY$AzF9OO0?et +zNyuamsJz{SN!#qZLIFzCM@!K+NEhMclBs?+cD7zSXqTe$t|LwBZ?(Hz0r+s;8dOvo +zh>xOM`<`IA_>j(>xHVYIv~?yCVcNZKVy&iY`Hb@(jo#?lW!`haY^lSEBqN~%PiI2s +zlVOf@O2>?>j`379le4Jeq52@kq@$A#r9o0qa>ASP-T6zg@FY8I@z_vIi3%?APR>Gj +zl!xcb+qt}*>c^qm|G%jpp{L!{Q&di;kcBiE2uJbq}qyHCOf +zsX_%Q_mNO}-mJyh@=~QRF=ZBt#(OmN`|8S>0oIDr*4 +zc4k5ekc=!B4r!$%D)H!5@qgEA^Z!{d^b=9D^Ov`&Mf0#t?iL*Bku0leL)8p->AV~D +zbp1tCx%ZP!UW?LsbX8G;S~QkUJWU&;E*+^lhuwm`amlKh5r22M?5@#i29~m`V-fCi +z#M`w94S`fdx6o(o!X5OYj=ygkjwqX%@UL}z;pBSoxGQ+jqTYUZn_0h~MbBK+Wrj%Qltec$$qFLkru~x7Y+R4 +zIR80`qIKl2x%)=b$AqEMz_>{IDsnjSbUJ7lSd{5Z6f4kh3}k>aGvD~8Cof?eOW4MT +z66t;iEo19)?360r3@Z{<%?U@x**JjFHy%m1cR4x_kYj%)RY+Z#ozh>5igSxnr4y+lDXpmm6ZLNv}o82Ij8#s!rmB4KqjejA~XMsenQ#IZTtF)aOWQD45E*&xjz;L +z(nrzU<3HQ!=nk8q88V-LBy7QK$AYtb9hIprc7`ZXw%?~n{x +zmYMIFEtM1Re{L607Mfn=+2GZ7dCE+x%jEs<+lo}%w4%hB<5DgQd!atTwbhn7i!ae% +z%`17e_@+=fafP{>c>*nXO}o_@hQFmPW&03hv5yOA5iH<@YAJJ05i1Uv!TC-G7iFLg*D~^nFH+mQX*8 +z79ZNzJu}3IVf46)=aHXgn0pNVkX}dYmR$L2-lX2?)fWMz-O@X~^2Rj8B_pK@lPRT~ +zb2fMYJ)<*wOIsWgg{hv}yMDdT-o<3Pp+-dh8VvnS` +zEqa}H)cqf-@XH1W%sEy+B2Lb=AKwy&1?+XJWo*0^=j*$QkGmHFf7-wwual&GpENiZ +z#wqI@>_7uwM!?4n+FF!YDnolcvJ(DxS#LM+MZ~%bvJ$ja4z{O(-%Y^l4f;w`7JIz` +zhk9>tu-6(aYmD_3jz~uzwzDA`(?!x_dcK3TyT1*mgS9r$G?Mg~g70Scx0dH%jqYzf +z*TG(G5Wf}s8_ON6-b0V?S~spe?qD?ySmajVVAXgl1&&?)Y^)sK`ZEqzMiAaQkv#2S +z#lRK3Um^de9LfO|7Z`nv?V&UjrfZ_->GRFL8|DL_X~6oHwGQ??syPe}`pXCN^+(+C +zozKO<4F5YH_SApusRl98g5@KRd9l?ET&csJw4ug7JQ(WE{05p3*Ov;&J;r>zf#&74 +zC06WFNTiiDi#@#NOwL0M+JnA+2~Fg&B@N00Zpba~z6O4w7WMPJ4op5RYT)PK&=-*) +zq&)@2?rt#d@6B_U&`Vip)#0zg(#G9Z?6wB64pPtd=!H1lV(PD1>8?Vqz_w+E@Y~>_-{PSY$-?9Y&BU +z9E&apH%#PYJ;SRrPbK~OHyAhflGnF^Pa^$hdgSp5q+dXTHmeuig?c`g^t-`BXXr8bcov_ff-Y* +z*e3$hul8a|AJwBCbKF!w4La!bt6oV1-MUH<#U1rZs^CIc!^Zk=4+zNV8hSjnS%f+(m@4U663x=XA8~lK +zzMf&mQy(vc0%N@1y}aQHZ#b;l411_@xfcVkZpMF{7ZbKCu2&|w)u#CJK@^vl>WwRW +zaY-r^+T66pZ3DsgT)lpog%9!zO!0r(_4XV@r*8N<~yjNY!Y?j#Sd(?$p~ +zu_z~`P9N@b1=m3)jj&jsI`TGD)8%iv6yZX6|3)^go?z!|^>{%eTqkP{htKs(tr2HR +zJ6=oPire+Q>5@IN^HRtz^Yd!chCeYci-r>^bM2W6o=BN)pA&Gszd1*V;=rz`H=+fT +z_aAezC?`s!*Y0My8&j_haT7v!*l)O5?(~5k`vHru=Nq?T{du?tOMP)`ZZht04NcvN +z5j-+vH4+N^Y=}GW=>xps@HJp%7uOpDec|wZl&3=L^>81?`h!<+9uVX9NQOKIDJW^bhj+|H7&2g@2$I6Ls+qTAJs{PGpTQxe;WcLm2-QVJJ2)ohZzoaLwME?n5pbM*a6Vcisl?K2AS_wBH0o +zaR$~cLRQXOu|1r}ZN;Cvvliah&DLE%W5MbqK}=B*IC%FkXp-k-|odanKICPX}vR&itxOWm1ox;^zq(sI-7sY?<5 +zvqG-^y;m-<0#3a$?K>;Bj*D%*%C`bEZMNFPjBhO13eLZ&K?Cu%1GGh^MgPK!B`q=IaLkvU_nG1~8mS|U$ +z_XTL$_bM~*8v88RM3Hy(y;k1KMHt$9RxDZ2Dero*qd^S=!Z$qXs +z-m-+}F!g`aD+h5JYU;noiVf!G|I^(T-Uzq;Z&9X*? +zTStaBI=plu9WK-<*-b!KOs-e8Fbc-!kJ9~;$PI$+HL)2po5Hd9`u72^U^ +zDy&$I(8VaXVik3we^_S4^g6C0Uun7k&AiP_d8Jmmm+JV-7(5y-3*DwVvCl+j7VLRo +zIATC6wqQlVrphZ;c~8~xKDF47@{)z_Ni)8it#m8uL|)Tgw9w@WI%SiU?jI(dvB5(3 +zh=_;&f|c$8!K*!Q#r|gUD$iMX?-4p1>%DX$KWEn|8+xZ(rkNgvz3J|()1T{2H&@u+ +zc-l*c^u5`%mHw0^+zeCRIxF1`qFbe`wPM$ccoHBvp7UWLfM+9i*aep&?AM(h&uc}+V=VH> +zL%0WP#d^tmtaKj>U9^Q(?0pf2vcQVHCom)1i{VTV{G@!lmgW?&A6$z=0K02x@UCYG +zBGXP?roMN1`Pjm({6Lldu!n|yTFpPG(jSUr%^*c|StFvOKj`&8P>q=A55%#Lsxcf< +zge4)H?H9P$UI>0qHSemzcKq8tydr;;)*AETimj0JH_ +zuja*78a_&@`O8(Buo~%{E3ARzx-#N0J(DBSO;7jQ2H5k}yby8FW_sda{L~`_8$b83 +z!fMJA(op?I;(e-`KaB_&H^i~E)%=MnY?vOZz_GHLcT^$5V*Dbq09#ON%=E<(cFGc3 +zDAT;*Vh!EATE1{A<{WN}<9Bbx!m(~TjQO@&<6020IkkK~Jhd5d{I6Scejv|KHmg>d +zN)jkuIo15GD($v7HWQRp##|5nNHxEs%9tYpx;)R8dOg`U@7AiKgs_ca8DakNysxmv +zBqQA)KP~Ze|Ah|oq!Bg_rA`*3qAZadbl=aC@dRWJ3tJeL7UrLRO;t+bS2L%`AsI8T +zUZ0lkzd8)Q&buK3dWre2F||gDr3|sz)i`IxG_S}9YAx0!##HN9`E107RC5_HHUM5h +z`8uYSN5iRH;f|NcS7F#xV3pgynqVv!9Y-u-qO2KXMbt$&5{1*hRvGUL2XuXFc@R9b +zB-2LF8A4b>{u;?$ay<4^67L2{Km4=D1R~(6cOSlZ#D@TkWU*D=IR-TTnGcfH5bz+F8UAXk2 +zULIggTWQd*MSC$ZMbNNSmo0Kg2&>tu#ab{{<Gsr7P=;PX|L|b`Y_ULml +z@w{m26XE3%;XJq17;NR~slt9+HIDsG?}Rw^%vSzvr9Lc9s#Kc%*=e9g0!g6q(ys=& +zSsJ}RVdW?DyV9km`Eb@}t#rBkUFp&WausE*3~|y9$=sXskIxRvNSDSFoJ^-0iF%Gb +zS%q^=;=DRR&lNzho;%ozdziG1^7@PT-oDl7XNfPu +zyLGFmh?D?9h;j*RmWdgD7VO5Y=6sXQf?dDW+`rQ!yW<1iYfMbJV8K$h@>?o#9>{MN +z?A9v5tDm=EvrJ4oXTh!%@l?(Vh{`I$7_*gMg0f(ow$R0FtuH=<3xH2qu)rD-H|_>3vzk7KQ-q$t! +zXa)B3f9(lR&A3!d0A8VnPf|0l#M0sbsXseZ!-rN%$Mi2{@Eop;ru=n8#@6L%8`f>a +zOa4LFLpN6P$68j+iS$XH%KB?r7pkh-#_k;&|A5`)OtI+>HWWnC6 +z6ccg!XC92b3j{+v`GZvLpiH+fzFEn$AWHjGkcjxbQAxu^kSL!Bl8#EWS=ixn03;Ou +z_DUK$lK;oTzsU?m`^fFzP|5!Sk@}}HzX5M?!(z@^+iF&PKrUEK7p$_%N;+NleP5Vc +zDk;UfwU1?<@;~srLOjNMULM4GLnSq6`ny)_Ie}^Kc(M8URA=NZuUM*vnX5|Wnd6pb +zhZT;mOvxRGyP3_^rbV>_5_542qT7jUoUzKtTEOTp*Wut7Wr%e}m?%isAw?z)(_E4p$e>%MJ5aHce +zqrB0ZZidLi+72%rc(1Jy{oi&kCguyTuF*OzynJ#6+QuQ(N{4)9aQ9nmP_?KWl$|oI +zD+{_X<-&m^>JT4(q44dIOaZC=V2RAhMzOt +zl?WHwvz}^x3W#1I0;ag0u1-H){V#E)9)5sU?hRJNRe*+W301`PD0)|dyi~;XYmc+U +z9oHiQ&|KcQ_Q@Q={wcb)Fc6cw8>Au8w@IVX1-(e$FAsw6$8H(QE95)U>$_JT2H*Fp +zY0LrrULxOV9$({K`3m^%sitfN-xtYujn}tZz81b6=)lv-xcWx;MhAO*mAB-R@c)OQ+ThJyI*q^=XzvoZ^*0Q +z@1ntrxFD*K{F%+`{~GKT%{Eo@cehB#!2b;V+1p#Z{+%#nG%Kp+t3+ZNPm%u$pZ`v> +zEYk82Hiz;R)hVv9mdeAGVHm@#_1YYMllfy_Kb*Vwq{WZlw*}3|vg#B^SfvZB`YM@B +z%$8J3Lrq|%EKStL_>1x(!dd8*g`wLDi!6kb>Geb3!D;d1H&HnAz2PW%W;i!{!clS& +zj-gUGc{X-yb%-7EkcTDiYbar{Q_LwYE>9ODusqC_9Ek~wQ0O?R9m{uiAA)WDC#so|K$yq5krSC~S +z)aQqw3cug|UBw%;+xs&`WH70}_JGVBA}eD2wp6bEB_+OqsnvWS!rvcZ)0fCBzM2n! +z>rkM+SVrYU7RT~|`(+#&F=g1Z`&f82w~^}o^}oS}#hJyK>T)ThCP@3DrzQw3^pT$G +z2Ou>sygKFbur*^3j}5B{;OEOt`HSS5p!PuJNRKJ)tD(o`tkmLcj|}}wA;b8pCvxls +z65?+a@|`I}xmyU)zVZoSKUPrzLi{wDeJ^@Zh+mc*`Tkjo;Llb3pvkM1%sl9prq7ev0k<^cuX5xsCrR4jD!$ttojYZAsEWTXq#1X}>>al> +zPl^srcU+^449qdM<)BCl+~eNTrYC-kdFUOCve3wb4{?|$T!$3l)E +zul#91_KC%;(XEPci_Bg%Rq3zXB4ZnMQx(?{uy(VI8gzRVcfq00mRY4IMzdsW(<*ip +zI~kJSCDpTdri_uv#22v!`dK`%pwVA=SsKyd_w*w@ucU +ze5_BDYc~p3_)R_D!`6A!ogt&YPgNfN$IT#h3##}sQg=G3`*an5nADvnv*jLjua|=k +z_prx20Kv-pXQ*9&QTNYKk6iDBjkkmp!Nzk2s3#WttQ3X0q*p~$mF+#kAdQ#;=GngZUSFQPAoT4z)Dt1H6uAxpD44d+>taUP`sv8@kGQ+nINb;&5Ii0NU?mps +z7N8}|Om+*b6&Cw9qPu6B)8 +z_a~}H#*l#*1d@Tz2C65nLMK})b``ruF6V=*QYy`MfS)QeE`>1ilwVCPt`h!XKK~!f +zj4{HWA1gzh7*b`77ETsi#lHcfxSf5f_?P4yC49}kdg|;7^amYTzq;3*d(TV!wi1U@ +z?vk;4(SK^JO-);-Iv=5;I6Q=k;+w%#6c+_kQIvwIDE{7`isIwpCs1v_*O$FtDXN*F +zO03NGijJZ*REv=#2lknXis8db-U&?(;RHIF?Wr^?793l_KCa}g@GxZAHOnSyzUTIN +ztInvJApI$`+It#RCj{laS?R4hskVFuH)!)p5)kbZ(5vc%36LB&I$n05noD_VQRPvQ1ZJ4cv +zNRwo?#v@Ils*|J@Rr0@^(t>5?^hm>ZVI^M*596X<(#*9vqsl2QV1q+s4N&gv?-vuQ4KKTD@j?#?t +z7P{Lic>;L#a~AC8O7U+~JL|#NO_e;cOuxvZ+vuP>{0onkIg1w~Zqe~M-@8UUEk(<> +zucr&+XUkXAr+jg3rM$o3yFJ`X}4U +zF}7W!Z9yY!Q%BiWUTWJlg1&e4^qi=D=J@Q;dk5uRPQ$5;g-_FS_yf`L5MG#EDW?@| +zno?|c3!gg3wldO&O-3uj1QKkUD#D!#XQ(ZxuPq1{&Ze4k(oyM1Zx=io+KrS~Pp6X)5HSLDU^H06OhoboY+wyl5%huIfD +z9ER_L?69S^%PnWyLm`pZkk$=bs5&(cThnk{x#)iBpL^0qt)C(tSQY+fHF>h?m>@Od +zJbSeWcfb5eb&irYm80Ep#nUc^80=yQzgKBsKJ_yFK&)>r2IqSW8*Q*If? +z44=ia$IFlk`oUN!Sn-o_IL=^AtxFQP40x(6$_mD90o +zA>`;}US-#X$jUQPurb`mu6GA&G{>^36sXc2%dUo4{q0!emsoZ?n6!7nq`!{HU>Ufs +z*w`dDlfFHcjVC5!Pi&AK<}l)IY@F#i#&|WBC6Ru+V<|gbPZ@@6Yjg@hLzFlh8{rnD +z)W>^O$BF!2vHb0o^ +z+*_yKdj_R9JKsJgaF^YdvkJSS66J)BDPbws(CrdtH9lf0Bq5K^|6M1Z%l|8$%S|5S +zoS$^cy1MQQ`+FfL^1qT3=??p!f=B(YcvLsfKEZSIf5mgN$&>y%@xTl@M-%5IELAS< +z!2V{jvuoi@czJ*#U6}J*~0q*!MSb5-(uyxfh=_ksvk^$-{+Oj +zuH3?VN(7C5ub>$Z<3fc+Ac4(rj>@U=A^XN{*}K1Z|Cr@8>DiwR+CsTbUr16+yT+OJ +zTHuw7H0ds*i7@4ED;94G*Sr|bhOyW!$~~5LP6|kk+L9i<1qCB&tRrIdh`{WzIPy-E +zFZ|ohF=nDB8Y`zp5Jhs9_uo7V+rqyr!Cz4=mVbdaPEZ@lq%F!{V-E%7g%I(*-xm$< +zz>x?jWOW-ui#N)^iWbnW8s@)+e*hlm@DAm6cf8^*P}$6DDM@y8IiKVl#c`uEWqaxu<;OF^4wr_3VtjD!*wDl)L^bdqQr6cFN=a>3@ofaYIM$DTMiaGn-DKd4#r-bhEvyJXc*c4p$Ldv_e4m^t# +zC~vk2aj%gO#O9XF06IoS9v*>sb^0Z>mpjtcw77xrO}p!TJd@+!cc%qwF6WDpceER0 +z(Qq9%4>v%5Fb3Fo1BRbc-{Rrxkr8;gF*TOemGi9twdvlpPb#A@b9Ui)g|zq%{Dy>v +z_$MzyBK4Bv$+n`NW99s23Mnm?y;9C^!Y4#}bVm@I%J~ZK5T4MDhK+1_xpI{y +z|5CPR|0p*md$IYpmjXT-i+#vYd0>hZY0GA1krQz`Lg2=*yd~vJmX;q*4x8Y&?18`c +zSu=J#=61Bjv59L!rOMnFLXU66p|l-qrs$v8qGsRn{E-b|EB$Pe{je*n!jEN@ulBR` +zOQ~GFx^IfiZG%&64km1-WA-ON>gIR&)b3ZJ{mC0A{Y~K9^~E_@zckoF +z*QZ>xAA`Jf%wEoQNYkTGRQk_y-dIHZMQ#EWsGMyG#jpXI3+wyUTbhJhYHl_C^_R!l&Vr +z1^FMA@rPVkZ`9AC^FHd5V!d)-3)WpG{>>Xf7Hk)~-8f%A(5oBdb&9q^v%9hRw)vNp +zWU6f5dYG=)xXt>bTV?6Z;D;3BAf8%@%bD7`a3cicY +zZ-;g+=0GxgNx1a0UOvdeR1NZlcE*iSd!XNO4voSOm}M>F5iTVpHu^j5CCZT}kp+(! +zoAIgLc1{|p-G5G+sN8?9#;@J)9lt|<7=P$1&Uti#?0hqQPk6&)xn-iZI^eJU976-G +za!g(x2-lCtuz$E64&x_M^-<(aWM6(? +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 +zRaAXUNmiw7r2%lJ#Es%G8yqM +zO)B9l?n7D$NXnzbd$yt#oBwsjdk@u55wVSZL|>XZDEeBS!Q~!o_>RY`>R?3ntsk +z>dY-rR2_EUV#cvxcBhxo#l6y1@WQ&HzA%IWJ(**(yrwIRBgIulSO=hC@xE4U(3)() +zXK+bz#b!i_C8dVL9okq>e1NMO?u--jcrYynd|#ic+*;~GX9m6?k7=a~xGR~qG!d)t +za>ZcOv`bEGix|}uc`or4RmYhT|U#ZnB;nEbg3@Iip%K +z@P)OCX;x*tMvFfqXJtOdk+kEm!muw$npcDN{Nd&35@+TeuhdPW;u1oF|IR~1G~Di< +zr3gQ19^A0#A_n#$;CJ5fDtDn%hdpL*aw+#csiCWy6aNTprn4aPDQ5%`*=!yUZJ2 +z;yliGZ($&t`gw6Ge7_-bFT +z=2ew0?02*?=pu{+e;j~ghBdq%dYP! +z8L5$(^($!e2k92iIcRi|v%Zt&_#X+iu*G}MGAFuh8ixBCCeW_Jq-FiR_0i@~N>7o| +z+d(DS^CRdD29Afx2kK^vK{+Y!=Bz)DIt-yh4O3LKCW0jai+A5ix_FD_LryLe{6(5e +zVT_Y#EY^wU`U&RNa5H)TN~BX;q^u!QS{*5|C?w2;yPf;(HqE~&JVGuii5X@lLk*g7 +zhGk<6YeyNjFm$~RHWUTW_1e!6>RS@33oX@#E=vZDrP}KeoHB%xem2TG{_e6I5blJu +z@e+SW#9z7s#~wr28ASPWcfD$`)p{Q7d4NkHLyY$}getP#&3bpUnZCfIcQZSBLQF?N +zg;~>bg+UW;ST@eEc8p;Q-K=Sb8;a;=O`|o0`jsrBybH8Qdi#vi!6H!|FFs4ojV-1M +z9p+yF>Yn>F92$mk-e991l+ADZ|5-Mp8!Vfh+2 +z7Y9bx?-TDfPZ}{fA;N3q6V8=VW^v$1ADKF>KX`u~agXm5xdBHX8fL3#X71!ZI^_9# +z-eX~A&3#V4bi!SXCZ-P#e-Fz_Y}$R|vSgu8rAw`pw|l>+`aV{|y|Rz_u78cwyb0RH +z#>X#5{Z8fe>t&lh+DCHd_-G9|e&pjNK0bzLTnsPBjIa2t7;fH3r6;(-deHm2NRtLv +zx#m}Dv7Kb=aF^;O7wgV_XPl|x5$xL+2tnEZOvitUp^bFg9;9PWAOz_Q!$ba=ROoXg +zee*$5rXL}6uE8J}9M1K8A6L>->LW9L_!1ond>~ytJ`&e>(6&BL8VJvI&t`~L;MMUe +zFUV8;z&H|cx1gFQJP-9y4=(-nV7lxS0G;Fzck%ODB7E!_i{ZA14=UF1?4Ey`)G +zdlG-*HgC3hNAeEz&5~U4sxwDAznG`@tvun?_#?g#z*FgXEsJ>bxcrgT%6VMmI`Te +zB@MeJ!c)POu2U9Ina!5^Ul5i<1!F@W+Y`vlWI_u7+*S +zhFmI`o2`nTmGN%s2(aQwev%zhJhqB=m!&3u$%Wm3PD-v9>FEzk)Q)qm4gCP!hLmq|={L*Owj +zgHns#+mG(08`*CAfsk=zXp@-cIZ3scrusRm_$uj#G(|ek%HOeHlb&B`I=A;}D75LlT7p2=0+CZSz~;)w-66MjkfZN_gUehcxN +ziC+YMA^3UYC!?T({&>*jcN=Rs=r!@tL>$dnPwZT=*YGiv#0`e +zChQDV62vFPew8gIOj_fE(&#*W33m@4*vnjdP!{xg`}dMDf=&02`u6P=1ff(0n6^+HAZ$Gc&whw*?=Wv@5x6Sd%oI`Tt7ZY+@_p%oUfJYb? +z57_C|NBnm*#~Y6FzkN_X!d~5L{qJ7fC;N>K`o2vl@*VJ}Z8{vP+ql>IGGZ8fxNz$o +zF-+^<^S-!O6cGwvi-D*Qb|`o4+zSrCpr8B-M(ON*yCK34miUI5k%o}DxHrKWkBc3e +z2|i2KD3y@u)0|0iSQ58*FE#UIzC_gyq9k;IRl_9M*%Nk_t`ofS&r)LDDX;N2L2$?Cfodc=o|h0p%#$NK2PY_Gil +zHPLIYX>I~`=5>$2dsjZSF4 +zL_gcsBp9M)Q1-%a8J*Z(K?9-YXFBiH%2;=>_K>&Xz)X_a9`_T)jLDEjGzl~7W<=*K +zci!&(jq4i)|*hF5XJ3$0#-FxmJ}SAVp~+%j>- +zB~{%CFT5~@_||cSL|GjpYgk`ZK+|(W3r%aYvG(`g4Oh~FB8Dfj{ddCLHh$;@3s|%G +ziesfL+ZoxC0Hseq(kwKlaV>l3Y`f&lmg%^!2K;;}9kb1QsN`HYpo=UnM&jy*eq{p| +zDn-NyYts96*tXV{Clj}-9mxq5Dxx$`2nMz+m3H$4uY?J~mWKNF>#WtoZ#Te$!!gNSUi=mpWp8ld_1}C7#=ta-dN#9lr6`TtHiH1ymCmt +z8t@d+F;!iK7g7Kg%PK4T9VQCVXg`!_XFxP4f1mO)qJ7VvJ%agfG)G^&r$AOhA4yAf +zx4kICA(aBGII-vZ2WSP?QINDhICxYtU*R$x8%4Ilr4}+G<^z{O8W<^I<^7m?i3bYO +zD)>V#!4*m73Ufz=ikU_WLA?u{jNYz7>)qvwC=6g1_Gw$jvU!Wi#PPH1V2hOa)}HZ? +zo6}~`gt{2~8q$MSyuQa_?vq7n#jAU)Q;MLP&Z3ha@z!;P(7P`yWOM%-x7@lt*3S!Z +ziY`Y--wIx{XF&fQVs^|A&bY@qrU*19TX#rffYd%T)G#H?5DgZ7ykTvGVar5A+9Q-d +zcIQSH@)P?h)eqT^aT;RYN*(alA?7CPz*Z`R3!}~q>SR&p&H!D6NfS4JkC65^xSrTU +z^&tEX9q9}X9q*W{Q?ZVWE@V^x)(_T4X`4nAGTZ;kYh73Xn}f-Fgm?c618yGPWA!h@ +z%joY6(n6~*KDqIG*yMkt8?(pydm-%g;~%8Ej!(|8M@aZbI{h9|Da~vdOy|&1>-Mm3 +z|CNs0S|X~97$}u3%0*%fRd8oYV6ye5u2G7c0^w!f)U~SUBOnc98{+@$=%Y4Co$DJ& +zV7o}f8rC;B>N0w}b9FT9W?+Q-6u!T32)rIGp(BiWUPPCu?{+DH$%(K5%L5)v`>14x +zl)XG03q<7*Y9lsRGyv1FPf#mCtTsZ7=n-Baj&C-?5iyMq8Sn_329mPtMb8;2y^e%A +z(@%}jDjhK5nisAJkkQqPU##N_2K>Sz9W&LLt15tjfnd~e?-x+(11#9j=tvI?9Pyl$ +zf_1c1Jvptg+eDc^8h@fGUIwr)>1i +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 +zE3kIv;}JC~9I5 +zi#SBQ-evSx!f7|^x-y(!c9gW*Vd4nmh-{qH<6-h)ev@lSJ)KYOU!vqSTs4tpVNdb +zt1fL}@V~a&Y~jyp!nRafA{hLq;aC*^y(SE7*r&|*nnqvA#g)2HVO3XskI53_RgY4+ULe+7vx-Xr*n(@*sMHI_+O`EbgW@rtL +z!6i6?P=!vz{--O9SYp&QR-MKXEUfIJxbg6rrUCJ2(_GQ(Gx{y&^&sqQtHxq}8APH* +zL(=#&n)nP$j9*PXNdub5`~jH0)`0qcsj2tMwZv#@TFF4MNIq?u^>#jk|Fzc6e7;#T +zZHx6*K7;=>Yezo+rG`vt{WE`ajIQQ#{U7-v@+suZX^m2deR=q_zQ&y(((Jx2a>M#- +zKHr31wO-9qnexHM_|bLy +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 +zXY=AaPr5vm|>0QmIE1lWR +zy@pT%4ZnVM&S)gWo$q=!N4y6HYro4*+#U3SiT~Z-94zYC#C^;2run!mNVxi-@8~DD +z)WrPe|Ce1XRc&yKOv3entaQDnLVxZl6MyY*Vb}*nn`ne^`9XOIi!xEWKEC~LVTmvA +z#3bTonnX=S$g|%IKhju~8~!4V33aK#$}9rvd_w?(Lu8`an{Fb6P_fopC}CR5VQtdc7d|7*igX13V6LlxHVOyGFSM7@iKDeh*Up$XQA30@WxeD${kd@lt9*wZkNP>VR! +z*S*p`ywNnC>b}4(Q2r-TBJ|tn;T+-103_UE6SsfQcd0|My%n}o)F;D1ep*2nvpb>mav(Y@Oc1V +zXFH&|*YSc%z1f*^!)KhBQeHp(Gs*mEcgZAV?-*{U1v +zsed493u!=}`MB>a6By@t?v+6dL +z37v3Hhvz;jM$vcp(jRL;Cty7gO>8T86~%=+%(WOoM}h*5fH9$9GakSx&t}Bqn{^e5}Ju_xU~hy*u(bkmr1ys3|`;My_YRcKMyc8$VMw?Jz#l;`p~GOtXRZ7+Ht*zVtT00 +z6rN}v{465te}Hs86De@k7F1f +zrD)kAe1>QN!y5Jx)InG%OZ!atmgb`)PCyA7Rvh58|5@bFP&9+O(V9NAMb$zwz}irx +zX!wk?kjM$}LPbO~eY6GrHgq3+3LfUA3gI%~rk$n`?!sYD+rS_;qBI^wuI2F=&Eqqg +zKZ#gzT=5v+5T#>09_0bg78Wxsln!mjtfOI}0`i5jm|USe?I28BG=q+BI%E~XhZGJm +z0uy8kMtamPJCg3UMcsk^fc*_960XyPXtV}{7jYOuVoMZECxxG)oW}^Fh{o`{Kz%pi +z(8-a;QsnSJ(^?*%(R8jv18USRQiKmg_^T-VXjv#*Mjdg=(fLlpGy?L4vY2h5ltO4& +znpqHM)_&^4)YLGDP_T63^2N5O|3K=)@32L|5^XKBlLlh^X@oTDY@sv^s|7N?0S7CH +z?gkT2i+z>09zKPzfjS%EurI^m*HPa~G;9s^y-351^z#MktO8uZTXc3I?-q6|jeQdi +zgS^X_X8O6DI?q$*KQscX=`vw2r3dd(8piCW^k6q_MYc`e3!F0;V->XP6tv4V0t(Tv +zm};Sv7Apkcw}?FtA6rk8d`h#^K`Qnx19YrKk%;9eJot=e@fpp&hcHx&hyvi;i7iAW +zl;CYawdhV0jmf1B!Za8L2s;3Wt)`IC%s?qhNT2ON)7hIxhg{ZwM5Pd>kC$O?QLhZ3+X-Xjqm;JWHLWaF``<*u~Vhh=whsz8D(z +z6#bk}odtl4M*&-C-YpF640a_PA(o={Bl;OdojKHbf<~a{mhszdVWF_dvG7l$6%bUT +zuP7HG-wT{ml73ViS}Z0+H2*PjF(@gN2a+|Es1?x(r(h~*nWdDzV1R1q5LXDh=o|rJ +zrZ9AjF~H7RCWAVev?I6EfsiQDmn2le6aZ#ai|*V)3#224hDEc;hf^VlV2Y^^B{`-Mm1JIpLrGbpzADe)8 +zcT$}n8w@s|c*}7C1M(sGn{@F;JRwlr9Dqln<~Zr~U$!zs1Gt%4)f^sXKc^CO{*X-5 +z*Wk|S8ThAXS*K@_b?3ratv@$8iz<`PNqLQ<4DhuR9T`#TwB7{@=pMqem_UE)_$=7g +zuH(jLF#-PMt+6y>bQY@vcu;{j^Fs#tAnw(j4i1d9W8dTOd+_}*FSgx03WPjoI$Y#E`VHVIbJj(sur++g%Q9UCu}1=Mq~17-1db?6SU +zEdDJU7c-EUvFU*L|EH|}UDlD{?RYPLD +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 +z*VfqK6(F&U^sSW(72JGg} +z$bx?gCrYj~9rtdGRZOR1(MA4eWS5-GpM^7tBITpB8J+psZR1K1SpIdK5`<#tDL2Z( +zsl9RU{31ih62r`8hKS{+hTg=_GpLp!`A}OK=+W&mZ+^q=vJn2I+hq~Ln%iYEb~99+ +zd~;h+x$dyR +z)mt-CWhHL)RT*Wvny^&TGz}~h@i^~TKX89tc?R)$0*v*H;Ue28flh|FE)CyWH%PQ~c1Hc|3_)^3*m7?HfB;Q+ +zwYNNya&f{dz2z~`TxwW&;vkLD2%CGc)?*|?he))`6_XP&YB%+gF=G`=H(?-e?A?k> +z&N0w8_O4eDcknU%dac>VyJqg9t--M;;l2f4{R +z`ITo2lRBCyyeP?l=hU-ng+?Re`Ri;4csgbnkw!spUmP$})YE05nX=+^3Qd#2d +zbg_oB_uUFq=O_@%B_YeDo0rR0E_bplcdlOUa%H)E=5p8keLwR5>Zre#Zk+On^;)|A +zT6*@i^i9{(-BW?UY|A3jV_scv2&g8=5_vU>jIAGs@LgF>r|$7 +zOy}ud^;0D2bf5Z~vP@47lFG|x()lmIE8$*w?-`OP?&(~wd?ycBnrWFxhr!t#8%#o~ +z+nJ|uHZrm;J-jVl0^_nOtLtx1Qd^N*I6p>Y^?4 +z8@2|I=w|N_+5I)3pRQ|$v0fb)HQcUusRWV#epvG|$ZtP(3cxKXB0Y*sP7lva8AY)< +z$!RhedeDLJx6_G?nz+E9#NAP*8r+nKU+FDb@d92F{^P1&Jkce-MmKW}FK&gq@Wr>Q +z&&jI4?1MjKo+P*|5+2Jusd>O78}v9?&QW`Xh-k_90-DAYEzKJ6$Ob)5N#|r>DcouF +z6SQYdPe?^qMqKf~`3V5#pnuG>65P=r{ySl{AqaoZB7U2aYC7b_0$Q6PzE1-n};c^ +z$K{7<_VYvPN72$y3hKH7aAz1?rLJC;3W(Y@B6 +z)6RL|yS_cGEkM#l%e1zqHRvQYv{>$98ZP54Q^0G{&?SVfEfn{of#?#LKcfSRuVcy5 +z3Psnswls=%rcWzevBO02Iz9OD07s8rW9XX37SQBMrr9s+cXvFs1i +zHWw-mY!}})c++KNp`y%vMQm2q;wr6ir@%O8hfE#s +zihl4P?Q~5Vf4}A1@z;H7jCDoy2YH|=F(cJ +zw)vFLc_%aiHh2*y@On@wFH1RNryDJ|9WlJ0VEN9{E+8UN0h+^iAQl5633 +zNRs!JTr-?|gpjjST@UY({fdK*x{P(?A)5Q1svsuz|M2zZaZOz7A8>Xg8IZ7qC7?`j +zP(fQjTbF7JxS$}tq7_@KEuo#LwYK6?KtV%L1f?yDRdKmDNjtJAwuR$k{9@Dj364g;8ZkTKjvzU{QGC{OeT`qUS3_L^y2pzfcIVmn +zOAEjpu!z>je<-L`l>2Wg@ZVIc4lk)JkuqC?8l|?y8z#z)6Fvu4jo|HtA8tCdpPznph8z*75%YrX +zD;eucxIYM|{Z<(BpHqa6Dah&9@Ei6_8R}J5vVt2p+NgX2_?zMB+S3*Dsqvfoh^a(0}1}0_STE^ +z3kBt;p;koFz7b3kcyHZ+h@@jG!-rPJXu`jCBBmw)mrf}z+ev~(3FWbEyvMd3q604rsld{Oh`S&I +zB)CSJ6QJHvja4EWQMn{nl{7`SdCum^8@K$U>1p-&PBZih&+}AW!LAa^u9D#c_;Wn_ +z+*PY_SHph8AqWeZ=dL0Ndyf1*^8X4dN{Rb|AsW@9*p@6uBd*mu#TXNjxDtn%O +z_C8fKUh~tx1V0rDw$2hj-;2&D+~cp<<2T@{uM}2?X*-G~Z9=*V{qTtXq`lXPDQtS$ +zhQE?REsU-wN&C|lBy6DB5-1Gm;|gQ8H1%ghp~%SGana*RMpTJ9*d7=CkEeC)78S%7 +z(yu?uH@s=oWuc;={`bQ2Jpb{E?ZwD5QJCkCv71ASXNm6VEx7l`L;?A +zIDerR;p@UbrNhI23y(OfFEoTdPjAvZ8xM~R<+q-ug=Pr7;Qy6Y#Npq>#{3e?PUn687H^C$AVrh3S;^}u*;e=^@f!+%EvnKN>8Z$& +zH5su9?S`LL2y|l6&@p(EG32SNk?8So73w4M{x3$C{Oo!^ns0a6ZWM<%&RGi8>#{hv +zS+DS#yD^8Ghn2fpP%4o>&Ijm&cTsRGWq6TzYY_)fDzq<5w5td8E{0}bp +zv(wCZMx*FQp_94I_^a`U# +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 +zcV{_dyCsPATDTRi8#{Ei+RUun1j_UojMyu +zYmzE{BpV0Tu+Xs^t&>bQHiTD{)m0fi1x4P1sd0kiBcHlAk_{6SMF?briF+eihyaq8 +zBBk49t9j3z7kwid;;4EVi6i_!!=Qr?L6(L~yU2OlbfzRlFBo4JrXE!kY +zk3@CJ)VhIr+x?O{4QJt}Hn4B?KLLPjI=+Ej;C`~qD}XTs+Xi<2({hN_p@zc0p;a{J*mOWcl{ABBI3&5*CC?Sg*CIZ8S={t7;)Yq;l>BHjHiML +zjpkYU5T#+=aTxXexuN7NqIOaf&aPQ^Wev%Fl0@u9ME1HXACZV=5^)$2E7o0EP9jc_ +zh&QRn)W_I+2Q$aX;}YsIigZ7JOP<%@3s4++f9xsWg@bcWF*AhND}K()w0Z*!Wv8n^ +zhr|H|&W^%`8%{zadnv_)QnLf=#TG8xuYWJAm%(ahX9!ML3M`+UA^9XAPW9lfg}@5a +zL^+)HOj*ZHR_Q{bQaz{vo3mr4eV#5R=J$s57Qxd*gkQY}AJL2Fp#;+&O)evFq11au +z0r7Pe9+?%@iq~g0C&afUWPGK}dl>$?5wq2KYJ0}c{rz0~#8<(-CtQ2St76BgFYKwp +zS*e1i<^+2xn%dwFh%1r>5Qg;2Mk~V^7>0$TlJ(xkgvdb>eB8nsmx_S$S|3#(B$VRH-y*<7`>RjYK^#%{JWdpXNB&NLZ$+o4Iof7niq5sNUcVm$y3^k}xXgDV_G=H&tfVg6S2&d7q?C^>KLIi+fLl^;lcDOOy +zfUaXlljFGuKgva|;in9;pA*?z8vg%lV!sKQH;pz=CTi(8+mKqgs%0K})J8njzeg0I1KItzYF9js!n7$0Fd*q7 +z%$+2hMy$qM&U$N>HfWYMc$PM#ylAbdYAqx$GhkA}->wa?YgJY)taFCJ4jZ=mzj-Y6 +zFxzHYZ5ejkGHRmp3&9f)#t-%0$sC^THL8>74- +zR&9h?%RtAUAUN)M5L)#P^!nY-*O|{%lsJBWlM1#7U=R`Bv_Tv7ctFvZ+lz^g6H+Ku +z&+JFRAjl^Xb1d)};9;g|{#B0|pp#ln*ptdL9kJKb9JEINdxX9wnd34@X|ai87le{lIN9ezf +z=;(+=!*qhc7XdhPvYDFWmCX<{*V90LAScoSOw{mA +z)Oz;T(_|zs(s`_R>*rr}CnI!FTCyJe?(k)j7~^YD&oLPPva<*$V+o`d`nN^Vzll_BH7OIXhdL +zD(7C4w#sq%lk&B|=inFzsGPI*3}z{SaXKPoZTe +z(w#M}<<13|zAkjX3F93Brh|pB&`K;JGmZcp>*mW$4TYAfe5!PU7k?(eY+S|xqBoC+ +zOS>-%-Fi(UQrYhVO#2Eg`wFRD6Gn311(@a+T0ehGjc^!`@vSI?N$kZ!#J$u@MKP~n +z*wbiUA@i?pTrJExXn{{;PNA|7m=CT)Ep6F#w?h5m+aM*P +zSfb3vE(NNL{g6P*vS8?*Ux5qr5gwTw@?tf40so&wX#b0gTihKfhit4!C}exVylRlQhhT2lyhJ2Gaqf`Z(_p~K)Nn_JjR +zj=J?iA|A0CsC`X`9sI8>85_1IcGUC{&z+(EB@Lwzibo$K(}uOoJH4uVj{$bWnmW#xd-+edg+7ca;=shBEo5%oCd(3M$5{??tK>Aam(Cr*_w5Ro%JAMZYs*1kG7Fr_geuLU@%L;prm +zw!(GR_wVptAcI&h5JlJne!C5(2^3mygBF4ZmfIuc(5n0O_7m|fNxO8oa9P9MT4hGl +zJ+tu)^O<}86P^yG=5B>dgqA_VIpRMGAcrhgikngH0yOb(%Zt0T~`XZ5v2knkQ~@Pk4X +zt-|QDeD0ri!p}AaOJ^i4m?kpEp7Dh)_ +z4x|2a%@0m9iU7F(-9T*)uWMq2Zt4YVCLf|XwGL9BtA^w7p?TE+ERcI`!J77Ep5_$z_rfr%2N=!iFh<7TjizRRzX0}0EI?zPha;H{rH +zERqcopnQ;HsSd3_awzynm=OjSO$>#1Y{yg{5HFpIl*1iYGOpE&+r6IvG?%pNCZ&k^ +z-q=ia%9?B$O~24h-_aLax?7YE)1N0s%CElUfw1~;(IeNPuIsX0mvDqUB7UF{xJ(aG +z)X<$ElSmZ~XhnDfo2i~-p#4*HieiJ-KfSouN(WTXN_?}TDy1&vuvHsi*7`v@kUs7Y +z(igV)HkqCFP0?MTQd;a<-)aKKd@+F@cUz-Xq0<-JGPMEI&n9a9pGc``gd_ZY=&EUFCF%qDq7t-9kpvyt +z(ThAs#5Gdp=ipkf=!brG+ertarz!EZ-61`+A71bI8)@|usrl5CnRUi-V7OQR;{oCy +zNEbdY=^Y{*=g!v++6j^MQtlmeH6BuIOlL4MHY*{;Fz#!b*)JzbE#- +z$^2blrvp2$)Y5I*s4}49Ss<(Iru08+K< +z2Hv^jVVs)!8`2bM`D~8o +zJ&Gxl5UJbDjFn|Mg$36NDvYi(*>3Q%&ICqDOqOKX^0H0Y9ofoakA|uk@J#f&@WmcC +z{iwAaaZ1~kHPrVtRE(>McmVjpB>zq7Qw6nhIhYCwOjg5CUr3rZxPcpb8O0 +zU~_{O$#Zu(NOpApr9gLq6ypvchUcHg +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 +zND_g=2t1PwPMOyPxvqu +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 +z;LyJK!iS7)THxh0P?Bg(NFlTjU?IK-71`a`w +z?6wK)LM(awCw}%*_tIyK#!~xs;@ +zW-n^*iM^t!j|5IKZm#XVRYAYiL+hvk#B!5%kxJ^P3wRkn)Iq;}bDouc+ctkq!{jDi +zL|D?-q9V1>baSO!2vqNv9x@fRmAZ-qf-{qwuFPK3LoZ5tS=cg=VgO=z5kfzf+s79t +zn(24bbH*AMR#trbXZqr6x`=^|x9{(igU3ltY-%mEYZp1`MY=%>n8p$_PoTKL7K_+# +z{i!gk#vh4b5bR7#*@%$8R$sORSkA-|QO)HAW7afYd0^_awONc^%Ii8HV7Pzb^>FF$!53vY3N0uPU(z9ZPLCx{E}6e +z%nR^PeFTC#<|98RJr7UU4gukYJ9qaMHLypU0sLIBfzAX<4r0U#?K|5Bz}pw&*JY*W +zHyi?g(oDb8(C{w%;_p;28C2&KM^*0+QjHqaqw#mrNoOCe?gkSU-o!YUfnKC2PHzku +z5!HC5xg0OsOiu0Fowf!Tvuh!J@T_al6IX7oMrU*YGPz1%GOxCnS5v##azEgV05%~; +zOyAAr%KV%f|M{+@=RFeXY4OR1IwW7%jkJuALSxubYf_E+zT +zrfRV8ks)r2PhagzeMr3~n~vqks(p*!P1e>2skRqa!_aRpOy$M79NNWZ?POB>6f-@A +zndi6tii2M4q^CUaQg=DEQ>tqRh9;}OIp}quP8mAmq!-p##iu1+KaB;{nsgfS>s~#E +zPOG3NS0zs!|4Piffy70O +z3-iN4Co5Xgzi!^;MZITPwc1Y4H>8>MjrC?0+j~ +zpna-wAG1_>UJiQtj>L?1XZnIKm_-kb9TMle`l+A%Nv)^;;k3;J$|t2NLvLATw7^xf +zUO&3TyVfhEE2Uj`@K<0=?6eY!2I)J$>~3jFpYWxFe$7e0TI`inGjzK*$d07pgQ*Dy +z`ZX#_|8bLkU!mItOm7G{eN!u<)~Ty1-dmT_Wv2g@(q6s0`S`v+t#rC7`jFY^Vt&45 +zHr-_h+@qrS7&1B(?DKx?G;FCexF@%aO?R#I4C9%5Si`A{OcMAHc5S-s;-6+)4!76^ +z_N7ej+L3sCK8au#xsJmVQkY}$j-uCLDV^&H1hCYqg@npkp6E=Q%H0m6#NZ=ZwMlEJqAd)F>2pXLsUBt3#@fp>?P;&-ChbC^otOS64SNA;Mq9O`sAPM& +z&Yt!j+ZkxpjxlRrbQkvqNt)JQ95eB;JLx#n{ak9Vy?ptz)GwK}L^`aA2^HlA*`YrPU1$@SI&xvL)EP+d=M$p( +z!RP$Xfwfr&wVTgk{~~lM@#t$J86&-)*_6hh+uH~CtBB=p{ +z>%e%SVz1@vT-%XcSg?U6@(uyl76>h8rM+BaPm_&}1+7hN*mx}RF-=@Swl5~p59quQ +zKHSX@EfAQ#%(dKF(JF#1WlMc-E!`?I?aO7p53=mbt&PRQ-dtEcu1$anBQ;ed0Dc#^ +z5UQ-X(6lGl61{?J39>}3s1+jN=ehjppjzeAgjOUB!9+h*XzE&J*`3Rr3bG7FHTiPW +z&Rq6n&{Fx+gia(3qo|J7Lep=nET83aCxR?na$7|Uwk+3{m0K@m7WhCFADg#Q(JD$*=n-LaD${sR4|riAJtbSgKO{_>LsE!bhNNyKh++=8TrPLXQy<(WZHoE1&-!F9&OTOIor+oi3Py8yj +zAt*td8|N=Hj+(T`@5OqlMU>kr<_`oJBm|sL14G_wqUR?9fNt8zHHUUO>rS#DpbA>m5OJKv4$+*-) +z-EN$aJqooR9q2^FQ5+YxO}2~=#H0}U*%tK!g_Q< +zPWvoB4wIV6{8XaCJlqE*zRE-O+Bb($LG77I#RIGIS4FvayS&=(M{HlmNPFEF+v9R# +z{DRvSjP)Xl{2*re{e9yj$J3F?gCggtVT-+4QE}>_YO%t4>VXO#mrwPnMkpvLx|%r+ +z8j!mPUOpvCN|%%d7>8DZp1mknX^8eAUSP{*z6(egmQDSHg(38Xx#}SRuU(7W8?aFA +zo2?#Lt)?OmdkXeOK%RRVQqZTktDmVr=A!&-`IV@Z5K1loK=0s&BjEU;z!bTH-Fz1S +zA_cphm;qJryMlX6f`VBjVb7uhQ|oeqg`&dvE56_@5MyMF9jz?-(Zzg2?&sXLo;06d +zi%ride=P^BPtT`z@6hsWprJTiqS)-9@>g>VpI@`g$iX>LQ3A6nWDFD}=M)F&g5cT^ +zOx-rmS`i>w8fab+Od=!d*L$WDattDI%c9L@;Fpif$iIG!pL}*g&Jp4EsAhm$x9t<2 +zj7q6HzvB<92>Sl&!`4JGzbwd(2hCUWg_tMLc(mL&)kwK&ytH1(Ja7T;Y_csw7?qO<1$Y| +zZz9(HvG-k5ANBLRW2I<}hP>;SH|&O`W1X*JKEQ~~dtG3~?-rRJXGaE05|fc8E?JbA +zEKE!mPlpS81BoHncgO=H6MZ6my>xN%@;|bRJzIvs{+Xv~UKULMxaX@$Fs^)}h|bI+ +zf<|U@AY=i3+$Vv|sJrZTtpAJ-itM4M!HQ00Ha_4EJm6gcwFU58FFqpV&B4oUp*TM! +z7ME`?NNN)mJuldGkU;XOP;Q^wXEL>q`KmuKfx5-|kl<-5l->F?05IM_5(H|3tL+b5 +zX7;-Swy{~r;ng300by=Le>g6So$d~ep!k;p2$%0jHVm+K4a_7c@7HBi=n*LoL^~1w +zwXpx}4?ISGa;`%hg8a~@L4I-o_87?siX9V>qRZa;A83?m(tC)zcrw^0vLne{fJhd) +zjyTvaal5!C9qd5jdIV*!PYi{=g +z0z+hu2bn6f`Pc5cVF_CUO`m4-v)vDz=rMaEU|$_2Nt%Tzj)EpI>jTJnv&+=Iic7ou +z-xm~T=zmc!%6r5o1)0`mbAP)FUW9_53It$iG~6nnd<9b$Xo|??lJ5vAo=7V +z)1WMF#$8ZCZ}JymEIVnIFRF{?>OIM?VfNt0@Af1W|3-;snaUF0&8DIc`r9RfQou<$ +zhs&g1&P}_k*37NAfmP^D_9qwTbC+9%p@K$J%uUqI^tw%NaBr#HYxnE3veemQGjRa( +ztrBgXls??IM${aap6t8zvakB`%&*JLI|UcwmenBBoT^$75M&I-0$A}zwa)(P`&#_%Kv$B{G7`j`_li3o%)^YLY$RU;cgt{ +zUr$3s{)I8c*l1X)iI4{K;Aa*_kG9Oid`#CNJZB +z0{~uq#NhTG^@vjj0KEE$RRYb8boVFu5~EFA=RKgMUs={J;lD!(trFyXX&G~Ylt%d8 +z0)Dq27;u0CY%@3pScfTNvL`Lm&4wt>(A-jzb?R{VM@I8`Q3FxwonlR%?AGm_>b@pn +zRp5#SRGb$ZgsP^g%H%}DbjtjLNMD>_nC@jh^}ajc?Y<6Vc7<4f5SbMp+7%z@AyBCc +z$JMS_YE``7ABNpQV>QhVc~o0q|3PG>Rye5T|Dyn#Wv7{tN9puhKqZIW$z3}}`#!Tw?Fs*kWjnS9lnn2SE~H+;Igz#nS5I7er__8^NA^$c8Jab8sV +z54e!u%x1hx!<=Nr$-C}gMsY&sbb(>I(A{(W-6;mESI+GAJt9YWbw1$U!tp$yb{Ta9 +z=2wSOf7$%4)X3duKpta^kVOaYyg6_XntU1STHqj62#X1J`}Lv_BqZTqnljE7$Ii8(`z?F-%50U-l=hU~rpBhKQs8ZEr&PnyQ!hNkfs +z{M~4B+(Inxei)j^G?CW?f&L9ifB=KQA$Q^bA*CXQKjIH-=8sU_5q~H+^5M`VMBj%} +zUd*i?wkCkTdY$mTC%n&svs%X!?2#Qb?B#2b$)1rRUL)Qa;Sb*op?=h{sXJXWMosvw +zsLI8(4RD;goxY$m@mOEn(Y~oBH@)cIHK2*W&43CT+4TTuoJxW)u;7BiV~RU$d-+4k +zi%kwNd>#(dd*m(Jl1j(`1Z~fK2&y!Zgx^H|iF{Ijum!Dk2bYjo)?Mln3bFhYl3)#q +zWu68R%TDgkhO<9Ekpy8u0ZN$eAdDwaVcY}~8;xvUT*9+p81oVd!d?Tah<_Fgmj2VO2r>YaA3U@G!d%>;xLe_fNt3vOCP$ENs5nznb +zQ7c1V%v!&SO0HGfiKfZI(DDD(G~omRZjF+KP(O0N3=5m();yULaYV}A@`q+Dz=wR7 +zzkw)YEZlx2ZN;j3@if3H!5r8RkP7Ai#r?+}$a{?b`iDPMX>o?*zwn27w9g#n=T}sC +z3KD)?u`u{AtrPwi&6mjWh^H66#OZ-ba6H{jRo +z<2%HX;2oUijQ46y{I$T+Qv{UBg%b{llnV|9lPzD)bp|da$&Ps35h0lqRZ +zKm{u-spNS9=kMENG^tJY +z|DZbJ0q|{`3UD|DCKe~U1JU?a&;T%#h-oER?hr3OaXB&5!TuAxResYwr1=yVw(=fO +zCwY&ox(@(7sV(3GLuv|G)c_n-;rbiizy~BQg#8XC1p2rRnGdFjA~DIBm}GJ~1|+^U +zIq|J2knK6YTYtTrX?n!{GYEvc2k3fuG6}DP>Vc#pImwzl#hyHMdGcff@(=sRBE +zJ5kPk5fsyy5DrHImnGI2bK+*a*3g(>ossUo&K+CMclA0=0>>8u$2$|9@4O6pC{cIM +zeZB9#_VGjeaC*Eg;6?|OzDHoZKK%J0b}L_cihVNxh9De(f|s(1AhJyRS6V{JA5?$9 +z-%*+@D=op~Y5z(FPh(eF0^ILDWO|gQ`jr-6JUPrd_O`NUqYIsZuMho4=xKwg3`0l% +zO(ERml3p0kdkc?$>#F$nQF>K(XcXfuoN6anR`lCMIeRD&mL(1a9+9-l+r=0FKLDD{ +zdXN*>SAi`dx_4xR56BF}jKORQfs}YU?{`O4C*h?JRDhlb?^?{fafd93I|i6Gt>iwv +zgALGBypsRqj?QloD?=5G^xoxBlsM5WV5Rq3c9`K%{^L8?Pb>dGcaOoD8eCjra?MTu +ztyyWgyp*EY>(IO`xVWOiF+jh`K*}e^(rq +z91z?(Y&RV4mtlj!m2m62v3s!IJbU1(pQZbStaIEhf3i*flR5=?PbSOJkKOd4?j4xM +zX5YLAMhJ%XynEP?+j>kP%Ppp*{7vA +zX33qF@yz>oc3otalF$ctc8zDBC-9R#eq@&^aV4JzV}8uYE;j3qaY`kOf&p#KEDAaf +z9kmc<6xLX#2QYYu=c!O;FwRrV?!eOV;CRf(*$*jV1K6d?r7+q|PFz&RYn511-wm32 +z?`c0`(c4LW-=qLG9_t$ydLuG))%pGY|Mz`AA075u>$$AwzMl20XFXnQJN#sd4+h$WgnxTrQvF=~ +z0_KP2=^gM%+kzFaZsx{1lgRHU3a8`b{Iz%hYwH=@$xPqR1t1Onyw2gLR%lw$aCimh +z`xMLw+fRJWR!W!2aC!vJyi6_1Qq5Da3s`>qeA&W;GIOb^X*>%Bg=<2KGU~|8gd-^- +z+an>*mNnml&%)*o>l~M`ISRZkVA&XHoujOpg9*QGrc2mNg^*liovEyv>B>E`f<3CU +zoQ;IgYJGxgdBQt3T5`YRBmMf$d+q%&Gajp_MoV(csk+ZEh0QJwoBg-2*)KNEexYS{ +z$s!0eFzcoxu47s2r)uB4{_n?e8js +zoyJD$G741ZRmE=Z5x44O^O(kl0j)S(?~)dZxx|DL&{%|Fg$rooVh@fc@Ue{`!&XEv +zP0PxQiG!$A6ef_39$~Kg-t-d#40kLAwyy7$U0>d7_jN7vRl<_2IH +z4uz9H)$rG@i?as^rwd``z0R_9Vlb14+$(9)JmZ`J(Cc!v4^EF6>Vv6szS0c6ASb>F0wQEcDkT +zd6&igcvqI~ub-^r#}0U}RKLzA0RweVTv~N!k`7hl3KOK%N?wf?I9911ub^{@2$2gB +zf**P%QzJ50y4_Byi4oaB_xD`FH?uGFP#Ep()B&*NQwGJdlVI6SzuR-*1ex;K2NmUH +z4x$3Z2NaZlnW|*NS!jX0ub>AXCqF$`m(NYW!u%~pFa3_5uk(YA)+3FQL10>cJ?wEY +z(GFntd4fD~K+vo=He*(2D+f3^qqq|U4}anSMa)mO43wFFZy9N0I2q$zZ2CLjBO;cU +zflV*KMj9V#gxFi!s=ngJFYBRiceSE4S2UQcwwKaByVFnm9jM{5m!Z3C)^S<*D{g{Y +zUpArthRdWB{O(_H(9W;Ct#(sz>J>sxA^WC|b6p`=3dPMj{wa82;TNKY#mD|8Le=JrrS)CXi8W#p5~F+3xtm(7y*_SD`ryF<|-LaJr| +zaB%iku2z&YiYB8%9jH(TD4MhiJmZN=@@h5l2`BFPS-%-Z)3e$KcZ!obk|*297x6Mg +zFV!Wd^$>`?+_mlDb5e+(ySDW^E#dYAB(J(hzTzy`vS2K9w4+g{U0Qq1(yTo?Wmg}8 +zZt7?Oq3xQbRf}z|e#~t`+vz5nb^3x^IUPbUIZ7g^fr+yS(HfY7}Nt*gR#!kJ(NhLf`F*i7m79v*JNt1VSCl~FTY +z*(JIcG_?N!LxIKgZ>6azMf$y$pmr@&E8&;9B*}o^GPR3I4L8l?J1faRpXq=pn+vWB +zzjt-k1^QeEjwM{g+%BOFd0L`_7dCL^%Ue}!E*7VQDmHTf?LFWmoRnO;0CsLQgyR$o +z+)R?WG0EP%%(@D*0mhqf=taDFN#D3`Z_3u9-Dbj2Ks)1MYU73G=eA$nF!@-6euHM^ +z6pzz~7o9p&pM27Dxph+DB3?Zp>sF-UvSrn;?f)UqvUEM+VtPW+c`LH(38nPw%Bpa% +zi@lz&R4))l?yDAM*G$*CnF{Mn7h%^TE_ykisT1B`1S3}pfS7@r!fokQ-yAz_*oW)1 +z%2Ulbb)To;qkelNp4X9|)M<>x+dAY)9c!#B9M~z@Tm50)=qff`>uT|cxD?sG#9-HL +zDQD`B!7=-_OifseN9E+@Q7x_+UUkv0mKiUukA|}WOU2NLO)eGiXlc4wIexjdIy&so +z27!+_5mNk52aRq`v}B?A|WQoyec->h-rYRopdP +z7|}1(&}C%y99g@qx`|O>9}`!TXi1(PH!l(0|J1dUZY?byS3Q7w91uu< +zhJx|x{#&q^veziS{@R8Da}pf-@-JhX#N(|jS9-BK_uaC}xJ77%uohL=p|zyO*J>-j +zS+>&^pQN5=4rBso%99zYGmjr66fCkDFOs*-OcycvoUUHfXuJqDS)=JeDP<|e9bymZ4Htmq6L%l^uLoXo-CO$8`|h{g +zKXFa7-B!k~j5Xqp8#mnUDh(;M)v`jdH0Ccbn +zeqA6@S%U;(kCLru!RGf~W9E1~2%NMC0z=)vj=FePYovRbj=W@6mfC^eu7Ov&;#Jm2 +zPiv${yNv##*qJ_**J#Sx0>?5n{0yJE4@&LO2{A?@g|)ba9lDH3<1rt|^9aj6<}=3; +zWgQz0!BXC1kw^R3E00kun)ji73aT9C?eHM +zK(fBgr|{08@3IEpWguy1xtBkqYk1ch{C +z(TnheE)hHjf>72q{6%V3h0V~F|Dq)CXTxzlrC#>iQW)-BSsMJy(v6zE?&oKfb}U`9 +zB{gEV_7f!&n8b`qC~_nTmid#lTpu*!+3(PH|vyjT66i~2WP#6BdrXLl{7!JDm8>Jtxcg(It< +zY|y4tgCTZ;N?A)WiRFh#A)#Hn#_Q1&8%8jRTIvcJN8{z(Fq&qPO +z7_8R_O1z41E@Y9o9_$jEv=IWk=9dj8h{2L|>redU?lCYJ6ILySzn5p0o?f{Whk&|G +z+$Qf$)O%j+JjHvG^SGjEmZE8rLOnyFeoUdBu24rR)Q>9EQx)nd3iTrjHC(_ytWb|r +zs6!Q9u8JyGm(I@IijwG8T$o2axbp?#GhM)q8ixyg?r<3}y5ghA$MpVaqY{NlJP>-cP +z*Bq{fBMYvn)@JF7yy>H+hQGp<@3e7s1#Dqg%nsY=J9z#v{7%zqTlnSjGF$j}F{QTf +z6Y3IM_`asU*}`keU$BL5jw!Z$8T@$m|HhQzV$ToUi(<0mGRpkY?(FHLJZKKoF`L@xs +zo6NS+lgnA#=#eqGw$X#sIkwT7rfeIo!GsTLT42K?eBmRTGHrDyy2BqCeYqB+IgRXF +zTwF@eFR47gWR2gdH>#B7Mg{lsqGk09g>RQo6ZZK1t>NsF(}xz;H`eR#dEqXS{z~A5 +zua{i?ddW|I**E>>mwvUR@+(A5dc!Y)dv&33dI|0u>AxF-OG*0mfel|SIlWVgdtk_! +zs!$9-jJD!iUH!i(fd_6I4%^7kY@hc9hT)d+8*cM8H-sGpmQ&;5g}Px0y#r&e?#K`N +z_5B);+|d{JYdO-TAKb6~$X)#xL0w0F*Dne3dRf0cFlfXZ{fdGHZR?jG6uYNiPEh#K +ze)AbRo#9iMhm)Ac5`qq%>6buxs^PNWiy1!eBgd|hm7RYd+PQgX=boXRhle)8wJ34$ +zsVs|h?L@1p{ifpN7X4smtSd1aI +zRiU@NbWK{J4!XEfHLoz+PpOmVOtiJM3gPyK(cE(9^oO +zO$%{cMDcHE$7nuY<;JBh5yQLaaX-AJfx{4MCHX4 +zq;9JX6YgtT%ihR{LlxFJ$Li)BNA{^ZJ=MExqUKsV9_b$Qmb&e&)#Z0=yy;i{$To4= +zO{f!caF>vs{fni>f(w2(W-DV>;Wh{yJ%d+C28}H));S?{ +zb3&0pAb-T08!J=U4O*hF1N8}2%M%W?Bc^ZxZf5_PUgi`TB=64vbf>OVsTMBjzI%Ob31Yy +zdQtr5mZb2p^>AbJVIauP?&f2E*>XahqOe*lbrvgIf0NoLv@LFETTJJ- +z`5#Y-R3&2NwN@)%AE{}qcKI<#8Ngzk)e$1G+KEX=&7%c^c(Wggadu2TlC2sK+_ACZ=4&YHW +z;+x)ebWd6JxRLwI(nGtd$9JWNwO2pfo<6RndO}P3_{M5wW4fYb$B>&H?iu&C?Qn~- +zWJTdtgeOc{if@;42!zfe5 +zPVa&!cEt9UYpc@QsO_SQPpa0sl_k2Q9q39_Qr5>kJ3B+W5?!x&dKt@Fl_rnqzp!nf0gf>+7UTVArsQ07~Nk1pRreB+}N +zo6h-aJik;m-#zx%ZEt>IJ)v!E)|R!pc6s<#dH5hv2%uFS-uNi<_+IMn~92T}dXm)SBN8>7m=ML6+y-}*9LV6-64*IOZ*!_lEk;a)tT{9PV=0}=l +zF4^{GJK6~8pqXM@>yBSD#=1nsD!O8ordZds15vYrOtT&|&Kle`>j7kgjFDfF2f`jC#pJ*MedD18`=_;R~NOYF=}D$-r)LU!Kcm!w?ySP +zMitaW6y(Pp14a9)!e*(~RE2UM6~U*6W$~FeRmW%J@x24FOkfx@YCJO~l!+b3q=ztz +z!kFjBc70ybZdrMA8g)Evtuka*W(2-cWlQs>f5&CgPLyIj*l$A +zVLLvVoQzEgtBU0zC|y>OM;eO$_|)Tc^8Ojs-VPSDp3S +zGN#T|ZFO~*!|({>hcF@u<1U3!pEZ&&9#&URIgE%fMueeL5XMsq<8d~Ogwa@Cz2q=- +zn)|FUgkeb-FDZ-$IO}wFj(hg1A`AQvMzv4R-7>XHJt1!i@vk4zf!T{3S9Q#ag5tm9 +z@=pbB36>I~v~dH{vQCGqQ%MH?^5r!Js?nYmNrp28svwO8O4m6ZRBY`>21|N1pZGh2 +z1KZK{Nrr@&2?^>+Wgk3RlBDGm-K#7m75_9?Qmg5??n{pt>OOeXl2L6{hbP2Ls!h`Z +z* +zH{!-rOJoTQ$?Dwig#{a0+`B{K0_w3X%pQ`E9o*>N1LHKJE6X0*>c+NS=09pLo>F|g +zqFP&(&1|Wm*3}-@S_s)N%T!LduyMc1p|AUrYXoGRIq}B*SSZZO +zCw_0)Uy&Vmu~3MSK>i8=FBA$z62 +z{IpOAlEHSFw|#}e03gH*4&K~NTJGaQ^5i--!0W41XRGNp-~PbW$+&^QeOoR5$9I@X +zi$H_CzM|%w`mUOLzmRYBorrKXg;bz~JXam$#h#avCH04Tc(+jaghhj%^M&flS}1%3 +zfc=hy038CNyW+>Xw94xXv7rzao6AO&7;yU$>Sm(-HBjsDQ@js);1G)ny$BG(l`SkO +zUIiRJxqlQ298v@di3)GC7Q;218mud1zxB0LT(iq$6%p4JpXh4gzt~@ObD>KyY^GU- +zVk-0*;34uc@}BVWT{c6ODr{)^(q!VwV(B<-);NP{r!8xoHf|irG%UAV=DF3?P#<8h +z1`Eq!RBFL3v>FRI6Aqch=H7DKLoB>6#C|h<$`^*&%OL{W`)hAnS0iy2{+K7mVk4kaDjy+?e#=coI$T##N%4Q$nn_1$EGn_L +z$+8AB;GpYK!`2qMhK$!jPi2@+Udf2cTkEK&>{%pw0#oj8(iE>Pd0870Hx#Q!f0Iwu +z2mc5u8Ct(qSCOOzW*9KrZNT8dw2YZ(@&Q;m$_$?=GKQpNM&|YT2cIhFoRKFYbTnNanYojf?IRLEG1Ek%G<6PEKgR4j5l08oLe!y+A!2m5><_7 +zIjbI3HYP{Amy}Ev=wj!!J>zcOY$?B``FNzzlT?(WW0KdkuHTdlsTjQu#(y;{V +zq6({SUkwHo1k*Qq`w>M6TY4$sciA_c`afu|_tFq+lQS(y_(vaYl=y}-jS^nzrD2m# +zziua@Envz;31!Yy@m0rIl4!+!G|P+h-<@d1!qZN)5_Y{4ZG*75kH#tZSDa|YLVh33 +zQX;N#qGbrCUfO6cx?Cd3b1YRTr1#QboAgpIjhZ7Q^-^$;WUW)#QHD9f6HZjIq&FUD +z8N!TS8uEM5nN}!7^wN;u3%xYzfH1k2A|&L}rT5k60byJpb#|`!oD>mtO}s;St8u}< +z3KxLAE6%RwMlK?H8gV5;fG)Ym;`|rV#eM0KH(j{kMdB)_GGT~wL5m25e#((HH&8;f +zD#hh+0Ls3Kn=H~?hZ)9y5t+-_Wxf1wNnrfOGR6nYVFNjDIhrfK1Z2+30WBtwhaD1& +z0AZ1HlVGt>N(lUZY;-IBooLQO6^lZQwUhjamWJSm+VLlqh;^rc^0K@O$GG&`)~R07 +zqJS{PtB0+oZj^b3{$3Dbw2+8IT#)DIUfPwvpdBLdqC7)?`X6W){!Bw#2MOm3A{=9G +z6q_X#!``J%?S +z*w;%N?ZwY?jyFfx-AluxbxF>&aOhrp%dnoF>r5Lh@O`vcHo=(|B)r{68^y;t(yAxYJfW%V<|dihnZDdavoIx>+5v%XhA;Pg0rmXpRRt7v3U`9N`50gHooDUI +zJ=V(;@`yCg@uCXZXlLBK0>P7oj!sfG%~o767aaXm +z+4KZ?Y1$vh6y-rG?7@9+yKI?U*4U#z+t1o~Prs_)reK_K6Q|1ffFnvS6*q#2)X7fu +z<>CscDUt*l?#s=!BhiJ*vyX9}#u4<4`N~veT(Mf}F-s(tiU`(a0(ha$}3HaUr+DTX@SuJm| +zUa-hL?SkYAF5q|CPhDW|Ne?Q9dI|PirQHkHZ24L$O@9gXqOJ1w!Z)@w*mFbyp(}dc +zCR|^*XUh&d_Yx9}yEHv*Gxt+V@vxm{sAxGr`C{AY%L`APuTOsKrnz4Tp~J-$?%*fC +zeWQy0^S66SXm& +zHtZB5vH~nCwe=EPV6k?kHcR>r$qFFIwFY&Yt$0G#T5T2>%L-_dh-CK%(4<=G2utt? +z`;Dz?rwut3j|-WoZIiNFirl}Ebq0;QY*7ESqwY?2VMO;cRj!cgZUm|BvJv}tJchda +z*pt+q+ROa#*i(+WtCun>kut+Q3ouF8mOwBMKH{YB9bb8E)fafyp`xDmGLMTswM~0! +zuNFN%t|Xv#EuP^tAR&WQg-tZRQTIqFt{x<)baeG=4cOq35AtBA*3hVmlfDUS3-^n!OzMye%=*d`(VP(?9kZHO9Y2|#n#OS^RgR6r6RNCrG*$vj=O +z6;C0d9NTpB8{X9qlWI?(9ZY`VT>b~umD_MQDP~IU;-jy +zRc$Z9#lHckYKDM_nJPS(6)`j*Vzw&gwk^UK5HU*yFA-$^h}6pI?EC+i4)(p>#Wv~z +zJnpx9yAmhwM+XgIMjDtwgC`CeL=B8J2JTn9%5|;{Dfzn=uAC~)R-0r0t%d^9GX`&< +zRpv_)>Ion2@A>jF#2)wIR_DuJ8Tezwemz@}{dRu*+xbzA+F34t`GP5Y=IZyK@ +zZ)z$$slt@SpBhZ2OmE5+Z^V;DRy^!Omb_Niwx@Mi<_`PpbSFt-eLh4!vEV_TX!HU7 +zT^%8a4L(s{YZJcFn*Oa_>k?~RQ?=1P{vk_b$P9dNo_VHR-grw$w! +zkuN-!O*OYF>4QE9up(cG1jrsB0T5@Zk_(5hgSRQ_ee|2vT%lB6q^UpQM)~d7%{>e% +z-R#4eLEu04;aI6^TA%>g>x1h!fozDL{NY0(wR7_&BF-y6_TkbHfkq9|NPs_1!g}#z +zNLVlNA%ulPqo3?+hS_gP=yKBRrO|oDA+;rCWESD(>dnjMHnT1N^MiIn8dtL3o8(YzgF`fyV&qOU^5>}Qq-q8>6 +zFfR{;xJTy;Z8>m_@Gl=sa)6Eb()Nh=;RfalViy0257$3mXwPEzAT`hjfq|ve9C51; +z^qPS6`H~w-(dyIGMPR>tp_!z|`854XU~f4+i;wyj0(#n`zvH9+iNJ35=x_U|FOu;X +z|9~`(=u>3FG*a3y`3LvpQRRkcZB{ffT`IksS7KiXPYv$O=Cgut<>4ry@?=)&&Af_e +z1Bd`gA8Bsne$SI-L~$dyhhGfj_*-5$x{de-5D2rw$oNfVjI)@qBql1GNhoAY51N+` +z;(p8%o;0ERxzhhcK<;9mT^@anK;P#HvrUr1wwi$F^CTe~qoIm`XY+*V5|ytc;5T`~ +zR4FCCf`F&&De?aR1a_L`$l|L23C~sB0dkteTL7E=Jh)Ht>fl-b9YBy%vK8*85!|Oz +zp~MOw>iIDmY*jzXqbq#SDp_ed_ynxWWB=ikwMwU^6#Y%ZxZP55=~sQwObES!tI1>k +z?jz*nkkHNCzw+1(K2SMsE&Upk8%$#%$n(97-{H?*3Hu494C0)ONdgIL<}g6=33ld +z8`jDFGf$Y4g+27kKGsCV#?Z~LfmqcSgrz&VzoYsPL@e_e6&<_Mn&`4!7dvj-#9bR* +z#@PM9;Qn#ov!#t&6;)P6+?Lf#ONdsCEKu7GS?j7RQVi}UhAYk!LXk|X8~vOQw<=F~ +zhyW_~Ss!j?o-m34xJu*G-^8@KaZlw53^4pNKF}mD&l83a;Au=}+>$)O06=`or`4VE +zo!0Mh`71Yo^8 +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 +zCJt^0jE>!Z^v&PlmPPNgJtJm-yAk4v%W +z=e$4P-SDrRvJ>5uch%u;xbE<&_-%E`_i){z>)fTop2yM>Y2hNthec(nslfaIqo-q< +z*qY;bIB`$)HG6(R{=>#;LSN4bF;*CfXKJa(qskUr6+KA +z<92K3xrU;MxDBloTWt+%a)h-xlxACku5F9d>rxeM>!ptrMcp}V<9Tghjd}L>@He_O +zByOK}o(2zyiY8U(X6Fd05;^^n90)IeBVsC9O5`Y{d}OX? +zj}wnwO0n6d{YKXipCiPBy9*8Jy`^h+l&F?Y0yWcH27n-hKL*?5(%8HO{aXe +zB@C7;sKqG>FwmZ&!0&y@eI?BoxX=BuZQF-%zIo({>m@J>1f9Wu`2<;IeDc08ad +ziZ)?Hj$@J>mV>tv#T-m~5P(_yL0D?gfs2g4ks0zJGaYw%2QoQ&W`#eqT1#zQn@%-c?e2=YKn3rPy%xM+x*b%>XdF`FDk>>6`od?ZYrfvb +zJ(Dg-n~0g}bKvDD-2!b9r`F +z`pq2p4TC!>H}MwU2}P#6q-v(?q^A1OBy^aZdZEdwlAU^?qn)HR<$}pkUC@b7>&**{ +zeCI@=qny?VDc;vkRB^I%ypv88e%c@79d)9z6P@GLJ5lH!~?jWg$<~T(WgTN!{c(fOpBS{C&a3&A37gU(%gyjdyWu=5fCoDZc +zDlQod%+?_!?};SuXp(oJdADA8%qcKGO3Ih@K(4~0P6V3Nwh-=w5lPJolbkV9#gZ|P +z+QyzT#Duj;7Ds)hmgB~lT3uy?kBk`Bi}3bFFAwB`O?IhKq>#Ln7WY7JI()D<7i6;U +zyhMXH*WUrq0Q?*P`=A^*+s_p5XIkcG;{5;5`lB1-{h>eNbpcWumE0d)?U39bm3Bz( +zk1lGpZ~gINw$q%UaP+b7oUpWwk|tK~$n>x&U=&QZup@ff}DdIJI#)ucBnmFDwxHj7`#K|xZ_%iNp$!_f$*YQ}Y +z(`*fYC-H@z)DtJO;%9Cq4WfJ{O(k3wC?;x#|q6pZflsBjYJbNE(zh}BP!iP?WGV>=I>P6 +zSJ~;d3*)jQ8g-XD+I}SroqjSqVZP$KX1U6vP`&bAqI7n4{CBAnJ*4IOW)57EvNLRg +zK}tRSlHoNSH6*mr4dmcN6F#ZN+$Y5smAd*KvrrM9>;mu5U&PG4T9akyz`|#@bL09@~ +z+YC+i`HPSRCfatY_(`_#d#At8Lb)3=F9{dPM?!i8a#Zx@$c~cbyN7HI-)0GSvM3GI +z)V;E2i=!$~=YJ3yq_+M)ervagSRuo7QDex2FdA&fG=wC(E7Ec6Q~H}2eP!z-)k8Yi;a7xZ?Ggbb-F +z?S1kP<3ETQ@?RTEU*L9rD@OHDm}uG>sz}y#8JD;>$VXHfyqyWVdpV#7*c$$kCG3={ +z>cu}-Rn(uV%090BgURAH6DLRh51Dt5z`FTPmSgS|I#Sqe7(y^fR0*5=&_AY#JkUVC +z-iN%9!oMpase3|YANpJhy_Jl@Uislq`K{>-d@6;tIPxp&L!U?y-Bjc!!vGkD|7K>w@0kI7eqUksJxy?2H!QaGHV?p%5cGOT~py3f#$>TEmvnhgtbRQ!5uhvznvUaKfm8DXms&|Y}3SFEM +z*|UJU5r2IFAtwDWOsz!@cY6SZC6T>Z*jxiPiq?>AYAt)mj+XRgb#o1lwuVkhpG9<_ +z^y*$d3CQWP*fmb;=}A>k0kr1+0dTC?ZIjt053-2Ydazr$-V=12`-<>Um3FE0>;j43 +zgp|?ZZL-}ZeVD%^N5Xys)9Y14V!L{Rr=`T7T#$W)L^LK7mW@fHrM)fR*(0R^tjuxJ +zXxjdU3GN{MvcS-2sokopZ`Pftp(sfij0--+)TrKjO33788+nr_6Sf^l9nhdcS_GJSe~RmAAW19S1t!RAWLk<#nNFmY~k=pA`wpDH~rmwxu%k71wyqeVegg@3hKZlC(RhT7W$RCN~ +zYzpU*)c!pZdBmT{GvzjWQ*JXPA1noN>QiEjQ=h_9OOzM=73v*p-jg;ecB(95^K;}T +z_3tepbyu89k(#4p?fg@MmlKtZbZSq?+oOf)^BvuRilry_&PU?MwoGY${0MUgzmrTj +zyU2vIXFf&*nQ#uw-$|UjMWuv@b@sj^X +z&LPypf1-|&sVfNe(?3$_(Gt~3-b9}vAwT?MNOpvrjzrz{M=C!|P6xe)#NPHNI{k-y +zgm>ou)tpQZk-|ClWMU;6Ppl%1H`CF0kCTt6l!q_~P-nucf0+(k()FDq3Jdz$^<}B; +z__aM(ADIu4E~uwhqI+TfpCme@k8RE~JttM9Tb_P;eoznPE3WJzNrNVh@{*ngWpD&tUTAchB^SRW&U+8HVD8+g8zBu#emzMuk9CYG9^k}S29~szzQXdqb?GZdk +z=i{D9cAov8n19f%Z}yK$QLuV>EWt0PvOc?eLq{aDN_(=BOp9#^)T9&0w#1P(>d=10OcsHv9g#WJt*Qvh#c7)E6L);IYY(FJ{I+>zqIcpLu`WzI^#KIWC({;u?}8 +zmuAKoJJ?WlA>5!KT$B2!=yLq0p%Acad&wB02i*vS5Q|0>ND +zQyh8n(=Y>M3Rxu2WB*5a@>6;ms7xX8|0YlLzp14EP3xih1=}(rZ)SkIgtMqNrK~%JSs{fsNn|2M9-W}Nt&INwW=OxIvQla98fT@Fmp+|Z);zcPS~8qN4X%Rs&D6lq#TnV=3^+`L +zFGKTeWz#T4JKiOI;DIi@RQjc%46i)R46cWB>Epr7W@U^)anOzETy}EoK3h|eq6KL@ +zuFp=-5S~wECKocZvq|hPG$i)-J|y-e-({*KlE6Y=^XBP}cA+&r5g&!1$lj!KDOJHF +zdE1p;k%668LB4EXvOF2{Eu75~<(R7G4@_#@q6 +zBYv%=Z(6Xyds=Vuce>kJ>CbXb-(F(zZg+2qrR3F(wumFBuYf0*_DJHbZUne3L*|FEgw?uFPYTlwZb=$|(A8+LnI^vW0`c~0R?N3Y!T +zSG`iBpRF#welMr$aF71@80+C~eN7+}J*3hrqY=i;)B`OrW-c;to*C`1XMWpQd#zq? +z8(Ic?=3~QxUrK`Gy`dwS@iUm{K}_zVDujK{(~5wbsoKN!`VGD<2zbRWcohN$KZhSu +zhYcPXrw3yU@#nhjTgR7r;_UiuC?&q`Mi52D>43S|wECcve%p<4OZgSwDp?nzFmhf- +zxJ*S#uKellBF&E3xMPNSLON6aJ^jM9MCyC7g~Y%x-^{^B)Qs2L$d=fR*svq{Fa8+m +z$Mg&L5-A)1r9Dy&XZd3!`tv_VI+}jrH$-Ba?UD9zFuS@xC-EqWw9kpX=JX4}bE)6N +zW8KtXQY0!c+H!KWqM55Falduql0N*$xbLT5@Izes2rMK>Tpz^!ZMEW8uI>J~$j-HN +zSGvJysh7+*tU6-uB$~+FXKb|3edEa77dIrtV1NP)w^dYzFfvtcCR3%bHIX_mF7Q(H +zljcfD6&&8DHq#f0YvDhJ-IYk)qci`vur-c!@3CqBTUeQgGl^6OKhF!3H8l{7P#%Fv +zmRDB8Bw1qR{Qa!R$)7+JcJBWe1*^&1wyBz?dg+`W``rz~D`~y+{Qe|5mMn{8P6wr| +zkMdEH_=H_}CA2|Xsu}OUMZ +z?AUxGY8ds56FUN7r>?ut$z~%uY@Bg~t2X8T1$INcHwV*Uf>n8&TuV +z9}>LM$xiiMyY_I7tUdH%CrOoTAIq-kK|a)z^y}RY^N|0G^nXutPG8neQqQwt&guV> +zM*WTQr7P}BpZh7z?C*E~!Kyd{y@Ht@!z50p+{oiBIkI;-^0`7qJ$@?5u!E(3p@PVn +zv}`XWj`AXi;#+aw8A@IbDOsn5oA0x$X&Na}{p_~w=tuwCxkim!e7{7@;9e2?RvTh< +z=XaBpriSDH*?l@yYO%~q4VmO4Dq{cyyH&jnM{nr9kaS;*)urJO$m!sXbUaxn@NtwX +z*l#Y1=>G_l_ym)a!>o9=3|B?AdsH35-4##kp&RR^ +zu)YufO#y +z=5r5b2-D#&EKba7gqdp14xDGJNo!NWg0w6vP_U)UN}%0V6Vz**VXJ2U4Rf=<`Uc3tS(*62cm++m_qt!R++A5yJ&;z1h0IL23!TB +zOR)zqzUy#di89R*sXl^pf5X%` +z_|-&Y8cG-^x_u!uf$!0faR|PJhZ9NZ_-+Y74l2NW%})NF1WT+-jPrLTgwT>mZIBq} +z@5nL0y2LntTZX~9#5jLTf_oX~Z_03^4i$zhH?TJ(gj|+~IgL|$c>K5a&^Wcn6;e?Y +zj{F_%aW9_k0Peo_xJ&{$wa3pSfOC6X0z!BTg>tmVPb7v@d;CaXr}hv5JGaLVfF12| +zK9xy)oXJUNRupjGrRsCs$-o;f4ZNSxuWsny^n{gw{{YE~O(nDt)}8A)O^l||pQJ{iTQzFjHC72lj#d%RX<#J^%x4Kyv)rM+ +z)8LvOVr|7TD7VbFn(|A)kfxz(-lwMUXUT&LQr^_($a^$@Mg#8*@_a)2*}qV(*-Xwn +zW(CW=o2qw}%C*;>OehPba(PMR>QBlgywzK(H{$8Djz*UYMW2!2-fl+!TY{ZR^o@iN +z9&r?i{#r(?ca(?zN{-T79PzY-=q-(SN`@PCa$&?TC784k_WRSixu@fW?i9?j_QODz +zRD9bHln_SJKR(>ua65(QEDPeDb(VRle|-iOG<;39Wb4p;2va&0sCb{FZ`+z&k)hy` +zOa;j*9~y6C$o3I9BTP!I0k78mzJ4a!gT3%Uz4UW$7(RotiHrlm^8_n>~F +z;lcsnN7?ehf({G?m@2QLNLg +zD|Xse!STS@#Q +z)Zslrp`XMkE8ykMpu61QRCL0B5p%m*jdbgm8EO}l8H%@yKo~8x8y$12-o6@P>!8$^aoNg +z%H?9Tf>|#bS5~DXBU0Cq&yc=hocpdJBorTEbN?le?^1LK7&^Ty9~*|HD6(&)ghYhi +zZ_SSQ)B(I_JZQ^m#$V42@!tahuG;&kv)(|nT2 +z;r}U7aF73>>T$Q%zrkZbpXm4pyI;`c)hNp+D*j!rWX1&(ySE@>*U+EXHTW^ReS-q` +z_@l!gbmfoQB*{`usb(k7+omiZsn{_7m`)$ANghYW%P|}GT8e$VyrSVMQ-l?9(s)@* +z#*4-=UN)qNYc$;Y6vuce*Kn@@AmhcI2Cyat<7K0Udl`Q*KGtde1u;sAv2flNXw0j+ +zK1Mz7U*0oy+g0p2TWoZoao9h9ALF(XX9F7cJA_zSg_nrM&un3d6>nf?-3*VzGVLsAv$5K$m(c7I&-VmIG& +zX{)cLHN;j?Xd8l6Kx=c;UJ59c#I}lvCTXjvp+dU2RQe!o1Z<@k+p4(acjgArzVGLK +zzn|Y9;>|2)&YU@O=FFKhXQahX1IFBWJZzfFhNcbu2H+3DOwc57cX;LTD=V(ehaQYt +z1pfVpgls$NL;S4wuFi)(zyoh^_Iw6Pt*?OBjNz>K(_wj581Fmg{b1QW@kOr#@dfjt +zFdm)KR^6B5euW!rd^DGjhwsad3WxCi8Txu^C;WR_)zH_ufJF2=cW%w!JylFZA{ZEb~aL^^~IVFjCi#Y+~0# +zfgyjK|9zW|XoTm*c=ji*)$v#p(^wyb^NrI$QHJJTx?|H1HHVKk?hD#{V`$xkymPl< +zkk8*{&SjXXWkU-N+y$V~x9)MJPp*J{^ZK&?uy2|j84&Vig%mdVe=%_WG_+QrHHvM$ +zjrNwL<2JerkiN{^vkdM69L@N6_@=}E;x2&ghh-g~WZ;3M^){M3+&Y9{yFbEVN%OH~ +z`7=4y)$m}sDm5|ef+#9HA}V@()DvM*&xb_48U((N;j*Y|f6!{exob$~%$&pZCMi6> +zFwEB7OLM?ReBr`n5VbzTu%{O54NzG>f;Xh#X)B<`$pDha86sgK3(35}@JGu! +zrsvdu2pHLo-V@c6F8t&Q#7^uPdv#h)@${U*Yw$YjwoNI26Tv%-TRwt|KS%c3h@1-t +zz_yH#Za&rQ^Bb{+Ybqgbq!n%qtH7a@dzTLose(DdA}<!@%VYBAOQqb70PF+XM)d^KJ{%({4>sy)^o;s2jKer5Tf~OpG#uERnJo0a_5_7q+ +z-UdH*&b3w2n(*Ku`G4qJ3bp1blrc+MIMMYuyaGi%WwnK`kU%YxcO?yMoZs~h|Q +zp-7vEUg&kKbL4PSA9I(z*T&iD@CoG4x68KsPJkgY&rcBa4y~h9ZVpgLl_`XqbWGAR +zh5pmEQSZQ&D7dmY0N3c&D~itRxma#Rz1sCbtGQc_S%vTTWI~u`A*!7~z6}>Xi$gOY +zbWMJe0*@LCza|a;N}dA0f`)%>o^@YIRF{4mU=?GUy6kTX71yJlIIT^Hur1Z<1>{!e6weWH$jIR +zwT#m}CXeW8oDL_uU(_i_@?gYwB6(1G8=uWQod+P1qeTJwNO&yDM>9_MEam1k`_66K +zV|nJAd2oa_e`HRNT+RWvrT;iW8`2?vHDAda7Q*Hm8Se1mc@4NtH}{O>fj`Lj5!@he +zp1JE@UMW3xB#&5?qrQN!jGL^LDYq;a=Z*Fvk;rLGK;JdrI3PhF^Dmq2{Fby +zwD6kiy}05Xs2vI%tLlQ4YGFyRfx!UZ@)}fyG3NQAg6W>?aEnLi5UUDRpor7K5S&`G +z8x>5T+lSlQo=0uZOEHMn8qbP(*h)hV4#F5N2!ht&h8QVe@^RntlD~LwUmi}TfA!)5 +zO;`>@&w*S}C4TXeecp?g*?w<|LA?HXc-v&cz)FM6@A*IE@yjaC7C9#j6uID^XQ)lk +zY2Z5GV$fdy^hQX@YhKdrExW*t%wl}5`*&___Q7@>qm{936BCC9SXV?$i7X&GIxNdnB +zI}KynmX;@?B9_SNqB00|0qF@|s3_zi00-Y@EgItZ`;v2c}p?j_v{(2(cG5UgCEC*5RVjqSy*Ye_ytEh;RD`JNt +zzH98Lh=qL=axBY>i~If?l +zxI)^|T-fP=L+&X_`H>6&3@;u`mo*NBr_!4C{~M$fN`8(LOg{dK%|v&|-N#2@tN)Fv +zuHF9u_hvz{J}=lf@@B#QjrYlxd-xf0r_1oCSo=K~yAg~RH^faYZs2RY1tnfV^3mKZDzi+kRv0Iv04rQDBGZa$ +z4jt5>k2cR_a5N@A8>TTwUgo)6y6N8BQ&Xsoq8(Y2cPV0p`ME&@%h7w!gIDC?a%PNY#|L+w5hc!hU?69mU6$%vxd&NE2Nob-ZtgI+A;3e8O(GT59c*zIh +zzUCiXy@yBYb@}RXt^F@RAQ&@a5DaDH<Ioov920l_@D!r4kMcn4P}1ka%LqT(WkE +zBtx_#aw8zz3e8BENg%=410%cv<1fxdJjZ@8ltw|EKF&8(6AYV1?hbS~JsREvgG;j^ +z7~@SJ3bwpk!rV^hmaG8xE(vop9W{*yknru7YiO46&A*xjQrl`%i_ +zqfKlOhCjguV~i&UaDudwG236vz&c6YLf)(FfzW +zFOA-OUz$CKGfRDMI;JCvhjizJLG$DD+6 +z;@H~!eh^TXwswDz+u-JYdJe$!sUkyTo9g37Y6KqCP0HcqLH#AVM6 +zB_iIOoMV1+DUkW;dudMtlrRxQk|?^4hp!TQrfR%k26`B||IS!)u6}g}c6P&{ZOwE!Y2ZwO%GPAlrwktO%PXs$eMv`ORnhw!W +zGbNj^dl@mzDCixTDG~qfW%z*IYJ3TqA=y0OJKN_oceA+z4EIt_F$R3$wd=uba9|j( +zO09q=-WBLwcye_OJTkcv8Mjs6SHyPeof9zkVoA{;7N!EvgFeOx7$~{WBBzUfQ~bRG +zIg$8a_53HSDF_yWagezF;bmB7qXnKnp0TD8@Qht=bdJSXmBcxgXFi!-%j3?1-dVyf7-{4rV|2t?eJGoYt|*@7Q2wuN +zH2s%0=s8>)mf<#DUP90Qf3^WM7Ev|XYkp0KO^aNWR)L9pWRC5Ws=njM`#!dE#`LpO +zrkM*f7&t`3jjYiP=2mIZZRF-5$9`a}ow4nJK15`(LL_DkD{3n0SL~_aB9?NxNYrRN +zN-2T3lu8 +z;UTHbA9xvT8_x=!C@k24eH=A?Wz00@)$Dly2VQ`WmM|NDe?W?Mirv#B%q!Wj^e&M2 +zsv@LJ@}!vD_3s@!4oB87Z-(a%;F6z>WH=o)GCzy_x9BD?E3?h-EWsfNvwO0HS)Oe! +zg&(lwPUcV^*`q=I$Fe!jrj^5UluP6KM~uK^dEgcXLc<>qFix#tG}($DHqnzH8~TpK +z0~40PM&2h&n8n#<>td)9;Es?mi?Yov+z%3dEX?*9xoJ6q4)vJ@+2+q68}`SY0{3_c +z+_#^bZ8k#+Ii8d6aMU&zdN^*l{KMJiI>==sBoHC>s4pS`zyZ8tfoza5W(04r8!R!` +zYlhcTcw!@DB#&}v?hE!)ba0Ujd_YPf{R6Jx`tl%0e_sxL)BoOjhw#MBwfDf@B0XG1=mTUh_hq>MxUW5sxlHv)-$;?f +zEMCm)%!1Pn)K~JF|9q)=JN!J1eww|h02PZ2hVaTmeK8NF;&?1<-^)gTu$TQ~+y5~C +zp30OA!=d|zaRI*Gl*O&BWbbg=Ol=m>Or4rGHN>aYPlGE9fH#!=R~FK=Y4->XAnoNW +zi}5ZVLH;~kAJW$NV7guRrM>7Y$9CVB_G}g~1-_f^x-Tt%2%mosr@`hJd~d?tx4k>! +z;IN6TgcA+=hIhvophUw#GaQ88^ol`-NXZ*e49>O6d#!5Y0I~ +z3&|b!yg$^s23BikF_(b9&7Sjz*GGM0$|Pr@Sq{SNtUr?k)nPfEH-rA(zdRue_uo1) +z510j6=AV!hx!_MrAb|D=PsqWFv48&-6Ij!0JaG5^pmYrLP?q_jETc(xxSm}TK*VP$ +zqV?cG`px2@G2_U`{4Iqxo9sN8i8`{iHC +zc{JuE1g~YJoC=le*O2zVl;ik`O+|Bo;%}&LSFis77_+A?Rr0Yu)*np|aF8w{?$x>&_}>uLz&2v7EDQ8Yd+9005j*6kmq%|(X+u@51s6}O@a +zOa}0gwW7-R6OC&(PklfGKOwRkSTDHrA=^ZIL2%dF;JocZ^*#-;PqR1~4vwPNgX@9v +zi$`X~jnVNj17E1L-_ZI@(#Vm)(x?35vA8c(CO&5I<#8cp>-^HzL*9e|^)3yu%Li%m +zuP6>bK1Lml`WiQRXOYftxkwQobexA3Rf0KZ*sOsp06y8tXWrJJIY*ng;Xpiz-#Ta* +z4NAnO0A>rgSU|9Kqd(F&knV%>|4az+IXx6>;Kg>6(Y?o)J#6=7ieR719^evDd1iwK +zqLN!ieiyZF(T!qW(x62h)Dt+HL%^Xnl>Iz`I{*RpT%|#a2wCN;#^EJKnoaW4{IEEo +zWxsU|t+}Wy@+6C~q8fDE8qRrN$L^yc59$6Mt< +zS@*$RGna!37mj_%%CTMGDjvJ<kF&zNlo&rcgM^xs?eW>=YcXpI7RB)i?gYT+lWe;qgUVcS0%L>=`bF +zzs7DDDRm!hQ-B5u!Zm%Fmi^fO$O|t+#t04W;{|S;>|=(t_s|^adnUkj3h`fyo>}uv +z=EZ~}&t}98_^*h~CSdP#Bllg=GsBSQm=JNL7|H19#V&)wH;R5xn0IBH~y +ze3Hp+Ukit($S~|tjCTo|((wKY?W^vaTg-=<<{wkYSBK>;4hxKA$Ez6e{!&G>bHV_( +zLP8sCiGOibCQ+3Mn!Zm?Fksq(Cs_vZI-)6<>0KHj)0Oje8nOEZ?zD}oqnb3Xa%ri# +zR_4+Kwgw!MpPNAU;B`z>xxIX}#WvNh39FSIl9PYHWl*{muQ?2dKCTXuB@cz>w=iMf~bX-$!IK%eSTNRR>>mRV8CFgUFqJw7TSJZh~x +z$`BEylQ85GmUo%k8D+ulXf*s&!oN89m*A^MVUL(_>1^I37Iw?s+R^kaZ{_Hv(x_>n +zQK@0NlQ+X|1ei|#8MYW=Z!K}(?!#s1a)jKm9Q@Yj-W2n|rb#E?+`v<;H*Q!4L6ZE~ +z!@nr%jkVG6c-<=LV+D{TVw;AN{(yVBjxQR-Eq)M%K}0XPxfyyk^o#ua%|pC4abeoS +zkF8w<5tzW8;PYQzm%`060sGl6tE7sL0VtfCr3ODfvyM=FZmf-Q4*;nj6P|0TBgdZF30uknJc6jla4;m{L}1iscMbKM`w@LNlzu@5x|0iy3ZbralE$b!Es6w6=!~j%>M5d+Mzz4j1Qo +z5|_i}BUcZ6%%7GpC=6n&AoK?I7Nadxz|Vr58=NzN#XevN9mM1+jAh^rJjgNl97F&f +zGTbvCWVol?*C)xZFPp(m<*eVvG=9Dm|@-pX>{0qY0qYucR(6B=DxHQ8Rl|GbB7G4aeePx><+uH +zpU}pW8Qe-j2M?Ds$0PhS8Fc79{LIs#3(S%XGUQ$wXERC3a0lN9Pt`BbaHNZ)-%{v* +z2bvgY&{YxLbhJ*Dk5UTgO)3>iNuZG@!mtiEC&Nr5eEmo8px`I-aE4oUuT2wQsN;)p +zi6H?qB=8Ig0#Is=;8P%66k`HCSeF1=u3DEMqQ}5(H=wIKy=$q|UEUQIEiB9lXCgBY +zQ;;Hmbfo#TlnG0rg|O8XOR>VFa3&%Hoea?ee{`S-xua58KIDSr14ED&kDsB1Bua*AFzV!pR}@s=mTGsm$tRb4oIPgud&C;lyopI~gL +zh@D@N`E-R99&4u1Xwa4yfj#7IXb!3 +zUGt^xH@m`K6%{6q!bMJiC~PkjwtpuCy$lx@X3G-zm?}@GS|~&a!!z_yMT}q(A`RW|SD1+70tA=eepa0J~qk+%wmg8u&HoCtL&WA +z+MVCtk>4{zbW+;O?}IH#T60?c_b*~M_?h0=oBTB8%IdS38sgFzBUhzCa7ajBzmEJe +z3lpzeh#)%=>?B6Jh>#n_wdHj@lW}(?Qx#ld-b&D4_+lwj7#0nsnjT-_9Owhn1h_ +z{&Q4|^inwg_=DJ`Fn)482ADL64$Msxe9(-%GFP{z1GPx1D5hcQ+a~r^Z+{( +zH)#^shx_awDo%vYaWcQRU$BPVk+>Lr*JW$iM5%{S4Gdbt{^qY^rfauZ!z%p@#=)K8 +z>nz6BgW;=)ndvxeHPVmsFd{Y`p7xGS2e|YcScus=*VBNHFya*bVqc3$6`yUlZQSM1 +z#z%sC*k-^W$#VJ@JsDprH5y-H^{xiK#STtt_G&Dqe%3yrTzRnCGw)OjA2bpcMi`mG +ziSYD@GV}QK8Kr9 +zU#U#Qdl+A3G@2olcUU-b5T4t{BgbEkBMh~?;=K#YUtMS{vFgFyuf(a1Pu%g7zlGRt +zCn^paq>dsJQEnmhtO=iY0s10fD}V3g+5WN6`jf6TpsRPCyN}UV|zF*NMT~H=*#d_xp$PoklGl=vG|T5!($!#TG-5 +z<2)l-$Y%C&O>cKs<0fK&9_sdEmSa2rLi&JLWQihn*Dx7?)^UeX}`-2 +zJllf{%?~c@mEH(1t?&A`^@3xt|8n!k2d*^mTtu*r2=Nf3okUQhH@mSj(OQyi?N7A! +ze%Sc$58HpRmUgy(OLQHvmNqwjO0=K0UT7`}uaq{HSWi{y-%HfKm8g9)TfaTKO1c$b +ze|(_(9@Xfe%d$eb5)cEF@^<`*=CiOtjK{R`lvJ_%PT!@U(__EYueIIAN699;I{2=y +zZ!0NnkkVKiSQ8ony##$*pxccZVm4Y%-`4BR`Vw7?V_W^%-F=*6)l}dgF=7_8b9R=OcRbVmk+T#3e{bwsYcmQDE)n%6V +zU*9{XW;8rIpu)B=TOL>>lX) +zG&lmsWU3ZkCYosvy5E<CflX(~xuEKJe3m2T!?C;yI;2S)|taf8Q9_XTG +zqpS}Y{f$HqHA~#+wGa=(Q0(`OlUI@)pSw0$=(rujsTa1{=atnK;vtFjA!aEagc +zCYO01F6PbW;liQ-knv8T!6`6M<8+cD&=5@2c!T71@V_+K@=X*0?%FzPB32ctZMJGV +ztxhW3LdgfJf(_Iptu|jrDIiK@&f4z;@Fu0-8{~7nc+4tk)^`Gv=neYWUU`z8APjzQ +z=tOULh>6BaRwpsZLMWO9U7gl}yRbIIraT*v@|?&($Twq{fe5b>oR2&oe>3D}V%!(w +zPE?p)M>sZkOj_y%c&OsB9fOzC-jcs(pdxhC1Xtjh)>(E+IX_VD0A{aw5ihBkRqH2< +zw>t)p-}0WAA*=lS1;@@0h4OguZEx&RtA&b;dMm_4kx>gFj5xTpL%@D|$EeNz7^K;W +z2s<^|mux2{ySKxDOm-0y~7M=-0xiW=6Q7$;9M +z5hNh_LjB<7s3iXJb1)j?@g+K996rkAgbDJ7XHk)7(d+aEA-A{Y@e-)uEQmW!g(#`8 +z0wQdNpg~M-8U?S7%D`#Y-$0DU?}BQVK!nJzo$r`0mM6&_0}pJHSGj^!`fZ!=QP#to +znz~hko3>u{P(dDoz=fDMco6t3G~$6QA{2ZsP^gF8pqdo^@m*NhS5fPo{Np>}l|u;F +zxmn`*MyNYubomPm{(NnJu)bem@aMq?Ttk3w_|Wz%bY~i!z5<=W`cAGuCs&|Tq3sOT +zc0vKG-B-X7taoq)99#j1LhA_DI-o$i#aEy?Sl_IGmk*&8)CBjfZB~R0hRC*sjSDfH +zx)lZolMwCZZQKRXZXQ4vIl`AmRp-NviSQ?*q63*XQ|R-(l^yVAm0X;Jm8YiQlkI1^ +zEU+N}Y1JIu&Vh8|JUfmJeV-Wsr&)V|z!ks;bl|E9{B;HJz_jf9hR2#V&&0YvOIiJ` +zv8&VQoUuM1{&ouOZC%c`0f6k{Aa^w@TsRM!0LbtSAOBCV<;oN>IKb^mS-st8tTGy= +zZOMnf=Y_hHM#ITQkH5eKRQCphCocRoaU>b~mO#2fClOfB=zRM}_-m5z;QkHlCE*)3 +zUX6!z@Ir87i_ZGB?)cB%mVh?&LU2{bjjJvqsHEG3_5&f>y%k;OD=eT%P-6y;R5aNx +zE^QNPFGOm8iA1(Ccl#(jJmP`lAsD+~R;O;#)Y{1XGO#u_t*N6dwxC*>&(KH;2kMHO +z%1y)=h&{Pq)+Th>6b9Q=Fg}_Qm>ZJH@m0Y$dFKLqCz56!0x4gg7N1-IuWhDu|dTl;7PKB*ww$8-Yt&UH`{lu_sl;YR*>l5o{qJ}{I +z{6oTh_<=`wTyp8!`BwtFuNTlzyZ?lR_=Q55 +zGLQcUx2MNNhHq8##_2yG3@69wOA^Z$q-k@r+usVVUQ}9V%xyFYv9il80_;?zQ^;$8 +z5c-ksWusz}mTh+$V{ZIl1_It@W`1$*ngTQr9~{sq7-B- +zim(HlZ)AZ9Y!HFh#=PsW5Po)f$@9hxj#gU=HK~UHte%(Er +zD-B!Pe7jSScBItdl)Z6YDu-<=JUx_P%U^5D#3gtlEJLtPPXga89Wl{B5uBQnh{x0l +z;f+{0d5xL(JT2}uW?6T96?|z7fAbQI$x6Wa=06wHego*{z^9uxVEjxMWHQ!D +zl^^yhVw{S49g7V_KT$I#%*Y03)?4X?g7T|s*u1Y^J+pczvPwvBzXW39%sw^lzsg@< +zk`22SXho$r`#mRy+c{!-+)wCXD%jyfn24ZQ0C?-SLsw1IgxI}0_uy}>-7}=I`*if+ +zZ|6EzNn;yy?9JbLZA+!GpXkV&zkz6v@DLO5rOWp7@Tc)dmzj810`M8jYIvQ2%Rb_@ +z1^~2L*|1oeKrO6**j46wEF`3Pv-8vgYw+?Df&{N&bUGgBd`t_cB8zW +zz7|+OOkGRN!1*nHfF}f=Lg;eUW%Q4}dc$O}*c5hKke!OLAOdiGZ^h})01Z3zJEj$9 +zk4g{~Z~%b_aL$iy=Wv8i5&NAaEjMjFFv2haoJ5QZ2*Bxi)14dv48#{0CLT+ +z?~*I^?PkAKqF$NY@%%s1nhO)aj2~wlOfa^Zj7AR;UGP1x;JDW4wdOxdSPPwDzXj@u +zXjO?d?6E)t5gl6vVdDZ!M6`v`9}Euwd&JprKP5H!eZE+L89r&5x5q`11}X|4ANDUv +zO;{vW6HJd4m}jf)1Zg0mjQe!9H`K;@P+K`i)&~tLsN?5AgDm8w4H$ +zA1!!EFdp7h%WIHT@_OocGo)=|=XY9@@mLF=tp-+B5|hE$Hrhl?Gv7@GWQ?r!;}|eF +zxh`nI0B88*lz4hD`eT>^SMSUQ3ssHOSGR1+11zsSsA$TonfuS)yjMZpD@+=|1N*vfbeDNyC7BEH +zt$32+$q8FKVB>4}u(zs%lt^Ef!eVUsP;oFk1V06Ds4scZdP>*ZJ#aC&tF7W>M{9@b +zn_yf9R)Y2mgp(R=b?8rCg|)k^rS>YF+>2EF5P(+O!7l985uoD*Z`m(}ISVKi1s(^R +z9r}c4%K`H^_)G@XNQl(Feay#xPw9{mA#|$X!nbfx@9Y$$by@=62#fQp8U0vP^XOjD +z_wVq!2J)xu_meflEilW{H;QgsPsPH!naN^oUSQ8Iyt3Ovgy7@!H!3_-$Z#QdT@M~H +zO_Ua&mJ8N|BwuTJmu}>({QdYSY~Jk?asaIu$gi0==K3do^8Wx04~NeS98T=nW$x{^ +zLlYB#7|k +zwjxCw>J@*7YU#!)bsCI)tQ*$cuOv#R*lyGscs#I-##VtQW<;+NAJSW^*5OO^C3<7& +zCc{UViNTC}m+MQG!v?D016{!$W^aawjFMy#qnuCPC-bNK)Abk}ffnLHT +zuvQKdB#`p}5;@)n=>>8rg7g}hiy*xQxltS>_@cL>imwe-gakH)OCXPMkWh(P0ErFt +zL3)i{bPLRPxp|^1Xe^5Zl$4#hyohsITiYR6dm@uuEjCe=Fg_puofOLI)-+Kj=D`S= +zp&U18f*?2(jyExNW~g8)4>f7VF{6{oRbq3MdOkd6$c##+Ulg0KsBnjgDvP7a8EG>4 +zg4i61a(`v~lIiEg=H3N(*-~j7)y%XlqMsAbmnKl3vETNv4YE1)?wiuOj;3ytaRq%- +z>a@+XP(gK9Ew%@Tm1{cvHxm_Np+?)wCtGYw?3$_Q93KKLaj9WXJ>e{$?$k`B|A2(C +z7HXW+wxl({VteY`1g_lT-z=~bFMkl(s;yFsZS_*A-S(2n_9A)4i_1(Wf)Xgb)3yP} +zPX?TvU^gk)cLfo1?Z%RVv;2bNu?=GO9YN78_?>W8knp9oLCC%>aJNX{H43Z5LzJ1Q +zy*fgUj}Chl#{sQ{8r^6 +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 +zDU4bF@q6w9A_c*=gL~w +znI(C}v=cK?Nf5Kfq}c#YUX~qLoAgw(iAX}qE|rK~U@WJvS}2vaAri{5`I03QJr}eC +zSM#rbk_Dx}dP4tQ(!FIaE_-oz@mq797qlNweZIXtzv!lcdQ?0fD;y8{>;mJ53KO-U +zO<*F_79xRt-VYW@C87cz0+@owhMW%%F&!t-F=0Rz|GdafB)W(s*D?$UmREJlSI_mk#H!otV6bAJsx9EyiTya~Zt_mzju>4=@v +z{bhnq`4e|a2@jzKwZjFA5{0hdC-)eB1CRZ6kn9~a8J+A~mlCL1_!19KY~cxA#=B0Q +z2p6pd9un(pnFgo06!y{c4AflkvMit$tfl5;QS-nBy|ufe)AQ7X0n< +z23bMdREw=`3Vc*-+a|kOz5!tnDLf@ +zC-(3pI^(-qZ%|`ZkU=dT7+B#^OWbE}1G?RVWanTD^o_e{P{K-Jacs5cUA%QJA@6Nq +zmwEKL?_mg@vaEscA?9}fP38J$IT>-yt;NG$g%eJY<{I|LK|Akz;0UW- +z2>wd~;%lbpQo@X#r%0wdmWQI8~piX(^+iuZYOVFa+lBXDUz0DE#f?>ik&XyART +z)rIOm4Yk@JfSDQ@F^*L1tQ>u?dX$TpUa0%6izjmOgk9aj +zcBpF)ZU0^k{y(6>tBzLW&BGf9t$F{Jagl6rNf`K(@^l2q8f2zl!2TStR0`vh7cOkH +zgo3Z{1HEPIEVdwbr@t5$Mq3cw>2D!s8;Cg&cN7%Uox85tdGMOUwZ#b$?)YZ+#iP8W4t@i8KiIBWOWIqFr%8Gll* +zpKRQ<2`FH_84Lt;*;Z?{IfMOHOQ?s}0jL>&2nP1FI)a_XGnhB><^$~|K^{b`b}O)~ +zT4?8eqvJWjr|JBo;D>!O5d25CPP7~E=y=~*A>N}_2!5n!o1+$8ynsv5iE=0%(Ob41 +zPOc)#*mi$F0)67{GyeE^J2Br$Jc6vo^UqG_;bF-id2xyO!yz5rv3BNlHE~0o%)`*f +zbv0~FUXr394(_$m-O>2?vXh`s^XPVPUuofyUkAWOO(KQ}7cf6HSJaC{gmFPl=veED +z;OFTQa?wL&Q_Fsio}Ben5JV*1jA2CO0;qsAJ1Ea|t8v-9CGH=1zTZ@*`Z2NfvkV +z;2|C^ayR0uq-%N~ZQyV4BOk(ktvB(py5hp{sX9InqG3F^bqzh>ty~lKxGXGMX0|-q +zSfw*ot*b4r3Po~RYDxeealGXyjEaU$7Zt{n%=>Eg8EIHJ +zTyHxr!|;hNwG`sjUj5+FfkC@RE!)em(HI^w8+5`3|K +zPQ~%-UUI;jSAAzMgU49ZQg#Z4$3rk>qD);9HA1*NXOjSU>N +zQ)8;+))IKC68iD8*UrOax5NHDR_C}IwqYzT+1*#!tzM$88J|=;xizWm)v~7$lXl@) +z!k0m_wqF*@u<|5zN20n?(h^WJKGfP5e7W<6yd>tt2mHKN(D;JR?)nYKM{1d1^SsY; +z7VLYsSqtykhwR3?E?a~%*ng48nU1xeQ#;dn++RNTS76~qsEi;|QFKq3orlIi`25C3 +z;eapfh0Uans9a;v_ybt>%|TK-$V^nbAC=;=mD`2*MB~wlBXgg%G2_+XK!r~lNQzAr +zxvK&IAcSx+@Dv91gvQSiWQ$R2G_HUTfLF3cx9kmgw>qpI1g(-R9`x9zyMlvV8CX}Z +z+LgiM{_?rMfZcQ_Z-!H?Xtcqjnt<2Ihg!)dvJqrsTSeLKrZLPd6*TSE2f%3;JeCkn +z9`jxuRNa{5co)X|LtbqMx%T_wKUF1Db*;Da&h@}LBV)tS6HDX8jJGu{*^Jg`m>%wv +zUiBr_d~ok)|0bO^C#39)=y1r$0QirV<~)2SP#lp^=# +z9_RLrus`xES~3S~j)Yx2GPWgMojnt-aiyyBK&6Ds|5W8H&5}pK`ERFCo|JhZDF1TM +zKz}g!+h2$;{Jn<^axYSQzTtV!Xa{Z(G2Q_WF<9@$-QXoS%KgYplW~x}>%O?Wfkzh( +z8hHNtE$Xt$qEh`wlhNsK%Il?ZF&ejVaNnucgkQ^`zfYnS{ZDD0G=Tm4paX64b_yaS) +z%(Cs9Wl;WPenSOe_Cd#hyVHh(pDa@%9UD4yDhOON14wbu}yu{FlDm! +zbdaiXG6bFJas)x>VWw!73b?sS0afiQBTf6?g)Gzljqum7ax$lzY;!+_jAeO)WY!>H +zQ4I@(N%^z!$Yh{9*ue+tgOfi50Rrw-zaR^Y0j`+C-U1_wFNV#DC);|$F2s?EmyM68 +zxeJaGrm1M9sGRS=_Hzzq^S
lLR2~1-E8{P^@{;qv(B&Vyl#`|{P1DdF +z;4~fo)yr8%4BLD2MlLW9oi@HgTQjBrGno|D@|5Sa723J$2z`mrTC-oNv0mseY}{L}Gp*O)lym*dn#i-R +zqeJUk{Ojvpu5Z!RPBYXTO|G40xc4CSm}xGj7|QPA4j13^8GEP{$|+a!I+i$ +z2lyQRUdPA%iWYYI_sRE%^fYKQSDVlG@0H^(sBW+ox0WmUn))wvc?&!1uGZJx$mXOa +z$4g_p)aB^%+G!dNf|md4_%DbKfs=pYPR6(9$}e=amXLZ&FfI$=fehSNZjePJSr>?wiZi%NRdB;9u%0V5Vz)#gn>TLDz{OskTp*AmU#g-WjC`Y;ewVvQdZBP=LxdH}2a8Wdq>ZG1*qK-EIr$J`sMI~=X~ +z$8rC6(sk>jG}52_%4aD5{<_XwzV02Xt=cREkaA%tPCTDD`JUfpgRRJsc4^ +zI~8p0EbP$$G+=VC?a@&ZGk%;gwvzo+^GOco+>rx)&@uDnw?I{d`LGS{;#)*o6PD>J +zjH8F9Ma>OT7W)k`D=U<>=m;!uOV6*=vfEutl3iny*XrM~+d<=@URZ6C7N3`Ib-4~E +zKfU^ykq7kSEYnOj$D;gmhcViQCCQ7E*}uN7HqRM~a|6k5ocZ|?y7hLA6k&XC=-9%j +zoWt=sF+YJ31P{5T>Y02~YQ||}RZyw8X7~HU_wJbakL!kSCQL2U7Gg#QZr(ino&G_V +z(rJ3z#PR8YxU;x{don;a4cv1hpQ2a;IpF?xSEFAN?ByCc|syCI#dFe$z1siDER +z%74Oy8w4A+4Eyr3+i&?TjI +zDH(q6&3qUuLrKM0PTK>qETGC*5O56cM(RC|MVGni+p)9(q +z@6tvky6ec&&sSvD;aayY6>s^*BVJ1Eg`4UosU16FdGzCcw6BG0IRX=WA)9c9+=wU8t|ejejcdHi<9cYYcidn +zwCXKqGS*t;JBIkxuJLp?4EDTslqj|zq2O$r>SP`h9Jrkzb(^g3o5WBs6XHOYmR$MC +z-HccKpy0fEYO{RDglPl^gCmZI+%~PZ(nXr5rZy{G6bpw0M-q>{Wis`l*!feN(~^~& +zl!@ZuNFs;)lgZ>qGgFQKk>cT$;7B5e{DW!gj;ds~_bRxfFD<36(kkuIpr)t`LzNE@ +zB-JBmn=eRyAC_U2@6gMpH*v`bJe%@sW&D1kC?ox*ndJe^3((EVQ)cHy=cgE!r{rbi +z55>ZcsicJwln%=ir-I-D_6iSZ%;U$CVwzBBf&6VtwL#Ne(&e6Vz_!DY-Z41>uVV>= +zStd##l*2r!j$NBOg21{kv?&TqEx2y1GP|piuO7&{>dv~_l6Cd_ +zEV-PMKH@DQ{>fe+=I9rvOgN9l+cwTz3(J}2nw_}`Z{%V%EQSWG^nyp8cpf{PSs*!5 +zKqrvoAuT9?i2g}>?9_^L9ls@kCCf)(lBrx5wtIe>zDq16 +zMcy#%p+_#c@Udn@rTv`HpH_~{bIv6dCZ+N=5EBS|#8P2oAK#KbyComIB}ALfc&w{D +zmUL5-2c-+)eZTed`_?e>TXeJa%ncO=Yx)gKx)3r6TC4hG%ZN#J7(YO;`5$49{-pi; +zhBDI(3nGqK^6X?Y&69K*$7oDi;ea%Q=FZJ)w2Tlfk^f_;tv4Kv|NK@`&2ik@s;xOx +z^G*bkRtqfMOK(!@4ePEYr4G!F&XG?T#&4<_GzypD)%@$eAGg5&=|5?f;hgL0qAC+K +z-5>kiKW+~3f7)vz3w0!?jfB2E^QAux+V()?gs8~;sK`Z8%Re6% +zIRX!?FCDhko^DUFBTZz?tjP3RK6nwfifLi51~9m?sMgZxBFDYHH#$Mtp*O~t~7z@T)$rPHjOcnT|TwxV%Dn0k5u!*>iFNLk}J^Q7% +z%$Q&}kVg5+&lO1qTHt2n#uY+xqbiHi^rigf1=TP0J>Me}65^Cy{;**?c+mxe5PTTt +zs->_AE6hWVPntl#SD<73(Q#A`$l;Z*m4j!MH_(sDA3CMBuU{zzu&2I6{|=UoowU0J +z-@&$BEMG4D^CH%g$sKFWEV*Nxd5#Vi!Iqg}->b#1+H_%gnzqh-S6}MNg0`r1=&bOe +z^+{{aCwHu=0b*!Bn35f0mals*8(Q>r=4xH3YmqYls%e0xQ0FMpi6MilbdE7PF*^FF +z&Jk~Pr0c{9{hDybV|2{ZiL-iL&~+ZV<9M)-BS~<;ba)a#tZG`{OJn^*uN*vvc~i(g +zbk|xWIHGmynZ^;KGY!-@vWSzBzeBz3($DLaW?v!Yk#4L!bjP|=Ah7%$^NcW9Y^}3g&^aFTcO)4*QR@|Rp3V{D +z?}#&!{eu8AggK~D`FV|O+STN +zlVF_G=z$=ZmHG>DY_oq^aurN~3Il`(WW~hOU!wG~ntpo|ZJen?wl@{(o+z)enma3D +zMQ`V|+GBUEQ?Jz@>$YCT@`Zb{7p@6m>uY#o>Fp-dM_f({9Eejk`WHWoZTk17QamDI +zk>B|SFK+zv8{kTgi6)7%wH4f1FqVn0iHZVm@@5WtVJs_Y1sm62O!5=w8N_rgb`NuD +zuB|W}JcC)f$WQrI2c}U(2i9y0d$WlSV1x*Ttnd=A&mQOi!ynFLr8f{u#zD^tXp0Hl@J0jP>p?6jTMxicq}ht!{Py8 +zw}Max>&;Usf1^~yVE*7OL+*nzn4rcw)mQ=ZfEvlm*o!ijO1)5q62Mc*nm@`>St$}(E)~%^B9?#)j@e6pX2wt3P>lZ+*8lzJ_ +z)Z|480glv%(Pi`aES2Z@TVLyyUyC{2$5LwD-`kqgyA&Hgn>rU2D5)5WDa$EvaD@7Z|qy4$+iY&m3&H`jy8)CH7oi}c|sD>pgcM)oB=P^sAYuWLg8 +zjD5xnQI22taYW-CV%#ba^;h#jS3&t)hL)tQ9>rLIibaFs?xdJ?Ol+Ktk7RC)L_vJRdO4R8T0kpHA6 +zl4`*%rTLo<<2+=Yc9|{)L^@U+HZcd!d8dZuC(zLoddc7Nf$(`1dRPvz1}JXG|AZ>4)%sLW>4`3@IjHu;E$gm8At2+{9R!PG +zbdD+E;y|Mqs&hOUg#1RSi5g}R;-ooE=#GtD^-)&GG|@4Uj1?I1w(bzK^8;bOa<;v~ +zz`kk+0|-Pu3tVF@?Ueo}Ws_%|S$f3-Dm2aut9+ecHB@Wme`q>BxodsU-1*6E>t_M9 +zZY>S~FtIm$F!V2r5|ea}bPkKm`yQ~!za?0XUGt^-RSy<~5mZE$ltwSy%2Y}la7D@i +z97+zsQSF6;eFr$|j8Nz@3B9BSwUd1LPx>X8A<>TC-H!4vhE|*B7N#p7LaQm8U9sw6?`~*$*o>hHjzUabDTnpa+)tQiGMN8&I+EC>*)HiQ_&Xz=^a&SSStdWrZ?h9HFTKsaLQdFK!Xeu-={P +zb(+3QbyCoI;UeqRi3sl;AeiQ)G1PJ%X +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 +z1NRp9ilbWhSUk`9X6_KKPNQ=s$| +zOC1FNs1pYS83bs_PYJu^D@I5!fgU_qn&fl%LKJ^wBfL;-2Bisd +z9C9<8f%Vg?tRne^uvGh~6z6bpIL!wGC{f-_M?c7#rl%FC_l{_O;td?2kIqG}*LZQQ +zufd&!h)N7UFLzH{kE~be)y}sb6prrf-Hx9=URZ!jp8=PYll1dBVO2eqpyKZ>OnIrc +z6-#JME30mmKT-K+&ipG!5H7!mA7u~yyx+>lQ##lx^ut?%zBvn_&d@gLgA0(to7vDd +z<$c(%Wba&)8+#8<-XC};s0~x=d2hQ==ktJ) +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 +zzD3w0@**r_V5N^O6gP +z7Cn=b)fY2u1PM}ylW|}1aEq7Ufb=w?ETm9h6oL+P?J6jqYdLML7R1puaqbky62paI +zZExfjf!VUoGwqwO?+_>qY>eETP#Iaf8Eb1yh{iu|XF-|CFE +zmPUuUuhbGLf;cWOI{S@WTt_x(H9W|=sjKXiHL2_9EbFCP`)2JsRf&WF>%aCiMVAe8 +z4CpV+6~=T#hj&H?=WW~g%&qGkS$(N~Q!CopUszHfZR>~*xw)rWpwL^-e0#kKp1g{qhXjK&GY4l3VcCxs6dMX>2?qC)v}Z5{ +zXAQWTHY+Vl#bKo{*3g7aHIs2+9MqZTb%a1CU(vLpJE6jY4{%ey`&IcNx$CRatU&oT +ze)(n?;nK~odSo%u$X3{3F@UV>x;MXZ96ef>7R=r-l+&~!JO|J5n{MyE40NU2Q)nMz +z#tDV;*H%Z$1CDUmm&SootROuJzZs{#-sO%q8 +z`p{yphQ7yH>YjE9e$USozz%a5EBvq`(n|&xdHX0k<&P+Z3tu9h@&J6;O)dtZFxIze +z&26p}{#P^9!d>N&yNeR=h-*SwE(;~)8l+J|nh3Zu2B-k<1+Hd +znSD@USkv_VfxF+2gepP^uN!v((Kn<$FAZ(R17AP5m*%^&g;j?!-(!XF>2nis?*_(j +z5=IA3MhONfh?lS@vckXsJ)U1c3A{~fx?H6RawKn}I-b(tCMmkdFAZ(_t9i|>$Q_ZJ +z^SxuJJV>#qA8XDx*kW;5uvjUL)39y>6TWV|Cl5e)Ihb9xoqo!ig-y!BCQO=4UIEri +zcMhPlz^?USgT@hzM}!pekQ~bZMHrY0M1d_@wy-HiJI{{iY6)zrn;%-0XdndAD}Qfl +zq0K*uZB%txZ@I8pcCTE?-+bpg3 +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 +z<%iBW!h7*lHsxp|g|2aKE?F(86$}> +z?pR@n7%T;Irv5tKNyEF|6$WXIx5zl`y{LK0G|Dia9ixv$);97Dyyl$}bUE5cRA%>Z +zDFJ9H4bk|h`q-qm8_|c!aI>N0 +zNiQ(y3Bu^(r^K@*q +zn#972ybigLN60_|GvkF#k$D#AXs9va-jvGgNTTp+$H>%6=!t&xS&huRVvAhR6ATk6 +zJWjFkAQ^o_8N!f~&wB||bDlysBUIi-8c%-Zp8pXprcgv&4|DH8-oeu828_)024Nnq +zYan1gaM?K<4jT)h!gng@N$oTb +z$SV1PK7hU#W71(TBJq)f@q@mj0CYUuzWW$F$siS{fPLLGUu_sNUwfSSzG4+CM|{+Y +zNpKVCuv11V_}Nf3zj6WBkH8?H_~ve8+m_&ZJJ3}csnkNVke%&Dx1XW2OZt({koR;q +z6ycd1HuwIXYaCD2oL-M9?oihnGWoOSl2ssvW7b-gf_AE;n +z?tR!p;QyXF6^{U-mz7VuA#J6CmELEeCP|ay4%8Zz6FuWop}V>#NXcxJ$D+y9HXS?M +z4Mi=wPIm}!B5QV|S8oMi-u1}I5c8lB|7idz($U+#o2MJZxFH~mpiF+>!h%n=Ng2~v +z>Ut7dW|U%9Lb5Smc8aAEyxq*WfJnX2)bVn(QshxKF>@aQwpx+KrQ;ig4V@Kg; +z+&xDA7;eeX?);KSq4IvWNec>&O(ap-A}?N}g&%b9+KSJ+4dcwa(y0^Wt~0o$a8_7B +z+bjrQcW=v)p1Oc0x+34h!~qXW|LQ#8>3=!{G@hv{c%pC75|t6={fr}|?gnQrb+I&{ +zaXnz5(T!;2C?DvXUwyOit|~+`SS4(%p__|l24#_o=r;|1SvKSutSlqEo`Rb&_^f8l +z^cl=r8b)T3l^2WjBdNU*o^lNP{>;I2Ac94Dj0jc-umsfSGJS4KOKAStB+N}DkQ@02 +zMu*{hMLDbL{ZSe0;+bY#@RRlet>rCLokf02Ohv0aF5Ei)<{+X|AC*K(AWg4z3 +z_0vM1`SNejaq{0iva9W`)($JiWGg;Wm>_1@TrUX|XRJ$z#? +zyyVd`=%4Kiv?=O)w*aZi$Vp;|ZYliY3W33*+2g?{Q&EEgZxgw5+F +z;-)wf`*HOAuxePrJ;(?VUKJcqK_X4DJcYUNq-{ax+b6Vl6kkgjtYMg=MV +zCaDd&3h8KG@&QPxbg3q20&(NkD^N}rTgznMb!Q(Qi +zF)}yM(N8BL9nlfurd1mF1n8mimo_dse(4@<#13YRys5DnR#Sj68ylgwoP>VfNcxk= +ztP&zlXK;mJ9A=;bnx%s>eLt_lFppDm+T_1q@$uM5w60CwaHU5%iKk)DT^VOC-hrO8 +zK%kC~4azqaI`&cfjmrlwrv`%6SRO;7%T;pU~^TjyzUBd-_k1nkyis2 +zkh0rIg3mKN5Ur;`$kwUl3a$Gf{ZoZyIP2vhH$d3b_WVy9)=e9G`U)*LfU|Vl1?9~) +zN+cmIg`q5bq-VUaI!}oqI!82F+1A4@3g5!s=5!K!+Z;zQBzbZ&M|Vaajt|Yl4%)@w +z1kpZ3Oq?U8JTA_Bn8q5mFGPEinDT3J=C8OvIzY5Xiz#?{Mnwif3h96Nc1n7Re-w#- +zWYs4xQsWk@A2m+OP(& +zp~v-WaMEnc>tJ}@_Xcy59!07U&lSVZ*5 +z;J}F4lY=c0i#G(DB8s*I<9YxYY@%^c^M0LE+w#BU<>g+=slD*O#D$UgFoeX1y~SEf +zd_NQ&AA7Ipdu3nAsa5`${JiX|Ikn&XFL7ZJStElVj(B!*@X(074Z-mQ^Pq_1+k@>9 +zXZHpVh`4klxL?HG#^4aKHZcBy^TC$*hkio!!$$VBjQ5w?_V9?|lY_%ROVA5*x1bkx +zY)3B~*!zpLK6tMDH#{I(*F7+@tYhDL+^a}f`ZHoneHb!L=Q~28c7xhLx3EW3lfwdP +zbsJ%L;!C}@qo#u%Cg~`Fx?q0XN52txp2wliU(OxGedlo>$ETeq!G7po5?((`()^dc +zt}+T?ztGKdb)c8Rd}GWi*{ln+yhiyr_e8I9J=C{aj+~;niG`_7I^l)|@&9<~othW)U^ch`7#8=<&(cG81^?PZcR-8-YGCQ{m0ainI-A5{ +zu#W~CvVie>u+Yu|F(kl&yYPb{`{SV(h_Oan#9$E20IvqOZ^S5krXXeph$~ED&OPKn +zcuZnuJ( +zx;9t})rDCZjPkG^Mm0IP_MP%`{R3|rX^5I;pfAlmodm!#xvg+1bXo(-`n#*#TdQK- +z^P5Hs!pV3pn)TxEL63C@=>**ISmTU%PhlUxlz&ay2V`*il#JUn7rpwM(y!ZM%ssYn0N*(B +zb0!XB1Q?Ql`v`8rWyK0o{J8*z8#gzc^T5m)*d=xE?L8MZ(6Cb*=n08IV)PJknAI_X +z8%?b?G#rO&ln!TTlur2sypsGbwfTKY +zj4~a;p}o`g< +zwJ{W>;xA+1Yvl!Aeh?GSCQkr5qQ!*604#+*HXtr#p*-l5-!*{;?NWZ%v<%bTtuLO3 +z>vaLO(2Rh6keagG-GyWmcXMh%@srZ?5S=K`(=ZLVtcRH^+@Y#u!@m=Z$mW1#Rp_0M +zd;^3&oA2gkU(SUw^|l327gnCZT)-6#P@A57d*p=gKqXc;R+!lOMj_ZeTrf{pk4XqF +z_E(LZ>k)1WFS}B6D-6+r>n~VN?#rzy&&2_mD-A%hWu!Q}jDQ@{ +z1Edn`1rjFcgg&Ln_W&*#{VjKMcP=d1U;RCRl$X$iT}nXqxc+ +zxJJ@Zcem|WuBGKR4fzM2!#Q-MrbT`9grUQPVk$aFc9y<1PH%6 +z3j0i@?rzuLb8FpqYyL^ASN2N<2OHV%p@=R0{%5x74l3c_fwYDS0|=^?l9OKsHtO&` +zIfi~N9XeR#IS}Rx0|=~U^!>v^@24O1(m~#?+1_>~-q$YnIx;J-{r_win~iqKv#DKl +zKbYF31oC!;{=c_No=(?6ru*78q||j#>P79E{on19f6Lp&e*1s63%HKwr;wWq1s9c! +zbkI$?)r|@Nh;)rEusud%vafMPZkDAU&wv9%!Udu2c<#ylxpcOlUQj$yo=oUJnWH}% +z0_&{xk^y)n{QYWH;7|I#mB6k4o;Y&~ieFbI&;*#sCjfF{+MJR#-vRRv-sPCzYx)rC +zee7H01saTHmS-&;Gd@XD%>M3?{65^SmDWWez(P#c{zVIEu?@jBiiNcNfuLA6Ct9uXfJ@MG+#4ad{ld$JWczGU~Y@rxzZsB>e#SA?Vh^Z1K>qu;rHD +zX|2%72|js_a)4wk)exM3!0#g}f1nYmq_l +z97exz!y-xw)RhgbN +z0#qth($e*QqZCOKAd=s#7rIr0!24LsMFA{;gkD<;AqGCHK=XTRU@1(`dTU66P}B<4 +z`d4FxQQF;T%`qsEbgy!gZ2wBKp)$qB@$g=OO&4+Mte0UKJ`P3TlLT%9s*ifS+hn2w +z<=0w)W)JxK2SBHA*yRbB+0K`Rc>tInl|x!I3k&|U_he4!*9Se$i&(`U@i_ORRXPpr +zq4|bqo@C%2>JJjoD1SuXfu9%(3;9La`KaeEY} +zvf7HJB3h&Pg2!DIo(q=Tu5i>p42R19t61vURo6@;j^l0AQB;V +z6B2>XALl8129q6q(Fw1T2$wufZ8KX156f?j3CCVS$6oMMVUr?1Pn?Gjzd!2cWA_nP +zNB4~#__BQnAY*^%KH6bn?|_!~iyVc07tGKod)4T0$kf#600@x7BexciF976n802u? +zHJFdn#@3iP0z%r_Nz>TidD-dyMq3H`pUT!Yx5|m-mcXHtY6C_xW*ZcAx)_hiNc*@4M$ws=x9vPR=)Aoo_L-ZR$h6}b`+r*FIgR}oKPY_#$4WuH6Ac$loWRU75ZYuHPY +z3ommWR=EBb9^w@GwixPQt^v#Zb&tdBPf9BrO0pf1w#OWgo*ROTk80m@+5>ZPW^0mB +z44+SJ8zF8@q_zza=Zz4TCW@;b662)N^P6FC;OFrc +zm?;1iQFG|!=UbPVckNg2u+yzrWdY$$O=m99}!RN*n7^H?H}gVb8j09O`^>3r`XV9)gWkV;QHu!eIwi{+F&o!|SfF=HwR%C(i@|w?E~n +z)h?j2z@`}mE1y{gK(s->rYI_)HJo!K~D`52z>h|T=)|%DSAc#r<4-_J# +zj?M~$^o0SJTBzICYpM+}sf5avw$A5y*@iklW%IS0Q9tz**@u-~%M04zt=V7cr*Zz7 +zs;D!`EuB!*yaj^;T!Gy?1JtnxT_v@O-)Q__pXL6iBLIa+=<}qpb&@CM#y`xp&|V(;W*R)U{)VLP<_=1`_@{6Z_yb3pNzlI&p|>&~m@JAR3u(u=;7|BavGuppsnLx>=JyCnn)S=({2wkL>s +zj|`2k>6YGaU0}vbX6O+;tes>05G8MF#f>G12&HLPmzlSRs)J@?xHd$Af9_mhZjPfI +z(i-G;(?IK$GswIs)SvG3APqQRy6>;fJ?SrAI)#FyR8DU>t3>VK#pEI{;h{g_fssu@ +ztza@<@{CUkoNR{78e)zJ<)cncu;3QhN1bbKZ7xXIJSlLC=?|j33`!63Qf*XDCF +zp^eBDiGWyu8mgE7$oY76DI|cH1xq18BSl@sicaJGGnxS%X7A|z_n07?o{`yeYV+a% +z2w#?a@cvo;r#Gy}{7XN*Ze8kM`Dv%s;$QpeHR~?F`cJP~r{NlV@uy-~xXAhnZ=DYd +z7GLip{2N#`x_U6n#K6NgbP2;p_TpkmFkuC3Qnmm8Hu +z*PL&2@FQ47=On$x8Ri&4<4nD~tJAj}U{{UVHU2~{a(sIQR9ls&{j8lhIr=}_$+ZhC +zwXS^ViUQ#V#}~`}$ni#eG2@P%2DcUiF- +zn5(qP^BRrc_@*FN8zpLMGqgRLd-CLaCr=tqKANkdK6|f|GZesw2===IPT8abe1Y|X +zNfQL}qU!&Ly*H1G>dN-TPmMs;L77CQN>db`QbE&*Ce8_yqM~WVS=(+Qo-%5u+i21z +zN^TGngG%3vW#XKEWyOPlk~U~}RHPd!wxU9!6%zqP4e=OR{t8%8PK_D6qa^3k8SDH4y=5j60y2t +z`IJH#1%gsWK3y6P=fn|7{73w|+>t2ScZ75HT^NvK+H4WwwmG4;#X+`}l;X??KihWg +ziU?KJc2u$<^HH&0=+>02QJDsFhoVxpp7QM}c-nW6V0t34(g`He;Y~-Mw}mF!ruMWw +zA8uP7YKxkQ5`{i%+cXL#3LVNYCnO$^(P80-Wg=T73ZXcaMttvTQ0{qWEF^&VY~Alb +z-T_sf=i~d{6=d%_XjZ}`p~oHN?FEdz;q!1xjTIa5aYKw|SiC8j7HruT97$uvM)_Nf +z5d~Ob2Ay`Ep&or7yRF|`R>pd%e{(f%Zq}>Vj?<$^vqC??UEJr3wbHFdW$4sO*BXme +z@durF+FEXWRP{W3Cb5gTYUyj3s@^PCiEs}KkABSana%M7I_<5|-eG8O!f$M+g%2(f +zUelcVW&1MDi&H{~w=FR!3%8jst0JYJ2+PjV0d!{>hfiI?`q3Z{1XB~Q#^4l74-KN@ +z;h3*#C5@UlDZau$g*50r#`k|qOM`{9G{~T(!93f6IhZ%2Y@rrgR4-dngl%ef+w)`qnJSfx($>p3{F;A>Rj3Ab2QE?||3@z|^hGGF +z;XYuDN||4lc%; +z(#_vAc!i^xkjcwqg<0xA5RM}lQoN_oA_~;}!ITIi8vMQU1tEA%U^|c$uoU+&G{&FK +z+e1OxT_8`pqy)H$)Y#Z4rnE}`@TTo^ljha0JRq((%@3hz7KG=UBo}H3T!ER6T +z->1e(?q}6TP!dwS~>xncf2Q(~4pwmAu1Rlw8n3UAsZ^ktj~ +ztEINfLnE|=zgSeG?R@<_Wop-ANN>{>E8l7^CP%bnf&FuFrZ-Iq40I<-G+v@2%Uzg;CjyiTKwP9eg*XM$h_PTQYMb3Z!yRv5C6S%FkE&iJ +zt*)0sYd{U}Rs(9Dx+-U@#@}~{2 +zG#^sLB=Qrk5YhA?h5wEi<&dAM3?RWHk}v`yAf%*4fY@iAAosZ>248`NvDvY49Cxzh +z32?&IG-%PVjlY5o&j@k+6<-|-gU{dgNyAV}Gp=MiE8h<3<#4ua3F+=~I`@S9res&% +zMk +z@lqagvuzOax{!4ZVHVS5#pdnLf2hfg5ZSE}FAmC!F+_>WYcQ;eZN##$h*czD!LjPc +zVTBhER$5A7rB;yh<=^|l<|Yc#mxM2_FU4O2mBmFh=4jFGZ4;6e0A$44L^=v&0Bkha +z?|gAtrBHfpzzIbC`b+tnFVPXMe<|Po(mP*NrJ++!M~q^P$b@bnJh_P}%uOaQcBfN~ +zzFw`0IV&IHTpPL6ijs}0C1*=c2W6E;l}u4d(Q?T~jccR2?Z~R +z-0G|u(FbCL!AeDIBw?4YKcbtAj4dsfkFvZ2zD9D_(5)FJ>p?7K!ZEzG38ej(n#^W? +zm@}uGvFsr~LMe6*;^E7=4L~H^(1>H>BHi)~Uk_QBe~tcLK{vt+WTVG-7;9>AmsGmg +zjH@;ukK*}Jfs*07NroAVby#n5MNy*PcP@AMeS90}K_wse!v^{XX6gY` +zGfX27@Mh^77&gEle%*dTk5 +z6LP^S$LlYA0)P1v#b2m~Ke;IWHn4SCyC&k`c(9kXkp@^A%N4x#>B9OpaS5csOABgI +zW%JwRU7-AN7wf^%1KuYM1Y1jgyqvpO{=+#e1vw5gIsf@ghic!;_7c^;KD+^Dh*B-_ +zubPJLcozIA5Cf_apKFzV-GJ6*LhlUHz*-1_y6dF{W7N)_AXL@@np{;Y?xQB9dY3! +zzj?0_Hs|div`_Mz|aef$-?!l-q5u&=i^BS*T_WpG*@hGAdJ7brtQ7WxB*;j0Czt>e0 +z68~kwmHOv%iwnRmUa6M4d^MI9HTe<2Th$Lj_fk`Pnf{A)?tylvJS;I(JJfhI(+i+!D%xp8DVT8es-&$JhuVU3=Q|>Mt3bDaDauf +z`ym**nn`{hjVDb$1HKz2jJTn$P%XbzSEvIyY-c3mOu;#s>Pd>AaOza|-k`B>@8zu|nsSxF}S +zGU>*3;L}Ee%wPx_pS%&I-){CT{+I*8dF{g5&y;vVRV_b`Z%}p@@E1BFoQcBSwWS)v+th=|Mi}R)?>!t>yNy@N$m{5wfvgr|FSb)SI_V=ok@R)uKQ~{uoyFWrejCfjERVV(nmH@TC?YtBGp)$}mLXN8gW7pPt +z=?Ft_iTZ#vs7^Xr8@}D!c2eb6D57__MCFZ;|6GR(-U}QMKByBctxCCVapAVK9=5~? +zo7HR!>CHosoh4}v4LOhq2dVPYK>6U4_26^va~$jCu(c1o^sorw3gAfrxMnXIE})f- +z^bXY}U)`f)T&DDl@D~H&k6VYpxpseX;N#pm;uY4wQbk8Q(|FGF@=>~-GqPGEjK5U! +zalHG_Sp^zboxgKmWd2R;UEaV*;M_O0P?I|NqfJ-Y*e6f<3NnJyzRK-%<%N4%rK(n$ +zU&{~c8g$TEtja<7b%xZUkG9`U>EETKVt)B3%nm-7l8=Y+ +zW@$WyZNVL~&qo(;|#|sHDRd%vT?R6WyP;BBNLr9KS7A-tI^j3&@6t#%N%9 +zi>2Qt?0in##*Nq06awke9^Ac~6JPww3ok-e-=^ggX0Bgouqg*yDMW38zEA!Ymhq9Z +z2k`?Nc5|E~xXh1R6U-eCEx7WP<9 +z$On*RRM~;ssLKaFIbKAfqdk)7Ir&F}t4?by!t;QpQa%ucl0G{*&@kG_@E-d`JRnPs +zpPoGOagoPZ+_y|+sxlrue?(QrSF7tG?E#^cuxj~@+pim(mN0b8iMMg!0Je|YY_Y{R +zRx{c8OI?w|l-vC^g}yZh<)K>RalR&A{EF(7=RJ^-bb)G>jmwtbV|qbT?5GAB83ky> +zj=H^?aYaF!fNjpUYJLuQq@XQ^ZELl~cLN4>Rjkf})U02h7Yvuj;t@>-lhTp4eK){> +zLD!d#H2Nw-Z>nGUsSdMiHz(LmDQz5Ut*~^+QdaWR&0(tiu)d(&8RThK +zO@oKN^SvGy5KWn_@m1v@$KiNZoO(6>%zQ2|-s${MNruwFdzJg=%kz}Pe0GrjeEqCg +zof&5K@03O~r6EjF(m4K;G_ZIUfBEBN+F^PhVun2{F3R#%yw%;5WsUNc-O>=R*x0^# +zyh?sdY=jz2mN>HV1DZ{}`XY%q)(BItI`(aLM4WkbkK|tv +zBF}*PB5kVGWM8=HYu{OLwgX&=vk^9g@9uD@Vys&VG=B_uO>0`QVpHQle};E_wDFj8 +zpC><}H?HEL$4m1 +zQu9(ZxHtZ-o4N}^a!WXNDPnrFaF#c+xs$^pq*G4Rcui}zytS=pD +zAxo!ZqrRj)opf&Ypy9zK8`VhtqkSR8#xhi+L$VDc@%(Uy6&J +z6ZPHQE=?MJY&8~vl9nrsJRF?8QJp&vgydlY(lzNyFlTiHzygDs8a +zO^u!_rR94}`eLK0%D$5=oY5Dmo*#`FQv2Zolf6(xRGHresUyUiNkWZ~L746w^FF)qDhgCI$ +zDie5v@z#wgh3TnPsr9wNCnF2ex2j%^bZ#rp@Bi$$gkixsgN*%O^v|+7EA@xM?cMN< +z*@+ljC0(n+g7BjOplRoxLPyb)3=2OnGu_AAsHrP(@!Q^aa}{7sF%=c2@7YF&kI37r +z>K8P_LKhAVS@E=AzmTDEhQ0^dk&2yhAj}uba0F+u%%|S0vt-@<;s6&LJD(4GQOE1% +zPg@fkf7dd9kY#yAY~G-(b=gZT-^Y*5&a!>_J4&>gVjWi+B`>_?)~a%U3xHa! +zw8RVW0s$=Z)}J4*o0%5HYey_3y0P%L7E`kG;1FkCpQdfWILav*t9Fc4#n|o1mp7~+ +z-np~9*`0(5g6iClL{0SOb%={4hFh=l=+#nrON^ZY-U31Kmi)ICL<4UKky%-Lf$Y)) +zLWUp)k~l5oGNflurhCpt;b;pH`M_z6v0#$M1*(WHM{CN-TAi>?i}!eQva%D_Pv7&- +zO+I{*<_gJ#tX3V;#+=!%+dG9`f=vxhJMh)^YJ$gAK&77$D5Prq3yuBQ5<88}AOR-*f4 +zy)f$*AD)^_t@uY)ZctKZtVa>VCN-~r9Z#5X`gjYWM!zd#6~uVLG#8~0>PGskjaK*?`Q}gHM*86P@WB%e+1@3?b)f5$r6r&2Z~i26$_PEIa4xwK@_Ypz9qaC>x~s@R54ni>|Za#v0EEPC0!=oQDwbB@}!?D4Z% +zz0%x;B}7X7>xRsG^B2URBn|$0NS3epE;e|@sA1p8hH;OD5y +z4?jn*AI*gBJ-v$)Cw@_^l9RrWCzD{CZ!S2Hd;jc3kxF^sKLMhE5F+6V={fM!VvRcX +zzAa)|u}V6Rj#Z_}oepaF5_uKQ+oi9+hP)*MhKT2H#P5!jzrG+W`hwr>OinT$%nu88 +zSF{H0b>SAGt{LDp?LXUBq;js#Ad?=-lMu=`}#72bq^EQZ{NOL;v +z)n +zP`##I6gIpMP!4{xgBPjv_uEG6t?ygba$tqe>mLlkA>SQWal?aoH$891+H-~vuxw}7ogB{1WASR&t}f__j$Is>VI0mTFkU;Hp0W4wJ$U?kd|w?) +z1a-g$x_|W;6qyD(*+Tn)`WyB|=3TILY0Tk%&x0&2J)s8m1$b}4;aC}nW%Vkt;DT#+ +zgD~|XIiyy=Vb6tv;GNN%`*0~mnn{Lv8q?r~IGd;Dny2AIacyJ0U{X6getu$j_O>H@ +zj7i#G?Ae|i#C4)W8rc$p@@(}4Sgivs +zgLIZiEySm>e#(a$6FbXd$PW$W{VZ$pUQ{P;=3?wCUw(V@_hW%fez99T`JvX#Q@|%9 +z^N%C{yr}X$R{ga!&C2Db(ziF?M8X&a)@89CdqE|?e?rmMY7E5d+Kf+Q}KHs%Q +zOaSu?)geg>f@Gp^6l#q@pvr_h^#vjITDC{;=(ok%Z@X!m$!dLJyW@o|9rOcCi&s9U +zfa17oqYapsvit9F_1|jB$zHU>RODK;RUUJVb{AA`1nPec+u@!za3ZbL(o=H*NBd*& +z0ENu=Tr_L}9QYP7vdk5q#;q36<9pqJ>n`sABb(9l?Mpn!@)8J#zd+2#i}~#FBhuTOM#zNjR2hrH51DB{G%q(;~%?jQ+D#?#A9bf*A>@- +z$ennI2Xv2}7@utTJ3I!|v+IYrW`rjmjXcY{u=URbZ86W!;u|@>f*WZF1qm +zl0GZlecp2P$t=fnEZd4oOBSqjEXd5=D}BL +zquo=UjEn59;3p*5q=j%pb&>Y4-tq|?xr-+r$L_yt@w{SbxQmy{9_a=g5vF|24itTB +zUJ#^~f9=H$(iA+$JV-C8p)Q#OEd3YzPGLED8dEU(*^#q2tTIBlEp9>_IV*qmxm-gN +z_Q}tE!;|!DMNX{!c|9!&ge{Z+@PT$KQCNqYaAq+45e##y@#r5JmQ-uxp=4N9tr3Sl +zqAkg1N*qejJW+PsPfXL%YuCdQ6?dxx)K9>Sb7-v&9d`VbdDwySkK585I)_91N5h1| +zltV!!4qTYXNaP_Fv?NW7p_JFV(zH2=1?u(Fozu%xo&wu>wO0P)eNa{sClnQ`L3o6V +zPRhMM=RiT?y@hJGLwDrj`4QUko8>pu1NFWH=;CwA +z*V{AF!1|Yw7`PUMWrvp6$8RflP`Zag)=%Hh(k({1;@bO%LJATmlpYR2x^U46Z{45s +z{vjn@@y+}2J90P#=@wl)KT=zMtNccYFWnqX-(ji=*7a}k-QJD^2W`qQHBug^Th~5b +z@y1`}3UAy8VhpE+1nLLIoDfTnlbl|_XBKEB+_3BHPE)IP1~StQ{$6E +zfM=mu-xdh)VREZXGgd)6nMQjtz88$Oi5+L&u#Tfh!_rdT9|FBVZ7hOTNHMpjDUj1( +z&QX8iuYz7lfe)!qv9f>$0g!Qo9^O0-qpPi +zd>Bq%ZOgQ_Y?bnKD%{fC4{^m`V;O?80vy*c5!Vz}%zNA}D@yt=n7waL;xr>ddhb!T +zHM7j{_FuF@LyN+AD;A)0AfDWIZqJYaI`a^AJQA?y|$6S^^? +zJL1K`t{EmKHPal1Cxm_R*xqxSl7BG`!zB7L=qO{VmQOqh!g26ev|rC{!REu;u=<6l +zin2R}k^Ec?=w)|aH1JC>)g8UVuX^3EXb`}b-r-Gf1y{0sfW)iK<#~}AmSBfnLN2R# +zULeDvU}--9LR!MyNxT?E`^P2KTFFX=Rn=O78PM(J!HSngWCnD5Dee(%xG-HlL0%@f +z3}S}L$Z>0d*tHdUO;Q +zN3eN#>(S^=+@}!W#v3zR`9QH(8+xbLHd-<>J}z)BATIYxaQytcE5}xS9B1_?d&t2- +zs5IE(2U{Rqh^0a6Z9ZbOZXQHbJi^*0>+XvN?pb5;+U2sh>*FBz_zH4US1YQH` +zzGXrooQ0B+;^6y(g3WG7TwO%Wxx4PhG=;8I#T`cpffmHf4=gRAFo-Mx7 +zO7xk(LcG>9rWIdrar)ZYmj`LZBTz%s=BK&0f@3G&T|d3=^az&jQX+L3>WS*3&TN%e +zGC0>v)`bqXm7=;L(j_+c3tGK(M;yzj7?YIKN~@}Gf0~xO^qO5aMNVg95U-|6(P1f{tTZuIc^TgcNY7I$*k>(%-^2rCF2bB0Hnpc9n +zHllQYQIZo+%8ul>SF5e#MhUO9@YXx&`N!8Vtze{ +z?m~I|k^gY=m!muTqd&dr;};-26DHSV`O_hfd2#KDjKWK!?)@tSI##z<~i0A7Y@|gbve8sk(dRPa(rgP&}J_u5R0$~U` +zc;*B2ukF(zEJL67!lu5{y{PZ}&~LFnh9#iBkl{o96o&e=E-ljx)Q`uOV0N%P>d_?J +zy*EF_Z2>IH(!1MNcwr5lIe-z(;|Z3TR@4|`Mc^ftB>I|QdA!#sEoAL{&NO)DCOTTB +zx=TbGCnqZH%FIcf%n6;$$%+|m`#V~GE4a!wL2DUQFK)p9AfZ0_-%APxPnkxDttZN0 +zy;cfG4OeS%u56Nhd@A>n@Rk{fYXj>C8u%T!HmMcDSdSv37)r)cGRh%{%X+0&=%w^Z +ztz>QmH1tZ@#F~!fN$KlJtglb-_I2yH(f5+TI1Zw2-+GMdpkg97fvs4glTj@XP%?%t +zDt4z{0)sTT9i}&rQWWKJF5imW1W?A7kWpa9Rb-U>DUZ}qDZ8wrYQ+%BBYK?_+zu~W +zJuWfh>)b=wM}Bz=sCfAn$L`PRN;wy?c15BgY*?rFzYM9xk8X(qjo=kk8%PdC(R%$ku1P +zZO9Y$DXR +zoDoN7;ERx6Y8|VkJ;Ih&$QgwbtpbGiAW?Xs;|tS@lr5i9HmI+@hYmMTJ6d-ywJYFr +z^_kyKGR#()=B(9o_SCM~0pqH+x@t8pgQHM|WHTQg#?p`aWRk2rD +z*2)YzX%)4JzFJeSy{(gU9G#}HHo-oAB)2E{J@x#oy8|`bRJ^9>)uA(Ec|D!blz-^= +zTb$|;B+OC@Bw
9**%s5>$vzu+EskGj^QK_YT)Z!p=9J<+rQ|8)18AD1YefusBjhlw&gi$H5ub4rj1{K$I9N%vlQjI>NFV>CZ$af;cy_& +zQku8DG$VCcTIzb(KhCpMT%RDWOrLN-7QlK +z9}!d6DRfC;H+A{#=%Y&hWKV1Ugg(NI7CsbmP@^_obcp&NNDmR!KjhvN-?*5&o$r|! +zwF%vlHcJ8EC!{nmwtX{8{JhTbzGX{9m)s4G?Jg5y;=Xu_QxA(iLz} +z(i+zgn_O;89?u*AgMWuFm^+o%WKH)>PEMLU=b{EW;$USwn~&g4Pp}@n5|Zrpo_=r=xR+w +zuwz%=mWWWgR1*SJatJp7$+F +zPX)U#B29PI6KAU2<)u?GyoC`n!H?q3N|t_gN0{Y}tI#xscnpppxr}0(@DPMVRMBu| +z6BC+fWll`ZfRpK)JN=jkIk#<_9@=C*+QU_D!J}dTQQchCsJaQN{=0IDd`+Uc3(flb~Ap{e%> +z(Uc3FY-^$}Bt|uDNLHX8M#c18`w8m@gdSAK_R#4{B}*POM447P&)P$(W14({G?P$I +z+7jU$a}+K?E7M6|Fq=#^oW)!r%_N**RbK3C0^w67P!)5go{ltqY5z}k-stxDy9aaw +ze^*uc-c5MSOxUOFk9TqXSC8K~dl%znh-FLHVn6WU3=l3cj)&{iXo@F|-2U*4!5nbW +z>j|L^Wq!hIw+dEcKv#hkN&5EdNBZl#DmT`vTxbR(XN)(MvfG~FvjTJDw(?t~K)(NM +z{3nTdu~t5Lrf_;0SbBxZGk6C9+l`ydzdIgun@?pLPz=6=&v9lj +z3W!sNa7!LyZ(`&Jh`Ls0$dtP%23~sqp#s8PtVc?pd*?V$MQlUGd^|mwSP{!+)cN~A +z^jl)47Od2Yr*FX!QyC_ox^<`zU3=NH3rruU8MlIG5)hYD$Iqww>qRY(@&3j`GRU7o +zgLJSBAgLajCLBGZ@Hd<-NRSVlNvxQ!#G^}QVJ_$LGIgc4Mk9WYp_VsRYURLIdiR04 +z2#6I5Zi3f5+Q*+Hu4Loa_O4>Tvu+|d?b)ZDxKjL +zJ<2jYFYR+}+?Z2|V;J+ze;1}Gam?Ny!_lO@d$1E6P1-*)(>_p&rYjpyz3KgP +zxZlQ&d7LcfWeo-&mY2s8WAxCo +zR*%+d?dhZgD5VZ)T*oB&jgOv9_RLnyDBk>n!m%W?RXqC;hE<@0oOy`j8FFC;xJaKq +z#CBmW;xGfeq)#4Vi$gBVK!K|tD(R(jmdXTc0_RRpl~*RX6V&Xh!Lfv8-;n+L4+?u9 +zu(Ql`&{ixp6w;HRI#ZM2Nl>$IM@V_s16EHM)>N3-vCHCrXy0U`Uf6uqj4cPun7O`h +z<<-vU1IUG9|M+@t^l+S-LU4<+bynP^itAuJAHi>z->J({o3`fVy_}Wx@;3E)t5vP_ +z!U7@&-ss>{rs0wAuvatwX1K-T$O>tB?MC?*irrW5K0Wh#N{%-7Wm{P9Oq>ftkQlW` +zAiq!KPT*L|`MTWygpwA9MBKvW_euRu_}BrJJTvE9@zL@2JZ0vjE#>MhHDWz +z1+Wtg4S+58@kU49GH>pA>#03!<7Te?#nHFW=a=7@g!?y1l#0hM*nf5=1xs!K?s5~L+h7b*&?CqQ@)Z4wJiC9wn0Ko^7Xi4!9 +zja6^tyYR-%3%IJVub;w2*nJO~{Y9>-*Vm(9-}w*+hB};EH;3pOdKj~N_^ne3?YU-c +z?=5sY{O^45zyBY?|4GJu@QEgqjQrmQ1Mz6e|D6u_&vR9wUk{=Dulh;;R{>SD4I#Sb +z5RG{8M-|cmm#_&>FDtbL9A)m8ZwRo3jIdb+Y`()c +zX>Fm=wy3_g!MJpYr+NHuV&r`&K{E)!OaMgqa)0BR@COE4l-fSHjz$kgZqnYwfE**- +zy@649iTvG-wRf<|0cV#Q05DEM1J91wd;{Q860|v3jzL=t +zLeQNXpx>+#?%Wt#&j1OJZx95bkwK7d-xzydNuU)DNB|mnf1@ODOGyA4C2;eGzKR8w +ze_(+{Xq1~9O5p1hI7WhotP9s~94{ySABEos_2V5!P;K*X;Vo#2o)CPu(^oW$*h^EW>?d#&MYM!u&-UF0|-xDZxtaH +z`V$6om8ic}tU6u68*^|aY-kUE6ES0v$jluvtZsw{xBh6z{J~OW$#cZ!3upVLCamd={&nuut>a^F#YulAOlDmch;fwLH0zHxI=THUxt4CXX{)9N#FU +zG*%TsHj3l2G`5kdT0t9vCH$r__mqH#P=QFY0mnDJn)1WGp9oHBoaR|QsyQ>}Czt1k +zeTB-H*cdB0mo7*u(@PK9!XqBzlI+@VsUPNt+IX`s2fn0@{Af9$QF^u!N%Cg!k0E)m +zX!_bonu&D5bW7=q(0)E$VN83v!Vi=#F54;TV!#{I$OfkI5P?8D0)DhK0um6ACuvS& +z?h$dpO_wW6{JxgJca*uk4~p)_j=qULp%T7>+#l&%e1s-^#6~7gfz}11arSMU!tIQb +zv`Kfu0QX!^$)eJ3(9P+a)7jj8W)4uV_smr;nn&Uw%=9cCyCG8p|Qa`5BuuC +zr^~;)BhUHL`sb`{=Nnn;ld`N+m3H3wzAaRf+0d(L^EvL?G@KM+i~kRnLZ<6Sj>p>_ +zm40T(^zZAh&8%A+$Q_L{->-_xyf;?G&2NsMzp$Lw#g283(}HBEbH78E_+r4AZx)0%R!DNdknUsDO+yIo5-5;5{B+WgznHLZ;i+?967w9 +z=v3uN_1j0m$$L2D{Pr6gtoG+V8=1_aRBOSwq82|tUZ~k%O&vVb(VidBBf))+`zowG +zFh-Hx0NGc}o(_7lX*n@CzNT8{25ATX6{h$8G<>eOb0$jqkZg^ +zN|o^Gaqyn%s6Vb?4-KKOpl|>3ddZ%)5q0hYSa9}QUYaCKWLsc1Zi7(BYp#q5w(PbD +zldg|omp~w7A!cxFTqJJ0lxg6BtF5$&hBL3BQQtccN(b+-?N@cHG~i3A#oM1S?mTJ~ +z`+fWSWQ( +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 +zrpH4y +zo5(HT-au&#_-b_hRD(DR4vW>uL0j8S&T^e%k!#j!a#h1sW6V>9Tt!a1hF<*#*QN@- +z3TL&(|6jWL{YzI>fqFTo=lnFw@RVBHv&%Sc05=NXA?!Pf8>LbAQ*i_qx#LE0Z5j>P +z$p!Y_uy-%udU4f#kQ=lj>Y3w$9;jlWx3vvo-#GR~2`E~SS;cgvUHlbW7RPE|yHnA# +z9&oP`oGeX(3cm-cKbBJszk6%~_m~SVXJt%KjA-}K;@9ExTqhrY{5pIlck&6s +zufr#;lMh6bS~`5Db@GYFufu0XCm)hM7gy;Z3KMl*az+rP;LprC|J+*N96 +zRs%pXR$IVcW(P8nJqv$khhZn;W~s86KjAXDQ%`wS^MnT8s^09|i+#=PYhvFZ_ATK4 +z$lX;b_!D|{2QUX%q;Bi##UJD{LZhQxs-Mur1DkuZZ!h*Wv#*JLg9zg|&OZoWH5a5x +zI!3lceAQe>`8!(eO_llB-VY%8hJAY9=>?w{=~mfJlwiK5lo-I9%kBNklhFs2u1NJ4Cy{a +z?!F(T|F4wKKd3LqT}MQpI)*`=%sHVPXL;_&W%0%NxiXPI<)O1bnd$d)I{8r?DueIW +zIV`#R;E{i4JDI6YJOBQbKe_pof9JqnvkyMy!`DVs*M3kx7v2}gmtJSP7cA3!?gabi +zeguQkqp*ZKKmGY&kh{s4En$VyRyd +zJYPLid{Vx0l9}?*IUk+v;KfB;?mETKdQUVzs}=KXLp~O>iz%bN985e`S(+M +zir16MPvs=MAhXYoVXVFUGD33n-&*_vd^-$6YuCI-K +zI=OdNzVtim2-5!Zm6ys$KVN46rLe!sao@cT?<|h{>Mcc4;NJnregN1FK>vjfvy%|8)6ap1*$s6B3arg-pF?%> +zW=3DV`|5$p?)%ZMl74E9Mx)jFDHaOo{jJrGS=(8S!H;&8KAp_;BRl<&e4Ed%m??ON +zqA)&x(tSU2r{7QGk0HpN6p&=y#!0Ygn2{58}o#UCYgC +zCOfC@@f~zj&aX&EL?`qtcw8krDskyu=;%aONhd%L)bUi8FZ_~=hcmYmc4(?^CUMZS +zxKTf-;|ULvp+gJGVY-Fm5gv9+>~lv9b<&+OZ_y*xD2+*emc4R03>P@K4P}tCd +z{-fg5P~250V0Sdba4i>)eQyF(@Kr6RexT)&VIBj;FwyPDWx0ESiqwl!K@q`X>9OA2 +ze?YB-+636an%-OpRM0U$E(|c}7fa+0b*w5+)mbqw_MuR|afERFQg`4klniwP>K4>( +zs5?;2PUozBlMAi!u041|kH0~@RXMrKo~yw(7(6=;E95B!LZf(r46n0uX0r3wfL +z3r^ElJ +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 +zqW5hmZo;sRF6s*?@&y$2 +zMSGEN4+UR>9_@iq$O_uG7x=S+0>5Y{)*q3!hoZiKqJM%v0XdhpxkdG;jPTpvgNb}< +zV_#;kZ$y_O_v4(#z)_y2subwdWMNga!#F|UI&^>7@ +zCDJwJQJEMQB;{aFU*vxRancSqydHYyqIYFZcqzc3cVf`wI$Y}!4N9I5pf6$oq8U@k +zOq|eR3Vh7SvHu7>1l_T9X~D@|i=&g?;_TvTpbgm!0Xv=GJPP9QV8JX^G7$|4$3H2X +zGBX4me}uDyFPsO4_z^M`GYiNN9sK!;TPDQ}8{gPimn3SIS$UAByTyW&krte#l*{e# +zgR6|~?aHxH>)_}F2C})idw6V7}xQLhuZ +z<8zKH9BHgmngthY%)&3WiL|!K@95~Z+Pj-yub>}tpUoRk*5XTUE@8j&J4I3Yq2CI(NLkso<=@UkkEaOG~hjgy_hy +z@JjJ{8dhQ9V`|2Sr`Md7Z}yi*^G~f8Szt>;R%lSG_@YE7k8>T5<~ipD@5Ez;0&d?bs;qLbuh +zhORMd@hyRj45?gafpr0-Z)G_`3Ta6v<9C#_l2Q&^1Z#wvPM{7f66^>*I<(Xv&q;#n +z%V`IEI}$#Wp;Uso$4m1%D(3+_0Xy*H1N_7TL2Bg$%xDiI;{^Opl#6^Smy~)E()20= +z^_w8I=a7~r1c}M@@#qKnOsR*IT#q201`!p|(cub|6i9d|Eg*V_G>(@k_!R86NxwIo +zu|1e=4I>$wTAH!BCY&{_&RC=Rj8$sMunT}W)*a{M&5SLW#Mqbf@h>`?u~&K&dViab +zHLZmtn9SDdIng<;pIg?Z^WCc9jZbzr7n)Y2nV)mZ!7ZP)7(MXt6aDXHq->G7}5!DwoaNjy8wBqQ1s_}cjbAC7C=9|!22P-@}St{?H+AVH%9X)OAnAg=cO@CmI +ze|p$_`0VQQ`VD+w*wf>c7qcP>(R +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 +zH0vJh%(i4|tq%99N9{Y4dZ5VnjSps9652* +zrg@)=mExU4K6PrtkiV?ghT6o_;HQXs+kqbh|lk +zLKv&k@kQr0k!QQViHbJ5e!n>Aa**-umBgPn7@wV5a^UxGp5*np)_UftUMbyb^zK)# +zVXhffue8Z?J9#ym+a%AaKIKLiYE@)*iE%BG1B$wpD8FI*hNHpP7Uf#q;H55iz0~Rv +zja%oRUg@VtT@DZZrey1{ibre>a<98Ew)6DBv@7Xpo%$rj&-BgiUo8KK631_^T|6K$ +zSGU2fTdnO{%iq~Au4A(Yo63g0FXK};-=J!Rrrz)SIBDRD9|A5e$=^Bn_`{f=E3Mk{ +z`fHEmHjz1+#N8{L<6%%xvaZhW_f6MazBw{v%U4$l>J#_hSdDaKHu +z@`t<*y_*MZ2%Ir`)bg3%bnYD*?9%Ix-TN9ZTr#-iySrn1<||aI;II0Fr7u)2f3s4- +zEoTNqzBnCL`sX^~`~6C9_^w^uJ%KMHFLw$lR%e7y&giK#w=}N%;~mE_%U9?-e0#9w +zg!xmdmr5@k{#5Vdr<*jO`tmc=Z+*Y+ePrYG|$x^dk)N| +zpVK@csLJRenx#&yD^fuT%zl;z +z?GrXOy85_lk(p^#Qh)kpO>FtvrI-Ei)(4)AI%nvebJX#o*&J40yyke;ZU4rL-3QjnbN;u2 +zkw=YNntAtHc7LZsUH3CzHQkoI(x~y929DeCOY?jCZ=VePedV-L$sIQzKY722d%Jb= +z*#p{-9oCqcBBtZ)!c2yp3hc@t5Tr9o9@+UBC7j +zMzoQo3X2eWW@o1VKSv=BlH~x%B0Dk&`Y4e0@hI)3K-&MKH0|*bq5d~a5u{kqlbIH}+0r6kz!RvWjw1j6 +zt1yuU*FL<`^2a=nIV3r$1Eu9W)FYWP)FYT#J(9I_Rx1yobc{o4q7KxKbc*W9cu+4Z +ze3b8rdc>e7>JiM0E_Ey66@I&f;A0Lmt4BH>tJI7AOg)+tnzK$aKK!Aa3^T(=y2f7d +za`rgudNk)WNd_q4oW(IVFseDmVPUn@LwGRfQF{A@DG)5kPGzQNANycw;r&p*K +zmR?~LV#F8e6|Uhun!~uJ7>9RA7+^ERNr)!9@&PEX-(*M7fJF6gJ)l@t98{kJP8`oW;n +z5s~=!2v4tIR`oAg!7unXpVL9bImwS}E3JIA8U!Hnqn95n +z7d0-rG7jH3&T=}Uf9o9X+RQK#3*`q(khYqxo5OVcwc{`vz +zqW%OaOsa!Vm^2|X^CPPLW0)1c5x}U9nem&N3BPaTH>n(8-aJ_jymypCenai4<*MZb +z-Y7a{xodI7?*a5;YuHWZDh1=?D&0h?7jj+MUDWsmHLqHpLLk``44x<<+nA0wn>6x* +z@TnejGV8#_x$t +z`2EB3-a@i+hCcY=&`Ti8iR(9(n;7XMmZO&6A@AbsTegzjV(wBNeB7m5NPUZ34f`E6 +zj-cjEjJz{i1_Fa0FwrlveFWw|EE-zSWq$aK<0%Hs%NR4`*Bt+;eCcVjGfqC;k@~}? +zaBarF+p|gF^gSNG>tMOG?5w3Co(602F3NkPoLEKV&~M}GaQz-NC!xh#3?XT(0l(^T +zM|uqY3ActE6$E?x@MrvzuMpAUQ+{8`Ub&1?{=%P}lImE4KXc@Ys^mCI8Q-S)<&*ZW +zGPM7v@}=2yEfap7aT@%U6ldk{1>`fvLbBq)gWa%1Gy3OB9$p}IL&f7;%NVq*TfI){6__dp<60ffjDPSeeb#}&3MYTWI1#L%eAEgG +zp?x-xIi+X@O?6C0S{>z6AvE6*1j5hpAjqb$`toIY%{G~>-?TI{;jd`ZWSu11azSUv +zKox^=t&aax27lInye`fA4|--*Ovbf3(r*dT=dX@|=s#nJwe>Ma4d}5E8oP?M(`sSI +zZfOciA2AOEebxp2S4A~#y8h?%S8B^JAIuh_@59Ei>RKPbTbif%_JJ;A>=EVrU_g;3 +zNSkOhHqXr94PhrLQ9X5<#!sClcS4=^KstFWZ+{exgYD8LyR_LZ%}~KSfVVG7#8Dw( +z1W!*vTGkz8+luaqkM41nzV;g_g-<5#Eppw3`?2H{tzvcm)O!`tCz7n6(G+3aX?FgutW +zP0o$*D_3!B8fwy+Ruf*aipATd5msm=mMJ|6zj2j0y&RxO^gvCf2Wm3CW;oPG^hg>+ +zFBX)Do`9dHr}+#$KTwqEIfJ63+&c%8Gxe^KOfMLyiC#TWBzhcvo}Tuz^u7Q^E=^FB +zduMXs(rlzilgV^!(o9g3%XIt_<+1C5H-!7)_r+-ZX!HjBYvY#{y?<-`vZnX%jNj+z +z{ddO?lN2T)nw4c`umYE4L{G|+-hY4mh@R#%^#0r9NA$FxrT1@) +zUz9v{k*qLAF;X5s8olU$ZTzyL_iv3~*7W|J@%tRT|7`p)*;s5>z8>R9Fw-EOP^D=d +zHg&U=(^|Y%m8KQwT7s=S80mW7+0rJYQ&nj*(h=Ql}6)TEC6LgSQ-B!<|H{ChP0Ut$v=dZ_W!8l +zdB}Cj`s2A-NF4~V4)8=H4}TeEEW>oUb!dM?!FN>0Dlxr-aR_q=y$U)$xs!}o>Sf&b +zPzE2@2*10MI{yT5Ww# +zSe0kdo+0=hToWLE{@W9{oIO19I)`+VSVhs7%4j=;@xJ6j-CUB+m_YRPrHvA3>R3{s +zpc{pJ4e|;rbi=8h!e1P7F-9<_koln97C#36HDo2^&E$H~9unjH)`P65?j4C$_E7Rj +zeqA)IQa$9qM*eY*$K=R714$ORGYiyc^hR@1l5rYj3t9X7DDW)c@0Jny>oHwOV_e5; +zSQV+tN2OKvPx?HVv#2K6~s6Y9He2DJr%wdg7-5L@x^(chIAt8)mPHP +zkk*68AHkcNhQW@;NA!(wQ~$04zn9XUl3KIS<6gfzTj5~ +zpd&iyyDs#5;3==-^)1TOa=(W((eVPVi@-(KC%~H<{$POS)(zmL`FaiYLX^a-TZ_8=DcE2Erf4gx-+ +z*#&vQO8sQiCt7X}oEEOdd*KSIE~@&v3BuIj4+?IV=-v1rfOaAUC9Hb##yp7kI* +z;KUfYcmh_TIV9%gN|e*QbYjv +ze=z8nK}W~T{&*5m47=6-G}r9sBc*9B0+;^`r93B~152{2Pd^Ui;Lr3rjGZp@sw1ny +zbo{!7BV=p#2q}rD>_MPQ<*=6_g^{1ibl${+JwHQO1^>(7wG7}HK+F|?(H4Av(q=8{ +z5RKKKQDl-w$YS9B2>2tQ$0xk%{K?kX`lj5{EMOd9X+V-yP(6>3?dXe+RR|;= +z)H1NgTM+f}f0ACr$9wRhW8N6^3V7t?jXsmyH4yVXrVG;rkbeAub(YGJhD@^MzXKf9M&QIgamC6eH=~QhVk$E?;L483B6foY +zMa(xVPA&Wh31hBjv>6nV7%Q$N)8b1-L&pVEJcRnaqN?}MNLn;x=HmB!Nnj4{z+ +zks9Cv{QxiK7~sfqcbYYJ0kB0jvKqh&t +z^5DD+`J9vc>J6VK8Gaqf+)Of(@$Lp*tWPo2o@}aGZX{=Q+Jtf;NBnmc=AzE%hPEU} +z7p*M~-vaeWX0HC~_Ilvc1Ba_3<8<^P3~6d#6YcSKw|5=j^8ys(&=YNFtnuQWv74QK +za^3Ql$DDLihyKBaAtqbO0L7(i_6zfwuTpTEvVv +z{s4~aPi#2equmW9ZI45bwtC?dag#rG=t$Qyg#USabD0%0#%Uvs$-3f3y+aA(8C^;A@KY)CZ0c3!N6eIrV!IFh{XVDo`z +zh|$E{jfo1+_LfP^xXi4^BUrc0tOmR`tJR=uVKwNQtcFh(Rzt6{8mJ>%4XkoTAK79# +z1cxI}LOMXP3b+oz9YGa!zx7JL=`Mt<1IY|CmNX3(5Hbu-GQI?Tk_jv|4A>TzBY6kHV;$7Nw_ +z(RQuBy%nbUX~ujo$g5g5e@B)rbR6*UIc&44Bm=U5hfyXhaU3ij?#!*0m}H~2#G=hd +zv=Nq<+UP)2Sl+DKM8I1YmX_K?p^dP#)TaAqEUhcs42!!3aVz3B#2tt`5qJ6Hb#Ijw +z{-3wMA6apuhqi<<7It^3t~_A$e`J53K^DTxyJzR+T~@rjdZth9b1);1aX0McYQPDA +z6Xdx^*TQxaZnL!5XqHA`gI08(qF(TF^&wsN#O~*yb5i{gCFh%#wxsr!-EtygS?ZD7=K}-xlN`! +zFqxSI?{x(eFK +z^wBOxViRRv<53rPwb1{Gkdw|xX{~H4$+OES2a;7*G7@Fv$=SC9PVlV@!QDIVtQX1U +z!oKqQpN)jO1g^8A(vdl>yYB^YtPo6w% +zr))oKXJS7+AXg8_lpxJ957=B`ALpQcamAbUfD9Ibmaws5xK`U#J=*Kho}fLRTg1Bx +z&m*+0siX-H*-RGgDz7aWZRGY0Hqw>tMtYB(tt7|wf8Jh_zd8W^>Ld88!SGif{fGW) +zBdjBt`>V98%PnRXAz77ATtEJU`IBv;aizlk9|^W~HNKcP|4s*=!wbgRt2QJENq# +zZ&5}z`y+6Y&89lSW)m%HPqvcmb_B|(O+lo|Zc|#=ZPIh9TODO)?IBf{4w*^_OT#{x1}+w@eji<#JTn&h51b`Ke1>>eOEx}Zm}bzJBxLza(aNyV +zSS_YIV`nDwbgYt&UZJE%a+qw9~RtK?i^l-vm3Z%$VM}nfJ$_&|?a`H=4Jnc0_0A +zPn`c@N`9gOw}Kw^f95z2-=d$CHY;*isKA#Btd4rbS2MJydchAhCII%*f%6fi;C(xc +z*L#UHmA}>Va@}yAKL_%s{BfX1@Wc+D-xG8wE&98EJI@zsAJikd*n}_vu;Shv9#;6+ +zd7aZavxVoc{7osp$6?R=95&j?@dh)VF1TDHkHgwEJiW67=gSxT61_QVlyRNJ`K!F1 +z)7h%%O`K95yo=`(ztk>Pk!SIh9RG>C9LBEVbi!6}J|YykM5F%_+ErKJ2}M4)6gvCe +zdAnrr4fYeTm%e?`%H0fIe${hfA?%{gZEQ#aOujP;_c=QS$4+RF#;N?D#H70tmE_H*( +z1i+#pADSnrNZJQmhO|}^nPXDMJVGI21xj#l>EvH{~I9(YFBxt +z(jUwdlJ7M@8qc+fy!;z5-Peb)3yAIUlJ8GB7<&RQrezR#(W4A6@FoQ_Ry73WzR(vx +z#!6z}zadtQX6%HM1Y90C?fvwL6DxrK@6_Rq11*cVMZf&k0%fSKgl25Nb3W#UQXl5P +zfR1iZSaGIjp-f`A5#{9?X;++3rFUWQb}gQII56Vd8{ZPzW|MzW@Q#~C{>j3|C~3t^ +z_^(hii%@X;;9rWpm>X(40*?=%3(geLn}gVALmr(z=T~l@TxAFLX=s7{d+?tPSe)=i +z1AXwLo%mz}bO59@z1>2P-mk>7Z*Y4Ij+dpvN%?i%Lw&J +zMkEp;tBjn*fJ!m6AZ?Ho{VIuHosGd8GiBH)lVlWRfj*~yDi&nw-X4dZ(7_aIYvfLEvf|?0@m&QK}N6X`Bud}?D +z)FYcV5suDQ9QOUQNi7;U$+8X8s4d$_nxt~jvVu}UiTaUQe=_!kY>NaN7lYHQ<)LF5 +zoLh|n{*0PI+}q}f7$cIin=DfyWrC#Ng4aoCC87UXHc7$+67jP^Xnzk!Ra1_f<3QVb{L-+ +z{1Y_w%bRnenyXYo`o!lu*CS6m&4@#9i9&n8@9_2*ym~1f9CVQ7*AaMopp3Q`8$;(} +z@Nd&HH!6vZL2e7wrnQ@|Xe0^SYBor#9&4ShEzE2P!Uz$cW*m+4P)aDxA5n-l +z97AE`B5G&_as&6aHHT&)@vBiF|6K^7rPNm!=mt(Zf-cPvs>vb$We8fAI5x8SahSuR +zS1}mJV6>tm8#FtKwglRqN}3?irq-Metz4Ay1O-lm-bEwrDh7*b!|MpV+CQm9wTWu5 +z+@5rbe2Pd}Kgq*#{ls&kHQomt;zR{Jra$wQXl!V;p;agbgoM9Fx>$-_RymN)1v_y2 +zLmEvZn@!d?oP$*Y&n1hLxlct}+}>K7FgA7&TFl$JDQ(FwBg;pS{4q|+*7naR*{>Gl +zmGHIf26*5)D?CAw5+0ryA*yL_H8c7buu32olCX#LT@9 +zlJ^y>bgIIp7?{lh)UaDoNS39V9=4J6 +zi+Clij6_m%>MlEwciCU5lk-pjZ<`^m8z6a#FQ(gP9`kaqLUN9do!l(sbl)J#${~{u>;n;xt=9 +zDyeCC7Lcbf6|Fl&B$dHdeALehE^4W$%QUDd`iYayvaO`iCY2SIPgu|fR?k1H +z{i8@k6?%n9kO8dFtS&zxP6EeDe5y$ljnmuZ-@_1`07U^D5Sg!mRR +zqx&3^$}p7J_z=0nt@TI>v@^tam9pv!?Y~XJc>92};lP?5(z4%;BmbD{Vbv!UgmdD6lL +zg`-#0$_uT$tgXDDSF~$IyB#suQ=l=fh+n4Tp)TxJ#$DR_$l*H>l8lXP3Ac};XMFUi +zXGD$mhj=d|;uVP+<0d4;udN7~Uon_4?|smidzW)o{k46CfM +zX(I7VPaU|X+mDJEEq)IX!>VXRKjI)Ic)&8Ij5;Fb4B!8(CfDG*=rl&uXI@fWlhsJ8 +zcadqt%VGe8?G(GpLZ8LnvhZPI@T|!Gj)6aI<2z6GT1R(JG1#l7e$m}@F5D}{;NFCf +zg-Dy^v^Ox@_J7Gsbd#tLgqa|XIzgJt>bnH$LsjJ2?=8!1Rc-#B7fu{zT}OL23LQ!2TWAfS*c{@b8iBN +zJP4ngGPsQ=AA>9atzLYDGutzc0ne4>XM$u0uDS7Eali7W6}!z3mD~kInk8@D)U!lg +z2Kl%Pn?inQPrFq#Bai=l-DuUj5(LJ0@>W>?+XyFnMC)UYp+& +z5r<@p5@Gi!^hKKcG<}hZ!I)JBq}^cdJMx|2jJv?(+u7_4rzfZozC_F`!cI1j>@Yp8 +zCJB+>NK^z51Zl?6{;#kOVjs8>>NQ3rjeO}Y^j>Hr>HB-DP6#a|@7}iC>xdsoKs7n2 +z@A-o4at-oY6yzbStGFY{YM+t3j;>Z5|7>5{2|fOMJGj*25mu_7w)X)>;Z>2%Q{OXI +zMVe$yR*m-8i8fya_$oqUNo6#Kq#I&vGmd3h)>R%o@~jC1jj8$`O01Y_Oc^mmL+j`X +zIjwtc^1}uYLrTxCd#Go$x=e$bVr0nU7oI-#f%^lSMCOA +zb>KO8{~mUVp34{oy@`27pya_ho(EJ;_m_n(zN +zuI^h_elf@ODIbZLwGN0xh3f=q+vmObMb=)EHLLEewr1)w4O`@Gvu1zCi|3X(yT?D^9f +z5t=jPcZ<36pZoDy^^@+PxYspCo;Qi0DRTG;0yE2O-(B|q@iOt}{eR-0&W2E}7{nrS +zk0?j@Me#EnOR=PEf(^}X{Y=exZ>9exqYT{22_(ywm4=u|3Ym#!^e!l`orr2nfwB0VL*Bo_5d#>*iLCa +zqAfT%h_TMtOFHR6Ek*zTyS)qsW;*3T_bO4@#rzdda>~$Vn;gWG9B`uf?@A^&#)Zxg +z(6}AOs20U+Bqqa=k(cAInLjOW25(G^(-GP7a<86d(P%aY +zPn+ppjwtfdZ1U=bUx32c(dsrDIz=^jou3sSfO36QxnzmO={n-*vX$e}(2inCP2&7@ +z2F{;ZInTP@Xi%yu)93dOTnB%_UI6}-9b+YCbqqTyKda>B$3B@0>U)j+Im8@O-)op~ +z>X-+z?`3k}x1Z!dXM2hFXluFpUWE5Ok1T;O`8!b%g~;8sl@4jlb6&2}VOu%rFg-iv +z-U2;;jI+w-h-_bpJKH_*=k=PevHwi3tLGHGu-DhNIb|{6i+aDj`Z_By@TTCUbgO!?(7{6~4Yx_5{-Ql*e6Kp4G +z=}KQ(eVt)jOJinhkjK~>E1xRsihMC%o#m6lok6FYl2;VJif`|CsBP^v-^}##j+KsD +z?}+oP?A#sMzEKZ2FJw0d#uFF6Ry8e?4*X;e%4eO_BC +zSlef=EyM+l;t-hz@lqI9h#K-(_^6UcV;fmBYSYN_5sSwaAKCaU?VSCXb1TN@Dedf$ +zMI>zGGi0s<#6b)^HJYC`Jy2|oT*k-tua4_czs$z;|N$wjCMAmTZP? +z)YNwv)K186AjVtIa`}ILJoEaayK?w+Jo)U5lh+!t4`CZyn@?85KNst@A4v4g*n3&a +zYFV*1W6lyE>w=Q~%m|hBmp_dvBxOF2=?Oi}UU7Cgh831;3J;6>8p5C8JHED2Eh3R; +z#3Y-Cfm3)Ao#LXiwRo@L6Q0zwbqju6lz68%n)q29nnA~`eIxlEvdUL@Mn|mW_M`45 +zdo6CV*WxC7E&R#b4PdqRj5vp)C!hL9#Uwt@sdsAsC{mVAR(8WmNzoJh${=K`z7LFH +z#U=8OO5n^Eei^{{dF`o+n*<&{)gF6)j5MdDEKXPhl|>*+)d{~bmr;YdSTUrXu$X;+=Bi?CWO_q*a*S5!I!$O{{z(Uu& +z#V*0 +zoK|O~OY*yJ#Vb6ba{=}q(FH4RwMTT{nwyzN#Ai)2^ojaKdlUtrIn-C$&yHa)CGnJ# +z$!~5#40sBd+50RR-(=LV{J6Jv0)}+h5PGUy3D#S~iqPi09LU}kv!>|jq?_tw_}_mg +zg?2h+Ta9TTbX?2=@iqt7`Om$hg8djxX3rWm@EB+ok^c~YcVNVOC*nPoNs@R^WfJ=9 +zfe)4NKm#D^a}1S{;|O1d_~U!*{JoSMNb!?p_MF?E$Ixj3dOE`Q#QE8DvJ`|9=a}$x +zhJ01qlSclgB!AyT%zQenV6#;=>!L^B&ujV9Ai|RI1U%OX8z=M*p)2svGb}nkJ_Muf +zg;NZ+6YP1x2d%Nh4e>-gb1YOsZxK>CKQ~4>bYg|_IX1zeKhk_9575x*9XfTAOa6Aj +zcYWkgscp>pn>$?VGPjAOj{I7RFpp*dDqj3Ymvpk>v8cNo#UW_yPthLzHY=fNyUSa0=-;A?0=Jm~OdI1jBM +zYkDS3Z);Oue61zo*)G)&Q04M>rRi)MJ)NO8C9S2@&tTM7_qV*N6u*Kfmx}(8uJL!Q +z>59hg8p;Xs9+%N5{fuSTxYu1-(-bw-r>nVjBkPs%J@jg@JyEPCYI7?TgDZPaKz;5) +zgV7=y^p+*P-9zss(OwKe>a&~moh#aBUT>AJ@bv6YUGK2=Tdah(_X%z9%8*5j0d`@T +zHS)!24uHAH*ppe!|EJ?fH4Gm(ol5oDS6$k|fMz+xdCkAsA!Z{-y0) +zC)Z~U&a?SrJe^sNV4*uS_P)XRk^||9uoJ`;pZDBe&~syY)*SIX&^Fv4}ywgxCyw_eJFKX^&P($a8>x44{@M*5O}==#3=0>W?cv_i2== +zExi{e;f|8#G3^D#;Cmo?z{_Y~g6=1@avmxv*yvfN8XNcONe0xG*CYHq&2b5D&sKxZ +z^)(0f;!3Y!8IZz1ctTd{-(?^lBu9ww;WGDafObbP!ZAIgA?sz^xh3Tj +zqh{+non9l~z8vd}|37ub72&Y$f|6$N5usn8pi$DwBOykm2rM~&A4Eu2!hXPC9iPF< +z=zKa(Y7WUK{7*)RBw@q%xe=lf7P~U!m64{D!aUTmCn4hbj_?j|hj2-e=fU5RxoaIA +zk_pXM$54F9LG2lmm!=D~Z*8kft+UdQyrG}hkO(Wqf2tweGq%YqD-97n`(OCK68K*U +z{I3N5R|5aHBoL1OMx_t^|F?l1x2$E|(?&TL)a+(C@ZZpjEmzY^rhiONw(L*8kiI#+ +zfu*u#m}P)vG5%M#81A&`zIBcKT$=XNuHnCTPg<_wKd<*$Qt>amr!Bu(Zop6C@7NP1 +zqVi8E>Hh{L5BALBgMTsiWp^wAxDK@>dmR4IBs~~s1Nx;mvlO!wOuv_QC%w95MEcL^ +zJ1u$GM%;zb>DXtM^6;-hrIP4Rc6cq1@sIDnTGm*WS+-g>;=j+gS^~GAw +zqzQQARnHz;UI6nZ%RN9h

~7O7r~+TX{+3i4dr_Sk^?Yj@)%}`N_4$pp+FS +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 +z4k+hWEui*j6`OUk~pOy8+V +z*5v$B^=s;{=fAJt#eMlF_S6pBe4Fm?sQGtWj=Trz>8Z=NmGb=7xX^Oas{fPvp0BCD +zHG11q>i!l@-%+~(_Pd}hu$-O>yY+;TN1twK#c;d!=G<#vY4P3?^p;nq496a*H5^OM +z%!$m*84VNHM^zn66zXze^b(UKH^L>+x>si+B5gc${5JCmE$xf9JUXRMALp@s`ZPUWSzo*jeen+R +zej2HMtkilRZ+LNiqz#qWVAt`vz0O_c?Pz#^{fRwU +zxBhW`*1Z0?^4IHMYqwN2bhOYu&FxJc4ek3oWLq7eojJd#vd9w+*7d_3itaPvGwD9Q +zSm}t+eR25Ay6+-`G!xYLsVaX-QW#%5$`z={Bjjmt2fBnFQ-g0p=RTOkQ)L62i+VKd#_x~ndT|IbH<+=?Ud(Uv0tM7lO +z_x$UA`_qjVp6))?`1FR})7>BW6SRx95^b)xuJM_Q#tu$kd<%Gr-xs5Py~<=4a?cT( +zj^xG0&JF1qyBZH}kf(zK&(01u9@rqCP0adc`!5@5^8~^E6t_*fJ2I>pziSLSe%IJR +zxu0pu)U5IZ$Rx(?$T&UWZyOk8mWwzW3WaLi(|sT9{dhyV7Rw$_hI1BGcCRLWLwvIc +zpKZT0FmKWH^?vM +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 +zv=8~BU@jK9qweNog7-Rxlqs3-huW@)sl2 +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 +zbFgkox%3Z5#vbJG4y +zp(2iYB!B~)kVBeM()dC6nOhw6&B|n9W}Onut3~v`LyTun6*5pk0~^Fa0yw}4DKHkq +zv1Bomv|aR)v+y;T>1eM>J;)CSlf~2c|NfltxS}YRHcVuK8C1}~1vW^7I7k2oq`+91 +z2u=txR)dV)CJFvp3I2NAdfZmrR@|Ks9Erc0IbtGtxNuvEi|i1xlf>(SGth?Ytn~jV +zR(y?n6897wBVHDH=E5x41^Yk@#wE>B!cTx00Z%iZkj6v$EU{877OSv5^Ot{>n8o~) +z12aKjt_0-Ae`FE)#PJVZDO8V~w;vVCCLu1bVk!fHUqsQ5y|_V;vRv2<`9fq}#{32e +zAixGG>T+@I?JQ@^c}_X+nV9pD=cZUhHfvCvUxsmz_o +zXF>wH9FWOcc1T|fipAMj)4Cw&_>JOqc~2(;DU +zheL3b=VNdjPQX!Q$KW`aS>rvhi~8wu3nbtlg+Ng4fPA~I(ZV;V{mEW!^O +zs9**mp}pjqCq}GfgoRO}K}EKX5Qx#v0xBan9y#fv>lS^Eoc%W>my +z6F`V;%EOw+K0JkTn&}g>nCG+Te=^7>%TD}dv|%wk3_ijZV!KS-eEAFoun@eE3lqq< +zO0HA44iht(_i~uOMG?y^HnBxo#1do)^f@7Mk%s5RFiXaTi82mp9E3Z;1v7chhgnbr +z9#}|R8}pP8w}5AXyR(ckNq+)%0~OY>XA3|XIOX1lHZ>Q-3axIlYcq1?-8N`_t&_aa5uwD+FB&grxIhu7S{PQ +z_?O{2c@EeyNi*9?;eli*2Mk2EPNr +z7|Jc7t{~PtB*vCLBoe>_IUvd&5;kx^3eRR-7fh6{44*)H_GO1XON4XU65#+Z&-sLV +zAs1#s6>-ZUO{Re=@~VJxI7Qwk;REP|6ChSUB#z-8ft}C_^-v2z*aDlN3M#-4v%mv3 +z&_KXZ^c;pZ*a=M#gw3!Cs-ObOp%nb^Ff4;2SOSY7lq|$T+yd}HK6oJ)X2DFz0S}~r +z6C98LaiD<;<$m%3KlmUQX2DFz0S`FA0SOQXHqbyo8uP+L`bX|o)-E|OvY*ajZ|%8` +zwIG`HBZhSWSKuCM#XZa1A?Hcvn3?QDYgq$r%wwgjeNO4J4yNJST&%me4p7m#n7yu< +zbUDmH0(~Bt&n(uibr=FXgV61xZ?QJEfeG1AC}7`{b1h{cd?qN!hJcy4DwGnp914&X +zfrq#r{^2Fbm=!4O}o0G9e3`LH1JQy9tiTwYrKqlQPvq1LOoPq6N2&y`BfZ +z2iG>5xuAu%<^9+!_k^xw@jK!ihfMm;L^#g;*a=-=vk_n2ak;qTSHtBYkpKC=#)yM| +zA1oHH8#IwM=LGrgcbmna|DXy5(qf{(Zz9bfS(4Eegj%SFCV2Bp$&vSCNKzF7QAubW(;c_%vVfY%wEepJ=XUo#c#U +zG90(96rJz^oP-mw35doy<4Umwg7Wz)Ec7wuyPh+sU+~_>x+rKH;ZGL9`Q$@hN3iKk +z);lqj_j267k>6PAs>!&#EADV9;;?LQ<_Hzn%${x{?-3r^hub)RV4sltIQ@lZXEpu! +z6^>?BvtFSuzC2mPA0~fiu{i!AVZUGrBA&`za}-;<(1O19da|7j!K~ml#i-ZS*-@ +zr;E0jKzYbtx?PY!d?p1^gzJYY2tq3y1rMlB&NjdXF3RG8(#w{MZVv7|>}zviCitNg +z%E1Yt52@1x_EZmI%RNGz=w@l9o?c<(QtkH2(IIndr7rU5K{80Nt@~18n6^n?% +zwoz@=`LB%MQfvZgP>Wr+K??8q$AavoDdPvQkp5TzrH~7)lv6CA9<< +zw54od5fVjm9uZw0=S1oSHW1?dP{-E^!ZY`N%fu!0C&+?K5bu5-nS$$tG#D#oVz@ZM +zxza?=m;C4}l{(*iYO4PZ#tHcs-A)-6k_HlZ?pjP<;97*e@1*bGil5L{-7Cal%6t?$ +zVeAh-7KbmcHzztNs%eQBJGVP~i&Dtk!d?;DXt2>ZQz77>`*ij8SATgB6BWOY*Rd*>8wSKipO>f@AgfK=OkyU +znazr)fafK+nYc5Nm*aNQZXO7=36Y7dTd~FS^eO+3=tGiaP)MA6h+9NEE~Q;~Zsj=_ +zzw18w6lr!s8|;ILlw+ccGd0{4T<5)%k+ebL`tPT$c`oAFhQAB8G$@`{$|4>>28Yn` +z^L;whp3l!71f@`T7?y?g13 +zwW5mW$DtGUV5bxyD +zw6(K4TW%?ivS0i#*5tVioi7oO{>MqKygB*?r#tiqWG7(fA+wmZC&IJv#RyLd<#EDT +zFiAtTtqpy>O7L%O$j|;{XOf93MT-qE?2saczy!Y{GGHQ1g8K-|fX(P$NZwrAh_=5o +zKcLfN>dyY;K=Yqe=Dzy36i+el_`aVho**uk%(gR@F2Ri?O)l|gfp=(#z63vw@FYOd +z7?UR#Sp^(}g&SF`As=SJV#om>=; +zU7IXi$i||pNUndh{bBqO;xL2dFz2+KQ?O@nc#1^=WSUp8p05&}#K|WtLIjBy6pCQ( +zhr!|z?k*nTuE(Q912>a|NnMYKDBuJk!USgVC9T9dqNhKjWUt~*MCMDGCcz>6o=%JS +z8a%^!*Kly22&dpAIFKbk=t(-2N>gd}7$MA2) +z4MN&`*bKJ=UsApR!gRWb~^;0&CFui+$!ThT9F#)ekE +zN?6&qXdu=ni!|D5EVQxLRgfuiKjT~_T;yZn*}`*{LcMth5OVKmTE&Gn_XyO*)249t +zOCJIaA}EgnW{8A1`HUX3d6noQe%m*zL%Gwj!6969e;)*U#iQ>r7vT33)(T$yMKbIo +z`jF{SF$^6KeyND%a369L{bVSNf(eiTqhT0CfEz}F0z<$BPOyQ1IP^uLrxhD6z#Yo- +zBHW8`7vlcMqwJG#ClfacE`fNs0xWPTTnsAZJBsZzSWDR+B+Z?$4gR|%S*%?{x>D*- +z+&D;qiSXaZt|?0vKY?xd6Un!jH1!gm&yu#Bvze3V4|Kn>nl90-K-}c0v=>LOleb06k{xGX%F3*AJUv3v7aNr~o(NE|?5g +zz$D0k2`~yq!{$#|ZvvbVKoR(%3S8iUT*yI}2lBxOUKmMQCtL!T!WdXh`Iq84v4Lj> +z>vay}iG7BP_%X=uhrtjH!c;6~%J-raA%?kF0$SMbi&e}ct9Zx4mFKmff(AB-gTu_- +zCnX8MyFiFLwUepxRcn>Vlxd%atH85L_;}9oGq#xD{8oz?#Qmv1Tkd?A%@{jHa{NFL +za-jf@5$`yNdJAVd%oF%Kp&Uw~0;*sWY=$imgj%SFCTNA7unUgD5!eT9a0m`d|6uB? +zkxx2f9aQ`dD2B0+2KnFvrIY;-t`lq!2O5|`fX76euwPqQ`@D5|2i~IK%BgOlF`NJr6W+)WHI;{cLk2rWq +zg!mI}@%j&+2{{^tu;b55+Yu^d4^|EpPz8SWcWrWy7qv<#2kCc^3q`P*@~bJ_v4aLS +zNP~P3+_`vhb72-%WbHf!F+AH~D8#{8 +zWbwEOpkL^UuS2=l5C?+vSwD1L&HfO&@V7w`ejA9dvAOvyJxGL}j_25(G;NSOlm0{g +zRWL4A5v{ntr5m<|gt#t}cMxbIP8HbbXZ7=CKgc1 +z@Kjx%J1DzLh_}t8mn$MWK{kfHIw|_L} +b4F2C~4_;jUw%c04m4Mu7{r~pwLDT;MxmF=) + +literal 0 +HcmV?d00001 + +diff --git a/target/linux/ipq807x/base-files/lib/upgrade/platform.sh b/target/linux/ipq807x/base-files/lib/upgrade/platform.sh +new file mode 100755 +index 0000000000..4943b6c406 +--- /dev/null ++++ b/target/linux/ipq807x/base-files/lib/upgrade/platform.sh +@@ -0,0 +1,66 @@ ++. /lib/functions/system.sh ++ ++qca_do_upgrade() { ++ local tar_file="$1" ++ ++ local board_dir=$(tar tf $tar_file | grep -m 1 '^sysupgrade-.*/$') ++ board_dir=${board_dir%/} ++ local dev=$(find_mtd_chardev "0:HLOS") ++ ++ tar Oxf $tar_file ${board_dir}/kernel | mtd write - ${dev} ++ ++ if [ -n "$UPGRADE_BACKUP" ]; then ++ tar Oxf $tar_file ${board_dir}/root | mtd -j "$UPGRADE_BACKUP" write - rootfs ++ else ++ tar Oxf $tar_file ${board_dir}/root | mtd write - rootfs ++ fi ++} ++ ++platform_check_image() { ++ local magic_long="$(get_magic_long "$1")" ++ board=$(board_name) ++ case $board in ++ cig,wf188|\ ++ cig,wf188n|\ ++ cig,wf194c|\ ++ edgecore,eap101|\ ++ edgecore,eap102|\ ++ edgecore,eap106|\ ++ tplink,ex227|\ ++ tplink,ex447|\ ++ qcom,ipq6018-cp01|\ ++ qcom,ipq807x-hk01|\ ++ qcom,ipq807x-hk14) ++ [ "$magic_long" = "73797375" ] && return 0 ++ ;; ++ esac ++ return 1 ++} ++ ++platform_do_upgrade() { ++ CI_UBIPART="rootfs" ++ CI_ROOTPART="ubi_rootfs" ++ CI_IPQ807X=1 ++ ++ board=$(board_name) ++ case $board in ++ cig,wf188) ++ qca_do_upgrade $1 ++ ;; ++ cig,wf188n|\ ++ cig,wf194c|\ ++ qcom,ipq6018-cp01|\ ++ qcom,ipq807x-hk01|\ ++ qcom,ipq807x-hk14|\ ++ tplink,ex447|\ ++ tplink,ex227) ++ nand_upgrade_tar "$1" ++ ;; ++ edgecore,eap106|\ ++ edgecore,eap102|\ ++ edgecore,eap101) ++ CI_UBIPART="rootfs1" ++ nand_upgrade_tar "$1" ++ ;; ++ esac ++} +diff --git a/target/linux/ipq807x/config-4.4 b/target/linux/ipq807x/config-4.4 +new file mode 100644 +index 0000000000..1b4b95b968 +--- /dev/null ++++ b/target/linux/ipq807x/config-4.4 +@@ -0,0 +1,828 @@ ++# CONFIG_AHCI_IPQ is not set ++CONFIG_ALIGNMENT_TRAP=y ++# CONFIG_ALLOW_DEV_COREDUMP is not set ++# CONFIG_AMBA_PL08X is not set ++# CONFIG_APM_EMULATION is not set ++# CONFIG_APQ_GCC_8084 is not set ++# CONFIG_APQ_MMCC_8084 is not set ++# CONFIG_AR8216_PHY is not set ++CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y ++CONFIG_ARCH_HAS_ELF_RANDOMIZE=y ++CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y ++CONFIG_ARCH_HAS_SG_CHAIN=y ++CONFIG_ARCH_HAS_TICK_BROADCAST=y ++CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y ++# CONFIG_ARCH_IPQ40XX is not set ++# CONFIG_ARCH_IPQ806x is not set ++# CONFIG_ARCH_IPQ807x is not set ++# CONFIG_ARCH_IPQ6018 is not set ++# CONFIG_ARCH_IPQ5018 is not set ++CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y ++# CONFIG_ARCH_MSM8960 is not set ++# CONFIG_ARCH_MSM8974 is not set ++CONFIG_ARCH_MSM8X60=y ++CONFIG_ARCH_MULTIPLATFORM=y ++# CONFIG_ARCH_MULTI_CPU_AUTO is not set ++CONFIG_ARCH_MULTI_V6_V7=y ++CONFIG_ARCH_MULTI_V7=y ++CONFIG_ARCH_NR_GPIO=0 ++CONFIG_ARCH_QCOM=y ++CONFIG_QSEECOM=m ++# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set ++# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set ++CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y ++CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y ++CONFIG_ARCH_SUPPORTS_UPROBES=y ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++CONFIG_ARCH_USE_BUILTIN_BSWAP=y ++CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y ++CONFIG_ARCH_WANT_GENERAL_HUGETLB=y ++CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y ++CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y ++CONFIG_ARM=y ++CONFIG_ARM_AMBA=y ++CONFIG_ARM_ARCH_TIMER=y ++CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y ++# CONFIG_ARM_ATAG_DTB_COMPAT is not set ++CONFIG_ARM_CCI=y ++CONFIG_ARM_CCI400_COMMON=y ++CONFIG_ARM_CCI400_PMU=y ++CONFIG_ARM_CCI_PMU=y ++CONFIG_ARM_CPU_SUSPEND=y ++CONFIG_ARM_GIC=y ++CONFIG_ARM_HAS_SG_CHAIN=y ++# CONFIG_ARM_HIGHBANK_CPUIDLE is not set ++CONFIG_ARM_CPUIDLE=y ++CONFIG_ARM_L1_CACHE_SHIFT=6 ++CONFIG_ARM_L1_CACHE_SHIFT_6=y ++# CONFIG_ARM_LPAE is not set ++CONFIG_ARM_MODULE_PLTS=y ++CONFIG_ARM_PATCH_PHYS_VIRT=y ++CONFIG_ARM_PMU=y ++CONFIG_ARM_PSCI=y ++CONFIG_ARM_PSCI_FW=y ++CONFIG_ARM_QCOM_CPUFREQ=y ++# CONFIG_ARM_SMMU is not set ++# CONFIG_ARM_SP805_WATCHDOG is not set ++CONFIG_ARM_THUMB=y ++# CONFIG_ARM_THUMBEE is not set ++CONFIG_ARM_UNWIND=y ++CONFIG_ARM_VIRT_EXT=y ++CONFIG_AT803X_PHY=y ++# CONFIG_ATA is not set ++CONFIG_BLK_DEV_LOOP=y ++CONFIG_BLK_DEV_NVME=y ++CONFIG_BLK_DEV_RAM=y ++CONFIG_BLK_DEV_RAM_COUNT=16 ++CONFIG_BLK_DEV_RAM_SIZE=4096 ++# CONFIG_VIRTIO_BLK is not set ++# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set ++CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 ++CONFIG_BOUNCE=y ++CONFIG_BUILD_BIN2C=y ++# CONFIG_CNSS_QCN9000 is not set ++# CONFIG_CNSS2 is not set ++# CONFIG_CNSS2_GENL is not set ++# CONFIG_CNSS2_DEBUG is not set ++# CONFIG_CNSS2_PM is not set ++# CONFIG_CNSS2_PCI_DRIVER is not set ++# CONFIG_CNSS2_CALIBRATION_SUPPORT is not set ++# CONFIG_CNSS2_SMMU is not set ++# CONFIG_CNSS2_RAMDUMP is not set ++# CONFIG_CACHE_L2X0 is not set ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_CC_STACKPROTECTOR=y ++# CONFIG_CC_STACKPROTECTOR_NONE is not set ++CONFIG_CC_STACKPROTECTOR_REGULAR=y ++# CONFIG_CHARGER_QCOM_SMBB is not set ++CONFIG_CLEANCACHE=y ++CONFIG_CLKDEV_LOOKUP=y ++CONFIG_CLKSRC_OF=y ++CONFIG_CLKSRC_PROBE=y ++CONFIG_CLKSRC_QCOM=y ++CONFIG_CLONE_BACKWARDS=y ++CONFIG_COMMON_CLK=y ++CONFIG_COMMON_CLK_QCOM=y ++CONFIG_CONFIGFS_FS=y ++CONFIG_COREDUMP=y ++# CONFIG_CORESIGHT is not set ++# CONFIG_CORESIGHT_CSR is not set ++# CONFIG_CORESIGHT_CTI is not set ++# NFIG_CORESIGHT_EVENT is not set ++# CONFIG_CORESIGHT_HWEVENT is not set ++# CONFIG_CORESIGHT_LINKS_AND_SINKS is not set ++# CONFIG_CORESIGHT_LINK_AND_SINK_TMC is not set ++# CONFIG_CORESIGHT_QCOM_REPLICATOR is not set ++# CONFIG_CORESIGHT_QPDI is not set ++# CONFIG_CORESIGHT_SINK_ETBV10 is not set ++# CONFIG_CORESIGHT_SINK_TPIU is not set ++# CONFIG_CORESIGHT_SOURCE_DUMMY is not set ++# CONFIG_CORESIGHT_SOURCE_ETM3X is not set ++# CONFIG_CORESIGHT_SOURCE_ETM4X is not set ++# CONFIG_CORESIGHT_REMOTE_ETM is not set ++# CONFIG_CORESIGHT_STM is not set ++# CONFIG_CORESIGHT_TPDA is not set ++# CONFIG_CORESIGHT_TPDM is not set ++# CONFIG_CORESIGHT_TPDM_DEFAULT_ENABLE is not set ++# CONFIG_CORESIGHT_STREAM is not set ++CONFIG_CPUFREQ_DT=y ++CONFIG_CPUFREQ_DT_PLATDEV=y ++CONFIG_CPU_32v6K=y ++CONFIG_CPU_32v7=y ++CONFIG_CPU_ABRT_EV7=y ++# CONFIG_CPU_BIG_ENDIAN is not set ++# CONFIG_CPU_BPREDICT_DISABLE is not set ++CONFIG_CPU_CACHE_V7=y ++CONFIG_CPU_CACHE_VIPT=y ++CONFIG_CPU_COPY_V6=y ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++# CONFIG_CPU_SW_DOMAIN_PAN is not set ++CONFIG_CPU_FREQ=y ++CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y ++CONFIG_CPU_FREQ_GOV_COMMON=y ++CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y ++CONFIG_CPU_FREQ_GOV_ONDEMAND=y ++CONFIG_CPU_FREQ_GOV_PERFORMANCE=y ++CONFIG_CPU_FREQ_GOV_POWERSAVE=y ++CONFIG_CPU_FREQ_GOV_USERSPACE=y ++CONFIG_CPU_FREQ_STAT=y ++CONFIG_CPU_HAS_ASID=y ++# CONFIG_CPU_ICACHE_DISABLE is not set ++CONFIG_CPU_IDLE=y ++CONFIG_CPU_IDLE_GOV_LADDER=y ++CONFIG_CPU_IDLE_GOV_MENU=y ++CONFIG_CPU_PABRT_V7=y ++CONFIG_CPU_PM=y ++CONFIG_CPU_RMAP=y ++# CONFIG_CPU_THERMAL is not set ++CONFIG_CPU_TLB_V7=y ++CONFIG_CPU_V7=y ++CONFIG_CRC16=y ++# CONFIG_CRC32_SARWATE is not set ++CONFIG_CRC32_SLICEBY8=y ++CONFIG_CROSS_MEMORY_ATTACH=y ++# CONFIG_CRYPTO_DEV_QCOM_MSM_QCE is not set ++# CONFIG_CRYPTO_DEV_OTA_CRYPTO is not set ++# CONFIG_FIPS_ENABLE is not set ++CONFIG_CRYPTO_AEAD=y ++CONFIG_CRYPTO_AEAD2=y ++CONFIG_CRYPTO_BLKCIPHER=y ++CONFIG_CRYPTO_BLKCIPHER2=y ++CONFIG_CRYPTO_CBC=y ++CONFIG_CRYPTO_CCM=y ++CONFIG_CRYPTO_CRC32C=y ++CONFIG_CRYPTO_CTR=y ++CONFIG_CRYPTO_DEFLATE=y ++CONFIG_CRYPTO_CMAC=y ++# CONFIG_CRYPTO_DEV_QCOM_ICE is not set ++CONFIG_CRYPTO_ECHAINIV=y ++CONFIG_CRYPTO_ECB=y ++CONFIG_CRYPTO_HASH2=y ++CONFIG_CRYPTO_HASH_INFO=y ++CONFIG_CRYPTO_HW=y ++CONFIG_CRYPTO_LZO=y ++CONFIG_CRYPTO_MANAGER=y ++CONFIG_CRYPTO_MANAGER2=y ++CONFIG_CRYPTO_NULL=y ++CONFIG_CRYPTO_RNG=y ++CONFIG_CRYPTO_RNG2=y ++CONFIG_CRYPTO_SEQIV=y ++CONFIG_CRYPTO_SHA256=y ++CONFIG_CRYPTO_WORKQUEUE=y ++CONFIG_CRYPTO_XZ=y ++CONFIG_CRYPTO_ARC4=y ++CONFIG_CRYPTO_GCM=y ++CONFIG_DCACHE_WORD_ACCESS=y ++CONFIG_DEBUG_BUGVERBOSE=y ++CONFIG_DEBUG_GPIO=y ++# CONFIG_DEBUG_INFO_REDUCED is not set ++CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S" ++# CONFIG_DEBUG_MEM_USAGE is not set ++# CONFIG_DEBUG_UART_8250 is not set ++# CONFIG_DEBUG_USER is not set ++CONFIG_DECOMPRESS_GZIP=y ++CONFIG_DEVMEM=y ++# CONFIG_DIAG_OVER_USB is not set ++CONFIG_DMADEVICES=y ++CONFIG_DMA_ENGINE=y ++CONFIG_DMA_OF=y ++CONFIG_DMA_VIRTUAL_CHANNELS=y ++CONFIG_DTC=y ++# CONFIG_DWMAC_GENERIC is not set ++# CONFIG_DWMAC_IPQ806X is not set ++# CONFIG_DWMAC_SUNXI is not set ++# CONFIG_DW_DMAC_PCI is not set ++# CONFIG_VHOST_NET is not set ++# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set ++CONFIG_DYNAMIC_DEBUG=y ++CONFIG_ETHERNET_PACKET_MANGLE=y ++CONFIG_EXT4_FS=y ++# CONFIG_EXT4_USE_FOR_EXT2 is not set ++CONFIG_FB=y ++CONFIG_FB_CFB_COPYAREA=y ++CONFIG_FB_CFB_FILLRECT=y ++CONFIG_FB_CFB_IMAGEBLIT=y ++CONFIG_FB_CMDLINE=y ++CONFIG_FB_QCOM_QPIC=y ++CONFIG_FB_QCOM_QPIC_ER_SSD1963_PANEL=y ++CONFIG_FB_SYS_FOPS=y ++CONFIG_FIXED_PHY=y ++CONFIG_FIX_EARLYCON_MEM=y ++CONFIG_FS_MBCACHE=y ++CONFIG_GENERIC_ALLOCATOR=y ++CONFIG_GENERIC_BUG=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y ++# CONFIG_GENERIC_CPUFREQ_KRAIT is not set ++CONFIG_GENERIC_IDLE_POLL_SETUP=y ++CONFIG_GENERIC_IO=y ++CONFIG_GENERIC_IRQ_SHOW=y ++CONFIG_GENERIC_IRQ_SHOW_LEVEL=y ++CONFIG_GENERIC_MSI_IRQ=y ++CONFIG_GENERIC_PCI_IOMAP=y ++CONFIG_GENERIC_PHY=y ++CONFIG_GENERIC_PINCONF=y ++CONFIG_GENERIC_SCHED_CLOCK=y ++CONFIG_GENERIC_SMP_IDLE_THREAD=y ++CONFIG_GENERIC_STRNCPY_FROM_USER=y ++CONFIG_GENERIC_STRNLEN_USER=y ++CONFIG_GENERIC_TIME_VSYSCALL=y ++CONFIG_GPIOLIB=y ++CONFIG_GPIOLIB_IRQCHIP=y ++CONFIG_GPIO_DEVRES=y ++# CONFIG_GPIO_LATCH is not set ++# CONFIG_GPIO_NXP_74HC153 is not set ++CONFIG_GPIO_SYSFS=y ++CONFIG_HANDLE_DOMAIN_IRQ=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_HAS_DMA=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT_MAP=y ++# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set ++CONFIG_HAVE_ARCH_AUDITSYSCALL=y ++CONFIG_HAVE_ARCH_BITREVERSE=y ++CONFIG_HAVE_ARCH_JUMP_LABEL=y ++CONFIG_HAVE_ARCH_KGDB=y ++CONFIG_HAVE_ARCH_PFN_VALID=y ++CONFIG_HAVE_ARCH_SECCOMP_FILTER=y ++CONFIG_HAVE_ARCH_TRACEHOOK=y ++CONFIG_HAVE_ARM_ARCH_TIMER=y ++# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set ++CONFIG_HAVE_BPF_JIT=y ++CONFIG_HAVE_CC_STACKPROTECTOR=y ++CONFIG_HAVE_CLK=y ++CONFIG_HAVE_CLK_PREPARE=y ++CONFIG_HAVE_CONTEXT_TRACKING=y ++CONFIG_HAVE_C_RECORDMCOUNT=y ++CONFIG_HAVE_DEBUG_KMEMLEAK=y ++CONFIG_HAVE_DMA_API_DEBUG=y ++CONFIG_HAVE_DMA_ATTRS=y ++CONFIG_HAVE_DMA_CONTIGUOUS=y ++CONFIG_HAVE_DYNAMIC_FTRACE=y ++CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y ++CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y ++CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y ++CONFIG_HAVE_FUNCTION_TRACER=y ++# CONFIG_SRD_TRACE is not set ++CONFIG_HAVE_GENERIC_DMA_COHERENT=y ++CONFIG_HAVE_HW_BREAKPOINT=y ++CONFIG_HAVE_IDE=y ++CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y ++CONFIG_HAVE_KERNEL_GZIP=y ++CONFIG_HAVE_KERNEL_LZ4=y ++CONFIG_HAVE_KERNEL_LZMA=y ++CONFIG_HAVE_KERNEL_LZO=y ++CONFIG_HAVE_KERNEL_XZ=y ++# CONFIG_HAVE_KPROBES is not set ++# CONFIG_HAVE_KRETPROBES is not set ++CONFIG_HAVE_MEMBLOCK=y ++CONFIG_HAVE_MOD_ARCH_SPECIFIC=y ++CONFIG_HAVE_NET_DSA=y ++CONFIG_HAVE_OPROFILE=y ++# CONFIG_HAVE_OPTPROBES is not set ++CONFIG_HAVE_PERF_EVENTS=y ++CONFIG_HAVE_PERF_REGS=y ++CONFIG_HAVE_PERF_USER_STACK_DUMP=y ++CONFIG_HAVE_PROC_CPU=y ++CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y ++CONFIG_HAVE_SMP=y ++CONFIG_HAVE_SYSCALL_TRACEPOINTS=y ++CONFIG_HAVE_UID16=y ++CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y ++CONFIG_HIGHMEM=y ++CONFIG_HIGHPTE=y ++CONFIG_HOTPLUG_CPU=y ++CONFIG_HWMON=y ++CONFIG_HWSPINLOCK=y ++CONFIG_HWSPINLOCK_QCOM=y ++CONFIG_HW_RANDOM=y ++CONFIG_HW_RANDOM_MSM=y ++CONFIG_HZ_FIXED=0 ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++CONFIG_I2C_CHARDEV=y ++CONFIG_I2C_COMPAT=y ++CONFIG_I2C_HELPER_AUTO=y ++CONFIG_I2C_QUP=y ++# CONFIG_IIO is not set ++# CONFIG_IIO_BUFFER is not set ++# CONFIG_IIO_TRIGGER is not set ++CONFIG_IKCONFIG=y ++CONFIG_IKCONFIG_PROC=y ++CONFIG_INITRAMFS_SOURCE="" ++# CONFIG_INPUT_PM8941_PWRKEY is not set ++CONFIG_IOMMU_HELPER=y ++# CONFIG_IOMMU_IO_PGTABLE_LPAE is not set ++# CONFIG_IPQ_DWC3_QTI_EXTCON is not set ++# CONFIG_IPQ_GCC_4019 is not set ++# CONFIG_IPQ_GCC_5018 is not set ++# CONFIG_IPQ_APSS_5018 is not set ++# CONFIG_IPQ_GCC_6018 is not set ++# CONFIG_IPQ_APSS_6018 is not set ++# CONFIG_IPQ_GCC_806X is not set ++# CONFIG_IPQ_ADSS_807x is not set ++# CONFIG_IPQ_APSS_807x is not set ++# CONFIG_IPQ_GCC_807x is not set ++# CONFIG_IPQ_ADCC_4019 is not set ++# CONFIG_IPQ_LCC_806X is not set ++# CONFIG_IPQ_REMOTEPROC_ADSP is not set ++# CONFIG_IPQ_SUBSYSTEM_RESTART is not set ++# CONFIG_IPQ_SUBSYSTEM_RESTART_TEST is not set ++CONFIG_IRQCHIP=y ++CONFIG_IRQ_DOMAIN=y ++CONFIG_IRQ_DOMAIN_HIERARCHY=y ++CONFIG_IRQ_FORCED_THREADING=y ++CONFIG_IRQ_WORK=y ++CONFIG_JBD2=y ++# CONFIG_IPC_ROUTER is not set ++# CONFIG_IPC_ROUTER_SECURITY is not set ++# CONFIG_IPC_LOGGING is not set ++CONFIG_KPSS_XCC=y ++# CONFIG_KRAITCC is not set ++# CONFIG_KRAIT_CLOCKS is not set ++# CONFIG_KRAIT_L2_ACCESSORS is not set ++CONFIG_LEDS_IPQ=y ++CONFIG_LEDS_TLC591XX=y ++# CONFIG_LEDS_PCA9956B is not set ++CONFIG_LIBFDT=y ++CONFIG_LOCKUP_DETECTOR=y ++CONFIG_LOCK_SPIN_ON_OWNER=y ++CONFIG_LZO_COMPRESS=y ++CONFIG_LZO_DECOMPRESS=y ++CONFIG_MDIO=y ++CONFIG_MDIO_BITBANG=y ++CONFIG_MDIO_BOARDINFO=y ++CONFIG_MDIO_GPIO=y ++# CONFIG_MDIO_QCA is not set ++CONFIG_MFD_QCOM_RPM=y ++CONFIG_MFD_SPMI_PMIC=y ++# CONFIG_SLIMBUS is not set ++# CONFIG_SLIMBUS_MSM_CTRL is not set ++# CONFIG_SLIMBUS_MSM_NGD is not set ++# CONFIG_OF_SLIMBUS is not set ++CONFIG_MFD_SYSCON=y ++CONFIG_MIGHT_HAVE_CACHE_L2X0=y ++CONFIG_MIGHT_HAVE_PCI=y ++CONFIG_MMC=y ++CONFIG_MMC_ARMMMCI=y ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_MINORS=32 ++CONFIG_MMC_QCOM_DML=y ++CONFIG_MMC_QCOM_TUNING=y ++CONFIG_MMC_SDHCI=y ++CONFIG_MMC_SDHCI_MSM=y ++# CONFIG_MMC_SDHCI_OF_ARASAN is not set ++# CONFIG_MMC_SDHCI_PCI is not set ++CONFIG_MMC_SDHCI_PLTFM=y ++# CONFIG_MMC_TIFM_SD is not set ++CONFIG_MODULES_TREE_LOOKUP=y ++CONFIG_MODULES_USE_ELF_REL=y ++# CONFIG_MPLS_ROUTING is not set ++# CONFIG_MSM_GCC_8660 is not set ++# CONFIG_MSM_GCC_8916 is not set ++# CONFIG_MSM_GCC_8960 is not set ++# CONFIG_MSM_GCC_8974 is not set ++# CONFIG_MSM_LCC_8960 is not set ++# CONFIG_MSM_MMCC_8960 is not set ++# CONFIG_MSM_MMCC_8974 is not set ++# CONFIG_MSM_MHI is not set ++# CONFIG_MSM_IPC_ROUTER_MHI_XPRT is not set ++# CONFIG_MSM_MHI_DEBUG is not set ++# CONFIG_MSM_MHI_DEV is not set ++# CONFIG_MSM_MHI_UCI is not set ++# CONFIG_DIAGFWD_BRIDGE_CODE is not set ++# CONFIG_MSM_BUS_SCALING is not set ++# CONFIG_BUS_TOPOLOGY_ADHOC is not set ++# CONFIG_QPNP_REVID is not set ++# CONFIG_SPS is not set ++# CONFIG_SPS_SUPPORT_NDP_BAM is not set ++# CONFIG_USB_BAM is not set ++# CONFIG_SPS_SUPPORT_BAMDMA is not set ++# CONFIG_IPA is not set ++# CONFIG_IPA3 is not set ++# CONFIG_EP_PCIE is not set ++# CONFIG_GSI is not set ++# CONFIG_PFT is not set ++# CONFIG_SEEMP_CORE is not set ++# CONFIG_GPIO_USB_DETECT is not set ++# CONFIG_MSM_GLINK is not set ++# CONFIG_MSM_GLINK_LOOPBACK_SERVER is not set ++# CONFIG_MSM_GLINK_SMEM_NATIVE_XPRT is not set ++# CONFIG_MSM_GLINK_PKT is not set ++# CONFIG_MSM_IPC_ROUTER_GLINK_XPRT is not set ++# CONFIG_MSM_QMI_INTERFACE is not set ++# CONFIG_MSM_TEST_QMI_CLIENT is not set ++# CONFIG_GLINK_DEBUG_FS is not set ++# CONFIG_MSM_RPM_SMD is not set ++# CONFIG_MSM_RPM_GLINK is not set ++CONFIG_MSM_RPM_LOG=y ++# CONFIG_MSM_SMEM is not set ++CONFIG_MTD_CMDLINE_PARTS=y ++CONFIG_MTD_M25P80=y ++CONFIG_MTD_NAND=y ++CONFIG_MTD_NAND_ECC=y ++CONFIG_MTD_NAND_QCOM=y ++CONFIG_MTD_QCOM_SMEM_PARTS=y ++CONFIG_MTD_SPINAND_GIGADEVICE=y ++CONFIG_MTD_SPINAND_MT29F=y ++CONFIG_MTD_SPINAND_ONDIEECC=y ++CONFIG_MTD_SPI_NOR=y ++CONFIG_MTD_SPLIT_FIRMWARE=y ++CONFIG_MTD_SPLIT_FIT_FW=y ++CONFIG_MTD_UBI=y ++CONFIG_MTD_UBI_BEB_LIMIT=20 ++CONFIG_MTD_UBI_BLOCK=y ++# CONFIG_MTD_UBI_FASTMAP is not set ++CONFIG_MTD_UBI_GLUEBI=y ++CONFIG_MTD_UBI_WL_THRESHOLD=4096 ++CONFIG_MULTI_IRQ_HANDLER=y ++CONFIG_MUTEX_SPIN_ON_OWNER=y ++CONFIG_NEED_DMA_MAP_STATE=y ++CONFIG_NEON=y ++CONFIG_NET=y ++# CONFIG_NET_DSA_MV88E6063 is not set ++CONFIG_NET_FLOW_LIMIT=y ++CONFIG_NET_PTP_CLASSIFY=y ++CONFIG_NO_BOOTMEM=y ++CONFIG_NO_HZ=y ++CONFIG_NO_HZ_COMMON=y ++CONFIG_NO_HZ_IDLE=y ++CONFIG_NR_CPUS=4 ++CONFIG_NUM_ALT_PARTITION=8 ++CONFIG_NVMEM=y ++CONFIG_OF=y ++CONFIG_OF_ADDRESS=y ++CONFIG_OF_ADDRESS_PCI=y ++CONFIG_OF_EARLY_FLATTREE=y ++CONFIG_OF_FLATTREE=y ++CONFIG_OF_GPIO=y ++CONFIG_OF_IRQ=y ++CONFIG_OF_MDIO=y ++CONFIG_OF_MTD=y ++CONFIG_OF_NET=y ++CONFIG_OF_PCI=y ++CONFIG_OF_PCI_IRQ=y ++CONFIG_OF_RESERVED_MEM=y ++CONFIG_OLD_SIGACTION=y ++CONFIG_OLD_SIGSUSPEND3=y ++CONFIG_PAGE_OFFSET=0xC0000000 ++CONFIG_PANIC_ON_OOPS=y ++CONFIG_PANIC_ON_OOPS_VALUE=1 ++CONFIG_PANIC_TIMEOUT=5 ++CONFIG_PCI=y ++# CONFIG_PCIEAER is not set ++CONFIG_PCIE_DW=y ++# CONFIG_PCIE_DW_PLAT is not set ++CONFIG_PCIE_PME=y ++CONFIG_PCIE_QCOM=y ++CONFIG_PCI_DOMAINS=y ++CONFIG_PCI_DOMAINS_GENERIC=y ++CONFIG_PCI_MSI=y ++CONFIG_PERF_EVENTS=y ++CONFIG_PERF_USE_VMALLOC=y ++CONFIG_PGTABLE_LEVELS=2 ++CONFIG_PHYLIB=y ++# CONFIG_PHY_IPQ_BALDUR_USB is not set ++# CONFIG_PHY_IPQ_UNIPHY_USB is not set ++# CONFIG_PHY_QCOM_APQ8064_SATA is not set ++# CONFIG_PHY_QCOM_IPQ806X_SATA is not set ++CONFIG_PHY_QCA_PCIE_QMP=y ++# CONFIG_PHY_QCOM_UFS is not set ++# CONFIG_PHY_IPQ_UNIPHY_PCIE is not set ++CONFIG_PINCTRL=y ++# CONFIG_PINCTRL_APQ8064 is not set ++# CONFIG_PINCTRL_APQ8084 is not set ++# CONFIG_PINCTRL_IPQ4019 is not set ++# CONFIG_PINCTRL_IPQ6018 is not set ++# CONFIG_PINCTRL_IPQ8064 is not set ++# CONFIG_PINCTRL_IPQ807x is not set ++# CONFIG_PINCTRL_IPQ5018 is not set ++CONFIG_PINCTRL_MSM=y ++# CONFIG_PINCTRL_MSM8660 is not set ++# CONFIG_PINCTRL_MSM8916 is not set ++# CONFIG_PINCTRL_MSM8960 is not set ++CONFIG_PINCTRL_QCOM_SPMI_PMIC=y ++# CONFIG_PINCTRL_QCOM_SSBI_PMIC is not set ++# CONFIG_PL330_DMA is not set ++CONFIG_PM=y ++CONFIG_PM_CLK=y ++# CONFIG_PM_DEBUG is not set ++CONFIG_PM_GENERIC_DOMAINS=y ++CONFIG_PM_GENERIC_DOMAINS_OF=y ++CONFIG_PM_GENERIC_DOMAINS_SLEEP=y ++CONFIG_PM_OPP=y ++CONFIG_PM_SLEEP=y ++CONFIG_PM_SLEEP_SMP=y ++CONFIG_POWER_RESET=y ++CONFIG_POWER_RESET_MSM=y ++CONFIG_POWER_SUPPLY=y ++CONFIG_PREEMPT=y ++CONFIG_PREEMPT_COUNT=y ++# CONFIG_PREEMPT_NONE is not set ++CONFIG_PREEMPT_RCU=y ++CONFIG_PRINTK_TIME=y ++CONFIG_PROC_PAGE_MONITOR=y ++# CONFIG_PROC_STRIPPED is not set ++CONFIG_PSTORE=y ++CONFIG_PSTORE_RAM=y ++# CONFIG_PSTORE_CONSOLE is not set ++# CONFIG_PSTORE_PMSG is not set ++CONFIG_PWM=y ++# CONFIG_PWM_IPQ4019 is not set ++# CONFIG_PWM_PCA9685 is not set ++CONFIG_PWM_SYSFS=y ++CONFIG_QCOM_ADM=y ++# CONFIG_QCOM_APM is not set ++CONFIG_QCOM_BAM_DMA=y ++# CONFIG_QTI_BT_TTY is not set ++# CONFIG_QCOM_COINCELL is not set ++# CONFIG_QCOM_DCC is not set ++CONFIG_QCOM_GDSC=y ++CONFIG_QCOM_GSBI=y ++# CONFIG_QCOM_HFPLL is not set ++# CONFIG_QCOM_MEMORY_DUMP_V2 is not set ++# CONFIG_QCOM_MDT_LOADER is not set ++CONFIG_QCOM_QFPROM=y ++# CONFIG_QCOM_SPMI_TEMP_ALARM is not set ++CONFIG_QCOM_RPM_CLK=y ++# CONFIG_QCOM_RTB is not set ++# CONFIG_QCOM_PM is not set ++CONFIG_QCOM_SCM=y ++CONFIG_QCOM_SCM_32=y ++# CONFIG_HAVE_ARM_SMCCC is not set ++CONFIG_QCA_SCM_RESTART_REASON=y ++CONFIG_IPQ_TCSR=y ++CONFIG_QCOM_QFPROM=y ++# CONFIG_QCOM_SMD is not set ++CONFIG_QCOM_SMEM=y ++CONFIG_QCOM_SMEM_STATE=y ++# CONFIG_QCOM_SMD is not set ++CONFIG_QCOM_SMP2P=y ++# CONFIG_QCOM_SPMI_VADC is not set ++CONFIG_QCOM_TSENS=y ++CONFIG_QCOM_TZ_LOG=y ++CONFIG_QCOM_WDT=y ++CONFIG_QMI_ENCDEC=y ++CONFIG_RATIONAL=y ++# CONFIG_RCU_BOOST is not set ++CONFIG_RCU_CPU_STALL_TIMEOUT=21 ++# CONFIG_RCU_EXPERT is not set ++CONFIG_RCU_STALL_COMMON=y ++CONFIG_RD_GZIP=y ++CONFIG_REGMAP=y ++# CONFIG_REGMAP_ALLOW_WRITE_DEBUGFS is not set ++CONFIG_REGMAP_MMIO=y ++CONFIG_REGULATOR=y ++# CONFIG_REGULATOR_CPR3 is not set ++CONFIG_REGULATOR_GPIO=y ++CONFIG_REGULATOR_FIXED_VOLTAGE=y ++CONFIG_REGULATOR_QCOM_RPM=y ++CONFIG_REGULATOR_QCOM_SPMI=y ++# CONFIG_REGULATOR_IPQ40XX is not set ++# CONFIG_REGULATOR_RPM_SMD is not set ++# CONFIG_REGULATOR_RPM_GLINK is not set ++CONFIG_RELAY=y ++CONFIG_REMOTEPROC=y ++# CONFIG_IPQ807X_REMOTEPROC is not set ++CONFIG_RESET_CONTROLLER=y ++CONFIG_RFS_ACCEL=y ++CONFIG_RPS=y ++CONFIG_RTC_CLASS=y ++CONFIG_NET_L3_MASTER_DEV=y ++# CONFIG_RTC_DRV_CMOS is not set ++# CONFIG_RTC_DRV_PM8XXX is not set ++CONFIG_RWSEM_SPIN_ON_OWNER=y ++CONFIG_RWSEM_XCHGADD_ALGORITHM=y ++# CONFIG_SATA_AHCI is not set ++CONFIG_SCHED_HRTICK=y ++# CONFIG_SCSI is not set ++# CONFIG_SCHED_INFO is not set ++# CONFIG_SCSI_DMA is not set ++# CONFIG_SERIAL_8250 is not set ++# CONFIG_SERIAL_8250_CONSOLE is not set ++# CONFIG_SERIAL_8250_DMA is not set ++# CONFIG_SERIAL_AMBA_PL010 is not set ++# CONFIG_SERIAL_AMBA_PL011 is not set ++CONFIG_SERIAL_MSM=y ++CONFIG_SERIAL_MSM_CONSOLE=y ++# CONFIG_VIRTIO_CONSOLE is not set ++CONFIG_SMP=y ++CONFIG_SMP_ON_UP=y ++# CONFIG_SND is not set ++CONFIG_SND_DYNAMIC_MINORS=y ++CONFIG_SND_MAX_CARDS=32 ++CONFIG_SND_PROC_FS=y ++# CONFIG_SND_COMPRESS_OFFLOAD is not set ++CONFIG_SND_PCM=y ++CONFIG_SND_SOC=y ++# CONFIG_SND_SOC_APQ8016_SBC is not set ++CONFIG_SND_SOC_I2C_AND_SPI=y ++CONFIG_SND_SOC_IPQ=y ++# CONFIG_SND_SOC_IPQ806X_LPAIF is not set ++# CONFIG_SND_SOC_IPQ806X_PCM_RAW is not set ++CONFIG_SND_SOC_IPQ_ADSS=y ++CONFIG_SND_SOC_IPQ_CODEC=y ++CONFIG_SND_SOC_IPQ_CPU_DAI=y ++CONFIG_SND_SOC_IPQ_MBOX=y ++CONFIG_SND_SOC_IPQ_PCM_I2S=y ++CONFIG_SND_SOC_IPQ_PCM_RAW=y ++CONFIG_SND_SOC_IPQ_PCM_SPDIF=y ++CONFIG_SND_SOC_IPQ_PCM_TDM=y ++CONFIG_SND_SOC_IPQ_STEREO=y ++CONFIG_SND_SOC_QCOM=y ++# CONFIG_SND_SOC_STORM is not set ++CONFIG_SOUND=y ++CONFIG_SPARSE_IRQ=y ++CONFIG_SPI=y ++CONFIG_SPI_MASTER=y ++CONFIG_SPI_QUP=y ++CONFIG_SPI_SPIDEV=y ++# CONFIG_SPI_VSC7385 is not set ++CONFIG_SPMI=y ++CONFIG_SPMI_MSM_PMIC_ARB=y ++CONFIG_SRCU=y ++# CONFIG_STRIP_ASM_SYMS is not set ++# CONFIG_STOPWATCH is not set ++CONFIG_SUSPEND=y ++CONFIG_SWCONFIG=y ++CONFIG_SWIOTLB=y ++# CONFIG_SWAP is not set ++CONFIG_SWP_EMULATE=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_THERMAL=y ++CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y ++CONFIG_THERMAL_GOV_STEP_WISE=y ++CONFIG_THERMAL_GOV_USER_SPACE=y ++CONFIG_THERMAL_HWMON=y ++CONFIG_THERMAL_OF=y ++CONFIG_THERMAL_WRITABLE_TRIPS=y ++# CONFIG_THUMB2_KERNEL is not set ++# CONFIG_TICK_CPU_ACCOUNTING is not set ++CONFIG_IRQ_TIME_ACCOUNTING=y ++CONFIG_TRACING_EVENTS_GPIO=y ++CONFIG_UBIFS_FS=y ++CONFIG_UBIFS_FS_ADVANCED_COMPR=y ++CONFIG_UBIFS_FS_LZO=y ++CONFIG_UBIFS_FS_XZ=y ++CONFIG_UBIFS_FS_ZLIB=y ++CONFIG_UEVENT_HELPER_PATH="" ++CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h" ++CONFIG_UNINLINE_SPIN_UNLOCK=y ++CONFIG_USB_GADGET=n ++CONFIG_USB_SUPPORT=y ++# CONFIG_USB_DWC3_OF_SIMPLE is not set ++# CONFIG_USB_QCOM_8X16_PHY is not set ++# CONFIG_USB_QCOM_KS_BRIDGE is not set ++# CONFIG_USB_QCOM_QUSB_PHY is not set ++# CONFIG_USB_QCOM_QMP_PHY is not set ++# CONFIG_USB_QCA_M31_PHY is not set ++# CONFIG_USB_EHCI_ROOT_HUB_TT is not set ++# CONFIG_USB_EHCI_TT_NEWSCHED is not set ++# CONFIG_USB_OHCI_LITTLE_ENDIAN is not set ++CONFIG_USE_OF=y ++CONFIG_VDSO=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_VFP=y ++CONFIG_VFPv3=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_WATCHDOG_CORE=y ++# CONFIG_WL_TI is not set ++# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set ++CONFIG_XPS=y ++CONFIG_XZ_DEC_ARM=y ++CONFIG_XZ_DEC_BCJ=y ++CONFIG_ZBOOT_ROM_BSS=0 ++CONFIG_ZBOOT_ROM_TEXT=0 ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZONE_DMA_FLAG=0 ++CONFIG_QCOM_CACHE_DUMP=y ++CONFIG_QCOM_CACHE_DUMP_ON_PANIC=y ++# CONFIG_QCOM_RESTART_REASON is not set ++# CONFIG_QCOM_DLOAD_MODE is not set ++CONFIG_FW_AUTH=y ++CONFIG_FW_AUTH_TEST=m ++CONFIG_ASYMMETRIC_KEY_TYPE=y ++CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y ++CONFIG_PUBLIC_KEY_ALGO_RSA=y ++CONFIG_X509_CERTIFICATE_PARSER=y ++CONFIG_PKCS7_MESSAGE_PARSER=n ++CONFIG_KEYS=y ++# CONFIG_SKB_RECYCLER is not set ++CONFIG_SKB_RECYCLER_MULTI_CPU=y ++# CONFIG_SKB_RECYCLER_PREALLOC is not set ++# CONFIG_U_SERIAL_CONSOLE is not set ++CONFIG_SCSI_SCAN_ASYNC=y ++# CONFIG_NF_IPV6_DUMMY_HEADER is not set ++# CONFIG_RMNET is not set ++# CONFIG_RMNET_DATA is not set ++# CONFIG_RMNET_CTL is not set ++# CONFIG_MSM_SECURE_BUFFER is not set ++# CONFIG_STAGING is not set ++# CONFIG_ANDROID is not set ++# CONFIG_ION is not set ++# CONFIG_ION_DUMMY is not set ++# CONFIG_ION_MSM is not set ++# CONFIG_ION_TEST is not set ++# CONFIG_CMA is not set ++# CONFIG_CMA_DEBUG is not set ++# CONFIG_CMA_DEBUGFS is not set ++# CONFIG_DMA_CMA is not set ++# CONFIG_CMA_AREAS is not set ++# CONFIG_CMA_SIZE_MBYTES is not set ++# CONFIG_CMA_SIZE_SEL_MBYTES is not set ++# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set ++# CONFIG_CMA_SIZE_SEL_MIN is not set ++# CONFIG_CMA_SIZE_SEL_MAX is not set ++# CONFIG_CMA_ALIGNMENT is not set ++# CONFIG_ASHMEM is not set ++# CONFIG_ANDROID_TIMED_OUTPUT is not set ++# CONFIG_ANDROID_LOW_MEMORY_KILLER is not set ++# CONFIG_SYNC is not set ++# CONFIG_SW_SYNC is not set ++# CONFIG_FSL_MC_BUS is not set ++# CONFIG_ALLOC_BUFFERS_IN_4K_CHUNKS is not set ++CONFIG_ALLOC_SKB_PAGE_FRAG_DISABLE=y ++# CONFIG_MMAP_ALLOW_UNINITIALIZED is not set ++# CONFIG_MAILBOX is not set ++# CONFIG_MAILBOX_TEST is not set ++# CONFIG_QCOM_APCS_IPC is not set ++# CONFIG_QCOM_GLINK_SSR is not set ++# CONFIG_QCOM_Q6V5_WCSS is not set ++# CONFIG_QCOM_SYSMON is not set ++# CONFIG_QRTR is not set ++# CONFIG_QRTR_SMD is not set ++# CONFIG_QRTR_TUN is not set ++# CONFIG_RPMSG is not set ++# CONFIG_RPMSG_QCOM_GLINK_RPM is not set ++# CONFIG_RPMSG_VIRTIO is not set ++# CONFIG_RPMSG_CHAR is not set ++# CONFIG_RPMSG_QCOM_GLINK_SMEM is not set ++# CONFIG_RPMSG_QCOM_SMD is not set ++CONFIG_QCA_MINIDUMP=y ++# CONFIG_QCA_MINIDUMP_DEBUG is not set ++# CONFIG_QRTR_USB is not set ++# CONFIG_QRTR_FIFO is not set ++CONFIG_QRTR_MHI=y ++CONFIG_MHI_BUS=y ++# CONFIG_MHI_QTI is not set ++# CONFIG_MHI_NETDEV is not set ++# CONFIG_MHI_DEBUG is not set ++# CONFIG_MHI_UCI is not set ++# CONFIG_MHI_SATELLITE is not set ++# CONFIG_DIAG_OVER_QRTR is not set ++# CONFIG_MSM_ADSPRPC is not set ++CONFIG_CRYPTO_MICHAEL_MIC=y ++# CONFIG_ARCH_HAS_KCOV is not set ++# CONFIG_KCOV is not set ++# CONFIG_GCC_PLUGINS is not set ++# CONFIG_QTI_Q6V5_ADSP is not set ++# CONFIG_MSM_RPM_RPMSG is not set ++# CONFIG_RPMSG_QCOM_GLINK_RPM is not set ++# CONFIG_REGULATOR_RPM_GLINK is not set ++# CONFIG_MTD_NAND_SERIAL is not set ++# CONFIG_ARM_QTI_IPQ60XX_CPUFREQ is not set ++# CONFIG_PAGE_SCOPE_MULTI_PAGE_READ is not set ++# CONFIG_CRYPTO_NO_ZERO_LEN_HASH is not set ++# CONFIG_CRYPTO_DISABLE_AES192_TEST is not set ++# CONFIG_QTI_EUD is not set ++# CONFIG_EUD_EXTCON_SUPPORT is not set ++# CONFIG_CLK_TEST_5018 is not set ++CONFIG_MAP_E_SUPPORT=y ++# CONFIG_IPQ_FLASH_16M_PROFILE is not set ++# CONFIG_QGIC2_MSI is not set ++CONFIG_BRIDGE_VLAN_FILTERING=y ++CONFIG_LEDS_GPIO=y ++# CONFIG_ARCH_IPQ256M is not set ++CONFIG_SKB_FIXED_SIZE_2K=y ++# CONFIG_IPQ_MEM_PROFILE is not set ++# CONFIG_VIRTIO_NET is not set ++# CONFIG_QCA_85XX_SWITCH is not set ++CONFIG_AQ_PHY=y ++CONFIG_DIAG_CHAR=y ++# CONFIG_HW_RANDOM_VIRTIO is not set ++# CONFIG_BOOTCONFIG_PARTITION is not set ++# CONFIG_CRYPTO_DEV_QCEDEV is not set ++# CONFIG_CRYPTO_DEV_QCRYPTO is not set ++# CONFIG_MHI_BUS_TEST is not set +diff --git a/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq6018-cig-wf188.dts b/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq6018-cig-wf188.dts +new file mode 100644 +index 0000000000..5f2d4fb03f +--- /dev/null ++++ b/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq6018-cig-wf188.dts +@@ -0,0 +1,18 @@ ++/* ++ * Copyright (c) 2019, The Linux Foundation. All rights reserved. ++ * ++ * Permission to use, copy, modify, and/or distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ */ ++ ++#include "../../../arm64/boot/dts/qcom/qcom-ipq6018-cig-wf188.dts" ++#include "qcom-ipq6018.dtsi" +diff --git a/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq6018-cig-wf188n.dts b/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq6018-cig-wf188n.dts +new file mode 100644 +index 0000000000..ffd7899228 +--- /dev/null ++++ b/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq6018-cig-wf188n.dts +@@ -0,0 +1,18 @@ ++/* ++ * Copyright (c) 2019, The Linux Foundation. All rights reserved. ++ * ++ * Permission to use, copy, modify, and/or distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ */ ++ ++#include "../../../arm64/boot/dts/qcom/qcom-ipq6018-cig-wf188n.dts" ++#include "qcom-ipq6018.dtsi" +diff --git a/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq6018-edgecore-eap101.dts b/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq6018-edgecore-eap101.dts +new file mode 100644 +index 0000000000..531510a764 +--- /dev/null ++++ b/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq6018-edgecore-eap101.dts +@@ -0,0 +1,18 @@ ++/* ++ * Copyright (c) 2019, The Linux Foundation. All rights reserved. ++ * ++ * Permission to use, copy, modify, and/or distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ */ ++ ++#include "../../../arm64/boot/dts/qcom/qcom-ipq6018-edgecore-eap101.dts" ++#include "qcom-ipq6018.dtsi" +diff --git a/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq6018-miwifi-ax1800.dts b/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq6018-miwifi-ax1800.dts +new file mode 100644 +index 0000000000..5c452c5741 +--- /dev/null ++++ b/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq6018-miwifi-ax1800.dts +@@ -0,0 +1,18 @@ ++/* ++ * Copyright (c) 2019, The Linux Foundation. All rights reserved. ++ * ++ * Permission to use, copy, modify, and/or distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ */ ++ ++#include "../../../arm64/boot/dts/qcom/qcom-ipq6018-miwifi-ax1800.dts" ++#include "qcom-ipq6018.dtsi" +diff --git a/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-eap102.dts b/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-eap102.dts +new file mode 100644 +index 0000000000..d1d3f3755e +--- /dev/null ++++ b/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-eap102.dts +@@ -0,0 +1,26 @@ ++/* ++ * Copyright (c) 2017, The Linux Foundation. All rights reserved. ++ * ++ * Permission to use, copy, modify, and/or distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ */ ++#include "../../../arm64/boot/dts/qcom/qcom-ipq807x-eap102.dts" ++ ++/ { ++ soc { ++ pmu { ++ compatible = "arm,cortex-a7-pmu"; ++ interrupts = ; ++ }; ++ }; ++}; +diff --git a/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-eap106.dts b/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-eap106.dts +new file mode 100644 +index 0000000000..1527f81a40 +--- /dev/null ++++ b/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-eap106.dts +@@ -0,0 +1,26 @@ ++/* ++ * Copyright (c) 2017, The Linux Foundation. All rights reserved. ++ * ++ * Permission to use, copy, modify, and/or distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ */ ++#include "../../../arm64/boot/dts/qcom/qcom-ipq807x-eap106.dts" ++ ++/ { ++ soc { ++ pmu { ++ compatible = "arm,cortex-a7-pmu"; ++ interrupts = ; ++ }; ++ }; ++}; +diff --git a/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-ex227.dts b/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-ex227.dts +new file mode 100644 +index 0000000000..f3b25e2633 +--- /dev/null ++++ b/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-ex227.dts +@@ -0,0 +1,26 @@ ++/* ++ * Copyright (c) 2017, The Linux Foundation. All rights reserved. ++ * ++ * Permission to use, copy, modify, and/or distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ */ ++#include "../../../arm64/boot/dts/qcom/qcom-ipq807x-ex227.dts" ++ ++/ { ++ soc { ++ pmu { ++ compatible = "arm,cortex-a7-pmu"; ++ interrupts = ; ++ }; ++ }; ++}; +diff --git a/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-ex447.dts b/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-ex447.dts +new file mode 100644 +index 0000000000..7cfd66ba0a +--- /dev/null ++++ b/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-ex447.dts +@@ -0,0 +1,26 @@ ++/* ++ * Copyright (c) 2017, The Linux Foundation. All rights reserved. ++ * ++ * Permission to use, copy, modify, and/or distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ */ ++#include "../../../arm64/boot/dts/qcom/qcom-ipq807x-ex447.dts" ++ ++/ { ++ soc { ++ pmu { ++ compatible = "arm,cortex-a7-pmu"; ++ interrupts = ; ++ }; ++ }; ++}; +diff --git a/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-sercomm-wallaby.dts b/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-sercomm-wallaby.dts +new file mode 100644 +index 0000000000..e756aa5622 +--- /dev/null ++++ b/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-sercomm-wallaby.dts +@@ -0,0 +1,26 @@ ++/* ++ * Copyright (c) 2017, The Linux Foundation. All rights reserved. ++ * ++ * Permission to use, copy, modify, and/or distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ */ ++#include "../../../arm64/boot/dts/qcom/qcom-ipq807x-sercomm-wallaby.dts" ++ ++/ { ++ soc { ++ pmu { ++ compatible = "arm,cortex-a7-pmu"; ++ interrupts = ; ++ }; ++ }; ++}; +diff --git a/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-wf194c.dts b/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-wf194c.dts +new file mode 100644 +index 0000000000..4274b6c704 +--- /dev/null ++++ b/target/linux/ipq807x/files/arch/arm/boot/dts/qcom-ipq807x-wf194c.dts +@@ -0,0 +1,26 @@ ++/* ++ * Copyright (c) 2017, The Linux Foundation. All rights reserved. ++ * ++ * Permission to use, copy, modify, and/or distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ */ ++#include "../../../arm64/boot/dts/qcom/qcom-ipq807x-wf194c.dts" ++ ++/ { ++ soc { ++ pmu { ++ compatible = "arm,cortex-a7-pmu"; ++ interrupts = ; ++ }; ++ }; ++}; +diff --git a/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq6018-miwifi-ax1800.dts b/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq6018-miwifi-ax1800.dts +new file mode 100755 +index 0000000000..ba4a5ef3ca +--- /dev/null ++++ b/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq6018-miwifi-ax1800.dts +@@ -0,0 +1,419 @@ ++/dts-v1/; ++/* ++ * Copyright (c) 2019, The Linux Foundation. All rights reserved. ++ * ++ * Permission to use, copy, modify, and/or distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ */ ++ ++#define __IPQ_MEM_PROFILE_256_MB__ ++#include "qcom-ipq6018.dtsi" ++#include "qcom-ipq6018-rpm-regulator.dtsi" ++#include "qcom-ipq6018-cpr-regulator.dtsi" ++#include "qcom-ipq6018-cp-cpu.dtsi" ++#include ++/ { ++ #address-cells = <0x2>; ++ #size-cells = <0x2>; ++ model = "Qualcomm Technologies, Inc. IPQ6018/AP-CP03-C1"; ++ compatible = "xiaomi,ax1800", "qcom,ipq6018-cp03", "qcom,ipq6018"; ++ interrupt-parent = <&intc>; ++ qcom,msm-id = <0x1A5 0x0>; ++ ++ aliases { ++ /* ++ * Aliases as required by u-boot ++ * to patch MAC addresses ++ */ ++ ethernet1 = "/soc/dp2"; ++ ethernet2 = "/soc/dp3"; ++ ethernet3 = "/soc/dp4"; ++ ethernet4 = "/soc/dp5"; ++ }; ++ ++ chosen { ++ bootargs = "console=ttyMSM0,115200,n8 rw init=/init"; ++ bootargs-append = " swiotlb=1 coherent_pool=2M console=ttyMSM0,115200,n8"; ++ }; ++ ++ /* ++ * +=========+==============+========================+ ++ * | | | | ++ * | Region | Start Offset | Size | ++ * | | | | ++ * +--------+--------------+-------------------------+ ++ * | | | | ++ * | | | | ++ * | | | | ++ * | | | | ++ * | Linux | 0x41000000 | 139MB | ++ * | | | | ++ * | | | | ++ * | | | | ++ * +--------+--------------+-------------------------+ ++ * | TZ App | 0x49B00000 | 6MB | ++ * +--------+--------------+-------------------------+ ++ * ++ * From the available 145 MB for Linux in the first 256 MB, ++ * we are reserving 6 MB for TZAPP. ++ * ++ * Refer arch/arm64/boot/dts/qcom/qcom-ipq6018-memory.dtsi ++ * for memory layout. ++ */ ++ ++}; ++ ++&tlmm { ++ uart_pins: uart_pins { ++ mux { ++ pins = "gpio44", "gpio45"; ++ function = "blsp2_uart"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ }; ++ ++ spi_0_pins: spi_0_pins { ++ mux { ++ pins = "gpio38", "gpio39", "gpio40", "gpio41"; ++ function = "blsp0_spi"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ }; ++ ++ qpic_pins: qpic_pins { ++ data_0 { ++ pins = "gpio15"; ++ function = "qpic_pad0"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ data_1 { ++ pins = "gpio12"; ++ function = "qpic_pad1"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ data_2 { ++ pins = "gpio13"; ++ function = "qpic_pad2"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ data_3 { ++ pins = "gpio14"; ++ function = "qpic_pad3"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ data_4 { ++ pins = "gpio5"; ++ function = "qpic_pad4"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ data_5 { ++ pins = "gpio6"; ++ function = "qpic_pad5"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ data_6 { ++ pins = "gpio7"; ++ function = "qpic_pad6"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ data_7 { ++ pins = "gpio8"; ++ function = "qpic_pad7"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ qpic_pad { ++ pins = "gpio1", "gpio3", "gpio4", ++ "gpio10", "gpio11", "gpio17"; ++ function = "qpic_pad"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ }; ++ ++ button_pins: button_pins { ++ wps_button { ++ pins = "gpio19"; ++ function = "gpio"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ }; ++ ++ mdio_pins: mdio_pinmux { ++ mux_0 { ++ pins = "gpio64"; ++ function = "mdc"; ++ drive-strength = <8>; ++ bias-pull-up; ++ }; ++ mux_1 { ++ pins = "gpio65"; ++ function = "mdio"; ++ drive-strength = <8>; ++ bias-pull-up; ++ }; ++ mux_2 { ++ pins = "gpio75"; ++ function = "gpio"; ++ bias-pull-up; ++ }; ++ }; ++ ++ gpio_keys { ++ pinctrl-names = "default"; ++ compatible = "gpio-keys"; ++ pinctrl-0 = <&button_pins>; ++ ++ button@1 { ++ debounce-interval = <0x3c>; ++ label = "reset"; ++ linux,code = ; ++ linux,input-type = <0x01>; ++ gpios = <&tlmm 0x13 GPIO_ACTIVE_LOW>; ++ }; ++ }; ++ leds_pins: leds_pins { ++ led_blue { ++ pins = "gpio31"; ++ bias-pull-down; ++ function = "gpio"; ++ drive-strength = <0x08>; ++ }; ++ ++ net_blue { ++ pins = "gpio29"; ++ bias-pull-down; ++ function = "gpio"; ++ drive-strength = <0x08>; ++ }; ++ ++ net_yellow { ++ pins = "gpio30"; ++ bias-pull-down; ++ function = "gpio"; ++ drive-strength = <0x08>; ++ }; ++ ++ led_yellow { ++ pins = "gpio32"; ++ bias-pull-down; ++ function = "gpio"; ++ drive-strength = <0x08>; ++ }; ++ }; ++}; ++ ++&soc { ++ mdio@90000 { ++ pinctrl-0 = <&mdio_pins>; ++ pinctrl-names = "default"; ++ phy-reset-gpio = <&tlmm 75 0>; ++ status = "ok"; ++ ethernet-phy@0 { ++ reg = <0x00>; ++ }; ++ ++ ethernet-phy@1 { ++ reg = <0x01>; ++ }; ++ ++ ethernet-phy@4 { ++ reg = <0x04>; ++ }; ++ ++ ethernet-phy@2 { ++ reg = <0x02>; ++ }; ++ ++ ethernet-phy@3 { ++ reg = <0x03>; ++ }; ++ }; ++ ++ ess-switch@3a000000 { ++ switch_cpu_bmp = <0x1>; /* cpu port bitmap */ ++ switch_lan_bmp = <0x1e>; /* lan port bitmap */ ++ switch_wan_bmp = <0x20>; /* wan port bitmap */ ++ switch_inner_bmp = <0xc0>; /*inner port bitmap*/ ++ switch_mac_mode = <0x0>; /* mac mode for uniphy instance0*/ ++ switch_mac_mode1 = <0xff>; /* mac mode for uniphy instance1*/ ++ switch_mac_mode2 = <0xff>; /* mac mode for uniphy instance2*/ ++ qcom,port_phyinfo { ++ port@0 { ++ port_id = <0x01>; ++ phy_address = <0x00>; ++ }; ++ ++ port@4 { ++ port_id = <0x05>; ++ phy_address = <0x04>; ++ }; ++ ++ port@2 { ++ port_id = <0x03>; ++ phy_address = <0x02>; ++ }; ++ ++ port@1 { ++ port_id = <0x02>; ++ phy_address = <0x01>; ++ }; ++ ++ port@3 { ++ port_id = <0x04>; ++ phy_address = <0x03>; ++ }; ++ ++ }; ++ }; ++ ++ dp2 { ++ reg = <0x3a001200 0x200>; ++ qcom,id = <0x02>; ++ qcom,phy-mdio-addr = <0x01>; ++ qcom,link-poll = <0x01>; ++ qcom,mactype = <0x00>; ++ compatible = "qcom,nss-dp"; ++ phy-mode = "sgmii"; ++ local-mac-address = [000000000000]; ++ device_type = "network"; ++ }; ++ ++ dp3 { ++ reg = <0x3a001400 0x200>; ++ qcom,id = <0x03>; ++ qcom,phy-mdio-addr = <0x02>; ++ qcom,link-poll = <0x01>; ++ qcom,mactype = <0x00>; ++ compatible = "qcom,nss-dp"; ++ phy-mode = "sgmii"; ++ local-mac-address = [000000000000]; ++ device_type = "network"; ++ }; ++ ++ dp4 { ++ reg = <0x3a001600 0x200>; ++ qcom,id = <0x04>; ++ qcom,phy-mdio-addr = <0x03>; ++ qcom,link-poll = <0x01>; ++ qcom,mactype = <0x00>; ++ compatible = "qcom,nss-dp"; ++ phy-mode = "sgmii"; ++ local-mac-address = [000000000000]; ++ device_type = "network"; ++ }; ++ ++ dp5 { ++ reg = <0x3a001800 0x200>; ++ qcom,id = <0x05>; ++ qcom,phy-mdio-addr = <0x04>; ++ qcom,link-poll = <0x01>; ++ qcom,mactype = <0x00>; ++ compatible = "qcom,nss-dp"; ++ phy-mode = "sgmii"; ++ local-mac-address = [8c 53 c3 b6 7d ac]; ++ device_type = "network"; ++ }; ++ ++ leds { ++ compatible = "gpio-leds"; ++ pinctrl-0 = <&leds_pins>; ++ pinctrl-names = "default"; ++ ++ led_sys_yellow { ++ label = "yellow:status"; ++ default-state = "on"; ++ gpio = <&tlmm 0x1e GPIO_ACTIVE_HIGH>; ++ }; ++ ++ led_net_yellow { ++ label = "yellow:net"; ++ default-state = "off"; ++ gpio = <&tlmm 0x20 GPIO_ACTIVE_HIGH>; ++ }; ++ ++ led_sys_blue { ++ label = "blue:status"; ++ default-state = "off"; ++ gpio = <&tlmm 0x1d GPIO_ACTIVE_HIGH>; ++ }; ++ ++ led_net_blue { ++ label = "blue:net"; ++ default-state = "off"; ++ gpio = <&tlmm 0x1f GPIO_ACTIVE_HIGH>; ++ }; ++ }; ++}; ++ ++&blsp1_uart3 { ++ pinctrl-0 = <&uart_pins>; ++ pinctrl-names = "default"; ++ status = "ok"; ++}; ++ ++&spi_0 { ++ pinctrl-0 = <&spi_0_pins>; ++ pinctrl-names = "default"; ++ cs-select = <0>; ++ status = "ok"; ++ ++ m25p80@0 { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ reg = <0>; ++ compatible = "n25q128a11"; ++ linux,modalias = "m25p80", "n25q128a11"; ++ spi-max-frequency = <50000000>; ++ use-default-sizes; ++ }; ++}; ++ ++&qpic_bam { ++ status = "ok"; ++}; ++ ++&nand { ++ pinctrl-0 = <&qpic_pins>; ++ pinctrl-names = "default"; ++ status = "ok"; ++}; ++ ++&ssphy_0 { ++ status = "ok"; ++}; ++ ++&qusb_phy_0 { ++ status = "ok"; ++}; ++ ++&usb3 { ++ status = "ok"; ++}; ++ ++&nss_crypto { ++ status = "ok"; ++}; ++ ++&q6_region { ++ reg = <0x0 0x4ab00000 0x0 0x05500000>; ++}; +diff --git a/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq807x-eap102.dts b/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq807x-eap102.dts +new file mode 100755 +index 0000000000..d04cb1020c +--- /dev/null ++++ b/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq807x-eap102.dts +@@ -0,0 +1,918 @@ ++/dts-v1/; ++/* ++ * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. ++ * ++ * Permission to use, copy, modify, and/or distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ */ ++#include "qcom-ipq807x-soc.dtsi" ++#include "qcom-ipq807x-ac-cpu.dtsi" ++ ++/ { ++ #address-cells = <0x2>; ++ #size-cells = <0x2>; ++ model = "Edgecore EAP102"; ++ compatible = "edgecore,eap102", "qcom,ipq807x-ac02", "qcom,ipq807x"; ++ qcom,msm-id = <0x178 0x0>; ++ interrupt-parent = <&intc>; ++ qcom,board-id = <0x8 0x0>; ++ qcom,pmic-id = <0x0 0x0 0x0 0x0>; ++ ++ aliases { ++ /* ++ * Aliases as required by u-boot ++ * to patch MAC addresses ++ */ ++ ethernet1 = "/soc/dp5"; ++ ethernet0 = "/soc/dp6"; ++ ++ led-boot = &led_power; ++ led-failsafe = &led_power; ++ led-running = &led_power; ++ led-upgrade = &led_power; ++ }; ++ ++ chosen { ++ bootargs = "console=ttyMSM0,115200,n8 root=/dev/ram0 rw \ ++ init=/init"; ++ #ifdef __IPQ_MEM_PROFILE_256_MB__ ++ bootargs-append = " swiotlb=1"; ++ #else ++ bootargs-append = " swiotlb=1 coherent_pool=2M"; ++ #endif ++ }; ++}; ++ ++&tlmm { ++ pinctrl-0 = <&btcoex_pins>; ++ pinctrl-names = "default"; ++ ++ btcoex_pins: btcoex_pins { ++ mux_0 { ++ pins = "gpio64"; ++ function = "pta1_1"; ++ drive-strength = <6>; ++ bias-pull-down; ++ }; ++ mux_1 { ++ pins = "gpio65"; ++ function = "pta1_2"; ++ drive-strength = <6>; ++ bias-pull-down; ++ }; ++ }; ++ ++ mdio_pins: mdio_pinmux { ++ mux_0 { ++ pins = "gpio68"; ++ function = "mdc"; ++ drive-strength = <8>; ++ bias-pull-up; ++ }; ++ mux_1 { ++ pins = "gpio69"; ++ function = "mdio"; ++ drive-strength = <8>; ++ bias-pull-up; ++ }; ++ mux_2 { ++ pins = "gpio33"; ++ function = "gpio"; ++ bias-pull-up; ++ }; ++ mux_3 { ++ pins = "gpio44"; ++ function = "gpio"; ++ bias-pull-up; ++ }; ++ }; ++ ++ uart_pins: uart_pins { ++ mux { ++ pins = "gpio23", "gpio24"; ++ function = "blsp4_uart1"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++ }; ++ ++ spi_0_pins: spi_0_pins { ++ mux { ++ pins = "gpio38", "gpio39", "gpio40", "gpio41"; ++ function = "blsp0_spi"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++ }; ++ ++ qpic_pins: qpic_pins { ++ data_0 { ++ pins = "gpio15"; ++ function = "qpic_pad0"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++ data_1 { ++ pins = "gpio12"; ++ function = "qpic_pad1"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++ data_2 { ++ pins = "gpio13"; ++ function = "qpic_pad2"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++ data_3 { ++ pins = "gpio14"; ++ function = "qpic_pad3"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++ data_4 { ++ pins = "gpio5"; ++ function = "qpic_pad4"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++ data_5 { ++ pins = "gpio6"; ++ function = "qpic_pad5"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++ data_6 { ++ pins = "gpio7"; ++ function = "qpic_pad6"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++ data_7 { ++ pins = "gpio8"; ++ function = "qpic_pad7"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++ qpic_pad { ++ pins = "gpio1", "gpio3", "gpio4", ++ "gpio10", "gpio11", "gpio17"; ++ function = "qpic_pad"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++ }; ++ ++ hsuart_pins: hsuart_pins { ++ mux { ++ pins = "gpio49"; ++ function = "blsp2_uart"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++ }; ++ ++ button_pins: button_pins { ++ ++ reset_button { ++ pins = "gpio66"; ++ function = "gpio"; ++ drive-strength = <8>; ++ bias-pull-up; ++ }; ++ }; ++ ++ led_pins: led_pins { ++ led_pwr { ++ pins = "gpio46"; ++ function = "gpio"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ ++ led_2g { ++ pins = "gpio47"; ++ function = "gpio"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ ++ led_5g { ++ pins = "gpio48"; ++ function = "gpio"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ ++ led_bt { ++ pins = "gpio50"; ++ function = "gpio"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ }; ++ ++ usb_mux_sel_pins: usb_mux_pins { ++ mux { ++ pins = "gpio27"; ++ function = "gpio"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ }; ++ ++ pcie0_pins: pcie_pins { ++ pcie0_rst { ++ pins = "gpio58"; ++ function = "pcie0_rst"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ pcie0_wake { ++ pins = "gpio59"; ++ function = "pcie0_wake"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ }; ++ ++}; ++ ++&soc { ++ gpio_keys { ++ compatible = "gpio-keys"; ++ pinctrl-0 = <&button_pins>; ++ pinctrl-names = "default"; ++ ++ button@1 { ++ label = "reset_button"; ++ linux,code = ; ++ gpios = <&tlmm 66 GPIO_ACTIVE_LOW>; ++ linux,input-type = <1>; ++ debounce-interval = <60>; ++ }; ++ }; ++ ++ mdio: mdio@90000 { ++ pinctrl-0 = <&mdio_pins>; ++ pinctrl-names = "default"; ++ phy-reset-gpio = <&tlmm 37 0 &tlmm 25 1 &tlmm 44 1>; ++ compatible = "qcom,ipq40xx-mdio", "qcom,qca-mdio"; ++ phy0: ethernet-phy@0 { ++ reg = <0>; ++ }; ++ phy1: ethernet-phy@1 { ++ reg = <1>; ++ }; ++ phy2: ethernet-phy@2 { ++ reg = <2>; ++ }; ++ phy3: ethernet-phy@3 { ++ reg = <3>; ++ }; ++ phy4: ethernet-phy@4 { ++ reg = <24>; ++ }; ++ phy5: ethernet-phy@5 { ++ reg = <28>; ++ }; ++ }; ++ ++ ess-switch@3a000000 { ++ switch_cpu_bmp = <0x1>; /* cpu port bitmap */ ++ switch_lan_bmp = <0x3e>; /* lan port bitmap */ ++ switch_wan_bmp = <0x40>; /* wan port bitmap */ ++ switch_mac_mode = <0x0>; /* mac mode for uniphy instance0*/ ++ switch_mac_mode1 = <0xf>; /* mac mode for uniphy instance1*/ ++ switch_mac_mode2 = <0xf>; /* mac mode for uniphy instance2*/ ++ bm_tick_mode = <0>; /* bm tick mode */ ++ tm_tick_mode = <0>; /* tm tick mode */ ++ qcom,port_phyinfo { ++ port@0 { ++ port_id = <1>; ++ phy_address = <0>; ++ }; ++ port@1 { ++ port_id = <2>; ++ phy_address = <1>; ++ }; ++ port@2 { ++ port_id = <3>; ++ phy_address = <2>; ++ }; ++ port@3 { ++ port_id = <4>; ++ phy_address = <3>; ++ }; ++ port@4 { ++ port_id = <5>; ++ phy_address = <24>; ++ port_mac_sel = "QGMAC_PORT"; ++ }; ++ port@5 { ++ port_id = <6>; ++ phy_address = <28>; ++ port_mac_sel = "QGMAC_PORT"; ++ }; ++ }; ++ port_scheduler_resource { ++ port@0 { ++ port_id = <0>; ++ ucast_queue = <0 143>; ++ mcast_queue = <256 271>; ++ l0sp = <0 35>; ++ l0cdrr = <0 47>; ++ l0edrr = <0 47>; ++ l1cdrr = <0 7>; ++ l1edrr = <0 7>; ++ }; ++ port@1 { ++ port_id = <1>; ++ ucast_queue = <144 159>; ++ mcast_queue = <272 275>; ++ l0sp = <36 39>; ++ l0cdrr = <48 63>; ++ l0edrr = <48 63>; ++ l1cdrr = <8 11>; ++ l1edrr = <8 11>; ++ }; ++ port@2 { ++ port_id = <2>; ++ ucast_queue = <160 175>; ++ mcast_queue = <276 279>; ++ l0sp = <40 43>; ++ l0cdrr = <64 79>; ++ l0edrr = <64 79>; ++ l1cdrr = <12 15>; ++ l1edrr = <12 15>; ++ }; ++ port@3 { ++ port_id = <3>; ++ ucast_queue = <176 191>; ++ mcast_queue = <280 283>; ++ l0sp = <44 47>; ++ l0cdrr = <80 95>; ++ l0edrr = <80 95>; ++ l1cdrr = <16 19>; ++ l1edrr = <16 19>; ++ }; ++ port@4 { ++ port_id = <4>; ++ ucast_queue = <192 207>; ++ mcast_queue = <284 287>; ++ l0sp = <48 51>; ++ l0cdrr = <96 111>; ++ l0edrr = <96 111>; ++ l1cdrr = <20 23>; ++ l1edrr = <20 23>; ++ }; ++ port@5 { ++ port_id = <5>; ++ ucast_queue = <208 223>; ++ mcast_queue = <288 291>; ++ l0sp = <52 55>; ++ l0cdrr = <112 127>; ++ l0edrr = <112 127>; ++ l1cdrr = <24 27>; ++ l1edrr = <24 27>; ++ }; ++ port@6 { ++ port_id = <6>; ++ ucast_queue = <224 239>; ++ mcast_queue = <292 295>; ++ l0sp = <56 59>; ++ l0cdrr = <128 143>; ++ l0edrr = <128 143>; ++ l1cdrr = <28 31>; ++ l1edrr = <28 31>; ++ }; ++ port@7 { ++ port_id = <7>; ++ ucast_queue = <240 255>; ++ mcast_queue = <296 299>; ++ l0sp = <60 63>; ++ l0cdrr = <144 159>; ++ l0edrr = <144 159>; ++ l1cdrr = <32 35>; ++ l1edrr = <32 35>; ++ }; ++ }; ++ port_scheduler_config { ++ port@0 { ++ port_id = <0>; ++ l1scheduler { ++ group@0 { ++ sp = <0 1>; /*L0 SPs*/ ++ /*cpri cdrr epri edrr*/ ++ cfg = <0 0 0 0>; ++ }; ++ }; ++ l0scheduler { ++ group@0 { ++ /*unicast queues*/ ++ ucast_queue = <0 4 8>; ++ /*multicast queues*/ ++ mcast_queue = <256 260>; ++ /*sp cpri cdrr epri edrr*/ ++ cfg = <0 0 0 0 0>; ++ }; ++ group@1 { ++ ucast_queue = <1 5 9>; ++ mcast_queue = <257 261>; ++ cfg = <0 1 1 1 1>; ++ }; ++ group@2 { ++ ucast_queue = <2 6 10>; ++ mcast_queue = <258 262>; ++ cfg = <0 2 2 2 2>; ++ }; ++ group@3 { ++ ucast_queue = <3 7 11>; ++ mcast_queue = <259 263>; ++ cfg = <0 3 3 3 3>; ++ }; ++ }; ++ }; ++ port@1 { ++ port_id = <1>; ++ l1scheduler { ++ group@0 { ++ sp = <36>; ++ cfg = <0 8 0 8>; ++ }; ++ group@1 { ++ sp = <37>; ++ cfg = <1 9 1 9>; ++ }; ++ }; ++ l0scheduler { ++ group@0 { ++ ucast_queue = <144>; ++ ucast_loop_pri = <16>; ++ mcast_queue = <272>; ++ mcast_loop_pri = <4>; ++ cfg = <36 0 48 0 48>; ++ }; ++ }; ++ }; ++ port@2 { ++ port_id = <2>; ++ l1scheduler { ++ group@0 { ++ sp = <40>; ++ cfg = <0 12 0 12>; ++ }; ++ group@1 { ++ sp = <41>; ++ cfg = <1 13 1 13>; ++ }; ++ }; ++ l0scheduler { ++ group@0 { ++ ucast_queue = <160>; ++ ucast_loop_pri = <16>; ++ mcast_queue = <276>; ++ mcast_loop_pri = <4>; ++ cfg = <40 0 64 0 64>; ++ }; ++ }; ++ }; ++ port@3 { ++ port_id = <3>; ++ l1scheduler { ++ group@0 { ++ sp = <44>; ++ cfg = <0 16 0 16>; ++ }; ++ group@1 { ++ sp = <45>; ++ cfg = <1 17 1 17>; ++ }; ++ }; ++ l0scheduler { ++ group@0 { ++ ucast_queue = <176>; ++ ucast_loop_pri = <16>; ++ mcast_queue = <280>; ++ mcast_loop_pri = <4>; ++ cfg = <44 0 80 0 80>; ++ }; ++ }; ++ }; ++ port@4 { ++ port_id = <4>; ++ l1scheduler { ++ group@0 { ++ sp = <48>; ++ cfg = <0 20 0 20>; ++ }; ++ group@1 { ++ sp = <49>; ++ cfg = <1 21 1 21>; ++ }; ++ }; ++ l0scheduler { ++ group@0 { ++ ucast_queue = <192>; ++ ucast_loop_pri = <16>; ++ mcast_queue = <284>; ++ mcast_loop_pri = <4>; ++ cfg = <48 0 96 0 96>; ++ }; ++ }; ++ }; ++ port@5 { ++ port_id = <5>; ++ l1scheduler { ++ group@0 { ++ sp = <52>; ++ cfg = <0 24 0 24>; ++ }; ++ group@1 { ++ sp = <53>; ++ cfg = <1 25 1 25>; ++ }; ++ }; ++ l0scheduler { ++ group@0 { ++ ucast_queue = <208>; ++ ucast_loop_pri = <16>; ++ mcast_queue = <288>; ++ mcast_loop_pri = <4>; ++ cfg = <52 0 112 0 112>; ++ }; ++ }; ++ }; ++ port@6 { ++ port_id = <6>; ++ l1scheduler { ++ group@0 { ++ sp = <56>; ++ cfg = <0 28 0 28>; ++ }; ++ group@1 { ++ sp = <57>; ++ cfg = <1 29 1 29>; ++ }; ++ }; ++ l0scheduler { ++ group@0 { ++ ucast_queue = <224>; ++ ucast_loop_pri = <16>; ++ mcast_queue = <292>; ++ mcast_loop_pri = <4>; ++ cfg = <56 0 128 0 128>; ++ }; ++ }; ++ }; ++ port@7 { ++ port_id = <7>; ++ l1scheduler { ++ group@0 { ++ sp = <60>; ++ cfg = <0 32 0 32>; ++ }; ++ }; ++ l0scheduler { ++ group@0 { ++ ucast_queue = <240>; ++ mcast_queue = <296>; ++ cfg = <60 0 144 0 144>; ++ }; ++ }; ++ }; ++ }; ++ }; ++/* ++ dp1 { ++ device_type = "network"; ++ compatible = "qcom,nss-dp"; ++ qcom,id = <1>; ++ reg = <0x3a001000 0x200>; ++ qcom,mactype = <0>; ++ local-mac-address = [000000000000]; ++ qcom,link-poll = <1>; ++ qcom,phy-mdio-addr = <0>; ++ phy-mode = "sgmii"; ++ }; ++ ++ dp2 { ++ device_type = "network"; ++ compatible = "qcom,nss-dp"; ++ qcom,id = <2>; ++ reg = <0x3a001200 0x200>; ++ qcom,mactype = <0>; ++ local-mac-address = [000000000000]; ++ qcom,link-poll = <1>; ++ qcom,phy-mdio-addr = <1>; ++ phy-mode = "sgmii"; ++ }; ++ ++ dp3 { ++ device_type = "network"; ++ compatible = "qcom,nss-dp"; ++ qcom,id = <3>; ++ reg = <0x3a001400 0x200>; ++ qcom,mactype = <0>; ++ local-mac-address = [000000000000]; ++ qcom,link-poll = <1>; ++ qcom,phy-mdio-addr = <2>; ++ phy-mode = "sgmii"; ++ }; ++ ++ dp4 { ++ device_type = "network"; ++ compatible = "qcom,nss-dp"; ++ qcom,id = <4>; ++ reg = <0x3a001600 0x200>; ++ qcom,mactype = <0>; ++ local-mac-address = [000000000000]; ++ qcom,link-poll = <1>; ++ qcom,phy-mdio-addr = <3>; ++ phy-mode = "sgmii"; ++ }; ++*/ ++ dp6 { ++ device_type = "network"; ++ compatible = "qcom,nss-dp"; ++ qcom,id = <6>; ++ reg = <0x3a001800 0x200>; ++ qcom,mactype = <0>; ++ local-mac-address = [000000000000]; ++ qcom,link-poll = <1>; ++ qcom,phy-mdio-addr = <28>; ++ phy-mode = "sgmii"; ++ }; ++ ++ dp5 { ++ device_type = "network"; ++ compatible = "qcom,nss-dp"; ++ qcom,id = <5>; ++ reg = <0x3a001a00 0x200>; ++ qcom,mactype = <0>; ++ local-mac-address = [000000000000]; ++ qcom,link-poll = <1>; ++ qcom,phy-mdio-addr = <24>; ++ phy-mode = "sgmii"; ++ }; ++ ++ leds { ++ compatible = "gpio-leds"; ++ pinctrl-0 = <&led_pins>; ++ pinctrl-names = "default"; ++ ++ led_pwr { ++ label = "green:wan"; ++ gpios = <&tlmm 46 GPIO_ACTIVE_HIGH>; ++ default-state = "off"; ++ linux,default-trigger = "led_pwr"; ++ }; ++ ++ led_2g { ++ label = "green:wifi2"; ++ gpio = <&tlmm 47 GPIO_ACTIVE_HIGH>; ++ default-state = "off"; ++ }; ++ ++ led_5g { ++ label = "green:wifi5"; ++ gpio = <&tlmm 48 GPIO_ACTIVE_HIGH>; ++ default-state = "off"; ++ }; ++ ++ led_power: led_bt { ++ gpios = <&tlmm 50 GPIO_ACTIVE_HIGH>; ++ label = "green:power"; ++ default-state = "on"; ++ linux,default-trigger = "led_bt"; ++ }; ++ }; ++ nss-macsec0 { ++ compatible = "qcom,nss-macsec"; ++ phy_addr = <0x18>; ++ phy_access_mode = <0>; ++ mdiobus = <&mdio>; ++ }; ++ nss-macsec1 { ++ compatible = "qcom,nss-macsec"; ++ phy_addr = <0x1c>; ++ phy_access_mode = <0>; ++ mdiobus = <&mdio>; ++ }; ++}; ++ ++&serial_blsp4 { ++ pinctrl-0 = <&uart_pins>; ++ pinctrl-names = "default"; ++ status = "ok"; ++}; ++ ++&spi_0 { /* BLSP1 QUP1 */ ++ pinctrl-0 = <&spi_0_pins>; ++ pinctrl-names = "default"; ++ cs-select = <0>; ++ status = "ok"; ++ ++ m25p80@0 { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ reg = <0>; ++ compatible = "n25q128a11"; ++ linux,modalias = "m25p80", "n25q128a11"; ++ spi-max-frequency = <50000000>; ++ use-default-sizes; ++ }; ++}; ++ ++&serial_blsp2 { ++ pinctrl-0 = <&hsuart_pins>; ++ pinctrl-names = "default"; ++ status = "ok"; ++}; ++ ++&nss0 { ++ qcom,low-frequency = <187200000>; ++ qcom,mid-frequency = <748800000>; ++ qcom,max-frequency = <1497600000>; ++}; ++ ++&msm_imem { ++ status = "disabled"; ++}; ++ ++&ssphy_0 { ++ status = "ok"; ++}; ++ ++&qusb_phy_0 { ++ status = "ok"; ++}; ++ ++&ssphy_1 { ++ status = "ok"; ++}; ++ ++&qusb_phy_1 { ++ status = "ok"; ++}; ++ ++&usb3_0 { ++ status = "ok"; ++}; ++ ++&usb3_1 { ++ status = "ok"; ++}; ++ ++&cryptobam { ++ status = "ok"; ++}; ++ ++&crypto { ++ status = "ok"; ++}; ++ ++&i2c_0 { ++ status = "disabled"; ++}; ++ ++&i2c_1 { ++ status = "disabled"; ++}; ++ ++&qpic_bam { ++ status = "ok"; ++}; ++ ++&nand { ++ pinctrl-0 = <&qpic_pins>; ++ pinctrl-names = "default"; ++ status = "ok"; ++}; ++ ++&qpic_lcd { ++ status = "disabled"; ++}; ++ ++&qpic_lcd_panel { ++ status = "disabled"; ++}; ++ ++&ledc { ++ status = "disabled"; ++}; ++ ++&pcie0 { ++ status = "ok"; ++}; ++ ++&pcie1 { ++ status = "disabled"; ++}; ++ ++&glink_rpm { ++ status = "disabled"; ++}; ++ ++&apc_cpr { ++ /* Same CPR configuration as OAK */ ++ compatible = "qcom,cpr4-ipq817x-apss-regulator"; ++ ++ thread@0 { ++ apc_vreg: regulator { ++ regulator-min-microvolt = <1>; ++ regulator-max-microvolt = <2>; ++ qcom,cpr-fuse-corners = <2>; ++ qcom,cpr-corners = <3>; ++ qcom,cpr-speed-bin-corners = <3>; ++ qcom,cpr-corner-fmax-map = <1 3>; ++ ++ qcom,cpr-voltage-ceiling = ++ <840000 904000 944000>; ++ qcom,cpr-voltage-floor = ++ <592000 648000 712000>; ++ qcom,corner-frequencies = ++ <1017600000 1382400000 1382400000>; ++ ++ qcom,cpr-open-loop-voltage-fuse-adjustment-0 = ++ /* Speed bin 0; CPR rev 0..7 */ ++ < 0 0>, ++ < 0 0>, ++ < 0 0>, ++ < 0 0>, ++ < 0 0>, ++ < 0 0>, ++ < 0 0>, ++ < 0 0>; ++ ++ qcom,cpr-open-loop-voltage-fuse-adjustment-1 = ++ /* Speed bin 0; CPR rev 0..7 */ ++ < 0 0>, ++ < 0 0>, ++ < 0 0>, ++ < 20000 26000>, ++ < 0 0>, ++ < 0 0>, ++ < 0 0>, ++ < 0 0>; ++ ++ qcom,cpr-open-loop-voltage-fuse-adjustment-v2-0 = ++ /* Speed bin 0; CPR rev 0..7 */ ++ < 0 0>, ++ < 0 0>, ++ < 0 0>, ++ < 0 0>, ++ < 0 0>, ++ < 0 0>, ++ < 0 0>, ++ < 0 0>; ++ ++ qcom,cpr-open-loop-voltage-fuse-adjustment-v2-1 = ++ /* Speed bin 0; CPR rev 0..7 */ ++ < 0 0>, ++ < 0 7000>, ++ < 0 0>, ++ < 0 0>, ++ < 0 0>, ++ < 0 0>, ++ < 0 0>, ++ < 0 0>; ++ ++ qcom,cpr-floor-to-ceiling-max-range = ++ < 40000 40000 40000>, ++ < 40000 40000 40000>, ++ < 40000 40000 40000>, ++ < 40000 40000 40000>, ++ < 40000 40000 40000>, ++ < 40000 40000 40000>, ++ < 40000 40000 40000>, ++ < 40000 40000 40000>; ++ }; ++ }; ++}; ++ ++&npu_cpr { ++ status = "disabled"; ++}; ++ ++&nss0 { ++ npu-supply = <&dummy_reg>; ++ mx-supply = <&dummy_reg>; ++}; ++ ++&wifi0 { ++ qcom,board_id = <0x92>; ++}; ++ ++&wifi1 { ++ qcom,board_id = <0x292>; ++}; +diff --git a/target/linux/ipq807x/image/Makefile b/target/linux/ipq807x/image/Makefile +new file mode 100644 +index 0000000000..3a219e6d6c +--- /dev/null ++++ b/target/linux/ipq807x/image/Makefile +@@ -0,0 +1,26 @@ ++include $(TOPDIR)/rules.mk ++include $(INCLUDE_DIR)/image.mk ++ ++IMG_PREFIX:=$(VERSION_DIST_SANITIZED)-$(IMG_PREFIX_VERNUM)$(IMG_PREFIX_VERCODE)$(IMG_PREFIX_EXTRA)$(BOARD) ++ ++# default all platform image(fit) build ++define Device/Default ++ PROFILES = Default $$(DEVICE_NAME) ++ KERNEL_NAME := zImage ++ FILESYSTEMS := squashfs ++ DEVICE_DTS_DIR := $(DTS_DIR) ++ KERNEL_IN_UBI := 1 ++ ROOTFSNAME_IN_UBI := ubi_rootfs ++ BLOCKSIZE := 128k ++ PAGESIZE := 2048 ++ IMAGES := sysupgrade.tar nand-factory.bin ++ IMAGE/sysupgrade.tar := sysupgrade-tar | append-metadata ++ IMAGE/nand-factory.bin := append-ubi | qsdk-ipq-factory-nand ++ KERNEL_NAME := Image ++ KERNEL = kernel-bin | gzip | fit gzip $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb ++ KERNEL_INITRAMFS = kernel-bin | gzip | fit gzip $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb ++endef ++ ++include $(SUBTARGET).mk ++ ++$(eval $(call BuildImage)) +diff --git a/target/linux/ipq807x/image/ipq60xx.mk b/target/linux/ipq807x/image/ipq60xx.mk +new file mode 100644 +index 0000000000..2751391ac7 +--- /dev/null ++++ b/target/linux/ipq807x/image/ipq60xx.mk +@@ -0,0 +1,47 @@ ++KERNEL_LOADADDR := 0x41008000 ++ ++define Device/cig_wf188 ++ DEVICE_TITLE := Cigtech WF-188 ++ DEVICE_DTS := qcom-ipq6018-cig-wf188 ++ DEVICE_DTS_CONFIG := config@cp03-c1 ++ SUPPORTED_DEVICES := cig,wf188 ++ IMAGES := sysupgrade.tar ++ IMAGE/sysupgrade.tar/squashfs := append-rootfs | pad-rootfs | sysupgrade-tar rootfs=$$$$@ | append-metadata ++ DEVICE_PACKAGES := ath11k-wifi-cig-wf188 uboot-env ++endef ++TARGET_DEVICES += cig_wf188 ++ ++define Device/cig_wf188n ++ DEVICE_TITLE := Cigtech WF-188n ++ DEVICE_DTS := qcom-ipq6018-cig-wf188n ++ DEVICE_DTS_CONFIG := config@cp03-c1 ++ SUPPORTED_DEVICES := cig,wf188n ++ DEVICE_PACKAGES := ath11k-wifi-cig-wf188n uboot-env ++endef ++TARGET_DEVICES += cig_wf188n ++ ++define Device/edgecore_eap101 ++ DEVICE_TITLE := EdgeCore EAP101 ++ DEVICE_DTS := qcom-ipq6018-edgecore-eap101 ++ DEVICE_DTS_CONFIG := config@cp01-c1 ++ SUPPORTED_DEVICES := edgecore,eap101 ++ DEVICE_PACKAGES := ath11k-wifi-edgecore-eap101 uboot-envtools ++endef ++TARGET_DEVICES += edgecore_eap101 ++ ++define Device/qcom_cp01_c1 ++ DEVICE_TITLE := Qualcomm Cypress C1 ++ DEVICE_DTS := qcom-ipq6018-cp01-c1 ++ SUPPORTED_DEVICES := qcom,ipq6018-cp01 ++ DEVICE_PACKAGES := ath11k-wifi-qcom-ipq6018 ++endef ++TARGET_DEVICES += qcom_cp01_c1 ++ ++define Device/xiaomi_ax1800 ++ DEVICE_TITLE := Xiaomi AX1800 ++ DEVICE_DTS := qcom-ipq6018-miwifi-ax1800 ++ SUPPORTED_DEVICES := xiaomi,ax1800 ++ DEVICE_DTS_CONFIG := config@cp03-c1 ++ DEVICE_PACKAGES := ath11k-wifi-xiaomi-ax1800 ++endef ++TARGET_DEVICES += xiaomi_ax1800 +diff --git a/target/linux/ipq807x/image/ipq807x.mk b/target/linux/ipq807x/image/ipq807x.mk +new file mode 100644 +index 0000000000..92b301bcfb +--- /dev/null ++++ b/target/linux/ipq807x/image/ipq807x.mk +@@ -0,0 +1,81 @@ ++KERNEL_LOADADDR := 0x41208000 ++ ++define Device/qcom_hk01 ++ DEVICE_TITLE := Qualcomm Hawkeye HK01 ++ DEVICE_DTS := qcom-ipq807x-hk01 ++ DEVICE_DTS_CONFIG=config@hk01 ++ SUPPORTED_DEVICES := qcom,ipq807x-hk01 ++ DEVICE_PACKAGES := ath11k-wifi-qcom-ipq8074 ++endef ++TARGET_DEVICES += qcom_hk01 ++ ++define Device/qcom_hk14 ++ DEVICE_TITLE := Qualcomm Hawkeye HK14 ++ DEVICE_DTS := qcom-ipq807x-hk14 ++ DEVICE_DTS_CONFIG=config@hk14 ++ SUPPORTED_DEVICES := qcom,ipq807x-hk14 ++ DEVICE_PACKAGES := ath11k-wifi-qcom-ipq8074 kmod-ath11k-pci ath11k-firmware-qcn9000 ++endef ++TARGET_DEVICES += qcom_hk14 ++ ++define Device/sercomm_wallaby ++ DEVICE_TITLE := Sercomm Kiwi ++ DEVICE_DTS := qcom-ipq807x-sercomm-wallaby ++ DEVICE_DTS_CONFIG=config@hk09 ++ SUPPORTED_DEVICES := sercomm,wallaby ++ DEVICE_PACKAGES := ath11k-wifi-sercomm-wallaby ++endef ++TARGET_DEVICES += sercomm_wallaby ++ ++define Device/cig_wf194 ++ DEVICE_TITLE := CIG WF194C ++ DEVICE_DTS := qcom-ipq807x-wf194c ++ DEVICE_DTS_CONFIG=config@hk01 ++ SUPPORTED_DEVICES := cig,wf194c ++ DEVICE_PACKAGES := ath11k-wifi-cig-wf194c aq-fw-download uboot-envtools kmod-usb3 kmod-usb2 ++endef ++TARGET_DEVICES += cig_wf194 ++ ++define Device/edgecore_eap102 ++ DEVICE_TITLE := Edgecore EAP102 ++ DEVICE_DTS := qcom-ipq807x-eap102 ++ DEVICE_DTS_CONFIG=config@ac02 ++ SUPPORTED_DEVICES := edgecore,eap102 ++ DEVICE_PACKAGES := ath11k-wifi-edgecore-eap102 kmod-usb3 uboot-envtools ++endef ++TARGET_DEVICES += edgecore_eap102 ++ ++define Device/edgecore_eap106 ++ DEVICE_TITLE := Edgecore EAP102 ++ DEVICE_DTS := qcom-ipq807x-eap106 ++ DEVICE_DTS_CONFIG=config@hk02 ++ SUPPORTED_DEVICES := edgecore,eap106 ++ DEVICE_PACKAGES := ath11k-wifi-edgecore-eap106 iaq-fw-download kmod-usb2 kmod-usb3 uboot-envtools ++endef ++TARGET_DEVICES += edgecore_eap106 ++ ++define Device/tplink_ex227 ++ DEVICE_TITLE := TP-Link EX227 ++ DEVICE_DTS := qcom-ipq807x-ex227 ++ DEVICE_DTS_CONFIG=config@hk07 ++ SUPPORTED_DEVICES := tplink,ex227 ++ DEVICE_PACKAGES := ath11k-wifi-tplink-ex227 ++ IMAGES := sysupgrade.tar nand-factory.bin nand-factory.ubi ++ IMAGE/sysupgrade.tar := sysupgrade-tar | append-metadata ++ IMAGE/nand-factory.bin := append-ubi | qsdk-ipq-factory-nand ++ IMAGE/nand-factory.ubi := append-ubi ++endef ++TARGET_DEVICES += tplink_ex227 ++ ++define Device/tplink_ex447 ++ DEVICE_TITLE := TP-Link EX447 ++ DEVICE_DTS := qcom-ipq807x-ex447 ++ DEVICE_DTS_CONFIG=config@hk09 ++ SUPPORTED_DEVICES := tplink,ex447 ++ DEVICE_PACKAGES := ath11k-wifi-tplink-ex447 ++ IMAGES := sysupgrade.tar nand-factory.bin nand-factory.ubi ++ IMAGE/sysupgrade.tar := sysupgrade-tar | append-metadata ++ IMAGE/nand-factory.bin := append-ubi | qsdk-ipq-factory-nand ++ IMAGE/nand-factory.ubi := append-ubi ++endef ++TARGET_DEVICES += tplink_ex447 +diff --git a/target/linux/ipq807x/ipq60xx/config-default b/target/linux/ipq807x/ipq60xx/config-default +new file mode 100644 +index 0000000000..3d7c59698e +--- /dev/null ++++ b/target/linux/ipq807x/ipq60xx/config-default +@@ -0,0 +1,122 @@ ++CONFIG_ALLOC_BUFFERS_IN_4K_CHUNKS=y ++CONFIG_ANDROID=y ++# CONFIG_ANDROID_BINDER_IPC is not set ++# CONFIG_AQ_PHY is not set ++CONFIG_ARCH_HIBERNATION_POSSIBLE=y ++CONFIG_ARCH_IPQ6018=y ++# CONFIG_ARCH_MSM8X60 is not set ++CONFIG_ARM_DMA_IOMMU_ALIGNMENT=8 ++CONFIG_ARM_DMA_USE_IOMMU=y ++CONFIG_ARM_HEAVY_MB=y ++CONFIG_ARM_QTI_IPQ60XX_CPUFREQ=y ++CONFIG_ARM_SMMU=y ++CONFIG_ASN1=y ++CONFIG_ASSOCIATIVE_ARRAY=y ++CONFIG_CACHE_L2X0=y ++CONFIG_CLZ_TAB=y ++CONFIG_CMA=y ++CONFIG_CMA_ALIGNMENT=8 ++CONFIG_CMA_AREAS=7 ++CONFIG_CMA_DEBUG=y ++CONFIG_CMA_DEBUGFS=y ++CONFIG_CMA_SIZE_MBYTES=0 ++CONFIG_CMA_SIZE_SEL_MBYTES=y ++CONFIG_CORESIGHT=y ++CONFIG_CORESIGHT_CSR=y ++CONFIG_CORESIGHT_CTI=y ++CONFIG_CORESIGHT_HWEVENT=y ++CONFIG_CORESIGHT_LINKS_AND_SINKS=y ++CONFIG_CORESIGHT_LINK_AND_SINK_TMC=y ++CONFIG_CORESIGHT_QCOM_REPLICATOR=y ++CONFIG_CORESIGHT_SINK_TPIU=y ++CONFIG_CORESIGHT_SOURCE_ETM3X=y ++CONFIG_CORESIGHT_SOURCE_ETM4X=y ++CONFIG_CORESIGHT_STM=y ++CONFIG_CORESIGHT_TPDA=y ++CONFIG_CORESIGHT_TPDM=y ++CONFIG_CRC_CCITT=m ++CONFIG_CRYPTO_AKCIPHER=y ++CONFIG_CRYPTO_AKCIPHER2=y ++CONFIG_CRYPTO_DRBG=y ++CONFIG_CRYPTO_DRBG_HMAC=y ++CONFIG_CRYPTO_DRBG_MENU=y ++CONFIG_CRYPTO_GF128MUL=y ++CONFIG_CRYPTO_GHASH=y ++CONFIG_CRYPTO_HASH=y ++CONFIG_CRYPTO_HMAC=y ++CONFIG_CRYPTO_JITTERENTROPY=y ++# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set ++CONFIG_CRYPTO_NULL2=y ++CONFIG_CRYPTO_PCOMP2=y ++CONFIG_CRYPTO_RNG_DEFAULT=y ++CONFIG_CRYPTO_SHA512=y ++CONFIG_DMA_CMA=y ++CONFIG_DMA_SHARED_BUFFER=y ++CONFIG_DT_IDLE_STATES=y ++CONFIG_EDAC_ATOMIC_SCRUB=y ++CONFIG_EDAC_SUPPORT=y ++CONFIG_EXTCON=y ++CONFIG_EXTCON_USB_GPIO=y ++CONFIG_FB_DEFERRED_IO=y ++CONFIG_FREEZER=y ++CONFIG_GPIO_WATCHDOG=y ++CONFIG_GPIO_WATCHDOG_ARCH_INITCALL=y ++CONFIG_IOMMU_API=y ++CONFIG_IOMMU_DMA=y ++CONFIG_IOMMU_IOVA=y ++CONFIG_IOMMU_IO_PGTABLE=y ++# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set ++CONFIG_IOMMU_IO_PGTABLE_LPAE=y ++# CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set ++CONFIG_IOMMU_SUPPORT=y ++CONFIG_ION=y ++CONFIG_ION_MSM=y ++CONFIG_IPQ_APSS_6018=y ++CONFIG_IPQ_GCC_6018=y ++CONFIG_IPQ_MEM_PROFILE=256 ++CONFIG_KASAN_SHADOW_OFFSET=0x5f000000 ++CONFIG_LEDS_PCA9956B=y ++CONFIG_MDIO_QCA=y ++CONFIG_MEMORY_ISOLATION=y ++CONFIG_MIGRATION=y ++CONFIG_MPILIB=y ++CONFIG_MSM_SECURE_BUFFER=y ++CONFIG_NEED_SG_DMA_LENGTH=y ++CONFIG_NET_SWITCHDEV=y ++CONFIG_NUM_ALT_PARTITION=16 ++CONFIG_OF_IOMMU=y ++CONFIG_OID_REGISTRY=y ++CONFIG_OUTER_CACHE=y ++CONFIG_OUTER_CACHE_SYNC=y ++CONFIG_PAGE_OFFSET=0x80000000 ++CONFIG_PINCTRL_IPQ6018=y ++# CONFIG_PKCS7_MESSAGE_PARSER is not set ++# CONFIG_PL310_ERRATA_588369 is not set ++# CONFIG_PL310_ERRATA_727915 is not set ++# CONFIG_PL310_ERRATA_753970 is not set ++# CONFIG_PL310_ERRATA_769419 is not set ++CONFIG_PPS=y ++CONFIG_PTP_1588_CLOCK=y ++CONFIG_PWM_IPQ4019=y ++CONFIG_QCOM_APM=y ++CONFIG_QCOM_DCC=y ++CONFIG_QCOM_QMI_HELPERS=y ++CONFIG_REGMAP_I2C=y ++CONFIG_REGMAP_SPMI=y ++CONFIG_REGULATOR_CPR3=y ++CONFIG_REGULATOR_CPR3_NPU=y ++CONFIG_REGULATOR_CPR4_APSS=y ++# CONFIG_SKB_FIXED_SIZE_2K is not set ++CONFIG_SOC_BUS=y ++CONFIG_SPS=y ++CONFIG_SPS_SUPPORT_NDP_BAM=y ++CONFIG_STAGING=y ++CONFIG_SUSPEND_FREEZER=y ++# CONFIG_USB_GADGET is not set ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++# CONFIG_VFIO is not set ++CONFIG_VIRTIO=y ++CONFIG_VIRTUALIZATION=y ++CONFIG_VMSPLIT_2G=y ++# CONFIG_VMSPLIT_3G is not set ++CONFIG_WANT_DEV_COREDUMP=y +diff --git a/target/linux/ipq807x/ipq60xx/profiles/default.mk b/target/linux/ipq807x/ipq60xx/profiles/default.mk +new file mode 100644 +index 0000000000..f47e73acfc +--- /dev/null ++++ b/target/linux/ipq807x/ipq60xx/profiles/default.mk +@@ -0,0 +1,9 @@ ++define Profile/Default ++ NAME:=Default Profile (minimum package set) ++endef ++ ++define Profile/Default/Description ++Default package set compatible with most boards. ++endef ++$(eval $(call Profile,Default)) ++ +diff --git a/target/linux/ipq807x/ipq60xx/target.mk b/target/linux/ipq807x/ipq60xx/target.mk +new file mode 100644 +index 0000000000..cf2bf7b9cd +--- /dev/null ++++ b/target/linux/ipq807x/ipq60xx/target.mk +@@ -0,0 +1,8 @@ ++SUBTARGET:=ipq60xx ++BOARDNAME:=IPQ60xx based boards ++ ++DEFAULT_PACKAGES += ath11k-firmware-ipq60xx qca-nss-fw-ipq60xx ++ ++define Target/Description ++ Build images for IPQ60xx systems. ++endef +diff --git a/target/linux/ipq807x/ipq807x/config-default b/target/linux/ipq807x/ipq807x/config-default +new file mode 100644 +index 0000000000..f1e8aadc9c +--- /dev/null ++++ b/target/linux/ipq807x/ipq807x/config-default +@@ -0,0 +1,78 @@ ++# CONFIG_AHCI_IPQ is not set ++CONFIG_ARCH_IPQ807x=y ++# CONFIG_DIAGFWD_BRIDGE_CODE is not set ++CONFIG_IPQ_ADSS_807x=y ++CONFIG_IPQ_APSS_807x=y ++CONFIG_IPQ_GCC_807x=y ++CONFIG_NET_SWITCHDEV=y ++CONFIG_NUM_ALT_PARTITION=16 ++CONFIG_PINCTRL_IPQ807x=y ++# CONFIG_IPC_LOGGING is not set ++CONFIG_IPQ_SUBSYSTEM_DUMP=y ++CONFIG_SPS=y ++CONFIG_SPS_SUPPORT_NDP_BAM=y ++CONFIG_CORESIGHT=y ++CONFIG_CORESIGHT_CSR=y ++CONFIG_CORESIGHT_CTI=y ++CONFIG_CORESIGHT_EVENT=y ++CONFIG_CORESIGHT_HWEVENT=y ++CONFIG_CORESIGHT_LINKS_AND_SINKS=y ++CONFIG_CORESIGHT_LINK_AND_SINK_TMC=y ++CONFIG_CORESIGHT_QCOM_REPLICATOR=y ++CONFIG_CORESIGHT_STREAM=m ++# CONFIG_INPUT_PM8941_PWRKEY is not set ++CONFIG_MDIO_QCA=y ++# CONFIG_CRYPTO_ALL_CASES is not set ++CONFIG_CRYPTO_DEV_QCOM_ICE=y ++# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set ++CONFIG_CRYPTO_SHA512=y ++# CONFIG_CORESIGHT_QPDI is not set ++# CONFIG_CORESIGHT_SINK_ETBV10 is not set ++CONFIG_CORESIGHT_SINK_TPIU=y ++# CONFIG_CORESIGHT_SOURCE_DUMMY is not set ++CONFIG_CORESIGHT_SOURCE_ETM3X=y ++CONFIG_CORESIGHT_SOURCE_ETM4X=y ++# CONFIG_CORESIGHT_REMOTE_ETM is not set ++CONFIG_CORESIGHT_STM=y ++CONFIG_CORESIGHT_TPDA=y ++CONFIG_CORESIGHT_TPDM=y ++CONFIG_AQUANTIA_PHY=y ++# CONFIG_CORESIGHT_TPDM_DEFAULT_ENABLE is not set ++CONFIG_IIO=y ++# CONFIG_IIO_BUFFER is not set ++# CONFIG_IIO_TRIGGER is not set ++CONFIG_PCIE_DW_PLAT=y ++CONFIG_VMSPLIT_2G=y ++# CONFIG_VMSPLIT_3G is not set ++CONFIG_PPS=y ++CONFIG_PTP_1588_CLOCK=y ++# CONFIG_DP83640_PHY is not set ++CONFIG_PWM_IPQ4019=y ++CONFIG_QCOM_APM=y ++CONFIG_QCOM_DCC=y ++# CONFIG_QCOM_SPMI_TEMP_ALARM is not set ++CONFIG_QCOM_SPMI_VADC=y ++CONFIG_REGMAP_ALLOW_WRITE_DEBUGFS=y ++CONFIG_REGULATOR_CPR3=y ++CONFIG_REGULATOR_CPR3_NPU=y ++CONFIG_REGULATOR_CPR4_APSS=y ++CONFIG_MMC_SDHCI_MSM_ICE=y ++CONFIG_USB_BAM=y ++CONFIG_USB_QCOM_KS_BRIDGE=m ++CONFIG_MAILBOX=y ++# CONFIG_USB_QCOM_DIAG_BRIDGE is not set ++# CONFIG_USB_CONFIGFS_F_DIAG is not set ++# CONFIG_NF_IPV6_DUMMY_HEADER is not set ++CONFIG_RMNET=y ++CONFIG_RMNET_DATA=y ++CONFIG_RMNET_DATA_DEBUG_PKT=y ++# CONFIG_RMNET_DATA_FC is not set ++CONFIG_QCOM_QMI_RMNET=y ++CONFIG_QCOM_QMI_DFC=y ++CONFIG_QCOM_QMI_POWER_COLLAPSE=y ++CONFIG_RMNET_CTL=y ++CONFIG_RMNET_CTL_DEBUG=y ++CONFIG_MHI_BUS_TEST=y ++CONFIG_MHI_DEBUG=y ++CONFIG_MHI_NETDEV=y ++CONFIG_MHI_UCI=y +diff --git a/target/linux/ipq807x/ipq807x/profiles/default.mk b/target/linux/ipq807x/ipq807x/profiles/default.mk +new file mode 100644 +index 0000000000..f47e73acfc +--- /dev/null ++++ b/target/linux/ipq807x/ipq807x/profiles/default.mk +@@ -0,0 +1,9 @@ ++define Profile/Default ++ NAME:=Default Profile (minimum package set) ++endef ++ ++define Profile/Default/Description ++Default package set compatible with most boards. ++endef ++$(eval $(call Profile,Default)) ++ +diff --git a/target/linux/ipq807x/ipq807x/target.mk b/target/linux/ipq807x/ipq807x/target.mk +new file mode 100644 +index 0000000000..7c24b66e60 +--- /dev/null ++++ b/target/linux/ipq807x/ipq807x/target.mk +@@ -0,0 +1,7 @@ ++SUBTARGET:=ipq807x ++BOARDNAME:=IPQ807x based boards ++ ++DEFAULT_PACKAGES += ath11k-firmware-ipq807x qca-nss-fw-ipq807x ++define Target/Description ++ Build images for IPQ807x systems. ++endef +diff --git a/target/linux/ipq807x/modules.mk b/target/linux/ipq807x/modules.mk +new file mode 100644 +index 0000000000..0223ff2590 +--- /dev/null ++++ b/target/linux/ipq807x/modules.mk +@@ -0,0 +1,61 @@ ++define KernelPackage/usb-phy-ipq807x ++ TITLE:=DWC3 USB QCOM PHY driver for IPQ807x ++ DEPENDS:=@TARGET_ipq807x ++ KCONFIG:= \ ++ CONFIG_USB_QCOM_QUSB_PHY \ ++ CONFIG_USB_QCOM_QMP_PHY ++ FILES:= \ ++ $(LINUX_DIR)/drivers/usb/phy/phy-msm-qusb.ko \ ++ $(LINUX_DIR)/drivers/usb/phy/phy-msm-ssusb-qmp.ko ++ AUTOLOAD:=$(call AutoLoad,45,phy-msm-qusb phy-msm-ssusb-qmp,1) ++ $(call AddDepends/usb) ++endef ++ ++define KernelPackage/usb-phy-ipq807x/description ++ This driver provides support for the USB PHY drivers ++ within the IPQ807x SoCs. ++endef ++ ++$(eval $(call KernelPackage,usb-phy-ipq807x)) ++ ++ ++define KernelPackage/qrtr_mproc ++ TITLE:= Ath11k Specific kernel configs for IPQ807x and IPQ60xx ++ DEPENDS+= @TARGET_ipq807x ++ KCONFIG:= \ ++ CONFIG_QRTR=y \ ++ CONFIG_QRTR_MHI=y \ ++ CONFIG_MHI_BUS=y \ ++ CONFIG_MHI_QTI=y \ ++ CONFIG_QCOM_APCS_IPC=y \ ++ CONFIG_QCOM_GLINK_SSR=y \ ++ CONFIG_QCOM_Q6V5_WCSS=y \ ++ CONFIG_MSM_RPM_RPMSG=y \ ++ CONFIG_RPMSG_QCOM_GLINK_RPM=y \ ++ CONFIG_REGULATOR_RPM_GLINK=y \ ++ CONFIG_QCOM_SYSMON=y \ ++ CONFIG_RPMSG=y \ ++ CONFIG_RPMSG_CHAR=y \ ++ CONFIG_RPMSG_QCOM_GLINK_SMEM=y \ ++ CONFIG_RPMSG_QCOM_SMD=y \ ++ CONFIG_QRTR_SMD=y \ ++ CONFIG_QCOM_QMI_HELPERS=y \ ++ CONFIG_SAMPLES=y \ ++ CONFIG_SAMPLE_QMI_CLIENT=m \ ++ CONFIG_SAMPLE_TRACE_EVENTS=n \ ++ CONFIG_SAMPLE_KOBJECT=n \ ++ CONFIG_SAMPLE_KPROBES=n \ ++ CONFIG_SAMPLE_KRETPROBES=n \ ++ CONFIG_SAMPLE_HW_BREAKPOINT=n \ ++ CONFIG_SAMPLE_KFIFO=n \ ++ CONFIG_SAMPLE_CONFIGFS=n \ ++ CONFIG_SAMPLE_RPMSG_CLIENT=n \ ++ CONFIG_MAILBOX=y \ ++ CONFIG_DIAG_OVER_QRTR=y ++endef ++ ++define KernelPackage/qrtr_mproc/description ++Kernel configs for ath11k support specific to ipq807x and IPQ60xx ++endef ++ ++$(eval $(call KernelPackage,qrtr_mproc)) +diff --git a/target/linux/ipq807x/patches/100-qrtr-ns.patch b/target/linux/ipq807x/patches/100-qrtr-ns.patch +new file mode 100644 +index 0000000000..850e644778 +--- /dev/null ++++ b/target/linux/ipq807x/patches/100-qrtr-ns.patch +@@ -0,0 +1,976 @@ ++Index: linux-4.4.60/net/qrtr/ns.c ++=================================================================== ++--- /dev/null +++++ linux-4.4.60/net/qrtr/ns.c ++@@ -0,0 +1,760 @@ +++// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +++/* +++ * Copyright (c) 2015, Sony Mobile Communications Inc. +++ * Copyright (c) 2013, The Linux Foundation. All rights reserved. +++ * Copyright (c) 2020, Linaro Ltd. +++ */ +++ +++#include +++#include +++#include +++#include +++ +++#include "qrtr.h" +++ +++#define CREATE_TRACE_POINTS +++#include +++ +++static RADIX_TREE(nodes, GFP_KERNEL); +++ +++static struct { +++ struct socket *sock; +++ struct sockaddr_qrtr bcast_sq; +++ struct list_head lookups; +++ struct workqueue_struct *workqueue; +++ struct work_struct work; +++ int local_node; +++} qrtr_ns; +++ +++static const char * const qrtr_ctrl_pkt_strings[] = { +++ [QRTR_TYPE_HELLO] = "hello", +++ [QRTR_TYPE_BYE] = "bye", +++ [QRTR_TYPE_NEW_SERVER] = "new-server", +++ [QRTR_TYPE_DEL_SERVER] = "del-server", +++ [QRTR_TYPE_DEL_CLIENT] = "del-client", +++ [QRTR_TYPE_RESUME_TX] = "resume-tx", +++ [QRTR_TYPE_EXIT] = "exit", +++ [QRTR_TYPE_PING] = "ping", +++ [QRTR_TYPE_NEW_LOOKUP] = "new-lookup", +++ [QRTR_TYPE_DEL_LOOKUP] = "del-lookup", +++}; +++ +++struct qrtr_server_filter { +++ unsigned int service; +++ unsigned int instance; +++ unsigned int ifilter; +++}; +++ +++struct qrtr_lookup { +++ unsigned int service; +++ unsigned int instance; +++ +++ struct sockaddr_qrtr sq; +++ struct list_head li; +++}; +++ +++struct qrtr_server { +++ unsigned int service; +++ unsigned int instance; +++ +++ unsigned int node; +++ unsigned int port; +++ +++ struct list_head qli; +++}; +++ +++struct qrtr_node { +++ unsigned int id; +++ struct radix_tree_root servers; +++}; +++ +++static struct qrtr_node *node_get(unsigned int node_id) +++{ +++ struct qrtr_node *node; +++ +++ node = radix_tree_lookup(&nodes, node_id); +++ if (node) +++ return node; +++ +++ /* If node didn't exist, allocate and insert it to the tree */ +++ node = kzalloc(sizeof(*node), GFP_KERNEL); +++ if (!node) +++ return NULL; +++ +++ node->id = node_id; +++ +++ radix_tree_insert(&nodes, node_id, node); +++ +++ return node; +++} +++ +++static int server_match(const struct qrtr_server *srv, +++ const struct qrtr_server_filter *f) +++{ +++ unsigned int ifilter = f->ifilter; +++ +++ if (f->service != 0 && srv->service != f->service) +++ return 0; +++ if (!ifilter && f->instance) +++ ifilter = ~0; +++ +++ return (srv->instance & ifilter) == f->instance; +++} +++ +++static int service_announce_new(struct sockaddr_qrtr *dest, +++ struct qrtr_server *srv) +++{ +++ struct qrtr_ctrl_pkt pkt; +++ struct msghdr msg = { }; +++ struct kvec iv; +++ +++ trace_qrtr_ns_service_announce_new(srv->service, srv->instance, +++ srv->node, srv->port); +++ +++ iv.iov_base = &pkt; +++ iv.iov_len = sizeof(pkt); +++ +++ memset(&pkt, 0, sizeof(pkt)); +++ pkt.cmd = cpu_to_le32(QRTR_TYPE_NEW_SERVER); +++ pkt.server.service = cpu_to_le32(srv->service); +++ pkt.server.instance = cpu_to_le32(srv->instance); +++ pkt.server.node = cpu_to_le32(srv->node); +++ pkt.server.port = cpu_to_le32(srv->port); +++ +++ msg.msg_name = (struct sockaddr *)dest; +++ msg.msg_namelen = sizeof(*dest); +++ +++ return kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt)); +++} +++ +++static int service_announce_del(struct sockaddr_qrtr *dest, +++ struct qrtr_server *srv) +++{ +++ struct qrtr_ctrl_pkt pkt; +++ struct msghdr msg = { }; +++ struct kvec iv; +++ int ret; +++ +++ trace_qrtr_ns_service_announce_del(srv->service, srv->instance, +++ srv->node, srv->port); +++ +++ iv.iov_base = &pkt; +++ iv.iov_len = sizeof(pkt); +++ +++ memset(&pkt, 0, sizeof(pkt)); +++ pkt.cmd = cpu_to_le32(QRTR_TYPE_DEL_SERVER); +++ pkt.server.service = cpu_to_le32(srv->service); +++ pkt.server.instance = cpu_to_le32(srv->instance); +++ pkt.server.node = cpu_to_le32(srv->node); +++ pkt.server.port = cpu_to_le32(srv->port); +++ +++ msg.msg_name = (struct sockaddr *)dest; +++ msg.msg_namelen = sizeof(*dest); +++ +++ ret = kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt)); +++ if (ret < 0) +++ pr_err("failed to announce del service\n"); +++ +++ return ret; +++} +++ +++static void lookup_notify(struct sockaddr_qrtr *to, struct qrtr_server *srv, +++ bool new) +++{ +++ struct qrtr_ctrl_pkt pkt; +++ struct msghdr msg = { }; +++ struct kvec iv; +++ int ret; +++ +++ iv.iov_base = &pkt; +++ iv.iov_len = sizeof(pkt); +++ +++ memset(&pkt, 0, sizeof(pkt)); +++ pkt.cmd = new ? cpu_to_le32(QRTR_TYPE_NEW_SERVER) : +++ cpu_to_le32(QRTR_TYPE_DEL_SERVER); +++ if (srv) { +++ pkt.server.service = cpu_to_le32(srv->service); +++ pkt.server.instance = cpu_to_le32(srv->instance); +++ pkt.server.node = cpu_to_le32(srv->node); +++ pkt.server.port = cpu_to_le32(srv->port); +++ } +++ +++ msg.msg_name = (struct sockaddr *)to; +++ msg.msg_namelen = sizeof(*to); +++ +++ ret = kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt)); +++ if (ret < 0) +++ pr_err("failed to send lookup notification\n"); +++} +++ +++static int announce_servers(struct sockaddr_qrtr *sq) +++{ +++ struct radix_tree_iter iter; +++ struct qrtr_server *srv; +++ struct qrtr_node *node; +++ void __rcu **slot; +++ int ret; +++ +++ node = node_get(qrtr_ns.local_node); +++ if (!node) +++ return 0; +++ +++ /* Announce the list of servers registered in this node */ +++ radix_tree_for_each_slot(slot, &node->servers, &iter, 0) { +++ srv = radix_tree_deref_slot(slot); +++ +++ ret = service_announce_new(sq, srv); +++ if (ret < 0) { +++ pr_err("failed to announce new service\n"); +++ return ret; +++ } +++ } +++ +++ return 0; +++} +++ +++static struct qrtr_server *server_add(unsigned int service, +++ unsigned int instance, +++ unsigned int node_id, +++ unsigned int port) +++{ +++ struct qrtr_server *srv; +++ struct qrtr_server *old; +++ struct qrtr_node *node; +++ +++ if (!service || !port) +++ return NULL; +++ +++ srv = kzalloc(sizeof(*srv), GFP_KERNEL); +++ if (!srv) +++ return NULL; +++ +++ srv->service = service; +++ srv->instance = instance; +++ srv->node = node_id; +++ srv->port = port; +++ +++ node = node_get(node_id); +++ if (!node) +++ goto err; +++ +++ /* Delete the old server on the same port */ +++ old = radix_tree_lookup(&node->servers, port); +++ if (old) { +++ radix_tree_delete(&node->servers, port); +++ kfree(old); +++ } +++ +++ radix_tree_insert(&node->servers, port, srv); +++ +++ trace_qrtr_ns_server_add(srv->service, srv->instance, +++ srv->node, srv->port); +++ +++ return srv; +++ +++err: +++ kfree(srv); +++ return NULL; +++} +++ +++static int server_del(struct qrtr_node *node, unsigned int port) +++{ +++ struct qrtr_lookup *lookup; +++ struct qrtr_server *srv; +++ struct list_head *li; +++ +++ srv = radix_tree_lookup(&node->servers, port); +++ if (!srv) +++ return -ENOENT; +++ +++ radix_tree_delete(&node->servers, port); +++ +++ /* Broadcast the removal of local servers */ +++ if (srv->node == qrtr_ns.local_node) +++ service_announce_del(&qrtr_ns.bcast_sq, srv); +++ +++ /* Announce the service's disappearance to observers */ +++ list_for_each(li, &qrtr_ns.lookups) { +++ lookup = container_of(li, struct qrtr_lookup, li); +++ if (lookup->service && lookup->service != srv->service) +++ continue; +++ if (lookup->instance && lookup->instance != srv->instance) +++ continue; +++ +++ lookup_notify(&lookup->sq, srv, false); +++ } +++ +++ kfree(srv); +++ +++ return 0; +++} +++ +++static int say_hello(struct sockaddr_qrtr *dest) +++{ +++ struct qrtr_ctrl_pkt pkt; +++ struct msghdr msg = { }; +++ struct kvec iv; +++ int ret; +++ +++ iv.iov_base = &pkt; +++ iv.iov_len = sizeof(pkt); +++ +++ memset(&pkt, 0, sizeof(pkt)); +++ pkt.cmd = cpu_to_le32(QRTR_TYPE_HELLO); +++ +++ msg.msg_name = (struct sockaddr *)dest; +++ msg.msg_namelen = sizeof(*dest); +++ +++ ret = kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt)); +++ if (ret < 0) +++ pr_err("failed to send hello msg\n"); +++ +++ return ret; +++} +++ +++/* Announce the list of servers registered on the local node */ +++static int ctrl_cmd_hello(struct sockaddr_qrtr *sq) +++{ +++ int ret; +++ +++ ret = say_hello(sq); +++ if (ret < 0) +++ return ret; +++ +++ return announce_servers(sq); +++} +++ +++static int ctrl_cmd_bye(struct sockaddr_qrtr *from) +++{ +++ struct qrtr_node *local_node; +++ struct radix_tree_iter iter; +++ struct qrtr_ctrl_pkt pkt; +++ struct qrtr_server *srv; +++ struct sockaddr_qrtr sq; +++ struct msghdr msg = { }; +++ struct qrtr_node *node; +++ void __rcu **slot; +++ struct kvec iv; +++ int ret; +++ +++ iv.iov_base = &pkt; +++ iv.iov_len = sizeof(pkt); +++ +++ node = node_get(from->sq_node); +++ if (!node) +++ return 0; +++ +++ /* Advertise removal of this client to all servers of remote node */ +++ radix_tree_for_each_slot(slot, &node->servers, &iter, 0) { +++ srv = radix_tree_deref_slot(slot); +++ server_del(node, srv->port); +++ } +++ +++ /* Advertise the removal of this client to all local servers */ +++ local_node = node_get(qrtr_ns.local_node); +++ if (!local_node) +++ return 0; +++ +++ memset(&pkt, 0, sizeof(pkt)); +++ pkt.cmd = cpu_to_le32(QRTR_TYPE_BYE); +++ pkt.client.node = cpu_to_le32(from->sq_node); +++ +++ radix_tree_for_each_slot(slot, &local_node->servers, &iter, 0) { +++ srv = radix_tree_deref_slot(slot); +++ +++ sq.sq_family = AF_QIPCRTR; +++ sq.sq_node = srv->node; +++ sq.sq_port = srv->port; +++ +++ msg.msg_name = (struct sockaddr *)&sq; +++ msg.msg_namelen = sizeof(sq); +++ +++ ret = kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt)); +++ if (ret < 0) { +++ pr_err("failed to send bye cmd\n"); +++ return ret; +++ } +++ } +++ +++ return 0; +++} +++ +++static int ctrl_cmd_del_client(struct sockaddr_qrtr *from, +++ unsigned int node_id, unsigned int port) +++{ +++ struct qrtr_node *local_node; +++ struct radix_tree_iter iter; +++ struct qrtr_lookup *lookup; +++ struct qrtr_ctrl_pkt pkt; +++ struct msghdr msg = { }; +++ struct qrtr_server *srv; +++ struct sockaddr_qrtr sq; +++ struct qrtr_node *node; +++ struct list_head *tmp; +++ struct list_head *li; +++ void __rcu **slot; +++ struct kvec iv; +++ int ret; +++ +++ iv.iov_base = &pkt; +++ iv.iov_len = sizeof(pkt); +++ +++ /* Don't accept spoofed messages */ +++ if (from->sq_node != node_id) +++ return -EINVAL; +++ +++ /* Local DEL_CLIENT messages comes from the port being closed */ +++ if (from->sq_node == qrtr_ns.local_node && from->sq_port != port) +++ return -EINVAL; +++ +++ /* Remove any lookups by this client */ +++ list_for_each_safe(li, tmp, &qrtr_ns.lookups) { +++ lookup = container_of(li, struct qrtr_lookup, li); +++ if (lookup->sq.sq_node != node_id) +++ continue; +++ if (lookup->sq.sq_port != port) +++ continue; +++ +++ list_del(&lookup->li); +++ kfree(lookup); +++ } +++ +++ /* Remove the server belonging to this port */ +++ node = node_get(node_id); +++ if (node) +++ server_del(node, port); +++ +++ /* Advertise the removal of this client to all local servers */ +++ local_node = node_get(qrtr_ns.local_node); +++ if (!local_node) +++ return 0; +++ +++ memset(&pkt, 0, sizeof(pkt)); +++ pkt.cmd = cpu_to_le32(QRTR_TYPE_DEL_CLIENT); +++ pkt.client.node = cpu_to_le32(node_id); +++ pkt.client.port = cpu_to_le32(port); +++ +++ radix_tree_for_each_slot(slot, &local_node->servers, &iter, 0) { +++ srv = radix_tree_deref_slot(slot); +++ +++ sq.sq_family = AF_QIPCRTR; +++ sq.sq_node = srv->node; +++ sq.sq_port = srv->port; +++ +++ msg.msg_name = (struct sockaddr *)&sq; +++ msg.msg_namelen = sizeof(sq); +++ +++ ret = kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt)); +++ if (ret < 0) { +++ pr_err("failed to send del client cmd\n"); +++ return ret; +++ } +++ } +++ +++ return 0; +++} +++ +++static int ctrl_cmd_new_server(struct sockaddr_qrtr *from, +++ unsigned int service, unsigned int instance, +++ unsigned int node_id, unsigned int port) +++{ +++ struct qrtr_lookup *lookup; +++ struct qrtr_server *srv; +++ struct list_head *li; +++ int ret = 0; +++ +++ /* Ignore specified node and port for local servers */ +++ if (from->sq_node == qrtr_ns.local_node) { +++ node_id = from->sq_node; +++ port = from->sq_port; +++ } +++ +++ /* Don't accept spoofed messages */ +++ if (from->sq_node != node_id) +++ return -EINVAL; +++ +++ srv = server_add(service, instance, node_id, port); +++ if (!srv) +++ return -EINVAL; +++ +++ if (srv->node == qrtr_ns.local_node) { +++ ret = service_announce_new(&qrtr_ns.bcast_sq, srv); +++ if (ret < 0) { +++ pr_err("failed to announce new service\n"); +++ return ret; +++ } +++ } +++ +++ /* Notify any potential lookups about the new server */ +++ list_for_each(li, &qrtr_ns.lookups) { +++ lookup = container_of(li, struct qrtr_lookup, li); +++ if (lookup->service && lookup->service != service) +++ continue; +++ if (lookup->instance && lookup->instance != instance) +++ continue; +++ +++ lookup_notify(&lookup->sq, srv, true); +++ } +++ +++ return ret; +++} +++ +++static int ctrl_cmd_del_server(struct sockaddr_qrtr *from, +++ unsigned int service, unsigned int instance, +++ unsigned int node_id, unsigned int port) +++{ +++ struct qrtr_node *node; +++ +++ /* Ignore specified node and port for local servers*/ +++ if (from->sq_node == qrtr_ns.local_node) { +++ node_id = from->sq_node; +++ port = from->sq_port; +++ } +++ +++ /* Don't accept spoofed messages */ +++ if (from->sq_node != node_id) +++ return -EINVAL; +++ +++ /* Local servers may only unregister themselves */ +++ if (from->sq_node == qrtr_ns.local_node && from->sq_port != port) +++ return -EINVAL; +++ +++ node = node_get(node_id); +++ if (!node) +++ return -ENOENT; +++ +++ return server_del(node, port); +++} +++ +++static int ctrl_cmd_new_lookup(struct sockaddr_qrtr *from, +++ unsigned int service, unsigned int instance) +++{ +++ struct radix_tree_iter node_iter; +++ struct qrtr_server_filter filter; +++ struct radix_tree_iter srv_iter; +++ struct qrtr_lookup *lookup; +++ struct qrtr_node *node; +++ void __rcu **node_slot; +++ void __rcu **srv_slot; +++ +++ /* Accept only local observers */ +++ if (from->sq_node != qrtr_ns.local_node) +++ return -EINVAL; +++ +++ lookup = kzalloc(sizeof(*lookup), GFP_KERNEL); +++ if (!lookup) +++ return -ENOMEM; +++ +++ lookup->sq = *from; +++ lookup->service = service; +++ lookup->instance = instance; +++ list_add_tail(&lookup->li, &qrtr_ns.lookups); +++ +++ memset(&filter, 0, sizeof(filter)); +++ filter.service = service; +++ filter.instance = instance; +++ +++ radix_tree_for_each_slot(node_slot, &nodes, &node_iter, 0) { +++ node = radix_tree_deref_slot(node_slot); +++ +++ radix_tree_for_each_slot(srv_slot, &node->servers, +++ &srv_iter, 0) { +++ struct qrtr_server *srv; +++ +++ srv = radix_tree_deref_slot(srv_slot); +++ if (!server_match(srv, &filter)) +++ continue; +++ +++ lookup_notify(from, srv, true); +++ } +++ } +++ +++ /* Empty notification, to indicate end of listing */ +++ lookup_notify(from, NULL, true); +++ +++ return 0; +++} +++ +++static void ctrl_cmd_del_lookup(struct sockaddr_qrtr *from, +++ unsigned int service, unsigned int instance) +++{ +++ struct qrtr_lookup *lookup; +++ struct list_head *tmp; +++ struct list_head *li; +++ +++ list_for_each_safe(li, tmp, &qrtr_ns.lookups) { +++ lookup = container_of(li, struct qrtr_lookup, li); +++ if (lookup->sq.sq_node != from->sq_node) +++ continue; +++ if (lookup->sq.sq_port != from->sq_port) +++ continue; +++ if (lookup->service != service) +++ continue; +++ if (lookup->instance && lookup->instance != instance) +++ continue; +++ +++ list_del(&lookup->li); +++ kfree(lookup); +++ } +++} +++ +++static void qrtr_ns_worker(struct work_struct *work) +++{ +++ const struct qrtr_ctrl_pkt *pkt; +++ size_t recv_buf_size = 4096; +++ struct sockaddr_qrtr sq; +++ struct msghdr msg = { }; +++ unsigned int cmd; +++ ssize_t msglen; +++ void *recv_buf; +++ struct kvec iv; +++ int ret; +++ +++ msg.msg_name = (struct sockaddr *)&sq; +++ msg.msg_namelen = sizeof(sq); +++ +++ recv_buf = kzalloc(recv_buf_size, GFP_KERNEL); +++ if (!recv_buf) +++ return; +++ +++ for (;;) { +++ iv.iov_base = recv_buf; +++ iv.iov_len = recv_buf_size; +++ +++ msglen = kernel_recvmsg(qrtr_ns.sock, &msg, &iv, 1, +++ iv.iov_len, MSG_DONTWAIT); +++ +++ if (msglen == -EAGAIN) +++ break; +++ +++ if (msglen < 0) { +++ pr_err("error receiving packet: %zd\n", msglen); +++ break; +++ } +++ +++ pkt = recv_buf; +++ cmd = le32_to_cpu(pkt->cmd); +++ if (cmd < ARRAY_SIZE(qrtr_ctrl_pkt_strings) && +++ qrtr_ctrl_pkt_strings[cmd]) +++ trace_qrtr_ns_message(qrtr_ctrl_pkt_strings[cmd], +++ sq.sq_node, sq.sq_port); +++ +++ ret = 0; +++ switch (cmd) { +++ case QRTR_TYPE_HELLO: +++ ret = ctrl_cmd_hello(&sq); +++ break; +++ case QRTR_TYPE_BYE: +++ ret = ctrl_cmd_bye(&sq); +++ break; +++ case QRTR_TYPE_DEL_CLIENT: +++ ret = ctrl_cmd_del_client(&sq, +++ le32_to_cpu(pkt->client.node), +++ le32_to_cpu(pkt->client.port)); +++ break; +++ case QRTR_TYPE_NEW_SERVER: +++ ret = ctrl_cmd_new_server(&sq, +++ le32_to_cpu(pkt->server.service), +++ le32_to_cpu(pkt->server.instance), +++ le32_to_cpu(pkt->server.node), +++ le32_to_cpu(pkt->server.port)); +++ break; +++ case QRTR_TYPE_DEL_SERVER: +++ ret = ctrl_cmd_del_server(&sq, +++ le32_to_cpu(pkt->server.service), +++ le32_to_cpu(pkt->server.instance), +++ le32_to_cpu(pkt->server.node), +++ le32_to_cpu(pkt->server.port)); +++ break; +++ case QRTR_TYPE_EXIT: +++ case QRTR_TYPE_PING: +++ case QRTR_TYPE_RESUME_TX: +++ break; +++ case QRTR_TYPE_NEW_LOOKUP: +++ ret = ctrl_cmd_new_lookup(&sq, +++ le32_to_cpu(pkt->server.service), +++ le32_to_cpu(pkt->server.instance)); +++ break; +++ case QRTR_TYPE_DEL_LOOKUP: +++ ctrl_cmd_del_lookup(&sq, +++ le32_to_cpu(pkt->server.service), +++ le32_to_cpu(pkt->server.instance)); +++ break; +++ } +++ +++ if (ret < 0) +++ pr_err("failed while handling packet from %d:%d", +++ sq.sq_node, sq.sq_port); +++ } +++ +++ kfree(recv_buf); +++} +++ +++static void qrtr_ns_data_ready(struct sock *sk) +++{ +++ queue_work(qrtr_ns.workqueue, &qrtr_ns.work); +++} +++ +++void qrtr_ns_init(void) +++{ +++ struct sockaddr_qrtr sq; +++ int sl = sizeof(sq); +++ int ret; +++ +++ INIT_LIST_HEAD(&qrtr_ns.lookups); +++ INIT_WORK(&qrtr_ns.work, qrtr_ns_worker); +++ +++ ret = sock_create_kern(&init_net, AF_QIPCRTR, SOCK_DGRAM, +++ PF_QIPCRTR, &qrtr_ns.sock); +++ if (ret < 0) +++ return; +++ +++ ret = kernel_getsockname(qrtr_ns.sock, (struct sockaddr *)&sq, &sl); +++ if (ret < 0) { +++ pr_err("failed to get socket name\n"); +++ goto err_sock; +++ } +++ +++ qrtr_ns.workqueue = alloc_workqueue("qrtr_ns_handler", WQ_UNBOUND, 1); +++ if (!qrtr_ns.workqueue) +++ goto err_sock; +++ +++ qrtr_ns.sock->sk->sk_data_ready = qrtr_ns_data_ready; +++ +++ sq.sq_port = QRTR_PORT_CTRL; +++ qrtr_ns.local_node = sq.sq_node; +++ +++ ret = kernel_bind(qrtr_ns.sock, (struct sockaddr *)&sq, sizeof(sq)); +++ if (ret < 0) { +++ pr_err("failed to bind to socket\n"); +++ goto err_wq; +++ } +++ +++ qrtr_ns.bcast_sq.sq_family = AF_QIPCRTR; +++ qrtr_ns.bcast_sq.sq_node = QRTR_NODE_BCAST; +++ qrtr_ns.bcast_sq.sq_port = QRTR_PORT_CTRL; +++ +++ ret = say_hello(&qrtr_ns.bcast_sq); +++ if (ret < 0) +++ goto err_wq; +++ +++ return; +++ +++err_wq: +++ destroy_workqueue(qrtr_ns.workqueue); +++err_sock: +++ sock_release(qrtr_ns.sock); +++} +++EXPORT_SYMBOL_GPL(qrtr_ns_init); +++ +++void qrtr_ns_remove(void) +++{ +++ cancel_work_sync(&qrtr_ns.work); +++ destroy_workqueue(qrtr_ns.workqueue); +++ sock_release(qrtr_ns.sock); +++} +++EXPORT_SYMBOL_GPL(qrtr_ns_remove); +++ +++MODULE_AUTHOR("Manivannan Sadhasivam "); +++MODULE_DESCRIPTION("Qualcomm IPC Router Nameservice"); +++MODULE_LICENSE("Dual BSD/GPL"); ++Index: linux-4.4.60/net/qrtr/qrtr.c ++=================================================================== ++--- linux-4.4.60.orig/net/qrtr/qrtr.c +++++ linux-4.4.60/net/qrtr/qrtr.c ++@@ -135,6 +135,8 @@ static DEFINE_IDR(qrtr_ports); ++ static DEFINE_MUTEX(qrtr_port_lock); ++ static DEFINE_MUTEX(qrtr_node_locking); ++ +++static struct delayed_work qrtr_ns_work; +++ ++ /** ++ * struct qrtr_node - endpoint node ++ * @ep_lock: lock for endpoint management and callbacks ++@@ -1765,33 +1767,6 @@ static int qrtr_create(struct net *net, ++ return 0; ++ } ++ ++-static const struct nla_policy qrtr_policy[IFA_MAX + 1] = { ++- [IFA_LOCAL] = { .type = NLA_U32 }, ++-}; ++- ++-static int qrtr_addr_doit(struct sk_buff *skb, struct nlmsghdr *nlh) ++-{ ++- struct nlattr *tb[IFA_MAX + 1]; ++- struct ifaddrmsg *ifm; ++- int rc; ++- ++- if (!netlink_capable(skb, CAP_NET_ADMIN)) ++- return -EPERM; ++- ++- ASSERT_RTNL(); ++- ++- rc = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, qrtr_policy); ++- if (rc < 0) ++- return rc; ++- ++- ifm = nlmsg_data(nlh); ++- if (!tb[IFA_LOCAL]) ++- return -EINVAL; ++- ++- qrtr_local_nid = nla_get_u32(tb[IFA_LOCAL]); ++- return 0; ++-} ++- ++ static const struct net_proto_family qrtr_family = { ++ .owner = THIS_MODULE, ++ .family = AF_QIPCRTR, ++@@ -1811,7 +1786,8 @@ static int __init qrtr_proto_init(void) ++ proto_unregister(&qrtr_proto); ++ return rc; ++ } ++- rtnl_register(PF_QIPCRTR, RTM_NEWADDR, qrtr_addr_doit, NULL, NULL); +++ +++ qrtr_ns_init(); ++ ++ return 0; ++ } ++@@ -1819,7 +1795,8 @@ postcore_initcall(qrtr_proto_init); ++ ++ static void __exit qrtr_proto_fini(void) ++ { ++- rtnl_unregister(PF_QIPCRTR, RTM_NEWADDR); +++ cancel_delayed_work_sync(&qrtr_ns_work); +++ qrtr_ns_remove(); ++ sock_unregister(qrtr_family.family); ++ proto_unregister(&qrtr_proto); ++ } ++Index: linux-4.4.60/net/qrtr/qrtr.h ++=================================================================== ++--- linux-4.4.60.orig/net/qrtr/qrtr.h +++++ linux-4.4.60/net/qrtr/qrtr.h ++@@ -33,4 +33,9 @@ void qrtr_endpoint_unregister(struct qrt ++ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len); ++ ++ int qrtr_peek_pkt_size(const void *data); +++ +++void qrtr_ns_init(void); +++ +++void qrtr_ns_remove(void); +++ ++ #endif ++Index: linux-4.4.60/net/qrtr/Makefile ++=================================================================== ++--- linux-4.4.60.orig/net/qrtr/Makefile +++++ linux-4.4.60/net/qrtr/Makefile ++@@ -1,4 +1,4 @@ ++-obj-$(CONFIG_QRTR) := qrtr.o +++obj-$(CONFIG_QRTR) := qrtr.o ns.o ++ ++ obj-$(CONFIG_QRTR_SMD) += qrtr-smd.o ++ qrtr-smd-y := smd.o ++Index: linux-4.4.60/include/trace/events/qrtr.h ++=================================================================== ++--- /dev/null +++++ linux-4.4.60/include/trace/events/qrtr.h ++@@ -0,0 +1,115 @@ +++/* SPDX-License-Identifier: GPL-2.0 */ +++#undef TRACE_SYSTEM +++#define TRACE_SYSTEM qrtr +++ +++#if !defined(_TRACE_QRTR_H) || defined(TRACE_HEADER_MULTI_READ) +++#define _TRACE_QRTR_H +++ +++#include +++#include +++ +++TRACE_EVENT(qrtr_ns_service_announce_new, +++ +++ TP_PROTO(__le32 service, __le32 instance, __le32 node, __le32 port), +++ +++ TP_ARGS(service, instance, node, port), +++ +++ TP_STRUCT__entry( +++ __field(__le32, service) +++ __field(__le32, instance) +++ __field(__le32, node) +++ __field(__le32, port) +++ ), +++ +++ TP_fast_assign( +++ __entry->service = service; +++ __entry->instance = instance; +++ __entry->node = node; +++ __entry->port = port; +++ ), +++ +++ TP_printk("advertising new server [%d:%x]@[%d:%d]", +++ __entry->service, __entry->instance, __entry->node, +++ __entry->port +++ ) +++); +++ +++TRACE_EVENT(qrtr_ns_service_announce_del, +++ +++ TP_PROTO(__le32 service, __le32 instance, __le32 node, __le32 port), +++ +++ TP_ARGS(service, instance, node, port), +++ +++ TP_STRUCT__entry( +++ __field(__le32, service) +++ __field(__le32, instance) +++ __field(__le32, node) +++ __field(__le32, port) +++ ), +++ +++ TP_fast_assign( +++ __entry->service = service; +++ __entry->instance = instance; +++ __entry->node = node; +++ __entry->port = port; +++ ), +++ +++ TP_printk("advertising removal of server [%d:%x]@[%d:%d]", +++ __entry->service, __entry->instance, __entry->node, +++ __entry->port +++ ) +++); +++ +++TRACE_EVENT(qrtr_ns_server_add, +++ +++ TP_PROTO(__le32 service, __le32 instance, __le32 node, __le32 port), +++ +++ TP_ARGS(service, instance, node, port), +++ +++ TP_STRUCT__entry( +++ __field(__le32, service) +++ __field(__le32, instance) +++ __field(__le32, node) +++ __field(__le32, port) +++ ), +++ +++ TP_fast_assign( +++ __entry->service = service; +++ __entry->instance = instance; +++ __entry->node = node; +++ __entry->port = port; +++ ), +++ +++ TP_printk("add server [%d:%x]@[%d:%d]", +++ __entry->service, __entry->instance, __entry->node, +++ __entry->port +++ ) +++); +++ +++TRACE_EVENT(qrtr_ns_message, +++ +++ TP_PROTO(const char * const ctrl_pkt_str, __u32 sq_node, __u32 sq_port), +++ +++ TP_ARGS(ctrl_pkt_str, sq_node, sq_port), +++ +++ TP_STRUCT__entry( +++ __string(ctrl_pkt_str, ctrl_pkt_str) +++ __field(__u32, sq_node) +++ __field(__u32, sq_port) +++ ), +++ +++ TP_fast_assign( +++ __assign_str(ctrl_pkt_str, ctrl_pkt_str); +++ __entry->sq_node = sq_node; +++ __entry->sq_port = sq_port; +++ ), +++ +++ TP_printk("%s from %d:%d", +++ __get_str(ctrl_pkt_str), __entry->sq_node, __entry->sq_port +++ ) +++); +++ +++#endif /* _TRACE_QRTR_H */ +++ +++/* This part must be outside protection */ +++#include +diff --git a/target/linux/ipq807x/patches/101-squashfs.patch b/target/linux/ipq807x/patches/101-squashfs.patch +new file mode 100644 +index 0000000000..5744a2a5bf +--- /dev/null ++++ b/target/linux/ipq807x/patches/101-squashfs.patch +@@ -0,0 +1,16 @@ ++Index: linux-4.4.60/fs/squashfs/xz_wrapper.c ++=================================================================== ++--- linux-4.4.60.orig/fs/squashfs/xz_wrapper.c +++++ linux-4.4.60/fs/squashfs/xz_wrapper.c ++@@ -40,10 +40,8 @@ struct squashfs_xz { ++ }; ++ ++ struct disk_comp_opts { ++- __le32 flags; ++- __le16 bit_opts; ++- __le16 fb; ++ __le32 dictionary_size; +++ __le32 flags; ++ }; ++ ++ struct comp_opts { +diff --git a/target/linux/ipq807x/patches/102-cig-wf188.patch b/target/linux/ipq807x/patches/102-cig-wf188.patch +new file mode 100644 +index 0000000000..05c736dfd7 +--- /dev/null ++++ b/target/linux/ipq807x/patches/102-cig-wf188.patch +@@ -0,0 +1,869 @@ ++Index: linux-4.4.60-qsdk-ad8f8efb2edcd35cdb130466cfc1923c37ef7ec1/arch/arm64/boot/dts/qcom/Makefile ++=================================================================== ++--- linux-4.4.60-qsdk-ad8f8efb2edcd35cdb130466cfc1923c37ef7ec1.orig/arch/arm64/boot/dts/qcom/Makefile +++++ linux-4.4.60-qsdk-ad8f8efb2edcd35cdb130466cfc1923c37ef7ec1/arch/arm64/boot/dts/qcom/Makefile ++@@ -30,6 +30,8 @@ dtb-$(CONFIG_ARCH_QCOM) += \ ++ qcom-ipq6018-cp01-c4.dtb \ ++ qcom-ipq6018-cp02-c1.dtb \ ++ qcom-ipq6018-cp03-c1.dtb \ +++ qcom-ipq6018-cig-wf188.dts \ +++ qcom-ipq6018-cig-wf188n.dts \ ++ qcom-ipq807x-hk01.dtb \ ++ qcom-ipq807x-hk01.c2.dtb \ ++ qcom-ipq807x-hk01.c3.dtb \ ++Index: linux-4.4.60-qsdk-ad8f8efb2edcd35cdb130466cfc1923c37ef7ec1/arch/arm64/boot/dts/qcom/qcom-ipq6018-cig-wf188.dts ++=================================================================== ++--- /dev/null +++++ linux-4.4.60-qsdk-ad8f8efb2edcd35cdb130466cfc1923c37ef7ec1/arch/arm64/boot/dts/qcom/qcom-ipq6018-cig-wf188.dts ++@@ -0,0 +1,423 @@ +++/dts-v1/; +++/* +++ * Copyright (c) 2019, The Linux Foundation. All rights reserved. +++ * +++ * Permission to use, copy, modify, and/or distribute this software for any +++ * purpose with or without fee is hereby granted, provided that the above +++ * copyright notice and this permission notice appear in all copies. +++ * +++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +++ */ +++ +++#include "qcom-ipq6018.dtsi" +++#include "qcom-ipq6018-rpm-regulator.dtsi" +++#include "qcom-ipq6018-cpr-regulator.dtsi" +++#include "qcom-ipq6018-cp-cpu.dtsi" +++#include +++#include +++ +++/ { +++ #address-cells = <0x2>; +++ #size-cells = <0x2>; +++ model = "Cigtech WF-188"; +++ compatible = "cig,wf188", "qcom,ipq6018-cp03", "qcom,ipq6018"; +++ interrupt-parent = <&intc>; +++ +++ aliases { +++ serial0 = &blsp1_uart3; +++ serial1 = &blsp1_uart2; +++ +++ /* +++ * Aliases as required by u-boot +++ * to patch MAC addresses +++ */ +++ ethernet0 = "/soc/dp1"; +++ ethernet1 = "/soc/dp2"; +++ +++ led-boot = &led_power; +++ led-failsafe = &led_power; +++ led-running = &led_power; +++ led-upgrade = &led_power; +++ }; +++ +++ chosen { +++ bootargs = "console=ttyMSM0,115200,n8 rw init=/init"; +++ bootargs-append = " swiotlb=1 coherent_pool=2M"; +++ }; +++ +++ /* +++ * +=========+==============+========================+ +++ * | | | | +++ * | Region | Start Offset | Size | +++ * | | | | +++ * +--------+--------------+-------------------------+ +++ * | | | | +++ * | | | | +++ * | | | | +++ * | | | | +++ * | Linux | 0x41000000 | 139MB | +++ * | | | | +++ * | | | | +++ * | | | | +++ * +--------+--------------+-------------------------+ +++ * | TZ App | 0x49B00000 | 6MB | +++ * +--------+--------------+-------------------------+ +++ * +++ * From the available 145 MB for Linux in the first 256 MB, +++ * we are reserving 6 MB for TZAPP. +++ * +++ * Refer arch/arm64/boot/dts/qcom/qcom-ipq6018-memory.dtsi +++ * for memory layout. +++ */ +++ +++/* TZAPP is enabled only in default memory profile */ +++#if !defined(__IPQ_MEM_PROFILE_256_MB__) && !defined(__IPQ_MEM_PROFILE_512_MB__) +++ reserved-memory { +++ tzapp:tzapp@49B00000 { /* TZAPPS */ +++ no-map; +++ reg = <0x0 0x49B00000 0x0 0x00600000>; +++ }; +++ }; +++#endif +++}; +++ +++&tlmm { +++ uart_pins: uart_pins { +++ mux { +++ pins = "gpio44", "gpio45"; +++ function = "blsp2_uart"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ +++ spi_0_pins: spi_0_pins { +++ mux { +++ pins = "gpio38", "gpio39", "gpio40", "gpio41"; +++ function = "blsp0_spi"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ +++ qpic_pins: qpic_pins { +++ data_0 { +++ pins = "gpio15"; +++ function = "qpic_pad0"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_1 { +++ pins = "gpio12"; +++ function = "qpic_pad1"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_2 { +++ pins = "gpio13"; +++ function = "qpic_pad2"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_3 { +++ pins = "gpio14"; +++ function = "qpic_pad3"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_4 { +++ pins = "gpio5"; +++ function = "qpic_pad4"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_5 { +++ pins = "gpio6"; +++ function = "qpic_pad5"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_6 { +++ pins = "gpio7"; +++ function = "qpic_pad6"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_7 { +++ pins = "gpio8"; +++ function = "qpic_pad7"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ qpic_pad { +++ pins = "gpio1", "gpio3", "gpio4", +++ "gpio10", "gpio11", "gpio17"; +++ function = "qpic_pad"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ +++ button_pins: button_pins { +++ wps_button { +++ pins = "gpio22"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ }; +++ +++ mdio_pins: mdio_pinmux { +++ mux_0 { +++ pins = "gpio64"; +++ function = "mdc"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ mux_1 { +++ pins = "gpio65"; +++ function = "mdio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ mux_2 { +++ pins = "gpio75"; +++ function = "gpio"; +++ bias-pull-up; +++ }; +++ }; +++ +++ leds_pins: leds_pins { +++ led_5g { +++ pins = "gpio25"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ led_2g { +++ pins = "gpio24"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ led_eth { +++ pins = "gpio18"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ led_pwr { +++ pins = "gpio16"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ uart2_pins: uart2_pins { +++ mux { +++ pins = "gpio57", "gpio58"; +++ function = "blsp4_uart"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++}; +++ +++&soc { +++ mdio@90000 { +++ pinctrl-0 = <&mdio_pins>; +++ pinctrl-names = "default"; +++ phy-reset-gpio = <&tlmm 75 0>; +++ status = "ok"; +++ phy0: ethernet-phy@0 { +++ reg = <3>; +++ }; +++ phy1: ethernet-phy@1 { +++ reg = <4>; +++ }; +++ }; +++ +++ +++ ess-switch@3a000000 { +++ switch_cpu_bmp = <0x1>; /* cpu port bitmap */ +++ switch_lan_bmp = <0x08>; /* lan port bitmap */ +++ switch_wan_bmp = <0x10>; /* wan port bitmap */ +++ switch_inner_bmp = <0xc0>; /*inner port bitmap*/ +++ switch_mac_mode = <0x0>; /* mac mode for uniphy instance0*/ +++ switch_mac_mode1 = <0xff>; /* mac mode for uniphy instance1*/ +++ switch_mac_mode2 = <0xff>; /* mac mode for uniphy instance2*/ +++ qcom,port_phyinfo { +++ port@3 { +++ port_id = <3>; +++ phy_address = <4>; +++ }; +++ port@4 { +++ port_id = <4>; +++ phy_address = <3>; +++ }; +++ }; +++ }; +++ +++ dp1 { +++ device_type = "network"; +++ compatible = "qcom,nss-dp"; +++ qcom,id = <3>; +++ reg = <0x3a001400 0x200>; +++ qcom,mactype = <0>; +++ local-mac-address = [000000000000]; +++ qcom,link-poll = <1>; +++ qcom,phy-mdio-addr = <4>; +++ phy-mode = "sgmii"; +++ }; +++ +++ dp2 { +++ device_type = "network"; +++ compatible = "qcom,nss-dp"; +++ qcom,id = <4>; +++ reg = <0x3a001600 0x200>; +++ qcom,mactype = <0>; +++ local-mac-address = [000000000000]; +++ qcom,link-poll = <1>; +++ qcom,phy-mdio-addr = <3>; +++ phy-mode = "sgmii"; +++ +++ }; +++ +++ gpio_keys { +++ compatible = "gpio-keys"; +++ pinctrl-0 = <&button_pins>; +++ pinctrl-names = "default"; +++ +++ wps { +++ label = "reset"; +++ linux,code = ; +++ gpios = <&tlmm 22 GPIO_ACTIVE_LOW>; +++ linux,input-type = <1>; +++ debounce-interval = <60>; +++ }; +++ }; +++ +++ leds { +++ compatible = "gpio-leds"; +++ pinctrl-0 = <&leds_pins>; +++ pinctrl-names = "default"; +++ +++ led@25 { +++ label = "green:wifi5"; +++ gpios = <&tlmm 25 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "wf188:green:5g"; +++ default-state = "off"; +++ }; +++ led@24 { +++ label = "green:wifi2"; +++ gpios = <&tlmm 24 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "wf188:green:2g"; +++ default-state = "off"; +++ }; +++ led@18 { +++ label = "green:wan"; +++ gpios = <&tlmm 18 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "wf188:green:eth"; +++ default-state = "off"; +++ }; +++ led_power: led@16 { +++ label = "green:power"; +++ gpios = <&tlmm 16 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "wf188:green:power"; +++ default-state = "off"; +++ }; +++ }; +++ +++ gpio-watchdog { +++ compatible = "linux,wdt-gpio"; +++ gpios = <&tlmm 35 GPIO_ACTIVE_HIGH>; +++ hw_algo = "toggle"; +++ hw_margin_ms = <5000>; +++ always-running; +++ }; +++}; +++ +++&blsp1_uart3 { +++ pinctrl-0 = <&uart_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&spi_0 { +++ pinctrl-0 = <&spi_0_pins>; +++ pinctrl-names = "default"; +++ cs-select = <0>; +++ status = "ok"; +++ +++ m25p80@0 { +++ #address-cells = <1>; +++ #size-cells = <1>; +++ reg = <0>; +++ compatible = "n25q128a11"; +++ linux,modalias = "m25p80", "n25q128a11"; +++ spi-max-frequency = <50000000>; +++ use-default-sizes; +++ }; +++}; +++ +++&blsp1_uart2 { +++ pinctrl-0 = <&uart2_pins>; +++ pinctrl-names = "default"; +++ dmas = <&blsp_dma 2>, +++ <&blsp_dma 3>; +++ dma-names = "tx", "rx"; +++ status = "ok"; +++}; +++&qpic_bam { +++ status = "ok"; +++}; +++ +++&nand { +++ pinctrl-0 = <&qpic_pins>; +++ pinctrl-names = "default"; +++ status = "disabled"; +++}; +++ +++&ssphy_0 { +++ status = "ok"; +++}; +++ +++&qusb_phy_0 { +++ status = "ok"; +++}; +++ +++&usb3 { +++ status = "ok"; +++}; +++ +++&nss_crypto { +++ status = "ok"; +++}; +++ +++&cpu0_opp_table { +++ compatible = "operating-points-v2"; +++ opp-shared; +++ opp03 { +++ opp-hz = /bits/ 64 <1200000000>; +++ opp-microvolt = <3>; +++ clock-latency-ns = <200000>; +++ }; +++ /delete-node/ opp04; +++ /delete-node/ opp05; +++ /delete-node/ opp06; +++}; +++ +++/* TZAPP is enabled in default memory profile only */ +++#if !defined(__IPQ_MEM_PROFILE_256_MB__) && !defined(__IPQ_MEM_PROFILE_512_MB__) +++&qseecom { +++ mem-start = <0x49B00000>; +++ mem-size = <0x600000>; +++ status = "ok"; +++}; +++#endif ++Index: linux-4.4.60-qsdk-ad8f8efb2edcd35cdb130466cfc1923c37ef7ec1/arch/arm64/boot/dts/qcom/qcom-ipq6018-cig-wf188n.dts ++=================================================================== ++--- /dev/null +++++ linux-4.4.60-qsdk-ad8f8efb2edcd35cdb130466cfc1923c37ef7ec1/arch/arm64/boot/dts/qcom/qcom-ipq6018-cig-wf188n.dts ++@@ -0,0 +1,423 @@ +++/dts-v1/; +++/* +++ * Copyright (c) 2019, The Linux Foundation. All rights reserved. +++ * +++ * Permission to use, copy, modify, and/or distribute this software for any +++ * purpose with or without fee is hereby granted, provided that the above +++ * copyright notice and this permission notice appear in all copies. +++ * +++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +++ */ +++ +++#include "qcom-ipq6018.dtsi" +++#include "qcom-ipq6018-rpm-regulator.dtsi" +++#include "qcom-ipq6018-cpr-regulator.dtsi" +++#include "qcom-ipq6018-cp-cpu.dtsi" +++#include +++#include +++ +++/ { +++ #address-cells = <0x2>; +++ #size-cells = <0x2>; +++ model = "Cigtech WF-188n"; +++ compatible = "cig,wf188n", "qcom,ipq6018-cp03", "qcom,ipq6018"; +++ interrupt-parent = <&intc>; +++ +++ aliases { +++ serial0 = &blsp1_uart3; +++ serial1 = &blsp1_uart2; +++ +++ /* +++ * Aliases as required by u-boot +++ * to patch MAC addresses +++ */ +++ ethernet0 = "/soc/dp1"; +++ ethernet1 = "/soc/dp2"; +++ +++ led-boot = &led_power; +++ led-failsafe = &led_power; +++ led-running = &led_power; +++ led-upgrade = &led_power; +++ }; +++ +++ chosen { +++ bootargs = "console=ttyMSM0,115200,n8 rw init=/init"; +++ bootargs-append = " swiotlb=1 coherent_pool=2M"; +++ }; +++ +++ /* +++ * +=========+==============+========================+ +++ * | | | | +++ * | Region | Start Offset | Size | +++ * | | | | +++ * +--------+--------------+-------------------------+ +++ * | | | | +++ * | | | | +++ * | | | | +++ * | | | | +++ * | Linux | 0x41000000 | 139MB | +++ * | | | | +++ * | | | | +++ * | | | | +++ * +--------+--------------+-------------------------+ +++ * | TZ App | 0x49B00000 | 6MB | +++ * +--------+--------------+-------------------------+ +++ * +++ * From the available 145 MB for Linux in the first 256 MB, +++ * we are reserving 6 MB for TZAPP. +++ * +++ * Refer arch/arm64/boot/dts/qcom/qcom-ipq6018-memory.dtsi +++ * for memory layout. +++ */ +++ +++/* TZAPP is enabled only in default memory profile */ +++#if !defined(__IPQ_MEM_PROFILE_256_MB__) && !defined(__IPQ_MEM_PROFILE_512_MB__) +++ reserved-memory { +++ tzapp:tzapp@49B00000 { /* TZAPPS */ +++ no-map; +++ reg = <0x0 0x49B00000 0x0 0x00600000>; +++ }; +++ }; +++#endif +++}; +++ +++&tlmm { +++ uart_pins: uart_pins { +++ mux { +++ pins = "gpio44", "gpio45"; +++ function = "blsp2_uart"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ +++ spi_0_pins: spi_0_pins { +++ mux { +++ pins = "gpio38", "gpio39", "gpio40", "gpio41"; +++ function = "blsp0_spi"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ +++ qpic_pins: qpic_pins { +++ data_0 { +++ pins = "gpio15"; +++ function = "qpic_pad0"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_1 { +++ pins = "gpio12"; +++ function = "qpic_pad1"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_2 { +++ pins = "gpio13"; +++ function = "qpic_pad2"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_3 { +++ pins = "gpio14"; +++ function = "qpic_pad3"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_4 { +++ pins = "gpio5"; +++ function = "qpic_pad4"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_5 { +++ pins = "gpio6"; +++ function = "qpic_pad5"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_6 { +++ pins = "gpio7"; +++ function = "qpic_pad6"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_7 { +++ pins = "gpio8"; +++ function = "qpic_pad7"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ qpic_pad { +++ pins = "gpio1", "gpio3", "gpio4", +++ "gpio10", "gpio11", "gpio17"; +++ function = "qpic_pad"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ +++ button_pins: button_pins { +++ wps_button { +++ pins = "gpio22"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ }; +++ +++ mdio_pins: mdio_pinmux { +++ mux_0 { +++ pins = "gpio64"; +++ function = "mdc"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ mux_1 { +++ pins = "gpio65"; +++ function = "mdio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ mux_2 { +++ pins = "gpio75"; +++ function = "gpio"; +++ bias-pull-up; +++ }; +++ }; +++ +++ leds_pins: leds_pins { +++ led_5g { +++ pins = "gpio25"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ led_2g { +++ pins = "gpio24"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ led_eth { +++ pins = "gpio18"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ led_pwr { +++ pins = "gpio16"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ uart2_pins: uart2_pins { +++ mux { +++ pins = "gpio57", "gpio58"; +++ function = "blsp4_uart"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++}; +++ +++&soc { +++ mdio@90000 { +++ pinctrl-0 = <&mdio_pins>; +++ pinctrl-names = "default"; +++ phy-reset-gpio = <&tlmm 75 0>; +++ status = "ok"; +++ phy0: ethernet-phy@0 { +++ reg = <3>; +++ }; +++ phy1: ethernet-phy@1 { +++ reg = <4>; +++ }; +++ }; +++ +++ +++ ess-switch@3a000000 { +++ switch_cpu_bmp = <0x1>; /* cpu port bitmap */ +++ switch_lan_bmp = <0x08>; /* lan port bitmap */ +++ switch_wan_bmp = <0x10>; /* wan port bitmap */ +++ switch_inner_bmp = <0xc0>; /*inner port bitmap*/ +++ switch_mac_mode = <0x0>; /* mac mode for uniphy instance0*/ +++ switch_mac_mode1 = <0xff>; /* mac mode for uniphy instance1*/ +++ switch_mac_mode2 = <0xff>; /* mac mode for uniphy instance2*/ +++ qcom,port_phyinfo { +++ port@3 { +++ port_id = <3>; +++ phy_address = <4>; +++ }; +++ port@4 { +++ port_id = <4>; +++ phy_address = <3>; +++ }; +++ }; +++ }; +++ +++ dp1 { +++ device_type = "network"; +++ compatible = "qcom,nss-dp"; +++ qcom,id = <3>; +++ reg = <0x3a001400 0x200>; +++ qcom,mactype = <0>; +++ local-mac-address = [000000000000]; +++ qcom,link-poll = <1>; +++ qcom,phy-mdio-addr = <4>; +++ phy-mode = "sgmii"; +++ }; +++ +++ dp2 { +++ device_type = "network"; +++ compatible = "qcom,nss-dp"; +++ qcom,id = <4>; +++ reg = <0x3a001600 0x200>; +++ qcom,mactype = <0>; +++ local-mac-address = [000000000000]; +++ qcom,link-poll = <1>; +++ qcom,phy-mdio-addr = <3>; +++ phy-mode = "sgmii"; +++ +++ }; +++ +++ gpio_keys { +++ compatible = "gpio-keys"; +++ pinctrl-0 = <&button_pins>; +++ pinctrl-names = "default"; +++ +++ wps { +++ label = "reset"; +++ linux,code = ; +++ gpios = <&tlmm 22 GPIO_ACTIVE_LOW>; +++ linux,input-type = <1>; +++ debounce-interval = <60>; +++ }; +++ }; +++ +++ leds { +++ compatible = "gpio-leds"; +++ pinctrl-0 = <&leds_pins>; +++ pinctrl-names = "default"; +++ +++ led@25 { +++ label = "green:wifi5"; +++ gpios = <&tlmm 25 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "wf188:green:5g"; +++ default-state = "off"; +++ }; +++ led@24 { +++ label = "green:wifi2"; +++ gpios = <&tlmm 24 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "wf188:green:2g"; +++ default-state = "off"; +++ }; +++ led@18 { +++ label = "green:wan"; +++ gpios = <&tlmm 18 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "wf188:green:eth"; +++ default-state = "off"; +++ }; +++ led_power: led@16 { +++ label = "green:power"; +++ gpios = <&tlmm 16 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "wf188:green:power"; +++ default-state = "on"; +++ }; +++ }; +++ +++ gpio-watchdog { +++ compatible = "linux,wdt-gpio"; +++ gpios = <&tlmm 35 GPIO_ACTIVE_HIGH>; +++ hw_algo = "toggle"; +++ hw_margin_ms = <5000>; +++ always-running; +++ }; +++}; +++ +++&blsp1_uart3 { +++ pinctrl-0 = <&uart_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&spi_0 { +++ pinctrl-0 = <&spi_0_pins>; +++ pinctrl-names = "default"; +++ cs-select = <0>; +++ status = "ok"; +++ +++ m25p80@0 { +++ #address-cells = <1>; +++ #size-cells = <1>; +++ reg = <0>; +++ compatible = "n25q128a11"; +++ linux,modalias = "m25p80", "n25q128a11"; +++ spi-max-frequency = <50000000>; +++ use-default-sizes; +++ }; +++}; +++ +++&blsp1_uart2 { +++ pinctrl-0 = <&uart2_pins>; +++ pinctrl-names = "default"; +++ dmas = <&blsp_dma 2>, +++ <&blsp_dma 3>; +++ dma-names = "tx", "rx"; +++ status = "ok"; +++}; +++&qpic_bam { +++ status = "ok"; +++}; +++ +++&nand { +++ pinctrl-0 = <&qpic_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&ssphy_0 { +++ status = "ok"; +++}; +++ +++&qusb_phy_0 { +++ status = "ok"; +++}; +++ +++&usb3 { +++ status = "ok"; +++}; +++ +++&nss_crypto { +++ status = "ok"; +++}; +++ +++&cpu0_opp_table { +++ compatible = "operating-points-v2"; +++ opp-shared; +++ opp03 { +++ opp-hz = /bits/ 64 <1200000000>; +++ opp-microvolt = <3>; +++ clock-latency-ns = <200000>; +++ }; +++ /delete-node/ opp04; +++ /delete-node/ opp05; +++ /delete-node/ opp06; +++}; +++ +++/* TZAPP is enabled in default memory profile only */ +++#if !defined(__IPQ_MEM_PROFILE_256_MB__) && !defined(__IPQ_MEM_PROFILE_512_MB__) +++&qseecom { +++ mem-start = <0x49B00000>; +++ mem-size = <0x600000>; +++ status = "ok"; +++}; +++#endif +diff --git a/target/linux/ipq807x/patches/103-sercomm-wallaby.patch b/target/linux/ipq807x/patches/103-sercomm-wallaby.patch +new file mode 100644 +index 0000000000..c6d12fe963 +--- /dev/null ++++ b/target/linux/ipq807x/patches/103-sercomm-wallaby.patch +@@ -0,0 +1,816 @@ ++Index: linux-4.4.60-qsdk/arch/arm64/boot/dts/qcom/Makefile ++=================================================================== ++--- linux-4.4.60-qsdk.orig/arch/arm64/boot/dts/qcom/Makefile +++++ linux-4.4.60-qsdk/arch/arm64/boot/dts/qcom/Makefile ++@@ -30,6 +30,7 @@ dtb-$(CONFIG_ARCH_QCOM) += \ ++ qcom-ipq807x-ac04.dtb \ ++ qcom-ipq807x-oak02.dtb \ ++ qcom-ipq807x-oak03.dtb \ +++ qcom-ipq807x-sercomm-wallaby.dtb \ ++ qcom-ipq807x-db.hk01.dtb \ ++ qcom-ipq807x-db.hk02.dtb ++ ++Index: linux-4.4.60-qsdk/arch/arm64/boot/dts/qcom/qcom-ipq807x-sercomm-wallaby.dts ++=================================================================== ++--- /dev/null +++++ linux-4.4.60-qsdk/arch/arm64/boot/dts/qcom/qcom-ipq807x-sercomm-wallaby.dts ++@@ -0,0 +1,799 @@ +++/dts-v1/; +++/* +++ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved. +++ * +++ * Permission to use, copy, modify, and/or distribute this software for any +++ * purpose with or without fee is hereby granted, provided that the above +++ * copyright notice and this permission notice appear in all copies. +++ * +++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +++ */ +++#include "qcom-ipq807x-soc.dtsi" +++#include "qcom-ipq807x-hk-cpu.dtsi" +++ +++/ { +++ #address-cells = <0x2>; +++ #size-cells = <0x2>; +++ model = "Sercomm Wallaby"; +++ compatible = "sercomm,wallaby", "qcom,ipq807x-hk09", "qcom,ipq807x"; +++ qcom,msm-id = <0x156 0x0>; +++ interrupt-parent = <&intc>; +++ qcom,board-id = <0x8 0x0>; +++ qcom,pmic-id = <0x0 0x0 0x0 0x0>; +++ +++ aliases { +++ /* +++ * Aliases as required by u-boot +++ * to patch MAC addresses +++ */ +++ ethernet3 = "/soc/dp4"; +++ ethernet4 = "/soc/dp5"; +++ +++ led-boot = &led_green; +++ led-failsafe = &led_green; +++ led-running = &led_green; +++ led-upgrade = &led_blue; +++ }; +++}; +++ +++&tlmm { +++ pinctrl-0 = <&btcoex_pins>; +++ pinctrl-names = "default"; +++ +++ btcoex_pins: btcoex_pins { +++ mux_0 { +++ pins = "gpio64"; +++ function = "pta1_1"; +++ drive-strength = <6>; +++ bias-pull-down; +++ }; +++ mux_1 { +++ pins = "gpio65"; +++ function = "pta1_2"; +++ drive-strength = <6>; +++ bias-pull-down; +++ }; +++ mux_2 { +++ pins = "gpio66"; +++ function = "pta1_0"; +++ drive-strength = <6>; +++ bias-pull-down; +++ }; +++ }; +++ +++ mdio_pins: mdio_pinmux { +++ mux_0 { +++ pins = "gpio68"; +++ function = "mdc"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ mux_1 { +++ pins = "gpio69"; +++ function = "mdio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ mux_2 { +++ pins = "gpio25"; +++ function = "gpio"; +++ bias-pull-up; +++ }; +++ mux_3 { +++ pins = "gpio44"; +++ function = "gpio"; +++ bias-pull-up; +++ }; +++ }; +++ +++ uart_pins: uart_pins { +++ mux { +++ pins = "gpio23", "gpio24"; +++ function = "blsp4_uart1"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ spi_0_pins: spi_0_pins { +++ mux { +++ pins = "gpio38", "gpio39", "gpio40", "gpio41"; +++ function = "blsp0_spi"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ spi_3_pins: spi_3_pins { +++ mux { +++ pins = "gpio50", "gpio52", "gpio53"; +++ function = "blsp3_spi"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ spi_cs { +++ pins = "gpio22"; +++ function = "blsp3_spi2"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ quartz_interrupt { +++ pins = "gpio47"; +++ function = "gpio"; +++ input; +++ bias-disable; +++ }; +++ quartz_reset { +++ pins = "gpio21"; +++ function = "gpio"; +++ output-low; +++ bias-disable; +++ }; +++ }; +++ +++ qpic_pins: qpic_pins { +++ data_0 { +++ pins = "gpio15"; +++ function = "qpic_pad0"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_1 { +++ pins = "gpio12"; +++ function = "qpic_pad1"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_2 { +++ pins = "gpio13"; +++ function = "qpic_pad2"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_3 { +++ pins = "gpio14"; +++ function = "qpic_pad3"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_4 { +++ pins = "gpio5"; +++ function = "qpic_pad4"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_5 { +++ pins = "gpio6"; +++ function = "qpic_pad5"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_6 { +++ pins = "gpio7"; +++ function = "qpic_pad6"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_7 { +++ pins = "gpio8"; +++ function = "qpic_pad7"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ qpic_pad { +++ pins = "gpio1", "gpio3", "gpio4", +++ "gpio10", "gpio11", "gpio17"; +++ function = "qpic_pad"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ hsuart_pins: hsuart_pins { +++ mux { +++ pins = "gpio46", "gpio47", "gpio48", "gpio49"; +++ function = "blsp2_uart"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ button_pins: button_pins { +++ reset_button { +++ pins = "gpio33"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ }; +++ +++ led_pins: led_pins { +++ led_wan { +++ pins = "gpio31"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ +++ led_lan { +++ pins = "gpio32"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ +++ led_blue { +++ pins = "gpio60"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ +++ led_green { +++ pins = "gpio61"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ +++ led_red { +++ pins = "gpio62"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ +++ usb_mux_sel_pins: usb_mux_pins { +++ mux { +++ pins = "gpio27"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ +++ pcie0_pins: pcie_pins { +++ pcie0_rst { +++ pins = "gpio58"; +++ function = "pcie0_rst"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ pcie0_wake { +++ pins = "gpio59"; +++ function = "pcie0_wake"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++}; +++ +++&soc { +++ gpio_keys { +++ compatible = "gpio-keys"; +++ pinctrl-0 = <&button_pins>; +++ pinctrl-names = "default"; +++ +++ button@1 { +++ label = "reset"; +++ linux,code = ; +++ gpios = <&tlmm 33 GPIO_ACTIVE_LOW>; +++ linux,input-type = <1>; +++ debounce-interval = <60>; +++ }; +++ }; +++ +++ mdio: mdio@90000 { +++ pinctrl-0 = <&mdio_pins>; +++ pinctrl-names = "default"; +++ phy-reset-gpio = <&tlmm 37 0 &tlmm 25 1 &tlmm 44 1>; +++ compatible = "qcom,ipq40xx-mdio", "qcom,qca-mdio"; +++ phy3: ethernet-phy@3 { +++ reg = <3>; +++ }; +++ phy4: ethernet-phy@4 { +++ reg = <4>; +++ }; +++ }; +++ +++ ess-switch@3a000000 { +++ switch_cpu_bmp = <0x1>; /* cpu port bitmap */ +++ switch_lan_bmp = <0x10>; /* lan port bitmap */ +++ switch_wan_bmp = <0x20>; /* wan port bitmap */ +++ switch_mac_mode = <0x0>; /* mac mode for uniphy instance0*/ +++ switch_mac_mode1 = <0xff>; /* mac mode for uniphy instance1*/ +++ switch_mac_mode2 = <0xff>; /* mac mode for uniphy instance2*/ +++ bm_tick_mode = <0>; /* bm tick mode */ +++ tm_tick_mode = <0>; /* tm tick mode */ +++ qcom,port_phyinfo { +++ port@0 { +++ port_id = <1>; +++ phy_address = <0>; +++ }; +++ port@1 { +++ port_id = <2>; +++ phy_address = <1>; +++ }; +++ port@2 { +++ port_id = <3>; +++ phy_address = <2>; +++ }; +++ port@3 { +++ port_id = <4>; +++ phy_address = <3>; +++ }; +++ port@4 { +++ port_id = <5>; +++ phy_address = <4>; +++/* port_mac_sel = "QGMAC_PORT"; */ +++ }; +++/* port@5 { +++ port_id = <6>; +++ phy_address = <28>; +++ port_mac_sel = "QGMAC_PORT"; +++ };*/ +++ }; +++ port_scheduler_resource { +++ port@0 { +++ port_id = <0>; +++ ucast_queue = <0 143>; +++ mcast_queue = <256 271>; +++ l0sp = <0 35>; +++ l0cdrr = <0 47>; +++ l0edrr = <0 47>; +++ l1cdrr = <0 7>; +++ l1edrr = <0 7>; +++ }; +++ port@1 { +++ port_id = <1>; +++ ucast_queue = <144 159>; +++ mcast_queue = <272 275>; +++ l0sp = <36 39>; +++ l0cdrr = <48 63>; +++ l0edrr = <48 63>; +++ l1cdrr = <8 11>; +++ l1edrr = <8 11>; +++ }; +++ port@2 { +++ port_id = <2>; +++ ucast_queue = <160 175>; +++ mcast_queue = <276 279>; +++ l0sp = <40 43>; +++ l0cdrr = <64 79>; +++ l0edrr = <64 79>; +++ l1cdrr = <12 15>; +++ l1edrr = <12 15>; +++ }; +++ port@3 { +++ port_id = <3>; +++ ucast_queue = <176 191>; +++ mcast_queue = <280 283>; +++ l0sp = <44 47>; +++ l0cdrr = <80 95>; +++ l0edrr = <80 95>; +++ l1cdrr = <16 19>; +++ l1edrr = <16 19>; +++ }; +++ port@4 { +++ port_id = <4>; +++ ucast_queue = <192 207>; +++ mcast_queue = <284 287>; +++ l0sp = <48 51>; +++ l0cdrr = <96 111>; +++ l0edrr = <96 111>; +++ l1cdrr = <20 23>; +++ l1edrr = <20 23>; +++ }; +++ port@5 { +++ port_id = <5>; +++ ucast_queue = <208 223>; +++ mcast_queue = <288 291>; +++ l0sp = <52 55>; +++ l0cdrr = <112 127>; +++ l0edrr = <112 127>; +++ l1cdrr = <24 27>; +++ l1edrr = <24 27>; +++ }; +++ port@6 { +++ port_id = <6>; +++ ucast_queue = <224 239>; +++ mcast_queue = <292 295>; +++ l0sp = <56 59>; +++ l0cdrr = <128 143>; +++ l0edrr = <128 143>; +++ l1cdrr = <28 31>; +++ l1edrr = <28 31>; +++ }; +++ port@7 { +++ port_id = <7>; +++ ucast_queue = <240 255>; +++ mcast_queue = <296 299>; +++ l0sp = <60 63>; +++ l0cdrr = <144 159>; +++ l0edrr = <144 159>; +++ l1cdrr = <32 35>; +++ l1edrr = <32 35>; +++ }; +++ }; +++ port_scheduler_config { +++ port@0 { +++ port_id = <0>; +++ l1scheduler { +++ group@0 { +++ sp = <0 1>; /*L0 SPs*/ +++ /*cpri cdrr epri edrr*/ +++ cfg = <0 0 0 0>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ /*unicast queues*/ +++ ucast_queue = <0 4 8>; +++ /*multicast queues*/ +++ mcast_queue = <256 260>; +++ /*sp cpri cdrr epri edrr*/ +++ cfg = <0 0 0 0 0>; +++ }; +++ group@1 { +++ ucast_queue = <1 5 9>; +++ mcast_queue = <257 261>; +++ cfg = <0 1 1 1 1>; +++ }; +++ group@2 { +++ ucast_queue = <2 6 10>; +++ mcast_queue = <258 262>; +++ cfg = <0 2 2 2 2>; +++ }; +++ group@3 { +++ ucast_queue = <3 7 11>; +++ mcast_queue = <259 263>; +++ cfg = <0 3 3 3 3>; +++ }; +++ }; +++ }; +++ port@1 { +++ port_id = <1>; +++ l1scheduler { +++ group@0 { +++ sp = <36>; +++ cfg = <0 8 0 8>; +++ }; +++ group@1 { +++ sp = <37>; +++ cfg = <1 9 1 9>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <144>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <272>; +++ mcast_loop_pri = <4>; +++ cfg = <36 0 48 0 48>; +++ }; +++ }; +++ }; +++ port@2 { +++ port_id = <2>; +++ l1scheduler { +++ group@0 { +++ sp = <40>; +++ cfg = <0 12 0 12>; +++ }; +++ group@1 { +++ sp = <41>; +++ cfg = <1 13 1 13>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <160>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <276>; +++ mcast_loop_pri = <4>; +++ cfg = <40 0 64 0 64>; +++ }; +++ }; +++ }; +++ port@3 { +++ port_id = <3>; +++ l1scheduler { +++ group@0 { +++ sp = <44>; +++ cfg = <0 16 0 16>; +++ }; +++ group@1 { +++ sp = <45>; +++ cfg = <1 17 1 17>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <176>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <280>; +++ mcast_loop_pri = <4>; +++ cfg = <44 0 80 0 80>; +++ }; +++ }; +++ }; +++ port@4 { +++ port_id = <4>; +++ l1scheduler { +++ group@0 { +++ sp = <48>; +++ cfg = <0 20 0 20>; +++ }; +++ group@1 { +++ sp = <49>; +++ cfg = <1 21 1 21>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <192>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <284>; +++ mcast_loop_pri = <4>; +++ cfg = <48 0 96 0 96>; +++ }; +++ }; +++ }; +++ port@5 { +++ port_id = <5>; +++ l1scheduler { +++ group@0 { +++ sp = <52>; +++ cfg = <0 24 0 24>; +++ }; +++ group@1 { +++ sp = <53>; +++ cfg = <1 25 1 25>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <208>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <288>; +++ mcast_loop_pri = <4>; +++ cfg = <52 0 112 0 112>; +++ }; +++ }; +++ }; +++ port@6 { +++ port_id = <6>; +++ l1scheduler { +++ group@0 { +++ sp = <56>; +++ cfg = <0 28 0 28>; +++ }; +++ group@1 { +++ sp = <57>; +++ cfg = <1 29 1 29>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <224>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <292>; +++ mcast_loop_pri = <4>; +++ cfg = <56 0 128 0 128>; +++ }; +++ }; +++ }; +++ port@7 { +++ port_id = <7>; +++ l1scheduler { +++ group@0 { +++ sp = <60>; +++ cfg = <0 32 0 32>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <240>; +++ mcast_queue = <296>; +++ cfg = <60 0 144 0 144>; +++ }; +++ }; +++ }; +++ }; +++ }; +++ +++ dp4 { +++ device_type = "network"; +++ compatible = "qcom,nss-dp"; +++ qcom,id = <4>; +++ reg = <0x3a001600 0x200>; +++ qcom,mactype = <0>; +++ local-mac-address = [000000000000]; +++ qcom,link-poll = <1>; +++ qcom,phy-mdio-addr = <3>; +++ phy-mode = "sgmii"; +++ }; +++ +++ dp5 { +++ device_type = "network"; +++ compatible = "qcom,nss-dp"; +++ qcom,id = <5>; +++ reg = <0x3a003000 0x3fff>; +++ qcom,mactype = <1>; +++ local-mac-address = [000000000000]; +++ qcom,link-poll = <1>; +++ qcom,phy-mdio-addr = <4>; +++ phy-mode = "sgmii"; +++ }; +++ +++ leds { +++ compatible = "gpio-leds"; +++ pinctrl-0 = <&led_pins>; +++ pinctrl-names = "default"; +++ +++ led_wan { +++ label = "wallaby:green:wan"; +++ gpio = <&tlmm 31 GPIO_ACTIVE_HIGH>; +++ default-state = "off"; +++ }; +++ +++ led_lan { +++ label = "wallaby:green:lan"; +++ gpio = <&tlmm 32 GPIO_ACTIVE_HIGH>; +++ default-state = "off"; +++ }; +++ +++ led_blue: led_blue { +++ label = "wallaby:blue:status"; +++ gpio = <&tlmm 60 GPIO_ACTIVE_HIGH>; +++ default-state = "off"; +++ }; +++ +++ led_green: led_green { +++ label = "wallaby:green:status"; +++ gpio = <&tlmm 61 GPIO_ACTIVE_HIGH>; +++ default-state = "off"; +++ }; +++ +++ led_red { +++ label = "wallaby:red:status"; +++ gpio = <&tlmm 62 GPIO_ACTIVE_HIGH>; +++ default-state = "off"; +++ }; +++ +++ }; +++ nss-macsec0 { +++ compatible = "qcom,nss-macsec"; +++ phy_addr = <0x18>; +++ phy_access_mode = <0>; +++ mdiobus = <&mdio>; +++ }; +++ nss-macsec1 { +++ compatible = "qcom,nss-macsec"; +++ phy_addr = <0x1c>; +++ phy_access_mode = <0>; +++ mdiobus = <&mdio>; +++ }; +++}; +++ +++&serial_blsp4 { +++ pinctrl-0 = <&uart_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&spi_0 { /* BLSP1 QUP1 */ +++ pinctrl-0 = <&spi_0_pins>; +++ pinctrl-names = "default"; +++ cs-select = <0>; +++ status = "ok"; +++ +++ m25p80@0 { +++ #address-cells = <1>; +++ #size-cells = <1>; +++ reg = <0>; +++ compatible = "n25q128a11"; +++ linux,modalias = "m25p80", "n25q128a11"; +++ spi-max-frequency = <50000000>; +++ use-default-sizes; +++ }; +++}; +++ +++&spi_4 { /* BLSP1 QUP3 */ +++ pinctrl-0 = <&spi_3_pins>; +++ pinctrl-names = "default"; +++ cs-select = <2>; +++ quartz-reset-gpio = <&tlmm 21 1>; +++ status = "ok"; +++ spidev3: spi@3 { +++ compatible = "qca,spidev"; +++ reg = <0>; +++ spi-max-frequency = <24000000>; +++ }; +++}; +++ +++&serial_blsp2 { +++ status = "disabled"; +++}; +++ +++&msm_imem { +++ status = "disabled"; +++}; +++ +++&ssphy_0 { +++ status = "ok"; +++}; +++ +++&qusb_phy_0 { +++ status = "ok"; +++}; +++ +++&ssphy_1 { +++ status = "ok"; +++}; +++ +++&qusb_phy_1 { +++ status = "ok"; +++}; +++ +++&usb3_0 { +++ status = "ok"; +++}; +++ +++&usb3_1 { +++ status = "ok"; +++}; +++ +++&cryptobam { +++ status = "ok"; +++}; +++ +++&crypto { +++ status = "ok"; +++}; +++ +++&i2c_0 { +++ status = "disabled"; +++}; +++ +++&i2c_1 { +++ status = "disabled"; +++}; +++ +++&qpic_bam { +++ status = "ok"; +++}; +++ +++&nand { +++ pinctrl-0 = <&qpic_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&qpic_lcd { +++ status = "disabled"; +++}; +++ +++&qpic_lcd_panel { +++ status = "disabled"; +++}; +++ +++&ledc { +++ status = "disabled"; +++}; +++ +++&pcie0 { +++ status = "disabled"; +++}; +++ +++&pcie1 { +++ status = "disabled"; +++}; +++ +diff --git a/target/linux/ipq807x/patches/104-wf194c.patch b/target/linux/ipq807x/patches/104-wf194c.patch +new file mode 100644 +index 0000000000..05b1b18b6c +--- /dev/null ++++ b/target/linux/ipq807x/patches/104-wf194c.patch +@@ -0,0 +1,816 @@ ++Index: linux-4.4.60-qsdk-ad8f8efb2edcd35cdb130466cfc1923c37ef7ec1/arch/arm64/boot/dts/qcom/Makefile ++=================================================================== ++--- linux-4.4.60-qsdk-ad8f8efb2edcd35cdb130466cfc1923c37ef7ec1.orig/arch/arm64/boot/dts/qcom/Makefile +++++ linux-4.4.60-qsdk-ad8f8efb2edcd35cdb130466cfc1923c37ef7ec1/arch/arm64/boot/dts/qcom/Makefile ++@@ -55,7 +55,8 @@ dtb-$(CONFIG_ARCH_QCOM) += \ ++ qcom-ipq807x-oak03.dtb \ ++ qcom-ipq807x-sercomm-wallaby.dtb \ ++ qcom-ipq807x-db.hk01.dtb \ ++- qcom-ipq807x-db.hk02.dtb +++ qcom-ipq807x-db.hk02.dtb \ +++ qcom-ipq807x-wf194c.dtb ++ endif ++ ++ always := $(dtb-y) ++Index: linux-4.4.60-qsdk-ad8f8efb2edcd35cdb130466cfc1923c37ef7ec1/arch/arm64/boot/dts/qcom/qcom-ipq807x-wf194c.dts ++=================================================================== ++--- /dev/null +++++ linux-4.4.60-qsdk-ad8f8efb2edcd35cdb130466cfc1923c37ef7ec1/arch/arm64/boot/dts/qcom/qcom-ipq807x-wf194c.dts ++@@ -0,0 +1,751 @@ +++/dts-v1/; +++/* +++ * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. +++ * +++ * Permission to use, copy, modify, and/or distribute this software for any +++ * purpose with or without fee is hereby granted, provided that the above +++ * copyright notice and this permission notice appear in all copies. +++ * +++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +++ */ +++#include "qcom-ipq807x-soc.dtsi" +++#include "qcom-ipq807x-audio.dtsi" +++#include "qcom-ipq807x-hk-cpu.dtsi" +++ +++/ { +++ #address-cells = <0x2>; +++ #size-cells = <0x2>; +++ model = "CIG WF194C"; +++ compatible = "cig,wf194c", "qcom,ipq807x"; +++ qcom,msm-id = <0x143 0x0>, <0x158 0x0>, <0x186 0x0>, <0x188 0x0>; +++ interrupt-parent = <&intc>; +++ qcom,board-id = <0x8 0x0>; +++ qcom,pmic-id = <0x0 0x0 0x0 0x0>; +++ +++ aliases { +++ sdhc1 = &sdhc_1; /* SDC1 eMMC slot */ +++ sdhc2 = &sdhc_2; /* SDC2 SD slot */ +++ /* +++ * Aliases as required by u-boot +++ * to patch MAC addresses +++ */ +++ ethernet0 = "/soc/dp1"; +++ ethernet1 = "/soc/dp2"; +++ }; +++ +++ chosen { +++ bootargs = "console=ttyMSM0,115200,n8 root=/dev/ram0 rw init=/init"; +++ #ifdef __IPQ_MEM_PROFILE_256_MB__ +++ bootargs-append = " swiotlb=1"; +++ #else +++ bootargs-append = " swiotlb=1 coherent_pool=2M"; +++ #endif +++ }; +++}; +++ +++&tlmm { +++ pinctrl-0 = <&btcoex_pins>; +++ pinctrl-names = "default"; +++ +++ btcoex_pins: btcoex_pins { +++ mux_0 { +++ pins = "gpio34"; +++ function = "gpio"; +++ drive-strength = <6>; +++ bias-pull-up; +++ output-high; +++ }; +++ mux_1 { +++ pins = "gpio62"; +++ function = "gpio"; +++ drive-strength = <6>; +++ bias-pull-up; +++ output-high; +++ }; +++ }; +++ +++ mdio_pins: mdio_pinmux { +++ mux_0 { +++ pins = "gpio68"; +++ function = "mdc"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ mux_1 { +++ pins = "gpio69"; +++ function = "mdio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ }; +++ +++ uart_pins: uart_pins { +++ mux { +++ pins = "gpio23", "gpio24"; +++ function = "blsp4_uart1"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ i2c_0_pins: i2c_0_pinmux { +++ mux { +++ pins = "gpio42", "gpio43"; +++ function = "blsp1_i2c"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ spi_0_pins: spi_0_pins { +++ mux { +++ pins = "gpio38", "gpio39", "gpio40", "gpio41"; +++ function = "blsp0_spi"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ qpic_pins: qpic_pins { +++ data_0 { +++ pins = "gpio15"; +++ function = "qpic_pad0"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_1 { +++ pins = "gpio12"; +++ function = "qpic_pad1"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_2 { +++ pins = "gpio13"; +++ function = "qpic_pad2"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_3 { +++ pins = "gpio14"; +++ function = "qpic_pad3"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_4 { +++ pins = "gpio5"; +++ function = "qpic_pad4"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_5 { +++ pins = "gpio6"; +++ function = "qpic_pad5"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_6 { +++ pins = "gpio7"; +++ function = "qpic_pad6"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_7 { +++ pins = "gpio8"; +++ function = "qpic_pad7"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_8 { +++ pins = "gpio16"; +++ function = "qpic_pad8"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ qpic_pad { +++ pins = "gpio0", "gpio1", "gpio2", "gpio3", "gpio4", +++ "gpio9", "gpio10", "gpio11", "gpio17"; +++ function = "qpic_pad"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ sd_pins: sd_pins { +++ mux { +++ pins = "gpio63"; +++ function = "sd_card"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ }; +++ +++ hsuart_pins: hsuart_pins { +++ mux { +++ pins = "gpio48", "gpio49"; +++ function = "blsp2_uart"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ leds_pins: leds_pinmux { +++ led1_r { +++ pins = "gpio54"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ led1_g { +++ pins = "gpio55"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ led2_r { +++ pins = "gpio56"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ led2_g { +++ pins = "gpio64"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ +++ }; +++ +++ button_pins: button_pins { +++ wps_button { +++ pins = "gpio67"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ }; +++ +++ uniphy_pins: uniphy_pinmux { +++ mux_2 { +++ pins = "gpio37"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ mux_3 { +++ pins = "gpio44"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ }; +++ +++ pwm_pins: pwm_pinmux { +++ mux_1 { +++ pins = "gpio25"; +++ function = "pwm02"; +++ drive-strength = <8>; +++ }; +++ }; +++}; +++ +++&soc { +++ pwm { +++ pinctrl-0 = <&pwm_pins>; +++ pinctrl-names = "default"; +++ used-pwm-indices = <1>, <0>, <0>, <0>; +++ status = "disabled"; +++ }; +++ +++ gpio_keys { +++ compatible = "gpio-keys"; +++ pinctrl-0 = <&button_pins>; +++ pinctrl-names = "default"; +++ +++ button@1 { +++ label = "reset"; +++ linux,code = ; +++ gpios = <&tlmm 67 GPIO_ACTIVE_LOW>; +++ linux,input-type = <1>; +++ debounce-interval = <60>; +++ }; +++ }; +++ +++ leds { +++ compatible = "gpio-leds"; +++ pinctrl-0 = <&leds_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++ +++ led@54 { +++ label = "wf194c:red:lan"; +++ gpios = <&tlmm 54 GPIO_ACTIVE_HIGH>; +++ default-state = "off"; +++ }; +++ led@55 { +++ label = "wf194c:green:lan"; +++ gpios = <&tlmm 55 GPIO_ACTIVE_HIGH>; +++ default-state = "on"; +++ }; +++ led@56 { +++ label = "wf194c:red:wan"; +++ gpios = <&tlmm 56 GPIO_ACTIVE_HIGH>; +++ default-state = "off"; +++ }; +++ led@64 { +++ label = "wf194c:green:wan"; +++ gpios = <&tlmm 64 GPIO_ACTIVE_HIGH>; +++ default-state = "on"; +++ }; +++ }; +++ mdio@90000 { +++ pinctrl-0 = <&mdio_pins>; +++ pinctrl-names = "default"; +++ phy-reset-gpio = <&tlmm 37 0 &tlmm 44 0>; +++ phy0: ethernet-phy@0 { +++ reg = <0xf>; /*<0>*/ +++ }; +++ phy1: ethernet-phy@1 { +++ reg = <0xf>; +++ }; +++ phy2: ethernet-phy@2 { +++ reg = <0xf>; +++ }; +++ phy3: ethernet-phy@3 { +++ reg = <3>; +++ }; +++ phy4: ethernet-phy@4 { +++ reg = <4>; +++ }; +++ phy5: ethernet-phy@5 { +++ compatible ="ethernet-phy-ieee802.3-c45"; +++ reg = <0>; +++ }; +++ }; +++ +++ ess-switch@3a000000 { +++ pinctrl-0 = <&uniphy_pins>; +++ pinctrl-names = "default"; +++ switch_cpu_bmp = <0x1>; /* cpu port bitmap */ +++ switch_lan_bmp = <0x30>; /*..0x3e lan port bitmap */ +++ switch_wan_bmp = <0x40>; /* wan port bitmap */ +++ switch_mac_mode = <0x0>; /* mac mode for uniphy instance0*/ +++ switch_mac_mode1 = <0xff>; /* mac mode for uniphy instance1*/ +++ switch_mac_mode2 = <0xd>; /* mac mode for uniphy instance2*/ +++ bm_tick_mode = <0>; /* bm tick mode */ +++ tm_tick_mode = <0>; /* tm tick mode */ +++ port_scheduler_resource { +++ port@0 { +++ port_id = <0>; +++ ucast_queue = <0 143>; +++ mcast_queue = <256 271>; +++ l0sp = <0 35>; +++ l0cdrr = <0 47>; +++ l0edrr = <0 47>; +++ l1cdrr = <0 7>; +++ l1edrr = <0 7>; +++ }; +++ port@1 { +++ port_id = <1>; +++ ucast_queue = <144 159>; +++ mcast_queue = <272 275>; +++ l0sp = <36 39>; +++ l0cdrr = <48 63>; +++ l0edrr = <48 63>; +++ l1cdrr = <8 11>; +++ l1edrr = <8 11>; +++ }; +++ port@2 { +++ port_id = <2>; +++ ucast_queue = <160 175>; +++ mcast_queue = <276 279>; +++ l0sp = <40 43>; +++ l0cdrr = <64 79>; +++ l0edrr = <64 79>; +++ l1cdrr = <12 15>; +++ l1edrr = <12 15>; +++ }; +++ port@3 { +++ port_id = <3>; +++ ucast_queue = <176 191>; +++ mcast_queue = <280 283>; +++ l0sp = <44 47>; +++ l0cdrr = <80 95>; +++ l0edrr = <80 95>; +++ l1cdrr = <16 19>; +++ l1edrr = <16 19>; +++ }; +++ port@4 { +++ port_id = <4>; +++ ucast_queue = <192 207>; +++ mcast_queue = <284 287>; +++ l0sp = <48 51>; +++ l0cdrr = <96 111>; +++ l0edrr = <96 111>; +++ l1cdrr = <20 23>; +++ l1edrr = <20 23>; +++ }; +++ port@5 { +++ port_id = <5>; +++ ucast_queue = <208 223>; +++ mcast_queue = <288 291>; +++ l0sp = <52 55>; +++ l0cdrr = <112 127>; +++ l0edrr = <112 127>; +++ l1cdrr = <24 27>; +++ l1edrr = <24 27>; +++ }; +++ port@6 { +++ port_id = <6>; +++ ucast_queue = <224 239>; +++ mcast_queue = <292 295>; +++ l0sp = <56 59>; +++ l0cdrr = <128 143>; +++ l0edrr = <128 143>; +++ l1cdrr = <28 31>; +++ l1edrr = <28 31>; +++ }; +++ port@7 { +++ port_id = <7>; +++ ucast_queue = <240 255>; +++ mcast_queue = <296 299>; +++ l0sp = <60 63>; +++ l0cdrr = <144 159>; +++ l0edrr = <144 159>; +++ l1cdrr = <32 35>; +++ l1edrr = <32 35>; +++ }; +++ }; +++ port_scheduler_config { +++ port@0 { +++ port_id = <0>; +++ l1scheduler { +++ group@0 { +++ sp = <0 1>; /*L0 SPs*/ +++ /*cpri cdrr epri edrr*/ +++ cfg = <0 0 0 0>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ /*unicast queues*/ +++ ucast_queue = <0 4 8>; +++ /*multicast queues*/ +++ mcast_queue = <256 260>; +++ /*sp cpri cdrr epri edrr*/ +++ cfg = <0 0 0 0 0>; +++ }; +++ group@1 { +++ ucast_queue = <1 5 9>; +++ mcast_queue = <257 261>; +++ cfg = <0 1 1 1 1>; +++ }; +++ group@2 { +++ ucast_queue = <2 6 10>; +++ mcast_queue = <258 262>; +++ cfg = <0 2 2 2 2>; +++ }; +++ group@3 { +++ ucast_queue = <3 7 11>; +++ mcast_queue = <259 263>; +++ cfg = <0 3 3 3 3>; +++ }; +++ }; +++ }; +++ port@1 { +++ port_id = <1>; +++ l1scheduler { +++ group@0 { +++ sp = <36>; +++ cfg = <0 8 0 8>; +++ }; +++ group@1 { +++ sp = <37>; +++ cfg = <1 9 1 9>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <144>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <272>; +++ mcast_loop_pri = <4>; +++ cfg = <36 0 48 0 48>; +++ }; +++ }; +++ }; +++ port@2 { +++ port_id = <2>; +++ l1scheduler { +++ group@0 { +++ sp = <40>; +++ cfg = <0 12 0 12>; +++ }; +++ group@1 { +++ sp = <41>; +++ cfg = <1 13 1 13>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <160>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <276>; +++ mcast_loop_pri = <4>; +++ cfg = <40 0 64 0 64>; +++ }; +++ }; +++ }; +++ port@3 { +++ port_id = <3>; +++ l1scheduler { +++ group@0 { +++ sp = <44>; +++ cfg = <0 16 0 16>; +++ }; +++ group@1 { +++ sp = <45>; +++ cfg = <1 17 1 17>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <176>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <280>; +++ mcast_loop_pri = <4>; +++ cfg = <44 0 80 0 80>; +++ }; +++ }; +++ }; +++ port@4 { +++ port_id = <4>; +++ l1scheduler { +++ group@0 { +++ sp = <48>; +++ cfg = <0 20 0 20>; +++ }; +++ group@1 { +++ sp = <49>; +++ cfg = <1 21 1 21>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <192>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <284>; +++ mcast_loop_pri = <4>; +++ cfg = <48 0 96 0 96>; +++ }; +++ }; +++ }; +++ port@5 { +++ port_id = <5>; +++ l1scheduler { +++ group@0 { +++ sp = <52>; +++ cfg = <0 24 0 24>; +++ }; +++ group@1 { +++ sp = <53>; +++ cfg = <1 25 1 25>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <208>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <288>; +++ mcast_loop_pri = <4>; +++ cfg = <52 0 112 0 112>; +++ }; +++ }; +++ }; +++ port@6 { +++ port_id = <6>; +++ l1scheduler { +++ group@0 { +++ sp = <56>; +++ cfg = <0 28 0 28>; +++ }; +++ group@1 { +++ sp = <57>; +++ cfg = <1 29 1 29>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <224>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <292>; +++ mcast_loop_pri = <4>; +++ cfg = <56 0 128 0 128>; +++ }; +++ }; +++ }; +++ port@7 { +++ port_id = <7>; +++ l1scheduler { +++ group@0 { +++ sp = <60>; +++ cfg = <0 32 0 32>; +++ }; +++ group@1 { +++ sp = <61>; +++ cfg = <1 33 1 33>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <240>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <296>; +++ cfg = <60 0 144 0 144>; +++ }; +++ }; +++ }; +++ }; +++ }; +++ dp1 { +++ device_type = "network"; +++ compatible = "qcom,nss-dp"; +++ qcom,id = <4>; +++ reg = <0x3a001600 0x200>; +++ qcom,mactype = <0>; +++ local-mac-address = [000000000000]; +++ qcom,link-poll = <1>; +++ qcom,phy-mdio-addr = <3>; +++ phy-mode = "sgmii"; +++ }; +++ dp2 { +++ device_type = "network"; +++ compatible = "qcom,nss-dp"; +++ qcom,id = <6>; +++ reg = <0x3a007000 0x3fff>; +++ qcom,mactype = <1>; +++ local-mac-address = [000000000000]; +++ qcom,link-poll = <1>; +++ qcom,phy-mdio-addr = <0>; +++ phy-mode = "sgmii"; +++ }; +++}; +++ +++&serial_blsp4 { +++ pinctrl-0 = <&uart_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&spi_0 { /* BLSP1 QUP1 */ +++ pinctrl-0 = <&spi_0_pins>; +++ pinctrl-names = "default"; +++ cs-select = <0>; +++ status = "ok"; +++ +++ m25p80@0 { +++ #address-cells = <1>; +++ #size-cells = <1>; +++ reg = <0>; +++ compatible = "n25q128a11"; +++ linux,modalias = "m25p80", "n25q128a11"; +++ spi-max-frequency = <50000000>; +++ use-default-sizes; +++ }; +++}; +++ +++&serial_blsp2 { +++ pinctrl-0 = <&hsuart_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&msm_imem { +++ status = "enabled"; +++}; +++ +++&ssphy_0 { +++ status = "ok"; +++}; +++ +++&qusb_phy_0 { +++ status = "ok"; +++}; +++ +++&ssphy_1 { +++ status = "ok"; +++}; +++ +++&qusb_phy_1 { +++ status = "ok"; +++}; +++ +++&usb3_0 { +++ status = "ok"; +++}; +++ +++&usb3_1 { +++ status = "ok"; +++}; +++ +++&cryptobam { +++ status = "ok"; +++}; +++ +++&crypto { +++ status = "ok"; +++}; +++ +++&i2c_0 { +++ pinctrl-0 = <&i2c_0_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&i2c_1 { +++ status = "disabled"; +++}; +++ +++&sdhc_1 { +++ qcom,clk-rates = <400000 25000000 50000000 100000000 \ +++ 192000000 384000000>; +++ qcom,bus-speed-mode = "HS400_1p8v", "HS200_1p8v", "DDR_1p8v"; +++ qcom,nonremovable; +++ status = "ok"; +++}; +++ +++&qpic_bam { +++ status = "ok"; +++}; +++ +++&nand { +++ pinctrl-0 = <&qpic_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&sdhc_2 { +++ qcom,clk-rates = <400000 25000000 50000000 100000000 \ +++ 192000000>; +++ qcom,bus-speed-mode = "HS200_1p8v", "DDR_1p8v"; +++ pinctrl-0 = <&sd_pins>; +++ pinctrl-names = "default"; +++ cd-gpios = <&tlmm 63 1>; +++ sd-ldo-gpios = <&tlmm 21 0>; +++ vqmmc-supply = <&ldo11>; +++ status = "ok"; +++}; +++ +++&qpic_lcd { +++ status = "ok"; +++}; +++ +++&qpic_lcd_panel { +++ status = "ok"; +++}; ++Index: linux-4.4.60-qsdk-ad8f8efb2edcd35cdb130466cfc1923c37ef7ec1/drivers/net/phy/aquantia.c ++=================================================================== ++--- linux-4.4.60-qsdk-ad8f8efb2edcd35cdb130466cfc1923c37ef7ec1.orig/drivers/net/phy/aquantia.c +++++ linux-4.4.60-qsdk-ad8f8efb2edcd35cdb130466cfc1923c37ef7ec1/drivers/net/phy/aquantia.c ++@@ -32,6 +32,7 @@ ++ #define PHY_ID_AQR112 0x03a1b660 ++ #define PHY_ID_AQR113C 0x31c31C10 ++ #define PHY_ID_AQR112C 0x03a1b792 +++#define PHY_ID_AQR114C 0x31c31C22 ++ ++ #define AQ_PHY_MAX_VALID_MMD_REG 0xff01 ++ #define AQ_PHY_MAX_INVALID_MMD_REG 0xffff ++@@ -756,6 +757,25 @@ static struct phy_driver aquantia_driver ++ .update_link = aquantia_update_link, ++ .driver = { .owner = THIS_MODULE,}, ++ }, +++{ +++ .phy_id = PHY_ID_AQR114C, +++ .phy_id_mask = 0xfffffff0, +++ .name = "Aquantia AQR114C", +++ .features = PHY_AQUANTIA_FEATURES, +++ .flags = PHY_HAS_INTERRUPT, +++ .probe = aquantia_phy_probe, +++ .soft_reset = aquantia_soft_reset, +++ .config_init = aquantia_config_init, +++ .aneg_done = aquantia_aneg_done, +++ .config_aneg = aquantia_config_aneg, +++ .config_intr = aquantia_config_intr, +++ .ack_interrupt = aquantia_ack_interrupt, +++ .read_status = aquantia_read_status, +++ .suspend = aquantia_suspend, +++ .resume = aquantia_resume, +++ .update_link = aquantia_update_link, +++ .driver = { .owner = THIS_MODULE,}, +++}, ++ }; ++ ++ module_phy_driver(aquantia_driver); ++@@ -773,6 +793,7 @@ static struct mdio_device_id __maybe_unu ++ { PHY_ID_AQR112, 0xfffffff0 }, ++ { PHY_ID_AQR113C, 0xfffffff0 }, ++ { PHY_ID_AQR112C, 0xfffffff0 }, +++ { PHY_ID_AQR114C, 0xfffffff0 }, ++ { } ++ }; ++ +diff --git a/target/linux/ipq807x/patches/105-fix-dtc-gcc10-build.patch b/target/linux/ipq807x/patches/105-fix-dtc-gcc10-build.patch +new file mode 100644 +index 0000000000..f91601ec59 +--- /dev/null ++++ b/target/linux/ipq807x/patches/105-fix-dtc-gcc10-build.patch +@@ -0,0 +1,11 @@ ++--- a/scripts/dtc/dtc-lexer.lex.c_shipped +++++ b/scripts/dtc/dtc-lexer.lex.c_shipped ++@@ -637,7 +637,7 @@ char *yytext; ++ #include "srcpos.h" ++ #include "dtc-parser.tab.h" ++ ++-YYLTYPE yylloc; +++extern YYLTYPE yylloc; ++ extern bool treesource_error; ++ ++ /* CAUTION: this will stop working if we ever use yyless() or yyunput() */ +diff --git a/target/linux/ipq807x/patches/106-eap101.patch b/target/linux/ipq807x/patches/106-eap101.patch +new file mode 100644 +index 0000000000..188870b8dc +--- /dev/null ++++ b/target/linux/ipq807x/patches/106-eap101.patch +@@ -0,0 +1,993 @@ ++Index: linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/arch/arm64/boot/dts/qcom/qcom-ipq6018-cp01-edgecore.dtsi ++=================================================================== ++--- /dev/null +++++ linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/arch/arm64/boot/dts/qcom/qcom-ipq6018-cp01-edgecore.dtsi ++@@ -0,0 +1,542 @@ +++/* +++ * Copyright (c) 2019, The Linux Foundation. All rights reserved. +++ * +++ * Permission to use, copy, modify, and/or distribute this software for any +++ * purpose with or without fee is hereby granted, provided that the above +++ * copyright notice and this permission notice appear in all copies. +++ * +++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +++ */ +++ +++#include "qcom-ipq6018.dtsi" +++#include +++#include +++ +++/ { +++ #address-cells = <0x2>; +++ #size-cells = <0x2>; +++ compatible = "qcom,ipq6018-cp01", "qcom,ipq6018"; +++ interrupt-parent = <&intc>; +++ qcom,msm-id = <0x192 0x0>, <0x193 0x0>; +++ +++ aliases { +++ serial0 = &blsp1_uart3; +++ serial1 = &blsp1_uart2; +++ sdhc2 = &sdhc_2; +++ /* +++ * Aliases as required by u-boot +++ * to patch MAC addresses +++ */ +++ ethernet0 = "/soc/dp1"; +++ ethernet1 = "/soc/dp2"; +++ ethernet2 = "/soc/dp3"; +++ +++ led-boot = &led_power; +++ led-failsafe = &led_power; +++ led-running = &led_power; +++ led-upgrade = &led_power; +++ }; +++ +++ chosen { +++ bootargs = "console=ttyMSM0,115200,n8 rw init=/init"; +++#ifdef __IPQ_MEM_PROFILE_256_MB__ +++ bootargs-append = " swiotlb=1"; +++#else +++ bootargs-append = " swiotlb=1 coherent_pool=2M"; +++#endif +++ }; +++ +++}; +++ +++&tlmm { +++ pinctrl-0 = <&sd_ldo_pins>; +++ pinctrl-names = "default"; +++ +++ uart_pins: uart_pins { +++ mux { +++ pins = "gpio44", "gpio45"; +++ function = "blsp2_uart"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ +++ sd_ldo_pins: sd_ldo_pins { +++ mux { +++ pins = "gpio66"; +++ function = "gpio"; +++ drive-strength = <2>; +++ bias-disable; +++ output-low; +++ }; +++ }; +++ +++ spi_0_pins: spi_0_pins { +++ mux { +++ pins = "gpio38", "gpio39", "gpio40", "gpio41"; +++ function = "blsp0_spi"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ +++ spi_1_pins: spi_1_pins { +++ mux { +++ pins = "gpio69", "gpio71", "gpio72"; +++ function = "blsp1_spi"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ spi_cs { +++ pins = "gpio70"; +++ function = "blsp1_spi"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ quartz_interrupt { +++ pins = "gpio78"; +++ function = "gpio"; +++ input; +++ bias-disable; +++ }; +++ quartz_reset { +++ pins = "gpio79"; +++ function = "gpio"; +++ output-low; +++ bias-disable; +++ }; +++ +++ }; +++ +++ qpic_pins: qpic_pins { +++ data_0 { +++ pins = "gpio15"; +++ function = "qpic_pad0"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_1 { +++ pins = "gpio12"; +++ function = "qpic_pad1"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_2 { +++ pins = "gpio13"; +++ function = "qpic_pad2"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_3 { +++ pins = "gpio14"; +++ function = "qpic_pad3"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_4 { +++ pins = "gpio5"; +++ function = "qpic_pad4"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_5 { +++ pins = "gpio6"; +++ function = "qpic_pad5"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_6 { +++ pins = "gpio7"; +++ function = "qpic_pad6"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_7 { +++ pins = "gpio8"; +++ function = "qpic_pad7"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ qpic_pad { +++ pins = "gpio1", "gpio3", "gpio4", +++ "gpio10", "gpio11", "gpio17"; +++ function = "qpic_pad"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ +++ sd_pins: sd_pins { +++ mux { +++ pins = "gpio62"; +++ function = "sd_card"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ }; +++ +++ extcon_usb_pins: extcon_usb_pins { +++ mux { +++ pins = "gpio26"; +++ function = "gpio"; +++ drive-strength = <2>; +++ bias-pull-down; +++ }; +++ }; +++ +++ button_pins: button_pins { +++ wps_button { +++ pins = "gpio9"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ reset_button { +++ pins = "gpio19"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ }; +++ +++ mdio_pins: mdio_pinmux { +++ mux_0 { +++ pins = "gpio64"; +++ function = "mdc"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ mux_1 { +++ pins = "gpio65"; +++ function = "mdio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ mux_2 { +++ pins = "gpio75"; +++ function = "gpio"; +++ bias-pull-up; +++ }; +++ mux_3 { +++ pins = "gpio77"; +++ function = "gpio"; +++ bias-pull-up; +++ }; +++ }; +++ +++ leds_pins: leds_pins { +++ led_pwr { +++ pins = "gpio74"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ led_5g { +++ pins = "gpio35"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ led_2g { +++ pins = "gpio37"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ led_wan { +++ pins = "gpio62"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ led_lan1 { +++ pins = "gpio61"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ led_lan2 { +++ pins = "gpio63"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ led_bt { +++ pins = "gpio73"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ +++ hsuart_pins: hsuart_pins { +++ mux { +++ pins = "gpio71", "gpio72", "gpio69", "gpio70"; +++ function = "blsp1_uart"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ btcoex_pins: btcoex_pins { +++ mux_0 { +++ pins = "gpio51"; +++ function = "pta1_1"; +++ drive-strength = <6>; +++ bias-pull-down; +++ }; +++ mux_1 { +++ pins = "gpio53"; +++ function = "pta1_0"; +++ drive-strength = <6>; +++ bias-pull-down; +++ }; +++ mux_2 { +++ pins = "gpio52"; +++ function = "pta1_2"; +++ drive-strength = <6>; +++ bias-pull-down; +++ }; +++ }; +++}; +++ +++&soc { +++ extcon_usb: extcon_usb { +++ pinctrl-0 = <&extcon_usb_pins>; +++ pinctrl-names = "default"; +++ id-gpio = <&tlmm 26 GPIO_ACTIVE_LOW>; +++ status = "ok"; +++ }; +++ +++ mdio: mdio@90000 { +++ pinctrl-0 = <&mdio_pins>; +++ pinctrl-names = "default"; +++ phy-reset-gpio = <&tlmm 75 0 &tlmm 77 1>; +++ status = "ok"; +++ phy0: ethernet-phy@0 { +++ reg = <0x1c>; +++ }; +++ phy1: ethernet-phy@1 { +++ reg = <3>; +++ }; +++ phy2: ethernet-phy@2 { +++ reg = <4>; +++ }; +++ }; +++ +++ dp1 { +++ device_type = "network"; +++ compatible = "qcom,nss-dp"; +++ qcom,id = <5>; +++ reg = <0x3a001000 0x200>; +++ qcom,mactype = <0>; +++ local-mac-address = [000000000000]; +++ qcom,link-poll = <1>; +++ qcom,phy-mdio-addr = <28>; +++ phy-mode = "sgmii"; +++ }; +++ +++ dp2 { +++ device_type = "network"; +++ compatible = "qcom,nss-dp"; +++ qcom,id = <4>; +++ reg = <0x3a001200 0x200>; +++ qcom,mactype = <0>; +++ local-mac-address = [000000000000]; +++ qcom,link-poll = <1>; +++ qcom,phy-mdio-addr = <3>; +++ phy-mode = "sgmii"; +++ }; +++ +++ dp3 { +++ device_type = "network"; +++ compatible = "qcom,nss-dp"; +++ qcom,id = <3>; +++ reg = <0x3a001400 0x200>; +++ qcom,mactype = <0>; +++ local-mac-address = [000000000000]; +++ qcom,link-poll = <1>; +++ qcom,phy-mdio-addr = <4>; +++ phy-mode = "sgmii"; +++ }; +++ +++ +++ nss-macsec0 { +++ compatible = "qcom,nss-macsec"; +++ phy_addr = <0x1c>; +++ phy_access_mode = <0>; +++ mdiobus = <&mdio>; +++ }; +++ +++ ess-switch@3a000000 { +++ switch_cpu_bmp = <0x1>; /* cpu port bitmap */ +++ switch_lan_bmp = <0x1e>; /* lan port bitmap */ +++ switch_wan_bmp = <0x20>; /* wan port bitmap */ +++ switch_inner_bmp = <0xc0>; /*inner port bitmap*/ +++ switch_mac_mode = <0x0>; /* mac mode for uniphy instance0*/ +++ switch_mac_mode1 = <0xf>; /* mac mode for uniphy instance1*/ +++ switch_mac_mode2 = <0xff>; /* mac mode for uniphy instance2*/ +++ qcom,port_phyinfo { +++ port@2 { +++ port_id = <3>; +++ phy_address = <4>; +++ }; +++ port@1 { +++ port_id = <4>; +++ phy_address = <3>; +++ }; +++ port@0 { +++ port_id = <5>; +++ phy_address = <0x1c>; +++ port_mac_sel = "QGMAC_PORT"; +++ }; +++ }; +++ }; +++ +++ gpio_keys { +++ compatible = "gpio-keys"; +++ pinctrl-0 = <&button_pins>; +++ pinctrl-names = "default"; +++ +++ /*wps { +++ label = "wps"; +++ linux,code = ; +++ gpios = <&tlmm 9 GPIO_ACTIVE_LOW>; +++ linux,input-type = <1>; +++ debounce-interval = <60>; +++ };*/ +++ reset { +++ label = "reset"; +++ linux,code = ; +++ gpios = <&tlmm 19 GPIO_ACTIVE_LOW>; +++ linux,input-type = <1>; +++ debounce-interval = <60>; +++ }; +++ }; +++ +++ leds { +++ compatible = "gpio-leds"; +++ pinctrl-0 = <&leds_pins>; +++ pinctrl-names = "default"; +++ +++ led_power: led@74 { +++ label = "green:power"; +++ gpios = <&tlmm 74 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "led_pwr"; +++ default-state = "on"; +++ }; +++ led@35 { +++ label = "green:wifi5"; +++ gpios = <&tlmm 35 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "led_5g"; +++ default-state = "off"; +++ }; +++ led@37 { +++ label = "green:wifi2"; +++ gpios = <&tlmm 37 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "led_2g"; +++ default-state = "off"; +++ }; +++ }; +++}; +++ +++&blsp1_uart3 { +++ pinctrl-0 = <&uart_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&spi_0 { +++ pinctrl-0 = <&spi_0_pins>; +++ pinctrl-names = "default"; +++ cs-select = <0>; +++ status = "ok"; +++ +++ m25p80@0 { +++ #address-cells = <1>; +++ #size-cells = <1>; +++ reg = <0>; +++ compatible = "n25q128a11"; +++ linux,modalias = "m25p80", "n25q128a11"; +++ spi-max-frequency = <50000000>; +++ use-default-sizes; +++ }; +++}; +++ +++&blsp1_uart2 { +++ pinctrl-0 = <&hsuart_pins &btcoex_pins>; +++ pinctrl-names = "default"; +++ dmas = <&blsp_dma 2>, +++ <&blsp_dma 3>; +++ dma-names = "tx", "rx"; +++ status = "ok"; +++}; +++ +++&spi_1 { /* BLSP1 QUP1 */ +++ pinctrl-0 = <&spi_1_pins>; +++ pinctrl-names = "default"; +++ cs-select = <0>; +++ quartz-reset-gpio = <&tlmm 79 1>; +++ status = "disabled"; +++ spidev1: spi@1 { +++ compatible = "qca,spidev"; +++ reg = <0>; +++ spi-max-frequency = <24000000>; +++ }; +++}; +++ +++&qpic_bam { +++ status = "ok"; +++}; +++ +++&nand { +++ pinctrl-0 = <&qpic_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&ssphy_0 { +++ status = "ok"; +++}; +++ +++&qusb_phy_0 { +++ status = "ok"; +++}; +++ +++&qusb_phy_1 { +++ status = "ok"; +++}; +++ +++&usb2 { +++ status = "ok"; +++}; +++ +++&usb3 { +++ status = "ok"; +++}; +++ +++&nss_crypto { +++ status = "ok"; +++}; +++ +++&pcie_phy { +++ status = "ok"; +++}; +++ +++&pcie0 { +++ status = "ok"; +++}; +++ +++&qpic_lcd { +++ status = "ok"; +++}; +++ +++&qpic_lcd_panel { +++ status = "ok"; +++}; ++Index: linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/arch/arm64/boot/dts/qcom/qcom-ipq6018-edgecore-eap101.dts ++=================================================================== ++--- /dev/null +++++ linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/arch/arm64/boot/dts/qcom/qcom-ipq6018-edgecore-eap101.dts ++@@ -0,0 +1,441 @@ +++/dts-v1/; +++/* +++ * Copyright (c) 2019, The Linux Foundation. All rights reserved. +++ * +++ * Permission to use, copy, modify, and/or distribute this software for any +++ * purpose with or without fee is hereby granted, provided that the above +++ * copyright notice and this permission notice appear in all copies. +++ * +++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +++ */ +++ +++#include "qcom-ipq6018.dtsi" +++#include "qcom-ipq6018-rpm-regulator.dtsi" +++#include "qcom-ipq6018-cpr-regulator.dtsi" +++#include "qcom-ipq6018-cp-cpu.dtsi" +++#include +++#include +++ +++/ { +++ #address-cells = <0x2>; +++ #size-cells = <0x2>; +++ model = "EdgeCore EAP101"; +++ compatible = "edgecore,eap101", "qcom,ipq6018-cp01", "qcom,ipq6018"; +++ interrupt-parent = <&intc>; +++ +++ aliases { +++ serial0 = &blsp1_uart3; +++ serial1 = &blsp1_uart2; +++ +++ /* +++ * Aliases as required by u-boot +++ * to patch MAC addresses +++ */ +++ ethernet0 = "/soc/dp1"; +++ ethernet1 = "/soc/dp2"; +++ +++ led-boot = &led_power; +++ led-failsafe = &led_power; +++ led-running = &led_power; +++ led-upgrade = &led_power; +++ }; +++ +++ chosen { +++ bootargs = "console=ttyMSM0,115200,n8 rw init=/init"; +++ bootargs-append = " console=ttyMSM0,115200,n8 swiotlb=1 coherent_pool=2M"; +++ }; +++ +++ /* +++ * +=========+==============+========================+ +++ * | | | | +++ * | Region | Start Offset | Size | +++ * | | | | +++ * +--------+--------------+-------------------------+ +++ * | | | | +++ * | | | | +++ * | | | | +++ * | | | | +++ * | Linux | 0x41000000 | 139MB | +++ * | | | | +++ * | | | | +++ * | | | | +++ * +--------+--------------+-------------------------+ +++ * | TZ App | 0x49B00000 | 6MB | +++ * +--------+--------------+-------------------------+ +++ * +++ * From the available 145 MB for Linux in the first 256 MB, +++ * we are reserving 6 MB for TZAPP. +++ * +++ * Refer arch/arm64/boot/dts/qcom/qcom-ipq6018-memory.dtsi +++ * for memory layout. +++ */ +++ +++/* TZAPP is enabled only in default memory profile */ +++#if !defined(__IPQ_MEM_PROFILE_256_MB__) && !defined(__IPQ_MEM_PROFILE_512_MB__) +++ reserved-memory { +++ tzapp:tzapp@49B00000 { /* TZAPPS */ +++ no-map; +++ reg = <0x0 0x49B00000 0x0 0x00600000>; +++ }; +++ }; +++#endif +++}; +++ +++&tlmm { +++ uart_pins: uart_pins { +++ mux { +++ pins = "gpio44", "gpio45"; +++ function = "blsp2_uart"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ +++ spi_0_pins: spi_0_pins { +++ mux { +++ pins = "gpio38", "gpio39", "gpio40", "gpio41"; +++ function = "blsp0_spi"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ +++ qpic_pins: qpic_pins { +++ data_0 { +++ pins = "gpio15"; +++ function = "qpic_pad0"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_1 { +++ pins = "gpio12"; +++ function = "qpic_pad1"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_2 { +++ pins = "gpio13"; +++ function = "qpic_pad2"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_3 { +++ pins = "gpio14"; +++ function = "qpic_pad3"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_4 { +++ pins = "gpio5"; +++ function = "qpic_pad4"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_5 { +++ pins = "gpio6"; +++ function = "qpic_pad5"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_6 { +++ pins = "gpio7"; +++ function = "qpic_pad6"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ data_7 { +++ pins = "gpio8"; +++ function = "qpic_pad7"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ qpic_pad { +++ pins = "gpio1", "gpio3", "gpio4", +++ "gpio10", "gpio11", "gpio17"; +++ function = "qpic_pad"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ +++ extcon_usb_pins: extcon_usb_pins { +++ mux { +++ pins = "gpio26"; +++ function = "gpio"; +++ drive-strength = <2>; +++ bias-pull-down; +++ }; +++ }; +++ +++ button_pins: button_pins { +++ wps_button { +++ pins = "gpio19"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ }; +++ +++ mdio_pins: mdio_pinmux { +++ mux_0 { +++ pins = "gpio64"; +++ function = "mdc"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ mux_1 { +++ pins = "gpio65"; +++ function = "mdio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ mux_2 { +++ pins = "gpio75"; +++ function = "gpio"; +++ bias-pull-up; +++ }; +++ }; +++ +++ leds_pins: leds_pins { +++ led_pwr { +++ pins = "gpio74"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ led_5g { +++ pins = "gpio35"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ led_2g { +++ pins = "gpio37"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ uart2_pins: uart2_pins { +++ mux { +++ pins = "gpio57", "gpio58"; +++ function = "blsp4_uart"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++}; +++ +++&soc { +++ extcon_usb: extcon_usb { +++ pinctrl-0 = <&extcon_usb_pins>; +++ pinctrl-names = "default"; +++ id-gpio = <&tlmm 26 GPIO_ACTIVE_LOW>; +++ status = "ok"; +++ }; +++ +++ mdio: mdio@90000 { +++ pinctrl-0 = <&mdio_pins>; +++ pinctrl-names = "default"; +++ phy-reset-gpio = <&tlmm 75 0 &tlmm 77 1>; +++ status = "ok"; +++ phy0: ethernet-phy@0 { +++ reg = <0x1c>; +++ }; +++ phy1: ethernet-phy@1 { +++ reg = <3>; +++ }; +++ phy2: ethernet-phy@2 { +++ reg = <4>; +++ }; +++ }; +++ +++ dp1 { +++ device_type = "network"; +++ compatible = "qcom,nss-dp"; +++ qcom,id = <5>; +++ reg = <0x3a001000 0x200>; +++ qcom,mactype = <0>; +++ local-mac-address = [000000000000]; +++ qcom,link-poll = <1>; +++ qcom,phy-mdio-addr = <28>; +++ phy-mode = "sgmii"; +++ }; +++ +++ dp2 { +++ device_type = "network"; +++ compatible = "qcom,nss-dp"; +++ qcom,id = <4>; +++ reg = <0x3a001200 0x200>; +++ qcom,mactype = <0>; +++ local-mac-address = [000000000000]; +++ qcom,link-poll = <1>; +++ qcom,phy-mdio-addr = <3>; +++ phy-mode = "sgmii"; +++ }; +++ +++ dp3 { +++ device_type = "network"; +++ compatible = "qcom,nss-dp"; +++ qcom,id = <3>; +++ reg = <0x3a001400 0x200>; +++ qcom,mactype = <0>; +++ local-mac-address = [000000000000]; +++ qcom,link-poll = <1>; +++ qcom,phy-mdio-addr = <4>; +++ phy-mode = "sgmii"; +++ }; +++ +++ ess-switch@3a000000 { +++ switch_cpu_bmp = <0x1>; /* cpu port bitmap */ +++ switch_lan_bmp = <0x1e>; /* lan port bitmap */ +++ switch_wan_bmp = <0x20>; /* wan port bitmap */ +++ switch_inner_bmp = <0xc0>; /*inner port bitmap*/ +++ switch_mac_mode = <0x0>; /* mac mode for uniphy instance0*/ +++ switch_mac_mode1 = <0xf>; /* mac mode for uniphy instance1*/ +++ switch_mac_mode2 = <0xff>; /* mac mode for uniphy instance2*/ +++ qcom,port_phyinfo { +++ port@2 { +++ port_id = <3>; +++ phy_address = <4>; +++ }; +++ port@1 { +++ port_id = <4>; +++ phy_address = <3>; +++ }; +++ port@0 { +++ port_id = <5>; +++ phy_address = <0x1c>; +++ port_mac_sel = "QGMAC_PORT"; +++ }; +++ }; +++ }; +++ +++ gpio_keys { +++ compatible = "gpio-keys"; +++ pinctrl-0 = <&button_pins>; +++ pinctrl-names = "default"; +++ +++ wps { +++ label = "reset"; +++ linux,code = ; +++ gpios = <&tlmm 19 GPIO_ACTIVE_LOW>; +++ linux,input-type = <1>; +++ debounce-interval = <60>; +++ }; +++ }; +++ +++ leds { +++ compatible = "gpio-leds"; +++ pinctrl-0 = <&leds_pins>; +++ pinctrl-names = "default"; +++ +++ led@25 { +++ label = "green:wifi5"; +++ gpios = <&tlmm 35 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "wf188:green:5g"; +++ default-state = "off"; +++ }; +++ led@24 { +++ label = "green:wifi2"; +++ gpios = <&tlmm 37 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "wf188:green:2g"; +++ default-state = "off"; +++ }; +++ led_power: led@16 { +++ label = "green:led_pwr"; +++ gpios = <&tlmm 74 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "green:power"; +++ default-state = "off"; +++ }; +++ led@61 { +++ label = "green:lan1"; +++ gpios = <&tlmm 61 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "green:power"; +++ default-state = "off"; +++ }; +++ led@62 { +++ label = "green:wan"; +++ gpios = <&tlmm 62 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "green:power"; +++ default-state = "off"; +++ }; +++ led@63 { +++ label = "green:lan2"; +++ gpios = <&tlmm 63 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "green:power"; +++ default-state = "off"; +++ }; +++ }; +++}; +++ +++&blsp1_uart3 { +++ pinctrl-0 = <&uart_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&spi_0 { +++ pinctrl-0 = <&spi_0_pins>; +++ pinctrl-names = "default"; +++ cs-select = <0>; +++ status = "ok"; +++ +++ m25p80@0 { +++ #address-cells = <1>; +++ #size-cells = <1>; +++ reg = <0>; +++ compatible = "n25q128a11"; +++ linux,modalias = "m25p80", "n25q128a11"; +++ spi-max-frequency = <50000000>; +++ use-default-sizes; +++ }; +++}; +++ +++&blsp1_uart2 { +++ pinctrl-0 = <&uart2_pins>; +++ pinctrl-names = "default"; +++ dmas = <&blsp_dma 2>, +++ <&blsp_dma 3>; +++ dma-names = "tx", "rx"; +++ status = "ok"; +++}; +++&qpic_bam { +++ status = "ok"; +++}; +++ +++&nand { +++ pinctrl-0 = <&qpic_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&ssphy_0 { +++ status = "ok"; +++}; +++ +++&qusb_phy_0 { +++ status = "ok"; +++}; +++ +++&qusb_phy_1 { +++ status = "ok"; +++}; +++ +++&usb2 { +++ status = "ok"; +++}; +++ +++&usb3 { +++ status = "ok"; +++}; +++ +++&nss_crypto { +++ status = "ok"; +++}; +diff --git a/target/linux/ipq807x/patches/108-log-spam.patch b/target/linux/ipq807x/patches/108-log-spam.patch +new file mode 100644 +index 0000000000..94b2a3ffd5 +--- /dev/null ++++ b/target/linux/ipq807x/patches/108-log-spam.patch +@@ -0,0 +1,37 @@ ++Index: linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/drivers/clk/qcom/clk-branch.c ++=================================================================== ++--- linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce.orig/drivers/clk/qcom/clk-branch.c +++++ linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/drivers/clk/qcom/clk-branch.c ++@@ -75,7 +75,7 @@ static int clk_branch_wait(const struct ++ bool (check_halt)(const struct clk_branch *, bool)) ++ { ++ bool voted = br->halt_check & BRANCH_VOTED; ++- const char *name = clk_hw_get_name(&br->clkr.hw); +++ //const char *name = clk_hw_get_name(&br->clkr.hw); ++ ++ /* Skip checking halt bit if the clock is in hardware gated mode */ ++ if (clk_branch_in_hwcg_mode(br)) ++@@ -93,8 +93,8 @@ static int clk_branch_wait(const struct ++ return 0; ++ udelay(1); ++ } ++- WARN(1, "%s status stuck at 'o%s'", name, ++- enabling ? "ff" : "n"); +++/* WARN(1, "%s status stuck at 'o%s'", name, +++ enabling ? "ff" : "n");*/ ++ return -EBUSY; ++ } ++ return 0; ++Index: linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/drivers/usb/phy/phy-msm-qusb.c ++=================================================================== ++--- linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce.orig/drivers/usb/phy/phy-msm-qusb.c +++++ linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/drivers/usb/phy/phy-msm-qusb.c ++@@ -491,7 +491,7 @@ static int qusb_phy_init(struct usb_phy ++ dev_err(phy->dev, "QUSB PHY PLL LOCK fails:%x\n", ++ readb_relaxed(qphy->base ++ + QUSB2PHY_PLL_STATUS)); ++- WARN_ON(1); +++ //WARN_ON(1); ++ } ++ ++ /* Set OTG VBUS Valid from HSPHY to controller */ +diff --git a/target/linux/ipq807x/patches/109-tplink.patch b/target/linux/ipq807x/patches/109-tplink.patch +new file mode 100644 +index 0000000000..3ad3ffd99c +--- /dev/null ++++ b/target/linux/ipq807x/patches/109-tplink.patch +@@ -0,0 +1,1518 @@ ++Index: linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/arch/arm64/boot/dts/qcom/qcom-ipq807x-ex227.dts ++=================================================================== ++--- /dev/null +++++ linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/arch/arm64/boot/dts/qcom/qcom-ipq807x-ex227.dts ++@@ -0,0 +1,754 @@ +++/dts-v1/; +++/* +++ * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. +++ * +++ * Permission to use, copy, modify, and/or distribute this software for any +++ * purpose with or without fee is hereby granted, provided that the above +++ * copyright notice and this permission notice appear in all copies. +++ * +++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +++ */ +++#include "qcom-ipq807x-soc.dtsi" +++#include "qcom-ipq807x-hk-cpu.dtsi" +++ +++/ { +++ #address-cells = <0x2>; +++ #size-cells = <0x2>; +++ model = "TP-Link EX227"; +++ compatible = "tplink,ex227", "qcom,ipq807x"; +++ qcom,msm-id = <0x143 0x0>; +++ interrupt-parent = <&intc>; +++ qcom,board-id = <0x8 0x0>; +++ qcom,pmic-id = <0x0 0x0 0x0 0x0>; +++ +++ aliases { +++ /* +++ * Aliases as required by u-boot +++ * to patch MAC addresses +++ */ +++ ethernet0 = "/soc/dp1"; +++ led-boot = &led_power; +++ led-failsafe = &led_power; +++ led-running = &led_power; +++ led-upgrade = &led_power; +++ }; +++ +++ chosen { +++ bootargs = "console=ttyMSM0,115200,n8 root=/dev/ram0 rw \ +++ init=/init"; +++ bootargs-append = " swiotlb=1"; +++ }; +++}; +++ +++&tlmm { +++ pinctrl-0 = <&btcoex_pins>; +++ pinctrl-names = "default"; +++ +++ btcoex_pins: btcoex_pins { +++ mux_0 { +++ pins = "gpio64"; +++ function = "pta1_1"; +++ drive-strength = <6>; +++ bias-pull-down; +++ }; +++ mux_1 { +++ pins = "gpio65"; +++ function = "pta1_2"; +++ drive-strength = <6>; +++ bias-pull-down; +++ }; +++ mux_2 { +++ pins = "gpio66"; +++ function = "pta1_0"; +++ drive-strength = <6>; +++ bias-pull-down; +++ }; +++ }; +++ +++ mdio_pins: mdio_pinmux { +++ mux_0 { +++ pins = "gpio68"; +++ function = "mdc"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ mux_1 { +++ pins = "gpio69"; +++ function = "mdio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ mux_2 { +++ pins = "gpio25"; +++ function = "gpio"; +++ bias-pull-up; +++ }; +++ mux_3 { +++ pins = "gpio37"; +++ function = "gpio"; +++ bias-pull-up; +++ }; +++ }; +++ +++ uart_pins: uart_pins { +++ mux { +++ pins = "gpio23", "gpio24"; +++ function = "blsp4_uart1"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ spi_0_pins: spi_0_pins { +++ mux { +++ pins = "gpio38", "gpio39", "gpio40", "gpio41"; +++ function = "blsp0_spi"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ spi_3_pins: spi_3_pins { +++ mux { +++ pins = "gpio52", "gpio53"; +++ function = "blsp3_spi"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ spi_cs { +++ pins = "gpio22"; +++ function = "blsp3_spi2"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ quartz_interrupt { +++ pins = "gpio47"; +++ function = "gpio"; +++ input; +++ bias-disable; +++ }; +++ quartz_reset { +++ pins = "gpio21"; +++ function = "gpio"; +++ output-low; +++ bias-disable; +++ }; +++ }; +++ +++ qpic_pins: qpic_pins { +++ data_0 { +++ pins = "gpio15"; +++ function = "qpic_pad0"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_1 { +++ pins = "gpio12"; +++ function = "qpic_pad1"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_2 { +++ pins = "gpio13"; +++ function = "qpic_pad2"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_3 { +++ pins = "gpio14"; +++ function = "qpic_pad3"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_4 { +++ pins = "gpio5"; +++ function = "qpic_pad4"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_5 { +++ pins = "gpio6"; +++ function = "qpic_pad5"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_6 { +++ pins = "gpio7"; +++ function = "qpic_pad6"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_7 { +++ pins = "gpio8"; +++ function = "qpic_pad7"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ qpic_pad { +++ pins = "gpio1", "gpio3", "gpio4", +++ "gpio10", "gpio11", "gpio17"; +++ function = "qpic_pad"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ hsuart_pins: hsuart_pins { +++ mux { +++ pins = "gpio46", "gpio47", "gpio48", "gpio49"; +++ function = "blsp2_uart"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ /* POWER_LED, TP-Link */ +++ led_pins: led_pins { +++ led_power { +++ pins = "gpio42"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ }; +++ +++ /* BUTTON, TP-Link */ +++ button_pins: button_pins { +++ reset_button { +++ pins = "gpio50"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ }; +++ +++ usb_mux_sel_pins: usb_mux_pins { +++ mux { +++ pins = "gpio27"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ +++ pcie0_pins: pcie_pins { +++ pcie0_rst { +++ pins = "gpio58"; +++ function = "pcie0_rst"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ pcie0_wake { +++ pins = "gpio59"; +++ function = "pcie0_wake"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ +++}; +++ +++&soc { +++ mdio: mdio@90000 { +++ pinctrl-0 = <&mdio_pins>; +++ pinctrl-names = "default"; +++ phy-reset-gpio = <&tlmm 37 0 &tlmm 25 1>; +++ compatible = "qcom,ipq40xx-mdio", "qcom,qca-mdio"; +++ phy0: ethernet-phy@0 { +++ reg = <0>; +++ }; +++ phy1: ethernet-phy@1 { +++ reg = <1>; +++ }; +++ phy2: ethernet-phy@2 { +++ reg = <2>; +++ }; +++ phy3: ethernet-phy@3 { +++ reg = <3>; +++ }; +++ phy4: ethernet-phy@4 { +++ reg = <28>; +++ }; +++ phy5: ethernet-phy@5 { +++ reg = <4>; +++ }; +++ }; +++ +++ ess-switch@3a000000 { +++ switch_cpu_bmp = <0x1>; /* cpu port bitmap */ +++ switch_lan_bmp = <0x3e>; /* lan port bitmap */ +++ switch_wan_bmp = <0x40>; /* wan port bitmap */ +++ switch_mac_mode = <0x0>; /* mac mode for uniphy instance0*/ +++ switch_mac_mode1 = <0xf>; /* mac mode for uniphy instance1*/ +++ switch_mac_mode2 = <0xf>; /* mac mode for uniphy instance2*/ +++ bm_tick_mode = <0>; /* bm tick mode */ +++ tm_tick_mode = <0>; /* tm tick mode */ +++ qcom,port_phyinfo { +++ port@0 { +++ port_id = <1>; +++ phy_address = <0>; +++ }; +++ port@1 { +++ port_id = <2>; +++ phy_address = <1>; +++ }; +++ port@2 { +++ port_id = <3>; +++ phy_address = <2>; +++ }; +++ port@3 { +++ port_id = <4>; +++ phy_address = <3>; +++ }; +++ port@4 { +++ port_id = <5>; +++ phy_address = <28>; +++ port_mac_sel = "QGMAC_PORT"; +++ }; +++ port@5 { +++ port_id = <6>; +++ phy_address = <4>; +++ }; +++ }; +++ port_scheduler_resource { +++ port@0 { +++ port_id = <0>; +++ ucast_queue = <0 143>; +++ mcast_queue = <256 271>; +++ l0sp = <0 35>; +++ l0cdrr = <0 47>; +++ l0edrr = <0 47>; +++ l1cdrr = <0 7>; +++ l1edrr = <0 7>; +++ }; +++ port@1 { +++ port_id = <1>; +++ ucast_queue = <144 159>; +++ mcast_queue = <272 275>; +++ l0sp = <36 39>; +++ l0cdrr = <48 63>; +++ l0edrr = <48 63>; +++ l1cdrr = <8 11>; +++ l1edrr = <8 11>; +++ }; +++ port@2 { +++ port_id = <2>; +++ ucast_queue = <160 175>; +++ mcast_queue = <276 279>; +++ l0sp = <40 43>; +++ l0cdrr = <64 79>; +++ l0edrr = <64 79>; +++ l1cdrr = <12 15>; +++ l1edrr = <12 15>; +++ }; +++ port@3 { +++ port_id = <3>; +++ ucast_queue = <176 191>; +++ mcast_queue = <280 283>; +++ l0sp = <44 47>; +++ l0cdrr = <80 95>; +++ l0edrr = <80 95>; +++ l1cdrr = <16 19>; +++ l1edrr = <16 19>; +++ }; +++ port@4 { +++ port_id = <4>; +++ ucast_queue = <192 207>; +++ mcast_queue = <284 287>; +++ l0sp = <48 51>; +++ l0cdrr = <96 111>; +++ l0edrr = <96 111>; +++ l1cdrr = <20 23>; +++ l1edrr = <20 23>; +++ }; +++ port@5 { +++ port_id = <5>; +++ ucast_queue = <208 223>; +++ mcast_queue = <288 291>; +++ l0sp = <52 55>; +++ l0cdrr = <112 127>; +++ l0edrr = <112 127>; +++ l1cdrr = <24 27>; +++ l1edrr = <24 27>; +++ }; +++ port@6 { +++ port_id = <6>; +++ ucast_queue = <224 239>; +++ mcast_queue = <292 295>; +++ l0sp = <56 59>; +++ l0cdrr = <128 143>; +++ l0edrr = <128 143>; +++ l1cdrr = <28 31>; +++ l1edrr = <28 31>; +++ }; +++ port@7 { +++ port_id = <7>; +++ ucast_queue = <240 255>; +++ mcast_queue = <296 299>; +++ l0sp = <60 63>; +++ l0cdrr = <144 159>; +++ l0edrr = <144 159>; +++ l1cdrr = <32 35>; +++ l1edrr = <32 35>; +++ }; +++ }; +++ port_scheduler_config { +++ port@0 { +++ port_id = <0>; +++ l1scheduler { +++ group@0 { +++ sp = <0 1>; /*L0 SPs*/ +++ /*cpri cdrr epri edrr*/ +++ cfg = <0 0 0 0>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ /*unicast queues*/ +++ ucast_queue = <0 4 8>; +++ /*multicast queues*/ +++ mcast_queue = <256 260>; +++ /*sp cpri cdrr epri edrr*/ +++ cfg = <0 0 0 0 0>; +++ }; +++ group@1 { +++ ucast_queue = <1 5 9>; +++ mcast_queue = <257 261>; +++ cfg = <0 1 1 1 1>; +++ }; +++ group@2 { +++ ucast_queue = <2 6 10>; +++ mcast_queue = <258 262>; +++ cfg = <0 2 2 2 2>; +++ }; +++ group@3 { +++ ucast_queue = <3 7 11>; +++ mcast_queue = <259 263>; +++ cfg = <0 3 3 3 3>; +++ }; +++ }; +++ }; +++ port@1 { +++ port_id = <1>; +++ l1scheduler { +++ group@0 { +++ sp = <36>; +++ cfg = <0 8 0 8>; +++ }; +++ group@1 { +++ sp = <37>; +++ cfg = <1 9 1 9>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <144>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <272>; +++ mcast_loop_pri = <4>; +++ cfg = <36 0 48 0 48>; +++ }; +++ }; +++ }; +++ port@2 { +++ port_id = <2>; +++ l1scheduler { +++ group@0 { +++ sp = <40>; +++ cfg = <0 12 0 12>; +++ }; +++ group@1 { +++ sp = <41>; +++ cfg = <1 13 1 13>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <160>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <276>; +++ mcast_loop_pri = <4>; +++ cfg = <40 0 64 0 64>; +++ }; +++ }; +++ }; +++ port@3 { +++ port_id = <3>; +++ l1scheduler { +++ group@0 { +++ sp = <44>; +++ cfg = <0 16 0 16>; +++ }; +++ group@1 { +++ sp = <45>; +++ cfg = <1 17 1 17>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <176>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <280>; +++ mcast_loop_pri = <4>; +++ cfg = <44 0 80 0 80>; +++ }; +++ }; +++ }; +++ port@4 { +++ port_id = <4>; +++ l1scheduler { +++ group@0 { +++ sp = <48>; +++ cfg = <0 20 0 20>; +++ }; +++ group@1 { +++ sp = <49>; +++ cfg = <1 21 1 21>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <192>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <284>; +++ mcast_loop_pri = <4>; +++ cfg = <48 0 96 0 96>; +++ }; +++ }; +++ }; +++ port@5 { +++ port_id = <5>; +++ l1scheduler { +++ group@0 { +++ sp = <52>; +++ cfg = <0 24 0 24>; +++ }; +++ group@1 { +++ sp = <53>; +++ cfg = <1 25 1 25>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <208>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <288>; +++ mcast_loop_pri = <4>; +++ cfg = <52 0 112 0 112>; +++ }; +++ }; +++ }; +++ port@6 { +++ port_id = <6>; +++ l1scheduler { +++ group@0 { +++ sp = <56>; +++ cfg = <0 28 0 28>; +++ }; +++ group@1 { +++ sp = <57>; +++ cfg = <1 29 1 29>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <224>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <292>; +++ mcast_loop_pri = <4>; +++ cfg = <56 0 128 0 128>; +++ }; +++ }; +++ }; +++ port@7 { +++ port_id = <7>; +++ l1scheduler { +++ group@0 { +++ sp = <60>; +++ cfg = <0 32 0 32>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <240>; +++ mcast_queue = <296>; +++ cfg = <60 0 144 0 144>; +++ }; +++ }; +++ }; +++ }; +++ }; +++ +++ dp1 { +++ device_type = "network"; +++ compatible = "qcom,nss-dp"; +++ qcom,id = <6>; +++ reg = <0x3a001000 0x200>; +++ qcom,mactype = <0>; +++ local-mac-address = [000000000000]; +++ qcom,link-poll = <1>; +++ qcom,phy-mdio-addr = <4>; +++ phy-mode = "sgmii"; +++ }; +++ +++ /* POWER LED, TP-Link */ +++ leds { +++ compatible = "gpio-leds"; +++ pinctrl-0 = <&led_pins>; +++ pinctrl-names = "default"; +++ +++ led_power: led_power { +++ label = "blue:power"; +++ gpio = <&tlmm 42 GPIO_ACTIVE_HIGH>; +++ default-state = "on"; +++ }; +++ }; +++ +++ /* BUTTON, TP-Link */ +++ gpio_keys { +++ compatible = "gpio-keys"; +++ pinctrl-0 = <&button_pins>; +++ pinctrl-names = "default"; +++ +++ button@1 { +++ label = "reset"; +++ linux,code = ; +++ gpios = <&tlmm 50 GPIO_ACTIVE_LOW>; +++ linux,input-type = <1>; +++ }; +++ }; +++ +++ nss-macsec0 { +++ compatible = "qcom,nss-macsec"; +++ phy_addr = <0x18>; +++ phy_access_mode = <0>; +++ mdiobus = <&mdio>; +++ }; +++ nss-macsec1 { +++ compatible = "qcom,nss-macsec"; +++ phy_addr = <0x1c>; +++ phy_access_mode = <0>; +++ mdiobus = <&mdio>; +++ }; +++}; +++ +++&serial_blsp4 { +++ pinctrl-0 = <&uart_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&spi_0 { /* BLSP1 QUP1 */ +++ pinctrl-0 = <&spi_0_pins>; +++ pinctrl-names = "default"; +++ cs-select = <0>; +++ status = "ok"; +++ +++ m25p80@0 { +++ #address-cells = <1>; +++ #size-cells = <1>; +++ reg = <0>; +++ compatible = "n25q128a11"; +++ linux,modalias = "m25p80", "n25q128a11"; +++ spi-max-frequency = <50000000>; +++ use-default-sizes; +++ }; +++}; +++ +++&spi_4 { /* BLSP1 QUP3 */ +++ pinctrl-0 = <&spi_3_pins>; +++ pinctrl-names = "default"; +++ cs-select = <2>; +++ quartz-reset-gpio = <&tlmm 21 1>; +++ status = "disabled"; +++ spidev3: spi@3 { +++ compatible = "qca,spidev"; +++ reg = <0>; +++ spi-max-frequency = <24000000>; +++ }; +++}; +++ +++&serial_blsp2 { +++ status = "disabled"; +++}; +++ +++&msm_imem { +++ status = "disabled"; +++}; +++ +++&ssphy_0 { +++ status = "ok"; +++}; +++ +++&qusb_phy_0 { +++ status = "ok"; +++}; +++ +++&ssphy_1 { +++ status = "ok"; +++}; +++ +++&qusb_phy_1 { +++ status = "ok"; +++}; +++ +++&usb3_0 { +++ status = "ok"; +++}; +++ +++&usb3_1 { +++ status = "ok"; +++}; +++ +++&cryptobam { +++ status = "ok"; +++}; +++ +++&crypto { +++ status = "ok"; +++}; +++ +++&i2c_0 { +++ status = "disabled"; +++}; +++ +++&i2c_1 { +++ status = "disabled"; +++}; +++ +++&qpic_bam { +++ status = "ok"; +++}; +++ +++&nand { +++ pinctrl-0 = <&qpic_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&qpic_lcd { +++ status = "disabled"; +++}; +++ +++&qpic_lcd_panel { +++ status = "disabled"; +++}; +++ +++&ledc { +++ status = "disabled"; +++}; +++ +++&pcie0 { +++ status = "ok"; +++}; +++ +++&pcie1 { +++ status = "disabled"; +++}; +++ ++Index: linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/arch/arm64/boot/dts/qcom/qcom-ipq807x-ex447.dts ++=================================================================== ++--- /dev/null +++++ linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/arch/arm64/boot/dts/qcom/qcom-ipq807x-ex447.dts ++@@ -0,0 +1,754 @@ +++/dts-v1/; +++/* +++ * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. +++ * +++ * Permission to use, copy, modify, and/or distribute this software for any +++ * purpose with or without fee is hereby granted, provided that the above +++ * copyright notice and this permission notice appear in all copies. +++ * +++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +++ */ +++#include "qcom-ipq807x-soc.dtsi" +++#include "qcom-ipq807x-hk-cpu.dtsi" +++ +++/ { +++ #address-cells = <0x2>; +++ #size-cells = <0x2>; +++ model = "TP-Link EX447"; +++ compatible = "tplink,ex447", "qcom,ipq807x"; +++ qcom,msm-id = <0x143 0x0>; +++ interrupt-parent = <&intc>; +++ qcom,board-id = <0x8 0x0>; +++ qcom,pmic-id = <0x0 0x0 0x0 0x0>; +++ +++ aliases { +++ /* +++ * Aliases as required by u-boot +++ * to patch MAC addresses +++ */ +++ ethernet0 = "/soc/dp1"; +++ }; +++ +++ chosen { +++ bootargs = "console=ttyMSM0,115200,n8 root=/dev/ram0 rw \ +++ init=/init"; +++ bootargs-append = " swiotlb=1"; +++ led-boot = &led_power; +++ led-failsafe = &led_power; +++ led-running = &led_power; +++ led-upgrade = &led_power; +++ }; +++}; +++ +++&tlmm { +++ pinctrl-0 = <&btcoex_pins>; +++ pinctrl-names = "default"; +++ +++ btcoex_pins: btcoex_pins { +++ mux_0 { +++ pins = "gpio64"; +++ function = "pta1_1"; +++ drive-strength = <6>; +++ bias-pull-down; +++ }; +++ mux_1 { +++ pins = "gpio65"; +++ function = "pta1_2"; +++ drive-strength = <6>; +++ bias-pull-down; +++ }; +++ mux_2 { +++ pins = "gpio66"; +++ function = "pta1_0"; +++ drive-strength = <6>; +++ bias-pull-down; +++ }; +++ }; +++ +++ mdio_pins: mdio_pinmux { +++ mux_0 { +++ pins = "gpio68"; +++ function = "mdc"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ mux_1 { +++ pins = "gpio69"; +++ function = "mdio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ mux_2 { +++ pins = "gpio25"; +++ function = "gpio"; +++ bias-pull-up; +++ }; +++ mux_3 { +++ pins = "gpio37"; +++ function = "gpio"; +++ bias-pull-up; +++ }; +++ }; +++ +++ uart_pins: uart_pins { +++ mux { +++ pins = "gpio23", "gpio24"; +++ function = "blsp4_uart1"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ spi_0_pins: spi_0_pins { +++ mux { +++ pins = "gpio38", "gpio39", "gpio40", "gpio41"; +++ function = "blsp0_spi"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ spi_3_pins: spi_3_pins { +++ mux { +++ pins = "gpio52", "gpio53"; +++ function = "blsp3_spi"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ spi_cs { +++ pins = "gpio22"; +++ function = "blsp3_spi2"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ quartz_interrupt { +++ pins = "gpio47"; +++ function = "gpio"; +++ input; +++ bias-disable; +++ }; +++ quartz_reset { +++ pins = "gpio21"; +++ function = "gpio"; +++ output-low; +++ bias-disable; +++ }; +++ }; +++ +++ qpic_pins: qpic_pins { +++ data_0 { +++ pins = "gpio15"; +++ function = "qpic_pad0"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_1 { +++ pins = "gpio12"; +++ function = "qpic_pad1"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_2 { +++ pins = "gpio13"; +++ function = "qpic_pad2"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_3 { +++ pins = "gpio14"; +++ function = "qpic_pad3"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_4 { +++ pins = "gpio5"; +++ function = "qpic_pad4"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_5 { +++ pins = "gpio6"; +++ function = "qpic_pad5"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_6 { +++ pins = "gpio7"; +++ function = "qpic_pad6"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_7 { +++ pins = "gpio8"; +++ function = "qpic_pad7"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ qpic_pad { +++ pins = "gpio1", "gpio3", "gpio4", +++ "gpio10", "gpio11", "gpio17"; +++ function = "qpic_pad"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ hsuart_pins: hsuart_pins { +++ mux { +++ pins = "gpio46", "gpio47", "gpio48", "gpio49"; +++ function = "blsp2_uart"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ /* POWER_LED, TP-Link */ +++ led_pins: led_pins { +++ led_power { +++ pins = "gpio42"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ }; +++ +++ /* BUTTON, TP-Link */ +++ button_pins: button_pins { +++ reset_button { +++ pins = "gpio50"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ }; +++ +++ usb_mux_sel_pins: usb_mux_pins { +++ mux { +++ pins = "gpio27"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ +++ pcie0_pins: pcie_pins { +++ pcie0_rst { +++ pins = "gpio58"; +++ function = "pcie0_rst"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ pcie0_wake { +++ pins = "gpio59"; +++ function = "pcie0_wake"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ +++}; +++ +++&soc { +++ mdio: mdio@90000 { +++ pinctrl-0 = <&mdio_pins>; +++ pinctrl-names = "default"; +++ phy-reset-gpio = <&tlmm 37 0 &tlmm 25 1>; +++ compatible = "qcom,ipq40xx-mdio", "qcom,qca-mdio"; +++ phy0: ethernet-phy@0 { +++ reg = <0>; +++ }; +++ phy1: ethernet-phy@1 { +++ reg = <1>; +++ }; +++ phy2: ethernet-phy@2 { +++ reg = <2>; +++ }; +++ phy3: ethernet-phy@3 { +++ reg = <3>; +++ }; +++ phy4: ethernet-phy@4 { +++ reg = <28>; +++ }; +++ phy5: ethernet-phy@5 { +++ reg = <4>; +++ }; +++ }; +++ +++ ess-switch@3a000000 { +++ switch_cpu_bmp = <0x1>; /* cpu port bitmap */ +++ switch_lan_bmp = <0x3e>; /* lan port bitmap */ +++ switch_wan_bmp = <0x40>; /* wan port bitmap */ +++ switch_mac_mode = <0x0>; /* mac mode for uniphy instance0*/ +++ switch_mac_mode1 = <0xf>; /* mac mode for uniphy instance1*/ +++ switch_mac_mode2 = <0xf>; /* mac mode for uniphy instance2*/ +++ bm_tick_mode = <0>; /* bm tick mode */ +++ tm_tick_mode = <0>; /* tm tick mode */ +++ qcom,port_phyinfo { +++ port@0 { +++ port_id = <1>; +++ phy_address = <0>; +++ }; +++ port@1 { +++ port_id = <2>; +++ phy_address = <1>; +++ }; +++ port@2 { +++ port_id = <3>; +++ phy_address = <2>; +++ }; +++ port@3 { +++ port_id = <4>; +++ phy_address = <3>; +++ }; +++ port@4 { +++ port_id = <5>; +++ phy_address = <28>; +++ port_mac_sel = "QGMAC_PORT"; +++ }; +++ port@5 { +++ port_id = <6>; +++ phy_address = <4>; +++ }; +++ }; +++ port_scheduler_resource { +++ port@0 { +++ port_id = <0>; +++ ucast_queue = <0 143>; +++ mcast_queue = <256 271>; +++ l0sp = <0 35>; +++ l0cdrr = <0 47>; +++ l0edrr = <0 47>; +++ l1cdrr = <0 7>; +++ l1edrr = <0 7>; +++ }; +++ port@1 { +++ port_id = <1>; +++ ucast_queue = <144 159>; +++ mcast_queue = <272 275>; +++ l0sp = <36 39>; +++ l0cdrr = <48 63>; +++ l0edrr = <48 63>; +++ l1cdrr = <8 11>; +++ l1edrr = <8 11>; +++ }; +++ port@2 { +++ port_id = <2>; +++ ucast_queue = <160 175>; +++ mcast_queue = <276 279>; +++ l0sp = <40 43>; +++ l0cdrr = <64 79>; +++ l0edrr = <64 79>; +++ l1cdrr = <12 15>; +++ l1edrr = <12 15>; +++ }; +++ port@3 { +++ port_id = <3>; +++ ucast_queue = <176 191>; +++ mcast_queue = <280 283>; +++ l0sp = <44 47>; +++ l0cdrr = <80 95>; +++ l0edrr = <80 95>; +++ l1cdrr = <16 19>; +++ l1edrr = <16 19>; +++ }; +++ port@4 { +++ port_id = <4>; +++ ucast_queue = <192 207>; +++ mcast_queue = <284 287>; +++ l0sp = <48 51>; +++ l0cdrr = <96 111>; +++ l0edrr = <96 111>; +++ l1cdrr = <20 23>; +++ l1edrr = <20 23>; +++ }; +++ port@5 { +++ port_id = <5>; +++ ucast_queue = <208 223>; +++ mcast_queue = <288 291>; +++ l0sp = <52 55>; +++ l0cdrr = <112 127>; +++ l0edrr = <112 127>; +++ l1cdrr = <24 27>; +++ l1edrr = <24 27>; +++ }; +++ port@6 { +++ port_id = <6>; +++ ucast_queue = <224 239>; +++ mcast_queue = <292 295>; +++ l0sp = <56 59>; +++ l0cdrr = <128 143>; +++ l0edrr = <128 143>; +++ l1cdrr = <28 31>; +++ l1edrr = <28 31>; +++ }; +++ port@7 { +++ port_id = <7>; +++ ucast_queue = <240 255>; +++ mcast_queue = <296 299>; +++ l0sp = <60 63>; +++ l0cdrr = <144 159>; +++ l0edrr = <144 159>; +++ l1cdrr = <32 35>; +++ l1edrr = <32 35>; +++ }; +++ }; +++ port_scheduler_config { +++ port@0 { +++ port_id = <0>; +++ l1scheduler { +++ group@0 { +++ sp = <0 1>; /*L0 SPs*/ +++ /*cpri cdrr epri edrr*/ +++ cfg = <0 0 0 0>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ /*unicast queues*/ +++ ucast_queue = <0 4 8>; +++ /*multicast queues*/ +++ mcast_queue = <256 260>; +++ /*sp cpri cdrr epri edrr*/ +++ cfg = <0 0 0 0 0>; +++ }; +++ group@1 { +++ ucast_queue = <1 5 9>; +++ mcast_queue = <257 261>; +++ cfg = <0 1 1 1 1>; +++ }; +++ group@2 { +++ ucast_queue = <2 6 10>; +++ mcast_queue = <258 262>; +++ cfg = <0 2 2 2 2>; +++ }; +++ group@3 { +++ ucast_queue = <3 7 11>; +++ mcast_queue = <259 263>; +++ cfg = <0 3 3 3 3>; +++ }; +++ }; +++ }; +++ port@1 { +++ port_id = <1>; +++ l1scheduler { +++ group@0 { +++ sp = <36>; +++ cfg = <0 8 0 8>; +++ }; +++ group@1 { +++ sp = <37>; +++ cfg = <1 9 1 9>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <144>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <272>; +++ mcast_loop_pri = <4>; +++ cfg = <36 0 48 0 48>; +++ }; +++ }; +++ }; +++ port@2 { +++ port_id = <2>; +++ l1scheduler { +++ group@0 { +++ sp = <40>; +++ cfg = <0 12 0 12>; +++ }; +++ group@1 { +++ sp = <41>; +++ cfg = <1 13 1 13>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <160>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <276>; +++ mcast_loop_pri = <4>; +++ cfg = <40 0 64 0 64>; +++ }; +++ }; +++ }; +++ port@3 { +++ port_id = <3>; +++ l1scheduler { +++ group@0 { +++ sp = <44>; +++ cfg = <0 16 0 16>; +++ }; +++ group@1 { +++ sp = <45>; +++ cfg = <1 17 1 17>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <176>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <280>; +++ mcast_loop_pri = <4>; +++ cfg = <44 0 80 0 80>; +++ }; +++ }; +++ }; +++ port@4 { +++ port_id = <4>; +++ l1scheduler { +++ group@0 { +++ sp = <48>; +++ cfg = <0 20 0 20>; +++ }; +++ group@1 { +++ sp = <49>; +++ cfg = <1 21 1 21>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <192>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <284>; +++ mcast_loop_pri = <4>; +++ cfg = <48 0 96 0 96>; +++ }; +++ }; +++ }; +++ port@5 { +++ port_id = <5>; +++ l1scheduler { +++ group@0 { +++ sp = <52>; +++ cfg = <0 24 0 24>; +++ }; +++ group@1 { +++ sp = <53>; +++ cfg = <1 25 1 25>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <208>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <288>; +++ mcast_loop_pri = <4>; +++ cfg = <52 0 112 0 112>; +++ }; +++ }; +++ }; +++ port@6 { +++ port_id = <6>; +++ l1scheduler { +++ group@0 { +++ sp = <56>; +++ cfg = <0 28 0 28>; +++ }; +++ group@1 { +++ sp = <57>; +++ cfg = <1 29 1 29>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <224>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <292>; +++ mcast_loop_pri = <4>; +++ cfg = <56 0 128 0 128>; +++ }; +++ }; +++ }; +++ port@7 { +++ port_id = <7>; +++ l1scheduler { +++ group@0 { +++ sp = <60>; +++ cfg = <0 32 0 32>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <240>; +++ mcast_queue = <296>; +++ cfg = <60 0 144 0 144>; +++ }; +++ }; +++ }; +++ }; +++ }; +++ +++ dp1 { +++ device_type = "network"; +++ compatible = "qcom,nss-dp"; +++ qcom,id = <5>; +++ reg = <0x3a001000 0x200>; +++ qcom,mactype = <0>; +++ local-mac-address = [000000000000]; +++ qcom,link-poll = <1>; +++ qcom,phy-mdio-addr = <28>; +++ phy-mode = "sgmii"; +++ }; +++ +++ /* POWER LED, TP-Link */ +++ leds { +++ compatible = "gpio-leds"; +++ pinctrl-0 = <&led_pins>; +++ pinctrl-names = "default"; +++ +++ led_power: led_power { +++ label = "power:blue"; +++ gpio = <&tlmm 42 GPIO_ACTIVE_HIGH>; +++ default-state = "on"; +++ }; +++ }; +++ +++ /* BUTTON, TP-Link */ +++ gpio_keys { +++ compatible = "gpio-keys"; +++ pinctrl-0 = <&button_pins>; +++ pinctrl-names = "default"; +++ +++ button@1 { +++ label = "reset"; +++ linux,code = ; +++ gpios = <&tlmm 50 GPIO_ACTIVE_LOW>; +++ linux,input-type = <1>; +++ }; +++ }; +++ +++ nss-macsec0 { +++ compatible = "qcom,nss-macsec"; +++ phy_addr = <0x18>; +++ phy_access_mode = <0>; +++ mdiobus = <&mdio>; +++ }; +++ nss-macsec1 { +++ compatible = "qcom,nss-macsec"; +++ phy_addr = <0x1c>; +++ phy_access_mode = <0>; +++ mdiobus = <&mdio>; +++ }; +++}; +++ +++&serial_blsp4 { +++ pinctrl-0 = <&uart_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&spi_0 { /* BLSP1 QUP1 */ +++ pinctrl-0 = <&spi_0_pins>; +++ pinctrl-names = "default"; +++ cs-select = <0>; +++ status = "ok"; +++ +++ m25p80@0 { +++ #address-cells = <1>; +++ #size-cells = <1>; +++ reg = <0>; +++ compatible = "n25q128a11"; +++ linux,modalias = "m25p80", "n25q128a11"; +++ spi-max-frequency = <50000000>; +++ use-default-sizes; +++ }; +++}; +++ +++&spi_4 { /* BLSP1 QUP3 */ +++ pinctrl-0 = <&spi_3_pins>; +++ pinctrl-names = "default"; +++ cs-select = <2>; +++ quartz-reset-gpio = <&tlmm 21 1>; +++ status = "disabled"; +++ spidev3: spi@3 { +++ compatible = "qca,spidev"; +++ reg = <0>; +++ spi-max-frequency = <24000000>; +++ }; +++}; +++ +++&serial_blsp2 { +++ status = "disabled"; +++}; +++ +++&msm_imem { +++ status = "disabled"; +++}; +++ +++&ssphy_0 { +++ status = "ok"; +++}; +++ +++&qusb_phy_0 { +++ status = "ok"; +++}; +++ +++&ssphy_1 { +++ status = "ok"; +++}; +++ +++&qusb_phy_1 { +++ status = "ok"; +++}; +++ +++&usb3_0 { +++ status = "ok"; +++}; +++ +++&usb3_1 { +++ status = "ok"; +++}; +++ +++&cryptobam { +++ status = "ok"; +++}; +++ +++&crypto { +++ status = "ok"; +++}; +++ +++&i2c_0 { +++ status = "disabled"; +++}; +++ +++&i2c_1 { +++ status = "disabled"; +++}; +++ +++&qpic_bam { +++ status = "ok"; +++}; +++ +++&nand { +++ pinctrl-0 = <&qpic_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&qpic_lcd { +++ status = "disabled"; +++}; +++ +++&qpic_lcd_panel { +++ status = "disabled"; +++}; +++ +++&ledc { +++ status = "disabled"; +++}; +++ +++&pcie0 { +++ status = "ok"; +++}; +++ +++&pcie1 { +++ status = "disabled"; +++}; +++ +diff --git a/target/linux/ipq807x/patches/110-add-esmt-nand.patch b/target/linux/ipq807x/patches/110-add-esmt-nand.patch +new file mode 100644 +index 0000000000..d47a4d0d16 +--- /dev/null ++++ b/target/linux/ipq807x/patches/110-add-esmt-nand.patch +@@ -0,0 +1,37 @@ ++Index: linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/drivers/mtd/nand/nand_ids.c ++=================================================================== ++--- linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce.orig/drivers/mtd/nand/nand_ids.c +++++ linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/drivers/mtd/nand/nand_ids.c ++@@ -62,6 +62,12 @@ struct nand_flash_dev nand_flash_ids[] = ++ {"TH58NYG3S0H 8G 1.8V 8-bit", ++ { .id = {0x98, 0xa3, 0x91, 0x26} }, ++ SZ_4K, SZ_1K, SZ_256K, 0, 4, 256, NAND_ECC_INFO(8, SZ_512) }, +++ +++ {"F59D2G81KA 2G 1.8V 8-bit", +++ { .id = {0xc8, 0x5a, 0x90, 0x04} }, +++ SZ_2K, SZ_256, SZ_128K, 0, 4, 128, NAND_ECC_INFO(8, SZ_512) }, +++ +++ ++ LEGACY_ID_NAND("NAND 4MiB 5V 8-bit", 0x6B, 4, SZ_8K, SP_OPTIONS), ++ LEGACY_ID_NAND("NAND 4MiB 3,3V 8-bit", 0xE3, 4, SZ_8K, SP_OPTIONS), ++ LEGACY_ID_NAND("NAND 4MiB 3,3V 8-bit", 0xE5, 4, SZ_8K, SP_OPTIONS), ++@@ -190,6 +196,7 @@ struct nand_manufacturers nand_manuf_ids ++ {NAND_MFR_SANDISK, "SanDisk"}, ++ {NAND_MFR_INTEL, "Intel"}, ++ {NAND_MFR_ATO, "ATO"}, +++ {NAND_MFR_ESMT, "ESMT"}, ++ {NAND_MFR_GIGA, "GigaDevice"}, ++ {NAND_MFR_ATO, "ATO"}, ++ {NAND_MFR_WINBOND, "Winbond"}, ++Index: linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/include/linux/mtd/nand.h ++=================================================================== ++--- linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce.orig/include/linux/mtd/nand.h +++++ linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/include/linux/mtd/nand.h ++@@ -778,6 +778,7 @@ static inline struct mtd_info *nand_to_m ++ #define NAND_MFR_ATO 0x9b ++ #define NAND_MFR_WINBOND 0xef ++ #define NAND_MFR_FIDELIX 0xe5 +++#define NAND_MFR_ESMT 0xc8 ++ ++ /* The maximum expected count of bytes in the NAND ID sequence */ ++ #define NAND_MAX_ID_LEN 8 +diff --git a/target/linux/ipq807x/patches/111-eap106.patch b/target/linux/ipq807x/patches/111-eap106.patch +new file mode 100644 +index 0000000000..497742193e +--- /dev/null ++++ b/target/linux/ipq807x/patches/111-eap106.patch +@@ -0,0 +1,765 @@ ++Index: linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/arch/arm64/boot/dts/qcom/qcom-ipq807x-eap106.dts ++=================================================================== ++--- /dev/null +++++ linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/arch/arm64/boot/dts/qcom/qcom-ipq807x-eap106.dts ++@@ -0,0 +1,716 @@ +++/dts-v1/; +++/* +++ * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. +++ * +++ * Permission to use, copy, modify, and/or distribute this software for any +++ * purpose with or without fee is hereby granted, provided that the above +++ * copyright notice and this permission notice appear in all copies. +++ * +++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +++ */ +++#include "qcom-ipq807x-soc.dtsi" +++#include "qcom-ipq807x-hk-cpu.dtsi" +++ +++/ { +++ #address-cells = <0x2>; +++ #size-cells = <0x2>; +++ model = "Edgecore EAP106"; +++ compatible = "edgecore,eap106", "qcom,ipq807x-hk02", "qcom,ipq807x"; +++ qcom,msm-id = <0x143 0x0>; +++ interrupt-parent = <&intc>; +++ qcom,board-id = <0x8 0x0>; +++ qcom,pmic-id = <0x0 0x0 0x0 0x0>; +++ +++ aliases { +++ /* +++ * Aliases as required by u-boot +++ * to patch MAC addresses +++ */ +++ ethernet0 = "/soc/dp1"; +++ ethernet1 = "/soc/dp2"; +++ }; +++ chosen { +++ bootargs = "console=ttyMSM0,115200,n8 root=/dev/ram0 rw init=/init"; +++ #ifdef __IPQ_MEM_PROFILE_256_MB__ +++ bootargs-append = " swiotlb=1"; +++ #else +++ bootargs-append = " swiotlb=1 coherent_pool=2M"; +++ #endif +++ }; +++}; +++ +++&tlmm { +++ leds_pins: leds_pinmux { +++ +++ led1_yellow { +++ pins = "gpio25"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ led1_green { +++ pins = "gpio28"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ led2_amber { +++ pins = "gpio29"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ led2_blue { +++ pins = "gpio32"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-down; +++ }; +++ }; +++ +++ mdio_pins: mdio_pinmux { +++ mux_0 { +++ pins = "gpio68"; +++ function = "mdc"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ mux_1 { +++ pins = "gpio69"; +++ function = "mdio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ }; +++ +++ uart_pins: uart_pins { +++ mux { +++ pins = "gpio23", "gpio24"; +++ function = "blsp4_uart1"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ i2c_0_pins: i2c_0_pinmux { +++ mux { +++ pins = "gpio42", "gpio43"; +++ function = "blsp1_i2c"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ spi_0_pins: spi_0_pins { +++ mux { +++ pins = "gpio38", "gpio39", "gpio40", "gpio41"; +++ function = "blsp0_spi"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ qpic_pins: qpic_pins { +++ data_0 { +++ pins = "gpio15"; +++ function = "qpic_pad0"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_1 { +++ pins = "gpio12"; +++ function = "qpic_pad1"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_2 { +++ pins = "gpio13"; +++ function = "qpic_pad2"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_3 { +++ pins = "gpio14"; +++ function = "qpic_pad3"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_4 { +++ pins = "gpio5"; +++ function = "qpic_pad4"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_5 { +++ pins = "gpio6"; +++ function = "qpic_pad5"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_6 { +++ pins = "gpio7"; +++ function = "qpic_pad6"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_7 { +++ pins = "gpio8"; +++ function = "qpic_pad7"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ data_8 { +++ pins = "gpio16"; +++ function = "qpic_pad8"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ qpic_pad { +++ pins = "gpio0", "gpio1", "gpio2", "gpio3", "gpio4", +++ "gpio9", "gpio10", "gpio11", "gpio17"; +++ function = "qpic_pad"; +++ drive-strength = <8>; +++ bias-disable; +++ }; +++ }; +++ +++ hsuart_pins: hsuart_pins { +++ mux { +++ pins = "gpio46", "gpio47", "gpio48", "gpio49"; +++ function = "blsp2_uart"; +++ drive-strength = <8>; +++ bias-disable; +++ output-low; +++ }; +++ mux_1 { +++ pins = "gpio51"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-disable; +++ output-high; +++ }; +++ }; +++ +++ button_pins: button_pins { +++ wps_button { +++ pins = "gpio57"; +++ function = "gpio"; +++ drive-strength = <8>; +++ bias-pull-up; +++ }; +++ }; +++ +++ uniphy_pins: uniphy_pinmux { +++ mux { +++ pins = "gpio60"; +++ function = "rx2"; +++ bias-disable; +++ }; +++ }; +++ cnss_wlan_en_active: cnss_wlan_en_active { +++ mux { +++ pins = "gpio57"; +++ function = "gpio"; +++ drive-strength = <16>; +++ output-high; +++ bias-pull-up; +++ }; +++ }; +++ +++ cnss_wlan_en_sleep: cnss_wlan_en_sleep { +++ mux { +++ pins = "gpio57"; +++ function = "gpio"; +++ drive-strength = <2>; +++ output-low; +++ bias-pull-down; +++ }; +++ }; +++}; +++ +++&soc { +++ gpio_keys { +++ compatible = "gpio-keys"; +++ pinctrl-0 = <&button_pins>; +++ pinctrl-names = "default"; +++ +++ button@1 { +++ label = "wps"; +++ linux,code = ; +++ gpios = <&tlmm 57 GPIO_ACTIVE_LOW>; +++ linux,input-type = <1>; +++ debounce-interval = <60>; +++ }; +++ }; +++ +++ leds { +++ compatible = "gpio-leds"; +++ pinctrl-0 = <&leds_pins>; +++ pinctrl-names = "default"; +++ +++ led@25 { +++ label = "led1_yellow"; +++ gpios = <&tlmm 25 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "led1_yellow"; +++ default-state = "off"; +++ }; +++ +++ led@28 { +++ label = "led1_green"; +++ gpios = <&tlmm 28 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "led1_green"; +++ default-state = "off"; +++ }; +++ +++ led@29 { +++ label = "led2_amber"; +++ gpios = <&tlmm 29 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "led2_amber"; +++ default-state = "off"; +++ }; +++ +++ led@32 { +++ label = "led2_blue"; +++ gpio = <&tlmm 32 GPIO_ACTIVE_HIGH>; +++ linux,default-trigger = "led2_blue"; +++ default-state = "off"; +++ }; +++ }; +++ +++ mdio@90000 { +++ pinctrl-0 = <&mdio_pins>; +++ pinctrl-names = "default"; +++ phy-reset-gpio = <&tlmm 37 0>; +++ phy0: ethernet-phy@0 { +++ reg = <0>; +++ }; +++ phy1: ethernet-phy@1 { +++ reg = <1>; +++ }; +++ phy2: ethernet-phy@2 { +++ reg = <2>; +++ }; +++ phy3: ethernet-phy@3 { +++ reg = <3>; +++ }; +++ phy4: ethernet-phy@4 { +++ reg = <4>; +++ }; +++ phy5: ethernet-phy@5 { +++ compatible ="ethernet-phy-ieee802.3-c45"; +++ reg = <8>; +++ }; +++ }; +++ +++ ess-switch@3a000000 { +++ pinctrl-0 = <&uniphy_pins>; +++ pinctrl-names = "default"; +++ switch_cpu_bmp = <0x1>; /* cpu port bitmap */ +++ switch_lan_bmp = <0x30>; /* lan port bitmap */ +++ switch_wan_bmp = <0x40>; /* wan port bitmap */ +++ switch_mac_mode = <0x0>; /* mac mode for uniphy instance0*/ +++ switch_mac_mode1 = <0xff>; /* mac mode for uniphy instance1*/ +++ switch_mac_mode2 = <0xd>; /* mac mode for uniphy instance2*/ +++ bm_tick_mode = <0>; /* bm tick mode */ +++ tm_tick_mode = <0>; /* tm tick mode */ +++ port_scheduler_resource { +++ port@0 { +++ port_id = <0>; +++ ucast_queue = <0 143>; +++ mcast_queue = <256 271>; +++ l0sp = <0 35>; +++ l0cdrr = <0 47>; +++ l0edrr = <0 47>; +++ l1cdrr = <0 7>; +++ l1edrr = <0 7>; +++ }; +++ port@1 { +++ port_id = <1>; +++ ucast_queue = <144 159>; +++ mcast_queue = <272 275>; +++ l0sp = <36 39>; +++ l0cdrr = <48 63>; +++ l0edrr = <48 63>; +++ l1cdrr = <8 11>; +++ l1edrr = <8 11>; +++ }; +++ port@2 { +++ port_id = <2>; +++ ucast_queue = <160 175>; +++ mcast_queue = <276 279>; +++ l0sp = <40 43>; +++ l0cdrr = <64 79>; +++ l0edrr = <64 79>; +++ l1cdrr = <12 15>; +++ l1edrr = <12 15>; +++ }; +++ port@3 { +++ port_id = <3>; +++ ucast_queue = <176 191>; +++ mcast_queue = <280 283>; +++ l0sp = <44 47>; +++ l0cdrr = <80 95>; +++ l0edrr = <80 95>; +++ l1cdrr = <16 19>; +++ l1edrr = <16 19>; +++ }; +++ port@4 { +++ port_id = <4>; +++ ucast_queue = <192 207>; +++ mcast_queue = <284 287>; +++ l0sp = <48 51>; +++ l0cdrr = <96 111>; +++ l0edrr = <96 111>; +++ l1cdrr = <20 23>; +++ l1edrr = <20 23>; +++ }; +++ port@5 { +++ port_id = <5>; +++ ucast_queue = <208 223>; +++ mcast_queue = <288 291>; +++ l0sp = <52 55>; +++ l0cdrr = <112 127>; +++ l0edrr = <112 127>; +++ l1cdrr = <24 27>; +++ l1edrr = <24 27>; +++ }; +++ port@6 { +++ port_id = <6>; +++ ucast_queue = <224 239>; +++ mcast_queue = <292 295>; +++ l0sp = <56 59>; +++ l0cdrr = <128 143>; +++ l0edrr = <128 143>; +++ l1cdrr = <28 31>; +++ l1edrr = <28 31>; +++ }; +++ port@7 { +++ port_id = <7>; +++ ucast_queue = <240 255>; +++ mcast_queue = <296 299>; +++ l0sp = <60 63>; +++ l0cdrr = <144 159>; +++ l0edrr = <144 159>; +++ l1cdrr = <32 35>; +++ l1edrr = <32 35>; +++ }; +++ }; +++ port_scheduler_config { +++ port@0 { +++ port_id = <0>; +++ l1scheduler { +++ group@0 { +++ sp = <0 1>; /*L0 SPs*/ +++ /*cpri cdrr epri edrr*/ +++ cfg = <0 0 0 0>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ /*unicast queues*/ +++ ucast_queue = <0 4 8>; +++ /*multicast queues*/ +++ mcast_queue = <256 260>; +++ /*sp cpri cdrr epri edrr*/ +++ cfg = <0 0 0 0 0>; +++ }; +++ group@1 { +++ ucast_queue = <1 5 9>; +++ mcast_queue = <257 261>; +++ cfg = <0 1 1 1 1>; +++ }; +++ group@2 { +++ ucast_queue = <2 6 10>; +++ mcast_queue = <258 262>; +++ cfg = <0 2 2 2 2>; +++ }; +++ group@3 { +++ ucast_queue = <3 7 11>; +++ mcast_queue = <259 263>; +++ cfg = <0 3 3 3 3>; +++ }; +++ }; +++ }; +++ port@1 { +++ port_id = <1>; +++ l1scheduler { +++ group@0 { +++ sp = <36>; +++ cfg = <0 8 0 8>; +++ }; +++ group@1 { +++ sp = <37>; +++ cfg = <1 9 1 9>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <144>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <272>; +++ mcast_loop_pri = <4>; +++ cfg = <36 0 48 0 48>; +++ }; +++ }; +++ }; +++ port@2 { +++ port_id = <2>; +++ l1scheduler { +++ group@0 { +++ sp = <40>; +++ cfg = <0 12 0 12>; +++ }; +++ group@1 { +++ sp = <41>; +++ cfg = <1 13 1 13>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <160>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <276>; +++ mcast_loop_pri = <4>; +++ cfg = <40 0 64 0 64>; +++ }; +++ }; +++ }; +++ port@3 { +++ port_id = <3>; +++ l1scheduler { +++ group@0 { +++ sp = <44>; +++ cfg = <0 16 0 16>; +++ }; +++ group@1 { +++ sp = <45>; +++ cfg = <1 17 1 17>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <176>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <280>; +++ mcast_loop_pri = <4>; +++ cfg = <44 0 80 0 80>; +++ }; +++ }; +++ }; +++ port@4 { +++ port_id = <4>; +++ l1scheduler { +++ group@0 { +++ sp = <48>; +++ cfg = <0 20 0 20>; +++ }; +++ group@1 { +++ sp = <49>; +++ cfg = <1 21 1 21>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <192>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <284>; +++ mcast_loop_pri = <4>; +++ cfg = <48 0 96 0 96>; +++ }; +++ }; +++ }; +++ port@5 { +++ port_id = <5>; +++ l1scheduler { +++ group@0 { +++ sp = <52>; +++ cfg = <0 24 0 24>; +++ }; +++ group@1 { +++ sp = <53>; +++ cfg = <1 25 1 25>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <208>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <288>; +++ mcast_loop_pri = <4>; +++ cfg = <52 0 112 0 112>; +++ }; +++ }; +++ }; +++ port@6 { +++ port_id = <6>; +++ l1scheduler { +++ group@0 { +++ sp = <56>; +++ cfg = <0 28 0 28>; +++ }; +++ group@1 { +++ sp = <57>; +++ cfg = <1 29 1 29>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <224>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <292>; +++ mcast_loop_pri = <4>; +++ cfg = <56 0 128 0 128>; +++ }; +++ }; +++ }; +++ port@7 { +++ port_id = <7>; +++ l1scheduler { +++ group@0 { +++ sp = <60>; +++ cfg = <0 32 0 32>; +++ }; +++ group@1 { +++ sp = <61>; +++ cfg = <1 33 1 33>; +++ }; +++ }; +++ l0scheduler { +++ group@0 { +++ ucast_queue = <240>; +++ ucast_loop_pri = <16>; +++ mcast_queue = <296>; +++ cfg = <60 0 144 0 144>; +++ }; +++ }; +++ }; +++ }; +++ }; +++ +++ dp1 { +++ device_type = "network"; +++ compatible = "qcom,nss-dp"; +++ qcom,id = <4>; +++ reg = <0x3a001600 0x200>; +++ qcom,mactype = <0>; +++ local-mac-address = [000000000000]; +++ qcom,link-poll = <1>; +++ qcom,phy-mdio-addr = <3>; +++ phy-mode = "sgmii"; +++ }; +++ +++ dp2 { +++ device_type = "network"; +++ compatible = "qcom,nss-dp"; +++ qcom,id = <6>; +++ reg = <0x3a007000 0x3fff>; +++ qcom,mactype = <1>; +++ local-mac-address = [000000000000]; +++ qcom,link-poll = <1>; +++ qcom,phy-mdio-addr = <8>; +++ phy-mode = "sgmii"; +++ }; +++ wifi3: wifi3@f00000 { +++ compatible = "qcom,cnss-qcn9000"; +++ wlan-en-gpio = <&tlmm 57 0>; +++ pinctrl-names = "wlan_en_active", "wlan_en_sleep"; +++ pinctrl-0 = <&cnss_wlan_en_active>; +++ pinctrl-1 = <&cnss_wlan_en_sleep>; +++ status = "disabled"; +++ }; +++}; +++ +++&serial_blsp4 { +++ pinctrl-0 = <&uart_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&spi_0 { /* BLSP1 QUP1 */ +++ pinctrl-0 = <&spi_0_pins>; +++ pinctrl-names = "default"; +++ cs-select = <0>; +++ status = "ok"; +++ +++ m25p80@0 { +++ #address-cells = <1>; +++ #size-cells = <1>; +++ reg = <0>; +++ compatible = "n25q128a11"; +++ linux,modalias = "m25p80", "n25q128a11"; +++ spi-max-frequency = <50000000>; +++ use-default-sizes; +++ }; +++}; +++ +++&serial_blsp2 { +++ pinctrl-0 = <&hsuart_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&msm_imem { +++ status = "disabled"; +++}; +++ +++&ssphy_0 { +++ status = "ok"; +++}; +++ +++&qusb_phy_0 { +++ status = "ok"; +++}; +++ +++&ssphy_1 { +++ status = "ok"; +++}; +++ +++&qusb_phy_1 { +++ status = "ok"; +++}; +++ +++&usb3_0 { +++ status = "ok"; +++}; +++ +++&usb3_1 { +++ status = "ok"; +++}; +++ +++&cryptobam { +++ status = "ok"; +++}; +++ +++&crypto { +++ status = "ok"; +++}; +++ +++&i2c_0 { +++ pinctrl-0 = <&i2c_0_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&i2c_1 { +++ status = "disabled"; +++}; +++ +++&qpic_bam { +++ status = "ok"; +++}; +++ +++&nand { +++ pinctrl-0 = <&qpic_pins>; +++ pinctrl-names = "default"; +++ status = "ok"; +++}; +++ +++&pcie0 { +++ status = "disabled"; +++}; ++Index: linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/drivers/net/phy/aquantia.c ++=================================================================== ++--- linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce.orig/drivers/net/phy/aquantia.c +++++ linux-4.4.60-qsdk-10fd7d14853b7020b804acae690c8acec5d954ce/drivers/net/phy/aquantia.c ++@@ -29,6 +29,7 @@ ++ #define PHY_ID_AQR109 0x03a1b502 ++ #define PHY_ID_AQR111 0x03a1b610 ++ #define PHY_ID_AQR111B0 0x03a1b612 +++#define PHY_ID_AQR111C 0x03a1b7e2 ++ #define PHY_ID_AQR112 0x03a1b660 ++ #define PHY_ID_AQR113C 0x31c31C10 ++ #define PHY_ID_AQR112C 0x03a1b792 ++@@ -701,6 +702,23 @@ static struct phy_driver aquantia_driver ++ .driver = { .owner = THIS_MODULE,}, ++ }, ++ { +++ .phy_id = PHY_ID_AQR111C, +++ .phy_id_mask = 0xfffffff0, +++ .name = "Aquantia AQR111C", +++ .features = PHY_AQUANTIA_FEATURES, +++ .flags = PHY_HAS_INTERRUPT, +++ .probe = aquantia_phy_probe, +++ .soft_reset = aquantia_soft_reset, +++ .config_init = aquantia_config_init, +++ .aneg_done = aquantia_aneg_done, +++ .config_aneg = aquantia_config_aneg, +++ .config_intr = aquantia_config_intr, +++ .ack_interrupt = aquantia_ack_interrupt, +++ .read_status = aquantia_read_status, +++ .update_link = aquantia_update_link, +++ .driver = { .owner = THIS_MODULE,}, +++}, +++{ ++ .phy_id = PHY_ID_AQR112, ++ .phy_id_mask = 0xfffffff0, ++ .name = "Aquantia AQR112", ++@@ -790,6 +808,7 @@ static struct mdio_device_id __maybe_unu ++ { PHY_ID_AQR109, 0xfffffff0 }, ++ { PHY_ID_AQR111, 0xfffffff0 }, ++ { PHY_ID_AQR111B0, 0xfffffff0 }, +++ { PHY_ID_AQR111C, 0xfffffff0 }, ++ { PHY_ID_AQR112, 0xfffffff0 }, ++ { PHY_ID_AQR113C, 0xfffffff0 }, ++ { PHY_ID_AQR112C, 0xfffffff0 }, +diff --git a/target/linux/ipq807x/patches/112-pstore.patch b/target/linux/ipq807x/patches/112-pstore.patch +new file mode 100644 +index 0000000000..dc3960306d +--- /dev/null ++++ b/target/linux/ipq807x/patches/112-pstore.patch +@@ -0,0 +1,147 @@ ++Index: linux-4.4.60-qsdk-11f09717303ecd83c3a64e9efe23f25921dc1016/arch/arm64/boot/dts/qcom/qcom-ipq6018-memory.dtsi ++=================================================================== ++--- linux-4.4.60-qsdk-11f09717303ecd83c3a64e9efe23f25921dc1016.orig/arch/arm64/boot/dts/qcom/qcom-ipq6018-memory.dtsi +++++ linux-4.4.60-qsdk-11f09717303ecd83c3a64e9efe23f25921dc1016/arch/arm64/boot/dts/qcom/qcom-ipq6018-memory.dtsi ++@@ -92,6 +92,12 @@ ++ reg = <0x0 0x40000000 0x0 0x00800000>; ++ }; ++ +++ ramoops@4A0f0000 { +++ compatible = "ramoops"; +++ reg = <0 0x4A0f0000 0 0x10000>; +++ record-size = <0x1000>; +++ }; +++ ++ uboot@4A100000 { ++ no-map; ++ reg = <0x0 0x4A100000 0x0 0x00400000>; ++@@ -211,6 +217,12 @@ ++ reg = <0x0 0x40000000 0x0 0x01000000>; ++ }; ++ +++ ramoops@4A0f0000 { +++ compatible = "ramoops"; +++ reg = <0 0x4A0f0000 0 0x10000>; +++ record-size = <0x1000>; +++ }; +++ ++ uboot@4A100000 { ++ no-map; ++ reg = <0x0 0x4A100000 0x0 0x00400000>; ++@@ -330,6 +342,12 @@ ++ reg = <0x0 0x40000000 0x0 0x01000000>; ++ }; ++ +++ ramoops@4A0f0000 { +++ compatible = "ramoops"; +++ reg = <0 0x4A0f0000 0 0x10000>; +++ record-size = <0x1000>; +++ }; +++ ++ uboot@4A100000 { ++ no-map; ++ reg = <0x0 0x4A100000 0x0 0x00400000>; ++Index: linux-4.4.60-qsdk-11f09717303ecd83c3a64e9efe23f25921dc1016/fs/pstore/ram.c ++=================================================================== ++--- linux-4.4.60-qsdk-11f09717303ecd83c3a64e9efe23f25921dc1016.orig/fs/pstore/ram.c +++++ linux-4.4.60-qsdk-11f09717303ecd83c3a64e9efe23f25921dc1016/fs/pstore/ram.c ++@@ -466,15 +466,46 @@ static int ramoops_init_prz(struct devic ++ return 0; ++ } ++ +++static int ramoops_parse_dt(struct platform_device *pdev, +++ struct ramoops_platform_data *pdata) +++{ +++ struct resource *res; +++ +++ dev_dbg(&pdev->dev, "using Device Tree\n"); +++ +++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +++ if (!res) { +++ dev_err(&pdev->dev, +++ "failed to locate DT /reserved-memory resource\n"); +++ return -EINVAL; +++ } +++ +++ pdata->mem_size = resource_size(res); +++ pdata->mem_address = res->start; +++ pdata->dump_oops = true; +++ pdata->record_size = 0x1000; +++ return 0; +++} +++ ++ static int ramoops_probe(struct platform_device *pdev) ++ { ++ struct device *dev = &pdev->dev; ++ struct ramoops_platform_data *pdata = pdev->dev.platform_data; +++ struct ramoops_platform_data pdata_local; ++ struct ramoops_context *cxt = &oops_cxt; ++ size_t dump_mem_sz; ++ phys_addr_t paddr; ++ int err = -EINVAL; ++ +++ if (dev_of_node(dev) && !pdata) { +++ pdata = &pdata_local; +++ memset(pdata, 0, sizeof(*pdata)); +++ +++ err = ramoops_parse_dt(pdev, pdata); +++ if (err < 0) +++ goto fail_out; +++ } +++ ++ /* Only a single ramoops area allowed at a time, so fail extra ++ * probes. ++ */ ++@@ -603,11 +634,17 @@ static int ramoops_remove(struct platfor ++ return 0; ++ } ++ +++static const struct of_device_id dt_match[] = { +++ { .compatible = "ramoops" }, +++ {} +++}; +++ ++ static struct platform_driver ramoops_driver = { ++ .probe = ramoops_probe, ++ .remove = ramoops_remove, ++ .driver = { ++ .name = "ramoops", +++ .of_match_table = dt_match, ++ }, ++ }; ++ ++Index: linux-4.4.60-qsdk-11f09717303ecd83c3a64e9efe23f25921dc1016/drivers/of/platform.c ++=================================================================== ++--- linux-4.4.60-qsdk-11f09717303ecd83c3a64e9efe23f25921dc1016.orig/drivers/of/platform.c +++++ linux-4.4.60-qsdk-11f09717303ecd83c3a64e9efe23f25921dc1016/drivers/of/platform.c ++@@ -53,6 +53,30 @@ struct platform_device *of_find_device_b ++ } ++ EXPORT_SYMBOL(of_find_device_by_node); ++ +++static const struct of_device_id reserved_mem_matches[] = { +++ { .compatible = "ramoops" }, +++ {} +++}; +++ +++static int __init of_platform_default_populate_init(void) +++{ +++ struct device_node *node; +++ +++ if (!of_have_populated_dt()) +++ return -ENODEV; +++ +++ /* +++ * Handle certain compatibles explicitly, since we don't want to create +++ * platform_devices for every node in /reserved-memory with a +++ * "compatible", +++ */ +++ for_each_matching_node(node, reserved_mem_matches) +++ of_platform_device_create(node, NULL, NULL); +++ +++ return 0; +++} +++arch_initcall_sync(of_platform_default_populate_init); +++ ++ #ifdef CONFIG_OF_ADDRESS ++ /* ++ * The following routines scan a subtree and registers a device for -- 2.25.1