kiddin9 2 rokov pred
rodič
commit
bf8bc0580f

+ 8 - 6
.github/workflows/Openwrt-AutoBuild.yml

@@ -117,7 +117,7 @@ jobs:
       run: |
         sudo -E apt-get -qq update
         sudo -E apt-get -qq install build-essential clang flex g++ gawk gcc-multilib gettext \
-        git libncurses5-dev libssl-dev python3-distutils python3-pyelftools libpython3-dev rsync unzip zlib1g-dev swig aria2 jq subversion qemu-utils ccache rename libelf-dev device-tree-compiler libgnutls28-dev coccinelle
+        git libncurses5-dev libssl-dev python3-distutils python3-pyelftools python3-setuptools libpython3-dev rsync unzip zlib1g-dev swig aria2 jq subversion qemu-utils ccache rename libelf-dev device-tree-compiler libgnutls28-dev coccinelle
         sudo -E apt-get -qq purge azure-cli ghc* zulu* llvm* firefox powershell openjdk* dotnet* google* mysql* php* android*
         sudo rm -rf /etc/apt/sources.list.d/* /usr/share/dotnet /usr/local/lib/android /opt/ghc
         sudo -E apt-get -qq autoremove --purge
@@ -151,7 +151,7 @@ jobs:
         elif [[ ! "${{ env.REPO_BRANCH }}" && "$REPO_URL" == "https://github.com/openwrt/openwrt" ]]; then
           REPO_BRANCH="$((curl -gs -H 'Content-Type: application/json' \
            -H "Authorization: Bearer ${{ secrets.REPO_TOKEN }}" \
-           -X POST -d '{ "query": "query {repository(owner: \"openwrt\", name: \"openwrt\") {refs(refPrefix: \"refs/tags/\", last: 4, orderBy: {field: TAG_COMMIT_DATE, direction: ASC}) {edges {node {name}}}}}"}' https://api.github.com/graphql) | jq -r '.data.repository.refs.edges[].node.name' | grep v22 | tail -n 1)"
+           -X POST -d '{ "query": "query {repository(owner: \"openwrt\", name: \"openwrt\") {refs(refPrefix: \"refs/tags/\", last: 4, orderBy: {field: TAG_COMMIT_DATE, direction: ASC}) {edges {node {name}}}}}"}' https://api.github.com/graphql) | jq -r '.data.repository.refs.edges[].node.name' | grep v23 | tail -n 1)"
            git clone $REPO_URL -b $REPO_BRANCH openwrt
         elif [[ ! "${{ env.REPO_BRANCH }}" ]]; then
             git clone $REPO_URL openwrt
@@ -198,10 +198,12 @@ jobs:
         cd openwrt
         find "devices/common/patches" -type f ! -name 'china_mirrors.patch' -name '*.patch' ! -name '*.revert.patch' -print0 | sort -z | xargs -I % -t -0 -n 1 sh -c "cat '%'  | patch -d './' -B --merge -p1 -E --forward"
         #git apply devices/common/patches/*.patch
-        if [ -n "$(ls -A "devices/${{matrix.target}}/patches" 2>/dev/null)" ]; then
-          find "devices/${{matrix.target}}/patches" -maxdepth 1 -type f -name '*.patch' ! -name '*.revert.patch' -print0 | sort -z | xargs -I % -t -0 -n 1 sh -c "cat '%'  | patch -d './' -B --merge -p1 -E --forward"
+        if [ -n "$(ls -A devices/${{matrix.target}}/patches 2>/dev/null)" ]; then
+          if [ -n "$(ls -A devices/${{matrix.target}}/*.bin.patch 2>/dev/null)" ]; then
+            git apply devices/${{matrix.target}}/patches/*.bin.patch
+          fi
+          find "devices/${{matrix.target}}/patches" -maxdepth 1 -type f -name '*.patch' ! -name '*.revert.patch' ! -name '*.bin.patch' -print0 | sort -z | xargs -I % -t -0 -n 1 sh -c "cat '%'  | patch -d './' -B --merge -p1 -E --forward"
           find "devices/${{matrix.target}}/patches" -maxdepth 1 -type f -name '*.revert.patch' -print0 | sort -z | xargs -I % -t -0 -n 1 sh -c "cat '%'  | patch -d './' -R -B --merge -p1 -E --forward"
-          #git apply devices/${{matrix.target}}/patches/*.patch
         fi
         sed -i '$a  \
         CONFIG_CPU_FREQ_GOV_POWERSAVE=y \
@@ -305,7 +307,7 @@ jobs:
         TARGET: "/www/wwwroot/op.supes.top/releases/tmp/"
 
     - name: Upload firmware for artifact
-      uses: actions/upload-artifact@main
+      uses: kiddin9/upload-artifact@main
       continue-on-error: true
       if: env.UPLOAD_FIRMWARE_FOR_ARTIFACT == 'true'
       with:

+ 2 - 0
devices/bcm53xx/.config

@@ -6,6 +6,8 @@ CONFIG_TARGET_DEVICE_bcm53xx_generic_DEVICE_phicomm_k3=y
 CONFIG_TARGET_DEVICE_bcm53xx_generic_DEVICE_asus_rt-ac88u=y
 CONFIG_TARGET_DEVICE_bcm53xx_generic_DEVICE_dlink_dir-885l=y
 
+CONFIG_PACKAGE_perf=n
+
 CONFIG_KERNEL_DEVMEM=y
 CONFIG_BUSYBOX_CONFIG_ARPING=y
 

+ 1 - 2
devices/bcm53xx/diy.sh

@@ -4,9 +4,8 @@ shopt -s extglob
 
 SHELL_FOLDER=$(dirname $(readlink -f "$0"))
 
-
 sed -i "s/^TARGET_DEVICES /# TARGET_DEVICES /" target/linux/bcm53xx/image/Makefile
 sed -i "s/# TARGET_DEVICES += phicomm_k3/TARGET_DEVICES += phicomm_k3/" target/linux/bcm53xx/image/Makefile
 sed -i "s/# TARGET_DEVICES += asus_rt-ac88u/TARGET_DEVICES += asus_rt-ac88u/" target/linux/bcm53xx/image/Makefile
 sed -i "s/# TARGET_DEVICES += dlink_dir-885l/TARGET_DEVICES += dlink_dir-885l/" target/linux/bcm53xx/image/Makefile
-sed -i "s/DEVICE_PACKAGES := \$(BRCMFMAC_4366C0) \$(USB3_PACKAGES)/DEVICE_PACKAGES := \$(IEEE8021X) kmod-brcmfmac k3wifi \$(USB3_PACKAGES) k3screenctrl wireless-tools/" target/linux/bcm53xx/image/Makefile
+sed -i "s/DEVICE_PACKAGES := \$(BRCMFMAC_4366C0) \$(USB3_PACKAGES)/DEVICE_PACKAGES := \$(BRCMFMAC_4366C0) \$(USB3_PACKAGES) k3screenctrl/" target/linux/bcm53xx/image/Makefile

+ 15 - 1
devices/common/diy.sh

@@ -43,11 +43,25 @@ sed -i "s/192.168.1/10.0.0/" package/base-files/files/bin/config_generate
 svn co https://github.com/coolsnowwolf/lede/trunk/target/linux/generic/hack-5.15 target/linux/generic/hack-5.15
 svn co https://github.com/coolsnowwolf/lede/trunk/target/linux/generic/backport-5.15 target/linux/generic/backport-5.15
 find target/linux/generic/backport-5.15 -name "[0-9][0-9][0-9]-[a-z][a-z]*" -exec rm -f {} \;
-rm -rf target/linux/generic/backport-5.15/{799-v6.0-net-mii*,802-v6.1-nvmem*,803-v5.19-nvmem*,733-v6.2-02-net-mediatek-sgmii-ensure*,733-v6.2-03-net-mediatek*,733-v6.2-04-mtk_sgmii-enable*,730-11-v6.3-net-ethernet-mtk_eth*,775-v5.16-net-phylink*,776-v5.16-net-ethernet-*,612-v6.3-skbuff-Fix*}
+rm -rf target/linux/generic/backport-5.15/{799-v6.0-net-mii*,802-v6.1-nvmem*,803-v5.19-nvmem*,733-v6.2-02-net-mediatek-sgmii-ensure*,733-v6.2-03-net-mediatek*,733-v6.2-04-mtk_sgmii-enable*,775-v5.16-net-phylink*,776-v5.16-net-ethernet-*}
 curl -sfL https://raw.githubusercontent.com/coolsnowwolf/lede/master/target/linux/generic/pending-5.15/613-netfilter_optional_tcp_window_check.patch -o target/linux/generic/pending-5.15/613-netfilter_optional_tcp_window_check.patch
 sed -i "s/CONFIG_WERROR=y/CONFIG_WERROR=n/" target/linux/generic/config-5.15
 ) &
 
+grep -q "2023-" package/kernel/mt76/Makefile && {
+mkdir package/kernel/mt76/patches
+curl -sfL https://raw.githubusercontent.com/immortalwrt/immortalwrt/master/package/kernel/mt76/patches/0001-mt76-allow-VHT-rate-on-2.4GHz.patch -o package/kernel/mt76/patches/0001-mt76-allow-VHT-rate-on-2.4GHz.patch
+}
+
+grep -q "1.8.8" package/network/utils/iptables/Makefile && {
+rm -rf package/network/utils/iptables
+svn co https://github.com/openwrt/openwrt/branches/openwrt-22.03/package/network/utils/iptables package/network/utils/iptables
+}
+
+grep -q 'PKG_RELEASE:=9' package/libs/openssl/Makefile && {
+sh -c "curl -sfL https://github.com/openwrt/openwrt/commit/a48d0bdb77eb93f7fba6e055dace125c72755b6a.patch | patch -d './' -p1 --forward"
+}
+
 sed -i "/BuildPackage,miniupnpd-iptables/d" feeds/packages/net/miniupnpd/Makefile
 sed -i 's/Os/O2/g' include/target.mk
 sed -i "/mediaurlbase/d" package/feeds/*/luci-theme*/root/etc/uci-defaults/*

+ 1 - 1
devices/common/settings.ini

@@ -1,5 +1,5 @@
 REPO_URL="https://github.com/openwrt/openwrt"
-REPO_BRANCH="openwrt-23.05"
+REPO_BRANCH=""
 CONFIG_FILE=".config"
 DIY_SH="diy.sh"
 FREE_UP_DISK="false"

+ 2 - 0
devices/ipq807x_generic/.config

@@ -8,6 +8,8 @@ CONFIG_TARGET_DEVICE_ipq807x_generic_DEVICE_xiaomi_ax9000=y
 CONFIG_TARGET_DEVICE_ipq807x_generic_DEVICE_qnap_301w=y
 CONFIG_TARGET_DEVICE_ipq807x_generic_DEVICE_zte_mf269=y
 CONFIG_TARGET_DEVICE_ipq807x_generic_DEVICE_zyxel_nbg7815=y
+CONFIG_TARGET_DEVICE_ipq807x_generic_DEVICE_tplink_tl-er2260t=y
+CONFIG_TARGET_DEVICE_ipq807x_generic_DEVICE_tplink_xtr10890=y
 CONFIG_PACKAGE_kmod-rtl8812au-ct=n
 CONFIG_PACKAGE_luci-ssl=y # uhttpd服务
 

+ 600 - 0
devices/ipq807x_generic/patches/01-zte_mf269.bin.patch

@@ -0,0 +1,600 @@
+From c8b8a6adca5bfb49a9312eb3ba17a68f53ffd63e Mon Sep 17 00:00:00 2001
+From: Hugo Yuan <[email protected]>
+Date: Thu, 8 Sep 2022 20:27:05 +0800
+Subject: [PATCH] ipq807x: add support for ZTE MF269
+
+Co-authored-by: AmadeusGhost <[email protected]>
+Signed-off-by: Tianling Shen <[email protected]>
+---
+ package/boot/uboot-envtools/files/ipq807x     |   3 +-
+ package/firmware/ipq-wifi/Makefile            |   2 +
+ .../firmware/ipq-wifi/board-zte_mf269.ipq8074 | Bin 0 -> 131172 bytes
+ .../ipq807x/base-files/etc/board.d/02_network |  24 +-
+ .../etc/hotplug.d/firmware/11-ath11k-caldata  |   3 +-
+ .../etc/hotplug.d/ieee80211/11_fix_wifi_mac   |  18 ++
+ .../base-files/lib/upgrade/platform.sh        |   4 +
+ .../arm64/boot/dts/qcom/ipq8071-mf269.dts     | 212 ++++++++++++++++++
+ target/linux/ipq807x/image/generic.mk         |  13 ++
+ 9 files changed, 276 insertions(+), 3 deletions(-)
+ create mode 100644 package/firmware/ipq-wifi/board-zte_mf269.ipq8074
+ create mode 100644 target/linux/ipq807x/base-files/etc/hotplug.d/ieee80211/11_fix_wifi_mac
+ create mode 100644 target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/ipq8071-mf269.dts
+
+diff --git a/package/boot/uboot-envtools/files/ipq807x b/package/boot/uboot-envtools/files/ipq807x
+index 5c5b77089ac..4444021defe 100644
+--- a/package/boot/uboot-envtools/files/ipq807x
++++ b/package/boot/uboot-envtools/files/ipq807x
+@@ -27,7 +27,8 @@ edimax,cax1800)
+ 	;;
+ redmi,ax6|\
+ xiaomi,ax3600|\
+-xiaomi,ax9000)
++xiaomi,ax9000|\
++zte,mf269)
+ 	idx="$(find_mtd_index 0:appsblenv)"
+ 	[ -n "$idx" ] && \
+ 		ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x10000" "0x20000"
+diff --git a/package/firmware/ipq-wifi/Makefile b/package/firmware/ipq-wifi/Makefile
+index 32988910c0a..763eeb3a137 100644
+--- a/package/firmware/ipq-wifi/Makefile
++++ b/package/firmware/ipq-wifi/Makefile
+@@ -38,6 +38,7 @@ ALLWIFIBOARDS:= \
+ 	wallys_dr40x9 \
+ 	xiaomi_ax3600 \
+ 	xiaomi_ax9000 \
++	zte_mf269 \
+ 	zyxel_nbg7815
+ 
+ ALLWIFIPACKAGES:=$(foreach BOARD,$(ALLWIFIBOARDS),ipq-wifi-$(BOARD))
+@@ -122,6 +123,7 @@ $(eval $(call generate-ipq-wifi-package,redmi_ax6,Redmi AX6))
+ $(eval $(call generate-ipq-wifi-package,wallys_dr40x9,Wallys DR40X9))
+ $(eval $(call generate-ipq-wifi-package,xiaomi_ax3600,Xiaomi AX3600))
+ $(eval $(call generate-ipq-wifi-package,xiaomi_ax9000,Xiaomi AX9000))
++$(eval $(call generate-ipq-wifi-package,zte_mf269,ZTE MF269))
+ $(eval $(call generate-ipq-wifi-package,zyxel_nbg7815,Zyxel NBG7815))
+ 
+ $(foreach PACKAGE,$(ALLWIFIPACKAGES),$(eval $(call BuildPackage,$(PACKAGE))))
+diff --git a/package/firmware/ipq-wifi/board-zte_mf269.ipq8074 b/package/firmware/ipq-wifi/board-zte_mf269.ipq8074
+new file mode 100644
+index 0000000000000000000000000000000000000000..473fceabc4e532a3099c0210562a31188e0c1988
+GIT binary patch
+literal 131172
+zcmeHw3vg7&neIPlhC#wY2qDb_1R6=BhY3zF79b=6l0YCp5<(gYNeGaHY`_LAFktbp
+zd1C}J<{{ho5u13u*{sXE>o`v0+KLnBUD+gCx3>1?)~2#~t+UDQ-MU3>Qn#|Vvex~+
+zbLNcBfMAZEMyPxKp6S24|L(uP{`+xy&Y9V;qV$2%P{o4}u6v+teQE7V*}Z$Wz*UIG
+z4=I3eKk&rTwjJ&B_U_*Kz_uMbJ0IBDv2?!9wLjjruY>G@g$w5$Y}>c9ZO{It&7txK
+zs#Yynw8Wv8pov3VE<JdB>LQ;@oX3*$8}#>$`g^1P-lV@b>+hTN+<3e4AVc|lGYVq}
+z?h-gHD#nN(;JtN#xCs`O?3k{<7CM&cuOdgG{#x!>tiP6pKbJU)_19uYzW!S1SfIa>
+z9BJWKF+OKTa8D4HOfXq8KUp$ASu#IaGCx@|KUp$ASu#Hj=Maa(Z89R0qx-r)L50RQ
+z0-F3u@AdlGx3*)NOuIGmHZjJ`6i)oyZ8D8O^jlFCi8%2ZjEfQ<MLow0o=!=Kf@CmQ
+zj(T3VTaN#o{KJR;^Y}lN{ImS(!;c1E<F&9GyyWdA9KJZ`-Ry6#dF&LIq#65y*jZ!e
+za5(;mWu)K7mbiCwxPZf*{Jqrj%9>DPOKZoDo=d&gUcLV27v6s7z4t%(=68Sa<C_}k
+ziklKoH)YC{IDWeL?uNf9-w@d5A;>6^*a%FL5Bt{(ZV(La&Y{@FsvHV|F+;#DKkB#P
+zF{@Qoq!1V#1SX3weC6(tV>iA%ZF!c(P5YhZa5$`f9krMS$6PqXNtxtWYE^9DLQsNc
+z@k1+QkeXPv8e%w3e)KX$I}dkXd*kiCuoIc{7a}vSh<Nsk%-9S(06_xKh{NTi>(_lT
+zYn$`ukiR72?Gj086G>VL`Ao>8CtSabEg$$Nk+iRi_}>&sJ%##lzINY2$OmwW_P=e&
+z|6F9&2O>V`kwSU2Vag&A_jJhrXKeXHaC5$Z`g?%E0bsBNWh_S<g3tk10Iq+DUB;Zx
+z1B1)J;1J|nAYUBD5VNc6SFz;-KMiAmzDPX{d6Y3I41N~I0D7cQ-ozkz5E!r@*@h!G
+z*@4|QK=)a&1K(k^VH@mV88Da)4F9`N-2Y(%1Je#n44Qxe`q8c(qyt0U4&H?RCkzbY
+z7vR7y4H*1BcKx)2z+1rJSzz!aaNLSEl%Wmj(4ntSTtAOpMgVosg1is%sjVW@OGTz)
+zEKI>Z-u-Vj<V`z3Ik(t>4GeV*K7{_C0|qC70c?5D7+@^S!hGPxSV)0<Qc1WUKL!Rr
+zv(X0F;H>9>0p^3$HppWvOw9rYQ|w`o0b7pD2ejoDiyaIXgFnR9U$+Cc!D`D((T41B
+z8-5qNjLg488z>J9Q!y5&V=PQfhrAmY{A+A^9fPlh=R^~OBG|GQwmcLJpu=G8Kqk1O
+z9ZYZtL}4Hb0}KLX2MPnug~|>T2BsYxIkoNR(p`c2)K!cz+=Ua(dkfmKYyB(D7?EdR
+zYra@`ET_|py`<?b{#onuOV4KQP2Fn7h#Wt&;Xujmj0Vr@{<s%TwC-Elo>!NOJ*4R_
+zz82~!LU}%m?3wE=y@jW;_F2n2eKPdK!flx$Pq`^6a_VsXV~aKgD}C6HneLfa8+sNW
+z4es$;%Ip5z*52aNnVr`1&OP1m_~Na>8Xv9+On3Ilh8>F=gKK=)o0(28@2TuPR{dUh
+zv-SDn)7ejWTFqP{-A5aD7i<Zx_m%X=J>Ru;XK_>R+LVX-<IX|9;^UdSQgJ<Gx)<MU
+z?OjU!ESO$C-11oArtHd;g=Q|1YX{mMSz4dBI`uRCaaUh&d9L_a=3^<A@}QqyUJCY!
+z$|(fy1_V00-x%mZNxNCM6DLl{sZ%)kQEoybP+8m9zN6>Lt8cvh?)x8n`^V-1XXG>Z
+zZIR6PaNdct4gaG!>#Gw<#`#cUGR`+_AeZwUk>FQE0x#lhU>C0KA<ua_DHUb7Vi%C}
+zJ&~+;MAC6CFl!Iw8z7IlItkbGiIZ%|v;Hrm{^ubN{e88N#~p}CGa!G<sJOMfJe=!f
+z;fynI5EyjeoNEOzz`0B^WD{+iapvG$E)(a2>9{IRYeoH7LsMp>epHoU<7_OO^1xn~
+z$6D)K3i&k1<7_SAp9dQ1(QU}3JoHaLfckMJ#63o8CglGFc^l_a+`G~Rzb}%3ewgzD
+z%6J?YYy<|2fdTp<!A3u1e+V4kg&x3S<_?^b)u0`Vpobr2#6{~o5Eq1eChAXr3H3wX
+zLwR746o7o<KoZe$+22C_UxGZaoVhbxKlHa-f8L+NjxGTMob%4X`P@vLQF=0f0jf!~
+zaaNs!v$0Ib56cd&LLTSDL$RYg*g+P~7X#3Lb~`XEgB?(RoUta__`blf0@wk@W9C<Z
+z0mhRbcNKdu9+T0Ji5}R2&G8(BeBfGmJcrPaxEVMJ@^;3vZU<ky$qq2425kqxQn!N*
+zsGoK)6ZHd&SnhuGWAGyE0ONU1E6OMV27$00*!bQi2X>T+en`hTZ`u&Xb2jbhc6RWK
+z*z-Xi<g=i^ZU?aAh#laZc~Ex1`2hW(&j*;7BlCd|cHoYMq6p{ph#kO=e1o-vZvqF5
+z=Q)?r2ChrB=z|B*h9uM<yL!pSx|W4?Exi|g_!#B`$fqoU9n3-*z#^8@=L6Ioz`Qz}
+z^D3^jJVEH-g#1Ub`ysL}a6F?Qe9KY)9Mq4B6KwP&*M$tu>qjBK4f3Us4?tdnyp8!N
+zmv%_`gOJDdkPrGt))gD;k~tq_p&v5d1qPVg{GGs{5f~Hz1G{zrJL38tnGfor$6)4z
+zZ=oHiU$+Cy>z)m$e?D-?fDY4Q^`c1jcToSAhhYbA8tX!o9b`iX%!P@+v1tduF0w8R
+z)($Y9BX-apwuAIR*a7s<f*tGogUuE@!1q>m_9vzt1iy=Z_zL;~<H^4Z{SX2M=*PrV
+z*dxY7ESC*CGWQ3wu)m1x^I%7blVeGvA5ni6>Q8?W;~Ddjmv)5ng{0Y#zt4s|=YwI`
+z!Q4NC4wzRnvA(8vKnKnTs5=?o<0jhNr|I)@7se9$!M_yiGvy~ie;eO@<#L}2JJRR%
+zR>)&MNDV+9d#gkn-=WTh9R=|ntiG<bLH{!7p9y&f<ZbM82ebq356}<E3sFX@O*{CG
+zr5`Y_>+>?^6T9<rWIVrsHoy+Ob+7}@>uJ!z#=IV}Bg#X6FYGvCM+vd*XfDQ6HrDry
+z0~ibF$C=ohcrYH5v0qQLF|X%vJhC6LF3jGFe#Cr`igh6wV<7RjeK8e?vIF#^ZU-5V
+z=RWV>W6SIN8|n``o`d-$>Uzh<x)!kmtnZQeU^sTbeH!fm^Lh&Hz~(+JvfsDLoBKQ)
+z*BjZ;KkKVE%_kVsN$88jsWH1j=DuOf2O0Z;V+-1V@$6wgVqQ(OvA%Mjcw0NL@m+c@
+z#<M=3V4tenQ3>oQJ#0rd<^$aho`oG?KAN)?`a?dl&$Y3?h}Z$fbLN*(2KpgtT}Z)v
+zpvA^9G9I6Y4(50+43B3U^SXI{pzkkWhrW8)(L<2;pdVea>kobi{l5r1xQ6<%E_oXu
+zkG@O_Kt3_H{DAYpQ0xHX@s{~usCEF|?XC-Xn2+>zfp)M37%aEgfsN~(h#g>kjXFo-
+zetiKjOokoAhOvKrAF3UE6YcmC=G7~>?!@_luLk3x0R1=}I@qXRw}W>Eumg-KTXul)
+zn2mWo;~;P}*M&jYfj*vlpg-lep&wSDAA-QpiTZ8K%em}Fj6uqq*DI-56ZL(njr|4Z
+zgY3)3x|aSh>c?E@p}fugO_Uv=AEK_?24M%mZ^4e<g*>n{&w;q#w|m`}19{yJfW<6a
+zFAUla%=&>v<hqmk!;b9Ou|A%#PmG)&lmbVt&#*x|=SV!yvz|vrt~)W8*}2}}b)PQ(
+zB<uio=wF6$FdOyT+-LIqK%WmFe~TU4*x#6TpzqV(!+7e2Em`Mv=#ppy$jJKq0^~8T
+zNA_tLQ+C$p-0#4izk+^%d>ZQaV_iti2M)6^Ck&?k7g7Hn)X#MVW5VwKK*y2$Eb|;`
+zuy(-py=NHn!JX{D#y&G*2bfPH`y1L3=K~x2n}{7?JPmj*Yj>ZAe$=n~xGq@FaWFU8
+zx$e{L;LGR-$frTxAA%h`GzdFj{gA)q9EtVYxZdEotbVSH{eI+JITQ6eAaCP7a(!Os
+zyi9rS(+0UdN94KRZ-aap=A*1|{Wh-q`29$bc5LnsFrN(OdM9EB-vo|d1df>3XLVYx
+z|NX$h&h`KIur9m<d5*`S%m?2`J0KrG{b?A_{*ADMg}?zeon&K!5V`Jz9YxJ&HtkS9
+zPvp8l9L;{j-ooy6W27HApKO5+gX{;>4g&ij-wt{1FK7oE@V8?Jm`{S3k9gh7^N(4O
+z_ri`-c>XYm@0o61pZ$&KhsEdvERcy96R}+6To>#6P_7$uV28umC+gRo*q;pbd#3x}
+zG_D&nVF&50z_A24!VXffJ}23{ZqxT^=*RSJmVUtXf0B)Rprhs^)USWfg?_X<AI-&l
+zmU9JT5%mXP2We#(%Nfug9hYQdJ~QV7WLItiBcSYH0(ZWp>B<f)U`*hkvV#fS`Ie?D
+zJFtK;frH8pCUEClny&1?0>%UmDm$3Koo{KnvI7ek6F8{sU;=l(rRmBJEMQFFpt6Gr
+z-1(NKD?6}&F@b~14kmEtTbi!yzyihu4k|mCz@2Yty0QZc7!x>X+QH>ln$H&=$$r$^
+z+z-Z6r)%~v-<8+mtL%?E_DsjI<$D4Ro{Ijs(>)z0OZMe$^VjyrU3{u>_rgsX>r#vQ
+z<9g3G9$L5~qtU;<Kd$>q{i%{eIoo+3n(3~c-g;n3M^?zU(u~2sDZSo&ammx!k9%;>
+zm+6k3+tBsUj=;ugxChL1m!E4sR`hsq>x|WA41QziO8tpNduKNCS$fl*KC<DlrEPf|
+z_}q}`u68#b%7=a_7TMmb&8PGC23oDMmru4lQP7@M>%~1krhDPF&CeD;mAl)&*^Ci+
+z`b^D%l0A7_{8jyNpM9?V*z(T2t*MqeUb?#ZMA6=yc0T)Ky4O!^+gH?@Q{yW!V??f=
+zYwXJ3p0&~Xn@TTV-Ew;I-mED7E}Yo7Z(&<TZK_4TBQLaFTyQY`5kKy^Gu_i?YVn&&
+z(fW0FHym2>XjYSFjhRd2<=)MwiuUDfo3XAx?$YU&1B=l|UP~YKoDUr?=?pZbSY$uj
+z+kU3-iQqOq-)6e&XKD{F+nwH!vdWARIdQG_+`=aV+f#8Loav6A-EgpUPkOx-zq98W
+z4lUl9*<`i9S9@DeEqx+y8-Me{bmvbs9az+n8Jb>f#)zElu06E8Gq*LxV!N+hZ9lVQ
+zU$EUOd+kE|Q$@RTHe2iM?rl81cz<R)pZ7G~*=IseF4`Xbn^dno+woM%9{lcAxtU9(
+zw|CRYCBVR1$Mfgfjx67mv&nB6Tj!r??#h2STJ~gj=t${a=xo9C;@K^SiXP2w@>=39
+z^fsSaav*CPpZhW0#q*mE7osnHYt0yu*LvEHl<dljs`u3wwwx~7pZhSMO*h?(=i82!
+z?8)8iuQp>uE_b&aUbsDTqxCnqPE)^qxov)n?Or~&`AE@YS<OC+z4Z3Bo>_VzyMy<i
+zo9@#2&CoB{<hAJ6dw%WSVzkYw^WkUP&MZ5S`-oNcv*&8}=Rcg=GJUC8n#haYZHEiC
+z2RC{xW9#HI^@mD2bGN2i`ux(_&0R}&1{=MWxT{yUo+^4GyFChno~=iVcV%y~&VSu!
+z>kk$@l3DMw*zT$4>W(dZJg_CzGOwLFS$|*=@_8)zUg>T>Qn)>Pqjl_`JQq4tdXs)v
+z&bD?H?Z}F1NAHy_CyVxFw^?oI<(_Rvm)&GTPo3D-wR}gQCe<>poqMj~*y6`Cws<Z2
+zT{zWz@Kc+!>b(~IUOm%suy9*;oe%f4n(oZ$hJ*PX8KG3mIKOgg%YmYYGwZBl|JlpU
+zCztHQJY*SzC(qS&E!dH_)jFTPeqqa@;+?roehc=!-7P1U?8|Po&JpLIX*#rIXJ(_-
+z#$SPc1s%Cj>%zG+O;0X-I5TRzJ$I(%$t90uMfK5{3k^pX@5<QZwT!n@_)WR|hx1xe
+zEbV>yY|H-Qj+}arrM(xPZF;J3Pv&N?Wh^}NOv9l?&@a_8246Yd4*YVW@VjuP8Tw^K
+z*};V~jRy-J&WQT$x!13>pIEjxuZ_>?nC{wz)+0+F%W3vo#?dQhTAnE0mJ_n}(bE@d
+zjx5Lg=dtAL>25w;@MvaJs%30lI?=o@e{1G?&vLT{kypC69a)O;=C|Z~>6xm|q8-5o
+zt8Kh|Y2A~>o!PBEiw#|WcEf?v-MK9(7Oajx-EnaFBZ2A^OC4u=LPr+?dyfVCOJ_HA
+z72a&)$G7fXyd|^RV_DB%J74nH{Px^t>wNGM_6LO>S+yQZzg;}P5$i&*(Yh{NJKuho
+zZJS=w-`*=HHgy)YW!G5O{in~>c46JxXk8aBA8*-P(3-X0W08ISXzT8R=HNO{VSjmN
+zPBc8RpfzKIb-Z0Wx@A}4rmVHo7xd>-A%%cKKp~(IPzWdl6aoqXg}~i}KyCY#H{Sg=
+ze!OS+P8)s^cP`<w?(qB7ba)Q-tnNh4>F&<5Dpet%5Kssx1QY@a0fm4<Kp~(IPzWdl
+z6aoqXg@8gpA)pXY2q**;0tx|zfI>hapb$_9C<GJ&3IT<HLO>y)5Kssx1QY@a0fm4<
+zKp~(IPzWdl6aor?y9a@I$(u}VT<*9j2~!iNB~4GBk&^21`usCzrOgRs2D5W=``{+W
+zaQwGJpX5n_lt_itNTamM4(XIGIWFhql3bJP@&$QE-oMT3P3e*S(jvu@CV%R?^$()1
+zca-MgufO1e*+DBwv&4xbjww?T5|ff6%FmvY9>~bdVgvH-pKGrTECv5dBmuN!{-E1p
+zzYW=N{f!99yhs}i4b=NYMj#l>0%d1rWMpM#WM<sNVg!tGI&CvMh`Iw=8L0mz7XL>!
+z%IOoi@1xp2$I2zZS^2vu>~uOO!QD+Nje;&y#HFt@o!y^(J8PJ36x176MOHSp?C81v
+z-VYv};BH)Xno@Se5#YXb#0ymgDg+b)qlUnJ@-@Be1$}pZg<5;Az4^`uKe%(Q1$~3f
+zSJ2o0I^2D2?qDa71aa~2ccsE`vXZX2xR@UWa3yf~$T#`<^XJVQuVKqiu8o>KsDc#&
+z;}L;k4)&W|et!NuOa;0_IDa@{qi7TeH=Ho_pqrPMmuG~A8x92e%Q3_A^3u|LzFXs2
+zS9Bf|H|D)L%-jRTv;AhgnP)hdSY`9)8*W}+FgUC*6@=?=uQhBRA49i-0_tNsi~(d~
+zY0B`E>I}yQt+GbBC~#cZqZRu*hfUnrcQ=PAIZ%8UTRp#-XT<Os6MMWfCTueuZP{p-
+zvPT0CJ9DTx-`U4l2Rn?nHLUFMRt$$~kK=KVp>$RVC<GJ&3IT<HLg4N~V5<D?Dm8NA
+zmq;C2g2SO{@D7K=iLg_1+(}!98+qKw>_+~{2v3fYKMr}~kUtLj;}MR(bN<dZ`fKle
+zd*JZ$d(;W~LeLiixCDKH4!UDs2>L?M7lOVJ^o7Le3qfB9`a;kbg1!*d7q_(}O-q=j
+zX_`|X8t4nnncxO@=l<w7*CB^AH|k|g=u-`S3a`Ptv{-#R<Qfe@Ee`d@p<dXA7N0O#
+zi(wnXtS%xxk;nUOjZY=mM!<=2ib3kc&~!L4PT}2TA_g`}0Vl?(6XVp0aq7f4h1cL+
+z&QTtxPK;A0#;FtI)QNHG9HVi1_?iLa;qdxwe%kIRm2p@IjFK6Tc(KE3<R}P_cmq{|
+zLq=c}x>pr>k09X1I_||f?!`Lp#X1h}_Kv|i?!`Lp#X9cAI_||f4zIzxyraC1d$Ept
+zv5tGOj(f3=d&g)USNrXIWWanv&G2EI`Y=v?7^gmrQ+T&;492Ms<J5<7>ccqoVVuHi
+z@Gjpdk5eDUsSo4ShjHq|IQ5OuI5qd%Tx`v~_RZl>$OKfi;{bsnZ_<?DCx*Z{FsmV{
+z_=y3kD!v7QA$6b<nh*%wVk|0ROc9t6Ms^o8a!fmQ7?s@xP(`UQjHW2j5k?@YV-%wh
+zupltPrlyJ;1_G9DQ9*@36avFAD<wL@2t;*^ViW=v1V-4@#$R#T4cwE8`$Z%7rh><J
+zKQZr5wcAoR%8R;}6+FJ<iFrS(-SXp5Uevv>;BDOhYPa~xmJfbBP~OU(_XdiV%AWTJ
+zjJKGa3MvE?0wauohItGgw{_oe!T%BWc!N(!?7z<&=}x3Ok?y?Fg?qlo?7r^-Cxl@}
+zYVI3-(f5<1eUs6?$!Oo?8*%VS@U3HcpZPGGbVqS54(*M)kNw86vAmc4j>?TfqFQ%G
+zc!E&HDFhS(3IT<HLO>xfY6v*74~PFa`q?eSVebv^g6|s3XSqgUYZg_c6Z`P!=f%)g
+z?8D*lyx5I6_$2t&v3!m!O2H9koY;p)Kc{x%*jPTRHp0z`SzPs&Z+!peOw||v`sOI9
+zzW9|};zn(dse%;(3IT<HLO>xf4iIo@H~L(7wg?BaP8Xgnayf6%Yw#}kE*H*X;oYt=
+zc-H8aMS2t>T-X!3@Jy2n&osI4Op|Le+KW9QybC@KJ_)|nh3~=O5ubqg(f?h8QD~}O
+zqzijO7tUr~c$UhAXQ^EAH;%dRJe6yVo~IhEcHOSr+V*cpl4`H?|EN*zm3JfY<6u}S
+z6%_&sfx8TW$ONJS3V{iNz+E;3l{yLmg}^vKV1i7Ks+kIb2m<3^SSl420t$h<3;{RJ
+zVBI)_b>j?H|A}v$!Mbq<3-5yOa^nmZ-tE3e&S2d*gLUH!){Qe*H_l+)ID>`P;9c->
+z@JaBkZk)lwBR&D~<M#~KjWbv`&S2d*gLUH!){Qe*H_l+)_vjgH^UETpzsrW&J*!S+
+z6QTkmg1|j%D5_y&g20Fv;RG*aOgc(cGGYi!aC04z=8srssDj1>ff4ES30}yUbd;)O
+z#1NR^<~pe6j~M79RFD_XfWT|;F8Dv<_y55sB=-LY0Mc>x1n+|H8q5C#7!<HJGkbB?
+z6#ZWVXdlj+;PGDrH{#%v;9JM?KL~89KBR13oHa%N$H9$bWBES^LsEJeLh4!U5t<lO
+zF$w{NfI>hapb$_9j5-27?8D(dj{aXC#9{9Z?}G0d%m4Wq#um($s1N(_=>HNzTd@y^
+z$A1akh=WgpZyn437_z1K5HtC(50Cy2qZ`M@@_&qmsP>S>26`5og$?vPwh@2pGuezE
+z^?|1<PzWdl6aoqXg@8g}!Xx0vy_bI6d+Eo$mwr6|?#I2C@EW`ezRQn$FX7$(d*t3r
+zKlb5%+<WQAy_bI6d+Eo$m+%_A3qB4$3BJ{jdoSS;pMd!Bd+((m`*1(*z4YVWOF!<t
+z^yA)3KkmKs-=p_lTAzRCe%f@_XW`8_ep;W4x5iKSi9rFN5Kssx1QY@a0foS*BVgTo
+zsIWp{yd#h(t~j=#@12Ac&D9~D-6HrSA8|>Xya@L>IJ1rK!wo0yUaG?dtQxO<;k%=W
+z)xA)MX*=puA)pXY2q*;ZP6Vcj%Qsxj{ww~!;#o%NeWmyHe`dsGV23d^ek#)VUhS@S
+zJ0?3O54ScERo}?sIs6_`B@7pV<#Oxm;s5^9$6xxmsn7aKm0MrKt=lU9SADm>tm$U>
+zFQg8yxlu1e*Jyb&zxq@NC<GJ&6B&W7>DLl2PH&$|Zx;t+RWMcpW9GlTq%rdv>BjtQ
+z%*eNwP$>!lg@8gpA)pXY2q**;0tx|zfI>haFwqc53f~Vf(b}!rs}N8KC<GJ&3IT<H
+z$aL8?rZ6N+$iWH&+Vv5y_n6i<;$@D8o}*FbjPQOgP(3gN@9TGJ@SacQ6aoqXg@8gp
+zA)pYr*APe%R~p;olEqTGij;R<<d0G$rHv$VaZIZukxP(fS*a7bBq@~AIuf}QStO+^
+zN#uGp$gLrfOJgakN#p{uTS{w5<Q|gwQd&jIOA$$>+(r`9f|4br^(1n6EG0xDmrl86
+z61jQMx~z^wZoV{0Sp|t@E|6L&TS;PCzGO&Q8Hrpc$}B_XCY>uFS59JDNR~=jGl^U=
+zT3c2{B3HtkAriTjvRTU3lgO=NS}BQKCGOrUg91itTV<1!Rg;+3!JMl}<Qkl4!zvQF
+z{YYC^K_b@$ZbcP|+)<#tqLf7L9NNCFiA1gk+=^ACygc*+<U%V+OuHr@$%;x6xmRVQ
+ztf(fDdxLU~Byw+&TTdeQKDl)ya$h4?OCopN0d5V6+&55PMJ<Wkcc^s}iQEs#HIvBw
+z4{$5jk;wfctZ8KxiQG?s^~&`maz90V<ts>fZ#oxA`Dzl=evYe>x&{){{tac8my?+G
+zTXG>1x&H%h)jATne<!z|MDG8RTSFrE|H##n$bAfM^(qoM&9PW&R*}fLz=c+k$R&VV
+zT}~pG0&ZnFiCh3Et*#)E3o_>#61jQgYDwhgldB|=%XbvY>XjsN1x%|Ukt=3eJ&9Zi
+z(?TS2%bnm>lgL##kgbVCt`c$;AriT2N0wAnk;v7cl!j6gxe&Cjs3wtXB)5)4t_3+O
+z>Ph5U!L6wyk?U~ml{M8QayuNQvSuYIuLdKIIX94)wx3)%iCihPUQ<OP*X39wYbr_P
+zjxuM6MDDcXBUxKTB3A;rwdEvommFoXc0GyQMaMZ=*GwYU>&TUL<s@=1J21d%N#tHb
+zed{)o$i0pFDjP`TK99CnmXXN4#k4vSxv!90Ln8M+xe$rm-;%2*k^4GIsaj7WmkX_{
+z){)444>_wglF0p?!!K1$ByxZ6*d$dAByvAt&Jc-Qg;pq46(n*$W!eT3xu27(C6W6j
+zxq1@0zkyvhg-GN+ax9msMiRNzD05X6iQIouZY7D_e~?>2B6ou=swR>9J=4lb<o-ae
+zjzsQ{K)0%tL~aM><f<wXIhXbusV*gvOVIvBs%uE(lCUCFSCYsjbA6~LkxOIR3KF@w
+z+H$FGCXrjDZI<fQByuZ>QVogRr@>XPA(1O&DfJ|B%d{-1UPU5T#<cY$asqCB6^Yzh
+ztzK%@k;tt<nKc_p<koBdDmA4fat&IM)T}0vYb4i1BG*E$oJ6jbTm^~T4%AmuNg}t4
+zT!=*OAnU6okvpv2FB?ip<eo;(+Hw-PljPQu$eq%bN^L!f+*#CDyOBh$2RX|sN#rhq
+ztE(W9yQ*!Kb=4$tFMz9DK_d4ea#pP(k$V|jO%;jUYv3AIkjU+W&2OwDadmnFZK$gv
+zG41ovr7lDw_m=jc)RmIR{k8Uy)K!zny@N7q>qz9jPPx@2avr4BHIm4EgWNh2xo?tN
+zLn8M*$TgRe$o(VI%IiqvK4Q*V61huQfhyOLxXSzv7E-sC#IzgCSxzGN2XHGYNaS9_
+zIu_bUB3I_Dl~6N@+@DZ;sDeaJfJ<mKiMS+SClCsen3jSSFH}t;=VMM3WN4PgoGVC7
+z3xKO%O(GX`E|dCF61gO#m6nsp6{3{YWh8PHPLI^rk;s*6;HpUEnw=R^-$WwU0$u8x
+zN#ufPLqk1@+!kl1G?bIbeaN(G5@-EdXQ4E#A?c-H?rB&}BDae+v5G|QNvBhq%1Ho1
+zegr(5H<Flk&haZ*TSFrEH`Bm9xG>BivvR{iz=`=SNgUWwIkbRi*e7dRrf8E2#R>a&
+zVs>>-O2*Z~44H&|xm!ySw|Hc-_$3~ra|&j>`!M4tXp3a3HeV7k&rH*nVg3%vbS)dD
+z=3w^DlNnmBq+qs6#rXDUwc^Dr>YY?BKCMA~lS;+sE)&1DNoHdHo~3QU9A6=6t`(9t
+zd8^FU*2^5(An95&PK7s0hSnsRTBl@byCrMVZzVYCmlAaEmF!8sksPcdx!SKKZ_-J*
+z-}RErb)J*Cu5S61>wn2S*DvG&*RSN$u2z{pr47Cvew%zI{$cnI`Apm+GCyu7{C1fi
+zzXSeJ_+9XLDjo;N$`1yE_V_Qv=b_(3j1Z>Ka44vU-bJbr$B>baq5f2FIA4mM@1^*^
+zif2fZm*U?Ihu(_+IznDtml>fHDTB<N+^1(eJ;NxkQV(Sy^XF&$Ivlqk<zz|?Y!+9K
+zdWaerA!=%bsHqX+W0FQFITAuX&4`1n9x~dtAmtxYuIt(xA<CXaTn)633x`r7q2x$t
+zP9#KK3<+vrgnW@yqGrTVQ!~{JQ7a=3wdo;hWvN%&m)h>RE-cRo5oaUB+RRilL|G$_
+z+M5y#RihLml_9psh?^A-8TA@*Ms3VDGm_6J?<c7>VO<z9G+>CW+?V<-J&q+OM|94K
+z)W(oe%E#e+$)0wPQJxWEc}9rkZTI{TsYKTZG1UkWNh3rnG2^swh&^b;Sxbov#}R|=
+zp5J>?ge^BhM#;ZNZT+D{y%fd~tL>hzMpBKC8Aoeks$sj^J<oaabe(_b`32%w-Y@jp
+z82YIv+nWOX%n;-5CYL1QwtmZG@LEL0`3O0%`k1Z+0ZrUfth@uOkm-#4E|bMM5as(H
+zE3VP`{`~w7(1Dlf$ZO)zpIByGn2$5lNBT3#fj>$YXX2u8!3OV&;$1R1B`utR=~jJ{
+zL~{cVQ(Txn3Hj$PFrvu2#BG(w+D(3~UZasdIpx!Zh5{%L>-$u1x>=vjyCeL3O+#-?
+z@n?ngov%$|4w|m+n661&QiO*syTp||CtTiq>>0o(=7#H=uT23TKP!8kDIeySnLPE0
+zpOsN;<)`=qrB>dRm>HhzSwG7UtPH0^8wbuMO*dcXSD7sAgZjD_nh{3(CQVx$j!4qm
+zGd)s3$t2?GO3VmL%-8XCP0w0k2!KcZ_sz^%9_DqtTo0@cmuHmkN~B%VmAHtfE3v>}
+zaR#RI$yR=nIA?t7AwvbGPZC$^y!;|v0{w^j(4Qqn0Y>|QPq+ZK&nfXfvpq)rQ~c%O
+z`bv=QK#8U+aT@)5znMM&kK8UT(a6F44t<|)2$aAYX&;;=>H1K<CJ9Rn&fuMrFgp@q
+zCaBL5L7;yo8<FBvAqoM7z&(#ZD!%EWD=sb`QSZSwMdR6d<xk^T{bB3w!+9_ZncFw7
+zZ?69Obl<0<J|76jo9X7Kk!x-^_i*Jytv%P?eCLB747Z%&%HM5z%tOBn=5@IH+OTcn
+zlPth5EoSu&heOjU8+Y_vfA51In~`_;>^%L(9a6(dGs8RCw6v_8Kp-pUP7<@^qyEd%
+zJ7rX93IT<{xJ4jMI?apmaoYx^xI#c7pb$_9C<GJ&3IT<HLO>y)5Kssx1QY@a0fm4<
+zKp~(IPzWdl6aoqXg@8gpA)pXY2q**;0tx|zfI>hapb$_9C<GJ&3IT<HLO>y)5Kssx
+z1QY@a0fm4<Kp~(IPzWdl6avFXV7B}$@(WkPFHM!85Kssx1QY@a0fm4<Kp~(I_+%0I
+E|I0XP%>V!Z
+
+literal 0
+HcmV?d00001
+
+diff --git a/target/linux/ipq807x/base-files/etc/board.d/02_network b/target/linux/ipq807x/base-files/etc/board.d/02_network
+index 004ab4fdc62..a597aee68f2 100644
+--- a/target/linux/ipq807x/base-files/etc/board.d/02_network
++++ b/target/linux/ipq807x/base-files/etc/board.d/02_network
+@@ -16,7 +16,8 @@ ipq807x_setup_interfaces()
+ 	xiaomi,ax9000)
+ 		ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4" "wan"
+ 		;;
+-	edgecore,eap102)
++	edgecore,eap102|\
++	zte,mf269)
+ 		ucidef_set_interfaces_lan_wan "lan" "wan"
+ 		;;
+ 	edimax,cax1800)
+@@ -38,9 +39,31 @@ ipq807x_setup_interfaces()
+ 	esac
+ }
+ 
++ipq807x_setup_macs()
++{
++	local board="$1"
++	local lan_mac=""
++	local wan_mac=""
++	local label_mac=""
++
++	case "$board" in
++	zte,mf269)
++		wan_mac="$(mtd_get_mac_binary mac 0x0)"
++		[ "$wan_mac" != "00:00:00:00:00:00" ] || wan_mac="$(get_mac_binary "$(find_mtd_chardev mac)" 0x20000)"
++		lan_mac="$(macaddr_add "$wan_mac" 1)"
++		label_mac="$wan_mac"
++		;;
++	esac
++
++	[ -n "$lan_mac" ] && ucidef_set_interface_macaddr "lan" "$lan_mac"
++	[ -n "$wan_mac" ] && ucidef_set_interface_macaddr "wan" "$wan_mac"
++	[ -n "$label_mac" ] && ucidef_set_label_macaddr "$label_mac"
++}
++
+ board_config_update
+ board=$(board_name)
+ ipq807x_setup_interfaces $board
++ipq807x_setup_macs $board
+ board_config_flush
+ 
+ exit 0
+diff --git a/target/linux/ipq807x/base-files/etc/hotplug.d/firmware/11-ath11k-caldata b/target/linux/ipq807x/base-files/etc/hotplug.d/firmware/11-ath11k-caldata
+index 524211ef43e..61ea555247e 100644
+--- a/target/linux/ipq807x/base-files/etc/hotplug.d/firmware/11-ath11k-caldata
++++ b/target/linux/ipq807x/base-files/etc/hotplug.d/firmware/11-ath11k-caldata
+@@ -18,6 +18,7 @@ case "$FIRMWARE" in
+ 	redmi,ax6|\
+ 	xiaomi,ax3600|\
+ 	xiaomi,ax9000|\
++	zte,mf269|\
+ 	zyxel,nbg7815)
+ 		caldata_extract "0:art" 0x1000 0x20000
+ 		;;
+diff --git a/target/linux/ipq807x/base-files/etc/hotplug.d/ieee80211/11_fix_wifi_mac b/target/linux/ipq807x/base-files/etc/hotplug.d/ieee80211/11_fix_wifi_mac
+new file mode 100644
+index 00000000000..c8a8c6ad2b9
+--- /dev/null
++++ b/target/linux/ipq807x/base-files/etc/hotplug.d/ieee80211/11_fix_wifi_mac
+@@ -0,0 +1,19 @@
++[ "$ACTION" == "add" ] || exit 0
++
++PHYNBR=${DEVPATH##*/phy}
++
++[ -n $PHYNBR ] || exit 0
++
++. /lib/functions.sh
++. /lib/functions/system.sh
++
++board=$(board_name)
++
++case "$board" in
++	zte,mf269)
++		mac_addr="$(mtd_get_mac_binary mac 0x0)"
++		[ "$mac_addr" != "00:00:00:00:00:00" ] || mac_addr="$(get_mac_binary "$(find_mtd_chardev mac)" 0x20000)"
++		[ "$PHYNBR" = "0" ] && macaddr_add "$mac_addr" 2 > "/sys${DEVPATH}/macaddress"
++		[ "$PHYNBR" = "1" ] && macaddr_add "$mac_addr" 3 > "/sys${DEVPATH}/macaddress"
++	;;
++esac
+diff --git a/target/linux/ipq807x/base-files/lib/upgrade/platform.sh b/target/linux/ipq807x/base-files/lib/upgrade/platform.sh
+index 346cc390f3124..d9a81e1e22d2b 100644
+--- a/target/linux/ipq807x/base-files/lib/upgrade/platform.sh
++++ b/target/linux/ipq807x/base-files/lib/upgrade/platform.sh
+@@ -109,6 +109,10 @@ platform_do_upgrade() {
+ 		CI_ROOT_UBIPART="rootfs"
+ 		nand_do_upgrade "$1"
+ 		;;
++	zte,mf269)
++		CI_UBIPART="rootfs"
++		nand_do_upgrade "$1"
++		;;
+ 	*)
+ 		default_do_upgrade "$1"
+ 		;;
+diff --git a/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/ipq8071-mf269.dts b/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/ipq8071-mf269.dts
+new file mode 100644
+index 00000000000..be76ddf12e4
+--- /dev/null
++++ b/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/ipq8071-mf269.dts
+@@ -0,0 +1,212 @@
++// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
++
++/dts-v1/;
++
++#include "ipq8074-512m.dtsi"
++#include "ipq8074-ac-cpu.dtsi"
++#include "ipq8074-ess.dtsi"
++#include <dt-bindings/gpio/gpio.h>
++#include <dt-bindings/input/input.h>
++
++/ {
++	model = "ZTE MF269";
++	compatible = "zte,mf269", "qcom,ipq8074";
++
++	aliases {
++		serial0 = &blsp1_uart5;
++		led-boot = &led_system_white;
++		led-failsafe = &led_system_white;
++		led-running = &led_system_white;
++		led-upgrade = &led_system_white;
++	};
++
++	chosen {
++		stdout-path = "serial0:115200n8";
++		bootargs-append = " root=/dev/ubiblock0_1";
++	};
++
++	keys {
++		compatible = "gpio-keys";
++
++		reset {
++			label = "reset";
++			gpios = <&tlmm 46 GPIO_ACTIVE_LOW>;
++			linux,code = <KEY_RESTART>;
++		};
++
++		wps {
++			label = "wps";
++			gpios = <&tlmm 37 GPIO_ACTIVE_LOW>;
++			linux,code = <KEY_WPS_BUTTON>;
++		};
++	};
++
++	leds {
++		compatible = "gpio-leds";
++
++		led_system_white: system-white {
++			label = "white:system";
++			gpio = <&tlmm 56 GPIO_ACTIVE_HIGH>;
++		};
++	};
++};
++
++&tlmm {
++	mdio_pins: mdio-pins {
++		mdc {
++			pins = "gpio68";
++			function = "mdc";
++			drive-strength = <8>;
++			bias-pull-up;
++		};
++
++		mido {
++			pins = "gpio69";
++			function = "mdio";
++			drive-strength = <8>;
++			bias-pull-up;
++		};
++	};
++
++	usb_vbus_pins: usb-vbus-pins {
++		usb-pins {
++			pins = "gpio29";
++			function = "gpio";
++			drive-strength = <8>;
++			bias-disable;
++			output-high;
++		};
++	};
++};
++
++&blsp1_spi1 {
++	pinctrl-0 = <&spi_0_pins>;
++	pinctrl-names = "default";
++	cs-select = <0>;
++	status = "okay";
++
++	flash@0 {
++		compatible = "jedec,spi-nor";
++		#address-cells = <1>;
++		#size-cells = <1>;
++		reg = <0>;
++		spi-max-frequency = <50000000>;
++	};
++};
++
++&blsp1_uart5 {
++	status = "okay";
++};
++
++&prng {
++	status = "okay";
++};
++
++&cryptobam {
++	status = "okay";
++};
++
++&crypto {
++	status = "okay";
++};
++
++&qpic_bam {
++	status = "okay";
++};
++
++&qpic_nand {
++	status = "okay";
++
++	nand@0 {
++		reg = <0>;
++		nand-ecc-strength = <4>;
++		nand-ecc-step-size = <512>;
++		nand-bus-width = <8>;
++
++		partitions {
++			compatible = "qcom,smem-part";
++		};
++	};
++};
++
++&qusb_phy_0 {
++	status = "okay";
++};
++
++&ssphy_0 {
++	status = "okay";
++};
++
++&usb_0 {
++	pinctrl-0 = <&usb_vbus_pins>;
++	pinctrl-names = "default";
++	status = "okay";
++};
++
++&mdio {
++	status = "okay";
++
++	pinctrl-0 = <&mdio_pins>;
++	pinctrl-names = "default";
++
++	qca8075_24: ethernet-phy@24 {
++		compatible = "ethernet-phy-ieee802.3-c22";
++		reg = <24>;
++		reset-gpios = <&tlmm 25 GPIO_ACTIVE_LOW>;
++	};
++
++	qca8075_28: ethernet-phy@28 {
++		compatible = "ethernet-phy-ieee802.3-c22";
++		reg = <28>;
++		reset-gpios = <&tlmm 44 GPIO_ACTIVE_LOW>;
++	};
++};
++
++&switch {
++	status = "okay";
++
++	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@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";
++		};
++	};
++};
++
++&edma {
++	status = "okay";
++};
++
++&dp5_syn {
++	status = "okay";
++	phy-handle = <&qca8075_24>;
++	label = "lan";
++};
++
++&dp6_syn {
++	status = "okay";
++	phy-handle = <&qca8075_28>;
++	label = "wan";
++};
++
++&wifi {
++	status = "okay";
++
++	qcom,ath11k-calibration-variant = "ZTE-MF269";
++	qcom,ath11k-fw-memory-mode = <1>;
++};
+
+--- a/target/linux/ipq807x/image/generic.mk
++++ b/target/linux/ipq807x/image/generic.mk
+@@ -147,6 +147,19 @@
+ endif
+ endef
+ TARGET_DEVICES += xiaomi_ax9000
++
++define Device/zte_mf269
++	$(call Device/FitImage)
++	$(call Device/UbiFit)
++	DEVICE_VENDOR := ZTE
++	DEVICE_MODEL := MF269
++	BLOCKSIZE := 128k
++	PAGESIZE := 2048
++	DEVICE_DTS_CONFIG := config@ac04
++	SOC := ipq8071
++	DEVICE_PACKAGES := ipq-wifi-zte_mf269
++endef
++TARGET_DEVICES += zte_mf269
+ 
+ define Device/zyxel_nbg7815
+ 	$(call Device/FitImage)

