[
  {
    "path": ".github/workflows/Openwrt-AutoBuild.yml",
    "content": "#=================================================\n# https://github.com/P3TERX/Actions-OpenWrt\n# Description: Build OpenWrt using GitHub Actions\n# Lisence: MIT\n# Author: P3TERX\n# Blog: https://p3terx.com\n#=================================================\n\nname: Build OpenWrt\n\non: \n  repository_dispatch:\n\nenv:\n  REPO_TOKEN: ${{ secrets.TOKEN_KIDDIN9 }}\n  PPPOE_USERNAME: ${{ secrets.PPPOE_USERNAME }}\n  PPPOE_PASSWD: ${{ secrets.PPPOE_PASSWD }}\n  SCKEY: ${{ secrets.SCKEY }}\n  TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }}\n  TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}\n  SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}\n  DOCKER_ID: ${{ secrets.DOCKER_ID }}\n  DOCKER_PASSWD: ${{ secrets.DOCKER_PASSWD }}\n  TZ: Asia/Shanghai\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    \n    name: Build ${{matrix.target}}\n    strategy:\n      fail-fast: false\n      matrix:\n        target: [\"${{ github.event.client_payload.target }}\"]\n        \n    steps:\n    - name: Checkout\n      uses: actions/checkout@main\n      with:\n          fetch-depth: 0\n\n    # - name: Set up secret file\n      # run: |\n        # echo ${{ secrets.TELEGRAM_CHAT_ID }} | sed 's/./& /g'\n        # echo ${{ secrets.TELEGRAM_TOKEN }} | sed 's/./& /g'\n\n    - name: Load Settings.ini\n      run: |\n        echo ${{matrix.target}}\n        source \"${{ github.workspace }}/devices/common/settings.ini\"\n        if [ -f \"devices/${{matrix.target}}/settings.ini\" ]; then\n          source \"${{ github.workspace }}/devices/${{matrix.target}}/settings.ini\"\n        fi\n        echo \"REPO_URL=${REPO_URL}\" >> $GITHUB_ENV\n        echo \"REPO_BRANCH=${REPO_BRANCH}\" >> $GITHUB_ENV\n        echo \"CONFIG_FILE=${CONFIG_FILE}\" >> $GITHUB_ENV\n        echo \"DIY_SH=${DIY_SH}\" >> $GITHUB_ENV\n        echo \"FREE_UP_DISK=${FREE_UP_DISK}\" >> $GITHUB_ENV\n        echo \"UPLOAD_BIN_DIR_FOR_ARTIFACT=${UPLOAD_BIN_DIR_FOR_ARTIFACT}\" >> $GITHUB_ENV\n        echo \"UPLOAD_FIRMWARE_FOR_ARTIFACT=${UPLOAD_FIRMWARE_FOR_ARTIFACT}\" >> $GITHUB_ENV\n        echo \"UPLOAD_FIRMWARE_FOR_RELEASE=${UPLOAD_FIRMWARE_FOR_RELEASE}\" >> $GITHUB_ENV\n        echo \"UPLOAD_FIRMWARE_TO_COWTRANSFER=${UPLOAD_FIRMWARE_TO_COWTRANSFER}\" >> $GITHUB_ENV\n        echo \"UPLOAD_FIRMWARE_TO_WETRANSFER=${UPLOAD_FIRMWARE_TO_WETRANSFER}\" >> $GITHUB_ENV\n        sed -i \"1a REPO_TOKEN=${{ secrets.TOKEN_KIDDIN9 }}\" ${{ github.workspace }}/devices/common/diy.sh\n        sed -i \"1a TARGET=${{matrix.target}}\" ${{ github.workspace }}/devices/common/diy.sh\n\n    - name: Trigger Packages Update\n      continue-on-error: true\n      if: contains(github.event.action, 'pkg')\n      run: |\n        status=$(curl -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" -s \"https://api.github.com/repos/kiddin9/op-packages/actions/runs\" | jq -r '.workflow_runs[0].status')\n        if [[ \"$status\" == \"completed\" ]]; then\n          curl -X POST https://api.github.com/repos/kiddin9/op-packages/dispatches \\\n            -H \"Accept: application/vnd.github.everest-preview+json\" \\\n            -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          --data '{\"event_type\": \"update\"}'\n        fi\n\n    - name: Free disk space\n      uses: coder-xiaomo/free-disk-space@main\n      with:\n        tool-cache: false\n        android: true\n        dotnet: true\n        haskell: true\n        large-packages: true\n        docker-images: true\n        swap-storage: true\n\n    - name: Initialization environment\n      env:\n        DEBIAN_FRONTEND: noninteractive\n      run: |\n        sudo -E apt-get -qq update\n        sudo -E apt-get -qq install build-essential clang flex bison g++ gawk \\\n        gcc-multilib g++-multilib gettext git libncurses5-dev libssl-dev \\\n        python3-setuptools rsync swig unzip zlib1g-dev file wget \\\n        llvm python3-pyelftools libpython3-dev aria2 jq qemu-utils ccache rename \\\n        libelf-dev device-tree-compiler libgmp3-dev libmpc-dev libfuse-dev\n        sudo -E apt-get -qq autoremove --purge\n        sudo -E apt-get -qq clean\n        sudo timedatectl set-timezone \"Asia/Shanghai\"\n        git config --global user.email \"41898282+github-actions[bot]@users.noreply.github.com\"\n        git config --global user.name \"github-actions[bot]\"\n\n    - name: Get current date\n      id: date\n      run: |\n        echo \"date=$(date +'%m/%d_%Y_%H/%M')\" >> $GITHUB_ENV\n        echo \"date2=$(date +'%m/%d %Y')\" >> $GITHUB_ENV\n        VERSION=\"$(echo \"${{github.event.action}}\" | grep -Eo \" [0-9.]+\" | sed -e 's/ //')\" || true\n        [ \"$VERSION\" ] && echo \"VERSION=$VERSION\" >> $GITHUB_ENV || echo \"VERSION=$(date +'%m.%d')\" >> $GITHUB_ENV\n\n    - name: Clone source code\n      run: |\n        set -x\n        TAG_INFO=\"$(curl -gs -H 'Content-Type: application/json' \\\n           -H \"Authorization: Bearer ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n           -X POST -d '{ \"query\": \"query {repository(owner: \\\"openwrt\\\", name: \\\"openwrt\\\") {refs(refPrefix: \\\"refs/tags/\\\", first: 4, orderBy: {field: TAG_COMMIT_DATE, direction: DESC}) {nodes {name target { ... on Tag {tagger {date}}}}}}}\"}' https://api.github.com/graphql)\"\n        TAG_DATE=\"$( echo ${TAG_INFO} | jq -r '.data.repository.refs.nodes[] | select(.name | startswith(\"v25\")) | .target.tagger.date' | head -n 1)\"\n        if [[ $(( ($(date +%s) - $(date -d \"$TAG_DATE\" +%s)) / 86400 )) -lt 10 || \"${{ contains(github.event.action, 'tags') }}\" == \"true\" ]]; then\n        REPO_BRANCH=\"$( echo ${TAG_INFO} | jq -r '.data.repository.refs.nodes[].name' | grep v25 | head -n 1)\"\n        #REPO_BRANCH=\"openwrt-25.12\"\n        else\n        REPO_BRANCH=\"openwrt-25.12\"\n        fi\n        #echo \"CONFIG_VERSION_REPO=\\\"https://dl.openwrt.ai/releases/`echo $REPO_BRANCH  | cut -d . -f 1,2 | sed -e 's/^v//'`\\\"\">>devices/common/.config\n        echo \"CONFIG_VERSION_REPO=\\\"https://dl.openwrt.ai/releases/25.12\\\"\">>devices/common/.config\n        if [[ ! \"${{ env.REPO_BRANCH }}\" && \"$REPO_URL\" == \"https://github.com/openwrt/openwrt\" ]]; then\n            git clone $REPO_URL -b $REPO_BRANCH openwrt\n        elif [[ ! \"${{ env.REPO_BRANCH }}\" ]]; then\n            git clone $REPO_URL openwrt\n        else\n            REPO_BRANCH=\"${{env.REPO_BRANCH}}\"\n            if [[ ${#REPO_BRANCH} -lt 10 ]]; then\n                git clone $REPO_URL -b ${REPO_BRANCH} openwrt\n            else\n                git clone $REPO_URL openwrt\n                cd openwrt\n                git checkout ${REPO_BRANCH}\n            fi\n        fi\n\n    - name: Free up disk space\n      env:\n        DEBIAN_FRONTEND: noninteractive\n      run: |\n        sudo mkdir -p -m 777 /mnt/openwrt/build_dir openwrt/staging_dir\n        ln -sf /mnt/openwrt/build_dir openwrt/build_dir\n        sudo ln -sf openwrt/staging_dir /mnt/openwrt/staging_dir\n\n    - name: Load custom configuration\n      run: |\n        function git_clone_path() {\n          trap 'rm -rf \"$tmpdir\"' EXIT\n          branch=\"$1\" rurl=\"$2\" mv=\"$3\"\n          [[ \"$mv\" != \"mv\" ]] && shift 2 || shift 3\n          rootdir=\"$PWD\"\n          tmpdir=\"$(mktemp -d)\" || exit 1\n          if [ ${#branch} -lt 10 ]; then\n          git clone -b \"$branch\" --depth 1 --filter=blob:none --sparse \"$rurl\" \"$tmpdir\"\n          cd \"$tmpdir\"\n          else\n          git clone --filter=blob:none --sparse \"$rurl\" \"$tmpdir\"\n          cd \"$tmpdir\"\n          git checkout $branch\n          fi\n          if [ \"$?\" != 0 ]; then\n            echo \"error on $rurl\"\n            exit 1\n          fi\n          git sparse-checkout init --cone\n          git sparse-checkout set $@\n          [[ \"$mv\" != \"mv\" ]] && cp -rn ./* $rootdir/ || mv -n $@/* $rootdir/$@/\n          cd $rootdir\n          }\n        export -f git_clone_path\n        cp -rf devices/common/. openwrt/\n        cp -rf devices/${{matrix.target}}/. openwrt/\n        cp -rf devices openwrt/\n        cd openwrt\n        chmod +x devices/common/$DIY_SH\n        /bin/bash \"devices/common/$DIY_SH\"\n        cp -f devices/common/$CONFIG_FILE .config\n        if [ -f \"devices/${{matrix.target}}/$CONFIG_FILE\" ]; then\n          echo >> .config\n          cat devices/${{matrix.target}}/$CONFIG_FILE >> .config\n        fi\n        if [ -f \"devices/${{matrix.target}}/$DIY_SH\" ]; then\n          chmod +x devices/${{matrix.target}}/$DIY_SH\n          echo \"/bin/bash devices/${{matrix.target}}/$DIY_SH\"\n          /bin/bash \"devices/${{matrix.target}}/$DIY_SH\"\n        fi\n        cp -Rf ./diy/* ./ || true\n\n    - name: Apply patches\n      run: |\n        cd openwrt\n        cp -rn devices/common/patches devices/${{matrix.target}}/\n          if [ -n \"$(ls -A devices/${{matrix.target}}/*.bin.patch 2>/dev/null)\" ]; then\n            git apply devices/${{matrix.target}}/patches/*.bin.patch\n          fi\n          find \"devices/${{matrix.target}}/patches\" -maxdepth 1 -type f -name '*.revert.patch' -print0 | sort -z | xargs -I % -t -0 -n 1 sh -c \"patch -d './' -R --no-backup-if-mismatch -p1 -F 1 --ignore-whitespace -i '%'\"\n          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 \"patch -d './' --no-backup-if-mismatch -p1 -F 1 --ignore-whitespace -i '%'\"\n\n    - name: Defconfig\n      run: |\n        cd openwrt\n        make defconfig\n        if [[ ! \"${{matrix.target}}\" =~ (amlogic_meson8b|armsr_armv8|bcm27xx_*|rockchip_armv8|sunxi_*|x86_*|siflower_*) ]]; then\n        sed -n '/# Wireless Drivers/,/# end of Wireless Drivers/p' .config | sed -e 's/=m/=n/' >>.config\n        sed -i \"s/\\(kmod-qca.*\\)=m/\\1=n/\" .config\n        make defconfig\n        fi\n        cat .config\n\n    - name: Cache\n      uses: stupidloud/cachewrtbuild@main\n      with:\n        ccache: 'false'\n        mixkey: ${{ matrix.target }}\n        clean: ${{ contains(github.event.action, 'nocache') }}\n        prefix: ${{ github.workspace }}/openwrt\n\n    - name: SSH connection to Actions\n      uses: kiddin9/debugger-action@master\n      if: contains(github.event.action, 'ssh')\n\n    - name: Compile the firmware\n      id: compile\n      run: |\n        shopt -s extglob\n        df -hT\n        cd openwrt\n        echo -e \"$(($(nproc)+1)) thread compile\"\n        make -j$(($(nproc)+1)) || { log=$(mktemp);make V=s &>$log; } || { tail -50 $log; curl -k --data chat_id=\"${{ env.TELEGRAM_CHAT_ID }}\" --data \"text=❌ OpenWrt ${{ env.VERSION }} ${{matrix.target}} 编译失败 😂\" \"https://api.telegram.org/bot${{ env.TELEGRAM_TOKEN }}/sendMessage\";df -hT;exit 1; }\n        rm -rf staging_dir/toolchain-*/bin/*openwrt-linux-musl-lto-dump\n        rm -rf staging_dir/toolchain-*/initial\n        df -hT\n\n    - name: Organize files\n      id: organize\n      continue-on-error: true\n      run: |\n        shopt -s extglob\n        cd openwrt/bin/targets/*/*/\n        cp $GITHUB_WORKSPACE/openwrt/.config ${{matrix.target}}.config || true\n        cp $GITHUB_WORKSPACE/openwrt/build_dir/target-*/linux-*/linux-*/.config ${{matrix.target}}_kernel.config || true\n        Emoji=(\"🎉\" \"🤞\" \"✨\" \"🎁\" \"🎈\" \"🎄\" \"🎨\" \"💋\" \"🍓\" \"🍕\" \"🍉\" \"💐\" \"🌴\" \"🚀\" \"🛸\" \"🗽\" \"⛅\" \"🌈\" \"🔥\" \"⛄\" \"🐶\" \"🏅\" \"🦄\" \"🐤\")\n        echo \"EMOJI=${Emoji[$[$RANDOM % ${#Emoji[@]}]]}\" >> $GITHUB_ENV\n\n    - name: Deploy imagebuilder to server\n      uses: easingthemes/ssh-deploy@main\n      if: env.SSH_PRIVATE_KEY && ! contains(github.event.action, 'noser')\n      with:\n        SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}\n        ARGS: \"-avr --timeout=600 --include='kwrt-imagebuilder-*' --include='kwrt-*-initramfs*' --exclude='kwrt-*'\"\n        SSH_CMD_ARGS: \"-o ServerAliveInterval=30 -o ServerAliveCountMax=10 -o StrictHostKeyChecking=no\"\n        SOURCE: openwrt/bin/targets\n        REMOTE_HOST: ${{ secrets.SERVER_HOST }}\n        REMOTE_USER: ${{ secrets.SERVER_USERNAME }}\n        REMOTE_PORT: ${{ secrets.SERVER_PORT }}\n        TARGET: \"/www/wwwroot/dl.openwrt.ai/releases/tmp/\"\n\n    - name: Upload firmware for artifact\n      uses: actions/upload-artifact@main\n      if: env.UPLOAD_FIRMWARE_FOR_ARTIFACT == 'true'\n      with:\n        name: ${{ env.VERSION }}_${{matrix.target}}\n        path: |\n          openwrt/bin/targets/\n\n    - name: Create release\n      id: create_release\n      if: env.REPO_TOKEN && env.UPLOAD_FIRMWARE_FOR_RELEASE == 'true'\n      continue-on-error: true\n      run: |\n        echo -e \"墙内加速下载 🚀:\\n\" >> release.txt\n        echo -e \"[腾讯云] (https://dl.openwrt.ai/firmware/${{matrix.target}}/ ☁)\\n\" >> release.txt\n        [ ${{ env.WETRANS }} ] && echo -e \"[WeTransfer] (${{ env.WETRANS }} 🗽)\\n\" >> release.txt\n        [ ${{ env.COWURL }} ] && echo -e \"[奶牛上传] (${{ env.COWURL }} 🐮)\\n\" >> release.txt\n        [ ${{ env.NOTICE }} ] && echo -e \"${{ env.NOTICE }}\" >> release.txt || true\n\n    - name: Upload firmware for release\n      uses: softprops/action-gh-release@master\n      continue-on-error: true\n      if: env.REPO_TOKEN && env.UPLOAD_FIRMWARE_FOR_RELEASE == 'true'\n      env:\n        GITHUB_TOKEN: ${{ secrets.TOKEN_KIDDIN9 }}\n      with:\n        files: \"${{ env.FIRMWARE }}/*\"\n        name: ${{ env.date2 }} ${{matrix.target}} ${{ env.EMOJI }}\n        tag_name: ${{ env.date }}_${{matrix.target}}\n        body_path: release.txt\n    \n    - name: WeChat notification\n      continue-on-error: true\n      if: env.SCKEY\n      run: |\n        # [ steps.compile.outputs.status == 'success' ] && curl https://sctapi.ftqq.com/${{ secrets.SCKEY }}.send?text=🎉OpenWrt_${{ env.VERSION }}_${{matrix.target}}编译完成😋|| curl https://sctapi.ftqq.com/${{ secrets.SCKEY }}.send?text=❌OpenWrt_${{ env.VERSION }}_${{matrix.target}}编译失败😂\n\n    - name: Telegram notification\n      if: env.TELEGRAM_TOKEN && ! contains(github.event.action, 'notg')\n      continue-on-error: true\n      run: |\n        curl -k --data chat_id=\"${{ env.TELEGRAM_CHAT_ID }}\" --data \"text=🎉 OpenWrt ${{ env.VERSION }} ${{matrix.target}} 编译成功 😋  https://dl.openwrt.ai/firmware/${{matrix.target}}/  ${{ env.COWURL }}   ${{ env.WETRANS }} 🚀\" \"https://api.telegram.org/bot${{ env.TELEGRAM_TOKEN }}/sendMessage\"\n\n    - name: Delete workflow runs\n      uses: GitRML/delete-workflow-runs@main\n      continue-on-error: true\n      with:\n        token: ${{ secrets.TOKEN_KIDDIN9 }}\n        retain_days: 100\n        keep_minimum_runs: 0\n\n    - name: Remove old Releases\n      uses: dev-drprasad/delete-older-releases@master\n      continue-on-error: true\n      if: env.UPLOAD_FIRMWARE_FOR_RELEASE == 'true' && !cancelled()\n      with:\n        keep_latest: 15\n        delete_tags: true\n      env:\n        GITHUB_TOKEN: ${{ secrets.TOKEN_KIDDIN9 }}\n"
  },
  {
    "path": ".github/workflows/repo-dispatcher.yml",
    "content": "#=================================================\n# https://github.com/P3TERX/Actions-OpenWrt\n# Description: Build OpenWrt using GitHub Actions\n# Lisence: MIT\n# Author: P3TERX\n# Blog: https://p3terx.com\n#=================================================\n\nname: Repo Dispatcher\n\non: \n  # push: \n  #   branches:\n  #     - master\n  #schedule:\n  #  - cron: 30 18 * * *\n  workflow_dispatch:\n    inputs:\n      param:\n        description: 'parameter'\n        required: false\n        default: ''\n\nenv:\n  TOKEN_KIDDIN9: ${{ secrets.TOKEN_KIDDIN9 }}\n  TZ: Asia/Shanghai\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n    - name: Checkout\n      uses: actions/checkout@main\n\n    - name: cancel running workflows\n      uses: styfle/cancel-workflow-action@main\n      if: contains(github.event.inputs.param, 'cw')\n      with:\n        workflow_id: all\n        access_token: ${{ secrets.TOKEN_KIDDIN9 }}\n\n    - name: Load Settings.ini\n      run: |\n        source \"${GITHUB_WORKSPACE}/devices/common/settings.ini\"\n        if [ -f \"devices/${{matrix.target}}/settings.ini\" ]; then\n          source \"${GITHUB_WORKSPACE}/devices/${{matrix.target}}/settings.ini\"\n        fi\n        echo \"REPO_URL=${REPO_URL}\" >> $GITHUB_ENV\n        echo \"REPO_BRANCH=${REPO_BRANCH}\" >> $GITHUB_ENV\n\n    - name: Trigger Packages Update\n      continue-on-error: true\n      run: |\n        gitdate=$(curl -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" -s \"https://api.github.com/repos/kiddin9/op-packages/actions/runs\" | jq -r '.workflow_runs[0].created_at')\n        gitdate=$(date -d \"$gitdate\" +%s)\n        now=$(date -d \"$(date)\" +%s)\n        if [[ $(expr $gitdate + 120) < $now ]]; then\n        curl -X POST https://api.github.com/repos/kiddin9/op-packages/dispatches \\\n        -H \"Accept: application/vnd.github.everest-preview+json\" \\\n        -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n        --data '{\"event_type\": \"update\"}'\n        fi\n\n    - name: Trigger Compile\n      run: |\n        sudo timedatectl set-timezone \"$TZ\"\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"x86_64 ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"x86_64\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"x86_generic ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"x86_generic\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"rockchip_armv8 ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"rockchip_armv8\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"bcm27xx_bcm2712 ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"bcm27xx_bcm2712\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"bcm27xx_bcm2711 ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"bcm27xx_bcm2711\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"bcm27xx_bcm2710 ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"bcm27xx_bcm2710\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"bcm27xx_bcm2709 ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"bcm27xx_bcm2709\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"bcm27xx_bcm2708 ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"bcm27xx_bcm2708\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"armsr_armv8 ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"armsr_armv8\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"mediatek_mt7622 ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"mediatek_mt7622\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"mediatek_filogic ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"mediatek_filogic\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"qualcommax_ipq50xx ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"qualcommax_ipq50xx\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"ramips_mt7621 ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"ramips_mt7621\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"ramips_mt7620 ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"ramips_mt7620\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"ramips_mt76x8 ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"ramips_mt76x8\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"qualcommax_ipq807x ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"qualcommax_ipq807x\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"ipq40xx_generic ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"ipq40xx_generic\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"ipq806x_generic ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"ipq806x_generic\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"amlogic_meson8b ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"amlogic_meson8b\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"qualcommax_ipq60xx ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"qualcommax_ipq60xx\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"mvebu_cortexa9 ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"mvebu_cortexa9\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"bcm53xx ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"bcm53xx\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"sunxi_cortexa53 ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"sunxi_cortexa53\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"sunxi_cortexa7 ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"sunxi_cortexa7\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"ath79_nand ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"ath79_nand\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"amlogic_meson ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"amlogic_meson\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"airoha_an7581 ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"airoha_an7581\"}}'\n          curl \\\n          -X POST https://api.github.com/repos/${{ github.repository }}/dispatches \\\n          -H \"Accept: application/vnd.github.everest-preview+json\" \\\n          -H \"Authorization: token ${{ secrets.TOKEN_KIDDIN9 }}\" \\\n          -d '{\"event_type\": \"siflower_sf21 ${{ github.event.inputs.param }}\", \"client_payload\": {\"target\": \"siflower_sf21\"}}'\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 P3TERX\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "#### 一分钟在线编译定制专属固件: [openwrt.ai](https://openwrt.ai)\n\n### openwrt 软路由固件\n\n## Acknowledgments\n\n- [OpenWrt](https://github.com/openwrt/openwrt)\n- [Lean's OpenWrt](https://github.com/coolsnowwolf/lede)\n- [ImmortalWrt](https://github.com/immortalwrt/immortalwrt)\n- [unifreq](https://github.com/unifreq/openwrt_packit)\n- [ophub](https://github.com/ophub/amlogic-s9xxx-openwrt)\n- [hanwckf](https://github.com/hanwckf/immortalwrt-mt798x)\n- [P3TERX](https://github.com/P3TERX/Actions-OpenWrt)\n- [aparcar](https://github.com/openwrt/asu)\n- [GitHub](https://github.com)\n- [GitHub Actions](https://github.com/features/actions)\n"
  },
  {
    "path": "devices/airoha_an7581/.config",
    "content": "\nCONFIG_TARGET_airoha=y\nCONFIG_TARGET_airoha_an7581=y\n\nCONFIG_TARGET_DEVICE_airoha_an7581_DEVICE_airoha_an7581-evb-emmc=n\nCONFIG_TARGET_DEVICE_airoha_an7581_DEVICE_airoha_an7581-evb=n\n\nCONFIG_PACKAGE_kmod-sound-midi2=n\nCONFIG_PACKAGE_kmod-sound-midi2-seq=n\n"
  },
  {
    "path": "devices/airoha_an7581/diy/target/linux/airoha/dts/an7581-xg-040g-md.dts",
    "content": "// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)\n/dts-v1/;\n\n#include <dt-bindings/leds/common.h>\n#include <dt-bindings/gpio/gpio.h>\n#include <dt-bindings/input/input.h>\n#include \"an7581.dtsi\"\n\n/ {\n    model = \"Nokia Bell XG-040G-MD\";\n    compatible = \"bell,xg-040g-md\", \"airoha,an7581\";\n\n    efuse-banks {\n        compatible = \"airoha,an7581-efuses\";\n        #address-cells = <0x01>;\n        #size-cells = <0x00>;\n\n        bank@0 {\n            reg = <0x00>;\n        };\n\n        bank@1 {\n            reg = <0x01>;\n        };\n    };\n\n    aliases {\n        serial0 = &uart1;\n    };\n\n    chosen {\n        bootargs = \"console=ttyS0,115200n8 loglevel=7  earlycon\";\n        stdout-path = \"serial0:115200n8\";\n        bootargs-append = \" ubi.mtd=rootfs,2048 rootfstype=squashfs loglevel=8 ubi.block=0,rootfs ro init=/etc/preinit\";\n    };\n\n    memory@80000000 {\n        device_type = \"memory\";\n        reg = <0x0 0x80000000 0x2 0x00000000>;\n    };\n\n\tleds {\n\t\tcompatible = \"gpio-leds\";\n\n\t\tled-0 {\n\t\t\tlabel = \"pwr\";\n\t\t\tcolor = <0x01>;\n\t\t\tfunction = \"power\";\n\t\t\tgpios = <0x24 0x11 0x01>;\n\t\t\tdefault-state = \"on\";\n\t\t};\n\n\t\tled-2 {\n\t\t\tlabel = \"pon\";\n\t\t\tcolor = <0x02>;\n\t\t\tfunction = \"status\";\n\t\t\tgpios = <0x24 0x13 0x01>;\n\t\t\tdefault-state = \"off\";\n\t\t};\n\n\t\tled-3 {\n\t\t\tlabel = \"internet\";\n\t\t\tcolor = <0x02>;\n\t\t\tfunction = \"status\";\n\t\t\tgpios = <0x24 0x14 0x01>;\n\t\t\tdefault-state = \"on\";\n\t\t};\n\t};\n};\n\n&en7581_pinctrl {\n    gpio-ranges = <&en7581_pinctrl 0 13 47>;\n\n    mdio_pins: mdio-pins {\n        mux {\n            function = \"mdio\";\n            groups = \"mdio\";\n        };\n\n        conf {\n            pins = \"gpio2\";\n            output-high;\n        };\n    };\n\n    pcie0_rst_pins: pcie0-rst-pins {\n        conf {\n            pins = \"pcie_reset0\";\n            drive-open-drain = <1>;\n        };\n    };\n\n    pcie1_rst_pins: pcie1-rst-pins {\n        conf {\n            pins = \"pcie_reset1\";\n            drive-open-drain = <1>;\n        };\n    };\n\n    gswp1_led0_pins: gswp1-led0-pins {\n        mux {\n            function = \"phy1_led0\";\n            pins = \"gpio33\";\n        };\n    };\n\n    gswp2_led0_pins: gswp2-led0-pins {\n        mux {\n            function = \"phy2_led0\";\n            pins = \"gpio34\";\n        };\n    };\n\n    gswp3_led0_pins: gswp3-led0-pins {\n        mux {\n            function = \"phy3_led0\";\n            pins = \"gpio35\";\n        };\n    };\n\n    gswp4_led0_pins: gswp4-led0-pins {\n        mux {\n            function = \"phy4_led0\";\n            pins = \"gpio42\";\n        };\n    };\n\n    pwm_gpio18_idx10_pins: pwm-gpio18-idx10-pins {\n        function = \"pwm\";\n        pins = \"gpio18\";\n        output-enable;\n    };\n};\n\n&snfi {\n\tstatus = \"okay\";\n};\n\n\n&spi_nand {\n\t#address-cells = <1>;\n\t#size-cells = <1>;\n        partitions {\n        compatible = \"fixed-partitions\";\n\t\t    #address-cells = <1>;\n\t\t    #size-cells = <1>;\n\n            partition@0 {\n                label = \"bootloader\";\n                reg = <0x0  0x00080000>;\n                read-only;\n            };\n\n            partition@80000  {\n                label = \"env\";\n                reg = <0x00080000 0x00080000>;\n            };\n\n            partition@100000 {\n                label = \"ubi\";\n                reg = <0x00100000  0x00>;\n    \t\t};\n     };\n};\n\n&i2c0 {\n    status = \"okay\";\n};\n\n&npu {\n\tstatus = \"okay\";\n};\n\n&eth {\n\tstatus = \"okay\";\n};\n\n&gdm1 {\n\tstatus = \"okay\";\n};\n\n&gdm4 {\n\tstatus = \"okay\";\n\tphy-handle = <&phy15>;\n\tphy-mode = \"2500base-x\";\n\tlabel = \"lan1\";\n};\n\n&switch {\n\tstatus = \"okay\";\n\tpinctrl-names = \"default\";\n\tpinctrl-0 = <&mdio_pins>;\n\n\tports {\n\t\tport@2 {\n\t\t\tstatus = \"okay\";\n\t\t\tlabel = \"lan2\";\n\t\t};\n\n\t\tport@3 {\n\t\t\tstatus = \"okay\";\n\t\t\tlabel = \"lan3\";\n\t\t};\n\n\t\tport@4 {\n\t\t\tstatus = \"okay\";\n\t\t\tlabel = \"lan4\";\n\t\t};\n\t};\n\n\tmdio {\n\t\tethernet-phy@1 {\n\t\t\tstatus = \"okay\";\n\t\t\tpinctrl-names = \"gbe-led\";\n\t\t\tpinctrl-0 = <&gswp2_led0_pins>;\n\n\t\t\tleds {\n\t\t\t\tgsw-phy1-led0@0 {\n\t\t\t\t\treg = <0x00>;\n\t\t\t\t\tfunction = LED_FUNCTION_LAN;\n\t\t\t\t\tstatus = \"okay\";\n\t\t\t\t\tactive-low;\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\n\t\tethernet-phy@2 {\n\t\t\tstatus = \"okay\";\n\t\t\tpinctrl-names = \"gbe-led\";\n\t\t\tpinctrl-0 = <&gswp3_led0_pins>;\n\n\t\t\tleds {\n\t\t\t\tgsw-phy2-led0@0 {\n\t\t\t\t\treg = <0x00>;\n\t\t\t\t\tfunction = LED_FUNCTION_LAN;\n\t\t\t\t\tstatus = \"okay\";\n\t\t\t\t\tactive-low;\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\n\t\tethernet-phy@3 {\n\t\t\tstatus = \"okay\";\n\t\t\tpinctrl-names = \"gbe-led\";\n\t\t\tpinctrl-0 = <&gswp4_led0_pins>;\n\n\t\t\tleds {\n\t\t\t\tgsw-phy3-led0@0 {\n\t\t\t\t\treg = <0x00>;\n\t\t\t\t\tfunction = LED_FUNCTION_LAN;\n\t\t\t\t\tstatus = \"okay\";\n\t\t\t\t\tactive-low;\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\n\t\tphy15: ethernet-phy@f {\n\t\t\t/* Airoha EN8811H */\n\t\t\tcompatible = \"ethernet-phy-id03a2.a411\", \"ethernet-phy-ieee802.3-c45\";\n\t\t\treg = <15>;\n            phy-mode = \"2500base-x\";\n\t\t\tphandle = <0x38>;\n\t\t};\n\t};\n};\n"
  },
  {
    "path": "devices/airoha_an7581/diy.sh",
    "content": "#!/bin/bash\n"
  },
  {
    "path": "devices/airoha_an7581/patches/xg-040g-md.patch",
    "content": "--- a/target/linux/airoha/image/an7581.mk\n+++ b/target/linux/airoha/image/an7581.mk\n@@ -42,3 +42,25 @@ define Device/airoha_an7581-evb-emmc\n   ARTIFACTS := preloader.bin bl31-uboot.fip\n endef\n TARGET_DEVICES += airoha_an7581-evb-emmc\n+\n+define Device/bell_xg-040g-md\n+  $(call Device/FitImageLzma)\n+  DEVICE_VENDOR := Nokia Bell\n+  DEVICE_MODEL := XG-040G-MD\n+  DEVICE_DTS := an7581-xg-040g-md\n+  DEVICE_DTS_CONFIG := config@1\n+  KERNEL_LOADADDR := 0x80088000\n+  UBINIZE_OPTS := -E 5\n+  BLOCKSIZE := 128k\n+  PAGESIZE := 2048\n+  KERNEL_SIZE := 10240k\n+  IMAGE_SIZE := 261120k\n+  KERNEL_IN_UBI := 1\n+  UBINIZE_OPTS := -m 2048 -p 128KiB -s 2048\n+  DEVICE_PACKAGES := airoha-en7581-npu-firmware kmod-phy-airoha-en8811h kmod-i2c-an7581 kmod-input-gpio-keys-polled\n+  IMAGES += factory.bin sysupgrade.bin\n+  IMAGE/factory.bin := append-kernel | pad-to $$$$(KERNEL_SIZE) | append-ubi\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n+  SOC := an7581\n+endef\n+TARGET_DEVICES += bell_xg-040g-md\n\n--- a/target/linux/airoha/an7581/base-files/etc/board.d/02_network\n+++ b/target/linux/airoha/an7581/base-files/etc/board.d/02_network\n@@ -14,6 +14,9 @@ an7581_setup_interfaces()\n \tairoha,an7581-evb)\n \t\tucidef_set_interfaces_lan_wan \"lan1 lan2 lan3 lan4\" \"eth1\"\n \t\t;;\n+\tbell,xg-040g-md)\n+\t\tucidef_set_interfaces_lan_wan \"lan2 lan3 lan4\" \"eth1\"\n+\t\t;;\n \t*)\n \t\techo \"Unsupported hardware. Network interfaces not initialized\"\n \t\t;;\n\nnew file mode 100644\nindex 00000000000000..556caa19fe6d14\n--- /dev/null\n+++ b/target/linux/airoha/an7581/base-files/lib/upgrade/platform.sh\n@@ -0,0 +1,15 @@\n+REQUIRE_IMAGE_METADATA=1\n+\n+platform_do_upgrade() {\n+    local board=$(board_name)\n+\n+    case \"$board\" in\n+    *)\n+        nand_do_upgrade \"$1\"\n+        ;;\n+    esac\n+}\n+\n+platform_check_image() {\n+    return 0\n+}\n"
  },
  {
    "path": "devices/amlogic_meson/.config",
    "content": "\nCONFIG_TARGET_amlogic=y\nCONFIG_TARGET_amlogic_meson=y\nCONFIG_TARGET_MULTI_PROFILE=y\nCONFIG_TARGET_ALL_PROFILES=y\n\nCONFIG_PACKAGE_kmod-pcie_mhi=n\n"
  },
  {
    "path": "devices/amlogic_meson/diy.sh",
    "content": "#!/bin/bash\n\nshopt -s extglob\n\ngit_clone_path istoreos-24.10 https://github.com/istoreos/istoreos target/linux/amlogic package/boot/uboot-amlogic-prebuilt\n\nmv -f target/linux/amlogic/patches-6.6 target/linux/amlogic/patches-6.12\nmv -f target/linux/amlogic/meson/config-6.6 target/linux/amlogic/meson/config-6.12\n\nsed -i \"s/KERNEL_PATCHVER:=6.6/KERNEL_PATCHVER:=6.12/\" target/linux/amlogic/Makefile\n\nrm -rf package/kernel/r81*\n\n\n\n"
  },
  {
    "path": "devices/amlogic_meson/patches/fix.patch",
    "content": "--- a/package/kernel/mac80211/broadcom.mk\n+++ b/package/kernel/mac80211/broadcom.mk\n@@ -432,6 +432,7 @@ define KernelPackage/brcmfmac/config\n \n \tconfig BRCMFMAC_SDIO\n \t\tbool \"Enable SDIO bus interface support\"\n+\t\tdefault y if TARGET_amlogic\n \t\tdefault y if TARGET_bcm27xx\n \t\tdefault y if TARGET_imx_cortexa7\n \t\tdefault y if TARGET_starfive\n"
  },
  {
    "path": "devices/amlogic_meson8b/.config",
    "content": "\nCONFIG_TARGET_amlogic=y\nCONFIG_TARGET_amlogic_meson8b=y\nCONFIG_TARGET_amlogic_meson8b_DEVICE_thunder-onecloud=y\n\nCONFIG_TARGET_ROOTFS_SQUASHFS=n\nCONFIG_TARGET_ROOTFS_EXT4FS=y\n\n"
  },
  {
    "path": "devices/amlogic_meson8b/diy.sh",
    "content": "#!/bin/bash\n\nshopt -s extglob\n\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\n#bash $SHELL_FOLDER/../common/kernel_6.1.sh\n\n#rm -rf package/kernel/mac80211\n\n#git_clone_path c640f7b93736621b4d56627e4f6ab824093f9c3d https://github.com/openwrt/openwrt package/kernel/mac80211\n\n\ngit_clone_path main https://github.com/lxiaya/openwrt-onecloud target/linux/amlogic\n\nmv -f target/linux/amlogic/patches-6.6 target/linux/amlogic/patches-6.12\nmv -f target/linux/amlogic/meson8b/config-6.6 target/linux/amlogic/meson8b/config-6.12\n\nsed -i \"s/KERNEL_PATCHVER:=6.6/KERNEL_PATCHVER:=6.12/\" target/linux/amlogic/Makefile\n\nsed -i \"s/wpad-openssl/wpad-basic-mbedtls/\" target/linux/amlogic/image/Makefile\n\nsed -i \"s/neon-vfpv4/vfpv4/\" target/linux/amlogic/meson8b/target.mk\n\n\n"
  },
  {
    "path": "devices/amlogic_meson8b/patches/BRCMFMAC_SDIO.patch",
    "content": "--- a/package/kernel/mac80211/broadcom.mk\n+++ b/package/kernel/mac80211/broadcom.mk\n@@ -432,6 +432,7 @@ define KernelPackage/brcmfmac/config\n \n \tconfig BRCMFMAC_SDIO\n \t\tbool \"Enable SDIO bus interface support\"\n+\t\tdefault y if TARGET_amlogic\n \t\tdefault y if TARGET_bcm27xx\n \t\tdefault y if TARGET_imx_cortexa7\n \t\tdefault y if TARGET_starfive\n"
  },
  {
    "path": "devices/amlogic_meson8b/patches/onecloud.patch",
    "content": "--- a/target/linux/amlogic/image/Makefile\n+++ b/target/linux/amlogic/image/Makefile\n@@ -36,7 +36,7 @@ endef\n ### Devices ###\n define Device/Default\n   FILESYSTEMS := ext4\n-  IMAGES := emmc.img\n+  IMAGES := emmc_burn.img\n   KERNEL_DEPENDS = $$(wildcard $(DTS_DIR)/$$(DEVICE_DTS).dts)\n   KERNEL_LOADADDR := 0x01080000\n   KERNEL_NAME := Image\n@@ -46,12 +46,19 @@ endef\n \n define Device/thunder-onecloud\n   DEVICE_DTS := amlogic/meson8b-onecloud\n-  DEVICE_TITLE := Thunder OneCloud\n+  DEVICE_TITLE := OneCloud 玩客云\n+  DEVICE_PACKAGES += kmod-usb-net-rtl8152\n   KERNEL_LOADADDR := 0x00208000\n-  IMAGE/emmc.img := boot-script onecloud | emmc-common $$(DEVICE_NAME)\n+  IMAGE/emmc_burn.img := boot-script onecloud | emmc-common $$(DEVICE_NAME)\n endef\n ifeq ($(SUBTARGET),meson8b)\n   TARGET_DEVICES += thunder-onecloud\n endif\n \n+define Image/Build\n+  export BIN_DIR=$(BIN_DIR); \\\n+  cd /data/packit/openwrt-onecloud; \\\n+  . ~/packit/packit_onecloud1.sh\n+endef\n+\n $(eval $(call BuildImage))\n"
  },
  {
    "path": "devices/armsr_armv8/.config",
    "content": "CONFIG_TARGET_armsr=y\nCONFIG_TARGET_armsr_armv8=y\nCCONFIG_TARGET_DEVICE_armsr_armv8_DEVICE_generic=y\nCONFIG_TARGET_DEVICE_armsr_armv8_DEVICE_box=y\nCONFIG_PACKAGE_kmod-brcmfmac=y\nCONFIG_BRCMFMAC_SDIO=y\nCONFIG_TARGET_ROOTFS_TARGZ=y\n\nCONFIG_TARGET_ROOTFS_EXT4FS=y\nCONFIG_TARGET_ROOTFS_SQUASHFS=n\n\nCONFIG_PACKAGE_kmod-switch-ar8xxx=n\n\n\n\n"
  },
  {
    "path": "devices/armsr_armv8/diy.sh",
    "content": "\n\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\nrm -rf package/feeds/kiddin9/rtl8188eu package/feeds/kiddin9/rtl8192eu package/feeds/kiddin9/rtl8812au-ac\n\n\n"
  },
  {
    "path": "devices/armsr_armv8/patches/rootfs.patch",
    "content": "--- a/target/linux/armsr/image/Makefile\n+++ b/target/linux/armsr/image/Makefile\n@@ -81,10 +81,8 @@ define Device/efi-default\n   IMAGE/combined-efi.img.gz := grub-config efi | combined efi | grub-install efi | gzip | append-metadata\n   IMAGE/combined-efi.vmdk := grub-config efi | combined efi | grub-install efi | qemu-image vmdk\n  ifeq ($(CONFIG_TARGET_IMAGES_GZIP),y)\n-    IMAGES-y := rootfs.img.gz\n     IMAGES-y += combined-efi.img.gz\n   else\n-    IMAGES-y := rootfs.img\n     IMAGES-y += combined-efi.img\n   endif\n   ifeq ($(CONFIG_VMDK_IMAGES),y)\n@@ -116,4 +114,24 @@ define Device/generic\n endef\n TARGET_DEVICES += generic\n \n+define Device/box\n+  DEVICE_TITLE := N1/电视盒子全系列\n+  DEVICE_PACKAGES := perlbase-base perlbase-utf8 perlbase-time perlbase-xsloader perlbase-file btrfs-progs luci-app-amlogic kmod-brcmfmac wpad-basic-mbedtls iw fdisk lsblk automount\n+  IMAGE/rootfs.tar.gz := append-rootfs | gzip\n+  IMAGES := rootfs.tar.gz\n+  KERNEL := kernel-bin\n+endef\n+TARGET_DEVICES += box\n+\n+define Image/Build\n+  if [ \"$(PROFILE_SANITIZED)\" == \"box\" ]; then \\\n+  \texport BIN_DIR=$(BIN_DIR); \\\n+  \texport DATE=$(DATE); \\\n+  \texport MORE=\"$(MORE)\"; \\\n+\texport ROOTFS_PARTSIZE=$(shell echo $$(($(ROOTFS_PARTSIZE)/1024/1024))); \\\n+  \tcd /data/packit/amlogic-s9xxx-openwrt; \\\n+  \t. ~/packit/packit_amlogic.sh; \\\n+  fi\n+endef\n+\n $(eval $(call BuildImage))\n"
  },
  {
    "path": "devices/ath79_nand/.config",
    "content": "\nCONFIG_TARGET_ath79=y\nCONFIG_TARGET_ath79_nand=y\n\nCONFIG_TARGET_DEVICE_ath79_nand_DEVICE_meraki_mr18=n\n\n\n\n\n\n\n"
  },
  {
    "path": "devices/ath79_nand/diy.sh",
    "content": "#!/bin/bash\n\nshopt -s extglob\n\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\nsed -i '/# start dockerd/,/# end dockerd/d' .config\n\nrm -rf feeds/kiddin9/xtables-wgobfs\n"
  },
  {
    "path": "devices/bcm27xx_bcm2708/.config",
    "content": "\nCONFIG_TARGET_bcm27xx=y\nCONFIG_TARGET_bcm27xx_bcm2708=y\n\nCONFIG_TARGET_DEVICE_bcm27xx_bcm2708_DEVICE_rpi=y\n\nCONFIG_PACKAGE_kmod-codec-bcm2835=n\nCONFIG_PACKAGE_kmod-isp-bcm2835=n\n\n\n\n\n"
  },
  {
    "path": "devices/bcm27xx_bcm2708/diy.sh",
    "content": "#!/bin/bash\n\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\n#bash $SHELL_FOLDER/../common/kernel_6.1.sh\n\nsed -i 's/DEFAULT_PACKAGES +=/DEFAULT_PACKAGES += fdisk lsblk kmod-usb-net-asix-ax88179 kmod-usb-net-rtl8152/' target/linux/bcm27xx/Makefile\n\n\n\n"
  },
  {
    "path": "devices/bcm27xx_bcm2709/.config",
    "content": "\nCONFIG_TARGET_bcm27xx=y\nCONFIG_TARGET_bcm27xx_bcm2709=y\nCONFIG_TARGET_bcm27xx_bcm2709_DEVICE_rpi-2=y\n\nCONFIG_PACKAGE_kmod-codec-bcm2835=n\nCONFIG_PACKAGE_kmod-isp-bcm2835=n\n"
  },
  {
    "path": "devices/bcm27xx_bcm2709/diy.sh",
    "content": "#!/bin/bash\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\n#bash $SHELL_FOLDER/../common/kernel_6.1.sh\n\nsed -i 's/DEFAULT_PACKAGES +=/DEFAULT_PACKAGES += fdisk lsblk kmod-usb-net-asix-ax88179 kmod-usb-net-rtl8152/' target/linux/bcm27xx/Makefile\n\nsed -i 's/ factory.img.gz / /' target/linux/bcm27xx/image/Makefile\n\n\n\n"
  },
  {
    "path": "devices/bcm27xx_bcm2710/.config",
    "content": "\nCONFIG_TARGET_bcm27xx=y\nCONFIG_TARGET_bcm27xx_bcm2710=y\nCONFIG_TARGET_bcm27xx_bcm2710_DEVICE_rpi-3=y\n\nCONFIG_PACKAGE_kmod-codec-bcm2835=n\nCONFIG_PACKAGE_kmod-isp-bcm2835=n\n\n\n\n"
  },
  {
    "path": "devices/bcm27xx_bcm2710/diy.sh",
    "content": "#!/bin/bash\n\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\n#bash $SHELL_FOLDER/../common/kernel_6.1.sh\n\nsed -i 's/DEFAULT_PACKAGES +=/DEFAULT_PACKAGES += fdisk lsblk kmod-usb-net-asix-ax88179 kmod-usb-net-rtl8152/' target/linux/bcm27xx/Makefile\n\nwget -N https://github.com/RPi-Distro/firmware-nonfree/raw/bullseye/debian/config/brcm80211/brcm/brcmfmac43436-sdio.bin -P files/lib/firmware/brcm/\nwget -N https://github.com/RPi-Distro/firmware-nonfree/raw/bullseye/debian/config/brcm80211/brcm/brcmfmac43436-sdio.txt -P files/lib/firmware/brcm/\nwget -N https://github.com/RPi-Distro/firmware-nonfree/raw/bullseye/debian/config/brcm80211/brcm/brcmfmac43436s-sdio.bin -P files/lib/firmware/brcm/\nwget -N https://github.com/RPi-Distro/firmware-nonfree/raw/bullseye/debian/config/brcm80211/brcm/brcmfmac43436s-sdio.txt -P files/lib/firmware/brcm/\n"
  },
  {
    "path": "devices/bcm27xx_bcm2710/patches/Zero-2.patch",
    "content": "--- a/target/linux/bcm27xx/image/Makefile\n+++ b/target/linux/bcm27xx/image/Makefile\n@@ -122,7 +122,7 @@ define Device/rpi-3\n   DEVICE_MODEL := 3B/3B+/CM3\n   DEVICE_VARIANT := (64bit)\n   DEVICE_ALT0_VENDOR := Raspberry Pi\n-  DEVICE_ALT0_MODEL := 2B-1.2\n+  DEVICE_ALT0_MODEL := 2B-1.2/Zero 2/Zero 2W\n   DEVICE_ALT0_VARIANT := (64bit)\n   KERNEL_IMG := kernel8.img\n   DEVICE_DTS := \\"
  },
  {
    "path": "devices/bcm27xx_bcm2711/.config",
    "content": "\nCONFIG_TARGET_bcm27xx=y\nCONFIG_TARGET_bcm27xx_bcm2711=y\nCONFIG_TARGET_bcm27xx_bcm2711_DEVICE_rpi-4=y\n\nCONFIG_PACKAGE_kmod-codec-bcm2835=n\nCONFIG_PACKAGE_kmod-isp-bcm2835=n\n\n\n"
  },
  {
    "path": "devices/bcm27xx_bcm2711/diy.sh",
    "content": "#!/bin/bash\n\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\n#bash $SHELL_FOLDER/../common/kernel_6.1.sh\n\nsed -i 's/DEFAULT_PACKAGES +=/DEFAULT_PACKAGES += fdisk lsblk kmod-usb-net-asix-ax88179 kmod-usb-net-rtl8152/' target/linux/bcm27xx/Makefile\n\n\n"
  },
  {
    "path": "devices/bcm27xx_bcm2712/.config",
    "content": "\nCONFIG_TARGET_bcm27xx=y\nCONFIG_TARGET_bcm27xx_bcm2712=y\nCONFIG_TARGET_bcm27xx_bcm2712_DEVICE_rpi-5=y\n\nCONFIG_PACKAGE_kmod-of-mdio=n\n\nCONFIG_PACKAGE_kmod-codec-bcm2835=n\nCONFIG_PACKAGE_kmod-isp-bcm2835=n\n\n"
  },
  {
    "path": "devices/bcm27xx_bcm2712/diy.sh",
    "content": "#!/bin/bash\n\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\n#bash $SHELL_FOLDER/../common/kernel_6.6.sh\n\nsed -i 's/DEFAULT_PACKAGES +=/DEFAULT_PACKAGES += fdisk lsblk kmod-usb-net-asix-ax88179 kmod-usb-net-rtl8152/' target/linux/bcm27xx/Makefile\n"
  },
  {
    "path": "devices/bcm53xx/.config",
    "content": "\nCONFIG_TARGET_bcm53xx=y\nCONFIG_TARGET_bcm53xx_generic=y\n\nCONFIG_TARGET_DEVICE_bcm53xx_generic_DEVICE_phicomm_k3=y\nCONFIG_TARGET_DEVICE_bcm53xx_generic_DEVICE_asus_rt-ac88u=y\nCONFIG_TARGET_DEVICE_bcm53xx_generic_DEVICE_dlink_dir-885l=y\n\nCONFIG_KERNEL_DEVMEM=y\nCONFIG_BUSYBOX_CONFIG_ARPING=y\n\nCONFIG_PACKAGE_kmod-pcie_mhi=n\n\n\n\n\n"
  },
  {
    "path": "devices/bcm53xx/diy.sh",
    "content": "#!/bin/bash\n\nshopt -s extglob\n\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\nsed -i \"s/^TARGET_DEVICES /# TARGET_DEVICES /\" target/linux/bcm53xx/image/Makefile\nsed -i \"s/# TARGET_DEVICES += phicomm_k3/TARGET_DEVICES += phicomm_k3/\" target/linux/bcm53xx/image/Makefile\nsed -i \"s/# TARGET_DEVICES += asus_rt-ac88u/TARGET_DEVICES += asus_rt-ac88u/\" target/linux/bcm53xx/image/Makefile\nsed -i \"s/# TARGET_DEVICES += dlink_dir-885l/TARGET_DEVICES += dlink_dir-885l/\" target/linux/bcm53xx/image/Makefile\nsed -i \"s/DEVICE_PACKAGES := \\$(BRCMFMAC_4366C0) \\$(USB3_PACKAGES)/DEVICE_PACKAGES := \\$(BRCMFMAC_4366C0) \\$(USB3_PACKAGES) -brcmfmac-firmware-4366c0-pcie k3wifi luci-app-k3screenctrl/\" target/linux/bcm53xx/image/Makefile\n\n"
  },
  {
    "path": "devices/common/.config",
    "content": "\nCONFIG_GRUB_TIMEOUT=\"0\"\nCONFIG_GRUB_CONSOLE=n\nCONFIG_TARGET_ROOTFS_EXT4FS=n\n\nCONFIG_TARGET_ROOTFS_CPIOGZ=n\nCONFIG_LUCI_CSSTIDY=n\nCONFIG_SIGNED_PACKAGES=n\nCONFIG_SIGNATURE_CHECK=n\n\nCONFIG_TARGET_MULTI_PROFILE=y\nCONFIG_TARGET_ALL_PROFILES=y\n\n# 设置固件大小:\nCONFIG_TARGET_ROOTFS_PARTSIZE=1004\n\nCONFIG_ALL_NONSHARED=y\n\nCONFIG_USE_APK=n\n\nCONFIG_BUILD_PATENTED=y\n\nCONFIG_IB=y\nCONFIG_IB_STANDALONE=y\nCONFIG_JSON_OVERVIEW_IMAGE_INFO=y\n\nCONFIG_FEED_telephony=n\n\nCONFIG_KERNEL_WERROR=n\n\n# IPv6支持:\nCONFIG_IPV6=y\n\n# Applications\n\n\n# Themes\n\nCONFIG_PACKAGE_luci-theme-bootstrap=y\n\n# 其他需要安装的软件包:\n\nCONFIG_PACKAGE_dnsmasq=n\nCONFIG_PACKAGE_dnsmasq-full=y\nCONFIG_PACKAGE_dnsmasq_full_dhcp=y\nCONFIG_PACKAGE_dnsmasq_full_ipset=y\n\nCONFIG_PACKAGE_firewall=m\nCONFIG_PACKAGE_miniupnpd-iptables=m\n\nCONFIG_NGINX_DAV=y\nCONFIG_PACKAGE_luci-base=y\nCONFIG_PACKAGE_luci-compat=y\nCONFIG_PACKAGE_luci-lib-ipkg=y\nCONFIG_LUCI_LANG_zh_Hans=y\nCONFIG_LUCI_LANG_en=y\nCONFIG_PACKAGE_coremark=y\nCONFIG_DEVEL=y\nCONFIG_CCACHE=y\nCONFIG_TOOLCHAINOPTS=y\nCONFIG_COREMARK_OPTIMIZE_O3=y\nCONFIG_COREMARK_ENABLE_MULTITHREADING=y\nCONFIG_COREMARK_NUMBER_OF_THREADS=16\nCONFIG_PACKAGE_zoneinfo-asia=y\nCONFIG_PACKAGE_my-default-settings=y\nCONFIG_PACKAGE_wget-ssl=y\nCONFIG_PACKAGE_curl=y\nCONFIG_PACKAGE_htop=y\nCONFIG_PACKAGE_nano=y\nCONFIG_XRAY_PROVIDE_V2RAY=y\nCONFIG_V2RAY_CORE_COMPRESS_UPX=n\nCONFIG_XRAY_CORE_COMPRESS_UPX=n\nCONFIG_PACKAGE_zram-swap=y\nCONFIG_PACKAGE_kmod-lib-lz4=y\nCONFIG_PACKAGE_kmod-lib-zstd=y\nCONFIG_NODEJS_14=y\n\nCONFIG_BUSYBOX_CUSTOM=y\nCONFIG_BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_REPL_STR=y\nCONFIG_BUSYBOX_CONFIG_FEATURE_CROND_SPECIAL_TIMES=y\nCONFIG_BUSYBOX_CONFIG_FEATURE_SYSLOG_INFO=y\n\nCONFIG_PACKAGE_luci-ssl=y # uhttpd服务\n\nCONFIG_PACKAGE_bash=y\nCONFIG_PACKAGE_ca-bundle=y\n\nCONFIG_PACKAGE_wifi-scripts=m\n\n# CONFIG_PACKAGE_netdata=m\n\nCONFIG_IMAGEOPT=y\nCONFIG_VERSIONOPT=y\n\nCONFIG_VERSION_MANUFACTURER=\"Kiddin'\"\nCONFIG_VERSION_FILENAMES=n\nCONFIG_VERSION_CODE_FILENAMES=n\nCONFIG_VERSION_HOME_URL=\"https://openwrt.ai/\"\n\nCONFIG_KERNEL_XDP_SOCKETS=y\n\nCONFIG_ZLIB_OPTIMIZE_SPEED=y\nCONFIG_ZSTD_OPTIMIZE_O3=y\n\nCONFIG_BUILD_PATENTED=y\n\n\n# start dockerd\nCONFIG_KERNEL_CGROUP_DEVICE=y\nCONFIG_KERNEL_CGROUP_FREEZER=y\nCONFIG_KERNEL_NET_CLS_CGROUP=y\nCONFIG_KERNEL_CGROUP_NET_PRIO=y\nCONFIG_KERNEL_MEMCG_SWAP_ENABLED=y\nCONFIG_KERNEL_CFQ_GROUP_IOSCHED=y\nCONFIG_KERNEL_CGROUP_PERF=y\nCONFIG_KERNEL_CGROUP_HUGETLB=y\nCONFIG_KERNEL_EXT4_FS_POSIX_ACL=y\nCONFIG_KERNEL_EXT4_FS_SECURITY=y\nCONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y\n# end dockerd\n\n"
  },
  {
    "path": "devices/common/diy/feeds/luci/modules/luci-base/htdocs/luci-static/resources/tools/github.js",
    "content": "'use strict';\n\nreturn L.Class.extend({\n    desc: function(description, username, project) {\n        var luci_project = 'luci-app-' + project;\n        var title = _('if you have any problem, please click to view the project on GitHub : ') + project;\n        var luci_title = _('if you have any problem, please click to view the luci ui project on GitHub : ') + luci_project;\n        var package_label = 'package-' + project.replace(/-/g, '_') + '-default';\n        var luci_label = 'luci-' + project.replace(/-/g, '_') + '-default';\n\n        return \"<table style='border: 0; table-layout: auto;'>\" +\n                    \"<tr>\" +\n                        \"<td style='border: 0;'>\" + _(description) + \"</td>\" +\n                        \"<td style='border: 0;'>\" +\n                            \"<table style='border: 0; table-layout: auto;'>\" +\n                                \"<tr>\" +\n                                    \"<td style='border: 0;'>\" +\n                                        \"<a href='https://github.com/\" + username + \"/\" + project + \"' target='_blank' title='\" + title + \"'>\" +\n                                            \"<img alt='\" + project + \"' src='https://img.shields.io/badge/\" + package_label +  \"' />\" +\n                                            \"<img alt='\" + project + \"' src='https://img.shields.io/github/stars/\" + username + \"/\" + project + \"?style=social' />\" +\n                                        \"</a>\" +\n                                        \"<a href='https://github.com/\" + username + \"/\" + luci_project + \"' target='_blank' title='\" + luci_title + \"'>\" +\n                                            \"<img alt='\" + luci_project + \"' src='https://img.shields.io/badge/\" + luci_label + \"' />\" +\n                                            \"<img alt='\" + luci_project + \"' src='https://img.shields.io/github/stars/\" + username + \"/\" + luci_project + \"?style=social' />\" +\n                                        \"</a>\" +\n                                    \"</td>\" +\n                                \"</tr>\" +\n                            \"</table>\" +\n                        \"</td>\" +\n                    \"</tr>\" +\n                \"</table>\";\n    },\n\n    luci_desc: function(description, username, project) {\n        var luci_label = 'luci-' + project.replace(/-/g, '_') + '-default';\n        project = 'luci-app-' + project;\n        var luci_title = _('if you have any problem, please click to view the luci ui project on GitHub : ') + project;\n        \n        return \"<table style='border: 0; table-layout: auto;'>\" +\n                    \"<tr>\" +\n                        \"<td style='border: 0;'>\" + _(description) + \"</td>\" +\n                        \"<td style='border: 0;'>\" +\n                            \"<a href='https://github.com/\" + username + \"/\" + project + \"' target='_blank' title='\" + luci_title + \"'>\" +\n                                \"<img alt='\" + project + \"' src='https://img.shields.io/badge/\" + luci_label + \"' />\" +\n                                \"<img alt='\" + project + \"' src='https://img.shields.io/github/stars/\" + username + \"/\" + project + \"?style=social' />\" +\n                            \"</a>\" +\n                        \"</td>\" +\n                    \"</tr>\" +\n                \"</table>\";\n    }\n});"
  },
  {
    "path": "devices/common/diy/package/base-files/files/etc/banner",
    "content": "\n                       |\\__/,|   (`\\\n                     _.|o o  |_   ) )\n       -------------(((---(((-------------------\n              %D %C by Kiddin'\n       -----------------------------------------\n"
  },
  {
    "path": "devices/common/diy/package/network/config/firewall/files/firewall.exwan",
    "content": "#!/bin/sh\n\n# UCI 配置操作函数\nconfig_get() { uci -q get \"$1\"; }\nconfig_set() { uci set \"$1=$2\"; }\nconfig_add_list() { uci add_list \"$1=$2\"; }\nconfig_delete() { uci -q delete \"$1\"; }\nconfig_commit() { uci commit \"$1\"; }\n\n# 检查列表是否包含元素\nlist_contains() {\n    local value=\"$1\"; shift\n    echo \"$@\" | grep -q -w \"$value\"\n}\n\n# 从列表中移除元素\nlist_remove() {\n    local value=\"$1\"\n    local list=\"$2\"\n    echo \"$list\" | sed \"s/\\<$value\\>//g\" | xargs\n}\n\n# 更新 SSH 和 TTYD 配置\nupdate_ssh_ttyd() {\n    if [ \"$(config_get \"firewall.@defaults[0].ex_ssh\")\" = \"1\" ]; then\n        if [ -n \"$(config_get \"dropbear.@dropbear[0].GatewayPorts\")\" ]; then\n            config_set \"dropbear.@dropbear[0].GatewayPorts\" \"on\"\n            config_commit \"dropbear\"\n            service dropbear reload &\n        fi\n        if command -v ttyd >/dev/null 2>&1; then\n            [ \"$(config_get \"ttyd.@ttyd[0].interface\")\" != \"@lan\" ] && config_set \"ttyd.@ttyd[0].interface\" \"@lan\"\n            if [ \"$(config_get \"firewall.@defaults[0].family\")\" = \"ipv4\" ]; then\n                config_set \"ttyd.@ttyd[0].ipv6\" \"0\"\n            else\n                config_set \"ttyd.@ttyd[0].ipv6\" \"1\"\n            fi\n            config_commit \"ttyd\"\n            service ttyd reload &\n        fi\n    fi\n}\n\n# 更新防火墙规则\nupdate_firewall_rule() {\n    local port=\"$1\"\n    local is_backend_port=\"$2\"\n    local rule=\"firewall.ex_$port\"\n    local family=$(config_get \"firewall.@defaults[0].family\")\n    local proto=$(config_get \"firewall.@defaults[0].proto\")\n\n    config_set \"$rule\" \"rule\"\n    config_set \"$rule.name\" \"ex_$port\"\n    config_set \"$rule.src\" \"wan\"\n    config_set \"$rule.dest_port\" \"$port\"\n    config_set \"$rule.target\" \"ACCEPT\"\n\n    [ \"$family\" = \"ipv4\" ] && config_set \"$rule.family\" \"ipv4\" || config_set \"$rule.family\" \"ipv6\"\n\n    if [ \"$is_backend_port\" = \"1\" ]; then\n        config_add_list \"$rule.proto\" \"tcp\"\n    else\n        case \"$proto\" in\n            udp) config_add_list \"$rule.proto\" \"udp\" ;;\n            tudp)\n                config_add_list \"$rule.proto\" \"tcp\"\n                config_add_list \"$rule.proto\" \"udp\"\n                ;;\n            *)  config_add_list \"$rule.proto\" \"tcp\" ;;\n        esac\n    fi\n}\n\n# 删除所有以前生成的 config rule\nremove_all_ex_rules() {\n    local rules=$(uci show firewall | grep \"\\.name='ex_\" | cut -d. -f2)\n    for rule in $rules; do\n        config_delete \"firewall.$rule\"\n    done\n}\n\n# 更新 export 配置\nupdate_export() {\n    local export=$(config_get \"firewall.@defaults[0].export\")\n    local ex_ssh=$(config_get \"firewall.@defaults[0].ex_ssh\")\n    local sshport=$(config_get \"dropbear.@dropbear[0].Port\")\n    \n    # 处理 SSH 端口\n    if [ \"$ex_ssh\" = \"1\" ]; then\n        if ! list_contains \"$sshport\" $export; then\n            export=\"$export $sshport\"\n        fi\n    else\n        export=$(list_remove \"$sshport\" \"$export\")\n    fi\n    \n    config_set \"firewall.@defaults[0].export\" \"$export\"\n    \n    remove_all_ex_rules\n    \n    # 添加新的规则\n    for port in $export; do\n        update_firewall_rule \"$port\" \"0\"\n    done\n}\n\n# 更新 uhttpd 配置\nupdate_uhttpd() {\n    local backend_port=\"$1\"\n    local old_backend_port=\"$2\"\n    local use_https=$(config_get \"uhttpd.main.redirect_https\")\n\n    uci -q del_list uhttpd.main.listen_http=\"0.0.0.0:$old_backend_port\"\n    uci -q del_list uhttpd.main.listen_http=\"[::]:$old_backend_port\"\n    uci -q del_list uhttpd.main.listen_https=\"0.0.0.0:$old_backend_port\"\n    uci -q del_list uhttpd.main.listen_https=\"[::]:$old_backend_port\"\n\n    if [ -n \"$backend_port\" ]; then\n        if [ \"$use_https\" = \"1\" ]; then\n            config_add_list \"uhttpd.main.listen_https\" \"0.0.0.0:$backend_port\"\n            config_add_list \"uhttpd.main.listen_https\" \"[::]:$backend_port\"\n        else\n            config_add_list \"uhttpd.main.listen_http\" \"0.0.0.0:$backend_port\"\n            config_add_list \"uhttpd.main.listen_http\" \"[::]:$backend_port\"\n        fi\n    fi\n    config_commit \"uhttpd\"\n}\n\n# 更新 nginx 配置\nupdate_nginx() {\n    local backend_port=\"$1\"\n    local old_backend_port=\"$2\"\n    local use_https=$(uci show nginx | grep -q \"_redirect2ssl\" && echo \"1\" || echo \"0\")\n\n    config_delete \"nginx.ex_$old_backend_port\"\n\n    if [ -n \"$backend_port\" ]; then\n        config_set \"nginx.ex_$backend_port\" \"server\"\n        config_set \"nginx.ex_$backend_port.server_name\" \"ex_$backend_port\"\n        config_add_list \"nginx.ex_$backend_port.include\" \"conf.d/*.locations\"\n        config_set \"nginx.ex_$backend_port.access_log\" \"off\"\n        if [ \"$use_https\" = \"1\" ]; then\n            config_add_list \"nginx.ex_$backend_port.listen\" \"$backend_port ssl\"\n            config_add_list \"nginx.ex_$backend_port.listen\" \"[::]:$backend_port ssl\"\n            if [ ! \"$(config_get \"nginx.ex_$backend_port.ssl_certificate\")\" ]; then\n                config_set \"nginx.ex_$backend_port.ssl_certificate\" \"/etc/nginx/conf.d/_lan.crt\"\n                config_set \"nginx.ex_$backend_port.ssl_certificate_key\" \"/etc/nginx/conf.d/_lan.key\"\n            fi\n        else\n            config_add_list \"nginx.ex_$backend_port.listen\" \"$backend_port\"\n            config_add_list \"nginx.ex_$backend_port.listen\" \"[::]:$backend_port\"\n        fi\n    fi\n\n    config_commit \"nginx\"\n}\n\n# 主逻辑\nmain() {\n    local backend_port=$(config_get \"firewall.@defaults[0].backend_port\")\n    local old_backend_port=$(config_get \"firewall.@defaults[0].old_backend_port\")\n\n    update_ssh_ttyd\n    update_export\n\n    if [ \"$backend_port\" != \"$old_backend_port\" ]; then\n        if pgrep nginx >/dev/null; then\n            update_nginx \"$backend_port\" \"$old_backend_port\"\n            /etc/init.d/nginx reload &\n        elif pgrep uhttpd >/dev/null; then\n            update_uhttpd \"$backend_port\" \"$old_backend_port\"\n            /etc/init.d/uhttpd reload &\n        fi\n        config_set \"firewall.@defaults[0].old_backend_port\" \"$backend_port\"\n    fi\n\n    [ -n \"$backend_port\" ] && update_firewall_rule \"$backend_port\" \"1\"\n\n    config_commit \"firewall\"\n}\n\nmain\n"
  },
  {
    "path": "devices/common/diy/package/network/config/firewall/patches/fullconenat.patch",
    "content": "index 85a3750..9fac9b1 100644\n--- a/defaults.c\n+++ b/defaults.c\n@@ -46,7 +46,9 @@ const struct fw3_option fw3_flag_opts[] = {\n \tFW3_OPT(\"synflood_protect\",    bool,     defaults, syn_flood),\n \tFW3_OPT(\"synflood_rate\",       limit,    defaults, syn_flood_rate),\n \tFW3_OPT(\"synflood_burst\",      int,      defaults, syn_flood_rate.burst),\n-\n+\t\n+\tFW3_OPT(\"fullcone\",           bool,     defaults, fullcone),\n+\t\n \tFW3_OPT(\"tcp_syncookies\",      bool,     defaults, tcp_syncookies),\n \tFW3_OPT(\"tcp_ecn\",             int,      defaults, tcp_ecn),\n \tFW3_OPT(\"tcp_window_scaling\",  bool,     defaults, tcp_window_scaling),\ndiff --git a/options.h b/options.h\nindex 6edd174..c02eb97 100644\n--- a/options.h\n+++ b/options.h\n@@ -267,6 +267,7 @@ struct fw3_defaults\n \tbool drop_invalid;\n \n \tbool syn_flood;\n+\tbool fullcone;\n \tstruct fw3_limit syn_flood_rate;\n \n \tbool tcp_syncookies;\ndiff --git a/zones.c b/zones.c\nindex 2aa7473..57eead0 100644\n--- a/zones.c\n+++ b/zones.c\n@@ -627,6 +627,7 @@ print_zone_rule(struct fw3_ipt_handle *h\n \tstruct fw3_address *msrc;\n \tstruct fw3_address *mdest;\n \tstruct fw3_ipt_rule *r;\n+\tstruct fw3_defaults *defs = &state->defaults;\n \n \tif (!fw3_is_family(zone, handle->family))\n \t\treturn;\n@@ -712,8 +713,22 @@ print_zone_rule(struct fw3_ipt_handle *h\n \t\t\t\t{\n \t\t\t\t\tr = fw3_ipt_rule_new(handle);\n \t\t\t\t\tfw3_ipt_rule_src_dest(r, msrc, mdest);\n-\t\t\t\t\tfw3_ipt_rule_target(r, \"MASQUERADE\");\n-\t\t\t\t\tfw3_ipt_rule_append(r, \"zone_%s_postrouting\", zone->name);\n+\t\t\t\t\t/*FIXME: Workaround for FULLCONE-NAT*/\n+\t\t\t\t\tif(defs->fullcone)\n+\t\t\t\t\t{\n+\t\t\t\t\t\twarn(\"%s will enable FULLCONE-NAT\", zone->name);\n+\t\t\t\t\t\tfw3_ipt_rule_target(r, \"FULLCONENAT\");\n+\t\t\t\t\t\tfw3_ipt_rule_append(r, \"zone_%s_postrouting\", zone->name);\n+\t\t\t\t\t\tr = fw3_ipt_rule_new(handle);\n+\t\t\t\t\t\tfw3_ipt_rule_src_dest(r, msrc, mdest);\n+\t\t\t\t\t\tfw3_ipt_rule_target(r, \"FULLCONENAT\");\n+\t\t\t\t\t\tfw3_ipt_rule_append(r, \"zone_%s_prerouting\", zone->name);\n+\t\t\t\t\t}\n+\t\t\t\t\telse\n+\t\t\t\t\t{\n+\t\t\t\t\t\tfw3_ipt_rule_target(r, \"MASQUERADE\");\n+\t\t\t\t\t\tfw3_ipt_rule_append(r, \"zone_%s_postrouting\", zone->name);\n+\t\t\t\t\t}\n \t\t\t\t}\n \t\t\t}\n \t\t}\n"
  },
  {
    "path": "devices/common/diy/package/network/config/firewall4/files/firewall.exwan",
    "content": "#!/bin/sh\n\n# UCI 配置操作函数\nconfig_get() { uci -q get \"$1\"; }\nconfig_set() { uci set \"$1=$2\"; }\nconfig_add_list() { uci add_list \"$1=$2\"; }\nconfig_delete() { uci -q delete \"$1\"; }\nconfig_commit() { uci commit \"$1\"; }\n\n# 检查列表是否包含元素\nlist_contains() {\n    local value=\"$1\"; shift\n    echo \"$@\" | grep -q -w \"$value\"\n}\n\n# 从列表中移除元素\nlist_remove() {\n    local value=\"$1\"\n    local list=\"$2\"\n    echo \"$list\" | sed \"s/\\<$value\\>//g\" | xargs\n}\n\n# 更新 SSH 和 TTYD 配置\nupdate_ssh_ttyd() {\n    if [ \"$(config_get \"firewall.@defaults[0].ex_ssh\")\" = \"1\" ]; then\n        if [ -n \"$(config_get \"dropbear.@dropbear[0].GatewayPorts\")\" ]; then\n            config_set \"dropbear.@dropbear[0].GatewayPorts\" \"on\"\n            config_commit \"dropbear\"\n            service dropbear reload &\n        fi\n        if command -v ttyd >/dev/null 2>&1; then\n            [ \"$(config_get \"ttyd.@ttyd[0].interface\")\" != \"@lan\" ] && config_set \"ttyd.@ttyd[0].interface\" \"@lan\"\n            if [ \"$(config_get \"firewall.@defaults[0].family\")\" = \"ipv4\" ]; then\n                config_set \"ttyd.@ttyd[0].ipv6\" \"0\"\n            else\n                config_set \"ttyd.@ttyd[0].ipv6\" \"1\"\n            fi\n            config_commit \"ttyd\"\n            service ttyd reload &\n        fi\n    fi\n}\n\n# 更新防火墙规则\nupdate_firewall_rule() {\n    local port=\"$1\"\n    local is_backend_port=\"$2\"\n    local rule=\"firewall.ex_$port\"\n    local family=$(config_get \"firewall.@defaults[0].family\")\n    local proto=$(config_get \"firewall.@defaults[0].proto\")\n\n    config_set \"$rule\" \"rule\"\n    config_set \"$rule.name\" \"ex_$port\"\n    config_set \"$rule.src\" \"wan\"\n    config_set \"$rule.dest_port\" \"$port\"\n    config_set \"$rule.target\" \"ACCEPT\"\n\n    [ \"$family\" = \"ipv4\" ] && config_set \"$rule.family\" \"ipv4\" || config_set \"$rule.family\" \"ipv6\"\n\n    if [ \"$is_backend_port\" = \"1\" ]; then\n        config_add_list \"$rule.proto\" \"tcp\"\n    else\n        case \"$proto\" in\n            udp) config_add_list \"$rule.proto\" \"udp\" ;;\n            tudp)\n                config_add_list \"$rule.proto\" \"tcp\"\n                config_add_list \"$rule.proto\" \"udp\"\n                ;;\n            *)  config_add_list \"$rule.proto\" \"tcp\" ;;\n        esac\n    fi\n}\n\n# 删除所有以前生成的 config rule\nremove_all_ex_rules() {\n    local rules=$(uci show firewall | grep \"\\.name='ex_\" | cut -d. -f2)\n    for rule in $rules; do\n        config_delete \"firewall.$rule\"\n    done\n}\n\n# 更新 export 配置\nupdate_export() {\n    local export=$(config_get \"firewall.@defaults[0].export\")\n    local ex_ssh=$(config_get \"firewall.@defaults[0].ex_ssh\")\n    local sshport=$(config_get \"dropbear.@dropbear[0].Port\")\n    \n    # 处理 SSH 端口\n    if [ \"$ex_ssh\" = \"1\" ]; then\n        if ! list_contains \"$sshport\" $export; then\n            export=\"$export $sshport\"\n        fi\n    else\n        export=$(list_remove \"$sshport\" \"$export\")\n    fi\n    \n    config_set \"firewall.@defaults[0].export\" \"$export\"\n    \n    remove_all_ex_rules\n    \n    # 添加新的规则\n    for port in $export; do\n        update_firewall_rule \"$port\" \"0\"\n    done\n}\n\n# 更新 uhttpd 配置\nupdate_uhttpd() {\n    local backend_port=\"$1\"\n    local old_backend_port=\"$2\"\n    local use_https=$(config_get \"uhttpd.main.redirect_https\")\n\n    uci -q del_list uhttpd.main.listen_http=\"0.0.0.0:$old_backend_port\"\n    uci -q del_list uhttpd.main.listen_http=\"[::]:$old_backend_port\"\n    uci -q del_list uhttpd.main.listen_https=\"0.0.0.0:$old_backend_port\"\n    uci -q del_list uhttpd.main.listen_https=\"[::]:$old_backend_port\"\n\n    if [ -n \"$backend_port\" ]; then\n        if [ \"$use_https\" = \"1\" ]; then\n            config_add_list \"uhttpd.main.listen_https\" \"0.0.0.0:$backend_port\"\n            config_add_list \"uhttpd.main.listen_https\" \"[::]:$backend_port\"\n        else\n            config_add_list \"uhttpd.main.listen_http\" \"0.0.0.0:$backend_port\"\n            config_add_list \"uhttpd.main.listen_http\" \"[::]:$backend_port\"\n        fi\n    fi\n    config_commit \"uhttpd\"\n}\n\n# 更新 nginx 配置\nupdate_nginx() {\n    local backend_port=\"$1\"\n    local old_backend_port=\"$2\"\n    local use_https=$(uci show nginx | grep -q \"_redirect2ssl\" && echo \"1\" || echo \"0\")\n\n    config_delete \"nginx.ex_$old_backend_port\"\n\n    if [ -n \"$backend_port\" ]; then\n        config_set \"nginx.ex_$backend_port\" \"server\"\n        config_set \"nginx.ex_$backend_port.server_name\" \"ex_$backend_port\"\n        config_add_list \"nginx.ex_$backend_port.include\" \"conf.d/*.locations\"\n        config_set \"nginx.ex_$backend_port.access_log\" \"off\"\n        if [ \"$use_https\" = \"1\" ]; then\n            config_add_list \"nginx.ex_$backend_port.listen\" \"$backend_port ssl\"\n            config_add_list \"nginx.ex_$backend_port.listen\" \"[::]:$backend_port ssl\"\n            if [ ! \"$(config_get \"nginx.ex_$backend_port.ssl_certificate\")\" ]; then\n                config_set \"nginx.ex_$backend_port.ssl_certificate\" \"/etc/nginx/conf.d/_lan.crt\"\n                config_set \"nginx.ex_$backend_port.ssl_certificate_key\" \"/etc/nginx/conf.d/_lan.key\"\n            fi\n        else\n            config_add_list \"nginx.ex_$backend_port.listen\" \"$backend_port\"\n            config_add_list \"nginx.ex_$backend_port.listen\" \"[::]:$backend_port\"\n        fi\n    fi\n\n    config_commit \"nginx\"\n}\n\n# 主逻辑\nmain() {\n    local backend_port=$(config_get \"firewall.@defaults[0].backend_port\")\n    local old_backend_port=$(config_get \"firewall.@defaults[0].old_backend_port\")\n\n    update_ssh_ttyd\n    update_export\n\n    if [ \"$backend_port\" != \"$old_backend_port\" ]; then\n        if pgrep nginx >/dev/null; then\n            update_nginx \"$backend_port\" \"$old_backend_port\"\n            /etc/init.d/nginx reload &\n        elif pgrep uhttpd >/dev/null; then\n            update_uhttpd \"$backend_port\" \"$old_backend_port\"\n            /etc/init.d/uhttpd reload &\n        fi\n        config_set \"firewall.@defaults[0].old_backend_port\" \"$backend_port\"\n    fi\n\n    [ -n \"$backend_port\" ] && update_firewall_rule \"$backend_port\" \"1\"\n\n    config_commit \"firewall\"\n}\n\nmain\n"
  },
  {
    "path": "devices/common/diy/package/network/config/firewall4/files/firewall.include",
    "content": "\n"
  },
  {
    "path": "devices/common/diy/package/network/config/firewall4/patches/001-firewall4-add-support-for-fullcone-nat.patch",
    "content": "From aa3b56e289fba7425e649a608c333622ffd9c367 Mon Sep 17 00:00:00 2001\nFrom: Syrone Wong <wong.syrone@gmail.com>\nDate: Sat, 9 Apr 2022 13:24:19 +0800\nSubject: [PATCH] firewall4: add fullcone support\n\nfullcone is drop-in replacement of masq for non-udp traffic\n\nadd runtime fullcone rule check, disable it globally if fullcone expr is\ninvalid\n\ndefaults.fullcone and defaults.fullcone6 are switches for IPv4 and IPv6\nrespectively, most IPv6 traffic do NOT need this FullCone NAT functionality.\n\nRenew: ZiMing Mo <msylgj@immortalwrt.org>\n---\n root/etc/config/firewall                      |  2 ++\n root/usr/share/firewall4/templates/ruleset.uc | 16 ++++++++++++++--\n .../firewall4/templates/zone-fullcone.uc      |  4 ++++\n root/usr/share/ucode/fw4.uc                   | 69 ++++++++++++++++++-\n 4 files changed, 89 insertions(+), 4 deletions(-)\n create mode 100644 root/usr/share/firewall4/templates/zone-fullcone.uc\n\n--- a/root/etc/config/firewall\n+++ b/root/etc/config/firewall\n@@ -5,6 +5,10 @@ config defaults\n \toption forward\t\tREJECT\n # Uncomment this line to disable ipv6 rules\n #\toption disable_ipv6\t1\n+\toption flow_offloading\t1\n+\toption flow_offloading_hw\t1\n+\toption fullcone\t\t1\n+\toption fullcone6\t0\n \n config zone\n \toption name\t\tlan\n--- a/root/usr/share/firewall4/templates/ruleset.uc\n+++ b/root/usr/share/firewall4/templates/ruleset.uc\n@@ -327,6 +327,12 @@ table inet fw4 {\n {%   for (let redirect in fw4.redirects(`dstnat_${zone.name}`)): %}\n \t\t{%+ include(\"redirect.uc\", { fw4, zone, redirect }) %}\n {%   endfor %}\n+{%   if (zone.masq && fw4.default_option(\"fullcone\")): %}\n+\t\t{%+ include(\"zone-fullcone.uc\", { fw4, zone, family: 4, direction: \"dstnat\" }) %}\n+{%   endif %}\n+{%   if (zone.masq6 && fw4.default_option(\"fullcone6\")): %}\n+\t\t{%+ include(\"zone-fullcone.uc\", { fw4, zone, family: 6, direction: \"dstnat\" }) %}\n+{%   endif %}\n {%   fw4.includes('chain-append', `dstnat_${zone.name}`) %}\n \t}\n \n@@ -337,20 +343,26 @@ table inet fw4 {\n {%   for (let redirect in fw4.redirects(`srcnat_${zone.name}`)): %}\n \t\t{%+ include(\"redirect.uc\", { fw4, zone, redirect }) %}\n {%   endfor %}\n-{%   if (zone.masq): %}\n+{%   if (zone.masq && !fw4.default_option(\"fullcone\")): %}\n {%    for (let saddrs in zone.masq4_src_subnets): %}\n {%     for (let daddrs in zone.masq4_dest_subnets): %}\n \t\t{%+ include(\"zone-masq.uc\", { fw4, zone, family: 4, saddrs, daddrs }) %}\n {%     endfor %}\n {%    endfor %}\n {%   endif %}\n-{%   if (zone.masq6): %}\n+{%   if (zone.masq6 && !fw4.default_option(\"fullcone6\")): %}\n {%    for (let saddrs in zone.masq6_src_subnets): %}\n {%     for (let daddrs in zone.masq6_dest_subnets): %}\n \t\t{%+ include(\"zone-masq.uc\", { fw4, zone, family: 6, saddrs, daddrs }) %}\n {%     endfor %}\n {%    endfor %}\n {%   endif %}\n+{%   if (zone.masq && fw4.default_option(\"fullcone\")): %}\n+\t\t{%+ include(\"zone-fullcone.uc\", { fw4, zone, family: 4, direction: \"srcnat\" }) %}\n+{%   endif %}\n+{%   if (zone.masq6 && fw4.default_option(\"fullcone6\")): %}\n+\t\t{%+ include(\"zone-fullcone.uc\", { fw4, zone, family: 6, direction: \"srcnat\" }) %}\n+{%   endif %}\n {%   fw4.includes('chain-append', `srcnat_${zone.name}`) %}\n \t}\n \n--- /dev/null\n+++ b/root/usr/share/firewall4/templates/zone-fullcone.uc\n@@ -0,0 +1,4 @@\n+{# /usr/share/firewall4/templates/zone-fullcone.uc #}\n+\t\tmeta nfproto {{ fw4.nfproto(family) }} fullcone comment \"!fw4: Handle {{\n+\t\tzone.name\n+}} {{ fw4.nfproto(family, true) }} fullcone NAT {{ direction }} traffic\"\n--- a/root/usr/share/ucode/fw4.uc\n+++ b/root/usr/share/ucode/fw4.uc\n@@ -1,3 +1,5 @@\n+// /usr/share/ucode/fw4.uc\n+\n const fs = require(\"fs\");\n const uci = require(\"uci\");\n const ubus = require(\"ubus\");\n@@ -489,6 +491,25 @@ function nft_try_hw_offload(devices) {\n \treturn (rc == 0);\n }\n \n+function nft_try_fullcone() {\n+\tlet nft_test =\n+\t\t'add table inet fw4-fullcone-test; ' +\n+\t\t'add chain inet fw4-fullcone-test dstnat { ' +\n+\t\t\t'type nat hook prerouting priority -100; policy accept; ' +\n+\t\t\t'fullcone; ' +\n+\t\t'}; ' +\n+\t\t'add chain inet fw4-fullcone-test srcnat { ' +\n+\t\t\t'type nat hook postrouting priority -100; policy accept; ' +\n+\t\t\t'fullcone; ' +\n+\t\t'}; ';\n+\tlet cmd = sprintf(\"/usr/sbin/nft -c '%s' 2>/dev/null\", replace(nft_test, \"'\", \"'\\\\''\"));\n+\tlet ok = system(cmd) == 0;\n+\tif (!ok) {\n+\t\twarn(\"nft_try_fullcone: cmd \"+ cmd + \"\\n\");\n+\t}\n+\treturn ok;\n+}\n+\n \n return {\n \tread_kernel_version: function() {\n@@ -855,6 +876,18 @@ return {\n \t\t\twarn(`[!] ${msg}\\n`);\n \t},\n \n+\tmyinfo: function(fmt, ...args) {\n+\t\tif (getenv(\"QUIET\"))\n+\t\t\treturn;\n+\n+\t\tlet msg = sprintf(fmt, ...args);\n+\n+\t\tif (getenv(\"TTY\"))\n+\t\t\twarn(`\\033[32m${msg}\\033[m\\n`);\n+\t\telse\n+\t\t\twarn(`[I] ${msg}\\n`);\n+\t},\n+\n \tget: function(sid, opt) {\n \t\treturn this.cursor.get(\"firewall\", sid, opt);\n \t},\n@@ -1036,6 +1069,21 @@ return {\n \t\t}\n \t},\n \n+\tmyinfo_section: function(s, msg) {\n+\t\tif (s[\".name\"]) {\n+\t\t\tif (s.name)\n+\t\t\t\tthis.myinfo(\"Section %s (%s) %s\", this.section_id(s[\".name\"]), s.name, msg);\n+\t\t\telse\n+\t\t\t\tthis.myinfo(\"Section %s %s\", this.section_id(s[\".name\"]), msg);\n+\t\t}\n+\t\telse {\n+\t\t\tif (s.name)\n+\t\t\t\tthis.myinfo(\"ubus %s (%s) %s\", s.type || \"rule\", s.name, msg);\n+\t\t\telse\n+\t\t\t\tthis.myinfo(\"ubus %s %s\", s.type || \"rule\", msg);\n+\t\t}\n+\t},\n+\n \tparse_policy: function(val) {\n \t\treturn this.parse_enum(val, [\n \t\t\t\"accept\",\n@@ -1475,6 +1523,7 @@ return {\n \t\t\t\"dnat\",\n \t\t\t\"snat\",\n \t\t\t\"masquerade\",\n+\t\t\t\"fullcone\",\n \t\t\t\"accept\",\n \t\t\t\"reject\",\n \t\t\t\"drop\"\n@@ -1946,6 +1995,8 @@ return {\n \t\t}\n \n \t\tlet defs = this.parse_options(data, {\n+\t\t\tfullcone: [ \"bool\", \"0\" ],\n+\t\t\tfullcone6: [ \"bool\", \"0\" ],\n \t\t\tinput: [ \"policy\", \"drop\" ],\n \t\t\toutput: [ \"policy\", \"drop\" ],\n \t\t\tforward: [ \"policy\", \"drop\" ],\n@@ -1980,6 +2031,11 @@ return {\n \n \t\tdelete defs.syn_flood;\n \n+\t\tif (!nft_try_fullcone()) {\n+\t\t\tdelete defs.fullcone;\n+\t\t\twarn(\"nft_try_fullcone failed, disable fullcone globally\\n\");\n+\t\t}\n+\n \t\tthis.state.defaults = defs;\n \t},\n \n@@ -2205,10 +2261,23 @@ return {\n \t\tzone.related_subnets = related_subnets;\n \t\tzone.related_physdevs = related_physdevs;\n \n-\t\tif (zone.masq || zone.masq6)\n+\t\tif (zone.masq) {\n \t\t\tzone.dflags.snat = true;\n+\t\t\tif (this.state.defaults.fullcone) {\n+\t\t\t\tzone.dflags.dnat = true;\n+\t\t\t\tthis.myinfo_section(data, \"IPv4 fullcone enabled for zone '\" + zone.name + \"'\");\n+\t\t\t}\n+\t\t}\n+\n+\t\tif (zone.masq6) {\n+\t\t\tzone.dflags.snat = true;\n+\t\t\tif (this.state.defaults.fullcone6) {\n+\t\t\t\tzone.dflags.dnat = true;\n+\t\t\t\tthis.myinfo_section(data, \"IPv6 fullcone enabled for zone '\" + zone.name + \"'\");\n+\t\t\t}\n+\t\t}\n \n-\t\tif ((zone.auto_helper && !(zone.masq || zone.masq6)) || length(zone.helper)) {\n+\t\tif ((zone.auto_helper && !(zone.masq || zone.masq6 || this.state.defaults.fullcone || this.state.defaults.fullcone6)) || length(zone.helper)) {\n \t\t\tzone.dflags.helper = true;\n \n \t\t\tfor (let helper in (length(zone.helper) ? zone.helper : this.state.helpers)) {\n"
  },
  {
    "path": "devices/common/diy/package/network/config/firewall4/patches/100-fw4-support-script.patch",
    "content": "diff --git a/root/sbin/fw4 b/root/sbin/fw4\nindex c3e95c2..8fa6c6e 100755\n--- a/root/sbin/fw4\n+++ b/root/sbin/fw4\n@@ -20,6 +20,7 @@ start() {\n \t{\n \t\tflock -x 1000\n \n+\t\ttest -f /etc/firewall.exwan && sh /etc/firewall.exwan\n \t\tcase \"$1\" in\n \t\t\tstart)\n \t\t\t\t[ -f $STATE ] && die \"The fw4 firewall appears to be already loaded.\"\n@@ -38,6 +39,7 @@ start() {\n \t\tACTION=includes \\\n \t\t\tutpl -S $MAIN\n \t} 1000>$LOCK\n+\ttest -f /etc/firewall.include && sh /etc/firewall.include\n }\n \n print() {\n"
  },
  {
    "path": "devices/common/diy/package/network/config/firewall4/patches/200-fw4-hotplug-fork.patch",
    "content": "diff --git a/root/etc/hotplug.d/iface/20-firewall b/root/etc/hotplug.d/iface/20-firewall\nindex d0f030b..9a8132c 100644\n--- a/root/etc/hotplug.d/iface/20-firewall\n+++ b/root/etc/hotplug.d/iface/20-firewall\n@@ -14,4 +14,4 @@ has_zone() {\n has_zone || exit 0\n \n logger -t firewall \"Reloading firewall due to $ACTION of $INTERFACE ($DEVICE)\"\n-fw4 -q reload\n+fw4 -q reload &\n"
  },
  {
    "path": "devices/common/diy/package/system/opkg/patches/010-opkg-force-depends.patch",
    "content": "--- a/src/opkg-cl.c\n+++ b/src/opkg-cl.c\n@@ -255,6 +255,10 @@ static int args_parse(int argc, char *argv[])\n \t\t}\n \t}\n \n+\tconf->force_depends = 1;\n+\tconf->force_checksum = 1;\n+\tconf->force_overwrite = 1;\n+\n \tif (!conf->conf_file && !conf->offline_root)\n \t\tconf->conf_file = xstrdup(\"/etc/opkg.conf\");\n\n"
  },
  {
    "path": "devices/common/diy/package/system/opkg/patches/ignore_error.patch",
    "content": "--- a/libopkg/pkg.c\n+++ b/libopkg/pkg.c\n@@ -1422,5 +1422,4 @@\n \t\t\t \"package \\\"%s\\\" %s script returned status %d.\\n\",\n \t\t\t pkg->name, script, err);\n-\t\treturn err;\n \t}\n \n"
  },
  {
    "path": "devices/common/diy/package/system/opkg/patches/pkg_hash.patch",
    "content": "--- a/libopkg/pkg_hash.c\n+++ b/libopkg/pkg_hash.c\n@@ -263,5 +263,5 @@\n \n \tif (unresolved) {\n-\t\tres = 1;\n+\t\t// res = 1;\n \t\ttmp = unresolved;\n \t\twhile (*tmp) {\n"
  },
  {
    "path": "devices/common/diy/package/system/opkg/patches/zh-cn.patch",
    "content": "---  a/libopkg/opkg_download.c\n+++  b/libopkg/opkg_download.c\n@@ -174,9 +174,9 @@\n \t\tif (res) {\n \t\t\topkg_msg(ERROR,\n-\t\t\t\t \"Failed to download %s, wget returned %d.\\n\",\n+\t\t\t\t \"下载失败 %s, wget returned %d.\\n\",\n \t\t\t\t src, res);\n \t\t\tif (res == 4)\n \t\t\t\topkg_msg(ERROR,\n-\t\t\t\t\t \"Check your network settings and connectivity.\\n\\n\");\n+\t\t\t\t\t \"请检查网络设置, 确保本设备网络可用.\\n\\n\");\n \t\t\tfree(tmp_file_location);\n \t\t\treturn -1;\n\n---  a/libopkg/opkg.c\n+++  b/libopkg/opkg.c\n@@ -225,5 +225,5 @@\n \tnew = pkg_hash_fetch_best_installation_candidate_by_name(package_name);\n \tif (!new) {\n-\t\topkg_msg(ERROR, \"Couldn't find package %s\\n\", package_name);\n+\t\topkg_msg(ERROR, \"找不到软件包 %s\\n\", package_name);\n \t\treturn -1;\n \t}\n@@ -242,5 +242,5 @@\n \tif (unresolved) {\n \t\tchar **tmp = unresolved;\n-\t\topkg_msg(ERROR, \"Couldn't satisfy the following dependencies\"\n+\t\topkg_msg(ERROR, \"无法满足以下依赖\"\n \t\t\t \" for %s:\\n\", package_name);\n \t\twhile (*tmp) {\n@@ -271,5 +271,5 @@\n \n \t\tif (pkg->src == NULL) {\n-\t\t\topkg_msg(ERROR, \"Package %s not available from any \"\n+\t\t\topkg_msg(ERROR, \"在以下仓库未找到可用的 %s 软件包\"\n \t\t\t\t \"configured src\\n\", package_name);\n \t\t\treturn -1;\n\n--- a/libopkg/opkg_install.c\n+++ b/libopkg/opkg_install.c\n@@ -222,6 +222,6 @@\n \n \tif (pkg_size_kbs >= kbs_available) {\n-\t\topkg_msg(ERROR, \"Only have %ldkb available on filesystem %s, \"\n-\t\t\t \"pkg %s needs %ld\\n\",\n+\t\topkg_msg(ERROR, \"剩余可用容量不足, 文件系统 %s 当前剩余 %ldkb 可用,\"\n+\t\t\t \"软件包 %s 需要 %ld\\n\",\n \t\t\t kbs_available, root_dir, pkg->name, pkg_size_kbs);\n \t\treturn -1;\n@@ -1319,6 +1319,6 @@\n \t\t}\n \t\tif (err) {\n-\t\t\topkg_msg(ERROR, \"Failed to download %s. \"\n-\t\t\t\t \"Perhaps you need to run 'opkg update'?\\n\",\n+\t\t\topkg_msg(ERROR, \"下载 %s 失败. \"\n+\t\t\t\t \"请更新列表后重试\\n\",\n \t\t\t\t pkg->name);\n \t\t\treturn -1;\n\n--- a/libopkg/opkg_conf.c\n+++ b/libopkg/opkg_conf.c\n@@ -497,10 +497,10 @@\n \tlock_fd = creat(lock_file, S_IRUSR | S_IWUSR | S_IRGRP);\n \tif (lock_fd == -1) {\n-\t\topkg_perror(ERROR, \"Could not create lock file %s\", lock_file);\n+\t\topkg_perror(ERROR, \"有任务在执行中, 请稍后再试.\", lock_file);\n \t\tgoto err2;\n \t}\n \n \tif (lockf(lock_fd, F_TLOCK, (off_t) 0) == -1) {\n-\t\topkg_perror(ERROR, \"Could not lock %s\", lock_file);\n+\t\topkg_perror(ERROR, \"有任务在执行中, 请稍后再试.\", lock_file);\n \t\tif (close(lock_fd) == -1)\n \t\t\topkg_perror(ERROR, \"Couldn't close descriptor %d (%s)\",\n"
  },
  {
    "path": "devices/common/diy.sh",
    "content": "#!/bin/bash\n#=================================================\nshopt -s extglob\n\nsed -i '$a src-git kiddin9 https://github.com/kiddin9/op-packages.git;main' feeds.conf.default\nsed -i \"/telephony/d\" feeds.conf.default\n\nsed -i \"s?targets/%S/packages?targets/%S/\\$(LINUX_VERSION)?\" include/feeds.mk\n\nsed -i '/\trefresh_config();/d' scripts/feeds\n\nsed -i \"s?git.openwrt.org/\\(project\\|feed\\)?github.com/openwrt?g\" feeds.conf.default\n\n./scripts/feeds update -a\n./scripts/feeds install -a -p kiddin9 -f\n./scripts/feeds install -a\n\nsed --follow-symlinks -i \"s#%C\\\"#%C by Kiddin'\\\"#\" package/base-files/files/etc/os-release\nsed -i -e '$a /etc/bench.log' \\\n        -e '/\\/etc\\/profile/d' \\\n        -e '/\\/etc\\/shinit/d' \\\n        package/base-files/files/lib/upgrade/keep.d/base-files-essential\nsed -i -e '/^\\/etc\\/profile/d' \\\n        -e '/^\\/etc\\/shinit/d' \\\n        package/base-files/Makefile\nsed -i \"s/192.168.1/10.0.0/\" package/base-files/files/bin/config_generate\n\nsed -i \"s#false; \\\\\\#true; \\\\\\#\" include/download.mk\n\nwget -N https://github.com/immortalwrt/immortalwrt/raw/refs/heads/openwrt-25.12/package/kernel/linux/modules/video.mk -P package/kernel/linux/modules/\nwget -N https://github.com/immortalwrt/immortalwrt/raw/refs/heads/openwrt-25.12/package/network/utils/nftables/patches/002-nftables-add-fullcone-expression-support.patch -P package/network/utils/nftables/patches/\nwget -N https://github.com/immortalwrt/immortalwrt/raw/refs/heads/openwrt-25.12/package/libs/libnftnl/patches/001-libnftnl-add-fullcone-expression-support.patch -P package/libs/libnftnl/patches/\nwget -N https://github.com/immortalwrt/immortalwrt/raw/refs/heads/openwrt-25.12/package/firmware/wireless-regdb/patches/600-custom-change-txpower-and-dfs.patch -P package/firmware/wireless-regdb/patches/\nwget -N  https://github.com/coolsnowwolf/lede/raw/refs/heads/master/package/system/fstools/patches/0200-ntfs3-with-utf8.patch -P package/system/fstools/patches/\nwget -N https://github.com/immortalwrt/immortalwrt/raw/refs/heads/openwrt-25.12/config/Config-kernel.in -P config/\n\nrm -rf package/libs/openssl package/network/services/ppp\ngit_clone_path openwrt-25.12 https://github.com/immortalwrt/immortalwrt package/libs/openssl package/network/services/ppp \n\necho \"$(date +\"%s\")\" >version.date\nsed -i '/$(curdir)\\/compile:/c\\$(curdir)/compile: package/opkg/host/compile' package/Makefile\nsed -i \"s/DEFAULT_PACKAGES:=/DEFAULT_PACKAGES:=luci-app-advancedplus luci-app-firewall luci-app-package-manager luci-app-upnp luci-app-syscontrol luci-proto-wireguard \\\nluci-app-wizard luci-base luci-compat luci-lib-ipkg luci-lib-fs \\\ncoremark wget-ssl curl autocore htop nano zram-swap kmod-lib-zstd kmod-tcp-bbr bash openssh-sftp-server block-mount resolveip ds-lite swconfig luci-app-fan luci-app-filemanager luci-app-wifihistory /\" include/target.mk\n\nsed -i \"s/^.*vermagic$/\\techo '1' > \\$(LINUX_DIR)\\/.vermagic/\" include/kernel-defaults.mk\n\nstatus=$(curl -H \"Authorization: token $REPO_TOKEN\" -s \"https://api.github.com/repos/kiddin9/op-packages/actions/runs\" | jq -r '.workflow_runs[0].status')\necho \"$status\"\nwhile [[ \"$status\" == \"in_progress\" || \"$status\" == \"queued\" ]];do\n\techo \"wait 5s\"\n\tsleep 5\n\tstatus=$(curl -H \"Authorization: token $REPO_TOKEN\" -s \"https://api.github.com/repos/kiddin9/op-packages/actions/runs\" | jq -r '.workflow_runs[0].status')\ndone\n\nwget -N https://raw.githubusercontent.com/openwrt/packages/master/lang/golang/golang/Makefile -P feeds/packages/lang/golang/golang/\n\n#sed -i \"/call Build\\/check-size,\\$\\$(KERNEL_SIZE)/d\" include/image.mk\n\nsed -i \"/+= targz/d\" include/image.mk\n\ngit_clone_path master https://github.com/coolsnowwolf/lede mv target/linux/generic/hack-6.12\n\nrm -rf target/linux/generic/hack-6.12/767-net-phy-realtek-add-led*\nwget -N https://raw.githubusercontent.com/coolsnowwolf/lede/master/target/linux/generic/pending-6.12/613-netfilter_optional_tcp_window_check.patch -P target/linux/generic/pending-6.12/\n\n# find target/linux/x86 -name \"config*\" -exec bash -c 'cat kernel.conf >> \"{}\"' \\;\nsed -i 's/max_requests 3/max_requests 20/g' package/network/services/uhttpd/files/uhttpd.config\n#rm -rf ./feeds/packages/lang/{golang,node}\nsed -i \"s/tty\\(0\\|1\\)::askfirst/tty\\1::respawn/g\" target/linux/*/base-files/etc/inittab\n\ndate=`date +%m.%d.%Y`\nsed -i -e \"/\\(# \\)\\?REVISION:=/c\\REVISION:=$date\" -e '/VERSION_CODE:=/c\\VERSION_CODE:=$(REVISION)' include/version.mk\n\nsed -i 's/option timeout 30/option timeout 60/g' package/system/rpcd/files/rpcd.config\nsed -i 's#20) \\* 1000#60) \\* 1000#g' feeds/luci/modules/luci-base/htdocs/luci-static/resources/rpc.js\n\nsed -i \\\n\t-e \"s/+\\(luci\\|luci-ssl\\|uhttpd\\)\\( \\|$\\)/\\2/\" \\\n\t-e \"s/+nginx\\( \\|$\\)/+nginx-ssl\\1/\" \\\n\t-e 's/+python\\( \\|$\\)/+python3/' \\\n\t-e 's?../../lang?$(TOPDIR)/feeds/packages/lang?' \\\n\tpackage/feeds/kiddin9/*/Makefile\n\nsed -i \"s/OpenWrt/Kwrt/g\" package/base-files/files/bin/config_generate package/base-files/image-config.in package/network/config/wifi-scripts/files/lib/wifi/mac80211.uc config/Config-images.in Config.in include/u-boot.mk include/version.mk || true\n\nsed -i -e \"s/set \\${s}.country='\\${country || ''}'/set \\${s}.country='\\${country || \\\"CN\\\"}'/g\" -e \"s/set \\${s}.disabled=.*/set \\${s}.disabled='0'/\" package/network/config/wifi-scripts/files/lib/wifi/mac80211.uc\n\nrm -rf package/feeds/packages/jool"
  },
  {
    "path": "devices/common/patches/LINUX_VERSION.patch",
    "content": "--- a/Makefile\n+++ b/Makefile\n@@ -33,6 +33,7 @@ ifneq ($(OPENWRT_BUILD),1)\n   include $(TOPDIR)/include/toplevel.mk\n else\n   include rules.mk\n+  include $(INCLUDE_DIR)/target.mk\n   include $(INCLUDE_DIR)/depends.mk\n   include $(INCLUDE_DIR)/subdir.mk\n   include target/Makefile\n@@ -131,6 +132,10 @@ world: prepare $(target/stamp-compile) $(package/stamp-compile) $(package/stamp-\n \t$(_SINGLE)$(SUBMAKE) -r package/index\n \t$(_SINGLE)$(SUBMAKE) -r json_overview_image_info\n \t$(_SINGLE)$(SUBMAKE) -r checksum\n+\tcp -f $(BIN_DIR)/packages/Packages.manifest $(BIN_DIR)/\n+\trm -rf $(BIN_DIR)/$(LINUX_VERSION)\n+\tmv -f $(BIN_DIR)/packages $(BIN_DIR)/$(LINUX_VERSION) 2>/dev/null\n+\tmv -f $(BIN_DIR)/profiles.json $(BIN_DIR)/profiles.json.b 2>/dev/null\n ifneq ($(CONFIG_CCACHE),)\n \t$(STAGING_DIR_HOST)/bin/ccache -s\n endif\n"
  },
  {
    "path": "devices/common/patches/autoreconf.patch",
    "content": "--- a/package/libs/libnftnl/Makefile\n+++ b/package/libs/libnftnl/Makefile\n@@ -19,6 +19,7 @@\n PKG_MAINTAINER:=Steven Barth <steven@midlink.org>\n PKG_LICENSE:=GPL-2.0-or-later\n PKG_LICENSE_FILES:=COPYING\n+PKG_FIXUP:=autoreconf\n \n PKG_INSTALL:=1\n PKG_BUILD_PARALLEL:=1"
  },
  {
    "path": "devices/common/patches/base-files.patch",
    "content": "--- a/package/base-files/files/lib/functions.sh\n+++ b/package/base-files/files/lib/functions.sh\n@@ -395,10 +395,13 @@ default_postinst() {\n \t\t\tif [ \"$PKG_UPGRADE\" != \"1\" ]; then\n \t\t\t\t\"$i\" enable\n \t\t\tfi\n-\t\t\t\"$i\" start\n+\t\t\tif \"$i\" enabled; then\n+\t\t\t\t\"$i\" start\n+\t\t\tfi\n \t\tfi\n \tdone\n \n+\t[ -x /etc/init.d/ucitrack ] && /etc/init.d/ucitrack reload\n \treturn $ret\n }\n \n\n--- a/package/base-files/files/etc/shinit\n+++ b/package/base-files/files/etc/shinit\n@@ -2,6 +2,8 @@\n [ -x /usr/bin/vim ] && alias vi=vim || alias vim=vi\n \n alias ll='ls -alF --color=auto'\n+alias reboot='(/bin/busybox reboot &);sleep 3;/bin/busybox reboot -f'\n+PS1='\\[\\e[32m\\][\\[\\e[m\\]\\[\\e[31m\\]\\u\\[\\e[m\\]\\[\\e[33m\\]@\\[\\e[m\\]\\[\\e[32m\\]\\h\\[\\e[m\\]:\\[\\e[m\\]\\[\\e[32m\\]\\[\\e[1;32m\\]\\@\\[\\e[36m\\] \\w\\[\\e[m\\]\\[\\e[32m\\]]\\[\\e[0m\\] \\$\\[\\e[m\\] '\n \n [ -z \"$KSH_VERSION\" -o \\! -s /etc/mkshrc ] || . /etc/mkshrc\n\n--- a/package/base-files/files/sbin/sysupgrade\n+++ b/package/base-files/files/sbin/sysupgrade\n@@ -287,11 +287,7 @@ create_backup_archive() {\n \t\t\t\t# Format: pkg-name<TAB>{rom,overlay,unknown}\n \t\t\t\t# rom is used for pkgs in /rom, even if updated later\n \t\t\t\tif [ -d \"/usr/lib/opkg/info\" ]; then\n-\t\t\t\t\ttar_print_member \"$INSTALLED_PACKAGES\" \"$(find /usr/lib/opkg/info -name \"*.control\" \\( \\\n-\t\t\t\t\t\t\\( -exec test -f /rom/{} \\; -exec echo {} rom \\; \\) -o \\\n-\t\t\t\t\t\t\\( -exec test -f /overlay/upper/{} \\; -exec echo {} overlay \\; \\) -o \\\n-\t\t\t\t\t\t\\( -exec echo {} unknown \\; \\) \\\n-\t\t\t\t\t\t\\) | sed -e 's,.*/,,;s/\\.control /\\t/')\" || ret=1\n+\t\t\t\t\t. /etc/profile.d/opkg.sh && opkg save\n \t\t\t\telif [ -d \"/lib/apk/packages\" ]; then\n \t\t\t\t\ttar_print_member \"$INSTALLED_PACKAGES\" \"$(find /lib/apk/packages -name \"*.list\" \\( \\\n \t\t\t\t\t\t\\( -exec test -f /rom/{} \\; -exec echo {} rom \\; \\) -o \\\n@@ -299,6 +295,10 @@ create_backup_archive() {\n \t\t\t\t\t\t\\( -exec echo {} unknown \\; \\) \\\n \t\t\t\t\t\t\\) | sed -e 's,.*/,,;s/\\.list /\\t/')\" || ret=1\n \t\t\t\tfi\n+\t\t\telse\n+\t\t\t\tuci -q del opkg.auto\n+\t\t\t\tuci -q del opkg.custom\n+\t\t\t\tuci commit opkg\n \t\t\tfi\n \t\tfi\n \n\n--- a/package/base-files/files/etc/profile\n+++ b/package/base-files/files/etc/profile\n@@ -33,7 +33,11 @@ esac\n if [ -z \"$FAILSAFE\" ] ; then\n \tfor FILE in /etc/profile.d/*.sh ; do\n \t\t[ -f \"${FILE%.sh}.hush\" ] && continue\n-\t\t[ -f \"$FILE\" ] && . \"$FILE\"\n+\t\tif [ \"$FILE\" == \"/etc/profile.d/30-sysinfo.sh\" ]; then\n+\t\t [ \"$(which bash)\" ] && env -i bash \"$FILE\"\n+\t\telse\n+\t\t [ -f \"$FILE\" ] && . \"$FILE\"\n+\t\tfi\n \tdone\n \tunset FILE\n fi\n\n--- a/package/base-files/files/lib/preinit/02_sysinfo\n+++ b/package/base-files/files/lib/preinit/02_sysinfo\n@@ -5,6 +5,7 @@ do_sysinfo_generic() {\n \t\techo \"$(strings /proc/device-tree/compatible | head -1)\" > /tmp/sysinfo/board_name\n \t[ ! -e /tmp/sysinfo/model -a -e /proc/device-tree/model ] && \\\n \t\techo \"$(cat /proc/device-tree/model)\" > /tmp/sysinfo/model\n+\tsed -i \"s/friendlyelec/friendlyarm/\" /tmp/sysinfo/board_name\n }\n \n boot_hook_add preinit_main do_sysinfo_generic\n\n"
  },
  {
    "path": "devices/common/patches/china_mirrors.patch.b",
    "content": "--- a/scripts/download.pl\n+++ b/scripts/download.pl\n@@ -201,6 +201,10 @@ sub cleanup\n \t\tpush @mirrors, \"https://mirror.leaseweb.com/debian/$1\";\n \t\tpush @mirrors, \"https://mirror.netcologne.de/debian/$1\";\n \t} elsif ($mirror =~ /^\\@APACHE\\/(.+)$/) {\n+\t\tpush @mirrors, \"https://mirrors.tencent.com/apache/$1\";\n+\t\tpush @mirrors, \"https://mirrors.aliyun.com/apache/$1\";\n+\t\tpush @mirrors, \"https://mirrors.tuna.tsinghua.edu.cn/apache/$1\";\n+\t\tpush @mirrors, \"https://mirrors.ustc.edu.cn/apache/$1\";\n \t\tpush @mirrors, \"https://mirror.netcologne.de/apache.org/$1\";\n \t\tpush @mirrors, \"https://mirror.aarnet.edu.au/pub/apache/$1\";\n \t\tpush @mirrors, \"https://mirror.csclub.uwaterloo.ca/apache/$1\";\n@@ -211,11 +215,35 @@ sub cleanup\n \t\tpush @mirrors, \"ftp://apache.cs.utah.edu/apache.org/$1\";\n \t\tpush @mirrors, \"ftp://apache.mirrors.ovh.net/ftp.apache.org/dist/$1\";\n \t} elsif ($mirror =~ /^\\@GITHUB\\/(.+)$/) {\n+\t\tmy $dir = $1;\n+\t\tmy $i = 0;\n+\t\t# replace the 2nd '/' with '@' for jsDelivr mirror\n+\t\tpush @mirrors, \"https://cdn.jsdelivr.net/gh/\". $dir =~ s{\\/}{++$i == 2 ? '@' : $&}ger;\n+\t\tpush @mirrors, \"https://raw.sevencdn.com/$dir\";\n+\t\tpush @mirrors, \"https://raw.fastgit.org/$dir\";\n+\t\tpush @mirrors, \"https://pd.zwc365.com/seturl/https://raw.githubusercontent.com/$dir\";\n+\t\tpush @mirrors, \"https://ghproxy.com/https://raw.githubusercontent.com/$dir\";\n+\t\tpush @mirrors, \"https://pd.zwc365.com/cfworker/https://raw.githubusercontent.com/$dir\";\n \t\t# give github a few more tries (different mirrors)\n \t\tfor (1 .. 5) {\n-\t\t\tpush @mirrors, \"https://raw.githubusercontent.com/$1\";\n+\t\t\tpush @mirrors, \"https://raw.githubusercontent.com/$dir\";\n \t\t}\n+\t} elsif ($mirror =~ /^\\@GHCODELOAD\\/(.+)$/) {\n+\t\tpush @mirrors, \"https://pd.zwc365.com/seturl/https://codeload.github.com/$1\";\n+\t\tpush @mirrors, \"https://ghproxy.com/https://codeload.github.com/$1\";\n+\t\tpush @mirrors, \"https://pd.zwc365.com/cfworker/https://codeload.github.com/$1\";\n+\t\tpush @mirrors, \"https://codeload.github.com/$1\";\n+\t} elsif ($mirror =~ /^\\@GHREPO\\/(.+)$/) {\n+\t\tpush @mirrors, \"https://pd.zwc365.com/seturl/https://github.com/$1\";\n+\t\tpush @mirrors, \"https://github.com.cnpmjs.org/$1\";\n+\t\tpush @mirrors, \"https://ghproxy.com/https://github.com/$1\";\n+\t\tpush @mirrors, \"https://hub.fastgit.org/$1\";\n+\t\tpush @mirrors, \"https://github.com/$1\";\n \t} elsif ($mirror =~ /^\\@GNU\\/(.+)$/) {\n+\t\tpush @mirrors, \"https://mirrors.tencent.com/gnu/$1\";\n+\t\tpush @mirrors, \"https://mirrors.tuna.tsinghua.edu.cn/gnu/$1\";\n+\t\tpush @mirrors, \"https://mirrors.cqu.edu.cn/gnu/$1\";\n+\t\tpush @mirrors, \"https://mirrors.ustc.edu.cn/gnu/$1\";\n \t\tpush @mirrors, \"https://mirror.csclub.uwaterloo.ca/gnu/$1\";\n \t\tpush @mirrors, \"https://mirror.netcologne.de/gnu/$1\";\n \t\tpush @mirrors, \"http://ftp.kddilabs.jp/GNU/gnu/$1\";\n@@ -240,6 +268,8 @@ sub cleanup\n \t\t\tpush @extra, \"$extra[0]/longterm/v$1\";\n \t\t}\n \t\tforeach my $dir (@extra) {\n+\t\t\tpush @mirrors, \"https://mirrors.cqu.edu.cn/kernel/$dir\";\n+\t\t\tpush @mirrors, \"https://mirrors.ustc.edu.cn/kernel.org/$dir\";\n \t\t\tpush @mirrors, \"https://cdn.kernel.org/pub/$dir\";\n \t\t\tpush @mirrors, \"https://download.xs4all.nl/ftp.kernel.org/pub/$dir\";\n \t\t\tpush @mirrors, \"https://mirrors.mit.edu/kernel/$dir\";\n@@ -250,6 +280,7 @@ sub cleanup\n \t\t}\n \t} elsif ($mirror =~ /^\\@GNOME\\/(.+)$/) {\n \t\tpush @mirrors, \"https://download.gnome.org/sources/$1\";\n+\t\tpush @mirrors, \"https://mirrors.ustc.edu.cn/gnome/sources/$1\";\n \t\tpush @mirrors, \"https://mirror.csclub.uwaterloo.ca/gnome/sources/$1\";\n \t\tpush @mirrors, \"http://ftp.acc.umu.se/pub/GNOME/sources/$1\";\n \t\tpush @mirrors, \"http://ftp.kaist.ac.kr/gnome/sources/$1\";\n@@ -263,6 +294,7 @@ sub cleanup\n \t}\n }\n \n+unshift @mirrors, \"http://182.140.223.146\";\n push @mirrors, 'https://sources.cdn.openwrt.org';\n push @mirrors, 'https://sources.openwrt.org';\n push @mirrors, 'https://mirror2.openwrt.org/sources';\n@@ -296,4 +328,3 @@ sub cleanup\n }\n \n $SIG{INT} = \\&cleanup;\n-\n"
  },
  {
    "path": "devices/common/patches/cmake.patch",
    "content": "--- a/include/cmake.mk\n+++ b/include/cmake.mk\n@@ -127,6 +127,7 @@ define Build/Configure/Default\n \t\t\t-DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=TRUE \\\n \t\t\t-DCMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY=FALSE \\\n \t\t\t-DCMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY=TRUE \\\n+\t\t\t-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \\\n \t\t\t$(CMAKE_OPTIONS) \\\n \t\t$(CMAKE_SOURCE_DIR) \\\n \t)"
  },
  {
    "path": "devices/common/patches/compressed-memory.patch.b",
    "content": "--- a/package/kernel/linux/modules/crypto.mk\n+++ b/package/kernel/linux/modules/crypto.mk\n@@ -809,3 +809,18 @@ endef\n \n $(eval $(call KernelPackage,crypto-xts))\n \n+\n+define KernelPackage/crypto-zstd\n+  TITLE:=zstd compression CryptoAPI module\n+  DEPENDS:=+kmod-lib-zstd +kmod-crypto-acompress\n+  KCONFIG:=CONFIG_CRYPTO_ZSTD\n+  FILES:=$(LINUX_DIR)/crypto/zstd.ko\n+  AUTOLOAD:=$(call AutoLoad,09,zstd)\n+  $(call AddDepends/crypto)\n+endef\n+\n+define KernelPackage/crypto-zstd/description\n+ Kernel module for the CryptoAPI to support Zstandard\n+endef\n+\n+$(eval $(call KernelPackage,crypto-zstd))\n\n--- a/package/kernel/linux/modules/lib.mk\n+++ b/package/kernel/linux/modules/lib.mk\n@@ -166,6 +166,27 @@ endef\n $(eval $(call KernelPackage,lib-lz4))\n \n \n+define KernelPackage/lib-lz4hc\n+  SUBMENU:=$(LIB_MENU)\n+  TITLE:=LZ4HC support\n+  DEPENDS:=+kmod-lib-lz4 +kmod-crypto-acompress\n+  HIDDEN:=1\n+  KCONFIG:= \\\n+\tCONFIG_CRYPTO_LZ4HC \\\n+\tCONFIG_LZ4HC_COMPRESS\n+  FILES:= \\\n+\t$(LINUX_DIR)/crypto/lz4hc.ko \\\n+\t$(LINUX_DIR)/lib/lz4/lz4hc_compress.ko\n+  AUTOLOAD:=$(call AutoProbe,lz4hc lz4hc_compress)\n+endef\n+\n+define KernelPackage/lib-lz4hc/description\n+ Kernel module for LZ4HC compression/decompression support\n+endef\n+\n+$(eval $(call KernelPackage,lib-lz4hc))\n+\n+\n define KernelPackage/lib-raid6\n   SUBMENU:=$(LIB_MENU)\n   TITLE:=RAID6 algorithm support\n\n--- a/package/kernel/linux/modules/other.mk\n+++ b/package/kernel/linux/modules/other.mk\n@@ -869,6 +869,85 @@ endef\n $(eval $(call KernelPackage,zram))\n \n \n+define KernelPackage/zsmalloc\n+  SUBMENU:=$(OTHER_MENU)\n+  TITLE:=ZSMALLOC support\n+  DEPENDS:=+kmod-crypto-deflate \\\n+\t+kmod-lib-lz4 \\\n+\t@!PACKAGE_kmod-zram\n+  KCONFIG:= \\\n+\tCONFIG_ZSMALLOC \\\n+\tCONFIG_ZSMALLOC_STAT=n\n+  FILES:= $(LINUX_DIR)/mm/zsmalloc.ko\n+  AUTOLOAD:=$(call AutoLoad,19,zsmalloc)\n+endef\n+\n+define KernelPackage/zsmalloc/description\n+ Special purpose memory allocator for compressed memory pages\n+endef\n+\n+define KernelPackage/zsmalloc/config\n+\tif PACKAGE_kmod-zsmalloc\n+\t\tconfig KERNEL_PGTABLE_MAPPING\n+\t\t\tbool \"zsmalloc: enable CONFIG_PGTABLE_MAPPING\"\n+\t\t\tdefault y if arm\n+\t\t\tdefault n\n+\t\t\thelp\n+\t  Enable CONFIG_PGTABLE_MAPPING in the kernel for faster memory\n+\t  allocations when using ZSMALLOC, in some architectures. Enabled\n+\t  by default for the ARM architecture because it may be a huge\n+\t  performance boost.\n+\tendif\n+endef\n+\n+$(eval $(call KernelPackage,zsmalloc))\n+\n+\n+define KernelPackage/zram-writeback\n+  SUBMENU:=$(OTHER_MENU)\n+  TITLE:=zram with writeback support\n+  DEPENDS:=+kmod-zsmalloc\n+  KCONFIG:= \\\n+\tCONFIG_ZRAM \\\n+\tCONFIG_ZRAM_DEBUG=n \\\n+\tCONFIG_ZRAM_MEMORY_TRACKING=n \\\n+\tCONFIG_ZRAM_WRITEBACK=y\n+  FILES:= \\\n+\t$(LINUX_DIR)/drivers/block/zram/zram.ko\n+  AUTOLOAD:=$(call AutoLoad,20,zram)\n+endef\n+\n+define KernelPackage/zram-writeback/description\n+ Compressed RAM disk with support for page writeback\n+endef\n+\n+$(eval $(call KernelPackage,zram-writeback))\n+\n+\n+define KernelPackage/zswap\n+  SUBMENU:=$(OTHER_MENU)\n+  TITLE:=zswap compressed swapping cache\n+  DEPENDS:=+kmod-zsmalloc\n+  KCONFIG:= \\\n+\tCONFIG_FRONTSWAP=y \\\n+\tCONFIG_Z3FOLD \\\n+\tCONFIG_ZBUD \\\n+\tCONFIG_ZPOOL \\\n+\tCONFIG_ZSWAP=y\n+  FILES:= \\\n+\t$(LINUX_DIR)/mm/z3fold.ko \\\n+\t$(LINUX_DIR)/mm/zbud.ko \\\n+\t$(LINUX_DIR)/mm/zpool.ko\n+  AUTOLOAD:=$(call AutoLoad,20,z3fold zbud zpool)\n+endef\n+\n+define KernelPackage/zswap/description\n+ Compressed swap cache and compressed memory allocator support\n+endef\n+\n+$(eval $(call KernelPackage,zswap))\n+\n+\n define KernelPackage/pps\n   SUBMENU:=$(OTHER_MENU)\n   TITLE:=PPS support\n"
  },
  {
    "path": "devices/common/patches/crontab.patch",
    "content": "From 388238b9baf8375e5474167c987a4a8a3358b559 Mon Sep 17 00:00:00 2001\nFrom: Paul Donald <newtwen+github@gmail.com>\nDate: Wed, 23 Apr 2025 00:03:25 +0200\nSubject: [PATCH] luci-mod-system: give crontab a helper page\n\nReference: https://github.com/openwrt/luci/pull/7495\n\nSigned-off-by: Paul Donald <newtwen+github@gmail.com>\n---\n .../resources/view/system/crontabhelper.js    | 334 ++++++++++++++++++\n .../share/luci/menu.d/luci-mod-system.json    |  14 +-\n 2 files changed, 347 insertions(+), 1 deletion(-)\n create mode 100644 feeds/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontabhelper.js\n\ndiff --git a/feeds/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontabhelper.js b/feeds/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontabhelper.js\nnew file mode 100644\nindex 000000000000..861d4d1f77a5\n--- /dev/null\n+++ b/feeds/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontabhelper.js\n@@ -0,0 +1,334 @@\n+'use strict';\n+'require view';\n+'require fs';\n+'require ui';\n+\n+var isReadonlyView = !L.hasViewPermission() || null;\n+\n+\n+const yearly  = { minute: '@yearly',  command: '', comment: '', };\n+const monthly = { minute: '@monthly', command: '', comment: '', };\n+const weekly  = { minute: '@weekly',  command: '', comment: '', };\n+const daily   = { minute: '@daily',   command: '', comment: '', };\n+const hourly  = { minute: '@hourly',  command: '', comment: '', };\n+const a_task  = { minute: '*', hour: '*', day: '*', month: '*', weekday: '*', command: '', comment: '', };\n+const alias   = { minute: '@', hour: '*', day: '*', month: '*', weekday: '*', command: '', comment: '', };\n+\n+const width = 'width:100px;';\n+const double_width = 'width:300px';\n+const padding = 'padding:3px;';\n+const centre = 'text-align:center;';\n+\n+return view.extend({\n+\tload() {\n+\t\treturn L.resolveDefault(fs.read('/etc/crontabs/root'), '');\n+\t},\n+\n+\thandleSave(ev) {\n+\t\tconst tasks = Array.from(document.querySelectorAll('.crontab-row')).map(row => {\n+\t\t\tconst getFieldValue = (fieldName) => {\n+\t\t\t\tconst mode = row.querySelector(`.${fieldName}-mode`)?.value;\n+\n+\t\t\t\tswitch (mode) {\n+\t\t\t\tcase 'custom':\n+\t\t\t\t\tconst custom = row.querySelector(`.${fieldName}-custom`)?.value?.trim();\n+\t\t\t\t\treturn custom;\n+\t\t\t\tcase 'ignore':\n+\t\t\t\t\treturn '*';\n+\t\t\t\tcase 'interval':\n+\t\t\t\t\tconst interval = row.querySelector(`.${fieldName}-interval`)?.value?.trim();\n+\t\t\t\t\treturn interval ? `*/${interval}` : '*'; // Every Xth unit\n+\t\t\t\tcase 'specific':\n+\t\t\t\t\tconst specific = row.querySelector(`.${fieldName}-specific`)?.value?.trim();\n+\t\t\t\t\treturn specific || '*'; // Specific units\n+\t\t\t\t}\n+\t\t\t};\n+\n+\t\t\tconst comment = row.querySelector('.comment')?.value?.trim();\n+\t\t\tconst minute  = row.querySelector('.minute')?.value?.trim();\n+\n+\t\t\t// if it's a # comment row, just stuff the comment and return\n+\t\t\tif (minute == comment)\n+\t\t\t\treturn { iscomment: true, comment: comment };\n+\t\t\telse\n+\t\t\t\treturn {\n+\t\t\t\t\tminute: getFieldValue('minute') || '*',\n+\t\t\t\t\thour: getFieldValue('hour') || '*',\n+\t\t\t\t\tday: getFieldValue('day') || '*',\n+\t\t\t\t\tmonth: getFieldValue('month') || '*',\n+\t\t\t\t\tweekday: getFieldValue('weekday') || '*',\n+\t\t\t\t\tcommand: row.querySelector('.command')?.value?.trim(),\n+\t\t\t\t\tcomment: comment ? `# ${comment}` : '',\n+\t\t\t\t};\n+\t\t});\n+\n+\t\tconst value = tasks.map(task => {\n+\t\t\tif (task.iscomment)\n+\t\t\t\treturn `${task.comment}`;\n+\t\t\telse if (task.minute[0] !== '@')\n+\t\t\t\treturn `${task.minute} ${task.hour} ${task.day} ${task.month} ${task.weekday} ${task.command} ${task.comment}`;\n+\t\t\telse\n+\t\t\t\treturn `${task.minute} ${task.command} ${task.comment}`;\n+\t\t}).join('\\n') + '\\n';\n+\n+\t\treturn fs.write('/etc/crontabs/root', value).then(() => {\n+\t\t\tui.addTimeLimitedNotification(null, E('p', _('Contents have been saved.')), 5000, 'info');\n+\t\t\treturn fs.exec('/etc/init.d/cron', [ 'reload' ]);\n+\t\t}).catch(e => {\n+\t\t\tui.addNotification(null, E('p', _('Unable to save contents: %s').format(e.message)));\n+\t\t});\n+\t},\n+\n+\trender(crontab) {\n+\t\tconst tasks = (crontab || '').split('\\n').filter(line => line.trim()).map(line => {\n+\t\t\tif (line.startsWith('#'))\n+\t\t\t\treturn {\n+\t\t\t\t\t// stash comment lines for saving later\n+\t\t\t\t\tminute:  line,\n+\t\t\t\t\tcomment: line,\n+\t\t\t\t};\n+\t\t\tconst parts = line.split(/\\s+/);\n+\t\t\tconst commentIndex = parts.findIndex(part => part.startsWith('#'));\n+\t\t\t// exclude the '#' character from comments existing in valid command rows:\n+\t\t\tif (commentIndex !== -1) parts[commentIndex] = parts[commentIndex].substring(1)?.trim();\n+\t\t\tconst comment = commentIndex !== -1 ? parts.slice(commentIndex).join(' ') : '';\n+\n+\t\t\tif(parts[0][0] == '@') {\n+\t\t\t\tconst updatedTask = { ...alias };\n+\t\t\t\tupdatedTask.minute = parts[0];\n+\t\t\t\tupdatedTask.command = commentIndex !== -1 ? parts.slice(1, commentIndex).join(' ') : parts.slice(1).join(' ');\n+\t\t\t\tupdatedTask.comment = comment;\n+\t\t\t\treturn updatedTask;\n+\t\t\t}\n+\n+\t\t\treturn {\n+\t\t\t\tminute:  parts[0] || '',\n+\t\t\t\thour:    parts[1] || '',\n+\t\t\t\tday:     parts[2] || '',\n+\t\t\t\tmonth:   parts[3] || '',\n+\t\t\t\tweekday: parts[4] || '',\n+\t\t\t\tcommand: commentIndex !== -1 ? parts.slice(5, commentIndex).join(' ') : parts.slice(5).join(' ') || '',\n+\t\t\t\tcomment: comment || '',\n+\t\t\t};\n+\t\t});\n+\n+\t\treturn E([\n+\t\t\tE('h2', _('Scheduled Tasks')),\n+\t\t\tE('p', { 'class': 'cbi-section-descr' }, _('Define your scheduled tasks for root below.') + '<br/>' + \n+\t\t\t\t_('CSV - Comma Separated Value(s)')),\n+\t\t\tE('a', { 'href': 'https://openwrt.org/docs/guide-user/base-system/cron', 'target':'_blank' }, _('Crontab help wiki')),\n+\t\t\tE('table', { 'class': 'table', }, [\n+\t\t\t\tE('thead', {}, [\n+\t\t\t\t\tE('tr', {}, [\n+\t\t\t\t\t\tE('th', {}, _('Minute / Alias', 'minute or crontab alias field')),\n+\t\t\t\t\t\tE('th', {}, _('Hour')),\n+\t\t\t\t\t\tE('th', {}, _('Day')),\n+\t\t\t\t\t\tE('th', {}, _('Month')),\n+\t\t\t\t\t\tE('th', {}, _('Weekday')),\n+\t\t\t\t\t\tE('th', {}, _('Command')),\n+\t\t\t\t\t\tE('th', {}, _('Comment')),\n+\t\t\t\t\t\tE('th', {}, _('Action'))\n+\t\t\t\t\t])\n+\t\t\t\t]),\n+\t\t\t\tE('tbody', { 'id': 'crontab-rows' }, this.renderTaskRows(tasks)),\n+\t\t\t\tE('hr', {}),\n+\t\t\t\tE('tfoot', {}, [\n+\t\t\t\t\tE('tr', {}, [\n+\t\t\t\t\t\tE('td', { 'colspan': 1, 'style': padding }, [\n+\t\t\t\t\t\t\tE('button', { 'class': 'btn', 'click': ui.createHandlerFn(this, 'addTask', alias   ) }, _('Add alias'))\n+\t\t\t\t\t\t]),\n+\t\t\t\t\t\tE('td', { 'colspan': 1, 'style': padding }, [\n+\t\t\t\t\t\t\tE('button', { 'class': 'btn', 'click': ui.createHandlerFn(this, 'addTask', yearly  ) }, _('Yearly task'))\n+\t\t\t\t\t\t]),\n+\t\t\t\t\t\tE('td', { 'colspan': 1, 'style': padding }, [\n+\t\t\t\t\t\t\tE('button', { 'class': 'btn', 'click': ui.createHandlerFn(this, 'addTask', monthly ) }, _('Monthly task'))\n+\t\t\t\t\t\t]),\n+\t\t\t\t\t\tE('td', { 'colspan': 1, 'style': padding }, [\n+\t\t\t\t\t\t\tE('button', { 'class': 'btn', 'click': ui.createHandlerFn(this, 'addTask', weekly  ) }, _('Weekly task'))\n+\t\t\t\t\t\t]),\n+\t\t\t\t\t\tE('td', { 'colspan': 1, 'style': padding }, [\n+\t\t\t\t\t\t\tE('button', { 'class': 'btn', 'click': ui.createHandlerFn(this, 'addTask', daily   ) }, _('Daily task'))\n+\t\t\t\t\t\t]),\n+\t\t\t\t\t\tE('td', { 'colspan': 1, 'style': padding }, [\n+\t\t\t\t\t\t\tE('button', { 'class': 'btn', 'click': ui.createHandlerFn(this, 'addTask', hourly  ) }, _('Hourly task'))\n+\t\t\t\t\t\t]),\n+\t\t\t\t\t\tE('td', { 'colspan': 1, 'style': padding }, [\n+\t\t\t\t\t\t\tE('button', { 'class': 'btn', 'click': ui.createHandlerFn(this, 'addTask') }, _('Add custom task'))\n+\t\t\t\t\t\t]),\n+\t\t\t\t\t])\n+\t\t\t\t])\n+\t\t\t])\n+\t\t]);\n+\t},\n+\n+\trenderTaskRows(tasks) {\n+\t\tconst rows = [];\n+\n+\t\ttasks.forEach((task, index) => {\n+\t\t\tif (task?.minute.startsWith('#') && task?.comment){\n+\t\t\t\trows.push(this.renderCommentRow(task));\n+\t\t\t\treturn;\n+\t\t\t}\n+\t\t\trows.push(E('tr', { 'class': 'crontab-hr' }, E('td', { 'colspan': 8 }, E('hr', { 'style': 'margin: 10px 0;' }))));\n+\t\t\tif (task.minute[0] == '@')\n+\t\t\t\trows.push(this.renderAliasRow(task));\n+\t\t\telse\n+\t\t\t\trows.push(this.renderTaskRow(task));\n+\t\t});\n+\n+\t\treturn rows;\n+\t},\n+\n+\trenderAliasRow(task) {\n+\t\treturn E('tr', { 'class': 'crontab-row', 'style': padding }, [\n+\t\t\t\t\tthis.createTimeDropdown('minute', task.minute, 'Minute'),\n+\t\t\t\t\tE('td', { 'style': padding + centre }, _('-')), // Hour - empty\n+\t\t\t\t\tE('td', { 'style': padding + centre }, _('-')), // Day - empty\n+\t\t\t\t\tE('td', { 'style': padding + centre }, _('-')), // Month - empty\n+\t\t\t\t\tE('td', { 'style': padding + centre }, _('-')), // Weekday - empty\n+\t\t\t\t\tE('td', { 'style': padding + centre },\n+\t\t\t\t\t\tE('div', {}, [\n+\t\t\t\t\t\t\tE('label', {}, _('Command')),\n+\t\t\t\t\t\t\tE('input', { 'type': 'text', 'class': 'command', 'style': double_width, 'value': task.command, 'disabled': isReadonlyView }),\n+\t\t\t\t\t\t]),\n+\t\t\t\t\t),\n+\t\t\t\t\tE('td', { 'style': padding },\n+\t\t\t\t\t\tE('div', {}, [\n+\t\t\t\t\t\t\tE('label', {}, _('Comment')),\n+\t\t\t\t\t\t\tE('input', { 'type': 'text', 'class': 'comment', 'style': width, 'value': task.comment, 'disabled': isReadonlyView }),\n+\t\t\t\t\t\t]),\n+\t\t\t\t\t),\n+\t\t\t\t\tE('td', { 'style': padding }, [\n+\t\t\t\t\t\tE('button', { 'class': 'btn remove-task cbi-button-negative', 'click': ui.createHandlerFn(this, 'removeTask') }, _('Remove'))\n+\t\t\t\t\t])\n+\t\t\t\t]);\n+\t},\n+\n+\trenderTaskRow(task) {\n+\t\treturn E('tr', { 'class': 'crontab-row' }, [\n+\t\t\t\t\tthis.createTimeDropdown('minute', task.minute, 'Minute', 0, 59),\n+\t\t\t\t\tthis.createTimeDropdown('hour', task.hour, 'Hour', 0, 23),\n+\t\t\t\t\tthis.createTimeDropdown('day', task.day, 'Day', 0, 31),\n+\t\t\t\t\tthis.createTimeDropdown('month', task.month, 'Month', 0, 12),\n+\t\t\t\t\tthis.createTimeDropdown('weekday', task.weekday, 'Weekday', 0, 6),\n+\t\t\t\t\tE('td', { 'style': padding }, E('input', { 'type': 'text', 'class': 'command', 'style': double_width, 'value': task.command, 'disabled': isReadonlyView })),\n+\t\t\t\t\tE('td', { 'style': padding }, E('input', { 'type': 'text', 'class': 'comment', 'style': width, 'value': task.comment, 'disabled': isReadonlyView })),\n+\t\t\t\t\tE('td', { 'style': padding }, [\n+\t\t\t\t\t\tE('button', { 'class': 'btn remove-task cbi-button-negative', 'click': ui.createHandlerFn(this, 'removeTask') }, _('Remove'))\n+\t\t\t\t\t])\n+\t\t\t\t]);\n+\t},\n+\n+\t/* \n+\thide the comment rows in valid fields, but don't display them.\n+\t*/\n+\trenderCommentRow(task) {\n+\t\t// \n+\t\treturn E('tr', { 'class': 'crontab-row', 'style': 'display: none; ' }, [\n+\t\t\tE('td', { 'style': padding },\n+\t\t\t\tE('div', {}, [\n+\t\t\t\t\tE('label', {}, _('Minute')),\n+\t\t\t\t\tE('input', { 'type': 'text', 'class': 'minute', 'style': width, 'value': task.comment, 'disabled': isReadonlyView }),\n+\t\t\t\t]),\n+\t\t\t),\n+\t\t\tE('td', { 'style': padding },\n+\t\t\t\tE('div', {}, [\n+\t\t\t\t\tE('label', {}, _('Comment')),\n+\t\t\t\t\tE('input', { 'type': 'text', 'class': 'comment', 'style': width, 'value': task.comment, 'disabled': isReadonlyView }),\n+\t\t\t\t]),\n+\t\t\t),\n+\t\t]);\n+\t},\n+\n+\t/* \n+\tcreates a block of entry fields customisable to the time interval type\n+\t*/\n+\tcreateTimeDropdown(fieldName, value, label, min, max) {\n+\t\tconst mode = value.includes(',') || parseInt(value, 10) >= 0 || value.startsWith('@')\n+\t\t\t? (value.split(',').filter(v => v.startsWith('*/')).length > 1 || value.startsWith('@') ? 'custom' : 'specific')\n+\t\t\t: value.startsWith('*/')\n+\t\t\t? 'interval'\n+\t\t\t: 'ignore';\n+\n+\t\tconst intervalValue = mode === 'interval' ? value.substring(2) : '';\n+\t\tconst specificValue = mode === 'specific' ? value : '';\n+\t\tconst customValue = mode === 'custom' ? value : '';\n+\n+\t\treturn E('td', { 'style': padding }, [\n+\t\t\tE('div', { 'class': 'dropdown-container' }, [\n+\t\t\t\tE('select', { \n+\t\t\t\t\t'class': `${fieldName}-mode`,\n+\t\t\t\t\t'style': width,\n+\t\t\t\t\t'change': ev => this.updateDropdownMode(ev, fieldName) \n+\t\t\t\t}, [\n+\t\t\t\t\tE('option', { 'value': 'ignore', 'style': width,\n+\t\t\t\t\t\t...(mode === 'ignore' ? { 'selected': 'true' } : {})\n+\t\t\t\t\t}, _('-')),\n+\t\t\t\t\tE('option', { 'value': 'interval', 'style': width,\n+\t\t\t\t\t\t...(mode === 'interval' ? { 'selected': 'true' } : {}) \n+\t\t\t\t\t}, _('Every Xth')),\n+\t\t\t\t\tE('option', { 'value': 'specific', 'style': width,\n+\t\t\t\t\t\t...(mode === 'specific' ? { 'selected': 'true' } : {}) \n+\t\t\t\t\t}, _('Specific')),\n+\t\t\t\t\tE('option', { 'value': 'custom', 'style': width,\n+\t\t\t\t\t\t...(mode === 'custom' ? { 'selected': 'true' } : {}) \n+\t\t\t\t\t}, _('Custom'))\n+\t\t\t\t]),\n+\t\t\t\tE('div', { 'class': `${fieldName}-input ignore-input`, 'style': mode === 'ignore' ? '' : 'display:none;' }, [\n+\t\t\t\t\tE('input', { 'type': 'text', 'class': fieldName, 'value': '*', 'style': mode === 'ignore' ? 'display:none;': width,\n+\t\t\t\t\t})\n+\t\t\t\t]),\n+\t\t\t\tE('div', { 'class': `${fieldName}-input interval-input`, 'style': mode === 'interval' ? width : 'display:none;' }, [\n+\t\t\t\t\tE('label', {}, _('Every')),\n+\t\t\t\t\tE('input', { 'type': 'number', 'min': min, 'max': max, 'class': `${fieldName}-interval`, 'value': intervalValue, 'style': width }),\n+\t\t\t\t\tE('span', {}, _(label.toLowerCase()))\n+\t\t\t\t]),\n+\t\t\t\tE('div', { 'class': `${fieldName}-input specific-input`, 'style': mode === 'specific' ? width : 'display:none;' }, [\n+\t\t\t\t\tE('label', {}, _('At')),\n+\t\t\t\t\tE('input', { 'type': 'text', 'class': `${fieldName}-specific`, 'value': specificValue, 'style': width, 'placeholder': '0,5,10,...' }),\n+\t\t\t\t\tE('span', {}, _(label.toLowerCase() + _('s (CSV)', 'pluralisation for hours, minutes, etc')))\n+\t\t\t\t]),\n+\t\t\t\tE('div', { 'class': `${fieldName}-input custom-input`, 'style': mode === 'custom' ? width : 'display:none;' }, [\n+\t\t\t\t\tE('label', {}, _('Value')),\n+\t\t\t\t\tE('input', { 'type': 'text', 'class': `${fieldName}-custom`, 'value': customValue, 'style': width })\n+\t\t\t\t]),\n+\t\t\t])\n+\t\t]);\n+\t},\n+\n+\tupdateDropdownMode(ev, fieldName) {\n+\t\tconst dropdown = ev.target.closest('.dropdown-container');\n+\t\tconst mode = ev.target.value;\n+\n+\t\tdropdown.querySelectorAll(`.${fieldName}-input`).forEach(input => {\n+\t\t\tinput.style.display = 'none';\n+\t\t});\n+\n+\t\tdropdown.querySelector(`.${fieldName}-input.${mode}-input`).style.display = '';\n+\t},\n+\n+\taddTask(param) {\n+\t\tconst tbody = document.getElementById('crontab-rows');\n+\n+\t\tlet newTask\n+\t\tif (param?.type !== 'click') {\n+\t\t\tnewTask = param;\n+\t\t} else {\n+\t\t\tnewTask = a_task; \n+\t\t}\n+\t\tconst newRows = this.renderTaskRows([newTask]);\n+\t\tnewRows.forEach(row => {\n+\t\t\ttbody.appendChild(row);\n+\t\t})\n+\t},\n+\n+\tremoveTask(ev) {\n+\t\tconst row = ev.target.closest('.crontab-row');\n+\t\tconst hr = row.previousElementSibling;\n+\t\tif (hr)\thr.remove();\n+\t\tif (row) row.remove();\n+\t},\n+\n+\thandleSaveApply: null,\n+\thandleReset: null\n+});\ndiff --git a/feeds/luci/modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json b/feeds/luci/modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json\nindex ebae989d0e00..b4eba7862444 100644\n--- a/feeds/luci/modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json\n+++ b/feeds/luci/modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json\n@@ -98,6 +98,16 @@\n \t\t}\n \t},\n \n+\t\"admin/system/crontabhelper\": {\n+\t\t\"action\": {\n+\t\t\t\"type\": \"view\",\n+\t\t\t\"path\": \"system/crontabhelper\"\n+\t\t},\n+\t\t\"depends\": {\n+\t\t\t\"acl\": [ \"luci-mod-system-cron\" ]\n+\t\t}\n+\t},\n+\n \t\"admin/system/mounts\": {\n \t\t\"title\": \"Mount Points\",\n \t\t\"order\": 50,\n\n--- a/feeds/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js\n+++ b/feeds/luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js\n@@ -27,6 +27,7 @@ return view.extend({\n \t\treturn E([\n \t\t\tE('h2', _('Scheduled Tasks')),\n \t\t\tE('p', { 'class': 'cbi-section-descr' }, _('This is the system crontab in which scheduled tasks can be defined.')),\n+\t\t\tE('p', { 'class': 'cbi-section-descr' }, _('<a href=\"/cgi-bin/luci/admin/system/crontabhelper\"> Scheduled Tasks Helper</a>')),\n \t\t\tE('p', {}, E('textarea', { 'style': 'width:100%', 'rows': 25, 'disabled': isReadonlyView }, [ crontab != null ? crontab : '' ]))\n \t\t]);\n \t},\n"
  },
  {
    "path": "devices/common/patches/curl.patch",
    "content": "--- a/package/feeds/packages/curl/Config.in\n+++ b/package/feeds/packages/curl/Config.in\n@@ -4,7 +4,7 @@ comment \"SSL support\"\n \n choice\n \tprompt \"Selected SSL library\"\n-\tdefault LIBCURL_MBEDTLS\n+\tdefault LIBCURL_OPENSSL\n \n \tconfig LIBCURL_MBEDTLS\n \t\tbool \"mbed TLS\"\n"
  },
  {
    "path": "devices/common/patches/default-packages.patch",
    "content": "--- a/include/target.mk\n+++ b/include/target.mk\n@@ -50,10 +50,8 @@ DEFAULT_PACKAGES.nas:=\\\n # @brief Default packages for @DEVICE_TYPE router.\n ##\n DEFAULT_PACKAGES.router:=\\\n-\tdnsmasq \\\n+\tdnsmasq-full \\\n \tfirewall4 \\\n-\tnftables \\\n-\tkmod-nft-offload \\\n \todhcp6c \\\n \todhcpd-ipv6only \\\n \tppp \\\n"
  },
  {
    "path": "devices/common/patches/disable-seccomp-ujail.patch",
    "content": "--- a/config/Config-kernel.in\n+++ b/config/Config-kernel.in\n@@ -1185,13 +1185,13 @@ config KERNEL_POSIX_MQUEUE\n \n config KERNEL_SECCOMP_FILTER\n \tbool\n-\tdefault y if !SMALL_FLASH\n+\tdefault n\n \n config KERNEL_SECCOMP\n \tbool \"Enable seccomp support\"\n \t\tdepends on !(TARGET_uml)\n \t\tselect KERNEL_SECCOMP_FILTER\n-\t\tdefault y if !SMALL_FLASH\n+\t\tdefault n\n \t\thelp\n \t\t  Build kernel with support for seccomp.\n \n--- a/include/target.mk\n+++ b/include/target.mk\n@@ -88,11 +88,6 @@ else\n   endif\n endif\n \n-# include ujail on systems with enough storage\n-ifeq ($(filter small_flash,$(FEATURES)),)\n-  DEFAULT_PACKAGES+=procd-ujail\n-endif\n-\n # Add device specific packages (here below to allow device type set from subtarget)\n DEFAULT_PACKAGES += $(DEFAULT_PACKAGES.$(DEVICE_TYPE))\n \n"
  },
  {
    "path": "devices/common/patches/dnsmasq.patch",
    "content": "--- a/package/network/services/dnsmasq/Makefile\n+++ b/package/network/services/dnsmasq/Makefile\n@@ -22,6 +22,8 @@ PKG_CPE_ID:=cpe:/a:thekelleys:dnsmasq\n \n PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_UPSTREAM_VERSION)\n \n+PKG_BUILD_DEPENDS:=nftables\n+\n PKG_INSTALL:=1\n PKG_BUILD_PARALLEL:=1\n PKG_BUILD_FLAGS:=lto\n@@ -66,8 +68,7 @@ $(call Package/dnsmasq/Default)\n   TITLE += (with DNSSEC, DHCPv6, Auth DNS, IPset, Nftset, Conntrack, NO_ID enabled by default)\n   DEPENDS+=+PACKAGE_dnsmasq_full_dnssec:libnettle \\\n \t+PACKAGE_dnsmasq_full_ipset:kmod-ipt-ipset \\\n-\t+PACKAGE_dnsmasq_full_conntrack:libnetfilter-conntrack \\\n-\t+PACKAGE_dnsmasq_full_nftset:nftables-json\n+\t+PACKAGE_dnsmasq_full_conntrack:libnetfilter-conntrack\n   VARIANT:=full\n   PROVIDES:=dnsmasq\n endef\n@@ -187,6 +188,11 @@ define Package/dnsmasq/install\n \t$(INSTALL_DIR) $(1)/etc/uci-defaults\n \t$(INSTALL_BIN) ./files/50-dnsmasq-migrate-resolv-conf-auto.sh $(1)/etc/uci-defaults\n \t$(INSTALL_BIN) ./files/50-dnsmasq-migrate-ipset.sh $(1)/etc/uci-defaults\n+\t$(INSTALL_DIR) $(1)/usr/lib\n+\t$(INSTALL_BIN) $(STAGING_DIR)/usr/lib/libnftables.so.1 $(1)/usr/lib/libnftables.so.1\n+\t$(INSTALL_BIN) $(STAGING_DIR)/usr/lib/libjansson.so.4 $(1)/usr/lib/libjansson.so.4\n+\t$(INSTALL_BIN) $(STAGING_DIR)/usr/lib/libnftnl.so.11 $(1)/usr/lib/libnftnl.so.11\n+\t$(INSTALL_BIN) $(STAGING_DIR)/usr/lib/libmnl.so.0 $(1)/usr/lib/libmnl.so.0\n endef\n \n Package/dnsmasq-dhcpv6/install = $(Package/dnsmasq/install)\n\n\n--- a/package/network/services/dnsmasq/files/dnsmasq.init\n+++ b/package/network/services/dnsmasq/files/dnsmasq.init\n@@ -1204,7 +1204,6 @@ dnsmasq_start()\n \t[ -n \"$instance_ifc\" ] && network_get_device instance_netdev \"$instance_ifc\" &&\n \t\t[ -n \"$instance_netdev\" ] && procd_set_param netdev $instance_netdev\n \n-\tprocd_add_jail dnsmasq ubus log\n \tprocd_add_jail_mount $CONFIGFILE $DHCPBOGUSHOSTNAMEFILE $DHCPSCRIPT $DHCPSCRIPT_DEPENDS\n \tprocd_add_jail_mount $EXTRA_MOUNT $RFC6761FILE $TRUSTANCHORSFILE\n \tprocd_add_jail_mount $dnsmasqconffile $dnsmasqconfdir $resolvdir $user_dhcpscript\n@@ -1217,6 +1216,20 @@ dnsmasq_start()\n \t[ -e \"$hostsfile\" ] && procd_add_jail_mount $hostsfile\n \n \tprocd_close_instance\n+\tconfig_get_bool dns_redirect \"$cfg\" dns_redirect 0\n+\tconfig_get dns_port \"$cfg\" port 53\n+\tif [ \"$dns_redirect\" = 1 ]; then\n+\tif [ -n \"$(command -v nft)\" ]; then\n+\t\tnft add table inet dnsmasq\n+\t\tnft add chain inet dnsmasq prerouting \"{ type nat hook prerouting priority -105; policy accept; }\"\n+\t\tnft add rule inet dnsmasq prerouting \"meta nfproto { ipv4, ipv6 } udp dport 53 counter redirect to :$dns_port comment \\\"DNSMASQ HIJACK\\\"\"\n+\telse\n+\t\tiptables -t nat -A PREROUTING -m comment --comment \"DNSMASQ\" -p udp --dport 53 -j REDIRECT --to-ports $dns_port\n+\t\tiptables -t nat -A PREROUTING -m comment --comment \"DNSMASQ\" -p tcp --dport 53 -j REDIRECT --to-ports $dns_port\n+\t\t[ -n \"$(command -v ip6tables)\" ] && ip6tables -t nat -A PREROUTING -m comment --comment \"DNSMASQ\" -p udp --dport 53 -j REDIRECT --to-ports $dns_port\n+\t\t[ -n \"$(command -v ip6tables)\" ] && ip6tables -t nat -A PREROUTING -m comment --comment \"DNSMASQ\" -p tcp --dport 53 -j REDIRECT --to-ports $dns_port\n+\tfi\n+\tfi\n }\n \n dnsmasq_stop()\n@@ -1234,6 +1247,21 @@ dnsmasq_stop()\n \trm -f ${BASEDHCPSTAMPFILE}.${cfg}.*.dhcp\n }\n \n+iptables_clear()\n+{\n+\tconfig_get dns_port \"$cfg\" port 53\n+\tiptables -t nat -D PREROUTING -m comment --comment \"DNSMASQ\" -p udp --dport 53 -j REDIRECT --to-ports $dns_port 2>\"/dev/null\"\n+\tiptables -t nat -D PREROUTING -m comment --comment \"DNSMASQ\" -p tcp --dport 53 -j REDIRECT --to-ports $dns_port 2>\"/dev/null\"\n+\t[ -n \"$(command -v ip6tables)\" ] && ip6tables -t nat -D PREROUTING -m comment --comment \"DNSMASQ\" -p udp --dport 53 -j REDIRECT --to-ports $dns_port 2>\"/dev/null\"\n+\t[ -n \"$(command -v ip6tables)\" ] && ip6tables -t nat -D PREROUTING -m comment --comment \"DNSMASQ\" -p tcp --dport 53 -j REDIRECT --to-ports $dns_port 2>\"/dev/null\"\n+}\n+\n+nftables_clear()\n+{\n+\t! nft --check list table inet dnsmasq > \"/dev/null\" 2>&1 || \\\n+\t\tnft delete table inet dnsmasq\n+}\n+\n add_interface_trigger()\n {\n \tlocal interface ignore\n@@ -1304,6 +1332,7 @@ start_service() {\n }\n \n reload_service() {\n+\t[ -n \"$(command -v nft)\" ] && nftables_clear || iptables_clear\n \trc_procd start_service \"$@\"\n \tprocd_send_signal dnsmasq \"$@\"\n }\n@@ -1330,4 +1359,5 @@ stop_service() {\n \telse\n \t\tconfig_foreach dnsmasq_stop dnsmasq\n \tfi\n+\t[ -n \"$(command -v nft)\" ] && nftables_clear || iptables_clear\n }\n"
  },
  {
    "path": "devices/common/patches/feeds.patch",
    "content": "--- a/include/feeds.mk\n+++ b/include/feeds.mk\n@@ -6,7 +6,7 @@\n -include $(TMP_DIR)/.packageauxvars\n \n FEEDS_INSTALLED:=$(notdir $(wildcard $(TOPDIR)/package/feeds/*))\n-FEEDS_AVAILABLE:=$(sort $(FEEDS_INSTALLED) $(shell $(SCRIPT_DIR)/feeds list -n 2>/dev/null))\n+FEEDS_AVAILABLE:=$(shell $(SCRIPT_DIR)/feeds list -n 2>/dev/null)\n \n PACKAGE_SUBDIRS=$(PACKAGE_DIR)\n ifneq ($(CONFIG_PER_FEED_REPO),)\n\n"
  },
  {
    "path": "devices/common/patches/firewall.patch",
    "content": "--- a/package/network/config/firewall4/Makefile\n+++ b/package/network/config/firewall4/Makefile\n@@ -25,7 +25,8 @@ define Package/firewall4\n \t+kmod-nft-core +kmod-nft-fib +kmod-nft-offload \\\n \t+kmod-nft-nat \\\n \t+nftables-json \\\n-\t+ucode +ucode-mod-fs +ucode-mod-ubus +ucode-mod-uci\n+\t+ucode +ucode-mod-fs +ucode-mod-ubus +ucode-mod-uci \\\n+\t+iptables +ip6tables +kmod-nft-fullcone +kmod-nft-socket +kmod-nft-tproxy\n   EXTRA_DEPENDS:=ucode (>=2022.03.22)\n   PROVIDES:=uci-firewall\n endef\n@@ -38,10 +39,14 @@ endef\n define Package/firewall4/conffiles\n /etc/config/firewall\n /etc/nftables.d/\n+/etc/firewall.user\n endef\n \n define Package/firewall4/install\n \t$(CP) -a $(PKG_BUILD_DIR)/root/* $(1)/\n+\t$(INSTALL_DIR) $(1)/etc/\n+\t$(INSTALL_CONF) ./files/firewall.include $(1)/etc/firewall.user\n+\t$(INSTALL_CONF) ./files/firewall.exwan $(1)/etc/firewall.exwan\n endef\n \n define Build/Compile\n\n--- a/package/network/config/firewall/Makefile\n+++ b/package/network/config/firewall/Makefile\n@@ -30,9 +30,10 @@ define Package/firewall\n   SECTION:=net\n   CATEGORY:=Base system\n   TITLE:=OpenWrt C Firewall\n-  DEPENDS:=+libubox +libubus +libuci +libip4tc +IPV6:libip6tc +libiptext +IPV6:libiptext6 +libxtables +kmod-ipt-core +kmod-ipt-conntrack +IPV6:kmod-nf-conntrack6 +kmod-ipt-nat\n+  DEPENDS:=+libubox +libubus +libuci +libip4tc +IPV6:libip6tc +libiptext +IPV6:libiptext6 +libxtables +kmod-ipt-core +kmod-ipt-conntrack +IPV6:kmod-nf-conntrack6 +kmod-ipt-nat \\\n+\t+iptables-mod-fullconenat +ip6tables-mod-fullconenat +iptables-legacy +ip6tables-legacy +kmod-ipt-nat6 +kmod-ipt-offload \\\n+\t+ipset +iptables-mod-conntrack-extra +iptables-mod-iprange +iptables-mod-socket +iptables-mod-tproxy\n   PROVIDES:=uci-firewall\n-  CONFLICTS:=firewall4\n endef\n \n define Package/firewall/description\n \n\n define Package/package/network/config/firewall/description\n@@ -59,6 +59,7 @@ define Package/package/network/config/firewall/install\n \t$(INSTALL_CONF) ./files/firewall.config $(1)/etc/config/firewall\n \t$(INSTALL_DIR) $(1)/etc/\n \t$(INSTALL_CONF) ./files/firewall.user $(1)/etc/firewall.user\n+\t$(INSTALL_CONF) ./files/firewall.exwan $(1)/etc/firewall.exwan\n \t$(INSTALL_DIR) $(1)/usr/share/fw3\n \t$(INSTALL_CONF) $(PKG_BUILD_DIR)/helpers.conf $(1)/usr/share/fw3\n endef\n\n--- a/package/feeds/luci/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js\n+++ b/package/feeds/luci/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js\n@@ -58,6 +58,50 @@ return view.extend({\n \n \t\to = s.option(form.Flag, 'drop_invalid', _('Drop invalid packets'));\n \n+\t\tif (L.hasSystemFeature('fullcone')) {\n+\t\t\to = s.option(form.Flag, 'fullcone', _('Enable FullCone NAT'));\n+\t\t\tif (fw4)\n+\t\t\t\to = s.option(form.Flag, 'fullcone6', _('Enable FullCone NAT6'));\n+\t\t\t\to.depends('fullcone', '1');\n+\t\t}\n+\n+\t\to = s.option(form.Flag, 'expose_wan', _('Expose WAN'), _('Danger! Proceed at your own risk.'));\n+\n+\t\to = s.option(form.Value, 'export', _('Ports to Expose'), _('Multiple ports can be, separated by spaces, format: 80 81 82'));\n+\t\to.depends('expose_wan', '1');\n+\t\to.validate = function(section_id, value) {\n+\t\tif (value.match(/^(\\d+\\s*)+$/)) {\n+\t\t\treturn true;\n+\t\t}\n+\t\t return _('Please enter valid format.');\n+\t\t};\n+\n+\t\to = s.option(form.ListValue, 'family', _('Restrict to address family'));\n+\t\to.modalonly = true;\n+\t\to.rmempty = true;\n+\t\to.depends('expose_wan', '1');\n+\t\to.value('', _('IPv4 and IPv6'));\n+\t\to.value('ipv4', _('IPv4 only'));\n+\t\to.value('ipv6', _('IPv6 only'));\n+\n+\t\to = s.option(form.ListValue, 'proto', _('Protocol'));\n+\t\to.modalonly = true;\n+\t\to.rmempty = true;\n+\t\to.default = 'tcp';\n+\t\to.depends('expose_wan', '1');\n+\t\to.value('tcp', _('TCP'));\n+\t\to.value('udp', _('UDP'));\n+\t\to.value('tudp', _('TCP+UDP'));\n+\n+\t\to = s.option(form.Flag, 'ex_ssh', _('Expose SSH'));\n+\t\to.depends('expose_wan', '1');\n+\t\to = s.option(form.Flag, 'ex_backend', _('Expose Backend'));\n+\t\to.depends('expose_wan', '1');\n+\t\to = s.option(form.Value, 'backend_port', _('Backend Port'), _('国内请使用除80,443外的端口'));\n+\t\to.depends('ex_backend', '1');\n+\t\to.rmempty = false;\n+\t\to.datatype = 'integer';\n+\n \t\tlet p = [\n \t\t\ts.option(form.ListValue, 'input', _('Input')),\n \t\t\ts.option(form.ListValue, 'output', _('Output')),\n\n--- a/package/network/config/firewall/files/firewall.init\n+++ b/package/network/config/firewall/files/firewall.init\n@@ -38,10 +38,12 @@ service_triggers() {\n }\n \n restart() {\n+\ttest -f /etc/firewall.exwan && sh /etc/firewall.exwan\n \tfw3 restart\n }\n \n start_service() {\n+\ttest -f /etc/firewall.exwan && sh /etc/firewall.exwan\n \tfw3 ${QUIET} start\n }\n \n@@ -50,6 +52,7 @@ stop_service() {\n }\n \n reload_service() {\n+\ttest -f /etc/firewall.exwan && sh /etc/firewall.exwan\n \tfw3 reload\n }\n"
  },
  {
    "path": "devices/common/patches/getcwd-fix.patch",
    "content": "--- a/include/host-build.mk\n+++ b/include/host-build.mk\n@@ -61,7 +61,8 @@ HOST_CONFIGURE_VARS = \\\n \tCPPFLAGS=\"$(HOST_CPPFLAGS)\" \\\n \tCXXFLAGS=\"$(HOST_CXXFLAGS)\" \\\n \tLDFLAGS=\"$(HOST_LDFLAGS)\" \\\n-\tCONFIG_SHELL=\"$(SHELL)\"\n+\tCONFIG_SHELL=\"$(SHELL)\" \\\n+\tgl_cv_func_getcwd_path_max=yes\n \n HOST_CONFIGURE_ARGS = \\\n \t--target=$(GNU_HOST_NAME) \\\n"
  },
  {
    "path": "devices/common/patches/imagebuilder.patch",
    "content": "--- a/include/image.mk\n+++ b/include/image.mk\n@@ -717,7 +717,7 @@ define Device/Build/kernel\n endef\n \n define Device/Build/image\n-  GZ_SUFFIX := $(if $(filter %dtb %gz,$(2)),,$(if $(and $(findstring ext4,$(1)),$(CONFIG_TARGET_IMAGES_GZIP)),.gz))\n+  GZ_SUFFIX := $(if $(filter %dtb %gz,$(2)),,$(if $(and $(findstring ext4,$(1)),$(findstring img,$(2)),$(CONFIG_TARGET_IMAGES_GZIP)),.gz))\n   $$(_TARGET): $(if $(CONFIG_JSON_OVERVIEW_IMAGE_INFO), \\\n \t  $(BUILD_DIR)/json_info_files/$(call DEVICE_IMG_NAME,$(1),$(2)).json, \\\n \t  $(BIN_DIR)/$(call DEVICE_IMG_NAME,$(1),$(2))$$(GZ_SUFFIX))\n@@ -755,6 +755,7 @@ define Device/Build/image\n \tFILE_TYPE=$(word 1,$(subst ., ,$(2))) \\\n \tFILE_FILESYSTEM=\"$(1)\" \\\n \tDEVICE_IMG_PREFIX=\"$(DEVICE_IMG_PREFIX)\" \\\n+\tIMAGE_SIZE=\"$(shell echo $$(($(call exp_units,$(IMAGE_SIZE)))))\" \\\n \tDEVICE_VENDOR=\"$(DEVICE_VENDOR)\" \\\n \tDEVICE_MODEL=\"$(DEVICE_MODEL)\" \\\n \tDEVICE_VARIANT=\"$(DEVICE_VARIANT)\" \\\n@@ -861,6 +862,7 @@ define Device/DumpInfo\n Target-Profile: DEVICE_$(1)\n Target-Profile-Name: $(DEVICE_DISPLAY)\n Target-Profile-Packages: $(DEVICE_PACKAGES)\n+Target-Profile-ImageSize: $(shell echo $$(( $(call exp_units,$(IMAGE_SIZE)) / 1024 )))\n Target-Profile-hasImageMetadata: $(if $(foreach image,$(IMAGES),$(findstring append-metadata,$(IMAGE/$(image)))),1,0)\n Target-Profile-SupportedDevices: $(SUPPORTED_DEVICES)\n $(if $(BROKEN),Target-Profile-Broken: $(BROKEN))\n\n--- a/scripts/json_add_image_info.py\n+++ b/scripts/json_add_image_info.py\n@@ -72,6 +72,7 @@ def get_titles():\n             \"device_packages\": getenv(\"DEVICE_PACKAGES\").split(),\n             \"supported_devices\": getenv(\"SUPPORTED_DEVICES\").split(),\n             \"titles\": get_titles(),\n+            \"image_size\": getenv(\"IMAGE_SIZE\"),\n         }\n     },\n }\n\n--- a/scripts/target-metadata.pl\n+++ b/scripts/target-metadata.pl\n@@ -437,6 +437,7 @@ ()\n \t\tprint \"PROFILE_NAMES = \".join(\" \", @profile_ids_unique).\"\\n\";\n \t\tforeach my $profile (@{$cur->{profiles}}) {\n \t\t\tprint $profile->{id}.'_NAME:='.$profile->{name}.\"\\n\";\n+\t\t\tprint $profile->{id}.'_IMAGE_SIZE:='.$profile->{image_size}.\"\\n\";\n \t\t\tprint $profile->{id}.'_HAS_IMAGE_METADATA:='.$profile->{has_image_metadata}.\"\\n\";\n \t\t\tif (defined($profile->{supported_devices}) and @{$profile->{supported_devices}} > 0) {\n \t\t\t\tprint $profile->{id}.'_SUPPORTED_DEVICES:='.join(' ', @{$profile->{supported_devices}}).\"\\n\";\n\n--- a/scripts/metadata.pm\n+++ b/scripts/metadata.pm\n@@ -150,6 +150,7 @@ sub parse_target_metadata($) {\n \t\t\tpush @{$target->{profiles}}, $profile;\n \t\t};\n \t\t/^Target-Profile-Name:\\s*(.+)\\s*$/ and $profile->{name} = $1;\n+\t\t/^Target-Profile-ImageSize:\\s*(.*)\\s*/ and $profile->{image_size} = $1;\n \t\t/^Target-Profile-hasImageMetadata:\\s*(\\d+)\\s*$/ and $profile->{has_image_metadata} = $1;\n \t\t/^Target-Profile-SupportedDevices:\\s*(.+)\\s*$/ and $profile->{supported_devices} = [ split(/\\s+/, $1) ];\n \t\t/^Target-Profile-Priority:\\s*(\\d+)\\s*$/ and do {\n\n--- a/target/imagebuilder/Makefile\n+++ b/target/imagebuilder/Makefile\n@@ -39,7 +39,8 @@ $(BIN_DIR)/$(IB_NAME).tar.zst: clean\n \t\t./files/Makefile \\\n \t\t$(TMP_DIR)/.targetinfo \\\n \t\t$(TMP_DIR)/.packageinfo \\\n-\t\t$(PKG_BUILD_DIR)/\n+\t\t$(TOPDIR)/files \\\n+\t\t$(PKG_BUILD_DIR)/ || true\n \n \t$(INSTALL_DIR) $(PKG_BUILD_DIR)/packages\n \n@@ -52,12 +53,13 @@ ifneq ($(CONFIG_USE_APK),)\n \n \t$(INSTALL_DATA) ./files/README.apk.md $(PKG_BUILD_DIR)/packages/README.md\n else\n-  ifeq ($(CONFIG_IB_STANDALONE),)\n \techo '## Remote package repositories' >> $(PKG_BUILD_DIR)/repositories.conf\n \t$(call FeedSourcesAppendOPKG,$(PKG_BUILD_DIR)/repositories.conf)\n \t$(VERSION_SED_SCRIPT) $(PKG_BUILD_DIR)/repositories.conf\n \n-  endif\n+\t$(SED) 's/^src\\/gz \\(.*\\) https.*ai\\/\\(.*packages.*\\)/src \\1 file:\\/\\/www\\/wwwroot\\/dl.openwrt.ai\\/\\2/' $(PKG_BUILD_DIR)/repositories.conf\n+\t$(SED) 's/^src\\/gz \\(.*\\) https.*ai\\/\\(.*targets.*\\)/src \\1 file:\\/\\/www\\/wwwroot\\/dl.openwrt.ai\\/\\2/' $(PKG_BUILD_DIR)/repositories.conf\n+\t$(SED) '/openwrt_core/d' $(PKG_BUILD_DIR)/repositories.conf\n \n \t# create an empty package index so `opkg` doesn't report an error\n \ttouch $(PKG_BUILD_DIR)/packages/Packages\n\n--- a/target/imagebuilder/files/Makefile\n+++ b/target/imagebuilder/files/Makefile\n@@ -144,6 +144,33 @@ BUILD_PACKAGES:=$(sort $(DEFAULT_PACKAGES) $($(USER_PROFILE)_PACKAGES) kernel)\n # \"-pkgname\" in the package list means remove \"pkgname\" from the package list\n BUILD_PACKAGES:=$(filter-out $(filter -%,$(BUILD_PACKAGES)) $(patsubst -%,%,$(filter -%,$(BUILD_PACKAGES))),$(BUILD_PACKAGES))\n BUILD_PACKAGES:=$(USER_PACKAGES) $(BUILD_PACKAGES)\n+IMAGE_SIZE_VALUE := $($(USER_PROFILE)_IMAGE_SIZE)\n+ifdef IMAGE_SIZE_VALUE\n+\tifeq ($(shell test $(IMAGE_SIZE_VALUE) -le 35840 && echo true),true)\n+\t\tSMALL_FLASH := true\n+\tendif\n+\tifeq ($(shell test $(IMAGE_SIZE_VALUE) -le 20480 && echo true),true)\n+\t\tXSMALL_FLASH := true\n+\tendif\n+endif\n+ifneq ($(findstring usb,$(BUILD_PACKAGES)),)\n+\tifneq ($(XSMALL_FLASH),true)\n+\t\tBUILD_PACKAGES += automount luci-app-diskman\n+\tendif\n+endif\n+ifeq ($(SMALL_FLASH),true)\n+\tifeq ($(shell grep -q small_flash $(TOPDIR)/repositories.conf || echo \"not_found\"),not_found)\n+        $(shell echo \"`grep kwrt_kiddin9 $(TOPDIR)/repositories.conf | sed -e 's/kiddin9/small_flash/g'`\" >>$(TOPDIR)/repositories.conf)\n+\tendif\n+\tifneq ($(findstring /www/wwwroot/,$(BIN_DIR)),)\n+\t\tBUILD_PACKAGES += -luci-app-istorex -luci-theme-argon -htop -bash -openssh-sftp-server -luci-nginx luci-ssl\n+\tendif\n+else\n+        $(shell sed -i \"/small_flash/d\" $(TOPDIR)/repositories.conf)\n+endif\n+define add_zh_cn_packages\n+$(eval BUILD_PACKAGES += $(foreach pkg,$(BUILD_PACKAGES),$(if $(and $(filter luci-app-%,$(pkg)),$(shell $(OPKG) list | grep -q \"^luci-i18n-$(patsubst luci-app-%,%,$(pkg))-zh-cn\" && echo 1)),luci-i18n-$(patsubst luci-app-%,%,$(pkg))-zh-cn)))\n+endef\n BUILD_PACKAGES:=$(filter-out $(filter -%,$(BUILD_PACKAGES)) $(patsubst -%,%,$(filter -%,$(BUILD_PACKAGES))),$(BUILD_PACKAGES))\n \n ifneq ($(CONFIG_USE_APK),)\n@@ -184,7 +211,10 @@ _call_image: staging_dir/host/.prereq-build\n \t$(MAKE) -s prepare_rootfs\n \t$(MAKE) -s build_image\n \t$(MAKE) -s json_overview_image_info\n+ifeq ($(findstring /www/wwwroot/,$(BIN_DIR)),)\n \t$(MAKE) -s checksum\n+endif\n+\trm -rf $(KERNEL_BUILD_DIR)/tmp $(KERNEL_BUILD_DIR)/root.* $(TARGET_DIR) $(TARGET_DIR_ORIG)\n \n _call_manifest: FORCE\n \trm -rf $(TARGET_DIR)\n@@ -251,9 +281,17 @@ package_install: FORCE\n \t@echo\n \t@echo Installing packages...\n ifeq ($(CONFIG_USE_APK),)\n+\t$(eval $(call add_zh_cn_packages))\n \t$(OPKG) install $(wildcard $(PACKAGE_DIR)/libc_*.ipk)\n \t$(OPKG) install $(wildcard $(PACKAGE_DIR)/kernel_*.ipk)\n-\t$(OPKG) install $(BUILD_PACKAGES)\n+\t$(OPKG) install --force-maintainer $(BUILD_PACKAGES) luci-i18n-base-zh-cn || true\n+\t$(if $(USER_FILES), \\\n+\tfind $(USER_FILES) -name \"*.ipk\" -print0 | \\\n+\twhile IFS= read -r -d '' ipk; do \\\n+\t\t$(OPKG) install \"$$ipk\" && rm -f \"$$ipk\" || true; \\\n+\tdone; \\\n+\t)\n+\t$(OPKG) install --force-maintainer --force-reinstall my-default-settings 2>/dev/null\n else\n \t$(eval BUILD_PACKAGES:=$(call FormatPackages,$(BUILD_PACKAGES)))\n \t$(APK) add --arch $(ARCH_PACKAGES) --no-scripts $(BUILD_PACKAGES)\n@@ -280,16 +318,19 @@ else\n \t)\n endif\n \t$(call prepare_rootfs,$(TARGET_DIR),$(USER_FILES),$(DISABLED_SERVICES))\n+\t$(if $(SMALL_FLASH), \\\n+        $(shell echo \"`grep kwrt_kiddin9 $(TOPDIR)/repositories.conf | sed -e 's/kiddin9/small_flash/g'`\" >>$(BUILD_DIR)/root-*/etc/opkg/distfeeds.conf) \\\n+\t)\n \n build_image: FORCE\n \t@echo\n \t@echo Building images...\n \trm -rf $(BUILD_DIR)/json_info_files/\n \tif [ -d \"target/linux/feeds/$(BOARD)\" ]; then \\\n-\t\t$(NO_TRACE_MAKE) -C target/linux/feeds/$(BOARD)/image install TARGET_BUILD=1 IB=1 EXTRA_IMAGE_NAME=\"$(EXTRA_IMAGE_NAME)\" \\\n+\t\tnice $(NO_TRACE_MAKE) -C target/linux/feeds/$(BOARD)/image install TARGET_BUILD=1 IB=1 EXTRA_IMAGE_NAME=\"$(EXTRA_IMAGE_NAME)\" \\\n \t\t\t$(if $(USER_PROFILE),PROFILE=\"$(USER_PROFILE)\"); \\\n \telse \\\n-\t\t$(NO_TRACE_MAKE) -C target/linux/$(BOARD)/image install TARGET_BUILD=1 IB=1 EXTRA_IMAGE_NAME=\"$(EXTRA_IMAGE_NAME)\" \\\n+\t\tnice $(NO_TRACE_MAKE) -C target/linux/$(BOARD)/image install TARGET_BUILD=1 IB=1 EXTRA_IMAGE_NAME=\"$(EXTRA_IMAGE_NAME)\" \\\n \t\t\t$(if $(USER_PROFILE),PROFILE=\"$(USER_PROFILE)\"); \\\n \tfi\n \n"
  },
  {
    "path": "devices/common/patches/kernel-defaults.patch",
    "content": "--- a/include/kernel-defaults.mk\n+++ b/include/kernel-defaults.mk\n@@ -127,6 +127,7 @@ endef\n \n define Kernel/CompileModules/Default\n \trm -f $(LINUX_DIR)/vmlinux $(LINUX_DIR)/System.map\n+\t+$(KERNEL_MAKE) olddefconfig\n \t+$(KERNEL_MAKE) $(if $(KERNELNAME),$(KERNELNAME),all) modules\n \t# If .config did not change, use the previous timestamp to avoid package rebuilds\n \tcmp -s $(LINUX_DIR)/.config $(LINUX_DIR)/.config.modules.save && \\\n"
  },
  {
    "path": "devices/common/patches/luci-base.patch",
    "content": "--- a/package/feeds/luci/luci-base/root/usr/share/rpcd/ucode/luci\n+++ b/package/feeds/luci/luci-base/root/usr/share/rpcd/ucode/luci\n@@ -222,6 +222,7 @@ const methods = {\n \n \tgetFeatures: {\n \t\tcall: function() {\n+\t\t\tlet kernel_version = popen('echo -n `uname -r`').read('all');\n \t\t\tlet result = {\n \t\t\t\tfirewall:   access('/sbin/fw3') == true,\n \t\t\t\tfirewall4:  access('/sbin/fw4') == true,\n@@ -229,6 +230,7 @@ const methods = {\n \t\t\t\tbonding:    access('/sys/module/bonding'),\n \t\t\t\tmii_tool:   access('/usr/sbin/mii-tool'),\n \t\t\t\toffloading: access('/sys/module/xt_FLOWOFFLOAD/refcnt') == true || access('/sys/module/nft_flow_offload/refcnt') == true,\n+\t\t\t\tfullcone:   access(`/lib/modules/${kernel_version}/xt_FULLCONENAT.ko`) == true || access(`/lib/modules/${kernel_version}/nft_fullcone.ko`) == true,\n \t\t\t\tbr2684ctl:  access('/usr/sbin/br2684ctl') == true,\n \t\t\t\tswconfig:   access('/sbin/swconfig') == true,\n \t\t\t\tzram:       access('/sys/class/zram-control') == true,\n@@ -565,6 +567,99 @@ const methods = {\n \t\t}\n \t},\n \n+\tgetCPUBench: {\n+\t\tcall: function() {\n+\t\t\treturn { cpubench: readfile('/etc/bench.log') || '' };\n+\t\t}\n+\t},\n+\n+\tgetCPUInfo: {\n+\t\tcall: function() {\n+\t\t\tif (!access('/sbin/cpuinfo'))\n+\t\t\t\treturn {};\n+\n+\t\t\tconst fd = popen('/sbin/cpuinfo');\n+\t\t\tif (fd) {\n+\t\t\t\tlet cpuinfo = fd.read('all');\n+\t\t\t\tfd.close();\n+\n+\t\t\t\treturn { cpuinfo: cpuinfo };\n+\t\t\t} else {\n+\t\t\t\treturn { cpuinfo: error() };\n+\t\t\t}\n+\t\t}\n+\t},\n+\n+\tgetCPUUsage: {\n+\t\tcall: function() {\n+\t\t\tconst fd = popen('top -n1 | awk \\'/^CPU/ {printf(\"%d%\", 100 - $8)}\\'');\n+\t\t\tif (fd) {\n+\t\t\t\tlet cpuusage = fd.read('all');\n+\t\t\t\tfd.close();\n+\n+\t\t\t\treturn { cpuusage: cpuusage };\n+\t\t\t} else {\n+\t\t\t\treturn { cpuusage: error() };\n+\t\t\t}\n+\t\t}\n+\t},\n+\n+\tgetETHInfo: {\n+\t\tcall: function() {\n+\t\t\tif (!access('/sbin/ethinfo'))\n+\t\t\t\treturn {};\n+\n+\t\t\tconst fd = popen('/sbin/ethinfo');\n+\t\t\tif (fd) {\n+\t\t\t\tlet ethinfo = fd.read('all');\n+\t\t\t\tif (!ethinfo)\n+\t\t\t\t\tethinfo = '{}';\n+\t\t\t\tethinfo = json(ethinfo);\n+\t\t\t\tfd.close();\n+\n+\t\t\t\treturn { ethinfo: ethinfo };\n+\t\t\t} else {\n+\t\t\t\treturn { ethinfo: error() };\n+\t\t\t}\n+\t\t}\n+\t},\n+\n+\tgetTempInfo: {\n+\t\tcall: function() {\n+\t\t\tif (!access('/sbin/tempinfo'))\n+\t\t\t\treturn {};\n+\n+\t\t\tconst fd = popen('/sbin/tempinfo');\n+\t\t\tif (fd) {\n+\t\t\t\tlet tempinfo = fd.read('all');\n+\t\t\t\tfd.close();\n+\n+\t\t\t\treturn { tempinfo: tempinfo };\n+\t\t\t} else {\n+\t\t\t\treturn { tempinfo: error() };\n+\t\t\t}\n+\t\t}\n+\t},\n+\n+\tgetOnlineUsers: {\n+\t\tcall: function() {\n+\t\t\tconst fd = open('/proc/net/arp', 'r');\n+\t\t\tif (fd) {\n+\t\t\t\tlet onlineusers = 0;\n+\n+\t\t\t\tfor (let line = fd.read('line'); length(line); line = fd.read('line'))\n+\t\t\t\t\tif (match(trim(line), /^.*(0x2).*(br-lan)$/))\n+\t\t\t\t\t\tonlineusers++;\n+\n+\t\t\t\tfd.close();\n+\n+\t\t\t\treturn { onlineusers: onlineusers };\n+\t\t\t} else {\n+\t\t\t\treturn { onlineusers: error() };\n+\t\t\t}\n+\t\t}\n+\t},\n+\n \tgetRealtimeStats: {\n \t\targs: { mode: 'interface', device: 'eth0' },\n \t\tcall: function(request) {\n\n--- a/package/feeds/luci/luci-base/htdocs/luci-static/resources/network.js\n+++ b/package/feeds/luci/luci-base/htdocs/luci-static/resources/network.js\n@@ -4376,4 +4376,10 @@ WifiNetwork = baseclass.extend(/** @lends LuCI.network.WifiNetwork.prototype */\n \t}\n });\n \n+setTimeout(function(){\n+try{\n+  document.getElementsByClassName('cbi-button-apply')[0].children[3].children[0].value='1'\n+}catch(err) {\n+}},1000)\n+\n return Network;\n\n--- a/package/feeds/luci/luci-base/ucode/dispatcher.uc\n+++ b/package/feeds/luci/luci-base/ucode/dispatcher.uc\n@@ -939,7 +939,12 @@ dispatch = function(_http, path) {\n \t\t\t\tlet cookie_name = (http.getenv('HTTPS') == 'on') ? 'sysauth_https' : 'sysauth_http',\n \t\t\t\t    cookie_secure = (http.getenv('HTTPS') == 'on') ? '; secure' : '';\n \n-\t\t\t\thttp.header('Set-Cookie', `${cookie_name}=${session.sid}; path=${build_url()}; SameSite=strict; HttpOnly${cookie_secure}`);\n+\t\t\t\tlet cookie_p = uci.get('wizard', 'default', 'cookie_p');\n+\t\t\t\tif (cookie_p == '0') {\n+\t\t\t\t\thttp.header('Set-Cookie', `${cookie_name}=${session.sid}; path=${build_url()}; SameSite=strict; HttpOnly${cookie_secure}`);\n+\t\t\t\t} else {\n+\t\t\t\t\thttp.header('Set-Cookie', `${cookie_name}=${session.sid}; Max-Age=2147483647; path=${build_url()}; SameSite=strict; HttpOnly${cookie_secure}`);\n+\t\t\t\t}\n \t\t\t\thttp.redirect(build_url(...resolved.ctx.request_path));\n \n \t\t\t\treturn;\n\n--- a/package/feeds/luci/luci-base/root/www/index.html\n+++ b/package/feeds/luci/luci-base/root/www/index.html\n@@ -15,6 +15,5 @@\n \t\t</style>\n \t</head>\n \t<body>\n-\t\t<a href=\"cgi-bin/luci/\">LuCI - Lua Configuration Interface</a>\n \t</body>\n </html>\n\n--- a/package/feeds/luci/luci-base/root/etc/init.d/ucitrack\n+++ b/package/feeds/luci/luci-base/root/etc/init.d/ucitrack\n@@ -8,7 +8,7 @@ register_init() {\n \tlocal init=\"$2\"\n \tshift; shift\n \n-\tif [ -x \"$init\" ] && \"$init\" enabled && ! grep -sqE 'USE_PROCD=.' \"$init\"; then\n+\tif [ -x \"$init\" ] && ! grep -sqE 'USE_PROCD=.' \"$init\"; then\n \t\tlogger -t \"ucitrack\" \"Setting up /etc/config/$config reload trigger for non-procd $init\"\n \t\tprocd_add_config_trigger \"config.change\" \"$config\" \"$init\" \"$@\"\n \tfi\n\n--- a/package/feeds/luci/luci-base/htdocs/luci-static/resources/tools/widgets.js\n+++ b/package/feeds/luci/luci-base/htdocs/luci-static/resources/tools/widgets.js\n@@ -4,6 +4,7 @@\n 'require network';\n 'require firewall';\n 'require fs';\n+'require uci';\n \n \n /**\n@@ -752,6 +752,81 @@ var CBIGroupSelect = form.ListValue.extend({\n \t},\n });\n \n+var CBIWifidogxGroupSelect = form.ListValue.extend({\n+\t__name__: 'CBI.WifidogxGroupSelect',\n+\n+\t// group_type: 1: Domain Group, 2: MAC Group\n+\t// add a new property to store the group type\n+\tgroup_type: '1',\n+\n+\tload: function(section_id) {\n+\t\tthis.sappList = [];\n+\t\tvar sections = uci.sections('wifidogx', 'group');\n+\t\t\n+\t\tfor (var i = 0; i < sections.length; i++) {\n+\t\t\tif (sections[i]['g_type'] == this.group_type)\n+\t\t\t\tthis.sappList.push(sections[i]['.name']);\n+\t\t}\n+\t\t\n+\t\treturn this.super('load', section_id);\n+\t},\n+\n+\tsetGroupType: function(group_type) {\n+\t\tif (group_type == 'mac') {\n+\t\t\tthis.group_type = '2';\n+\t\t} else if (group_type == 'wildcard') {\n+\t\t\tthis.group_type = '3';\n+\t\t}\n+\t},\n+\n+\tfilter: function(section_id, value) {\n+\t\treturn true;\n+\t},\n+\n+\trenderWidget: function(section_id, option_index, cfgvalue) {\n+\t\tvar values = L.toArray((cfgvalue != null) ? cfgvalue : this.default),\n+\t\t    choices = {},\n+\t\t    checked = {};\n+\n+\t\tfor (var i = 0; i < values.length; i++)\n+\t\t\tchecked[values[i]] = true;\n+\n+\t\tvalues = [];\n+\n+\t\tif (!this.multiple && (this.rmempty || this.optional))\n+\t\t\tchoices[''] = E('em', _('unspecified'));\n+\n+\t\tfor (var i = 0; i < this.sappList.length; i++) {\n+\t\t\tvar name = this.sappList[i];\n+\n+\t\t\tif (checked[name])\n+\t\t\t\tvalues.push(name);\n+\n+\t\t\tchoices[name] =  E('span', { 'class': 'ifacebadge' }, name);\n+\t\t}\n+\n+\t\tvar widget = new ui.Dropdown(this.multiple ? values : values[0], choices, {\n+\t\t\tid: this.cbid(section_id),\n+\t\t\tsort: true,\n+\t\t\tmultiple: this.multiple,\n+\t\t\toptional: this.optional || this.rmempty,\n+\t\t\tdisabled: (this.readonly != null) ? this.readonly : this.map.readonly,\n+\t\t\tselect_placeholder: E('em', _('unspecified')),\n+\t\t\tdisplay_items: this.display_size || this.size || 3,\n+\t\t\tdropdown_items: this.dropdown_size || this.size || 5,\n+\t\t\tvalidate: L.bind(this.validate, this, section_id),\n+\t\t\tcreate: !this.nocreate,\n+\t\t\tcreate_markup: '' +\n+\t\t\t\t'<li data-value=\"{{value}}\">' +\n+\t\t\t\t\t'<span class=\"ifacebadge\" style=\"background:repeating-linear-gradient(45deg,rgba(204,204,204,0.5),rgba(204,204,204,0.5) 5px,rgba(255,255,255,0.5) 5px,rgba(255,255,255,0.5) 10px)\">' +\n+\t\t\t\t\t\t'{{value}}: <em>('+_('create')+')</em>' +\n+\t\t\t\t\t'</span>' +\n+\t\t\t\t'</li>'\n+\t\t});\n+\n+\t\treturn widget.render();\n+\t}\n+});\n \n return L.Class.extend({\n \tZoneSelect: CBIZoneSelect,\n@@ -761,4 +836,5 @@ return L.Class.extend({\n \tDeviceSelect: CBIDeviceSelect,\n \tUserSelect: CBIUserSelect,\n \tGroupSelect: CBIGroupSelect,\n+\tWifidogxGroupSelect: CBIWifidogxGroupSelect,\n });\n\n--- a/package/feeds/luci/luci-base/htdocs/luci-static/resources/validation.js\n+++ b/package/feeds/luci/luci-base/htdocs/luci-static/resources/validation.js\n@@ -403,6 +403,14 @@ const ValidatorFactory = baseclass.extend({\n \t\t\treturn this.assert(false, _('valid hostname'));\n \t\t},\n \n+\t\twildcard() {\n+\t\t\t// must start with '.', then remove it and check if it's a valid hostname\n+\t\t\tif (this.value[0] != '.')\n+\t\t\t\treturn this.assert(false, _('valid wildcard hostname'));\n+\t\t\tconst hostname = this.value.substr(1);\n+\t\t\treturn this.apply('hostname', hostname);\n+\t\t},\n+\n \t\t/**\n \t\t * Assert a valid UCI identifier, hostname or IP address range.\n \t\t * @function LuCI.validation.ValidatorFactory.types#network\n\n--- a/package/feeds/luci/luci-base/root/usr/share/luci/menu.d/luci-base.json\n+++ b/package/feeds/luci/luci-base/root/usr/share/luci/menu.d/luci-base.json\n@@ -50,6 +50,24 @@\n \t\t}\n \t},\n \n+\t\"admin/nas\": {\n+\t\t\"title\": \"NAS\",\n+\t\t\"order\": 60,\n+\t\t\"action\": {\n+\t\t\t\"type\": \"firstchild\",\n+\t\t\t\"recurse\": true\n+\t\t}\n+\t},\n+\n+\t\"admin/control\": {\n+\t\t\"title\": \"Control\",\n+\t\t\"order\": 61,\n+\t\t\"action\": {\n+\t\t\t\"type\": \"firstchild\",\n+\t\t\t\"recurse\": true\n+\t\t}\n+\t},\n+\n \t\"admin/vpn\": {\n \t\t\"title\": \"VPN\",\n \t\t\"order\": 70,\n"
  },
  {
    "path": "devices/common/patches/luci-dhcp.patch",
    "content": "--- a/package/feeds/luci/luci-mod-network/htdocs/luci-static/resources/view/network/dns.js\n+++ b/package/feeds/luci/luci-mod-network/htdocs/luci-static/resources/view/network/dns.js\n@@ -243,6 +243,11 @@ return view.extend({\n \t\to.optional = true;\n \t\to.placeholder = '/router.local/router.lan/192.168.0.1';\n \n+\t\to = s.taboption('general', form.Flag, 'dns_redirect',\n+\t\t\t_('DNS Redirect'),\n+\t\t\t_('Force redirect all local DNS queries to DNSMasq, a.k.a. DNS Hijacking.'));\n+\t\to.optional = true;\n+\n \t\to = s.taboption('general', form.Flag, 'allservers',\n \t\t\t_('All servers'),\n \t\t\t_('Query all available upstream resolvers.') + ' ' + _('First answer wins.'));\n@@ -437,6 +442,9 @@ return view.extend({\n \t\tso.rmempty = false;\n \t\tso.datatype = 'ipaddr(\"nomask\")';\n \n+\t\tso = ss.option(form.Value, 'comments', _('Comments'));\n+\t\tso.rmempty  = true;\n+\n \t\tconst ipaddrs = {};\n \n \t\tObject.keys(hosts).forEach(function(mac) {"
  },
  {
    "path": "devices/common/patches/luci-mod-system.patch",
    "content": "--- a/package/feeds/luci/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js\n+++ b/package/feeds/luci/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js\n@@ -101,7 +101,7 @@ return view.extend({\n \t\t/* Currently the sysupgrade rpc call will not return, hence no promise handling */\n \t\tfs.exec('/sbin/firstboot', [ '-r', '-y' ]);\n \n-\t\tui.awaitReconnect('192.168.1.1', 'openwrt.lan');\n+\t\tui.awaitReconnect('10.0.0.1', 'kwrt.lan');\n \t},\n \n \thandleRestore: function(ev) {\n@@ -163,7 +163,7 @@ return view.extend({\n \t\t\t\t\tE('p', { 'class': 'spinning' }, _('The system is rebooting now. If the restored configuration changed the current LAN IP address, you might need to reconnect manually.'))\n \t\t\t\t]);\n \n-\t\t\t\tui.awaitReconnect(window.location.host, '192.168.1.1', 'openwrt.lan');\n+\t\t\t\tui.awaitReconnect(window.location.host, '10.0.0.1', 'kwrt.lan');\n \t\t\t}, this))\n \t\t\t.catch(function(e) { ui.addNotification(null, E('p', e.message)) })\n \t\t\t.finally(function() { btn.firstChild.data = _('Upload archive...') });\n@@ -263,6 +263,7 @@ return view.extend({\n \t\t\t\t\tbody.push(E('p', {}, E('label', { 'class': 'btn' }, [\n \t\t\t\t\t\topts.backup_pkgs[0], ' ', _('Include in backup a list of current installed packages at /etc/backup/installed_packages.txt')\n \t\t\t\t\t])));\n+\t\t\t\t\topts.backup_pkgs[0].checked = true;\n \t\t\t\t};\n \n \t\t\t\tvar cntbtn = E('button', {\n@@ -304,6 +305,10 @@ return view.extend({\n \t\t\t\topts.keep[0].addEventListener('change', function(ev) {\n \t\t\t\t\topts.skip_orig[0].disabled = !ev.target.checked;\n \t\t\t\t\topts.backup_pkgs[0].disabled = !ev.target.checked;\n+\t\t\t\t\tif (ev.target.checked == false){\n+\t\t\t\t\t\topts.skip_orig[0].checked =false\n+\t\t\t\t\t\topts.backup_pkgs[0].checked =false\n+\t\t\t\t\t}\n \n \t\t\t\t});\n \n@@ -337,7 +342,7 @@ return view.extend({\n \t\tif (opts['keep'][0].checked)\n \t\t\tui.awaitReconnect(window.location.host);\n \t\telse\n-\t\t\tui.awaitReconnect('192.168.1.1', 'openwrt.lan');\n+\t\t\tui.awaitReconnect('10.0.0.1', 'kwrt.lan');\n \t},\n \n \thandleBackupList: function(ev) {\n"
  },
  {
    "path": "devices/common/patches/luci_mk.patch",
    "content": "--- a/feeds/luci/luci.mk\n+++ b/feeds/luci/luci.mk\n@@ -84,7 +84,7 @@ define findrev\n       set -- $$(git log -1 --format=\"%ct %h\" --abbrev=7 -- $(if $(1),. ':(exclude)po',po)); \\\n       if [ -n \"$$1\" ]; then\n         secs=\"$$(($$1 % 86400))\"; \\\n-        yday=\"$$(date --utc --date=\"@$$1\" \"+%y.%j\")\"; \\\n+        yday=\"$$(date --utc --date=\"@$$(($$1 + 365*24*60*60))\" \"+%y.%j\")\"; \\\n         printf '%s.%05d~%s' \"$$yday\" \"$$secs\" \"$$2\"; \\\n       else \\\n         echo \"0\"; \\\n@@ -207,9 +207,20 @@ define Package/$(PKG_NAME)/install\n \t$(call Build/Install/Default)\n \t$(CP) $(PKG_INSTALL_DIR)/* $(1)/\n  endif\n+ ifneq ($(wildcard ${CURDIR}/po),)\n+\t$(INSTALL_DIR) $(1)/etc/uci-defaults\n+\techo \"uci set luci.languages.zh_cn='$(LUCI_LANG.zh_Hans)'; uci commit luci\" \\\n+\t\t> $(1)/etc/uci-defaults/luci-i18n-$(LUCI_BASENAME)-zh-cn\n+\t$(INSTALL_DIR) $(1)$(LUCI_LIBRARYDIR)/i18n\n+\t$(foreach po,$(wildcard ${CURDIR}/po/zh_Hans/*.po), \\\n+\t\tpo2lmo $(po) \\\n+\t\t\t$(1)$(LUCI_LIBRARYDIR)/i18n/$(basename $(notdir $(po))).zh-cn.lmo;)\n+ endif\n+\n endef\n \n ifndef Package/$(PKG_NAME)/postinst\n+ifneq ($(wildcard ${CURDIR}/htdocs/luci-static/resources/view),)\n define Package/$(PKG_NAME)/postinst\n [ -n \"$${IPKG_INSTROOT}\" ] || { \\\n \trm -f /tmp/luci-indexcache.*\n@@ -218,6 +229,16 @@ define Package/$(PKG_NAME)/postinst\n \texit 0\n }\n endef\n+else\n+define Package/$(PKG_NAME)/postinst\n+[ -n \"$${IPKG_INSTROOT}\" ] || {$(foreach script,$(LUCI_DEFAULTS),\n+\t(. /etc/uci-defaults/$(script)) && rm -f /etc/uci-defaults/$(script))\n+\trm -f /tmp/luci-indexcache.*\n+\trm -rf /tmp/luci-modulecache/\n+\texit 0\n+}\n+endef\n+endif\n endif\n \n # some generic macros that can be used by all packages\n@@ -334,5 +355,5 @@ define LuciTranslation\n \n endef\n \n-$(foreach lang,$(LUCI_LANGUAGES),$(if $(LUCI_LANG.$(lang)),$(eval $(call LuciTranslation,$(firstword $(LUCI_LC_ALIAS.$(lang)) $(lang)),$(lang)))))\n+# $(foreach lang,$(LUCI_LANGUAGES),$(if $(LUCI_LANG.$(lang)),$(eval $(call LuciTranslation,$(firstword $(LUCI_LC_ALIAS.$(lang)) $(lang)),$(lang)))))\n $(foreach pkg,$(LUCI_BUILD_PACKAGES),$(eval $(call BuildPackage,$(pkg))))\n"
  },
  {
    "path": "devices/common/patches/netfilter.patch.b",
    "content": "--- a/package/kernel/linux/modules/netfilter.mk\n+++ b/package/kernel/linux/modules/netfilter.mk\n@@ -458,15 +458,100 @@\n $(eval $(call KernelPackage,ipt-nat))\n \n+define KernelPackage/ipt-cgroup\n+  SUBMENU:=$(NF_MENU)\n+  TITLE:=cgroup netfilter module\n+  KCONFIG:=$(KCONFIG_IPT_CGROUP)\n+  FILES:=$(LINUX_DIR)/net/netfilter/*cgroup*.$(LINUX_KMOD_SUFFIX)\n+  AUTOLOAD:=$(call AutoLoad,$(notdir $(IPT_CGROUP-m)))\n+  DEPENDS:= kmod-ipt-core\n+endef\n \n+$(eval $(call KernelPackage,ipt-cgroup))\n+\n+define KernelPackage/ipt-cgroup/description\n+ Kernel support for cgroup netfilter module\n+ Include:\n+ - cgroup\n+endef\n+\n define KernelPackage/ipt-raw\n   TITLE:=Netfilter IPv4 raw table support\n   KCONFIG:=CONFIG_IP_NF_RAW\n   FILES:=$(LINUX_DIR)/net/ipv4/netfilter/iptable_raw.ko\n   AUTOLOAD:=$(call AutoProbe,iptable_raw)\n   $(call AddDepends/ipt)\n endef\n \n $(eval $(call KernelPackage,ipt-raw))\n+\n+\n+define KernelPackage/ipt-imq\n+  TITLE:=Intermediate Queueing support\n+  KCONFIG:= \\\n+\tCONFIG_IMQ \\\n+\tCONFIG_IMQ_BEHAVIOR_BA=y \\\n+\tCONFIG_IMQ_NUM_DEVS=2 \\\n+\tCONFIG_NETFILTER_XT_TARGET_IMQ\n+  FILES:= \\\n+\t$(LINUX_DIR)/drivers/net/imq.$(LINUX_KMOD_SUFFIX) \\\n+\t$(foreach mod,$(IPT_IMQ-m),$(LINUX_DIR)/net/$(mod).$(LINUX_KMOD_SUFFIX))\n+  AUTOLOAD:=$(call AutoProbe,$(notdir imq $(IPT_IMQ-m)))\n+  $(call AddDepends/ipt)\n+endef\n+\n+define KernelPackage/ipt-imq/description\n+ Kernel support for Intermediate Queueing devices\n+endef\n+\n+$(eval $(call KernelPackage,ipt-imq))\n+\n+\n+define KernelPackage/ipt-bandwidth\n+  SUBMENU:=$(NF_MENU)\n+  TITLE:=bandwidth\n+  KCONFIG:=$(KCONFIG_IPT_BANDWIDTH)\n+  FILES:=$(LINUX_DIR)/net/ipv4/netfilter/*bandwidth*.$(LINUX_KMOD_SUFFIX)\n+  AUTOLOAD:=$(call AutoLoad,$(notdir $(IPT_BANDWIDTH-m)))\n+  DEPENDS:=@!LINUX_5_4 kmod-ipt-core\n+endef\n+\n+$(eval $(call KernelPackage,ipt-bandwidth))\n+\n+\n+define KernelPackage/ipt-timerange\n+  SUBMENU:=$(NF_MENU)\n+  TITLE:=timerange\n+  KCONFIG:=$(KCONFIG_IPT_TIMERANGE)\n+  FILES:=$(LINUX_DIR)/net/ipv4/netfilter/*timerange*.$(LINUX_KMOD_SUFFIX)\n+  AUTOLOAD:=$(call AutoLoad,$(notdir $(IPT_TIMERANGE-m)))\n+  DEPENDS:=@!LINUX_5_4 kmod-ipt-core\n+endef\n+\n+$(eval $(call KernelPackage,ipt-timerange))\n+\n+\n+define KernelPackage/ipt-webmon\n+  SUBMENU:=$(NF_MENU)\n+  TITLE:=webmon\n+  KCONFIG:=$(KCONFIG_IPT_WEBMON)\n+  FILES:=$(LINUX_DIR)/net/ipv4/netfilter/*webmon*.$(LINUX_KMOD_SUFFIX)\n+  AUTOLOAD:=$(call AutoLoad,$(notdir $(IPT_WEBMON-m)))\n+  DEPENDS:=@!LINUX_5_4 kmod-ipt-core\n+endef\n+\n+$(eval $(call KernelPackage,ipt-webmon))\n+\n+\n+define KernelPackage/ipt-weburl\n+  SUBMENU:=$(NF_MENU)\n+  TITLE:=weburl\n+  KCONFIG:=$(KCONFIG_IPT_WEBURL)\n+  FILES:=$(LINUX_DIR)/net/ipv4/netfilter/*weburl*.$(LINUX_KMOD_SUFFIX)\n+  AUTOLOAD:=$(call AutoLoad,$(notdir $(IPT_WEBURL-m)))\n+  DEPENDS:=@!LINUX_5_4 kmod-ipt-core\n+endef\n+\n+$(eval $(call KernelPackage,ipt-weburl))\n \n \n define KernelPackage/ipt-raw6\n\n--- a/include/netfilter.mk\n+++ b/include/netfilter.mk\n@@ -111,3 +111,14 @@\n \n+# imq\n+\n+$(eval $(call nf_add,IPT_IMQ,CONFIG_IP_NF_TARGET_IMQ, $(P_V4)ipt_IMQ))\n+$(eval $(call nf_add,IPT_IMQ,CONFIG_NETFILTER_XT_TARGET_IMQ, $(P_XT)xt_IMQ))\n+\n+# gargoyle-qos\n+\n+$(eval $(call nf_add,IPT_BANDWIDTH,CONFIG_IP_NF_MATCH_BANDWIDTH, $(P_V4)ipt_bandwidth))\n+$(eval $(call nf_add,IPT_TIMERANGE,CONFIG_IP_NF_MATCH_TIMERANGE, $(P_V4)ipt_timerange))\n+$(eval $(call nf_add,IPT_WEBMON,CONFIG_IP_NF_MATCH_WEBMON, $(P_V4)ipt_webmon))\n+$(eval $(call nf_add,IPT_WEBURL,CONFIG_IP_NF_MATCH_WEBURL, $(P_V4)ipt_weburl))\n \n # ipopt\n@@ -151,3 +162,6 @@\n $(eval $(call nf_add,IPT_FLOW,CONFIG_NETFILTER_XT_TARGET_FLOWOFFLOAD, $(P_XT)xt_FLOWOFFLOAD))\n+\n+# cgroup\n+$(eval $(call nf_add,IPT_CGROUP,CONFIG_NETFILTER_XT_MATCH_CGROUP, $(P_XT)xt_cgroup))\n \n # IPv6\n\n--- a/package/network/utils/iptables/Makefile\n+++ b/package/network/utils/iptables/Makefile\n@@ -170,3 +170,49 @@\n endef\n \n+define Package/iptables-mod-cgroup\n+$(call Package/iptables/Module, +kmod-ipt-cgroup)\n+  TITLE:=cgroup extension\n+  endef\n+\n+define Package/iptables-mod-cgroup/description\n+iptables extension for cgroup support.\n+\n+ Matches:\n+   - cgroup\n+\n+endef\n+\n+define Package/iptables-mod-imq\n+$(call Package/iptables/Module, +kmod-ipt-imq)\n+  TITLE:=IMQ support\n+endef\n+\n+define Package/iptables-mod-imq/description\n+iptables extension for IMQ support.\n+\n+ Targets:\n+   - IMQ\n+\n+endef\n+\n+define Package/iptables-mod-bandwidth\n+$(call Package/iptables/Module, +kmod-ipt-bandwidth)\n+  TITLE:=bandwidth option extensions\n+endef\n+\n+define Package/iptables-mod-timerange\n+$(call Package/iptables/Module, +kmod-ipt-timerange)\n+  TITLE:=timerange option extensions\n+endef\n+\n+define Package/iptables-mod-webmon\n+$(call Package/iptables/Module, +kmod-ipt-webmon)\n+  TITLE:=webmon option extensions\n+endef\n+\n+define Package/iptables-mod-weburl\n+$(call Package/iptables/Module, +kmod-ipt-weburl)\n+  TITLE:=weburl option extensions\n+endef\n+\n define Package/iptables-mod-ipopt\n@@ -666,2 +712,8 @@\n $(eval $(call BuildPlugin,iptables-mod-filter,$(IPT_FILTER-m)))\n+$(eval $(call BuildPlugin,iptables-mod-cgroup,$(IPT_CGROUP-m)))\n+$(eval $(call BuildPlugin,iptables-mod-imq,$(IPT_IMQ-m)))\n+$(eval $(call BuildPlugin,iptables-mod-bandwidth,$(IPT_BANDWIDTH-m)))\n+$(eval $(call BuildPlugin,iptables-mod-timerange,$(IPT_TIMERANGE-m)))\n+$(eval $(call BuildPlugin,iptables-mod-webmon,$(IPT_WEBMON-m)))\n+$(eval $(call BuildPlugin,iptables-mod-weburl,$(IPT_WEBURL-m)))\n $(eval $(call BuildPlugin,iptables-mod-ipopt,$(IPT_IPOPT-m)))\n\n"
  },
  {
    "path": "devices/common/patches/netsupport.patch",
    "content": "--- a/package/kernel/linux/modules/netsupport.mk\n+++ b/package/kernel/linux/modules/netsupport.mk\n@@ -64,7 +64,7 @@ define KernelPackage/bonding\n   SUBMENU:=$(NETWORK_SUPPORT_MENU)\n   TITLE:=Ethernet bonding driver\n   KCONFIG:=CONFIG_BONDING\n-  DEPENDS:=PACKAGE_kmod-tls:kmod-tls\n+  DEPENDS:=+PACKAGE_kmod-tls:kmod-tls\n   FILES:=$(LINUX_DIR)/drivers/net/bonding/bonding.ko\n   AUTOLOAD:=$(call AutoLoad,40,bonding)\n   MODPARAMS.bonding:=max_bonds=0\n"
  },
  {
    "path": "devices/common/patches/nftables.patch",
    "content": "--- a/package/network/utils/nftables/Makefile\n+++ b/package/network/utils/nftables/Makefile\n@@ -48,7 +48,6 @@ define Package/nftables-nojson\n   TITLE+= no JSON support\n   VARIANT:=nojson\n   DEFAULT_VARIANT:=1\n-  CONFLICTS:=nftables-json\n endef\n \n define Package/nftables-json\n"
  },
  {
    "path": "devices/common/patches/nginx-fancyindex.patch.bak",
    "content": "--- package/feeds/packages/nginx/Makefile\n+++ package/feeds/packages/nginx/Makefile\n@@ -28,6 +28,7 @@ PKG_CONFIG_DEPENDS := \\\n \tCONFIG_NGINX_DAV \\\n \tCONFIG_NGINX_FLV \\\n \tCONFIG_NGINX_UBUS \\\n+\tCONFIG_NGINX_FANCYINDEX \\\n \tCONFIG_NGINX_STUB_STATUS \\\n \tCONFIG_NGINX_HTTP_CHARSET \\\n \tCONFIG_NGINX_HTTP_GZIP \\\n@@ -242,6 +243,9 @@ ifneq ($(BUILD_VARIANT),all-module)\n   ifeq ($(CONFIG_NGINX_UBUS),y)\n     ADDITIONAL_MODULES += --add-module=$(PKG_BUILD_DIR)/nginx-ubus-module\n   endif\n+  ifeq ($(CONFIG_NGINX_FANCYINDEX),y)\n+    ADDITIONAL_MODULES += --with-http_addition_module --add-module=$(PKG_BUILD_DIR)/nginx-fancyindex-module\n+  endif\n   ifeq ($(CONFIG_NGINX_HTTP_AUTH_REQUEST),y)\n     ADDITIONAL_MODULES += --with-http_auth_request_module\n   endif\n@@ -398,6 +402,7 @@ define Build/Prepare\n \t$(Prepare/nginx-ts)\n \t$(Prepare/nginx-dav-ext-module)\n \t$(Prepare/nginx-ubus-module)\n+\t$(Prepare/nginx-fancyindex-module)\n endef\n \n \n@@ -545,6 +550,22 @@ ifeq ($(CONFIG_NGINX_UBUS),y)\n   endef\n endif\n \n+ifeq ($(CONFIG_NGINX_FANCYINDEX),y)\n+  define Download/nginx-fancyindex-module\n+    VERSION:=56934db14ccfb89d6cb452ea1b4c76225c89b8c1\n+    SUBDIR:=nginx-fancyindex-module\n+    FILE:=ngx-fancyindex-$$(VERSION).tar.xz\n+    URL:=https://github.com/aperezdc/ngx-fancyindex.git\n+    PROTO:=git\n+  endef\n+  $(eval $(call Download,nginx-fancyindex-module))\n+\n+  define Prepare/nginx-fancyindex-module\n+\t$(eval $(Download/nginx-fancyindex-module))\n+\txzcat $(DL_DIR)/$(FILE) | tar -C $(PKG_BUILD_DIR) $(TAR_OPTIONS)\n+  endef\n+endif\n+\n # TODO: remove after a transition period (together with pkg nginx-util):\n # It is for smoothly substituting nginx and nginx-mod-luci-ssl (by nginx-ssl\n # respectively nginx-mod-luci). Add above commented PROVIDES when removing.\n\n--- package/feeds/packages/nginx/Config_ssl.in\n+++ package/feeds/packages/nginx/Config_ssl.in\n@@ -36,6 +36,13 @@ config NGINX_STUB_STATUS\n \t\tEnable the stub status module which gives some status from the server.\n \tdefault n\n \n+config NGINX_FANCYINDEX\n+\tbool\n+\tprompt \"Enable FANCYINDEX module\"\n+\thelp\n+\t\tEnable FANCYINDEX module.\n+\tdefault y\n+\n config NGINX_HTTP_CHARSET\n \tbool\n \tprompt \"Enable HTTP charset module\"\n"
  },
  {
    "path": "devices/common/patches/nonshared.patch",
    "content": "--- a/package/firmware/linux-firmware/Makefile\n+++ b/package/firmware/linux-firmware/Makefile\n@@ -19,6 +19,8 @@ PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>\n \n SCAN_DEPS = *.mk\n \n+PKG_FLAGS:=nonshared\n+\n include $(INCLUDE_DIR)/package.mk\n \n RSTRIP:=:\n"
  },
  {
    "path": "devices/common/patches/opkginstall.patch",
    "content": "--- a/package/feeds/luci/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js\n+++ b/package/feeds/luci/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js\n@@ -186,7 +186,7 @@ function parseList(s, dest)\n \t\t\tval = RegExp.$2.trim();\n \t\t}\n \t\telse if (pkg) {\n-\t\t\tdest.pkgs[pkg.name] = pkg;\n+\t\t\tdest.pkgs[pkg.name] = dest.pkgs[pkg.name] ? dest.pkgs[pkg.name] : pkg;\n \n \t\t\tconst provides = dest.providers[pkg.name] ? [] : [ pkg.name ];\n \n@@ -249,7 +249,7 @@ function display(pattern)\n \t\t\tconst avail = packages.available.pkgs[name];\n \t\t\tconst inst  = packages.installed.pkgs[name];\n \n-\t\t\tif (!inst || !inst.installed)\n+\t\t\tif (!inst || !inst.installed || pkg.name.includes('kmod-') || pkg.name.includes('busybox') || pkg.name.includes('base-files'))\n \t\t\t\tcontinue;\n \n \t\t\tif (!avail || compareVersion(avail.version, pkg.version) <= 0)\n@@ -289,7 +289,7 @@ function display(pattern)\n \t\t\t\t\t'data-action': 'install',\n \t\t\t\t\t'click': handleInstall\n \t\t\t\t}, _('Install…'));\n-\t\t\telse if (inst.installed && inst.version != pkg.version)\n+\t\t\telse if (inst.installed && compareVersion(pkg.version, inst.version) > 0)\n \t\t\t\tbtn = E('div', {\n \t\t\t\t\t'class': 'btn cbi-button-positive',\n \t\t\t\t\t'data-package': name,\n@@ -791,7 +791,8 @@ function handleInstall(ev)\n \t\t\t\t\t\t'id': 'overwrite-cb',\n \t\t\t\t\t\t'type': 'checkbox',\n \t\t\t\t\t\t'name': 'overwrite',\n-\t\t\t\t\t\t'disabled': isReadonlyView\n+\t\t\t\t\t\t'disabled': isReadonlyView,\n+\t\t\t\t\t\t'checked': true\n \t\t\t\t\t}), ' ',\n \t\t\t\t\tE('label', { 'for': 'overwrite-cb' }), ' ',\n \t\t\t\t\t_('Allow overwriting conflicting package files')\n@@ -1031,6 +1032,8 @@ function handlePkg(ev)\n \t\t\tif (res.pkmcmd)\n \t\t\t\tdlg.appendChild(E('pre', [ res.pkmcmd ]));\n \n+\t\t\tconst showModalFlag = (cmd !== 'update' && pkg) || res.stderr;\n+\t\t\tif (showModalFlag) {\n \t\t\tif (res.stdout)\n \t\t\t\tdlg.appendChild(E('pre', [ res.stdout ]));\n \n@@ -1058,6 +1061,10 @@ function handlePkg(ev)\n \t\t\t\t\t\t\tresolveFn(res);\n \t\t\t\t\t}, this, res)\n \t\t\t\t}, _('Dismiss'))));\n+\t\t\t\t} else {\n+\t\t\t\tui.hideModal();\n+\t\t\t\tupdateLists();\n+\t\t\t\t}\n \t\t}).catch(function(err) {\n \t\t\tui.addNotification(null, E('p', _('Unable to execute <em>%s %s</em> command: %s').format(L.hasSystemFeature('apk') ? 'apk' : 'opkg', cmd, err)));\n \t\t\tui.hideModal();\n@@ -1152,6 +1159,36 @@ return view.extend({\n \t},\n \n \trender(listData) {\n+\t\t\tconst checkUpdateNeeded = function() {\n+            return Promise.all([\n+                L.resolveDefault(fs.stat('/tmp/opkg-lists/kwrt_kiddin9'), null),\n+                L.resolveDefault(fs.read('/tmp/resolv.conf.d/resolv.conf.auto'), '')\n+            ]).then(function(results) {\n+                const stat = results[0];\n+                const resolvContent = results[1];\n+\n+                let needUpdate = false;\n+\n+                if (stat) {\n+                    const currentDate = new Date();\n+                    const lastUpdateDate = new Date(stat.mtime * 1000);  // Convert seconds to milliseconds\n+                    // 检查是否在今天的零点之后更新过\n+                    const today = new Date(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate());\n+                    needUpdate = lastUpdateDate < today;\n+                } else {\n+                    needUpdate = true;\n+                }\n+\n+                // 检查 resolv.conf.auto 文件内容\n+                const hasResolvContent = resolvContent && resolvContent.trim().length > 0;\n+\n+                // 只有当需要更新且 resolv.conf.auto 不为空时，才返回 true\n+                return needUpdate && hasResolvContent;\n+            }).catch(function(error) {\n+                console.error('Error checking update status:', error);\n+                return false; // 如果出错，不执行更新\n+            });\n+        };\n \t\tconst query = decodeURIComponent(L.toArray(location.search.match(/\\bquery=([^=]+)\\b/))[1] || '');\n \n \t\tconst view = E([], [\n@@ -1193,6 +1230,7 @@ return view.extend({\n \t\t\t\t\tE('label', {}, _('Actions') + ':'), ' ',\n \t\t\t\t\tE('span', { 'class': 'control-group' }, [\n \t\t\t\t\t\tE('button', { 'class': 'btn cbi-button-positive', 'data-command': 'update', 'click': handlePkg, 'disabled': isReadonlyView }, [ _('Update lists…') ]), ' ',\n+\t\t\t\t\t\tE('button', { 'class': 'btn cbi-button-negative', 'data-command': 'upgradeall', 'click': handlePkg, 'disabled': isReadonlyView }, [ _('Upgrade all…') ]), ' ',\n \t\t\t\t\t\tE('button', { 'class': 'btn cbi-button-action', 'click': handleUpload, 'disabled': isReadonlyView }, [ _('Upload Package…') ]), ' ',\n \t\t\t\t\t\tE('button', { 'class': 'btn cbi-button-neutral', 'click': handleConfig }, [ _('Configure %s').format(L.hasSystemFeature('apk') ? 'apk' : 'opkg') ])\n \t\t\t\t\t])\n@@ -1278,7 +1316,17 @@ return view.extend({\n \t\t]);\n \n \t\trequestAnimationFrame(function() {\n-\t\t\tupdateLists(listData)\n+\t\t\tupdateLists(listData);\n+            checkUpdateNeeded().then(function(needUpdate) {\n+                if (needUpdate) {\n+\t\tsetTimeout(function() {\n+                    const updateButton = document.querySelector('button[data-command=\"update\"]');\n+                    if (updateButton) {\n+                        updateButton.click();\n+                    }\n+\t\t}, 10)\n+                }\n+            });\n \t\t});\n \n \t\treturn view;\n\n--- a/package/feeds/luci/luci-app-package-manager/root/usr/libexec/package-manager-call\n+++ b/package/feeds/luci/luci-app-package-manager/root/usr/libexec/package-manager-call\n@@ -27,7 +27,7 @@ case \"$action\" in\n \t\t\tfind \"${lists_dir:-/usr/lib/opkg/lists}\" -type f '!' -name '*.sig' | xargs -r gzip -cd\n \t\tfi\n \t;;\n-\tinstall|update|upgrade|remove)\n+\tinstall|update|upgrade|upgradeall|remove)\n \t\t(\n \t\t\tcmd=\"$ipkg_bin\"\n \n@@ -89,10 +89,45 @@ case \"$action\" in\n \n \t\t\tif flock -x 200; then\n \t\t\t\tpkmcmd=\"$cmd $action $@\"\n-\t\t\t\t$cmd $action \"$@\" </dev/null >/tmp/ipkg.out 2>/tmp/ipkg.err\n-\t\t\t\tcode=$?\n-\t\t\t\tstdout=$(cat /tmp/ipkg.out)\n+\t\t\t\tif [ $action == \"upgradeall\" ]; then\n+\t\t\t\t\t$cmd update </dev/null >/tmp/ipkg.out 2>/tmp/ipkg.err\n+\t\t\t\t\tcode=$?\n+\t\t\t\t\tif [ $code == 0 ]; then\n+\t\t\t\t\t\t. /etc/profile.d/opkg.sh\n+\t\t\t\t\t\tif [[ \"$(cat `opkg export au`)\" ]] && lock -n /var/lock/opkg-upgrade; then\n+\t\t\t\t\t\t opkg upgr </dev/null >>/tmp/ipkg.out 2>>/tmp/ipkg.err\n+\t\t\t\t\t\t code=$?\n+\t\t\t\t\t\t lock -u /var/lock/opkg-upgrade\n+\t\t\t\t\t\telse\n+\t\t\t\t\t\t\techo \"🎉 所有软件包已是最新~\" >>/tmp/ipkg.out\n+\t\t\t\t\t\t\tcode=0\n+\t\t\t\t\t\tfi\n+\t\t\t\t\tfi\n+\t\t\t\telse\n+\t\t\t\t\t$cmd $action \"$@\" </dev/null >/tmp/ipkg.out 2>/tmp/ipkg.err\n+\t\t\t\t\tcode=$?\n+\t\t\t\tfi\n+\t\t\t\tpkgn=\"$(echo $@ | cut -d - -f 3-)\"\n+\t\t\t\tcase \"$action\" in\n+\t\t\t\t\tinstall|upgrade)\n+\t\t\t\t\tif [ \"$(opkg list-installed | cut -f 1 -d ' ' | grep -w $@)\" ]; then\n+\t\t\t\t\t\t\trm -f /tmp/ipkg.err\n+\t\t\t\t\t\t\t([ -f /etc/profile.d/opkg.sh ] && . /etc/profile.d/opkg.sh && opkg save) &\n+\t\t\t\t\tfi\n+\t\t\t\t\t;;\n+\t\t\t\t\tremove)\n+\t\t\t\t\t\tif [ ! \"$(opkg list-installed | cut -f 1 -d ' ' | grep -w $@)\" ]; then\n+\t\t\t\t\t\t\trm -f /tmp/ipkg.err\n+\t\t\t\t\t\t\t([ -f /etc/profile.d/opkg.sh ] && . /etc/profile.d/opkg.sh && opkg save) &\n+\t\t\t\t\t\tfi\n+\t\t\t\t\t;;\n+\t\t\t\tesac\n \t\t\t\tstderr=$(cat /tmp/ipkg.err)\n+\t\t\t\t[ -n \"$stderr\" ] || {\n+\t\t\t\t\techo \"🎉 已完成, 请关闭本窗口~\" >>/tmp/ipkg.out\n+\t\t\t\t\tcode=0\n+\t\t\t\t}\n+\t\t\t\tstdout=$(cat /tmp/ipkg.out)\n \t\t\telse\n \t\t\t\tcode=255\n \t\t\t\tstderr=\"Failed to acquire lock\"\n@@ -110,7 +145,7 @@ case \"$action\" in\n \t;;\n \t*)\n \t\techo \"Usage: $0 {list-installed|list-available|update}\" >&2\n-\t\techo \"       $0 {install|upgrade|remove} pkg[ pkg...]\" >&2\n+\t\techo \"       $0 {install|upgrade|upgradeall|remove} pkg[ pkg...]\" >&2\n \t\texit 1\n \t;;\n esac\n\n\n--- a/package/feeds/luci/luci-app-package-manager/root/usr/share/rpcd/acl.d/luci-app-package-manager.json\n+++ b/package/feeds/luci/luci-app-package-manager/root/usr/share/rpcd/acl.d/luci-app-package-manager.json\n@@ -8,6 +8,7 @@\n \t\t\t\t\"/usr/libexec/package-manager-call list-available\": [ \"exec\" ],\n \t\t\t\t\"/etc/opkg.conf\": [ \"read\" ],\n \t\t\t\t\"/etc/opkg/*.conf\": [ \"read\" ],\n+\t\t\t\t\"/tmp/resolv.conf.d/resolv.conf.auto\": [ \"read\" ],\n \t\t\t\t\"/etc/apk/repositories\": [ \"read\" ],\n \t\t\t\t\"/etc/apk/repositories.d/distfeeds.list\": [ \"read\" ],\n \t\t\t\t\"/etc/apk/repositories.d/customfeeds.list\": [ \"read\" ]\n@@ -24,6 +25,7 @@\n \t\t\t\t\"/usr/libexec/package-manager-call update\": [ \"exec\" ],\n \t\t\t\t\"/usr/libexec/package-manager-call upgrade\": [ \"exec\" ],\n \t\t\t\t\"/usr/libexec/package-manager-call upgrade *\": [ \"exec\" ],\n+\t\t\t\t\"/usr/libexec/package-manager-call upgradeall\": [ \"exec\" ],\n \t\t\t\t\"/etc/opkg.conf\": [ \"write\" ],\n \t\t\t\t\"/etc/opkg/*.conf\": [ \"write\" ],\n \t\t\t\t\"/etc/apk/repositories\": [ \"write\" ],\n"
  },
  {
    "path": "devices/common/patches/package.patch",
    "content": "--- a/include/package.mk\n+++ b/include/package.mk\n@@ -354,3 +354,11 @@ dist:\n \n distcheck:\n \t$(Build/DistCheck)\n+\n+ifndef Package/$(PKG_NAME)/conffiles\n+define Package/$(PKG_NAME)/conffiles\n+/etc/config/\n+/etc/$(PKG_NAME)/\n+endef\n+endif\n+\n\n--- a/package/Makefile\n+++ b/package/Makefile\n@@ -118,8 +118,11 @@ endif\n \n \t$(call prepare_rootfs,$(TARGET_DIR),$(TOPDIR)/files)\n \n+PACKAGE_SUFFIX:=$(if $(CONFIG_USE_APK),apk,ipk)\n $(curdir)/index: FORCE\n \t@echo Generating package index...\n+\t$(FIND) $(wildcard $(PACKAGE_SUBDIRS)) -path $(PACKAGE_DIR) -prune -o \\\n+    -type f -name '*.$(PACKAGE_SUFFIX)' -exec $(CP) -t $(PACKAGE_DIR)/ {} +\n ifneq ($(CONFIG_USE_APK),)\n \t@for d in $(PACKAGE_SUBDIRS); do \\\n \t\tmkdir -p $$d; \\\n"
  },
  {
    "path": "devices/common/patches/rootfs.patch",
    "content": "--- a/include/rootfs.mk\n+++ b/include/rootfs.mk\n@@ -88,7 +88,6 @@ define prepare_rootfs\n \t\t\tret=$$?; \\\n \t\t\tif [ $$ret -ne 0 ]; then \\\n \t\t\t\techo \"postinst script $$script has failed with exit code $$ret\" >&2; \\\n-\t\t\t\texit 1; \\\n \t\t\tfi; \\\n \t\t\t[ -n \"$(CONFIG_USE_APK)\" ] && $(STAGING_DIR_HOST)/bin/tar --delete -f ./lib/apk/db/scripts.tar $$(basename $$script); \\\n \t\tdone; \\"
  },
  {
    "path": "devices/common/patches/status.patch",
    "content": "--- a/package/feeds/luci/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js\n+++ b/package/feeds/luci/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js\n@@ -32,8 +32,7 @@ return baseclass.extend({\n \t\t    swap = L.isObject(systeminfo.swap) ? systeminfo.swap : {};\n \n \t\tvar fields = [\n-\t\t\t_('Total Available'), (mem.available) ? mem.available : (mem.total && mem.free && mem.buffered) ? mem.free + mem.buffered : null, mem.total,\n-\t\t\t_('Used'),            (mem.total && mem.free) ? (mem.total - mem.free) : null, mem.total,\n+\t\t\t_('Used'),            (mem.total && mem.available) ? (mem.total - mem.free - mem.buffered - mem.cached) : null, mem.total,\n \t\t];\n \n \t\tif (mem.buffered)\n@@ -43,9 +42,9 @@ return baseclass.extend({\n \t\t\tfields.push(_('Cached'), mem.cached, mem.total);\n \n \t\tif (swap.total > 0)\n-\t\t\tfields.push(_('Swap free'), swap.free, swap.total);\n+\t\t\tfields.push(_('Swap used'), swap.total - swap.free, swap.total);\n \n-\t\tvar table = E('table', { 'class': 'table' });\n+\t\tvar table = E('table', { 'class': 'table memory' });\n \n \t\tfor (var i = 0; i < fields.length; i += 3) {\n \t\t\ttable.appendChild(E('tr', { 'class': 'tr' }, [\n\n--- a/package/feeds/luci/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json\n+++ b/package/feeds/luci/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json\n@@ -6,7 +6,7 @@\n \t\t\t\t\"/etc/services\": [ \"read\" ]\n \t\t\t},\n \t\t\t\"ubus\": {\n-\t\t\t\t\"luci\": [ \"getConntrackList\", \"getRealtimeStats\" ],\n+\t\t\t\t\"luci\": [ \"getConntrackList\", \"getRealtimeStats\", \"getCPUBench\", \"getCPUUsage\", \"getOnlineUsers\" ],\n \t\t\t\t\"luci-rpc\": [ \"getHostHints\", \"getNetworkDevices\", \"getDHCPLeases\" ],\n \t\t\t\t\"network.rrdns\": [ \"lookup\" ]\n \t\t\t}\n\n--- a/package/feeds/luci/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js\n+++ b/package/feeds/luci/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js\n@@ -18,6 +18,21 @@ var callSystemInfo = rpc.declare({\n \tmethod: 'info'\n });\n \n+var callCPUBench = rpc.declare({\n+\tobject: 'luci',\n+\tmethod: 'getCPUBench'\n+});\n+\n+var callCPUInfo = rpc.declare({\n+\tobject: 'luci',\n+\tmethod: 'getCPUInfo'\n+});\n+\n+var callTempInfo = rpc.declare({\n+\tobject: 'luci',\n+\tmethod: 'getTempInfo'\n+});\n+\n return baseclass.extend({\n \ttitle: _('System'),\n \n@@ -25,6 +45,9 @@ return baseclass.extend({\n \t\treturn Promise.all([\n \t\t\tL.resolveDefault(callSystemBoard(), {}),\n \t\t\tL.resolveDefault(callSystemInfo(), {}),\n+\t\t\tL.resolveDefault(callCPUBench(), {}),\n+\t\t\tL.resolveDefault(callCPUInfo(), {}),\n+\t\t\tL.resolveDefault(callTempInfo(), {}),\n \t\t\tL.resolveDefault(callLuciVersion(), { revision: _('unknown version'), branch: 'LuCI' }),\n \t\t\tL.resolveDefault(callGetUnixtime(), 0),\n \t\t\tuci.load('system')\n@@ -32,7 +56,10 @@ return baseclass.extend({\n \trender: function(data) {\n \t\tvar boardinfo   = data[0],\n \t\t    systeminfo  = data[1],\n-\t\t    luciversion = data[2],\n-\t\t    unixtime    = data[3];\n+\t\t    cpubench    = data[2],\n+\t\t    cpuinfo     = data[3],\n+\t\t    tempinfo    = data[4],\n+\t\t    luciversion = data[5],\n+\t\t    unixtime    = data[6];\n \n \t\tluciversion = luciversion.branch + ' ' + luciversion.revision;\n \n@@ -53,8 +81,6 @@ return baseclass.extend({\n \n \t\tvar fields = [\n \t\t\t_('Hostname'),         boardinfo.hostname,\n-\t\t\t_('Model'),            boardinfo.model,\n-\t\t\t_('Architecture'),     boardinfo.system,\n \t\t\t_('Target Platform'),  (L.isObject(boardinfo.release) ? boardinfo.release.target : ''),\n \t\t\t_('Firmware Version'), (L.isObject(boardinfo.release) ? boardinfo.release.description + ' / ' : '') + (luciversion || ''),\n \t\t\t_('Kernel Version'),   boardinfo.kernel,\n@@ -67,6 +93,24 @@ return baseclass.extend({\n \t\t\t) : null\n \t\t];\n \n+\t\tif (tempinfo.tempinfo) {\n+\t\t\tfields.splice(6, 0, _('Temperature'));\n+\t\t\tfields.splice(7, 0, tempinfo.tempinfo);\n+\t\t}\n+\t\tif (boardinfo.model == \"Default string Default string\") {\n+\t\t\tif (cpuinfo.cpuinfo) {\n+\t\t\tfields.splice(2, 0, _('Architecture'));\n+\t\t\tfields.splice(3, 0, cpuinfo.cpuinfo + cpubench.cpubench);\n+\t\t\t}\n+\t\t} else {\n+\t\t\tfields.splice(2, 0, _('Model'));\n+\t\t\tfields.splice(3, 0, boardinfo.model + cpubench.cpubench);\n+\t\t\tif (cpuinfo.cpuinfo) {\n+\t\t\tfields.splice(4, 0, _('Architecture'));\n+\t\t\tfields.splice(5, 0, cpuinfo.cpuinfo);\n+\t\t\t}\n+\t\t}\n+\n \t\tvar table = E('table', { 'class': 'table' });\n \n \t\tfor (var i = 0; i < fields.length; i += 2) {\n\n--- a/package/feeds/luci/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js\n+++ b/package/feeds/luci/luci-mod-status/htdocs/luci-static/resources/view/status/nftables.js\n@@ -675,7 +675,6 @@ return view.extend({\n \tcheckLegacyRules: function(ipt4save, ipt6save) {\n \t\tif (ipt4save.match(/\\n-A /) || ipt6save.match(/\\n-A /)) {\n \t\t\tui.addNotification(_('Legacy rules detected'), [\n-\t\t\t\tE('p', _('There are legacy iptables rules present on the system. Mixing iptables and nftables rules is discouraged and may lead to incomplete traffic filtering.')),\n \t\t\t\tE('button', {\n \t\t\t\t\t'class': 'btn cbi-button',\n \t\t\t\t\t'click': function() { location.href = 'nftables/iptables' }\n\n--- a/package/feeds/luci/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js\n+++ b/package/feeds/luci/luci-mod-status/htdocs/luci-static/resources/view/status/include/29_ports.js\n@@ -309,8 +309,6 @@ return baseclass.extend({\n \t},\n \n \trender(data) {\n-\t\tif (L.hasSystemFeature('swconfig'))\n-\t\t\treturn null;\n \n \t\tconst board = JSON.parse(data[1]),\n \t\t    known_ports = [],\n"
  },
  {
    "path": "devices/common/patches/use_json_object_new_int64.patch.b",
    "content": "--- a/package/feeds/luci/luci-lib-jsonc/src/jsonc.c\n+++ b/package/feeds/luci/luci-lib-jsonc/src/jsonc.c\n@@ -366,9 +366,7 @@\n \tcase LUA_TNUMBER:\n \t\tnd = lua_tonumber(L, index);\n-\t\tni = lua_tointeger(L, index);\n-\n-\t\tif (nd == ni)\n-\t\t\treturn json_object_new_int(nd);\n-\n+\t\tif(nd >= INT64_MIN && nd <= INT64_MAX)\n+\t\t\treturn json_object_new_int64(nd);\n+\t\telse\n \t\treturn json_object_new_double(nd);\n \n"
  },
  {
    "path": "devices/common/patches/wifi-scripts.patch",
    "content": "--- a/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh\n+++ b/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh\n@@ -122,6 +122,7 @@ hostapd_common_add_device_config() {\n \tconfig_add_int maxassoc\n \tconfig_add_int reg_power_type\n \tconfig_add_boolean stationary_ap\n+\tconfig_add_boolean vendor_vht\n \n \tconfig_add_string acs_chan_bias\n \tconfig_add_array hostapd_options\n@@ -141,7 +142,7 @@ hostapd_prepare_device_config() {\n \tjson_get_vars country country3 country_ie beacon_int:100 doth require_mode legacy_rates \\\n \t\tacs_chan_bias local_pwr_constraint spectrum_mgmt_required airtime_mode cell_density \\\n \t\trts_threshold beacon_rate rssi_reject_assoc_rssi rssi_reject_assoc_timeout rssi_ignore_probe_request \\\n-\t\tmaxassoc mbssid:0 band reg_power_type stationary_ap\n+\t\tmaxassoc mbssid:0 band reg_power_type stationary_ap vendor_vht\n \n \thostapd_set_log_options base_cfg\n \n@@ -210,6 +211,7 @@ hostapd_prepare_device_config() {\n \t\t\t\tset_default rate_list \"24000 36000 48000 54000\"\n \t\t\t\tset_default basic_rate_list \"24000\"\n \t\t\tfi\n+\t\t\t[ -n \"$vendor_vht\" ] && append base_cfg \"vendor_vht=$vendor_vht\" \"$N\"\n \t\t;;\n \t\ta)\n \t\t\tif [ \"$cell_density\" -eq 1 ]; then\n"
  },
  {
    "path": "devices/common/patches/wireless.patch",
    "content": "--- a/package/feeds/luci/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js\n+++ b/package/feeds/luci/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js\n@@ -1026,6 +1026,12 @@ return view.extend({\n \t\t\t\t\to.placeholder = 100;\n \t\t\t\t\to.rmempty = true;\n \n+\t\t\t\t\to = ss.taboption(\"advanced\", form.Flag, 'mu_beamformer', _('MU-MIMO'));\n+\t\t\t\t\to.default = '1';\n+\n+\t\t\t\t\to = ss.taboption('advanced', form.Flag, 'vendor_vht', _('Enable 256-QAM'), _('802.11n 2.4Ghz Only'));\n+\t\t\t\t\to.default = o.disabled;\n+\n \t\t\t\t\to = ss.taboption('advanced', form.Flag, 'rxldpc', _('Rx LDPC'), _('Low-Density Parity-Check'));\n \t\t\t\t\to.default = '1';\n \n"
  },
  {
    "path": "devices/common/settings.ini",
    "content": "REPO_URL=\"https://github.com/openwrt/openwrt\"\nREPO_BRANCH=\"\"\nCONFIG_FILE=\".config\"\nDIY_SH=\"diy.sh\"\nFREE_UP_DISK=\"false\"\nUPLOAD_BIN_DIR_FOR_ARTIFACT=\"false\"\nUPLOAD_FIRMWARE_FOR_ARTIFACT=\"true\"\nUPLOAD_FIRMWARE_FOR_RELEASE=\"false\"\nUPLOAD_FIRMWARE_TO_COWTRANSFER=\"false\"\nUPLOAD_FIRMWARE_TO_WETRANSFER=\"true\"\n"
  },
  {
    "path": "devices/ipq40xx_generic/.config",
    "content": "\nCONFIG_TARGET_ipq40xx=y\nCONFIG_TARGET_ipq40xx_generic=y\n\nCONFIG_TARGET_DEVICE_ipq40xx_generic_DEVICE_dlink_dap-2610=n\nCONFIG_TARGET_DEVICE_ipq40xx_generic_DEVICE_eagle-pro-ai-m32-a1=n\nCONFIG_TARGET_DEVICE_ipq40xx_generic_DEVICE_eagle-pro-ai-r32-a1=n\nCONFIG_TARGET_DEVICE_ipq40xx_generic_DEVICE_extreme-networks_ws-ap391x=n\nCONFIG_TARGET_DEVICE_ipq40xx_generic_DEVICE_netgear_ex6100v2=n\nCONFIG_TARGET_DEVICE_ipq40xx_generic_DEVICE_netgear_ex6150v2=n\nCONFIG_TARGET_DEVICE_ipq40xx_generic_DEVICE_zyxel_nbg6617=n\n\n\n\n\n\n"
  },
  {
    "path": "devices/ipq40xx_generic/diy.sh",
    "content": "#!/bin/bash\n\nshopt -s extglob\n\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\n#sh -c \"curl -sfL https://patch-diff.githubusercontent.com/raw/openwrt/openwrt/pull/10778.patch | git apply -p1\"\n\nwget -N https://github.com/immortalwrt/immortalwrt/raw/refs/heads/openwrt-25.12/target/linux/ipq40xx/patches-6.12/991-ipq40xx-unlock-cpu-frequency.patch -P target/linux/ipq40xx/patches-6.12/\n\n\n"
  },
  {
    "path": "devices/ipq40xx_generic/patches/ap4220.patch",
    "content": "From 901be81149fd7c97fb5c7fdabe6e05e470fada00 Mon Sep 17 00:00:00 2001\nFrom: Willem Lee <1980490718@qq.com>\nDate: Fri, 18 Apr 2025 05:30:01 +0800\nSubject: [PATCH] ipq40xx: add support for Aliyun AP4220\n\nHardware specifications\n-------------\n- SoC       : Qualcomm IPQ4018\n- RAM       : 256 MiB DDR3\n- Flash     : 4 MiB SPI NOR (Winbond) + 128 MiB SPI NAND (Winbond)\n- WLAN      : IPQ4018 built-in\n  - 2.4 GHz : 2x2 MIMO WiFi4\n  - 5 GHz   : 2x2 MIMO WiFi5\n- Ethernet  : QCA8072 10/100/1000 Mbps 1x WAN (PoE); 1x LAN\n- USB       : 1x 2.0\n- UART      : 1x Rj45 port, 115200n8\n- Buttons   : 1x Reset\n- LEDs      : 1x Power (green)\n              1x WiFi 2.4 GHz (green)\n              1x WiFi 5 GHz (green)\n- Power     : 802.3at PoE\n\nFlash instructions\n-------------\n  1. Connect the router via serial port\n  2. Keep pressing \"@\" until uboot is interrupted\n  3. Download the initramfs image, rename it to\n     initramfs.bin, host it with tftp server\n  4. Run these commands:\n     \"tftpboot initramfs.bin && bootm\"\n  5. After openwrt boots up, use scp or luci\n     to upload sysupgrade.bin to upgrade.\n\nSigned-off-by: Willem Lee <1980490718@qq.com>\n---\n .../uboot-tools/uboot-envtools/files/ipq40xx  |   1 +\n package/firmware/ipq-wifi/Makefile            |   2 +\n .../ipq40xx/base-files/etc/board.d/02_network |   6 +\n .../etc/hotplug.d/firmware/11-ath10k-caldata  |   8 +\n .../base-files/lib/upgrade/platform.sh        |   3 +-\n .../arm/boot/dts/qcom/qcom-ipq4018-ap4220.dts | 369 ++++++++++++++++++\n target/linux/ipq40xx/image/generic.mk         |  12 +\n 7 files changed, 400 insertions(+), 1 deletion(-)\n create mode 100644 target/linux/ipq40xx/files-6.12/arch/arm/boot/dts/qcom/qcom-ipq4018-ap4220.dts\n\ndiff --git a/package/boot/uboot-tools/uboot-envtools/files/ipq40xx b/package/boot/uboot-tools/uboot-envtools/files/ipq40xx\nindex 717158b0425ea5..481722a7e7c66a 100644\n--- a/package/boot/uboot-tools/uboot-envtools/files/ipq40xx\n+++ b/package/boot/uboot-tools/uboot-envtools/files/ipq40xx\n@@ -32,6 +32,7 @@ ubootenv_mtdinfo () {\n \n case \"$board\" in\n alfa-network,ap120c-ac|\\\n+aliyun,ap4220|\\\n devolo,magic-2-wifi-next|\\\n edgecore,ecw5211|\\\n glinet,gl-a1300 |\\\ndiff --git a/package/firmware/ipq-wifi/Makefile b/package/firmware/ipq-wifi/Makefile\nindex 72e397443888c9..1f0b611c9ed584 100644\n--- a/package/firmware/ipq-wifi/Makefile\n+++ b/package/firmware/ipq-wifi/Makefile\n@@ -28,6 +28,7 @@ endef\n \t8devices_kiwi \\\n \t8devices_mango \\\n \talfa-network_ap120c-ax \\\n+\taliyun_ap4220 \\\n \taliyun_ap8220 \\\n \tarcadyan_aw1000 \\\n \tasus_rt-ax89x \\\n@@ -177,6 +178,7 @@ endef\n $(eval $(call generate-ipq-wifi-package,8devices_kiwi,8devices Kiwi))\n $(eval $(call generate-ipq-wifi-package,8devices_mango,8devices Mango))\n $(eval $(call generate-ipq-wifi-package,alfa-network_ap120c-ax,ALFA Network AP120C-AX))\n+$(eval $(call generate-ipq-wifi-package,aliyun_ap4220,Aliyun AP4220))\n $(eval $(call generate-ipq-wifi-package,aliyun_ap8220,Aliyun AP8220))\n $(eval $(call generate-ipq-wifi-package,arcadyan_aw1000,Arcadyan AW1000))\n $(eval $(call generate-ipq-wifi-package,asus_rt-ax89x,Asus RT-AX89X))\ndiff --git a/target/linux/ipq40xx/base-files/etc/board.d/02_network b/target/linux/ipq40xx/base-files/etc/board.d/02_network\nindex 57dca0e1a2a93a..27f5aefd002286 100644\n--- a/target/linux/ipq40xx/base-files/etc/board.d/02_network\n+++ b/target/linux/ipq40xx/base-files/etc/board.d/02_network\n@@ -31,6 +31,7 @@ ipq40xx_setup_interfaces()\n \t8dev,jalapeno|\\\n \talfa-network,ap120c-ac|\\\n \tasus,map-ac1300|\\\n+\taliyun,ap4220|\\\n \tasus,map-ac2200|\\\n \tcilab,meshpoint-one|\\\n \tedgecore,ecw5211|\\\n@@ -171,6 +172,11 @@ ipq40xx_setup_macs()\n \t8dev,habanero-dvk)\n \t\tlabel_mac=$(mtd_get_mac_binary \"ART\" 0x1006)\n \t\t;;\n+\taliyun,ap4220)\n+\t\twan_mac=$(mtd_get_mac_text product_info 0x40)\n+\t\tlan_mac=$(macaddr_add \"$wan_mac\" 1)\n+\t\tlabel_mac=\"$wan_mac\"\n+\t\t;;\n \tasus,rt-ac42u)\n \t\tlabel_mac=$(mtd_get_mac_binary_ubi Factory 0x1006)\n \t\t;;\ndiff --git a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata\nindex 4a1a0ff31118a3..beb8aed58cfb2f 100644\n--- a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata\n+++ b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata\n@@ -57,6 +57,10 @@ case \"$FIRMWARE\" in\n \t;;\n \"ath10k/pre-cal-ahb-a000000.wifi.bin\")\n \tcase \"$board\" in\n+\taliyun,ap4220)\n+\t\tcaldata_extract \"ART\" 0x1000 0x2f20\n+\t\tath10k_patch_mac $(macaddr_add \"$(mtd_get_mac_text product_info 0x40)\" 2)\n+\t\t;;\n \tasus,rt-ac42u)\n \t\tcaldata_extract_ubi \"Factory\" 0x1000 0x2f20\n \t\t;;\n@@ -157,6 +161,10 @@ case \"$FIRMWARE\" in\n \t;;\n \"ath10k/pre-cal-ahb-a800000.wifi.bin\")\n \tcase \"$board\" in\n+\taliyun,ap4220)\n+\t\tcaldata_extract \"ART\" 0x5000 0x2f20\n+\t\tath10k_patch_mac $(macaddr_add \"$(mtd_get_mac_text product_info 0x40)\" 3)\n+\t\t;;\n \tavm,fritzbox-4040)\n \t\t/usr/bin/fritz_cal_extract -i 1 -s 0x400 -e 0x208 -l 12064 -o /lib/firmware/$FIRMWARE $(find_mtd_chardev \"urlader_config\")\n \t\t;;\ndiff --git a/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh b/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh\nindex 53a95611487b50..8f4f002dbea61d 100644\n--- a/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh\n+++ b/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh\n@@ -132,7 +132,8 @@ platform_do_upgrade() {\n \twallys,dr40x9)\n \t\tnand_do_upgrade \"$1\"\n \t\t;;\n-\talfa-network,ap120c-ac)\n+\talfa-network,ap120c-ac|\\\n+\taliyun,ap4220)\n \t\tpart=\"$(awk -F 'ubi.mtd=' '{printf $2}' /proc/cmdline | sed -e 's/ .*$//')\"\n \t\tif [ \"$part\" = \"rootfs1\" ]; then\n \t\t\tfw_setenv active 2 || exit 1\ndiff --git a/target/linux/ipq40xx/files-6.12/arch/arm/boot/dts/qcom/qcom-ipq4018-ap4220.dts b/target/linux/ipq40xx/files-6.12/arch/arm/boot/dts/qcom/qcom-ipq4018-ap4220.dts\nnew file mode 100644\nindex 00000000000000..4f9ab7f61627b0\n--- /dev/null\n+++ b/target/linux/ipq40xx/files-6.12/arch/arm/boot/dts/qcom/qcom-ipq4018-ap4220.dts\n@@ -0,0 +1,369 @@\n+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n+\n+#include \"qcom-ipq4019.dtsi\"\n+#include <dt-bindings/gpio/gpio.h>\n+#include <dt-bindings/input/input.h>\n+#include <dt-bindings/leds/common.h>\n+#include <dt-bindings/soc/qcom,tcsr.h>\n+\n+/ {\n+\tcompatible = \"aliyun,ap4220\", \"qcom,ipq4019\";\n+\tmodel = \"Aliyun AP4220\";\n+\n+\taliases {\n+\t\tlabel-mac-device = &gmac;\n+\t\tled-boot = &led_status;\n+\t\tled-failsafe = &led_status;\n+\t\tled-running = &led_status;\n+\t\tled-upgrade = &led_status;\n+\t};\n+\n+\tchosen {\n+\t\tbootargs-append = \" root=/dev/ubiblock0_1\";\n+\t\tstdout-path = \"serial:115200n8\";\n+\t};\n+\n+\tkeys {\n+\t\tcompatible = \"gpio-keys\";\n+\n+\t\tbutton-reset {\n+\t\t\tlabel = \"reset\";\n+\t\t\tgpios = <&tlmm 63 GPIO_ACTIVE_LOW>;\n+\t\t\tlinux,code = <KEY_RESTART>;\n+\t\t};\n+\t};\n+\n+\tleds {\n+\t\tcompatible = \"gpio-leds\";\n+\n+\t\tled-0 {\n+\t\t\tcolor = <LED_COLOR_ID_GREEN>;\n+\t\t\tfunction = LED_FUNCTION_WLAN_5GHZ;\n+\t\t\tgpios = <&tlmm 2 GPIO_ACTIVE_LOW>;\n+\t\t\tlinux,default-trigger = \"phy1tpt\";\n+\t\t};\n+\n+\t\tled-1 {\n+\t\t\tcolor = <LED_COLOR_ID_GREEN>;\n+\t\t\tfunction = LED_FUNCTION_WLAN_2GHZ;\n+\t\t\tgpios = <&tlmm 3 GPIO_ACTIVE_HIGH>;\n+\t\t\tlinux,default-trigger = \"phy0tpt\";\n+\t\t};\n+\n+\t\tled_status: led-2 {\n+\t\t\tcolor = <LED_COLOR_ID_GREEN>;\n+\t\t\tfunction = LED_FUNCTION_POWER;\n+\t\t\tgpios = <&tlmm 5 GPIO_ACTIVE_LOW>;\n+\t\t\tdefault-state = \"on\";\n+\t\t};\n+\t};\n+\n+\treg_usb: regulator-usb {\n+\t\tcompatible = \"regulator-fixed\";\n+\t\tgpios = <&tlmm 1 GPIO_ACTIVE_LOW>;\n+\t\tregulator-max-microvolt = <5000000>;\n+\t\tregulator-min-microvolt = <5000000>;\n+\t\tregulator-name = \"reg_usb\";\n+\t};\n+\n+\tsoc {\n+\t\ttcsr@1949000 {\n+\t\t\tcompatible = \"qcom,tcsr\";\n+\t\t\treg = <0x1949000 0x100>;\n+\t\t\tqcom,wifi_glb_cfg = <TCSR_WIFI_GLB_CFG>;\n+\t\t};\n+\n+\t\ttcsr@194b000 {\n+\t\t\tcompatible = \"qcom,tcsr\";\n+\t\t\treg = <0x194b000 0x100>;\n+\t\t\tqcom,usb-hsphy-mode-select = <TCSR_USB_HSPHY_HOST_MODE>;\n+\t\t};\n+\n+\t\tess_tcsr@1953000 {\n+\t\t\tcompatible = \"qcom,tcsr\";\n+\t\t\treg = <0x1953000 0x1000>;\n+\t\t\tqcom,ess-interface-select = <TCSR_ESS_PSGMII>;\n+\t\t};\n+\n+\t\ttcsr@1957000 {\n+\t\t\tcompatible = \"qcom,tcsr\";\n+\t\t\treg = <0x1957000 0x100>;\n+\t\t\tqcom,wifi_noc_memtype_m0_m2 = <TCSR_WIFI_NOC_MEMTYPE_M0_M2>;\n+\t\t};\n+\t};\n+};\n+\n+&blsp_dma {\n+\tstatus = \"okay\";\n+};\n+\n+&blsp1_spi1 {\n+\tstatus = \"okay\";\n+\n+\t#address-cells = <1>;\n+\t#size-cells = <0>;\n+\tnum-cs = <2>;\n+\tpinctrl-0 = <&spi0_pins>;\n+\tpinctrl-names = \"default\";\n+\tcs-gpios = <&tlmm 54 GPIO_ACTIVE_HIGH>, <&tlmm 4 GPIO_ACTIVE_HIGH>;\n+\n+\tflash@0 {\n+\t\tcompatible = \"jedec,spi-nor\";\n+\t\treg = <0>;\n+\t\tspi-max-frequency = <24000000>;\n+\t\t#address-cells = <1>;\n+\t\t#size-cells = <1>;\n+\n+\t\tpartitions {\n+\t\t\tcompatible = \"fixed-partitions\";\n+\t\t\t#address-cells = <1>;\n+\t\t\t#size-cells = <1>;\n+\n+\t\t\tpartition@0 {\n+\t\t\t\tlabel = \"SBL1\";\n+\t\t\t\treg = <0x0 0x40000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@40000 {\n+\t\t\t\tlabel = \"MIBIB\";\n+\t\t\t\treg = <0x40000 0x20000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@60000 {\n+\t\t\t\tlabel = \"QSEE\";\n+\t\t\t\treg = <0x60000 0x60000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@c0000 {\n+\t\t\t\tlabel = \"CDT\";\n+\t\t\t\treg = <0xc0000 0x10000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@d0000 {\n+\t\t\t\tlabel = \"DDRPARAMS\";\n+\t\t\t\treg = <0xd0000 0x10000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@e0000 {\n+\t\t\t\tcompatible = \"u-boot,env\";\n+\t\t\t\tlabel = \"APPSBLENV\";\n+\t\t\t\treg = <0xe0000 0x10000>;\n+\t\t\t};\n+\n+\t\t\tpartition@f0000 {\n+\t\t\t\tlabel = \"APPSBL\";\n+\t\t\t\treg = <0xf0000 0x80000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@170000 {\n+\t\t\t\tlabel = \"ART\";\n+\t\t\t\treg = <0x170000 0x10000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@180000 {\n+\t\t\t\tlabel = \"product_info\";\n+\t\t\t\treg = <0x180000 0x10000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@190000 {\n+\t\t\t\tlabel = \"mtdoops\";\n+\t\t\t\treg = <0x190000 0x20000>;\n+\t\t\t};\n+\n+\t\t\tpartition@1b0000 {\n+\t\t\t\tlabel = \"priv_data1\";\n+\t\t\t\treg = <0x1b0000 0x10000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@1c0000 {\n+\t\t\t\tlabel = \"priv_data2\";\n+\t\t\t\treg = <0x1c0000 0x10000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@1d0000 {\n+\t\t\t\tlabel = \"priv_data3\";\n+\t\t\t\treg = <0x1d0000 0x200000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\t\t};\n+\t};\n+\n+\tspi-nand@1 {\n+\t\tcompatible = \"spi-nand\";\n+\t\treg = <1>;\n+\t\tspi-max-frequency = <24000000>;\n+\n+\t\tpartitions {\n+\t\t\tcompatible = \"fixed-partitions\";\n+\t\t\t#address-cells = <1>;\n+\t\t\t#size-cells = <1>;\n+\n+\t\t\tpartition@0 {\n+\t\t\t\tlabel = \"rootfs1\";\n+\t\t\t\treg = <0x0 0x3000000>;\n+\t\t\t};\n+\n+\t\t\tpartition@3000000 {\n+\t\t\t\tlabel = \"rootfs2\";\n+\t\t\t\treg = <0x3000000 0x3000000>;\n+\t\t\t};\n+\n+\t\t\tpartition@6000000 {\n+\t\t\t\tlabel = \"usrdata\";\n+\t\t\t\treg = <0x6000000 0x2000000>;\n+\t\t\t};\n+\t\t};\n+\t};\n+};\n+\n+&blsp1_uart1 {\n+\tstatus = \"okay\";\n+\n+\tpinctrl-0 = <&serial_pins>;\n+\tpinctrl-names = \"default\";\n+};\n+\n+&crypto {\n+\tstatus = \"okay\";\n+};\n+\n+&cryptobam {\n+\tstatus = \"okay\";\n+};\n+\n+&ethphy0 {\n+\tstatus = \"disabled\";\n+};\n+\n+&ethphy1 {\n+\tstatus = \"disabled\";\n+};\n+\n+&ethphy2 {\n+\tstatus = \"disabled\";\n+};\n+\n+&ethphy3 {\n+\tstatus = \"okay\";\n+};\n+\n+&ethphy4 {\n+\tstatus = \"okay\";\n+};\n+\n+&gmac {\n+\tstatus = \"okay\";\n+};\n+\n+&mdio {\n+\tstatus = \"okay\";\n+\n+\tpinctrl-0 = <&mdio_pins>;\n+\tpinctrl-names = \"default\";\n+};\n+\n+&prng {\n+\tstatus = \"okay\";\n+};\n+\n+&switch {\n+\tstatus = \"okay\";\n+};\n+\n+&swport4 {\n+\tstatus = \"okay\";\n+\n+\tlabel = \"wan\";\n+};\n+\n+&swport5 {\n+\tstatus = \"okay\";\n+\n+\tlabel = \"lan\";\n+};\n+\n+&tlmm {\n+\tmdio_pins: mdio_pinmux {\n+\t\tmdc {\n+\t\t\tpins = \"gpio52\";\n+\t\t\tfunction = \"mdc\";\n+\t\t\tdrive-strength = <4>;\n+\t\t\tbias-pull-up;\n+\t\t};\n+\n+\t\tmdio {\n+\t\t\tpins = \"gpio53\";\n+\t\t\tfunction = \"mdio\";\n+\t\t\tdrive-strength = <4>;\n+\t\t\tbias-pull-up;\n+\t\t};\n+\t};\n+\n+\tserial_pins: serial_pinmux {\n+\t\tblsp_uart0 {\n+\t\t\tpins = \"gpio60\", \"gpio61\";\n+\t\t\tfunction = \"blsp_uart0\";\n+\t\t\tdrive-strength = <8>;\n+\t\t\tbias-disable;\n+\t\t};\n+\t};\n+\n+\tspi0_pins: spi0_pinmux {\n+\t\tblsp_spi0 {\n+\t\t\tpins = \"gpio55\", \"gpio56\", \"gpio57\";\n+\t\t\tfunction = \"blsp_spi0\";\n+\t\t\tdrive-strength = <12>;\n+\t\t\tbias-disable;\n+\t\t};\n+\n+\t\tgpio {\n+\t\t\tpins = \"gpio54\", \"gpio4\";\n+\t\t\tfunction = \"gpio\";\n+\t\t\tdrive-strength = <2>;\n+\t\t\tbias-disable;\n+\t\t\toutput-high;\n+\t\t};\n+\t};\n+};\n+\n+&usb3 {\n+\tstatus = \"okay\";\n+};\n+\n+&usb3_hs_phy {\n+\tstatus = \"okay\";\n+\n+\tphy-supply = <&reg_usb>;\n+};\n+\n+&usb3_ss_phy {\n+\tstatus = \"okay\";\n+\n+\tphy-supply = <&reg_usb>;\n+};\n+\n+&watchdog {\n+\tstatus = \"okay\";\n+};\n+\n+&wifi0 {\n+\tstatus = \"okay\";\n+\n+\tqcom,ath10k-calibration-variant = \"Aliyun-AP4220\";\n+};\n+\n+&wifi1 {\n+\tstatus = \"okay\";\n+\n+\tqcom,ath10k-calibration-variant = \"Aliyun-AP4220\";\n+};\ndiff --git a/target/linux/ipq40xx/image/generic.mk b/target/linux/ipq40xx/image/generic.mk\nindex 393bb991f11e6a..475a05188a8231 100644\n--- a/target/linux/ipq40xx/image/generic.mk\n+++ b/target/linux/ipq40xx/image/generic.mk\n@@ -170,6 +170,18 @@ define Device/alfa-network_ap120c-ac\n endef\n TARGET_DEVICES += alfa-network_ap120c-ac\n \n+define Device/aliyun_ap4220\n+\t$(call Device/FitImage)\n+\t$(call Device/UbiFit)\n+\tDEVICE_VENDOR := Aliyun\n+\tDEVICE_MODEL := AP4220\n+\tSOC := qcom-ipq4018\n+\tBLOCKSIZE := 128k\n+\tPAGESIZE := 2048\n+\tDEVICE_PACKAGES := ipq-wifi-aliyun_ap4220\n+endef\n+TARGET_DEVICES += aliyun_ap4220\n+\n define Device/aruba_glenmorangie\n \t$(call Device/FitImageLzma)\n \tDEVICE_VENDOR := Aruba\n"
  },
  {
    "path": "devices/ipq40xx_generic/patches/cm520.patch",
    "content": "--- a/target/linux/ipq40xx/files-6.12/arch/arm/boot/dts/qcom/qcom-ipq4019-cm520-79f.dts\r\n+++ b/target/linux/ipq40xx/files-6.12/arch/arm/boot/dts/qcom/qcom-ipq4019-cm520-79f.dts\r\n@@ -19,6 +19,10 @@\r\n \t\tled-upgrade = &led_sys;\r\n \t};\r\n \r\n+\tchosen {\r\n+\t\tbootargs-append = \" ubi.block=0,1 root=/dev/ubiblock0_1\";\r\n+\t};\r\n+\r\n \tsoc {\r\n \t\ttcsr@1949000 {\r\n \t\t\tcompatible = \"qcom,tcsr\";\r\n@@ -160,65 +164,8 @@\r\n \t\t\t#size-cells = <1>;\r\n \r\n \t\t\tpartition@0 {\r\n-\t\t\t\tlabel = \"SBL1\";\r\n-\t\t\t\treg = <0x0 0x100000>;\r\n-\t\t\t\tread-only;\r\n-\t\t\t};\r\n-\r\n-\t\t\tpartition@100000 {\r\n-\t\t\t\tlabel = \"MIBIB\";\r\n-\t\t\t\treg = <0x100000 0x100000>;\r\n-\t\t\t\tread-only;\r\n-\t\t\t};\r\n-\r\n-\t\t\tpartition@200000 {\r\n-\t\t\t\tlabel = \"BOOTCONFIG\";\r\n-\t\t\t\treg = <0x200000 0x100000>;\r\n-\t\t\t};\r\n-\r\n-\t\t\tpartition@300000 {\r\n-\t\t\t\tlabel = \"QSEE\";\r\n-\t\t\t\treg = <0x300000 0x100000>;\r\n-\t\t\t\tread-only;\r\n-\t\t\t};\r\n-\r\n-\t\t\tpartition@400000 {\r\n-\t\t\t\tlabel = \"QSEE_1\";\r\n-\t\t\t\treg = <0x400000 0x100000>;\r\n-\t\t\t\tread-only;\r\n-\t\t\t};\r\n-\r\n-\t\t\tpartition@500000 {\r\n-\t\t\t\tlabel = \"CDT\";\r\n-\t\t\t\treg = <0x500000 0x80000>;\r\n-\t\t\t\tread-only;\r\n-\t\t\t};\r\n-\r\n-\t\t\tpartition@580000 {\r\n-\t\t\t\tlabel = \"CDT_1\";\r\n-\t\t\t\treg = <0x580000 0x80000>;\r\n-\t\t\t\tread-only;\r\n-\t\t\t};\r\n-\r\n-\t\t\tpartition@600000 {\r\n-\t\t\t\tlabel = \"BOOTCONFIG1\";\r\n-\t\t\t\treg = <0x600000 0x80000>;\r\n-\t\t\t};\r\n-\r\n-\t\t\tpartition@680000 {\r\n-\t\t\t\tlabel = \"APPSBLENV\";\r\n-\t\t\t\treg = <0x680000 0x80000>;\r\n-\t\t\t};\r\n-\r\n-\t\t\tpartition@700000 {\r\n-\t\t\t\tlabel = \"APPSBL\";\r\n-\t\t\t\treg = <0x700000 0x200000>;\r\n-\t\t\t\tread-only;\r\n-\t\t\t};\r\n-\r\n-\t\t\tpartition@900000 {\r\n-\t\t\t\tlabel = \"APPSBL_1\";\r\n-\t\t\t\treg = <0x900000 0x200000>;\r\n+\t\t\t\tlabel = \"Bootloader\";\r\n+\t\t\t\treg = <0x0 0xb00000>;\r\n \t\t\t\tread-only;\r\n \t\t\t};\r\n \r\n@@ -251,7 +198,7 @@\r\n \t\t\t};\r\n \r\n \t\t\tpartition@b80000 {\r\n-\t\t\t\tlabel = \"ubi\";\r\n+\t\t\t\tlabel = \"rootfs\";\r\n \t\t\t\treg = <0xb80000 0x7480000>;\r\n \t\t\t};\r\n \t\t};"
  },
  {
    "path": "devices/ipq40xx_generic/patches/target.patch",
    "content": "--- a/target/linux/ipq40xx/image/generic.mk\n+++ b/target/linux/ipq40xx/image/generic.mk\n@@ -694,7 +694,7 @@ TARGET_DEVICES += meraki_mr33\n define Device/mobipromo_cm520-79f\n \t$(call Device/FitzImage)\n \t$(call Device/UbiFit)\n-\tDEVICE_VENDOR := MobiPromo\n+\tDEVICE_VENDOR := MobiPromo星际宝盒\n \tDEVICE_MODEL := CM520-79F\n \tSOC := qcom-ipq4019\n \tBLOCKSIZE := 128k\n@@ -834,7 +834,7 @@ TARGET_DEVICES += openmesh_a62\n define Device/p2w_r619ac\n \t$(call Device/FitzImage)\n \t$(call Device/UbiFit)\n-\tDEVICE_VENDOR := P&W\n+\tDEVICE_VENDOR := P&W竞斗云\n \tDEVICE_MODEL := R619AC\n \tSOC := qcom-ipq4019\n \tDEVICE_DTS_CONFIG := config@10"
  },
  {
    "path": "devices/ipq806x_generic/.config",
    "content": "\nCONFIG_TARGET_ipq806x=y\nCONFIG_TARGET_ipq806x_generic=y\n\nCONFIG_TARGET_DEVICE_ipq806x_generic_DEVICE_tplink_ad7200=n\nCONFIG_TARGET_DEVICE_ipq806x_generic_DEVICE_tplink_c2600=n\nCONFIG_TARGET_DEVICE_ipq806x_generic_DEVICE_ubnt_unifi-ac-hd=n\n\n\nCONFIG_PACKAGE_MAC80211_NSS_SUPPORT=y\n\nCONFIG_PACKAGE_kmod-ipsec=n\n\n\n\n\n"
  },
  {
    "path": "devices/ipq806x_generic/diy.sh",
    "content": "#!/bin/bash\n\nshopt -s extglob\n\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\n\n\n\n\n"
  },
  {
    "path": "devices/ipq806x_generic/patches/xiaomi_r3d.patch",
    "content": "From c433730d889d0dfb31bdcf4f102ca47939606c46 Mon Sep 17 00:00:00 2001\nFrom: remittor <remittor@gmail.com>\nDate: Fri, 11 Aug 2023 12:08:30 +0300\nSubject: [PATCH] ipq806x: Add support for Xiaomi Mi Router HD (R3D)\n\nXiaomi R3D is a 2.4/5 GHz band 11ac router, based on IPQ8064.\n\nSpecification:\n* SoC: Qualcomm IPQ8064\n* RAM: 512MB DDR3\n* Flash: 256MB NAND (Macronix MX30UF2G18AC-TI)\n* Ethernet: 4x 10/100/1000 Mbps (1x WAN, 3x LAN)\n* WiFi: Qualcomm QCA9984 (5GHz, 4T4R, n/ac)\n* WiFi: Qualcomm QCA9980 (2.4GHz, 4T4R, b/g/n)\n* USB: 1x 3.0\n* SATA: 1x SATA 3.1 (only for internal HDD 3.5\")\n* BTN: Power, Reset\n* LEDS: Status(Green/Blue/Red)\n* UART: present as 4-pads on the PCB (3.3V, 115200-8-N-1)\n\nMAC addresses as verified by stock firmware:\n\n| Interface   |       MAC         |  ART    | Format |\n|-------------+-------------------+---------+--------|\n| WAN (label) | xx:xx:xx:xx:xx:B2 | 0x0     | binary |\n| LAN         | xx:xx:xx:xx:xx:B3 | 0x6     | binary |\n| WiFi 2g     | xx:xx:xx:xx:xx:B4 | 0x1006  | binary |\n| WiFi 5g     | xx:xx:xx:xx:xx:B5 | 0x5006  | binary |\n---\n package/boot/uboot-tools/uboot-envtools/files/ipq806x     |   6 +-\n .../ipq806x/base-files/etc/board.d/02_network |   4 +\n .../etc/hotplug.d/firmware/11-ath10k-caldata  |   6 +\n .../ipq806x/base-files/etc/init.d/bootcount   |   8 +\n .../base-files/lib/upgrade/platform.sh        |   3 +\n .../ipq806x/base-files/lib/upgrade/xiaomi.sh  | 441 ++++++++++++++++\n .../arch/arm/boot/dts/qcom-ipq8064-r3d.dts    | 479 ++++++++++++++++++\n target/linux/ipq806x/image/generic.mk         |  17 +\n 8 files changed, 963 insertions(+), 1 deletion(-)\n create mode 100644 target/linux/ipq806x/base-files/lib/upgrade/xiaomi.sh\n create mode 100644 target/linux/ipq806x/files-6.12/arch/arm/boot/dts/qcom-ipq8064-r3d.dts\n\ndiff --git a/package/boot/uboot-tools/uboot-envtools/files/ipq806x b/package/boot/uboot-tools/uboot-envtools/files/ipq806x\nindex 01a86c7b19fca..c0a781c1e21b4 100644\n--- a/package/boot/uboot-tools/uboot-envtools/files/ipq806x\n+++ b/package/boot/uboot-tools/uboot-envtools/files/ipq806x\n@@ -52,6 +52,10 @@ qcom,ipq8064-ap148|\\\n nokia,ac400i)\n \tubootenv_add_uci_config \"/dev/mtd20\" \"0x0\" \"0x040000\" \"0x20000\"\n \t;;\n+xiaomi,r3d)\n+\tubootenv_add_uci_config \"/dev/mtd9\" \"0x0\" \"0x10000\" \"0x10000\"\n+\tubootenv_add_uci_sys_config \"/dev/mtd12\" \"0x0\" \"0x10000\" \"0x10000\"\n+\t;;\n ubnt,unifi-ac-hd|\\\n zyxel,nbg6817)\n \tubootenv_add_uci_config \"/dev/mtdblock9\" \"0x0\" \"0x10000\" \"0x10000\"\n@@ -59,6 +63,6 @@ zyxel,nbg6817)\n esac\n \n config_load ubootenv\n-config_foreach ubootenv_add_app_config ubootenv\n+config_foreach ubootenv_add_app_config\n \n exit 0\ndiff --git a/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata\nindex 4c5019cf5bd24..aa8ed06aae4b3 100644\n--- a/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata\n+++ b/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata\n@@ -56,6 +56,9 @@ case \"$FIRMWARE\" in\n \t\tcaldata_extract \"0:art\" 0x1000 0x2f20\n \t\tath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii 0:appsblenv ethaddr) +2)\n \t\t;;\n+\txiaomi,r3d)\n+\t\tcaldata_extract \"ART\" 0x1000 0x2f20\n+\t\t;;\n \tzyxel,nbg6817)\n \t\tcaldata_extract \"0:art\" 0x1000 0x2f20\n \t\tath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii 0:appsblenv ethaddr) 1)\n@@ -92,6 +95,9 @@ case \"$FIRMWARE\" in\n \t\tcaldata_extract \"0:art\" 0x5000 0x2f20\n \t\tath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii 0:appsblenv ethaddr) +3)\n \t\t;;\n+\txiaomi,r3d)\n+\t\tcaldata_extract \"ART\" 0x5000 0x2f20\n+\t\t;;\n \tzyxel,nbg6817)\n \t\tcaldata_extract \"0:art\" 0x5000 0x2f20\n \t\tath10k_patch_mac $(mtd_get_mac_ascii 0:appsblenv ethaddr)\ndiff --git a/target/linux/ipq806x/base-files/etc/init.d/bootcount b/target/linux/ipq806x/base-files/etc/init.d/bootcount\nindex cb32a4ed3568d..9d9ab3f100fe2 100755\n--- a/target/linux/ipq806x/base-files/etc/init.d/bootcount\n+++ b/target/linux/ipq806x/base-files/etc/init.d/bootcount\n@@ -16,5 +16,13 @@ boot() {\n \tlinksys,ea8500)\n \t\tmtd resetbc s_env || true\n \t\t;;\n+\txiaomi,r3d)\n+\t\tlocal boot_wait=$( fw_printenv boot_wait | cut -d = -f 2 )\n+\t\t[ \"$boot_wait\" != \"on\" ] && fw_setenv boot_wait on\n+\t\tlocal bootdelay=$( fw_printenv bootdelay | cut -d = -f 2 )\n+\t\t[ \"$bootdelay\" != \"3\" ] && fw_setenv bootdelay 3\n+\t\tlocal uart_en=$( fw_printenv uart_en | cut -d = -f 2 )\n+\t\t[ \"$uart_en\" != \"1\" ] && fw_setenv uart_en 1\n+\t\t;;\n \tesac\n }\ndiff --git a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh\nindex 5ec4f513bd33d..b142fce86a082 100644\n--- a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh\n+++ b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh\n@@ -71,6 +71,9 @@ platform_do_upgrade() {\n \t\tMTD_CONFIG_ARGS=\"-s 0x200000\"\n \t\tdefault_do_upgrade \"$1\"\n \t\t;;\n+\txiaomi,r3d)\n+\t\tplatform_do_upgrade_xiaomi \"$1\" 0x2800000\n+\t\t;;\n \tzyxel,nbg6817)\n \t\tzyxel_do_upgrade \"$1\"\n \t\t;;\ndiff --git a/target/linux/ipq806x/base-files/lib/upgrade/xiaomi.sh b/target/linux/ipq806x/base-files/lib/upgrade/xiaomi.sh\nnew file mode 100644\nindex 0000000000000..9246e8f867e3f\n--- /dev/null\n+++ b/target/linux/ipq806x/base-files/lib/upgrade/xiaomi.sh\n@@ -0,0 +1,441 @@\n+# SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n+\n+. /lib/functions.sh\n+\n+MAGIC_XIAOMI_HDR1=\"48445231\"     # \"HDR1\" - xiaomi image header\n+MAGIC_XIAOMI_BLK=\"beba0000\"\n+MAGIC_UIMAGE=\"27051956\"          # uImage header\n+MAGIC_UBI=\"55424923\"             # \"UBI#\"\n+MAGIC_UBIFS=\"31181006\"\n+MAGIC_HSQS=\"68737173\"            # \"hsqs\"\n+MAGIC_SYSUPG=\"7379737570677261\"  # TAR \"sysupgrade\"\n+\n+XIAOMI_PAGESIZE=2048\n+\n+XIAOMI_FW_FILE=\"\"\n+XIAOMI_FW_SIZE=0\n+XIAOMI_KERNEL_PART=$CI_KERNPART\n+XIAOMI_KERNEL2_PART=\"\"\n+XIAOMI_KERNEL2_NAMES=\"kernel_stock|kernel_dup\"\n+XIAOMI_ROOTFS_PART=$CI_UBIPART\n+XIAOMI_ROOTFS_PARTSIZE=\n+\n+XIAOMI_RESTORE_ROOTFS2=\n+\n+log_msg() {\n+\techo \"$@\"\n+}\n+\n+log_err() {\n+\techo \"ERROR: $@\" >&2\n+}\n+\n+die() {\n+\tlog_err \"$@\"\n+\texit 1\n+}\n+\n+get_uint32_at() {\n+\tlocal offset=$1\n+\tlocal endianness=$2\n+\tlocal hex\n+\tif [ $(( $offset + 4 )) -gt $XIAOMI_FW_SIZE ]; then\n+\t\techo \"\"\n+\t\treturn\n+\tfi\n+\tlocal dd_args=\"if=$XIAOMI_FW_FILE skip=$offset bs=1 count=4\"\n+\tif [ \"$endianness\" = \"be\" ]; then\n+\t\thex=$( dd $dd_args 2>/dev/null | hexdump -v -n 4 -e '1/1 \"%02x\"' )\n+\telse\n+\t\thex=$( dd $dd_args 2>/dev/null | hexdump -v -e '1/4 \"%02x\"' )\n+\tfi\n+\techo $( printf \"%d\" 0x$hex )\n+}\n+\n+get_hexdump_at() {\n+\tlocal offset=$1\n+\tlocal size=$2\n+\tif [ $(( $offset + $size )) -gt $XIAOMI_FW_SIZE ]; then\n+\t\techo \"\"\n+\t\treturn\n+\tfi\n+\tlocal dd_args=\"if=$XIAOMI_FW_FILE skip=$offset bs=1 count=$size\"\n+\techo $( dd $dd_args 2>/dev/null | hexdump -v -n $size -e '1/1 \"%02x\"' )\n+}\n+\n+get_round_up() {\n+\tlocal value=$1\n+\tlocal base=$2\n+\tlocal pad=0\n+\tif [ -z \"$base\" ]; then\n+\t\tbase=$XIAOMI_PAGESIZE\n+\telse\n+\t\tbase=$( printf \"%d\" $base )\n+\tfi\n+\tif [ $(( $value % $base )) != 0 ]; then\n+\t\tpad=$(( $base - $value % $base ))\n+\tfi\n+\techo $(( $value + $pad ))\n+}\n+\n+get_part_size() {\n+\tlocal part_name=$1\n+\tlocal part=$( cat /proc/mtd | grep \\\"$part_name\\\" )\n+\tif [ -z \"$part\" ]; then\n+\t\techo 0\n+\telse\n+\t\tlocal mtd_size_hex=$( echo $part | awk '{print \"0x\"$2}' )\n+\t\techo $( printf \"%d\" $mtd_size_hex )\n+\tfi\n+}\n+\n+xiaomi_check_sizes() {\n+\tlocal part_name=$1\n+\tlocal img_offset=$2\n+\tlocal img_size=$3\n+\n+\tlocal mtd_size=$( get_part_size $part_name )\n+\tif [ \"$mtd_size\" = \"0\" ]; then\n+\t\techo \"cannot find mtd partition with name '$part_name'\"\n+\t\treturn 1\n+\tfi\t\n+\tlocal img_end=$(( $img_offset + $img_size ))\n+\tif [ $img_end -gt $XIAOMI_FW_SIZE ]; then\n+\t\techo \"incorrect image size (part: '$part_name')\"\n+\t\treturn 1\n+\tfi\n+\tif [ $img_size -gt $mtd_size ]; then\n+\t\techo \"image is greater than partition '$part_name'\"\n+\t\treturn 1\n+\tfi\n+\techo \"\"\n+\treturn 0\n+}\n+\n+xiaomi_mtd_write() {\n+\tlocal part_name=$1\n+\tlocal img_offset=$2\n+\tlocal img_size=$3\n+\tlocal part_skip=$4\n+\n+\timg_size=$( get_round_up $img_size )\n+\tlocal err=$( xiaomi_check_sizes $part_name $img_offset $img_size )\n+\tif [ -n \"$err\" ]; then\n+\t\tlog_err $err\n+\t\treturn 1\n+\tfi\n+\tif [ -n \"$part_skip\" ]; then\n+\t\tpart_skip=\"-p $part_skip\"\n+\tfi\n+\tlocal count=$(( $img_size / $XIAOMI_PAGESIZE ))\n+\tlocal dd_args=\"if=$XIAOMI_FW_FILE iflag=skip_bytes skip=$img_offset bs=$XIAOMI_PAGESIZE count=$count\"\n+\tdd $dd_args | mtd -f $part_skip write - \"$part_name\" || {\n+\t\tlog_err \"Failed to flash '$part_name'\"\n+\t\treturn 1\n+\t}\n+\treturn 0\n+}\n+\n+xiaomi_flash_images() {\n+\tlocal kernel_offset=$1\n+\tlocal kernel_size=$2\n+\tlocal rootfs_offset=$3\n+\tlocal rootfs_size=$4\n+\tlocal err\n+\tlocal part_skip=0\n+\n+\tkernel_size=$( get_round_up $kernel_size )\n+\trootfs_size=$( get_round_up $rootfs_size )\n+\n+\terr=$( xiaomi_check_sizes $XIAOMI_KERNEL_PART $kernel_offset $kernel_size )\n+\t[ -n \"$err\" ] && { log_err $err; return 1; }\n+\n+\tif [ -n \"$XIAOMI_KERNEL2_PART\" ]; then\n+\t\terr=$( xiaomi_check_sizes $XIAOMI_KERNEL2_PART $kernel_offset $kernel_size )\n+\t\t[ -n \"$err\" ] && { log_err $err; return 1; }\n+\tfi\n+\n+\terr=$( xiaomi_check_sizes $XIAOMI_ROOTFS_PART $rootfs_offset $rootfs_size )\n+\t[ -n \"$err\" ] && { log_err $err; return 1; }\n+\n+\tif [ \"$XIAOMI_RESTORE_ROOTFS2\" = \"true\" -a -n \"$XIAOMI_ROOTFS_PARTSIZE\" ]; then\n+\t\tpart_skip=$( printf \"%d\" $XIAOMI_ROOTFS_PARTSIZE )\n+\t\tif [ $part_skip -lt 1000000 ]; then\n+\t\t\tpart_skip=0\n+\t\tfi\n+\tfi\n+\n+\tif [ $part_skip -gt 0 ]; then\n+\t\tlocal ksize=$(( $part_skip + $rootfs_size ))\n+\t\tlocal mtd_size=$( get_part_size $XIAOMI_ROOTFS_PART )\n+\t\tif [ $ksize -gt $mtd_size ]; then\n+\t\t\tlog_err \"double rootfs is greater than partition '$XIAOMI_ROOTFS_PART'\"\n+\t\t\treturn 1\n+\t\tfi\n+\tfi\n+\n+\tmtd erase \"$XIAOMI_ROOTFS_PART\" || {\n+\t\tlog_err \"Failed to erase partition '$part_name'\"\n+\t\treturn 1\n+\t}\n+\n+\txiaomi_mtd_write $XIAOMI_KERNEL_PART $kernel_offset $kernel_size || {\n+\t\tlog_err \"Failed flash data to '$XIAOMI_KERNEL_PART' partition\"\n+\t\treturn 1\n+\t}\n+\tlog_msg \"Kernel image flashed to '$XIAOMI_KERNEL_PART'\"\n+\n+\tif [ -n \"$XIAOMI_KERNEL2_PART\" ]; then\n+\t\txiaomi_mtd_write $XIAOMI_KERNEL2_PART $kernel_offset $kernel_size || {\n+\t\t\tlog_err \"Failed flash data to '$XIAOMI_KERNEL2_PART' partition\"\n+\t\t\treturn 1\n+\t\t}\n+\t\tlog_msg \"Kernel image flashed to '$XIAOMI_KERNEL2_PART'\"\n+\tfi\n+\n+\txiaomi_mtd_write $XIAOMI_ROOTFS_PART $rootfs_offset $rootfs_size || {\n+\t\tlog_err \"Failed flash data to '$XIAOMI_ROOTFS_PART' partition\"\n+\t\treturn 1\n+\t}\n+\tlog_msg \"Rootfs image flashed to '$XIAOMI_ROOTFS_PART'!\"\n+\t\n+\tif [ $part_skip -gt 0 ]; then\n+\t\txiaomi_mtd_write $XIAOMI_ROOTFS_PART $rootfs_offset $rootfs_size $part_skip || {\n+\t\t\tlog_err \"Failed flash data to '$XIAOMI_ROOTFS_PART' partition (2)\"\n+\t\t\treturn 1\n+\t\t}\n+\t\tlog_msg \"Rootfs image flashed to '$XIAOMI_ROOTFS_PART':$XIAOMI_ROOTFS_PARTSIZE\"\n+\tfi\n+\n+\tlog_msg \"Firmware write successful! Reboot...\"\n+\tsync\n+\tumount -a\n+\treboot -f\n+\texit 0\n+}\n+\n+check_ubi_header() {\n+\tlocal offset=$1\n+\n+\tlocal magic=$( get_hexdump_at $offset 4 )\n+\t[ \"$magic\" != $MAGIC_UBI ] && { echo \"\"; return 1; }\n+\n+\tlocal magic_ubi2=\"55424921\"  # \"UBI!\"\n+\toffset=$(( $offset + $XIAOMI_PAGESIZE ))\n+\tmagic=$( get_hexdump_at $offset 4 )\n+\t[ \"$magic\" != $magic_ubi2 ] && { echo \"\"; return 1; }\n+\n+\techo \"true\"\n+\treturn 0\n+}\n+\n+get_rootfs_offset() {\n+\tlocal start=$1\n+\tlocal pos  offset  align  end\n+\n+\tfor offset in 0 1 2 3 4; do\n+\t\tpos=$(( $start + $offset ))\n+\t\t[ -n \"$( check_ubi_header $pos )\" ] && { echo $pos; return 0; }\n+\tdone\n+\n+\tfor align in 4 8 16 32 64 128 256 512 1024 2048 4096; do\n+\t\tpos=$( get_round_up $start $align )\n+\t\t[ -n \"$( check_ubi_header $pos )\" ] && { echo $pos; return 0; }\n+\tdone\n+\n+\talign=65536\n+\tpos=$( get_round_up $start $align )\n+\tend=$(( $pos + 3000000 ))\n+\twhile true; do\n+\t\t[ $(( $pos + 150000 )) -gt $XIAOMI_FW_SIZE ] && break\n+\t\t[ -n \"$( check_ubi_header $pos )\" ] && { echo $pos; return 0; }\n+\t\tpos=$(( $pos + $align ))\n+\t\t[ $pos -ge $end ] && break\n+\tdone\n+\n+\techo \"\"\n+\treturn 1\n+}\n+\n+xiaomi_do_factory_upgrade() {\n+\tlocal err\n+\tlocal magic\n+\tlocal kernel_offset  kernel_size\n+\tlocal rootfs_offset  rootfs_size\n+\n+\tlocal kernel_mtd=\"$( find_mtd_index $XIAOMI_KERNEL_PART )\"\n+\tif [ -z \"$kernel_mtd\" ]; then\n+\t\tlog_err \"partition '$XIAOMI_KERNEL_PART' not found\"\n+\t\treturn 1\n+\tfi\n+\tlog_msg \"Forced factory upgrade...\"\n+\n+\tkernel_offset=0\n+\tkernel_size=$( get_uint32_at 12 \"be\" )\n+\tkernel_size=$(( $kernel_size + 64 ))\t\n+\n+\trootfs_offset=$( get_rootfs_offset $kernel_size )\n+\tif [ -z \"$rootfs_offset\" ]; then\n+\t\tlog_err \"can't find ubinized rootfs in the firmware image\"\n+\t\treturn 1\n+\tfi\n+\trootfs_size=$(( $XIAOMI_FW_SIZE - $rootfs_offset ))\n+\tlocal rootfs_end=$(( $rootfs_offset + $rootfs_size ))\n+\n+\tXIAOMI_RESTORE_ROOTFS2=false\n+\txiaomi_flash_images $kernel_offset $kernel_size $rootfs_offset $rootfs_size || {\n+\t\tlog_err \"can't flash factory image\"\n+\t\treturn 1\n+\t}\n+\texit 0\n+}\n+\n+xiaomi_do_revert_stock() {\n+\tlocal err\n+\tlocal magic\n+\tlocal blk  blkpos  blk_magic  offset  file_size\n+\tlocal kernel_offset\n+\tlocal kernel_size=0\n+\tlocal rootfs_offset\n+\tlocal rootfs_size=0\n+\n+\tlocal kernel_mtd=$( find_mtd_index $XIAOMI_KERNEL_PART )\n+\tif [ -z \"$kernel_mtd\" ]; then\n+\t\tlog_err \"partition '$XIAOMI_KERNEL_PART' not found\"\n+\t\treturn 1\n+\tfi\n+\tlog_msg \"Forced revert to stock firmware...\"\n+\n+\tfor blk in 16 20 24 28 32 36; do\n+\t\tblkpos=$( get_uint32_at $blk )\n+\t\t[ -z \"$blkpos\" ] && continue\n+\t\t[ $blkpos -lt 48 ] && continue\n+\t\tblk_magic=$( get_hexdump_at $blkpos 4 )\n+\t\t[ \"$blk_magic\" != $MAGIC_XIAOMI_BLK ] && continue\n+\t\toffset=$(( $blkpos + 8 ))\n+\t\tfile_size=$( get_uint32_at $offset 4 )\n+\t\t[ -z \"$file_size\" ] && continue\n+\t\t[ $file_size -lt 1000000 ] && continue\n+\t\toffset=$(( $blkpos + 48 ))\n+\t\tmagic=$( get_hexdump_at $offset 4 )\n+\t\tif [ \"$magic\" = $MAGIC_UIMAGE ]; then\n+\t\t\tkernel_size=$file_size\n+\t\t\tkernel_offset=$offset\n+\t\tfi\n+\t\tif [ \"$magic\" = $MAGIC_UBI -o \"$magic\" = $MAGIC_HSQS ]; then\n+\t\t\trootfs_size=$file_size\n+\t\t\trootfs_offset=$offset\n+\t\tfi\n+\tdone\n+\tif [ $kernel_size -eq 0 ]; then\n+\t\tlog_err \"incorrect stock firmware image (kernel not found)\"\n+\t\treturn 1\n+\tfi\n+\tif [ $rootfs_size -eq 0 ]; then\n+\t\tlog_err \"incorrect stock firmware image (rootfs not found)\"\n+\t\treturn 1\n+\tfi\n+\n+\tXIAOMI_RESTORE_ROOTFS2=true\n+\txiaomi_flash_images $kernel_offset $kernel_size $rootfs_offset $rootfs_size || {\n+\t\tlog_err \"ERROR: can't revert to stock firmware\"\n+\t\treturn 1\n+\t}\n+\texit 0\n+}\n+\n+platform_do_upgrade_xiaomi() {\n+\tXIAOMI_FW_FILE=$1\n+\tlocal stock_rootfs_size=$2\n+\tlocal magic\n+\tlocal kernel_mtd  kernel2_mtd  rootfs_mtd\n+\tlocal kernel2_part_list  part_name\n+\n+\tXIAOMI_FW_SIZE=$( wc -c \"$XIAOMI_FW_FILE\" 2> /dev/null | awk '{print $1}' )\n+\tif [ -z \"$XIAOMI_FW_SIZE\" ]; then\n+\t\tlog_err \"File '$XIAOMI_FW_FILE' not found!\"\n+\t\texit 1\n+\tfi\n+\tif [ $XIAOMI_FW_SIZE -lt 1000000 ]; then\n+\t\tlog_err \"file '$XIAOMI_FW_FILE' is incorrect\"\n+\t\texit 1\n+\tfi\n+\n+\tkernel_mtd=$( find_mtd_index $XIAOMI_KERNEL_PART )\n+\tif [ -z \"$kernel_mtd\" ]; then\n+\t\tlog_err \"cannot find mtd partition for '$XIAOMI_KERNEL_PART'\"\n+\t\texit 1\n+\tfi\n+\tkernel2_part_list=$( echo \"$XIAOMI_KERNEL2_NAMES\" | sed 's/|/\\n/g' )\n+\tfor part_name in $kernel2_part_list; do\n+\t\tkernel2_mtd=$( find_mtd_index $part_name )\n+\t\tif [ -n \"$kernel2_mtd\" ]; then\n+\t\t\tXIAOMI_KERNEL2_PART=\"$part_name\"\n+\t\t\tlog_msg \"Found alt kernel partition '$XIAOMI_KERNEL2_PART'\"\n+\t\t\tbreak\n+\t\tfi\n+\tdone\n+\trootfs_mtd=$( find_mtd_index $XIAOMI_ROOTFS_PART )\n+\tif [ -z \"$rootfs_mtd\" ]; then\n+\t\tlog_err \"cannot find mtd partition for '$XIAOMI_ROOTFS_PART'\"\n+\t\texit 1\n+\tfi\n+\n+\tmagic=$( get_hexdump_at 0 4 )\n+\n+\t# Flash factory image (uImage header)\n+\tif [ \"$magic\" = $MAGIC_UIMAGE ]; then\n+\t\txiaomi_do_factory_upgrade\n+\t\texit $?\n+\tfi\n+\n+\t# Revert to stock firmware (\"HDR1\" header)\n+\tif [ \"$magic\" = $MAGIC_XIAOMI_HDR1 ]; then\n+\t\tif [ -n \"$stock_rootfs_size\" ]; then\n+\t\t\tXIAOMI_ROOTFS_PARTSIZE=$stock_rootfs_size\n+\t\tfi\n+\t\txiaomi_do_revert_stock\n+\t\texit $?\n+\tfi\n+\n+\tmagic=$( get_hexdump_at 0 8 )\n+\tif [ \"$magic\" != $MAGIC_SYSUPG ]; then\n+\t\tlog_err \"incorrect image for system upgrading!\"\n+\t\texit 1\n+\tfi\n+\tlog_msg \"SysUpgrade start...\"\n+\tlocal tar_file=$XIAOMI_FW_FILE\n+\tlocal board_dir=$( tar tf $tar_file | grep -m 1 '^sysupgrade-.*/$' )\n+\t[ -z \"$board_dir\" ] && {\n+\t\tlog_err \"board dir not found\"\n+\t\texit 1\n+\t}\n+\tboard_dir=${board_dir%/}\n+\n+\tlocal control_len=$( (tar xf $tar_file $board_dir/CONTROL -O | wc -c) 2> /dev/null)\n+\tif [ $control_len -lt 3 ]; then\n+\t\tlog_err \"incorrect stock firmware image (CONTROL not found)\"\n+\t\texit 1\n+\tfi\n+\tlocal kernel_len=$( (tar xf $tar_file $board_dir/kernel -O | wc -c) 2> /dev/null)\n+\tif [ $kernel_len -lt 1000000 ]; then\n+\t\tlog_err \"incorrect stock firmware image (kernel not found)\"\n+\t\texit 1\n+\tfi\n+\tlocal rootfs_len=$( (tar xf $tar_file $board_dir/root -O | wc -c) 2> /dev/null)\n+\tif [ $rootfs_len -lt 1000000 ]; then\n+\t\tlog_err \"incorrect stock firmware image (rootfs not found)\"\n+\t\texit 1\n+\tfi\n+\n+\tif [ -n \"$XIAOMI_KERNEL2_PART\" ]; then\n+\t\ttar Oxf $tar_file $board_dir/kernel | mtd -f write - $XIAOMI_KERNEL2_PART && {\n+\t\t\tlog_msg \"Kernel image flashed to '$XIAOMI_KERNEL2_PART'\"\n+\t\t} || {\n+\t\t\tlog_err \"cannot flash partition '$XIAOMI_KERNEL2_PART'\"\n+\t\t\texit 1\n+\t\t}\n+\tfi\n+\n+\tnand_do_upgrade \"$XIAOMI_FW_FILE\"\n+}\ndiff --git a/target/linux/ipq806x/files-6.12/arch/arm/boot/dts/qcom/qcom-ipq8064-r3d.dts b/target/linux/ipq806x/files-6.12/arch/arm/boot/dts/qcom/qcom-ipq8064-r3d.dts\nnew file mode 100644\nindex 0000000000000..fd952d230c5da\n--- /dev/null\n+++ b/target/linux/ipq806x/files-6.12/arch/arm/boot/dts/qcom/qcom-ipq8064-r3d.dts\n@@ -0,0 +1,479 @@\n+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n+\n+#include \"qcom-ipq8064-v2.0-smb208.dtsi\"\n+\n+#include <dt-bindings/input/input.h>\n+\n+/ {\n+\tmodel = \"Xiaomi Mi Router HD (R3D)\";\n+\tcompatible = \"xiaomi,r3d\", \"qcom,ipq8064\";\n+\n+\tmemory@0 {\n+\t\tdevice_type = \"memory\";\n+\t\treg = <0x42000000 0x1e000000>;\n+\t};\n+\n+\treserved-memory {\n+\t\trsvd@44600000 {\n+\t\t\treg = <0x44600000 0x200000>; /* IPQ_TZ_APPS_ADDR */\n+\t\t\tno-map;\n+\t\t};\n+\t};\n+\n+\taliases {\n+\t\tlabel-mac-device = &gmac1;\n+\n+\t\tmdio-gpio0 = &mdio0;\n+\n+\t\tled-boot = &led_status_yellow;\n+\t\tled-failsafe = &led_status_red;\n+\t\tled-running = &led_status_blue;\n+\t\tled-upgrade = &led_status_yellow;\n+\t};\n+\n+\tchosen {\n+\t\tbootargs = \"rootfstype=squashfs noinitrd\";\n+\t};\n+\n+\tkeys {\n+\t\tcompatible = \"gpio-keys\";\n+\t\tpinctrl-0 = <&button_pins>;\n+\t\tpinctrl-names = \"default\";\n+\n+\t\treset {\n+\t\t\tlabel = \"reset\";\n+\t\t\tgpios = <&qcom_pinmux 16 GPIO_ACTIVE_LOW>;\n+\t\t\tlinux,code = <KEY_RESTART>;\n+\t\t\tdebounce-interval = <60>;\n+\t\t\twakeup-source;\n+\t\t};\n+\n+\t\tpower {\n+\t\t\tlabel = \"power\"; /* Labeled POWER on the device, but using for sleep mode */\n+\t\t\tgpios = <&qcom_pinmux 68 GPIO_ACTIVE_LOW>;\n+\t\t\tlinux,code = <KEY_POWER>;\n+\t\t\tdebounce-interval = <60>;\n+\t\t\twakeup-source;\n+\t\t};\n+\t};\n+\n+\tleds {\n+\t\tcompatible = \"gpio-leds\";\n+\t\tpinctrl-0 = <&led_pins>;\n+\t\tpinctrl-names = \"default\";\n+\n+\t\tled_status_red: led_status_red {\n+\t\t\tlabel = \"red:status\";\n+\t\t\tgpios = <&qcom_pinmux 7 GPIO_ACTIVE_HIGH>;\n+\t\t\tdefault-state = \"keep\";\n+\t\t};\n+\n+\t\tled_status_blue: led_status_blue {\n+\t\t\tlabel = \"blue:status\";\n+\t\t\tgpios = <&qcom_pinmux 8 GPIO_ACTIVE_HIGH>;\n+\t\t\tdefault-state = \"keep\";\n+\t\t};\n+\n+\t\tled_status_yellow: led_status_yellow {\n+\t\t\tlabel = \"yellow:status\";\n+\t\t\tgpios = <&qcom_pinmux 9 GPIO_ACTIVE_HIGH>;\n+\t\t\tdefault-state = \"keep\";\n+\t\t};\n+\t};\n+\n+\ti2c_gpio_0 { // GSBI1\n+\t\tcompatible = \"i2c-gpio\";\n+\t\t#address-cells = <1>;\n+\t\t#size-cells = <0>;\n+\t\tpinctrl-0 = <&i2c1_pins>;\n+\t\tpinctrl-names = \"default\";\n+\t\tsda-gpios = <&qcom_pinmux 53 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;\n+\t\tscl-gpios = <&qcom_pinmux 54 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;\n+\t\ti2c-gpio,delay-us = <5>;\n+\n+\t\temc2301@2f {\n+\t\t\tcompatible = \"smsc,emc2301\";\n+\t\t\treg = <0x2f>;\n+\t\t\t#address-cells = <1>;\n+\t\t\t#size-cells = <0>;\n+\n+\t\t\tfan@0 {\n+\t\t\t\treg = <0>;\n+\t\t\t\tpwm-output-mode = <1>;\n+\t\t\t};\n+\t\t};\n+\t};\n+\n+\ti2c_gpio_1 { // GSBI2\n+\t\tcompatible = \"i2c-gpio\";\n+\t\t#address-cells = <1>;\n+\t\t#size-cells = <0>;\n+\t\tpinctrl-0 = <&i2c2_pins>;\n+\t\tpinctrl-names = \"default\";\n+\t\tsda-gpios = <&qcom_pinmux 24 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;\n+\t\tscl-gpios = <&qcom_pinmux 25 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;\n+\t\ti2c-gpio,delay-us = <5>;\n+\n+\t\ttmp75@48 {\n+\t\t\tcompatible = \"ti,tmp75\";\n+\t\t\treg = <0x48>;\n+\t\t\t#address-cells = <1>;\n+\t\t\t#size-cells = <0>;\n+\t\t\t#thermal-sensor-cells = <0>;\n+\t\t\tstatus = \"okay\";\n+\t\t};\n+\t};\n+};\n+\n+// https://github.com/openwrt/openwrt/commit/622ce713ca246aa465bf28d2a743f96999085ea2\n+// https://github.com/openwrt/openwrt/commit/2336c2dbb1929837f7e42d4315c8073342a5b46b\n+// https://forum.openwrt.org/t/failed-to-startup-an-ipq806x-router-on-kernel-5-4/60775/41\n+&CPU_SPC {\n+\tstatus = \"disabled\";\n+};\n+\n+&adm_dma {\n+\tstatus = \"okay\";\n+};\n+\n+&qcom_pinmux {\n+\ti2c1_pins: i2c1_pins { // GSBI1 - EMC2301\n+\t\tmux {\n+\t\t\tpins = \"gpio53\", \"gpio54\";\n+\t\t\tfunction = \"gsbi1\";\n+\t\t\tdrive-strength = <12>;\n+\t\t\tbias-none;\n+\t\t\tinput;\n+\t\t};\n+\t};\n+\n+\ti2c2_pins: i2c2_pins { // GSBI2 - TMP75\n+\t\tmux {\n+\t\t\tpins = \"gpio24\", \"gpio25\";\n+\t\t\tfunction = \"gsbi2\";\n+\t\t\tdrive-strength = <12>;\n+\t\t\tbias-none;\n+\t\t\tinput;\n+\t\t};\n+\t};\n+\n+\tbutton_pins: button_pins {\n+\t\tmux {\n+\t\t\tpins = \"gpio16\", \"gpio68\";\n+\t\t\tfunction = \"gpio\";\n+\t\t\tdrive-strength = <2>;\n+\t\t\tbias-pull-up;\n+\t\t};\n+\t};\n+\n+\tled_pins: led_pins {\n+\t\tmux {\n+\t\t\tpins = \"gpio7\", \"gpio8\", \"gpio9\";\n+\t\t\tfunction = \"gpio\";\n+\t\t\tdrive-strength = <2>;\n+\t\t\tbias-pull-up;\n+\t\t};\n+\t};\n+\n+\tusb_pwr_en_pins: usb_pwr_en_pins {\n+\t\tmux {\n+\t\t\tpins = \"gpio56\";\n+\t\t\tfunction = \"gpio\";\n+\t\t\tdrive-strength = <12>;\n+\t\t\tbias-pull-up;\n+\t\t\toutput-high;\n+\t\t};\n+\t};\n+};\n+\n+&sata_phy {\n+\tstatus = \"okay\";\n+};\n+\n+&sata {\n+\tstatus = \"okay\";\n+};\n+\n+&hs_phy_0 {\n+\tstatus = \"okay\";\n+};\n+\n+&ss_phy_0 {\n+\tstatus = \"okay\";\n+};\n+\n+&usb3_0 {\n+\tstatus = \"okay\";\n+};\n+\n+&hs_phy_1 {\n+\tstatus = \"okay\";\n+};\n+\n+&ss_phy_1 {\n+\tstatus = \"okay\";\n+};\n+\n+&usb3_1 {\n+\tstatus = \"okay\";\n+\tpinctrl-0 = <&usb_pwr_en_pins>;\n+\tpinctrl-names = \"default\";\n+};\n+\n+&pcie0 {\n+\tstatus = \"okay\";\n+\treset-gpio = <&qcom_pinmux 3 GPIO_ACTIVE_LOW>;\n+\tpinctrl-0 = <&pcie0_pins>;\n+\tpinctrl-names = \"default\";\n+\n+\tbridge@0,0 {\n+\t\treg = <0x00000000 0 0 0 0>;\n+\t\t#address-cells = <3>;\n+\t\t#size-cells = <2>;\n+\t\tranges;\n+\n+\t\twifi@1,0 {\n+\t\t\tcompatible = \"pci168c,0040\";\n+\t\t\treg = <0x00010000 0 0 0 0>;\n+\n+\t\t\tnvmem-cells = <&macaddr_art_1006>, <&precal_art_1000>;\n+\t\t\tnvmem-cell-names = \"mac-address\", \"pre-calibration\";\n+\t\t};\n+\t};\n+};\n+\n+&pcie1 {\n+\tstatus = \"okay\";\n+\treset-gpio = <&qcom_pinmux 48 GPIO_ACTIVE_LOW>;\n+\tpinctrl-0 = <&pcie1_pins>;\n+\tpinctrl-names = \"default\";\n+\tmax-link-speed = <1>;\n+\n+\tbridge@0,0 {\n+\t\treg = <0x00000000 0 0 0 0>;\n+\t\t#address-cells = <3>;\n+\t\t#size-cells = <2>;\n+\t\tranges;\n+\n+\t\twifi@1,0 {\n+\t\t\tcompatible = \"pci168c,0040\";\n+\t\t\treg = <0x00010000 0 0 0 0>;\n+\n+\t\t\tnvmem-cells = <&macaddr_art_5006>, <&precal_art_5000>;\n+\t\t\tnvmem-cell-names = \"mac-address\", \"pre-calibration\";\n+\t\t};\n+\t};  \n+};\n+\n+&nand {\n+\tstatus = \"okay\";\n+\n+\tpinctrl-0 = <&nand_pins>;\n+\tpinctrl-names = \"default\";\n+\n+\tnand@0 {\n+\t\treg = <0>;\n+\t\tcompatible = \"qcom,nandcs\";\n+\n+\t\tnand-bus-width = <8>;\n+\t\tnand-ecc-strength = <4>;\n+\t\tnand-ecc-step-size = <512>;\n+\n+\t\tnand-is-boot-medium;\n+\t\tqcom,boot-partitions = <0 0xf0000000>;\n+\n+\t\tpartitions {\n+\t\t\tcompatible = \"fixed-partitions\";\n+\t\t\t#address-cells = <1>;\n+\t\t\t#size-cells = <1>;\n+\n+\t\t\tpartition@0 {\n+\t\t\t\tlabel = \"SBL1\";\n+\t\t\t\treg = <0x0 0x40000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@40000 {\n+\t\t\t\tlabel = \"MIBIB\";\n+\t\t\t\treg = <0x40000 0x80000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@c0000 {\n+\t\t\t\tlabel = \"SBL2\";\n+\t\t\t\treg = <0xc0000 0x80000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@140000 {\n+\t\t\t\tlabel = \"SBL3\";\n+\t\t\t\treg = <0x140000 0x80000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@1c0000 {\n+\t\t\t\tlabel = \"DDRCONFIG\";\n+\t\t\t\treg = <0x1c0000 0x80000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@240000 {\n+\t\t\t\tlabel = \"SSD\";\n+\t\t\t\treg = <0x240000 0x80000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@2c0000 {\n+\t\t\t\tlabel = \"TZ\";\n+\t\t\t\treg = <0x2c0000 0x80000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@340000 {\n+\t\t\t\tlabel = \"RPM\";\n+\t\t\t\treg = <0x340000 0x80000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@3c0000 {\n+\t\t\t\tlabel = \"APPSBL\";\n+\t\t\t\treg = <0x3c0000 0x100000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@4c0000 {\n+\t\t\t\tlabel = \"APPSBLENV\";\n+\t\t\t\treg = <0x4c0000 0x80000>;\n+\t\t\t};\n+\n+\t\t\tart: partition@540000 {\n+\t\t\t\tlabel = \"ART\";\n+\t\t\t\treg = <0x540000 0x80000>;\n+\t\t\t\tread-only;\n+\n+\t\t\t\tcompatible = \"nvmem-cells\";\n+\t\t\t\t#address-cells = <1>;\n+\t\t\t\t#size-cells = <1>;\n+\n+\t\t\t\tmacaddr_art_0: macaddr@0 {  // WAN (label)\n+\t\t\t\t\treg = <0x0 0x6>;\n+\t\t\t\t};\n+\t\t\t\tmacaddr_art_6: macaddr@6 {  // LAN\n+\t\t\t\t\treg = <0x6 0x6>;\n+\t\t\t\t};\n+\t\t\t\tmacaddr_art_1006: macaddr@1006 {  // WiFi 2g\n+\t\t\t\t\treg = <0x1006 0x6>;\n+\t\t\t\t};\n+\t\t\t\tmacaddr_art_5006: macaddr@5006 {  // WiFi 5g\n+\t\t\t\t\treg = <0x5006 0x6>;\n+\t\t\t\t};\n+\t\t\t\tprecal_art_1000: precal@1000 {\n+\t\t\t\t\treg = <0x1000 0x2f20>;\n+\t\t\t\t};\n+\t\t\t\tprecal_art_5000: precal@5000 {\n+\t\t\t\t\treg = <0x5000 0x2f20>;\n+\t\t\t\t};\n+\t\t\t};\n+\n+\t\t\tpartition@5c0000 {\n+\t\t\t\tlabel = \"BOOTCONFIG\";\n+\t\t\t\treg = <0x5c0000 0x40000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@600000 {\n+\t\t\t\tlabel = \"bdata\";\n+\t\t\t\treg = <0x600000 0x80000>;\n+\t\t\t};\n+\n+\t\t\tpartition@680000 {\n+\t\t\t\tlabel = \"crash\";\n+\t\t\t\treg = <0x680000 0x80000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@700000 {\n+\t\t\t\tlabel = \"crash_syslog\";\n+\t\t\t\treg = <0x700000 0x80000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@780000 {\n+\t\t\t\tlabel = \"rsvd\";\n+\t\t\t\treg = <0x780000 0x80000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\t/* Stock U-Boot support Dual Boot */\n+\t\t\tpartition@800000 {\n+\t\t\t\tlabel = \"kernel_dup\";\n+\t\t\t\treg = <0x800000 0x400000>;\n+\t\t\t};\n+\n+\t\t\tpartition@c00000 {\n+\t\t\t\tlabel = \"kernel\";\n+\t\t\t\treg = <0xc00000 0x400000>;\n+\t\t\t};\n+\n+\t\t\tpartition@1000000 {\n+\t\t\t\tlabel = \"ubi\";\n+\t\t\t\treg = <0x1000000 0xf000000>;\n+\t\t\t};\n+\t\t};\n+\t};\n+};\n+\n+&mdio0 {\n+\tstatus = \"okay\";\n+\n+\tpinctrl-0 = <&mdio0_pins>;\n+\tpinctrl-names = \"default\";\n+\n+\tphy0: ethernet-phy@0 {\n+\t\treg = <0>;\n+\t\tqca,ar8327-initvals = <\n+\t\t\t0x04 0x07600000  /* PAD0_MODE */\n+\t\t\t0x08 0x01000000  /* PAD5_MODE */\n+\t\t\t0x0c 0x00000080  /* PAD6_MODE */\n+\t\t\t0x7c 0x0000004e  /* PORT0_STATUS */\n+\t\t\t0x94 0x0000004e  /* PORT6_STATUS */\n+\t\t\t0xe0 0xc74164de  /* SGMII_CTRL */\n+\t\t\t0xe4 0x0006a545  /* MAC_POWER_SEL */\n+\t\t>;\n+\t};\n+\n+\tphy4: ethernet-phy@4 {\n+\t\treg = <4>;\n+\t};\n+};\n+\n+&gmac1 {\n+\tstatus = \"okay\";\n+\tphy-mode = \"rgmii\";\n+\tqcom,id = <1>;\n+\n+\tpinctrl-0 = <&rgmii2_pins>;\n+\tpinctrl-names = \"default\";\n+\n+\tnvmem-cells = <&macaddr_art_0>;\n+\tnvmem-cell-names = \"mac-address\";\n+\n+\tfixed-link {\n+\t\tspeed = <1000>;\n+\t\tfull-duplex;\n+\t};\n+};\n+\n+&gmac2 {\n+\tstatus = \"okay\";\n+\tphy-mode = \"sgmii\";\n+\tqcom,id = <2>;\n+\n+\tnvmem-cells = <&macaddr_art_6>;\n+\tnvmem-cell-names = \"mac-address\";\n+\n+\tfixed-link {\n+\t\tspeed = <1000>;\n+\t\tfull-duplex;\n+\t};\n+};\ndiff --git a/target/linux/ipq806x/image/generic.mk b/target/linux/ipq806x/image/generic.mk\nindex aac0a2c8fadfd..b437706cd445e 100644\n--- a/target/linux/ipq806x/image/generic.mk\n+++ b/target/linux/ipq806x/image/generic.mk\n@@ -471,6 +471,23 @@ define Device/ubnt_unifi-ac-hd\n endef\n TARGET_DEVICES += ubnt_unifi-ac-hd\n \n+define Device/xiaomi_r3d\n+\t$(call Device/LegacyImage)\n+\tDEVICE_VENDOR := Xiaomi\n+\tDEVICE_MODEL := R3D\n+\tSOC := qcom-ipq8064\n+\tBLOCKSIZE := 128k\n+\tPAGESIZE := 2048\n+\tKERNEL_SIZE := 4096k\n+\tIMAGE_SIZE := 86016k\n+\tUBINIZE_OPTS := -E 5\n+\tIMAGES := factory.bin sysupgrade.bin\n+\tIMAGE/factory.bin := append-kernel | pad-to $$$$(KERNEL_SIZE) | append-ubi | pad-to $$$$(BLOCKSIZE) | check-size\n+\tDEVICE_PACKAGES := kmod-i2c-gpio kmod-hwmon-lm75 kmod-hwmon-emc2305 hwmon-drivetemp \\\n+\t\tkmod-usb-storage-uas ath10k-firmware-qca9984-ct ath10k-firmware-qca99x0-ct\n+endef\n+TARGET_DEVICES += xiaomi_r3d\n+\n define Device/zyxel_nbg6817\n \t$(Device/dsa-migration)\n \tDEVICE_VENDOR := Zyxel\n"
  },
  {
    "path": "devices/mediatek_filogic/.config",
    "content": "\nCONFIG_TARGET_mediatek=y\nCONFIG_TARGET_mediatek_filogic=y\n\nCONFIG_TARGET_DEVICE_mediatek_filogic_DEVICE_cudy_re3000-v1=n\nCONFIG_TARGET_DEVICE_mediatek_filogic_DEVICE_cudy_wr3000-v1=n\nCONFIG_TARGET_DEVICE_mediatek_filogic_DEVICE_yuncore_ax835=n\nCONFIG_TARGET_DEVICE_mediatek_filogic_DEVICE_gatonetworks_gdsp=n\nCONFIG_TARGET_DEVICE_mediatek_filogic_DEVICE_xiaomi_redmi-router-ax6000-stock=n\n"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7981b-aigo-ags21.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n/*\n * Author:dailook\n */\n\n/dts-v1/;\n#include <dt-bindings/gpio/gpio.h>\n#include <dt-bindings/input/input.h>\n#include <dt-bindings/leds/common.h>\n\n#include \"mt7981b.dtsi\"\n\n/ {\n\tmodel = \"Aigo AGS21\";\n\tcompatible = \"aigo,ags21\", \"mediatek,mt7981\";\n\n\tchosen {\n\t\tbootargs = \"root=PARTLABEL=rootfs rootwait rootfstype=squashfs,f2fs\";\n\t\tstdout-path = \"serial0:115200n8\";\n\t};\n\n\taliases {\n\t\tled-boot = &status_red_led;\n\t\tled-failsafe = &status_red_led;\n\t\tled-running = &status_blue_led;\n\t\tled-upgrade = &status_blue_led;\n\t\tserial0 = &uart0;\n\t};\n\n\tmemory {\n\t\treg = <0 0x40000000 0 0x20000000>;\n\t};\n\n\tleds {\n\t\tcompatible = \"gpio-leds\";\n\n\t\tstatus_red_led: led-0 {\n\t\t\tlabel = \"red:status\";\n\t\t\tgpios = <&pio 6 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tstatus_blue_led: led-1 {\n\t\t\tlabel = \"blue:status\";\n\t\t\tgpios = <&pio 4 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tinternet_led: led-2 {\n\t\t\tlabel = \"green:status\";\n\t\t\tgpios = <&pio 29 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\twifi_led: led-3 {\n\t\t\tlabel = \"white:status\";\n\t\t\tgpios = <&pio 30 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n\n\tgpio-keys {\n\t\tcompatible = \"gpio-keys\";\n\t\treset {\n\t\t\tlabel = \"reset\";\n\t\t\tlinux,code = <KEY_RESTART>;\n\t\t\tgpios = <&pio 1 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tmesh {\n\t\t\tlabel = \"mesh\";\n\t\t\tlinux,code = <BTN_9>;\n\t\t\tgpios = <&pio 0 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n};\n\n&uart0 {\n\tstatus = \"okay\";\n};\n\n&watchdog {\n\tstatus = \"okay\";\n};\n\n&mmc0 {\n\tbus-width = <8>;\n\tcap-mmc-highspeed;\n\tmax-frequency = <52000000>;\n\tnon-removable;\n\tpinctrl-names = \"default\", \"state_uhs\";\n\tpinctrl-0 = <&mmc0_pins_default>;\n\tpinctrl-1 = <&mmc0_pins_uhs>;\n\tvmmc-supply = <&reg_3p3v>;\n\tstatus = \"okay\";\n\n\tcard@0 {\n\t\tcompatible = \"mmc-card\";\n\t\treg = <0>;\n\n\t\tblock {\n\t\t\tcompatible = \"block-device\";\n\n\t\t\tpartitions {\n\t\t\t\tblock-partition-factory {\n\t\t\t\t\tpartname = \"factory\";\n\n\t\t\t\t\tnvmem-layout {\n\t\t\t\t\t\tcompatible = \"fixed-layout\";\n\t\t\t\t\t\t#address-cells = <1>;\n\t\t\t\t\t\t#size-cells = <1>;\n\n\t\t\t\t\t\teeprom_factory_0: eeprom@0 {\n\t\t\t\t\t\t\treg = <0x0 0x1000>;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tmacaddr_factory_4: macaddr@4 {\n\t\t\t\t\t\t\tcompatible = \"mac-base\";\n\t\t\t\t\t\t\treg = <0x4 0x6>;\n\t\t\t\t\t\t\t#nvmem-cell-cells = <1>;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tmacaddr_factory_24: macaddr@24 {\n\t\t\t\t\t\t\tcompatible = \"mac-base\";\n\t\t\t\t\t\t\treg = <0x24 0x6>;\n\t\t\t\t\t\t\t#nvmem-cell-cells = <1>;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tmacaddr_factory_2a: macaddr@2a {\n\t\t\t\t\t\t\tcompatible = \"mac-base\";\n\t\t\t\t\t\t\treg = <0x2a 0x6>;\n\t\t\t\t\t\t\t#nvmem-cell-cells = <1>;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tmacaddr_factory_30: macaddr@30 {\n\t\t\t\t\t\t\tcompatible = \"mac-base\";\n\t\t\t\t\t\t\treg = <0x30 0x6>;\n\t\t\t\t\t\t\t#nvmem-cell-cells = <1>;\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\n&eth {\n\tstatus = \"okay\";\n\n\tgmac0: mac@0 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <0>;\n\t\tphy-mode = \"2500base-x\";\n\t\t\n\t\tnvmem-cells = <&macaddr_factory_2a 0>;\n        nvmem-cell-names = \"mac-address\";\n\t\t\n\t\tfixed-link {\n\t\t\tspeed = <2500>;\n\t\t\tfull-duplex;\n\t\t\tpause;\n\t\t};\n\t};\n\n\tgmac1: mac@1 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <1>;\n\t\tphy-mode = \"gmii\";\n\t\tphy-handle = <&int_gbe_phy>;\n\n\t\tnvmem-cells = <&macaddr_factory_24 0>;\n\t\tnvmem-cell-names = \"mac-address\";\n\t};\n\n\tmdio: mdio-bus {\n\t\t#address-cells = <1>;\n\t\t#size-cells = <0>;\n\n\t\tphy0: ethernet-phy@0 {\n\t\t\tcompatible = \"ethernet-phy-id03a2.9461\";\n\t\t\treg = <0>;\n\t\t\tphy-mode = \"gmii\";\n\t\t\tnvmem-cells = <&phy_calibration>;\n\t\t\tnvmem-cell-names = \"phy-cal-data\";\n\t\t};\n\n\t\tswitch@0 {\n\t\t\tcompatible = \"mediatek,mt7531\";\n\t\t\treg = <31>;\n\t\t\treset-gpios = <&pio 39 0>;\n\n\t\t\tports {\n\t\t\t\t#address-cells = <1>;\n\t\t\t\t#size-cells = <0>;\n\n\t\t\t\tport@1 {\n\t\t\t\t\treg = <1>;\n\t\t\t\t\tlabel = \"lan1\";\n\t\t\t\t};\n\n\t\t\t\tport@2 {\n\t\t\t\t\treg = <2>;\n\t\t\t\t\tlabel = \"lan2\";\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tport@6 {\n\t\t\t\t\treg = <6>;\n\t\t\t\t\tlabel = \"cpu\";\n\t\t\t\t\tethernet = <&gmac0>;\n\t\t\t\t\tphy-mode = \"2500base-x\";\n\n\t\t\t\t\tfixed-link {\n\t\t\t\t\t\tspeed = <2500>;\n\t\t\t\t\t\tfull-duplex;\n\t\t\t\t\t\tpause;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\n&pio {\n\tmmc0_pins_default: mmc0-pins-default {\n\t\tmux {\n\t\t\tfunction = \"flash\";\n\t\t\tgroups = \"emmc_45\";\n\t\t};\n\t};\n\n\tmmc0_pins_uhs: mmc0-pins-uhs {\n\t\tmux {\n\t\t\tfunction = \"flash\";\n\t\t\tgroups = \"emmc_45\";\n\t\t};\n\t};\n};\n\n&wifi {\n\tstatus = \"okay\";\n\tnvmem-cells = <&eeprom_factory_0>;\n\tnvmem-cell-names = \"eeprom\";\n\t\n\tband@0 {\n\t\treg = <0>;\n\t\tnvmem-cells = <&macaddr_factory_4 0>;\n\t\tnvmem-cell-names = \"mac-address\";\n\t};\n\n\tband@1 {\n\t\treg = <1>;\n\t\tnvmem-cells = <&macaddr_factory_30 0>;\n\t\tnvmem-cell-names = \"mac-address\";\n\t};\n};"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7981b-bt-r320.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n\n/dts-v1/;\n#include <dt-bindings/gpio/gpio.h>\n#include <dt-bindings/input/input.h>\n#include <dt-bindings/leds/common.h>\n\n#include \"mt7981b.dtsi\"\n\n/ {\n\tmodel = \"BT R320\";\n\tcompatible = \"bt,r320\", \"mediatek,mt7981\";\n\n\taliases {\n\t\tserial0 = &uart0;\n\t\tlabel-mac-device = &gmac0;\n\t};\n\n\tchosen {\n\t\tbootargs = \"root=PARTLABEL=rootfs rootwait\";\n\t\tstdout-path = \"serial0:115200n8\";\n\t};\n\n\tmemory {\n\t\treg = <0 0x40000000 0 0x40000000>;\n\t};\n\n\tgpio-keys {\n\t\tcompatible = \"gpio-keys\";\n\n\t\tbutton-wps {\n\t\t\tlabel = \"wps\";\n\t\t\tlinux,code = <KEY_WPS_BUTTON>;\n\t\t\tgpios = <&pio 0 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tbutton-reset {\n\t\t\tlabel = \"reset\";\n\t\t\tlinux,code = <KEY_RESTART>;\n\t\t\tgpios = <&pio 1 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n\n\tgpio-leds {\n\t\tcompatible = \"gpio-leds\";\n\n\t\twlan2g_led: led-0 {\n\t\t\tfunction = LED_FUNCTION_WLAN_2GHZ;\n\t\t\tcolor = <LED_COLOR_ID_GREEN>;\n\t\t\tgpios = <&pio 34 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\twlan5g_led: led-1 {\n\t\t\tfunction = LED_FUNCTION_WLAN_5GHZ;\n\t\t\tcolor = <LED_COLOR_ID_GREEN>;\n\t\t\tgpios = <&pio 35 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n};\n\n&eth {\n\tstatus = \"okay\";\n\tgmac0: mac@0 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <0>;\n\t\tphy-mode = \"2500base-x\";\n        nvmem-cells = <&macaddr_factory_2a 0>;\n        nvmem-cell-names = \"mac-address\";\n\t\tfixed-link {\n\t\t\tspeed = <2500>;\n\t\t\tfull-duplex;\n\t\t\tpause;\n\t\t};\n\t};\t\n\t\tgmac1: mac@1 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <1>;\n\t\tphy-mode = \"gmii\";\n\t\tphy-handle = <&int_gbe_phy>;\n\t};\n\n\tmdio: mdio-bus {\n\t\t#address-cells = <1>;\n\t\t#size-cells = <0>;\n\n\n\t\tswitch@0 {\n\t\t\tcompatible = \"mediatek,mt7531\";\n\t\t\treg = <31>;\n\t\t\treset-gpios = <&pio 39 0>;\n\n\t\t\tports {\n\t\t\t\t#address-cells = <1>;\n\t\t\t\t#size-cells = <0>;\n\n\t\t\t\tport@1 {\n\t\t\t\t\treg = <1>;\n\t\t\t\t\tlabel = \"lan1\";\n\t\t\t\t};\n\n\t\t\t\tport@2 {\n\t\t\t\t\treg = <2>;\n\t\t\t\t\tlabel = \"lan2\";\n\t\t\t\t};\n\n\t\t\t\tport@3 {\n\t\t\t\t\treg = <3>;\n\t\t\t\t\tlabel = \"lan3\";\n\t\t\t\t};\n\n\t\t\t\tport@4 {\n\t\t\t\t\treg = <4>;\n\t\t\t\t\tlabel = \"wan\";\n                    nvmem-cells = <&macaddr_factory_24 0>;\n                    nvmem-cell-names = \"mac-address\";\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tport@6 {\n\t\t\t\t\treg = <6>;\n\t\t\t\t\tlabel = \"cpu\";\n\t\t\t\t\tethernet = <&gmac0>;\n\t\t\t\t\tphy-mode = \"2500base-x\";\n\n\t\t\t\t\tfixed-link {\n\t\t\t\t\t\tspeed = <2500>;\n\t\t\t\t\t\tfull-duplex;\n\t\t\t\t\t\tpause;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\n&mmc0 {\n\tstatus = \"okay\";\n\n\tpinctrl-names = \"default\", \"state_uhs\";\n\tpinctrl-0 = <&mmc0_pins_default>;\n\tpinctrl-1 = <&mmc0_pins_uhs>;\n\tbus-width = <8>;\n\tmax-frequency = <52000000>;\n\tvmmc-supply = <&reg_3p3v>;\n\tcap-mmc-highspeed;\n\tnon-removable;\n\tno-sd;\n\tno-sdio;\n\n\tcard@0 {\n\t\tcompatible = \"mmc-card\";\n\t\treg = <0>;\n\n\t\tblock {\n\t\t\tcompatible = \"block-device\";\n\n\t\t\tpartitions {\n\t\t\t\tblock-partition-factory {\n\t\t\t\t\tpartname = \"factory\";\n\n\t\t\t\t\tnvmem-layout {\n\t\t\t\t\t\tcompatible = \"fixed-layout\";\n\t\t\t\t\t\t#address-cells = <1>;\n\t\t\t\t\t\t#size-cells = <1>;\n\n\t\t\t\t\t\teeprom_factory_0: eeprom@0 {\n\t\t\t\t\t\t\treg = <0x0 0x1000>;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tmacaddr_factory_24: macaddr@24 {\n\t\t\t\t\t\t\tcompatible = \"mac-base\";\n\t\t\t\t\t\t\treg = <0x24 0x6>;\n\t\t\t\t\t\t\t#nvmem-cell-cells = <1>;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tmacaddr_factory_2a: macaddr@2a {\n\t\t\t\t\t\t\tcompatible = \"mac-base\";\n\t\t\t\t\t\t\treg = <0x2a 0x6>;\n\t\t\t\t\t\t\t#nvmem-cell-cells = <1>;\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\n&pio {\n\tmmc0_pins_default: mmc0-pins-default {\n\t\tmux {\n\t\t\tfunction = \"flash\";\n\t\t\tgroups = \"emmc_45\";\n\t\t};\n\t};\n\n\tmmc0_pins_uhs: mmc0-pins-uhs {\n\t\tmux {\n\t\t\tfunction = \"flash\";\n\t\t\tgroups = \"emmc_45\";\n\t\t};\n\t};\n};\n\n&uart0 {\n\tstatus = \"okay\";\n};\n\n&watchdog {\n\tstatus = \"okay\";\n};\n\n&wifi {\n\tnvmem-cells = <&eeprom_factory_0>;\n\tnvmem-cell-names = \"eeprom\";\n\tstatus = \"okay\";\n};\n\n&usb_phy {\n\tstatus = \"okay\";\n};\n\n&xhci {\n\tstatus = \"okay\";\n};\n"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7981b-cmcc-a10.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n\n/dts-v1/;\n#include \"mt7981b-cmcc-a10.dtsi\"\n\n/ {\n\tmodel = \"CMCC A10\";\n\tcompatible = \"cmcc,a10\", \"mediatek,mt7981\";\n};\n\n&partitions {\n\tpartition@580000 {\n\t\tlabel = \"ubi\";\n\t\treg = <0x580000 0x7000000>;\n\t};\n};\n\n&spi_nand {\n\tmediatek,nmbm;\n\tmediatek,bmt-max-ratio = <1>;\n\tmediatek,bmt-max-reserved-blocks = <64>;\n};\n"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7981b-cmcc-mr3000d-ciq-256m.dts",
    "content": "/dts-v1/;\n\n#include \"mt7981b.dtsi\"\n\n/ {\n\tmodel = \"CMCC MR3000D-CIq (256M)\";\n\tcompatible = \"cmcc,mr3000d-ciq-256m\", \"mediatek,mt7981\";\n\n\taliases {\n\t\tethernet0 = &gmac0;\n\t\tled-boot = &led_run;\n\t\tled-failsafe = &led_blue;\n\t\tled-running = &led_green;\n\t\tled-upgrade = &led_blue;\n\t\tserial0 = &uart0;\n\t\tlabel-mac-device = &gmac1;\n\t};\n\n\tchosen {\n\t\tstdout-path = \"serial0:115200n8\";\n\t};\n\n\tgpio-keys {\n\t\tcompatible = \"gpio-keys\";\n\n\t\treset {\n\t\t\tlabel = \"reset\";\n\t\t\tlinux,code = <KEY_RESTART>;\n\t\t\tgpios = <&pio 1 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\twps {\n\t\t\tlabel = \"wps\";\n\t\t\tlinux,code = <KEY_WPS_BUTTON>;\n\t\t\tgpios = <&pio 0 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n\n\tleds {\n\t\tcompatible = \"gpio-leds\";\n\n\t\tled_run: RGB_RED {\n\t\t\tlabel = \"RGB_RED\";\n\t\t\tgpios = <&pio 10 GPIO_ACTIVE_LOW>;\n\t\t\tdefault-state = \"on\";\n\t\t};\n\n\t\tled_green: RGB_GREEN {\n\t\t\tlabel = \"RGB_GREEN\";\n\t\t\tgpios = <&pio 11 GPIO_ACTIVE_LOW>;\n\t\t\tdefault-state = \"off\";\n\t\t};\n\n\t\tled_blue: RGB_BLUE {\n\t\t\tlabel = \"RGB_BLUE\";\n\t\t\tgpios = <&pio 12 GPIO_ACTIVE_LOW>;\n\t\t\tdefault-state = \"off\";\n\t\t};\n\t};\n};\n\n&uart0 {\n\tstatus = \"okay\";\n};\n\n&watchdog {\n\tstatus = \"okay\";\n};\n\n&eth {\n\tpinctrl-names = \"default\";\n\tpinctrl-0 = <&mdio_pins>;\n\n\tstatus = \"okay\";\n\n\tgmac0: mac@0 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <0>;\n\t\tphy-mode = \"2500base-x\";\n\t\tnvmem-cells = <&macaddr_factory_4 (-1)>;\n\t\tnvmem-cell-names = \"mac-address\";\n\n\t\tfixed-link {\n\t\t\tspeed = <2500>;\n\t\t\tfull-duplex;\n\t\t\tpause;\n\t\t};\n\t};\n\n\tgmac1: mac@1 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <1>;\n\t\tphy-mode = \"gmii\";\n\t\tphy-handle = <&int_gbe_phy>;\n\t\tnvmem-cells = <&macaddr_factory_4 (-2)>;\n\t\tnvmem-cell-names = \"mac-address\";\n\t};\n};\n\n&mdio_bus {\n\tswitch0: switch@1f {\n\t\tcompatible = \"mediatek,mt7531\";\n\t\treg = <31>;\n\t\tdsa,member = <0 0>;\n\t\treset-gpios = <&pio 39 GPIO_ACTIVE_HIGH>;\n\t\tinterrupt-controller;\n\t\t#interrupt-cells = <1>;\n\t\tinterrupt-parent = <&pio>;\n\t\tinterrupts = <38 IRQ_TYPE_LEVEL_HIGH>;\n\t};\n};\n\n&switch0 {\n\tports {\n\t\t#address-cells = <1>;\n\t\t#size-cells = <0>;\n\n\t\tport@0 {\n\t\t\treg = <0>;\n\t\t\tlabel = \"lan1\";\n\t\t};\n\n\t\tport@1 {\n\t\t\treg = <1>;\n\t\t\tlabel = \"lan2\";\n\t\t};\n\n\t\tport@2 {\n\t\t\treg = <2>;\n\t\t\tlabel = \"lan3\";\n\t\t};\n\n\t\tport@6 {\n\t\t\treg = <6>;\n\t\t\tethernet = <&gmac0>;\n\t\t\tphy-mode = \"2500base-x\";\n\n\t\t\tfixed-link {\n\t\t\t\tspeed = <2500>;\n\t\t\t\tfull-duplex;\n\t\t\t\tpause;\n\t\t\t};\n\t\t};\n\t};\n};\n\n&spi0 {\n\tpinctrl-names = \"default\";\n\tpinctrl-0 = <&spi0_flash_pins>;\n\tstatus = \"okay\";\n\n\tspi_nand: flash@0 {\n\t\t#address-cells = <1>;\n\t\t#size-cells = <1>;\n\t\tcompatible = \"spi-nand\";\n\t\treg = <0>;\n\t\tspi-max-frequency = <52000000>;\n\n\t\tspi-cal-enable;\n\t\tspi-cal-mode = \"read-data\";\n\t\tspi-cal-datalen = <7>;\n\t\tspi-cal-data = /bits/ 8 <0x53 0x50 0x49 0x4E 0x41 0x4E 0x44>;\n\t\tspi-cal-addrlen = <5>;\n\t\tspi-cal-addr = /bits/ 32 <0x0 0x0 0x0 0x0 0x0>;\n\n\t\tspi-tx-bus-width = <4>;\n\t\tspi-rx-bus-width = <4>;\n\t\tmediatek,nmbm;\n\t\tmediatek,bmt-max-ratio = <1>;\n\t\tmediatek,bmt-max-reserved-blocks = <64>;\n\n\t\tpartitions {\n\t\t\tcompatible = \"fixed-partitions\";\n\t\t\t#address-cells = <1>;\n\t\t\t#size-cells = <1>;\n\n\t\t\tpartition@0 {\n\t\t\t\tlabel = \"BL2\";\n\t\t\t\treg = <0x00000 0x0100000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@100000 {\n\t\t\t\tlabel = \"u-boot-env\";\n\t\t\t\treg = <0x0100000 0x0080000>;\n\t\t\t};\n\n\t\t\tfactory: partition@180000 {\n\t\t\t\tlabel = \"Factory\";\n\t\t\t\treg = <0x180000 0x0200000>;\n\n\t\t\t\tnvmem-layout {\n\t\t\t\t\tcompatible = \"fixed-layout\";\n\t\t\t\t\t#address-cells = <1>;\n\t\t\t\t\t#size-cells = <1>;\n\n\t\t\t\t\tmacaddr_factory_4: macaddr@4 {\n\t\t\t\t\t\tcompatible = \"mac-base\";\n\t\t\t\t\t\treg = <0x4 0x6>;\n\t\t\t\t\t\t#nvmem-cell-cells = <1>;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tpartition@380000 {\n\t\t\t\tlabel = \"FIP\";\n\t\t\t\treg = <0x380000 0x0200000>;\n\t\t\t};\n\n\t\t\tpartition@580000 {\n\t\t\t\tlabel = \"ubi\";\n\t\t\t\tcompatible = \"linux,ubi\";\n\t\t\t\treg = <0x580000 0x3000000>;\n\t\t\t};\n\n\t\t\tpartition@3580000 {\n\t\t\t\tlabel = \"ubi1\";\n\t\t\t\treg = <0x3580000 0x3000000>;\n\t\t\t};\n\n\t\t\tpartition@6580000 {\n\t\t\t\tlabel = \"Product\";\n\t\t\t\treg = <0x6580000 0x0020000>;  // 128 KB\n\t\t\t};\n\n\t\t\tpartition@65a0000 {\n\t\t\t\tlabel = \"Custom\";\n\t\t\t\treg = <0x65a0000 0x1000000>;  // 16 MB\n\t\t\t};\n\t\t};\n\t};\n};\n\n&pio {\n\tspi0_flash_pins: spi0-pins {\n\t\tmux {\n\t\t\tfunction = \"spi\";\n\t\t\tgroups = \"spi0\", \"spi0_wp_hold\";\n\t\t};\n\n\t\tconf-pu {\n\t\t\tpins = \"SPI0_CS\", \"SPI0_HOLD\", \"SPI0_WP\";\n\t\t\tdrive-strength = <MTK_DRIVE_8mA>;\n\t\t\tbias-pull-up = <MTK_PUPD_SET_R1R0_11>;\n\t\t};\n\n\t\tconf-pd {\n\t\t\tpins = \"SPI0_CLK\", \"SPI0_MOSI\", \"SPI0_MISO\";\n\t\t\tdrive-strength = <MTK_DRIVE_8mA>;\n\t\t\tbias-pull-down = <MTK_PUPD_SET_R1R0_11>;\n\t\t};\n\t};\n};\n\n&wifi {\n\tmediatek,mtd-eeprom = <&factory 0x0>;\n\n\tstatus = \"okay\";\n};\n"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7981b-cmcc-rax3000m-emmc.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n\n/dts-v1/;\n#include \"mt7981b-cmcc-rax3000m.dts\"\n\n/ {\n\tmodel = \"CMCC RAX3000M (eMMC version)\";\n\tcompatible = \"cmcc,rax3000m-emmc\", \"mediatek,mt7981\";\n\n\tchosen {\n\t\tbootargs = \"root=PARTLABEL=rootfs rootwait\";\n\t};\n};\n\n&gmac0 {\n\tnvmem-cells = <&macaddr_factory_2a>;\n\tnvmem-cell-names = \"mac-address\";\n};\n\n&gmac1 {\n\tnvmem-cells = <&macaddr_factory_24>;\n\tnvmem-cell-names = \"mac-address\";\n};\n\n&mmc0 {\n\tbus-width = <8>;\n\tmax-frequency = <26000000>;\n\tnon-removable;\n\tpinctrl-names = \"default\", \"state_uhs\";\n\tpinctrl-0 = <&mmc0_pins_default>;\n\tpinctrl-1 = <&mmc0_pins_uhs>;\n\tvmmc-supply = <&reg_3p3v>;\n\t#address-cells = <1>;\n\t#size-cells = <0>;\n\tstatus = \"okay\";\n\n\tcard@0 {\n\t\tcompatible = \"mmc-card\";\n\t\treg = <0>;\n\n\t\tblock {\n\t\t\tcompatible = \"block-device\";\n\n\t\t\tpartitions {\n\t\t\t\tblock-partition-factory {\n\t\t\t\t\tpartname = \"factory\";\n\n\t\t\t\t\tnvmem-layout {\n\t\t\t\t\t\tcompatible = \"fixed-layout\";\n\t\t\t\t\t\t#address-cells = <1>;\n\t\t\t\t\t\t#size-cells = <1>;\n\n\t\t\t\t\t\teeprom_factory_0: eeprom@0 {\n\t\t\t\t\t\t\treg = <0x0 0x1000>;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tmacaddr_factory_24: macaddr@24 {\n\t\t\t\t\t\t\treg = <0x24 0x6>;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tmacaddr_factory_2a: macaddr@2a {\n\t\t\t\t\t\t\treg = <0x2a 0x6>;\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\n&pio {\n\tmmc0_pins_default: mmc0-pins {\n\t\tmux {\n\t\t\tfunction = \"flash\";\n\t\t\tgroups = \"emmc_45\";\n\t\t};\n\t};\n\n\tmmc0_pins_uhs: mmc0-uhs-pins {\n\t\tmux {\n\t\t\tfunction = \"flash\";\n\t\t\tgroups = \"emmc_45\";\n\t\t};\n\t};\n};\n"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7981b-cmcc-rax3000m-nand.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n\n/dts-v1/;\n#include \"mt7981b-cmcc-rax3000m.dts\"\n\n/ {\n\tmodel = \"CMCC RAX3000M (NAND version)\";\n\tcompatible = \"cmcc,rax3000m-nand\", \"mediatek,mt7981\";\n\n\taliases {\n\t\tlabel-mac-device = &gmac1;\n\t};\n};\n\n&gmac0 {\n\tnvmem-cells = <&macaddr_factory_2a>;\n\tnvmem-cell-names = \"mac-address\";\n};\n\n&gmac1 {\n\tnvmem-cells = <&macaddr_factory_24>;\n\tnvmem-cell-names = \"mac-address\";\n};\n\n&spi0 {\n\tpinctrl-names = \"default\";\n\tpinctrl-0 = <&spi0_flash_pins>;\n\tstatus = \"okay\";\n\n\tflash@0 {\n\t\tcompatible = \"spi-nand\";\n\t\t#address-cells = <1>;\n\t\t#size-cells = <1>;\n\t\treg = <0>;\n\n\t\tspi-max-frequency = <52000000>;\n\t\tspi-tx-bus-width = <4>;\n\t\tspi-rx-bus-width = <4>;\n\t\tmediatek,nmbm;\n\t\tmediatek,bmt-max-ratio = <1>;\n\t\tmediatek,bmt-max-reserved-blocks = <64>;\n\n\t\tpartitions {\n\t\t\tcompatible = \"fixed-partitions\";\n\t\t\t#address-cells = <1>;\n\t\t\t#size-cells = <1>;\n\n\t\t\tpartition@0 {\n\t\t\t\tlabel = \"bl2\";\n\t\t\t\treg = <0x00000 0x0100000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@100000 {\n\t\t\t\tlabel = \"u-boot-env\";\n\t\t\t\treg = <0x100000 0x80000>;\n\t\t\t};\n\n\t\t\tfactory: partition@180000 {\n\t\t\t\tlabel = \"factory\";\n\t\t\t\treg = <0x180000 0x200000>;\n\t\t\t\tread-only;\n\n\t\t\t\tnvmem-layout {\n\t\t\t\t\tcompatible = \"fixed-layout\";\n\t\t\t\t\t#address-cells = <1>;\n\t\t\t\t\t#size-cells = <1>;\n\n\t\t\t\t\tmacaddr_factory_24: macaddr@24 {\n\t\t\t\t\t\treg = <0x24 0x6>;\n\t\t\t\t\t};\n\n\t\t\t\t\tmacaddr_factory_2a: macaddr@2a {\n\t\t\t\t\t\treg = <0x2a 0x6>;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tpartition@380000 {\n\t\t\t\tlabel = \"fip\";\n\t\t\t\treg = <0x380000 0x200000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@580000 {\n\t\t\t\tlabel = \"ubi\";\n\t\t\t\treg = <0x580000 0x7200000>;\n\t\t\t};\n\t\t};\n\t};\n};\n\n&pio {\n\tspi0_flash_pins: spi0-pins {\n\t\tmux {\n\t\t\tfunction = \"spi\";\n\t\t\tgroups = \"spi0\", \"spi0_wp_hold\";\n\t\t};\n\n\t\tconf-pu {\n\t\t\tpins = \"SPI0_CS\", \"SPI0_HOLD\", \"SPI0_WP\";\n\t\t\tdrive-strength = <8>;\n\t\t\tmediatek,pull-up-adv = <0>; /* bias-disable */\n\t\t};\n\n\t\tconf-pd {\n\t\t\tpins = \"SPI0_CLK\", \"SPI0_MOSI\", \"SPI0_MISO\";\n\t\t\tdrive-strength = <8>;\n\t\t\tmediatek,pull-up-adv = <0>; /* bias-disable */\n\t\t};\n\t};\n};\n\n&wifi {\n\tmediatek,mtd-eeprom = <&factory 0x0>;\n};\n"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7981b-cmcc-xr30-emmc.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n\n/dts-v1/;\n#include \"mt7981b-cmcc-xr30.dtsi\"\n\n/ {\n\tmodel = \"CMCC XR30 (eMMC version)\";\n\tcompatible = \"cmcc,xr30-emmc\", \"mediatek,mt7981\";\n\n\tchosen {\n\t\tbootargs = \"root=PARTLABEL=rootfs rootwait\";\n\t};\n};\n\n&gmac0 {\n\tnvmem-cells = <&macaddr_factory_2a>;\n\tnvmem-cell-names = \"mac-address\";\n};\n\n&gmac1 {\n\tnvmem-cells = <&macaddr_factory_24>;\n\tnvmem-cell-names = \"mac-address\";\n};\n\n&mmc0 {\n\tbus-width = <8>;\n\tcap-mmc-highspeed;\n\tmax-frequency = <52000000>;\n\tnon-removable;\n\tpinctrl-names = \"default\", \"state_uhs\";\n\tpinctrl-0 = <&mmc0_pins_default>;\n\tpinctrl-1 = <&mmc0_pins_uhs>;\n\tvmmc-supply = <&reg_3p3v>;\n\t#address-cells = <1>;\n\t#size-cells = <0>;\n\tstatus = \"okay\";\n\n\tcard@0 {\n\t\tcompatible = \"mmc-card\";\n\t\treg = <0>;\n\n\t\tblock {\n\t\t\tcompatible = \"block-device\";\n\n\t\t\tpartitions {\n\t\t\t\tblock-partition-factory {\n\t\t\t\t\tpartname = \"factory\";\n\n\t\t\t\t\tnvmem-layout {\n\t\t\t\t\t\tcompatible = \"fixed-layout\";\n\t\t\t\t\t\t#address-cells = <1>;\n\t\t\t\t\t\t#size-cells = <1>;\n\n\t\t\t\t\t\teeprom_factory_0: eeprom@0 {\n\t\t\t\t\t\t\treg = <0x0 0x1000>;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tmacaddr_factory_24: macaddr@24 {\n\t\t\t\t\t\t\treg = <0x24 0x6>;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tmacaddr_factory_2a: macaddr@2a {\n\t\t\t\t\t\t\treg = <0x2a 0x6>;\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\n&pio {\n\tmmc0_pins_default: mmc0-pins {\n\t\tmux {\n\t\t\tfunction = \"flash\";\n\t\t\tgroups = \"emmc_45\";\n\t\t};\n\t};\n\n\tmmc0_pins_uhs: mmc0-uhs-pins {\n\t\tmux {\n\t\t\tfunction = \"flash\";\n\t\t\tgroups = \"emmc_45\";\n\t\t};\n\t};\n};\n"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7981b-cmcc-xr30.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n\n/dts-v1/;\n#include \"mt7981b-cmcc-xr30.dtsi\"\n\n/ {\n\tmodel = \"CMCC XR30\";\n\tcompatible = \"cmcc,xr30\", \"mediatek,mt7981\";\n\n\taliases {\n\t\tlabel-mac-device = &gmac1;\n\t};\n};\n\n&gmac0 {\n\tnvmem-cells = <&macaddr_factory_2a>;\n\tnvmem-cell-names = \"mac-address\";\n};\n\n&gmac1 {\n\tnvmem-cells = <&macaddr_factory_24>;\n\tnvmem-cell-names = \"mac-address\";\n};\n\n&spi0 {\n\tpinctrl-names = \"default\";\n\tpinctrl-0 = <&spi0_flash_pins>;\n\tstatus = \"okay\";\n\n\tflash@0 {\n\t\t#address-cells = <1>;\n\t\t#size-cells = <1>;\n\t\tcompatible = \"spi-nand\";\n\t\treg = <0>;\n\n\t\tspi-max-frequency = <52000000>;\n\t\tspi-tx-bus-width = <4>;\n\t\tspi-rx-bus-width = <4>;\n\t\tmediatek,nmbm;\n\t\tmediatek,bmt-max-ratio = <1>;\n\t\tmediatek,bmt-max-reserved-blocks = <64>;\n\n\t\tpartitions {\n\t\t\tcompatible = \"fixed-partitions\";\n\t\t\t#address-cells = <1>;\n\t\t\t#size-cells = <1>;\n\n\t\t\tpartition@0 {\n\t\t\t\tlabel = \"bl2\";\n\t\t\t\treg = <0x00000 0x0100000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@100000 {\n\t\t\t\tlabel = \"u-boot-env\";\n\t\t\t\treg = <0x100000 0x80000>;\n\t\t\t};\n\n\t\t\tfactory: partition@180000 {\n\t\t\t\tlabel = \"factory\";\n\t\t\t\treg = <0x180000 0x200000>;\n\t\t\t\tread-only;\n\n\t\t\t\tnvmem-layout {\n\t\t\t\t\tcompatible = \"fixed-layout\";\n\t\t\t\t\t#address-cells = <1>;\n\t\t\t\t\t#size-cells = <1>;\n\n\t\t\t\t\tmacaddr_factory_24: macaddr@24 {\n\t\t\t\t\t\treg = <0x24 0x6>;\n\t\t\t\t\t};\n\n\t\t\t\t\tmacaddr_factory_2a: macaddr@2a {\n\t\t\t\t\t\treg = <0x2a 0x6>;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tpartition@380000 {\n\t\t\t\tlabel = \"fip\";\n\t\t\t\treg = <0x380000 0x200000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@580000 {\n\t\t\t\tlabel = \"ubi\";\n\t\t\t\treg = <0x580000 0x7200000>;\n\t\t\t};\n\t\t};\n\t};\n};\n\n&pio {\n\tspi0_flash_pins: spi0-pins {\n\t\tmux {\n\t\t\tfunction = \"spi\";\n\t\t\tgroups = \"spi0\", \"spi0_wp_hold\";\n\t\t};\n\n\t\tconf-pu {\n\t\t\tpins = \"SPI0_CS\", \"SPI0_HOLD\", \"SPI0_WP\";\n\t\t\tdrive-strength = <8>;\n\t\t\tmediatek,pull-up-adv = <0>; /* bias-disable */\n\t\t};\n\n\t\tconf-pd {\n\t\t\tpins = \"SPI0_CLK\", \"SPI0_MOSI\", \"SPI0_MISO\";\n\t\t\tdrive-strength = <8>;\n\t\t\tmediatek,pull-up-adv = <0>; /* bias-disable */\n\t\t};\n\t};\n};\n\n&wifi {\n\tmediatek,mtd-eeprom = <&factory 0x0>;\n};\n"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7981b-cmcc-xr30.dtsi",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n/*\n * Copyright (C) 2023 Tianling Shen <cnsztl@immortalwrt.org>\n */\n\n/dts-v1/;\n#include <dt-bindings/gpio/gpio.h>\n#include <dt-bindings/input/input.h>\n\n#include \"mt7981b.dtsi\"\n\n/ {\n\taliases {\n\t\tled-boot = &red_led;\n\t\tled-failsafe = &red_led;\n\t\tled-running = &white_led;\n\t\tled-upgrade = &red_led;\n\t\tserial0 = &uart0;\n\t};\n\n\tchosen: chosen {\n\t\tstdout-path = \"serial0:115200n8\";\n\t};\n\n\tmemory {\n\t\treg = <0 0x40000000 0 0x20000000>;\n\t};\n\n\tgpio-keys {\n\t\tcompatible = \"gpio-keys\";\n\n\t\tbutton-reset {\n\t\t\tlabel = \"reset\";\n\t\t\tlinux,code = <KEY_RESTART>;\n\t\t\tgpios = <&pio 1 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tbutton-mesh {\n\t\t\tlabel = \"mesh\";\n\t\t\tlinux,code = <BTN_9>;\n\t\t\tlinux,input-type = <EV_SW>;\n\t\t\tgpios = <&pio 0 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n\n\tleds {\n\t\tcompatible = \"gpio-leds\";\n\n\t\tred_led: red {\n\t\t\tlabel = \"red:status\";\n\t\t\tgpios = <&pio 35 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\twhite_led: white {\n\t\t\tlabel = \"white:status\";\n\t\t\tgpios = <&pio 34 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n};\n\n&eth {\n\tstatus = \"okay\";\n\n\tgmac0: mac@0 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <0>;\n\t\tphy-mode = \"2500base-x\";\n\n\t\tfixed-link {\n\t\t\tspeed = <2500>;\n\t\t\tfull-duplex;\n\t\t\tpause;\n\t\t};\n\t};\n\n\tgmac1: mac@1 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <1>;\n\t\tphy-mode = \"gmii\";\n\t\tphy-handle = <&int_gbe_phy>;\n\t};\n};\n\n&mdio_bus {\n\tswitch: switch@1f {\n\t\tcompatible = \"mediatek,mt7531\";\n\t\treg = <31>;\n\t\treset-gpios = <&pio 39 GPIO_ACTIVE_HIGH>;\n\t\tinterrupt-controller;\n\t\t#interrupt-cells = <1>;\n\t\tinterrupt-parent = <&pio>;\n\t\tinterrupts = <38 IRQ_TYPE_LEVEL_HIGH>;\n\t};\n};\n\n&switch {\n\tports {\n\t\t#address-cells = <1>;\n\t\t#size-cells = <0>;\n\n\t\tport@0 {\n\t\t\treg = <0>;\n\t\t\tlabel = \"lan3\";\n\t\t};\n\n\t\tport@1 {\n\t\t\treg = <1>;\n\t\t\tlabel = \"lan2\";\n\t\t};\n\n\t\tport@2 {\n\t\t\treg = <2>;\n\t\t\tlabel = \"lan1\";\n\t\t};\n\n\t\tport@6 {\n\t\t\treg = <6>;\n\t\t\tethernet = <&gmac0>;\n\t\t\tphy-mode = \"2500base-x\";\n\n\t\t\tfixed-link {\n\t\t\t\tspeed = <2500>;\n\t\t\t\tfull-duplex;\n\t\t\t\tpause;\n\t\t\t};\n\t\t};\n\t};\n};\n\n&uart0 {\n\tstatus = \"okay\";\n};\n\n&usb_phy {\n\tstatus = \"okay\";\n};\n\n&watchdog {\n\tstatus = \"okay\";\n};\n\n&wifi {\n\tstatus = \"okay\";\n};\n\n&xhci {\n\tstatus = \"okay\";\n};\n"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7981b-cudy-tr3000-mod.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n\n/dts-v1/;\n#include \"mt7981b-cudy-tr3000-v1.dts\"\n\n/ {\n\tmodel = \"Cudy TR3000 v1 112M\";\n\tcompatible = \"cudy,tr3000-mod\", \"mediatek,mt7981\";\n};\n\n&spi0 {\n\tflash@0 {\n\t\tpartitions {\n\t\t\tpartition@5c0000 {\n\t\t\t\tlabel = \"ubi\";\n\t\t\t\treg = <0x5c0000 0x7000000>;\n\t\t\t};\n\t\t};\n\t};\n};\n\n"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7981b-ikuai-q3000.dts",
    "content": "/dts-v1/;\n#include \"mt7981b.dtsi\"\n/ {\n\tcompatible = \"ikuai,q3000\", \"mediatek,mt7981-spim-snand-rfb\";\n\tmodel = \"q3000\";\n\n\taliases {\n\t\tled-boot = &red_led;\n\t\tled-failsafe = &red_led;\n\t\tled-running = &green_led;\n\t\tled-upgrade = &blue_led;\n\t};\n\n\tchosen {\n\t\tbootargs = \"console=ttyS0,115200n1 loglevel=8 earlycon=uart8250,mmio32,0x11002000 clk_ignore_unused\";\n\t};\n\n\tgpio-keys {\n\t\tcompatible = \"gpio-keys\";\n\t\treset {\n\t\t\tlabel = \"reset\";\n\t\t\tlinux,code = <KEY_RESTART>;\n\t\t\tgpios = <&pio 1 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\twps {\n\t\t\tlabel = \"wps\";\n\t\t\tlinux,code = <KEY_WPS_BUTTON>;\n\t\t\tgpios = <&pio 0 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n\n\tleds {\n\t\tcompatible = \"gpio-leds\";\n\n\t\tgreen_led: green {\n\t\t\tlabel = \"q3000:green\";\n\t\t\tgpios = <&pio 11 1>;\n\t\t};\n\n\t\tred_led: red {\n\t\t\tlabel = \"q3000:red\";\n\t\t\tgpios = <&pio 10 1>;\n\t\t};\n\n\t\tblue_led: blue {\n\t\t\tlabel = \"q3000:blue\";\n\t\t\tgpios = <&pio 12 1>;\n\t\t};\n\t};\n\n\tnmbm_spim_nand {\n\t\tcompatible = \"generic,nmbm\";\n\n\t\t#address-cells = <1>;\n\t\t#size-cells = <1>;\n\n\t\tlower-mtd-device = <&spi_nand>;\n\t\tforced-create;\n\n\t\tpartitions {\n\t\t\tcompatible = \"fixed-partitions\";\n\t\t\t#address-cells = <1>;\n\t\t\t#size-cells = <1>;\n\n\t\t\tpartition@0 {\n\t\t\t\tlabel = \"BL2\";\n\t\t\t\treg = <0x00000 0x0100000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@100000 {\n\t\t\t\tlabel = \"u-boot-env\";\n\t\t\t\treg = <0x0100000 0x0080000>;\n\t\t\t};\n\n\t\t\tpartition@180000 {\n\t\t\t\tlabel = \"Factory\";\n\t\t\t\treg = <0x180000 0x0200000>;\n\t\t\t};\n\n\t\t\tpartition@380000 {\n\t\t\t\tlabel = \"FIP\";\n\t\t\t\treg = <0x380000 0x0200000>;\n\t\t\t};\n\n\t\t\tpartition@580000 {\n\t\t\t\tlabel = \"ubi\";\n\t\t\t\treg = <0x580000 0x4000000>;\n\t\t\t};\n\t\t};\n\t};\n\n\tsound_wm8960 {\n\t\tcompatible = \"mediatek,mt79xx-wm8960-machine\";\n\t\tmediatek,platform = <&afe>;\n\t\taudio-routing = \"Headphone\", \"HP_L\",\n\t\t\t\t\"Headphone\", \"HP_R\",\n\t\t\t\t\"LINPUT1\", \"AMIC\",\n\t\t\t\t\"RINPUT1\", \"AMIC\";\n\t\tmediatek,audio-codec = <&wm8960>;\n\t\tstatus = \"disabled\";\n\t};\n\n\tsound_si3218x {\n\t\tcompatible = \"mediatek,mt79xx-si3218x-machine\";\n\t\tmediatek,platform = <&afe>;\n\t\tmediatek,ext-codec = <&proslic_spi>;\n\t\tstatus = \"disabled\";\n\t};\n};\n\n&afe {\n\tpinctrl-names = \"default\";\n\tpinctrl-0 = <&pcm_pins>;\n\tstatus = \"okay\";\n};\n\n&i2c0 {\n\tpinctrl-names = \"default\";\n\tpinctrl-0 = <&i2c_pins>;\n\tstatus = \"disabled\";\n\n\twm8960: wm8960@1a {\n\t\tcompatible = \"wlf,wm8960\";\n\t\treg = <0x1a>;\n\t};\n};\n\n&uart0 {\n\tstatus = \"okay\";\n};\n\n&watchdog {\n\tstatus = \"okay\";\n};\n\n&eth {\n\tstatus = \"okay\";\n\n\tgmac0: mac@0 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <0>;\n\t\tphy-mode = \"2500base-x\";\n\n\t\tfixed-link {\n\t\t\tspeed = <2500>;\n\t\t\tfull-duplex;\n\t\t\tpause;\n\t\t};\n\t};\n\n\n\tmdio: mdio-bus {\n\t\t#address-cells = <1>;\n\t\t#size-cells = <0>;\n\n\t\tswitch@0 {\n\t\t\tcompatible = \"mediatek,mt7531\";\n\t\t\treg = <31>;\n\t\t\treset-gpios = <&pio 39 0>;\n\n\t\t\tports {\n\t\t\t\t#address-cells = <1>;\n\t\t\t\t#size-cells = <0>;\n\n\t\t\t\tport@0 {\n\t\t\t\t\treg = <0>;\n\t\t\t\t\tlabel = \"lan1\";\n\t\t\t\t};\n\n\t\t\t\tport@1 {\n\t\t\t\t\treg = <1>;\n\t\t\t\t\tlabel = \"lan2\";\n\t\t\t\t};\n\n\t\t\t\tport@2 {\n\t\t\t\t\treg = <2>;\n\t\t\t\t\tlabel = \"lan3\";\n\t\t\t\t};\n\n\t\t\t\tport@3 {\n\t\t\t\t\treg = <3>;\n\t\t\t\t\tlabel = \"wan\";\n\t\t\t\t};\n\n\t\t\t\tport@6 {\n\t\t\t\t\treg = <6>;\n\t\t\t\t\tlabel = \"cpu\";\n\t\t\t\t\tethernet = <&gmac0>;\n\t\t\t\t\tphy-mode = \"2500base-x\";\n\n\t\t\t\t\tfixed-link {\n\t\t\t\t\t\tspeed = <2500>;\n\t\t\t\t\t\tfull-duplex;\n\t\t\t\t\t\tpause;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\n&spi0 {\n\tpinctrl-names = \"default\";\n\tpinctrl-0 = <&spi0_flash_pins>;\n\tstatus = \"okay\";\n\tspi_nand: spi_nand@0 {\n\t\t#address-cells = <1>;\n\t\t#size-cells = <1>;\n\t\tcompatible = \"spi-nand\";\n\t\treg = <0>;\n\t\tspi-max-frequency = <52000000>;\n\t\tspi-tx-bus-width = <4>;\n\t\tspi-rx-bus-widt = <4>;\n\t};\n};\n\n&spi1 {\n\tpinctrl-names = \"default\";\n\tpinctrl-0 = <&spic_pins>;\n\tstatus = \"okay\";\n\n\tproslic_spi: proslic_spi@0 {\n\t\tcompatible = \"silabs,proslic_spi\";\n\t\treg = <0>;\n\t\tspi-max-frequency = <10000000>;\n\t\tspi-cpha = <1>;\n\t\tspi-cpol = <1>;\n\t\tchannel_count = <1>;\n\t\tdebug_level = <4>;       /* 1 = TRC, 2 = DBG, 4 = ERR */\n\t\treset_gpio = <&pio 15 0>;\n\t\tig,enable-spi = <1>;     /* 1: Enable, 0: Disable */\n\t};\n};\n\n&pio {\n\ti2c_pins: i2c-pins-g0 {\n\t\tmux {\n\t\t\tfunction = \"i2c\";\n\t\t\tgroups = \"i2c0_0\";\n\t\t};\n\t};\n\n\tpcm_pins: pcm-pins-g0 {\n\t\tmux {\n\t\t\tfunction = \"pcm\";\n\t\t\tgroups = \"pcm\";\n\t\t};\n\t};\n\n\tpwm0_pin: pwm0-pin-g0 {\n\t\tmux {\n\t\t\tfunction = \"pwm\";\n\t\t\tgroups = \"pwm0_0\";\n\t\t};\n\t};\n\n\tpwm1_pin: pwm1-pin-g0 {\n\t\tmux {\n\t\t\tfunction = \"pwm\";\n\t\t\tgroups = \"pwm1_0\";\n\t\t};\n\t};\n\n\tpwm2_pin: pwm2-pin {\n\t\tmux {\n\t\t\tfunction = \"pwm\";\n\t\t\tgroups = \"pwm2\";\n\t\t};\n\t};\n\n\tspi0_flash_pins: spi0-pins {\n\t\tmux {\n\t\t\tfunction = \"spi\";\n\t\t\tgroups = \"spi0\", \"spi0_wp_hold\";\n\t\t};\n\n\t\tconf-pu {\n\t\t\tpins = \"SPI0_CS\", \"SPI0_HOLD\", \"SPI0_WP\";\n\t\t\tdrive-strength = <MTK_DRIVE_8mA>;\n\t\t\tbias-pull-up = <MTK_PUPD_SET_R1R0_11>;\n\t\t};\n\n\t\tconf-pd {\n\t\t\tpins = \"SPI0_CLK\", \"SPI0_MOSI\", \"SPI0_MISO\";\n\t\t\tdrive-strength = <MTK_DRIVE_8mA>;\n\t\t\tbias-pull-down = <MTK_PUPD_SET_R1R0_11>;\n\t\t};\n\t};\n\n\tspic_pins: spi1-pins {\n\t\tmux {\n\t\t\tfunction = \"spi\";\n\t\t\tgroups = \"spi1_1\";\n\t\t};\n\t};\n\n\tuart1_pins: uart1-pins-g1 {\n\t\tmux {\n\t\t\tfunction = \"uart\";\n\t\t\tgroups = \"uart1_1\";\n\t\t};\n\t};\n\n\tuart2_pins: uart2-pins-g1 {\n\t\tmux {\n\t\t\tfunction = \"uart\";\n\t\t\tgroups = \"uart2_1\";\n\t\t};\n\t};\n};\n\n&xhci {\n\tmediatek,u3p-dis-msk = <0x0>;\n\tphys = <&u2port0 PHY_TYPE_USB2>,\n\t       <&u3port0 PHY_TYPE_USB3>;\n\tstatus = \"okay\";\n};\n"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7981b-konka-komi-a31.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n\n/dts-v1/;\n#include <dt-bindings/gpio/gpio.h>\n#include <dt-bindings/input/input.h>\n#include <dt-bindings/leds/common.h>\n#include <dt-bindings/pinctrl/mt65xx.h>\n\n#include \"mt7981b.dtsi\"\n\n/ {\n\tmodel = \"Konka KOMI A31\";\n\tcompatible = \"konka,komi-a31\", \"mediatek,mt7981\";\n\n\taliases {\n\t\tled-boot = &red_led;\n\t\tled-failsafe = &red_led;\n\t\tled-running = &green_led;\n\t\tled-upgrade = &green_led;\n\t\tlabel-mac-device = &gmac1;\n\t\tserial0 = &uart0;\n\t};\n\n\tchosen {\n\t\tstdout-path = \"serial0:115200n8\";\n\t};\n\n\tmemory@40000000 {\n\t\treg = <0 0x40000000 0 0x10000000>;\n\t\tdevice_type = \"memory\";\n\t};\n\n\tgpio-keys {\n\t\tcompatible = \"gpio-keys\";\n\n\t\tbutton-mesh {\n\t\t\tlabel = \"mesh\";\n\t\t\tlinux,code = <BTN_9>;\n\t\t\tlinux,input-type = <EV_SW>;\n\t\t\tgpios = <&pio 0 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tbutton-reset {\n\t\t\tlabel = \"reset\";\n\t\t\tlinux,code = <KEY_RESTART>;\n\t\t\tgpios = <&pio 1 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n\n\tgpio-leds {\n\t\tcompatible = \"gpio-leds\";\n\n\t\tgreen_led: led-0 {\n\t\t\tcolor = <LED_COLOR_ID_GREEN>;\n\t\t\tfunction = LED_FUNCTION_STATUS;\n\t\t\tgpios = <&pio 8 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tled-1 {\n\t\t\tcolor = <LED_COLOR_ID_BLUE>;\n\t\t\tfunction = LED_FUNCTION_STATUS;\n\t\t\tgpios = <&pio 13 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tred_led: led-2 {\n\t\t\tcolor = <LED_COLOR_ID_RED>;\n\t\t\tfunction = LED_FUNCTION_STATUS;\n\t\t\tgpios = <&pio 34 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n};\n\n&eth {\n\tpinctrl-names = \"default\";\n\tpinctrl-0 = <&mdio_pins>;\n\tstatus = \"okay\";\n\n\tgmac0: mac@0 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <0>;\n\t\tphy-mode = \"2500base-x\";\n\n\t\tnvmem-cells = <&macaddr_factory_2a 0>;\n\t\tnvmem-cell-names = \"mac-address\";\n\n\t\tfixed-link {\n\t\t\tspeed = <2500>;\n\t\t\tfull-duplex;\n\t\t\tpause;\n\t\t};\n\t};\n\n\tgmac1: mac@1 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <1>;\n\t\tphy-mode = \"gmii\";\n\t\tphy-handle = <&int_gbe_phy>;\n\n\t\tnvmem-cells = <&macaddr_factory_24 0>;\n\t\tnvmem-cell-names = \"mac-address\";\n\t};\n};\n\n&mdio_bus {\n\tswitch: switch@1f {\n\t\tcompatible = \"mediatek,mt7531\";\n\t\treg = <31>;\n\t\treset-gpios = <&pio 39 GPIO_ACTIVE_HIGH>;\n\t\tinterrupt-controller;\n\t\t#interrupt-cells = <1>;\n\t\tinterrupt-parent = <&pio>;\n\t\tinterrupts = <38 IRQ_TYPE_LEVEL_HIGH>;\n\t};\n};\n\n&pio {\n\tspi0_flash_pins: spi0-pins {\n\t\tmux {\n\t\t\tfunction = \"spi\";\n\t\t\tgroups = \"spi0\", \"spi0_wp_hold\";\n\t\t};\n\n\t\tconf-pu {\n\t\t\tpins = \"SPI0_CS\", \"SPI0_HOLD\", \"SPI0_WP\";\n\t\t\tdrive-strength = <MTK_DRIVE_8mA>;\n\t\t\tbias-disable; /* bias-disable */\n\t\t};\n\n\t\tconf-pd {\n\t\t\tpins = \"SPI0_CLK\", \"SPI0_MOSI\", \"SPI0_MISO\";\n\t\t\tdrive-strength = <MTK_DRIVE_8mA>;\n\t\t\tbias-disable; /* bias-disable */\n\t\t};\n\t};\n};\n\n&spi0 {\n\tpinctrl-names = \"default\";\n\tpinctrl-0 = <&spi0_flash_pins>;\n\tstatus = \"okay\";\n\n\tspi_nand: flash@0 {\n\t\t#address-cells = <1>;\n\t\t#size-cells = <1>;\n\t\tcompatible = \"spi-nand\";\n\t\treg = <0>;\n\n\t\tspi-max-frequency = <52000000>;\n\t\tspi-tx-bus-width = <4>;\n\t\tspi-rx-bus-width = <4>;\n\n\t\tmediatek,nmbm;\n\t\tmediatek,bmt-max-ratio = <1>;\n\t\tmediatek,bmt-max-reserved-blocks = <64>;\n\n\t\tpartitions {\n\t\t\tcompatible = \"fixed-partitions\";\n\t\t\t#address-cells = <1>;\n\t\t\t#size-cells = <1>;\n\n\t\t\tpartition@0 {\n\t\t\t\tlabel = \"bl2\";\n\t\t\t\treg = <0x0 0x100000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@100000 {\n\t\t\t\tlabel = \"u-boot-env\";\n\t\t\t\treg = <0x100000 0x80000>;\n\t\t\t};\n\n\t\t\tpartition@180000 {\n\t\t\t\tlabel = \"factory\";\n\t\t\t\treg = <0x180000 0x200000>;\n\t\t\t\tread-only;\n\n\t\t\t\tnvmem-layout {\n\t\t\t\t\tcompatible = \"fixed-layout\";\n\t\t\t\t\t#address-cells = <1>;\n\t\t\t\t\t#size-cells = <1>;\n\n\t\t\t\t\teeprom_factory_0: eeprom@0 {\n\t\t\t\t\t\treg = <0x0 0x1000>;\n\t\t\t\t\t};\n\n\t\t\t\t\tmacaddr_factory_24: macaddr@24 {\n\t\t\t\t\t\tcompatible = \"mac-base\";\n\t\t\t\t\t\treg = <0x24 0x6>;\n\t\t\t\t\t\t#nvmem-cell-cells = <1>;\n\t\t\t\t\t};\n\n\t\t\t\t\tmacaddr_factory_2a: macaddr@2a {\n\t\t\t\t\t\tcompatible = \"mac-base\";\n\t\t\t\t\t\treg = <0x2a 0x6>;\n\t\t\t\t\t\t#nvmem-cell-cells = <1>;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tpartition@380000 {\n\t\t\t\tlabel = \"fip\";\n\t\t\t\treg = <0x380000 0x200000>;\n\t\t\t};\n\n\t\t\tpartition@580000 {\n\t\t\t\tcompatible = \"linux,ubi\";\n\t\t\t\tlabel = \"ubi\";\n\t\t\t\treg = <0x580000 0x7000000>;\n\t\t\t};\n\t\t};\n\t};\n};\n\n&switch {\n\tports {\n\t\t#address-cells = <1>;\n\t\t#size-cells = <0>;\n\n\t\tport@0 {\n\t\t\treg = <0>;\n\t\t\tlabel = \"lan1\";\n\t\t};\n\n\t\tport@1 {\n\t\t\treg = <1>;\n\t\t\tlabel = \"lan2\";\n\t\t};\n\n\t\tport@2 {\n\t\t\treg = <2>;\n\t\t\tlabel = \"lan3\";\n\t\t};\n\n\t\tport@6 {\n\t\t\treg = <6>;\n\t\t\tethernet = <&gmac0>;\n\t\t\tphy-mode = \"2500base-x\";\n\n\t\t\tfixed-link {\n\t\t\t\tspeed = <2500>;\n\t\t\t\tfull-duplex;\n\t\t\t\tpause;\n\t\t\t};\n\t\t};\n\t};\n};\n\n&uart0 {\n\tstatus = \"okay\";\n};\n\n&watchdog {\n\tstatus = \"okay\";\n};\n\n&wifi {\n\t#address-cells = <1>;\n\t#size-cells = <0>;\n\tnvmem-cells = <&eeprom_factory_0>;\n\tnvmem-cell-names = \"eeprom\";\n\tstatus = \"okay\";\n\n\tband@0 {\n\t\treg = <0>;\n\t\tnvmem-cells = <&macaddr_factory_2a 1>;\n\t\tnvmem-cell-names = \"mac-address\";\n\t};\n\n\tband@1 {\n\t\treg = <1>;\n\t\tnvmem-cells = <&macaddr_factory_2a 2>;\n\t\tnvmem-cell-names = \"mac-address\";\n\t};\n};\n"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7981b-newland-nl-wr8103.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n\n/dts-v1/;\n#include <dt-bindings/gpio/gpio.h>\n#include <dt-bindings/input/input.h>\n#include <dt-bindings/leds/common.h>\n#include \"mt7981b.dtsi\"\n\n/ {\n\tmodel = \"Newland NL-WR8103\";\n\tcompatible = \"newland,nl-wr8103\", \"mediatek,mt7981\";\n\n\taliases {\n\t\tled-boot = &red_led;\n\t\tled-failsafe = &red_led;\n\t\tled-running = &green_led;\n\t\tled-upgrade = &green_led;\n\t\tlabel-mac-device = &gmac1;\n\t\tserial0 = &uart0;\n\t};\n\n\tchosen {\n\t\tstdout-path = \"serial0:115200n8\";\n\t};\n\n\tmemory@40000000 {\n\t\treg = <0 0x40000000 0 0x10000000>;\n\t};\n\n\tgpio-keys {\n\t\tcompatible = \"gpio-keys\";\n\n\t\tbutton-mesh {\n\t\t\tlabel = \"mesh\";\n\t\t\tlinux,code = <BTN_9>;\n\t\t\tlinux,input-type = <EV_SW>;\n\t\t\tgpios = <&pio 0 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tbutton-reset {\n\t\t\tlabel = \"reset\";\n\t\t\tlinux,code = <KEY_RESTART>;\n\t\t\tgpios = <&pio 1 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n\n\tgpio-leds {\n\t\tcompatible = \"gpio-leds\";\n\n\t\tgreen_led: led-0 {\n\t\t\tcolor = <LED_COLOR_ID_GREEN>;\n\t\t\tfunction = LED_FUNCTION_STATUS;\n\t\t\tgpios = <&pio 11 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tled-1 {\n\t\t\tcolor = <LED_COLOR_ID_BLUE>;\n\t\t\tfunction = LED_FUNCTION_STATUS;\n\t\t\tgpios = <&pio 12 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tred_led: led-2 {\n\t\t\tcolor = <LED_COLOR_ID_RED>;\n\t\t\tfunction = LED_FUNCTION_STATUS;\n\t\t\tgpios = <&pio 10 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n};\n\n&eth {\n\tpinctrl-names = \"default\";\n\tpinctrl-0 = <&mdio_pins>;\n\tstatus = \"okay\";\n\n\tgmac0: mac@0 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <0>;\n\t\tphy-mode = \"2500base-x\";\n\n\t\tnvmem-cells = <&macaddr_factory_4 0>;\n\t\tnvmem-cell-names = \"mac-address\";\n\n\t\tfixed-link {\n\t\t\tspeed = <2500>;\n\t\t\tfull-duplex;\n\t\t\tpause;\n\t\t};\n\t};\n\n\tgmac1: mac@1 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <1>;\n\t\tphy-mode = \"gmii\";\n\t\tphy-handle = <&int_gbe_phy>;\n\n\t\tnvmem-cells = <&macaddr_factory_4 2>;\n\t\tnvmem-cell-names = \"mac-address\";\n\t};\n};\n\n&mdio_bus {\n\tswitch: switch@1f {\n\t\tcompatible = \"mediatek,mt7531\";\n\t\treg = <31>;\n\t\treset-gpios = <&pio 39 GPIO_ACTIVE_HIGH>;\n\t\tinterrupt-controller;\n\t\t#interrupt-cells = <1>;\n\t\tinterrupt-parent = <&pio>;\n\t\tinterrupts = <38 IRQ_TYPE_LEVEL_HIGH>;\n\t};\n};\n\n&pio {\n\tspi0_flash_pins: spi0-pins {\n\t\tmux {\n\t\t\tfunction = \"spi\";\n\t\t\tgroups = \"spi0\", \"spi0_wp_hold\";\n\t\t};\n\n\t\tconf-pu {\n\t\t\tpins = \"SPI0_CS\", \"SPI0_HOLD\", \"SPI0_WP\";\n\t\t\tdrive-strength = <MTK_DRIVE_8mA>;\n\t\t\tbias-pull-up = <MTK_PUPD_SET_R1R0_11>;\n\t\t};\n\n\t\tconf-pd {\n\t\t\tpins = \"SPI0_CLK\", \"SPI0_MOSI\", \"SPI0_MISO\";\n\t\t\tdrive-strength = <MTK_DRIVE_8mA>;\n\t\t\tbias-pull-down = <MTK_PUPD_SET_R1R0_11>;\n\t\t};\n\t};\n};\n\n&spi0 {\n\tpinctrl-names = \"default\";\n\tpinctrl-0 = <&spi0_flash_pins>;\n\tstatus = \"okay\";\n\n\tspi_nand: flash@0 {\n\t\t#address-cells = <1>;\n\t\t#size-cells = <1>;\n\t\tcompatible = \"spi-nand\";\n\t\treg = <0>;\n\n\t\tspi-max-frequency = <52000000>;\n\t\tspi-tx-bus-width = <4>;\n\t\tspi-rx-bus-width = <4>;\n                mediatek,nmbm;\n                mediatek,bmt-max-ratio = <1>;\n                mediatek,bmt-max-reserved-blocks = <64>;\n\n\t\tpartitions {\n\t\t\tcompatible = \"fixed-partitions\";\n\t\t\t#address-cells = <1>;\n\t\t\t#size-cells = <1>;\n\n\t\t\tpartition@0 {\n\t\t\t\tlabel = \"BL2\";\n\t\t\t\treg = <0x0 0x100000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@100000 {\n\t\t\t\tlabel = \"u-boot-env\";\n\t\t\t\treg = <0x100000 0x80000>;\n\t\t\t};\n\n\t\t\tpartition@180000 {\n\t\t\t\tlabel = \"Factory\";\n\t\t\t\treg = <0x180000 0x200000>;\n\t\t\t\tread-only;\n\n\t\t\t\tnvmem-layout {\n\t\t\t\t\tcompatible = \"fixed-layout\";\n\t\t\t\t\t#address-cells = <1>;\n\t\t\t\t\t#size-cells = <1>;\n\n\t\t\t\t\teeprom_factory_0: eeprom@0 {\n\t\t\t\t\t\treg = <0x0 0x1000>;\n\t\t\t\t\t};\n\n\t\t\t\t\tmacaddr_factory_4: macaddr@4 {\n\t\t\t\t\t\tcompatible = \"mac-base\";\n\t\t\t\t\t\treg = <0x4 0x6>;\n\t\t\t\t\t\t#nvmem-cell-cells = <1>;\n\t\t\t\t\t};\n\n\t\t\t\t\tmacaddr_factory_a: macaddr@a {\n\t\t\t\t\t\tcompatible = \"mac-base\";\n\t\t\t\t\t\treg = <0xa 0x6>;\n\t\t\t\t\t\t#nvmem-cell-cells = <1>;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tpartition@380000 {\n\t\t\t\tlabel = \"FIP\";\n\t\t\t\treg = <0x380000 0x200000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@580000 {\n\t\t\t\tlabel = \"ubi\";\n\t\t\t\treg = <0x580000 0x7200000>;\n\t\t\t};\n\t\t};\n\t};\n};\n\n&switch {\n\tports {\n\t\t#address-cells = <1>;\n\t\t#size-cells = <0>;\n\n\t\tport@0 {\n\t\t\treg = <0>;\n\t\t\tlabel = \"lan1\";\n\t\t};\n\n\t\tport@1 {\n\t\t\treg = <1>;\n\t\t\tlabel = \"lan2\";\n\t\t};\n\n\t\tport@2 {\n\t\t\treg = <2>;\n\t\t\tlabel = \"lan3\";\n\t\t};\n\n\t\tport@6 {\n\t\t\treg = <6>;\n\t\t\tethernet = <&gmac0>;\n\t\t\tphy-mode = \"2500base-x\";\n\n\t\t\tfixed-link {\n\t\t\t\tspeed = <2500>;\n\t\t\t\tfull-duplex;\n\t\t\t\tpause;\n\t\t\t};\n\t\t};\n\t};\n};\n\n&uart0 {\n\tstatus = \"okay\";\n};\n\n&watchdog {\n\tstatus = \"okay\";\n};\n\n&wifi {\n\tnvmem-cells = <&eeprom_factory_0>;\n\tnvmem-cell-names = \"eeprom\";\n\tstatus = \"okay\";\n};\n"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7981b-nradio-c8-660.dts",
    "content": "/dts-v1/;\n\n#include \"mt7981b.dtsi\"\n\n/ {\n\tmodel = \"NRadio C8-660\";\n\tcompatible = \"nradio,c8-660\", \"mediatek,mt7981\";\n\n\taliases {\n\t\tled-boot = &status_blue;\n\t\tled-failsafe = &status_blue;\n\t\tled-running = &status_blue;\n\t\tled-upgrade = &status_blue;\n\t\tserial0 = &uart0;\n\t};\n\n\tchosen {\n\t\tstdout-path = \"serial0:115200n8\";\n\t};\n\n\tgpio-keys {\n\t\tcompatible = \"gpio-keys\";\n\n\t\treset {\n\t\t\tlabel = \"reset\";\n\t\t\tlinux,code = <KEY_RESTART>;\n\t\t\tgpios = <&pio 1 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\twps {\n\t\t\tlabel = \"wps\";\n\t\t\tlinux,code = <KEY_WPS_BUTTON>;\n\t\t\tgpios = <&pio 9 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n\n\tgpio-export {\n\t\tcompatible = \"gpio-export\";\n\n\t\tcpepower {\n\t\t\tgpio-export,name = \"cpe-pwr\";\n\t\t\tgpio-export,output = <0>;\n\t\t\tgpios = <&pio 25 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tcpesel0 {\n\t\t\tgpio-export,name = \"cpe-sel0\";\n\t\t\tgpio-export,output = <1>;\n\t\t\tgpios = <&pio 24 GPIO_ACTIVE_HIGH>;\n\t\t};\n\t};\n\n\tgpio-leds {\n\t\tcompatible = \"gpio-leds\";\n\n\t\tstatus_blue: status {\n\t\t\tlabel = \"blue:status\";\n\t\t\tgpios = <&pio 10 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tcmode5 {\n\t\t\tlabel = \"blue:cmode5\";\n\t\t\tgpios = <&pio 11 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tcmode4 {\n\t\t\tlabel = \"blue:cmode4\";\n\t\t\tgpios = <&pio 12 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\twifi {\n\t\t\tlabel = \"blue:wifi\";\n\t\t\tgpios = <&pio 13 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n};\n\n&uart0 {\n\tstatus = \"okay\";\n};\n\n&watchdog {\n\tstatus = \"okay\";\n};\n\n&eth {\n\tstatus = \"okay\";\n\n\tgmac0: mac@0 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <0>;\n\t\tphy-mode = \"2500base-x\";\n\n\t\tfixed-link {\n\t\t\tspeed = <2500>;\n\t\t\tfull-duplex;\n\t\t\tpause;\n\t\t};\n\t};\n\n\tgmac1: mac@1 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <1>;\n\t\tphy-mode = \"2500base-x\";\n\t\tphy-handle = <&phy21>;\n\t};\n};\n\n&mdio_bus {\n\treset-gpios = <&pio 7 GPIO_ACTIVE_LOW>, <&pio 8 GPIO_ACTIVE_LOW>;\n\treset-delay-us = <600>;\n\treset-post-delay-us = <20000>;\n\n\tphy5: ethernet-phy@5 {\n\t\treg = <5>;\n\t\tcompatible = \"ethernet-phy-ieee802.3-c45\";\n\t\tmxl,led-config = <0x3f0 0x330 0x0 0x0>;\n\t};\n\n\tphy21: ethernet-phy@21 {\n\t\treg = <21>;\n\t\tcompatible = \"ethernet-phy-ieee802.3-c45\";\n\t};\n\n\tswitch: switch@1f {\n\t\tcompatible = \"mediatek,mt7531\";\n\t\treg = <31>;\n\t\tdsa,member = <0 0>;\n\t\treset-gpios = <&pio 39 GPIO_ACTIVE_LOW>;\n\t\tinterrupt-controller;\n\t\t#interrupt-cells = <1>;\n\t\tinterrupt-parent = <&pio>;\n\t\tinterrupts = <38 IRQ_TYPE_LEVEL_HIGH>;\n\t};\n};\n\n&switch {\n\tports {\n\t\t#address-cells = <1>;\n\t\t#size-cells = <0>;\n\n\t\tport@1 {\n\t\t\treg = <1>;\n\t\t\tlabel = \"lan1\";\n\t\t};\n\n\t\tport@2 {\n\t\t\treg = <2>;\n\t\t\tlabel = \"lan2\";\n\t\t};\n\n\t\tport@3 {\n\t\t\treg = <3>;\n\t\t\tlabel = \"lan3\";\n\t\t};\n\n\t\tport@5 {\n\t\t\treg = <5>;\n\t\t\tlabel = \"lan4\";\n\t\t\tphy-mode = \"2500base-x\";\n\t\t\tphy-handle = <&phy5>;\n\t\t};\n\n\t\tport@6 {\n\t\t\treg = <6>;\n\t\t\tethernet = <&gmac0>;\n\t\t\tphy-mode = \"2500base-x\";\n\n\t\t\tfixed-link {\n\t\t\t\tspeed = <2500>;\n\t\t\t\tfull-duplex;\n\t\t\t\tpause;\n\t\t\t};\n\t\t};\n\t};\n};\n\n&spi0 {\n\tpinctrl-names = \"default\";\n\tpinctrl-0 = <&spi0_flash_pins>;\n\tstatus = \"okay\";\n\n\tspi_nand: flash@0 {\n\t\t#address-cells = <1>;\n\t\t#size-cells = <1>;\n\t\tcompatible = \"spi-nand\";\n\t\treg = <0>;\n\t\tspi-max-frequency = <52000000>;\n\n\t\tspi-cal-enable;\n\t\tspi-cal-mode = \"read-data\";\n\t\tspi-cal-datalen = <7>;\n\t\tspi-cal-data = /bits/ 8 <0x53 0x50 0x49 0x4E 0x41 0x4E 0x44>;\n\t\tspi-cal-addrlen = <5>;\n\t\tspi-cal-addr = /bits/ 32 <0x0 0x0 0x0 0x0 0x0>;\n\n\t\tspi-tx-bus-width = <4>;\n\t\tspi-rx-bus-width = <4>;\n\t\tmediatek,nmbm;\n\t\tmediatek,bmt-max-ratio = <1>;\n\t\tmediatek,bmt-max-reserved-blocks = <64>;\n\n\t\tpartitions {\n\t\t\tcompatible = \"fixed-partitions\";\n\t\t\t#address-cells = <1>;\n\t\t\t#size-cells = <1>;\n\n\t\t\tpartition@0 {\n\t\t\t\tlabel = \"BL2\";\n\t\t\t\treg = <0x00000 0x0100000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@100000 {\n\t\t\t\tlabel = \"u-boot-env\";\n\t\t\t\treg = <0x0100000 0x0080000>;\n\t\t\t};\n\n\t\t\tfactory: partition@180000 {\n\t\t\t\tlabel = \"Factory\";\n\t\t\t\treg = <0x180000 0x0180000>;\n\t\t\t\tread-only;\n\n\t\t\t\tnvmem-layout {\n\t\t\t\t\tcompatible = \"fixed-layout\";\n\t\t\t\t\t#address-cells = <1>;\n\t\t\t\t\t#size-cells = <1>;\n\n\t\t\t\t\teeprom_factory_0: eeprom@0 {\n\t\t\t\t\t\treg = <0x0 0x1000>;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tpartition@300000 {\n\t\t\t\tlabel = \"bdinfo\";\n\t\t\t\treg = <0x300000 0x0080000>;\n\t\t\t};\n\n\t\t\tpartition@380000 {\n\t\t\t\tlabel = \"FIP\";\n\t\t\t\treg = <0x380000 0x0200000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@580000 {\n\t\t\t\tlabel = \"ubi_oem\";\n\t\t\t\treg = <0x580000 0x4000000>;\n\t\t\t};\n\n\t\t\tpartition@4580000 {\n\t\t\t\tlabel = \"app_data\";\n\t\t\t\treg = <0x4580000 0x1000000>;\n\t\t\t};\n\n\t\t\tpartition@5580000 {\n\t\t\t\tlabel = \"ubi\";\n\t\t\t\treg = <0x5580000 0x18a80000>;\n\t\t\t\tcompatible = \"linux,ubi\";\n\t\t\t};\n\t\t};\n\t};\n};\n\n&pio {\n\tspi0_flash_pins: spi0-pins {\n\t\tmux {\n\t\t\tfunction = \"spi\";\n\t\t\tgroups = \"spi0\", \"spi0_wp_hold\";\n\t\t};\n\t};\n};\n\n&usb_phy {\n\tstatus = \"okay\";\n};\n\n&xhci {\n\tstatus = \"okay\";\n};\n\n&wifi {\n\tnvmem-cells = <&eeprom_factory_0>;\n\tnvmem-cell-names = \"eeprom\";\n\tstatus = \"okay\";\n};\n"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7981b-nradio-c8-668gl.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n\n/dts-v1/;\n\n#include \"mt7981b.dtsi\"\n\n/ {\n\tmodel = \"NRadio C8-668GL\";\n\tcompatible = \"nradio,c8-668gl\", \"mediatek,mt7981\";\n\n\taliases {\n\t\tethernet0 = &gmac0;\n\t\tled-boot = &led_power;\n\t\tled-failsafe = &led_power;\n\t\tled-running = &led_power;\n\t\tled-upgrade = &led_power;\n\t\tserial0 = &uart0;\n\t};\n\n\tchosen {\n\t\tstdout-path = \"serial0:115200n1\";\n\t\t/* If official system version < 1.9.2.n6.c3, use root=PARTLABEL=rootfs */\n\t\tbootargs = \"console=ttyS0,115200n1 root=PARTLABEL=rootfs_2nd rootwait\";\n\t};\n\n\tgpio-keys {\n\t\tcompatible = \"gpio-keys\";\n\n\t\treset {\n\t\t\tlabel = \"reset\";\n\t\t\tlinux,code = <KEY_RESTART>;\n\t\t\tgpios = <&pio 1 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\twps {\n\t\t\tlabel = \"wps\";\n\t\t\tlinux,code = <KEY_WPS_BUTTON>;\n\t\t\tgpios = <&pio 9 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n\n\tgpio-export {\n\t\tcompatible = \"gpio-export\";\n\t\t#size-cells = <0>;\n\n\t\tcpepower {\n\t\t\tgpio-export,name = \"cpe-pwr\";\n\t\t\tgpio-export,output = <0>;\n\t\t\tgpios = <&pio 31 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tcpesel0 {\n\t\t\tgpio-export,name = \"cpe-sel0\";\n\t\t\tgpio-export,output = <1>;\n\t\t\tgpios = <&pio 30 GPIO_ACTIVE_HIGH>;\n\t\t};\n\t};\n\n\tleds {\n\t\tcompatible = \"gpio-leds\";\n\n\t\tled_power: power {\n\t\t\tcolor = <LED_COLOR_ID_BLUE>;\n\t\t\tfunction = LED_FUNCTION_POWER;\n\t\t\tgpios = <&pio 10 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tled-cellular-5g {\n\t\t\tcolor = <LED_COLOR_ID_BLUE>;\n\t\t\tfunction = LED_FUNCTION_INDICATOR;\n\t\t\tfunction-enumerator = <0>;\n\t\t\tgpios = <&pio 11 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tled-cellular-4g {\n\t\t\tcolor = <LED_COLOR_ID_BLUE>;\n\t\t\tfunction = LED_FUNCTION_INDICATOR;\n\t\t\tfunction-enumerator = <1>;\n\t\t\tgpios = <&pio 12 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tled-wifi {\n\t\t\tcolor = <LED_COLOR_ID_BLUE>;\n\t\t\tfunction = LED_FUNCTION_WLAN;\n\t\t\tgpios = <&pio 13 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n};\n\n&uart0 {\n\tstatus = \"okay\";\n};\n\n&watchdog {\n\tstatus = \"okay\";\n};\n\n&mmc0 {\n\tpinctrl-names = \"default\", \"state_uhs\";\n\tpinctrl-0 = <&mmc0_pins_default>;\n\tpinctrl-1 = <&mmc0_pins_uhs>;\n\tbus-width = <8>;\n\tmax-frequency = <52000000>;\n\tcap-mmc-highspeed;\n\tvmmc-supply = <&reg_3p3v>;\n\tnon-removable;\n\tstatus = \"okay\";\n\n\tcard@0 {\n\t\tcompatible = \"mmc-card\";\n\t\treg = <0>;\n\n\t\tblock {\n\t\t\tcompatible = \"block-device\";\n\t\t\tpartitions {\n\t\t\t\tblock-partition-env {\n\t\t\t\t\tpartname = \"u-boot-env\";\n\n\t\t\t\t\tnvmem-layout {\n\t\t\t\t\t\tcompatible = \"u-boot,env\";\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\tblock-partition-factory {\n\t\t\t\t\tpartname = \"factory\";\n\n\t\t\t\t\tnvmem-layout {\n\t\t\t\t\t\tcompatible = \"fixed-layout\";\n\t\t\t\t\t\t#address-cells = <1>;\n\t\t\t\t\t\t#size-cells = <1>;\n\n\t\t\t\t\t\teeprom_factory_0: eeprom@0 {\n\t\t\t\t\t\t\treg = <0x0 0x1000>;\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\n&pio {\n\tmmc0_pins_default: mmc0-pins-default {\n\t\tmux {\n\t\t\tfunction = \"flash\";\n\t\t\tgroups = \"emmc_45\";\n\t\t};\n\t};\n\n\tmmc0_pins_uhs: mmc0-pins-uhs {\n\t\tmux {\n\t\t\tfunction = \"flash\";\n\t\t\tgroups = \"emmc_45\";\n\t\t};\n\t};\n};\n\n&eth {\n\tstatus = \"okay\";\n\n\tgmac0: mac@0 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <0>;\n\t\tphy-mode = \"2500base-x\";\n\n\t\tfixed-link {\n\t\t\tspeed = <2500>;\n\t\t\tfull-duplex;\n\t\t\tpause;\n\t\t};\n\t};\n\n\tgmac1: mac@1 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <1>;\n\t\tphy-mode = \"2500base-x\";\n\t\tphy-handle = <&phy21>;\n\t};\n\n\tmdio: mdio-bus {\n\t\t#address-cells = <1>;\n\t\t#size-cells = <0>;\n\n\t\tphy5: ethernet-phy@5 {\n\t\t\tcompatible = \"ethernet-phy-ieee802.3-c45\";\n\t\t\treg = <5>;\n\t\t\treset-gpios = <&pio 7 GPIO_ACTIVE_LOW>;\n\t\t\treset-assert-us = <600>;\n\t\t\treset-deassert-us = <20000>;\n\t\t};\n\n\t\tphy21: ethernet-phy@21 {\n\t\t\tcompatible = \"ethernet-phy-ieee802.3-c45\";\n\t\t\treg = <21>;\n\t\t\treset-gpios = <&pio 8 GPIO_ACTIVE_LOW>;\n\t\t\treset-assert-us = <600>;\n\t\t\treset-deassert-us = <20000>;\n\t\t};\n\n\t\tswitch@1f {\n\t\t\tcompatible = \"mediatek,mt7531\";\n\t\t\treg = <31>;\n\t\t\treset-gpios = <&pio 39 GPIO_ACTIVE_HIGH>;\n\t\t\tinterrupt-controller;\n\t\t\t#interrupt-cells = <1>;\n\t\t\tinterrupt-parent = <&pio>;\n\t\t\tinterrupts = <38 IRQ_TYPE_LEVEL_HIGH>;\n\n\t\t\tports {\n\t\t\t\t#address-cells = <1>;\n\t\t\t\t#size-cells = <0>;\n\n\t\t\t\tport@1 {\n\t\t\t\t\treg = <1>;\n\t\t\t\t\tlabel = \"lan1\";\n\t\t\t\t};\n\n\t\t\t\tport@2 {\n\t\t\t\t\treg = <2>;\n\t\t\t\t\tlabel = \"lan2\";\n\t\t\t\t};\n\n\t\t\t\tport@3 {\n\t\t\t\t\treg = <3>;\n\t\t\t\t\tlabel = \"lan3\";\n\t\t\t\t};\n\n\t\t\t\tport@5 {\n\t\t\t\t\treg = <5>;\n\t\t\t\t\tlabel = \"lan4\";\n\t\t\t\t\tphy-mode = \"2500base-x\";\n\t\t\t\t\tphy-handle = <&phy5>;\n\t\t\t\t};\n\n\t\t\t\tport@6 {\n\t\t\t\t\treg = <6>;\n\t\t\t\t\tlabel = \"cpu\";\n\t\t\t\t\tethernet = <&gmac0>;\n\t\t\t\t\tphy-mode = \"2500base-x\";\n\n\t\t\t\t\tfixed-link {\n\t\t\t\t\t\tspeed = <2500>;\n\t\t\t\t\t\tfull-duplex;\n\t\t\t\t\t\tpause;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\n&usb_phy {\n\tstatus = \"okay\";\n};\n\n&xhci {\n\tstatus = \"okay\";\n};\n\n&wifi {\n\tnvmem-cells = <&eeprom_factory_0>;\n\tnvmem-cell-names = \"eeprom\";\n\tstatus = \"okay\";\n};\n"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7981b-philips-hy3000.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n/*\n * Copyright (C) 2023 Tianling Shen <cnsztl@immortalwrt.org>\n */\n\n/dts-v1/;\n#include <dt-bindings/gpio/gpio.h>\n#include <dt-bindings/input/input.h>\n#include <dt-bindings/leds/common.h>\n\n#include \"mt7981b.dtsi\"\n\n/ {\n\tmodel = \"Philips-hy3000\";\n\tcompatible = \"philips,hy3000\", \"mediatek,mt7981\";\n\n\taliases {\n\t\tled-boot = &status_red_led;\n\t\tled-failsafe = &status_red_led;\n\t\tled-running = &status_green_led;\n\t\tled-upgrade = &status_red_led;\n\t\tserial0 = &uart0;\n\t};\n\n\tchosen: chosen {\n\t\tbootargs = \"root=PARTLABEL=rootfs rootwait rootfstype=squashfs,f2fs\";\n\t\tstdout-path = \"serial0:115200n8\";\n\t};\n\n\tmemory {\n\t\treg = <0 0x40000000 0 0x20000000>;\n\t};\n\n\tgpio-keys {\n\t\tcompatible = \"gpio-keys\";\n\n\t\tbutton-reset {\n\t\t\tlabel = \"reset\";\n\t\t\tlinux,code = <KEY_RESTART>;\n\t\t\tgpios = <&pio 1 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tbutton-mesh {\n\t\t\tlabel = \"mesh\";\n\t\t\tlinux,code = <BTN_9>;\n\t\t\tlinux,input-type = <EV_SW>;\n\t\t\tgpios = <&pio 0 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n\n\tgpio-leds {\n\t\tcompatible = \"gpio-leds\";\n\n\t\tstatus_red_led: led-0 {\n\t\t\tlabel = \"red:status\";\n\t\t\tgpios = <&pio 8 GPIO_ACTIVE_HIGH>;\n\t\t\t};\n\n\t\tstatus_green_led: led-1 {\n\t\t\tlabel = \"green:status\";\n\t\t\tgpios = <&pio 13 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n};\n\n&mmc0 {\n\tbus-width = <8>;\n\tcap-mmc-highspeed;\n\tmax-frequency = <52000000>;\n\tnon-removable;\n\tpinctrl-names = \"default\", \"state_uhs\";\n\tpinctrl-0 = <&mmc0_pins_default>;\n\tpinctrl-1 = <&mmc0_pins_uhs>;\n\tvmmc-supply = <&reg_3p3v>;\n\tstatus = \"okay\";\n\n\tcard@0 {\n\t\tcompatible = \"mmc-card\";\n\t\treg = <0>;\n\n\t\tblock {\n\t\t\tcompatible = \"block-device\";\n\n\t\t\tpartitions {\n\t\t\t\tblock-partition-factory {\n\t\t\t\t\tpartname = \"factory\";\n\n\t\t\t\t\tnvmem-layout {\n\t\t\t\t\t\tcompatible = \"fixed-layout\";\n\t\t\t\t\t\t#address-cells = <1>;\n\t\t\t\t\t\t#size-cells = <1>;\n\n\t\t\t\t\t\teeprom_factory_0: eeprom@0 {\n\t\t\t\t\t\t\treg = <0x0 0x1000>;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tmacaddr_factory_74: macaddr@74 {\n\t\t\t\t\t\t\tcompatible = \"mac-base\";\n\t\t\t\t\t\t\treg = <0x74 0x6>;\n\t\t\t\t\t\t\t#nvmem-cell-cells = <1>;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\n&eth {\n\tstatus = \"okay\";\n\n\tgmac0: mac@0 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <0>;\n\t\tphy-mode = \"2500base-x\";\n\t\t\n\t\tnvmem-cells = <&macaddr_factory_74 0>;\n                nvmem-cell-names = \"mac-address\";\n\t\tfixed-link {\n\t\t\tspeed = <2500>;\n\t\t\tfull-duplex;\n\t\t\tpause;\n\t\t};\n\t};\n\n\tgmac1: mac@1 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <1>;\n\t\tphy-mode = \"gmii\";\n\t\tphy-handle = <&int_gbe_phy>;\n\t};\n};\n\n&mdio_bus {\n\tswitch: switch@1f {\n\t\tcompatible = \"mediatek,mt7531\";\n\t\treg = <31>;\n\t\treset-gpios = <&pio 39 GPIO_ACTIVE_HIGH>;\n\t\tinterrupt-controller;\n\t\t#interrupt-cells = <1>;\n\t\tinterrupt-parent = <&pio>;\n\t\tinterrupts = <38 IRQ_TYPE_LEVEL_HIGH>;\n\t};\n};\n\n&switch {\n\tports {\n\t\t#address-cells = <1>;\n\t\t#size-cells = <0>;\n\n\t\tport@0 {\n\t\t\treg = <0>;\n\t\t\tlabel = \"wan\";\n\t\t};\n\n\t\tport@1 {\n\t\t\treg = <1>;\n\t\t\tlabel = \"lan1\";\n\t\t};\n\n\t\tport@2 {\n\t\t\treg = <2>;\n\t\t\tlabel = \"lan2\";\n\t\t};\n\n\t\tport@3 {\n                        reg = <3>;\n                        label = \"lan3\";\n                };\n\n\t\tport@6 {\n\t\t\treg = <6>;\n\t\t\tethernet = <&gmac0>;\n\t\t\tphy-mode = \"2500base-x\";\n\n\t\t\tfixed-link {\n\t\t\t\tspeed = <2500>;\n\t\t\t\tfull-duplex;\n\t\t\t\tpause;\n\t\t\t};\n\t\t};\n\t};\n};\n\n&pio {\n\tmmc0_pins_default: mmc0-pins-default {\n\t\tmux {\n\t\t\tfunction = \"flash\";\n\t\t\tgroups = \"emmc_45\";\n\t\t};\n\t};\n\n\tmmc0_pins_uhs: mmc0-pins-uhs {\n\t\tmux {\n\t\t\tfunction = \"flash\";\n\t\t\tgroups = \"emmc_45\";\n\t\t};\n\t};\n};\n\n&uart0 {\n\tstatus = \"okay\";\n};\n\n&usb_phy {\n\tstatus = \"okay\";\n};\n\n&watchdog {\n\tstatus = \"okay\";\n};\n\n&xhci {\n\tstatus = \"okay\";\n};\n"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7981b-sl-3000-emmc.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n\n/dts-v1/;\n#include <dt-bindings/gpio/gpio.h>\n#include <dt-bindings/input/input.h>\n#include <dt-bindings/leds/common.h>\n\n#include \"mt7981b.dtsi\"\n\n/ {\n\tmodel = \"SL-3000 eMMC bootstrap versions\";\n\tcompatible = \"sl,3000-emmc\", \"mediatek,mt7981\";\n\n\taliases {\n\t\tserial0 = &uart0;\n\t\tled-boot = &status_red_led;\n\t\tled-failsafe = &status_red_led;\n\t\tled-running = &status_green_led;\n\t\tled-upgrade = &status_blue_led;\n\t};\n\n\tchosen {\n\t\tbootargs = \"root=PARTLABEL=rootfs rootwait\";\n\t\tstdout-path = \"serial0:115200n8\";\n\t};\n\n\tmemory@40000000 {\n\t\treg = <0 0x40000000 0 0x20000000>;\n\t};\n\n\tgpio-keys {\n\t\tcompatible = \"gpio-keys\";\n\n\t\tbutton-mesh {\n\t\t\tlabel = \"mesh\";\n\t\t\tlinux,code = <BTN_9>;\n\t\t\tlinux,input-type = <EV_SW>;\n\t\t\tgpios = <&pio 0 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tbutton-reset {\n\t\t\tlabel = \"reset\";\n\t\t\tlinux,code = <KEY_RESTART>;\n\t\t\tgpios = <&pio 1 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n\n\tgpio-leds {\n\t\tcompatible = \"gpio-leds\";\n\n                status_red_led: led-0 {\n                        label = \"red:status\";\n                        gpios = <&pio 10 GPIO_ACTIVE_LOW>;\n                };\n\n                status_green_led: led-1 {\n                        label = \"green:status\";\n                        gpios = <&pio 11 GPIO_ACTIVE_LOW>;\n                };\n\n                status_blue_led: led-2 {\n                        label = \"blue:status\";\n                        gpios = <&pio 12 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n};\n\n&eth {\n\tstatus = \"okay\";\n\n\tgmac0: mac@0 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <0>;\n\t\tphy-mode = \"2500base-x\";\n\n\t\tfixed-link {\n\t\t\tspeed = <2500>;\n\t\t\tfull-duplex;\n\t\t\tpause;\n\t\t};\n\t};\n\t\n\tgmac1: mac@1 {\n        status = \"disabled\";\n        };\n        \n\tmdio: mdio-bus {\n\t\t#address-cells = <1>;\n\t\t#size-cells = <0>;\n\n\n\t\tswitch@0 {\n\t\t\tcompatible = \"mediatek,mt7531\";\n\t\t\treg = <31>;\n\t\t\treset-gpios = <&pio 39 0>;\n\n\t\t\tports {\n\t\t\t\t#address-cells = <1>;\n\t\t\t\t#size-cells = <0>;\n\n\t\t\t\tport@0 {\n\t\t\t\t\treg = <0>;\n\t\t\t\t\tlabel = \"lan1\";\n\t\t\t\t};\n\n\t\t\t\tport@1 {\n\t\t\t\t\treg = <1>;\n\t\t\t\t\tlabel = \"lan2\";\n\t\t\t\t};\n\n\t\t\t\tport@2 {\n\t\t\t\t\treg = <2>;\n\t\t\t\t\tlabel = \"lan3\";\n\t\t\t\t};\n\n\t\t\t\tport@3 {\n\t\t\t\t\treg = <3>;\n\t\t\t\t\tlabel = \"wan\";\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tport@6 {\n\t\t\t\t\treg = <6>;\n\t\t\t\t\tlabel = \"cpu\";\n\t\t\t\t\tethernet = <&gmac0>;\n\t\t\t\t\tphy-mode = \"2500base-x\";\n\n\t\t\t\t\tfixed-link {\n\t\t\t\t\t\tspeed = <2500>;\n\t\t\t\t\t\tfull-duplex;\n\t\t\t\t\t\tpause;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\n&mmc0 {\n\tbus-width = <8>;\n\tcap-mmc-highspeed;\n\tmax-frequency = <52000000>;\n\tno-sd;\n\tno-sdio;\n\tnon-removable;\n\tpinctrl-names = \"default\", \"state_uhs\";\n\tpinctrl-0 = <&mmc0_pins_default>;\n\tpinctrl-1 = <&mmc0_pins_uhs>;\n\tvmmc-supply = <&reg_3p3v>;\n\tstatus = \"okay\";\n\n\tcard@0 {\n\t\tcompatible = \"mmc-card\";\n\t\treg = <0>;\n\n\t\tblock {\n\t\t\tcompatible = \"block-device\";\n\n\t\t\tpartitions {\n\t\t\t\tblock-partition-factory {\n\t\t\t\t\tpartname = \"factory\";\n\n\t\t\t\t\tnvmem-layout {\n\t\t\t\t\t\tcompatible = \"fixed-layout\";\n\t\t\t\t\t\t#address-cells = <1>;\n\t\t\t\t\t\t#size-cells = <1>;\n\n\t\t\t\t\t\teeprom_factory_0: eeprom@0 {\n\t\t\t\t\t\t\treg = <0x0 0x1000>;\n\t\t\t\t\t\t};\n\t\t\t\t\t\t\n\t\t\t\t\t\tmacaddr_factory_a: macaddr@a {\n\t\t\t\t\t\t\tcompatible = \"mac-base\";\n\t\t\t\t\t\t\treg = <0xa 0x6>;\n\t\t\t\t\t\t\t#nvmem-cell-cells = <1>;\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\n&pio {\n\tmmc0_pins_default: mmc0-pins-default {\n\t\tmux {\n\t\t\tfunction = \"flash\";\n\t\t\tgroups = \"emmc_45\";\n\t\t};\n\t};\n\n\tmmc0_pins_uhs: mmc0-pins-uhs {\n\t\tmux {\n\t\t\tfunction = \"flash\";\n\t\t\tgroups = \"emmc_45\";\n\t\t};\n\t};\n};\n\n&uart0 {\n\tstatus = \"okay\";\n};\n\n&watchdog {\n\tstatus = \"okay\";\n};\n\n&wifi {\n\tstatus = \"okay\";\n\tnvmem-cells = <&eeprom_factory_0>;\n\tnvmem-cell-names = \"eeprom\";\n\t\n\tband@0 {\n\t\treg = <0>;\n\t\tnvmem-cells = <&macaddr_factory_a 0>;\n\t\tnvmem-cell-names = \"mac-address\";\n\n\t};\n\n\tband@1 {\n\t\treg = <1>;\n\t\tnvmem-cells = <&macaddr_factory_a 1>;\n\t\tnvmem-cell-names = \"mac-address\";\n\t};\n};\n\n&usb_phy {\n\tstatus = \"okay\";\n};\n\n&xhci {\n\tstatus = \"okay\";\n};\n"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7981b-sl-3000.dts",
    "content": "/dts-v1/;\n\n#include \"mt7981b.dtsi\"\n\n/ {\n\tmodel = \"SL-3000\";\n\tcompatible = \"sl,3000\", \"mediatek,mt7981\";\n\n\taliases {\n\t\tled-boot = &led_run;\n\t\tled-failsafe = &led_blue;\n\t\tled-running = &led_green;\n\t\tled-upgrade = &led_blue;\n\t\tserial0 = &uart0;\n\t\tlabel-mac-device = &wan;\n\t};\n\n\tchosen {\n\t        bootargs = \"root=PARTLABEL=rootfs rootwait\";\n\t\tstdout-path = \"serial0:115200n8\";\n\t};\n\n\tgpio-keys {\n\t\tcompatible = \"gpio-keys\";\n\n\t\treset {\n\t\t\tlabel = \"reset\";\n\t\t\tlinux,code = <KEY_RESTART>;\n\t\t\tgpios = <&pio 1 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\twps {\n\t\t\tlabel = \"wps\";\n\t\t\tlinux,code = <KEY_WPS_BUTTON>;\n\t\t\tgpios = <&pio 0 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n\n\tleds {\n\t\tcompatible = \"gpio-leds\";\n\n\t\tled_run: RGB_RED {\n\t\t\tlabel = \"RGB_RED\";\n\t\t\tgpios = <&pio 10 GPIO_ACTIVE_LOW>;\n\t\t\tdefault-state = \"on\";\n\t\t};\n\n\t\tled_green: RGB_GREEN {\n\t\t\tlabel = \"RGB_GREEN\";\n\t\t\tgpios = <&pio 11 GPIO_ACTIVE_LOW>;\n\t\t\tdefault-state = \"off\";\n\t\t};\n\n\t\tled_blue: RGB_BLUE {\n\t\t\tlabel = \"RGB_BLUE\";\n\t\t\tgpios = <&pio 12 GPIO_ACTIVE_LOW>;\n\t\t\tdefault-state = \"off\";\n\t\t};\n\t};\n\n\treg_3p3v: regulator-3p3v {\n\t\tcompatible = \"regulator-fixed\";\n\t\tregulator-name = \"fixed-3.3V\";\n\t\tregulator-min-microvolt = <3300000>;\n\t\tregulator-max-microvolt = <3300000>;\n\t\tregulator-boot-on;\n\t\tregulator-always-on;\n\t};\n};\n\n&uart0 {\n\tstatus = \"okay\";\n};\n\n&watchdog {\n\tstatus = \"okay\";\n};\n\n&eth {\n\tpinctrl-names = \"default\";\n\tpinctrl-0 = <&mdio_pins>;\n\n\tstatus = \"okay\";\n\n\tgmac0: mac@0 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <0>;\n\t\tphy-mode = \"2500base-x\";\n\t\tnvmem-cells = <&macaddr_factory_4 (-1)>;\n\t\tnvmem-cell-names = \"mac-address\";\n\n\t\tfixed-link {\n\t\t\tspeed = <2500>;\n\t\t\tfull-duplex;\n\t\t\tpause;\n\t\t};\n\t};\n};\n\n&mdio_bus {\n\tswitch0: switch@1f {\n\t\tcompatible = \"mediatek,mt7531\";\n\t\treg = <31>;\n\t\tdsa,member = <0 0>;\n\t\treset-gpios = <&pio 39 GPIO_ACTIVE_HIGH>;\n\t\tinterrupt-controller;\n\t\t#interrupt-cells = <1>;\n\t\tinterrupt-parent = <&pio>;\n\t\tinterrupts = <38 IRQ_TYPE_LEVEL_HIGH>;\n\t};\n};\n\n&switch0 {\n\tports {\n\t\t#address-cells = <1>;\n\t\t#size-cells = <0>;\n\n\t\tport@0 {\n\t\t\treg = <0>;\n\t\t\tlabel = \"lan1\";\n\t\t};\n\n\t\tport@1 {\n\t\t\treg = <1>;\n\t\t\tlabel = \"lan2\";\n\t\t};\n\n\t\tport@2 {\n\t\t\treg = <2>;\n\t\t\tlabel = \"lan3\";\n\t\t};\n\n\t\twan: port@3 {\n\t\t\treg = <3>;\n\t\t\tlabel = \"wan\";\n\t\t\tnvmem-cells = <&macaddr_factory_4 (-2)>;\n\t\t\tnvmem-cell-names = \"mac-address\";\n\t\t};\n\n\t\tport@6 {\n\t\t\treg = <6>;\n\t\t\tethernet = <&gmac0>;\n\t\t\tphy-mode = \"2500base-x\";\n\n\t\t\tfixed-link {\n\t\t\t\tspeed = <2500>;\n\t\t\t\tfull-duplex;\n\t\t\t\tpause;\n\t\t\t};\n\t\t};\n\t};\n};\n\n&mmc0 {\n\tpinctrl-names = \"default\", \"state_uhs\";\n\tpinctrl-0 = <&mmc0_pins_default>;\n\tpinctrl-1 = <&mmc0_pins_uhs>;\n\tbus-width = <8>;\n\tmax-frequency = <52000000>;\n\tcap-mmc-highspeed;\n\tvmmc-supply = <&reg_3p3v>;\n\tnon-removable;\n\tstatus = \"okay\";\n};\n\n&spi2 {\n\tpinctrl-names = \"default\";\n\tpinctrl-0 = <&spi2_flash_pins>;\n\tstatus = \"okay\";\n\n\tspi_nor@0 {\n\t\t#address-cells = <1>;\n\t\t#size-cells = <1>;\n\t\tcompatible = \"jedec,spi-nor\";\n\t\treg = <0>;\n\t\tspi-max-frequency = <52000000>;\n\t\tspi-tx-bus-width = <4>;\n\t\tspi-rx-bus-width = <4>;\n\n\t\tpartitions {\n\t\t\tcompatible = \"fixed-partitions\";\n\t\t\t#address-cells = <1>;\n\t\t\t#size-cells = <1>;\n\n\t\t\tpartition@00000 {\n\t\t\t\tlabel = \"BL2\";\n\t\t\t\treg = <0x00000 0x0100000>;\n\t\t\t};\n\t\t\tpartition@100000 {\n\t\t\t\tlabel = \"u-boot-env\";\n\t\t\t\treg = <0x0100000 0x0080000>;\n\t\t\t};\n\t\t\tfactory: partition@180000 {\n\t\t\t\tlabel = \"Factory\";\n\t\t\t\treg = <0x180000 0x0200000>;\n\n\t\t\t\tnvmem-layout {\n\t\t\t\t\tcompatible = \"fixed-layout\";\n\t\t\t\t\t#address-cells = <1>;\n\t\t\t\t\t#size-cells = <1>;\n\n\t\t\t\t\tmacaddr_factory_4: macaddr@4 {\n\t\t\t\t\t\tcompatible = \"mac-base\";\n\t\t\t\t\t\treg = <0x4 0x6>;\n\t\t\t\t\t\t#nvmem-cell-cells = <1>;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tpartition@380000 {\n\t\t\t\tlabel = \"FIP\";\n\t\t\t\treg = <0x380000 0x0200000>;\n\t\t\t};\n\t\t\tpartition@580000 {\n\t\t\t\tlabel = \"firmware\";\n\t\t\t\treg = <0x580000 0x1900000>;\n\t\t\t};\n\t\t\tpartition@1e80000 {\n\t\t\t\tlabel = \"Product\";\n\t\t\t\treg = <0x1e80000 0x20000>;\n\t\t\t};\n\t\t\tpartition@1ea0000 {\n\t\t\t\tlabel = \"Custom\";\n\t\t\t\treg = <0x1ea0000 0x160000>;\n\t\t\t};\n\t\t};\n\t};\n};\n\n&pio {\n\tspi2_flash_pins: spi2-pins {\n\t\tmux {\n\t\t\tfunction = \"spi\";\n\t\t\tgroups = \"spi2\", \"spi2_wp_hold\";\n\t\t};\n\n\t\tconf-pu {\n\t\t\tpins = \"SPI2_CS\", \"SPI2_HOLD\", \"SPI2_WP\";\n\t\t\tdrive-strength = <MTK_DRIVE_8mA>;\n\t\t\tbias-pull-up = <MTK_PUPD_SET_R1R0_11>;\n\t\t};\n\n\t\tconf-pd {\n\t\t\tpins = \"SPI2_CLK\", \"SPI2_MOSI\", \"SPI2_MISO\";\n\t\t\tdrive-strength = <MTK_DRIVE_8mA>;\n\t\t\tbias-pull-down = <MTK_PUPD_SET_R1R0_11>;\n\t\t};\n\t};\n\n\tmmc0_pins_default: mmc0-pins-default {\n\t\tmux {\n\t\t\tfunction = \"flash\";\n\t\t\tgroups = \"emmc_45\";\n\t\t};\n\n\t\tconf-cmd-dat {\n\t\t\tpins = \"SPI0_CLK\", \"SPI0_MOSI\", \"SPI0_MISO\",\n\t\t\t\t\"SPI0_CS\",  \"SPI0_HOLD\", \"SPI0_WP\",\n\t\t\t\t\"SPI1_CLK\", \"SPI1_MOSI\", \"SPI1_MISO\";\n\t\t\tinput-enable;\n\t\t\tdrive-strength = <MTK_DRIVE_4mA>;\n\t\t\tbias-pull-up = <MTK_PUPD_SET_R1R0_01>;\n\t\t};\n\n\t\tconf-clk {\n\t\t\tpins = \"SPI1_CS\";\n\t\t\tdrive-strength = <MTK_DRIVE_6mA>;\n\t\t\tbias-pull-down = <MTK_PUPD_SET_R1R0_10>;\n\t\t};\n\n\t\tconf-rst {\n\t\t\tpins = \"PWM0\";\n\t\t\tdrive-strength = <MTK_DRIVE_4mA>;\n\t\t\tbias-pull-up = <MTK_PUPD_SET_R1R0_01>;\n\t\t};\n\t};\n\n\tmmc0_pins_uhs: mmc0-pins-uhs {\n\t\tmux {\n\t\t\tfunction = \"flash\";\n\t\t\tgroups = \"emmc_45\";\n\t\t};\n\n\t\tconf-cmd-dat {\n\t\t\tpins = \"SPI0_CLK\", \"SPI0_MOSI\", \"SPI0_MISO\",\n\t\t\t\t\"SPI0_CS\",  \"SPI0_HOLD\", \"SPI0_WP\",\n\t\t\t\t\"SPI1_CLK\", \"SPI1_MOSI\", \"SPI1_MISO\";\n\t\t\tinput-enable;\n\t\t\tdrive-strength = <MTK_DRIVE_4mA>;\n\t\t\tbias-pull-up = <MTK_PUPD_SET_R1R0_01>;\n\t\t};\n\n\t\tconf-clk {\n\t\t\tpins = \"SPI1_CS\";\n\t\t\tdrive-strength = <MTK_DRIVE_6mA>;\n\t\t\tbias-pull-down = <MTK_PUPD_SET_R1R0_10>;\n\t\t};\n\n\t\tconf-rst {\n\t\t\tpins = \"PWM0\";\n\t\t\tdrive-strength = <MTK_DRIVE_4mA>;\n\t\t\tbias-pull-up = <MTK_PUPD_SET_R1R0_01>;\n\t\t};\n\t};\n};\n\n&wifi {\n\tmediatek,mtd-eeprom = <&factory 0x0>;\n\n\tstatus = \"okay\";\n};\n\n&xhci {\n\tstatus = \"okay\";\n};\n"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7981b-umi-uax3000e.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n\n/dts-v1/;\n#include <dt-bindings/gpio/gpio.h>\n#include <dt-bindings/input/input.h>\n#include <dt-bindings/leds/common.h>\n\n#include \"mt7981b.dtsi\"\n\n/ {\n\tmodel = \"UMI UAX3000E eMMC version\";\n\tcompatible = \"umi,uax3000e\", \"mediatek,mt7981\";\n\n\tchosen {\n\t\tbootargs = \"root=PARTLABEL=rootfs rootwait\";\n\t\tstdout-path = \"serial0:115200n8\";\n\t};\n\n\taliases {\n\t\tled-boot = &red_led;\n\t\tled-failsafe = &red_led;\n\t\tled-running = &green_led;\n\t\tled-upgrade = &blue_led;\n\t\tserial0 = &uart0;\n\t};\n\n\tmemory {\n\t\treg = <0 0x40000000 0 0x40000000>;\n\t};\n\n        gpio-leds {\n                compatible = \"gpio-leds\";\n\n                red_led: led-0 {\n                        label = \"red:power\";\n                        gpios = <&pio 11 GPIO_ACTIVE_LOW>;\n                };\n\n                green_led: led-1 {\n                        label = \"green:wan\";\n                        gpios = <&pio 34 GPIO_ACTIVE_LOW>;\n                };\n                \n\t\tblue_led: led-2 {\n\t\t\tlabel = \"blue:status\";\n\t\t\tgpios = <&pio 35 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n\n\tgpio-keys {\n\t\tcompatible = \"gpio-keys\";\n\t\treset {\n\t\t\tlabel = \"reset\";\n\t\t\tlinux,code = <KEY_RESTART>;\n\t\t\tgpios = <&pio 1 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n};\n\n&eth {\n\tstatus = \"okay\";\n\n\tgmac0: mac@0 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <0>;\n\t\tphy-mode = \"2500base-x\";\n\n\t\tfixed-link {\n\t\t\tspeed = <2500>;\n\t\t\tfull-duplex;\n\t\t\tpause;\n\t\t};\n\t};\n\n\n\tgmac1: mac@1 {\n\t\tcompatible = \"mediatek,eth-mac\";\n\t\treg = <1>;\n\t\tphy-mode = \"gmii\";\n\t\tphy-handle = <&int_gbe_phy>;\n\t};\n};\n\n&mdio_bus {\n\tswitch: switch@1f {\n\t\tcompatible = \"mediatek,mt7531\";\n\t\treg = <31>;\n\t\treset-gpios = <&pio 39 GPIO_ACTIVE_HIGH>;\n\t\tinterrupt-controller;\n\t\t#interrupt-cells = <1>;\n\t\tinterrupt-parent = <&pio>;\n\t\tinterrupts = <38 IRQ_TYPE_LEVEL_HIGH>;\n\t};\n};\n\n&switch {\n\tports {\n\t\t#address-cells = <1>;\n\t\t#size-cells = <0>;\n\n\t\tport@0 {\n\t\t\treg = <0>;\n\t\t\tlabel = \"lan1\";\n\t\t};\n\n\t\tport@1 {\n\t\t\treg = <1>;\n\t\t\tlabel = \"lan2\";\n\t\t};\n\n\t\tport@2 {\n\t\t\treg = <2>;\n\t\t\tlabel = \"lan3\";\n\t\t};\n\n\t\tport@6 {\n\t\t\treg = <6>;\n\t\t\tethernet = <&gmac0>;\n\t\t\tphy-mode = \"2500base-x\";\n\n\t\t\tfixed-link {\n\t\t\t\tspeed = <2500>;\n\t\t\t\tfull-duplex;\n\t\t\t\tpause;\n\t\t\t};\n\t\t};\n\t};\n};\n\n&mmc0 {\n\tbus-width = <8>;\n\tcap-mmc-highspeed;\n\tmax-frequency = <52000000>;\n\tno-sd;\n\tno-sdio;\n\tnon-removable;\n\tpinctrl-names = \"default\", \"state_uhs\";\n\tpinctrl-0 = <&mmc0_pins_default>;\n\tpinctrl-1 = <&mmc0_pins_uhs>;\n\tvmmc-supply = <&reg_3p3v>;\n\tstatus = \"okay\";\n\n\tcard@0 {\n\t\tcompatible = \"mmc-card\";\n\t\treg = <0>;\n\n\t\tblock {\n\t\t\tcompatible = \"block-device\";\n\n\t\t\tpartitions {\n\t\t\t\tblock-partition-factory {\n\t\t\t\t\tpartname = \"factory\";\n\n\t\t\t\t\tnvmem-layout {\n\t\t\t\t\t\tcompatible = \"fixed-layout\";\n\t\t\t\t\t\t#address-cells = <1>;\n\t\t\t\t\t\t#size-cells = <1>;\n\n\t\t\t\t\t\teeprom_factory_0: eeprom@0 {\n\t\t\t\t\t\t\treg = <0x0 0x1000>;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tmacaddr_factory_24: macaddr@24 {\n\t\t\t\t\t\t\tcompatible = \"mac-base\";\n\t\t\t\t\t\t\treg = <0x24 0x6>;\n\t\t\t\t\t\t\t#nvmem-cell-cells = <1>;\n\t\t\t\t\t\t};\n\t\t\t\t\t\t\n\t\t\t\t\t\tmacaddr_factory_0a: macaddr@0a {\n\t\t\t\t\t\t\tcompatible = \"mac-base\";\n\t\t\t\t\t\t\treg = <0x0a 0x6>;\n\t\t\t\t\t\t\t#nvmem-cell-cells = <1>;\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n};\n\n&pio {\n\tmmc0_pins_default: mmc0-pins-default {\n\t\tmux {\n\t\t\tfunction = \"flash\";\n\t\t\tgroups = \"emmc_45\";\n\t\t};\n\t};\n\n\tmmc0_pins_uhs: mmc0-pins-uhs {\n\t\tmux {\n\t\t\tfunction = \"flash\";\n\t\t\tgroups = \"emmc_45\";\n\t\t};\n\t};\n};\n\n&uart0 {\n\tstatus = \"okay\";\n};\n\n&usb_phy {\n\tstatus = \"okay\";\n};\n\n&watchdog {\n\tstatus = \"okay\";\n};\n\n&xhci {\n\tstatus = \"okay\";\n};\n\n&wifi {\n\tnvmem-cells = <&eeprom_factory_0>;\n\tnvmem-cell-names = \"eeprom\";\n\tstatus = \"okay\";\n};\n"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7981b-xiaomi-mi-router-wr30u.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n\n/dts-v1/;\n#include \"mt7981b-xiaomi-mi-router-wr30u.dtsi\"\n\n/ {\n\tmodel = \"Xiaomi Mi Router WR30U\";\n\tcompatible = \"xiaomi,mi-router-wr30u\", \"mediatek,mt7981\";\n};\n\n&spi_nand {\n\tmediatek,nmbm;\n\tmediatek,bmt-max-ratio = <1>;\n\tmediatek,bmt-max-reserved-blocks = <64>;\n};\n\n&partitions {\n\tpartition@600000 {\n\t\tlabel = \"ubi\";\n\t\treg = <0x600000 0x7000000>;\n\t};\n};"
  },
  {
    "path": "devices/mediatek_filogic/diy/target/linux/mediatek/dts/mt7987a-glinet-gl-mt3600be.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n/*\n * Copyright (C) 2026 Tianling Shen <cnsztl@immortalwrt.org>\n */\n\n/dts-v1/;\n#include <dt-bindings/input/input.h>\n#include <dt-bindings/leds/common.h>\n\n#include \"mt7987a.dtsi\"\n\n/ {\n\tmodel = \"GL.iNet GL-MT3600BE\";\n\tcompatible = \"glinet,gl-mt3600be\", \"mediatek,mt7987a\", \"mediatek,mt7987\";\n\n\taliases {\n\t\tserial0 = &uart0;\n\t\tlabel-mac-device = &gmac0;\n\t\tled-boot = &led_status_white;\n\t\tled-failsafe = &led_status_blue;\n\t\tled-running = &led_status_blue;\n\t\tled-upgrade = &led_status_blue;\n\t};\n\n\tchosen {\n\t\tbootargs = \"console=ttyS0,115200n1 earlycon=uart8250,mmio32,0x11000000 pci=pcie_bus_perf\";\n\t\tstdout-path = \"serial0:115200n8\";\n\t};\n\n\tgpio-leds {\n\t\tcompatible = \"gpio-leds\";\n\n\t\tled_status_blue: led-0 {\n\t\t\tcolor = <LED_COLOR_ID_BLUE>;\n\t\t\tfunction = LED_FUNCTION_STATUS;\n\t\t\tgpios = <&pio 48 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tled_status_white: led-1 {\n\t\t\tcolor = <LED_COLOR_ID_WHITE>;\n\t\t\tfunction = LED_FUNCTION_STATUS;\n\t\t\tgpios = <&pio 49 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n\n\tgpio-keys {\n\t\tcompatible = \"gpio-keys\";\n\n\t\tbutton-mode {\n\t\t\tlabel = \"mode\";\n\t\t\tlinux,code = <BTN_0>;\n\t\t\tlinux,input-type = <EV_SW>;\n\t\t\tgpios = <&pio 3 GPIO_ACTIVE_HIGH>;\n\t\t\tdebounce-interval = <10>;\n\t\t};\n\n\t\tbutton-reset {\n\t\t\tlabel = \"reset\";\n\t\t\tlinux,code = <KEY_RESTART>;\n\t\t\tgpios = <&pio 4 GPIO_ACTIVE_LOW>;\n\t\t\tdebounce-interval = <10>;\n\t\t};\n\t};\n\n\tfan_3p3v: regulator-fan-3p3v {\n\t\tcompatible = \"regulator-fixed\";\n\t\tenable-active-high;\n\t\tgpios = <&pio 6 GPIO_ACTIVE_HIGH>;\n\t\tregulator-name = \"fan\";\n\t\tregulator-min-microvolt = <3300000>;\n\t\tregulator-max-microvolt = <3300000>;\n\t};\n\n\tusb_vbus: regulator-usb-vbus {\n\t\tcompatible = \"regulator-fixed\";\n\t\tenable-active-high;\n\t\tgpios = <&pio 14 GPIO_ACTIVE_HIGH>;\n\t\tregulator-name = \"usb_vbus\";\n\t\tregulator-boot-on;\n\t\tregulator-min-microvolt = <5000000>;\n\t\tregulator-max-microvolt = <5000000>;\n\t};\n};\n\n&fan {\n\tfan-supply = <&fan_3p3v>;\n\tinterrupt-parent = <&pio>;\n\tinterrupts = <5 IRQ_TYPE_EDGE_RISING>;\n\tpwms = <&pwm 1 50000 0>;\n\tstatus = \"okay\";\n};\n\n&gmac0 {\n\tnvmem-cells = <&macaddr_factory_4000 0>;\n\tnvmem-cell-names = \"mac-address\";\n\tphy-handle = <&phy7>;\n\tphy-mode = \"2500base-x\";\n\tstatus = \"okay\";\n};\n\n&gmac1 {\n\tnvmem-cells = <&macaddr_factory_4000 1>;\n\tnvmem-cell-names = \"mac-address\";\n\tphy-handle = <&phy15>;\n\tphy-mode = \"internal\";\n\tstatus = \"okay\";\n};\n\n&mdio {\n\treset-delay-us = <10000>;\n\treset-gpios = <&pio 0 GPIO_ACTIVE_LOW>;\n\n\tphy7: phy@7 {\n\t\tcompatible = \"ethernet-phy-ieee802.3-c45\";\n\t\treg = <7>;\n\t\tinterrupt-parent = <&pio>;\n\t\tinterrupts = <41 IRQ_TYPE_LEVEL_LOW>;\n\t\treset-assert-us = <100000>;\n\t\treset-deassert-us = <100000>;\n\t\treset-gpios = <&pio 42 GPIO_ACTIVE_LOW>;\n\t};\n\n\tphy15: phy@f {\n\t\tcompatible = \"ethernet-phy-ieee802.3-c45\";\n\t\treg = <15>;\n\t\tpinctrl-names = \"i2p5gbe-led\";\n\t\tpinctrl-0 = <&i2p5gbe_led0_pins>;\n\t};\n};\n\n&pcie0 {\n\tpinctrl-names = \"default\";\n\tpinctrl-0 = <&pcie0_pins>;\n\treset-gpios = <&pio 38 GPIO_ACTIVE_HIGH>;\n\tstatus = \"okay\";\n\n\tpcie@0,0 {\n\t\treg = <0x0000 0 0 0 0>;\n\n\t\tmt7990@0,0 {\n\t\t\tcompatible = \"mediatek,mt76\";\n\t\t\treg = <0x0000 0 0 0 0>;\n\t\t\t#address-cells = <1>;\n\t\t\t#size-cells = <0>;\n\n\t\t\tdevice_type = \"pci\";\n\n\t\t\tieee80211-freq-limit = <2400000 2500000>,\n\t\t\t\t\t       <5170000 5835000>;\n\n\t\t\tnvmem-cells = <&eeprom_factory_0>;\n\t\t\tnvmem-cell-names = \"eeprom\";\n\n\t\t\tband@0 {\n\t\t\t\treg = <0>;\n\t\t\t\tnvmem-cells = <&macaddr_factory_4006 0>;\n\t\t\t\tnvmem-cell-names = \"mac-address\";\n\t\t\t};\n\n\t\t\tband@1 {\n\t\t\t\treg = <1>;\n\t\t\t\tnvmem-cells = <&macaddr_factory_4006 1>;\n\t\t\t\tnvmem-cell-names = \"mac-address\";\n\t\t\t};\n\t\t};\n\t};\n};\n\n&pio {\n\tpwm1_pins: pwm1-pins {\n\t\tmux {\n\t\t\tfunction = \"pwm\";\n\t\t\tgroups = \"pwm1_0\";\n\t\t};\n\t};\n};\n\n&pwm {\n\tpinctrl-names = \"default\";\n\tpinctrl-0 = <&pwm1_pins>;\n\tstatus = \"okay\";\n};\n\n&spi2 {\n\tpinctrl-names = \"default\";\n\tpinctrl-0 = <&spi2_flash_pins>;\n\tstatus = \"okay\";\n\n\tflash@0 {\n\t\tcompatible = \"spi-nand\";\n\t\treg = <0>;\n\n\t\tspi-cal-enable;\n\t\tspi-cal-mode = \"read-data\";\n\t\tspi-cal-datalen = <7>;\n\t\tspi-cal-data = /bits/ 8 <0x53 0x50 0x49 0x4e 0x41 0x4e 0x44>;\n\t\tspi-cal-addrlen = <5>;\n\t\tspi-cal-addr = /bits/ 32 <0x0 0x0 0x0 0x0 0x0>;\n\n\t\tspi-max-frequency = <52000000>;\n\t\tspi-tx-bus-width = <4>;\n\t\tspi-rx-bus-width = <4>;\n\n\t\tmediatek,nmbm;\n\t\tmediatek,bmt-max-ratio = <1>;\n\t\tmediatek,bmt-max-reserved-blocks = <256>;\n\n\t\tpartitions {\n\t\t\tcompatible = \"fixed-partitions\";\n\t\t\t#address-cells = <1>;\n\t\t\t#size-cells = <1>;\n\n\t\t\tpartition@0 {\n\t\t\t\tlabel = \"BL2\";\n\t\t\t\treg = <0x0 0x100000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@100000 {\n\t\t\t\tlabel = \"u-boot-env\";\n\t\t\t\treg = <0x100000 0x80000>;\n\t\t\t};\n\n\t\t\tpartition@180000 {\n\t\t\t\tlabel = \"Factory\";\n\t\t\t\treg = <0x180000 0x400000>;\n\t\t\t\tread-only;\n\n\t\t\t\tnvmem-layout {\n\t\t\t\t\tcompatible = \"fixed-layout\";\n\t\t\t\t\t#address-cells = <1>;\n\t\t\t\t\t#size-cells = <1>;\n\n\t\t\t\t\teeprom_factory_0: eeprom@0 {\n\t\t\t\t\t\treg = <0x0 0x1e00>;\n\t\t\t\t\t};\n\n\t\t\t\t\tmacaddr_factory_4000: macaddr@4000 {\n\t\t\t\t\t\tcompatible = \"mac-base\";\n\t\t\t\t\t\treg = <0x4000 0x6>;\n\t\t\t\t\t\t#nvmem-cell-cells = <1>;\n\t\t\t\t\t};\n\n\t\t\t\t\tmacaddr_factory_4006: macaddr@4006 {\n\t\t\t\t\t\tcompatible = \"mac-base\";\n\t\t\t\t\t\treg = <0x4006 0x6>;\n\t\t\t\t\t\t#nvmem-cell-cells = <1>;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tpartition@580000 {\n\t\t\t\tlabel = \"FIP\";\n\t\t\t\treg = <0x580000 0x200000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@780000 {\n\t\t\t\tlabel = \"log\";\n\t\t\t\treg = <0x780000 0x40000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@7c0000 {\n\t\t\t\tlabel = \"CFG\";\n\t\t\t\treg = <0x7c0000 0x40000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@800000 {\n\t\t\t\tlabel = \"ubi\";\n\t\t\t\treg = <0x800000 0x1d800000>;\n\t\t\t\tcompatible = \"linux,ubi\";\n\t\t\t};\n\t\t};\n\t};\n};\n\n&ssusb {\n\tvbus-supply = <&usb_vbus>;\n\tstatus = \"okay\";\n};\n\n&tphyu3port0 {\n\tstatus = \"okay\";\n};\n\n&uart0 {\n\tpinctrl-names = \"default\";\n\tpinctrl-0 = <&uart0_pins>;\n\tstatus = \"okay\";\n};\n"
  },
  {
    "path": "devices/mediatek_filogic/diy.sh",
    "content": "#!/bin/bash\n\nshopt -s extglob\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\n#bash $SHELL_FOLDER/../common/kernel_6.6.sh\n\nsed -i -E -e 's/ ?root=\\/dev\\/fit0 rootwait//' -e \"/rootdisk =/d\" -e '/bootargs.* = \"\"/d' target/linux/mediatek/dts/*{qihoo-360t7,netcore-n60*,h3c-magic-nx30-pro,jdcloud-re-cp-03,cmcc-rax3000m,jcg-q30-pro,tplink-tl-xdr*,abt-asr3000,komi-a31,nokia-ea0326gmp}.dts\n"
  },
  {
    "path": "devices/mediatek_filogic/patches/01-360t7.patch",
    "content": "--- a/target/linux/mediatek/dts/mt7981b-qihoo-360t7.dts\n+++ b/target/linux/mediatek/dts/mt7981b-qihoo-360t7.dts\n@@ -105,6 +105,10 @@\n \t\tspi-tx-bus-width = <4>;\n \t\tspi-rx-bus-width = <4>;\n \n+\t\tmediatek,nmbm;\n+\t\tmediatek,bmt-max-ratio = <1>;\n+\t\tmediatek,bmt-max-reserved-blocks = <64>;\n+\n \t\tpartitions {\n \t\t\tcompatible = \"fixed-partitions\";\n \t\t\t#address-cells = <1>;\n@@ -159,7 +163,7 @@\n \n \t\t\tpartition@7300000 {\n \t\t\t\tlabel = \"log\";\n-\t\t\t\treg = <0x7300000 0x0700000>;\n+\t\t\t\treg = <0x7300000 0x0400000>;\n \t\t\t\tread-only;\n \t\t\t};\n \t\t};\n\n--- a/target/linux/mediatek/image/filogic.mk\n+++ b/target/linux/mediatek/image/filogic.mk\n@@ -149,17 +149,10 @@ define Device/abt_asr3000\n   BLOCKSIZE := 128k\n   PAGESIZE := 2048\n   KERNEL_IN_UBI := 1\n-  UBOOTENV_IN_UBI := 1\n-  IMAGES := sysupgrade.itb\n-  KERNEL_INITRAMFS_SUFFIX := -recovery.itb\n-  KERNEL := kernel-bin | gzip\n-  KERNEL_INITRAMFS := kernel-bin | lzma | \\\n-\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k\n-  IMAGE/sysupgrade.itb := append-kernel | \\\n-\tfit gzip $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb external-static-with-rootfs | append-metadata\n-  ARTIFACTS := preloader.bin bl31-uboot.fip\n-  ARTIFACT/preloader.bin := mt7981-bl2 spim-nand-ddr3\n-  ARTIFACT/bl31-uboot.fip := mt7981-bl31-uboot abt_asr3000\n+  IMAGE_SIZE := 114816k\n+  IMAGES += factory.bin\n+  IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n endef\n TARGET_DEVICES += abt_asr3000\n \n@@ -835,21 +828,21 @@ define Device/cetron_ct3003\n endef\n TARGET_DEVICES += cetron_ct3003\n \n-define Device/cmcc_a10-stock\n+define Device/cmcc_a10\n   DEVICE_VENDOR := CMCC\n-  DEVICE_MODEL := A10 (stock layout)\n+  DEVICE_MODEL := A10\n   DEVICE_ALT0_VENDOR := SuperElectron\n-  DEVICE_ALT0_MODEL := ZN-M5 (stock layout)\n+  DEVICE_ALT0_MODEL := ZN-M5\n   DEVICE_ALT1_VENDOR := SuperElectron\n-  DEVICE_ALT1_MODEL := ZN-M8 (stock layout)\n-  DEVICE_DTS := mt7981b-cmcc-a10-stock\n+  DEVICE_ALT1_MODEL := ZN-M8\n+  DEVICE_DTS := mt7981b-cmcc-a10\n   DEVICE_DTS_DIR := ../dts\n   SUPPORTED_DEVICES += mediatek,mt7981-spim-snand-rfb\n   DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware\n   UBINIZE_OPTS := -E 5\n   BLOCKSIZE := 128k\n   PAGESIZE := 2048\n-  IMAGE_SIZE := 65536k\n+  IMAGE_SIZE := 114688k\n   KERNEL_IN_UBI := 1\n   IMAGES += factory.bin\n   IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)\n@@ -859,7 +852,7 @@ define Device/cmcc_a10-stock\n   KERNEL_INITRAMFS = kernel-bin | lzma | \\\n \tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd\n endef\n-TARGET_DEVICES += cmcc_a10-stock\n+TARGET_DEVICES += cmcc_a10\n \n define Device/cmcc_a10-ubootmod\n   DEVICE_VENDOR := CMCC\n@@ -929,7 +922,6 @@ define Device/cmcc_rax3000m\n   ARTIFACT/nand-ddr4-bl31-uboot.fip := mt7981-bl31-uboot cmcc_rax3000m-nand-ddr4\n   ARTIFACT/nand-ddr4-preloader.bin  := mt7981-bl2 spim-nand-ddr4\n endef\n-TARGET_DEVICES += cmcc_rax3000m\n \n define Device/comfast_cf-e393ax\n   DEVICE_VENDOR := COMFAST\n@@ -970,7 +962,7 @@ endef\n \n define Device/comfast_cf-wr632ax\n   DEVICE_DTS := mt7981b-comfast-cf-wr632ax\n-  IMAGE_SIZE := 65536k\n+  IMAGE_SIZE := 116736k\n   IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n   SUPPORTED_DEVICES += cf-wr632ax\n   $(call Device/comfast_cf-wr632ax-common)\n@@ -1175,30 +1167,20 @@ define Device/cudy_tr3000-v1\n endef\n TARGET_DEVICES += cudy_tr3000-v1\n \n-define Device/cudy_tr3000-v1-ubootmod\n+define Device/cudy_tr3000-mod\n   DEVICE_VENDOR := Cudy\n   DEVICE_MODEL := TR3000\n-  DEVICE_VARIANT := v1 (OpenWrt U-Boot layout)\n-  DEVICE_DTS := mt7981b-cudy-tr3000-v1-ubootmod\n+  DEVICE_VARIANT := v1 112M\n+  DEVICE_DTS := mt7981b-cudy-tr3000-mod\n   DEVICE_DTS_DIR := ../dts\n   DEVICE_PACKAGES := kmod-usb3 kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware\n   UBINIZE_OPTS := -E 5\n   BLOCKSIZE := 128k\n   PAGESIZE := 2048\n   KERNEL_IN_UBI := 1\n-  UBOOTENV_IN_UBI := 1\n-  IMAGES := sysupgrade.itb\n-  KERNEL_INITRAMFS_SUFFIX := -recovery.itb\n-  KERNEL := kernel-bin | gzip\n-  KERNEL_INITRAMFS := kernel-bin | lzma | \\\n-\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k\n-  IMAGE/sysupgrade.itb := append-kernel | \\\n-\tfit gzip $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb external-static-with-rootfs | append-metadata\n-  ARTIFACTS := preloader.bin bl31-uboot.fip\n-  ARTIFACT/preloader.bin := mt7981-bl2 cudy-ddr3\n-  ARTIFACT/bl31-uboot.fip := mt7981-bl31-uboot cudy_tr3000-v1\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n endef\n-TARGET_DEVICES += cudy_tr3000-v1-ubootmod\n+TARGET_DEVICES += cudy_tr3000-mod\n \n define Device/cudy_wr3000-v1\n   DEVICE_VENDOR := Cudy\n@@ -1411,7 +1393,7 @@ define Device/gatonetworks_gdsp\n   DEVICE_DTC_FLAGS := --pad 4096\n   IMAGES := sysupgrade.itb\n   IMAGE_SIZE := 32768k\n-  DEVICE_PACKAGES := e2fsprogs f2fsck mkf2fs fitblk \\\n+  DEVICE_PACKAGES := e2fsprogs f2fsck mkf2fs \\\n     kmod-mt7915e kmod-mt7981-firmware \\\n     kmod-usb-net-qmi-wwan kmod-usb-serial-option kmod-usb3 \\\n     mt7981-wo-firmware\n@@ -1530,19 +1512,11 @@ define Device/h3c_magic-nx30-pro\n   BLOCKSIZE := 128k\n   PAGESIZE := 2048\n   KERNEL_IN_UBI := 1\n-  UBOOTENV_IN_UBI := 1\n   IMAGE_SIZE := 65536k\n-  IMAGES := sysupgrade.itb\n-  KERNEL_INITRAMFS_SUFFIX := -recovery.itb\n-  KERNEL := kernel-bin | gzip\n-  KERNEL_INITRAMFS := kernel-bin | lzma | \\\n-\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k\n-  IMAGE/sysupgrade.itb := append-kernel | \\\n-\tfit gzip $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb external-static-with-rootfs | append-metadata\n+  IMAGES += factory.bin\n+  IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n   DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware\n-  ARTIFACTS := preloader.bin bl31-uboot.fip\n-  ARTIFACT/preloader.bin := mt7981-bl2 spim-nand-ddr3\n-  ARTIFACT/bl31-uboot.fip := mt7981-bl31-uboot h3c_magic-nx30-pro\n endef\n TARGET_DEVICES += h3c_magic-nx30-pro\n \n@@ -1703,45 +1677,23 @@ define Device/jcg_q30-pro\n   UBINIZE_OPTS := -E 5\n   BLOCKSIZE := 128k\n   PAGESIZE := 2048\n+  IMAGE_SIZE := 114816k\n   KERNEL_IN_UBI := 1\n-  UBOOTENV_IN_UBI := 1\n-  IMAGES := sysupgrade.itb\n-  KERNEL_INITRAMFS_SUFFIX := -recovery.itb\n-  KERNEL := kernel-bin | gzip\n-  KERNEL_INITRAMFS := kernel-bin | lzma | \\\n-\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k\n-  IMAGE/sysupgrade.itb := append-kernel | \\\n-\tfit gzip $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb external-static-with-rootfs | append-metadata\n   DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware\n-  ARTIFACTS := preloader.bin bl31-uboot.fip\n-  ARTIFACT/preloader.bin := mt7981-bl2 spim-nand-ddr3\n-  ARTIFACT/bl31-uboot.fip := mt7981-bl31-uboot jcg_q30-pro\n+  IMAGES += factory.bin\n+  IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n endef\n TARGET_DEVICES += jcg_q30-pro\n \n define Device/jdcloud_re-cp-03\n   DEVICE_VENDOR := JDCloud\n-  DEVICE_MODEL := RE-CP-03\n+  DEVICE_MODEL := AX6000 Baili(RE-CP-03)\n   DEVICE_DTS := mt7986a-jdcloud-re-cp-03\n   DEVICE_DTS_DIR := ../dts\n-  DEVICE_DTC_FLAGS := --pad 4096\n-  DEVICE_DTS_LOADADDR := 0x43f00000\n   DEVICE_PACKAGES := kmod-mt7915e kmod-mt7986-firmware mt7986-wo-firmware \\\n-\te2fsprogs f2fsck mkf2fs\n-  KERNEL_LOADADDR := 0x44000000\n-  KERNEL := kernel-bin | gzip\n-  KERNEL_INITRAMFS := kernel-bin | lzma | \\\n-\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k\n-  KERNEL_INITRAMFS_SUFFIX := -recovery.itb\n-  IMAGES := sysupgrade.itb\n-  IMAGE_SIZE := $$(shell expr 64 + $$(CONFIG_TARGET_ROOTFS_PARTSIZE))m\n-  IMAGE/sysupgrade.itb := append-kernel | \\\n-\tfit gzip $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb external-static-with-rootfs | \\\n-\tpad-rootfs | append-metadata\n-  ARTIFACTS :=gpt.bin preloader.bin bl31-uboot.fip\n-  ARTIFACT/gpt.bin := mt798x-gpt emmc\n-  ARTIFACT/preloader.bin := mt7986-bl2 emmc-ddr4\n-  ARTIFACT/bl31-uboot.fip := mt7986-bl31-uboot jdcloud_re-cp-03\n+\te2fsprogs f2fsck mkf2fs losetup kmod-mmc kmod-nls-cp437 kmod-nls-iso8859-1 blkid blockdev\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n endef\n TARGET_DEVICES += jdcloud_re-cp-03\n \n@@ -1859,18 +1811,14 @@ define Device/konka_komi-a31\n   UBINIZE_OPTS := -E 5\n   BLOCKSIZE := 128k\n   PAGESIZE := 2048\n+  IMAGE_SIZE := 114688k\n   KERNEL_IN_UBI := 1\n-  UBOOTENV_IN_UBI := 1\n-  IMAGES := sysupgrade.itb\n-  KERNEL_INITRAMFS_SUFFIX := -recovery.itb\n   KERNEL := kernel-bin | gzip\n   KERNEL_INITRAMFS := kernel-bin | lzma | \\\n \tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k\n-  IMAGE/sysupgrade.itb := append-kernel | \\\n-\tfit gzip $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb external-static-with-rootfs | append-metadata\n-  ARTIFACTS := preloader.bin bl31-uboot.fip\n-  ARTIFACT/preloader.bin := mt7981-bl2 spim-nand-ddr3\n-  ARTIFACT/bl31-uboot.fip := mt7981-bl31-uboot konka_komi-a31\n+  IMAGES += factory.bin\n+  IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n endef\n TARGET_DEVICES += konka_komi-a31\n \n@@ -2161,18 +2109,11 @@ define Device/netcore_n60\n   BLOCKSIZE := 128k\n   PAGESIZE := 2048\n   KERNEL_IN_UBI := 1\n-  UBOOTENV_IN_UBI := 1\n-  IMAGES := sysupgrade.itb\n-  KERNEL_INITRAMFS_SUFFIX := -recovery.itb\n-  KERNEL := kernel-bin | gzip\n-  KERNEL_INITRAMFS := kernel-bin | lzma | \\\n-\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k\n-  IMAGE/sysupgrade.itb := append-kernel | \\\n-\tfit gzip $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb external-static-with-rootfs | append-metadata\n   DEVICE_PACKAGES := kmod-mt7915e kmod-mt7986-firmware mt7986-wo-firmware\n-  ARTIFACTS := preloader.bin bl31-uboot.fip\n-  ARTIFACT/preloader.bin := mt7986-bl2 spim-nand-ddr3\n-  ARTIFACT/bl31-uboot.fip := mt7986-bl31-uboot netcore_n60\n+  IMAGE_SIZE := 112640k\n+  IMAGES += factory.bin\n+  IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n endef\n TARGET_DEVICES += netcore_n60\n \n@@ -2185,18 +2126,11 @@ define Device/netcore_n60-pro\n   BLOCKSIZE := 128k\n   PAGESIZE := 2048\n   KERNEL_IN_UBI := 1\n-  UBOOTENV_IN_UBI := 1\n-  IMAGES := sysupgrade.itb\n-  KERNEL_INITRAMFS_SUFFIX := -recovery.itb\n-  KERNEL := kernel-bin | gzip\n-  KERNEL_INITRAMFS := kernel-bin | lzma | \\\n-\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k\n-  IMAGE/sysupgrade.itb := append-kernel | \\\n-\tfit gzip $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb external-static-with-rootfs | append-metadata\n   DEVICE_PACKAGES := kmod-mt7915e kmod-mt7986-firmware mt7986-wo-firmware kmod-usb3\n-  ARTIFACTS := preloader.bin bl31-uboot.fip\n-  ARTIFACT/preloader.bin := mt7986-bl2 spim-nand-ddr4\n-  ARTIFACT/bl31-uboot.fip := mt7986-bl31-uboot netcore_n60-pro\n+  IMAGE_SIZE := 112640k\n+  IMAGES += factory.bin\n+  IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n endef\n TARGET_DEVICES += netcore_n60-pro\n \n@@ -2361,20 +2295,32 @@ define Device/nokia_ea0326gmp\n   BLOCKSIZE := 128k\n   PAGESIZE := 2048\n   KERNEL_IN_UBI := 1\n-  UBOOTENV_IN_UBI := 1\n-  IMAGES := sysupgrade.itb\n-  KERNEL_INITRAMFS_SUFFIX := -recovery.itb\n-  KERNEL := kernel-bin | gzip\n-  KERNEL_INITRAMFS := kernel-bin | lzma | \\\n-\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k\n-  IMAGE/sysupgrade.itb := append-kernel | \\\n-\tfit gzip $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb external-static-with-rootfs | append-metadata\n-  ARTIFACTS := preloader.bin bl31-uboot.fip\n-  ARTIFACT/preloader.bin := mt7981-bl2 spim-nand-ddr3\n-  ARTIFACT/bl31-uboot.fip := mt7981-bl31-uboot nokia_ea0326gmp\n+  IMAGE_SIZE := 112640k\n+  IMAGES += factory.bin\n+  IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n endef\n TARGET_DEVICES += nokia_ea0326gmp\n \n+define Device/nradio_c8-660\n+  DEVICE_VENDOR := NRadio\n+  DEVICE_MODEL := C8-660\n+  DEVICE_DTS := mt7981b-nradio-c8-660\n+  DEVICE_DTS_DIR := ../dts\n+  UBINIZE_OPTS := -E 5\n+  BLOCKSIZE := 128k\n+  PAGESIZE := 2048\n+  IMAGE_SIZE := 131072k\n+  KERNEL_IN_UBI := 1\n+  DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware \\\n+\tkmod-usb-serial-option kmod-usb-net-cdc-ether kmod-usb-net-qmi-wwan \\\n+\tkmod-usb3\n+  IMAGES += factory.bin\n+  IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n+endef\n+TARGET_DEVICES += nradio_c8-660\n+\n define Device/nradio_c8-668gl\n   DEVICE_VENDOR := NRadio\n   DEVICE_MODEL := C8-668GL\n@@ -2463,7 +2409,7 @@ define Device/openwrt_one\n   UBINIZE_PARTS := fip=:$(STAGING_DIR_IMAGE)/mt7981_openwrt_one-snand-u-boot.fip \\\n \t\t   $(if $(IB),recovery=:$(STAGING_DIR_IMAGE)/mediatek-filogic-openwrt_one-initramfs.itb,\\\n \t\t\t      recovery=:$(KDIR)/tmp/$$(KERNEL_INITRAMFS_IMAGE)) \\\n-\t\t   $(if $(wildcard $(TOPDIR)/openwrt-mediatek-filogic-openwrt_one-calibration.itb), calibration=:$(TOPDIR)/openwrt-mediatek-filogic-openwrt_one-calibration.itb)\n+\t\t   $(if $(wildcard $(TOPDIR)/kwrt-mediatek-filogic-openwrt_one-calibration.itb), calibration=:$(TOPDIR)/kwrt-mediatek-filogic-openwrt_one-calibration.itb)\n endef\n TARGET_DEVICES += openwrt_one\n \n@@ -2475,19 +2421,12 @@ define Device/qihoo_360t7\n   UBINIZE_OPTS := -E 5\n   BLOCKSIZE := 128k\n   PAGESIZE := 2048\n+  IMAGE_SIZE := 112640k\n   KERNEL_IN_UBI := 1\n-  UBOOTENV_IN_UBI := 1\n-  IMAGES := sysupgrade.itb\n-  KERNEL_INITRAMFS_SUFFIX := -recovery.itb\n-  KERNEL := kernel-bin | gzip\n-  KERNEL_INITRAMFS := kernel-bin | lzma | \\\n-\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k\n-  IMAGE/sysupgrade.itb := append-kernel | \\\n-\tfit gzip $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb external-static-with-rootfs | append-metadata\n+  IMAGES += factory.bin\n+  IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n   DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware\n-  ARTIFACTS := preloader.bin bl31-uboot.fip\n-  ARTIFACT/preloader.bin := mt7981-bl2 spim-nand-ddr3\n-  ARTIFACT/bl31-uboot.fip := mt7981-bl31-uboot qihoo_360t7\n endef\n TARGET_DEVICES += qihoo_360t7\n \n@@ -2762,17 +2701,8 @@ define Device/tplink_tl-xdr-common\n   BLOCKSIZE := 128k\n   PAGESIZE := 2048\n   KERNEL_IN_UBI := 1\n-  UBOOTENV_IN_UBI := 1\n-  IMAGES := sysupgrade.itb\n-  KERNEL_INITRAMFS_SUFFIX := -recovery.itb\n-  KERNEL := kernel-bin | gzip\n-  KERNEL_INITRAMFS := kernel-bin | lzma | \\\n-\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k\n-  IMAGE/sysupgrade.itb := append-kernel | \\\n-\tfit gzip $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb external-with-rootfs | append-metadata\n-  DEVICE_PACKAGES := fitblk kmod-usb3 kmod-mt7915e kmod-mt7986-firmware mt7986-wo-firmware\n-  ARTIFACTS := preloader.bin bl31-uboot.fip\n-  ARTIFACT/preloader.bin := mt7986-bl2 spim-nand-ddr3\n+  DEVICE_PACKAGES := kmod-usb3 kmod-mt7915e kmod-mt7986-firmware mt7986-wo-firmware\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n endef\n \n define Device/tplink_tl-xdr4288\n@@ -2989,14 +2919,18 @@ endif\n endef\n TARGET_DEVICES += xiaomi_mi-router-ax3000t-ubootmod\n \n-define Device/xiaomi_mi-router-wr30u-stock\n+define Device/xiaomi_mi-router-wr30u\n   DEVICE_VENDOR := Xiaomi\n-  DEVICE_MODEL := Mi Router WR30U (stock layout)\n-  DEVICE_DTS := mt7981b-xiaomi-mi-router-wr30u-stock\n+  DEVICE_MODEL := Mi Router WR30U\n+  DEVICE_DTS := mt7981b-xiaomi-mi-router-wr30u\n   DEVICE_DTS_DIR := ../dts\n   UBINIZE_OPTS := -E 5\n   BLOCKSIZE := 128k\n   PAGESIZE := 2048\n+  IMAGE_SIZE := 114688k\n+  KERNEL_IN_UBI := 1\n+  IMAGES += factory.bin\n+  IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)\n   DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware\n ifeq ($(IB),)\n ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),)\n@@ -3006,7 +2940,7 @@ endif\n endif\n   IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n endef\n-TARGET_DEVICES += xiaomi_mi-router-wr30u-stock\n+TARGET_DEVICES += xiaomi_mi-router-wr30u\n \n define Device/xiaomi_mi-router-wr30u-ubootmod\n   DEVICE_VENDOR := Xiaomi\n@@ -3087,6 +3021,23 @@ endif\n endef\n TARGET_DEVICES += xiaomi_redmi-router-ax6000-ubootmod\n \n+define Device/xiaomi_redmi-router-ax6000\n+  DEVICE_VENDOR := Xiaomi\n+  DEVICE_MODEL := Redmi Router AX6000\n+  DEVICE_DTS := mt7986a-xiaomi-redmi-router-ax6000\n+  DEVICE_DTS_DIR := ../dts\n+  DEVICE_PACKAGES := kmod-leds-ws2812b kmod-mt7915e kmod-mt7986-firmware mt7986-wo-firmware\n+  UBINIZE_OPTS := -E 5\n+  BLOCKSIZE := 128k\n+  PAGESIZE := 2048\n+  KERNEL_IN_UBI := 1\n+  IMAGE_SIZE := 112640k\n+  IMAGES += factory.bin\n+  IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n+endef\n+TARGET_DEVICES += xiaomi_redmi-router-ax6000\n+\n define Device/yuncore_ax835\n   DEVICE_VENDOR := YunCore\n   DEVICE_MODEL := AX835\n@@ -3269,3 +3220,237 @@ define Device/zyxel_nwa50ax-pro\n   IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n endef\n TARGET_DEVICES += zyxel_nwa50ax-pro\n+\n+define Device/philips_hy3000\n+  DEVICE_VENDOR := Philips\n+  DEVICE_MODEL := HY3000\n+  DEVICE_DTS := mt7981b-philips-hy3000\n+  DEVICE_DTS_DIR := ../dts\n+  DEVICE_PACKAGES := kmod-usb3 f2fsck mkf2fs\n+  SUPPORTED_DEVICES += philips,hy3000\n+  KERNEL := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb\n+  KERNEL_INITRAMFS := kernel-bin | lzma | \\\n+        fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n+endef\n+TARGET_DEVICES += philips_hy3000\n+\n+define Device/sl_3000-emmc\n+  DEVICE_VENDOR := SL\n+  DEVICE_MODEL := 3000 eMMC\n+  DEVICE_DTS := mt7981b-sl-3000-emmc\n+  DEVICE_DTS_DIR := ../dts\n+  DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware blkid blockdev fdisk f2fsck mkf2fs kmod-mmc\n+  KERNEL := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb\n+  KERNEL_INITRAMFS := kernel-bin | lzma | \\\n+\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n+endef\n+TARGET_DEVICES += sl_3000-emmc\n+\n+define Device/bt_r320\n+  DEVICE_VENDOR := Globitel\n+  DEVICE_MODEL := BT-R320\n+  DEVICE_DTS := mt7981b-bt-r320\n+  DEVICE_DTS_DIR := ../dts\n+  DEVICE_PACKAGES := kmod-usb3 kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware e2fsprogs f2fsck mkf2fs\n+  KERNEL := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb\n+  KERNEL_INITRAMFS := kernel-bin | lzma | \\\n+\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n+endef\n+TARGET_DEVICES += bt_r320\n+\n+define Device/newland_nl-wr8103\n+  DEVICE_VENDOR := Newland\n+  DEVICE_MODEL := NL-WR8103\n+  DEVICE_DTS := mt7981b-newland-nl-wr8103\n+  DEVICE_DTS_DIR := ../dts\n+  DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware\n+  UBINIZE_OPTS := -E 5\n+  BLOCKSIZE := 128k\n+  PAGESIZE := 2048\n+  IMAGE_SIZE := 116736k\n+  KERNEL_IN_UBI := 1  \n+  IMAGES += factory.bin\n+  IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n+endef\n+TARGET_DEVICES += newland_nl-wr8103\n+\n+define Device/umi_uax3000e\n+  DEVICE_VENDOR := UMI\n+  DEVICE_MODEL := UAX3000E\n+  DEVICE_DTS := mt7981b-umi-uax3000e\n+  DEVICE_DTS_DIR := ../dts\n+  DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware \\\n+\tkmod-usb-net-cdc-mbim kmod-usb-net-qmi-wwan kmod-usb-serial-option \\\n+\tkmod-usb3 blkid blockdev fdisk f2fsck mkf2fs kmod-mmc mmc-utils\n+  KERNEL := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb\n+  KERNEL_INITRAMFS := kernel-bin | lzma | \\\n+\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n+endef\n+TARGET_DEVICES += umi_uax3000e\n+\n+define Device/glinet_gl-mt3600be\n+  DEVICE_VENDOR := GL.iNet\n+  DEVICE_MODEL := GL-MT3600BE\n+  DEVICE_DTS := mt7987a-glinet-gl-mt3600be\n+  DEVICE_DTS_DIR := ../dts\n+  DEVICE_PACKAGES := mt7987-2p5g-phy-firmware kmod-mt7990-firmware \\\n+\tkmod-hwmon-pwmfan kmod-usb3\n+  KERNEL = kernel-bin | lzma | \\\n+\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb\n+  KERNEL_INITRAMFS = kernel-bin | lzma | \\\n+\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd\n+  KERNEL_IN_UBI := 1\n+  KERNEL_LOADADDR := 0x40000000\n+  UBINIZE_OPTS := -E 5\n+  BLOCKSIZE := 128k\n+  PAGESIZE := 2048\n+  IMAGE_SIZE := 483328k\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n+endef\n+TARGET_DEVICES += glinet_gl-mt3600be\n+\n+define Device/ikuai_q3000\n+  DEVICE_VENDOR := iKuai\n+  DEVICE_MODEL := Q3000\n+  DEVICE_DTS := mt7981b-ikuai-q3000\n+  DEVICE_DTS_DIR := ../dts\n+  SUPPORTED_DEVICES := ikuai,q3000\n+  UBINIZE_OPTS := -E 5\n+  BLOCKSIZE := 128k\n+  PAGESIZE := 2048\n+  IMAGE_SIZE := 114816k\n+  KERNEL_IN_UBI := 1\n+  IMAGES += factory.bin\n+  IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n+endef\n+TARGET_DEVICES += ikuai_q3000\n+\n+define Device/imou_lc-hx3001\n+  DEVICE_VENDOR := IMOU\n+  DEVICE_MODEL := LC-HX3001\n+  DEVICE_DTS := mt7981b-imou-lc-hx3001\n+  DEVICE_DTS_DIR := ../dts\n+  DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware\n+  SUPPORTED_DEVICES += imou,lc-hx3001\n+  UBINIZE_OPTS := -E 5\n+  BLOCKSIZE := 128k\n+  PAGESIZE := 2048\n+  IMAGE_SIZE := 113152k\n+  KERNEL_IN_UBI := 1\n+  IMAGES += factory.bin\n+  IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n+  KERNEL = kernel-bin | lzma | \\\n+\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb\n+  KERNEL_INITRAMFS = kernel-bin | lzma | \\\n+\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd\n+endef\n+TARGET_DEVICES += imou_lc-hx3001\n+\n+define Device/cmcc_rax3000m-nand\n+  DEVICE_VENDOR := CMCC\n+  DEVICE_MODEL := RAX3000M NAND\n+  DEVICE_DTS := mt7981b-cmcc-rax3000m-nand\n+  DEVICE_DTS_DIR := ../dts\n+  DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware kmod-usb3 \\\n+\te2fsprogs f2fsck mkf2fs\n+  UBINIZE_OPTS := -E 5\n+  BLOCKSIZE := 128k\n+  PAGESIZE := 2048\n+  IMAGE_SIZE := 116736k\n+  KERNEL_IN_UBI := 1\n+  IMAGES += factory.bin\n+  IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n+endef\n+TARGET_DEVICES += cmcc_rax3000m-nand\n+\n+define Device/cmcc_rax3000m-emmc\n+  DEVICE_VENDOR := CMCC\n+  DEVICE_MODEL := RAX3000M eMMC\n+  DEVICE_DTS := mt7981b-cmcc-rax3000m-emmc\n+  DEVICE_DTS_DIR := ../dts\n+  DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware kmod-usb3 \\\n+\te2fsprogs f2fsck mkf2fs losetup kmod-fs-f2fs kmod-mmc\n+  KERNEL := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb\n+  KERNEL_INITRAMFS := kernel-bin | lzma | \\\n+\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n+endef\n+TARGET_DEVICES += cmcc_rax3000m-emmc\n+\n+define Device/cmcc_xr30\n+  DEVICE_VENDOR := CMCC\n+  DEVICE_MODEL := XR30 NAND\n+  DEVICE_DTS := mt7981b-cmcc-xr30\n+  DEVICE_DTS_DIR := ../dts\n+  DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware kmod-usb3 \\\n+\te2fsprogs f2fsck mkf2fs\n+  UBINIZE_OPTS := -E 5\n+  BLOCKSIZE := 128k\n+  PAGESIZE := 2048\n+  IMAGE_SIZE := 116736k\n+  KERNEL_IN_UBI := 1\n+  IMAGES += factory.bin\n+  IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n+endef\n+TARGET_DEVICES += cmcc_xr30\n+\n+define Device/cmcc_xr30-emmc\n+  DEVICE_VENDOR := CMCC\n+  DEVICE_MODEL := XR30 eMMC (RAX3000Z增强版)\n+  DEVICE_DTS := mt7981b-cmcc-xr30-emmc\n+  DEVICE_DTS_DIR := ../dts\n+  DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware kmod-usb3 \\\n+\te2fsprogs f2fsck mkf2fs losetup kmod-fs-f2fs kmod-mmc\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n+endef\n+TARGET_DEVICES += cmcc_xr30-emmc\n+\n+define Device/cmcc_mr3000d-ciq-256m\n+  DEVICE_VENDOR := CMCC\n+  DEVICE_MODEL := MR3000D-CIq (256M)\n+  DEVICE_DTS := mt7981b-cmcc-mr3000d-ciq-256m\n+  DEVICE_DTS_DIR := ../dts\n+  DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware uboot-envtools\n+  SUPPORTED_DEVICES := cmcc,mr3000d-ciq-256m mt7981-spim-nand-gsw-wr3000k\n+  UBINIZE_OPTS := -E 5\n+  BLOCKSIZE := 128k\n+  PAGESIZE := 2048\n+  IMAGE_SIZE := 65536k\n+  KERNEL_IN_UBI := 1\n+  IMAGES += factory.bin\n+  IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE)\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n+  KERNEL = kernel-bin | lzma | \\\n+\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb\n+  KERNEL_INITRAMFS = kernel-bin | lzma | \\\n+\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd\n+ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),)\n+ifeq ($(CONFIG_TARGET_ROOTFS_INITRAMFS_SEPARATE),)\n+  ARTIFACTS := initramfs-MR3000D-CIq-factory.bin\n+  ARTIFACT/initramfs-MR3000D-CIq-factory.bin := append-image-stage initramfs-kernel.bin | sysupgrade-initramfs-tar | append-metadata | tenbay-factory MR3000D-CIq\n+endif\n+endif\n+endef\n+TARGET_DEVICES += cmcc_mr3000d-ciq-256m\n+\n+define Device/aigo_ags21\n+  DEVICE_VENDOR := Aigo\n+  DEVICE_MODEL := AGS21\n+  DEVICE_DTS := mt7981b-aigo-ags21\n+  DEVICE_DTS_DIR := ../dts\n+  DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware automount coremark blkid blockdev fdisk f2fsck mkf2fs kmod-mmc mmc-utils\n+  KERNEL := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb\n+  KERNEL_INITRAMFS := kernel-bin | lzma | \\\n+\tfit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n+endef\n+TARGET_DEVICES += aigo_ags21\n"
  },
  {
    "path": "devices/mediatek_filogic/patches/02-ax6000.patch",
    "content": "new file mode 100644\nindex 0000000000000..759baae3aeb18\n--- /dev/null\n+++ b/target/linux/mediatek/dts/mt7986a-xiaomi-redmi-router-ax6000.dts\n@@ -0,0 +1,32 @@\n+// SPDX-License-Identifier: (GPL-2.0 OR MIT)\n+\n+/dts-v1/;\n+#include \"mt7986a-xiaomi-redmi-router-ax6000.dtsi\"\n+\n+/ {\n+\tmodel = \"Xiaomi Redmi Router AX6000\";\n+\tcompatible = \"xiaomi,redmi-router-ax6000\", \"mediatek,mt7986a\";\n+};\n+\n+&spi_nand_flash {\n+\tmediatek,nmbm;\n+\tmediatek,bmt-max-ratio = <1>;\n+\tmediatek,bmt-max-reserved-blocks = <64>;\n+};\n+\n+&partitions {\n+\t\t\tpartition@580000 {\n+\t\t\t\tlabel = \"crash\";\n+\t\t\t\treg = <0x580000 0x40000>;\n+\t\t\t};\n+\n+\t\t\tpartition@5c0000 {\n+\t\t\t\tlabel = \"crash_log\";\n+\t\t\t\treg = <0x5c0000 0x40000>;\n+\t\t\t};\n+\n+\t\t\tpartition@600000 {\n+\t\t\t\tlabel = \"ubi\";\n+\t\t\t\treg = <0x600000 0x6e00000>;\n+\t\t\t};\n+};\n\n--- a/target/linux/mediatek/base-files/lib/preinit/05_set_preinit_iface\n+++ b/target/linux/mediatek/base-files/lib/preinit/05_set_preinit_iface\n@@ -30,9 +30,9 @@ set_preinit_iface() {\n \t\t;;\n \txiaomi,mi-router-ax3000t|\\\n \txiaomi,mi-router-ax3000t-ubootmod|\\\n-\txiaomi,mi-router-wr30u-stock|\\\n+\txiaomi,mi-router-wr30u|\\\n \txiaomi,mi-router-wr30u-ubootmod|\\\n-\txiaomi,redmi-router-ax6000-stock|\\\n+\txiaomi,redmi-router-ax6000|\\\n \txiaomi,redmi-router-ax6000-ubootmod)\n \t\tip link set eth0 up\n \t\tifname=lan4\n"
  },
  {
    "path": "devices/mediatek_filogic/patches/03-nx30.patch",
    "content": "--- a/target/linux/mediatek/dts/mt7981b-h3c-magic-nx30-pro.dts\n+++ b/target/linux/mediatek/dts/mt7981b-h3c-magic-nx30-pro.dts\n@@ -112,6 +112,10 @@\n \t\tspi-tx-bus-width = <4>;\n \t\tspi-rx-bus-width = <4>;\n \n+\t\tmediatek,nmbm;\n+\t\tmediatek,bmt-max-ratio = <1>;\n+\t\tmediatek,bmt-max-reserved-blocks = <64>;\n+\n \t\tpartitions {\n \t\t\tcompatible = \"fixed-partitions\";\n \t\t\t#address-cells = <1>;\n"
  },
  {
    "path": "devices/mediatek_filogic/patches/08-cmcc_rax3000m.patch",
    "content": "--- a/target/linux/mediatek/filogic/base-files/etc/board.d/02_network\n+++ b/target/linux/mediatek/filogic/base-files/etc/board.d/02_network\n@@ -10,12 +10,17 @@ mediatek_setup_interfaces()\n \tcase $board in\n \tabt,asr3000|\\\n \tbuffalo,wsr-6000ax8|\\\n-\tcmcc,rax3000m|\\\n+\tcmcc,mr3000d-ciq-256m|\\\n+\tcmcc,rax3000m*|\\\n+\tcmcc,xr30*|\\\n+\timou,lc-hx3001|\\\n+\tumi,uax3000e|\\\n \th3c,magic-nx30-pro|\\\n \timou,hx21|\\\n \tkonka,komi-a31|\\\n \tnetis,nx30v2|\\\n \tnetis,nx31|\\\n+\tnewland,nl-wr8103|\\\n \tnokia,ea0326gmp|\\\n \tmercusys,mr80x-v3|\\\n \trouterich,ax3000-v1|\\\n@@ -38,6 +43,9 @@ mediatek_setup_interfaces()\n \tacer,vero-w6m)\n \t\tucidef_set_interfaces_lan_wan \"lan1 lan2 lan3\" internet\n \t\t;;\n+\taigo,ags21)\n+\t\tucidef_set_interfaces_lan_wan \"lan1 lan2\" eth1\n+\t\t;;\n \tarcadyan,mozart)\n \t\tucidef_set_interfaces_lan_wan \"lan0 eth1\" eth2\n \t\t;;\n@@ -46,17 +54,21 @@ mediatek_setup_interfaces()\n \tasus,zenwifi-bt8|\\\n \tasus,zenwifi-bt8-ubootmod|\\\n \tcetron,ct3003|\\\n-\tcmcc,a10-stock|\\\n+\tcmcc,a10|\\\n \tcmcc,a10-ubootmod|\\\n \tconfiabits,mt7981|\\\n \tcreatlentem,clt-r30b1|\\\n \tcreatlentem,clt-r30b1-112m|\\\n \tcudy,wr3000-v1|\\\n+\tikuai,q3000|\\\n \tjcg,q30-pro|\\\n \tkeenetic,kn-3711|\\\n \tkeenetic,kn-3811|\\\n \tnetis,nx32u|\\\n \tqihoo,360t7|\\\n+\tphilips,hy3000|\\\n+\tsl,3000*|\\\n+\tbt,r320|\\\n \trouterich,ax3000|\\\n \trouterich,ax3000-ubootmod|\\\n \trouterich,be7200|\\\n@@ -70,6 +82,7 @@ mediatek_setup_interfaces()\n \tmediatek,mt7981-rfb|\\\n \tnetcore,n60|\\\n \tnetcore,n60-pro|\\\n+\tnradio,c8-660|\\\n \tnradio,c8-668gl|\\\n \truijie,rg-x60-pro|\\\n \tunielec,u7981-01*|\\\n@@ -130,7 +143,8 @@ mediatek_setup_interfaces()\n \tcudy,m3000-v1|\\\n \tcudy,tr3000-256mb-v1|\\\n \tcudy,tr3000-v1|\\\n-\tcudy,tr3000-v1-ubootmod|\\\n+\tcudy,tr3000-mod|\\\n+\tglinet,gl-mt3600be|\\\n \tglinet,gl-mt2500|\\\n \tglinet,gl-mt2500-airoha|\\\n \tglinet,gl-mt3000|\\\n@@ -170,6 +186,10 @@ mediatek_setup_interfaces()\n \t\tucidef_add_switch \"switch0\" \"0:lan0\" \"1:lan1\" \"2:lan2\" \"6@eth0\"\n \t\tucidef_set_interfaces_lan_wan \"eth0.1 eth0.2 eth0.3\" eth1\n \t\t;;\n+\tikuai,q3000)\n+\t\twan_mac=$(mtd_get_mac_binary $part_name 0x10048)\n+\t\tlan_mac=$(macaddr_add $wan_mac 1)\n+\t\t;;\n \tmercusys,mr90x-v1|\\\n \tmercusys,mr90x-v1-ubi)\n \t\tucidef_set_interfaces_lan_wan \"lan0 lan1 lan2\" eth1\n@@ -193,11 +213,21 @@ mediatek_setup_interfaces()\n \ttplink,re6000xd)\n \t\tucidef_set_interface_lan \"lan1 lan2 eth1\"\n \t\t;;\n+\tphilips,hy3000)\n+\t\tlan_mac=$(mmc_get_mac_binary factory 0x74)\n+\t\twan_mac=$(macaddr factory $lan_mac 1)\n+\t\tlabel_mac=$wan_mac\n+\t\t;;\n+ \tsl,3000-emmc)\n+ \t\tlan_mac=$(mmc_get_mac_binary factory 0x04)\t\t\n+ \t\twan_mac=$(macaddr_add \"$lan_mac\" -2)\n+ \t\tlabel_mac=$lan_mac\n+ \t\t;;\n \txiaomi,mi-router-ax3000t|\\\n \txiaomi,mi-router-ax3000t-ubootmod|\\\n-\txiaomi,mi-router-wr30u-stock|\\\n+\txiaomi,mi-router-wr30u|\\\n \txiaomi,mi-router-wr30u-ubootmod|\\\n-\txiaomi,redmi-router-ax6000-stock|\\\n+\txiaomi,redmi-router-ax6000|\\\n \txiaomi,redmi-router-ax6000-ubootmod)\n \t\tucidef_set_interfaces_lan_wan \"lan2 lan3 lan4\" wan\n \t\t;;\n@@ -238,6 +268,12 @@ mediatek_setup_macs()\n \tbananapi,bpi-r4-lite)\n \t\twan_mac=$(macaddr_add $(cat /sys/class/net/eth0/address) 1)\n \t\t;;\n+\timou,lc-hx3001)\n+\t\tlan_mac=$(mtd_get_mac_ascii u-boot-env mac)\n+\t\t[ -n \"$lan_mac\" ] || lan_mac=$(macaddr_add $(mtd_get_mac_binary Factory 0x4) -1)\n+\t\twan_mac=$(macaddr_add $lan_mac 2)\n+\t\tlabel_mac=\"$lan_mac\"\n+\t\t;;\n \th3c,magic-nx30-pro)\n \t\twan_mac=$(mtd_get_mac_ascii pdt_data_1 ethaddr)\n \t\tlan_mac=$(macaddr_add \"$wan_mac\" 1)\n@@ -261,11 +297,17 @@ mediatek_setup_macs()\n \t\tlan_mac=$(mtd_get_mac_ascii u-boot-env mac)\n \t\tlabel_mac=$lan_mac\n \t\t;;\n+\tnradio,c8-660|\\\n \tnradio,c8-668gl)\n \t\tlan_mac=$(mmc_get_mac_ascii bdinfo \"fac_mac \")\n \t\twan_mac=$(macaddr_add \"$lan_mac\" 2)\n \t\tlabel_mac=$lan_mac\n \t\t;;\n+\tnewland,nl-wr8103)\n+ \t\tlabel_mac=$(mtd_get_mac_binary Factory 0x04)\t\t\n+ \t\twan_mac=$(macaddr_add \"$label_mac\" -2)\n+ \t\tlan_mac=$label_mac\n+ \t\t;;\n \tqihoo,360t7)\n \t\tlan_mac=$(mtd_get_mac_ascii factory lanMac)\n \t\twan_mac=$(macaddr_add \"$lan_mac\" 1)\n@@ -286,9 +328,9 @@ mediatek_setup_macs()\n \t\t;;\n \txiaomi,mi-router-ax3000t|\\\n \txiaomi,mi-router-ax3000t-ubootmod|\\\n-\txiaomi,mi-router-wr30u-stock|\\\n+\txiaomi,mi-router-wr30u|\\\n \txiaomi,mi-router-wr30u-ubootmod|\\\n-\txiaomi,redmi-router-ax6000-stock|\\\n+\txiaomi,redmi-router-ax6000|\\\n \txiaomi,redmi-router-ax6000-ubootmod)\n \t\twan_mac=$(mtd_get_mac_ascii Bdata ethaddr_wan)\n \t\tlabel_mac=$wan_mac\n\n--- a/target/linux/mediatek/filogic/base-files/etc/hotplug.d/firmware/11-mt76-caldata\n+++ b/target/linux/mediatek/filogic/base-files/etc/hotplug.d/firmware/11-mt76-caldata\n@@ -17,6 +17,12 @@ case \"$FIRMWARE\" in\n \ttplink,fr365-v1)\n \t\tln -sf /tmp/wlan/radio /lib/firmware/$FIRMWARE\n \t\t;;\n+\tumi,uax3000e|\\\n+\tsl,3000-emmc|\\\n+\tcmcc,rax3000m-emmc|\\\n+\tcmcc,xr30-emmc)\n+ \t\tcaldata_extract_mmc \"factory\" 0x0 0x1000\n+ \t\t;;\n \tesac\n \t;;\n \"mediatek/mt7986_eeprom_mt7975_dual.bin\")\n@@ -35,6 +40,10 @@ case \"$FIRMWARE\" in\n \t\tln -sf /tmp/tp_data/MT7986_EEPROM.bin \\\n \t\t\t/lib/firmware/$FIRMWARE\n \t\t;;\n+\tglinet,gl-mt6000|\\\n+\tjdcloud,re-cp-03)\n+\t\tcaldata_extract_mmc \"factory\" 0x0 0x1000\n+\t\t;;\n \tesac\n \t;;\n \"mediatek/mt7996/mt7992_eeprom.bin\")\n"
  },
  {
    "path": "devices/mediatek_filogic/patches/09-jcg_q30-pro.patch",
    "content": "--- a/target/linux/mediatek/dts/mt7981b-jcg-q30-pro.dts\n+++ b/target/linux/mediatek/dts/mt7981b-jcg-q30-pro.dts\n@@ -103,6 +103,10 @@\n \t\tspi-tx-bus-width = <4>;\n \t\tspi-rx-bus-width = <4>;\n \n+\t\tmediatek,nmbm;\n+\t\tmediatek,bmt-max-ratio = <1>;\n+\t\tmediatek,bmt-max-reserved-blocks = <64>;\n+\n \t\tpartitions {\n \t\t\tcompatible = \"fixed-partitions\";\n \t\t\t#address-cells = <1>;\n@@ -142,12 +146,11 @@\n \t\t\tpartition@380000 {\n \t\t\t\tlabel = \"fip\";\n \t\t\t\treg = <0x0380000 0x0200000>;\n-\t\t\t\tread-only;\n \t\t\t};\n \n \t\t\tpartition@580000 {\n \t\t\t\tlabel = \"ubi\";\n-\t\t\t\treg = <0x0580000 0x7000000>;\n+\t\t\t\treg = <0x0580000 0x6e80000>;\n \t\t\t\tcompatible = \"linux,ubi\";\n \n \t\t\t\tvolumes {"
  },
  {
    "path": "devices/mediatek_filogic/patches/12-asr3000.patch",
    "content": "--- a/target/linux/mediatek/dts/mt7981b-abt-asr3000.dts\n+++ b/target/linux/mediatek/dts/mt7981b-abt-asr3000.dts\n@@ -155,6 +155,10 @@\n \t\tspi-tx-bus-width = <4>;\n \t\tspi-rx-bus-width = <4>;\n \n+\t\tmediatek,nmbm;\n+\t\tmediatek,bmt-max-ratio = <1>;\n+\t\tmediatek,bmt-max-reserved-blocks = <64>;\n+\n \t\tpartitions {\n \t\t\tcompatible = \"fixed-partitions\";\n \t\t\t#address-cells = <1>;\n@@ -208,13 +212,12 @@\n \t\t\tpartition@380000 {\n \t\t\t\tlabel = \"fip\";\n \t\t\t\treg = <0x380000 0x200000>;\n-\t\t\t\tread-only;\n \t\t\t};\n \n \t\t\tpartition@580000 {\n \t\t\t\tcompatible = \"linux,ubi\";\n \t\t\t\tlabel = \"ubi\";\n-\t\t\t\treg = <0x580000 0x7a80000>;\n+\t\t\t\treg = <0x580000 0x6e80000>;\n \n \t\t\t\tvolumes {\n \t\t\t\t\tubi_rootdisk: ubi-volume-fit {\n"
  },
  {
    "path": "devices/mediatek_filogic/patches/16-komi-a31.patch",
    "content": "--- a/target/linux/mediatek/filogic/base-files/etc/hotplug.d/ieee80211/11_fix_wifi_mac\n+++ b/target/linux/mediatek/filogic/base-files/etc/hotplug.d/ieee80211/11_fix_wifi_mac\n@@ -95,7 +95,7 @@ case \"$board\" in\n \tcudy,re3000-v1|\\\n \tcudy,tr3000-256mb-v1|\\\n \tcudy,tr3000-v1|\\\n-\tcudy,tr3000-v1-ubootmod|\\\n+\tcudy,tr3000-mod|\\\n \tcudy,wbr3000uax-v1|\\\n \tcudy,wbr3000uax-v1-ubootmod|\\\n \tcudy,wr3000e-v1|\\\n@@ -189,11 +189,18 @@ case \"$board\" in\n \t\t[ \"$PHYNBR\" = \"0\" ] && echo \"$addr_2g\" > /sys${DEVPATH}/macaddress\n \t\t[ \"$PHYNBR\" = \"1\" ] && echo \"$addr_5g\" > /sys${DEVPATH}/macaddress\n \t\t;;\n+\timou,lc-hx3001)\n+\t\taddr=$(mtd_get_mac_ascii u-boot-env mac)\n+\t\t[ -n \"$addr\" ] || addr=$(macaddr_add $(mtd_get_mac_binary Factory 0x4) -1)\n+\t\t[ \"$PHYNBR\" = \"0\" ] && macaddr_add $addr 1 > /sys${DEVPATH}/macaddress\n+\t\t[ \"$PHYNBR\" = \"1\" ] && macaddr_add $addr 3 > /sys${DEVPATH}/macaddress\n+\t\t;;\n \tnokia,ea0326gmp)\n \t\taddr=$(cat /sys/class/net/eth0/address)\n \t\t[ \"$PHYNBR\" = \"0\" ] && macaddr_add $addr 1 > /sys${DEVPATH}/macaddress\n \t\t[ \"$PHYNBR\" = \"1\" ] && macaddr_add $addr 2 > /sys${DEVPATH}/macaddress\n \t\t;;\n+\tc8-668gl|\\\n \tnradio,c8-668gl)\n \t\thw_mac_addr=$(mmc_get_mac_ascii bdinfo \"fac_mac \")\n \t\t[ \"$PHYNBR\" = \"0\" ] && echo \"$hw_mac_addr\" > /sys${DEVPATH}/macaddress\n@@ -227,6 +234,26 @@ case \"$board\" in\n \ttplink,tl-xtr8488)\n \t\t[ \"$PHYNBR\" = \"1\" ] && get_mac_label > /sys${DEVPATH}/macaddress\n \t\t;;\n+        umi,uax3000e)\n+\t\taddr=$(mmc_get_mac_binary factory 0x24)\n+\t\t[ \"$PHYNBR\" = \"0\" ] && macaddr_add $addr > /sys${DEVPATH}/macaddress\n+\t\t[ \"$PHYNBR\" = \"1\" ] && macaddr_add $addr 1 > /sys${DEVPATH}/macaddress\n+\t\t;;\n+        newland,nl-wr8103)\n+\t\taddr=$(mtd_get_mac_binary Factory 0x0A)\n+\t\t[ \"$PHYNBR\" = \"0\" ] && macaddr_add $addr > /sys${DEVPATH}/macaddress\n+\t\t[ \"$PHYNBR\" = \"1\" ] && macaddr_add $addr 1 > /sys${DEVPATH}/macaddress\n+\t\t;;\n+    sl,3000-emmc)\n+\t\tlabel_mac=$(mmc_get_mac_binary factory 0x04)\n+\t\t[ \"$PHYNBR\" = \"0\" ] && macaddr_add $label_mac 1 > /sys${DEVPATH}/macaddress\n+\t\t[ \"$PHYNBR\" = \"1\" ] && macaddr_add $label_mac 2 > /sys${DEVPATH}/macaddress\n+\t\t;;\n+    bt,r320)\n+\t\tlabel_mac=$(mmc_get_mac_binary factory 0x4)\n+\t\t[ \"$PHYNBR\" = \"0\" ] && macaddr_add $label_mac 1 > /sys${DEVPATH}/macaddress\n+\t\t[ \"$PHYNBR\" = \"1\" ] && macaddr_add $label_mac 2 > /sys${DEVPATH}/macaddress\n+\t\t;;\n \trouterich,ax3000|\\\n \trouterich,ax3000-ubootmod|\\\n \tzbtlink,zbt-z8102ax|\\"
  },
  {
    "path": "devices/mediatek_filogic/patches/17-lc-hx3001.patch",
    "content": "--- /dev/null\n+++ b/target/linux/mediatek/dts/mt7981b-imou-lc-hx3001.dts\n@@ -0,0 +1,239 @@\n+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n+\n+/dts-v1/;\n+#include <dt-bindings/gpio/gpio.h>\n+#include <dt-bindings/input/input.h>\n+\n+#include \"mt7981b.dtsi\"\n+\n+/ {\n+\tmodel = \"IMOU LC-HX3001 (uboot layout)\";\n+\tcompatible = \"imou,lc-hx3001\", \"mediatek,mt7981\";\n+\n+\taliases {\n+\t\tled-boot = &power_led;\n+\t\tled-failsafe = &power_led;\n+\t\tled-running = &power_led;\n+\t\tled-upgrade = &power_led;\n+\t\tserial0 = &uart0;\n+\t};\n+\n+\tchosen {\n+\t\tstdout-path = \"serial0:115200n8\";\n+\t};\n+\n+\tmemory {\n+\t\treg = <0 0x40000000 0 0x10000000>;\n+\t};\n+\n+\tgpio-keys {\n+\t\tcompatible = \"gpio-keys\";\n+\n+\t\tbutton-reset {\n+\t\t\tlabel = \"reset\";\n+\t\t\tlinux,code = <KEY_RESTART>;\n+\t\t\tgpios = <&pio 1 GPIO_ACTIVE_LOW>;\n+\t\t};\n+\n+\t\tbutton-mesh {\n+\t\t\tlabel = \"mesh\";\n+\t\t\tlinux,code = <BTN_9>;\n+\t\t\tlinux,input-type = <EV_SW>;\n+\t\t\tgpios = <&pio 0 GPIO_ACTIVE_LOW>;\n+\t\t};\n+\t};\n+\n+\tgpio-leds {\n+\t\tcompatible = \"gpio-leds\";\n+\n+\t\tpower_led: led-0 {\n+\t\t\tlabel = \"green:power\";\n+\t\t\tgpios = <&pio 4 GPIO_ACTIVE_LOW>;\n+\t\t};\n+\n+\t\tled-1 {\n+\t\t\tlabel = \"green:wlan\";\n+\t\t\tgpios = <&pio 5 GPIO_ACTIVE_LOW>;\n+\t\t};\n+\n+\t\tled-2 {\n+\t\t\tlabel = \"red:wan\";\n+\t\t\tgpios = <&pio 6 GPIO_ACTIVE_LOW>;\n+\t\t};\n+\n+\t\tled-3 {\n+\t\t\tlabel = \"green:wan\";\n+\t\t\tgpios = <&pio 7 GPIO_ACTIVE_LOW>;\n+\t\t};\n+\n+\t\tled-4 {\n+\t\t\tlabel = \"green:lan\";\n+\t\t\tgpios = <&pio 8 GPIO_ACTIVE_LOW>;\n+\t\t};\n+\t};\n+};\n+\n+&eth {\n+\tpinctrl-names = \"default\";\n+\tpinctrl-0 = <&mdio_pins>;\n+\n+\tstatus = \"okay\";\n+\n+\tgmac0: mac@0 {\n+\t\tcompatible = \"mediatek,eth-mac\";\n+\t\treg = <0>;\n+\t\tphy-mode = \"2500base-x\";\n+\n+\t\tfixed-link {\n+\t\t\tspeed = <2500>;\n+\t\t\tfull-duplex;\n+\t\t\tpause;\n+\t\t};\n+\t};\n+\n+\tgmac1: mac@1 {\n+\t\tcompatible = \"mediatek,eth-mac\";\n+\t\treg = <1>;\n+\t\tphy-mode = \"gmii\";\n+\t\tphy-handle = <&int_gbe_phy>;\n+\t};\n+};\n+\n+&mdio_bus {\n+\tswitch: switch@1f {\n+\t\tcompatible = \"mediatek,mt7531\";\n+\t\treg = <31>;\n+\t\treset-gpios = <&pio 39 GPIO_ACTIVE_HIGH>;\n+\t\tinterrupt-controller;\n+\t\t#interrupt-cells = <1>;\n+\t\tinterrupt-parent = <&pio>;\n+\t\tinterrupts = <38 IRQ_TYPE_LEVEL_HIGH>;\n+\t};\n+};\n+\n+&spi0 {\n+\tpinctrl-names = \"default\";\n+\tpinctrl-0 = <&spi0_flash_pins>;\n+\tstatus = \"okay\";\n+\n+\tspi_nand: flash@0 {\n+\t\t#address-cells = <1>;\n+\t\t#size-cells = <1>;\n+\t\tcompatible = \"spi-nand\";\n+\t\treg = <0>;\n+\t\tspi-max-frequency = <52000000>;\n+\n+\t\tspi-cal-enable;\n+\t\tspi-cal-mode = \"read-data\";\n+\t\tspi-cal-datalen = <7>;\n+\t\tspi-cal-data = /bits/ 8 <0x53 0x50 0x49 0x4E 0x41 0x4E 0x44>;\n+\t\tspi-cal-addrlen = <5>;\n+\t\tspi-cal-addr = /bits/ 32 <0x0 0x0 0x0 0x0 0x0>;\n+\n+\t\tspi-tx-bus-width = <4>;\n+\t\tspi-rx-bus-width = <4>;\n+\t\tmediatek,nmbm;\n+\t\tmediatek,bmt-max-ratio = <1>;\n+\t\tmediatek,bmt-max-reserved-blocks = <64>;\n+\n+\t\tpartitions {\n+\t\t\tcompatible = \"fixed-partitions\";\n+\t\t\t#address-cells = <1>;\n+\t\t\t#size-cells = <1>;\n+\n+\t\t\tpartition@0 {\n+\t\t\t\tlabel = \"BL2\";\n+\t\t\t\treg = <0x00000 0x100000>;\n+\t\t\t};\n+\n+\t\t\tpartition@100000 {\n+\t\t\t\tlabel = \"u-boot-env\";\n+\t\t\t\treg = <0x100000 0x80000>;\n+\t\t\t};\n+\n+\t\t\tfactory: partition@180000 {\n+\t\t\t\tlabel = \"Factory\";\n+\t\t\t\treg = <0x180000 0x200000>;\n+\t\t\t};\n+\n+\t\t\tpartition@380000 {\n+\t\t\t\tlabel = \"FIP\";\n+\t\t\t\treg = <0x380000 0x200000>;\n+\t\t\t};\n+\n+\t\t\tpartition@580000 {\n+\t\t\t\tlabel = \"ubi\";\n+\t\t\t\treg = <0x580000 0x7280000>;\n+\t\t\t};\n+\t\t};\n+\t};\n+};\n+\n+&switch {\n+\tports {\n+\t\t#address-cells = <1>;\n+\t\t#size-cells = <0>;\n+\n+\t\tport@0 {\n+\t\t\treg = <0>;\n+\t\t\tlabel = \"lan1\";\n+\t\t};\n+\n+\t\tport@1 {\n+\t\t\treg = <1>;\n+\t\t\tlabel = \"lan2\";\n+\t\t};\n+\n+\t\tport@2 {\n+\t\t\treg = <2>;\n+\t\t\tlabel = \"lan3\";\n+\t\t};\n+\n+\t\tport@6 {\n+\t\t\treg = <6>;\n+\t\t\tethernet = <&gmac0>;\n+\t\t\tphy-mode = \"2500base-x\";\n+\n+\t\t\tfixed-link {\n+\t\t\t\tspeed = <2500>;\n+\t\t\t\tfull-duplex;\n+\t\t\t\tpause;\n+\t\t\t};\n+\t\t};\n+\t};\n+};\n+\n+&pio {\n+\tspi0_flash_pins: spi0-pins {\n+\t\tmux {\n+\t\t\tfunction = \"spi\";\n+\t\t\tgroups = \"spi0\", \"spi0_wp_hold\";\n+\t\t};\n+\n+\t\tconf-pu {\n+\t\t\tpins = \"SPI0_CS\", \"SPI0_HOLD\", \"SPI0_WP\";\n+\t\t\tdrive-strength = <8>;\n+\t\t\tbias-pull-up = <103>;\n+\t\t};\n+\n+\t\tconf-pd {\n+\t\t\tpins = \"SPI0_CLK\", \"SPI0_MOSI\", \"SPI0_MISO\";\n+\t\t\tdrive-strength = <8>;\n+\t\t\tbias-pull-down = <103>;\n+\t\t};\n+\t};\n+};\n+\n+&uart0 {\n+\tstatus = \"okay\";\n+};\n+\n+&watchdog {\n+\tstatus = \"okay\";\n+};\n+\n+&wifi {\n+\tstatus = \"okay\";\n+\n+\tmediatek,mtd-eeprom = <&factory 0x0>;\n+};\n\n--- a/target/linux/mediatek/filogic/base-files/etc/board.d/01_leds\n+++ b/target/linux/mediatek/filogic/base-files/etc/board.d/01_leds\n@@ -24,6 +24,10 @@ acer,predator-w6x-stock|\\\n acer,predator-w6x-ubootmod)\n \tucidef_set_led_netdev \"wan\" \"wan\" \"rgb:status\" \"eth1\"\n \t;;\n+aigo,ags21)\n+\tucidef_set_led_netdev \"internet\" \"INTERNET\" \"green:status\" \"eth1\"\n+\tucidef_set_led_netdev \"wlan\" \"WLAN\" \"white:status\" \"phy1-ap0\"\n+\t;;\n asus,rt-ax52|\\\n asus,rt-ax57m|\\\n snr,snr-cpe-ax2)\n@@ -97,6 +101,11 @@ cudy,wbr3000uax-v1-ubootmod)\n elecom,wrc-x3000gs3)\n \tucidef_set_led_netdev \"wan\" \"wan\" \"green:wan\" \"wan\"\n \t;;\n+imou,lc-hx3001)\n+\tucidef_set_led_netdev \"wan\" \"WAN\" \"green:wan\" \"eth1\" \"link\"\n+\tucidef_set_led_netdev \"lan\" \"LAN\" \"green:lan\" \"br-lan\" \"link\"\n+\tucidef_set_led_netdev \"wlan\" \"WLAN\" \"green:wlan\" \"phy1-ap0\" \"link\"\n+\t;;\n glinet,gl-x3000|\\\n glinet,gl-xe3000)\n \tucidef_set_led_default \"power\" \"POWER\" \"green:power\" \"1\"\n@@ -145,6 +154,15 @@ mercusys,mr85x)\n \tucidef_set_led_switch \"lan2\" \"lan-2\" \"green:lan-2\" \"switch0\" \"0x04\"\n \tucidef_set_led_netdev \"wan\" \"wan\" \"green:wan\" \"eth1\" \"link tx rx\"\n \t;;\n+ikuai,q3000)\n+\tucidef_set_led_default \"green\" \"GREEN\" \"q3000:green\" \"1\"\n+\tucidef_set_led_default \"blue\" \"BLUE\" \"q3000:blue\" \"0\"\n+\tucidef_set_led_default \"red\" \"RED\" \"q3000:red\" \"0\"\n+\t;;\n+bt,r320)\n+\tucidef_set_led_netdev \"wlan2g\" \"2.4G\" \"green:wlan-2ghz\" \"phy0-ap0\"\n+\tucidef_set_led_netdev \"wlan5g\" \"5G\" \"green:wlan-5ghz\" \"phy1-ap0\"\n+\t;;\n mercusys,mr90x-v1|\\\n mercusys,mr90x-v1-ubi)\n \tucidef_set_led_netdev \"lan-0\" \"lan-0\" \"green:lan-0\" \"lan0\" \"link tx rx\"\n@@ -190,6 +208,10 @@ nokia,ea0326gmp)\n \tucidef_set_led_netdev \"lan\" \"LAN\" \"green:lan\" \"br-lan\" \"link\"\n \tucidef_set_led_netdev \"wlan\" \"WLAN\" \"green:wlan\" \"phy1-ap0\" \"link\"\n \t;;\n+nradio,c8-660)\n+\tucidef_set_led_netdev \"wifi\" \"WIFI\" \"blue:wifi\" \"phy0-ap0\"\n+\tucidef_set_led_netdev \"5g\" \"5G\" \"blue:cmode5\" \"eth1\" \"link tx rx\"\n+\t;;\n nradio,c8-668gl)\n \tucidef_set_led_netdev \"wifi\" \"WIFI\" \"blue:wlan\" \"phy1-ap0\" \"link\"\n \tucidef_set_led_netdev \"5g\" \"5G\" \"blue:indicator-0\" \"eth1\" \"link\"\n@@ -315,11 +337,11 @@ wavlink,wl-wn586x3b)\n \tucidef_set_led_netdev \"lan-2\" \"lan-2\" \"blue:lan-2\" \"lan2\" \"link tx rx\"\n \tucidef_set_led_netdev \"wan\" \"wan\" \"blue:wan\" \"eth1\" \"link tx rx\"\n \t;;\n-xiaomi,mi-router-wr30u-stock|\\\n+xiaomi,mi-router-wr30u|\\\n xiaomi,mi-router-wr30u-ubootmod)\n \tucidef_set_led_netdev \"wan\" \"wan\" \"blue:wan\" \"wan\" \"link tx rx\"\n \t;;\n-xiaomi,redmi-router-ax6000-stock|\\\n+xiaomi,redmi-router-ax6000|\\\n xiaomi,redmi-router-ax6000-ubootmod)\n \tucidef_set_led_netdev \"wan\" \"wan\" \"rgb:network\" \"wan\"\n \t;;\n"
  },
  {
    "path": "devices/mediatek_filogic/patches/19-ct3003.patch",
    "content": "--- a/target/linux/mediatek/dts/mt7981b-cetron-ct3003.dts\n+++ b/target/linux/mediatek/dts/mt7981b-cetron-ct3003.dts\n@@ -159,18 +159,9 @@\n \n \t\t\tpartition@580000 {\n \t\t\t\tlabel = \"ubi\";\n-\t\t\t\treg = <0x0580000 0x2000000>;\n+\t\t\t\treg = <0x0580000 0x7000000>;\n \t\t\t};\n \n-\t\t\tpartition@2580000 {\n-\t\t\t\tlabel = \"ubi_backup\";\n-\t\t\t\treg = <0x2580000 0x2000000>;\n-\t\t\t};\n-\n-\t\t\tpartition@4580000 {\n-\t\t\t\tlabel = \"Config_backup\";\n-\t\t\t\treg = <0x4580000 0x0400000>;\n-\t\t\t};\n \t\t};\n \t};\n };\n"
  },
  {
    "path": "devices/mediatek_filogic/patches/20-ea0326gmp.patch",
    "content": "--- a/target/linux/mediatek/dts/mt7981b-nokia-ea0326gmp.dts\n+++ b/target/linux/mediatek/dts/mt7981b-nokia-ea0326gmp.dts\n@@ -164,6 +163,10 @@\n \t\tspi-tx-bus-width = <4>;\n \t\tspi-rx-bus-width = <4>;\n \n+\t\tmediatek,nmbm;\n+\t\tmediatek,bmt-max-ratio = <1>;\n+\t\tmediatek,bmt-max-reserved-blocks = <64>;\n+\n \t\tpartitions {\n \t\t\tcompatible = \"fixed-partitions\";\n \t\t\t#address-cells = <1>;\n@@ -223,13 +226,7 @@\n \t\t\tpartition@980000 {\n \t\t\t\tcompatible = \"linux,ubi\";\n \t\t\t\tlabel = \"ubi\";\n-\t\t\t\treg = <0x980000 0x7680000>;\n-\n-\t\t\t\tvolumes {\n-\t\t\t\t\tubi_rootdisk: ubi-volume-fit {\n-\t\t\t\t\t\tvolname = \"fit\";\n-\t\t\t\t\t};\n-\t\t\t\t};\n+\t\t\t\treg = <0x980000 0x6e00000>;\n \t\t\t};\n \t\t};\n \t};\n"
  },
  {
    "path": "devices/mediatek_filogic/patches/22-netcore-n60-pro.patch",
    "content": "--- a/target/linux/mediatek/dts/mt7986a-netcore-n60-pro.dts\n+++ b/target/linux/mediatek/dts/mt7986a-netcore-n60-pro.dts\n@@ -242,6 +242,10 @@\n \t\tspi-tx-bus-width = <4>;\n \t\tspi-rx-bus-width = <4>;\n \n+\t\tmediatek,nmbm;\n+\t\tmediatek,bmt-max-ratio = <1>;\n+\t\tmediatek,bmt-max-reserved-blocks = <64>;\n+\n \t\tpartitions {\n \t\t\tcompatible = \"fixed-partitions\";\n \t\t\t#address-cells = <1>;\n@@ -290,7 +294,7 @@\n \n \t\t\tpartition@580000 {\n \t\t\t\tlabel = \"ubi\";\n-\t\t\t\treg = <0x0580000 0x7a80000>;\n+\t\t\t\treg = <0x0580000 0x7280000>;\n \t\t\t\tcompatible = \"linux,ubi\";\n \n \t\t\t\tvolumes {\n\n--- a/target/linux/mediatek/dts/mt7981b-comfast-cf-wr632ax.dts\n+++ b/target/linux/mediatek/dts/mt7981b-comfast-cf-wr632ax.dts\n@@ -14,5 +14,5 @@\n };\n \n &ubi {\n-\treg = <0x580000 0x4000000>;\n+\treg = <0x580000 0x07200000>;\n };\n"
  },
  {
    "path": "devices/mediatek_filogic/patches/22-netcore-n60.patch",
    "content": "--- a/target/linux/mediatek/dts/mt7986a-netcore-n60.dts\n+++ b/target/linux/mediatek/dts/mt7986a-netcore-n60.dts\n@@ -175,6 +175,10 @@\n \t\tspi-tx-bus-width = <4>;\n \t\tspi-rx-bus-width = <4>;\n \n+\t\tmediatek,nmbm;\n+\t\tmediatek,bmt-max-ratio = <1>;\n+\t\tmediatek,bmt-max-reserved-blocks = <64>;\n+\n \t\tpartitions {\n \t\t\tcompatible = \"fixed-partitions\";\n \t\t\t#address-cells = <1>;\n@@ -200,7 +204,6 @@\n \t\t\tpartition@380000 {\n \t\t\t\tlabel = \"FIP\";\n \t\t\t\treg = <0x0380000 0x0200000>;\n-\t\t\t\tread-only;\n \t\t\t};\n \n \t\t\tpartition@580000 {\n"
  },
  {
    "path": "devices/mediatek_filogic/patches/23-ax3000t.patch",
    "content": "--- a/target/linux/mediatek/dts/mt7981b-xiaomi-mi-router-ax3000t.dts\n+++ b/target/linux/mediatek/dts/mt7981b-xiaomi-mi-router-ax3000t.dts\n@@ -18,8 +18,8 @@\n &partitions {\n \t// ubi_kernel is the ubi partition in stock.\n \tpartition@600000 {\n-\t\tlabel = \"ubi_kernel\";\n-\t\treg = <0x600000 0x2200000>;\n+\t\tlabel = \"ubi\";\n+\t\treg = <0x600000 0x7000000>;\n \t};\n \n \t/* ubi is the result of squashing\n@@ -28,8 +28,8 @@\n \t * - overlay\n \t * - data\n \t */\n-\tpartition@2800000 {\n-\t\tlabel = \"ubi\";\n-\t\treg = <0x2800000 0x4e00000>;\n+\tpartition@7600000 {\n+\t\tlabel = \"KF\";\n+\t\treg = <0x7600000 0x40000>;\n \t};\n };\n"
  },
  {
    "path": "devices/mediatek_filogic/patches/25-platform.patch",
    "content": "--- a/target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh\n+++ b/target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh\n@@ -65,10 +65,10 @@ xiaomi_initial_setup()\n \tlocal board=$(board_name)\n \tcase \"$board\" in\n \txiaomi,mi-router-ax3000t|\\\n-\txiaomi,mi-router-wr30u-stock)\n+\txiaomi,mi-router-wr30u)\n \t\tfw_setenv mtdparts \"nmbm0:1024k(bl2),256k(Nvram),256k(Bdata),2048k(factory),2048k(fip),256k(crash),256k(crash_log),34816k(ubi),34816k(ubi1),32768k(overlay),12288k(data),256k(KF)\"\n \t\t;;\n-\txiaomi,redmi-router-ax6000-stock)\n+\txiaomi,redmi-router-ax6000)\n \t\tfw_setenv mtdparts \"nmbm0:1024k(bl2),256k(Nvram),256k(Bdata),2048k(factory),2048k(fip),256k(crash),256k(crash_log),30720k(ubi),30720k(ubi1),51200k(overlay)\"\n \t\t;;\n \tesac\n@@ -78,7 +78,6 @@ platform_do_upgrade() {\n \tlocal board=$(board_name)\n \n \tcase \"$board\" in\n-\tabt,asr3000|\\\n \tacer,predator-w6x-ubootmod|\\\n \tasus,zenwifi-bt8-ubootmod|\\\n \tbananapi,bpi-r3|\\\n@@ -89,34 +88,21 @@ platform_do_upgrade() {\n \tbananapi,bpi-r4-lite|\\\n \tbazis,ax3000wm|\\\n \tcmcc,a10-ubootmod|\\\n-\tcmcc,rax3000m|\\\n \tcomfast,cf-wr632ax-ubootmod|\\\n \tcudy,tr3000-v1-ubootmod|\\\n \tcudy,wbr3000uax-v1-ubootmod|\\\n \tgatonetworks,gdsp|\\\n-\th3c,magic-nx30-pro|\\\n \timou,hx21|\\\n-\tjcg,q30-pro|\\\n-\tjdcloud,re-cp-03|\\\n-\tkonka,komi-a31|\\\n \tmediatek,mt7981-rfb|\\\n \tmediatek,mt7988a-rfb|\\\n \tmercusys,mr90x-v1-ubi|\\\n \tnetis,nx30v2|\\\n \tnetis,nx31|\\\n \tnetis,nx32u|\\\n-\tnokia,ea0326gmp|\\\n \topenwrt,one|\\\n-\tnetcore,n60|\\\n-\tnetcore,n60-pro|\\\n-\tqihoo,360t7|\\\n \trouterich,ax3000-ubootmod|\\\n \trouterich,be7200|\\\n \tsnr,snr-cpe-ax2|\\\n-\ttplink,tl-xdr4288|\\\n-\ttplink,tl-xdr6086|\\\n-\ttplink,tl-xdr6088|\\\n-\ttplink,tl-xtr8488|\\\n \txiaomi,mi-router-ax3000t-ubootmod|\\\n \txiaomi,redmi-router-ax6000-ubootmod|\\\n \txiaomi,mi-router-wr30u-ubootmod|\\\n@@ -126,8 +112,11 @@ platform_do_upgrade() {\n \tacer,predator-w6|\\\n \tacer,predator-w6d|\\\n \tacer,vero-w6m|\\\n+\taigo,ags21|\\\n \tairpi,ap3000m|\\\n \tarcadyan,mozart|\\\n+\tcmcc,rax3000m-emmc|\\\n+\tcmcc,xr30-emmc|\\\n \tglinet,gl-mt2500|\\\n \tglinet,gl-mt2500-airoha|\\\n \tglinet,gl-mt6000|\\\n@@ -135,12 +124,16 @@ platform_do_upgrade() {\n \tglinet,gl-xe3000|\\\n \thuasifei,wh3000|\\\n \thuasifei,wh3000-pro|\\\n+\tphilips,hy3000|\\\n+\tsl,3000*|\\\n+\tbt,r320|\\\n \tsmartrg,sdg-8612|\\\n \tsmartrg,sdg-8614|\\\n \tsmartrg,sdg-8622|\\\n \tsmartrg,sdg-8632|\\\n \tsmartrg,sdg-8733|\\\n \tsmartrg,sdg-8733a|\\\n+\tumi,uax3000e|\\\n \tsmartrg,sdg-8734)\n \t\tCI_KERNPART=\"kernel\"\n \t\tCI_ROOTPART=\"rootfs\"\n@@ -251,13 +244,6 @@ platform_do_upgrade() {\n \t\t\t;;\n \t\tesac\n \t\t;;\n-\txiaomi,mi-router-ax3000t|\\\n-\txiaomi,mi-router-wr30u-stock|\\\n-\txiaomi,redmi-router-ax6000-stock)\n-\t\tCI_KERN_UBIPART=ubi_kernel\n-\t\tCI_ROOT_UBIPART=ubi\n-\t\tnand_do_upgrade \"$1\"\n-\t\t;;\n \t*)\n \t\tnand_do_upgrade \"$1\"\n \t\t;;\n@@ -354,6 +340,8 @@ platform_copy_config() {\n \tacer,vero-w6m|\\\n \tairpi,ap3000m|\\\n \tarcadyan,mozart|\\\n+\tcmcc,rax3000m-emmc|\\\n+\tcmcc,xr30-emmc|\\\n \tglinet,gl-mt2500|\\\n \tglinet,gl-mt2500-airoha|\\\n \tglinet,gl-mt6000|\\\n@@ -363,6 +351,9 @@ platform_copy_config() {\n \thuasifei,wh3000-pro|\\\n \tjdcloud,re-cp-03|\\\n \tnradio,c8-668gl|\\\n+\tphilips,hy3000|\\\n+\tsl,3000*|\\\n+\tbt,r320|\\\n \tsmartrg,sdg-8612|\\\n \tsmartrg,sdg-8614|\\\n \tsmartrg,sdg-8622|\\\n@@ -376,6 +367,18 @@ platform_copy_config() {\n \tesac\n }\n \n+tenbay_dualboot_fixup()\n+{\n+\t[ \"$(rootfs_type)\" = \"tmpfs\" ] || return 0\n+\n+\tif ! fw_printenv -n boot_from &>/dev/null; then\n+\t\techo \"unable to read uboot-env\"\n+\t\treturn 1\n+\tfi\n+\n+\tfw_setenv boot_from ubi\n+}\n+\n platform_pre_upgrade() {\n \tlocal board=$(board_name)\n \n@@ -393,9 +396,12 @@ platform_pre_upgrade() {\n \t\tbuffalo_initial_setup\n \t\t;;\n \txiaomi,mi-router-ax3000t|\\\n-\txiaomi,mi-router-wr30u-stock|\\\n-\txiaomi,redmi-router-ax6000-stock)\n+\txiaomi,mi-router-wr30u|\\\n+\txiaomi,redmi-router-ax6000)\n \t\txiaomi_initial_setup\n \t\t;;\n+\tcmcc,mr3000d-ciq-256m)\n+\t\ttenbay_dualboot_fixup\n+\t\t;;\n \tesac\n }\n"
  },
  {
    "path": "devices/mediatek_filogic/patches/26-ruijie-rg-x60-pro.patch",
    "content": "--- a/target/linux/mediatek/dts/mt7986a-ruijie-rg-x60-pro.dts\n+++ b/target/linux/mediatek/dts/mt7986a-ruijie-rg-x60-pro.dts\n@@ -199,7 +199,6 @@\n \t\t\tpartition@380000 {\n \t\t\t\tlabel = \"FIP\";\n \t\t\t\treg = <0x380000 0x200000>;\n-\t\t\t\tread-only;\n \t\t\t};\n \n \t\t\tpartition@580000 {\n@@ -216,7 +215,7 @@\n \n \t\t\tpartition@680000 {\n \t\t\t\tlabel = \"ubi\";\n-\t\t\t\treg = <0x680000 0x3f00000>;\n+\t\t\t\treg = <0x680000 0x6b00000>;\n \t\t\t};\n \t\t};\n \t};"
  },
  {
    "path": "devices/mediatek_filogic/patches/99-bpi-r4-lite.patch.b",
    "content": "--- a/target/linux/mediatek/base-files/etc/uci-defaults/99_fwenv-store-ethaddr.sh\n+++ b/target/linux/mediatek/base-files/etc/uci-defaults/99_fwenv-store-ethaddr.sh\n@@ -12,6 +12,7 @@ unielec,u7623-02)\n bananapi,bpi-r3|\\\n bananapi,bpi-r3-mini|\\\n bananapi,bpi-r4|\\\n+bananapi,bpi-r4-lite|\\\n bananapi,bpi-r4-poe)\n \t[ -z \"$(fw_printenv -n ethaddr 2>/dev/null)\" ] &&\n \t\tfw_setenv ethaddr \"$(cat /sys/class/net/eth0/address)\"\n\n--- a/target/linux/mediatek/filogic/base-files/etc/board.d/01_leds\n+++ b/target/linux/mediatek/filogic/base-files/etc/board.d/01_leds\n@@ -53,6 +53,9 @@ bananapi,bpi-r4-poe)\n \tucidef_set_led_netdev \"lan2\" \"lan2\" \"mt7530-0:02:green:lan\" \"lan2\" \"link tx rx\"\n \tucidef_set_led_netdev \"lan3\" \"lan3\" \"mt7530-0:03:green:lan\" \"lan3\" \"link tx rx\"\n \t;;\n+bananapi,bpi-r4-lite)\n+\tucidef_set_led_netdev \"sfp0\" \"sfp0\" \"green:sfp\" \"sfp0\" \"link tx rx\"\n+\t;;\n cudy,re3000-v1|\\\n wavlink,wl-wn573hx3)\n \tucidef_set_led_netdev \"lan\" \"lan\" \"green:lan\" \"eth0\" \"link tx rx\"\n\n--- a/target/linux/mediatek/filogic/base-files/etc/board.d/02_network\n+++ b/target/linux/mediatek/filogic/base-files/etc/board.d/02_network\n@@ -171,6 +171,9 @@ mediatek_setup_macs()\n \tbananapi,bpi-r4)\n \t\twan_mac=$(macaddr_add $(cat /sys/class/net/eth0/address) 1)\n \t\t;;\n+\tbananapi,bpi-r4-lite)\n+\t\tucidef_set_interfaces_lan_wan \"lan0 lan1 lan2 lan3 sfp0\" \"eth1\"\n+\t\t;;\n \th3c,magic-nx30-pro)\n \t\twan_mac=$(mtd_get_mac_ascii pdt_data_1 ethaddr)\n \t\tlan_mac=$(macaddr_add \"$wan_mac\" 1)\n\n--- a/target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh\n+++ b/target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh\n@@ -71,6 +71,7 @@ platform_do_upgrade() {\n \tbananapi,bpi-r3-mini|\\\n \tbananapi,bpi-r4|\\\n \tbananapi,bpi-r4-poe|\\\n+\tbananapi,bpi-r4-lite|\\\n \tcmcc,a10-ubootmod|\\\n \tcmcc,rax3000m|\\\n \tcudy,tr3000-v1-ubootmod|\\\n@@ -197,6 +198,7 @@ platform_check_image() {\n \tbananapi,bpi-r3-mini|\\\n \tbananapi,bpi-r4|\\\n \tbananapi,bpi-r4-poe|\\\n+\tbananapi,bpi-r4-lite|\\\n \tcmcc,rax3000m)\n \t\t[ \"$magic\" != \"d00dfeed\" ] && {\n \t\t\techo \"Invalid image type.\"\n@@ -219,6 +221,7 @@ platform_copy_config() {\n \tbananapi,bpi-r3-mini|\\\n \tbananapi,bpi-r4|\\\n \tbananapi,bpi-r4-poe|\\\n+\tbananapi,bpi-r4-lite|\\\n \tcmcc,rax3000m)\n \t\tif [ \"$CI_METHOD\" = \"emmc\" ]; then\n \t\t\temmc_copy_config\n\n--- a/target/linux/mediatek/image/filogic.mk\n+++ b/target/linux/mediatek/image/filogic.mk\n@@ -638,6 +638,67 @@ endif\n endef\n TARGET_DEVICES += bananapi_bpi-r4-poe\n \n+define Device/bananapi_bpi-r4-lite\n+  DEVICE_VENDOR := Bananapi\n+  DEVICE_MODEL := BPi-R4 Lite\n+  DEVICE_DTS := mt7987a-bananapi-bpi-r4-lite\n+  DEVICE_DTS_OVERLAY:= mt7987a-bananapi-bpi-r4-lite-1pcie-2L mt7987a-bananapi-bpi-r4-lite-2pcie-1L \\\n+\t\t       mt7987a-bananapi-bpi-r4-lite-emmc mt7987a-bananapi-bpi-r4-lite-sd \\\n+\t\t       mt7987a-bananapi-bpi-r4-lite-nand mt7987a-bananapi-bpi-r4-lite-nor\n+  DEVICE_DTS_CONFIG := config-mt7987a-bananapi-bpi-r4-lite\n+  DEVICE_DTC_FLAGS := --pad 4096\n+  DEVICE_DTS_DIR := ../dts\n+  DEVICE_DTS_LOADADDR := 0x4ff00000\n+  DEVICE_PACKAGES := mt7987-2p5g-phy-firmware kmod-eeprom-at24 \\\n+\t\t     kmod-gpio-pca953x kmod-i2c-mux-pca954x kmod-rtc-pcf8563 \\\n+\t\t     kmod-sfp e2fsprogs mkf2fs\n+  BLOCKSIZE := 128k\n+  PAGESIZE := 2048\n+  KERNEL_IN_UBI := 1\n+  UBOOTENV_IN_UBI := 1\n+  KERNEL_LOADADDR := 0x40000000\n+  KERNEL := kernel-bin | gzip\n+  KERNEL_INITRAMFS := kernel-bin | lzma | \\\n+        fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k\n+  IMAGES := sysupgrade.itb\n+  KERNEL_INITRAMFS_SUFFIX := -recovery.itb\n+  KERNEL_IN_UBI := 1\n+  IMAGES := sysupgrade.itb\n+  IMAGE/sysupgrade.itb := append-kernel | fit gzip $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb external-with-rootfs | pad-rootfs | append-metadata\n+  ARTIFACTS := \\\n+\t       emmc-preloader.bin emmc-bl31-uboot.fip \\\n+\t       nor-preloader.bin nor-bl31-uboot.fip \\\n+\t       sdcard.img.gz \\\n+\t       snand-preloader.bin snand-bl31-uboot.fip\n+  ARTIFACT/emmc-preloader.bin\t:= mt7987-bl2 emmc-comb\n+  ARTIFACT/emmc-bl31-uboot.fip\t:= mt7987-bl31-uboot bananapi_bpi-r4-lite-emmc\n+  ARTIFACT/nor-preloader.bin\t:= mt7987-bl2 nor-comb\n+  ARTIFACT/nor-bl31-uboot.fip\t:= mt7987-bl31-uboot bananapi_bpi-r4-lite-nor\n+  ARTIFACT/snand-preloader.bin\t:= mt7987-bl2 spim-nand2-ubi-comb\n+  ARTIFACT/snand-bl31-uboot.fip\t:= mt7987-bl31-uboot bananapi_bpi-r4-lite-snand\n+  ARTIFACT/sdcard.img.gz\t:= mt798x-gpt sdmmc |\\\n+\t\t\t\t   pad-to 17k | mt7987-bl2 sdmmc-comb |\\\n+\t\t\t\t   pad-to 6656k | mt7987-bl31-uboot bananapi_bpi-r4-lite-sdmmc |\\\n+\t\t\t\t$(if $(CONFIG_TARGET_ROOTFS_INITRAMFS),\\\n+\t\t\t\t   pad-to 12M | append-image-stage initramfs-recovery.itb | check-size 44m |\\\n+\t\t\t\t) \\\n+\t\t\t\t   pad-to 44M | mt7987-bl2 spim-nand2-ubi-comb |\\\n+\t\t\t\t   pad-to 45M | mt7987-bl31-uboot bananapi_bpi-r4-lite-snand |\\\n+\t\t\t\t   pad-to 49M | mt7987-bl2 nor-comb |\\\n+\t\t\t\t   pad-to 50M | mt7987-bl31-uboot bananapi_bpi-r4-lite-nor |\\\n+\t\t\t\t   pad-to 51M | mt7987-bl2 emmc-comb |\\\n+\t\t\t\t   pad-to 52M | mt7987-bl31-uboot bananapi_bpi-r4-lite-emmc |\\\n+\t\t\t\t   pad-to 56M | mt798x-gpt emmc |\\\n+\t\t\t\t$(if $(CONFIG_TARGET_ROOTFS_SQUASHFS),\\\n+\t\t\t\t   pad-to 64M | append-image squashfs-sysupgrade.itb | check-size |\\\n+\t\t\t\t) \\\n+\t\t\t\t  gzip\n+ifeq ($(DUMP),)\n+  IMAGE_SIZE := $$(shell expr 64 + $$(CONFIG_TARGET_ROOTFS_PARTSIZE))m\n+endif\n+endef\n+TARGET_DEVICES += bananapi_bpi-r4-lite\n+\n define Device/cetron_ct3003\n   DEVICE_VENDOR := Cetron\n   DEVICE_MODEL := CT3003\n\n--- a/package/firmware/linux-firmware/mediatek.mk\n+++ b/package/firmware/linux-firmware/mediatek.mk\n@@ -97,6 +97,16 @@ define Package/mt7986-wo-firmware/install\n endef\n $(eval $(call BuildPackage,mt7986-wo-firmware))\n \n+Package/mt7987-2p5g-phy-firmware = $(call Package/firmware-default,MT7987 built-in 2.5G Ethernet PHY firmware,,LICENCE.mediatek)\n+define Package/mt7987-2p5g-phy-firmware/install\n+\t$(INSTALL_DIR) $(1)/lib/firmware/mediatek/mt7987\n+\t$(INSTALL_DATA) \\\n+\t\t$(PKG_BUILD_DIR)/mediatek/mt7987/i2p5ge-phy-DSPBitTb.bin \\\n+\t\t$(PKG_BUILD_DIR)/mediatek/mt7987/i2p5ge-phy-pmb.bin \\\n+\t\t$(1)/lib/firmware/mediatek/mt7987\n+endef\n+$(eval $(call BuildPackage,mt7987-2p5g-phy-firmware))\n+\n Package/mt7988-2p5g-phy-firmware = $(call Package/firmware-default,MT7988 built-in 2.5G Ethernet PHY firmware,,LICENCE.mediatek)\n define Package/mt7988-2p5g-phy-firmware/install\n \t$(INSTALL_DIR) $(1)/lib/firmware/mediatek/mt7988\n"
  },
  {
    "path": "devices/mediatek_filogic/patches/Winbond-NMBM-fix.patch",
    "content": "--- a/target/linux/generic/files/drivers/mtd/nand/mtk_bmt_nmbm.c\n+++ b/target/linux/generic/files/drivers/mtd/nand/mtk_bmt_nmbm.c\n@@ -2200,11 +2200,15 @@ static int nmbm_attach(struct nmbm_instance *ni)\n \tif (ni->signature.nand_size != bmtd.total_blks << bmtd.blk_shift ||\n \t    ni->signature.block_size != bmtd.blk_size ||\n \t    ni->signature.page_size != bmtd.pg_size ||\n-\t    ni->signature.spare_size != bmtd.mtd->oobsize) {\n+\t    ni->signature.spare_size > bmtd.mtd->oobsize) {\n \t\tnlog_err(ni, \"NMBM configuration mismatch\\n\");\n \t\treturn -EINVAL;\n \t}\n \n+\tif (ni->signature.spare_size < bmtd.mtd->oobsize)\n+\t\tnlog_warn(ni, \"NMBM spare size (%u) is less than mtd oob size (%u)\\n\",\n+\t\t\t ni->signature.spare_size, bmtd.mtd->oobsize);\n+\n \tsuccess = nmbm_load_existing(ni);\n \tif (!success)\n \t\treturn -ENODEV;\n"
  },
  {
    "path": "devices/mediatek_filogic/patches/ags21.patch",
    "content": "--- a/package/boot/uboot-tools/uboot-envtools/files/mediatek_filogic\n+++ b/package/boot/uboot-tools/uboot-envtools/files/mediatek_filogic\n@@ -58,13 +58,15 @@ zyxel,ex5601-t0-ubootmod)\n acer,predator-w6|\\\n acer,predator-w6d|\\\n acer,vero-w6m|\\\n+aigo,ags21|\\\n glinet,gl-mt2500|\\\n glinet,gl-mt2500-airoha|\\\n glinet,gl-mt6000|\\\n glinet,gl-x3000|\\\n glinet,gl-xe3000|\\\n huasifei,wh3000|\\\n-nradio,c8-668gl)\n+nradio,c8-668gl|\\\n+umi,uax3000e)\n \tubootenv_add_mmc \"u-boot-env\" \"\" \"0x0\" \"0x80000\"\n \t;;\n asiarf,ap7986-003|\\\n@@ -84,6 +86,7 @@ bananapi,bpi-r3-mini|\\\n bananapi,bpi-r4|\\\n bananapi,bpi-r4-lite|\\\n bananapi,bpi-r4-poe|\\\n+bt,r320|\\\n cmcc,rax3000m|\\\n jdcloud,re-cp-03)\n \t. /lib/upgrade/fit.sh\n@@ -146,11 +149,14 @@ ubnt,unifi-6-plus)\n \tubootenv_add_uci_config \"/dev/mtd1\" \"0x0\" \"0x80000\" \"0x10000\"\n \t;;\n xiaomi,mi-router-ax3000t|\\\n-xiaomi,mi-router-wr30u-stock|\\\n-xiaomi,redmi-router-ax6000-stock)\n+xiaomi,mi-router-wr30u|\\\n+xiaomi,redmi-router-ax6000)\n \tubootenv_add_uci_config \"/dev/mtd1\" \"0x0\" \"0x10000\" \"0x20000\"\n \tubootenv_add_uci_sys_config \"/dev/mtd2\" \"0x0\" \"0x10000\" \"0x20000\"\n \t;;\n+cmcc,mr3000d-ciq-256m)\n+\tubootenv_add_uci_config \"/dev/mtd1\" \"0\" \"0x20000\" \"0x20000\" 1\n+\t;;\n zyxel,ex5601-t0)\n \tubootenv_add_mtd \"u-boot-env\" \"0x0\" \"0x20000\" \"0x40000\" \"2\"\n \t;;"
  },
  {
    "path": "devices/mediatek_filogic/patches/ax6s.patch",
    "content": "--- a/target/linux/mediatek/image/mt7622.mk\n+++ b/target/linux/mediatek/image/mt7622.mk\n@@ -438,18 +438,10 @@ define Device/xiaomi_redmi-router-ax6s\n   UBINIZE_OPTS := -E 5\n   BLOCKSIZE := 128k\n   PAGESIZE := 2048\n-  KERNEL := kernel-bin | gzip\n-  KERNEL_INITRAMFS := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k\n+  KERNEL_SIZE := 6144k\n   KERNEL_INITRAMFS_SUFFIX := -recovery.itb\n-  IMAGES := sysupgrade.itb\n-  IMAGE/sysupgrade.itb := append-kernel | fit gzip $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb external-static-with-rootfs | append-metadata\n-  ARTIFACTS := ubi-loader.itb\n-  ARTIFACT/ubi-loader.itb := uboot-bin xiaomi_redmi-router-ax6s-ubi-loader | lzma | uboot-fit lzma\n-ifneq ($(CONFIG_TARGET_ROOTFS_SQUASHFS),)\n-  ARTIFACTS += factory.bin\n-  ARTIFACT/factory.bin := uboot-bin xiaomi_redmi-router-ax6s-ubi-loader | lzma | uboot-fit lzma | pad-to 512k | ubinize-image fit squashfs-sysupgrade.itb\n-endif\n-  DEVICE_COMPAT_VERSION := 2.0\n-  DEVICE_COMPAT_MESSAGE := Flash layout changes require a manual reinstall using factory.bin.\n+  IMAGES += factory.bin\n+  IMAGE/factory.bin := append-kernel | pad-to $$(KERNEL_SIZE) | append-ubi\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n endef\n TARGET_DEVICES += xiaomi_redmi-router-ax6s\n\n--- a/target/linux/mediatek/dts/mt7622-xiaomi-redmi-router-ax6s.dts\n+++ b/target/linux/mediatek/dts/mt7622-xiaomi-redmi-router-ax6s.dts\n@@ -22,8 +22,7 @@\n \n \tchosen {\n \t\tstdout-path = \"serial0:115200n8\";\n-\t\trootdisk = <&ubi_rootfs>;\n-\t\tbootargs = \"earlycon=uart8250,mmio32,0x11002000 swiotlb=512 ubi.block=0,fit root=/dev/fit0\";\n+\t\tbootargs = \"earlycon=uart8250,mmio32,0x11002000 swiotlb=512\";\n \t};\n \n \tmemory {\n@@ -297,8 +296,8 @@\n \t\t\t};\n \n \t\t\tpartition@2c0000 {\n-\t\t\t\tlabel = \"ubi-loader\";\n-\t\t\t\treg = <0x2c0000 0x80000>;\n+\t\t\t\tlabel = \"kernel\";\n+\t\t\t\treg = <0x2c0000 0x600000>;\n \t\t\t};\n \n \t\t\t/* ubi partition is the result of squashing\n@@ -308,16 +307,9 @@\n \t\t\t * - overlay\n \t\t\t * - obr\n \t\t\t */\n-\t\t\tpartition@340000 {\n+\t\t\tpartition@8c0000 {\n \t\t\t\tlabel = \"ubi\";\n-\t\t\t\treg = <0x340000 0x7280000>;\n-\t\t\t\tcompatible = \"linux,ubi\";\n-\n-\t\t\t\tvolumes {\n-\t\t\t\t\tubi_rootfs: ubi-volume-fit {\n-\t\t\t\t\t\tvolname = \"fit\";\n-\t\t\t\t\t};\n-\t\t\t\t};\n+\t\t\t\treg = <0x8c0000 0x6d00000>;\n \t\t\t};\n \t\t};\n \t};\n"
  },
  {
    "path": "devices/mediatek_filogic/patches/tr3000-mod.patch",
    "content": "--- a/target/linux/mediatek/base-files/lib/preinit/05_set_preinit_iface\n+++ b/target/linux/mediatek/base-files/lib/preinit/05_set_preinit_iface\n@@ -5,7 +5,7 @@ set_preinit_iface() {\n \tcudy,m3000-v2-yt8821|\\\n \tcudy,tr3000-256mb-v1|\\\n \tcudy,tr3000-v1|\\\n-\tcudy,tr3000-v1-ubootmod|\\\n+\tcudy,tr3000-mod|\\\n \tglinet,gl-mt2500|\\\n \tglinet,gl-mt2500-airoha|\\\n \tglinet,gl-mt3000|\\"
  },
  {
    "path": "devices/mediatek_mt7622/.config",
    "content": "\nCONFIG_TARGET_mediatek=y\nCONFIG_TARGET_mediatek_mt7622=y\n\nCONFIG_TARGET_DEVICE_mediatek_mt7622_DEVICE_dlink_eagle-pro-ai-m32-a1=n\nCONFIG_TARGET_DEVICE_mediatek_mt7622_DEVICE_dlink_eagle-pro-ai-r32-a1=n\nCONFIG_TARGET_DEVICE_mediatek_mt7622_DEVICE_elecom_wrc-x3200gst3=n\n\n\n"
  },
  {
    "path": "devices/mediatek_mt7622/diy.sh",
    "content": "#!/bin/bash\n\nshopt -s extglob\n\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\n\n#curl -sfL https://raw.githubusercontent.com/x-wrt/x-wrt/master/target/linux/mediatek/patches-5.15/995-0001-hwnat-add-natflow-flow-offload-support.patch -o target/linux/mediatek/patches-5.15/995-0001-hwnat-add-natflow-flow-offload-support.patch\n\n"
  },
  {
    "path": "devices/mvebu_cortexa9/.config",
    "content": "\nCONFIG_TARGET_mvebu=y\nCONFIG_TARGET_mvebu_cortexa9=y\n\nCONFIG_TARGET_DEVICE_mvebu_cortexa9_DEVICE_plathome_openblocks-ax3-4=n\nCONFIG_TARGET_DEVICE_mvebu_cortexa9_DEVICE_synology_ds213j=n\nCONFIG_TARGET_DEVICE_mvebu_cortexa9_DEVICE_iij_sa-w2=n\nCONFIG_TARGET_DEVICE_mvebu_cortexa9_DEVICE_linksys_wrt1900ac-v1=n\n\n\nCONFIG_TARGET_ROOTFS_TARGZ=n\n"
  },
  {
    "path": "devices/mvebu_cortexa9/diy.sh",
    "content": "#!/bin/bash\n\nshopt -s extglob\n\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\n\n"
  },
  {
    "path": "devices/qualcommax_ipq50xx/.config",
    "content": "\nCONFIG_TARGET_qualcommax=y\nCONFIG_TARGET_qualcommax_ipq50xx=y\n\n\n"
  },
  {
    "path": "devices/qualcommax_ipq50xx/diy/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-re-cs-03.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-only\n\n/dts-v1/;\n\n#include \"ipq5018.dtsi\"\n#include \"ipq5018-ess.dtsi\"\n#include \"ipq5018-qcn6122.dtsi\"\n\n#include <dt-bindings/gpio/gpio.h>\n#include <dt-bindings/input/input.h>\n#include <dt-bindings/leds/common.h>\n\n/ {\n\t#address-cells = <0x2>;\n\t#size-cells = <0x2>;\n\tmodel = \"JDCloud RE-CS-03\";\n\tcompatible = \"jdcloud,re-cs-03\", \"qcom,ipq5018\";\n\tinterrupt-parent = <&intc>;\n\n\taliases {\n\t\tsdhc1 = &sdhc_1;\n\t\tserial0 = &blsp1_uart1;\n\t\tethernet0 = \"/soc/dp1\";\n\t\tethernet1 = \"/soc/dp2\";\n\n\t\tled-boot = &led_red;\n\t\tled-failsafe = &led_red;\n\t\tled-running = &led_blue;\n\t\tled-upgrade = &led_green;\n\t};\n\n\tchosen {\n\t\tstdout-path = \"serial0\";\n\t\tbootargs-append = \" swiotlb=1 coherent_pool=2M\";\n\t};\n\n\treserved-memory {\n\t\tq6_mem_regions: q6_mem_regions@4B000000 {\n\t\t\tno-map;\n\t\t\treg = <0x0 0x4B000000 0x0 0x3900000>;\n\t\t};\n\n\t\tq6_code_data: q6_code_data@4B000000 {\n\t\t\tno-map;\n\t\t\treg = <0x0 0x4B000000 0x0 01000000>;\n\t\t};\n\n\t\tq6_ipq5018_data: q6_ipq5018_data@4C000000 {\n\t\t\tno-map;\n\t\t\treg = <0x0 0x4C000000 0x0 0xE00000>;\n\t\t};\n\n\t\tm3_dump: m3_dump@4CE00000 {\n\t\t\tno-map;\n\t\t\treg = <0x0 0x4CE00000 0x0 0x100000>;\n\t\t};\n\n\t\tq6_etr_region: q6_etr_dump@4CF00000 {\n\t\t\tno-map;\n\t\t\treg = <0x0 0x4CF00000 0x0 0x100000>;\n\t\t};\n\n\t\tq6_caldb_region: q6_caldb_region@4D000000 {\n\t\t\tno-map;\n\t\t\treg = <0x0 0x4D000000 0x0 0x200000>;\n\t\t};\n\n\t\tq6_qcn6122_data1: q6_qcn6122_data1@4D200000 {\n\t\t\tno-map;\n\t\t\treg = <0x0 0x4D200000 0x0 0x1000000>;\n\t\t};\n\n\t\tm3_dump_qcn6122_1: m3_dump_qcn6122_1@4E200000 {\n\t\t\tno-map;\n\t\t\treg = <0x0 0x4E200000 0x0 0x100000>;\n\t\t};\n\n\t\tq6_qcn6122_etr_1: q6_qcn6122_etr_1@4E300000 {\n\t\t\tno-map;\n\t\t\treg = <0x0 0x4E300000 0x0 0x100000>;\n\t\t};\n\n\t\tq6_qcn6122_caldb_1: q6_qcn6122_caldb_1@4E400000 {\n\t\t\tno-map;\n\t\t\treg = <0x0 0x4E400000 0x0 0x500000>;\n\t\t};\n\t};\n\n\tsoc {\n\t\tess-instance {\n\t\t\tnum_devices = <0x2>;\n\n\t\t\tess-switch@0x39c00000 {\n\t\t\t\tcompatible = \"qcom,ess-switch-ipq50xx\";\n\t\t\t\tdevice_id = <0>;\n\t\t\t\tswitch_mac_mode = <0xf>; /* mac mode for uniphy instance*/\n\t\t\t\tcmnblk_clk = \"internal_96MHz\"; /* cmnblk clk*/\n\n\t\t\t\tqcom,port_phyinfo {\n\t\t\t\t\tport@0 {\n\t\t\t\t\t\tport_id = <1>;\n\t\t\t\t\t\tphy_address = <7>;\n\t\t\t\t\t};\n\t\t\t\t\tport@1 {\n\t\t\t\t\t\tport_id = <2>;\n\t\t\t\t\t\tforced-speed = <1000>;\n\t\t\t\t\t\tforced-duplex = <1>;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tess-switch1@1 {\n\t\t\t\tcompatible = \"qcom,ess-switch-qca83xx\";\n\t\t\t\tdevice_id = <1>;\n\t\t\t\tswitch_access_mode = \"mdio\";\n\t\t\t\tmdio-bus = <&mdio1>;\n\t\t\t\treset_gpio = <&tlmm 39 0>;\n\t\t\t\tswitch_cpu_bmp = <0x40>;  /* cpu port bitmap */\n\t\t\t\tswitch_lan_bmp = <0x1e>; /* lan port bitmap */\n\t\t\t\tswitch_wan_bmp = <0x0>;  /* wan port bitmap */\n\n\t\t\t\tqca,ar8327-initvals = <\n\t\t\t\t\t\t0x00004 0x7600000   /* PAD0_MODE */\n\t\t\t\t\t\t0x00008 0x1000000   /* PAD5_MODE */\n\t\t\t\t\t\t0x0000c 0x80        /* PAD6_MODE */\n\t\t\t\t\t\t0x00010 0x2613a0    /* PORT6 FORCE MODE*/\n\t\t\t\t\t\t0x000e4 0xaa545     /* MAC_POWER_SEL */\n\t\t\t\t\t\t0x000e0 0xc74164de  /* SGMII_CTRL */\n\t\t\t\t\t\t0x0007c 0x4e        /* PORT0_STATUS */\n\t\t\t\t\t\t0x00094 0x4e        /* PORT6_STATUS */\n\t\t\t\t>;\n\t\t\t\tqcom,port_phyinfo {\n\t\t\t\t\tport@0 {\n\t\t\t\t\t\tport_id = <1>;\n\t\t\t\t\t\tphy_address = <0>;\n\t\t\t\t\t};\n\t\t\t\t\tport@1 {\n\t\t\t\t\t\tport_id = <2>;\n\t\t\t\t\t\tphy_address = <1>;\n\t\t\t\t\t};\n\t\t\t\t\tport@2 {\n\t\t\t\t\t\tport_id = <3>;\n\t\t\t\t\t\tphy_address = <2>;\n\t\t\t\t\t};\n\t\t\t\t\tport@3 {\n\t\t\t\t\t\tport_id = <4>;\n\t\t\t\t\t\tphy_address = <3>;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\n\t\tdp1 {\n\t\t\tdevice_type = \"network\";\n\t\t\tcompatible = \"qcom,nss-dp\";\n\t\t\tclocks = <&gcc GCC_SNOC_GMAC0_AXI_CLK>;\n\t\t\tclock-names = \"nss-snoc-gmac-axi-clk\";\n\t\t\tqcom,id = <1>;\n\t\t\treg = <0x39C00000 0x10000>;\n\t\t\tinterrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>;\n\t\t\tqcom,mactype = <2>;\n\t\t\tqcom,link-poll = <1>;\n\t\t\tqcom,phy-mdio-addr = <7>;\n\t\t\tmdio-bus = <&mdio0>;\n\t\t\tlocal-mac-address = [000000000000];\n\t\t\tphy-mode = \"sgmii\";\n\t\t\tqcom,rx-page-mode = <0>;\n\t\t};\n\n\t\tdp2 {\n\t\t\tdevice_type = \"network\";\n\t\t\tcompatible = \"qcom,nss-dp\";\n\t\t\tclocks = <&gcc GCC_SNOC_GMAC1_AXI_CLK>;\n\t\t\tclock-names = \"nss-snoc-gmac-axi-clk\";\n\t\t\tqcom,id = <2>;\n\t\t\treg = <0x39D00000 0x10000>;\n\t\t\tinterrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>;\n\t\t\tqcom,mactype = <2>;\n\t\t\tlocal-mac-address = [000000000000];\n\t\t\tphy-mode = \"sgmii\";\n\t\t\tqcom,rx-page-mode = <0>;\n\t\t};\n\t};\n\n\tkeys {\n\t\tcompatible = \"gpio-keys\";\n\t\tpinctrl-0 = <&button_pins>;\n\t\tpinctrl-names = \"default\";\n\n\t\treset {\n\t\t\tlabel = \"reset\";\n\t\t\tlinux,code = <KEY_RESTART>;\n\t\t\tgpios = <&tlmm 25 GPIO_ACTIVE_LOW>;\n\t\t\tlinux,input-type = <1>;\n\t\t\tdebounce-interval = <60>;\n\t\t};\n\n\t\twps {\n\t\t\tlabel = \"wps\";\n\t\t\tlinux,code = <KEY_WPS_BUTTON>;\n\t\t\tgpios = <&tlmm 38 GPIO_ACTIVE_LOW>;\n\t\t\tlinux,input-type = <1>;\n\t\t\tdebounce-interval = <60>;\n\t\t};\n\t};\n\n\tleds {\n\t\tcompatible = \"gpio-leds\";\n\t\tpinctrl-0 = <&leds_pins>;\n\t\tpinctrl-names = \"default\";\n\n\t\tled_blue: status_blue {\n\t\t\tlabel = \"blue:status\";\n\t\t\tgpio = <&tlmm 31 GPIO_ACTIVE_HIGH>;\n\t\t};\n\n\t\tled_green: status_green {\n\t\t\tlabel = \"green:status\";\n\t\t\tgpio = <&tlmm 32 GPIO_ACTIVE_HIGH>;\n\t\t};\n\n\t\tled_red: status_red {\n\t\t\tlabel = \"red:status\";\n\t\t\tgpio = <&tlmm 33 GPIO_ACTIVE_HIGH>;\n\t\t};\n\t};\n};\n\n&blsp1_uart1 {\n\tstatus = \"ok\";\n};\n\n&mdio0 {\n\tstatus = \"ok\";\n\n\tethernet-phy@0 {\n\t\treg = <7>;\n\t};\n};\n\n&mdio1 {\n\tpinctrl-0 = <&mdio1_pins>;\n\tpinctrl-names = \"default\";\n\tphy-reset-gpio = <&tlmm 39 0>;\n\tstatus = \"ok\";\n\n\tethernet-phy@0 {\n\t\treg = <0>;\n\t};\n\n\tethernet-phy@1 {\n\t\treg = <1>;\n\t};\n\n\tethernet-phy@2 {\n\t\treg = <2>;\n\t};\n\n\tethernet-phy@3 {\n\t\treg = <3>;\n\t};\n};\n\n&q6v5_wcss {\n\tcompatible = \"qcom,ipq5018-q6-mpd\";\n\tfirmware = \"IPQ5018/q6_fw.mdt\";\n\t#address-cells = <1>;\n\t#size-cells = <1>;\n\tranges;\n\n\treg = <0x0cd00000 0x4040>,\n\t      <0x1938000 0x8>,\n\t      <0x193d204 0x4>;\n\treg-names = \"qdsp6\",\n\t\t    \"tcsr-msip\",\n\t\t    \"tcsr-q6\";\n\tresets = <&gcc GCC_WCSSAON_RESET>,\n\t\t <&gcc GCC_WCSS_Q6_BCR>;\n\n\treset-names = \"wcss_aon_reset\",\n\t\t      \"wcss_q6_reset\";\n\n\tclocks = <&gcc GCC_Q6_AXIS_CLK>,\n\t\t <&gcc GCC_WCSS_ECAHB_CLK>,\n\t\t <&gcc GCC_Q6_AXIM_CLK>,\n\t\t <&gcc GCC_Q6_AXIM2_CLK>,\n\t\t <&gcc GCC_Q6_AHB_CLK>,\n\t\t <&gcc GCC_Q6_AHB_S_CLK>,\n\t\t <&gcc GCC_WCSS_AXI_S_CLK>;\n\tclock-names = \"gcc_q6_axis_clk\",\n\t\t      \"gcc_wcss_ecahb_clk\",\n\t\t      \"gcc_q6_axim_clk\",\n\t\t      \"gcc_q6_axim2_clk\",\n\t\t      \"gcc_q6_ahb_clk\",\n\t\t      \"gcc_q6_ahb_s_clk\",\n\t\t      \"gcc_wcss_axi_s_clk\";\n\n\tmemory-region = <&q6_mem_regions>, <&q6_etr_region>,\n\t\t\t<&q6_caldb_region>;\n\n\tqcom,rproc = <&q6v5_wcss>;\n\tqcom,bootargs_smem = <507>;\n\tboot-args = <0x1 0x4 0x3 0x0F 0x0 0x0>,\n\t\t    <0x2 0x4 0x2 0x12 0x0 0x0>;\n};\n\n&sdhc_1 {\n\tpinctrl-0 = <&emmc_pins>;\n\tpinctrl-names = \"default\";\n\tstatus = \"ok\";\n};\n\n&tlmm {\n\tbutton_pins: button_pins {\n\t\tmux {\n\t\t\tpins = \"gpio25\", \"gpio38\";\n\t\t\tfunction = \"gpio\";\n\t\t\tdrive-strength = <8>;\n\t\t\tbias-pull-up;\n\t\t};\n\t};\n\n\tleds_pins: leds_pins {\n\t\tmux {\n\t\t\tpins = \"gpio31\", \"gpio32\", \"gpio33\";\n\t\t\tfunction = \"gpio\";\n\t\t\tdrive-strength = <8>;\n\t\t\tbias-pull-down;\n\t\t\toutput-low;\n\t\t};\n\t};\n\n\tmdio1_pins: mdio_pinmux {\n\t\tmux_0 {\n\t\t\tpins = \"gpio36\";\n\t\t\tfunction = \"mdc\";\n\t\t\tdrive-strength = <8>;\n\t\t\tbias-pull-up;\n\t\t};\n\t\tmux_1 {\n\t\t\tpins = \"gpio37\";\n\t\t\tfunction = \"mdio\";\n\t\t\tdrive-strength = <8>;\n\t\t\tbias-pull-up;\n\t\t};\n\t};\n\n\temmc_pins: emmc_pins {\n\t\temmc_clk {\n\t\t\tpins = \"gpio9\";\n\t\t\tfunction = \"sdc1_clk\";\n\t\t\tdrive-strength = <8>;\n\t\t\tbias-disable;\n\t\t};\n\n\t\temmc_cmd {\n\t\t\tpins = \"gpio8\";\n\t\t\tfunction = \"sdc1_cmd\";\n\t\t\tdrive-strength = <8>;\n\t\t\tbias-pull-up;\n\t\t};\n\n\t\temmc_data {\n\t\t\tpins = \"gpio4\", \"gpio5\", \"gpio6\", \"gpio7\";\n\t\t\tfunction = \"sdc1_data\";\n\t\t\tdrive-strength = <8>;\n\t\t\tbias-disable;\n\t\t};\n\t};\n};\n\n&wifi {\n\tqcom,multipd_arch;\n\tqcom,userpd-subsys-name = \"q6v5_wcss_userpd1\";\n\tqcom,rproc = <&q6_wcss_pd1>;\n\tqcom,board_id = <0x24>;\n\tqcom,bdf-addr = <0x0 0x4C000000 0x4C000000 0x0 0x0>;\n\tqcom,caldb-addr = <0x0 0x4D000000 0 0 0>;\n\tmem-region = <&q6_ipq5018_data>;\n\tqcom,caldb-size = <0x200000>;\n\tstatus = \"ok\";\n};\n\n&wifi1 {\n\tqcom,multipd_arch;\n\tqcom,userpd-subsys-name = \"q6v5_wcss_userpd2\";\n\tqcom,rproc = <&q6_wcss_pd2>;\n\tqcom,tgt-mem-mode = <1>;\n\tqcom,board_id = <0x60>;\n\tqcom,bdf-addr = <0x0 0x4D200000 0x4CF00000 0x0 0x0>;\n\tqcom,caldb-addr = <0x0 0x4E400000 0 0 0>;\n\tmem-region = <&q6_qcn6122_data1>;\n\tqcom,caldb-size = <0x500000>;\n\tstatus = \"ok\";\n};\n"
  },
  {
    "path": "devices/qualcommax_ipq50xx/diy.sh",
    "content": "#!/bin/bash\n\nshopt -s extglob\n\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\n"
  },
  {
    "path": "devices/qualcommax_ipq50xx/patches/ath11k-smallbuffers.patch",
    "content": "From 2858400d263dae0d476f88a7cb7c4540eeb7783f Mon Sep 17 00:00:00 2001\nFrom: Ziyang Huang <hzyitc@outlook.com>\nDate: Fri, 9 Jan 2026 23:15:13 +0800\nSubject: [PATCH] mac80211: ath11k: provide smallbuffers variant\n\nSigned-off-by: Ziyang Huang <hzyitc@outlook.com>\n---\n package/kernel/mac80211/Makefile              |  1 +\n package/kernel/mac80211/ath.mk                | 23 ++++++++--\n ...introduct-CONFIG_ATH11K_SMALLBUFFERS.patch | 43 +++++++++++++++++++\n 3 files changed, 63 insertions(+), 4 deletions(-)\n create mode 100644 package/kernel/mac80211/patches/ath11k/951-wifi-ath11k-introduct-CONFIG_ATH11K_SMALLBUFFERS.patch\n\ndiff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile\nindex 0beb264db16c38..864b0af8a6cebf 100644\n--- a/package/kernel/mac80211/Makefile\n+++ b/package/kernel/mac80211/Makefile\n@@ -280,6 +280,7 @@ C_DEFINES=\n \n ifeq ($(BUILD_VARIANT),smallbuffers)\n \tC_DEFINES+= -DCONFIG_ATH10K_SMALLBUFFERS\n+\tC_DEFINES+= -DCONFIG_ATH11K_SMALLBUFFERS\n endif\n \n MAKE_OPTS:= \\\ndiff --git a/package/kernel/mac80211/ath.mk b/package/kernel/mac80211/ath.mk\nindex 9adb8914cd5829..e87cef5600e75b 100644\n--- a/package/kernel/mac80211/ath.mk\n+++ b/package/kernel/mac80211/ath.mk\n@@ -1,6 +1,6 @@\n PKG_DRIVERS += \\\n \tath ath5k ath6kl ath6kl-sdio ath6kl-usb ath9k ath9k-common ath9k-htc ath10k ath10k-smallbuffers \\\n-\tath11k ath11k-ahb ath11k-pci ath12k carl9170 owl-loader ar5523 wil6210 qcom-qmi-helpers\n+\tath11k ath11k-smallbuffers ath11k-ahb ath11k-pci ath12k carl9170 owl-loader ar5523 wil6210 qcom-qmi-helpers\n \n PKG_CONFIG_DEPENDS += \\\n \tCONFIG_PACKAGE_ATH_DEBUG \\\n@@ -65,7 +65,8 @@ config-$(CONFIG_ATH12K_THERMAL) += ATH12K_THERMAL\n config-$(call config_package,ath9k-htc) += ATH9K_HTC\n config-$(call config_package,ath10k,regular) += ATH10K ATH10K_PCI\n config-$(call config_package,ath10k-smallbuffers,smallbuffers) += ATH10K ATH10K_PCI ATH10K_SMALLBUFFERS\n-config-$(call config_package,ath11k) += ATH11K\n+config-$(call config_package,ath11k,regular) += ATH11K\n+config-$(call config_package,ath11k-smallbuffers,smallbuffers) += ATH11K ATH11K_SMALLBUFFERS\n config-$(call config_package,ath11k-ahb) += ATH11K_AHB\n config-$(call config_package,ath11k-pci) += ATH11K_PCI\n config-$(call config_package,ath12k) += ATH12K\n@@ -312,16 +313,24 @@ define KernelPackage/ath10k-smallbuffers\n   PROVIDES:=@kmod-ath10k-any\n endef\n \n-define KernelPackage/ath11k\n+define KernelPackage/ath11k/Default\n   $(call KernelPackage/mac80211/Default)\n   TITLE:=Qualcomm 802.11ax wireless chipset support (common code)\n   URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath11k\n   DEPENDS+= +kmod-ath +@DRIVER_11AC_SUPPORT +@DRIVER_11AX_SUPPORT \\\n   +kmod-crypto-michael-mic +ATH11K_THERMAL:kmod-hwmon-core \\\n   +ATH11K_THERMAL:kmod-thermal +kmod-qcom-qmi-helpers\n+  PROVIDES:=kmod-ath11k\n   FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath11k/ath11k.ko\n endef\n \n+define KernelPackage/ath11k\n+  $(call KernelPackage/ath11k/Default)\n+  VARIANT:=regular\n+  DEFAULT_VARIANT:=1\n+  CONFLICTS:=kmod-ath11k-smallbuffers\n+endef\n+\n define KernelPackage/ath11k/description\n This module adds support for Qualcomm Technologies 802.11ax family of\n chipsets.\n@@ -331,11 +340,17 @@ define KernelPackage/ath11k/config\n \n        config ATH11K_THERMAL\n                bool \"Enable thermal sensors and throttling support\"\n-               depends on PACKAGE_kmod-ath11k\n+               depends on PACKAGE_kmod-ath11k || PACKAGE_kmod-ath11k-smallbuffers\n                default y if TARGET_qualcommax\n \n endef\n \n+define KernelPackage/ath11k-smallbuffers\n+  $(call KernelPackage/ath11k/Default)\n+  TITLE+= (small buffers for low-RAM devices)\n+  VARIANT:=smallbuffers\n+endef\n+\n define KernelPackage/ath11k-ahb\n   $(call KernelPackage/mac80211/Default)\n   TITLE:=Qualcomm 802.11ax AHB wireless chipset support\ndiff --git a/package/kernel/mac80211/patches/ath11k/951-wifi-ath11k-introduct-CONFIG_ATH11K_SMALLBUFFERS.patch b/package/kernel/mac80211/patches/ath11k/951-wifi-ath11k-introduct-CONFIG_ATH11K_SMALLBUFFERS.patch\nnew file mode 100644\nindex 00000000000000..aa56ac0600f370\n--- /dev/null\n+++ b/package/kernel/mac80211/patches/ath11k/951-wifi-ath11k-introduct-CONFIG_ATH11K_SMALLBUFFERS.patch\n@@ -0,0 +1,43 @@\n+From 4032fbc94b8cde0ff761b6dd6a278420e6f052b4 Mon Sep 17 00:00:00 2001\n+From: Ziyang Huang <hzyitc@outlook.com>\n+Date: Sun, 8 Sep 2024 16:52:04 +0800\n+Subject: [PATCH 1/1] wifi: ath11k: introduct CONFIG_ATH11K_SMALLBUFFERS\n+\n+Signed-off-by: Ziyang Huang <hzyitc@outlook.com>\n+---\n+ drivers/net/wireless/ath/ath11k/dp.h | 10 +++++-----\n+ 1 file changed, 5 insertions(+), 5 deletions(-)\n+\n+diff --git a/drivers/net/wireless/ath/ath11k/dp.h b/drivers/net/wireless/ath/ath11k/dp.h\n+index 7a55afd33be8..d3d3b2aa800c 100644\n+--- a/drivers/net/wireless/ath/ath11k/dp.h\n++++ b/drivers/net/wireless/ath/ath11k/dp.h\n+@@ -206,7 +206,7 @@ struct ath11k_pdev_dp {\n+ #define DP_WBM_RELEASE_RING_SIZE\t64\n+ #define DP_TCL_DATA_RING_SIZE\t\t512\n+ #define DP_TCL_DATA_RING_SIZE_WCN6750\t2048\n+-#define DP_TX_COMP_RING_SIZE\t\t32768\n++#define DP_TX_COMP_RING_SIZE\t\t(!IS_ENABLED(CONFIG_ATH11K_SMALLBUFFERS) ? 32768 : 2048)\n+ #define DP_TX_IDR_SIZE\t\t\tDP_TX_COMP_RING_SIZE\n+ #define DP_TCL_CMD_RING_SIZE\t\t32\n+ #define DP_TCL_STATUS_RING_SIZE\t\t32\n+@@ -217,12 +217,12 @@ struct ath11k_pdev_dp {\n+ #define DP_REO_EXCEPTION_RING_SIZE\t128\n+ #define DP_REO_CMD_RING_SIZE\t\t256\n+ #define DP_REO_STATUS_RING_SIZE\t\t2048\n+-#define DP_RXDMA_BUF_RING_SIZE\t\t4096\n++#define DP_RXDMA_BUF_RING_SIZE\t\t(!IS_ENABLED(CONFIG_ATH11K_SMALLBUFFERS) ? 4096 : 1024)\n+ #define DP_RXDMA_REFILL_RING_SIZE\t2048\n+ #define DP_RXDMA_ERR_DST_RING_SIZE\t1024\n+-#define DP_RXDMA_MON_STATUS_RING_SIZE\t1024\n+-#define DP_RXDMA_MONITOR_BUF_RING_SIZE\t4096\n+-#define DP_RXDMA_MONITOR_DST_RING_SIZE\t2048\n++#define DP_RXDMA_MON_STATUS_RING_SIZE\t(!IS_ENABLED(CONFIG_ATH11K_SMALLBUFFERS) ? 1024 : 512)\n++#define DP_RXDMA_MONITOR_BUF_RING_SIZE\t(!IS_ENABLED(CONFIG_ATH11K_SMALLBUFFERS) ? 4096 : 128)\n++#define DP_RXDMA_MONITOR_DST_RING_SIZE\t(!IS_ENABLED(CONFIG_ATH11K_SMALLBUFFERS) ? 2048 : 128)\n+ #define DP_RXDMA_MONITOR_DESC_RING_SIZE\t4096\n+ \n+ #define DP_RX_RELEASE_RING_NUM\t3\n+-- \n+2.40.1\n+\n"
  },
  {
    "path": "devices/qualcommax_ipq50xx/patches/fix.patch",
    "content": "diff --git a/target/linux/qualcommax/patches-6.12/999-fix-netdev-cacheline-size.patch b/target/linux/qualcommax/patches-6.12/999-fix-netdev-cacheline-size.patch\nnew file mode 100644\nindex 00000000000000..1481f8844bf45e\n--- /dev/null\n+++ b/target/linux/qualcommax/patches-6.12/999-fix-netdev-cacheline-size.patch\n@@ -0,0 +1,11 @@\n+--- a/net/core/dev.c\n++++ b/net/core/dev.c\n+@@ -12060,7 +12060,7 @@ static void __init net_dev_struct_check(void)\n+ #ifdef CONFIG_NET_XGRESS\n+ \tCACHELINE_ASSERT_GROUP_MEMBER(struct net_device, net_device_read_tx, tcx_egress);\n+ #endif\n+-\tCACHELINE_ASSERT_GROUP_SIZE(struct net_device, net_device_read_tx, 160);\n++\tCACHELINE_ASSERT_GROUP_SIZE(struct net_device, net_device_read_tx, 192);\n+ \n+ \t/* TXRX read-mostly hotpath */\n+ \tCACHELINE_ASSERT_GROUP_MEMBER(struct net_device, net_device_read_txrx, lstats);\n\n--- a/target/linux/qualcommax/image/ipq50xx.mk\n+++ b/target/linux/qualcommax/image/ipq50xx.mk\n@@ -57,6 +57,18 @@ define Device/glinet_gl-b3000\n endef\n TARGET_DEVICES += glinet_gl-b3000\n \n+define Device/jdcloud_re-cs-03\n+\t$(call Device/FitImage)\n+\t$(call Device/EmmcImage)\n+\tSOC := ipq5018\n+\tBLOCKSIZE := 64k\n+\tKERNEL_SIZE := 6144k\n+\tDEVICE_VENDOR := JDCloud\n+\tDEVICE_MODEL := AX3000\n+\tDEVICE_DTS_CONFIG := config@mp03.5-c2\n+endef\n+TARGET_DEVICES += jdcloud_re-cs-03\n+\n define Device/iodata_wn-dax3000gr\n \t$(call Device/FitImageLzma)\n \tDEVICE_VENDOR := I-O DATA\n\n--- a/target/linux/qualcommax/ipq50xx/base-files/lib/upgrade/platform.sh\n+++ b/target/linux/qualcommax/ipq50xx/base-files/lib/upgrade/platform.sh\n@@ -120,6 +120,11 @@ platform_do_upgrade() {\n \tglinet,gl-b3000)\n \t\tglinet_do_upgrade \"$1\"\n \t\t;;\n+  \tjdcloud,re-cs-03)\n+\t\tCI_KERNPART=\"0:HLOS\"\n+\t\tCI_ROOTPART=\"rootfs\"\n+\t\temmc_do_upgrade \"$1\"\n+\t\t;;\n \tlinksys,mr5500|\\\n \tlinksys,mx2000|\\\n \tlinksys,mx5500|\\\n@@ -157,3 +162,12 @@ platform_do_upgrade() {\n \t\t;;\n \tesac\n }\n+\n+platform_copy_config() {\n+\tcase \"$(board_name)\" in\n+\tjdcloud,re-cs-03)\n+\t\temmc_copy_config\n+\t\t;;\n+\tesac\n+\treturn 0;\n+}\n"
  },
  {
    "path": "devices/qualcommax_ipq50xx/patches/pz-l8-enable-wifi.patch",
    "content": "--- a/package/firmware/ipq-wifi/Makefile\n+++ b/package/firmware/ipq-wifi/Makefile\n@@ -14,6 +14,8 @@ PKG_FLAGS:=nonshared\n include $(INCLUDE_DIR)/package.mk\n \n define Build/Compile\n+\t$(CP) ./files/board-cmcc_pz-l8.ipq5018 $(PKG_BUILD_DIR)/\n+\t$(CP) ./files/board-cmcc_pz-l8.qcn6122 $(PKG_BUILD_DIR)/\n endef\n \n # Use ath10k-bdencoder from https://github.com/qca/qca-swiss-army-knife.git\n@@ -35,6 +35,7 @@ ALLWIFIBOARDS:= \\\n \tasus_rt-ax89x \\\n \tbuffalo_wxr-5950ax12 \\\n \tcambiumnetworks_xe34 \\\n+\tcmcc_pz-l8 \\\n \tcmcc_rm2-6 \\\n \tcompex_wpq873 \\\n \tdynalink_dl-wrx36 \\\n@@ -218,6 +219,7 @@ $(eval $(call generate-ipq-wifi-package,arcadyan_aw1000,Arcadyan AW1000))\n $(eval $(call generate-ipq-wifi-package,asus_rt-ax89x,Asus RT-AX89X))\n $(eval $(call generate-ipq-wifi-package,buffalo_wxr-5950ax12,Buffalo WXR-5950AX12))\n $(eval $(call generate-ipq-wifi-package,cambiumnetworks_xe34,Cambium Networks XE3-4))\n+$(eval $(call generate-ipq-wifi-package,cmcc_pz-l8,CMCC PZ-L8))\n $(eval $(call generate-ipq-wifi-package,cmcc_rm2-6,CMCC RM2-6))\n $(eval $(call generate-ipq-wifi-package,compex_wpq873,Compex WPQ-873))\n $(eval $(call generate-ipq-wifi-package,dynalink_dl-wrx36,Dynalink DL-WRX36))\n\n--- a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-pz-l8.dts\n+++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-pz-l8.dts\n@@ -350,13 +350,12 @@\n \t};\n };\n \n-/*\n- * ath11k Wi-Fi consumes too large memory spaces and too few spaces are\n- * available for users. To prevent OOM when using LuCI or other softwares,\n- * disable Wi-Fi related peripherals at the moment.\n- */\n &q6v5_wcss {\n-\tstatus = \"disabled\";\n+\tboot-args = </*       type:\t*/ 0x2 /* PCIE1\t*/\n+\t\t     /*     length:\t*/ 4\n+\t\t     /*     UPD ID:\t*/ 2\n+\t\t     /* reset GPIO:\t*/ 27\n+\t\t     /*   reserved:\t*/ 0 0>;\n };\n \n &wifi {\n@@ -368,7 +367,7 @@\n \n \tieee80211-freq-limit = <2400000 2483000>;\n \n-\tstatus = \"disabled\";\n+\tstatus = \"okay\";\n };\n \n &wifi1 {\n@@ -382,5 +381,5 @@\n \n \tieee80211-freq-limit = <5150000 5730000>;\n \n-\tstatus = \"disabled\";\n+\tstatus = \"okay\";\n };\n\n--- a/target/linux/qualcommax/image/ipq50xx.mk\n+++ b/target/linux/qualcommax/image/ipq50xx.mk\n@@ -46,6 +46,7 @@ define Device/cmcc_pz-l8\n \tPAGESIZE := 2048\n \tIMAGE_SIZE := 59392k\n \tNAND_SIZE := 128m\n+\tDEVICE_PACKAGES := kmod-ath11k-smallbuffers ath11k-firmware-ipq5018-qcn6122 ipq-wifi-cmcc_pz-l8\n endef\n TARGET_DEVICES += cmcc_pz-l8\n \n\n--- a/target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata\n+++ b/target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata\n@@ -39,6 +39,12 @@ case \"$FIRMWARE\" in\n \t\tath11k_remove_regdomain\n \t\tath11k_set_macflag\n \t\t;;\n+\tcmcc,pz-l8)\n+\t\tcaldata_extract \"0:art\" 0x1000 0x20000\n+\t\tlabel_mac=$(cat /sys/class/net/eth0/address)\n+\t\tath11k_patch_mac $(macaddr_add $label_mac 2) 0\n+\t\tath11k_set_macflag\n+\t\t;;\n \txiaomi,ax6000)\n \t\tcaldata_extract \"0:art\" 0x1000 0x20000\n \t\t;;\n@@ -88,6 +94,12 @@ case \"$FIRMWARE\" in\n \t\tath11k_remove_regdomain\n \t\tath11k_set_macflag\n \t\t;;\n+\tcmcc,pz-l8)\n+\t\tcaldata_extract \"0:art\" 0x1000 0x20000\n+\t\tlabel_mac=$(cat /sys/class/net/eth0/address)\n+\t\tath11k_patch_mac $(macaddr_add $label_mac 3) 0\n+\t\tath11k_set_macflag\n+\t\t;;\n \tesac\n \t;;\n \"ath11k/QCN6122/hw1.0/cal-ahb-b00b040.wifi.bin\")\n\n--- a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-pz-l8.dts\n+++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-pz-l8.dts\n@@ -232,6 +232,18 @@\n \t\t\t#address-cells = <1>;\n \t\t\t#size-cells = <0>;\n \n+\t\t\tport@0 {\n+\t\t\t\treg = <0>;\n+\t\t\t\tphy-mode = \"sgmii\";\n+\t\t\t\tethernet = <&dp2>;\n+\t\t\t\tqca,sgmii-enable-pll;\n+\n+\t\t\t\tfixed-link {\n+\t\t\t\t\tspeed = <1000>;\n+\t\t\t\t\tfull-duplex;\n+\t\t\t\t};\n+\t\t\t};\n+\n \t\t\tport@1 {\n \t\t\t\treg = <1>;\n \t\t\t\tlabel = \"lan3\";\n@@ -256,26 +268,11 @@\n \t\t\t\tphy-handle = <&qca8337_3>;\n \t\t\t};\n \n-\t\t\t/*\n-\t\t\t * WAN cannot work if added\n-\t\t\t * port@5 {\n-\t\t\t * \treg = <5>;\n-\t\t\t * \tphy-handle = <&qca8337_4>;\n-\t\t\t * \tphy-mode = \"gmii\";\n-\t\t\t * \tethernet = <&dp1>;\n-\t\t\t * };\n-\t\t\t */\n-\n-\t\t\tport@6 {\n-\t\t\t\treg = <6>;\n-\t\t\t\tphy-mode = \"sgmii\";\n-\t\t\t\tethernet = <&dp2>;\n-\t\t\t\tqca,sgmii-enable-pll;\n-\n-\t\t\t\tfixed-link {\n-\t\t\t\t\tspeed = <1000>;\n-\t\t\t\t\tfull-duplex;\n-\t\t\t\t};\n+\t\t\tport@5 {\n+\t\t\t\treg = <5>;\n+\t\t\t\tphy-handle = <&qca8337_4>;\n+\t\t\t\tphy-mode = \"gmii\";\n+\t\t\t\tethernet = <&dp1>;\n \t\t\t};\n \t\t};\n \t};\n\n--- a/target/linux/qualcommax/ipq50xx/base-files/etc/board.d/02_network\n+++ b/target/linux/qualcommax/ipq50xx/base-files/etc/board.d/02_network\n@@ -16,7 +16,14 @@ ipq50xx_setup_interfaces()\n \tglinet,gl-b3000)\n \t\tucidef_set_interfaces_lan_wan \"lan1 lan2\" \"wan\"\n \t\t;;\n-\tcmcc,pz-l8|\\\n+\tcmcc,pz-l8)\n+\t\tucidef_set_interfaces_lan_wan \"lan1 lan2 lan3\" \"wan\"\n+\t\tucidef_set_network_device_conduit \"lan1\" \"eth1\"\n+\t\tucidef_set_network_device_conduit \"lan2\" \"eth1\"\n+\t\tucidef_set_network_device_conduit \"lan3\" \"eth1\"\n+\t\tucidef_set_network_device_conduit \"wan\" \"eth0\"\n+\t\t;;\n+\tjdcloud,re-cs-03|\\\n \tlinksys,mx2000|\\\n \tlinksys,mx5500|\\\n \tlinksys,spnmx56|\\"
  },
  {
    "path": "devices/qualcommax_ipq60xx/.config",
    "content": "\nCONFIG_TARGET_qualcommax=y\nCONFIG_TARGET_qualcommax_ipq60xx=y\n\n\n"
  },
  {
    "path": "devices/qualcommax_ipq60xx/diy.sh",
    "content": "#!/bin/bash\n\nshopt -s extglob\n\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\nrm -rf package/boot package/firmware/ipq-wifi target/linux/generic target/linux/qualcommax package/firmware/ath11k-firmware package/kernel/mac80211 package/kernel/nat46\n\ngit_clone_path 25.12-nss https://github.com/LiBwrt/openwrt-6.x target/linux/generic target/linux/qualcommax package/boot package/firmware/ipq-wifi package/firmware/ath11k-firmware package/kernel/mac80211 package/kernel/nat46\n\nwget -N https://github.com/LiBwrt/openwrt-6.x/raw/refs/heads/25.12-nss/include/image-commands.mk -P include/\nwget -N https://github.com/LiBwrt/openwrt-6.x/raw/refs/heads/25.12-nss/config/Config-ipq.in -P config/\nwget -N https://github.com/LiBwrt/openwrt-6.x/raw/refs/heads/25.12-nss/Config.in -P ./\n\nrm -rf feeds/kiddin9/shortcut-fe\n\n\ngit clone https://github.com/qosmio/nss-packages.git package/nss-packages\ngit clone https://github.com/qosmio/sqm-scripts-nss.git package/sqm-scripts-nss\n\nsed -i \"/ECM_INTERFACE_RAWIP_ENABLE/d\"  package/nss-packages/qca-nss-ecm/Makefile\nrm -rf package/nss-packages/nss-userspace-oss\n\nsed -i \"s/luci uboot-envtools wpad-openssl/luci uboot-envtools wpad-mbedtls/\" target/linux/qualcommax/Makefile\n"
  },
  {
    "path": "devices/qualcommax_ipq60xx/patches/ax6600.patch",
    "content": "--- a/target/linux/qualcommax/image/ipq60xx.mk\n+++ b/target/linux/qualcommax/image/ipq60xx.mk\n@@ -360,7 +360,7 @@ define Device/jdcloud_re-ss-01\n \t$(call Device/FitImage)\n \t$(call Device/EmmcImage)\n \tDEVICE_VENDOR := JDCloud\n-\tDEVICE_MODEL := RE-SS-01\n+\tDEVICE_MODEL := AX1800 Pro\n \tKERNEL_SIZE := 6144k\n \tSOC := ipq6000\n \tDEVICE_DTS_CONFIG := config@cp03-c2\n@@ -373,7 +373,7 @@ define Device/jdcloud_re-cs-02\n \t$(call Device/FitImage)\n \t$(call Device/EmmcImage)\n \tDEVICE_VENDOR := JDCloud\n-\tDEVICE_MODEL := RE-CS-02\n+\tDEVICE_MODEL := AX6600\n \tKERNEL_SIZE := 6144k\n \tSOC := ipq6010\n \tDEVICE_DTS_CONFIG := config@cp03-c3\n\n--- a/package/kernel/linux/modules/netfilter.mk\n+++ b/package/kernel/linux/modules/netfilter.mk\n@@ -330,7 +330,7 @@ define KernelPackage/ipt-ipopt\n   KCONFIG:=$(KCONFIG_IPT_IPOPT)\n   FILES:=$(foreach mod,$(IPT_IPOPT-m),$(LINUX_DIR)/net/$(mod).ko)\n   AUTOLOAD:=$(call AutoProbe,$(notdir $(IPT_IPOPT-m)))\n-  $(call AddDepends/ipt)\n+  $(call AddDepends/ipt,+kmod-nf-conntrack)\n endef\n \n define KernelPackage/ipt-ipopt/description\n"
  },
  {
    "path": "devices/qualcommax_ipq807x/.config",
    "content": "CONFIG_TARGET_qualcommax=y\nCONFIG_TARGET_qualcommax_ipq807x=y\n\nCONFIG_TARGET_DEVICE_qualcommax_ipq807x_DEVICE_asus_rt-ax89x=n\nCONFIG_TARGET_DEVICE_qualcommax_ipq807x_DEVICE_netgear_wax218-web-ui=n\nCONFIG_TARGET_DEVICE_qualcommax_ipq807x_DEVICE_netgear_rax120v2=n\n"
  },
  {
    "path": "devices/qualcommax_ipq807x/diy/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq8071-ax3600.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n/* Copyright (c) 2021, Robert Marko <robimarko@gmail.com> */\n\n/dts-v1/;\n\n#include \"ipq8071-ax3600.dtsi\"\n\n/ {\n\tmodel = \"Xiaomi AX3600\";\n\tcompatible = \"xiaomi,ax3600\", \"qcom,ipq8074\";\n\n\taliases {\n\t\t/* Aliases as required by u-boot to patch MAC addresses */\n\t\tethernet1 = &dp2;\n\t\tethernet2 = &dp3;\n\t\tethernet3 = &dp4;\n\t\tethernet4 = &dp5;\n\t};\n\n\tchosen {\n\t\tbootargs-append = \" root=/dev/ubiblock0_1\";\n\t};\n\n\tleds {\n\t\tcompatible = \"gpio-leds\";\n\n\t\tled_system_blue: system-blue {\n\t\t\tlabel = \"blue:system\";\n\t\t\tgpios = <&tlmm 42 GPIO_ACTIVE_HIGH>;\n\t\t};\n\n\t\tled_system_yellow: system-yellow {\n\t\t\tlabel = \"yellow:system\";\n\t\t\tgpios = <&tlmm 43 GPIO_ACTIVE_HIGH>;\n\t\t};\n\n\t\tnetwork-yellow {\n\t\t\tlabel = \"yellow:network\";\n\t\t\tgpios = <&tlmm 22 GPIO_ACTIVE_HIGH>;\n\t\t};\n\n\t\tnetwork-blue {\n\t\t\tlabel = \"blue:network\";\n\t\t\tgpios = <&tlmm 21 GPIO_ACTIVE_HIGH>;\n\t\t};\n\n\t\taiot {\n\t\t\tlabel = \"blue:aiot\";\n\t\t\tgpios = <&tlmm 51 GPIO_ACTIVE_HIGH>;\n\t\t\tlinux,default-trigger = \"phy0tpt\";\n\t\t};\n\t};\n};\n\n&pcie_qmp0 {\n\tstatus = \"okay\";\n};\n\n&pcie0 {\n\tstatus = \"okay\";\n\n\tperst-gpio = <&tlmm 52 GPIO_ACTIVE_HIGH>;\n\n\tbridge@0,0 {\n\t\treg = <0x00000000 0 0 0 0>;\n\t\t#address-cells = <3>;\n\t\t#size-cells = <2>;\n\t\tranges;\n\n\t\twifi0: wifi@1,0 {\n\t\t\tstatus = \"okay\";\n\n\t\t\tcompatible = \"qcom,ath10k\";\n\t\t\treg = <0x00010000 0 0 0 0>;\n\n\t\t\tqcom,ath10k-calibration-variant = \"Xiaomi-AX3600\";\n\t\t\tnvmem-cell-names = \"calibration\";\n\t\t\tnvmem-cells = <&caldata_qca9889>;\n\t\t};\n\t};\n};\n\n&wifi {\n\tqcom,ath11k-calibration-variant = \"Xiaomi-AX3600\";\n};\n\n&qpic_nand {\n\t/delete-node/ partitions;\n\n\tnand@0 {\n\t\t/delete-node/ partitions;\n\n\t\tpartitions {\n\t\t\tcompatible = \"qcom,smem-part\";\n\t\t};\n\t};\n};\n\n&dp2 {\n\t/delete-property/ nvmem-cells;\n\t/delete-property/ nvmem-cell-names;\n};\n\n&dp3 {\n\t/delete-property/ nvmem-cells;\n\t/delete-property/ nvmem-cell-names;\n};\n\n&dp4 {\n\t/delete-property/ nvmem-cells;\n\t/delete-property/ nvmem-cell-names;\n};\n\n&dp5 {\n\t/delete-property/ nvmem-cells;\n\t/delete-property/ nvmem-cell-names;\n};\n\n&wifi0 {\n\t/delete-property/ nvmem-cells;\n\t/delete-property/ nvmem-cell-names;\n};"
  },
  {
    "path": "devices/qualcommax_ipq807x/diy/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq8071-ax6.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n/* Copyright (c) 2021, Zhijun You <hujy652@gmail.com> */\n\n/dts-v1/;\n\n#include \"ipq8071-ax3600.dtsi\"\n\n/ {\n\tmodel = \"Redmi AX6\";\n\tcompatible = \"redmi,ax6\", \"qcom,ipq8074\";\n\n\taliases {\n\t\t/* Aliases as required by u-boot to patch MAC addresses */\n\t\tethernet1 = &dp2;\n\t\tethernet2 = &dp3;\n\t\tethernet3 = &dp4;\n\t\tethernet4 = &dp5;\n\t};\n\n\tchosen {\n\t\tbootargs-append = \" root=/dev/ubiblock0_1\";\n\t};\n\n\tleds {\n\t\tcompatible = \"gpio-leds\";\n\n\t\tled_system_blue: system-blue {\n\t\t\tlabel = \"blue:system\";\n\t\t\tgpios = <&tlmm 21 GPIO_ACTIVE_HIGH>;\n\t\t};\n\n\t\tled_system_yellow: system-yellow {\n\t\t\tlabel = \"yellow:system\";\n\t\t\tgpios = <&tlmm 22 GPIO_ACTIVE_HIGH>;\n\t\t};\n\n\t\tnetwork-blue {\n\t\t\tlabel = \"blue:network\";\n\t\t\tgpios = <&tlmm 42 GPIO_ACTIVE_HIGH>;\n\t\t};\n\n\t\tnetwork-yellow {\n\t\t\tlabel = \"yellow:network\";\n\t\t\tgpios = <&tlmm 43 GPIO_ACTIVE_HIGH>;\n\t\t};\n\t};\n};\n\n/* AX6 can both have NAND of 256MiB or 128MiB.\n * To be on the safe side, assume 128MiB of NAND.\n */\n&rootfs {\n\treg = <0x2dc0000 0x5220000>;\n};\n\n&wifi {\n\tqcom,ath11k-calibration-variant = \"Redmi-AX6\";\n};\n\n&qpic_nand {\n\t/delete-node/ partitions;\n\n\tnand@0 {\n\t\t/delete-node/ partitions;\n\n\t\tpartitions {\n\t\t\tcompatible = \"qcom,smem-part\";\n\t\t};\n\t};\n};\n\n&dp2 {\n\t/delete-property/ nvmem-cells;\n\t/delete-property/ nvmem-cell-names;\n};\n\n&dp3 {\n\t/delete-property/ nvmem-cells;\n\t/delete-property/ nvmem-cell-names;\n};\n\n&dp4 {\n\t/delete-property/ nvmem-cells;\n\t/delete-property/ nvmem-cell-names;\n};\n\n&dp5 {\n\t/delete-property/ nvmem-cells;\n\t/delete-property/ nvmem-cell-names;\n};\n"
  },
  {
    "path": "devices/qualcommax_ipq807x/diy/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq8072-ax9000.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n/* Copyright (c) 2021, Robert Marko <robimarko@gmail.com> */\n\n/dts-v1/;\n\n#include \"ipq8074.dtsi\"\n#include \"ipq8074-hk-cpu.dtsi\"\n#include \"ipq8074-ess.dtsi\"\n#include <dt-bindings/gpio/gpio.h>\n#include <dt-bindings/input/input.h>\n#include <dt-bindings/leds/common.h>\n\n/ {\n\tmodel = \"Xiaomi AX9000\";\n\tcompatible = \"xiaomi,ax9000\", \"qcom,ipq8074\";\n\n\taliases {\n\t\tserial0 = &blsp1_uart5;\n\t\tled-boot = &led_system_yellow;\n\t\tled-failsafe = &led_system_yellow;\n\t\tled-running = &led_system_blue;\n\t\tled-upgrade = &led_system_yellow;\n\t\t/* Aliases as required by u-boot to patch MAC addresses */\n\t\tethernet0 = &dp1;\n\t\tethernet1 = &dp2;\n\t\tethernet2 = &dp3;\n\t\tethernet3 = &dp4;\n\t\tethernet4 = &dp5;\n\t\tlabel-mac-device = &dp5;\n\t};\n\n\tchosen {\n\t\tstdout-path = \"serial0:115200n8\";\n\t\tbootargs-append = \" root=/dev/ubiblock0_1\";\n\t};\n\n\tkeys {\n\t\tcompatible = \"gpio-keys\";\n\n\t\treset {\n\t\t\tlabel = \"reset\";\n\t\t\tgpios = <&tlmm 47 GPIO_ACTIVE_LOW>;\n\t\t\tlinux,code = <KEY_RESTART>;\n\t\t};\n\n\t\twps {\n\t\t\tlabel = \"wps\"; /* Labeled Mesh on the device */\n\t\t\tgpios = <&tlmm 46 GPIO_ACTIVE_LOW>;\n\t\t\tlinux,code = <KEY_WPS_BUTTON>;\n\t\t};\n\t};\n\n\tleds {\n\t\tcompatible = \"gpio-leds\";\n\n\t\tled_system_blue: system-blue {\n\t\t\tlabel = \"blue:system\";\n\t\t\tgpios = <&tlmm 48 GPIO_ACTIVE_HIGH>;\n\t\t\tcolor = <LED_COLOR_ID_BLUE>;\n\t\t};\n\n\t\tled_system_yellow: system-yellow {\n\t\t\tlabel = \"yellow:system\";\n\t\t\tgpios = <&tlmm 52 GPIO_ACTIVE_HIGH>;\n\t\t\tcolor = <LED_COLOR_ID_YELLOW>;\n\t\t};\n\n\t\tnetwork-yellow {\n\t\t\tlabel = \"yellow:network\";\n\t\t\tgpios = <&tlmm 50 GPIO_ACTIVE_HIGH>;\n\t\t\tcolor = <LED_COLOR_ID_YELLOW>;\n\t\t};\n\n\t\tnetwork-blue {\n\t\t\tlabel = \"blue:network\";\n\t\t\tgpios = <&tlmm 51 GPIO_ACTIVE_HIGH>;\n\t\t\tcolor = <LED_COLOR_ID_BLUE>;\n\t\t};\n\n\t\ttop-red {\n\t\t\tlabel = \"red:top\";\n\t\t\tgpios = <&tlmm 63 GPIO_ACTIVE_HIGH>;\n\t\t\tcolor = <LED_COLOR_ID_RED>;\n\t\t\tdefault-state = \"keep\";\n\t\t};\n\n\t\ttop-green {\n\t\t\tlabel = \"green:top\";\n\t\t\tgpios = <&tlmm 64 GPIO_ACTIVE_HIGH>;\n\t\t\tcolor = <LED_COLOR_ID_GREEN>;\n\t\t\tdefault-state = \"keep\";\n\t\t};\n\n\t\ttop-blue {\n\t\t\tlabel = \"blue:top\";\n\t\t\tgpios = <&tlmm 66 GPIO_ACTIVE_HIGH>;\n\t\t\tcolor = <LED_COLOR_ID_BLUE>;\n\t\t\tdefault-state = \"keep\";\n\t\t};\n\t};\n};\n\n&tlmm {\n\tmdio_pins: mdio-pins {\n\t\tmdc {\n\t\t\tpins = \"gpio68\";\n\t\t\tfunction = \"mdc\";\n\t\t\tdrive-strength = <8>;\n\t\t\tbias-pull-up;\n\t\t};\n\n\t\tmdio {\n\t\t\tpins = \"gpio69\";\n\t\t\tfunction = \"mdio\";\n\t\t\tdrive-strength = <8>;\n\t\t\tbias-pull-up;\n\t\t};\n\t};\n\n\ti2c_pins: i2c-pins {\n\t\tpins = \"gpio0\", \"gpio2\";\n\t\tfunction = \"blsp5_i2c\";\n\t\tdrive-strength = <8>;\n\t\tbias-disable;\n\t};\n};\n\n&blsp1_uart5 {\n\tstatus = \"okay\";\n};\n\n&blsp1_i2c6 {\n\tstatus = \"okay\";\n\n\tpinctrl-0 = <&i2c_pins>;\n\tpinctrl-names = \"default\";\n};\n\n&prng {\n\tstatus = \"okay\";\n};\n\n&cryptobam {\n\tstatus = \"okay\";\n};\n\n&crypto {\n\tstatus = \"okay\";\n};\n\n&qpic_bam {\n\tstatus = \"okay\";\n};\n\n&qpic_nand {\n\tstatus = \"okay\";\n\n\t/*\n\t * Bootloader will find the NAND DT node by the compatible and\n\t * then \"fixup\" it by adding the partitions from the SMEM table\n\t * using the legacy bindings thus making it impossible for us\n\t * to change the partition table or utilize NVMEM for calibration.\n\t * So add a dummy partitions node that bootloader will populate\n\t * and set it as disabled so the kernel ignores it instead of\n\t * printing warnings due to the broken way bootloader adds the\n\t * partitions.\n\t */\n\tpartitions {\n\t\tstatus = \"disabled\";\n\t};\n\n\tnand@0 {\n\t\treg = <0>;\n\t\tnand-ecc-strength = <4>;\n\t\tnand-ecc-step-size = <512>;\n\t\tnand-bus-width = <8>;\n\n\t\tpartitions {\n\t\t\tcompatible = \"fixed-partitions\";\n\t\t\t#address-cells = <1>;\n\t\t\t#size-cells = <1>;\n\n\t\t\tpartition@0 {\n\t\t\t\tlabel = \"0:sbl1\";\n\t\t\t\treg = <0x0 0x100000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@100000 {\n\t\t\t\tlabel = \"0:mibib\";\n\t\t\t\treg = <0x100000 0x100000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@200000 {\n\t\t\t\tlabel = \"0:bootconfig\";\n\t\t\t\treg = <0x200000 0x80000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@280000 {\n\t\t\t\tlabel = \"0:bootconfig1\";\n\t\t\t\treg = <0x280000 0x80000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@300000 {\n\t\t\t\tlabel = \"0:qsee\";\n\t\t\t\treg = <0x300000 0x300000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@600000 {\n\t\t\t\tlabel = \"0:qsee_1\";\n\t\t\t\treg = <0x600000 0x300000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@900000 {\n\t\t\t\tlabel = \"0:devcfg\";\n\t\t\t\treg = <0x900000 0x80000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@980000 {\n\t\t\t\tlabel = \"0:devcfg_1\";\n\t\t\t\treg = <0x980000 0x80000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@a00000 {\n\t\t\t\tlabel = \"0:apdp\";\n\t\t\t\treg = <0xa00000 0x80000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@a80000 {\n\t\t\t\tlabel = \"0:apdp_1\";\n\t\t\t\treg = <0xa80000 0x80000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@b00000 {\n\t\t\t\tlabel = \"0:rpm\";\n\t\t\t\treg = <0xb00000 0x80000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@b80000 {\n\t\t\t\tlabel = \"0:rpm_1\";\n\t\t\t\treg = <0xb80000 0x80000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@c00000 {\n\t\t\t\tlabel = \"0:cdt\";\n\t\t\t\treg = <0xc00000 0x80000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@c80000 {\n\t\t\t\tlabel = \"0:cdt_1\";\n\t\t\t\treg = <0xc80000 0x80000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@d00000 {\n\t\t\t\tlabel = \"0:appsblenv\";\n\t\t\t\treg = <0xd00000 0x80000>;\n\t\t\t};\n\n\t\t\tpartition@d80000 {\n\t\t\t\tlabel = \"0:appsbl\";\n\t\t\t\treg = <0xd80000 0x100000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@e80000 {\n\t\t\t\tlabel = \"0:appsbl_1\";\n\t\t\t\treg = <0xe80000 0x100000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@f80000 {\n\t\t\t\tlabel = \"0:art\";\n\t\t\t\treg = <0xf80000 0x80000>;\n\t\t\t\tread-only;\n\n\t\t\t\tcompatible = \"nvmem-cells\";\n\t\t\t\t#address-cells = <1>;\n\t\t\t\t#size-cells = <1>;\n\n\t\t\t\tmacaddr_dp1: macaddr@0 {\n\t\t\t\t\treg = <0x0 0x6>;\n\t\t\t\t};\n\n\t\t\t\tmacaddr_dp2: macaddr@6 {\n\t\t\t\t\treg = <0x6 0x6>;\n\t\t\t\t};\n\n\t\t\t\tmacaddr_dp3: macaddr@c {\n\t\t\t\t\treg = <0xc 0x6>;\n\t\t\t\t};\n\n\t\t\t\tmacaddr_dp4: macaddr@12 {\n\t\t\t\t\treg = <0x12 0x6>;\n\t\t\t\t};\n\n\t\t\t\tmacaddr_dp5: macaddr@18 {\n\t\t\t\t\treg = <0x18 0x6>;\n\t\t\t\t};\n\n\t\t\t\tcaldata_qca9889: caldata@4d000 {\n\t\t\t\t\treg = <0x4d000 0x844>;\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tpartition@1000000 {\n\t\t\t\tlabel = \"bdata\";\n\t\t\t\treg = <0x1000000 0x80000>;\n\t\t\t};\n\n\t\t\tpartition@1080000 {\n\t\t\t\t/* This is crash + crash_syslog parts combined */\n\t\t\t\tlabel = \"pstore\";\n\t\t\t\treg = <0x1080000 0x100000>;\n\t\t\t};\n\n\t\t\tpartition@1180000 {\n\t\t\t\tlabel = \"ubi_kernel\";\n\t\t\t\treg = <0x1180000 0x3800000>;\n\t\t\t};\n\n\t\t\tpartition@4980000 {\n\t\t\t\tlabel = \"rootfs\";\n\t\t\t\treg = <0x4980000 0xb680000>;\n\t\t\t};\n\t\t};\n\t};\n};\n\n&qusb_phy_0 {\n\tstatus = \"okay\";\n};\n\n&ssphy_0 {\n\tstatus = \"okay\";\n};\n\n&usb_0 {\n\tstatus = \"okay\";\n};\n\n&mdio {\n\tstatus = \"okay\";\n\n\tpinctrl-0 = <&mdio_pins>;\n\tpinctrl-names = \"default\";\n\treset-gpios = <&tlmm 37 GPIO_ACTIVE_LOW>;\n\n\tqca8075_0: ethernet-phy@0 {\n\t\tcompatible = \"ethernet-phy-ieee802.3-c22\";\n\t\treg = <0>;\n\t};\n\n\tqca8075_1: ethernet-phy@1 {\n\t\tcompatible = \"ethernet-phy-ieee802.3-c22\";\n\t\treg = <1>;\n\t};\n\n\tqca8075_2: ethernet-phy@2 {\n\t\tcompatible = \"ethernet-phy-ieee802.3-c22\";\n\t\treg = <2>;\n\t};\n\n\tqca8075_3: ethernet-phy@3 {\n\t\tcompatible = \"ethernet-phy-ieee802.3-c22\";\n\t\treg = <3>;\n\t};\n\n\tqca8081: ethernet-phy@24 {\n\t\tcompatible = \"ethernet-phy-id004d.d101\";\n\t\treg = <24>;\n\t\treset-gpios = <&tlmm 44 GPIO_ACTIVE_LOW>;\n\t};\n};\n\n&switch {\n\tstatus = \"okay\";\n\n\tswitch_cpu_bmp = <0x1>;  /* cpu port bitmap */\n\tswitch_lan_bmp = <0x1e>; /* lan port bitmap */\n\tswitch_wan_bmp = <0x20>; /* wan port bitmap */\n\tswitch_mac_mode = <0xb>; /* mac mode for uniphy instance0*/\n\tswitch_mac_mode1 = <0xc>; /* mac mode for uniphy instance1*/\n\tswitch_mac_mode2 = <0xff>; /* mac mode for uniphy instance2*/\n\tbm_tick_mode = <0>; /* bm tick mode */\n\ttm_tick_mode = <0>; /* tm tick mode */\n\n\tqcom,port_phyinfo {\n\t\tport@0 {\n\t\t\tport_id = <1>;\n\t\t\tphy_address = <0>;\n\t\t};\n\t\tport@1 {\n\t\t\tport_id = <2>;\n\t\t\tphy_address = <1>;\n\t\t};\n\t\tport@2 {\n\t\t\tport_id = <3>;\n\t\t\tphy_address = <2>;\n\t\t};\n\t\tport@3 {\n\t\t\tport_id = <4>;\n\t\t\tphy_address = <3>;\n\t\t};\n\t\tport@4 {\n\t\t\tport_id = <5>;\n\t\t\tphy_address = <24>;\n\t\t\tport_mac_sel = \"QGMAC_PORT\";\n\t\t};\n\t};\n};\n\n&dp1 {\n\tstatus = \"okay\";\n\tphy-handle = <&qca8075_0>;\n\tlabel = \"lan4\";\n\tnvmem-cells = <&macaddr_dp1>;\n\tnvmem-cell-names = \"mac-address\";\n};\n\n&dp2 {\n\tstatus = \"okay\";\n\tphy-handle = <&qca8075_1>;\n\tlabel = \"lan3\";\n\tnvmem-cells = <&macaddr_dp2>;\n\tnvmem-cell-names = \"mac-address\";\n};\n\n&dp3 {\n\tstatus = \"okay\";\n\tphy-handle = <&qca8075_2>;\n\tlabel = \"lan2\";\n\tnvmem-cells = <&macaddr_dp3>;\n\tnvmem-cell-names = \"mac-address\";\n};\n\n&dp4 {\n\tstatus = \"okay\";\n\tphy-handle = <&qca8075_3>;\n\tlabel = \"lan1\";\n\tnvmem-cells = <&macaddr_dp4>;\n\tnvmem-cell-names = \"mac-address\";\n};\n\n&dp5 {\n\tstatus = \"okay\";\n\tphy-handle = <&qca8081>;\n\tlabel = \"wan\";\n\tnvmem-cells = <&macaddr_dp5>;\n\tnvmem-cell-names = \"mac-address\";\n};\n\n&edma {\n\tstatus = \"okay\";\n};\n\n&pcie_qmp0 {\n\tstatus = \"okay\";\n};\n\n&pcie0 {\n\tstatus = \"okay\";\n\n\tperst-gpio = <&tlmm 58 GPIO_ACTIVE_LOW>;\n\n\tbridge@0,0 {\n\t\treg = <0x00000000 0 0 0 0>;\n\t\t#address-cells = <3>;\n\t\t#size-cells = <2>;\n\t\tranges;\n\n\t\twifi@1,0 {\n\t\t\tstatus = \"okay\";\n\n\t\t\t/* ath11k has no DT compatible for PCI cards */\n\t\t\tcompatible = \"pci17cb,1104\";\n\t\t\treg = <0x00010000 0 0 0 0>;\n\n\t\t\tqcom,ath11k-calibration-variant = \"Xiaomi-AX9000\";\n\t\t};\n\t};\n};\n\n&pcie_qmp1 {\n\tstatus = \"okay\";\n};\n\n&pcie1 {\n\tstatus = \"okay\";\n\n\tperst-gpio = <&tlmm 62 GPIO_ACTIVE_HIGH>;\n\n\tbridge@1,0 {\n\t\treg = <0x00010000 0 0 0 0>;\n\t\t#address-cells = <3>;\n\t\t#size-cells = <2>;\n\t\tranges;\n\n\t\twifi1: wifi@1,0 {\n\t\t\tstatus = \"okay\";\n\n\t\t\tcompatible = \"qcom,ath10k\";\n\t\t\treg = <0x00010000 0 0 0 0>;\n\n\t\t\tqcom,ath10k-calibration-variant = \"Xiaomi-AX9000\";\n\t\t};\n\t};\n};\n\n&wifi {\n\tstatus = \"okay\";\n\n\tqcom,ath11k-calibration-variant = \"Xiaomi-AX9000\";\n};\n\n&qpic_nand {\n\t/delete-node/ partitions;\n\n\tnand@0 {\n\t\t/delete-node/ partitions;\n\n\t\tpartitions {\n\t\t\tcompatible = \"qcom,smem-part\";\n\t\t};\n\t};\n};\n\n&dp1 {\n\t/delete-property/ nvmem-cells;\n\t/delete-property/ nvmem-cell-names;\n};\n\n&dp2 {\n\t/delete-property/ nvmem-cells;\n\t/delete-property/ nvmem-cell-names;\n};\n\n&dp3 {\n\t/delete-property/ nvmem-cells;\n\t/delete-property/ nvmem-cell-names;\n};\n\n&dp4 {\n\t/delete-property/ nvmem-cells;\n\t/delete-property/ nvmem-cell-names;\n};\n\n&dp5 {\n\t/delete-property/ nvmem-cells;\n\t/delete-property/ nvmem-cell-names;\n};\n\n&wifi1 {\n\t/delete-property/ nvmem-cells;\n\t/delete-property/ nvmem-cell-names;\n};\n"
  },
  {
    "path": "devices/qualcommax_ipq807x/diy/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq8074-nss.dtsi",
    "content": "// SPDX-License-Identifier: GPL-2.0-only\n\n/ {\n\tnss_dummy_reg: nss-regulator {\n\t\tcompatible = \"regulator-fixed\";\n\t\tregulator-name = \"nss-reg\";\n\t\tregulator-min-microvolt = <848000>;\n\t\tregulator-max-microvolt = <848000>;\n\t\tregulator-always-on;\n\t\tregulator-boot-on;\n\t};\n};\n\n&soc {\n\tnss-common {\n\t\tcompatible = \"qcom,nss-common\";\n\t\treg = <0x01868010 0x1000>;\n\t\treg-names = \"nss-misc-reset\";\n\t\tmemory-region = <&nss_region>;\n\t};\n\n\tnss0: nss@40000000 {\n\t\tcompatible = \"qcom,nss\";\n\t\tinterrupts = <GIC_SPI 377 IRQ_TYPE_EDGE_RISING>,\n\t\t\t     \t <GIC_SPI 378 IRQ_TYPE_EDGE_RISING>,\n\t\t\t     \t <GIC_SPI 379 IRQ_TYPE_EDGE_RISING>,\n\t\t\t     \t <GIC_SPI 380 IRQ_TYPE_EDGE_RISING>,\n\t\t\t     \t <GIC_SPI 381 IRQ_TYPE_EDGE_RISING>,\n\t\t\t     \t <GIC_SPI 382 IRQ_TYPE_EDGE_RISING>,\n\t\t\t     \t <GIC_SPI 383 IRQ_TYPE_EDGE_RISING>,\n\t\t\t     \t <GIC_SPI 384 IRQ_TYPE_EDGE_RISING>,\n\t\t\t     \t <GIC_SPI 385 IRQ_TYPE_EDGE_RISING>,\n\t\t\t     \t <GIC_SPI 386 IRQ_TYPE_EDGE_RISING>;\n\t\treg = <0x39000000 0x1000>,\n\t\t      <0x38000000 0x30000>,\n\t\t      <0x0b111000 0x1000>;\n\t\treg-names = \"nphys\", \"vphys\", \"qgic-phys\";\n\t\tclocks = <&gcc GCC_NSS_NOC_CLK>,\n\t\t\t \t <&gcc GCC_NSS_PTP_REF_CLK>,\n\t\t\t \t <&gcc GCC_NSS_CSR_CLK>,\n\t\t\t\t <&gcc GCC_NSS_CFG_CLK>,\n\t\t\t \t <&gcc GCC_NSS_IMEM_CLK>,\n\t\t\t \t <&gcc GCC_NSSNOC_QOSGEN_REF_CLK>,\n\t\t\t \t <&gcc GCC_MEM_NOC_NSS_AXI_CLK>,\n\t\t\t \t <&gcc GCC_NSSNOC_SNOC_CLK>,\n\t\t\t \t <&gcc GCC_NSSNOC_TIMEOUT_REF_CLK>,\n\t\t\t \t <&gcc GCC_NSS_CE_AXI_CLK>,\n\t\t\t \t <&gcc GCC_NSS_CE_APB_CLK>,\n\t\t\t \t <&gcc GCC_NSSNOC_CE_AXI_CLK>,\n\t\t\t \t <&gcc GCC_NSSNOC_CE_APB_CLK>,\n\t\t\t \t <&gcc GCC_NSSNOC_UBI0_AHB_CLK>,\n\t\t\t \t <&gcc GCC_UBI0_CORE_CLK>,\n\t\t\t \t <&gcc GCC_UBI0_AHB_CLK>,\n\t\t\t \t <&gcc GCC_UBI0_AXI_CLK>,\n\t\t\t \t <&gcc GCC_UBI0_MPT_CLK>,\n\t\t\t \t <&gcc GCC_UBI0_NC_AXI_CLK>;\n\t\tclock-names = \"nss-noc-clk\",\n\t\t\t\t\t  \"nss-ptp-ref-clk\",\n\t\t\t      \t  \"nss-csr-clk\",\n\t\t\t\t\t  \"nss-cfg-clk\",\n\t\t\t\t\t  \"nss-imem-clk\",\n\t\t\t\t\t  \"nss-nssnoc-qosgen-ref-clk\",\n\t\t\t\t\t  \"nss-mem-noc-nss-axi-clk\",\n\t\t\t\t\t  \"nss-nssnoc-snoc-clk\",\n\t\t\t\t\t  \"nss-nssnoc-timeout-ref-clk\",\n\t\t\t\t\t  \"nss-ce-axi-clk\",\n\t\t\t\t\t  \"nss-ce-apb-clk\",\n\t\t\t\t\t  \"nss-nssnoc-ce-axi-clk\",\n\t\t\t\t\t  \"nss-nssnoc-ce-apb-clk\",\n\t\t\t\t\t  \"nss-nssnoc-ahb-clk\",\n\t\t\t\t\t  \"nss-core-clk\",\n\t\t\t\t\t  \"nss-ahb-clk\",\n\t\t\t\t\t  \"nss-axi-clk\",\n\t\t\t\t\t  \"nss-mpt-clk\",\n\t\t\t\t\t  \"nss-nc-axi-clk\";\n\t\tqcom,id = <0>;\n\t\tqcom,num-queue = <4>;\n\t\tqcom,num-irq = <10>;\n\t\tqcom,num-pri = <4>;\n\t\tqcom,load-addr = <0x40000000>;\n\t\tqcom,low-frequency = <187200000>;\n\t\tqcom,mid-frequency = <748800000>;\n\t\tqcom,max-frequency = <1689600000>;\n\t\tqcom,bridge-enabled;\n\t\tqcom,ipv4-enabled;\n\t\tqcom,ipv4-reasm-enabled;\n\t\tqcom,ipv6-enabled;\n\t\tqcom,ipv6-reasm-enabled;\n\t\tqcom,wlanredirect-enabled;\n\t\tqcom,tun6rd-enabled;\n\t\tqcom,l2tpv2-enabled;\n\t\tqcom,gre-enabled;\n\t\tqcom,gre-redir-enabled;\n\t\tqcom,gre-redir-mark-enabled;\n\t\tqcom,map-t-enabled;\n\t\tqcom,portid-enabled;\n\t\tqcom,ppe-enabled;\n\t\tqcom,pppoe-enabled;\n\t\tqcom,pptp-enabled;\n\t\tqcom,tunipip6-enabled;\n\t\tqcom,shaping-enabled;\n\t\tqcom,wlan-dataplane-offload-enabled;\n\t\tqcom,vlan-enabled;\n\t\tqcom,igs-enabled;\n\t\tqcom,vxlan-enabled;\n\t\tqcom,match-enabled;\n\t\tqcom,mirror-enabled;\n\t\tqcom,udp-st-enabled;\n\t\tmx-supply = <&nss_dummy_reg>;\n\t\tnpu-supply = <&nss_dummy_reg>;\n\t};\n\n\tnss1: nss@40800000 {\n\t\tcompatible = \"qcom,nss\";\n\t\tinterrupts = <GIC_SPI 390 IRQ_TYPE_EDGE_RISING>,\n\t\t\t\t\t <GIC_SPI 391 IRQ_TYPE_EDGE_RISING>,\n\t\t\t\t\t <GIC_SPI 392 IRQ_TYPE_EDGE_RISING>,\n\t\t\t\t\t <GIC_SPI 393 IRQ_TYPE_EDGE_RISING>,\n\t\t\t\t\t <GIC_SPI 394 IRQ_TYPE_EDGE_RISING>,\n\t\t\t\t\t <GIC_SPI 395 IRQ_TYPE_EDGE_RISING>,\n\t\t\t\t\t <GIC_SPI 396 IRQ_TYPE_EDGE_RISING>,\n\t\t\t\t\t <GIC_SPI 397 IRQ_TYPE_EDGE_RISING>,\n\t\t\t\t\t <GIC_SPI 398 IRQ_TYPE_EDGE_RISING>;\n\t\treg = <0x39400000 0x1000>,\n\t\t      <0x38030000 0x30000>,\n\t\t      <0x0b111000 0x1000>;\n\t\treg-names = \"nphys\", \"vphys\", \"qgic-phys\";\n\t\tclocks = <&gcc GCC_NSS_NOC_CLK>,\n\t\t\t\t <&gcc GCC_NSS_PTP_REF_CLK>,\n\t\t\t\t <&gcc GCC_NSS_CSR_CLK>,\n\t\t\t\t <&gcc GCC_NSS_CFG_CLK>,\n\t\t\t\t <&gcc GCC_NSS_IMEM_CLK>,\n\t\t\t\t <&gcc GCC_NSSNOC_QOSGEN_REF_CLK>,\n\t\t\t\t <&gcc GCC_MEM_NOC_NSS_AXI_CLK>,\n\t\t\t\t <&gcc GCC_NSSNOC_SNOC_CLK>,\n\t\t\t\t <&gcc GCC_NSSNOC_TIMEOUT_REF_CLK>,\n\t\t\t\t <&gcc GCC_NSS_CE_AXI_CLK>,\n\t\t\t\t <&gcc GCC_NSS_CE_APB_CLK>,\n\t\t\t\t <&gcc GCC_NSSNOC_CE_AXI_CLK>,\n\t\t\t\t <&gcc GCC_NSSNOC_CE_APB_CLK>,\n\t\t\t\t <&gcc GCC_NSSNOC_UBI1_AHB_CLK>,\n\t\t\t\t <&gcc GCC_UBI1_CORE_CLK>,\n\t\t\t\t <&gcc GCC_UBI1_AHB_CLK>,\n\t\t\t\t <&gcc GCC_UBI1_AXI_CLK>,\n\t\t\t\t <&gcc GCC_UBI1_MPT_CLK>,\n\t\t\t\t <&gcc GCC_UBI1_NC_AXI_CLK>;\n\t\tclock-names = \"nss-noc-clk\",\n\t\t\t\t\t  \"nss-ptp-ref-clk\",\n\t\t\t\t\t  \"nss-csr-clk\",\n\t\t\t\t\t  \"nss-cfg-clk\",\n\t\t\t\t\t  \"nss-imem-clk\",\n\t\t\t\t\t  \"nss-nssnoc-qosgen-ref-clk\",\n\t\t\t\t\t  \"nss-mem-noc-nss-axi-clk\",\n\t\t\t\t\t  \"nss-nssnoc-snoc-clk\",\n\t\t\t\t\t  \"nss-nssnoc-timeout-ref-clk\",\n\t\t\t\t\t  \"nss-ce-axi-clk\",\n\t\t\t\t\t  \"nss-ce-apb-clk\",\n\t\t\t\t\t  \"nss-nssnoc-ce-axi-clk\",\n\t\t\t\t\t  \"nss-nssnoc-ce-apb-clk\",\n\t\t\t\t\t  \"nss-nssnoc-ahb-clk\",\n\t\t\t\t\t  \"nss-core-clk\",\n\t\t\t\t\t  \"nss-ahb-clk\",\n\t\t\t\t\t  \"nss-axi-clk\",\n\t\t\t\t\t  \"nss-mpt-clk\",\n\t\t\t\t\t  \"nss-nc-axi-clk\";\n\t\tqcom,id = <1>;\n\t\tqcom,num-queue = <4>;\n\t\tqcom,num-irq = <9>;\n\t\tqcom,num-pri = <4>;\n\t\tqcom,load-addr = <0x40800000>;\n\t\tqcom,capwap-enabled;\n\t\tqcom,dtls-enabled;\n\t\tqcom,tls-enabled;\n\t\tqcom,crypto-enabled;\n\t\tqcom,ipsec-enabled;\n\t\tqcom,qvpn-enabled;\n\t\tqcom,pvxlan-enabled;\n\t\tqcom,clmap-enabled;\n\t\tqcom,rmnet_rx-enabled;\n\t};\n\n\tnss_crypto: qcom,nss_crypto {\n\t\tcompatible = \"qcom,nss-crypto\";\n\t\t#address-cells = <1>;\n\t\t#size-cells = <1>;\n\t\tqcom,max-contexts = <64>;\n\t\tqcom,max-context-size = <32>;\n\t\tranges;\n\n\t\teip197_node {\n\t\t\tcompatible = \"qcom,eip197\";\n\t\t\treg-names = \"crypto_pbase\";\n\t\t\treg = <0x39800000 0x7ffff>;\n\t\t\tclocks = <&gcc GCC_NSS_CRYPTO_CLK>,\n\t\t\t\t \t <&gcc GCC_NSSNOC_CRYPTO_CLK>,\n\t\t\t\t \t <&gcc GCC_CRYPTO_PPE_CLK>;\n\t\t\tclock-names = \"crypto_clk\",\n\t\t\t\t      \t  \"crypto_nocclk\",\n\t\t\t\t      \t  \"crypto_ppeclk\";\n\t\t\tclock-frequency = /bits/ 64 <600000000 600000000 300000000>;\n\t\t\tqcom,dma-mask = <0xff>;\n\t\t\tqcom,transform-enabled;\n\t\t\tqcom,aes128-cbc;\n\t\t\tqcom,aes192-cbc;\n\t\t\tqcom,aes256-cbc;\n\t\t\tqcom,aes128-ctr;\n\t\t\tqcom,aes192-ctr;\n\t\t\tqcom,aes256-ctr;\n\t\t\tqcom,aes128-ecb;\n\t\t\tqcom,aes192-ecb;\n\t\t\tqcom,aes256-ecb;\n\t\t\tqcom,3des-cbc;\n\t\t\tqcom,md5-hash;\n\t\t\tqcom,sha160-hash;\n\t\t\tqcom,sha224-hash;\n\t\t\tqcom,sha384-hash;\n\t\t\tqcom,sha512-hash;\n\t\t\tqcom,sha256-hash;\n\t\t\tqcom,md5-hmac;\n\t\t\tqcom,sha160-hmac;\n\t\t\tqcom,sha224-hmac;\n\t\t\tqcom,sha256-hmac;\n\t\t\tqcom,sha384-hmac;\n\t\t\tqcom,sha512-hmac;\n\t\t\tqcom,aes128-gcm-gmac;\n\t\t\tqcom,aes192-gcm-gmac;\n\t\t\tqcom,aes256-gcm-gmac;\n\t\t\tqcom,aes128-cbc-md5-hmac;\n\t\t\tqcom,aes128-cbc-sha160-hmac;\n\t\t\tqcom,aes192-cbc-md5-hmac;\n\t\t\tqcom,aes192-cbc-sha160-hmac;\n\t\t\tqcom,aes256-cbc-md5-hmac;\n\t\t\tqcom,aes256-cbc-sha160-hmac;\n\t\t\tqcom,aes128-ctr-sha160-hmac;\n\t\t\tqcom,aes192-ctr-sha160-hmac;\n\t\t\tqcom,aes256-ctr-sha160-hmac;\n\t\t\tqcom,aes128-ctr-md5-hmac;\n\t\t\tqcom,aes192-ctr-md5-hmac;\n\t\t\tqcom,aes256-ctr-md5-hmac;\n\t\t\tqcom,3des-cbc-md5-hmac;\n\t\t\tqcom,3des-cbc-sha160-hmac;\n\t\t\tqcom,aes128-cbc-sha256-hmac;\n\t\t\tqcom,aes192-cbc-sha256-hmac;\n\t\t\tqcom,aes256-cbc-sha256-hmac;\n\t\t\tqcom,aes128-ctr-sha256-hmac;\n\t\t\tqcom,aes192-ctr-sha256-hmac;\n\t\t\tqcom,aes256-ctr-sha256-hmac;\n\t\t\tqcom,3des-cbc-sha256-hmac;\n\t\t\tqcom,aes128-cbc-sha384-hmac;\n\t\t\tqcom,aes192-cbc-sha384-hmac;\n\t\t\tqcom,aes256-cbc-sha384-hmac;\n\t\t\tqcom,aes128-ctr-sha384-hmac;\n\t\t\tqcom,aes192-ctr-sha384-hmac;\n\t\t\tqcom,aes256-ctr-sha384-hmac;\n\t\t\tqcom,aes128-cbc-sha512-hmac;\n\t\t\tqcom,aes192-cbc-sha512-hmac;\n\t\t\tqcom,aes256-cbc-sha512-hmac;\n\t\t\tqcom,aes128-ctr-sha512-hmac;\n\t\t\tqcom,aes192-ctr-sha512-hmac;\n\t\t\tqcom,aes256-ctr-sha512-hmac;\n\n\t\t\tengine0 {\n\t\t\t\treg_offset = <0x80000>;\n\t\t\t\tqcom,ifpp-enabled;\n\t\t\t\tqcom,ipue-enabled;\n\t\t\t\tqcom,ofpp-enabled;\n\t\t\t\tqcom,opue-enabled;\n\t\t\t};\n\t\t};\n\t};\n};\n"
  },
  {
    "path": "devices/qualcommax_ipq807x/diy/target/linux/qualcommax/patches-6.12/0102-arm64-dts-ipq8074-add-reserved-memory-nodes.patch",
    "content": "From ad2d07f71739351eeea1d8a120c0918e2c4b265f Mon Sep 17 00:00:00 2001\nFrom: Robert Marko <robimarko@gmail.com>\nDate: Wed, 22 Dec 2021 12:23:34 +0100\nSubject: [PATCH] arm64: dts: ipq8074: add reserved memory nodes\n\nIPQ8074 has multiple reserved memory ranges, if they are not defined\nthen weird things tend to happen, board hangs and resets when PCI or\nWLAN is used etc.\n\nSo, to avoid all of that add the reserved memory nodes from the downstream\n5.4 kernel from QCA.\nThis is their default layout meant for devices with 1GB of RAM, but\ndevices with lower ammounts can override the Q6 node.\n\nSigned-off-by: Robert Marko <robimarko@gmail.com>\n---\n arch/arm64/boot/dts/qcom/ipq8074.dtsi | 35 +++++++++++++++++++++++++++\n 1 file changed, 35 insertions(+)\n\n--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi\n+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi\n@@ -86,6 +86,16 @@\n \t\t#size-cells = <2>;\n \t\tranges;\n \n+\t\tnss_region: nss@40000000 {\n+\t\t\tno-map;\n+\t\t\treg = <0x0 0x40000000 0x0 0x01000000>;\n+\t\t};\n+\n+\t\ttzapp_region: tzapp@4a400000 {\n+\t\t\tno-map;\n+\t\t\treg = <0x0 0x4a400000 0x0 0x00200000>;\n+\t\t};\n+\n \t\tsmem@4ab00000 {\n \t\t\tcompatible = \"qcom,smem\";\n \t\t\treg = <0x0 0x4ab00000 0x0 0x00100000>;\n@@ -108,6 +118,21 @@\n \t\t\treg = <0x0 0x4ac00000 0x0 0x400000>;\n \t\t\tno-map;\n \t\t};\n+\n+\t\tq6_region: wcnss@4b000000 {\n+\t\t\tno-map;\n+\t\t\treg = <0x0 0x4b000000 0x0 0x05f00000>;\n+\t\t};\n+\n+\t\tq6_etr_region: q6_etr_dump@50f00000 {\n+\t\t\tno-map;\n+\t\t\treg = <0x0 0x50f00000 0x0 0x00100000>;\n+\t\t};\n+\n+\t\tm3_dump_region: m3_dump@51000000 {\n+\t\t\tno-map;\n+\t\t\treg = <0x0 0x51000000 0x0 0x100000>;\n+\t\t};\n \t};\n \n \tfirmware {\n"
  },
  {
    "path": "devices/qualcommax_ipq807x/diy.sh",
    "content": "#!/bin/bash\nshopt -s extglob"
  },
  {
    "path": "devices/qualcommax_ipq807x/patches/04-stock.patch",
    "content": "--- a/target/linux/qualcommax/ipq807x/base-files/etc/init.d/bootcount\n+++ b/target/linux/qualcommax/ipq807x/base-files/etc/init.d/bootcount\n@@ -9,5 +9,13 @@ boot() {\n \t\tnetgear,wax630)\n \t\tfw_setenv boot_count 0\n \t;;\n+\tredmi,ax6|\\\n+\txiaomi,ax3600|\\\n+\txiaomi,ax9000)\n+\t\t# OTA handling should not be used. Reset it just in case.\n+\t\tfw_setenv flag_ota_reboot 0\n+\t\t# Not strictly needed but useful to handle partition crash condition\n+\t\tfw_setenv flag_boot_success 1\n+\t;;\n \tesac\n }\n \n\n--- a/target/linux/qualcommax/ipq807x/base-files/lib/upgrade/platform.sh\n+++ b/target/linux/qualcommax/ipq807x/base-files/lib/upgrade/platform.sh\n@@ -83,20 +83,29 @@ platform_do_upgrade() {\n \tredmi,ax6|\\\n \txiaomi,ax3600|\\\n \txiaomi,ax9000)\n-\t\t# Make sure that UART is enabled\n-\t\tfw_setenv boot_wait on\n-\t\tfw_setenv uart_en 1\n+\t\tpart_num=\"$(fw_printenv -n flag_boot_rootfs)\"\n+\t\tif [ \"$part_num\" -eq \"1\" ]; then\n+\t\t\tCI_UBIPART=\"rootfs_1\"\n+\t\t\ttarget_num=1\n+\t\t\t# Reset fail flag for the current partition\n+\t\t\t# With both partition set to fail, the partition 2 (bit 1)\n+\t\t\t# is loaded\n+\t\t\tfw_setenv flag_try_sys2_failed 0\n+\t\telse\n+\t\t\tCI_UBIPART=\"rootfs\"\n+\t\t\ttarget_num=0\n+\t\t\t# Reset fail flag for the current partition\n+\t\t\t# or uboot will skip the loading of this partition\n+\t\t\tfw_setenv flag_try_sys1_failed 0\n+\t\tfi\n+\n+\t\t# Tell uboot to switch partition\n+\t\tfw_setenv flag_boot_rootfs \"$target_num\"\n+\t\tfw_setenv flag_last_success \"$target_num\"\n \n-\t\t# Enforce single partition.\n-\t\tfw_setenv flag_boot_rootfs 0\n-\t\tfw_setenv flag_last_success 0\n-\t\tfw_setenv flag_boot_success 1\n-\t\tfw_setenv flag_try_sys1_failed 8\n-\t\tfw_setenv flag_try_sys2_failed 8\n+\t\t# Reset success flag\n+\t\tfw_setenv flag_boot_success 0\n \n-\t\t# Kernel and rootfs are placed in 2 different UBI\n-\t\tCI_KERN_UBIPART=\"ubi_kernel\"\n-\t\tCI_ROOT_UBIPART=\"rootfs\"\n \t\tnand_do_upgrade \"$1\"\n \t\t;;\n \t*)\n\n--- /dev/null\n+++ b/target/linux/qualcommax/ipq807x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata\n@@ -0,0 +1,20 @@\n+#!/bin/sh\n+\n+[ -e /lib/firmware/$FIRMWARE ] && exit 0\n+\n+. /lib/functions/caldata.sh\n+\n+board=$(board_name)\n+\n+case \"$FIRMWARE\" in\n+\"ath10k/cal-pci-0000:01:00.0.bin\")\n+\tcase \"$board\" in\n+\txiaomi,ax3600)\n+\t\tcaldata_extract \"0:art\" 0x33000 0x844\n+\t\t;;\n+\tesac\n+\t;;\n+*)\n+\texit 1\n+\t;;\n+esac\n"
  },
  {
    "path": "devices/ramips_mt7620/.config",
    "content": "\nCONFIG_TARGET_ramips=y\nCONFIG_TARGET_ramips_mt7620=y\n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_aigale_ai-br100=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_ampedwireless_b1200ex=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_asus_rp-n53=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_buffalo_whr-300hp2=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_buffalo_whr-600d=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_buffalo_wmr-300=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_comfast_cf-wr800n=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_dlink_dch-m225=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_dlink_dir-806a-b1=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_dlink_dir-810l=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_dlink_dwr-116-a1=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_dovado_tiny-ac=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_edimax_br-6208ac-v2=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_edimax_br-6478ac-v2=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_edimax_ew-7476rpc=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_edimax_ew-7478ac=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_edimax_ew-7478apc=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_humax_e2=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_hootoo_ht-tm05=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_iodata_wn-ac1167gr=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_iodata_wn-ac733gr3=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_iptime_a104ns=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_lb-link_bl-w1200=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_linksys_e1700=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_netgear_ex2700=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_netgear_ex3700=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_netgear_ex6120=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_netgear_ex6130=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_netgear_jwnr2010-v5=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_netgear_wn3000rp-v3=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_netgear_wn3100rp-v2=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_nexx_wt3020-4m=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_nexx_wt3020-8m=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_phicomm_k2-v22.4=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_phicomm_k2-v22.5=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_phicomm_k2g=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_phicomm_psg1208=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_phicomm_psg1218b=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_planex_cs-qr10=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_planex_db-wrt01=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_planex_mzk-750dhp=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_planex_mzk-ex300np=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_planex_mzk-ex750np=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_ralink_mt7620a-evb=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_ralink_mt7620a-mt7530-evb=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_ralink_mt7620a-mt7610e-evb=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_ralink_mt7620a-v22sg-evb=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_ravpower_rp-wd03=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_rostelecom_rt-fl-1=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_rostelecom_s1010=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_sitecom_wlr-4100-v1-002=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_snr_cpe-w4n-mt=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_tplink_archer-c20i=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_tplink_archer-c20-v1=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_tplink_archer-c2-v1=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_tplink_archer-c5-v4=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_tplink_archer-c50-v1=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_tplink_archer-mr200=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_tplink_ec220-g5-v2=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_tplink_re200-v1=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_tplink_re210-v1=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_trendnet_tew-810dr=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_trendnet_tha103ac=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_vonets_var11n-300=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_wavlink_wl-wn530hg4=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_wavlink_wl-wn531g3=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_wavlink_wl-wn531g3-a2=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_wavlink_wl-wn535k1=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_wavlink_wl-wn579x3=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_yukai_bocco=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_zbtlink_zbt-cpe102=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_zbtlink_zbt-wa05=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_zbtlink_zbt-we2026=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_zbtlink_zbt-wr8305rt=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_zte_q7=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_zyxel_keenetic-lite-iii-a=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_zyxel_keenetic-omni=n\nCONFIG_TARGET_DEVICE_ramips_mt7620_DEVICE_zyxel_keenetic-omni-ii=n\n"
  },
  {
    "path": "devices/ramips_mt7620/diy.sh",
    "content": "#!/bin/bash\n\nshopt -s extglob\n\nsh -c \"curl -sfL https://github.com/openwrt/openwrt/commit/2e6d19ee32399e37c7545aefc57d41541a406d55.patch | patch -d './' -p1 --forward\" || true\n\nsed -i '/# start dockerd/,/# end dockerd/d' .config\n\n\n\n"
  },
  {
    "path": "devices/ramips_mt7620/patches/mir3.patch",
    "content": "From aa2cc7b9d5124216f0ea377f9ffe28e494da20c6 Mon Sep 17 00:00:00 2001\nFrom: Chen Minqiang <ptpt52@gmail.com>\nDate: Sat, 18 Nov 2017 21:35:39 +0800\nSubject: [PATCH] ramips: add xiaomi_miwifi-r3 support\n\nSpecification:\n - CPU: 580 MHz\n - Flash size: 128 MiB NAND\n - RAM size: 128 MiB DDR2\n - Wireless No1: SoC-integrated: MT7620A 2x2 MIMO 802.11b/g/n (2.4 GHz)\n - Wireless No2: On-board chip: MT7612E 2x2 MIMO 802.11a/n/ac (5 GHz)\n - Switch: MT7620 built-in 10/100 switch w/ vlan support\n - USB: 2.0 x1\n\nFlash instructions:\n 1. access ssh via https://wiki.openwrt.org/toh/xiaomi/mir3\n 2. in ssh:\n      nvram set flag_last_success=1\n      nvram set boot_wait=on\n      nvram set uart_en=1\n      nvram commit\n      mtd write lede-ramips-mt7620-miwifi-r3-squashfs-kernel1.bin kernel1\n      mtd write lede-ramips-mt7620-miwifi-r3-squashfs-rootfs0.bin rootfs0\n      reboot\n\nIf you want to revert back to stock fw while on LEDE:\n  insert usb stick (FAT/FAT32) with stock fw renamed to miwifi.bin\n  fw_setenv flag_last_success 0\n  power off the device\n  hold the reset button and power on the device, keep holding the reset button until yellow led starts blinking.\n\nSigned-off-by: Chen Minqiang <ptpt52@gmail.com>\n---\n package/boot/uboot-tools/uboot-envtools/files/ramips      |   1 +\n .../ramips/dts/mt7620a_xiaomi_miwifi-r3.dts   | 187 ++++++++++++++++++\n target/linux/ramips/image/mt7620.mk           |  17 ++\n .../mt7620/base-files/etc/board.d/02_network  |   8 +\n .../mt7620/base-files/lib/upgrade/platform.sh |   7 +\n 5 files changed, 220 insertions(+)\n create mode 100644 target/linux/ramips/dts/mt7620a_xiaomi_miwifi-r3.dts\n\ndiff --git a/package/boot/uboot-tools/uboot-envtools/files/ramips b/package/boot/uboot-tools/uboot-envtools/files/ramips\nindex 05ca7ffd12c8..6afc4470f7a7 100644\n--- a/package/boot/uboot-tools/uboot-envtools/files/ramips\n+++ b/package/boot/uboot-tools/uboot-envtools/files/ramips\n@@ -79,6 +79,7 @@ xiaomi,mi-router-3g|\\\n xiaomi,mi-router-3-pro|\\\n xiaomi,mi-router-4|\\\n xiaomi,mi-router-ac2100|\\\n+xiaomi,miwifi-r3|\\\n xiaomi,redmi-router-ac2100)\n \tubootenv_add_uci_config \"/dev/mtd1\" \"0x0\" \"0x1000\" \"0x20000\"\n \tubootenv_add_uci_sys_config \"/dev/mtd2\" \"0x0\" \"0x4000\" \"0x20000\"\ndiff --git a/target/linux/ramips/dts/mt7620a_xiaomi_miwifi-r3.dts b/target/linux/ramips/dts/mt7620a_xiaomi_miwifi-r3.dts\nnew file mode 100644\nindex 000000000000..301b6e3a02e6\n--- /dev/null\n+++ b/target/linux/ramips/dts/mt7620a_xiaomi_miwifi-r3.dts\n@@ -0,0 +1,187 @@\n+/dts-v1/;\n+\n+#include \"mt7620a.dtsi\"\n+\n+#include <dt-bindings/gpio/gpio.h>\n+#include <dt-bindings/input/input.h>\n+\n+/ {\n+\tcompatible = \"xiaomi,miwifi-r3\", \"ralink,mt7620a-soc\";\n+\tmodel = \"Xiaomi Mi Router R3\";\n+\n+\taliases {\n+\t\tled-status = &led_status_blue;\n+\t};\n+\n+\tchosen {\n+\t\tbootargs = \"console=ttyS0,115200\";\n+\t};\n+\n+\tkeys {\n+\t\tcompatible = \"gpio-keys\";\n+\n+\t\treset {\n+\t\t\tlabel = \"reset\";\n+\t\t\tgpios = <&gpio1 6 GPIO_ACTIVE_HIGH>;\n+\t\t\tlinux,code = <KEY_RESTART>;\n+\t\t};\n+\t};\n+\n+\tleds {\n+\t\tcompatible = \"gpio-leds\";\n+\n+\t\tled_status_blue: blue {\n+\t\t\tlabel = \"blue:status\";\n+\t\t\tgpios = <&gpio1 0 GPIO_ACTIVE_LOW>;\n+\t\t\tdefault-state = \"on\";\n+\t\t};\n+\n+\t\tyellow {\n+\t\t\tlabel = \"yellow:status\";\n+\t\t\tgpios = <&gpio1 2 GPIO_ACTIVE_LOW>;\n+\t\t};\n+\n+\t\tred {\n+\t\t\tlabel = \"red:status\";\n+\t\t\tgpios = <&gpio1 5 GPIO_ACTIVE_LOW>;\n+\t\t};\n+\t};\n+\n+\tnand {\n+\t\tstatus = \"okay\";\n+\t\t#address-cells = <1>;\n+\t\t#size-cells = <1>;\n+\t\tcompatible = \"mtk,mt7620-nand\";\n+\n+\t\tpartitions {\n+\t\t\tcompatible = \"fixed-partitions\";\n+\t\t\t#address-cells = <1>;\n+\t\t\t#size-cells = <1>;\n+\n+\t\t\tpartition@0 {\n+\t\t\t\tlabel = \"Bootloader\";\n+\t\t\t\treg = <0x0 0x40000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@40000 {\n+\t\t\t\tlabel = \"Config\";\n+\t\t\t\treg = <0x40000 0x40000>;\n+\t\t\t};\n+\n+\t\t\tpartition@80000 {\n+\t\t\t\tlabel = \"Bdata\";\n+\t\t\t\treg = <0x80000 0x40000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tfactory: partition@0xc0000 {\n+\t\t\t\tlabel = \"factory\";\n+\t\t\t\treg = <0xc0000 0x40000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@100000 {\n+\t\t\t\tlabel = \"crash\";\n+\t\t\t\treg = <0x100000 0x40000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@140000 {\n+\t\t\t\tlabel = \"crash_syslog\";\n+\t\t\t\treg = <0x140000 0x40000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@180000 {\n+\t\t\t\tlabel = \"reserved0\";\n+\t\t\t\treg = <0x180000 0x80000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\n+\t\t\tpartition@200000 {\n+\t\t\t\tlabel = \"kernel_stock\";\n+\t\t\t\treg = <0x200000 0x400000>;\n+\t\t\t};\n+\n+\t\t\tpartition@600000 {\n+\t\t\t\tlabel = \"kernel\";\n+\t\t\t\treg = <0x600000 0x400000>;\n+\t\t\t};\n+\n+\t\t\t/* ubi partition is the result of squashing\n+\t\t\t * next consequent stock partitions:\n+\t\t\t * - rootfs0 (rootfs partition for stock kernel0),\n+\t\t\t * - rootfs1 (rootfs partition for stock failsafe kernel1),\n+\t\t\t * - overlay (used as ubi overlay in stock fw)\n+\t\t\t * resulting 117,5MiB space for packages.\n+\t\t\t */\n+\t\t\tpartition@a00000 {\n+\t\t\t\tlabel = \"ubi\";\n+\t\t\t\treg = <0xa00000 0x7600000>;\n+\t\t\t};\n+\t\t};\n+\t};\n+};\n+\n+&gpio1 {\n+\tstatus = \"okay\";\n+};\n+\n+&ehci {\n+\tstatus = \"okay\";\n+};\n+\n+&ohci {\n+\tstatus = \"okay\";\n+};\n+\n+&ethernet {\n+\tpinctrl-names = \"default\";\n+\tpinctrl-0 = <&ephy_pins>;\n+\tmtd-mac-address = <&factory 0x28>;\n+\tnvmem-cells = <&macaddr_factory_28>;\n+\tnvmem-cell-names = \"mac-address\";\n+\tmediatek,portmap = \"llllw\";\n+};\n+\n+&wmac {\n+\tralink,mtd-eeprom = <&factory 0>;\n+};\n+\n+&pcie {\n+\tstatus = \"okay\";\n+};\n+\n+&pcie0 {\n+\twifi@0,0 {\n+\t\tcompatible = \"pci14c3,7662\";\n+\t\treg = <0x0000 0 0 0 0>;\n+\t\tmediatek,mtd-eeprom = <&factory 0x8000>;\n+\t\tieee80211-freq-limit = <5000000 6000000>;\n+\t};\n+};\n+\n+&pinctrl {\n+\tstate_default: pinctrl0 {\n+\t\tgpio {\n+\t\t\tgroups = \"rgmii1\";\n+\t\t\tfunction = \"gpio\";\n+\t\t};\n+\n+\t\tpa {\n+\t\t\tgroups = \"pa\";\n+\t\t\tfunction = \"pa\";\n+\t\t};\n+\t};\n+};\n+\n+&factory {\n+\tcompatible = \"nvmem-cells\";\n+\t#address-cells = <1>;\n+\t#size-cells = <1>;\n+\n+\tmacaddr_factory_28: macaddr@28 {\n+\t\treg = <0x28 0x6>;\n+\t};\n+};\ndiff --git a/target/linux/ramips/image/mt7620.mk b/target/linux/ramips/image/mt7620.mk\nindex a9dea1db57f9..ebf4cfc4117c 100644\n--- a/target/linux/ramips/image/mt7620.mk\n+++ b/target/linux/ramips/image/mt7620.mk\n@@ -1248,6 +1248,23 @@ define Device/xiaomi_miwifi-mini\n endef\n TARGET_DEVICES += xiaomi_miwifi-mini\n \n+define Device/xiaomi_miwifi-r3\n+  SOC := mt7620a\n+  BLOCKSIZE := 128k\n+  PAGESIZE := 2048\n+  KERNEL_SIZE := 4096k\n+  IMAGE_SIZE := 32768k\n+  UBINIZE_OPTS := -E 5\n+  IMAGES += kernel1.bin rootfs0.bin\n+  IMAGE/kernel1.bin := append-kernel | check-size $$$$(KERNEL_SIZE)\n+  IMAGE/rootfs0.bin := append-ubi | check-size $$$$(IMAGE_SIZE)\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n+  DEVICE_VENDOR := Xiaomi\n+  DEVICE_MODEL := Mi Router R3\n+  DEVICE_PACKAGES := kmod-mt76x2 kmod-usb2 kmod-usb-ohci uboot-envtools\n+endef\n+TARGET_DEVICES += xiaomi_miwifi-r3\n+\n define Device/youku_x2\n   SOC := mt7620a\n   IMAGE_SIZE := 16064k\ndiff --git a/target/linux/ramips/mt7620/base-files/etc/board.d/02_network b/target/linux/ramips/mt7620/base-files/etc/board.d/02_network\nindex f7bc41669f80..e252b6e04611 100644\n--- a/target/linux/ramips/mt7620/base-files/etc/board.d/02_network\n+++ b/target/linux/ramips/mt7620/base-files/etc/board.d/02_network\n@@ -278,6 +278,10 @@ ramips_setup_interfaces()\n \t\tucidef_add_switch \"switch0\" \\\n \t\t\t\"0:lan\" \"1:lan\" \"4:wan\" \"6@eth0\"\n \t\t;;\n+\txiaomi,miwifi-r3)\n+\t\tucidef_add_switch \"switch0\" \\\n+\t\t\t\"1:lan\" \"4:lan\" \"0:wan\" \"6@eth0\"\n+\t\t;;\n \tzbtlink,zbt-we1026-5g-16m)\n \t\tucidef_add_switch \"switch0\" \\\n \t\t\t\"0:lan\" \"6t@eth0\"\n@@ -434,6 +438,10 @@ ramips_setup_macs()\n \ttplink,ec220-g5-v2)\n \t\twan_mac=$(macaddr_add \"$(mtd_get_mac_binary rom 0xf100)\" 1)\n \t\t;;\n+\txiaomi,miwifi-r3)\n+\t\twan_mac=$(mtd_get_mac_binary factory 0x28)\n+\t\tlan_mac=$(macaddr_setbit_la \"$wan_mac\")\n+\t\t;;\n \twavlink,wl-wn531g3|\\\n \twavlink,wl-wn531g3-a2|\\\n \tzbtlink,zbt-we1026-5g-16m)\ndiff --git a/target/linux/ramips/mt7620/base-files/lib/upgrade/platform.sh b/target/linux/ramips/mt7620/base-files/lib/upgrade/platform.sh\nindex 9f71dc918e50..5519312289fa 100755\n--- a/target/linux/ramips/mt7620/base-files/lib/upgrade/platform.sh\n+++ b/target/linux/ramips/mt7620/base-files/lib/upgrade/platform.sh\n@@ -30,6 +30,11 @@ platform_do_upgrade() {\n \t\t}\n \t\tdefault_do_upgrade \"$1\"\n \t\t;;\n+\txiaomi,miwifi-r3)\n+\t\t# this make it compatible with breed\n+\t\tdd if=/dev/mtd0 bs=64 count=1 2>/dev/null | grep -qi breed && CI_KERNPART_EXT=\"kernel_stock\"\n+\t\tnand_do_upgrade \"$1\"\n+\t\t;;\n \t*)\n \t\tdefault_do_upgrade \"$1\"\n \t\t;;\n"
  },
  {
    "path": "devices/ramips_mt7620/patches/tblsection.patch",
    "content": "--- a/package/feeds/luci/luci-compat/luasrc/view/cbi/tblsection.htm\n+++ b/package/feeds/luci/luci-compat/luasrc/view/cbi/tblsection.htm\n@@ -123,6 +123,7 @@ <h3><%=self.title%></h3>\n \n \t\t\tlocal isempty, section, i, k = true, nil, nil\n \t\t    for i, k in ipairs(self:cfgsections()) do\n+\t\t    \tif i <= 100 then\n \t\t\t\tisempty = false\n \t\t\t\tsection = k\n \n@@ -165,6 +166,8 @@ <h3><%=self.title%></h3>\n \t\t\t\t</td>\n \t\t\t<%- end -%>\n \t\t</tr>\n+\t\t\t<%- i=i+1 -%>\n+\t\t\t<%- end -%>\n \t\t<%- end -%>\n \n \t\t<%- if isempty then -%>\n"
  },
  {
    "path": "devices/ramips_mt7621/.config",
    "content": "\nCONFIG_TARGET_ramips=y\nCONFIG_TARGET_ramips_mt7621=y\n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_dna_valokuitu-plus-ex400=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_elecom_wrc-1167gs2-b=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_elecom_wrc-1750gsv=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_elecom_wrc-1900gst=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_elecom_wrc-2533ghbk-i=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_elecom_wrc-2533ghbk2-t=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_elecom_wrc-2533gs2=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_elecom_wrc-x3200gst3=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_iodata_wn-gx300gr=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_linksys_re6500=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_mediatek_ap-mt7621a-v60=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_ruijie_rg-ew1200g-pro-v1.1=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_storylink_sap-g3200u3=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_tplink_eap235-wall-v1=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_tplink_eap613-v1=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_tplink_eap615-wall-v1=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_tplink_re350-v1=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_tplink_re650-v2=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_tplink_tl-wpa8631p-v3=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_winstars_ws-wn583a6=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_tplink_re650-v1=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_tplink_re500-v1=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_iodata_wnpr2600g=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_iodata_wn-ax1167gr=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_elecom_wrc-2533gst=n\nCONFIG_TARGET_DEVICE_ramips_mt7621_DEVICE_elecom_wrc-1750gs=n\n"
  },
  {
    "path": "devices/ramips_mt7621/diy/target/linux/ramips/dts/mt7621_ht-jsh_0211.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-only\n\n#include \"mt7621.dtsi\"\n\n#include <dt-bindings/gpio/gpio.h>\n#include <dt-bindings/input/input.h>\n\n/ {\n\tcompatible = \"ht-jsh,0211\", \"mediatek,mt7621-soc\";\n\tmodel = \"HT-JSH-0211\";\n\n\tkeys {\n\t\tcompatible = \"gpio-keys\";\n\n\t\treset {\n\t\t\tlabel = \"reset\";\n\t\t\tgpios = <&gpio 3 GPIO_ACTIVE_LOW>;\n\t\t\tlinux,code = <KEY_RESTART>;\n\t\t};\n\t};\n};\n\n&spi0 {\n\tstatus = \"okay\";\n\n\tflash@0 {\n\t\tcompatible = \"jedec,spi-nor\";\n\t\treg = <0>;\n\t\tspi-max-frequency = <50000000>;\n\n\t\tpartitions {\n\t\t\tcompatible = \"fixed-partitions\";\n\t\t\t#address-cells = <1>;\n\t\t\t#size-cells = <1>;\n\n\t\t\tpartition@0 {\n\t\t\t\tlabel = \"Bootloader\";\n\t\t\t\treg = <0x0 0x30000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@30000 {\n\t\t\t\tlabel = \"Config\";\n\t\t\t\treg = <0x30000 0x10000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tfactory: partition@40000 {\n\t\t\t\tlabel = \"Factory\";\n\t\t\t\treg = <0x40000 0x10000>;\n\t\t\t\tread-only;\n\t\t\t};\n\n\t\t\tpartition@50000 {\n\t\t\t\tcompatible = \"denx,uimage\";\n\t\t\t\tlabel = \"firmware\";\n\t\t\t\treg = <0x50000 0xfb0000>;\n\t\t\t};\n\t\t};\n\t};\n};\n\n&pcie {\n\tstatus = \"okay\";\n};\n\n&pcie0 {\n\tmt76@0,0 {\n\t\treg = <0x0000 0 0 0 0>;\n\t\tmediatek,mtd-eeprom = <&factory 0x0>;\n\t};\n};\n\n&gmac0 {\n\tmtd-mac-address = <&factory 0xe000>;\n};\n\n&gmac1 {\n\tmtd-mac-address = <&factory 0xe006>;\n\tstatus = \"okay\";\n};\n\n&switch0 {\n\tstatus = \"disabled\";\n};\n\n&state_default {\n\tgpio {\n\t\tgroups = \"i2c\";\n\t\tfunction = \"gpio\";\n\t};\n};\n"
  },
  {
    "path": "devices/ramips_mt7621/diy/target/linux/ramips/dts/mt7621_zte_e8820s.dts",
    "content": "// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n\n#include \"mt7621.dtsi\"\n\n#include <dt-bindings/gpio/gpio.h>\n#include <dt-bindings/input/input.h>\n\n/ {\n\tcompatible = \"zte,e8820s\", \"mediatek,mt7621-soc\";\n\tmodel = \"ZTE E8820S\";\n\n\taliases {\n\t\tled-boot = &led_power;\n\t\tled-failsafe = &led_power;\n\t\tled-running = &led_power;\n\t\tled-upgrade = &led_power;\n\t\tlabel-mac-device = &gmac0;\n\t};\n\n\tchosen {\n\t\tbootargs = \"console=ttyS0,115200\";\n\t};\n\n\tleds {\n\t\tcompatible = \"gpio-leds\";\n\n\t\tled_power: power {\n\t\t\tlabel = \"white:power\";\n\t\t\tgpios = <&gpio 16 GPIO_ACTIVE_LOW>;\n\t\t};\n\n\t\tled_sys: sys {\n\t\t\tlabel = \"white:sys\";\n\t\t\tgpios = <&gpio 3 GPIO_ACTIVE_LOW>;\n\t\t};\n\t};\n\n\tkeys {\n\t\tcompatible = \"gpio-keys\";\n\n\t\treset {\n\t\t\tlabel = \"reset\";\n\t\t\tgpios = <&gpio 18 GPIO_ACTIVE_HIGH>;\n\t\t\tlinux,code = <KEY_RESTART>;\n\t\t};\n\n\t\twps {\n\t\t\tlabel = \"wps\";\n\t\t\tgpios = <&gpio 8 GPIO_ACTIVE_LOW>;\n\t\t\tlinux,code = <KEY_WPS_BUTTON>;\n\t\t};\n\n\t\twifi {\n\t\t\tlabel = \"wifi\";\n\t\t\tgpios = <&gpio 10 GPIO_ACTIVE_LOW>;\n\t\t\tlinux,code = <KEY_RFKILL>;\n\t\t};\n\t};\n};\n\n&nand {\n\tstatus = \"okay\";\n\n\tpartitions {\n\t\tcompatible = \"fixed-partitions\";\n\t\t#address-cells = <1>;\n\t\t#size-cells = <1>;\n\n\t\tpartition@0 {\n\t\t\tlabel = \"u-boot\";\n\t\t\treg = <0x0 0x80000>;\n\t\t\tread-only;\n\t\t};\n\n\t\tpartition@80000 {\n\t\t\tlabel = \"u-boot-env\";\n\t\t\treg = <0x80000 0x80000>;\n\t\t\tread-only;\n\t\t};\n\n\t\tfactory: partition@100000 {\n\t\t\tlabel = \"factory\";\n\t\t\treg = <0x100000 0x40000>;\n\t\t\tread-only;\n\t\t};\n\n\t\tpartition@140000 {\n\t\t\tlabel = \"kernel\";\n\t\t\treg = <0x140000 0x400000>;\n\t\t};\n\n\t\tpartition@540000 {\n\t\t\tlabel = \"ubi\";\n\t\t\treg = <0x540000 0x7a40000>;\n\t\t};\n\t};\n};\n\n&pcie {\n\tstatus = \"okay\";\n};\n\n&pcie0 {\n\twifi@0,0 {\n\t\tcompatible = \"pci14c3,7603\";\n\t\treg = <0x0000 0 0 0 0>;\n\t\tmediatek,mtd-eeprom = <&factory 0x0000>;\n\t\tieee80211-freq-limit = <2400000 2500000>;\n\n\t\tled {\n\t\t\tled-active-low;\n\t\t};\n\t};\n};\n\n&pcie1 {\n\twifi@0,0 {\n\t\tcompatible = \"pci14c3,7662\";\n\t\treg = <0x0000 0 0 0 0>;\n\t\tmediatek,mtd-eeprom = <&factory 0x8000>;\n\t\tieee80211-freq-limit = <5000000 6000000>;\n\n\t\tled {\n\t\t\tled-sources = <2>;\n\t\t\tled-active-low;\n\t\t};\n\t};\n};\n\n&gmac0 {\n\tmtd-mac-address = <&factory 0xe000>;\n};\n\n&gmac1 {\n\tmtd-mac-address = <&factory 0xe006>;\n\tstatus = \"okay\";\n};\n\n&switch0 {\n\tports {\n\t\tport@0 {\n\t\t\tstatus = \"okay\";\n\t\t\tlabel = \"lan1\";\n\t\t};\n\n\t\tport@1 {\n\t\t\tstatus = \"okay\";\n\t\t\tlabel = \"lan2\";\n\t\t};\n\n\t\tport@2 {\n\t\t\tstatus = \"okay\";\n\t\t\tlabel = \"lan3\";\n\t\t};\n\n\t\tport@3 {\n\t\t\tstatus = \"okay\";\n\t\t\tlabel = \"lan4\";\n\t\t};\n\n\t\tport@4 {\n\t\t\tstatus = \"okay\";\n\t\t\tlabel = \"wan\";\n\t\t\tmtd-mac-address = <&factory 0xe000>;\n\t\t};\n\t};\n};\n\n&state_default {\n\tgpio {\n\t\tgroups = \"i2c\", \"jtag\", \"uart2\", \"uart3\", \"wdt\";\n\t\tfunction = \"gpio\";\n\t};\n};\n"
  },
  {
    "path": "devices/ramips_mt7621/diy/target/linux/ramips/dts/mt7621_zte_e8820v2.dts",
    "content": "/dts-v1/;\n\n#include \"mt7621.dtsi\"\n\n#include <dt-bindings/gpio/gpio.h>\n#include <dt-bindings/input/input.h>\n\n/ {\n    compatible = \"zte,e8820v2\", \"mediatek,mt7621-soc\";\n    model = \"ZTE E8820V2\";\n   \n    aliases {\n        led-boot = &led_sys;\n        led-failsafe = &led_sys;\n        led-running = &led_sys;\n        led-upgrade = &led_sys;\n    };\n\n    chosen {\n        bootargs = \"console=ttyS0,115200\";\n    };\n\n    leds {\n        compatible = \"gpio-leds\";\n\n        led_sys:sys {\n            label = \"e8820v2:white:sys\";\n            gpios = <&gpio 29 GPIO_ACTIVE_LOW>;\n        };   \n\n        led_power:power {\n            label = \"e8820v2:white:power\";\n            gpios = <&gpio 31 GPIO_ACTIVE_LOW>;            \n        };\n    };\n\n    keys {\n        compatible = \"gpio-keys\";\n\n        reset {\n            label = \"reset\";\n            gpios = <&gpio 18 GPIO_ACTIVE_LOW>;\n            linux,code = <KEY_RESTART>;\n        };\n\n        wps {\n            label = \"wps\";\n            gpios = <&gpio 24 GPIO_ACTIVE_LOW>;\n            linux,code = <KEY_WPS_BUTTON>;\n        };\n    };\n};\n\n&spi0 {\n    status = \"okay\";\n\n    m25p80@0 {\n        compatible = \"jedec,spi-nor\";\n        reg = <0>;\n        spi-max-frequency = <10000000>;\n\n        partitions {\n            compatible = \"fixed-partitions\";\n            #address-cells = <1>;\n            #size-cells = <1>;\n\n            partition@0 {\n                label = \"u-boot\";\n                reg = <0x0 0x30000>;\n                read-only;\n            };\n\n            partition@30000 {\n                label = \"u-boot-env\";\n                reg = <0x30000 0x10000>;\n                read-only;\n            };\n\n            factory: partition@40000 {\n                label = \"factory\";\n                reg = <0x40000 0x10000>;\n                read-only;\n            };\n\n            partition@50000 {\n                compatible = \"denx,uimage\";\n                label = \"firmware\";\n                reg = <0x50000 0xfb0000>;\n            };\n        };\n    };\n};\n\n\n&pcie {\n    status = \"okay\";\n};\n\n&pcie0 {\n    mt76@0,0 {\n        reg = <0x0000 0 0 0 0>;\n        mediatek,mtd-eeprom = <&factory 0x0000>;\n\n        led {\n            led-active-low;\n        };\n\n    };\n};\n\n&pcie1 {\n    mt76@0,0 {\n        reg = <0x0000 0 0 0 0>;\n        mediatek,mtd-eeprom = <&factory 0x8000>;\n        ieee80211-freq-limit = <5000000 6000000>;\n\n        led {\n            led-sources = <2>;\n            led-active-low;\n        };\n\n    };\n};\n\n\n&gmac0 {\n    mtd-mac-address = <&factory 0xe000>;\n};\n\n&switch0 {\n    ports {\n        port@4 {\n            status = \"okay\";\n            label = \"wan\";\n            mtd-mac-address = <&factory 0xe006>;\n        };\n\n        port@0 {\n            status = \"okay\";\n            label = \"lan1\";\n        };\n\n        port@1 {\n            status = \"okay\";\n            label = \"lan2\";\n        };\n\n        port@2 {\n            status = \"okay\";\n            label = \"lan3\";\n        };\n\n        port@3 {\n            status = \"okay\";\n            label = \"lan4\";\n        };\n    };\n};\n\n&state_default {\n    gpio {\n        groups = \"i2c\", \"uart2\", \"uart3\", \"wdt\";\n        function = \"gpio\";\n    };\n};"
  },
  {
    "path": "devices/ramips_mt7621/diy.sh",
    "content": "#!/bin/bash\n\nshopt -s extglob\n\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\n\nsed -i \"s/DEVICE_MODEL := HC5962$/DEVICE_MODEL := HC5962 \\/ B70/\" target/linux/ramips/image/mt7621.mk\n\n\nsed -i '/# start dockerd/,/# end dockerd/d' .config\n\nsed -i \"s/--max-leb-cnt=96/--max-leb-cnt=128/g\" target/linux/ramips/image/mt7621.mk\n"
  },
  {
    "path": "devices/ramips_mt7621/patches/02-cr660x.patch",
    "content": "--- a/target/linux/ramips/image/mt7621.mk\n+++ b/target/linux/ramips/image/mt7621.mk\n@@ -157,6 +157,55 @@ define Device/nand\n   IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n endef\n \n+define Device/phicomm_k2p-32m\n+  IMAGE_SIZE := 32128k\n+  DEVICE_VENDOR := Phicomm\n+  DEVICE_MODEL := K2P\n+  DEVICE_VARIANT := 32M\n+  SUPPORTED_DEVICES += k2p-32M\n+  DEVICE_PACKAGES := kmod-mt7615e kmod-mt7615-firmware\n+endef\n+TARGET_DEVICES += phicomm_k2p-32m\n+\n+define Device/jdcloud_luban\n+  $(Device/dsa-migration)\n+  $(Device/uimage-lzma-loader)\n+  IMAGE_SIZE := 15808k\n+  DEVICE_VENDOR := JDCloud\n+  DEVICE_MODEL := Luban 鲁班\n+  DEVICE_PACKAGES += kmod-mt7915e kmod-mt7915-firmware uboot-envtools kmod-mmc kmod-sdhci kmod-sdhci-mt7620 kmod-fs-ext4 wpad-mini -wpad-basic-mbedtls -coremark -htop -bash -openssh-sftp-server\n+endef\n+TARGET_DEVICES += jdcloud_luban\n+\n+define Device/zte_e8820s\n+  $(Device/dsa-migration)\n+  $(Device/uimage-lzma-loader)\n+  BLOCKSIZE := 128k\n+  PAGESIZE := 2048\n+  KERNEL_SIZE := 4096k\n+  UBINIZE_OPTS := -E 5\n+  IMAGE_SIZE := 129280k\n+  IMAGES += factory.bin\n+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata\n+  IMAGE/factory.bin := append-kernel | pad-to $$(KERNEL_SIZE) | append-ubi | \\\n+\tcheck-size\n+  DEVICE_VENDOR := ZTE\n+  DEVICE_MODEL := E8820S\n+  DEVICE_PACKAGES := kmod-mt7603 kmod-mt76x2 kmod-usb3 kmod-usb-ledtrig-usbport\n+endef\n+TARGET_DEVICES += zte_e8820s\n+\n+define Device/zte_e8820v2\n+  $(Device/dsa-migration)\n+  $(Device/uimage-lzma-loader)\n+  IMAGE_SIZE := 16064k\n+  DEVICE_VENDOR := ZTE\n+  DEVICE_MODEL := E8820V2\n+  DEVICE_PACKAGES := kmod-mt7603 kmod-mt76x2 kmod-usb2 \\\n+\tkmod-usb-ledtrig-usbport wpad-mini -wpad-basic-mbedtls -coremark -htop -bash -openssh-sftp-server\n+endef\n+TARGET_DEVICES += zte_e8820v2\n+\n define Device/adslr_g7\n   $(Device/dsa-migration)\n   IMAGE_SIZE := 16064k\n@@ -2427,7 +2486,6 @@ define Device/xiaomi_nand_separate\n   $(Device/nand)\n   $(Device/uimage-lzma-loader)\n   DEVICE_VENDOR := Xiaomi\n-  IMAGES += kernel1.bin rootfs0.bin\n   IMAGE/kernel1.bin := append-kernel\n   IMAGE/rootfs0.bin := append-ubi | check-size\n endef\n@@ -2511,30 +2569,14 @@ define Device/xiaomi_mi-router-cr660x\n   $(Device/nand)\n   $(Device/uimage-lzma-loader)\n   DEVICE_VENDOR := Xiaomi\n+  DEVICE_MODEL := Mi Router CR660X / TR60X\n   IMAGE_SIZE := 128512k\n-  IMAGES += firmware.bin\n-  IMAGE/firmware.bin := append-kernel | pad-to $$(KERNEL_SIZE) | append-ubi | \\\n+  IMAGES += factory.bin\n+  IMAGE/factory.bin := append-kernel | pad-to $$(KERNEL_SIZE) | append-ubi | \\\n \tcheck-size\n   DEVICE_PACKAGES += kmod-mt7915-firmware\n endef\n-\n-define Device/xiaomi_mi-router-cr6606\n-  $(Device/xiaomi_mi-router-cr660x)\n-  DEVICE_MODEL := Mi Router CR6606\n-endef\n-TARGET_DEVICES += xiaomi_mi-router-cr6606\n-\n-define Device/xiaomi_mi-router-cr6608\n-  $(Device/xiaomi_mi-router-cr660x)\n-  DEVICE_MODEL := Mi Router CR6608\n-endef\n-TARGET_DEVICES += xiaomi_mi-router-cr6608\n-\n-define Device/xiaomi_mi-router-cr6609\n-  $(Device/xiaomi_mi-router-cr660x)\n-  DEVICE_MODEL := Mi Router CR6609\n-endef\n-TARGET_DEVICES += xiaomi_mi-router-cr6609\n+TARGET_DEVICES += xiaomi_mi-router-cr660x\n \n define Device/xiaomi_redmi-router-ac2100\n   $(Device/xiaomi_nand_separate) \n\n--- /dev/null\n+++ b/target/linux/ramips/dts/mt7621_xiaomi_mi-router-cr660x.dts\n@@ -0,0 +1,8 @@\n+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT\n+\n+#include \"mt7621_xiaomi_mi-router-cr660x.dtsi\"\n+\n+/ {\n+\tcompatible = \"xiaomi,mi-router-cr660x\", \"mediatek,mt7621-soc\";\n+\tmodel = \"Xiaomi Mi Router CR6606 / CR6608 / CR6609\";\n+};\n\n--- a/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds\n+++ b/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds\n@@ -131,9 +131,7 @@ tplink,tl-wpa8631p-v3)\n xiaomi,mi-router-ac2100)\n \tucidef_set_led_netdev \"wan-blue\" \"WAN (blue)\" \"blue:wan\" \"wan\"\n \t;;\n-xiaomi,mi-router-cr6606|\\\n-xiaomi,mi-router-cr6608|\\\n-xiaomi,mi-router-cr6609)\n+xiaomi,mi-router-cr660x)\n \tucidef_set_led_netdev \"internet\" \"Internet\" \"blue:net\" \"wan\"\n \t;;\n xiaomi,redmi-router-ac2100)\n\n--- a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network\n+++ b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network\n@@ -28,9 +28,7 @@ ramips_setup_interfaces()\n \ttplink,mr600-v2-eu|\\\n \txiaomi,mi-router-3-pro|\\\n \txiaomi,mi-router-ac2100|\\\n-\txiaomi,mi-router-cr6606|\\\n-\txiaomi,mi-router-cr6608|\\\n-\txiaomi,mi-router-cr6609|\\\n+\txiaomi,mi-router-cr660x|\\\n \txiaomi,redmi-router-ac2100|\\\n \tz-router,zr-2660|\\\n \tzyxel,wsm20)\n\n--- a/target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh\n+++ b/target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh\n@@ -151,9 +151,8 @@ platform_do_upgrade() {\n \txiaomi,mi-router-3-pro|\\\n \txiaomi,mi-router-4|\\\n \txiaomi,mi-router-ac2100|\\\n-\txiaomi,mi-router-cr6606|\\\n-\txiaomi,mi-router-cr6608|\\\n-\txiaomi,mi-router-cr6609|\\\n+\txiaomi,mi-router-cr660x|\\\n+\tzte,e8820s|\\\n \txiaomi,redmi-router-ac2100|\\\n \tz-router,zr-2660|\\\n \tzyxel,nwa50ax|\\\n\n--- a/package/boot/uboot-tools/uboot-envtools/files/ramips\n+++ b/package/boot/uboot-tools/uboot-envtools/files/ramips\n@@ -73,9 +73,7 @@ zyxel,nr7101)\n \t\tubootenv_add_uci_config \"/dev/mtd$idx\" \"0x0\" \"0x1000\" \"0x80000\"\n \t;;\n bolt,arion|\\\n-xiaomi,mi-router-cr6606|\\\n-xiaomi,mi-router-cr6608|\\\n-xiaomi,mi-router-cr6609)\n+xiaomi,mi-router-cr660x)\n \tubootenv_add_uci_config \"/dev/mtd1\" \"0x0\" \"0x10000\" \"0x20000\"\n \t;;\n esac\n"
  },
  {
    "path": "devices/ramips_mt7621/patches/ht-jsh_0211.patch",
    "content": "diff --git a/target/linux/ramips/image/mt7621.mk b/target/linux/ramips/image/mt7621.mk\nindex 1908f60bc37bc..bc6a3ac05ae3a 100644\n--- a/target/linux/ramips/image/mt7621.mk\n+++ b/target/linux/ramips/image/mt7621.mk\n@@ -802,6 +802,15 @@ define Device/huasifei_ws1208v2\n endef\n TARGET_DEVICES += huasifei_ws1208v2\n \n+define Device/ht-jsh_0211\n+  $(Device/dsa-migration)\n+  IMAGE_SIZE := 16064k\n+  DEVICE_VENDOR := HT-JSH\n+  DEVICE_MODEL := 0211\n+  DEVICE_PACKAGES := kmod-mt7603\n+endef\n+TARGET_DEVICES += ht-jsh_0211\n+\n define Device/iodata_wn-ax1167gr\n   $(Device/dsa-migration)\n   $(Device/uimage-lzma-loader)\n\n--- a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network\n+++ b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network\n@@ -112,6 +112,10 @@ ramips_setup_interfaces()\n \tdlink,covr-x1860-a1)\n \t\tucidef_set_interfaces_lan_wan \"ethernet\" \"internet\"\n \t\t;;\n+\tht-jsh,0211)\n+\t\tucidef_add_switch \"switch0\" \\\n+\t\t\t\"0:wan\" \"2:lan\" \"3:lan\" \"6u@eth0\" \"5u@eth1\"\n+\t\t;;\n \telecom,wmc-s1267gs2|\\\n \tlinksys,re6500|\\\n \tnetgear,wac104|\\\n"
  },
  {
    "path": "devices/ramips_mt7621/patches/jcg_q20-pb-boot.patch",
    "content": "--- a/target/linux/ramips/dts/mt7621_jcg_q20.dts\n+++ b/target/linux/ramips/dts/mt7621_jcg_q20.dts\n@@ -50,22 +50,6 @@\n \t\t\tlinux,code = <KEY_WPS_BUTTON>;\n \t\t};\n \t};\n-\n-\tubi-concat {\n-\t\tcompatible = \"mtd-concat\";\n-\t\tdevices = <&ubiconcat0 &ubiconcat1>;\n-\n-\t\tpartitions {\n-\t\t\tcompatible = \"fixed-partitions\";\n-\t\t\t#address-cells = <1>;\n-\t\t\t#size-cells = <1>;\n-\n-\t\t\tpartition@0 {\n-\t\t\t\tlabel = \"ubi\";\n-\t\t\t\treg = <0x0 0x5900000>;\n-\t\t\t};\n-\t\t};\n-\t};\n };\n \n &nand {\n@@ -79,12 +63,18 @@\n \t\tpartition@0 {\n \t\t\tlabel = \"Bootloader\";\n \t\t\treg = <0x0 0x80000>;\n-\t\t\tread-only;\n \t\t};\n \n \t\tpartition@80000 {\n-\t\t\tlabel = \"Config\";\n-\t\t\treg = <0x80000 0x80000>;\n+\t\t\tlabel = \"Nvram\";\n+\t\t\treg = <0x80000 0x40000>;\n+\t\t\tread-only;\n+\t\t};\n+\n+\t\tpartition@c0000 {\n+\t\t\tlabel = \"Bdata\";\n+\t\t\treg = <0xc0000 0x40000>;\n+\t\t\tread-only;\n \t\t};\n \n \t\tfactory: partition@100000 {\n@@ -94,40 +84,26 @@\n \t\t};\n \n \t\tpartition@180000 {\n-\t\t\tlabel = \"kernel\";\n-\t\t\treg = <0x180000 0x400000>;\n-\t\t};\n-\n-\t\tubiconcat0: partition@580000 {\n-\t\t\tlabel = \"ubiconcat0\";\n-\t\t\treg = <0x580000 0x1c00000>;\n-\t\t};\n-\n-\t\tpartition@2180000 {\n-\t\t\tlabel = \"firmware_backup\";\n-\t\t\treg = <0x2180000 0x2000000>;\n-\t\t};\n-\n-\t\tpartition@4180000 {\n-\t\t\tlabel = \"rootfs_data_back\";\n-\t\t\treg = <0x4180000 0x80000>;\n+\t\t\tlabel = \"crash\";\n+\t\t\treg = <0x180000 0x40000>;\n \t\t\tread-only;\n \t\t};\n \n-\t\tpartition@4200000 {\n-\t\t\tlabel = \"nvram_config\";\n-\t\t\treg = <0x4200000 0x80000>;\n+\t\tpartition@1c0000 {\n+\t\t\tlabel = \"crash_log\";\n+\t\t\treg = <0x1c0000 0x40000>;\n \t\t\tread-only;\n \t\t};\n \n-\t\tubiconcat1: partition@4280000 {\n-\t\t\tlabel = \"ubiconcat1\";\n-\t\t\treg = <0x4280000 0x3d00000>;\n+\t\tpartition@200000 {\n+\t\t\tlabel = \"kernel\";\n+\t\t\treg = <0x200000 0x400000>;\n \t\t};\n \n-\t\t/*\n-\t\t * last 512 KiB are for the bad block table\n-\t\t */\n+\t\tpartition@600000 {\n+\t\t\tlabel = \"ubi\";\n+\t\t\treg = <0x600000 0x7980000>;\n+\t\t};\n \t};\n };\n "
  },
  {
    "path": "devices/ramips_mt7621/patches/k2p_32m.patch",
    "content": "diff --git a/target/linux/ramips/dts/mt7621_phicomm_k2p.dts b/target/linux/ramips/dts/mt7621_phicomm_k2p.dtsi\nsimilarity index 94%\nrename from target/linux/ramips/dts/mt7621_phicomm_k2p.dts\nrename to target/linux/ramips/dts/mt7621_phicomm_k2p.dtsi\nindex b18d12608acc7..8f72ac2a48280 100644\n--- a/target/linux/ramips/dts/mt7621_phicomm_k2p.dts\n+++ b/target/linux/ramips/dts/mt7621_phicomm_k2p.dtsi\n@@ -4,9 +4,6 @@\n #include <dt-bindings/input/input.h>\n \n / {\n-\tcompatible = \"phicomm,k2p\", \"mediatek,mt7621-soc\";\n-\tmodel = \"Phicomm K2P\";\n-\n \taliases {\n \t\tled-boot = &led_blue;\n \t\tled-failsafe = &led_blue;\n@@ -47,7 +44,7 @@\n &spi0 {\n \tstatus = \"okay\";\n \n-\tflash@0 {\n+\tflash: flash@0 {\n \t\tcompatible = \"jedec,spi-nor\";\n \t\treg = <0>;\n \t\tspi-max-frequency = <50000000>;\n@@ -81,10 +78,9 @@\n \t\t\t\tread-only;\n \t\t\t};\n \n-\t\t\tpartition@a0000 {\n+\t\t\tfirmware: partition@a0000 {\n \t\t\t\tcompatible = \"denx,uimage\";\n \t\t\t\tlabel = \"firmware\";\n-\t\t\t\treg = <0xa0000 0xf60000>;\n \t\t\t};\n \t\t};\n \t};\ndiff --git a/target/linux/ramips/dts/mt7621_phicomm_k2p.dts b/target/linux/ramips/dts/mt7621_phicomm_k2p.dts\nnew file mode 100644\nindex 0000000000000..5bad6f2d9562d\n--- /dev/null\n+++ b/target/linux/ramips/dts/mt7621_phicomm_k2p.dts\n@@ -0,0 +1,10 @@\n+#include \"mt7621_phicomm_k2p.dtsi\"\n+\n+/ {\n+\tcompatible = \"phicomm,k2p\", \"mediatek,mt7621-soc\";\n+ \tmodel = \"Phicomm K2P\";\n+};\n+\n+&firmware {\n+\treg = <0xa0000 0x1f60000>;\n+};\ndiff --git a/target/linux/ramips/dts/mt7621_phicomm_k2p-32m.dts b/target/linux/ramips/dts/mt7621_phicomm_k2p-32m.dts\nnew file mode 100644\nindex 0000000000000..5bad6f2d9562d\n--- /dev/null\n+++ b/target/linux/ramips/dts/mt7621_phicomm_k2p-32m.dts\n@@ -0,0 +1,14 @@\n+#include \"mt7621_phicomm_k2p.dtsi\"\n+\n+/ {\n+\tcompatible = \"phicomm,k2p-32m\", \"mediatek,mt7621-soc\";\n+\tmodel = \"Phicomm K2P (32M)\";\n+};\n+\n+&firmware {\n+\treg = <0xa0000 0x1f60000>;\n+};\n+\n+&flash {\n+\tbroken-flash-reset;\n+};\n--- a/target/linux/ramips/mt7621/base-files/etc/hotplug.d/ieee80211/10_fix_wifi_mac\n+++ b/target/linux/ramips/mt7621/base-files/etc/hotplug.d/ieee80211/10_fix_wifi_mac\n@@ -28,7 +28,8 @@ case \"$board\" in\n \t\t\t\t> /sys${DEVPATH}/macaddress\n \t\t;;\n \tdlink,dir-853-r1|\\\n-\tphicomm,k2p)\n+\tphicomm,k2p|\\\n+\tphicomm,k2p-32m)\n \t\tif [ \"$PHYNBR\" = \"0\" ]; then\n \t\t\tbase_mac=$(macaddr_add \"$(mtd_get_mac_binary factory 0x4)\" -1)\n \t\t\tmacaddr_setbit_la \"$base_mac\" > /sys${DEVPATH}/macaddress\n"
  },
  {
    "path": "devices/ramips_mt7621/patches/luban.patch",
    "content": "diff --git a/target/linux/ramips/dts/mt7621_jdcloud_luban.dts b/target/linux/ramips/dts/mt7621_jdcloud_luban.dts\nnew file mode 100644\nindex 0000000..ed1ebed\n--- /dev/null\n+++ b/target/linux/ramips/dts/mt7621_jdcloud_luban.dts\n@@ -0,0 +1,171 @@\n+#include \"mt7621.dtsi\"\n+\n+#include <dt-bindings/gpio/gpio.h>\n+#include <dt-bindings/input/input.h>\n+\n+/ {\n+\tcompatible = \"jdcloud,luban\", \"mediatek,mt7621-soc\";\n+\tmodel = \"JDCloud luban\";\n+\n+\taliases {\n+\t\tled-boot = &led_r1;\n+\t\tled-failsafe = &led_r1;\n+\t\tled-running = &led_g1;\n+\t\tled-upgrade = &led_b1;\n+\t\tlabel-mac-device = &gmac0;\n+\t};\n+\n+\tchosen {\n+\t\tbootargs = \"console=ttyS0,115200n8\";\n+\t};\n+\n+\tleds {\n+\t\tcompatible = \"gpio-leds\";\n+\n+\t\tled_r1: led_r1 {\n+\t\t\tlabel = \"led_r1\";\n+\t\t\tgpios = <&gpio 6 GPIO_ACTIVE_LOW>;\n+\t\t\tdefault-state = \"on\";\n+\t\t};\n+\n+\t\tled_b1: led_b1 {\n+\t\t\tlabel = \"led_b1\";\n+\t\t\tgpios = <&gpio 7 GPIO_ACTIVE_LOW>;\n+\t\t};\n+\n+\t\tled_g1: led_g1 {\n+\t\t\tlabel = \"led_g1\";\n+\t\t\tgpios = <&gpio 8 GPIO_ACTIVE_LOW>;\n+\t\t};\n+\t};\n+\n+\tkeys {\n+\t\tcompatible = \"gpio-keys\";\n+\n+\t\treset {\n+\t\t\tlabel = \"reset\";\n+\t\t\tgpios = <&gpio 18 GPIO_ACTIVE_LOW>;\n+\t\t\tlinux,code = <KEY_RESTART>;\n+\t\t};\n+\n+\t\twps {\n+\t\t\tlabel = \"wps\";\n+\t\t\tgpios = <&gpio 15 GPIO_ACTIVE_LOW>;\n+\t\t\tlinux,code = <KEY_WPS_BUTTON>;\n+\t\t};\n+\t};\n+};\n+\n+&spi0 {\n+\tstatus = \"okay\";\n+\n+\tflash@0 {\n+\t\tcompatible = \"jedec,spi-nor\";\n+\t\treg = <0>;\n+\t\tspi-max-frequency = <10000000>;\n+\t\tbroken-flash-reset;\n+\n+\t\tpartitions {\n+\t\t\tcompatible = \"fixed-partitions\";\n+\t\t\t#address-cells = <1>;\n+\t\t\t#size-cells = <1>;\n+\n+\t\t\tpartition@0 {\n+\t\t\t\tlabel = \"u-boot\";\n+\t\t\t\treg = <0x0 0x40000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\t\t\t\n+\t\t\tpartition@40000 {\n+\t\t\t\tlabel = \"u-boot-env\";\n+\t\t\t\treg = <0x40000 0x10000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\t\t\t\n+\t\t\tfactory: partition@50000 {\n+\t\t\t\tlabel = \"factory\";\n+\t\t\t\treg = <0x50000 0x40000>;\n+\t\t\t\tread-only;\n+\t\t\t};\n+\t\t\t\n+\t\t\tpartition@90000 {\n+\t\t\t\tcompatible = \"denx,uimage\";\n+\t\t\t\tlabel = \"firmware\";\n+\t\t\t\treg = <0x90000 0xf70000>;\n+\t\t\t};\n+\t\t};\n+\t};\n+};\n+\n+&state_default {\n+\tgpio {\n+\t\tgroups = \"i2c\", \"uart2\", \"uart3\";\n+\t\tfunction = \"gpio\";\n+\t};\n+};\n+\n+&sdhci {\n+\tstatus = \"okay\";\n+};\n+\n+&gmac0 {\n+\tnvmem-cells = <&macaddr_factory_3fff4>;\n+\tnvmem-cell-names = \"mac-address\";\n+};\n+\n+&switch0 {\n+\tports {\n+\t\tport@0 {\n+\t\t\tstatus = \"okay\";\n+\t\t\tlabel = \"lan4\";\n+\t\t};\n+\n+\t\tport@1 {\n+\t\t\tstatus = \"okay\";\n+\t\t\tlabel = \"lan3\";\t\t   \n+\t\t};\n+\n+\t\tport@2 {\n+\t\t\tstatus = \"okay\";\n+\t\t\tlabel = \"lan2\";\n+\t\t};\n+\n+\t\tport@3 {\n+\t\t\tstatus = \"okay\";\n+\t\t\tlabel = \"lan1\";\n+\t\t};\n+\n+\t\tport@4 {\n+\t\t\tstatus = \"okay\";\n+\t\t\tlabel = \"wan\";\n+\t\t\tnvmem-cells = <&macaddr_factory_3fffa>;\n+\t\t\tnvmem-cell-names = \"mac-address\";\n+\t\t};\n+\t};\n+};\n+\n+&pcie {\n+\tstatus = \"okay\";\n+};\n+\n+&pcie1 {\n+\twifi@0,0 {\n+\t\tcompatible = \"mediatek,mt76\";\n+\t\treg = <0x0000 0 0 0 0>;\n+\t\tmediatek,mtd-eeprom = <&factory 0x0>;\n+\t};\n+};\n+\n+&factory {\n+\tcompatible = \"nvmem-cells\";\n+\t#address-cells = <1>;\n+\t#size-cells = <1>;\n+\n+\tmacaddr_factory_3fff4: macaddr@3fff4 {\n+\t\treg = <0x3fff4 0x6>;\n+\t};\n+\n+\tmacaddr_factory_3fffa: macaddr@3fffa {\n+\t\treg = <0x3fffa 0x6>;\n+\t};\n+};\n"
  },
  {
    "path": "devices/ramips_mt7621/patches/tblsection.patch",
    "content": "--- a/package/feeds/luci/luci-compat/luasrc/view/cbi/tblsection.htm\n+++ b/package/feeds/luci/luci-compat/luasrc/view/cbi/tblsection.htm\n@@ -123,6 +123,7 @@ <h3><%=self.title%></h3>\n \n \t\t\tlocal isempty, section, i, k = true, nil, nil\n \t\t    for i, k in ipairs(self:cfgsections()) do\n+\t\t    \tif i <= 100 then\n \t\t\t\tisempty = false\n \t\t\t\tsection = k\n \n@@ -165,6 +166,8 @@ <h3><%=self.title%></h3>\n \t\t\t\t</td>\n \t\t\t<%- end -%>\n \t\t</tr>\n+\t\t\t<%- i=i+1 -%>\n+\t\t\t<%- end -%>\n \t\t<%- end -%>\n \n \t\t<%- if isempty then -%>\n"
  },
  {
    "path": "devices/ramips_mt7621/patches/zte_e8820s.patch",
    "content": "diff --git a/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds b/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds\nindex aad2e32b36210..a6a4707fc295d 100644\n--- a/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds\n+++ b/target/linux/ramips/mt7621/base-files/etc/board.d/01_leds\n@@ -157,6 +157,16 @@\n zyxel,lte5398-m904)\n \tucidef_set_led_netdev \"internet\" \"LTE/3G Internet Activity\" \"green:internet\" \"wwan0\" \"rx tx\"\n \t;;\n+zte,e8820s)\n+\tucidef_set_led_netdev \"sys\" \"SYS_LED\" \"white:sys\" \"eth0\" \"tx rx\"\n+\tucidef_set_led_timer \"power\" \"POWER_LED\" \"white:sys\" \"100\" \"8000\"\n+\tucidef_set_led_netdev \"wlan2g\" \"WiFi 2.4GHz\" \"white:wlan2g\" \"ra0\"\n+\tucidef_set_led_netdev \"wlan5g\" \"WiFi 5GHz\" \"white:wlan5g\" \"rai0\"\n+\t;;\n+zte,e8820v2)\n+\tucidef_set_led_netdev \"sys\" \"SYS_LED\" \"white:sys\" \"eth0\" \"tx rx\"\n+\tucidef_set_led_timer \"power\" \"POWER_LED\" \"white:power\" \"100\" \"8000\"\n+\t;;\n esac\n \n board_config_flush\n"
  },
  {
    "path": "devices/ramips_mt76x8/.config",
    "content": "\nCONFIG_TARGET_ramips=y\nCONFIG_TARGET_ramips_mt76x8=y\n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_7links_wlr-1230=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_7links_wlr-1240=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_alfa-network_awusfree1=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_asus_rt-n10p-v3=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_asus_rt-n11p-b1=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_asus_rt-n12-vp-b1=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_buffalo_wcr-1166ds=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_comfast_cf-wr617ac=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_comfast_cf-wr758ac-v1=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_comfast_cf-wr758ac-v2=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_cudy_wr1000=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_dlink_dap-1325-a1=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_duzun_dm06=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_elecom_wrc-1167fs=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_glinet_vixmini=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_iptime_a3=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_iptime_a604m=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_jotale_js76x8-8m=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_mediatek_mt7628an-eval-board=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_mercury_mac1200r-v2=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_motorola_mwr03=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_netgear_r6020=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_netgear_r6080=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_rakwireless_rak633=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_totolink_a3=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_totolink_lr1200=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_archer-c20-v4=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_archer-c20-v5=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_archer-c50-v3=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_archer-c50-v4=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_archer-c50-v6=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_archer-mr200-v5=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_re200-v2=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_re200-v3=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_re200-v4=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_re205-v3=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_re220-v2=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_re305-v1=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_re305-v3=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_re365-v1=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_tl-mr3020-v3=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_tl-mr3420-v5=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_tl-mr6400-v4=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_tl-mr6400-v5=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_tl-wa801nd-v5=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_tl-wr802n-v4=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_tl-wr840n-v4=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_tl-wr840n-v5=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_tl-wr841n-v13=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_tl-wr841n-v14=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_tl-wr842n-v5=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_tl-wr850n-v2=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_tl-wr902ac-v3=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_tplink_tl-wr902ac-v4=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_vocore_vocore2-lite=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_wavlink_wl-wn531a3=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_wavlink_wl-wn570ha1=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_wavlink_wl-wn575a3=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_wavlink_wl-wn576a2=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_wavlink_wl-wn577a2=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_wavlink_wl-wn578a2=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_yuncore_cpe200=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_yuncore_m300=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_zbtlink_zbt-we1226=n\nCONFIG_TARGET_DEVICE_ramips_mt76x8_DEVICE_zbtlink_zbt-we2426-b=n\n\n\n\n\n\n"
  },
  {
    "path": "devices/ramips_mt76x8/diy.sh",
    "content": "#!/bin/bash\n\nshopt -s extglob\n\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\nsh -c \"curl -sfL https://github.com/openwrt/openwrt/commit/2e6d19ee32399e37c7545aefc57d41541a406d55.patch | patch -d './' -p1 --forward\" || true\n\nsed -i '/# start dockerd/,/# end dockerd/d' .config\n\n\n#sh -c \"curl -sfL https://patch-diff.githubusercontent.com/raw/openwrt/openwrt/pull/11287.patch | patch -d './' -p1 --forward\"\n\n#curl -sfL https://raw.githubusercontent.com/x-wrt/x-wrt/master/target/linux/mediatek/patches-5.15/995-0001-hwnat-add-natflow-flow-offload-support.patch -o target/linux/ramips/patches-5.15/995-0001-hwnat-add-natflow-flow-offload-support.patch\n\n#svn export --force https://github.com/x-wrt/x-wrt/trunk/target/linux/ramips/files/drivers/net/ethernet/ralink target/linux/ramips/files/drivers/net/ethernet/ralink\n\n#sed -i 's/DEFAULT_PACKAGES +=/DEFAULT_PACKAGES += luci-app-natflow-users natflow-boot/' target/linux/ramips/Makefile\n\n"
  },
  {
    "path": "devices/ramips_mt76x8/patches/tblsection.patch",
    "content": "--- a/package/feeds/luci/luci-compat/luasrc/view/cbi/tblsection.htm\n+++ b/package/feeds/luci/luci-compat/luasrc/view/cbi/tblsection.htm\n@@ -123,6 +123,7 @@ <h3><%=self.title%></h3>\n \n \t\t\tlocal isempty, section, i, k = true, nil, nil\n \t\t    for i, k in ipairs(self:cfgsections()) do\n+\t\t    \tif i <= 100 then\n \t\t\t\tisempty = false\n \t\t\t\tsection = k\n \n@@ -165,6 +166,8 @@ <h3><%=self.title%></h3>\n \t\t\t\t</td>\n \t\t\t<%- end -%>\n \t\t</tr>\n+\t\t\t<%- i=i+1 -%>\n+\t\t\t<%- end -%>\n \t\t<%- end -%>\n \n \t\t<%- if isempty then -%>\n"
  },
  {
    "path": "devices/rockchip_armv8/.config",
    "content": "\nCONFIG_TARGET_rockchip=y\nCONFIG_TARGET_rockchip_armv8=y\n\nCONFIG_TARGET_DEVICE_rockchip_armv8_DEVICE_radxa_rock-pi-4a=n\n\nCONFIG_TARGET_KERNEL_PARTSIZE=32\n"
  },
  {
    "path": "devices/rockchip_armv8/README.md",
    "content": "Kernel等部分源码来源 https://github.com/coolsnowwolf/lede 感谢"
  },
  {
    "path": "devices/rockchip_armv8/diy.sh",
    "content": "#!/bin/bash\n\nshopt -s extglob\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\n#bash $SHELL_FOLDER/../common/kernel_6.6.sh\n\nrm -rf package/boot target/linux/rockchip\n\ngit_clone_path master https://github.com/coolsnowwolf/lede target/linux/rockchip package/boot\n\nwget -N https://github.com/istoreos/istoreos/raw/refs/heads/istoreos-23.05/target/linux/rockchip/patches-5.15/305-r2s-pwm-fan.patch -P target/linux/rockchip/patches-6.12/\n\nwget -N https://github.com/coolsnowwolf/lede/raw/refs/heads/master/target/linux/generic/backport-6.12/203-v6.15-drivers-base-component-add-function-to-query-the-bound.patch -P target/linux/generic/backport-6.12/\n\nsed -i \"/KernelPackage,ptp/d\" package/kernel/linux/modules/other.mk\n\nrm -rf target/linux/rockchip/armv8/base-files/etc/uci-defaults/13_opkg_update package/feeds/kiddin9/pcat-manager package/feeds/kiddin9/*_QMI_WWAN\n\nsed -i -e 's,kmod-r8168,kmod-r8169,g' target/linux/rockchip/image/armv8.mk\nsed -i -e 's,wpad-openssl,wpad-basic-mbedtls,g' target/linux/rockchip/image/armv8.mk\n\nsed -i -e '/KERNEL_TESTING_PATCHVER/d' -e 's/DEFAULT_PACKAGES +=/DEFAULT_PACKAGES += fdisk lsblk kmod-drm-rockchip luci-app-diskman/' -e 's/autocore-arm/autocore/' target/linux/rockchip/Makefile\n\nsed -i 's/Ariaboard/光影猫/' target/linux/rockchip/image/armv8.mk\n"
  },
  {
    "path": "devices/rockchip_armv8/patches/55-xgp.patch.b",
    "content": "--- a/target/linux/rockchip/image/Makefile\n+++ b/target/linux/rockchip/image/Makefile\n@@ -20,6 +20,23 @@ define Build/boot-common\n \t$(CP) $(IMAGE_KERNEL) $@.boot/kernel.img\n endef\n \n+define Build/boot-combined\n+\t# This creates a new folder copies the dtbs (as rockchip*.dtb)\n+\t# and the kernel image (as kernel.img)\n+\trm -fR $@.boot\n+\tmkdir -p $@.boot\n+\n+\ti=0; \\\n+\tfor dts in $(DEVICE_DTS); do \\\n+\t\tdts=$$(echo $${dts} | cut -d'/' -f2); \\\n+\t\t$(CP) $(KDIR)/image-$$(echo $${dts} | cut -d'/' -f2).dtb $@.boot/rockchip$$(perl -e 'printf \"%b\\n\",'$$i).dtb; \\\n+\t\tlet i+=1; \\\n+\tdone\n+\n+\t$(LN) rockchip0.dtb $@.boot/rockchip.dtb\n+\t$(CP) $(IMAGE_KERNEL) $@.boot/kernel.img\n+endef\n+\n define Build/boot-script\n \t# Make an U-boot image and copy it to the boot partition\n \tmkimage -A arm -O linux -T script -C none -a 0 -e 0 -d $(if $(1),$(1),mmc).bootscript $@.boot/boot.scr\ndiff --git a/target/linux/rockchip/image/nlnet-xgp.bootscript b/target/linux/rockchip/image/nlnet-xgp.bootscript\nnew file mode 100644\nindex 0000000000000..80df26f6c1520\n--- /dev/null\n+++ b/target/linux/rockchip/image/nlnet-xgp.bootscript\n@@ -0,0 +1,38 @@\n+# nlnet-xgp rk3568 combined image, board detected by ADC\n+\n+env delete hwrev\n+env delete coreboard_adc_value\n+env delete motherboard_adc_value\n+\n+# using SARADC CH1 to detect coreboard hwrev\n+# using SARADC CH7 to detect motherboard hwrev\n+\n+adc single saradc@fe720000 1 coreboard_adc_value\n+adc single saradc@fe720000 7 motherboard_adc_value\n+\n+if test -n \"$coreboard_adc_value\"; then\n+    if test \"$coreboard_adc_value\" -lt 225000; then\n+        echo coreboard rev02\n+    fi\n+fi\n+\n+if test -n \"$motherboard_adc_value\"; then\n+    if test \"$motherboard_adc_value\" -lt 225000; then\n+        echo motherboard rev03\n+        setenv hwrev 1\n+    fi\n+fi\n+\n+env delete coreboard_adc_value\n+env delete motherboard_adc_value\n+\n+part uuid mmc ${devnum}:2 uuid\n+\n+setenv bootargs \"console=ttyS2,1500000 earlycon=uart8250,mmio32,0xfe660000 root=PARTUUID=${uuid} rw rootwait\"\n+\n+load mmc ${devnum}:1 ${fdt_addr_r} rockchip${hwrev}.dtb\n+load mmc ${devnum}:1 ${kernel_addr_r} kernel.img\n+\n+env delete hwrev\n+\n+booti ${kernel_addr_r} - ${fdt_addr_r}\n"
  },
  {
    "path": "devices/rockchip_armv8/patches/Photonicat_wireless.patch",
    "content": "diff --git a/package/firmware/linux-firmware/qca_ath10k.mk b/package/firmware/linux-firmware/qca_ath10k.mk\nindex b3bfe8a3919803..a4ce0b01e410f2 100644\n--- a/package/firmware/linux-firmware/qca_ath10k.mk\n+++ b/package/firmware/linux-firmware/qca_ath10k.mk\n@@ -32,6 +32,24 @@ define Package/ath10k-firmware-qca9377/install\n endef\n $(eval $(call BuildPackage,ath10k-firmware-qca9377))\n \n+Package/ath10k-board-qca9377-sdio = $(call Package/firmware-default,ath10k qca9377 board sdio firmware)\n+define Package/ath10k-board-qca9377-sdio/install\n+\t$(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA9377/hw1.0\n+\t$(INSTALL_DATA) \\\n+\t\t$(PKG_BUILD_DIR)/ath10k/QCA9377/hw1.0/board.bin \\\n+\t\t$(1)/lib/firmware/ath10k/QCA9377/hw1.0/board.bin\n+endef\n+$(eval $(call BuildPackage,ath10k-board-qca9377-sdio))\n+\n+Package/ath10k-firmware-qca9377-sdio = $(call Package/firmware-default,ath10k qca9377 sdio firmware,+ath10k-board-qca9377-sdio)\n+define Package/ath10k-firmware-qca9377-sdio/install\n+\t$(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA9377/hw1.0\n+\t$(INSTALL_DATA) \\\n+\t\t$(PKG_BUILD_DIR)/ath10k/QCA9377/hw1.0/firmware-sdio-5.bin \\\n+\t\t$(1)/lib/firmware/ath10k/QCA9377/hw1.0/firmware-sdio-5.bin\n+endef\n+$(eval $(call BuildPackage,ath10k-firmware-qca9377-sdio))\n+\n Package/ath10k-board-qca9887 = $(call Package/firmware-default,ath10k qca9887 board firmware,,LICENSE.QualcommAtheros_ath10k)\n define Package/ath10k-board-qca9887/install\n \t$(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA9887/hw1.0\ndiff --git a/package/kernel/mac80211/ath.mk b/package/kernel/mac80211/ath.mk\nindex 1d4b37d259bb0f..3404227c604488 100644\n--- a/package/kernel/mac80211/ath.mk\n+++ b/package/kernel/mac80211/ath.mk\n@@ -1,5 +1,5 @@\n PKG_DRIVERS += \\\n-\tath ath5k ath6kl ath6kl-sdio ath6kl-usb ath9k ath9k-common ath9k-htc ath10k ath10k-smallbuffers \\\n+\tath ath5k ath6kl ath6kl-sdio ath6kl-usb ath9k ath9k-common ath9k-htc ath10k ath10k-sdio ath10k-smallbuffers \\\n \tath11k ath11k-ahb ath11k-pci ath12k carl9170 owl-loader ar5523 wil6210 qcom-qmi-helpers\n \n PKG_CONFIG_DEPENDS += \\\n@@ -40,7 +40,7 @@ ifdef CONFIG_PACKAGE_MAC80211_TRACING\n endif\n \n config-$(call config_package,qcom-qmi-helpers) += QCOM_QMI_HELPERS\n-config-$(call config_package,ath,regular smallbuffers) += ATH_CARDS ATH_COMMON\n+config-$(call config_package,ath,regular sdio smallbuffers) += ATH_CARDS ATH_COMMON\n config-$(CONFIG_PACKAGE_ATH_DEBUG) += ATH_DEBUG ATH10K_DEBUG ATH11K_DEBUG ATH12K_DEBUG ATH9K_STATION_STATISTICS\n config-$(CONFIG_PACKAGE_ATH_DFS) += ATH9K_DFS_CERTIFIED ATH10K_DFS_CERTIFIED\n config-$(CONFIG_PACKAGE_ATH_SPECTRAL) += ATH9K_COMMON_SPECTRAL ATH10K_SPECTRAL ATH11K_SPECTRAL\n@@ -62,6 +62,7 @@ config-$(CONFIG_ATH11K_THERMAL) += ATH11K_THERMAL\n \n config-$(call config_package,ath9k-htc) += ATH9K_HTC\n config-$(call config_package,ath10k,regular) += ATH10K ATH10K_PCI\n+config-$(call config_package,ath10k-sdio,sdio) += ATH10K ATH10K_SDIO\n config-$(call config_package,ath10k-smallbuffers,smallbuffers) += ATH10K ATH10K_PCI ATH10K_SMALLBUFFERS\n config-$(call config_package,ath11k) += ATH11K\n config-$(call config_package,ath11k-ahb) += ATH11K_AHB\n@@ -294,8 +295,27 @@ define KernelPackage/ath10k/config\n \n        config ATH10K_THERMAL\n                bool \"Enable thermal sensors and throttling support\"\n-               depends on PACKAGE_kmod-ath10k || PACKAGE_kmod-ath10k-smallbuffers\n+               depends on PACKAGE_kmod-ath10k || PACKAGE_kmod-ath10k-sdio || PACKAGE_kmod-ath10k-smallbuffers\n+\n+endef\n \n+define KernelPackage/ath10k-sdio\n+  $(call KernelPackage/mac80211/Default)\n+  TITLE:=Atheros 802.11ac SDIO wireless cards support\n+  URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath10k\n+  DEPENDS+= +kmod-ath +kmod-mmc +@DRIVER_11AC_SUPPORT \\\n+\t+ATH10K_THERMAL:kmod-hwmon-core +ATH10K_THERMAL:kmod-thermal\n+  FILES:= \\\n+\t$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_core.ko \\\n+\t$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_sdio.ko\n+  AUTOLOAD:=$(call AutoProbe,ath10k_core ath10k_sdio)\n+  MODPARAMS.ath10k_core:=frame_mode=2\n+  VARIANT:=sdio\n+endef\n+ \n+define KernelPackage/ath10k-sdio/description\n+  This module adds support for wireless adapters based on\n+  Atheros IEEE 802.11ac family of chipsets with SDIO bus.\n endef\n \n define KernelPackage/ath10k-smallbuffers\ndiff --git a/package/kernel/mac80211/patches/ath10k/911-ath10k-disable-caldata-prefetch-for-sdio-bus.patch b/package/kernel/mac80211/patches/ath10k/911-ath10k-disable-caldata-prefetch-for-sdio-bus.patch\nnew file mode 100644\nindex 00000000000000..8ca8f3b55b6a6e\n--- /dev/null\n+++ b/package/kernel/mac80211/patches/ath10k/911-ath10k-disable-caldata-prefetch-for-sdio-bus.patch\n@@ -0,0 +1,12 @@\n+--- a/drivers/net/wireless/ath/ath10k/debug.c\n++++ b/drivers/net/wireless/ath/ath10k/debug.c\n+@@ -1260,6 +1260,9 @@ static int ath10k_debug_cal_data_fetch(s\n+ \tif (ar->hw_params.cal_data_len == 0)\n+ \t\treturn -EOPNOTSUPP;\n+ \n++\tif (ar->hif.bus == ATH10K_BUS_SDIO)\n++\t\treturn -EINVAL;\n++\n+ \thi_addr = host_interest_item_address(HI_ITEM(hi_board_data));\n+ \n+ \tret = ath10k_hif_diag_read(ar, hi_addr, &addr, sizeof(addr));\n"
  },
  {
    "path": "devices/rockchip_armv8/patches/add_extra_CPU_FLAGS.b",
    "content": "--- a/include/target.mk\n+++ b/include/target.mk\n@@ -259,9 +259,18 @@ ifeq ($(DUMP),1)\n     CPU_CFLAGS_arc700 = -mcpu=arc700\n     CPU_CFLAGS_archs = -mcpu=archs\n   endif\n+  ifeq ($(BOARD),rockchip)\n+    CPU_CFLAGS = -O3 -pipe\n+    CPU_CFLAGS_cortex-a53 = -mcpu=cortex-a53\n+    CPU_CFLAGS_cortex-a55 = -march=armv8-a+crypto+crc -mcpu=cortex-a55+crypto+crc -mtune=cortex-a55\n+    CPU_CFLAGS_cortex-a73 = -march=armv8-a+crypto+crc -mcpu=cortex-a73.cortex-a53+crypto+crc -mtune=cortex-a73.cortex-a53\n+    ifneq ($(SOC_CFLAGS),)\n+      CPU_CFLAGS_generic = $(SOC_CFLAGS)\n+    endif\n+  endif\n   ifneq ($(CPU_TYPE),)\n     ifndef CPU_CFLAGS_$(CPU_TYPE)\n-      $(warning CPU_TYPE \"$(CPU_TYPE)\" doesn't correspond to a known type)\n+      $(warning CPU_TYPE \"$(CPU_TYPE)\" \"doesn't correspond to a known type\")\n     endif\n   endif\n   DEFAULT_CFLAGS=$(strip $(CPU_CFLAGS) $(CPU_CFLAGS_$(CPU_TYPE)) $(CPU_CFLAGS_$(CPU_SUBTYPE)))"
  },
  {
    "path": "devices/rockchip_armv8/patches/nanopi-zero2.patch",
    "content": "--- a/target/linux/rockchip/image/armv8.mk\n+++ b/target/linux/rockchip/image/armv8.mk\n@@ -264,6 +264,17 @@ define Device/friendlyarm_nanopi-r6s\n endef\n TARGET_DEVICES += friendlyarm_nanopi-r76s\n \n+define Device/friendlyarm_nanopi-zero2\n+  DEVICE_VENDOR := FriendlyARM\n+  DEVICE_MODEL := NanoPi Zero2\n+  SOC := rk3328\n+  UBOOT_DEVICE_NAME := nanopi-r2s-rk3328\n+  IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-bin | gzip | append-metadata\n+  DEVICE_PACKAGES := -luci-app-gpsysupgrade kmod-gpio-button-hotplug kmod-usb-net-rtl8152\n+  DEVICE_DTS = rockchip/rk3328-nanopi-r2s\n+endef\n+TARGET_DEVICES += friendlyarm_nanopi-zero2\n+\n define Device/firefly_station-p2\n   DEVICE_VENDOR := Firefly\n   DEVICE_MODEL := Station P2\n\n--- a/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\n+++ b/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\n@@ -67,6 +67,17 @@ rockchip_setup_interfaces()\n \tfriendlyarm,nanopi-r5s)\n \t\tucidef_set_interfaces_lan_wan 'eth1 eth2' 'eth0'\n \t\t;;\n+\tfriendlyarm,nanopi-neo3|\\\n+\tfriendlyarm,nanopc-t4|\\\n+\tfriendlyarm,nanopi-m4|\\\n+\tfriendlyarm,nanopi-m6|\\\n+\tfriendlyarm,nanopi-zero2|\\\n+\tfriendlyarm,nanopi-neo3-plus|\\\n+\tfriendlyarm,nanopi-neo4|\\\n+\tfriendlyarm,cm3588|\\\n+\tfriendlyarm,som-rk3399)\n+\t\tucidef_set_interfaces_lan_wan 'wlan0' 'eth0'\n+\t\t;;\n \tlyt,t68m)\n \t\tucidef_set_network_device_path lan1 'platform/fe2a0000.ethernet'\n \t\tucidef_set_network_device_path lan2 'platform/fe010000.ethernet'\n\n--- a/target/linux/rockchip/image/Makefile\n+++ b/target/linux/rockchip/image/Makefile\n@@ -79,4 +79,16 @@ endif\n \n include $(SUBTARGET).mk\n \n+define Image/Build\n+\tif [[ \"$(PROFILE_SANITIZED)\" == \"friendlyarm_nanopi-zero2\" ]]; then \\\n+\t\texport IMG_PREFIX=\"$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED))\"; \\\n+\t\texport BIN_DIR=$(BIN_DIR); \\\n+\t\texport TOPDIR=$(TOPDIR); \\\n+\t\texport MORE=$(MORE); \\\n+\t\texport ROOTFS_PARTSIZE=$(shell echo $$(($(ROOTFS_PARTSIZE)/1024/1024))); \\\n+\t\tcd /data/packit/friendlywrt24-rk3528; \\\n+\t\t. ~/packit/packit_nanopi.sh; \\\n+\tfi\n+endef\n+\n $(eval $(call BuildImage))\n"
  },
  {
    "path": "devices/rockchip_armv8/patches/r4s-fan.patch",
    "content": "diff --git a/target/linux/rockchip/patches-6.12/304-r4s-pwm-fan.patch b/target/linux/rockchip/patches-6.12/304-r4s-pwm-fan.patch\nnew file mode 100644\nindex 000000000000..546ca54589c2\n--- /dev/null\n+++ b/target/linux/rockchip/patches-6.12/304-r4s-pwm-fan.patch\n@@ -0,0 +1,55 @@\n+From 930d10b5a37004c428ad1c9747a1424e85567e3f Mon Sep 17 00:00:00 2001\n+From: jjm2473 <1129525450@qq.com>\n+Date: Wed, 15 Mar 2023 16:18:26 +0800\n+Subject: [PATCH] rockchip: add pwm-fan for R4S(E)\n+\n+---\n+ .../boot/dts/rockchip/rk3399-nanopi-r4s.dts   | 36 +++++++++++++++++++\n+ .../boot/dts/rockchip/rk3399-nanopi-r4se.dts  | 36 +++++++++++++++++++\n+ 2 files changed, 72 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts\n+@@ -69,6 +69,42 @@\n+ \t\tregulator-always-on;\n+ \t\tregulator-boot-on;\n+ \t};\n++\n++        fan: pwm-fan {\n++                compatible = \"pwm-fan\";\n++                cooling-levels = <0 18 102 170 255>;\n++                #cooling-cells = <2>;\n++                fan-supply = <&vdd_5v>;\n++                pwms = <&pwm1 0 50000 0>;\n++        };\n++};\n++\n++&cpu_thermal {\n++        trips {\n++                cpu_warm: cpu_warm {\n++                        temperature = <55000>;\n++                        hysteresis = <2000>;\n++                        type = \"active\";\n++                };\n++\n++                cpu_hot: cpu_hot {\n++                        temperature = <65000>;\n++                        hysteresis = <2000>;\n++                        type = \"active\";\n++                };\n++        };\n++\n++        cooling-maps {\n++                map2 {\n++                        trip = <&cpu_warm>;\n++                        cooling-device = <&fan THERMAL_NO_LIMIT 1>;\n++                };\n++\n++                map3 {\n++                        trip = <&cpu_hot>;\n++                        cooling-device = <&fan 2 THERMAL_NO_LIMIT>;\n++                };\n++        };\n+ };\n+ \n+ &emmc_phy {\n"
  },
  {
    "path": "devices/siflower_sf21/.config",
    "content": "CONFIG_TARGET_siflower=y\nCONFIG_TARGET_siflower_sf21=y\n\n"
  },
  {
    "path": "devices/siflower_sf21/diy.sh",
    "content": "#!/bin/bash\nshopt -s extglob"
  },
  {
    "path": "devices/sunxi_cortexa53/.config",
    "content": "\nCONFIG_TARGET_sunxi=y\nCONFIG_TARGET_sunxi_cortexa53=y\n\nCONFIG_TARGET_DEVICE_sunxi_cortexa53_DEVICE_friendlyarm_nanopi-neo-plus2=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa53_DEVICE_friendlyarm_nanopi-neo2=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa53_DEVICE_friendlyarm_nanopi-r1s-h5=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa53_DEVICE_xunlong_orangepi-one-plus=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa53_DEVICE_xunlong_orangepi-pc2=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa53_DEVICE_xunlong_orangepi-zero-plus=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa53_DEVICE_xunlong_orangepi-zero2=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa53_DEVICE_xunlong_orangepi-zero3=y\n"
  },
  {
    "path": "devices/sunxi_cortexa53/diy.sh",
    "content": "#!/bin/bash\n\nshopt -s extglob\n\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\n#bash $SHELL_FOLDER/../common/kernel_6.6.sh\n\nsed -i 's/DEFAULT_PACKAGES +=/DEFAULT_PACKAGES += fdisk lsblk kmod-usb-net-asix-ax88179 kmod-usb-net-rtl8152 kmod-rtl8189es/' target/linux/sunxi/Makefile\n\n\n\n\n"
  },
  {
    "path": "devices/sunxi_cortexa7/.config",
    "content": "\nCONFIG_TARGET_sunxi=y\nCONFIG_TARGET_sunxi_cortexa7=y\n\nCONFIG_TARGET_DEVICE_sunxi_cortexa7_DEVICE_friendlyarm_nanopi-m1-plus=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa7_DEVICE_friendlyarm_nanopi-neo=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa7_DEVICE_friendlyarm_nanopi-neo-air=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa7_DEVICE_friendlyarm_nanopi-r1=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa7_DEVICE_friendlyarm_zeropi=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa7_DEVICE_xunlong_orangepi-2=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa7_DEVICE_xunlong_orangepi-one=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa7_DEVICE_xunlong_orangepi-pc=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa7_DEVICE_xunlong_orangepi-pc-plus=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa7_DEVICE_xunlong_orangepi-plus=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa7_DEVICE_xunlong_orangepi-r1=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa7_DEVICE_xunlong_orangepi-zero=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa7_DEVICE_sinovoip_bananapi-p2-zero=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa7_DEVICE_sinovoip_bananapi-m3=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa7_DEVICE_sinovoip_bananapi-m2-plus=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa7_DEVICE_sinovoip_bananapi-m2-berry=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa7_DEVICE_sinovoip_bananapi-m2-ultra=y\nCONFIG_TARGET_DEVICE_sunxi_cortexa7_DEVICE_mele_m9=y\n"
  },
  {
    "path": "devices/sunxi_cortexa7/diy.sh",
    "content": "#!/bin/bash\n\nshopt -s extglob\n\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\n#bash $SHELL_FOLDER/../common/kernel_6.1.sh\n\nsed -i 's/DEFAULT_PACKAGES +=/DEFAULT_PACKAGES += fdisk lsblk kmod-usb-net-asix-ax88179 kmod-usb-net-rtl8152 kmod-rtl8189es/' target/linux/sunxi/Makefile\n\n\n\n\n"
  },
  {
    "path": "devices/x86_64/.config",
    "content": "\nCONFIG_TARGET_x86=y\nCONFIG_TARGET_x86_64=y\nCONFIG_TARGET_ROOTFS_TARGZ=y\n\n# EFI支持:\nCONFIG_GRUB_IMAGES=y\nCONFIG_GRUB_EFI_IMAGES=y\nCONFIG_VMDK_IMAGES=n\n\n\n"
  },
  {
    "path": "devices/x86_64/diy.sh",
    "content": "#!/bin/bash\n\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\n#bash $SHELL_FOLDER/../common/kernel_6.6.sh\n\ngit_clone_path master https://github.com/coolsnowwolf/lede target/linux/x86/files target/linux/x86/patches-6.12\n\nwget -N https://raw.githubusercontent.com/coolsnowwolf/lede/master/target/linux/x86/base-files/etc/board.d/02_network -P target/linux/x86/base-files/etc/board.d/\n\nsed -i 's/kmod-r8169/kmod-r8168/' target/linux/x86/image/64.mk\n\nsed -i 's/DEFAULT_PACKAGES +=/DEFAULT_PACKAGES += kmod-fs-f2fs kmod-mmc kmod-sdhci kmod-usb-hid usbutils pciutils lm-sensors-detect kmod-atlantic kmod-vmxnet3 kmod-igbvf kmod-iavf kmod-bnx2x kmod-pcnet32 kmod-tulip kmod-r8101 kmod-r8125 kmod-r8126 kmod-8139cp kmod-8139too kmod-i40e kmod-drm-amdgpu kmod-mlx4-core kmod-mlx5-core fdisk lsblk kmod-phy-broadcom kmod-ixgbevf/' target/linux/x86/Makefile\n\nsed -i 's/256/1024/g' target/linux/x86/image/Makefile\n\n\n"
  },
  {
    "path": "devices/x86_64/patches/Intel_gpu.patch",
    "content": "diff --git a/package/kernel/linux/modules/virt.mk b/package/kernel/linux/modules/virt.mk\nindex 5ed0d5dbbf2..a853a8c7980 100644\n--- a/package/kernel/linux/modules/virt.mk\n+++ b/package/kernel/linux/modules/virt.mk\n@@ -4,6 +4,50 @@\n # This is free software, licensed under the GNU General Public License v2.\n # See /LICENSE for more information.\n #\n+define KernelPackage/vfio-mdev\n+  SUBMENU:=Virtualization\n+  TITLE:=VFIO driver support to to virtualize devices\n+  DEPENDS:=@TARGET_x86_64\n+  KCONFIG:=\t\\\n+\tCONFIG_IOMMU_API=y \\\n+\tCONFIG_MMU=y \\\n+\tCONFIG_VFIO=y \\\n+\tCONFIG_VFIO_MDEV \\\n+\tCONFIG_VFIO_MDEV_DEVICE \\\n+\tCONFIG_VFIO_NOIOMMU=y \\\n+\tCONFIG_VFIO_PCI=y \\\n+\tCONFIG_VFIO_PCI_IGD=y\n+  FILES:= \\\n+\t$(LINUX_DIR)/drivers/vfio/mdev/mdev.ko \\\n+\t$(LINUX_DIR)/drivers/vfio/mdev/vfio_mdev.ko@lt5.10\n+  AUTOLOAD:=$(call AutoProbe,mdev vfio_mdev)\n+endef\n+\n+define KernelPackage/vfio-mdev/description\n+  Provides a framework to virtualize devices.\n+endef\n+\n+$(eval $(call KernelPackage,vfio-mdev))\n+\n+define KernelPackage/i915-gvt\n+  SUBMENU:=Virtualization\n+  TITLE:=Enable KVM/VFIO support for Intel GVT-g\n+  DEPENDS:=@TARGET_x86_64 +kmod-kvm-intel +kmod-drm-i915 +kmod-vfio-mdev\n+  KCONFIG:= CONFIG_DRM_I915_GVT_KVMGT\n+  FILES:= \\\n+      $(LINUX_DIR)/drivers/gpu/drm/i915/gvt/kvmgt.ko@lt5.18 \\\n+      $(LINUX_DIR)/drivers/gpu/drm/i915/kvmgt.ko@ge5.18\n+  AUTOLOAD:=$(call AutoProbe,kvmgt)\n+endef\n+\n+define KernelPackage/i915-gvt/description\n+  Enable Intel GVT-g graphics virtualization technology host support with \n+  integrated graphics. With GVT-g, it's possible to have one integrated \n+  graphics device shared by multiple VMs under KVM.\n+endef\n+\n+$(eval $(call KernelPackage,i915-gvt))\n+\n define KernelPackage/irqbypass\n   SUBMENU:=Virtualization\n   TITLE:=IRQ offload/bypass manager\n"
  },
  {
    "path": "devices/x86_64/patches/def_set_interfaces_lan_wan.patch",
    "content": "--- a/target/linux/x86/base-files/etc/board.d/02_network\n+++ b/target/linux/x86/base-files/etc/board.d/02_network\n@@ -39,6 +39,9 @@ traverse-technologies-geos)\n xiaoma-m12)\n \tucidef_set_interfaces_lan_wan \"eth1 eth2 eth3 eth4 eth5 eth6\" \"eth0\"\n \t;;\n+*)\n+\t[ \"$(ip address | grep ^[0-9] | awk -F: '{print $2}' | sed \"s/ //g\" | grep '^[e]' | grep -cvE \"(@|\\.)\")\" -gt 2 ] && ucidef_set_interfaces_lan_wan \"$(ip address | grep ^[0-9] | awk -F: '{print $2}' | sed \"s/ //g\" | grep '^[e]' | grep -vE \"(@|\\.|eth1)\" | tr \"\\n\" \" \" | sed \"s/ $//\")\" \"eth1\"\n+\t;;\n esac\n board_config_flush\n \n"
  },
  {
    "path": "devices/x86_64/patches/image-commands.patch",
    "content": "--- a/include/image-commands.mk\n+++ b/include/image-commands.mk\n@@ -419,6 +419,17 @@ endef\n \n # Convert a raw image into a $1 type image.\n # E.g. | qemu-image vdi <optional extra arguments to qemu-img binary>\n+define Build/qemu-exsi\n+\tif command -v qemu-img; then \\\n+\t\tname=\"$(subst .vmdk.zip,,$@)\"; \\\n+\t\tqemu-img convert -f raw -O $1 $@ $$name.vmdk; \\\n+\t\trm -f $@; \\\n+\t\tzip -jm $@ $$name*.vmdk; \\\n+\telse \\\n+\t\techo \"WARNING: Install qemu-img to create VDI/VMDK images\" >&2; exit 1; \\\n+\tfi\n+endef\n+\n define Build/qemu-image\n \tif command -v qemu-img; then \\\n \t\tqemu-img convert -f raw -O $1 $@ $@.new; \\"
  },
  {
    "path": "devices/x86_64/patches/image.patch",
    "content": "From c7bc056650227ba6003414356f57b33cdb2603b7 Mon Sep 17 00:00:00 2001\nFrom: kiddin9 <48883331+kiddin9@users.noreply.github.com>\nDate: Sat, 23 Apr 2022 18:38:12 +0800\nSubject: [PATCH] Update Makefile\n\n---\n target/linux/x86/image/Makefile | 12 ++++--------\n 1 file changed, 4 insertions(+), 8 deletions(-)\n\ndiff --git a/target/linux/x86/image/Makefile b/target/linux/x86/image/Makefile\nindex 322131c2a488..0b4ed1d272eb 100644\n--- a/target/linux/x86/image/Makefile\n+++ b/target/linux/x86/image/Makefile\n@@ -108,22 +108,18 @@ define Device/Default\n   IMAGE/combined.img := grub-config pc | combined | grub-install | append-metadata\n   IMAGE/combined.img.gz := grub-config pc | combined | grub-install | gzip | append-metadata\n   IMAGE/combined.vdi := grub-config pc | combined | grub-install | qemu-image vdi\n-  IMAGE/combined.vmdk := grub-config pc | combined | grub-install | qemu-image vmdk\n+  IMAGE/combined.vmdk.zip := grub-config pc | combined | grub-install | qemu-exsi vmdk -o adapter_type=lsilogic -o subformat=monolithicFlat\n   IMAGE/combined.vhdx := grub-config pc | combined | grub-install | qemu-image vhdx -o subformat=dynamic\n-  IMAGE/rootfs.img := append-rootfs | pad-to $(ROOTFS_PARTSIZE)\n-  IMAGE/rootfs.img.gz := append-rootfs | pad-to $(ROOTFS_PARTSIZE) | gzip\n   ARTIFACT/image-efi.iso := grub-config iso | iso efi\n   IMAGE/combined-efi.img := grub-config efi | combined efi | grub-install efi | append-metadata\n   IMAGE/combined-efi.img.gz := grub-config efi | combined efi | grub-install efi | gzip | append-metadata\n   IMAGE/combined-efi.vdi := grub-config efi | combined efi | grub-install efi | qemu-image vdi\n-  IMAGE/combined-efi.vmdk := grub-config efi | combined efi | grub-install efi | qemu-image vmdk\n+  IMAGE/combined-efi.vmdk.zip := grub-config efi | combined efi | grub-install efi | qemu-exsi vmdk -o adapter_type=lsilogic -o subformat=monolithicFlat\n   IMAGE/combined-efi.vhdx := grub-config efi | combined efi | grub-install efi | qemu-image vhdx -o subformat=dynamic\n   ifeq ($(CONFIG_TARGET_IMAGES_GZIP),y)\n-    IMAGES-y := rootfs.img.gz\n     IMAGES-$$(CONFIG_GRUB_IMAGES) += combined.img.gz\n     IMAGES-$$(CONFIG_GRUB_EFI_IMAGES) += combined-efi.img.gz\n   else\n-    IMAGES-y := rootfs.img\n     IMAGES-$$(CONFIG_GRUB_IMAGES) += combined.img\n     IMAGES-$$(CONFIG_GRUB_EFI_IMAGES) += combined-efi.img\n   endif\n@@ -139,8 +135,8 @@ define Device/Default\n     IMAGES-$$(CONFIG_GRUB_EFI_IMAGES) += combined-efi.vdi\n   endif\n   ifeq ($(CONFIG_VMDK_IMAGES),y)\n-    IMAGES-$$(CONFIG_GRUB_IMAGES) += combined.vmdk\n-    IMAGES-$$(CONFIG_GRUB_EFI_IMAGES) += combined-efi.vmdk\n+    IMAGES-$$(CONFIG_GRUB_IMAGES) += combined.vmdk.zip\n+    IMAGES-$$(CONFIG_GRUB_EFI_IMAGES) += combined-efi.vmdk.zip\n   endif\n   ifeq ($(CONFIG_VHDX_IMAGES),y)\n     IMAGES-$$(CONFIG_GRUB_IMAGES) += combined.vhdx\n"
  },
  {
    "path": "devices/x86_generic/.config",
    "content": "\nCONFIG_TARGET_x86=y\nCONFIG_TARGET_x86_generic=y\nCONFIG_TARGET_ROOTFS_TARGZ=y\n\n# EFI支持:\nCONFIG_GRUB_IMAGES=y\nCONFIG_GRUB_EFI_IMAGES=y\nCONFIG_VMDK_IMAGES=n\n\n"
  },
  {
    "path": "devices/x86_generic/diy.sh",
    "content": "#!/bin/bash\n\nSHELL_FOLDER=$(dirname $(readlink -f \"$0\"))\n\n#bash $SHELL_FOLDER/../common/kernel_6.6.sh\n\ngit_clone_path master https://github.com/coolsnowwolf/lede target/linux/x86/files target/linux/x86/patches-6.12\n\nsed -i 's/DEFAULT_PACKAGES +=/DEFAULT_PACKAGES += kmod-fs-f2fs kmod-mmc kmod-sdhci kmod-usb-hid amd64-microcode intel-microcode usbutils pciutils lm-sensors-detect kmod-alx kmod-vmxnet3 kmod-igbvf kmod-iavf kmod-bnx2x kmod-pcnet32 kmod-tulip kmod-r8125 kmod-r8126 kmod-r8101 kmod-8139cp kmod-8139too kmod-i40e kmod-i40evf kmod-mlx4-core kmod-mlx5-core fdisk lsblk/' target/linux/x86/Makefile\n\nsed -i 's/kmod-r8169/kmod-r8168/' target/linux/x86/image/generic.mk\n\nsed -i 's/256/1024/g' target/linux/x86/image/Makefile\n\nsed -i \"s/DEVICE_MODEL := x86/DEVICE_MODEL := x86\\/32/\" target/linux/x86/image/generic.mk\n\n\n"
  },
  {
    "path": "devices/x86_generic/patches/image-commands.patch",
    "content": "--- a/include/image-commands.mk\n+++ b/include/image-commands.mk\n@@ -419,6 +419,17 @@ endef\n \n # Convert a raw image into a $1 type image.\n # E.g. | qemu-image vdi <optional extra arguments to qemu-img binary>\n+define Build/qemu-exsi\n+\tif command -v qemu-img; then \\\n+\t\tname=\"$(subst .vmdk.zip,,$@)\"; \\\n+\t\tqemu-img convert -f raw -O $1 $@ $$name.vmdk; \\\n+\t\trm -f $@; \\\n+\t\tzip -jm $@ $$name*.vmdk; \\\n+\telse \\\n+\t\techo \"WARNING: Install qemu-img to create VDI/VMDK images\" >&2; exit 1; \\\n+\tfi\n+endef\n+\n define Build/qemu-image\n \tif command -v qemu-img; then \\\n \t\tqemu-img convert -f raw -O $1 $@ $@.new; \\"
  },
  {
    "path": "devices/x86_generic/patches/image.patch",
    "content": "From c7bc056650227ba6003414356f57b33cdb2603b7 Mon Sep 17 00:00:00 2001\nFrom: kiddin9 <48883331+kiddin9@users.noreply.github.com>\nDate: Sat, 23 Apr 2022 18:38:12 +0800\nSubject: [PATCH] Update Makefile\n\n---\n target/linux/x86/image/Makefile | 12 ++++--------\n 1 file changed, 4 insertions(+), 8 deletions(-)\n\ndiff --git a/target/linux/x86/image/Makefile b/target/linux/x86/image/Makefile\nindex 322131c2a488..0b4ed1d272eb 100644\n--- a/target/linux/x86/image/Makefile\n+++ b/target/linux/x86/image/Makefile\n@@ -108,22 +108,18 @@ define Device/Default\n   IMAGE/combined.img := grub-config pc | combined | grub-install | append-metadata\n   IMAGE/combined.img.gz := grub-config pc | combined | grub-install | gzip | append-metadata\n   IMAGE/combined.vdi := grub-config pc | combined | grub-install | qemu-image vdi\n-  IMAGE/combined.vmdk := grub-config pc | combined | grub-install | qemu-image vmdk\n+  IMAGE/combined.vmdk.zip := grub-config pc | combined | grub-install | qemu-exsi vmdk -o adapter_type=lsilogic -o subformat=monolithicFlat\n   IMAGE/combined.vhdx := grub-config pc | combined | grub-install | qemu-image vhdx -o subformat=dynamic\n-  IMAGE/rootfs.img := append-rootfs | pad-to $(ROOTFS_PARTSIZE)\n-  IMAGE/rootfs.img.gz := append-rootfs | pad-to $(ROOTFS_PARTSIZE) | gzip\n   ARTIFACT/image-efi.iso := grub-config iso | iso efi\n   IMAGE/combined-efi.img := grub-config efi | combined efi | grub-install efi | append-metadata\n   IMAGE/combined-efi.img.gz := grub-config efi | combined efi | grub-install efi | gzip | append-metadata\n   IMAGE/combined-efi.vdi := grub-config efi | combined efi | grub-install efi | qemu-image vdi\n-  IMAGE/combined-efi.vmdk := grub-config efi | combined efi | grub-install efi | qemu-image vmdk\n+  IMAGE/combined-efi.vmdk.zip := grub-config efi | combined efi | grub-install efi | qemu-exsi vmdk -o adapter_type=lsilogic -o subformat=monolithicFlat\n   IMAGE/combined-efi.vhdx := grub-config efi | combined efi | grub-install efi | qemu-image vhdx -o subformat=dynamic\n   ifeq ($(CONFIG_TARGET_IMAGES_GZIP),y)\n-    IMAGES-y := rootfs.img.gz\n     IMAGES-$$(CONFIG_GRUB_IMAGES) += combined.img.gz\n     IMAGES-$$(CONFIG_GRUB_EFI_IMAGES) += combined-efi.img.gz\n   else\n-    IMAGES-y := rootfs.img\n     IMAGES-$$(CONFIG_GRUB_IMAGES) += combined.img\n     IMAGES-$$(CONFIG_GRUB_EFI_IMAGES) += combined-efi.img\n   endif\n@@ -139,8 +135,8 @@ define Device/Default\n     IMAGES-$$(CONFIG_GRUB_EFI_IMAGES) += combined-efi.vdi\n   endif\n   ifeq ($(CONFIG_VMDK_IMAGES),y)\n-    IMAGES-$$(CONFIG_GRUB_IMAGES) += combined.vmdk\n-    IMAGES-$$(CONFIG_GRUB_EFI_IMAGES) += combined-efi.vmdk\n+    IMAGES-$$(CONFIG_GRUB_IMAGES) += combined.vmdk.zip\n+    IMAGES-$$(CONFIG_GRUB_EFI_IMAGES) += combined-efi.vmdk.zip\n   endif\n   ifeq ($(CONFIG_VHDX_IMAGES),y)\n     IMAGES-$$(CONFIG_GRUB_IMAGES) += combined.vhdx\n"
  }
]