+ 1354 - 0
devices/ipq807x_generic/patches/02-xtr10890.bin.patch

@@ -0,0 +1,1354 @@
+From 98eeb48d7069b0ca3e52fdd23a03951532aa7ddc Mon Sep 17 00:00:00 2001
+From: zhouF96 <[email protected]>
+Date: Thu, 7 Apr 2022 22:49:43 +0800
+Subject: [PATCH] Add basic support for TL-XTR10890 (#9202)
+
+* kernel: add module for  bcm574xx 575xx serials
+
+kernel: add module for bnxt_en Linux driver for the
+Broadcom NetXtreme-C/NetXtreme-E
+BCM573xx, BCM574xx, BCM575xx, NetXtreme-S BCM5880x
+(up to 200 Gbps) Ethernet Network Controllers and Broadcom Nitro
+BCM58700 4-port 1/2.5/10 Gbps Ethernet Network Controller.
+
+* reapply bcm578xx sfp 2.5g patch
+
+* add basic tplink-xtr10890 support
+
+* update 10890dts and add to platform.sh
+
+* update 10890 dts to try boot qcn9074
+
+* revert qca-ssdk to original version
+---
+ package/firmware/ipq-wifi/Makefile            |   4 +-
+ .../ipq-wifi/board-tplink_xtr10890.ipq8074    | Bin 0 -> 131176 bytes
+ .../ipq807x/base-files/etc/board.d/02_network |   3 +
+ .../etc/hotplug.d/firmware/11-ath11k-caldata  |   3 +
+ .../base-files/lib/upgrade/platform.sh        |   3 +
+ .../arm64/boot/dts/qcom/ipq8078-xtr10890.dts  | 969 ++++++++++++++++++
+ target/linux/ipq807x/image/generic.mk         |  13 +
+ .../900-arm64-dts-add-OpenWrt-DTS-files.patch |   3 +-
+ 8 files changed, 996 insertions(+), 2 deletions(-)
+ create mode 100755 package/firmware/ipq-wifi/board-tplink_xtr10890.ipq8074
+ create mode 100755 target/linux/ipq807x/files-5.15/arch/arm64/boot/dts/qcom/ipq8078-xtr10890.dts
+
+diff --git a/package/firmware/ipq-wifi/Makefile b/package/firmware/ipq-wifi/Makefile
+index d56a182658cf..416a03413891 100644
+--- a/package/firmware/ipq-wifi/Makefile
++++ b/package/firmware/ipq-wifi/Makefile
+@@ -58,7 +58,8 @@ ALLWIFIBOARDS:= \
+ 	qnap_301w \
+ 	qxwlan_e2600ac \
+ 	zte_mf263 \
+-	zte_mf269
++	zte_mf269 \
++	tplink_xtr10890
+ 
+ ALLWIFIPACKAGES:=$(foreach BOARD,$(ALLWIFIBOARDS),ipq-wifi-$(BOARD))
+ 
+@@ -162,5 +163,6 @@ $(eval $(call generate-ipq-wifi-package,qnap_301w,QNAP 301w))
+ $(eval $(call generate-ipq-wifi-package,qxwlan_e2600ac,Qxwlan E2600AC))
+ $(eval $(call generate-ipq-wifi-package,zte_mf263,ZTE MF263))
+ $(eval $(call generate-ipq-wifi-package,zte_mf269,ZTE MF269))
++$(eval $(call generate-ipq-wifi-package,tplink_xtr10890,TPLINK XTR10890))
+ 
+ $(foreach PACKAGE,$(ALLWIFIPACKAGES),$(eval $(call BuildPackage,$(PACKAGE))))
+diff --git a/package/firmware/ipq-wifi/board-tplink_xtr10890.ipq8074 b/package/firmware/ipq-wifi/board-tplink_xtr10890.ipq8074
+new file mode 100755
+index 0000000000000000000000000000000000000000..2815a4d661471ac403d9c0f38258aa8cd95a266f
+GIT binary patch
+literal 131176
+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
+CPBuUQ
+
+literal 0
+HcmV?d00001
+
+diff --git a/target/linux/ipq807x/base-files/etc/board.d/02_network b/target/linux/ipq807x/base-files/etc/board.d/02_network
+index 93421fbb86dc..cbd229347f76 100644
+--- a/target/linux/ipq807x/base-files/etc/board.d/02_network
++++ b/target/linux/ipq807x/base-files/etc/board.d/02_network
+@@ -17,6 +17,9 @@ ipq807x_setup_interfaces()
+ 	zte,mf269)
+ 		ucidef_set_interfaces_lan_wan "eth0" "eth1"
+ 		;;
++	tplink,xtr10890)
++		ucidef_set_interfaces_lan_wan "eth0 eth1 eth2 eth3 eth4" "eth5"
++		;;
+ 	*)
+ 		echo "Unsupported hardware. Network interfaces not initialized"
+ 		;;
+diff --git a/target/linux/ipq807x/base-files/etc/hotplug.d/firmware/11-ath11k-caldata b/target/linux/ipq807x/base-files/etc/hotplug.d/firmware/11-ath11k-caldata
+index 68334ce4101e..4a91b83d8604 100644
+--- a/target/linux/ipq807x/base-files/etc/hotplug.d/firmware/11-ath11k-caldata
++++ b/target/linux/ipq807x/base-files/etc/hotplug.d/firmware/11-ath11k-caldata
+@@ -15,6 +15,9 @@ case "$FIRMWARE" in
+ 	zte,mf269)
+ 		caldata_extract "0:ART" 0x1000 0x20000
+ 		;;
++	tplink,xtr10890)
++		caldata_extract "0:ART" 0x1000 0x20000
++		;;
+ 	esac
+ 	;;
+ *)
+diff --git a/target/linux/ipq807x/base-files/lib/upgrade/platform.sh b/target/linux/ipq807x/base-files/lib/upgrade/platform.sh
+index a7de5ea47afe..a164a73deb7b 100644
+--- a/target/linux/ipq807x/base-files/lib/upgrade/platform.sh
++++ b/target/linux/ipq807x/base-files/lib/upgrade/platform.sh
+@@ -18,6 +18,9 @@ platform_do_upgrade() {
+ 	zte,mf269)
+ 		nand_do_upgrade "$1"
+ 		;;
++	tplink,xtr10890)
++		nand_do_upgrade "$1"
++		;;
+ 	*)
+ 		default_do_upgrade "$1"
+ 		;;
+diff --git a/target/linux/ipq807x/files-5.15/arch/arm64/boot/dts/qcom/ipq8078-xtr10890.dts b/target/linux/ipq807x/files-5.15/arch/arm64/boot/dts/qcom/ipq8078-xtr10890.dts
+new file mode 100755
+index 000000000000..9b2ef387508c
+--- /dev/null
++++ b/target/linux/ipq807x/files-5.15/arch/arm64/boot/dts/qcom/ipq8078-xtr10890.dts
+@@ -0,0 +1,969 @@
++// SPDX-License-Identifier: GPL-2.0-only
++/dts-v1/;
++/* Copyright (c) 2017, 2020-2021, The Linux Foundation. All rights reserved.
++ */
++#include "ipq8074.dtsi"
++#include "ipq8074-hk-cpu.dtsi"
++#include "ipq8074-ac-nss.dtsi"
++#include <dt-bindings/gpio/gpio.h>
++#include <dt-bindings/input/input.h>
++#include <dt-bindings/leds/common.h>
++
++/ {
++	#address-cells = <0x2>;
++	#size-cells = <0x2>;
++	model = "TP-LINK XTR10890";
++	compatible = "tplink,xtr10890", "qcom,ipq8074";
++	interrupt-parent = <&intc>;
++	//qcom,msm-id = <0x143 0x0>, <0x186 0x0>, <0x158 0x0>, <0x188 0x0>;
++
++	aliases {
++		serial0 = &blsp1_uart5;
++		serial1 = &blsp1_uart3;
++		/*
++		 * Aliases as required by u-boot
++		 * to patch MAC addresses
++		 */
++		led-boot = &led_system_red;
++		led-failsafe = &led_system_green;
++		led-running = &led_system_red;
++		led-upgrade = &led_system_green;
++		ethernet0 = &dp1;
++		ethernet1 = &dp2;
++		ethernet2 = &dp3;
++		ethernet3 = &dp4;
++		ethernet4 = &dp5;
++		ethernet5 = &dp6;
++	};
++
++	chosen {
++		stdout-path = "serial0";
++		bootargs-append = " root=/dev/ubiblock0_1 rootfstype=squashfs";
++	};
++
++	reserved-memory {
++		
++		/delete-node/ wifi_dump@51100000;
++		/delete-node/ wigig_dump@51300000;
++		qcn9000_pcie0: qcn9000_pcie0@51100000 {
++			no-map;
++			reg = <0x0 0x51100000 0x0 0x03500000>;
++		};
++
++		mhi_region0: dma_pool0@54600000 {
++			compatible = "shared-dma-pool";
++			no-map;
++			reg = <0x0 0x54600000 0x0 0x00900000>;
++		};
++
++	};
++
++
++	keys {
++		compatible = "gpio-keys";
++		pinctrl-0 = <&button_pins>;
++		pinctrl-names = "default";
++		status = "okay";
++			button@1 {
++			label = "wps";
++			linux,code = <KEY_WPS_BUTTON>;
++			gpios = <&tlmm 50 GPIO_ACTIVE_LOW>;
++			linux,input-type = <1>;
++			debounce-interval = <60>;
++		};
++	};
++
++	leds {
++		compatible = "gpio-leds";
++		led_system_green: system-green {
++			label = "green:system";
++			gpios = <&tlmm 31 GPIO_ACTIVE_LOW>;
++		};
++		led_system_red: system-red {
++			label = "red:system";
++			gpios = <&tlmm 29 GPIO_ACTIVE_HIGH>;
++		};
++
++		10g-green {
++			label = "green:10g";
++			gpios = <&tlmm 32 GPIO_ACTIVE_HIGH>;
++		};
++
++		sfp_green {
++			label = "green:sfp";
++			gpios = <&tlmm 30 GPIO_ACTIVE_HIGH>;
++		};
++	};
++
++};
++
++&sdhc_1 {
++	status = "okay";
++};
++
++
++&qpic_nand {
++	pinctrl-0 = <&qpic_pins>;
++	pinctrl-names = "default";
++	status = "okay";
++	nand@0 {
++		reg = <0>;
++		#address-cells = <1>;
++		#size-cells = <1>;
++		nand-ecc-strength = <4>;
++		nand-ecc-step-size = <512>;
++		nand-bus-width = <8>;
++
++		partition0@0 {
++			label = "0:SBL1";
++			reg = <0x0 0x80000>;
++			read-only;
++		};
++		partition1@80000 {
++			label = "0:MIBIB";
++			reg = <0x80000 0x40000>;
++		};
++
++		partition2@c0000 {
++			label = "0:BOOTCONFIG";
++			reg = <0xc0000 0x20000>;
++			read-only;
++		};
++		partition3@e0000 {
++			label = "0:BOOTCONFIG1";
++			reg = <0xe0000 0x20000>;
++			read-only;
++		};
++
++		partition4@100000 {
++			label = "0:QSEE";
++			reg = <0x100000 0x280000>;
++			read-only;
++		};
++
++		partition4@380000 {
++			label = "0:DEVCFG";
++			reg = <0x380000 0x20000>;
++			read-only;
++		};
++
++		partition4@3a0000 {
++			label = "0:RPM";
++			reg = <0x3a0000 0x40000>;
++			read-only;
++		};
++
++		partition5@3e0000 {
++			label = "0:CDT";
++			reg = <0x3e0000 0x20000>;
++			read-only;
++		};
++
++		partition6@400000 {
++			label = "0:APPSBLENV";
++			reg = <0x400000 0x40000>;
++		};
++
++		partition7@440000 {
++			label = "0:APPSBL";
++			reg = <0x440000 0x100000>;
++		};
++
++		partition8@540000 {
++			label = "0:ART";
++			reg = <0x540000 0x80000>;
++		};
++
++		partition12@5c0000 {
++			label = "rootfs";
++			reg = <0x5c0000 0x7000000>;
++		};
++
++		partition13@75c0000 {
++			label = "0:WIFIFW";
++			reg = <0x75c0000 0x900000>;
++		};
++
++		partition15@7ec0000 {
++			label = "0:ETHPHYFW";
++			reg = <0x7ec0000 0x80000>;
++		};
++	};
++};
++
++
++&mdio{
++	status = "okay";
++
++	pinctrl-0 = <&mdio_pins>;
++	pinctrl-names = "default";
++	phy-reset-gpio = <&tlmm 37 0>;
++	phy0: ethernet-phy@0 {
++		reg = <16>;
++	};
++	phy1: ethernet-phy@1 {
++		reg = <17>;
++	};
++	phy2: ethernet-phy@2 {
++		reg = <18>;
++	};
++	phy3: ethernet-phy@3 {
++		reg = <19>;
++	};
++	phy4: ethernet-phy@4 {
++		reg = <30>;
++	};
++	phy5: ethernet-phy@5 {
++		compatible ="ethernet-phy-ieee802.3-c45";
++		reg = <0>;
++	};
++};
++
++&tlmm {
++	sd_pins: sd-pinmux {
++		pins = "gpio63";
++		function = "sd_card";
++		drive-strength = <8>;
++		bias-pull-up;
++	};
++
++	button_pins: button_pins {
++		wps_button {
++			pins = "gpio50";
++			function = "gpio";
++			drive-strength = <8>;
++			bias-pull-up;
++		};
++	};
++
++	leds_pins: leds_pinmux {
++		led_pwr_green {
++			pins = "gpio31";
++			function = "gpio";
++			drive-strength = <8>;
++			bias-pull-down;
++		};
++
++		led_pwr_red {
++			pins = "gpio29";
++			function = "gpio";
++			drive-strength = <8>;
++			bias-pull-down;
++		};
++
++		led_sfp_green {
++			pins = "gpio30";
++			function = "gpio";
++			drive-strength = <8>;
++			bias-pull-down;
++		};
++
++		led_10g_green {
++			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;
++		};
++	};
++
++	qpic_pins: qpic-pins {
++		pins = "gpio1", "gpio3", "gpio4",
++		       "gpio5", "gpio6", "gpio7",
++		       "gpio8", "gpio10", "gpio11",
++		       "gpio12", "gpio13", "gpio14",
++		       "gpio15", "gpio17";
++		function = "qpic";
++		drive-strength = <8>;
++		bias-disable;
++	};
++
++	uniphy_pins: uniphy_pinmux {
++		mux {
++			pins = "gpio60";
++			function = "rx2";
++			bias-disable;
++		};
++
++		sfp_tx {
++			pins = "gpio52";
++			function = "gpio";
++			drive-strength = <8>;
++			bias-pull-down;
++			output-low;
++		};
++	};
++
++	i2c_0_pins: i2c-0-pinmux {
++		pins = "gpio46", "gpio47";
++		function = "blsp1_i2c";
++		drive-strength = <8>;
++		bias-disable;
++	};
++
++	pwm_pins: pwm_pinmux {
++		mux_1 {
++			pins = "gpio25";
++			function = "pwm02";
++			drive-strength = <8>;
++		};
++	};
++
++	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;
++		};
++	};
++};
++
++&blsp1_uart5 {
++	status = "okay";
++};
++
++&blsp1_spi1 {
++	status = "okay";
++	pinctrl-0 = <&spi_0_pins>;
++	pinctrl-names = "default";
++	cs-select = <0>;
++
++	m25p80@0 {
++		  compatible = "n25q128a11";
++		  #address-cells = <1>;
++		  #size-cells = <1>;
++		  reg = <0>;
++		  spi-max-frequency = <50000000>;
++	};
++};
++
++&blsp1_i2c2 {
++	pinctrl-0 = <&i2c_0_pins>;
++	pinctrl-names = "default";
++	status = "okay";
++};
++
++&ssphy_0 {
++	status = "okay";
++};
++
++&qusb_phy_0 {
++	status = "okay";
++};
++
++&ssphy_1 {
++	status = "okay";
++};
++
++&qusb_phy_1 {
++	status = "okay";
++};
++
++&usb_0 {
++	status = "okay";
++};
++
++&usb_1 {
++	status = "okay";
++};
++
++&prng {
++	status = "okay";
++};
++
++&cryptobam {
++	status = "okay";
++};
++
++&crypto {
++	status = "okay";
++};
++
++&qpic_bam {
++	status = "okay";
++};
++
++&qmp_pcie_phy0 {
++	status = "okay";
++};
++
++&pcie0 {
++	perst-gpio = <&tlmm 58 1>;
++	status = "okay";
++
++	pcie0_rp {
++		status = "ok";
++
++		mhi_0: qcom,mhi@0 {
++			reg = <0 0 0 0 0 >;
++			qrtr_instance_id = <0x20>;
++			#address-cells = <0x2>;
++			#size-cells = <0x2>;
++			memory-region = <&mhi_region0>;
++			// base-addr = <0x51100000>;
++			// m3-dump-addr = <0x53400000>;
++			// etr-addr = <0x53500000>;
++			// qcom,caldb-addr = <0x53600000>;
++			// mhi,max-channels = <30>;
++			// mhi,timeout = <10000>;
++			// qcom,board_id= <0xa4>;
++
++			// pcie0_mhi: pcie0_mhi {
++			// 		status = "ok";
++			// };
++		};
++	};
++
++};
++
++&qmp_pcie_phy1 {
++	//status = "okay";
++	status = "disabled";
++};
++
++&pcie1 {
++	perst-gpio = <&tlmm 61 0x1>;
++	status = "disabled";
++};
++
++&ess_switch {
++	status = "okay";
++	pinctrl-0 = <&uniphy_pins>;
++	pinctrl-names = "default";
++	switch_cpu_bmp = <0x1>;  /* cpu port bitmap */
++	switch_lan_bmp = <0x3e>; /* lan port bitmap */
++	switch_wan_bmp = <0x40>; /* wan port bitmap */
++	switch_mac_mode = <0x0b>; /* mac mode for uniphy instance0*/
++	switch_mac_mode1 = <0x0e>; /* mac mode for uniphy instance1*/
++	switch_mac_mode2 = <0x0d>; /* 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 = <16>;
++		};
++		port@1 {
++			port_id = <2>;
++			phy_address = <17>;
++		};
++		port@2 {
++			port_id = <3>;
++			phy_address = <18>;
++		};
++		port@3 {
++			port_id = <4>;
++			phy_address = <19>;
++		};
++		port@4 {
++			port_id = <5>;
++			phy_address = <30>;
++			phy_i2c_address = <30>;
++			phy-i2c-mode; /*i2c access phy */
++			media-type = "sfp"; /* fiber mode */
++		};
++		port@5 {
++			port_id = <6>;
++			phy_address = <0>;
++			ethernet-phy-ieee802.3-c45;
++		};
++	};
++	port_scheduler_resource {
++
++		port@0 {
++			port_id = < 0x00 >;
++			ucast_queue = < 0x00 0x8f >;
++			mcast_queue = < 0x100 0x10f >;
++			l0sp = < 0x00 0x23 >;
++			l0cdrr = < 0x00 0x2f >;
++			l0edrr = < 0x00 0x2f >;
++			l1cdrr = < 0x00 0x07 >;
++			l1edrr = < 0x00 0x07 >;
++		};
++
++		port@1 {
++			port_id = < 0x01 >;
++			ucast_queue = < 0x90 0x9f >;
++			mcast_queue = < 0x110 0x113 >;
++			l0sp = < 0x24 0x27 >;
++			l0cdrr = < 0x30 0x3f >;
++			l0edrr = < 0x30 0x3f >;
++			l1cdrr = < 0x08 0x0b >;
++			l1edrr = < 0x08 0x0b >;
++		};
++
++		port@2 {
++			port_id = < 0x02 >;
++			ucast_queue = < 0xa0 0xaf >;
++			mcast_queue = < 0x114 0x117 >;
++			l0sp = < 0x28 0x2b >;
++			l0cdrr = < 0x40 0x4f >;
++			l0edrr = < 0x40 0x4f >;
++			l1cdrr = < 0x0c 0x0f >;
++			l1edrr = < 0x0c 0x0f >;
++		};
++
++		port@3 {
++			port_id = < 0x03 >;
++			ucast_queue = < 0xb0 0xbf >;
++			mcast_queue = < 0x118 0x11b >;
++			l0sp = < 0x2c 0x2f >;
++			l0cdrr = < 0x50 0x5f >;
++			l0edrr = < 0x50 0x5f >;
++			l1cdrr = < 0x10 0x13 >;
++			l1edrr = < 0x10 0x13 >;
++		};
++
++		port@4 {
++			port_id = < 0x04 >;
++			ucast_queue = < 0xc0 0xcf >;
++			mcast_queue = < 0x11c 0x11f >;
++			l0sp = < 0x30 0x33 >;
++			l0cdrr = < 0x60 0x6f >;
++			l0edrr = < 0x60 0x6f >;
++			l1cdrr = < 0x14 0x17 >;
++			l1edrr = < 0x14 0x17 >;
++		};
++
++		port@5 {
++			port_id = < 0x05 >;
++			ucast_queue = < 0xd0 0xdf >;
++			mcast_queue = < 0x120 0x123 >;
++			l0sp = < 0x34 0x37 >;
++			l0cdrr = < 0x70 0x7f >;
++			l0edrr = < 0x70 0x7f >;
++			l1cdrr = < 0x18 0x1b >;
++			l1edrr = < 0x18 0x1b >;
++		};
++
++		port@6 {
++			port_id = < 0x06 >;
++			ucast_queue = < 0xe0 0xef >;
++			mcast_queue = < 0x124 0x127 >;
++			l0sp = < 0x38 0x3b >;
++			l0cdrr = < 0x80 0x8f >;
++			l0edrr = < 0x80 0x8f >;
++			l1cdrr = < 0x1c 0x1f >;
++			l1edrr = < 0x1c 0x1f >;
++		};
++
++		port@7 {
++			port_id = < 0x07 >;
++			ucast_queue = < 0xf0 0xff >;
++			mcast_queue = < 0x128 0x12b >;
++			l0sp = < 0x3c 0x3f >;
++			l0cdrr = < 0x90 0x9f >;
++			l0edrr = < 0x90 0x9f >;
++			l1cdrr = < 0x20 0x23 >;
++			l1edrr = < 0x20 0x23 >;
++		};
++	};
++
++	port_scheduler_config {
++
++		port@0 {
++			port_id = < 0x00 >;
++
++			l1scheduler {
++
++				group@0 {
++					sp = < 0x00 0x01 >;
++					cfg = < 0x00 0x00 0x00 0x00 >;
++				};
++			};
++
++			l0scheduler {
++
++				group@0 {
++					ucast_queue = < 0x00 0x04 0x08 >;
++					mcast_queue = < 0x100 0x104 >;
++					cfg = < 0x00 0x00 0x00 0x00 0x00 >;
++				};
++
++				group@1 {
++					ucast_queue = < 0x01 0x05 0x09 >;
++					mcast_queue = < 0x101 0x105 >;
++					cfg = < 0x00 0x01 0x01 0x01 0x01 >;
++				};
++
++				group@2 {
++					ucast_queue = < 0x02 0x06 0x0a >;
++					mcast_queue = < 0x102 0x106 >;
++					cfg = < 0x00 0x02 0x02 0x02 0x02 >;
++				};
++
++				group@3 {
++					ucast_queue = < 0x03 0x07 0x0b >;
++					mcast_queue = < 0x103 0x107 >;
++					cfg = < 0x00 0x03 0x03 0x03 0x03 >;
++				};
++			};
++		};
++
++		port@1 {
++			port_id = < 0x01 >;
++
++			l1scheduler {
++
++				group@0 {
++					sp = < 0x24 >;
++					cfg = < 0x00 0x08 0x00 0x08 >;
++				};
++
++				group@1 {
++					sp = < 0x25 >;
++					cfg = < 0x01 0x09 0x01 0x09 >;
++				};
++			};
++
++			l0scheduler {
++
++				group@0 {
++					ucast_queue = < 0x90 >;
++					ucast_loop_pri = < 0x10 >;
++					mcast_queue = < 0x110 >;
++					mcast_loop_pri = < 0x04 >;
++					cfg = < 0x24 0x00 0x30 0x00 0x30 >;
++				};
++			};
++		};
++
++		port@2 {
++			port_id = < 0x02 >;
++
++			l1scheduler {
++
++				group@0 {
++					sp = < 0x28 >;
++					cfg = < 0x00 0x0c 0x00 0x0c >;
++				};
++
++				group@1 {
++					sp = < 0x29 >;
++					cfg = < 0x01 0x0d 0x01 0x0d >;
++				};
++			};
++
++			l0scheduler {
++
++				group@0 {
++					ucast_queue = < 0xa0 >;
++					ucast_loop_pri = < 0x10 >;
++					mcast_queue = < 0x114 >;
++					mcast_loop_pri = < 0x04 >;
++					cfg = < 0x28 0x00 0x40 0x00 0x40 >;
++				};
++			};
++		};
++
++		port@3 {
++			port_id = < 0x03 >;
++
++			l1scheduler {
++
++				group@0 {
++					sp = < 0x2c >;
++					cfg = < 0x00 0x10 0x00 0x10 >;
++				};
++
++				group@1 {
++					sp = < 0x2d >;
++					cfg = < 0x01 0x11 0x01 0x11 >;
++				};
++			};
++
++			l0scheduler {
++
++				group@0 {
++					ucast_queue = < 0xb0 >;
++					ucast_loop_pri = < 0x10 >;
++					mcast_queue = < 0x118 >;
++					mcast_loop_pri = < 0x04 >;
++					cfg = < 0x2c 0x00 0x50 0x00 0x50 >;
++				};
++			};
++		};
++
++		port@4 {
++			port_id = < 0x04 >;
++
++			l1scheduler {
++
++				group@0 {
++					sp = < 0x30 >;
++					cfg = < 0x00 0x14 0x00 0x14 >;
++				};
++
++				group@1 {
++					sp = < 0x31 >;
++					cfg = < 0x01 0x15 0x01 0x15 >;
++				};
++			};
++
++			l0scheduler {
++
++				group@0 {
++					ucast_queue = < 0xc0 >;
++					ucast_loop_pri = < 0x10 >;
++					mcast_queue = < 0x11c >;
++					mcast_loop_pri = < 0x04 >;
++					cfg = < 0x30 0x00 0x60 0x00 0x60 >;
++				};
++			};
++		};
++
++		port@5 {
++			port_id = < 0x05 >;
++
++			l1scheduler {
++
++				group@0 {
++					sp = < 0x34 >;
++					cfg = < 0x00 0x18 0x00 0x18 >;
++				};
++
++				group@1 {
++					sp = < 0x35 >;
++					cfg = < 0x01 0x19 0x01 0x19 >;
++				};
++			};
++
++			l0scheduler {
++
++				group@0 {
++					ucast_queue = < 0xd0 >;
++					ucast_loop_pri = < 0x10 >;
++					mcast_queue = < 0x120 >;
++					mcast_loop_pri = < 0x04 >;
++					cfg = < 0x34 0x00 0x70 0x00 0x70 >;
++				};
++			};
++		};
++
++		port@6 {
++			port_id = < 0x06 >;
++
++			l1scheduler {
++
++				group@0 {
++					sp = < 0x38 >;
++					cfg = < 0x00 0x1c 0x00 0x1c >;
++				};
++
++				group@1 {
++					sp = < 0x39 >;
++					cfg = < 0x01 0x1d 0x01 0x1d >;
++				};
++			};
++
++			l0scheduler {
++
++				group@0 {
++					ucast_queue = < 0xe0 >;
++					ucast_loop_pri = < 0x10 >;
++					mcast_queue = < 0x124 >;
++					mcast_loop_pri = < 0x04 >;
++					cfg = < 0x38 0x00 0x80 0x00 0x80 >;
++				};
++			};
++		};
++
++		port@7 {
++			port_id = < 0x07 >;
++
++			l1scheduler {
++
++				group@0 {
++					sp = < 0x3c >;
++					cfg = < 0x00 0x20 0x00 0x20 >;
++				};
++
++				group@1 {
++					sp = < 0x3d >;
++					cfg = < 0x01 0x21 0x01 0x21 >;
++				};
++			};
++
++			l0scheduler {
++
++				group@0 {
++					ucast_queue = < 0xf0 >;
++					ucast_loop_pri = < 0x10 >;
++					mcast_queue = < 0x128 >;
++					cfg = < 0x3c 0x00 0x90 0x00 0x90 >;
++				};
++			};
++		};
++	};
++};
++
++
++&soc {
++
++		phy@86000 {
++			status = "okay";
++		};
++		
++		sd-pwrseq {
++			status = "okay";
++		};
++
++		sdhci@7864900 {
++			pinctrl-0 = <&sd_pins>;
++			pinctrl-names = "default";
++			cd-gpios = <&tlmm 63 GPIO_ACTIVE_LOW>;
++			status = "okay";
++		};
++
++		pwm {
++			pinctrl-0 = <&pwm_pins>;
++			pinctrl-names = "default";
++			used-pwm-indices = <1>, <0>, <0>, <0>;
++			status = "disabled";
++		};
++
++		// qcom,test@0 {
++		// 	status = "okay";
++		// };
++
++
++		dp1: 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 = <16>;
++			phy-mode = "sgmii";
++			mdio-bus = <&mdio>;
++		};
++
++		dp2: 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 = <17>;
++			phy-mode = "sgmii";
++			mdio-bus = <&mdio>;
++		};
++
++		dp3: 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 = <18>;
++			phy-mode = "sgmii";
++			mdio-bus = <&mdio>;
++		};
++
++		dp4: 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 = <19>;
++			phy-mode = "sgmii";
++			mdio-bus = <&mdio>;
++		};
++
++		dp5: 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 = <30>;
++			phy-mode = "sgmii";
++			mdio-bus = <&mdio>;
++		};
++
++		dp6: dp6 {
++			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";
++			mdio-bus = <&mdio>;
++		};
++		
++		// qcn9000_pcie0: qcn9000_pcie0@51100000 {
++		// 	no-map;
++		// 	reg = <0x0 0x51100000 0x0 0x02D00000>;
++		// };
++
++		wifi1: wifi1@f00000 {
++
++			compatible  = "qcom,cnss-qcn9000";
++			qcom,wlan-ramdump-dynamic = <0x400000>;
++			mhi,max-channels = <30>;
++			mhi,timeout = <10000>;
++			qrtr_node_id = <0x20>;
++			qca,auto-restart;
++
++			pcie0_mhi: pcie0_mhi {
++				status = "ok";
++			};
++
++		};
++};
++
++&wifi {
++	status = "okay";
++	qcom,board_id = <528>;
++	qcom,ath11k-calibration-variant = "TL-XTR10890";
++};
++
++&wifi1 {
++	base-addr = <0x51100000>;
++	m3-dump-addr = <0x53400000>;
++	etr-addr = <0x53500000>;
++	caldb-addr = <0x53600000>;
++	hremote-size = <0x2300000>;
++	tgt-mem-mode = <0x0>;
++	caldb-size = <0x800000>;
++	hremote_node = <&qcn9000_pcie0>;
++	pageable-size = <0x800000>;
++	board_id = <171>;
++	qcom,ath11k-calibration-variant = "TL-XTR10890";
++	status = "ok";
++};
+diff --git a/target/linux/ipq807x/image/generic.mk b/target/linux/ipq807x/image/generic.mk
+index e8440c83ce02..b853ae4338d0 100644
+--- a/target/linux/ipq807x/image/generic.mk
++++ b/target/linux/ipq807x/image/generic.mk
+@@ -44,3 +44,16 @@ define Device/zte_mf269
+ 	DEVICE_PACKAGES := ipq-wifi-zte_mf269 uboot-envtools
+ endef
+ TARGET_DEVICES += zte_mf269
++
++define Device/tplink_xtr10890
++	$(call Device/FitImage)
++	$(call Device/UbiFit)
++	DEVICE_VENDOR := TPLINK
++	DEVICE_MODEL := XTR10890
++	BLOCKSIZE := 128k
++	PAGESIZE := 2048
++	DEVICE_DTS_CONFIG := [email protected]
++	SOC := ipq8078
++	DEVICE_PACKAGES := ipq-wifi-tplink_xtr10890 uboot-envtools
++endef
++TARGET_DEVICES += tplink_xtr10890

+ 738 - 0
devices/ipq807x_generic/patches/03-tplink_tl-er2260t.patch

@@ -0,0 +1,738 @@
+diff --git a/target/linux/ipq807x/base-files/etc/board.d/01_leds b/target/linux/ipq807x/base-files/etc/board.d/01_leds
+index e63ef959caff..fd998f0b3c21 100644
+--- a/target/linux/ipq807x/base-files/etc/board.d/01_leds
++++ b/target/linux/ipq807x/base-files/etc/board.d/01_leds
+@@ -11,6 +11,10 @@ xiaomi,ax3600|\
+ redmi,ax6)
+ 	ucidef_set_led_netdev "wan" "WAN" "blue:network" "eth0"
+ 	;;
++tplink,tl-er2260t)
++	ucidef_set_led_netdev "SFP1_active" "SFP1_ACTIVE" "green:sfp1" "eth5"
++	ucidef_set_led_netdev "SFP2_active" "SFP2_ACTIVE" "green:sfp2" "eth4"
++	;;
+ qnap,301w)
+ 	ucidef_set_led_netdev "lan1" "LAN1" "green:lan1" "eth0"
+ 	ucidef_set_led_netdev "lan2" "LAN2" "green:lan2" "eth1"
+diff --git a/target/linux/ipq807x/base-files/etc/board.d/02_network b/target/linux/ipq807x/base-files/etc/board.d/02_network
+index 40c2d1de1a34..99745cdf4933 100644
+--- a/target/linux/ipq807x/base-files/etc/board.d/02_network
++++ b/target/linux/ipq807x/base-files/etc/board.d/02_network
+@@ -21,6 +21,9 @@ ipq807x_setup_interfaces()
+ 	zte,mf269)
+ 		ucidef_set_interfaces_lan_wan "eth0" "eth1"
+ 		;;
++	tplink,tl-er2260t)
++		ucidef_set_interfaces_lan_wan "eth0 eth1 eth2 eth3 eth5" "eth4"
++		;;
+ 	tplink,xtr10890)
+ 		ucidef_set_interfaces_lan_wan "eth0 eth1 eth2 eth3 eth4" "eth5"
+ 		;;
+diff --git a/target/linux/ipq807x/base-files/lib/upgrade/platform.sh b/target/linux/ipq807x/base-files/lib/upgrade/platform.sh
+index 09b243a2dde8..ea2e8becf10c 100644
+--- a/target/linux/ipq807x/base-files/lib/upgrade/platform.sh
++++ b/target/linux/ipq807x/base-files/lib/upgrade/platform.sh
+@@ -46,6 +46,7 @@ platform_do_upgrade() {
+ 	zte,mf269)
+ 		nand_do_upgrade "$1"
+ 		;;
++	tplink,tl-er2260t|\
+ 	tplink,xtr10890)
+ 		nand_do_upgrade "$1"
+ 		;;
+diff --git a/target/linux/ipq807x/files-5.15/arch/arm64/boot/dts/qcom/ipq8070-tl-er2260t.dts b/target/linux/ipq807x/files-5.15/arch/arm64/boot/dts/qcom/ipq8070-tl-er2260t.dts
+new file mode 100644
+index 000000000000..fb6d4b831473
+--- /dev/null
++++ b/target/linux/ipq807x/files-5.15/arch/arm64/boot/dts/qcom/ipq8070-tl-er2260t.dts
+@@ -0,0 +1,666 @@
++// SPDX-License-Identifier: GPL-2.0-only
++/* Copyright (c) 2020 The Linux Foundation. All rights reserved.
++ */
++
++/dts-v1/;
++
++#include "ipq8074.dtsi"
++#include "ipq8074-ess.dtsi"
++#include "ipq8074-hk-cpu.dtsi"
++#include <dt-bindings/gpio/gpio.h>
++#include <dt-bindings/input/input.h>
++#include <dt-bindings/leds/common.h>
++/ {
++	#address-cells = <0x2>;
++	#size-cells = <0x2>;
++	model = "TP-Link TL-ER2260T";
++	compatible = "tplink,tl-er2260t", "qcom,ipq8074";
++	qcom,msm-id = <0x143 0x0>;
++	interrupt-parent = <&intc>;
++
++	aliases {
++		led-boot = &led_sys;
++		led-failsafe = &led_sys;
++		led-running = &led_sys;
++		led-upgrade = &led_sys;
++		serial0 = &blsp1_uart5;
++
++		ethernet0 = "/soc/dp1";
++		ethernet1 = "/soc/dp2";
++		ethernet2 = "/soc/dp3";
++		ethernet3 = "/soc/dp4";
++		ethernet4 = "/soc/dp5";
++		ethernet5 = "/soc/dp6";
++	};
++
++	chosen {
++		stdout-path = "serial0";
++		bootargs-append = " root=/dev/ubiblock0_1";
++	};
++
++	gpio_keys {
++		compatible = "gpio-keys";
++		pinctrl-0 = <&button_pins>;
++		pinctrl-names = "default";
++
++		reset {
++			label = "reset";
++			linux,code = <KEY_RESTART>;
++			gpios = <&tlmm 50 GPIO_ACTIVE_LOW>;
++			linux,input-type = <1>;
++			debounce-interval = <60>;
++		};
++	};
++
++	leds {
++		compatible = "gpio-leds";
++		pinctrl-0 = <&leds_pins>;
++		pinctrl-names = "default";
++
++		led_sys: sys {
++			label = "green:sys";
++			gpios = <&tlmm 21 GPIO_ACTIVE_HIGH>;
++		};
++
++		usb {
++			label = "green:usb";
++			gpios = <&tlmm 22 GPIO_ACTIVE_HIGH>;
++			linux,default-trigger = "usbport";
++		};
++
++		sfp1-green {
++			label = "green:sfp1";
++			gpios = <&tlmm 51 GPIO_ACTIVE_HIGH>;
++		};
++
++		sfp2-green {
++			label = "green:sfp2";
++			gpios = <&tlmm 55 GPIO_ACTIVE_HIGH>;
++		};
++	};
++	
++	spi@78b5000 {
++		status = "ok";
++		pinctrl-0 = <&spi_0_pins>;
++		pinctrl-names = "default";
++		cs-select = <0>;
++
++		m25p80@0 {
++			  compatible = "n25q128a11";
++			  #address-cells = <1>;
++			  #size-cells = <1>;
++			  reg = <0>;
++			  spi-max-frequency = <50000000>;
++		};
++	};
++};
++
++&tlmm {
++	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 = "gpio44";
++			function = "gpio";
++			bias-pull-up;
++		};
++	};
++
++	i2c_1_pins: i2c_1_pins {
++		pins = "gpio46", "gpio47";
++		function = "blsp2_i2c";
++		drive-strength = <8>;
++		bias-disable;
++	};
++
++	button_pins: button_pins {
++		reset {
++			pins = "gpio50";
++			function = "gpio";
++			drive-strength = <8>;
++			bias-pull-up;
++		};
++	};
++
++	uniphy_pins: uniphy_pinmux {
++		mux {
++			pins = "gpio60";
++			function = "rx2";
++			bias-disable;
++		};
++		sfp_tx {
++			pins = "gpio59";
++			function = "gpio";
++			drive-strength = <8>;
++			bias-pull-down;
++			output-high;
++		};
++	};
++
++	leds_pins: leds_pinmux {
++		mux {
++			pins = "gpio21", "gpio22", "gpio65";
++			function = "gpio";
++			drive-strength = <8>;
++			bias-pull-down;
++		};
++		led_sfp1_active {
++			pins = "gpio51";
++			function = "gpio";
++			drive-strength = <8>;
++			bias-pull-down;
++		};
++		led_sfp2_active {
++			pins = "gpio55";
++			function = "gpio";
++			drive-strength = <8>;
++			bias-pull-down;
++		};
++	};
++};
++
++&mdio {
++	status = "okay";
++	pinctrl-0 = <&mdio_pins>;
++	pinctrl-names = "default";
++	reset-gpios = <&tlmm 37 GPIO_ACTIVE_LOW>;
++
++	phy0:ethernet-phy@0 {
++		compatible = "ethernet-phy-ieee802.3-c22";
++		reg = <0>;
++	};
++	phy1:ethernet-phy@1 {
++		compatible = "ethernet-phy-ieee802.3-c22";
++		reg = <1>;
++	};
++	phy2:ethernet-phy@2 {
++		compatible = "ethernet-phy-ieee802.3-c22";
++		reg = <2>;
++	};
++	phy3:ethernet-phy@3 {
++		compatible = "ethernet-phy-ieee802.3-c22";
++		reg = <3>;
++	};
++	phy4: ethernet-phy@29 {
++		reg = <29>;
++	};
++	phy5: ethernet-phy@30 {
++		reg = <30>;
++	};
++};
++
++&switch {
++	status = "okay";
++	switch_cpu_bmp = <0x1>;  /* cpu port bitmap */
++	switch_lan_bmp = <0x3e>; /* lan port bitmap */
++	switch_wan_bmp = <0x40>; /* wan port bitmap */
++	switch_mac_mode = <0xb>; /* mac mode for uniphy instance0*/
++	switch_mac_mode1 = <0xe>; /* mac mode for uniphy instance1*/ //use 10g_baser mode for default
++	switch_mac_mode2 = <0xe>; /* mac mode for uniphy instance2*/ //use 10g_baser mode for default
++	bm_tick_mode = <0>; /* bm tick mode */
++	tm_tick_mode = <0>; /* tm tick mode */
++	cmnblk_clk = "external_50MHz";
++
++	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 = <29>;//29
++			phy_i2c_address = <29>;//29
++			phy-i2c-mode; /*i2c access phy */
++			media-type = "sfp"; /* fiber mode */
++		};
++		port@5 {
++			port_id = <6>;
++			phy_address = <30>;//30
++			phy_i2c_address = <30>;//30
++			phy-i2c-mode; /*i2c access phy */
++			media-type = "sfp"; /* fiber 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>;
++				};
++			};
++		};
++	};
++};
++
++&soc {
++	dp1: 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";
++		mdio-bus = <&mdio>;
++	};
++	dp2: 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";
++		mdio-bus = <&mdio>;
++	};
++	dp3: 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";
++		mdio-bus = <&mdio>;
++	};
++	dp4: 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";
++		mdio-bus = <&mdio>;
++	};
++	dp5: dp5 {
++		device_type = "network";
++		compatible = "qcom,nss-dp";
++		qcom,id = <5>;
++		reg = <0x3a001800 0x200>;
++		qcom,mactype = <1>;
++		local-mac-address = [000000000000];
++		qcom,link-poll = <1>;
++		qcom,phy-mdio-addr = <29>;
++		phy-mode = "sgmii";
++		mdio-bus = <&mdio>;
++	};
++	dp6: dp6 {
++		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 = <30>;
++		phy-mode = "sgmii";
++		mdio-bus = <&mdio>;
++	};
++	
++	nss-macsec1 {
++		compatible = "qcom,nss-macsec";
++		phy_addr = <0x1c>;
++		phy_access_mode = <0x00>;
++		mdiobus = <&mdio>;
++	};
++
++	watchdog@b017000 {
++		compatible = "qcom,kpss-wdt-ipq807x";
++		reg = <0xb017000 0x1000>;
++		reg-names = "kpss_wdt";
++		interrupt-names = "bark_irq";
++		interrupts = <0x00 0x03 0x00>;
++		clocks = <&sleep_clk>;
++		timeout-sec = <0x0a>;
++		wdt-max-timeout = <0x20>;
++	};
++};
++
++&blsp1_i2c2 {
++	status = "okay";
++};
++
++&blsp1_i2c3 {
++	pinctrl-0 = <&i2c_1_pins>;
++	pinctrl-names = "default";
++	status = "okay";
++};
++
++&blsp1_uart5 {
++	status = "okay";
++};
++
++&cryptobam {
++	status = "okay";
++};
++
++&crypto {
++	status = "okay";
++};
++
++&qpic_bam {
++	status = "okay";
++};
++
++&qpic_nand {
++	status = "okay";
++
++	nand@0 {
++		reg = <0>;
++		#address-cells = <1>;
++		#size-cells = <1>;
++		nand-ecc-strength = <4>;
++		nand-ecc-step-size = <512>;
++		nand-bus-width = <8>;
++
++		partitions {
++			compatible = "qcom,smem-part";
++		};
++	};
++};
++
++&qusb_phy_0 {
++	status = "okay";
++};
++
++&ssphy_0 {
++	status = "okay";
++};
++
++&usb_0 {
++	status = "okay";
++};
+
+diff --git a/target/linux/ipq807x/image/generic.mk b/target/linux/ipq807x/image/generic.mk
+index b853ae4338d0..8cbf99f7586e 100644
+--- a/target/linux/ipq807x/image/generic.mk
++++ b/target/linux/ipq807x/image/generic.mk
+@@ -45,6 +45,19 @@ define Device/zte_mf269
+ endef
+ TARGET_DEVICES += zte_mf269
+ 
++define Device/tplink_tl-er2260t
++	$(call Device/FitImage)
++	$(call Device/UbiFit)  
++	DEVICE_DTS := ipq8070-tl-er2260t
++	DEVICE_DTS_CONFIG := config@hk07
++	BLOCKSIZE := 128k
++	PAGESIZE := 2048
++	BOARD_NAME := tplink,tl-er2260t
++	DEVICE_TITLE := TPLINK TL-ER2260T
++	DEVICE_PACKAGES := qca-ssdk-shell
++endef
++TARGET_DEVICES += tplink_tl-er2260t
++
+ define Device/tplink_xtr10890
+ 	$(call Device/FitImage)
+ 	$(call Device/UbiFit)

+ 0 - 0
devices/ipq807x_generic/patches/stock.patch → devices/ipq807x_generic/patches/04-stock.patch


+ 26 - 0
devices/ipq807x_ipq60xx/patches/iptables-mod-socket.patch

@@ -0,0 +1,26 @@
+--- a/package/network/utils/iptables/Makefile
++++ b/package/network/utils/iptables/Makefile
+@@ -394,4 +394,17 @@
+ endef
+ 
++define Package/iptables-mod-socket
++$(call Package/iptables/Module, +kmod-ipt-socket)
++  TITLE:=Socket match iptables extensions
++endef
++
++define Package/iptables-mod-socket/description
++Socket match iptables extensions.
++
++ Matches:
++  - socket
++
++endef
++
+ define Package/iptables-mod-tproxy
+ $(call Package/iptables/Module, +kmod-ipt-tproxy)
+@@ -679,4 +692,5 @@
+ $(eval $(call BuildPlugin,iptables-mod-rpfilter,$(IPT_RPFILTER-m)))
+ $(eval $(call BuildPlugin,iptables-mod-led,$(IPT_LED-m)))
++$(eval $(call BuildPlugin,iptables-mod-socket,$(IPT_SOCKET-m)))
+ $(eval $(call BuildPlugin,iptables-mod-tproxy,$(IPT_TPROXY-m)))
+ $(eval $(call BuildPlugin,iptables-mod-tee,$(IPT_TEE-m)))

+ 1 - 1
devices/mediatek_filogic/diy.sh

@@ -2,4 +2,4 @@
 
 shopt -s extglob
 
-sh -c "curl -sfL https://patch-diff.githubusercontent.com/raw/openwrt/openwrt/pull/11115.patch | patch -d './' -p1 --forward"
+#sh -c "curl -sfL https://patch-diff.githubusercontent.com/raw/openwrt/openwrt/pull/11115.patch | patch -d './' -p1 --forward"

+ 0 - 411
devices/mediatek_filogic/patches/360t7.patch

@@ -1,411 +0,0 @@
-From 0e0de4f8b35a36d170c80cd54498d65dacdade18 Mon Sep 17 00:00:00 2001
-From: Tianling Shen <[email protected]>
-Date: Fri, 12 May 2023 18:00:42 +0800
-Subject: [PATCH] mediatek: add Qihoo 360 T7 support
-
-Co-authored-by: Chen Minqiang <[email protected]>
-Signed-off-by: Tianling Shen <[email protected]>
----
- .../uboot-envtools/files/mediatek_filogic     |   4 +-
- .../dts/mt7981b-qihoo-360-t7-stock.dts         |  26 ++
- .../dts/mt7981b-qihoo-360-t7-ubootmod.dts      |  16 ++
- .../mediatek/dts/mt7981b-qihoo-360-t7.dtsi     | 238 ++++++++++++++++++
- .../filogic/base-files/etc/board.d/02_network |   9 +-
- .../etc/hotplug.d/ieee80211/11_fix_wifi_mac   |   5 +
- target/linux/mediatek/image/filogic.mk        |  32 +++
- 7 files changed, 328 insertions(+), 2 deletions(-)
- create mode 100644 target/linux/mediatek/dts/mt7981b-qihoo-360-t7-stock.dts
- create mode 100644 target/linux/mediatek/dts/mt7981b-qihoo-360-t7-ubootmod.dts
- create mode 100644 target/linux/mediatek/dts/mt7981b-qihoo-360-t7.dtsi
-
-diff --git a/package/boot/uboot-envtools/files/mediatek_filogic b/package/boot/uboot-envtools/files/mediatek_filogic
-index 50b9cd0e4631c..739a6f007e23a 100644
---- a/package/boot/uboot-envtools/files/mediatek_filogic
-+++ b/package/boot/uboot-envtools/files/mediatek_filogic
-@@ -37,6 +37,10 @@ bananapi,bpi-r3)
- 		;;
- 	esac
- 	;;
-+qihoo,360-t7-stock|\
-+qihoo,360-t7-ubootmod)
-+	ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x20000" "1"
-+	;;
- xiaomi,redmi-router-ax6000-stock)
- 	ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x10000" "0x20000"
- 	ubootenv_add_uci_sys_config "/dev/mtd2" "0x0" "0x10000" "0x20000"
-diff --git a/target/linux/mediatek/dts/mt7981b-qihoo-360-t7-stock.dts b/target/linux/mediatek/dts/mt7981b-qihoo-360-t7-stock.dts
-new file mode 100644
-index 00000000000..9311ccc6f01
---- /dev/null
-+++ b/target/linux/mediatek/dts/mt7981b-qihoo-360-t7-stock.dts
-@@ -0,0 +1,26 @@
-+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
-+
-+/dts-v1/;
-+#include "mt7981b-qihoo-360-t7.dtsi"
-+
-+/ {
-+	model = "Qihoo 360 T7 (stock layout)";
-+	compatible = "qihoo,360-t7-stock", "mediatek,mt7981";
-+};
-+
-+&partitions {
-+	partition@580000 {
-+		label = "ubi";
-+		reg = <0x580000 0x2400000>;
-+	};
-+
-+	partition@2980000 {
-+		label = "firmware-1";
-+		reg = <0x2980000 0x2400000>;
-+	};
-+
-+	partition@4D80000 {
-+		label = "plugin";
-+		reg = <0x4d80000 0x2400000>;
-+	};
-+};
-diff --git a/target/linux/mediatek/dts/mt7981b-qihoo-360-t7-ubootmod.dts b/target/linux/mediatek/dts/mt7981b-qihoo-360-t7-ubootmod.dts
-new file mode 100644
-index 00000000000..6e009509fd5
---- /dev/null
-+++ b/target/linux/mediatek/dts/mt7981b-qihoo-360-t7-ubootmod.dts
-@@ -0,0 +1,16 @@
-+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
-+
-+/dts-v1/;
-+#include "mt7981b-qihoo-360-t7.dtsi"
-+
-+/ {
-+	model = "Qihoo 360 T7 (modified U-Boot layout)";
-+	compatible = "qihoo,360-t7-ubootmod", "mediatek,mt7981";
-+};
-+
-+&partitions {
-+	partition@580000 {
-+		label = "ubi";
-+		reg = <0x580000 0x6c00000>;
-+	};
-+};
-diff --git a/target/linux/mediatek/dts/mt7981b-qihoo-360-t7.dtsi b/target/linux/mediatek/dts/mt7981b-qihoo-360-t7.dtsi
-new file mode 100644
-index 00000000000..387712ec330
---- /dev/null
-+++ b/target/linux/mediatek/dts/mt7981b-qihoo-360-t7.dtsi
-@@ -0,0 +1,242 @@
-+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
-+
-+/dts-v1/;
-+#include "mt7981.dtsi"
-+
-+/ {
-+	aliases {
-+		led-boot = &red_led;
-+		led-failsafe = &red_led;
-+		led-running = &green_led;
-+		led-upgrade = &green_led;
-+		serial0 = &uart0;
-+	};
-+
-+	chosen {
-+		stdout-path = "serial0:115200n8";
-+	};
-+
-+	gpio-keys {
-+		compatible = "gpio-keys";
-+
-+		button-reset {
-+			label = "reset";
-+			linux,code = <KEY_RESTART>;
-+			gpios = <&pio 1 GPIO_ACTIVE_LOW>;
-+		};
-+
-+		button-wps {
-+			label = "wps";
-+			linux,code = <KEY_WPS_BUTTON>;
-+			gpios = <&pio 0 GPIO_ACTIVE_LOW>;
-+		};
-+	};
-+
-+	gpio-leds {
-+		compatible = "gpio-leds";
-+
-+		red_led: led-0 {
-+			label = "red:system";
-+			gpios = <&pio 3 GPIO_ACTIVE_LOW>;
-+		};
-+
-+		green_led: led-1 {
-+			label = "green:system";
-+			gpios = <&pio 7 GPIO_ACTIVE_LOW>;
-+		};
-+	};
-+};
-+
-+&uart0 {
-+	status = "okay";
-+};
-+
-+&watchdog {
-+	status = "okay";
-+};
-+
-+&eth {
-+	pinctrl-names = "default";
-+	pinctrl-0 = <&mdio_pins>;
-+
-+	status = "okay";
-+
-+	gmac0: mac@0 {
-+		compatible = "mediatek,eth-mac";
-+		reg = <0>;
-+		phy-mode = "2500base-x";
-+
-+		nvmem-cells = <&macaddr_factory_14>;
-+		nvmem-cell-names = "mac-address-ascii";
-+
-+		fixed-link {
-+			speed = <2500>;
-+			full-duplex;
-+			pause;
-+		};
-+	};
-+};
-+
-+&mdio_bus {
-+	switch0: switch@0 {
-+		compatible = "mediatek,mt7531";
-+		reg = <31>;
-+		dsa,member = <0 0>;
-+		reset-gpios = <&pio 39 GPIO_ACTIVE_HIGH>;
-+		interrupt-controller;
-+		#interrupt-cells = <1>;
-+		interrupt-parent = <&pio>;
-+		interrupts = <38 IRQ_TYPE_LEVEL_HIGH>;
-+	};
-+};
-+
-+&switch0 {
-+	ports {
-+		#address-cells = <1>;
-+		#size-cells = <0>;
-+
-+		port@0 {
-+			reg = <0>;
-+			label = "lan1";
-+		};
-+
-+		port@1 {
-+			reg = <1>;
-+			label = "lan2";
-+		};
-+
-+		port@2 {
-+			reg = <2>;
-+			label = "lan3";
-+		};
-+
-+		port@3 {
-+			reg = <3>;
-+			label = "wan";
-+
-+			nvmem-cells = <&macaddr_factory_14>;
-+			nvmem-cell-names = "mac-address-ascii";
-+			mac-address-increment = <1>;
-+		};
-+
-+		port@6 {
-+			reg = <6>;
-+			ethernet = <&gmac0>;
-+			phy-mode = "2500base-x";
-+
-+			fixed-link {
-+				speed = <2500>;
-+				full-duplex;
-+				pause;
-+			};
-+		};
-+	};
-+};
-+
-+&spi0 {
-+	pinctrl-names = "default";
-+	pinctrl-0 = <&spi0_flash_pins>;
-+	status = "okay";
-+
-+	spi_nand: flash@0 {
-+		#address-cells = <1>;
-+		#size-cells = <1>;
-+		compatible = "spi-nand";
-+		reg = <0>;
-+		spi-max-frequency = <52000000>;
-+
-+		spi-cal-enable;
-+		spi-cal-mode = "read-data";
-+		spi-cal-datalen = <7>;
-+		spi-cal-data = /bits/ 8 <0x53 0x50 0x49 0x4E 0x41 0x4E 0x44>;
-+		spi-cal-addrlen = <5>;
-+		spi-cal-addr = /bits/ 32 <0x0 0x0 0x0 0x0 0x0>;
-+
-+		spi-tx-buswidth = <4>;
-+		spi-rx-buswidth = <4>;
-+		mediatek,nmbm;
-+		mediatek,bmt-max-ratio = <1>;
-+		mediatek,bmt-max-reserved-blocks = <64>;
-+
-+		partitions: partitions {
-+			compatible = "fixed-partitions";
-+			#address-cells = <1>;
-+			#size-cells = <1>;
-+
-+			partition@0 {
-+				label = "BL2";
-+				reg = <0x00 0x100000>;
-+			};
-+
-+			partition@100000 {
-+				label = "u-boot-env";
-+				reg = <0x100000 0x80000>;
-+			};
-+
-+			factory: partition@180000 {
-+				label = "Factory";
-+				reg = <0x180000 0x200000>;
-+			};
-+
-+			partition@380000 {
-+				label = "FIP";
-+				reg = <0x380000 0x200000>;
-+			};
-+
-+			partition@7180000 {
-+				label = "stock-config";
-+				reg = <0x7180000 0x100000>;
-+			};
-+
-+			partition@7280000 {
-+				label = "stock-factory";
-+				reg = <0x7280000 0x80000>;
-+
-+				compatible = "nvmem-cells";
-+				#address-cells = <1>;
-+				#size-cells = <1>;
-+
-+				macaddr_factory_14: macaddr@14 {
-+					reg = <0x14 0x11>;
-+				};
-+
-+			};
-+
-+			partition@7300000 {
-+				label = "stock-log";
-+				reg = <0x7300000 0x400000>;
-+			};
-+		};
-+	};
-+};
-+
-+&pio {
-+	spi0_flash_pins: spi0-pins {
-+		mux {
-+			function = "spi";
-+			groups = "spi0", "spi0_wp_hold";
-+		};
-+
-+		conf-pu {
-+			pins = "SPI0_CS", "SPI0_HOLD", "SPI0_WP";
-+			drive-strength = <MTK_DRIVE_8mA>;
-+			bias-pull-up = <MTK_PUPD_SET_R1R0_11>;
-+		};
-+
-+		conf-pd {
-+			pins = "SPI0_CLK", "SPI0_MOSI", "SPI0_MISO";
-+			drive-strength = <MTK_DRIVE_8mA>;
-+			bias-pull-down = <MTK_PUPD_SET_R1R0_11>;
-+		};
-+	};
-+};
-+
-+&wifi {
-+	mediatek,mtd-eeprom = <&factory 0x0>;
-+
-+	nvmem-cells = <&macaddr_factory_14>;
-+	nvmem-cell-names = "mac-address-ascii";
-+	mac-address-increment = <2>;
-+
-+	status = "okay";
-+};
-diff --git a/target/linux/mediatek/filogic/base-files/etc/board.d/02_network b/target/linux/mediatek/filogic/base-files/etc/board.d/02_network
-index 2fca00921b8ca..983aa9a83aa86 100644
---- a/target/linux/mediatek/filogic/base-files/etc/board.d/02_network
-+++ b/target/linux/mediatek/filogic/base-files/etc/board.d/02_network
-@@ -36,6 +36,10 @@ mediatek_setup_interfaces()
- 	tplink,tl-xdr6086)
- 		ucidef_set_interfaces_lan_wan "lan1 lan2" eth1
- 		;;
-+	qihoo,360-t7-stock|\
-+	qihoo,360-t7-ubootmod)
-+ 		ucidef_set_interfaces_lan_wan "lan1 lan2 lan3" wan
-+ 		;;
- 	xiaomi,redmi-router-ax6000-stock|\
- 	xiaomi,redmi-router-ax6000-ubootmod)
- 		ucidef_set_interfaces_lan_wan "lan2 lan3 lan4" wan
-diff --git a/target/linux/mediatek/filogic/base-files/etc/hotplug.d/ieee80211/11_fix_wifi_mac b/target/linux/mediatek/filogic/base-files/etc/hotplug.d/ieee80211/11_fix_wifi_mac
-index 29edea9c502..32853dcef4a 100644
---- a/target/linux/mediatek/filogic/base-files/etc/hotplug.d/ieee80211/11_fix_wifi_mac
-+++ b/target/linux/mediatek/filogic/base-files/etc/hotplug.d/ieee80211/11_fix_wifi_mac
-@@ -28,6 +28,11 @@ case "$board" in
- 		addr=$(mtd_get_mac_ascii config2 wifi5gmac)
- 		[ "$PHYNBR" = "1" ] && echo $macaddr > /sys${DEVPATH}/macaddress
- 		;;
-+	qihoo,360-t7-stock|\
-+	qihoo,360-t7-ubootmod)
-+		addr=$(macaddr_add $(cat /sys/class/net/eth0/address) 2)
-+		[ "$PHYNBR" = "1" ] && macaddr_setbit $addr 6 > /sys${DEVPATH}/macaddress
-+		;;
- 	tplink,tl-xdr4288|\
- 	tplink,tl-xdr6086|\
- 	tplink,tl-xdr6088)
-diff --git a/target/linux/mediatek/image/filogic.mk b/target/linux/mediatek/image/filogic.mk
-index 16c9ea2c130..d6fcb395dd9 100644
---- a/target/linux/mediatek/image/filogic.mk
-+++ b/target/linux/mediatek/image/filogic.mk
-@@ -162,6 +162,38 @@ define Device/mediatek_mt7986b-rfb
- endef
- TARGET_DEVICES += mediatek_mt7986b-rfb
- 
-+define Device/qihoo_360-t7-common
-+  DEVICE_VENDOR := Qihoo
-+  DEVICE_DTS_DIR := ../dts
-+  DEVICE_PACKAGES := kmod-mt7981-firmware mt7981-wo-firmware
-+  UBINIZE_OPTS := -E 5
-+  BLOCKSIZE := 128k
-+  PAGESIZE := 2048
-+  IMAGE_SIZE := 65536k
-+  KERNEL_IN_UBI := 1
-+  IMAGES += factory.bin
-+  IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)
-+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
-+  KERNEL = kernel-bin | lzma | \
-+	fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb
-+  KERNEL_INITRAMFS = kernel-bin | lzma | \
-+	fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd
-+endef
-+
-+define Device/qihoo_360-t7-stock
-+  DEVICE_MODEL := 360 T7 (stock layout)
-+  DEVICE_DTS := mt7981b-qihoo-360-t7-stock
-+  $(call Device/qihoo_360-t7-common)
-+endef
-+TARGET_DEVICES += qihoo_360-t7-stock
-+
-+define Device/qihoo_360-t7-ubootmod
-+  DEVICE_MODEL := 360 T7 (modified U-Boot layout)
-+  DEVICE_DTS := mt7981b-qihoo-360-t7-ubootmod
-+  $(call Device/qihoo_360-t7-common)
-+endef
-+TARGET_DEVICES += qihoo_360-t7-ubootmod
-+
- define Device/tplink_tl-xdr-common
-   DEVICE_VENDOR := TP-Link
-   DEVICE_DTS_DIR := ../dts

+ 2 - 1
devices/mediatek_mt7981/.config

@@ -6,7 +6,8 @@ CONFIG_TARGET_DEVICE_mediatek_mt7981_DEVICE_glinet_gl-mt2500=y
 CONFIG_TARGET_DEVICE_mediatek_mt7981_DEVICE_glinet_gl-x3000=y
 CONFIG_TARGET_DEVICE_mediatek_mt7981_DEVICE_glinet_gl-xe3000=y
 CONFIG_TARGET_DEVICE_mediatek_mt7981_DEVICE_mt7981-360-t7-108M=y
-CONFIG_TARGET_DEVICE_mediatek_mt7981_DEVICE_xiaomi_wr30u-112M=y
+CONFIG_TARGET_DEVICE_mediatek_mt7981_DEVICE_livinet_zr-3020=y
+CONFIG_TARGET_DEVICE_mediatek_mt7981_DEVICE_xiaomi_mi-router-wr30u-112m=y
 
 CONFIG_VERSION_DIST="OpenWrt"
 CONFIG_PACKAGE_kmod-nft-fullcone=n

+ 1 - 1
devices/mediatek_mt7981/diy.sh

@@ -4,7 +4,7 @@ shopt -s extglob
 
 SHELL_FOLDER=$(dirname $(readlink -f "$0"))
 
-rm -rf package/feeds/kiddin9/rtl*
+rm -rf package/feeds/kiddin9/rtl* package/feeds/packages/gptfdisk package/utils/f2fs-tools
 
 rm -rf devices/common/patches/{fix.patch,iptables.patch,kernel-defaults.patch,targets.patch}
 

+ 0 - 520
devices/mediatek_mt7981/patches/wr30u.patch

@@ -1,520 +0,0 @@
-From 2d50fec513fa86b93942881186526e27d00dde0c Mon Sep 17 00:00:00 2001
-From: upnd <[email protected]>
-Date: Thu, 6 Apr 2023 16:22:04 +0800
-Subject: [PATCH] mediatek: add support for Xiaomi WR30U
-
----
- target/linux/mediatek/base-files/sbin/smp.sh  |   1 +
- .../dts/mediatek/mt7981-xiaomi-wr30u-112M.dts |  64 +++++
- .../mediatek/mt7981-xiaomi-wr30u-base.dtsi    | 223 ++++++++++++++++++
- .../boot/dts/mediatek/mt7981-xiaomi-wr30u.dts |  79 +++++++
- target/linux/mediatek/image/mt7981.mk         |  34 +++
- .../mt7981/base-files/etc/board.d/01_leds     |   5 +
- .../mt7981/base-files/etc/board.d/02_network  |   9 +
- .../mt7981/base-files/lib/upgrade/platform.sh |   2 +
- 8 files changed, 417 insertions(+)
- create mode 100644 target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-xiaomi-wr30u-112M.dts
- create mode 100644 target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-xiaomi-wr30u-base.dtsi
- create mode 100644 target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-xiaomi-wr30u.dts
-
-diff --git a/target/linux/mediatek/base-files/sbin/smp.sh b/target/linux/mediatek/base-files/sbin/smp.sh
-index 5cdb7e5eb4d..8ccef249f50 100755
---- a/target/linux/mediatek/base-files/sbin/smp.sh
-+++ b/target/linux/mediatek/base-files/sbin/smp.sh
-@@ -713,6 +713,7 @@ setup_model()
- 	*7986*)
- 		MT7986_whnat $num_of_wifi
- 		;;
-+        *wr30u* |\
- 	*mt3000* |\
- 	*x3000* |\
- 	*xe3000* |\
-diff --git a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-xiaomi-wr30u-112M.dts b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-xiaomi-wr30u-112M.dts
-new file mode 100644
-index 00000000000..9c73b3b0fc0
---- /dev/null
-+++ b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-xiaomi-wr30u-112M.dts
-@@ -0,0 +1,64 @@
-+/dts-v1/;
-+#include "mt7981-xiaomi-wr30u-base.dtsi"
-+
-+/ {
-+        nmbm_spim_nand {
-+                compatible = "generic,nmbm";
-+                #address-cells = <1>;
-+                #size-cells = <1>;
-+
-+                lower-mtd-device = <&spi_nand>;
-+                forced-create;
-+
-+                partitions {
-+                        compatible = "fixed-partitions";
-+                        #address-cells = <0x01>;
-+                        #size-cells = <0x01>;
-+
-+                        partition@0 {
-+                                label = "BL2";
-+                                reg = <0x00 0x100000>;
-+                        };
-+
-+                        partition@100000 {
-+                                label = "Nvram";
-+                                reg = <0x100000 0x40000>;
-+                        };
-+
-+                        partition@140000 {
-+                                label = "Bdata";
-+                                reg = <0x140000 0x40000>;
-+                        };
-+
-+                        partition@180000 {
-+                                label = "Factory";
-+                                reg = <0x180000 0x200000>;
-+                        };
-+
-+                        partition@380000 {
-+                                label = "FIP";
-+                                reg = <0x380000 0x200000>;
-+                        };
-+
-+                        partition@580000 {
-+                                label = "crash";
-+                                reg = <0x580000 0x40000>;
-+                        };
-+
-+                        partition@5c0000 {
-+                                label = "crash_log";
-+                                reg = <0x5c0000 0x40000>;
-+                        };
-+
-+                        partition@600000 {
-+                                label = "ubi";
-+                                reg = <0x600000 0x7000000>;
-+                        };
-+
-+                        partition@7600000 {
-+                                label = "KF";
-+                                reg = <0x7600000 0x40000>;
-+                        };
-+                };
-+        };
-+};
-diff --git a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-xiaomi-wr30u-base.dtsi b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-xiaomi-wr30u-base.dtsi
-new file mode 100644
-index 00000000000..5d13117a21f
---- /dev/null
-+++ b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-xiaomi-wr30u-base.dtsi
-@@ -0,0 +1,223 @@
-+/dts-v1/;
-+#include "mt7981.dtsi"
-+
-+/ {
-+        model = "Xiaomi WR30U";
-+        compatible = "xiaomi,wr30u", "mediatek,mt7981";
-+
-+        chosen {
-+                bootargs = "console=ttyS0,115200n1 loglevel=8 earlycon=uart8250,mmio32,0x11002000";
-+        };
-+
-+        memory {
-+                reg = <0 0x40000000 0 0x10000000>;
-+        };
-+
-+        leds {
-+                compatible = "gpio-leds";
-+
-+                led_sys_blue {
-+                        label = "led_blue";
-+                        gpios = <&pio 9 GPIO_ACTIVE_LOW>;
-+                        default-state = "off";
-+                };
-+
-+                led_sys_yellow {
-+                        label = "led_yellow";
-+                        gpios = <&pio 10 GPIO_ACTIVE_LOW>;
-+                        default-state = "on";
-+                };
-+
-+                led_net_blue {
-+                        label = "net_blue";
-+                        gpios = <&pio 11 GPIO_ACTIVE_LOW>;
-+                        default-state = "off";
-+                };
-+
-+                led_net_yellow {
-+                        label = "net_yellow";
-+                        gpios = <&pio 12 GPIO_ACTIVE_LOW>;
-+                        default-state = "off";
-+                };
-+        };
-+
-+        gpio-keys {
-+                compatible = "gpio-keys";
-+                        reset {
-+                                label = "reset";
-+                                linux,code = <KEY_RESTART>;
-+                                gpios = <&pio 1 GPIO_ACTIVE_LOW>;
-+                        };
-+
-+                        mesh {
-+                                label = "mesh";
-+                                linux,code = <BTN_9>;
-+                                gpios = <&pio 0 GPIO_ACTIVE_LOW>;
-+                        };
-+        };
-+
-+        gsw: gsw@0 {
-+                compatible = "mediatek,mt753x";
-+                mediatek,ethsys = <&ethsys>;
-+                #address-cells = <1>;
-+                #size-cells = <0>;
-+        };
-+};
-+
-+&uart0 {
-+        status = "okay";
-+};
-+
-+&watchdog {
-+        status = "okay";
-+};
-+
-+&eth {
-+        status = "okay";
-+
-+        gmac0: mac@0 {
-+                compatible = "mediatek,eth-mac";
-+                reg = <0>;
-+                phy-mode = "2500base-x";
-+
-+                fixed-link {
-+                        speed = <2500>;
-+                        full-duplex;
-+                        pause;
-+                };
-+        };
-+
-+        gmac1: mac@1 {
-+                compatible = "mediatek,eth-mac";
-+                reg = <1>;
-+                phy-mode = "2500base-x";
-+
-+                fixed-link {
-+                        speed = <2500>;
-+                        full-duplex;
-+                        pause;
-+                };
-+        };
-+
-+        mdio: mdio-bus {
-+                #address-cells = <1>;
-+                #size-cells = <0>;
-+        };
-+};
-+
-+&gsw {
-+        mediatek,mdio = <&mdio>;
-+        mediatek,mdio_master_pinmux = <0>;
-+        reset-gpios = <&pio 39 0>;
-+        interrupt-parent = <&pio>;
-+        interrupts = <38 IRQ_TYPE_LEVEL_HIGH>;
-+        status = "okay";
-+
-+        port5: port@5 {
-+                compatible = "mediatek,mt753x-port";
-+                reg = <5>;
-+                phy-mode = "sgmii";
-+
-+                fixed-link {
-+                        speed = <2500>;
-+                        full-duplex;
-+                };
-+        };
-+
-+        port6: port@6 {
-+                compatible = "mediatek,mt753x-port";
-+                mediatek,ssc-on;
-+                reg = <6>;
-+                phy-mode = "sgmii";
-+
-+                fixed-link {
-+                        speed = <2500>;
-+                        full-duplex;
-+                };
-+        };
-+};
-+
-+&hnat {
-+        mtketh-wan = "eth1";
-+        mtketh-lan = "eth0";
-+        mtketh-max-gmac = <2>;
-+        status = "okay";
-+};
-+
-+&spi0 {
-+        pinctrl-names = "default";
-+        pinctrl-0 = <&spi0_flash_pins>;
-+        status = "okay";
-+
-+        spi_nand: spi_nand@0 {
-+                #address-cells = <1>;
-+                #size-cells = <1>;
-+                compatible = "spi-nand";
-+                reg = <0>;
-+                spi-max-frequency = <52000000>;
-+                spi-tx-buswidth = <4>;
-+                spi-rx-buswidth = <4>;
-+                spi-cal-enable;
-+                spi-cal-mode = "read-data";
-+                spi-cal-datalen = <7>;
-+                spi-cal-data = /bits/ 8 <0x53 0x50 0x49 0x4E 0x41 0x4E 0x44>; /* 'SPINAND' */
-+                spi-cal-addrlen = <5>;
-+                spi-cal-addr = /bits/ 32 <0x0 0x0 0x0 0x0 0x0>;
-+        };
-+};
-+
-+&pio {
-+        pwm0_pin: pwm0-pin-g0 {
-+                mux {
-+                        function = "pwm";
-+                        groups = "pwm0_0";
-+                };
-+        };
-+
-+        pwm1_pin: pwm1-pin-g0 {
-+                mux {
-+                        function = "pwm";
-+                        groups = "pwm1_0";
-+                };
-+        };
-+
-+        pwm2_pin: pwm2-pin {
-+                mux {
-+                        function = "pwm";
-+                        groups = "pwm2";
-+                };
-+        };
-+
-+        spi0_flash_pins: spi0-pins {
-+                mux {
-+                        function = "spi";
-+                        groups = "spi0", "spi0_wp_hold";
-+                };
-+
-+                conf-pu {
-+                        pins = "SPI0_CS", "SPI0_HOLD", "SPI0_WP";
-+                        drive-strength = <MTK_DRIVE_8mA>;
-+                        bias-pull-up = <MTK_PUPD_SET_R1R0_11>;
-+                };
-+
-+                conf-pd {
-+                        pins = "SPI0_CLK", "SPI0_MOSI", "SPI0_MISO";
-+                        drive-strength = <MTK_DRIVE_8mA>;
-+                        bias-pull-down = <MTK_PUPD_SET_R1R0_11>;
-+                };
-+        };
-+
-+        uart1_pins: uart1-pins-g1 {
-+                mux {
-+                        function = "uart";
-+                        groups = "uart1_1";
-+                };
-+        };
-+
-+        uart2_pins: uart2-pins-g1 {
-+                mux {
-+                        function = "uart";
-+                        groups = "uart2_1";
-+                };
-+        };
-+};
-diff --git a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-xiaomi-wr30u.dts b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-xiaomi-wr30u.dts
-new file mode 100644
-index 00000000000..78271f10aea
---- /dev/null
-+++ b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-xiaomi-wr30u.dts
-@@ -0,0 +1,79 @@
-+/dts-v1/;
-+#include "mt7981-xiaomi-wr30u-base.dtsi"
-+
-+/ {
-+        nmbm_spim_nand {
-+                compatible = "generic,nmbm";
-+                #address-cells = <1>;
-+                #size-cells = <1>;
-+
-+                lower-mtd-device = <&spi_nand>;
-+                forced-create;
-+
-+                partitions {
-+                        compatible = "fixed-partitions";
-+                        #address-cells = <0x01>;
-+                        #size-cells = <0x01>;
-+
-+                        partition@0 {
-+                                label = "BL2";
-+                                reg = <0x00 0x100000>;
-+                        };
-+
-+                        partition@100000 {
-+                                label = "Nvram";
-+                                reg = <0x100000 0x40000>;
-+                        };
-+
-+                        partition@140000 {
-+                                label = "Bdata";
-+                                reg = <0x140000 0x40000>;
-+                        };
-+
-+                        partition@180000 {
-+                                label = "Factory";
-+                                reg = <0x180000 0x200000>;
-+                        };
-+
-+                        partition@380000 {
-+                                label = "FIP";
-+                                reg = <0x380000 0x200000>;
-+                        };
-+
-+                        partition@580000 {
-+                                label = "crash";
-+                                reg = <0x580000 0x40000>;
-+                        };
-+
-+                        partition@5c0000 {
-+                                label = "crash_log";
-+                                reg = <0x5c0000 0x40000>;
-+                        };
-+
-+                        partition@600000 {
-+                                label = "ubi";
-+                                reg = <0x600000 0x2200000>;
-+                        };
-+
-+                        partition@2800000 {
-+                                label = "ubi1";
-+                                reg = <0x2800000 0x2200000>;
-+                        };
-+
-+                        partition@4a00000 {
-+                                label = "overlay";
-+                                reg = <0x4a00000 0x2000000>;
-+                        };
-+
-+                        partition@6a00000 {
-+                                label = "data";
-+                                reg = <0x6a00000 0xc00000>;
-+                        };
-+
-+                        partition@7600000 {
-+                                label = "KF";
-+                                reg = <0x7600000 0x40000>;
-+                        };
-+                };
-+        };
-+};
-diff --git a/target/linux/mediatek/image/mt7981.mk b/target/linux/mediatek/image/mt7981.mk
-index af070ebc017..86c05aec8c6 100644
---- a/target/linux/mediatek/image/mt7981.mk
-+++ b/target/linux/mediatek/image/mt7981.mk
-@@ -255,3 +255,37 @@ define Device/glinet_gl-mt2500
-   IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
- endef
- TARGET_DEVICES += glinet_gl-mt2500
-+
-+define Device/xiaomi_wr30u
-+  DEVICE_VENDOR := Xiaomi
-+  DEVICE_MODEL := WR30U
-+  DEVICE_DTS := mt7981-xiaomi-wr30u
-+  DEVICE_DTS_DIR := $(DTS_DIR)/mediatek
-+  SUPPORTED_DEVICES := xiaomi,wr30u
-+  UBINIZE_OPTS := -E 5
-+  BLOCKSIZE := 128k
-+  PAGESIZE := 2048
-+  IMAGE_SIZE := 34816k
-+  KERNEL_IN_UBI := 1
-+  IMAGES += factory.bin
-+  IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)
-+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
-+endef
-+TARGET_DEVICES += xiaomi_wr30u
-+
-+define Device/xiaomi_wr30u-112M
-+  DEVICE_VENDOR := Xiaomi
-+  DEVICE_MODEL := WR30U (with 112M ubi)
-+  DEVICE_DTS := mt7981-xiaomi-wr30u-112M
-+  DEVICE_DTS_DIR := $(DTS_DIR)/mediatek
-+  SUPPORTED_DEVICES := xiaomi,wr30u
-+  UBINIZE_OPTS := -E 5
-+  BLOCKSIZE := 128k
-+  PAGESIZE := 2048
-+  IMAGE_SIZE := 114688k
-+  KERNEL_IN_UBI := 1
-+  IMAGES += factory.bin
-+  IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)
-+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
-+endef
-+TARGET_DEVICES += xiaomi_wr30u-112M
-diff --git a/target/linux/mediatek/mt7981/base-files/etc/board.d/01_leds b/target/linux/mediatek/mt7981/base-files/etc/board.d/01_leds
-index e2bc027cbc6..7190778e545 100755
---- a/target/linux/mediatek/mt7981/base-files/etc/board.d/01_leds
-+++ b/target/linux/mediatek/mt7981/base-files/etc/board.d/01_leds
-@@ -12,6 +12,11 @@ case "$(board_name)" in
- 	ucidef_set_led_default "green" "GREEN" "360t7:green" "1"
- 	ucidef_set_led_default "red" "RED" "360t7:red" "0"
- 	;;
-+*wr30u*)
-+        ucidef_set_led_default "sys_blue" "BLUE" "led_blue" "1"
-+        ucidef_set_led_default "sys_yellow" "YELLOW" "led_yellow" "0"
-+        ucidef_set_led_netdev "net_blue" "NET_BLUE" "net_blue" "eth1"
-+	;;
- esac
- board_config_flush
- 
-diff --git a/target/linux/mediatek/mt7981/base-files/etc/board.d/02_network b/target/linux/mediatek/mt7981/base-files/etc/board.d/02_network
-index a27b30b1183..f3b5c848963 100755
---- a/target/linux/mediatek/mt7981/base-files/etc/board.d/02_network
-+++ b/target/linux/mediatek/mt7981/base-files/etc/board.d/02_network
-@@ -33,6 +33,11 @@ mediatek_setup_interfaces()
- 	*mt2500*)
- 		ucidef_set_interfaces_lan_wan "eth1" "eth0"
- 		;;
-+        *wr30u*)
-+                ucidef_set_interfaces_lan_wan "eth0" "eth1"
-+                ucidef_add_switch "switch0" \
-+                        "1:lan" "2:lan" "3:lan" "0:wan" "6u@eth0" "5u@eth1"
-+                ;;
- 	*)
- 		ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4" eth1
- 		;;
-@@ -86,6 +91,10 @@ mediatek_setup_macs()
- 	wan_mac=$(mtd_get_mac_binary $part_name $wan_mac_offset)
- 
- 	case $board in
-+        *wr30u*)
-+                wan_mac=$(dd if=/dev/mtd3ro bs=1 count=256 2>/dev/null |grep "^ethaddr_wan=" | awk -F '=' '{print $2}')
-+                lan_mac=$(dd if=/dev/mtd3ro bs=1 count=256 2>/dev/null |grep "^ethaddr=" | awk -F '=' '{print $2}')
-+                ;;
- 	*mt3000*)
- 		wan_mac=$(mtd_get_mac_binary $part_name 0x0a)
- 		lan_mac=$(macaddr_add "$wan_mac" 1)
-diff --git a/target/linux/mediatek/mt7981/base-files/lib/upgrade/platform.sh b/target/linux/mediatek/mt7981/base-files/lib/upgrade/platform.sh
-index 2babdc0b75a..b34d0f9e000 100644
---- a/target/linux/mediatek/mt7981/base-files/lib/upgrade/platform.sh
-+++ b/target/linux/mediatek/mt7981/base-files/lib/upgrade/platform.sh
-@@ -4,6 +4,7 @@ platform_do_upgrade() {
- 	local board=$(board_name)
- 
- 	case "$board" in
-+        *wr30u* |\
- 	*mt3000* |\
- 	*x3000* |\
- 	*xe3000* |\
-@@ -30,6 +31,7 @@ platform_check_image() {
- 	[ "$#" -gt 1 ] && return 1
- 
- 	case "$board" in
-+        *wr30u* |\
- 	*mt3000* |\
- 	*x3000* |\
- 	*xe3000* |\

+ 2 - 2
devices/mediatek_mt7981/settings.ini

@@ -1,2 +1,2 @@
-REPO_URL="https://github.com/hanwckf/immortalwrt-mt798x"
-REPO_BRANCH="openwrt-21.02"
+REPO_URL="https://github.com/hank9999/immortalwrt-mt798x"
+REPO_BRANCH="mt7981-wr30u"

+ 1 - 1
devices/mediatek_mt7986/diy.sh

@@ -4,7 +4,7 @@ shopt -s extglob
 
 SHELL_FOLDER=$(dirname $(readlink -f "$0"))
 
-rm -rf package/feeds/kiddin9/rtl*
+rm -rf package/feeds/kiddin9/rtl* package/feeds/packages/gptfdisk
 
 sed -i "s/PKG_SOURCE_DATE:=.*/PKG_SOURCE_DATE:=2024-12-06/" package/network/config/netifd/Makefile
 

+ 1 - 1
devices/rockchip_armv8/.config

@@ -4,7 +4,7 @@ CONFIG_TARGET_rockchip_armv8=y
 CONFIG_TARGET_MULTI_PROFILE=y
 CONFIG_TARGET_ALL_PROFILES=y
 
-CONFIG_PACKAGE_kmod-rtl8821cu=m
+CONFIG_PACKAGE_kmod-rtl8821cu=n
 CONFIG_PACKAGE_kmod-rtl88x2bu=m
 CONFIG_PACKAGE_kmod-pcie_mhi=m
 

+ 6 - 9
devices/rockchip_armv8/diy.sh

@@ -6,18 +6,15 @@ SHELL_FOLDER=$(dirname $(readlink -f "$0"))
 rm -rf package/boot/uboot-rockchip
 svn export --force https://github.com/coolsnowwolf/lede/trunk/package/boot/uboot-rockchip package/boot/uboot-rockchip
 svn export --force https://github.com/coolsnowwolf/lede/trunk/package/boot/arm-trusted-firmware-rockchip-vendor package/boot/arm-trusted-firmware-rockchip-vendor
-rm -rf target/linux/rockchip/!(Makefile|patches-5.15)
-svn co https://github.com/coolsnowwolf/lede/trunk/target/linux/rockchip target/linux/rockchip
-rm -rf target/linux/rockchip/{.svn,patches-5.15/.svn}
-svn co https://github.com/coolsnowwolf/lede/trunk/target/linux/rockchip/patches-5.15 target/linux/rockchip/patches-5.15
-rm -rf target/linux/rockchip/patches-5.15/{002-net-usb*,204-rockchip-rk3328*,003-dt-bindings*,006-rockchip-rk3399*,072-v6.2-net-phy*,073-v6.2-net-phy*,074-v6.3-net-phy*,075-v6.3-net-phy*,076-v6.3-net-phy*,077-v6.3-net-phy*,078-v6.3-net-phy*,079-v6.3-net-phy*}
 
-curl -sfL https://raw.githubusercontent.com/coolsnowwolf/lede/master/package/kernel/linux/modules/video.mk -o package/kernel/linux/modules/video.mk
+rm -rf target/linux/generic target/linux/rockchip/!(Makefile)
 
-svn co https://github.com/openwrt/openwrt/trunk/package/kernel/mt76 package/feeds/kiddin9/mt76
-curl -sfL https://raw.githubusercontent.com/immortalwrt/immortalwrt/master/package/kernel/mt76/patches/0001-mt76-allow-VHT-rate-on-2.4GHz.patch -o package/feeds/kiddin9/mt76/patches/0001-mt76-allow-VHT-rate-on-2.4GHz.patch
+svn co https://github.com/coolsnowwolf/lede/trunk/target/linux/generic target/linux/generic
+svn co https://github.com/coolsnowwolf/lede/trunk/target/linux/rockchip target/linux/rockchip
 
-sed -i "/KernelPackage,ptp/d" package/kernel/linux/modules/other.mk
+curl -sfL https://raw.githubusercontent.com/coolsnowwolf/lede/master/include/kernel-5.15 -o include/kernel-5.15
+
+curl -sfL https://raw.githubusercontent.com/coolsnowwolf/lede/master/package/kernel/linux/modules/video.mk -o package/kernel/linux/modules/video.mk
 
 mv -f tmp/r8125 feeds/kiddin9/