From be43a1fb06fc2ef1cc2722c581ee32324fe26e4b Mon Sep 17 00:00:00 2001 From: thl Date: Wed, 19 Jul 2023 11:00:40 +0800 Subject: [PATCH] sync --- 7986.config | 5533 +++++++++++++++++ package/connectivity/conninfra/src/Makefile | 1 - .../connectivity/conninfra/src/conninfra.o | Bin 908096 -> 0 bytes package/{connectivity => }/conninfra/Makefile | 5 +- package/conninfra/src/Makefile | 66 + package/conninfra/src/NOTICE | 202 + .../conninfra/src/base/include/msg_thread.h | 141 + package/conninfra/src/base/include/osal.h | 399 ++ package/conninfra/src/base/include/ring.h | 95 + package/conninfra/src/base/msg_thread.c | 716 +++ package/conninfra/src/base/osal.c | 1595 +++++ package/conninfra/src/base/ring.c | 150 + package/conninfra/src/core/conninfra_core.c | 1244 ++++ .../src/core/include/conninfra_core.h | 193 + package/conninfra/src/include/conninfra.h | 216 + package/conninfra/src/platform/consys_hw.c | 663 ++ .../src/platform/consys_hw_plat_data.c | 39 + .../conninfra/src/platform/consys_reg_mng.c | 148 + package/conninfra/src/platform/emi_mng.c | 158 + .../src/platform/include/consys_hw.h | 255 + .../src/platform/include/consys_reg_base.h | 28 + .../src/platform/include/consys_reg_mng.h | 57 + .../src/platform/include/consys_reg_util.h | 174 + .../conninfra/src/platform/include/emi_mng.h | 99 + .../conninfra/src/platform/include/plat_def.h | 31 + .../conninfra/src/platform/include/pmic_mng.h | 110 + .../src/platform/mt7981/include/mt7981.h | 59 + .../mt7981/include/mt7981_consys_reg.h | 132 + .../mt7981/include/mt7981_consys_reg_offset.h | 243 + .../src/platform/mt7981/include/mt7981_emi.h | 72 + .../src/platform/mt7981/include/mt7981_pmic.h | 72 + .../src/platform/mt7981/include/mt7981_pos.h | 63 + .../conninfra/src/platform/mt7981/mt7981.c | 162 + .../src/platform/mt7981/mt7981_consys_reg.c | 172 + .../src/platform/mt7981/mt7981_emi.c | 50 + .../src/platform/mt7981/mt7981_pmic.c | 95 + .../src/platform/mt7981/mt7981_pos.c | 1715 +++++ .../src/platform/mt7986/include/mt7986.h | 59 + .../mt7986/include/mt7986_consys_reg.h | 132 + .../mt7986/include/mt7986_consys_reg_offset.h | 243 + .../src/platform/mt7986/include/mt7986_emi.h | 72 + .../src/platform/mt7986/include/mt7986_pmic.h | 72 + .../src/platform/mt7986/include/mt7986_pos.h | 64 + .../conninfra/src/platform/mt7986/mt7986.c | 163 + .../src/platform/mt7986/mt7986_consys_reg.c | 172 + .../src/platform/mt7986/mt7986_emi.c | 50 + .../src/platform/mt7986/mt7986_pmic.c | 95 + .../src/platform/mt7986/mt7986_pos.c | 2043 ++++++ package/conninfra/src/platform/pmic_mng.c | 145 + package/conninfra/src/src/conninfra.c | 263 + package/conninfra/src/src/conninfra_dev.c | 344 + package/kernel/leds-ws2812b/Makefile | 33 + package/kernel/leds-ws2812b/src/Makefile | 1 + .../kernel/leds-ws2812b/src/leds-ws2812b.c | 240 + package/luci-app-upnp/Makefile | 14 + .../resources/view/status/include/80_upnp.js | 74 + .../luci-static/resources/view/upnp/upnp.js | 215 + package/luci-app-upnp/po/ar/upnp.po | 230 + package/luci-app-upnp/po/bg/upnp.po | 229 + package/luci-app-upnp/po/bn_BD/upnp.po | 229 + package/luci-app-upnp/po/ca/upnp.po | 235 + package/luci-app-upnp/po/cs/upnp.po | 230 + package/luci-app-upnp/po/da/upnp.po | 233 + package/luci-app-upnp/po/de/upnp.po | 233 + package/luci-app-upnp/po/el/upnp.po | 229 + package/luci-app-upnp/po/en/upnp.po | 229 + package/luci-app-upnp/po/es/upnp.po | 233 + package/luci-app-upnp/po/fi/upnp.po | 229 + package/luci-app-upnp/po/fr/upnp.po | 236 + package/luci-app-upnp/po/he/upnp.po | 227 + package/luci-app-upnp/po/hi/upnp.po | 227 + package/luci-app-upnp/po/hu/upnp.po | 233 + package/luci-app-upnp/po/it/upnp.po | 233 + package/luci-app-upnp/po/ja/upnp.po | 233 + package/luci-app-upnp/po/ko/upnp.po | 229 + package/luci-app-upnp/po/mr/upnp.po | 229 + package/luci-app-upnp/po/ms/upnp.po | 227 + package/luci-app-upnp/po/nb_NO/upnp.po | 229 + package/luci-app-upnp/po/pl/upnp.po | 232 + package/luci-app-upnp/po/pt/upnp.po | 234 + package/luci-app-upnp/po/pt_BR/upnp.po | 233 + package/luci-app-upnp/po/ro/upnp.po | 231 + package/luci-app-upnp/po/ru/upnp.po | 235 + package/luci-app-upnp/po/sk/upnp.po | 227 + package/luci-app-upnp/po/sv/upnp.po | 231 + package/luci-app-upnp/po/templates/upnp.pot | 216 + package/luci-app-upnp/po/tr/upnp.po | 231 + package/luci-app-upnp/po/uk/upnp.po | 233 + package/luci-app-upnp/po/vi/upnp.po | 233 + package/luci-app-upnp/po/zh_Hans/upnp.po | 232 + package/luci-app-upnp/po/zh_Hant/upnp.po | 233 + .../root/etc/uci-defaults/40_luci-miniupnp | 10 + .../root/usr/libexec/rpcd/luci.upnp | 155 + .../usr/share/luci/menu.d/luci-app-upnp.json | 13 + .../usr/share/rpcd/acl.d/luci-app-upnp.json | 18 + package/miniupnpd/Makefile | 80 + package/miniupnpd/files/firewall.include | 57 + package/miniupnpd/files/miniupnpd.defaults | 13 + package/miniupnpd/files/miniupnpd.hotplug | 39 + package/miniupnpd/files/miniupnpd.init | 212 + package/miniupnpd/files/upnpd.config | 27 + .../miniupnpd/patches/101-no-ssl-uuid.patch | 23 + .../miniupnpd/patches/102-ipv6-ext-port.patch | 10 + .../patches/103-no-ipv6-autodetection.patch | 27 + .../patches/104-always-libuuid.patch | 20 + .../miniupnpd/patches/105-no_ssdp_warn.patch | 13 + .../106-fix-build-with-linux-kernel-5_0.patch | 111 + ...onditionnaly-use-NFC_UNKNOWN-as-well.patch | 63 + ...ion-fix-in-get_portmappings_in_range.patch | 32 + .../wifi-profile/files/mt7981/l1profile.dat | 18 +- .../files/mt7981/mt7981.dbdc.b0.dat | 4 +- .../files/mt7981/mt7981.dbdc.b1.dat | 4 +- .../901-add-fwnode_get_name.patch | 175 + .../902-export-fwnode-get-name.patch | 10 + .../drivers/leds/led-class-multicolor.c | 203 + .../include/linux/led-class-multicolor.h | 109 + .../841-add-leds-class-multicolor.patch | 30 + .../boot/dts/mediatek/mt7981-360-t7-108M.dts | 4 +- .../dts/mediatek/mt7981-cetron-ct3003.dts | 10 +- .../boot/dts/mediatek/mt7981-cmcc-a10.dts | 285 + .../dts/mediatek/mt7981-cmcc-rax3000m.dts | 14 +- .../boot/dts/mediatek/mt7981-jcg-q30.dts | 19 +- .../dts/mediatek/mt7981-komi-a31-base.dtsi | 2 +- .../boot/dts/mediatek/mt7981-komi-a31.dts | 12 +- .../dts/mediatek/mt7981-xiaomi-wr30u-112M.dts | 2 +- .../mediatek/mt7981-xiaomi-wr30u-base.dtsi | 10 +- .../dts/mediatek/mt7986a-tl-xdr-common.dtsi | 347 ++ .../boot/dts/mediatek/mt7986a-tl-xdr6086.dts | 8 + .../boot/dts/mediatek/mt7986a-tl-xdr6088.dts | 8 + ...7986a-xiaomi-redmi-router-ax6000-uboot.dts | 375 ++ .../mt7986a-xiaomi-redmi-router-ax6000.dts | 351 ++ .../drivers/net/ethernet/mediatek/Kconfig | 7 + .../drivers/net/ethernet/mediatek/Makefile | 1 + .../net/ethernet/mediatek/mtk_eth_soc.c | 271 +- .../net/ethernet/mediatek/mtk_eth_soc.h | 19 + .../net/ethernet/mediatek/rtl822x/Makefile | 4 + .../ethernet/mediatek/rtl822x/nic_rtl8226b.c | 2699 ++++++++ .../ethernet/mediatek/rtl822x/nic_rtl8226b.h | 336 + .../mediatek/rtl822x/nic_rtl8226b_init.c | 1642 +++++ .../mediatek/rtl822x/nic_rtl8226b_init.h | 16 + .../mediatek/rtl822x/rtl8226_typedef.h | 302 + .../ethernet/mediatek/rtl822x/rtl_adapter.c | 42 + .../ethernet/mediatek/rtl822x/rtl_adapter.h | 40 + target/linux/mediatek/image/mt7986.mk | 55 + .../mt7981/base-files/etc/board.d/02_network | 2 +- target/linux/mediatek/mt7981/config-5.4 | 1 + .../mt7986/base-files/etc/board.d/01_leds | 21 + .../mt7986/base-files/etc/board.d/02_network | 68 +- .../mt7986/base-files/etc/init.d/bootcount | 17 + target/linux/mediatek/mt7986/config-5.4 | 4 + .../patches-5.4/751-m7531-ext-irq.patch | 272 + .../930-spi-mt65xx-enable-sel-clk.patch | 15 + 152 files changed, 36199 insertions(+), 48 deletions(-) create mode 100644 7986.config delete mode 100644 package/connectivity/conninfra/src/Makefile delete mode 100644 package/connectivity/conninfra/src/conninfra.o rename package/{connectivity => }/conninfra/Makefile (96%) create mode 100644 package/conninfra/src/Makefile create mode 100644 package/conninfra/src/NOTICE create mode 100644 package/conninfra/src/base/include/msg_thread.h create mode 100644 package/conninfra/src/base/include/osal.h create mode 100644 package/conninfra/src/base/include/ring.h create mode 100644 package/conninfra/src/base/msg_thread.c create mode 100644 package/conninfra/src/base/osal.c create mode 100644 package/conninfra/src/base/ring.c create mode 100644 package/conninfra/src/core/conninfra_core.c create mode 100644 package/conninfra/src/core/include/conninfra_core.h create mode 100644 package/conninfra/src/include/conninfra.h create mode 100644 package/conninfra/src/platform/consys_hw.c create mode 100644 package/conninfra/src/platform/consys_hw_plat_data.c create mode 100644 package/conninfra/src/platform/consys_reg_mng.c create mode 100644 package/conninfra/src/platform/emi_mng.c create mode 100644 package/conninfra/src/platform/include/consys_hw.h create mode 100644 package/conninfra/src/platform/include/consys_reg_base.h create mode 100644 package/conninfra/src/platform/include/consys_reg_mng.h create mode 100644 package/conninfra/src/platform/include/consys_reg_util.h create mode 100644 package/conninfra/src/platform/include/emi_mng.h create mode 100644 package/conninfra/src/platform/include/plat_def.h create mode 100644 package/conninfra/src/platform/include/pmic_mng.h create mode 100644 package/conninfra/src/platform/mt7981/include/mt7981.h create mode 100644 package/conninfra/src/platform/mt7981/include/mt7981_consys_reg.h create mode 100644 package/conninfra/src/platform/mt7981/include/mt7981_consys_reg_offset.h create mode 100644 package/conninfra/src/platform/mt7981/include/mt7981_emi.h create mode 100644 package/conninfra/src/platform/mt7981/include/mt7981_pmic.h create mode 100644 package/conninfra/src/platform/mt7981/include/mt7981_pos.h create mode 100644 package/conninfra/src/platform/mt7981/mt7981.c create mode 100644 package/conninfra/src/platform/mt7981/mt7981_consys_reg.c create mode 100644 package/conninfra/src/platform/mt7981/mt7981_emi.c create mode 100644 package/conninfra/src/platform/mt7981/mt7981_pmic.c create mode 100644 package/conninfra/src/platform/mt7981/mt7981_pos.c create mode 100644 package/conninfra/src/platform/mt7986/include/mt7986.h create mode 100644 package/conninfra/src/platform/mt7986/include/mt7986_consys_reg.h create mode 100644 package/conninfra/src/platform/mt7986/include/mt7986_consys_reg_offset.h create mode 100644 package/conninfra/src/platform/mt7986/include/mt7986_emi.h create mode 100644 package/conninfra/src/platform/mt7986/include/mt7986_pmic.h create mode 100644 package/conninfra/src/platform/mt7986/include/mt7986_pos.h create mode 100644 package/conninfra/src/platform/mt7986/mt7986.c create mode 100644 package/conninfra/src/platform/mt7986/mt7986_consys_reg.c create mode 100644 package/conninfra/src/platform/mt7986/mt7986_emi.c create mode 100644 package/conninfra/src/platform/mt7986/mt7986_pmic.c create mode 100644 package/conninfra/src/platform/mt7986/mt7986_pos.c create mode 100644 package/conninfra/src/platform/pmic_mng.c create mode 100644 package/conninfra/src/src/conninfra.c create mode 100644 package/conninfra/src/src/conninfra_dev.c create mode 100644 package/kernel/leds-ws2812b/Makefile create mode 100644 package/kernel/leds-ws2812b/src/Makefile create mode 100644 package/kernel/leds-ws2812b/src/leds-ws2812b.c create mode 100644 package/luci-app-upnp/Makefile create mode 100644 package/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js create mode 100644 package/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js create mode 100644 package/luci-app-upnp/po/ar/upnp.po create mode 100644 package/luci-app-upnp/po/bg/upnp.po create mode 100644 package/luci-app-upnp/po/bn_BD/upnp.po create mode 100644 package/luci-app-upnp/po/ca/upnp.po create mode 100644 package/luci-app-upnp/po/cs/upnp.po create mode 100644 package/luci-app-upnp/po/da/upnp.po create mode 100644 package/luci-app-upnp/po/de/upnp.po create mode 100644 package/luci-app-upnp/po/el/upnp.po create mode 100644 package/luci-app-upnp/po/en/upnp.po create mode 100644 package/luci-app-upnp/po/es/upnp.po create mode 100644 package/luci-app-upnp/po/fi/upnp.po create mode 100644 package/luci-app-upnp/po/fr/upnp.po create mode 100644 package/luci-app-upnp/po/he/upnp.po create mode 100644 package/luci-app-upnp/po/hi/upnp.po create mode 100644 package/luci-app-upnp/po/hu/upnp.po create mode 100644 package/luci-app-upnp/po/it/upnp.po create mode 100644 package/luci-app-upnp/po/ja/upnp.po create mode 100644 package/luci-app-upnp/po/ko/upnp.po create mode 100644 package/luci-app-upnp/po/mr/upnp.po create mode 100644 package/luci-app-upnp/po/ms/upnp.po create mode 100644 package/luci-app-upnp/po/nb_NO/upnp.po create mode 100644 package/luci-app-upnp/po/pl/upnp.po create mode 100644 package/luci-app-upnp/po/pt/upnp.po create mode 100644 package/luci-app-upnp/po/pt_BR/upnp.po create mode 100644 package/luci-app-upnp/po/ro/upnp.po create mode 100644 package/luci-app-upnp/po/ru/upnp.po create mode 100644 package/luci-app-upnp/po/sk/upnp.po create mode 100644 package/luci-app-upnp/po/sv/upnp.po create mode 100644 package/luci-app-upnp/po/templates/upnp.pot create mode 100644 package/luci-app-upnp/po/tr/upnp.po create mode 100644 package/luci-app-upnp/po/uk/upnp.po create mode 100644 package/luci-app-upnp/po/vi/upnp.po create mode 100644 package/luci-app-upnp/po/zh_Hans/upnp.po create mode 100644 package/luci-app-upnp/po/zh_Hant/upnp.po create mode 100755 package/luci-app-upnp/root/etc/uci-defaults/40_luci-miniupnp create mode 100755 package/luci-app-upnp/root/usr/libexec/rpcd/luci.upnp create mode 100644 package/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json create mode 100644 package/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json create mode 100644 package/miniupnpd/Makefile create mode 100644 package/miniupnpd/files/firewall.include create mode 100644 package/miniupnpd/files/miniupnpd.defaults create mode 100644 package/miniupnpd/files/miniupnpd.hotplug create mode 100644 package/miniupnpd/files/miniupnpd.init create mode 100644 package/miniupnpd/files/upnpd.config create mode 100644 package/miniupnpd/patches/101-no-ssl-uuid.patch create mode 100644 package/miniupnpd/patches/102-ipv6-ext-port.patch create mode 100644 package/miniupnpd/patches/103-no-ipv6-autodetection.patch create mode 100644 package/miniupnpd/patches/104-always-libuuid.patch create mode 100644 package/miniupnpd/patches/105-no_ssdp_warn.patch create mode 100644 package/miniupnpd/patches/106-fix-build-with-linux-kernel-5_0.patch create mode 100644 package/miniupnpd/patches/107-conditionnaly-use-NFC_UNKNOWN-as-well.patch create mode 100644 package/miniupnpd/patches/108-memory-allocation-fix-in-get_portmappings_in_range.patch create mode 100644 target/linux/generic/backport-5.4/901-add-fwnode_get_name.patch create mode 100644 target/linux/generic/backport-5.4/902-export-fwnode-get-name.patch create mode 100644 target/linux/generic/files-5.4/drivers/leds/led-class-multicolor.c create mode 100644 target/linux/generic/files/include/linux/led-class-multicolor.h create mode 100644 target/linux/generic/pending-5.4/841-add-leds-class-multicolor.patch create mode 100644 target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-cmcc-a10.dts create mode 100755 target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-tl-xdr-common.dtsi create mode 100644 target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-tl-xdr6086.dts create mode 100644 target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-tl-xdr6088.dts create mode 100755 target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-xiaomi-redmi-router-ax6000-uboot.dts create mode 100755 target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-xiaomi-redmi-router-ax6000.dts create mode 100755 target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/Makefile create mode 100755 target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/nic_rtl8226b.c create mode 100755 target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/nic_rtl8226b.h create mode 100755 target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/nic_rtl8226b_init.c create mode 100755 target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/nic_rtl8226b_init.h create mode 100755 target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/rtl8226_typedef.h create mode 100755 target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/rtl_adapter.c create mode 100755 target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/rtl_adapter.h create mode 100755 target/linux/mediatek/mt7986/base-files/etc/board.d/01_leds create mode 100755 target/linux/mediatek/mt7986/base-files/etc/init.d/bootcount create mode 100644 target/linux/mediatek/patches-5.4/751-m7531-ext-irq.patch create mode 100644 target/linux/mediatek/patches-5.4/930-spi-mt65xx-enable-sel-clk.patch diff --git a/7986.config b/7986.config new file mode 100644 index 0000000..5afc948 --- /dev/null +++ b/7986.config @@ -0,0 +1,5533 @@ +# +# Automatically generated file; DO NOT EDIT. +# OpenWrt Configuration +# +CONFIG_MODULES=y +CONFIG_HAVE_DOT_CONFIG=y +# CONFIG_TARGET_sunxi is not set +# CONFIG_TARGET_apm821xx is not set +# CONFIG_TARGET_ath25 is not set +# CONFIG_TARGET_ath79 is not set +# CONFIG_TARGET_bcm27xx is not set +# CONFIG_TARGET_bcm53xx is not set +# CONFIG_TARGET_bcm47xx is not set +# CONFIG_TARGET_bcm4908 is not set +# CONFIG_TARGET_bcm63xx is not set +# CONFIG_TARGET_octeon is not set +# CONFIG_TARGET_gemini is not set +# CONFIG_TARGET_mpc85xx is not set +# CONFIG_TARGET_imx6 is not set +# CONFIG_TARGET_mxs is not set +# CONFIG_TARGET_lantiq is not set +# CONFIG_TARGET_malta is not set +# CONFIG_TARGET_pistachio is not set +# CONFIG_TARGET_mvebu is not set +# CONFIG_TARGET_kirkwood is not set +CONFIG_TARGET_mediatek=y +# CONFIG_TARGET_ramips is not set +# CONFIG_TARGET_at91 is not set +# CONFIG_TARGET_tegra is not set +# CONFIG_TARGET_layerscape is not set +# CONFIG_TARGET_octeontx is not set +# CONFIG_TARGET_oxnas is not set +# CONFIG_TARGET_armvirt is not set +# CONFIG_TARGET_ipq40xx is not set +# CONFIG_TARGET_ipq806x is not set +# CONFIG_TARGET_realtek is not set +# CONFIG_TARGET_rockchip is not set +# CONFIG_TARGET_arc770 is not set +# CONFIG_TARGET_archs38 is not set +# CONFIG_TARGET_omap is not set +# CONFIG_TARGET_uml is not set +# CONFIG_TARGET_zynq is not set +# CONFIG_TARGET_x86 is not set +# CONFIG_TARGET_mediatek_mt7622 is not set +# CONFIG_TARGET_mediatek_mt7623 is not set +# CONFIG_TARGET_mediatek_mt7629 is not set +CONFIG_TARGET_mediatek_mt7986=y +# CONFIG_TARGET_mediatek_mt7981 is not set +CONFIG_TARGET_MULTI_PROFILE=y +# CONFIG_TARGET_mediatek_mt7986_Default is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986a-ax6000-spim-nor-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986a-ax6000-spim-nand-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986a-ax8400-spim-nand-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986a-ax6000-snfi-nand-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986a-ax6000-emmc-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986a-ax7800-emmc-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986a-ax6000-2500wan-spim-nor-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986a-ax6000-2500wan-spim-nand-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986a-ax6000-2500wan-gsw-spim-nand-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986a-ax6000-2500wan-sd-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986a-ax8400-2500wan-spim-nand-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986a-ax7800-spim-nor-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986a-ax7800-spim-nand-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986a-ax7800-2500wan-spim-nor-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986a-ax7800-2500wan-spim-nand-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986b-ax6000-spim-nor-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986b-ax6000-spim-nand-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986b-ax6000-snfi-nand-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986b-ax6000-emmc-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986b-ax6000-2500wan-spim-nor-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986b-ax6000-2500wan-spim-nand-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986b-ax6000-2500wan-gsw-spim-nand-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986b-ax6000-2500wan-snfi-nand-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mt7986b-ax6000-2500wan-sd-rfb is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mediatek_mt7986-fpga is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_mediatek_mt7986-fpga-ubi is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_xiaomi_redmi-router-ax6000-uboot is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_xiaomi_redmi-router-ax6000 is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_tplink_tl-xdr6086 is not set +# CONFIG_TARGET_mediatek_mt7986_DEVICE_tplink_tl-xdr6088 is not set + +# +# Target Devices +# +# CONFIG_TARGET_ALL_PROFILES is not set +# CONFIG_TARGET_PER_DEVICE_ROOTFS is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986a-ax6000-2500wan-gsw-spim-nand-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986a-ax6000-2500wan-sd-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986a-ax6000-2500wan-spim-nand-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986a-ax6000-2500wan-spim-nor-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986a-ax6000-emmc-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986a-ax6000-snfi-nand-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986a-ax6000-spim-nand-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986a-ax6000-spim-nor-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986a-ax7800-2500wan-spim-nand-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986a-ax7800-2500wan-spim-nor-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986a-ax7800-emmc-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986a-ax7800-spim-nand-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986a-ax7800-spim-nor-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986a-ax8400-2500wan-spim-nand-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986a-ax8400-spim-nand-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986b-ax6000-2500wan-gsw-spim-nand-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986b-ax6000-2500wan-sd-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986b-ax6000-2500wan-snfi-nand-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986b-ax6000-2500wan-spim-nand-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986b-ax6000-2500wan-spim-nor-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986b-ax6000-emmc-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986b-ax6000-snfi-nand-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986b-ax6000-spim-nand-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mt7986b-ax6000-spim-nor-rfb is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mediatek_mt7986-fpga is not set +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_mediatek_mt7986-fpga-ubi is not set +CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_tplink_tl-xdr6086=y +CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_tplink_tl-xdr6088=y +# CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_xiaomi_redmi-router-ax6000 is not set +CONFIG_TARGET_DEVICE_mediatek_mt7986_DEVICE_xiaomi_redmi-router-ax6000-uboot=y +# end of Target Devices + +CONFIG_HAS_SUBTARGETS=y +CONFIG_HAS_DEVICES=y +CONFIG_TARGET_BOARD="mediatek" +CONFIG_TARGET_SUBTARGET="mt7986" +CONFIG_TARGET_ARCH_PACKAGES="aarch64_cortex-a53" +CONFIG_DEFAULT_TARGET_OPTIMIZATION="-Os -pipe -mcpu=cortex-a53" +CONFIG_CPU_TYPE="cortex-a53" +CONFIG_LINUX_5_4=y +CONFIG_DEFAULT_autocore-arm=y +CONFIG_DEFAULT_base-files=y +CONFIG_DEFAULT_bash=y +CONFIG_DEFAULT_busybox=y +CONFIG_DEFAULT_ca-bundle=y +CONFIG_DEFAULT_dnsmasq=y +CONFIG_DEFAULT_dropbear=y +CONFIG_DEFAULT_firewall=y +CONFIG_DEFAULT_fstools=y +CONFIG_DEFAULT_ip6tables=y +CONFIG_DEFAULT_iptables=y +CONFIG_DEFAULT_ipv6helper=y +CONFIG_DEFAULT_kmod-conninfra=y +CONFIG_DEFAULT_kmod-gpio-button-hotplug=y +CONFIG_DEFAULT_kmod-ipt-offload=y +CONFIG_DEFAULT_kmod-leds-gpio=y +CONFIG_DEFAULT_kmod-leds-ws2812b=y +CONFIG_DEFAULT_kmod-mediatek_hnat=y +CONFIG_DEFAULT_kmod-mt_wifi=y +CONFIG_DEFAULT_kmod-warp=y +CONFIG_DEFAULT_l1profile=y +CONFIG_DEFAULT_libc=y +CONFIG_DEFAULT_libgcc=y +CONFIG_DEFAULT_libustream-wolfssl=y +CONFIG_DEFAULT_logd=y +CONFIG_DEFAULT_luci-app-mtk=y +CONFIG_DEFAULT_mtd=y +CONFIG_DEFAULT_mtkhnat_util=y +CONFIG_DEFAULT_netifd=y +CONFIG_DEFAULT_odhcp6c=y +CONFIG_DEFAULT_odhcpd-ipv6only=y +CONFIG_DEFAULT_opkg=y +CONFIG_DEFAULT_ppp=y +CONFIG_DEFAULT_ppp-mod-pppoe=y +CONFIG_DEFAULT_procd=y +CONFIG_DEFAULT_uci=y +CONFIG_DEFAULT_uclient-fetch=y +CONFIG_DEFAULT_urandom-seed=y +CONFIG_DEFAULT_urngd=y +CONFIG_DEFAULT_wireless-tools=y +CONFIG_AUDIO_SUPPORT=y +CONFIG_GPIO_SUPPORT=y +CONFIG_PCI_SUPPORT=y +CONFIG_USB_SUPPORT=y +CONFIG_RTC_SUPPORT=y +CONFIG_USES_DEVICETREE=y +CONFIG_USES_INITRAMFS=y +CONFIG_USES_SQUASHFS=y +CONFIG_NAND_SUPPORT=y +CONFIG_ARCH_64BIT=y +CONFIG_aarch64=y +CONFIG_ARCH="aarch64" + +# +# Target Images +# +CONFIG_TARGET_ROOTFS_INITRAMFS=y +CONFIG_TARGET_INITRAMFS_COMPRESSION_NONE=y +# CONFIG_TARGET_INITRAMFS_COMPRESSION_GZIP is not set +# CONFIG_TARGET_INITRAMFS_COMPRESSION_BZIP2 is not set +# CONFIG_TARGET_INITRAMFS_COMPRESSION_LZMA is not set +# CONFIG_TARGET_INITRAMFS_COMPRESSION_LZO is not set +# CONFIG_TARGET_INITRAMFS_COMPRESSION_LZ4 is not set +# CONFIG_TARGET_INITRAMFS_COMPRESSION_XZ is not set +CONFIG_EXTERNAL_CPIO="" +# CONFIG_TARGET_INITRAMFS_FORCE is not set + +# +# Root filesystem archives +# +# CONFIG_TARGET_ROOTFS_CPIOGZ is not set +# CONFIG_TARGET_ROOTFS_TARGZ is not set + +# +# Root filesystem images +# +# CONFIG_TARGET_ROOTFS_EXT4FS is not set +CONFIG_TARGET_ROOTFS_SQUASHFS=y +CONFIG_TARGET_SQUASHFS_BLOCK_SIZE=256 +CONFIG_TARGET_UBIFS_FREE_SPACE_FIXUP=y +CONFIG_TARGET_UBIFS_JOURNAL_SIZE="" + +# +# Image Options +# +# end of Target Images + +# CONFIG_EXPERIMENTAL is not set + +# +# Global build settings +# +# CONFIG_JSON_OVERVIEW_IMAGE_INFO is not set +# CONFIG_ALL_NONSHARED is not set +# CONFIG_ALL_KMODS is not set +# CONFIG_ALL is not set +# CONFIG_BUILDBOT is not set +CONFIG_SIGNED_PACKAGES=y +# CONFIG_SIGNATURE_CHECK is not set + +# +# General build options +# +# CONFIG_DISPLAY_SUPPORT is not set +# CONFIG_BUILD_PATENTED is not set +# CONFIG_BUILD_NLS is not set +CONFIG_SHADOW_PASSWORDS=y +# CONFIG_CLEAN_IPKG is not set +# CONFIG_IPK_FILES_CHECKSUMS is not set +# CONFIG_INCLUDE_CONFIG is not set +# CONFIG_REPRODUCIBLE_DEBUG_INFO is not set +# CONFIG_COLLECT_KERNEL_DEBUG is not set + +# +# Kernel build options +# +CONFIG_KERNEL_BUILD_USER="" +CONFIG_KERNEL_BUILD_DOMAIN="" +CONFIG_KERNEL_PRINTK=y +CONFIG_KERNEL_CRASHLOG=y +CONFIG_KERNEL_SWAP=y +# CONFIG_KERNEL_PROC_STRIPPED is not set +CONFIG_KERNEL_DEBUG_FS=y +# CONFIG_KERNEL_ARM_PMU is not set +# CONFIG_KERNEL_PERF_EVENTS is not set +# CONFIG_KERNEL_PROFILING is not set +# CONFIG_KERNEL_UBSAN is not set +# CONFIG_KERNEL_KASAN is not set +# CONFIG_KERNEL_KCOV is not set +# CONFIG_KERNEL_TASKSTATS is not set +CONFIG_KERNEL_KALLSYMS=y +# CONFIG_KERNEL_FTRACE is not set +CONFIG_KERNEL_DEBUG_KERNEL=y +CONFIG_KERNEL_DEBUG_INFO=y +# CONFIG_KERNEL_DYNAMIC_DEBUG is not set +# CONFIG_KERNEL_KPROBES is not set +CONFIG_KERNEL_AIO=y +CONFIG_KERNEL_IO_URING=y +CONFIG_KERNEL_FHANDLE=y +CONFIG_KERNEL_FANOTIFY=y +# CONFIG_KERNEL_BLK_DEV_BSG is not set +# CONFIG_KERNEL_HUGETLB_PAGE is not set +CONFIG_KERNEL_MAGIC_SYSRQ=y +# CONFIG_KERNEL_DEBUG_PINCTRL is not set +# CONFIG_KERNEL_DEBUG_GPIO is not set +CONFIG_KERNEL_COREDUMP=y +CONFIG_KERNEL_ELF_CORE=y +# CONFIG_KERNEL_PROVE_LOCKING is not set +# CONFIG_KERNEL_SOFTLOCKUP_DETECTOR is not set +# CONFIG_KERNEL_DETECT_HUNG_TASK is not set +# CONFIG_KERNEL_WQ_WATCHDOG is not set +# CONFIG_KERNEL_DEBUG_ATOMIC_SLEEP is not set +# CONFIG_KERNEL_DEBUG_VM is not set +CONFIG_KERNEL_PRINTK_TIME=y +# CONFIG_KERNEL_SLABINFO is not set +# CONFIG_KERNEL_PROC_PAGE_MONITOR is not set +# CONFIG_KERNEL_KEXEC is not set +# CONFIG_USE_RFKILL is not set +# CONFIG_USE_SPARSE is not set +# CONFIG_KERNEL_DEVTMPFS is not set +CONFIG_KERNEL_KEYS=y +# CONFIG_KERNEL_PERSISTENT_KEYRINGS is not set +# CONFIG_KERNEL_KEYS_REQUEST_CACHE is not set +# CONFIG_KERNEL_BIG_KEYS is not set +CONFIG_KERNEL_CGROUPS=y +# CONFIG_KERNEL_CGROUP_DEBUG is not set +CONFIG_KERNEL_FREEZER=y +# CONFIG_KERNEL_CGROUP_FREEZER is not set +# CONFIG_KERNEL_CGROUP_DEVICE is not set +# CONFIG_KERNEL_CGROUP_HUGETLB is not set +CONFIG_KERNEL_CGROUP_PIDS=y +CONFIG_KERNEL_CGROUP_RDMA=y +CONFIG_KERNEL_CGROUP_BPF=y +CONFIG_KERNEL_CPUSETS=y +# CONFIG_KERNEL_PROC_PID_CPUSET is not set +CONFIG_KERNEL_CGROUP_CPUACCT=y +CONFIG_KERNEL_RESOURCE_COUNTERS=y +CONFIG_KERNEL_MM_OWNER=y +CONFIG_KERNEL_MEMCG=y +CONFIG_KERNEL_MEMCG_SWAP=y +# CONFIG_KERNEL_MEMCG_SWAP_ENABLED is not set +CONFIG_KERNEL_MEMCG_KMEM=y +# CONFIG_KERNEL_CGROUP_PERF is not set +CONFIG_KERNEL_CGROUP_SCHED=y +CONFIG_KERNEL_FAIR_GROUP_SCHED=y +CONFIG_KERNEL_CFS_BANDWIDTH=y +CONFIG_KERNEL_RT_GROUP_SCHED=y +CONFIG_KERNEL_BLK_CGROUP=y +# CONFIG_KERNEL_CFQ_GROUP_IOSCHED is not set +CONFIG_KERNEL_BLK_DEV_THROTTLING=y +# CONFIG_KERNEL_BLK_DEV_THROTTLING_LOW is not set +# CONFIG_KERNEL_DEBUG_BLK_CGROUP is not set +# CONFIG_KERNEL_NET_CLS_CGROUP is not set +# CONFIG_KERNEL_CGROUP_NET_CLASSID is not set +# CONFIG_KERNEL_CGROUP_NET_PRIO is not set +CONFIG_KERNEL_NAMESPACES=y +CONFIG_KERNEL_UTS_NS=y +CONFIG_KERNEL_IPC_NS=y +CONFIG_KERNEL_USER_NS=y +CONFIG_KERNEL_PID_NS=y +CONFIG_KERNEL_NET_NS=y +CONFIG_KERNEL_DEVPTS_MULTIPLE_INSTANCES=y +CONFIG_KERNEL_POSIX_MQUEUE=y +CONFIG_KERNEL_SECCOMP_FILTER=y +CONFIG_KERNEL_SECCOMP=y +CONFIG_KERNEL_IP_MROUTE=y +CONFIG_KERNEL_IPV6=y +CONFIG_KERNEL_IPV6_MULTIPLE_TABLES=y +CONFIG_KERNEL_IPV6_SUBTREES=y +CONFIG_KERNEL_IPV6_MROUTE=y +# CONFIG_KERNEL_IPV6_PIMSM_V2 is not set +CONFIG_KERNEL_IPV6_SEG6_LWTUNNEL=y +# CONFIG_KERNEL_LWTUNNEL_BPF is not set +# CONFIG_KERNEL_IP_PNP is not set + +# +# Filesystem ACL and attr support options +# +# CONFIG_USE_FS_ACL_ATTR is not set +# CONFIG_KERNEL_FS_POSIX_ACL is not set +# CONFIG_KERNEL_BTRFS_FS_POSIX_ACL is not set +# CONFIG_KERNEL_EXT4_FS_POSIX_ACL is not set +# CONFIG_KERNEL_F2FS_FS_POSIX_ACL is not set +# CONFIG_KERNEL_JFFS2_FS_POSIX_ACL is not set +# CONFIG_KERNEL_TMPFS_POSIX_ACL is not set +# CONFIG_KERNEL_CIFS_ACL is not set +# CONFIG_KERNEL_HFS_FS_POSIX_ACL is not set +# CONFIG_KERNEL_HFSPLUS_FS_POSIX_ACL is not set +# CONFIG_KERNEL_NFS_ACL_SUPPORT is not set +# CONFIG_KERNEL_NFS_V3_ACL_SUPPORT is not set +# CONFIG_KERNEL_NFSD_V2_ACL_SUPPORT is not set +# CONFIG_KERNEL_NFSD_V3_ACL_SUPPORT is not set +# CONFIG_KERNEL_REISER_FS_POSIX_ACL is not set +# CONFIG_KERNEL_XFS_POSIX_ACL is not set +# CONFIG_KERNEL_JFS_POSIX_ACL is not set +# end of Filesystem ACL and attr support options + +CONFIG_KERNEL_DEVMEM=y +# CONFIG_KERNEL_DEVKMEM is not set +CONFIG_KERNEL_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +# CONFIG_KERNEL_SQUASHFS_XATTR is not set +CONFIG_KERNEL_CC_OPTIMIZE_FOR_PERFORMANCE=y +# CONFIG_KERNEL_CC_OPTIMIZE_FOR_SIZE is not set +# CONFIG_KERNEL_AUDIT is not set +# CONFIG_KERNEL_SECURITY is not set +# CONFIG_KERNEL_SECURITY_NETWORK is not set +# CONFIG_KERNEL_SECURITY_SELINUX is not set +# CONFIG_KERNEL_EXT4_FS_SECURITY is not set +# CONFIG_KERNEL_F2FS_FS_SECURITY is not set +# CONFIG_KERNEL_UBIFS_FS_SECURITY is not set +# CONFIG_KERNEL_JFFS2_FS_SECURITY is not set +# end of Kernel build options + +# +# Package build options +# +# CONFIG_DEBUG is not set +CONFIG_IPV6=y + +# +# Stripping options +# +# CONFIG_NO_STRIP is not set +# CONFIG_USE_STRIP is not set +CONFIG_USE_SSTRIP=y +CONFIG_SSTRIP_ARGS="-z" +# CONFIG_STRIP_KERNEL_EXPORTS is not set +# CONFIG_USE_MKLIBS is not set + +# +# Hardening build options +# +CONFIG_PKG_CHECK_FORMAT_SECURITY=y +# CONFIG_PKG_ASLR_PIE_NONE is not set +CONFIG_PKG_ASLR_PIE_REGULAR=y +# CONFIG_PKG_ASLR_PIE_ALL is not set +# CONFIG_PKG_CC_STACKPROTECTOR_NONE is not set +CONFIG_PKG_CC_STACKPROTECTOR_REGULAR=y +# CONFIG_PKG_CC_STACKPROTECTOR_STRONG is not set +# CONFIG_KERNEL_CC_STACKPROTECTOR_NONE is not set +CONFIG_KERNEL_CC_STACKPROTECTOR_REGULAR=y +# CONFIG_KERNEL_CC_STACKPROTECTOR_STRONG is not set +CONFIG_KERNEL_STACKPROTECTOR=y +# CONFIG_KERNEL_STACKPROTECTOR_STRONG is not set +# CONFIG_PKG_FORTIFY_SOURCE_NONE is not set +CONFIG_PKG_FORTIFY_SOURCE_1=y +# CONFIG_PKG_FORTIFY_SOURCE_2 is not set +# CONFIG_PKG_RELRO_NONE is not set +# CONFIG_PKG_RELRO_PARTIAL is not set +CONFIG_PKG_RELRO_FULL=y +# CONFIG_SELINUX is not set +# end of Global build settings + +# CONFIG_DEVEL is not set +# CONFIG_BROKEN is not set +CONFIG_BINARY_FOLDER="" +CONFIG_DOWNLOAD_FOLDER="" +CONFIG_LOCALMIRROR="" +CONFIG_AUTOREBUILD=y +# CONFIG_AUTOREMOVE is not set +CONFIG_BUILD_SUFFIX="" +CONFIG_TARGET_ROOTFS_DIR="" +# CONFIG_CCACHE is not set +CONFIG_CCACHE_DIR="" +CONFIG_KERNEL_CFLAGS="" +CONFIG_EXTERNAL_KERNEL_TREE="" +CONFIG_KERNEL_GIT_CLONE_URI="" +CONFIG_BUILD_LOG_DIR="" +CONFIG_EXTRA_OPTIMIZATION="-fno-caller-saves -fno-plt" +CONFIG_TARGET_OPTIMIZATION="-Os -pipe -mcpu=cortex-a53" +# CONFIG_EXTRA_TARGET_ARCH is not set +CONFIG_EXTRA_BINUTILS_CONFIG_OPTIONS="" +CONFIG_EXTRA_GCC_CONFIG_OPTIONS="" +# CONFIG_GCC_DEFAULT_PIE is not set +# CONFIG_GCC_DEFAULT_SSP is not set +# CONFIG_SJLJ_EXCEPTIONS is not set +# CONFIG_INSTALL_GFORTRAN is not set +CONFIG_GDB=y +CONFIG_USE_MUSL=y +CONFIG_SSP_SUPPORT=y +CONFIG_BINUTILS_VERSION_2_34=y +CONFIG_BINUTILS_VERSION="2.34" +CONFIG_GCC_VERSION="8.4.0" +# CONFIG_GCC_USE_IREMAP is not set +CONFIG_LIBC="musl" +CONFIG_TARGET_SUFFIX="musl" +# CONFIG_IB is not set +# CONFIG_SDK is not set +# CONFIG_MAKE_TOOLCHAIN is not set +# CONFIG_IMAGEOPT is not set +# CONFIG_PREINITOPT is not set +CONFIG_TARGET_PREINIT_SUPPRESS_STDERR=y +# CONFIG_TARGET_PREINIT_DISABLE_FAILSAFE is not set +CONFIG_TARGET_PREINIT_TIMEOUT=2 +# CONFIG_TARGET_PREINIT_SHOW_NETMSG is not set +# CONFIG_TARGET_PREINIT_SUPPRESS_FAILSAFE_NETMSG is not set +CONFIG_TARGET_PREINIT_IFNAME="" +CONFIG_TARGET_PREINIT_IP="192.168.1.1" +CONFIG_TARGET_PREINIT_NETMASK="255.255.255.0" +CONFIG_TARGET_PREINIT_BROADCAST="192.168.1.255" +# CONFIG_INITOPT is not set +CONFIG_TARGET_INIT_PATH="/usr/sbin:/usr/bin:/sbin:/bin" +CONFIG_TARGET_INIT_ENV="" +CONFIG_TARGET_INIT_CMD="/sbin/init" +CONFIG_TARGET_INIT_SUPPRESS_STDERR=y +# CONFIG_VERSIONOPT is not set +CONFIG_PER_FEED_REPO=y +CONFIG_FEED_packages=y +CONFIG_FEED_luci=y +CONFIG_FEED_routing=y +CONFIG_FEED_telephony=y +CONFIG_FEED_mtk_openwrt_feed=y +CONFIG_FEED_gl_feed_common=y +CONFIG_FEED_gl_feed_21_02=y +CONFIG_FEED_gl_feed_mtk=y + +# +# Base system +# +CONFIG_PACKAGE_base-files=y +CONFIG_PACKAGE_block-mount=y +# CONFIG_PACKAGE_blockd is not set +CONFIG_PACKAGE_busybox=y +CONFIG_BUSYBOX_CUSTOM=y +CONFIG_BUSYBOX_DEFAULT_HAVE_DOT_CONFIG=y +# CONFIG_BUSYBOX_DEFAULT_DESKTOP is not set +# CONFIG_BUSYBOX_DEFAULT_EXTRA_COMPAT is not set +# CONFIG_BUSYBOX_DEFAULT_FEDORA_COMPAT is not set +CONFIG_BUSYBOX_DEFAULT_INCLUDE_SUSv2=y +CONFIG_BUSYBOX_DEFAULT_LONG_OPTS=y +CONFIG_BUSYBOX_DEFAULT_SHOW_USAGE=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_VERBOSE_USAGE=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_COMPRESS_USAGE is not set +CONFIG_BUSYBOX_DEFAULT_LFS=y +# CONFIG_BUSYBOX_DEFAULT_PAM is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_DEVPTS=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_UTMP is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_WTMP is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_PIDFILE=y +CONFIG_BUSYBOX_DEFAULT_PID_FILE_PATH="/var/run" +# CONFIG_BUSYBOX_DEFAULT_BUSYBOX is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SHOW_SCRIPT is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSTALLER is not set +# CONFIG_BUSYBOX_DEFAULT_INSTALL_NO_USR is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SUID is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SUID_CONFIG is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SUID_CONFIG_QUIET is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_PREFER_APPLETS=y +CONFIG_BUSYBOX_DEFAULT_BUSYBOX_EXEC_PATH="/proc/self/exe" +# CONFIG_BUSYBOX_DEFAULT_SELINUX is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CLEAN_UP is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SYSLOG_INFO is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_SYSLOG=y +# CONFIG_BUSYBOX_DEFAULT_STATIC is not set +# CONFIG_BUSYBOX_DEFAULT_PIE is not set +# CONFIG_BUSYBOX_DEFAULT_NOMMU is not set +# CONFIG_BUSYBOX_DEFAULT_BUILD_LIBBUSYBOX is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_LIBBUSYBOX_STATIC is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_INDIVIDUAL is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SHARED_BUSYBOX is not set +CONFIG_BUSYBOX_DEFAULT_CROSS_COMPILER_PREFIX="" +CONFIG_BUSYBOX_DEFAULT_SYSROOT="" +CONFIG_BUSYBOX_DEFAULT_EXTRA_CFLAGS="" +CONFIG_BUSYBOX_DEFAULT_EXTRA_LDFLAGS="" +CONFIG_BUSYBOX_DEFAULT_EXTRA_LDLIBS="" +# CONFIG_BUSYBOX_DEFAULT_USE_PORTABLE_CODE is not set +# CONFIG_BUSYBOX_DEFAULT_STACK_OPTIMIZATION_386 is not set +# CONFIG_BUSYBOX_DEFAULT_STATIC_LIBGCC is not set +CONFIG_BUSYBOX_DEFAULT_INSTALL_APPLET_SYMLINKS=y +# CONFIG_BUSYBOX_DEFAULT_INSTALL_APPLET_HARDLINKS is not set +# CONFIG_BUSYBOX_DEFAULT_INSTALL_APPLET_SCRIPT_WRAPPERS is not set +# CONFIG_BUSYBOX_DEFAULT_INSTALL_APPLET_DONT is not set +# CONFIG_BUSYBOX_DEFAULT_INSTALL_SH_APPLET_SYMLINK is not set +# CONFIG_BUSYBOX_DEFAULT_INSTALL_SH_APPLET_HARDLINK is not set +# CONFIG_BUSYBOX_DEFAULT_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set +CONFIG_BUSYBOX_DEFAULT_PREFIX="./_install" +# CONFIG_BUSYBOX_DEFAULT_DEBUG is not set +# CONFIG_BUSYBOX_DEFAULT_DEBUG_PESSIMIZE is not set +# CONFIG_BUSYBOX_DEFAULT_DEBUG_SANITIZE is not set +# CONFIG_BUSYBOX_DEFAULT_UNIT_TEST is not set +# CONFIG_BUSYBOX_DEFAULT_WERROR is not set +# CONFIG_BUSYBOX_DEFAULT_WARN_SIMPLE_MSG is not set +CONFIG_BUSYBOX_DEFAULT_NO_DEBUG_LIB=y +# CONFIG_BUSYBOX_DEFAULT_DMALLOC is not set +# CONFIG_BUSYBOX_DEFAULT_EFENCE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_USE_BSS_TAIL is not set +# CONFIG_BUSYBOX_DEFAULT_FLOAT_DURATION is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_RTMINMAX is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_RTMINMAX_USE_LIBC_DEFINITIONS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_BUFFERS_USE_MALLOC is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_BUFFERS_GO_ON_STACK=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_BUFFERS_GO_IN_BSS is not set +CONFIG_BUSYBOX_DEFAULT_PASSWORD_MINLEN=6 +CONFIG_BUSYBOX_DEFAULT_MD5_SMALL=1 +CONFIG_BUSYBOX_DEFAULT_SHA3_SMALL=1 +CONFIG_BUSYBOX_DEFAULT_FEATURE_FAST_TOP=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_ETC_NETWORKS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_ETC_SERVICES is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_MAX_LEN=512 +# CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_VI is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_HISTORY=256 +# CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_SAVEHISTORY is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_SAVE_ON_EXIT is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_REVERSE_SEARCH is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_TAB_COMPLETION=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_USERNAME_COMPLETION is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_FANCY_PROMPT=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_WINCH is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_ASK_TERMINAL is not set +# CONFIG_BUSYBOX_DEFAULT_LOCALE_SUPPORT is not set +# CONFIG_BUSYBOX_DEFAULT_UNICODE_SUPPORT is not set +# CONFIG_BUSYBOX_DEFAULT_UNICODE_USING_LOCALE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHECK_UNICODE_IN_ENV is not set +CONFIG_BUSYBOX_DEFAULT_SUBST_WCHAR=0 +CONFIG_BUSYBOX_DEFAULT_LAST_SUPPORTED_WCHAR=0 +# CONFIG_BUSYBOX_DEFAULT_UNICODE_COMBINING_WCHARS is not set +# CONFIG_BUSYBOX_DEFAULT_UNICODE_WIDE_WCHARS is not set +# CONFIG_BUSYBOX_DEFAULT_UNICODE_BIDI_SUPPORT is not set +# CONFIG_BUSYBOX_DEFAULT_UNICODE_NEUTRAL_TABLE is not set +# CONFIG_BUSYBOX_DEFAULT_UNICODE_PRESERVE_BROKEN is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_NON_POSIX_CP=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VERBOSE_CP_MESSAGE is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_USE_SENDFILE=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_COPYBUF_KB=4 +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SKIP_ROOTFS is not set +CONFIG_BUSYBOX_DEFAULT_MONOTONIC_SYSCALL=y +CONFIG_BUSYBOX_DEFAULT_IOCTL_HEX2STR_ERROR=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HWIB is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SEAMLESS_XZ is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SEAMLESS_LZMA is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SEAMLESS_BZ2 is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_SEAMLESS_GZ=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SEAMLESS_Z is not set +# CONFIG_BUSYBOX_DEFAULT_AR is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_AR_LONG_FILENAMES is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_AR_CREATE is not set +# CONFIG_BUSYBOX_DEFAULT_UNCOMPRESS is not set +CONFIG_BUSYBOX_DEFAULT_GUNZIP=y +CONFIG_BUSYBOX_DEFAULT_ZCAT=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_GUNZIP_LONG_OPTIONS is not set +CONFIG_BUSYBOX_DEFAULT_BUNZIP2=y +CONFIG_BUSYBOX_DEFAULT_BZCAT=y +# CONFIG_BUSYBOX_DEFAULT_UNLZMA is not set +# CONFIG_BUSYBOX_DEFAULT_LZCAT is not set +# CONFIG_BUSYBOX_DEFAULT_LZMA is not set +# CONFIG_BUSYBOX_DEFAULT_UNXZ is not set +# CONFIG_BUSYBOX_DEFAULT_XZCAT is not set +# CONFIG_BUSYBOX_DEFAULT_XZ is not set +# CONFIG_BUSYBOX_DEFAULT_BZIP2 is not set +CONFIG_BUSYBOX_DEFAULT_BZIP2_SMALL=0 +CONFIG_BUSYBOX_DEFAULT_FEATURE_BZIP2_DECOMPRESS=y +# CONFIG_BUSYBOX_DEFAULT_CPIO is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CPIO_O is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CPIO_P is not set +# CONFIG_BUSYBOX_DEFAULT_DPKG is not set +# CONFIG_BUSYBOX_DEFAULT_DPKG_DEB is not set +CONFIG_BUSYBOX_DEFAULT_GZIP=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_GZIP_LONG_OPTIONS is not set +CONFIG_BUSYBOX_DEFAULT_GZIP_FAST=0 +# CONFIG_BUSYBOX_DEFAULT_FEATURE_GZIP_LEVELS is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_GZIP_DECOMPRESS=y +# CONFIG_BUSYBOX_DEFAULT_LZOP is not set +# CONFIG_BUSYBOX_DEFAULT_UNLZOP is not set +# CONFIG_BUSYBOX_DEFAULT_LZOPCAT is not set +# CONFIG_BUSYBOX_DEFAULT_LZOP_COMPR_HIGH is not set +# CONFIG_BUSYBOX_DEFAULT_RPM is not set +# CONFIG_BUSYBOX_DEFAULT_RPM2CPIO is not set +CONFIG_BUSYBOX_DEFAULT_TAR=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_LONG_OPTIONS is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_CREATE=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_AUTODETECT is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_FROM=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_OLDGNU_COMPATIBILITY is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_GNU_EXTENSIONS=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_TO_COMMAND is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_UNAME_GNAME is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_NOPRESERVE_TIME is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_SELINUX is not set +# CONFIG_BUSYBOX_DEFAULT_UNZIP is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_UNZIP_CDF is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_UNZIP_BZIP2 is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_UNZIP_LZMA is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_UNZIP_XZ is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_LZMA_FAST is not set +CONFIG_BUSYBOX_DEFAULT_BASENAME=y +CONFIG_BUSYBOX_DEFAULT_CAT=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CATN is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CATV is not set +CONFIG_BUSYBOX_DEFAULT_CHGRP=y +CONFIG_BUSYBOX_DEFAULT_CHMOD=y +CONFIG_BUSYBOX_DEFAULT_CHOWN=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHOWN_LONG_OPTIONS is not set +CONFIG_BUSYBOX_DEFAULT_CHROOT=y +# CONFIG_BUSYBOX_DEFAULT_CKSUM is not set +# CONFIG_BUSYBOX_DEFAULT_COMM is not set +CONFIG_BUSYBOX_DEFAULT_CP=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CP_LONG_OPTIONS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CP_REFLINK is not set +CONFIG_BUSYBOX_DEFAULT_CUT=y +CONFIG_BUSYBOX_DEFAULT_DATE=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_DATE_ISOFMT=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_DATE_NANO is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_DATE_COMPAT is not set +CONFIG_BUSYBOX_DEFAULT_DD=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_DD_SIGNAL_HANDLING=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_DD_THIRD_STATUS_LINE is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_DD_IBS_OBS=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_DD_STATUS is not set +CONFIG_BUSYBOX_DEFAULT_DF=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_DF_FANCY is not set +CONFIG_BUSYBOX_DEFAULT_DIRNAME=y +# CONFIG_BUSYBOX_DEFAULT_DOS2UNIX is not set +# CONFIG_BUSYBOX_DEFAULT_UNIX2DOS is not set +CONFIG_BUSYBOX_DEFAULT_DU=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y +CONFIG_BUSYBOX_DEFAULT_ECHO=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_FANCY_ECHO=y +CONFIG_BUSYBOX_DEFAULT_ENV=y +# CONFIG_BUSYBOX_DEFAULT_EXPAND is not set +# CONFIG_BUSYBOX_DEFAULT_UNEXPAND is not set +CONFIG_BUSYBOX_DEFAULT_EXPR=y +CONFIG_BUSYBOX_DEFAULT_EXPR_MATH_SUPPORT_64=y +# CONFIG_BUSYBOX_DEFAULT_FACTOR is not set +CONFIG_BUSYBOX_DEFAULT_FALSE=y +# CONFIG_BUSYBOX_DEFAULT_FOLD is not set +CONFIG_BUSYBOX_DEFAULT_HEAD=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_FANCY_HEAD=y +# CONFIG_BUSYBOX_DEFAULT_HOSTID is not set +CONFIG_BUSYBOX_DEFAULT_ID=y +# CONFIG_BUSYBOX_DEFAULT_GROUPS is not set +# CONFIG_BUSYBOX_DEFAULT_INSTALL is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSTALL_LONG_OPTIONS is not set +# CONFIG_BUSYBOX_DEFAULT_LINK is not set +CONFIG_BUSYBOX_DEFAULT_LN=y +# CONFIG_BUSYBOX_DEFAULT_LOGNAME is not set +CONFIG_BUSYBOX_DEFAULT_LS=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_FILETYPES=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_FOLLOWLINKS=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_RECURSIVE=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_WIDTH=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_SORTFILES=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_TIMESTAMPS=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_USERNAME=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_COLOR=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_COLOR_IS_DEFAULT=y +CONFIG_BUSYBOX_DEFAULT_MD5SUM=y +# CONFIG_BUSYBOX_DEFAULT_SHA1SUM is not set +CONFIG_BUSYBOX_DEFAULT_SHA256SUM=y +# CONFIG_BUSYBOX_DEFAULT_SHA512SUM is not set +# CONFIG_BUSYBOX_DEFAULT_SHA3SUM is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_MD5_SHA1_SUM_CHECK=y +CONFIG_BUSYBOX_DEFAULT_MKDIR=y +CONFIG_BUSYBOX_DEFAULT_MKFIFO=y +CONFIG_BUSYBOX_DEFAULT_MKNOD=y +CONFIG_BUSYBOX_DEFAULT_MKTEMP=y +CONFIG_BUSYBOX_DEFAULT_MV=y +CONFIG_BUSYBOX_DEFAULT_NICE=y +# CONFIG_BUSYBOX_DEFAULT_NL is not set +# CONFIG_BUSYBOX_DEFAULT_NOHUP is not set +# CONFIG_BUSYBOX_DEFAULT_NPROC is not set +# CONFIG_BUSYBOX_DEFAULT_OD is not set +# CONFIG_BUSYBOX_DEFAULT_PASTE is not set +# CONFIG_BUSYBOX_DEFAULT_PRINTENV is not set +CONFIG_BUSYBOX_DEFAULT_PRINTF=y +CONFIG_BUSYBOX_DEFAULT_PWD=y +CONFIG_BUSYBOX_DEFAULT_READLINK=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_READLINK_FOLLOW=y +# CONFIG_BUSYBOX_DEFAULT_REALPATH is not set +CONFIG_BUSYBOX_DEFAULT_RM=y +CONFIG_BUSYBOX_DEFAULT_RMDIR=y +CONFIG_BUSYBOX_DEFAULT_SEQ=y +# CONFIG_BUSYBOX_DEFAULT_SHRED is not set +# CONFIG_BUSYBOX_DEFAULT_SHUF is not set +CONFIG_BUSYBOX_DEFAULT_SLEEP=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_FANCY_SLEEP=y +CONFIG_BUSYBOX_DEFAULT_SORT=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SORT_BIG is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SORT_OPTIMIZE_MEMORY is not set +# CONFIG_BUSYBOX_DEFAULT_SPLIT is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SPLIT_FANCY is not set +# CONFIG_BUSYBOX_DEFAULT_STAT is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_STAT_FORMAT is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_STAT_FILESYSTEM is not set +# CONFIG_BUSYBOX_DEFAULT_STTY is not set +# CONFIG_BUSYBOX_DEFAULT_SUM is not set +CONFIG_BUSYBOX_DEFAULT_SYNC=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SYNC_FANCY is not set +CONFIG_BUSYBOX_DEFAULT_FSYNC=y +# CONFIG_BUSYBOX_DEFAULT_TAC is not set +CONFIG_BUSYBOX_DEFAULT_TAIL=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_FANCY_TAIL=y +CONFIG_BUSYBOX_DEFAULT_TEE=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_TEE_USE_BLOCK_IO=y +CONFIG_BUSYBOX_DEFAULT_TEST=y +CONFIG_BUSYBOX_DEFAULT_TEST1=y +CONFIG_BUSYBOX_DEFAULT_TEST2=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_TEST_64=y +# CONFIG_BUSYBOX_DEFAULT_TIMEOUT is not set +CONFIG_BUSYBOX_DEFAULT_TOUCH=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TOUCH_NODEREF is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_TOUCH_SUSV3=y +CONFIG_BUSYBOX_DEFAULT_TR=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TR_CLASSES is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TR_EQUIV is not set +CONFIG_BUSYBOX_DEFAULT_TRUE=y +# CONFIG_BUSYBOX_DEFAULT_TRUNCATE is not set +# CONFIG_BUSYBOX_DEFAULT_TTY is not set +CONFIG_BUSYBOX_DEFAULT_UNAME=y +CONFIG_BUSYBOX_DEFAULT_UNAME_OSNAME="GNU/Linux" +# CONFIG_BUSYBOX_DEFAULT_BB_ARCH is not set +CONFIG_BUSYBOX_DEFAULT_UNIQ=y +# CONFIG_BUSYBOX_DEFAULT_UNLINK is not set +# CONFIG_BUSYBOX_DEFAULT_USLEEP is not set +# CONFIG_BUSYBOX_DEFAULT_UUDECODE is not set +# CONFIG_BUSYBOX_DEFAULT_BASE32 is not set +# CONFIG_BUSYBOX_DEFAULT_BASE64 is not set +# CONFIG_BUSYBOX_DEFAULT_UUENCODE is not set +CONFIG_BUSYBOX_DEFAULT_WC=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_WC_LARGE is not set +# CONFIG_BUSYBOX_DEFAULT_WHO is not set +# CONFIG_BUSYBOX_DEFAULT_W is not set +# CONFIG_BUSYBOX_DEFAULT_USERS is not set +# CONFIG_BUSYBOX_DEFAULT_WHOAMI is not set +CONFIG_BUSYBOX_DEFAULT_YES=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VERBOSE is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_PRESERVE_HARDLINKS=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_HUMAN_READABLE=y +# CONFIG_BUSYBOX_DEFAULT_CHVT is not set +CONFIG_BUSYBOX_DEFAULT_CLEAR=y +# CONFIG_BUSYBOX_DEFAULT_DEALLOCVT is not set +# CONFIG_BUSYBOX_DEFAULT_DUMPKMAP is not set +# CONFIG_BUSYBOX_DEFAULT_FGCONSOLE is not set +# CONFIG_BUSYBOX_DEFAULT_KBD_MODE is not set +# CONFIG_BUSYBOX_DEFAULT_LOADFONT is not set +# CONFIG_BUSYBOX_DEFAULT_SETFONT is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SETFONT_TEXTUAL_MAP is not set +CONFIG_BUSYBOX_DEFAULT_DEFAULT_SETFONT_DIR="" +# CONFIG_BUSYBOX_DEFAULT_FEATURE_LOADFONT_PSF2 is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_LOADFONT_RAW is not set +# CONFIG_BUSYBOX_DEFAULT_LOADKMAP is not set +# CONFIG_BUSYBOX_DEFAULT_OPENVT is not set +CONFIG_BUSYBOX_DEFAULT_RESET=y +# CONFIG_BUSYBOX_DEFAULT_RESIZE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_RESIZE_PRINT is not set +# CONFIG_BUSYBOX_DEFAULT_SETCONSOLE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SETCONSOLE_LONG_OPTIONS is not set +# CONFIG_BUSYBOX_DEFAULT_SETKEYCODES is not set +# CONFIG_BUSYBOX_DEFAULT_SETLOGCONS is not set +# CONFIG_BUSYBOX_DEFAULT_SHOWKEY is not set +# CONFIG_BUSYBOX_DEFAULT_PIPE_PROGRESS is not set +# CONFIG_BUSYBOX_DEFAULT_RUN_PARTS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_RUN_PARTS_LONG_OPTIONS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_RUN_PARTS_FANCY is not set +CONFIG_BUSYBOX_DEFAULT_START_STOP_DAEMON=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_START_STOP_DAEMON_LONG_OPTIONS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_START_STOP_DAEMON_FANCY is not set +CONFIG_BUSYBOX_DEFAULT_WHICH=y +# CONFIG_BUSYBOX_DEFAULT_MINIPS is not set +# CONFIG_BUSYBOX_DEFAULT_NUKE is not set +# CONFIG_BUSYBOX_DEFAULT_RESUME is not set +# CONFIG_BUSYBOX_DEFAULT_RUN_INIT is not set +CONFIG_BUSYBOX_DEFAULT_AWK=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_AWK_LIBM=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_AWK_GNU_EXTENSIONS=y +CONFIG_BUSYBOX_DEFAULT_CMP=y +# CONFIG_BUSYBOX_DEFAULT_DIFF is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_DIFF_LONG_OPTIONS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_DIFF_DIR is not set +# CONFIG_BUSYBOX_DEFAULT_ED is not set +# CONFIG_BUSYBOX_DEFAULT_PATCH is not set +CONFIG_BUSYBOX_DEFAULT_SED=y +CONFIG_BUSYBOX_DEFAULT_VI=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_MAX_LEN=1024 +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_8BIT is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_COLON=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_YANKMARK=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_SEARCH=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_REGEX_SEARCH is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_USE_SIGNALS=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_DOT_CMD=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_READONLY=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_SETOPTS=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_SET=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_WIN_RESIZE=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_ASK_TERMINAL=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_UNDO is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_UNDO_QUEUE is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_UNDO_QUEUE_MAX=0 +CONFIG_BUSYBOX_DEFAULT_FEATURE_ALLOW_EXEC=y +CONFIG_BUSYBOX_DEFAULT_FIND=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_PRINT0=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_MTIME=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_MMIN=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_PERM=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_TYPE=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_EXECUTABLE is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_XDEV=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_MAXDEPTH=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_NEWER=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_INUM is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_EXEC=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_EXEC_PLUS is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_USER=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_GROUP=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_NOT=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_DEPTH=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_PAREN=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_SIZE=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_PRUNE=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_QUIT is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_DELETE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_EMPTY is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_PATH=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_REGEX=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_CONTEXT is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_LINKS is not set +CONFIG_BUSYBOX_DEFAULT_GREP=y +CONFIG_BUSYBOX_DEFAULT_EGREP=y +CONFIG_BUSYBOX_DEFAULT_FGREP=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_GREP_CONTEXT=y +CONFIG_BUSYBOX_DEFAULT_XARGS=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_XARGS_SUPPORT_CONFIRMATION=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_XARGS_SUPPORT_QUOTES=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_XARGS_SUPPORT_TERMOPT=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_XARGS_SUPPORT_ZERO_TERM=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_XARGS_SUPPORT_REPL_STR is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_XARGS_SUPPORT_PARALLEL is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_XARGS_SUPPORT_ARGS_FILE is not set +# CONFIG_BUSYBOX_DEFAULT_BOOTCHARTD is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_BOOTCHARTD_BLOATED_HEADER is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_BOOTCHARTD_CONFIG_FILE is not set +CONFIG_BUSYBOX_DEFAULT_HALT=y +CONFIG_BUSYBOX_DEFAULT_POWEROFF=y +CONFIG_BUSYBOX_DEFAULT_REBOOT=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_WAIT_FOR_INIT is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CALL_TELINIT is not set +CONFIG_BUSYBOX_DEFAULT_TELINIT_PATH="" +# CONFIG_BUSYBOX_DEFAULT_INIT is not set +# CONFIG_BUSYBOX_DEFAULT_LINUXRC is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_USE_INITTAB is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_KILL_REMOVED is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_KILL_DELAY=0 +# CONFIG_BUSYBOX_DEFAULT_FEATURE_INIT_SCTTY is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_INIT_SYSLOG is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_INIT_QUIET is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_INIT_COREDUMPS is not set +CONFIG_BUSYBOX_DEFAULT_INIT_TERMINAL_TYPE="" +# CONFIG_BUSYBOX_DEFAULT_FEATURE_INIT_MODIFY_CMDLINE is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_SHADOWPASSWDS=y +# CONFIG_BUSYBOX_DEFAULT_USE_BB_PWD_GRP is not set +# CONFIG_BUSYBOX_DEFAULT_USE_BB_SHADOW is not set +# CONFIG_BUSYBOX_DEFAULT_USE_BB_CRYPT is not set +# CONFIG_BUSYBOX_DEFAULT_USE_BB_CRYPT_SHA is not set +# CONFIG_BUSYBOX_DEFAULT_ADD_SHELL is not set +# CONFIG_BUSYBOX_DEFAULT_REMOVE_SHELL is not set +# CONFIG_BUSYBOX_DEFAULT_ADDGROUP is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_ADDUSER_TO_GROUP is not set +# CONFIG_BUSYBOX_DEFAULT_ADDUSER is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHECK_NAMES is not set +CONFIG_BUSYBOX_DEFAULT_LAST_ID=0 +CONFIG_BUSYBOX_DEFAULT_FIRST_SYSTEM_ID=0 +CONFIG_BUSYBOX_DEFAULT_LAST_SYSTEM_ID=0 +# CONFIG_BUSYBOX_DEFAULT_CHPASSWD is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_DEFAULT_PASSWD_ALGO="md5" +# CONFIG_BUSYBOX_DEFAULT_CRYPTPW is not set +# CONFIG_BUSYBOX_DEFAULT_MKPASSWD is not set +# CONFIG_BUSYBOX_DEFAULT_DELUSER is not set +# CONFIG_BUSYBOX_DEFAULT_DELGROUP is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_DEL_USER_FROM_GROUP is not set +# CONFIG_BUSYBOX_DEFAULT_GETTY is not set +CONFIG_BUSYBOX_DEFAULT_LOGIN=y +CONFIG_BUSYBOX_DEFAULT_LOGIN_SESSION_AS_CHILD=y +# CONFIG_BUSYBOX_DEFAULT_LOGIN_SCRIPTS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_NOLOGIN is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SECURETTY is not set +CONFIG_BUSYBOX_DEFAULT_PASSWD=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_PASSWD_WEAK_CHECK=y +# CONFIG_BUSYBOX_DEFAULT_SU is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SU_SYSLOG is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SU_CHECKS_SHELLS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SU_BLANK_PW_NEEDS_SECURE_TTY is not set +# CONFIG_BUSYBOX_DEFAULT_SULOGIN is not set +# CONFIG_BUSYBOX_DEFAULT_VLOCK is not set +# CONFIG_BUSYBOX_DEFAULT_CHATTR is not set +# CONFIG_BUSYBOX_DEFAULT_FSCK is not set +# CONFIG_BUSYBOX_DEFAULT_LSATTR is not set +# CONFIG_BUSYBOX_DEFAULT_TUNE2FS is not set +# CONFIG_BUSYBOX_DEFAULT_MODPROBE_SMALL is not set +# CONFIG_BUSYBOX_DEFAULT_DEPMOD is not set +# CONFIG_BUSYBOX_DEFAULT_INSMOD is not set +# CONFIG_BUSYBOX_DEFAULT_LSMOD is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set +# CONFIG_BUSYBOX_DEFAULT_MODINFO is not set +# CONFIG_BUSYBOX_DEFAULT_MODPROBE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MODPROBE_BLACKLIST is not set +# CONFIG_BUSYBOX_DEFAULT_RMMOD is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CMDLINE_MODULE_OPTIONS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_2_4_MODULES is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSMOD_VERSION_CHECKING is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSMOD_LOADINKMEM is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSMOD_LOAD_MAP is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSMOD_LOAD_MAP_FULL is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHECK_TAINTED_MODULE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSMOD_TRY_MMAP is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MODUTILS_ALIAS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MODUTILS_SYMBOLS is not set +CONFIG_BUSYBOX_DEFAULT_DEFAULT_MODULES_DIR="" +CONFIG_BUSYBOX_DEFAULT_DEFAULT_DEPMOD_FILE="" +# CONFIG_BUSYBOX_DEFAULT_ACPID is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_ACPID_COMPAT is not set +# CONFIG_BUSYBOX_DEFAULT_BLKDISCARD is not set +# CONFIG_BUSYBOX_DEFAULT_BLKID is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_BLKID_TYPE is not set +# CONFIG_BUSYBOX_DEFAULT_BLOCKDEV is not set +# CONFIG_BUSYBOX_DEFAULT_CAL is not set +# CONFIG_BUSYBOX_DEFAULT_CHRT is not set +CONFIG_BUSYBOX_DEFAULT_DMESG=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_DMESG_PRETTY=y +# CONFIG_BUSYBOX_DEFAULT_EJECT is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_EJECT_SCSI is not set +# CONFIG_BUSYBOX_DEFAULT_FALLOCATE is not set +# CONFIG_BUSYBOX_DEFAULT_FATATTR is not set +# CONFIG_BUSYBOX_DEFAULT_FBSET is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_FBSET_FANCY is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_FBSET_READMODE is not set +# CONFIG_BUSYBOX_DEFAULT_FDFORMAT is not set +# CONFIG_BUSYBOX_DEFAULT_FDISK is not set +# CONFIG_BUSYBOX_DEFAULT_FDISK_SUPPORT_LARGE_DISKS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_FDISK_WRITABLE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_AIX_LABEL is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SGI_LABEL is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SUN_LABEL is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_OSF_LABEL is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_GPT_LABEL is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_FDISK_ADVANCED is not set +# CONFIG_BUSYBOX_DEFAULT_FINDFS is not set +CONFIG_BUSYBOX_DEFAULT_FLOCK=y +# CONFIG_BUSYBOX_DEFAULT_FDFLUSH is not set +# CONFIG_BUSYBOX_DEFAULT_FREERAMDISK is not set +# CONFIG_BUSYBOX_DEFAULT_FSCK_MINIX is not set +# CONFIG_BUSYBOX_DEFAULT_FSFREEZE is not set +# CONFIG_BUSYBOX_DEFAULT_FSTRIM is not set +# CONFIG_BUSYBOX_DEFAULT_GETOPT is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_GETOPT_LONG is not set +CONFIG_BUSYBOX_DEFAULT_HEXDUMP=y +# CONFIG_BUSYBOX_DEFAULT_HD is not set +# CONFIG_BUSYBOX_DEFAULT_XXD is not set +CONFIG_BUSYBOX_DEFAULT_HWCLOCK=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HWCLOCK_ADJTIME_FHS is not set +# CONFIG_BUSYBOX_DEFAULT_IONICE is not set +# CONFIG_BUSYBOX_DEFAULT_IPCRM is not set +# CONFIG_BUSYBOX_DEFAULT_IPCS is not set +# CONFIG_BUSYBOX_DEFAULT_LAST is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_LAST_FANCY is not set +# CONFIG_BUSYBOX_DEFAULT_LOSETUP is not set +# CONFIG_BUSYBOX_DEFAULT_LSPCI is not set +# CONFIG_BUSYBOX_DEFAULT_LSUSB is not set +# CONFIG_BUSYBOX_DEFAULT_MDEV is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MDEV_CONF is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MDEV_RENAME is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MDEV_RENAME_REGEXP is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MDEV_EXEC is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MDEV_LOAD_FIRMWARE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MDEV_DAEMON is not set +# CONFIG_BUSYBOX_DEFAULT_MESG is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MESG_ENABLE_ONLY_GROUP is not set +# CONFIG_BUSYBOX_DEFAULT_MKE2FS is not set +# CONFIG_BUSYBOX_DEFAULT_MKFS_EXT2 is not set +# CONFIG_BUSYBOX_DEFAULT_MKFS_MINIX is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MINIX2 is not set +# CONFIG_BUSYBOX_DEFAULT_MKFS_REISER is not set +# CONFIG_BUSYBOX_DEFAULT_MKDOSFS is not set +# CONFIG_BUSYBOX_DEFAULT_MKFS_VFAT is not set +CONFIG_BUSYBOX_DEFAULT_MKSWAP=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MKSWAP_UUID is not set +# CONFIG_BUSYBOX_DEFAULT_MORE is not set +CONFIG_BUSYBOX_DEFAULT_MOUNT=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_FAKE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_VERBOSE is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_HELPERS=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_LABEL is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_NFS is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_CIFS=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_FLAGS=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_FSTAB=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_OTHERTAB is not set +# CONFIG_BUSYBOX_DEFAULT_MOUNTPOINT is not set +# CONFIG_BUSYBOX_DEFAULT_NOLOGIN is not set +# CONFIG_BUSYBOX_DEFAULT_NOLOGIN_DEPENDENCIES is not set +# CONFIG_BUSYBOX_DEFAULT_NSENTER is not set +CONFIG_BUSYBOX_DEFAULT_PIVOT_ROOT=y +# CONFIG_BUSYBOX_DEFAULT_RDATE is not set +# CONFIG_BUSYBOX_DEFAULT_RDEV is not set +# CONFIG_BUSYBOX_DEFAULT_READPROFILE is not set +# CONFIG_BUSYBOX_DEFAULT_RENICE is not set +# CONFIG_BUSYBOX_DEFAULT_REV is not set +# CONFIG_BUSYBOX_DEFAULT_RTCWAKE is not set +# CONFIG_BUSYBOX_DEFAULT_SCRIPT is not set +# CONFIG_BUSYBOX_DEFAULT_SCRIPTREPLAY is not set +# CONFIG_BUSYBOX_DEFAULT_SETARCH is not set +# CONFIG_BUSYBOX_DEFAULT_LINUX32 is not set +# CONFIG_BUSYBOX_DEFAULT_LINUX64 is not set +# CONFIG_BUSYBOX_DEFAULT_SETPRIV is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SETPRIV_DUMP is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SETPRIV_CAPABILITIES is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SETPRIV_CAPABILITY_NAMES is not set +# CONFIG_BUSYBOX_DEFAULT_SETSID is not set +CONFIG_BUSYBOX_DEFAULT_SWAPON=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_SWAPON_DISCARD=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_SWAPON_PRI=y +CONFIG_BUSYBOX_DEFAULT_SWAPOFF=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SWAPONOFF_LABEL is not set +CONFIG_BUSYBOX_DEFAULT_SWITCH_ROOT=y +# CONFIG_BUSYBOX_DEFAULT_TASKSET is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TASKSET_FANCY is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TASKSET_CPULIST is not set +# CONFIG_BUSYBOX_DEFAULT_UEVENT is not set +CONFIG_BUSYBOX_DEFAULT_UMOUNT=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_UMOUNT_ALL=y +# CONFIG_BUSYBOX_DEFAULT_UNSHARE is not set +# CONFIG_BUSYBOX_DEFAULT_WALL is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_LOOP=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_LOOP_CREATE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MTAB_SUPPORT is not set +# CONFIG_BUSYBOX_DEFAULT_VOLUMEID is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_BCACHE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_BTRFS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_CRAMFS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_EROFS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_EXFAT is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_EXT is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_F2FS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_FAT is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_HFS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_ISO9660 is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_JFS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_LFS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_LINUXRAID is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_LINUXSWAP is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_LUKS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_MINIX is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_NILFS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_NTFS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_OCFS2 is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_REISERFS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_ROMFS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_SQUASHFS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_SYSV is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_UBIFS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_UDF is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_XFS is not set +# CONFIG_BUSYBOX_DEFAULT_ADJTIMEX is not set +# CONFIG_BUSYBOX_DEFAULT_BBCONFIG is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_COMPRESS_BBCONFIG is not set +# CONFIG_BUSYBOX_DEFAULT_BC is not set +# CONFIG_BUSYBOX_DEFAULT_DC is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_DC_BIG is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_DC_LIBM is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_BC_INTERACTIVE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_BC_LONG_OPTIONS is not set +# CONFIG_BUSYBOX_DEFAULT_BEEP is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_BEEP_FREQ=0 +CONFIG_BUSYBOX_DEFAULT_FEATURE_BEEP_LENGTH_MS=0 +# CONFIG_BUSYBOX_DEFAULT_CHAT is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_NOFAIL is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_TTY_HIFI is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_IMPLICIT_CR is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_SWALLOW_OPTS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_SEND_ESCAPES is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_VAR_ABORT_LEN is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_CLR_ABORT is not set +# CONFIG_BUSYBOX_DEFAULT_CONSPY is not set +CONFIG_BUSYBOX_DEFAULT_CROND=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CROND_D is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CROND_CALL_SENDMAIL is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_CROND_SPECIAL_TIMES is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_CROND_DIR="/etc" +CONFIG_BUSYBOX_DEFAULT_CRONTAB=y +# CONFIG_BUSYBOX_DEFAULT_DEVFSD is not set +# CONFIG_BUSYBOX_DEFAULT_DEVFSD_MODLOAD is not set +# CONFIG_BUSYBOX_DEFAULT_DEVFSD_FG_NP is not set +# CONFIG_BUSYBOX_DEFAULT_DEVFSD_VERBOSE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_DEVFS is not set +# CONFIG_BUSYBOX_DEFAULT_DEVMEM is not set +# CONFIG_BUSYBOX_DEFAULT_FBSPLASH is not set +# CONFIG_BUSYBOX_DEFAULT_FLASH_ERASEALL is not set +# CONFIG_BUSYBOX_DEFAULT_FLASH_LOCK is not set +# CONFIG_BUSYBOX_DEFAULT_FLASH_UNLOCK is not set +# CONFIG_BUSYBOX_DEFAULT_FLASHCP is not set +# CONFIG_BUSYBOX_DEFAULT_HDPARM is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HDPARM_GET_IDENTITY is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HDPARM_HDIO_DRIVE_RESET is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HDPARM_HDIO_TRISTATE_HWIF is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HDPARM_HDIO_GETSET_DMA is not set +# CONFIG_BUSYBOX_DEFAULT_HEXEDIT is not set +# CONFIG_BUSYBOX_DEFAULT_I2CGET is not set +# CONFIG_BUSYBOX_DEFAULT_I2CSET is not set +# CONFIG_BUSYBOX_DEFAULT_I2CDUMP is not set +# CONFIG_BUSYBOX_DEFAULT_I2CDETECT is not set +# CONFIG_BUSYBOX_DEFAULT_I2CTRANSFER is not set +# CONFIG_BUSYBOX_DEFAULT_INOTIFYD is not set +CONFIG_BUSYBOX_DEFAULT_LESS=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_MAXLINES=9999999 +# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_BRACKETS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_FLAGS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_TRUNCATE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_MARKS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_REGEXP is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_WINCH is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_ASK_TERMINAL is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_DASHCMD is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_LINENUMS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_RAW is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_ENV is not set +CONFIG_BUSYBOX_DEFAULT_LOCK=y +# CONFIG_BUSYBOX_DEFAULT_LSSCSI is not set +# CONFIG_BUSYBOX_DEFAULT_MAKEDEVS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MAKEDEVS_LEAF is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_MAKEDEVS_TABLE is not set +# CONFIG_BUSYBOX_DEFAULT_MAN is not set +# CONFIG_BUSYBOX_DEFAULT_MICROCOM is not set +# CONFIG_BUSYBOX_DEFAULT_MIM is not set +# CONFIG_BUSYBOX_DEFAULT_MT is not set +# CONFIG_BUSYBOX_DEFAULT_NANDWRITE is not set +# CONFIG_BUSYBOX_DEFAULT_NANDDUMP is not set +# CONFIG_BUSYBOX_DEFAULT_PARTPROBE is not set +# CONFIG_BUSYBOX_DEFAULT_RAIDAUTORUN is not set +# CONFIG_BUSYBOX_DEFAULT_READAHEAD is not set +# CONFIG_BUSYBOX_DEFAULT_RFKILL is not set +# CONFIG_BUSYBOX_DEFAULT_RUNLEVEL is not set +# CONFIG_BUSYBOX_DEFAULT_RX is not set +# CONFIG_BUSYBOX_DEFAULT_SETFATTR is not set +# CONFIG_BUSYBOX_DEFAULT_SETSERIAL is not set +CONFIG_BUSYBOX_DEFAULT_STRINGS=y +CONFIG_BUSYBOX_DEFAULT_TIME=y +# CONFIG_BUSYBOX_DEFAULT_TS is not set +# CONFIG_BUSYBOX_DEFAULT_TTYSIZE is not set +# CONFIG_BUSYBOX_DEFAULT_UBIATTACH is not set +# CONFIG_BUSYBOX_DEFAULT_UBIDETACH is not set +# CONFIG_BUSYBOX_DEFAULT_UBIMKVOL is not set +# CONFIG_BUSYBOX_DEFAULT_UBIRMVOL is not set +# CONFIG_BUSYBOX_DEFAULT_UBIRSVOL is not set +# CONFIG_BUSYBOX_DEFAULT_UBIUPDATEVOL is not set +# CONFIG_BUSYBOX_DEFAULT_UBIRENAME is not set +# CONFIG_BUSYBOX_DEFAULT_VOLNAME is not set +# CONFIG_BUSYBOX_DEFAULT_WATCHDOG is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_IPV6=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_UNIX_LOCAL is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_PREFER_IPV4_ADDRESS is not set +CONFIG_BUSYBOX_DEFAULT_VERBOSE_RESOLUTION_ERRORS=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TLS_SHA1 is not set +# CONFIG_BUSYBOX_DEFAULT_ARP is not set +# CONFIG_BUSYBOX_DEFAULT_ARPING is not set +CONFIG_BUSYBOX_DEFAULT_BRCTL=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_BRCTL_FANCY=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_BRCTL_SHOW=y +# CONFIG_BUSYBOX_DEFAULT_DNSD is not set +# CONFIG_BUSYBOX_DEFAULT_ETHER_WAKE is not set +# CONFIG_BUSYBOX_DEFAULT_FTPD is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_FTPD_WRITE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_FTPD_ACCEPT_BROKEN_LIST is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_FTPD_AUTHENTICATION is not set +# CONFIG_BUSYBOX_DEFAULT_FTPGET is not set +# CONFIG_BUSYBOX_DEFAULT_FTPPUT is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_FTPGETPUT_LONG_OPTIONS is not set +# CONFIG_BUSYBOX_DEFAULT_HOSTNAME is not set +# CONFIG_BUSYBOX_DEFAULT_DNSDOMAINNAME is not set +# CONFIG_BUSYBOX_DEFAULT_HTTPD is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_RANGES is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_SETUID is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_BASIC_AUTH is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_AUTH_MD5 is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_CGI is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_ENCODE_URL_STR is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_ERROR_PAGES is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_PROXY is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_GZIP is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_ETAG is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_LAST_MODIFIED is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_DATE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_ACL_IP is not set +CONFIG_BUSYBOX_DEFAULT_IFCONFIG=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_IFCONFIG_STATUS=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFCONFIG_SLIP is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_IFCONFIG_HW=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_IFCONFIG_BROADCAST_PLUS=y +# CONFIG_BUSYBOX_DEFAULT_IFENSLAVE is not set +# CONFIG_BUSYBOX_DEFAULT_IFPLUGD is not set +# CONFIG_BUSYBOX_DEFAULT_IFUP is not set +# CONFIG_BUSYBOX_DEFAULT_IFDOWN is not set +CONFIG_BUSYBOX_DEFAULT_IFUPDOWN_IFSTATE_PATH="" +# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFUPDOWN_IP is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFUPDOWN_IPV4 is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFUPDOWN_IPV6 is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFUPDOWN_MAPPING is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set +# CONFIG_BUSYBOX_DEFAULT_INETD is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_INETD_SUPPORT_BUILTIN_ECHO is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_INETD_SUPPORT_BUILTIN_TIME is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_INETD_RPC is not set +CONFIG_BUSYBOX_DEFAULT_IP=y +# CONFIG_BUSYBOX_DEFAULT_IPADDR is not set +# CONFIG_BUSYBOX_DEFAULT_IPLINK is not set +# CONFIG_BUSYBOX_DEFAULT_IPROUTE is not set +# CONFIG_BUSYBOX_DEFAULT_IPTUNNEL is not set +# CONFIG_BUSYBOX_DEFAULT_IPRULE is not set +# CONFIG_BUSYBOX_DEFAULT_IPNEIGH is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_ADDRESS=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_LINK=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_ROUTE=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_ROUTE_DIR="/etc/iproute2" +# CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_TUNNEL is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_RULE=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_NEIGH=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_RARE_PROTOCOLS is not set +# CONFIG_BUSYBOX_DEFAULT_IPCALC is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_IPCALC_LONG_OPTIONS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_IPCALC_FANCY is not set +# CONFIG_BUSYBOX_DEFAULT_FAKEIDENTD is not set +# CONFIG_BUSYBOX_DEFAULT_NAMEIF is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_NAMEIF_EXTENDED is not set +# CONFIG_BUSYBOX_DEFAULT_NBDCLIENT is not set +CONFIG_BUSYBOX_DEFAULT_NC=y +# CONFIG_BUSYBOX_DEFAULT_NETCAT is not set +# CONFIG_BUSYBOX_DEFAULT_NC_SERVER is not set +# CONFIG_BUSYBOX_DEFAULT_NC_EXTRA is not set +# CONFIG_BUSYBOX_DEFAULT_NC_110_COMPAT is not set +CONFIG_BUSYBOX_DEFAULT_NETMSG=y +CONFIG_BUSYBOX_DEFAULT_NETSTAT=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_NETSTAT_WIDE=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_NETSTAT_PRG=y +# CONFIG_BUSYBOX_DEFAULT_NSLOOKUP is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_NSLOOKUP_BIG is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_NSLOOKUP_LONG_OPTIONS is not set +CONFIG_BUSYBOX_DEFAULT_NSLOOKUP_OPENWRT=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_NSLOOKUP_OPENWRT_LONG_OPTIONS is not set +CONFIG_BUSYBOX_DEFAULT_NTPD=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_NTPD_SERVER=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_NTPD_CONF is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_NTP_AUTH is not set +CONFIG_BUSYBOX_DEFAULT_PING=y +CONFIG_BUSYBOX_DEFAULT_PING6=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_FANCY_PING=y +# CONFIG_BUSYBOX_DEFAULT_PSCAN is not set +CONFIG_BUSYBOX_DEFAULT_ROUTE=y +# CONFIG_BUSYBOX_DEFAULT_SLATTACH is not set +# CONFIG_BUSYBOX_DEFAULT_SSL_CLIENT is not set +# CONFIG_BUSYBOX_DEFAULT_TC is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TC_INGRESS is not set +# CONFIG_BUSYBOX_DEFAULT_TCPSVD is not set +# CONFIG_BUSYBOX_DEFAULT_UDPSVD is not set +# CONFIG_BUSYBOX_DEFAULT_TELNET is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TELNET_TTYPE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TELNET_AUTOLOGIN is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TELNET_WIDTH is not set +# CONFIG_BUSYBOX_DEFAULT_TELNETD is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TELNETD_STANDALONE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TELNETD_INETD_WAIT is not set +# CONFIG_BUSYBOX_DEFAULT_TFTP is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TFTP_PROGRESS_BAR is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TFTP_HPA_COMPAT is not set +# CONFIG_BUSYBOX_DEFAULT_TFTPD is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TFTP_GET is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TFTP_PUT is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TFTP_BLOCKSIZE is not set +# CONFIG_BUSYBOX_DEFAULT_TFTP_DEBUG is not set +# CONFIG_BUSYBOX_DEFAULT_TLS is not set +CONFIG_BUSYBOX_DEFAULT_TRACEROUTE=y +CONFIG_BUSYBOX_DEFAULT_TRACEROUTE6=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_TRACEROUTE_VERBOSE=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TRACEROUTE_USE_ICMP is not set +# CONFIG_BUSYBOX_DEFAULT_TUNCTL is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TUNCTL_UG is not set +# CONFIG_BUSYBOX_DEFAULT_VCONFIG is not set +# CONFIG_BUSYBOX_DEFAULT_WGET is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_WGET_LONG_OPTIONS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_WGET_STATUSBAR is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_WGET_AUTHENTICATION is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_WGET_TIMEOUT is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_WGET_HTTPS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_WGET_OPENSSL is not set +# CONFIG_BUSYBOX_DEFAULT_WHOIS is not set +# CONFIG_BUSYBOX_DEFAULT_ZCIP is not set +# CONFIG_BUSYBOX_DEFAULT_UDHCPD is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCPD_BASE_IP_ON_MAC is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set +CONFIG_BUSYBOX_DEFAULT_DHCPD_LEASES_FILE="" +# CONFIG_BUSYBOX_DEFAULT_DUMPLEASES is not set +# CONFIG_BUSYBOX_DEFAULT_DHCPRELAY is not set +CONFIG_BUSYBOX_DEFAULT_UDHCPC=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCPC_ARPING is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCPC_SANITIZEOPT is not set +CONFIG_BUSYBOX_DEFAULT_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script" +# CONFIG_BUSYBOX_DEFAULT_UDHCPC6 is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCPC6_RFC3646 is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCPC6_RFC4704 is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCPC6_RFC4833 is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCPC6_RFC5970 is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCP_PORT is not set +CONFIG_BUSYBOX_DEFAULT_UDHCP_DEBUG=0 +CONFIG_BUSYBOX_DEFAULT_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80 +CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCP_RFC3397=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCP_8021Q is not set +CONFIG_BUSYBOX_DEFAULT_IFUPDOWN_UDHCPC_CMD_OPTIONS="" +# CONFIG_BUSYBOX_DEFAULT_LPD is not set +# CONFIG_BUSYBOX_DEFAULT_LPR is not set +# CONFIG_BUSYBOX_DEFAULT_LPQ is not set +# CONFIG_BUSYBOX_DEFAULT_MAKEMIME is not set +# CONFIG_BUSYBOX_DEFAULT_POPMAILDIR is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_POPMAILDIR_DELIVERY is not set +# CONFIG_BUSYBOX_DEFAULT_REFORMIME is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_REFORMIME_COMPAT is not set +# CONFIG_BUSYBOX_DEFAULT_SENDMAIL is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_MIME_CHARSET="" +CONFIG_BUSYBOX_DEFAULT_FREE=y +# CONFIG_BUSYBOX_DEFAULT_FUSER is not set +# CONFIG_BUSYBOX_DEFAULT_IOSTAT is not set +CONFIG_BUSYBOX_DEFAULT_KILL=y +CONFIG_BUSYBOX_DEFAULT_KILLALL=y +# CONFIG_BUSYBOX_DEFAULT_KILLALL5 is not set +# CONFIG_BUSYBOX_DEFAULT_LSOF is not set +# CONFIG_BUSYBOX_DEFAULT_MPSTAT is not set +# CONFIG_BUSYBOX_DEFAULT_NMETER is not set +CONFIG_BUSYBOX_DEFAULT_PGREP=y +# CONFIG_BUSYBOX_DEFAULT_PKILL is not set +CONFIG_BUSYBOX_DEFAULT_PIDOF=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_PIDOF_SINGLE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_PIDOF_OMIT is not set +# CONFIG_BUSYBOX_DEFAULT_PMAP is not set +# CONFIG_BUSYBOX_DEFAULT_POWERTOP is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_POWERTOP_INTERACTIVE is not set +CONFIG_BUSYBOX_DEFAULT_PS=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_PS_WIDE=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_PS_LONG is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_PS_TIME is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_PS_UNUSUAL_SYSTEMS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_PS_ADDITIONAL_COLUMNS is not set +# CONFIG_BUSYBOX_DEFAULT_PSTREE is not set +# CONFIG_BUSYBOX_DEFAULT_PWDX is not set +# CONFIG_BUSYBOX_DEFAULT_SMEMCAP is not set +CONFIG_BUSYBOX_DEFAULT_BB_SYSCTL=y +CONFIG_BUSYBOX_DEFAULT_TOP=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TOP_INTERACTIVE is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TOP_SMP_CPU is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TOP_DECIMALS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TOP_SMP_PROCESS is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_TOPMEM is not set +CONFIG_BUSYBOX_DEFAULT_UPTIME=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_UPTIME_UTMP_SUPPORT is not set +# CONFIG_BUSYBOX_DEFAULT_WATCH is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SHOW_THREADS is not set +# CONFIG_BUSYBOX_DEFAULT_CHPST is not set +# CONFIG_BUSYBOX_DEFAULT_SETUIDGID is not set +# CONFIG_BUSYBOX_DEFAULT_ENVUIDGID is not set +# CONFIG_BUSYBOX_DEFAULT_ENVDIR is not set +# CONFIG_BUSYBOX_DEFAULT_SOFTLIMIT is not set +# CONFIG_BUSYBOX_DEFAULT_RUNSV is not set +# CONFIG_BUSYBOX_DEFAULT_RUNSVDIR is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_RUNSVDIR_LOG is not set +# CONFIG_BUSYBOX_DEFAULT_SV is not set +CONFIG_BUSYBOX_DEFAULT_SV_DEFAULT_SERVICE_DIR="" +# CONFIG_BUSYBOX_DEFAULT_SVC is not set +# CONFIG_BUSYBOX_DEFAULT_SVOK is not set +# CONFIG_BUSYBOX_DEFAULT_SVLOGD is not set +# CONFIG_BUSYBOX_DEFAULT_CHCON is not set +# CONFIG_BUSYBOX_DEFAULT_GETENFORCE is not set +# CONFIG_BUSYBOX_DEFAULT_GETSEBOOL is not set +# CONFIG_BUSYBOX_DEFAULT_LOAD_POLICY is not set +# CONFIG_BUSYBOX_DEFAULT_MATCHPATHCON is not set +# CONFIG_BUSYBOX_DEFAULT_RUNCON is not set +# CONFIG_BUSYBOX_DEFAULT_SELINUXENABLED is not set +# CONFIG_BUSYBOX_DEFAULT_SESTATUS is not set +# CONFIG_BUSYBOX_DEFAULT_SETENFORCE is not set +# CONFIG_BUSYBOX_DEFAULT_SETFILES is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SETFILES_CHECK_OPTION is not set +# CONFIG_BUSYBOX_DEFAULT_RESTORECON is not set +# CONFIG_BUSYBOX_DEFAULT_SETSEBOOL is not set +CONFIG_BUSYBOX_DEFAULT_SH_IS_ASH=y +# CONFIG_BUSYBOX_DEFAULT_SH_IS_HUSH is not set +# CONFIG_BUSYBOX_DEFAULT_SH_IS_NONE is not set +# CONFIG_BUSYBOX_DEFAULT_BASH_IS_ASH is not set +# CONFIG_BUSYBOX_DEFAULT_BASH_IS_HUSH is not set +CONFIG_BUSYBOX_DEFAULT_BASH_IS_NONE=y +CONFIG_BUSYBOX_DEFAULT_SHELL_ASH=y +CONFIG_BUSYBOX_DEFAULT_ASH=y +# CONFIG_BUSYBOX_DEFAULT_ASH_OPTIMIZE_FOR_SIZE is not set +CONFIG_BUSYBOX_DEFAULT_ASH_INTERNAL_GLOB=y +CONFIG_BUSYBOX_DEFAULT_ASH_BASH_COMPAT=y +# CONFIG_BUSYBOX_DEFAULT_ASH_BASH_SOURCE_CURDIR is not set +# CONFIG_BUSYBOX_DEFAULT_ASH_BASH_NOT_FOUND_HOOK is not set +CONFIG_BUSYBOX_DEFAULT_ASH_JOB_CONTROL=y +CONFIG_BUSYBOX_DEFAULT_ASH_ALIAS=y +# CONFIG_BUSYBOX_DEFAULT_ASH_RANDOM_SUPPORT is not set +CONFIG_BUSYBOX_DEFAULT_ASH_EXPAND_PRMT=y +# CONFIG_BUSYBOX_DEFAULT_ASH_IDLE_TIMEOUT is not set +# CONFIG_BUSYBOX_DEFAULT_ASH_MAIL is not set +CONFIG_BUSYBOX_DEFAULT_ASH_ECHO=y +CONFIG_BUSYBOX_DEFAULT_ASH_PRINTF=y +CONFIG_BUSYBOX_DEFAULT_ASH_TEST=y +# CONFIG_BUSYBOX_DEFAULT_ASH_HELP is not set +CONFIG_BUSYBOX_DEFAULT_ASH_GETOPTS=y +CONFIG_BUSYBOX_DEFAULT_ASH_CMDCMD=y +# CONFIG_BUSYBOX_DEFAULT_CTTYHACK is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH is not set +# CONFIG_BUSYBOX_DEFAULT_SHELL_HUSH is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_BASH_COMPAT is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_BRACE_EXPANSION is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_LINENO_VAR is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_BASH_SOURCE_CURDIR is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_INTERACTIVE is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_SAVEHISTORY is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_JOB is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_TICK is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_IF is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_LOOPS is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_CASE is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_FUNCTIONS is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_LOCAL is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_RANDOM_SUPPORT is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_MODE_X is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_ECHO is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_PRINTF is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_TEST is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_HELP is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_EXPORT is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_EXPORT_N is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_READONLY is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_KILL is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_WAIT is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_COMMAND is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_TRAP is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_TYPE is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_TIMES is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_READ is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_SET is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_UNSET is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_ULIMIT is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_UMASK is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_GETOPTS is not set +# CONFIG_BUSYBOX_DEFAULT_HUSH_MEMLEAK is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_MATH=y +CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_MATH_64=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_MATH_BASE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_EXTRA_QUIET is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_STANDALONE is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_NOFORK=y +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_READ_FRAC is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_HISTFILESIZE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_EMBEDDED_SCRIPTS is not set +# CONFIG_BUSYBOX_DEFAULT_KLOGD is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_KLOGD_KLOGCTL is not set +CONFIG_BUSYBOX_DEFAULT_LOGGER=y +# CONFIG_BUSYBOX_DEFAULT_LOGREAD is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_LOGREAD_REDUCED_LOCKING is not set +# CONFIG_BUSYBOX_DEFAULT_SYSLOGD is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_ROTATE_LOGFILE is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_REMOTE_LOG is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SYSLOGD_DUP is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SYSLOGD_CFG is not set +# CONFIG_BUSYBOX_DEFAULT_FEATURE_SYSLOGD_PRECISE_TIMESTAMPS is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_SYSLOGD_READ_BUFFER_SIZE=0 +# CONFIG_BUSYBOX_DEFAULT_FEATURE_IPC_SYSLOG is not set +CONFIG_BUSYBOX_DEFAULT_FEATURE_IPC_SYSLOG_BUFFER_SIZE=0 +# CONFIG_BUSYBOX_DEFAULT_FEATURE_KMSG_SYSLOG is not set +CONFIG_BUSYBOX_CONFIG_HAVE_DOT_CONFIG=y + +# +# Settings +# +# CONFIG_BUSYBOX_CONFIG_DESKTOP is not set +# CONFIG_BUSYBOX_CONFIG_EXTRA_COMPAT is not set +# CONFIG_BUSYBOX_CONFIG_FEDORA_COMPAT is not set +CONFIG_BUSYBOX_CONFIG_INCLUDE_SUSv2=y +CONFIG_BUSYBOX_CONFIG_LONG_OPTS=y +CONFIG_BUSYBOX_CONFIG_SHOW_USAGE=y +CONFIG_BUSYBOX_CONFIG_FEATURE_VERBOSE_USAGE=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_COMPRESS_USAGE is not set +CONFIG_BUSYBOX_CONFIG_LFS=y +# CONFIG_BUSYBOX_CONFIG_PAM is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_DEVPTS=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_UTMP is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_PIDFILE=y +CONFIG_BUSYBOX_CONFIG_PID_FILE_PATH="/var/run" +# CONFIG_BUSYBOX_CONFIG_BUSYBOX is not set +# CONFIG_BUSYBOX_CONFIG_INSTALL_NO_USR is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_SUID is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_PREFER_APPLETS=y +CONFIG_BUSYBOX_CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" +# CONFIG_BUSYBOX_CONFIG_SELINUX is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_CLEAN_UP is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_SYSLOG_INFO is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_SYSLOG=y + +# +# Build Options +# +# CONFIG_BUSYBOX_CONFIG_STATIC is not set +# CONFIG_BUSYBOX_CONFIG_PIE is not set +# CONFIG_BUSYBOX_CONFIG_NOMMU is not set +CONFIG_BUSYBOX_CONFIG_CROSS_COMPILER_PREFIX="" +CONFIG_BUSYBOX_CONFIG_SYSROOT="" +CONFIG_BUSYBOX_CONFIG_EXTRA_CFLAGS="" +CONFIG_BUSYBOX_CONFIG_EXTRA_LDFLAGS="" +CONFIG_BUSYBOX_CONFIG_EXTRA_LDLIBS="" +# CONFIG_BUSYBOX_CONFIG_USE_PORTABLE_CODE is not set +# CONFIG_BUSYBOX_CONFIG_STACK_OPTIMIZATION_386 is not set +# CONFIG_BUSYBOX_CONFIG_STATIC_LIBGCC is not set + +# +# Installation Options ("make install" behavior) +# +CONFIG_BUSYBOX_CONFIG_INSTALL_APPLET_SYMLINKS=y +# CONFIG_BUSYBOX_CONFIG_INSTALL_APPLET_HARDLINKS is not set +# CONFIG_BUSYBOX_CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS is not set +# CONFIG_BUSYBOX_CONFIG_INSTALL_APPLET_DONT is not set +CONFIG_BUSYBOX_CONFIG_PREFIX="./_install" + +# +# Debugging Options +# +# CONFIG_BUSYBOX_CONFIG_DEBUG is not set +# CONFIG_BUSYBOX_CONFIG_DEBUG_SANITIZE is not set +# CONFIG_BUSYBOX_CONFIG_UNIT_TEST is not set +# CONFIG_BUSYBOX_CONFIG_WERROR is not set +# CONFIG_BUSYBOX_CONFIG_WARN_SIMPLE_MSG is not set +CONFIG_BUSYBOX_CONFIG_NO_DEBUG_LIB=y +# CONFIG_BUSYBOX_CONFIG_DMALLOC is not set +# CONFIG_BUSYBOX_CONFIG_EFENCE is not set + +# +# Library Tuning +# +# CONFIG_BUSYBOX_CONFIG_FEATURE_USE_BSS_TAIL is not set +# CONFIG_BUSYBOX_CONFIG_FLOAT_DURATION is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_RTMINMAX is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_BUFFERS_USE_MALLOC is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_BUFFERS_GO_ON_STACK=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set +CONFIG_BUSYBOX_CONFIG_PASSWORD_MINLEN=6 +CONFIG_BUSYBOX_CONFIG_MD5_SMALL=1 +CONFIG_BUSYBOX_CONFIG_SHA3_SMALL=1 +CONFIG_BUSYBOX_CONFIG_FEATURE_FAST_TOP=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_ETC_NETWORKS is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_ETC_SERVICES is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_EDITING=y +CONFIG_BUSYBOX_CONFIG_FEATURE_EDITING_MAX_LEN=512 +# CONFIG_BUSYBOX_CONFIG_FEATURE_EDITING_VI is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_EDITING_HISTORY=256 +# CONFIG_BUSYBOX_CONFIG_FEATURE_EDITING_SAVEHISTORY is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_REVERSE_SEARCH is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_TAB_COMPLETION=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_USERNAME_COMPLETION is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_EDITING_FANCY_PROMPT=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_EDITING_WINCH is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_EDITING_ASK_TERMINAL is not set +# CONFIG_BUSYBOX_CONFIG_LOCALE_SUPPORT is not set +# CONFIG_BUSYBOX_CONFIG_UNICODE_SUPPORT is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_NON_POSIX_CP=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_VERBOSE_CP_MESSAGE is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_USE_SENDFILE=y +CONFIG_BUSYBOX_CONFIG_FEATURE_COPYBUF_KB=4 +# CONFIG_BUSYBOX_CONFIG_FEATURE_SKIP_ROOTFS is not set +CONFIG_BUSYBOX_CONFIG_MONOTONIC_SYSCALL=y +CONFIG_BUSYBOX_CONFIG_IOCTL_HEX2STR_ERROR=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_HWIB is not set +# end of Settings + +# +# Applets +# + +# +# Archival Utilities +# +# CONFIG_BUSYBOX_CONFIG_FEATURE_SEAMLESS_XZ is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_SEAMLESS_LZMA is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_SEAMLESS_BZ2 is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_SEAMLESS_GZ=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_SEAMLESS_Z is not set +# CONFIG_BUSYBOX_CONFIG_AR is not set +# CONFIG_BUSYBOX_CONFIG_UNCOMPRESS is not set +CONFIG_BUSYBOX_CONFIG_GUNZIP=y +CONFIG_BUSYBOX_CONFIG_ZCAT=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_GUNZIP_LONG_OPTIONS is not set +CONFIG_BUSYBOX_CONFIG_BUNZIP2=y +CONFIG_BUSYBOX_CONFIG_BZCAT=y +# CONFIG_BUSYBOX_CONFIG_UNLZMA is not set +# CONFIG_BUSYBOX_CONFIG_LZCAT is not set +# CONFIG_BUSYBOX_CONFIG_LZMA is not set +# CONFIG_BUSYBOX_CONFIG_UNXZ is not set +# CONFIG_BUSYBOX_CONFIG_XZCAT is not set +# CONFIG_BUSYBOX_CONFIG_XZ is not set +# CONFIG_BUSYBOX_CONFIG_BZIP2 is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_BZIP2_DECOMPRESS=y +# CONFIG_BUSYBOX_CONFIG_CPIO is not set +# CONFIG_BUSYBOX_CONFIG_DPKG is not set +# CONFIG_BUSYBOX_CONFIG_DPKG_DEB is not set +CONFIG_BUSYBOX_CONFIG_GZIP=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_GZIP_LONG_OPTIONS is not set +CONFIG_BUSYBOX_CONFIG_GZIP_FAST=0 +# CONFIG_BUSYBOX_CONFIG_FEATURE_GZIP_LEVELS is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_GZIP_DECOMPRESS=y +# CONFIG_BUSYBOX_CONFIG_LZOP is not set +# CONFIG_BUSYBOX_CONFIG_UNLZOP is not set +# CONFIG_BUSYBOX_CONFIG_LZOPCAT is not set +# CONFIG_BUSYBOX_CONFIG_RPM is not set +# CONFIG_BUSYBOX_CONFIG_RPM2CPIO is not set +CONFIG_BUSYBOX_CONFIG_TAR=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_TAR_LONG_OPTIONS is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_TAR_CREATE=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_TAR_AUTODETECT is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_TAR_FROM=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_TAR_UNAME_GNAME is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_TAR_NOPRESERVE_TIME is not set +# CONFIG_BUSYBOX_CONFIG_UNZIP is not set +# end of Archival Utilities + +# +# Coreutils +# +CONFIG_BUSYBOX_CONFIG_BASENAME=y +CONFIG_BUSYBOX_CONFIG_CAT=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_CATN is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_CATV is not set +CONFIG_BUSYBOX_CONFIG_CHGRP=y +CONFIG_BUSYBOX_CONFIG_CHMOD=y +CONFIG_BUSYBOX_CONFIG_CHOWN=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_CHOWN_LONG_OPTIONS is not set +CONFIG_BUSYBOX_CONFIG_CHROOT=y +# CONFIG_BUSYBOX_CONFIG_CKSUM is not set +# CONFIG_BUSYBOX_CONFIG_COMM is not set +CONFIG_BUSYBOX_CONFIG_CP=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_CP_LONG_OPTIONS is not set +CONFIG_BUSYBOX_CONFIG_CUT=y +CONFIG_BUSYBOX_CONFIG_DATE=y +CONFIG_BUSYBOX_CONFIG_FEATURE_DATE_ISOFMT=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_DATE_NANO is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_DATE_COMPAT is not set +CONFIG_BUSYBOX_CONFIG_DD=y +CONFIG_BUSYBOX_CONFIG_FEATURE_DD_SIGNAL_HANDLING=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_DD_THIRD_STATUS_LINE is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_DD_IBS_OBS=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_DD_STATUS is not set +CONFIG_BUSYBOX_CONFIG_DF=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_DF_FANCY is not set +CONFIG_BUSYBOX_CONFIG_DIRNAME=y +# CONFIG_BUSYBOX_CONFIG_DOS2UNIX is not set +# CONFIG_BUSYBOX_CONFIG_UNIX2DOS is not set +CONFIG_BUSYBOX_CONFIG_DU=y +CONFIG_BUSYBOX_CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y +CONFIG_BUSYBOX_CONFIG_ECHO=y +CONFIG_BUSYBOX_CONFIG_FEATURE_FANCY_ECHO=y +CONFIG_BUSYBOX_CONFIG_ENV=y +# CONFIG_BUSYBOX_CONFIG_EXPAND is not set +# CONFIG_BUSYBOX_CONFIG_UNEXPAND is not set +CONFIG_BUSYBOX_CONFIG_EXPR=y +CONFIG_BUSYBOX_CONFIG_EXPR_MATH_SUPPORT_64=y +# CONFIG_BUSYBOX_CONFIG_FACTOR is not set +CONFIG_BUSYBOX_CONFIG_FALSE=y +# CONFIG_BUSYBOX_CONFIG_FOLD is not set +CONFIG_BUSYBOX_CONFIG_HEAD=y +CONFIG_BUSYBOX_CONFIG_FEATURE_FANCY_HEAD=y +# CONFIG_BUSYBOX_CONFIG_HOSTID is not set +CONFIG_BUSYBOX_CONFIG_ID=y +# CONFIG_BUSYBOX_CONFIG_GROUPS is not set +# CONFIG_BUSYBOX_CONFIG_INSTALL is not set +# CONFIG_BUSYBOX_CONFIG_LINK is not set +CONFIG_BUSYBOX_CONFIG_LN=y +# CONFIG_BUSYBOX_CONFIG_LOGNAME is not set +CONFIG_BUSYBOX_CONFIG_LS=y +CONFIG_BUSYBOX_CONFIG_FEATURE_LS_FILETYPES=y +CONFIG_BUSYBOX_CONFIG_FEATURE_LS_FOLLOWLINKS=y +CONFIG_BUSYBOX_CONFIG_FEATURE_LS_RECURSIVE=y +CONFIG_BUSYBOX_CONFIG_FEATURE_LS_WIDTH=y +CONFIG_BUSYBOX_CONFIG_FEATURE_LS_SORTFILES=y +CONFIG_BUSYBOX_CONFIG_FEATURE_LS_TIMESTAMPS=y +CONFIG_BUSYBOX_CONFIG_FEATURE_LS_USERNAME=y +CONFIG_BUSYBOX_CONFIG_FEATURE_LS_COLOR=y +CONFIG_BUSYBOX_CONFIG_FEATURE_LS_COLOR_IS_DEFAULT=y +CONFIG_BUSYBOX_CONFIG_MD5SUM=y +# CONFIG_BUSYBOX_CONFIG_SHA1SUM is not set +CONFIG_BUSYBOX_CONFIG_SHA256SUM=y +# CONFIG_BUSYBOX_CONFIG_SHA512SUM is not set +# CONFIG_BUSYBOX_CONFIG_SHA3SUM is not set + +# +# Common options for md5sum, sha1sum, sha256sum, sha512sum, sha3sum +# +CONFIG_BUSYBOX_CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y +CONFIG_BUSYBOX_CONFIG_MKDIR=y +CONFIG_BUSYBOX_CONFIG_MKFIFO=y +CONFIG_BUSYBOX_CONFIG_MKNOD=y +CONFIG_BUSYBOX_CONFIG_MKTEMP=y +CONFIG_BUSYBOX_CONFIG_MV=y +CONFIG_BUSYBOX_CONFIG_NICE=y +# CONFIG_BUSYBOX_CONFIG_NL is not set +# CONFIG_BUSYBOX_CONFIG_NOHUP is not set +# CONFIG_BUSYBOX_CONFIG_NPROC is not set +# CONFIG_BUSYBOX_CONFIG_OD is not set +# CONFIG_BUSYBOX_CONFIG_PASTE is not set +# CONFIG_BUSYBOX_CONFIG_PRINTENV is not set +CONFIG_BUSYBOX_CONFIG_PRINTF=y +CONFIG_BUSYBOX_CONFIG_PWD=y +CONFIG_BUSYBOX_CONFIG_READLINK=y +CONFIG_BUSYBOX_CONFIG_FEATURE_READLINK_FOLLOW=y +# CONFIG_BUSYBOX_CONFIG_REALPATH is not set +CONFIG_BUSYBOX_CONFIG_RM=y +CONFIG_BUSYBOX_CONFIG_RMDIR=y +CONFIG_BUSYBOX_CONFIG_SEQ=y +# CONFIG_BUSYBOX_CONFIG_SHRED is not set +# CONFIG_BUSYBOX_CONFIG_SHUF is not set +CONFIG_BUSYBOX_CONFIG_SLEEP=y +CONFIG_BUSYBOX_CONFIG_FEATURE_FANCY_SLEEP=y +CONFIG_BUSYBOX_CONFIG_SORT=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_SORT_BIG is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_SORT_OPTIMIZE_MEMORY is not set +# CONFIG_BUSYBOX_CONFIG_SPLIT is not set +# CONFIG_BUSYBOX_CONFIG_STAT is not set +# CONFIG_BUSYBOX_CONFIG_STTY is not set +# CONFIG_BUSYBOX_CONFIG_SUM is not set +CONFIG_BUSYBOX_CONFIG_SYNC=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_SYNC_FANCY is not set +CONFIG_BUSYBOX_CONFIG_FSYNC=y +# CONFIG_BUSYBOX_CONFIG_TAC is not set +CONFIG_BUSYBOX_CONFIG_TAIL=y +CONFIG_BUSYBOX_CONFIG_FEATURE_FANCY_TAIL=y +CONFIG_BUSYBOX_CONFIG_TEE=y +CONFIG_BUSYBOX_CONFIG_FEATURE_TEE_USE_BLOCK_IO=y +CONFIG_BUSYBOX_CONFIG_TEST=y +CONFIG_BUSYBOX_CONFIG_TEST1=y +CONFIG_BUSYBOX_CONFIG_TEST2=y +CONFIG_BUSYBOX_CONFIG_FEATURE_TEST_64=y +# CONFIG_BUSYBOX_CONFIG_TIMEOUT is not set +CONFIG_BUSYBOX_CONFIG_TOUCH=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_TOUCH_NODEREF is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_TOUCH_SUSV3=y +CONFIG_BUSYBOX_CONFIG_TR=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_TR_CLASSES is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_TR_EQUIV is not set +CONFIG_BUSYBOX_CONFIG_TRUE=y +# CONFIG_BUSYBOX_CONFIG_TRUNCATE is not set +# CONFIG_BUSYBOX_CONFIG_TTY is not set +CONFIG_BUSYBOX_CONFIG_UNAME=y +CONFIG_BUSYBOX_CONFIG_UNAME_OSNAME="GNU/Linux" +# CONFIG_BUSYBOX_CONFIG_BB_ARCH is not set +CONFIG_BUSYBOX_CONFIG_UNIQ=y +# CONFIG_BUSYBOX_CONFIG_UNLINK is not set +# CONFIG_BUSYBOX_CONFIG_USLEEP is not set +# CONFIG_BUSYBOX_CONFIG_UUDECODE is not set +# CONFIG_BUSYBOX_CONFIG_BASE32 is not set +# CONFIG_BUSYBOX_CONFIG_BASE64 is not set +# CONFIG_BUSYBOX_CONFIG_UUENCODE is not set +CONFIG_BUSYBOX_CONFIG_WC=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_WC_LARGE is not set +# CONFIG_BUSYBOX_CONFIG_WHOAMI is not set +CONFIG_BUSYBOX_CONFIG_YES=y + +# +# Common options +# +# CONFIG_BUSYBOX_CONFIG_FEATURE_VERBOSE is not set + +# +# Common options for cp and mv +# +CONFIG_BUSYBOX_CONFIG_FEATURE_PRESERVE_HARDLINKS=y + +# +# Common options for df, du, ls +# +CONFIG_BUSYBOX_CONFIG_FEATURE_HUMAN_READABLE=y +# end of Coreutils + +# +# Console Utilities +# +# CONFIG_BUSYBOX_CONFIG_CHVT is not set +CONFIG_BUSYBOX_CONFIG_CLEAR=y +# CONFIG_BUSYBOX_CONFIG_DEALLOCVT is not set +# CONFIG_BUSYBOX_CONFIG_DUMPKMAP is not set +# CONFIG_BUSYBOX_CONFIG_FGCONSOLE is not set +# CONFIG_BUSYBOX_CONFIG_KBD_MODE is not set +# CONFIG_BUSYBOX_CONFIG_LOADFONT is not set +# CONFIG_BUSYBOX_CONFIG_SETFONT is not set +# CONFIG_BUSYBOX_CONFIG_LOADKMAP is not set +# CONFIG_BUSYBOX_CONFIG_OPENVT is not set +CONFIG_BUSYBOX_CONFIG_RESET=y +# CONFIG_BUSYBOX_CONFIG_RESIZE is not set +# CONFIG_BUSYBOX_CONFIG_SETCONSOLE is not set +# CONFIG_BUSYBOX_CONFIG_SETKEYCODES is not set +# CONFIG_BUSYBOX_CONFIG_SETLOGCONS is not set +# CONFIG_BUSYBOX_CONFIG_SHOWKEY is not set +# end of Console Utilities + +# +# Debian Utilities +# +# CONFIG_BUSYBOX_CONFIG_PIPE_PROGRESS is not set +# CONFIG_BUSYBOX_CONFIG_RUN_PARTS is not set +CONFIG_BUSYBOX_CONFIG_START_STOP_DAEMON=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_START_STOP_DAEMON_FANCY is not set +CONFIG_BUSYBOX_CONFIG_WHICH=y +# end of Debian Utilities + +# +# klibc-utils +# +# CONFIG_BUSYBOX_CONFIG_MINIPS is not set +# CONFIG_BUSYBOX_CONFIG_NUKE is not set +# CONFIG_BUSYBOX_CONFIG_RESUME is not set +# CONFIG_BUSYBOX_CONFIG_RUN_INIT is not set +# end of klibc-utils + +# +# Editors +# +CONFIG_BUSYBOX_CONFIG_AWK=y +CONFIG_BUSYBOX_CONFIG_FEATURE_AWK_LIBM=y +CONFIG_BUSYBOX_CONFIG_FEATURE_AWK_GNU_EXTENSIONS=y +CONFIG_BUSYBOX_CONFIG_CMP=y +# CONFIG_BUSYBOX_CONFIG_DIFF is not set +# CONFIG_BUSYBOX_CONFIG_ED is not set +# CONFIG_BUSYBOX_CONFIG_PATCH is not set +CONFIG_BUSYBOX_CONFIG_SED=y +CONFIG_BUSYBOX_CONFIG_VI=y +CONFIG_BUSYBOX_CONFIG_FEATURE_VI_MAX_LEN=1024 +# CONFIG_BUSYBOX_CONFIG_FEATURE_VI_8BIT is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_VI_COLON=y +CONFIG_BUSYBOX_CONFIG_FEATURE_VI_YANKMARK=y +CONFIG_BUSYBOX_CONFIG_FEATURE_VI_SEARCH=y +CONFIG_BUSYBOX_CONFIG_FEATURE_VI_USE_SIGNALS=y +CONFIG_BUSYBOX_CONFIG_FEATURE_VI_DOT_CMD=y +CONFIG_BUSYBOX_CONFIG_FEATURE_VI_READONLY=y +CONFIG_BUSYBOX_CONFIG_FEATURE_VI_SETOPTS=y +CONFIG_BUSYBOX_CONFIG_FEATURE_VI_SET=y +CONFIG_BUSYBOX_CONFIG_FEATURE_VI_WIN_RESIZE=y +CONFIG_BUSYBOX_CONFIG_FEATURE_VI_ASK_TERMINAL=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_VI_UNDO is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_ALLOW_EXEC=y +# end of Editors + +# +# Finding Utilities +# +CONFIG_BUSYBOX_CONFIG_FIND=y +CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_PRINT0=y +CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_MTIME=y +CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_MMIN=y +CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_PERM=y +CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_TYPE=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_EXECUTABLE is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_XDEV=y +CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_MAXDEPTH=y +CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_NEWER=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_INUM is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_EXEC=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_EXEC_PLUS is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_USER=y +CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_GROUP=y +CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_NOT=y +CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_DEPTH=y +CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_PAREN=y +CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_SIZE=y +CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_PRUNE=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_QUIT is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_DELETE is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_EMPTY is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_PATH=y +CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_REGEX=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_LINKS is not set +CONFIG_BUSYBOX_CONFIG_GREP=y +CONFIG_BUSYBOX_CONFIG_EGREP=y +CONFIG_BUSYBOX_CONFIG_FGREP=y +CONFIG_BUSYBOX_CONFIG_FEATURE_GREP_CONTEXT=y +CONFIG_BUSYBOX_CONFIG_XARGS=y +CONFIG_BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION=y +CONFIG_BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y +CONFIG_BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y +CONFIG_BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_REPL_STR is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_PARALLEL is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_ARGS_FILE is not set +# end of Finding Utilities + +# +# Init Utilities +# +# CONFIG_BUSYBOX_CONFIG_BOOTCHARTD is not set +CONFIG_BUSYBOX_CONFIG_HALT=y +CONFIG_BUSYBOX_CONFIG_POWEROFF=y +CONFIG_BUSYBOX_CONFIG_REBOOT=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_WAIT_FOR_INIT is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_CALL_TELINIT is not set +# CONFIG_BUSYBOX_CONFIG_INIT is not set +# CONFIG_BUSYBOX_CONFIG_LINUXRC is not set +# end of Init Utilities + +# +# Login/Password Management Utilities +# +CONFIG_BUSYBOX_CONFIG_FEATURE_SHADOWPASSWDS=y +# CONFIG_BUSYBOX_CONFIG_USE_BB_PWD_GRP is not set +# CONFIG_BUSYBOX_CONFIG_USE_BB_CRYPT is not set +# CONFIG_BUSYBOX_CONFIG_ADD_SHELL is not set +# CONFIG_BUSYBOX_CONFIG_REMOVE_SHELL is not set +CONFIG_BUSYBOX_CONFIG_ADDGROUP=y +CONFIG_BUSYBOX_CONFIG_FEATURE_ADDUSER_TO_GROUP=y +CONFIG_BUSYBOX_CONFIG_ADDUSER=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_CHECK_NAMES is not set +CONFIG_BUSYBOX_CONFIG_LAST_ID=0 +CONFIG_BUSYBOX_CONFIG_FIRST_SYSTEM_ID=0 +CONFIG_BUSYBOX_CONFIG_LAST_SYSTEM_ID=0 +CONFIG_BUSYBOX_CONFIG_CHPASSWD=y +CONFIG_BUSYBOX_CONFIG_FEATURE_DEFAULT_PASSWD_ALGO="md5" +# CONFIG_BUSYBOX_CONFIG_CRYPTPW is not set +# CONFIG_BUSYBOX_CONFIG_MKPASSWD is not set +CONFIG_BUSYBOX_CONFIG_DELUSER=y +CONFIG_BUSYBOX_CONFIG_DELGROUP=y +CONFIG_BUSYBOX_CONFIG_FEATURE_DEL_USER_FROM_GROUP=y +# CONFIG_BUSYBOX_CONFIG_GETTY is not set +CONFIG_BUSYBOX_CONFIG_LOGIN=y +# CONFIG_BUSYBOX_CONFIG_LOGIN_SESSION_AS_CHILD is not set +# CONFIG_BUSYBOX_CONFIG_LOGIN_SCRIPTS is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_NOLOGIN is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_SECURETTY is not set +CONFIG_BUSYBOX_CONFIG_PASSWD=y +CONFIG_BUSYBOX_CONFIG_FEATURE_PASSWD_WEAK_CHECK=y +# CONFIG_BUSYBOX_CONFIG_SU is not set +# CONFIG_BUSYBOX_CONFIG_SULOGIN is not set +# CONFIG_BUSYBOX_CONFIG_VLOCK is not set +# end of Login/Password Management Utilities + +# +# Linux Ext2 FS Progs +# +# CONFIG_BUSYBOX_CONFIG_CHATTR is not set +# CONFIG_BUSYBOX_CONFIG_FSCK is not set +# CONFIG_BUSYBOX_CONFIG_LSATTR is not set +# CONFIG_BUSYBOX_CONFIG_TUNE2FS is not set +# end of Linux Ext2 FS Progs + +# +# Linux Module Utilities +# +# CONFIG_BUSYBOX_CONFIG_MODPROBE_SMALL is not set +# CONFIG_BUSYBOX_CONFIG_DEPMOD is not set +# CONFIG_BUSYBOX_CONFIG_INSMOD is not set +# CONFIG_BUSYBOX_CONFIG_LSMOD is not set +# CONFIG_BUSYBOX_CONFIG_MODINFO is not set +# CONFIG_BUSYBOX_CONFIG_MODPROBE is not set +# CONFIG_BUSYBOX_CONFIG_RMMOD is not set + +# +# Options common to multiple modutils +# +# end of Linux Module Utilities + +# +# Linux System Utilities +# +# CONFIG_BUSYBOX_CONFIG_ACPID is not set +# CONFIG_BUSYBOX_CONFIG_BLKDISCARD is not set +# CONFIG_BUSYBOX_CONFIG_BLKID is not set +# CONFIG_BUSYBOX_CONFIG_BLOCKDEV is not set +# CONFIG_BUSYBOX_CONFIG_CAL is not set +# CONFIG_BUSYBOX_CONFIG_CHRT is not set +CONFIG_BUSYBOX_CONFIG_DMESG=y +CONFIG_BUSYBOX_CONFIG_FEATURE_DMESG_PRETTY=y +# CONFIG_BUSYBOX_CONFIG_EJECT is not set +# CONFIG_BUSYBOX_CONFIG_FALLOCATE is not set +# CONFIG_BUSYBOX_CONFIG_FATATTR is not set +# CONFIG_BUSYBOX_CONFIG_FBSET is not set +# CONFIG_BUSYBOX_CONFIG_FDFORMAT is not set +# CONFIG_BUSYBOX_CONFIG_FDISK is not set +# CONFIG_BUSYBOX_CONFIG_FINDFS is not set +CONFIG_BUSYBOX_CONFIG_FLOCK=y +# CONFIG_BUSYBOX_CONFIG_FDFLUSH is not set +# CONFIG_BUSYBOX_CONFIG_FREERAMDISK is not set +# CONFIG_BUSYBOX_CONFIG_FSCK_MINIX is not set +# CONFIG_BUSYBOX_CONFIG_FSFREEZE is not set +# CONFIG_BUSYBOX_CONFIG_FSTRIM is not set +# CONFIG_BUSYBOX_CONFIG_GETOPT is not set +CONFIG_BUSYBOX_CONFIG_HEXDUMP=y +# CONFIG_BUSYBOX_CONFIG_HD is not set +# CONFIG_BUSYBOX_CONFIG_XXD is not set +CONFIG_BUSYBOX_CONFIG_HWCLOCK=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS is not set +# CONFIG_BUSYBOX_CONFIG_IONICE is not set +# CONFIG_BUSYBOX_CONFIG_IPCRM is not set +# CONFIG_BUSYBOX_CONFIG_IPCS is not set +# CONFIG_BUSYBOX_CONFIG_LOSETUP is not set +# CONFIG_BUSYBOX_CONFIG_LSPCI is not set +# CONFIG_BUSYBOX_CONFIG_LSUSB is not set +# CONFIG_BUSYBOX_CONFIG_MDEV is not set +# CONFIG_BUSYBOX_CONFIG_MESG is not set +# CONFIG_BUSYBOX_CONFIG_MKE2FS is not set +# CONFIG_BUSYBOX_CONFIG_MKFS_EXT2 is not set +# CONFIG_BUSYBOX_CONFIG_MKFS_MINIX is not set +# CONFIG_BUSYBOX_CONFIG_MKFS_REISER is not set +# CONFIG_BUSYBOX_CONFIG_MKDOSFS is not set +# CONFIG_BUSYBOX_CONFIG_MKFS_VFAT is not set +CONFIG_BUSYBOX_CONFIG_MKSWAP=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_MKSWAP_UUID is not set +# CONFIG_BUSYBOX_CONFIG_MORE is not set +CONFIG_BUSYBOX_CONFIG_MOUNT=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_FAKE is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_VERBOSE is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_HELPERS=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_LABEL is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_NFS is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_CIFS=y +CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_FLAGS=y +CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_FSTAB=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_OTHERTAB is not set +# CONFIG_BUSYBOX_CONFIG_MOUNTPOINT is not set +# CONFIG_BUSYBOX_CONFIG_NSENTER is not set +CONFIG_BUSYBOX_CONFIG_PIVOT_ROOT=y +# CONFIG_BUSYBOX_CONFIG_RDATE is not set +# CONFIG_BUSYBOX_CONFIG_RDEV is not set +# CONFIG_BUSYBOX_CONFIG_READPROFILE is not set +# CONFIG_BUSYBOX_CONFIG_RENICE is not set +# CONFIG_BUSYBOX_CONFIG_REV is not set +# CONFIG_BUSYBOX_CONFIG_RTCWAKE is not set +# CONFIG_BUSYBOX_CONFIG_SCRIPT is not set +# CONFIG_BUSYBOX_CONFIG_SCRIPTREPLAY is not set +# CONFIG_BUSYBOX_CONFIG_SETARCH is not set +# CONFIG_BUSYBOX_CONFIG_LINUX32 is not set +# CONFIG_BUSYBOX_CONFIG_LINUX64 is not set +# CONFIG_BUSYBOX_CONFIG_SETPRIV is not set +# CONFIG_BUSYBOX_CONFIG_SETSID is not set +CONFIG_BUSYBOX_CONFIG_SWAPON=y +CONFIG_BUSYBOX_CONFIG_FEATURE_SWAPON_DISCARD=y +CONFIG_BUSYBOX_CONFIG_FEATURE_SWAPON_PRI=y +CONFIG_BUSYBOX_CONFIG_SWAPOFF=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_SWAPONOFF_LABEL is not set +CONFIG_BUSYBOX_CONFIG_SWITCH_ROOT=y +# CONFIG_BUSYBOX_CONFIG_TASKSET is not set +# CONFIG_BUSYBOX_CONFIG_UEVENT is not set +CONFIG_BUSYBOX_CONFIG_UMOUNT=y +CONFIG_BUSYBOX_CONFIG_FEATURE_UMOUNT_ALL=y +# CONFIG_BUSYBOX_CONFIG_UNSHARE is not set + +# +# Common options for mount/umount +# +CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_LOOP=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_MOUNT_LOOP_CREATE is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_MTAB_SUPPORT is not set +# CONFIG_BUSYBOX_CONFIG_VOLUMEID is not set +# end of Linux System Utilities + +# +# Miscellaneous Utilities +# +# CONFIG_BUSYBOX_CONFIG_ADJTIMEX is not set +# CONFIG_BUSYBOX_CONFIG_BBCONFIG is not set +# CONFIG_BUSYBOX_CONFIG_BC is not set +# CONFIG_BUSYBOX_CONFIG_DC is not set +# CONFIG_BUSYBOX_CONFIG_BEEP is not set +# CONFIG_BUSYBOX_CONFIG_CHAT is not set +# CONFIG_BUSYBOX_CONFIG_CONSPY is not set +CONFIG_BUSYBOX_CONFIG_CROND=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_CROND_D is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_CROND_SPECIAL_TIMES is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_CROND_DIR="/etc" +CONFIG_BUSYBOX_CONFIG_CRONTAB=y +# CONFIG_BUSYBOX_CONFIG_DEVFSD is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_DEVFS is not set +# CONFIG_BUSYBOX_CONFIG_DEVMEM is not set +# CONFIG_BUSYBOX_CONFIG_FBSPLASH is not set +# CONFIG_BUSYBOX_CONFIG_FLASH_ERASEALL is not set +# CONFIG_BUSYBOX_CONFIG_FLASH_LOCK is not set +# CONFIG_BUSYBOX_CONFIG_FLASH_UNLOCK is not set +# CONFIG_BUSYBOX_CONFIG_FLASHCP is not set +# CONFIG_BUSYBOX_CONFIG_HDPARM is not set +# CONFIG_BUSYBOX_CONFIG_HEXEDIT is not set +# CONFIG_BUSYBOX_CONFIG_I2CGET is not set +# CONFIG_BUSYBOX_CONFIG_I2CSET is not set +# CONFIG_BUSYBOX_CONFIG_I2CDUMP is not set +# CONFIG_BUSYBOX_CONFIG_I2CDETECT is not set +# CONFIG_BUSYBOX_CONFIG_I2CTRANSFER is not set +# CONFIG_BUSYBOX_CONFIG_INOTIFYD is not set +CONFIG_BUSYBOX_CONFIG_LESS=y +CONFIG_BUSYBOX_CONFIG_FEATURE_LESS_MAXLINES=9999999 +# CONFIG_BUSYBOX_CONFIG_FEATURE_LESS_BRACKETS is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_LESS_FLAGS is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_LESS_TRUNCATE is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_LESS_MARKS is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_LESS_REGEXP is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_LESS_WINCH is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_LESS_DASHCMD is not set +CONFIG_BUSYBOX_CONFIG_LOCK=y +# CONFIG_BUSYBOX_CONFIG_LSSCSI is not set +# CONFIG_BUSYBOX_CONFIG_MAKEDEVS is not set +# CONFIG_BUSYBOX_CONFIG_MAN is not set +# CONFIG_BUSYBOX_CONFIG_MICROCOM is not set +# CONFIG_BUSYBOX_CONFIG_MT is not set +# CONFIG_BUSYBOX_CONFIG_NANDWRITE is not set +# CONFIG_BUSYBOX_CONFIG_NANDDUMP is not set +# CONFIG_BUSYBOX_CONFIG_PARTPROBE is not set +# CONFIG_BUSYBOX_CONFIG_RAIDAUTORUN is not set +# CONFIG_BUSYBOX_CONFIG_READAHEAD is not set +# CONFIG_BUSYBOX_CONFIG_RFKILL is not set +# CONFIG_BUSYBOX_CONFIG_RX is not set +# CONFIG_BUSYBOX_CONFIG_SETFATTR is not set +# CONFIG_BUSYBOX_CONFIG_SETSERIAL is not set +CONFIG_BUSYBOX_CONFIG_STRINGS=y +CONFIG_BUSYBOX_CONFIG_TIME=y +# CONFIG_BUSYBOX_CONFIG_TS is not set +# CONFIG_BUSYBOX_CONFIG_TTYSIZE is not set +# CONFIG_BUSYBOX_CONFIG_UBIATTACH is not set +# CONFIG_BUSYBOX_CONFIG_UBIDETACH is not set +# CONFIG_BUSYBOX_CONFIG_UBIMKVOL is not set +# CONFIG_BUSYBOX_CONFIG_UBIRMVOL is not set +# CONFIG_BUSYBOX_CONFIG_UBIRSVOL is not set +# CONFIG_BUSYBOX_CONFIG_UBIUPDATEVOL is not set +# CONFIG_BUSYBOX_CONFIG_UBIRENAME is not set +# CONFIG_BUSYBOX_CONFIG_VOLNAME is not set +# CONFIG_BUSYBOX_CONFIG_WATCHDOG is not set +# end of Miscellaneous Utilities + +# +# Networking Utilities +# +CONFIG_BUSYBOX_CONFIG_FEATURE_IPV6=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_UNIX_LOCAL is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_PREFER_IPV4_ADDRESS is not set +CONFIG_BUSYBOX_CONFIG_VERBOSE_RESOLUTION_ERRORS=y +# CONFIG_BUSYBOX_CONFIG_ARP is not set +# CONFIG_BUSYBOX_CONFIG_ARPING is not set +CONFIG_BUSYBOX_CONFIG_BRCTL=y +CONFIG_BUSYBOX_CONFIG_FEATURE_BRCTL_FANCY=y +CONFIG_BUSYBOX_CONFIG_FEATURE_BRCTL_SHOW=y +# CONFIG_BUSYBOX_CONFIG_DNSD is not set +# CONFIG_BUSYBOX_CONFIG_ETHER_WAKE is not set +# CONFIG_BUSYBOX_CONFIG_FTPD is not set +# CONFIG_BUSYBOX_CONFIG_FTPGET is not set +# CONFIG_BUSYBOX_CONFIG_FTPPUT is not set +# CONFIG_BUSYBOX_CONFIG_HOSTNAME is not set +# CONFIG_BUSYBOX_CONFIG_DNSDOMAINNAME is not set +# CONFIG_BUSYBOX_CONFIG_HTTPD is not set +CONFIG_BUSYBOX_CONFIG_IFCONFIG=y +CONFIG_BUSYBOX_CONFIG_FEATURE_IFCONFIG_STATUS=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_IFCONFIG_SLIP is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_IFCONFIG_HW=y +CONFIG_BUSYBOX_CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS=y +# CONFIG_BUSYBOX_CONFIG_IFENSLAVE is not set +# CONFIG_BUSYBOX_CONFIG_IFPLUGD is not set +# CONFIG_BUSYBOX_CONFIG_IFUP is not set +# CONFIG_BUSYBOX_CONFIG_IFDOWN is not set +# CONFIG_BUSYBOX_CONFIG_INETD is not set +CONFIG_BUSYBOX_CONFIG_IP=y +# CONFIG_BUSYBOX_CONFIG_IPADDR is not set +# CONFIG_BUSYBOX_CONFIG_IPLINK is not set +# CONFIG_BUSYBOX_CONFIG_IPROUTE is not set +# CONFIG_BUSYBOX_CONFIG_IPTUNNEL is not set +# CONFIG_BUSYBOX_CONFIG_IPRULE is not set +# CONFIG_BUSYBOX_CONFIG_IPNEIGH is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_IP_ADDRESS=y +CONFIG_BUSYBOX_CONFIG_FEATURE_IP_LINK=y +CONFIG_BUSYBOX_CONFIG_FEATURE_IP_ROUTE=y +CONFIG_BUSYBOX_CONFIG_FEATURE_IP_ROUTE_DIR="/etc/iproute2" +# CONFIG_BUSYBOX_CONFIG_FEATURE_IP_TUNNEL is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_IP_RULE=y +CONFIG_BUSYBOX_CONFIG_FEATURE_IP_NEIGH=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set +# CONFIG_BUSYBOX_CONFIG_IPCALC is not set +# CONFIG_BUSYBOX_CONFIG_FAKEIDENTD is not set +# CONFIG_BUSYBOX_CONFIG_NAMEIF is not set +# CONFIG_BUSYBOX_CONFIG_NBDCLIENT is not set +CONFIG_BUSYBOX_CONFIG_NC=y +# CONFIG_BUSYBOX_CONFIG_NETCAT is not set +# CONFIG_BUSYBOX_CONFIG_NC_SERVER is not set +# CONFIG_BUSYBOX_CONFIG_NC_EXTRA is not set +# CONFIG_BUSYBOX_CONFIG_NC_110_COMPAT is not set +CONFIG_BUSYBOX_CONFIG_NETMSG=y +CONFIG_BUSYBOX_CONFIG_NETSTAT=y +CONFIG_BUSYBOX_CONFIG_FEATURE_NETSTAT_WIDE=y +CONFIG_BUSYBOX_CONFIG_FEATURE_NETSTAT_PRG=y +# CONFIG_BUSYBOX_CONFIG_NSLOOKUP is not set +CONFIG_BUSYBOX_CONFIG_NSLOOKUP_OPENWRT=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_NSLOOKUP_OPENWRT_LONG_OPTIONS is not set +CONFIG_BUSYBOX_CONFIG_NTPD=y +CONFIG_BUSYBOX_CONFIG_FEATURE_NTPD_SERVER=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_NTPD_CONF is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_NTP_AUTH is not set +CONFIG_BUSYBOX_CONFIG_PING=y +CONFIG_BUSYBOX_CONFIG_PING6=y +CONFIG_BUSYBOX_CONFIG_FEATURE_FANCY_PING=y +# CONFIG_BUSYBOX_CONFIG_PSCAN is not set +CONFIG_BUSYBOX_CONFIG_ROUTE=y +# CONFIG_BUSYBOX_CONFIG_SLATTACH is not set +# CONFIG_BUSYBOX_CONFIG_SSL_CLIENT is not set +# CONFIG_BUSYBOX_CONFIG_TC is not set +# CONFIG_BUSYBOX_CONFIG_TCPSVD is not set +# CONFIG_BUSYBOX_CONFIG_UDPSVD is not set +# CONFIG_BUSYBOX_CONFIG_TELNET is not set +# CONFIG_BUSYBOX_CONFIG_TELNETD is not set +# CONFIG_BUSYBOX_CONFIG_TFTP is not set +# CONFIG_BUSYBOX_CONFIG_TFTPD is not set +# CONFIG_BUSYBOX_CONFIG_TLS is not set +CONFIG_BUSYBOX_CONFIG_TRACEROUTE=y +CONFIG_BUSYBOX_CONFIG_TRACEROUTE6=y +CONFIG_BUSYBOX_CONFIG_FEATURE_TRACEROUTE_VERBOSE=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set +# CONFIG_BUSYBOX_CONFIG_TUNCTL is not set +# CONFIG_BUSYBOX_CONFIG_VCONFIG is not set +# CONFIG_BUSYBOX_CONFIG_WGET is not set +# CONFIG_BUSYBOX_CONFIG_WHOIS is not set +# CONFIG_BUSYBOX_CONFIG_ZCIP is not set +# CONFIG_BUSYBOX_CONFIG_UDHCPD is not set +# CONFIG_BUSYBOX_CONFIG_DUMPLEASES is not set +# CONFIG_BUSYBOX_CONFIG_DHCPRELAY is not set +CONFIG_BUSYBOX_CONFIG_UDHCPC=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_UDHCPC_ARPING is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_UDHCPC_SANITIZEOPT is not set +CONFIG_BUSYBOX_CONFIG_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script" +# CONFIG_BUSYBOX_CONFIG_UDHCPC6 is not set + +# +# Common options for DHCP applets +# +# CONFIG_BUSYBOX_CONFIG_FEATURE_UDHCP_PORT is not set +CONFIG_BUSYBOX_CONFIG_UDHCP_DEBUG=0 +CONFIG_BUSYBOX_CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80 +CONFIG_BUSYBOX_CONFIG_FEATURE_UDHCP_RFC3397=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_UDHCP_8021Q is not set +# end of Networking Utilities + +# +# Print Utilities +# +# CONFIG_BUSYBOX_CONFIG_LPD is not set +# CONFIG_BUSYBOX_CONFIG_LPR is not set +# CONFIG_BUSYBOX_CONFIG_LPQ is not set +# end of Print Utilities + +# +# Mail Utilities +# +# CONFIG_BUSYBOX_CONFIG_MAKEMIME is not set +# CONFIG_BUSYBOX_CONFIG_POPMAILDIR is not set +# CONFIG_BUSYBOX_CONFIG_REFORMIME is not set +# CONFIG_BUSYBOX_CONFIG_SENDMAIL is not set +# end of Mail Utilities + +# +# Process Utilities +# +CONFIG_BUSYBOX_CONFIG_FREE=y +# CONFIG_BUSYBOX_CONFIG_FUSER is not set +# CONFIG_BUSYBOX_CONFIG_IOSTAT is not set +CONFIG_BUSYBOX_CONFIG_KILL=y +CONFIG_BUSYBOX_CONFIG_KILLALL=y +# CONFIG_BUSYBOX_CONFIG_KILLALL5 is not set +# CONFIG_BUSYBOX_CONFIG_LSOF is not set +# CONFIG_BUSYBOX_CONFIG_MPSTAT is not set +# CONFIG_BUSYBOX_CONFIG_NMETER is not set +CONFIG_BUSYBOX_CONFIG_PGREP=y +# CONFIG_BUSYBOX_CONFIG_PKILL is not set +CONFIG_BUSYBOX_CONFIG_PIDOF=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_PIDOF_SINGLE is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_PIDOF_OMIT is not set +# CONFIG_BUSYBOX_CONFIG_PMAP is not set +# CONFIG_BUSYBOX_CONFIG_POWERTOP is not set +CONFIG_BUSYBOX_CONFIG_PS=y +CONFIG_BUSYBOX_CONFIG_FEATURE_PS_WIDE=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_PS_LONG is not set +# CONFIG_BUSYBOX_CONFIG_PSTREE is not set +# CONFIG_BUSYBOX_CONFIG_PWDX is not set +# CONFIG_BUSYBOX_CONFIG_SMEMCAP is not set +CONFIG_BUSYBOX_CONFIG_BB_SYSCTL=y +CONFIG_BUSYBOX_CONFIG_TOP=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_TOP_INTERACTIVE is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y +CONFIG_BUSYBOX_CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_TOP_SMP_CPU is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_TOP_DECIMALS is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_TOP_SMP_PROCESS is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_TOPMEM is not set +CONFIG_BUSYBOX_CONFIG_UPTIME=y +# CONFIG_BUSYBOX_CONFIG_WATCH is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_SHOW_THREADS is not set +# end of Process Utilities + +# +# Runit Utilities +# +# CONFIG_BUSYBOX_CONFIG_CHPST is not set +# CONFIG_BUSYBOX_CONFIG_SETUIDGID is not set +# CONFIG_BUSYBOX_CONFIG_ENVUIDGID is not set +# CONFIG_BUSYBOX_CONFIG_ENVDIR is not set +# CONFIG_BUSYBOX_CONFIG_SOFTLIMIT is not set +# CONFIG_BUSYBOX_CONFIG_RUNSV is not set +# CONFIG_BUSYBOX_CONFIG_RUNSVDIR is not set +# CONFIG_BUSYBOX_CONFIG_SV is not set +# CONFIG_BUSYBOX_CONFIG_SVC is not set +# CONFIG_BUSYBOX_CONFIG_SVOK is not set +# CONFIG_BUSYBOX_CONFIG_SVLOGD is not set +# end of Runit Utilities + +# +# Shells +# +CONFIG_BUSYBOX_CONFIG_SH_IS_ASH=y +# CONFIG_BUSYBOX_CONFIG_SH_IS_HUSH is not set +# CONFIG_BUSYBOX_CONFIG_SH_IS_NONE is not set +# CONFIG_BUSYBOX_CONFIG_BASH_IS_ASH is not set +# CONFIG_BUSYBOX_CONFIG_BASH_IS_HUSH is not set +CONFIG_BUSYBOX_CONFIG_BASH_IS_NONE=y +CONFIG_BUSYBOX_CONFIG_SHELL_ASH=y +CONFIG_BUSYBOX_CONFIG_ASH=y +# CONFIG_BUSYBOX_CONFIG_ASH_OPTIMIZE_FOR_SIZE is not set +CONFIG_BUSYBOX_CONFIG_ASH_INTERNAL_GLOB=y +CONFIG_BUSYBOX_CONFIG_ASH_BASH_COMPAT=y +# CONFIG_BUSYBOX_CONFIG_ASH_BASH_SOURCE_CURDIR is not set +# CONFIG_BUSYBOX_CONFIG_ASH_BASH_NOT_FOUND_HOOK is not set +CONFIG_BUSYBOX_CONFIG_ASH_JOB_CONTROL=y +CONFIG_BUSYBOX_CONFIG_ASH_ALIAS=y +# CONFIG_BUSYBOX_CONFIG_ASH_RANDOM_SUPPORT is not set +CONFIG_BUSYBOX_CONFIG_ASH_EXPAND_PRMT=y +# CONFIG_BUSYBOX_CONFIG_ASH_IDLE_TIMEOUT is not set +# CONFIG_BUSYBOX_CONFIG_ASH_MAIL is not set +CONFIG_BUSYBOX_CONFIG_ASH_ECHO=y +CONFIG_BUSYBOX_CONFIG_ASH_PRINTF=y +CONFIG_BUSYBOX_CONFIG_ASH_TEST=y +# CONFIG_BUSYBOX_CONFIG_ASH_HELP is not set +CONFIG_BUSYBOX_CONFIG_ASH_GETOPTS=y +CONFIG_BUSYBOX_CONFIG_ASH_CMDCMD=y +# CONFIG_BUSYBOX_CONFIG_CTTYHACK is not set +# CONFIG_BUSYBOX_CONFIG_HUSH is not set +# CONFIG_BUSYBOX_CONFIG_SHELL_HUSH is not set + +# +# Options common to all shells +# +CONFIG_BUSYBOX_CONFIG_FEATURE_SH_MATH=y +CONFIG_BUSYBOX_CONFIG_FEATURE_SH_MATH_64=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_SH_MATH_BASE is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_SH_EXTRA_QUIET is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_SH_STANDALONE is not set +CONFIG_BUSYBOX_CONFIG_FEATURE_SH_NOFORK=y +# CONFIG_BUSYBOX_CONFIG_FEATURE_SH_READ_FRAC is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_SH_HISTFILESIZE is not set +# CONFIG_BUSYBOX_CONFIG_FEATURE_SH_EMBEDDED_SCRIPTS is not set +# end of Shells + +# +# System Logging Utilities +# +# CONFIG_BUSYBOX_CONFIG_KLOGD is not set +CONFIG_BUSYBOX_CONFIG_LOGGER=y +# CONFIG_BUSYBOX_CONFIG_LOGREAD is not set +# CONFIG_BUSYBOX_CONFIG_SYSLOGD is not set +# end of System Logging Utilities + +# CONFIG_PACKAGE_busybox-selinux is not set +CONFIG_PACKAGE_ca-bundle=y +CONFIG_PACKAGE_ca-certificates=y +# CONFIG_PACKAGE_dnsmasq is not set +# CONFIG_PACKAGE_dnsmasq-dhcpv6 is not set +CONFIG_PACKAGE_dnsmasq-full=y +CONFIG_PACKAGE_dnsmasq_full_dhcp=y +CONFIG_PACKAGE_dnsmasq_full_dhcpv6=y +CONFIG_PACKAGE_dnsmasq_full_dnssec=y +CONFIG_PACKAGE_dnsmasq_full_auth=y +CONFIG_PACKAGE_dnsmasq_full_ipset=y +CONFIG_PACKAGE_dnsmasq_full_conntrack=y +CONFIG_PACKAGE_dnsmasq_full_noid=y +# CONFIG_PACKAGE_dnsmasq_full_broken_rtc is not set +CONFIG_PACKAGE_dnsmasq_full_tftp=y +CONFIG_PACKAGE_dropbear=y + +# +# Configuration +# +CONFIG_DROPBEAR_CURVE25519=y +# CONFIG_DROPBEAR_ECC is not set +CONFIG_DROPBEAR_ED25519=y +CONFIG_DROPBEAR_CHACHA20POLY1305=y +# CONFIG_DROPBEAR_ZLIB is not set +CONFIG_DROPBEAR_DBCLIENT=y +CONFIG_DROPBEAR_SCP=y +# CONFIG_DROPBEAR_ASKPASS is not set +# end of Configuration + +# CONFIG_PACKAGE_ead is not set +CONFIG_PACKAGE_firewall=y +CONFIG_PACKAGE_fstools=y +CONFIG_FSTOOLS_UBIFS_EXTROOT=y +# CONFIG_FSTOOLS_OVL_MOUNT_FULL_ACCESS_TIME is not set +# CONFIG_FSTOOLS_OVL_MOUNT_COMPRESS_ZLIB is not set +CONFIG_PACKAGE_fwtool=y +CONFIG_PACKAGE_getrandom=y +CONFIG_PACKAGE_jsonfilter=y +# CONFIG_PACKAGE_libatomic is not set +CONFIG_PACKAGE_libc=y +CONFIG_PACKAGE_libgcc=y +# CONFIG_PACKAGE_libgomp is not set +CONFIG_PACKAGE_libpthread=y +CONFIG_PACKAGE_librt=y +CONFIG_PACKAGE_libstdcpp=y +CONFIG_PACKAGE_logd=y +CONFIG_PACKAGE_mtd=y +CONFIG_PACKAGE_netifd=y +# CONFIG_PACKAGE_om-watchdog is not set +CONFIG_PACKAGE_openwrt-keyring=y +CONFIG_PACKAGE_opkg=y +CONFIG_PACKAGE_procd=y + +# +# Configuration +# +# CONFIG_PROCD_SHOW_BOOT is not set +# CONFIG_PROCD_ZRAM_TMPFS is not set +# end of Configuration + +# CONFIG_PACKAGE_procd-selinux is not set +# CONFIG_PACKAGE_procd-ujail is not set +# CONFIG_PACKAGE_procd-ujail-console is not set +# CONFIG_PACKAGE_qos-scripts is not set +# CONFIG_PACKAGE_refpolicy is not set +CONFIG_PACKAGE_resolveip=y +CONFIG_PACKAGE_rpcd=y +CONFIG_PACKAGE_rpcd-mod-file=y +CONFIG_PACKAGE_rpcd-mod-iwinfo=y +# CONFIG_PACKAGE_rpcd-mod-rpcsys is not set +# CONFIG_PACKAGE_selinux-policy is not set +# CONFIG_PACKAGE_snapshot-tool is not set +CONFIG_PACKAGE_swconfig=y +CONFIG_PACKAGE_ubox=y +CONFIG_PACKAGE_ubus=y +CONFIG_PACKAGE_ubusd=y +# CONFIG_PACKAGE_ucert is not set +# CONFIG_PACKAGE_ucert-full is not set +CONFIG_PACKAGE_uci=y +CONFIG_PACKAGE_urandom-seed=y +CONFIG_PACKAGE_urngd=y +CONFIG_PACKAGE_usign=y +# CONFIG_PACKAGE_uxc is not set +CONFIG_PACKAGE_wireless-tools=y +CONFIG_PACKAGE_zram-swap=y +# end of Base system + +# +# Administration +# +CONFIG_PACKAGE_sudo=y +# end of Administration + +# +# Boot Loaders +# +# end of Boot Loaders + +# +# Development +# + +# +# Libraries +# +# CONFIG_PACKAGE_libncurses-dev is not set +# CONFIG_PACKAGE_libxml2-dev is not set +# CONFIG_PACKAGE_zlib-dev is not set +# end of Libraries + +# CONFIG_PACKAGE_ar is not set +# CONFIG_PACKAGE_binutils is not set +# CONFIG_PACKAGE_gdb is not set +# CONFIG_PACKAGE_gdbserver is not set +# CONFIG_PACKAGE_meson is not set +# CONFIG_PACKAGE_ninja is not set +# CONFIG_PACKAGE_objdump is not set +# CONFIG_PACKAGE_trace-cmd is not set +# CONFIG_PACKAGE_trace-cmd-extra is not set +# CONFIG_PACKAGE_valgrind is not set +# end of Development + +# +# Extra packages +# +CONFIG_PACKAGE_libiwinfo-data=y +# end of Extra packages + +# +# Firmware +# + +# +# ath10k Board-Specific Overrides +# +# end of ath10k Board-Specific Overrides + +# CONFIG_PACKAGE_aircard-pcmcia-firmware is not set +# CONFIG_PACKAGE_amdgpu-firmware is not set +# CONFIG_PACKAGE_ar3k-firmware is not set +# CONFIG_PACKAGE_ath10k-board-qca4019 is not set +# CONFIG_PACKAGE_ath10k-board-qca9377 is not set +# CONFIG_PACKAGE_ath10k-board-qca9887 is not set +# CONFIG_PACKAGE_ath10k-board-qca9888 is not set +# CONFIG_PACKAGE_ath10k-board-qca988x is not set +# CONFIG_PACKAGE_ath10k-board-qca9984 is not set +# CONFIG_PACKAGE_ath10k-board-qca99x0 is not set +# CONFIG_PACKAGE_ath10k-firmware-qca4019 is not set +# CONFIG_PACKAGE_ath10k-firmware-qca4019-ct is not set +# CONFIG_PACKAGE_ath10k-firmware-qca4019-ct-full-htt is not set +# CONFIG_PACKAGE_ath10k-firmware-qca4019-ct-htt is not set +# CONFIG_PACKAGE_ath10k-firmware-qca6174 is not set +# CONFIG_PACKAGE_ath10k-firmware-qca9377 is not set +# CONFIG_PACKAGE_ath10k-firmware-qca9887 is not set +# CONFIG_PACKAGE_ath10k-firmware-qca9887-ct is not set +# CONFIG_PACKAGE_ath10k-firmware-qca9887-ct-full-htt is not set +# CONFIG_PACKAGE_ath10k-firmware-qca9888 is not set +# CONFIG_PACKAGE_ath10k-firmware-qca9888-ct is not set +# CONFIG_PACKAGE_ath10k-firmware-qca9888-ct-full-htt is not set +# CONFIG_PACKAGE_ath10k-firmware-qca9888-ct-htt is not set +# CONFIG_PACKAGE_ath10k-firmware-qca988x is not set +# CONFIG_PACKAGE_ath10k-firmware-qca988x-ct is not set +# CONFIG_PACKAGE_ath10k-firmware-qca988x-ct-full-htt is not set +# CONFIG_PACKAGE_ath10k-firmware-qca9984 is not set +# CONFIG_PACKAGE_ath10k-firmware-qca9984-ct is not set +# CONFIG_PACKAGE_ath10k-firmware-qca9984-ct-full-htt is not set +# CONFIG_PACKAGE_ath10k-firmware-qca9984-ct-htt is not set +# CONFIG_PACKAGE_ath10k-firmware-qca99x0 is not set +# CONFIG_PACKAGE_ath10k-firmware-qca99x0-ct is not set +# CONFIG_PACKAGE_ath10k-firmware-qca99x0-ct-full-htt is not set +# CONFIG_PACKAGE_ath10k-firmware-qca99x0-ct-htt is not set +# CONFIG_PACKAGE_ath6k-firmware is not set +# CONFIG_PACKAGE_ath9k-htc-firmware is not set +# CONFIG_PACKAGE_b43legacy-firmware is not set +# CONFIG_PACKAGE_bnx2-firmware is not set +# CONFIG_PACKAGE_bnx2x-firmware is not set +# CONFIG_PACKAGE_brcmfmac-firmware-4329-sdio is not set +# CONFIG_PACKAGE_brcmfmac-firmware-43430-sdio-rpi-3b is not set +# CONFIG_PACKAGE_brcmfmac-firmware-43430-sdio-rpi-zero-w is not set +# CONFIG_PACKAGE_brcmfmac-firmware-43430a0-sdio is not set +# CONFIG_PACKAGE_brcmfmac-firmware-43455-sdio-rpi-3b-plus is not set +# CONFIG_PACKAGE_brcmfmac-firmware-43455-sdio-rpi-4b is not set +# CONFIG_PACKAGE_brcmfmac-firmware-43602a1-pcie is not set +# CONFIG_PACKAGE_brcmfmac-firmware-4366b1-pcie is not set +# CONFIG_PACKAGE_brcmfmac-firmware-4366c0-pcie is not set +# CONFIG_PACKAGE_brcmfmac-firmware-usb is not set +# CONFIG_PACKAGE_brcmsmac-firmware is not set +# CONFIG_PACKAGE_carl9170-firmware is not set +# CONFIG_PACKAGE_cypress-firmware-43012-sdio is not set +# CONFIG_PACKAGE_cypress-firmware-43340-sdio is not set +# CONFIG_PACKAGE_cypress-firmware-43362-sdio is not set +# CONFIG_PACKAGE_cypress-firmware-4339-sdio is not set +# CONFIG_PACKAGE_cypress-firmware-43430-sdio is not set +# CONFIG_PACKAGE_cypress-firmware-43455-sdio is not set +# CONFIG_PACKAGE_cypress-firmware-4354-sdio is not set +# CONFIG_PACKAGE_cypress-firmware-4356-pcie is not set +# CONFIG_PACKAGE_cypress-firmware-4356-sdio is not set +# CONFIG_PACKAGE_cypress-firmware-43570-pcie is not set +# CONFIG_PACKAGE_cypress-firmware-4373-sdio is not set +# CONFIG_PACKAGE_cypress-firmware-4373-usb is not set +# CONFIG_PACKAGE_cypress-firmware-54591-pcie is not set +# CONFIG_PACKAGE_e100-firmware is not set +# CONFIG_PACKAGE_edgeport-firmware is not set +# CONFIG_PACKAGE_eip197-mini-firmware is not set +# CONFIG_PACKAGE_ibt-firmware is not set +# CONFIG_PACKAGE_iwl3945-firmware is not set +# CONFIG_PACKAGE_iwl4965-firmware is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl100 is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl1000 is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl105 is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl135 is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl2000 is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl2030 is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl3160 is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl3168 is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl5000 is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl5150 is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl6000g2 is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl6000g2a is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl6000g2b is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl6050 is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl7260 is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl7265 is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl7265d is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl8260c is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl8265 is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl9000 is not set +# CONFIG_PACKAGE_iwlwifi-firmware-iwl9260 is not set +# CONFIG_PACKAGE_libertas-sdio-firmware is not set +# CONFIG_PACKAGE_libertas-spi-firmware is not set +# CONFIG_PACKAGE_libertas-usb-firmware is not set +# CONFIG_PACKAGE_mt7601u-firmware is not set +# CONFIG_PACKAGE_mt7622bt-firmware is not set +# CONFIG_PACKAGE_mwifiex-pcie-firmware is not set +# CONFIG_PACKAGE_mwifiex-sdio-firmware is not set +# CONFIG_PACKAGE_mwl8k-firmware is not set +# CONFIG_PACKAGE_p54-pci-firmware is not set +# CONFIG_PACKAGE_p54-spi-firmware is not set +# CONFIG_PACKAGE_p54-usb-firmware is not set +# CONFIG_PACKAGE_prism54-firmware is not set +# CONFIG_PACKAGE_r8169-firmware is not set +# CONFIG_PACKAGE_radeon-firmware is not set +# CONFIG_PACKAGE_rs9113-firmware is not set +# CONFIG_PACKAGE_rt2800-pci-firmware is not set +# CONFIG_PACKAGE_rt2800-usb-firmware is not set +# CONFIG_PACKAGE_rt61-pci-firmware is not set +# CONFIG_PACKAGE_rt73-usb-firmware is not set +# CONFIG_PACKAGE_rtl8188eu-firmware is not set +# CONFIG_PACKAGE_rtl8192ce-firmware is not set +# CONFIG_PACKAGE_rtl8192cu-firmware is not set +# CONFIG_PACKAGE_rtl8192de-firmware is not set +# CONFIG_PACKAGE_rtl8192eu-firmware is not set +# CONFIG_PACKAGE_rtl8192se-firmware is not set +# CONFIG_PACKAGE_rtl8192su-firmware is not set +# CONFIG_PACKAGE_rtl8723au-firmware is not set +# CONFIG_PACKAGE_rtl8723bu-firmware is not set +# CONFIG_PACKAGE_rtl8821ae-firmware is not set +# CONFIG_PACKAGE_rtl8822be-firmware is not set +# CONFIG_PACKAGE_rtl8822ce-firmware is not set +# CONFIG_PACKAGE_ti-3410-firmware is not set +# CONFIG_PACKAGE_ti-5052-firmware is not set +# CONFIG_PACKAGE_wil6210-firmware is not set +CONFIG_PACKAGE_wireless-regdb=y +# CONFIG_PACKAGE_wl12xx-firmware is not set +# CONFIG_PACKAGE_wl18xx-firmware is not set +# end of Firmware + +# +# gl-inet +# + +# +# Kernel modules +# +CONFIG_PACKAGE_kmod-gl-sdk4-edgerouter-status=y +# end of Kernel modules +# end of gl-inet + +# +# gl-sdk4 +# + +# +# Kernel modules +# +CONFIG_PACKAGE_kmod-gl-sdk4-fan=y +CONFIG_PACKAGE_kmod-gl-sdk4-hw-info=y +CONFIG_PACKAGE_kmod-gl-sdk4-parental-control=y +CONFIG_PACKAGE_kmod-gl-sdk4-tertf=y +CONFIG_PACKAGE_kmod-usb-serial-ch343=y +# end of Kernel modules + +CONFIG_PACKAGE_gl-sdk4-mtk-wifi-v2=y +# end of gl-sdk4 + +# +# Kernel modules +# + +# +# Block Devices +# +# CONFIG_PACKAGE_kmod-aoe is not set +# CONFIG_PACKAGE_kmod-ata-ahci is not set +# CONFIG_PACKAGE_kmod-ata-artop is not set +# CONFIG_PACKAGE_kmod-ata-core is not set +# CONFIG_PACKAGE_kmod-ata-marvell-sata is not set +# CONFIG_PACKAGE_kmod-ata-nvidia-sata is not set +# CONFIG_PACKAGE_kmod-ata-pdc202xx-old is not set +# CONFIG_PACKAGE_kmod-ata-piix is not set +# CONFIG_PACKAGE_kmod-ata-sil is not set +# CONFIG_PACKAGE_kmod-ata-sil24 is not set +# CONFIG_PACKAGE_kmod-ata-via-sata is not set +# CONFIG_PACKAGE_kmod-block2mtd is not set +CONFIG_PACKAGE_kmod-dax=y +CONFIG_PACKAGE_kmod-dm=y +# CONFIG_PACKAGE_kmod-dm-raid is not set +# CONFIG_PACKAGE_kmod-iosched-bfq is not set +# CONFIG_PACKAGE_kmod-iscsi-initiator is not set +# CONFIG_PACKAGE_kmod-loop is not set +# CONFIG_PACKAGE_kmod-md-mod is not set +# CONFIG_PACKAGE_kmod-nbd is not set +# CONFIG_PACKAGE_kmod-scsi-cdrom is not set +CONFIG_PACKAGE_kmod-scsi-core=y +# CONFIG_PACKAGE_kmod-scsi-generic is not set +# CONFIG_PACKAGE_kmod-scsi-tape is not set +# end of Block Devices + +# +# CAN Support +# +# CONFIG_PACKAGE_kmod-can is not set +# end of CAN Support + +# +# Cryptographic API modules +# +CONFIG_PACKAGE_kmod-crypto-acompress=y +CONFIG_PACKAGE_kmod-crypto-aead=y +CONFIG_PACKAGE_kmod-crypto-arc4=y +# CONFIG_PACKAGE_kmod-crypto-authenc is not set +CONFIG_PACKAGE_kmod-crypto-cbc=y +# CONFIG_PACKAGE_kmod-crypto-ccm is not set +# CONFIG_PACKAGE_kmod-crypto-cmac is not set +CONFIG_PACKAGE_kmod-crypto-crc32c=y +# CONFIG_PACKAGE_kmod-crypto-ctr is not set +CONFIG_PACKAGE_kmod-crypto-cts=y +# CONFIG_PACKAGE_kmod-crypto-deflate is not set +CONFIG_PACKAGE_kmod-crypto-des=y +CONFIG_PACKAGE_kmod-crypto-ecb=y +# CONFIG_PACKAGE_kmod-crypto-ecdh is not set +# CONFIG_PACKAGE_kmod-crypto-echainiv is not set +# CONFIG_PACKAGE_kmod-crypto-fcrypt is not set +# CONFIG_PACKAGE_kmod-crypto-gcm is not set +# CONFIG_PACKAGE_kmod-crypto-gf128 is not set +# CONFIG_PACKAGE_kmod-crypto-ghash is not set +CONFIG_PACKAGE_kmod-crypto-hash=y +CONFIG_PACKAGE_kmod-crypto-hmac=y +# CONFIG_PACKAGE_kmod-crypto-hw-geode is not set +# CONFIG_PACKAGE_kmod-crypto-hw-hifn-795x is not set +# CONFIG_PACKAGE_kmod-crypto-hw-mtk is not set +# CONFIG_PACKAGE_kmod-crypto-hw-padlock is not set +# CONFIG_PACKAGE_kmod-crypto-hw-talitos is not set +CONFIG_PACKAGE_kmod-crypto-kpp=y +CONFIG_PACKAGE_kmod-crypto-lib-chacha20=y +CONFIG_PACKAGE_kmod-crypto-lib-chacha20poly1305=y +CONFIG_PACKAGE_kmod-crypto-lib-curve25519=y +CONFIG_PACKAGE_kmod-crypto-lib-poly1305=y +CONFIG_PACKAGE_kmod-crypto-manager=y +# CONFIG_PACKAGE_kmod-crypto-md4 is not set +CONFIG_PACKAGE_kmod-crypto-md5=y +# CONFIG_PACKAGE_kmod-crypto-michael-mic is not set +# CONFIG_PACKAGE_kmod-crypto-misc is not set +CONFIG_PACKAGE_kmod-crypto-null=y +# CONFIG_PACKAGE_kmod-crypto-pcbc is not set +CONFIG_PACKAGE_kmod-crypto-pcompress=y +# CONFIG_PACKAGE_kmod-crypto-rmd160 is not set +# CONFIG_PACKAGE_kmod-crypto-rng is not set +# CONFIG_PACKAGE_kmod-crypto-seqiv is not set +CONFIG_PACKAGE_kmod-crypto-sha1=y +# CONFIG_PACKAGE_kmod-crypto-sha256 is not set +# CONFIG_PACKAGE_kmod-crypto-sha512 is not set +# CONFIG_PACKAGE_kmod-crypto-test is not set +# CONFIG_PACKAGE_kmod-crypto-user is not set +# CONFIG_PACKAGE_kmod-crypto-wq is not set +# CONFIG_PACKAGE_kmod-crypto-xcbc is not set +# CONFIG_PACKAGE_kmod-crypto-xts is not set +# CONFIG_PACKAGE_kmod-cryptodev is not set +# end of Cryptographic API modules + +# +# Filesystems +# +# CONFIG_PACKAGE_kmod-fs-afs is not set +# CONFIG_PACKAGE_kmod-fs-autofs4 is not set +# CONFIG_PACKAGE_kmod-fs-btrfs is not set +# CONFIG_PACKAGE_kmod-fs-cifs is not set +# CONFIG_PACKAGE_kmod-fs-configfs is not set +# CONFIG_PACKAGE_kmod-fs-cramfs is not set +CONFIG_PACKAGE_kmod-fs-exfat=y +CONFIG_PACKAGE_kmod-fs-exportfs=y +CONFIG_PACKAGE_kmod-fs-ext4=y +# CONFIG_PACKAGE_kmod-fs-f2fs is not set +# CONFIG_PACKAGE_kmod-fs-fscache is not set +# CONFIG_PACKAGE_kmod-fs-hfs is not set +# CONFIG_PACKAGE_kmod-fs-hfsplus is not set +# CONFIG_PACKAGE_kmod-fs-isofs is not set +# CONFIG_PACKAGE_kmod-fs-jfs is not set +# CONFIG_PACKAGE_kmod-fs-minix is not set +# CONFIG_PACKAGE_kmod-fs-msdos is not set +CONFIG_PACKAGE_kmod-fs-nfs=y +CONFIG_PACKAGE_kmod-fs-nfs-common=y +CONFIG_PACKAGE_kmod-fs-nfs-common-rpcsec=y +# CONFIG_PACKAGE_kmod-fs-nfs-v3 is not set +CONFIG_PACKAGE_kmod-fs-nfs-v4=y +CONFIG_PACKAGE_kmod-fs-nfsd=y +CONFIG_PACKAGE_kmod-fs-ntfs=y +# CONFIG_PACKAGE_kmod-fs-reiserfs is not set +# CONFIG_PACKAGE_kmod-fs-squashfs is not set +# CONFIG_PACKAGE_kmod-fs-udf is not set +CONFIG_PACKAGE_kmod-fs-vfat=y +# CONFIG_PACKAGE_kmod-fs-xfs is not set +CONFIG_PACKAGE_kmod-fuse=y +# CONFIG_PACKAGE_kmod-ramoops is not set +# end of Filesystems + +# +# FireWire support +# +# CONFIG_PACKAGE_kmod-firewire is not set +# end of FireWire support + +# +# Hardware Monitoring Support +# +# CONFIG_PACKAGE_kmod-hwmon-ad7418 is not set +# CONFIG_PACKAGE_kmod-hwmon-adcxx is not set +# CONFIG_PACKAGE_kmod-hwmon-ads1015 is not set +# CONFIG_PACKAGE_kmod-hwmon-adt7410 is not set +# CONFIG_PACKAGE_kmod-hwmon-adt7475 is not set +CONFIG_PACKAGE_kmod-hwmon-core=y +# CONFIG_PACKAGE_kmod-hwmon-dme1737 is not set +# CONFIG_PACKAGE_kmod-hwmon-drivetemp is not set +# CONFIG_PACKAGE_kmod-hwmon-gpiofan is not set +# CONFIG_PACKAGE_kmod-hwmon-ina209 is not set +# CONFIG_PACKAGE_kmod-hwmon-ina2xx is not set +# CONFIG_PACKAGE_kmod-hwmon-it87 is not set +# CONFIG_PACKAGE_kmod-hwmon-lm63 is not set +# CONFIG_PACKAGE_kmod-hwmon-lm75 is not set +# CONFIG_PACKAGE_kmod-hwmon-lm77 is not set +# CONFIG_PACKAGE_kmod-hwmon-lm85 is not set +# CONFIG_PACKAGE_kmod-hwmon-lm90 is not set +# CONFIG_PACKAGE_kmod-hwmon-lm92 is not set +# CONFIG_PACKAGE_kmod-hwmon-lm95241 is not set +# CONFIG_PACKAGE_kmod-hwmon-ltc4151 is not set +# CONFIG_PACKAGE_kmod-hwmon-mcp3021 is not set +CONFIG_PACKAGE_kmod-hwmon-pwmfan=y +# CONFIG_PACKAGE_kmod-hwmon-sch5627 is not set +# CONFIG_PACKAGE_kmod-hwmon-sht21 is not set +# CONFIG_PACKAGE_kmod-hwmon-tmp102 is not set +# CONFIG_PACKAGE_kmod-hwmon-tmp103 is not set +# CONFIG_PACKAGE_kmod-hwmon-tmp421 is not set +# CONFIG_PACKAGE_kmod-hwmon-vid is not set +# CONFIG_PACKAGE_kmod-hwmon-w83793 is not set +# CONFIG_PACKAGE_kmod-pmbus-core is not set +# CONFIG_PACKAGE_kmod-pmbus-zl6100 is not set +# end of Hardware Monitoring Support + +# +# I2C support +# +# CONFIG_PACKAGE_kmod-i2c-algo-bit is not set +# CONFIG_PACKAGE_kmod-i2c-algo-pca is not set +# CONFIG_PACKAGE_kmod-i2c-algo-pcf is not set +# CONFIG_PACKAGE_kmod-i2c-core is not set +# CONFIG_PACKAGE_kmod-i2c-gpio is not set +# CONFIG_PACKAGE_kmod-i2c-mux is not set +# CONFIG_PACKAGE_kmod-i2c-mux-gpio is not set +# CONFIG_PACKAGE_kmod-i2c-mux-pca9541 is not set +# CONFIG_PACKAGE_kmod-i2c-mux-pca954x is not set +# CONFIG_PACKAGE_kmod-i2c-pxa is not set +# CONFIG_PACKAGE_kmod-i2c-smbus is not set +# CONFIG_PACKAGE_kmod-i2c-tiny-usb is not set +# end of I2C support + +# +# Industrial I/O Modules +# +# CONFIG_PACKAGE_kmod-iio-ad799x is not set +# CONFIG_PACKAGE_kmod-iio-am2315 is not set +# CONFIG_PACKAGE_kmod-iio-bh1750 is not set +# CONFIG_PACKAGE_kmod-iio-bme680 is not set +# CONFIG_PACKAGE_kmod-iio-bme680-i2c is not set +# CONFIG_PACKAGE_kmod-iio-bme680-spi is not set +# CONFIG_PACKAGE_kmod-iio-bmp280 is not set +# CONFIG_PACKAGE_kmod-iio-bmp280-i2c is not set +# CONFIG_PACKAGE_kmod-iio-bmp280-spi is not set +# CONFIG_PACKAGE_kmod-iio-ccs811 is not set +# CONFIG_PACKAGE_kmod-iio-core is not set +# CONFIG_PACKAGE_kmod-iio-dht11 is not set +# CONFIG_PACKAGE_kmod-iio-fxas21002c is not set +# CONFIG_PACKAGE_kmod-iio-fxas21002c-i2c is not set +# CONFIG_PACKAGE_kmod-iio-fxas21002c-spi is not set +# CONFIG_PACKAGE_kmod-iio-fxos8700 is not set +# CONFIG_PACKAGE_kmod-iio-fxos8700-i2c is not set +# CONFIG_PACKAGE_kmod-iio-fxos8700-spi is not set +# CONFIG_PACKAGE_kmod-iio-hmc5843 is not set +# CONFIG_PACKAGE_kmod-iio-htu21 is not set +# CONFIG_PACKAGE_kmod-iio-kfifo-buf is not set +# CONFIG_PACKAGE_kmod-iio-lsm6dsx is not set +# CONFIG_PACKAGE_kmod-iio-lsm6dsx-i2c is not set +# CONFIG_PACKAGE_kmod-iio-lsm6dsx-spi is not set +# CONFIG_PACKAGE_kmod-iio-si7020 is not set +# CONFIG_PACKAGE_kmod-iio-sps30 is not set +# CONFIG_PACKAGE_kmod-iio-st_accel is not set +# CONFIG_PACKAGE_kmod-iio-st_accel-i2c is not set +# CONFIG_PACKAGE_kmod-iio-st_accel-spi is not set +# CONFIG_PACKAGE_kmod-iio-tsl4531 is not set +# CONFIG_PACKAGE_kmod-industrialio-triggered-buffer is not set +# end of Industrial I/O Modules + +# +# Input modules +# +# CONFIG_PACKAGE_kmod-hid is not set +# CONFIG_PACKAGE_kmod-hid-generic is not set +# CONFIG_PACKAGE_kmod-input-core is not set +# CONFIG_PACKAGE_kmod-input-evdev is not set +# CONFIG_PACKAGE_kmod-input-gpio-encoder is not set +# CONFIG_PACKAGE_kmod-input-gpio-keys is not set +# CONFIG_PACKAGE_kmod-input-gpio-keys-polled is not set +# CONFIG_PACKAGE_kmod-input-joydev is not set +# CONFIG_PACKAGE_kmod-input-matrixkmap is not set +# CONFIG_PACKAGE_kmod-input-polldev is not set +# CONFIG_PACKAGE_kmod-input-touchscreen-ads7846 is not set +# CONFIG_PACKAGE_kmod-input-uinput is not set +# end of Input modules + +# +# LED modules +# +# CONFIG_PACKAGE_kmod-leds-et6326 is not set +CONFIG_PACKAGE_kmod-leds-gpio=y +# CONFIG_PACKAGE_kmod-leds-pca963x is not set +# CONFIG_PACKAGE_kmod-leds-uleds is not set +CONFIG_PACKAGE_kmod-leds-ws2812b=y +# CONFIG_PACKAGE_kmod-ledtrig-activity is not set +# CONFIG_PACKAGE_kmod-ledtrig-gpio is not set +# CONFIG_PACKAGE_kmod-ledtrig-oneshot is not set +# CONFIG_PACKAGE_kmod-ledtrig-pattern is not set +# CONFIG_PACKAGE_kmod-ledtrig-transient is not set +# end of LED modules + +# +# Libraries +# +# CONFIG_PACKAGE_kmod-lib-cordic is not set +CONFIG_PACKAGE_kmod-lib-crc-ccitt=y +# CONFIG_PACKAGE_kmod-lib-crc-itu-t is not set +CONFIG_PACKAGE_kmod-lib-crc16=y +# CONFIG_PACKAGE_kmod-lib-crc32c is not set +# CONFIG_PACKAGE_kmod-lib-crc7 is not set +# CONFIG_PACKAGE_kmod-lib-crc8 is not set +# CONFIG_PACKAGE_kmod-lib-lz4 is not set +CONFIG_PACKAGE_kmod-lib-lzo=y +CONFIG_PACKAGE_kmod-lib-textsearch=y +# CONFIG_PACKAGE_kmod-lib-zstd is not set +# end of Libraries + +# +# Native Language Support +# +CONFIG_PACKAGE_kmod-nls-base=y +# CONFIG_PACKAGE_kmod-nls-cp1250 is not set +# CONFIG_PACKAGE_kmod-nls-cp1251 is not set +CONFIG_PACKAGE_kmod-nls-cp437=y +# CONFIG_PACKAGE_kmod-nls-cp775 is not set +# CONFIG_PACKAGE_kmod-nls-cp850 is not set +# CONFIG_PACKAGE_kmod-nls-cp852 is not set +# CONFIG_PACKAGE_kmod-nls-cp862 is not set +# CONFIG_PACKAGE_kmod-nls-cp864 is not set +# CONFIG_PACKAGE_kmod-nls-cp866 is not set +# CONFIG_PACKAGE_kmod-nls-cp932 is not set +# CONFIG_PACKAGE_kmod-nls-cp936 is not set +# CONFIG_PACKAGE_kmod-nls-cp950 is not set +CONFIG_PACKAGE_kmod-nls-iso8859-1=y +# CONFIG_PACKAGE_kmod-nls-iso8859-13 is not set +# CONFIG_PACKAGE_kmod-nls-iso8859-15 is not set +# CONFIG_PACKAGE_kmod-nls-iso8859-2 is not set +# CONFIG_PACKAGE_kmod-nls-iso8859-6 is not set +# CONFIG_PACKAGE_kmod-nls-iso8859-8 is not set +# CONFIG_PACKAGE_kmod-nls-koi8r is not set +CONFIG_PACKAGE_kmod-nls-utf8=y +# end of Native Language Support + +# +# Netfilter Extensions +# +CONFIG_PACKAGE_kmod-arptables=y +CONFIG_PACKAGE_kmod-br-netfilter=y +# CONFIG_PACKAGE_kmod-ebtables is not set +# CONFIG_PACKAGE_kmod-ebtables-ipv4 is not set +# CONFIG_PACKAGE_kmod-ebtables-ipv6 is not set +# CONFIG_PACKAGE_kmod-ebtables-watchers is not set +CONFIG_PACKAGE_kmod-ip6tables=y +# CONFIG_PACKAGE_kmod-ip6tables-extra is not set +# CONFIG_PACKAGE_kmod-ipt-checksum is not set +# CONFIG_PACKAGE_kmod-ipt-cluster is not set +# CONFIG_PACKAGE_kmod-ipt-clusterip is not set +CONFIG_PACKAGE_kmod-ipt-conntrack=y +CONFIG_PACKAGE_kmod-ipt-conntrack-extra=y +# CONFIG_PACKAGE_kmod-ipt-conntrack-label is not set +CONFIG_PACKAGE_kmod-ipt-core=y +# CONFIG_PACKAGE_kmod-ipt-debug is not set +CONFIG_PACKAGE_kmod-ipt-extra=y +CONFIG_PACKAGE_kmod-ipt-filter=y +CONFIG_PACKAGE_kmod-ipt-fullconenat=y +# CONFIG_PACKAGE_kmod-ipt-hashlimit is not set +CONFIG_PACKAGE_kmod-ipt-ipopt=y +CONFIG_PACKAGE_kmod-ipt-iprange=y +# CONFIG_PACKAGE_kmod-ipt-ipsec is not set +CONFIG_PACKAGE_kmod-ipt-ipset=y +# CONFIG_PACKAGE_kmod-ipt-led is not set +CONFIG_PACKAGE_kmod-ipt-nat=y +# CONFIG_PACKAGE_kmod-ipt-nat-extra is not set +CONFIG_PACKAGE_kmod-ipt-nat6=y +# CONFIG_PACKAGE_kmod-ipt-nflog is not set +# CONFIG_PACKAGE_kmod-ipt-nfqueue is not set +CONFIG_PACKAGE_kmod-ipt-offload=y +# CONFIG_PACKAGE_kmod-ipt-physdev is not set +CONFIG_PACKAGE_kmod-ipt-raw=y +# CONFIG_PACKAGE_kmod-ipt-raw6 is not set +# CONFIG_PACKAGE_kmod-ipt-rpfilter is not set +# CONFIG_PACKAGE_kmod-ipt-tee is not set +CONFIG_PACKAGE_kmod-ipt-tproxy=y +# CONFIG_PACKAGE_kmod-ipt-u32 is not set +# CONFIG_PACKAGE_kmod-ipt-ulog is not set +CONFIG_PACKAGE_kmod-nf-conntrack=y +CONFIG_PACKAGE_kmod-nf-conntrack-netlink=y +CONFIG_PACKAGE_kmod-nf-conntrack6=y +CONFIG_PACKAGE_kmod-nf-flow=y +CONFIG_PACKAGE_kmod-nf-ipt=y +CONFIG_PACKAGE_kmod-nf-ipt6=y +# CONFIG_PACKAGE_kmod-nf-ipvs is not set +CONFIG_PACKAGE_kmod-nf-nat=y +CONFIG_PACKAGE_kmod-nf-nat6=y +# CONFIG_PACKAGE_kmod-nf-nathelper is not set +# CONFIG_PACKAGE_kmod-nf-nathelper-extra is not set +CONFIG_PACKAGE_kmod-nf-reject=y +CONFIG_PACKAGE_kmod-nf-reject6=y +CONFIG_PACKAGE_kmod-nfnetlink=y +# CONFIG_PACKAGE_kmod-nfnetlink-log is not set +# CONFIG_PACKAGE_kmod-nfnetlink-queue is not set +# CONFIG_PACKAGE_kmod-nft-arp is not set +# CONFIG_PACKAGE_kmod-nft-bridge is not set +# CONFIG_PACKAGE_kmod-nft-core is not set +# CONFIG_PACKAGE_kmod-nft-fib is not set +# CONFIG_PACKAGE_kmod-nft-nat is not set +# CONFIG_PACKAGE_kmod-nft-nat6 is not set +# CONFIG_PACKAGE_kmod-nft-netdev is not set +# CONFIG_PACKAGE_kmod-nft-offload is not set +# CONFIG_PACKAGE_kmod-nft-queue is not set +# end of Netfilter Extensions + +# +# Network Devices +# +# CONFIG_PACKAGE_kmod-3c59x is not set +# CONFIG_PACKAGE_kmod-8139cp is not set +# CONFIG_PACKAGE_kmod-8139too is not set +# CONFIG_PACKAGE_kmod-alx is not set +# CONFIG_PACKAGE_kmod-atl1 is not set +# CONFIG_PACKAGE_kmod-atl1c is not set +# CONFIG_PACKAGE_kmod-atl1e is not set +# CONFIG_PACKAGE_kmod-atl2 is not set +# CONFIG_PACKAGE_kmod-b44 is not set +# CONFIG_PACKAGE_kmod-be2net is not set +# CONFIG_PACKAGE_kmod-bnx2 is not set +# CONFIG_PACKAGE_kmod-bnx2x is not set +# CONFIG_PACKAGE_kmod-dm9000 is not set +# CONFIG_PACKAGE_kmod-dummy is not set +# CONFIG_PACKAGE_kmod-e100 is not set +# CONFIG_PACKAGE_kmod-e1000 is not set +# CONFIG_PACKAGE_kmod-et131x is not set +# CONFIG_PACKAGE_kmod-ethoc is not set +# CONFIG_PACKAGE_kmod-forcedeth is not set +# CONFIG_PACKAGE_kmod-hfcmulti is not set +# CONFIG_PACKAGE_kmod-hfcpci is not set +# CONFIG_PACKAGE_kmod-i40e is not set +# CONFIG_PACKAGE_kmod-iavf is not set +CONFIG_PACKAGE_kmod-ifb=y +# CONFIG_PACKAGE_kmod-igb is not set +# CONFIG_PACKAGE_kmod-igc is not set +# CONFIG_PACKAGE_kmod-ixgbe is not set +# CONFIG_PACKAGE_kmod-ixgbevf is not set +# CONFIG_PACKAGE_kmod-libphy is not set +# CONFIG_PACKAGE_kmod-macvlan is not set +# CONFIG_PACKAGE_kmod-mdio-gpio is not set +CONFIG_PACKAGE_kmod-mediatek_hnat=y +CONFIG_PACKAGE_kmod-mii=y +# CONFIG_PACKAGE_kmod-mlx4-core is not set +# CONFIG_PACKAGE_kmod-mlx5-core is not set +# CONFIG_PACKAGE_kmod-natsemi is not set +# CONFIG_PACKAGE_kmod-ne2k-pci is not set +# CONFIG_PACKAGE_kmod-niu is not set +# CONFIG_PACKAGE_kmod-of-mdio is not set +# CONFIG_PACKAGE_kmod-pcnet32 is not set +# CONFIG_PACKAGE_kmod-phy-bcm84881 is not set +# CONFIG_PACKAGE_kmod-phy-broadcom is not set +# CONFIG_PACKAGE_kmod-phy-realtek is not set +# CONFIG_PACKAGE_kmod-phylink is not set +# CONFIG_PACKAGE_kmod-r6040 is not set +# CONFIG_PACKAGE_kmod-r8169 is not set +# CONFIG_PACKAGE_kmod-sfc is not set +# CONFIG_PACKAGE_kmod-sfc-falcon is not set +# CONFIG_PACKAGE_kmod-sfp is not set +# CONFIG_PACKAGE_kmod-sis190 is not set +# CONFIG_PACKAGE_kmod-sis900 is not set +# CONFIG_PACKAGE_kmod-skge is not set +# CONFIG_PACKAGE_kmod-sky2 is not set +# CONFIG_PACKAGE_kmod-solos-pci is not set +# CONFIG_PACKAGE_kmod-spi-ks8995 is not set +# CONFIG_PACKAGE_kmod-swconfig is not set +# CONFIG_PACKAGE_kmod-switch-bcm53xx is not set +# CONFIG_PACKAGE_kmod-switch-bcm53xx-mdio is not set +# CONFIG_PACKAGE_kmod-switch-ip17xx is not set +# CONFIG_PACKAGE_kmod-switch-rtl8306 is not set +# CONFIG_PACKAGE_kmod-switch-rtl8366-smi is not set +# CONFIG_PACKAGE_kmod-switch-rtl8366rb is not set +# CONFIG_PACKAGE_kmod-switch-rtl8366s is not set +# CONFIG_PACKAGE_kmod-switch-rtl8367b is not set +# CONFIG_PACKAGE_kmod-tg3 is not set +# CONFIG_PACKAGE_kmod-tulip is not set +# CONFIG_PACKAGE_kmod-via-rhine is not set +# CONFIG_PACKAGE_kmod-via-velocity is not set +# CONFIG_PACKAGE_kmod-vmxnet3 is not set +# end of Network Devices + +# +# Network Support +# +# CONFIG_PACKAGE_kmod-atm is not set +# CONFIG_PACKAGE_kmod-ax25 is not set +# CONFIG_PACKAGE_kmod-bonding is not set +# CONFIG_PACKAGE_kmod-bpf-test is not set +CONFIG_PACKAGE_kmod-dnsresolver=y +# CONFIG_PACKAGE_kmod-fast-classifier is not set +# CONFIG_PACKAGE_kmod-fou is not set +# CONFIG_PACKAGE_kmod-fou6 is not set +# CONFIG_PACKAGE_kmod-geneve is not set +# CONFIG_PACKAGE_kmod-gre is not set +# CONFIG_PACKAGE_kmod-gre6 is not set +# CONFIG_PACKAGE_kmod-ip6-tunnel is not set +# CONFIG_PACKAGE_kmod-ipip is not set +# CONFIG_PACKAGE_kmod-ipsec is not set +# CONFIG_PACKAGE_kmod-iptunnel6 is not set +# CONFIG_PACKAGE_kmod-isdn4linux is not set +# CONFIG_PACKAGE_kmod-l2tp is not set +# CONFIG_PACKAGE_kmod-l2tp-eth is not set +# CONFIG_PACKAGE_kmod-l2tp-ip is not set +# CONFIG_PACKAGE_kmod-macsec is not set +# CONFIG_PACKAGE_kmod-misdn is not set +# CONFIG_PACKAGE_kmod-mpls is not set +# CONFIG_PACKAGE_kmod-mppe is not set +# CONFIG_PACKAGE_kmod-nat46 is not set +# CONFIG_PACKAGE_kmod-netem is not set +# CONFIG_PACKAGE_kmod-netlink-diag is not set +# CONFIG_PACKAGE_kmod-nlmon is not set +# CONFIG_PACKAGE_kmod-nsh is not set +# CONFIG_PACKAGE_kmod-pktgen is not set +CONFIG_PACKAGE_kmod-ppp=y +# CONFIG_PACKAGE_kmod-ppp-synctty is not set +# CONFIG_PACKAGE_kmod-pppoa is not set +CONFIG_PACKAGE_kmod-pppoe=y +# CONFIG_PACKAGE_kmod-pppol2tp is not set +CONFIG_PACKAGE_kmod-pppox=y +# CONFIG_PACKAGE_kmod-pptp is not set +# CONFIG_PACKAGE_kmod-sched is not set +# CONFIG_PACKAGE_kmod-sched-act-vlan is not set +# CONFIG_PACKAGE_kmod-sched-bpf is not set +# CONFIG_PACKAGE_kmod-sched-cake is not set +# CONFIG_PACKAGE_kmod-sched-connmark is not set +CONFIG_PACKAGE_kmod-sched-core=y +# CONFIG_PACKAGE_kmod-sched-ctinfo is not set +# CONFIG_PACKAGE_kmod-sched-flower is not set +# CONFIG_PACKAGE_kmod-sched-ipset is not set +# CONFIG_PACKAGE_kmod-sched-mqprio is not set +# CONFIG_PACKAGE_kmod-sctp is not set +# CONFIG_PACKAGE_kmod-shortcut-fe is not set +# CONFIG_PACKAGE_kmod-shortcut-fe-cm is not set +# CONFIG_PACKAGE_kmod-sit is not set +CONFIG_PACKAGE_kmod-slhc=y +# CONFIG_PACKAGE_kmod-slip is not set +CONFIG_PACKAGE_kmod-tcp-bbr=y +# CONFIG_PACKAGE_kmod-tcp-hybla is not set +# CONFIG_PACKAGE_kmod-trelay is not set +CONFIG_PACKAGE_kmod-tun=y +CONFIG_PACKAGE_kmod-udptunnel4=y +CONFIG_PACKAGE_kmod-udptunnel6=y +# CONFIG_PACKAGE_kmod-veth is not set +# CONFIG_PACKAGE_kmod-vxlan is not set +CONFIG_PACKAGE_kmod-wireguard=y +# end of Network Support + +# +# Other modules +# +# CONFIG_PACKAGE_kmod-6lowpan is not set +# CONFIG_PACKAGE_kmod-ath3k is not set +# CONFIG_PACKAGE_kmod-bcma is not set +# CONFIG_PACKAGE_kmod-bluetooth is not set +# CONFIG_PACKAGE_kmod-bluetooth-6lowpan is not set +# CONFIG_PACKAGE_kmod-btmrvl is not set +# CONFIG_PACKAGE_kmod-button-hotplug is not set +# CONFIG_PACKAGE_kmod-echo is not set +# CONFIG_PACKAGE_kmod-eeprom-93cx6 is not set +# CONFIG_PACKAGE_kmod-eeprom-at24 is not set +# CONFIG_PACKAGE_kmod-eeprom-at25 is not set +# CONFIG_PACKAGE_kmod-gpio-beeper is not set +CONFIG_PACKAGE_kmod-gpio-button-hotplug=y +# CONFIG_PACKAGE_kmod-gpio-dev is not set +# CONFIG_PACKAGE_kmod-gpio-mcp23s08 is not set +# CONFIG_PACKAGE_kmod-gpio-nxp-74hc164 is not set +# CONFIG_PACKAGE_kmod-gpio-pca953x is not set +# CONFIG_PACKAGE_kmod-gpio-pcf857x is not set +# CONFIG_PACKAGE_kmod-ikconfig is not set +# CONFIG_PACKAGE_kmod-it87-wdt is not set +# CONFIG_PACKAGE_kmod-itco-wdt is not set +# CONFIG_PACKAGE_kmod-keys-encrypted is not set +# CONFIG_PACKAGE_kmod-keys-trusted is not set +# CONFIG_PACKAGE_kmod-lp is not set +# CONFIG_PACKAGE_kmod-mmc is not set +CONFIG_PACKAGE_kmod-mtdoops=y +# CONFIG_PACKAGE_kmod-mtdram is not set +# CONFIG_PACKAGE_kmod-mtdtests is not set +# CONFIG_PACKAGE_kmod-parport-pc is not set +# CONFIG_PACKAGE_kmod-ppdev is not set +# CONFIG_PACKAGE_kmod-pps is not set +# CONFIG_PACKAGE_kmod-pps-gpio is not set +# CONFIG_PACKAGE_kmod-pps-ldisc is not set +# CONFIG_PACKAGE_kmod-ptp is not set +# CONFIG_PACKAGE_kmod-random-core is not set +# CONFIG_PACKAGE_kmod-rtc-ds1307 is not set +# CONFIG_PACKAGE_kmod-rtc-ds1374 is not set +# CONFIG_PACKAGE_kmod-rtc-ds1672 is not set +# CONFIG_PACKAGE_kmod-rtc-em3027 is not set +# CONFIG_PACKAGE_kmod-rtc-isl1208 is not set +# CONFIG_PACKAGE_kmod-rtc-pcf2123 is not set +# CONFIG_PACKAGE_kmod-rtc-pcf2127 is not set +# CONFIG_PACKAGE_kmod-rtc-pcf8563 is not set +# CONFIG_PACKAGE_kmod-rtc-pt7c4338 is not set +# CONFIG_PACKAGE_kmod-rtc-rs5c372a is not set +# CONFIG_PACKAGE_kmod-rtc-rx8025 is not set +# CONFIG_PACKAGE_kmod-rtc-s35390a is not set +# CONFIG_PACKAGE_kmod-sdhci is not set +# CONFIG_PACKAGE_kmod-serial-8250 is not set +# CONFIG_PACKAGE_kmod-serial-8250-exar is not set +# CONFIG_PACKAGE_kmod-softdog is not set +# CONFIG_PACKAGE_kmod-ssb is not set +# CONFIG_PACKAGE_kmod-tpm is not set +# CONFIG_PACKAGE_kmod-tpm-i2c-atmel is not set +# CONFIG_PACKAGE_kmod-tpm-i2c-infineon is not set +# CONFIG_PACKAGE_kmod-w83627hf-wdt is not set +CONFIG_PACKAGE_kmod-zram=y +# end of Other modules + +# +# PCMCIA support +# +# end of PCMCIA support + +# +# SPI Support +# +# CONFIG_PACKAGE_kmod-mmc-spi is not set +# CONFIG_PACKAGE_kmod-spi-bitbang is not set +# CONFIG_PACKAGE_kmod-spi-dev is not set +# CONFIG_PACKAGE_kmod-spi-gpio is not set +# end of SPI Support + +# +# Sound Support +# +# CONFIG_PACKAGE_kmod-sound-core is not set +# end of Sound Support + +# +# USB Support +# +# CONFIG_PACKAGE_kmod-chaoskey is not set +CONFIG_PACKAGE_kmod-usb-acm=y +# CONFIG_PACKAGE_kmod-usb-atm is not set +# CONFIG_PACKAGE_kmod-usb-cm109 is not set +CONFIG_PACKAGE_kmod-usb-core=y +# CONFIG_PACKAGE_kmod-usb-dwc2 is not set +# CONFIG_PACKAGE_kmod-usb-dwc3 is not set +CONFIG_PACKAGE_kmod-usb-ehci=y +# CONFIG_PACKAGE_kmod-usb-hid is not set +# CONFIG_PACKAGE_kmod-usb-hid-cp2112 is not set +# CONFIG_PACKAGE_kmod-usb-ledtrig-usbport is not set +CONFIG_PACKAGE_kmod-usb-net=y +# CONFIG_PACKAGE_kmod-usb-net-aqc111 is not set +# CONFIG_PACKAGE_kmod-usb-net-asix is not set +# CONFIG_PACKAGE_kmod-usb-net-asix-ax88179 is not set +# CONFIG_PACKAGE_kmod-usb-net-cdc-eem is not set +CONFIG_PACKAGE_kmod-usb-net-cdc-ether=y +# CONFIG_PACKAGE_kmod-usb-net-cdc-mbim is not set +CONFIG_PACKAGE_kmod-usb-net-cdc-ncm=y +# CONFIG_PACKAGE_kmod-usb-net-cdc-subset is not set +# CONFIG_PACKAGE_kmod-usb-net-dm9601-ether is not set +# CONFIG_PACKAGE_kmod-usb-net-hso is not set +CONFIG_PACKAGE_kmod-usb-net-huawei-cdc-ncm=y +CONFIG_PACKAGE_kmod-usb-net-ipheth=y +# CONFIG_PACKAGE_kmod-usb-net-kalmia is not set +# CONFIG_PACKAGE_kmod-usb-net-kaweth is not set +# CONFIG_PACKAGE_kmod-usb-net-mcs7830 is not set +# CONFIG_PACKAGE_kmod-usb-net-pegasus is not set +# CONFIG_PACKAGE_kmod-usb-net-pl is not set +CONFIG_PACKAGE_kmod-usb-net-qmi-wwan=y +CONFIG_PACKAGE_kmod-usb-net-rndis=y +# CONFIG_PACKAGE_kmod-usb-net-rtl8150 is not set +# CONFIG_PACKAGE_kmod-usb-net-rtl8152 is not set +# CONFIG_PACKAGE_kmod-usb-net-sierrawireless is not set +# CONFIG_PACKAGE_kmod-usb-net-smsc95xx is not set +# CONFIG_PACKAGE_kmod-usb-net-sr9700 is not set +# CONFIG_PACKAGE_kmod-usb-net-vl600 is not set +CONFIG_PACKAGE_kmod-usb-ohci=y +# CONFIG_PACKAGE_kmod-usb-ohci-pci is not set +# CONFIG_PACKAGE_kmod-usb-printer is not set +CONFIG_PACKAGE_kmod-usb-serial=y +# CONFIG_PACKAGE_kmod-usb-serial-ark3116 is not set +# CONFIG_PACKAGE_kmod-usb-serial-belkin is not set +# CONFIG_PACKAGE_kmod-usb-serial-ch341 is not set +# CONFIG_PACKAGE_kmod-usb-serial-cp210x is not set +# CONFIG_PACKAGE_kmod-usb-serial-cypress-m8 is not set +# CONFIG_PACKAGE_kmod-usb-serial-edgeport is not set +# CONFIG_PACKAGE_kmod-usb-serial-ftdi is not set +# CONFIG_PACKAGE_kmod-usb-serial-garmin is not set +# CONFIG_PACKAGE_kmod-usb-serial-ipw is not set +# CONFIG_PACKAGE_kmod-usb-serial-keyspan is not set +# CONFIG_PACKAGE_kmod-usb-serial-mct is not set +# CONFIG_PACKAGE_kmod-usb-serial-mos7720 is not set +# CONFIG_PACKAGE_kmod-usb-serial-mos7840 is not set +CONFIG_PACKAGE_kmod-usb-serial-option=y +# CONFIG_PACKAGE_kmod-usb-serial-oti6858 is not set +# CONFIG_PACKAGE_kmod-usb-serial-pl2303 is not set +# CONFIG_PACKAGE_kmod-usb-serial-qualcomm is not set +# CONFIG_PACKAGE_kmod-usb-serial-sierrawireless is not set +# CONFIG_PACKAGE_kmod-usb-serial-simple is not set +# CONFIG_PACKAGE_kmod-usb-serial-ti-usb is not set +# CONFIG_PACKAGE_kmod-usb-serial-visor is not set +CONFIG_PACKAGE_kmod-usb-serial-wwan=y +CONFIG_PACKAGE_kmod-usb-storage=y +# CONFIG_PACKAGE_kmod-usb-storage-extras is not set +# CONFIG_PACKAGE_kmod-usb-storage-uas is not set +CONFIG_PACKAGE_kmod-usb-uhci=y +CONFIG_PACKAGE_kmod-usb-wdm=y +# CONFIG_PACKAGE_kmod-usb-yealink is not set +CONFIG_PACKAGE_kmod-usb2=y +# CONFIG_PACKAGE_kmod-usb2-pci is not set +# CONFIG_PACKAGE_kmod-usb3 is not set +# CONFIG_PACKAGE_kmod-usbip is not set +# CONFIG_PACKAGE_kmod-usbip-client is not set +# CONFIG_PACKAGE_kmod-usbip-server is not set +# CONFIG_PACKAGE_kmod-usbmon is not set +# end of USB Support + +# +# Video Support +# +# CONFIG_PACKAGE_kmod-video-core is not set +# end of Video Support + +# +# Virtualization +# +# end of Virtualization + +# +# Voice over IP +# +# end of Voice over IP + +# +# W1 support +# +# CONFIG_PACKAGE_kmod-w1 is not set +# end of W1 support + +# +# WPAN 802.15.4 Support +# +# CONFIG_PACKAGE_kmod-at86rf230 is not set +# CONFIG_PACKAGE_kmod-atusb is not set +# CONFIG_PACKAGE_kmod-ca8210 is not set +# CONFIG_PACKAGE_kmod-cc2520 is not set +# CONFIG_PACKAGE_kmod-fakelb is not set +# CONFIG_PACKAGE_kmod-ieee802154 is not set +# CONFIG_PACKAGE_kmod-ieee802154-6lowpan is not set +# CONFIG_PACKAGE_kmod-mac802154 is not set +# CONFIG_PACKAGE_kmod-mrf24j40 is not set +# end of WPAN 802.15.4 Support + +# +# Wireless Drivers +# +# CONFIG_PACKAGE_kmod-adm8211 is not set +# CONFIG_PACKAGE_kmod-ar5523 is not set +# CONFIG_PACKAGE_kmod-ath is not set +# CONFIG_PACKAGE_kmod-ath10k is not set +# CONFIG_PACKAGE_kmod-ath10k-ct is not set +# CONFIG_PACKAGE_kmod-ath10k-ct-smallbuffers is not set +# CONFIG_PACKAGE_kmod-ath10k-smallbuffers is not set +# CONFIG_PACKAGE_kmod-ath5k is not set +# CONFIG_PACKAGE_kmod-ath6kl-sdio is not set +# CONFIG_PACKAGE_kmod-ath6kl-usb is not set +# CONFIG_PACKAGE_kmod-ath9k is not set +# CONFIG_PACKAGE_kmod-ath9k-htc is not set +# CONFIG_PACKAGE_kmod-b43 is not set +# CONFIG_PACKAGE_kmod-b43legacy is not set +# CONFIG_PACKAGE_kmod-brcmfmac is not set +# CONFIG_PACKAGE_kmod-brcmsmac is not set +# CONFIG_PACKAGE_kmod-brcmutil is not set +# CONFIG_PACKAGE_kmod-carl9170 is not set +# CONFIG_PACKAGE_kmod-cfg80211 is not set +# CONFIG_PACKAGE_kmod-hermes is not set +# CONFIG_PACKAGE_kmod-hermes-pci is not set +# CONFIG_PACKAGE_kmod-hermes-plx is not set +# CONFIG_PACKAGE_kmod-ipw2100 is not set +# CONFIG_PACKAGE_kmod-ipw2200 is not set +# CONFIG_PACKAGE_kmod-iwl-legacy is not set +# CONFIG_PACKAGE_kmod-iwl3945 is not set +# CONFIG_PACKAGE_kmod-iwl4965 is not set +# CONFIG_PACKAGE_kmod-iwlwifi is not set +# CONFIG_PACKAGE_kmod-lib80211 is not set +# CONFIG_PACKAGE_kmod-libertas-sdio is not set +# CONFIG_PACKAGE_kmod-libertas-spi is not set +# CONFIG_PACKAGE_kmod-libertas-usb is not set +# CONFIG_PACKAGE_kmod-libipw is not set +# CONFIG_PACKAGE_kmod-mac80211 is not set +# CONFIG_PACKAGE_kmod-mac80211-hwsim is not set +# CONFIG_PACKAGE_kmod-mt76 is not set +# CONFIG_PACKAGE_kmod-mt7601u is not set +# CONFIG_PACKAGE_kmod-mt7603 is not set +# CONFIG_PACKAGE_kmod-mt7615-firmware is not set +# CONFIG_PACKAGE_kmod-mt7615e is not set +# CONFIG_PACKAGE_kmod-mt7663-firmware-ap is not set +# CONFIG_PACKAGE_kmod-mt7663-firmware-sta is not set +# CONFIG_PACKAGE_kmod-mt7663s is not set +# CONFIG_PACKAGE_kmod-mt7663u is not set +# CONFIG_PACKAGE_kmod-mt76x0e is not set +# CONFIG_PACKAGE_kmod-mt76x0u is not set +# CONFIG_PACKAGE_kmod-mt76x2 is not set +# CONFIG_PACKAGE_kmod-mt76x2u is not set +# CONFIG_PACKAGE_kmod-mt7915e is not set +# CONFIG_PACKAGE_kmod-mt7921e is not set +# CONFIG_PACKAGE_kmod-mt7921s is not set +# CONFIG_PACKAGE_kmod-mwifiex-pcie is not set +# CONFIG_PACKAGE_kmod-mwifiex-sdio is not set +# CONFIG_PACKAGE_kmod-mwl8k is not set +# CONFIG_PACKAGE_kmod-net-prism54 is not set +# CONFIG_PACKAGE_kmod-net-rtl8192su is not set +# CONFIG_PACKAGE_kmod-owl-loader is not set +# CONFIG_PACKAGE_kmod-p54-common is not set +# CONFIG_PACKAGE_kmod-p54-pci is not set +# CONFIG_PACKAGE_kmod-p54-usb is not set +# CONFIG_PACKAGE_kmod-rsi91x is not set +# CONFIG_PACKAGE_kmod-rsi91x-sdio is not set +# CONFIG_PACKAGE_kmod-rsi91x-usb is not set +# CONFIG_PACKAGE_kmod-rt2400-pci is not set +# CONFIG_PACKAGE_kmod-rt2500-pci is not set +# CONFIG_PACKAGE_kmod-rt2500-usb is not set +# CONFIG_PACKAGE_kmod-rt2800-pci is not set +# CONFIG_PACKAGE_kmod-rt2800-usb is not set +# CONFIG_PACKAGE_kmod-rt2x00-lib is not set +# CONFIG_PACKAGE_kmod-rt61-pci is not set +# CONFIG_PACKAGE_kmod-rt73-usb is not set +# CONFIG_PACKAGE_kmod-rtl8180 is not set +# CONFIG_PACKAGE_kmod-rtl8187 is not set +# CONFIG_PACKAGE_kmod-rtl8192ce is not set +# CONFIG_PACKAGE_kmod-rtl8192cu is not set +# CONFIG_PACKAGE_kmod-rtl8192de is not set +# CONFIG_PACKAGE_kmod-rtl8192se is not set +# CONFIG_PACKAGE_kmod-rtl8723bs is not set +# CONFIG_PACKAGE_kmod-rtl8812au-ct is not set +# CONFIG_PACKAGE_kmod-rtl8821ae is not set +# CONFIG_PACKAGE_kmod-rtl8xxxu is not set +# CONFIG_PACKAGE_kmod-rtw88 is not set +# CONFIG_PACKAGE_kmod-wil6210 is not set +# CONFIG_PACKAGE_kmod-wl12xx is not set +# CONFIG_PACKAGE_kmod-wl18xx is not set +# CONFIG_PACKAGE_kmod-wlcore is not set +# CONFIG_PACKAGE_kmod-zd1211rw is not set +# end of Wireless Drivers +# end of Kernel modules + +# +# Languages +# + +# +# Go +# +# CONFIG_PACKAGE_golang is not set + +# +# Configuration +# +CONFIG_GOLANG_EXTERNAL_BOOTSTRAP_ROOT="" +CONFIG_GOLANG_BUILD_CACHE_DIR="" +# CONFIG_GOLANG_MOD_CACHE_WORLD_READABLE is not set +# end of Configuration + +# CONFIG_PACKAGE_golang-doc is not set +# CONFIG_PACKAGE_golang-github-jedisct1-dnscrypt-proxy2-dev is not set +# CONFIG_PACKAGE_golang-src is not set +# end of Go + +# +# Lua +# +CONFIG_PACKAGE_libiwinfo-lua=y +CONFIG_PACKAGE_lsqlite3=y +CONFIG_PACKAGE_lua=y +CONFIG_PACKAGE_lua-cjson=y +# CONFIG_PACKAGE_lua-eco is not set +# CONFIG_PACKAGE_lua-eco-base64 is not set +# CONFIG_PACKAGE_lua-eco-dns is not set +# CONFIG_PACKAGE_lua-eco-file is not set +# CONFIG_PACKAGE_lua-eco-http is not set +# CONFIG_PACKAGE_lua-eco-log is not set +# CONFIG_PACKAGE_lua-eco-mqtt is not set +# CONFIG_PACKAGE_lua-eco-socket is not set +# CONFIG_PACKAGE_lua-eco-ssl is not set +# CONFIG_PACKAGE_lua-eco-sys is not set +# CONFIG_PACKAGE_lua-eco-termios is not set +# CONFIG_PACKAGE_lua-eco-ubus is not set +# CONFIG_PACKAGE_lua-examples is not set +# CONFIG_PACKAGE_lua-mosquitto is not set +CONFIG_PACKAGE_lua-neturl=y +# CONFIG_PACKAGE_lua5.3 is not set +CONFIG_PACKAGE_luabitop=y +# CONFIG_PACKAGE_luac is not set +# CONFIG_PACKAGE_luac5.3 is not set +# CONFIG_PACKAGE_luasrcdiet is not set +# end of Lua + +# +# Python +# +# CONFIG_PACKAGE_libpython3 is not set +# CONFIG_PACKAGE_python-pip-conf is not set +# CONFIG_PACKAGE_python3 is not set +# CONFIG_PACKAGE_python3-asyncio is not set +# CONFIG_PACKAGE_python3-base is not set +# CONFIG_PACKAGE_python3-cgi is not set +# CONFIG_PACKAGE_python3-cgitb is not set +# CONFIG_PACKAGE_python3-codecs is not set +# CONFIG_PACKAGE_python3-ctypes is not set +# CONFIG_PACKAGE_python3-dbm is not set +# CONFIG_PACKAGE_python3-decimal is not set +# CONFIG_PACKAGE_python3-dev is not set +# CONFIG_PACKAGE_python3-distutils is not set +# CONFIG_PACKAGE_python3-email is not set +# CONFIG_PACKAGE_python3-gdbm is not set +# CONFIG_PACKAGE_python3-lib2to3 is not set +# CONFIG_PACKAGE_python3-light is not set + +# +# Configuration +# +# CONFIG_PYTHON3_BLUETOOTH_SUPPORT is not set +# CONFIG_PYTHON3_HOST_PIP_CACHE_WORLD_READABLE is not set +# end of Configuration + +# CONFIG_PACKAGE_python3-logging is not set +# CONFIG_PACKAGE_python3-lzma is not set +# CONFIG_PACKAGE_python3-multiprocessing is not set +# CONFIG_PACKAGE_python3-ncurses is not set +# CONFIG_PACKAGE_python3-openssl is not set +# CONFIG_PACKAGE_python3-pip is not set +# CONFIG_PACKAGE_python3-pkg-resources is not set +# CONFIG_PACKAGE_python3-pydoc is not set +# CONFIG_PACKAGE_python3-readline is not set +# CONFIG_PACKAGE_python3-setuptools is not set +# CONFIG_PACKAGE_python3-sqlite3 is not set +# CONFIG_PACKAGE_python3-unittest is not set +# CONFIG_PACKAGE_python3-urllib is not set +# CONFIG_PACKAGE_python3-xml is not set +# end of Python + +# +# Ruby +# +CONFIG_PACKAGE_ruby=y + +# +# Standard Library +# +# CONFIG_PACKAGE_ruby-stdlib is not set +# CONFIG_PACKAGE_ruby-abbrev is not set +# CONFIG_PACKAGE_ruby-base64 is not set +# CONFIG_PACKAGE_ruby-benchmark is not set +CONFIG_PACKAGE_ruby-bigdecimal=y +# CONFIG_PACKAGE_ruby-bundler is not set +# CONFIG_PACKAGE_ruby-cgi is not set +# CONFIG_PACKAGE_ruby-continuation is not set +# CONFIG_PACKAGE_ruby-coverage is not set +# CONFIG_PACKAGE_ruby-csv is not set +CONFIG_PACKAGE_ruby-date=y +# CONFIG_PACKAGE_ruby-debug is not set +# CONFIG_PACKAGE_ruby-delegate is not set +# CONFIG_PACKAGE_ruby-dev is not set +# CONFIG_PACKAGE_ruby-did-you-mean is not set +CONFIG_PACKAGE_ruby-digest=y +# CONFIG_RUBY_DIGEST_USE_OPENSSL is not set +# CONFIG_PACKAGE_ruby-drb is not set +CONFIG_PACKAGE_ruby-enc=y +# CONFIG_PACKAGE_ruby-enc-extra is not set +# CONFIG_PACKAGE_ruby-english is not set +# CONFIG_PACKAGE_ruby-erb is not set +# CONFIG_PACKAGE_ruby-error_highlight is not set +# CONFIG_PACKAGE_ruby-etc is not set +# CONFIG_PACKAGE_ruby-expect is not set +# CONFIG_PACKAGE_ruby-fcntl is not set +# CONFIG_PACKAGE_ruby-fiddle is not set +# CONFIG_PACKAGE_ruby-fileutils is not set +# CONFIG_PACKAGE_ruby-find is not set +CONFIG_PACKAGE_ruby-forwardable=y +# CONFIG_PACKAGE_ruby-gems is not set +# CONFIG_PACKAGE_ruby-getoptlong is not set +# CONFIG_PACKAGE_ruby-io-console is not set +# CONFIG_PACKAGE_ruby-io-nonblock is not set +# CONFIG_PACKAGE_ruby-io-wait is not set +# CONFIG_PACKAGE_ruby-ipaddr is not set +# CONFIG_PACKAGE_ruby-irb is not set +# CONFIG_PACKAGE_ruby-json is not set +# CONFIG_PACKAGE_ruby-logger is not set +# CONFIG_PACKAGE_ruby-matrix is not set +# CONFIG_PACKAGE_ruby-minitest is not set +# CONFIG_PACKAGE_ruby-mkmf is not set +# CONFIG_PACKAGE_ruby-monitor is not set +# CONFIG_PACKAGE_ruby-mutex_m is not set +# CONFIG_PACKAGE_ruby-net-ftp is not set +# CONFIG_PACKAGE_ruby-net-http is not set +# CONFIG_PACKAGE_ruby-net-imap is not set +# CONFIG_PACKAGE_ruby-net-pop is not set +# CONFIG_PACKAGE_ruby-net-protocol is not set +# CONFIG_PACKAGE_ruby-net-smtp is not set +# CONFIG_PACKAGE_ruby-nkf is not set +# CONFIG_PACKAGE_ruby-objspace is not set +# CONFIG_PACKAGE_ruby-observer is not set +# CONFIG_PACKAGE_ruby-open-uri is not set +# CONFIG_PACKAGE_ruby-open3 is not set +# CONFIG_PACKAGE_ruby-openssl is not set +# CONFIG_PACKAGE_ruby-optparse is not set +# CONFIG_PACKAGE_ruby-ostruct is not set +# CONFIG_PACKAGE_ruby-pathname is not set +# CONFIG_PACKAGE_ruby-powerassert is not set +# CONFIG_PACKAGE_ruby-pp is not set +# CONFIG_PACKAGE_ruby-prettyprint is not set +# CONFIG_PACKAGE_ruby-prime is not set +CONFIG_PACKAGE_ruby-pstore=y +CONFIG_PACKAGE_ruby-psych=y +# CONFIG_PACKAGE_ruby-pty is not set +# CONFIG_PACKAGE_ruby-racc is not set +# CONFIG_PACKAGE_ruby-rake is not set +# CONFIG_PACKAGE_ruby-random_formatter is not set +# CONFIG_PACKAGE_ruby-rbconfig is not set +# CONFIG_PACKAGE_ruby-rbs is not set +# CONFIG_PACKAGE_ruby-rdoc is not set +# CONFIG_PACKAGE_ruby-readline is not set +# CONFIG_PACKAGE_ruby-readline-ext is not set +# CONFIG_PACKAGE_ruby-reline is not set +# CONFIG_PACKAGE_ruby-resolv is not set +# CONFIG_PACKAGE_ruby-resolv-replace is not set +# CONFIG_PACKAGE_ruby-rexml is not set +# CONFIG_PACKAGE_ruby-rinda is not set +# CONFIG_PACKAGE_ruby-ripper is not set +# CONFIG_PACKAGE_ruby-rss is not set +# CONFIG_PACKAGE_ruby-ruby2_keywords is not set +# CONFIG_PACKAGE_ruby-securerandom is not set +# CONFIG_PACKAGE_ruby-set is not set +# CONFIG_PACKAGE_ruby-shellwords is not set +# CONFIG_PACKAGE_ruby-singleton is not set +# CONFIG_PACKAGE_ruby-socket is not set +CONFIG_PACKAGE_ruby-stringio=y +CONFIG_PACKAGE_ruby-strscan=y +# CONFIG_PACKAGE_ruby-syslog is not set +# CONFIG_PACKAGE_ruby-tempfile is not set +# CONFIG_PACKAGE_ruby-testunit is not set +# CONFIG_PACKAGE_ruby-time is not set +# CONFIG_PACKAGE_ruby-timeout is not set +# CONFIG_PACKAGE_ruby-tmpdir is not set +# CONFIG_PACKAGE_ruby-tsort is not set +# CONFIG_PACKAGE_ruby-typeprof is not set +# CONFIG_PACKAGE_ruby-un is not set +# CONFIG_PACKAGE_ruby-unicodenormalize is not set +# CONFIG_PACKAGE_ruby-uri is not set +# CONFIG_PACKAGE_ruby-weakref is not set +CONFIG_PACKAGE_ruby-yaml=y +# CONFIG_PACKAGE_ruby-zlib is not set +# end of Ruby +# end of Languages + +# +# Libraries +# + +# +# Compression +# +CONFIG_PACKAGE_libbz2=y +# CONFIG_PACKAGE_liblzma is not set +# CONFIG_PACKAGE_libzstd is not set +# end of Compression + +# +# Database +# +CONFIG_PACKAGE_libsqlite3=y + +# +# Configuration +# +CONFIG_SQLITE3_DYNAMIC_EXTENSIONS=y +CONFIG_SQLITE3_FTS3=y +CONFIG_SQLITE3_FTS4=y +CONFIG_SQLITE3_FTS5=y +CONFIG_SQLITE3_JSON1=y +CONFIG_SQLITE3_RTREE=y +# CONFIG_SQLITE3_SESSION is not set +# end of Configuration +# end of Database + +# +# Filesystem +# +# CONFIG_PACKAGE_libacl is not set +# CONFIG_PACKAGE_libattr is not set +# CONFIG_PACKAGE_libfuse is not set +# CONFIG_PACKAGE_libsysfs is not set +# end of Filesystem + +# +# Firewall +# +CONFIG_PACKAGE_libip4tc=y +CONFIG_PACKAGE_libip6tc=y +CONFIG_PACKAGE_libxtables=y +# CONFIG_PACKAGE_libxtables-nft is not set +# end of Firewall + +# +# Languages +# +CONFIG_PACKAGE_libyaml=y +# end of Languages + +# +# Networking +# +# CONFIG_PACKAGE_libuhttpd-mbedtls is not set +# CONFIG_PACKAGE_libuhttpd-nossl is not set +# CONFIG_PACKAGE_libuhttpd-openssl is not set +# CONFIG_PACKAGE_libuhttpd-wolfssl is not set +# CONFIG_PACKAGE_libunbound is not set +# end of Networking + +# +# SSL +# +# CONFIG_PACKAGE_libgnutls is not set +# CONFIG_PACKAGE_libgnutls-dane is not set +CONFIG_PACKAGE_libmbedtls=y +# CONFIG_LIBMBEDTLS_DEBUG_C is not set +# CONFIG_LIBMBEDTLS_HKDF_C is not set +CONFIG_PACKAGE_libopenssl=y + +# +# Build Options +# +CONFIG_OPENSSL_OPTIMIZE_SPEED=y +CONFIG_OPENSSL_WITH_ASM=y +CONFIG_OPENSSL_WITH_DEPRECATED=y +# CONFIG_OPENSSL_NO_DEPRECATED is not set +CONFIG_OPENSSL_WITH_ERROR_MESSAGES=y + +# +# Protocol Support +# +CONFIG_OPENSSL_WITH_TLS13=y +# CONFIG_OPENSSL_WITH_DTLS is not set +# CONFIG_OPENSSL_WITH_NPN is not set +CONFIG_OPENSSL_WITH_SRP=y +CONFIG_OPENSSL_WITH_CMS=y + +# +# Algorithm Selection +# +# CONFIG_OPENSSL_WITH_EC2M is not set +CONFIG_OPENSSL_WITH_CHACHA_POLY1305=y +# CONFIG_OPENSSL_PREFER_CHACHA_OVER_GCM is not set +CONFIG_OPENSSL_WITH_PSK=y + +# +# Less commonly used build options +# +# CONFIG_OPENSSL_WITH_ARIA is not set +# CONFIG_OPENSSL_WITH_CAMELLIA is not set +# CONFIG_OPENSSL_WITH_IDEA is not set +# CONFIG_OPENSSL_WITH_SEED is not set +# CONFIG_OPENSSL_WITH_SM234 is not set +# CONFIG_OPENSSL_WITH_BLAKE2 is not set +# CONFIG_OPENSSL_WITH_MDC2 is not set +# CONFIG_OPENSSL_WITH_WHIRLPOOL is not set +# CONFIG_OPENSSL_WITH_COMPRESSION is not set +# CONFIG_OPENSSL_WITH_RFC3779 is not set + +# +# Engine/Hardware Support +# +CONFIG_OPENSSL_ENGINE=y +# CONFIG_OPENSSL_ENGINE_BUILTIN is not set +# CONFIG_OPENSSL_WITH_GOST is not set +# CONFIG_PACKAGE_libopenssl-afalg is not set +CONFIG_PACKAGE_libopenssl-conf=y +# CONFIG_PACKAGE_libopenssl-devcrypto is not set +CONFIG_PACKAGE_libwolfssl=y +CONFIG_WOLFSSL_HAS_AES_CCM=y +CONFIG_WOLFSSL_HAS_CHACHA_POLY=y +CONFIG_WOLFSSL_HAS_DH=y +CONFIG_WOLFSSL_HAS_ARC4=y +CONFIG_WOLFSSL_HAS_CERTGEN=y +CONFIG_WOLFSSL_HAS_TLSV10=y +CONFIG_WOLFSSL_HAS_TLSV13=y +CONFIG_WOLFSSL_HAS_SESSION_TICKET=y +# CONFIG_WOLFSSL_HAS_DTLS is not set +CONFIG_WOLFSSL_HAS_OCSP=y +CONFIG_WOLFSSL_HAS_WPAS=y +CONFIG_WOLFSSL_HAS_ECC25519=y +CONFIG_WOLFSSL_ALT_NAMES=y +CONFIG_WOLFSSL_HAS_NO_HW=y +# CONFIG_WOLFSSL_HAS_AFALG is not set +# CONFIG_WOLFSSL_HAS_DEVCRYPTO_CBC is not set +# CONFIG_WOLFSSL_HAS_DEVCRYPTO_AES is not set +# CONFIG_WOLFSSL_HAS_DEVCRYPTO_FULL is not set +# end of SSL + +# +# libimobiledevice +# +CONFIG_PACKAGE_libimobiledevice=y +CONFIG_PACKAGE_libplist=y +# CONFIG_PACKAGE_libplistcxx is not set +CONFIG_PACKAGE_libusbmuxd=y +# end of libimobiledevice + +# CONFIG_PACKAGE_alsa-lib is not set +# CONFIG_PACKAGE_argp-standalone is not set +# CONFIG_PACKAGE_bind-libs is not set +# CONFIG_PACKAGE_bluez-libs is not set +# CONFIG_PACKAGE_boost is not set +# CONFIG_boost-context-exclude is not set +# CONFIG_boost-coroutine-exclude is not set +# CONFIG_boost-fiber-exclude is not set +# CONFIG_PACKAGE_cJSON is not set +CONFIG_PACKAGE_fcgi=y +# CONFIG_PACKAGE_fcgixx is not set +CONFIG_PACKAGE_getdns=y + +# +# Configuration +# +CONFIG_GETDNS_ENABLE_STUB_ONLY=y +# CONFIG_GETDNS_ENABLE_IDN_LIBIDN2 is not set +# end of Configuration + +# CONFIG_PACKAGE_giflib is not set +# CONFIG_PACKAGE_glib2 is not set +# CONFIG_PACKAGE_icu is not set +# CONFIG_PACKAGE_icu-data-tools is not set +# CONFIG_PACKAGE_icu-full-data is not set +CONFIG_PACKAGE_jansson=y +# CONFIG_PACKAGE_libaio is not set +# CONFIG_PACKAGE_libasm is not set +# CONFIG_PACKAGE_libaudit is not set +# CONFIG_PACKAGE_libbfd is not set +CONFIG_PACKAGE_libblkid=y +CONFIG_PACKAGE_libblobmsg-json=y +CONFIG_PACKAGE_libbpf=y +# CONFIG_PACKAGE_libbsd is not set +CONFIG_PACKAGE_libcap=y +CONFIG_PACKAGE_libcap-bin=y +CONFIG_PACKAGE_libcap-bin-capsh-shell="/bin/sh" +CONFIG_PACKAGE_libcares=y +# CONFIG_PACKAGE_libcharset is not set +CONFIG_PACKAGE_libcomerr=y +# CONFIG_PACKAGE_libctf is not set +CONFIG_PACKAGE_libcurl=y + +# +# SSL support +# +# CONFIG_LIBCURL_MBEDTLS is not set +# CONFIG_LIBCURL_WOLFSSL is not set +CONFIG_LIBCURL_OPENSSL=y +# CONFIG_LIBCURL_GNUTLS is not set +# CONFIG_LIBCURL_NOSSL is not set + +# +# Supported protocols +# +# CONFIG_LIBCURL_DICT is not set +CONFIG_LIBCURL_FILE=y +CONFIG_LIBCURL_FTP=y +# CONFIG_LIBCURL_GOPHER is not set +CONFIG_LIBCURL_HTTP=y +CONFIG_LIBCURL_COOKIES=y +# CONFIG_LIBCURL_IMAP is not set +# CONFIG_LIBCURL_LDAP is not set +# CONFIG_LIBCURL_POP3 is not set +# CONFIG_LIBCURL_RTSP is not set +# CONFIG_LIBCURL_SSH2 is not set +CONFIG_LIBCURL_NO_SMB="!" +# CONFIG_LIBCURL_SMTP is not set +# CONFIG_LIBCURL_TELNET is not set +# CONFIG_LIBCURL_TFTP is not set +CONFIG_LIBCURL_NGHTTP2=y + +# +# Miscellaneous +# +CONFIG_LIBCURL_PROXY=y +# CONFIG_LIBCURL_CRYPTO_AUTH is not set +# CONFIG_LIBCURL_TLS_SRP is not set +# CONFIG_LIBCURL_LIBIDN2 is not set +# CONFIG_LIBCURL_THREADED_RESOLVER is not set +# CONFIG_LIBCURL_ZLIB is not set +# CONFIG_LIBCURL_ZSTD is not set +# CONFIG_LIBCURL_UNIX_SOCKETS is not set +# CONFIG_LIBCURL_LIBCURL_OPTION is not set +# CONFIG_LIBCURL_VERBOSE is not set +# CONFIG_PACKAGE_libdb47 is not set +# CONFIG_PACKAGE_libdb47xx is not set +# CONFIG_PACKAGE_libdbus is not set +CONFIG_PACKAGE_libdevmapper=y +# CONFIG_PACKAGE_libdevmapper-selinux is not set +# CONFIG_PACKAGE_libdw is not set +# CONFIG_PACKAGE_libedit is not set +CONFIG_PACKAGE_libelf=y +CONFIG_PACKAGE_libev=y +CONFIG_PACKAGE_libevent2=y +# CONFIG_PACKAGE_libevent2-core is not set +# CONFIG_PACKAGE_libevent2-extra is not set +# CONFIG_PACKAGE_libevent2-openssl is not set +# CONFIG_PACKAGE_libevent2-pthreads is not set +CONFIG_PACKAGE_libexif=y +# CONFIG_PACKAGE_libexpat is not set +CONFIG_PACKAGE_libext2fs=y +# CONFIG_PACKAGE_libf2fs is not set +# CONFIG_PACKAGE_libf2fs-selinux is not set +# CONFIG_PACKAGE_libfdisk is not set +# CONFIG_PACKAGE_libfdt is not set +# CONFIG_PACKAGE_libffi is not set +CONFIG_PACKAGE_libffmpeg-audio-dec=y +# CONFIG_PACKAGE_libffmpeg-custom is not set +# CONFIG_PACKAGE_libffmpeg-full is not set +# CONFIG_PACKAGE_libffmpeg-mini is not set +CONFIG_PACKAGE_libflac=y +CONFIG_PACKAGE_libgcrypt=y +# CONFIG_PACKAGE_libgdbm is not set +CONFIG_PACKAGE_libgmp=y +CONFIG_PACKAGE_libgpg-error=y +# CONFIG_PACKAGE_libical is not set +# CONFIG_PACKAGE_libiconv is not set +# CONFIG_PACKAGE_libiconv-full is not set +CONFIG_PACKAGE_libid3tag=y +# CONFIG_PACKAGE_libidn2 is not set +# CONFIG_PACKAGE_libintl is not set +# CONFIG_PACKAGE_libintl-full is not set +# CONFIG_PACKAGE_libiw is not set +CONFIG_PACKAGE_libiwinfo=y +CONFIG_PACKAGE_libjpeg-turbo=y +CONFIG_PACKAGE_libjson-c=y +CONFIG_PACKAGE_libkeyutils=y +# CONFIG_PACKAGE_libkmod is not set +CONFIG_PACKAGE_libkvcutil=y +# CONFIG_PACKAGE_libldns is not set +# CONFIG_PACKAGE_libltdl is not set +CONFIG_PACKAGE_liblua=y +# CONFIG_PACKAGE_liblua5.3 is not set +CONFIG_PACKAGE_liblucihttp=y +CONFIG_PACKAGE_liblucihttp-lua=y +CONFIG_PACKAGE_liblzo=y +CONFIG_PACKAGE_libminiupnpc=y +CONFIG_PACKAGE_libmnl=y +# CONFIG_PACKAGE_libmosquitto-nossl is not set +# CONFIG_PACKAGE_libmosquitto-ssl is not set +# CONFIG_PACKAGE_libmount is not set +CONFIG_PACKAGE_libnatpmp=y +CONFIG_PACKAGE_libncurses=y +# CONFIG_PACKAGE_libnetfilter-acct is not set +CONFIG_PACKAGE_libnetfilter-conntrack=y +CONFIG_PACKAGE_libnetfilter-cthelper=y +CONFIG_PACKAGE_libnetfilter-cttimeout=y +CONFIG_PACKAGE_libnetfilter-queue=y +# CONFIG_PACKAGE_libnetsnmp is not set +CONFIG_PACKAGE_libnettle=y + +# +# Configuration +# +# CONFIG_LIBNETTLE_MINI is not set +# end of Configuration + +CONFIG_PACKAGE_libnfnetlink=y +# CONFIG_PACKAGE_libnftnl is not set +CONFIG_PACKAGE_libnghttp2=y +# CONFIG_PACKAGE_libnl is not set +# CONFIG_PACKAGE_libnl-core is not set +# CONFIG_PACKAGE_libnl-genl is not set +# CONFIG_PACKAGE_libnl-nf is not set +# CONFIG_PACKAGE_libnl-route is not set +CONFIG_PACKAGE_libnl-tiny=y +CONFIG_PACKAGE_libogg=y +# CONFIG_PACKAGE_libopcodes is not set +# CONFIG_PACKAGE_libopus is not set +# CONFIG_PACKAGE_libpam is not set +CONFIG_PACKAGE_libpcap=y + +# +# Configuration +# +# CONFIG_PCAP_HAS_USB is not set +# CONFIG_PCAP_HAS_NETFILTER is not set +# end of Configuration + +# CONFIG_PACKAGE_libpci is not set +CONFIG_PACKAGE_libpcre=y +# CONFIG_PACKAGE_libpcre16 is not set +# CONFIG_PACKAGE_libpcre32 is not set +# CONFIG_PACKAGE_libpcrecpp is not set +# CONFIG_PACKAGE_libpopt is not set +# CONFIG_PACKAGE_libprotobuf-c is not set +CONFIG_PACKAGE_libreadline=y +CONFIG_PACKAGE_libruby=y +# CONFIG_PACKAGE_libsasl2 is not set +# CONFIG_PACKAGE_libselinux is not set +# CONFIG_PACKAGE_libsemanage is not set +# CONFIG_PACKAGE_libsepol is not set +# CONFIG_PACKAGE_libsmartcols is not set +# CONFIG_PACKAGE_libsocks is not set +CONFIG_PACKAGE_libsodium=y + +# +# Configuration +# +CONFIG_LIBSODIUM_MINIMAL=y +# end of Configuration + +CONFIG_PACKAGE_libss=y +# CONFIG_PACKAGE_libssh2 is not set +# CONFIG_PACKAGE_libtasn1 is not set +CONFIG_PACKAGE_libtirpc=y +CONFIG_PACKAGE_libubox=y +CONFIG_PACKAGE_libubox-lua=y +CONFIG_PACKAGE_libubus=y +CONFIG_PACKAGE_libubus-lua=y +CONFIG_PACKAGE_libuci=y +CONFIG_PACKAGE_libuci-lua=y +CONFIG_PACKAGE_libuclient=y +CONFIG_PACKAGE_libudns=y +# CONFIG_PACKAGE_libunistring is not set +# CONFIG_PACKAGE_libunwind is not set +CONFIG_PACKAGE_libusb-1.0=y +# CONFIG_PACKAGE_libustream-mbedtls is not set +# CONFIG_PACKAGE_libustream-openssl is not set +CONFIG_PACKAGE_libustream-wolfssl=y +CONFIG_PACKAGE_libuuid=y +# CONFIG_PACKAGE_libuv is not set +CONFIG_PACKAGE_libvorbis=y +# CONFIG_PACKAGE_libwebsockets-full is not set +# CONFIG_PACKAGE_libwebsockets-mbedtls is not set +# CONFIG_PACKAGE_libwebsockets-openssl is not set +CONFIG_PACKAGE_libwrap=y +CONFIG_PACKAGE_libxml2=y +# CONFIG_PACKAGE_linux-atm is not set +# CONFIG_PACKAGE_musl-fts is not set +# CONFIG_PACKAGE_p11-kit is not set +# CONFIG_PACKAGE_protobuf is not set +# CONFIG_PACKAGE_protobuf-lite is not set +CONFIG_PACKAGE_rpcd-mod-luci=y +CONFIG_PACKAGE_rpcd-mod-rrdns=y +CONFIG_PACKAGE_terminfo=y +# CONFIG_PACKAGE_uclibcxx is not set +CONFIG_PACKAGE_zlib=y + +# +# Configuration +# +# CONFIG_ZLIB_OPTIMIZE_SPEED is not set +# end of Configuration +# end of Libraries + +# +# LuCI +# + +# +# 1. Collections +# +CONFIG_PACKAGE_luci=y +# end of 1. Collections + +# +# 2. Modules +# +CONFIG_PACKAGE_luci-base=y +# CONFIG_LUCI_SRCDIET is not set +CONFIG_LUCI_JSMIN=y +CONFIG_LUCI_CSSTIDY=y + +# +# Translations +# +# CONFIG_LUCI_LANG_ar is not set +# CONFIG_LUCI_LANG_bg is not set +# CONFIG_LUCI_LANG_bn_BD is not set +# CONFIG_LUCI_LANG_ca is not set +# CONFIG_LUCI_LANG_cs is not set +# CONFIG_LUCI_LANG_da is not set +# CONFIG_LUCI_LANG_de is not set +# CONFIG_LUCI_LANG_el is not set +CONFIG_LUCI_LANG_en=y +# CONFIG_LUCI_LANG_es is not set +# CONFIG_LUCI_LANG_fi is not set +# CONFIG_LUCI_LANG_fr is not set +# CONFIG_LUCI_LANG_he is not set +# CONFIG_LUCI_LANG_hi is not set +# CONFIG_LUCI_LANG_hu is not set +# CONFIG_LUCI_LANG_it is not set +# CONFIG_LUCI_LANG_ja is not set +# CONFIG_LUCI_LANG_ko is not set +# CONFIG_LUCI_LANG_mr is not set +# CONFIG_LUCI_LANG_ms is not set +# CONFIG_LUCI_LANG_nb_NO is not set +# CONFIG_LUCI_LANG_nl is not set +# CONFIG_LUCI_LANG_pl is not set +# CONFIG_LUCI_LANG_pt is not set +# CONFIG_LUCI_LANG_pt_BR is not set +# CONFIG_LUCI_LANG_ro is not set +# CONFIG_LUCI_LANG_ru is not set +# CONFIG_LUCI_LANG_sk is not set +# CONFIG_LUCI_LANG_sv is not set +# CONFIG_LUCI_LANG_tr is not set +# CONFIG_LUCI_LANG_uk is not set +# CONFIG_LUCI_LANG_vi is not set +CONFIG_LUCI_LANG_zh_Hans=y +# CONFIG_LUCI_LANG_zh_Hant is not set +# end of Translations + +CONFIG_PACKAGE_luci-compat=y +CONFIG_PACKAGE_luci-mod-admin-full=y +CONFIG_PACKAGE_luci-mod-network=y +CONFIG_PACKAGE_luci-mod-rpc=y +CONFIG_PACKAGE_luci-mod-status=y +CONFIG_PACKAGE_luci-mod-system=y +# end of 2. Modules + +# +# 3. Applications +# +CONFIG_PACKAGE_luci-app-firewall=y +CONFIG_PACKAGE_luci-app-mtk=y +CONFIG_PACKAGE_luci-app-openclash=y +CONFIG_PACKAGE_iptables-mod-tproxy=y +CONFIG_PACKAGE_iptables-mod-extra=y +CONFIG_PACKAGE_luci-app-opkg=y +CONFIG_PACKAGE_luci-app-passwall=y + +# +# Configuration +# +# CONFIG_PACKAGE_luci-app-passwall_INCLUDE_Brook is not set +# CONFIG_PACKAGE_luci-app-passwall_INCLUDE_Haproxy is not set +# CONFIG_PACKAGE_luci-app-passwall_INCLUDE_Hysteria is not set +# CONFIG_PACKAGE_luci-app-passwall_INCLUDE_NaiveProxy is not set +CONFIG_PACKAGE_luci-app-passwall_INCLUDE_Shadowsocks_Libev_Client=y +CONFIG_PACKAGE_luci-app-passwall_INCLUDE_Shadowsocks_Libev_Server=y +CONFIG_PACKAGE_luci-app-passwall_INCLUDE_Shadowsocks_Rust_Client=y +CONFIG_PACKAGE_luci-app-passwall_INCLUDE_Shadowsocks_Rust_Server=y +CONFIG_PACKAGE_luci-app-passwall_INCLUDE_ShadowsocksR_Libev_Client=y +CONFIG_PACKAGE_luci-app-passwall_INCLUDE_ShadowsocksR_Libev_Server=y +CONFIG_PACKAGE_luci-app-passwall_INCLUDE_Simple_Obfs=y +# CONFIG_PACKAGE_luci-app-passwall_INCLUDE_Trojan_GO is not set +# CONFIG_PACKAGE_luci-app-passwall_INCLUDE_Trojan_Plus is not set +CONFIG_PACKAGE_luci-app-passwall_INCLUDE_V2ray=y +# CONFIG_PACKAGE_luci-app-passwall_INCLUDE_V2ray_Geodata is not set +# CONFIG_PACKAGE_luci-app-passwall_INCLUDE_V2ray_Plugin is not set +# CONFIG_PACKAGE_luci-app-passwall_INCLUDE_Xray is not set +# CONFIG_PACKAGE_luci-app-passwall_INCLUDE_Xray_Plugin is not set +# end of Configuration + +CONFIG_PACKAGE_luci-app-ssr-plus=y +# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Shadowsocks_NONE_Client is not set +# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Shadowsocks_Libev_Client is not set +CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Shadowsocks_Rust_Client=y +# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Shadowsocks_NONE_Server is not set +# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Shadowsocks_Libev_Server is not set +CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Shadowsocks_Rust_Server=y +# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_NONE_V2RAY is not set +CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_V2ray=y +# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Xray is not set +CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_ChinaDNS_NG=y +# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Hysteria is not set +# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_TUIC-Client is not set +CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_IPT2Socks=y +# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Kcptun is not set +# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_NaiveProxy is not set +# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Redsocks2 is not set +CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Shadowsocks_Simple_Obfs=y +# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Shadowsocks_V2ray_Plugin is not set +CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_ShadowsocksR_Libev_Client=y +CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_ShadowsocksR_Libev_Server=y +# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Trojan is not set +CONFIG_PACKAGE_luci-app-turboacc=y +# CONFIG_PACKAGE_TURBOACC_INCLUDE_NO_FASTPATH is not set +CONFIG_PACKAGE_TURBOACC_INCLUDE_FLOW_OFFLOADING=y +# CONFIG_PACKAGE_TURBOACC_INCLUDE_FAST_CLASSIFIER is not set +# CONFIG_PACKAGE_TURBOACC_INCLUDE_SHORTCUT_FE_CM is not set +# CONFIG_PACKAGE_TURBOACC_INCLUDE_BBR_CCA is not set +CONFIG_PACKAGE_luci-app-upnp=y +# end of 3. Applications + +# +# 4. Themes +# +CONFIG_PACKAGE_luci-theme-bootstrap=y +# CONFIG_PACKAGE_luci-theme-design is not set +# end of 4. Themes + +# +# 5. Protocols +# +CONFIG_PACKAGE_luci-proto-ipv6=y +CONFIG_PACKAGE_luci-proto-ppp=y +# end of 5. Protocols + +# +# 6. Libraries +# +CONFIG_PACKAGE_luci-lib-base=y +CONFIG_PACKAGE_luci-lib-ip=y +CONFIG_PACKAGE_luci-lib-ipkg=y +CONFIG_PACKAGE_luci-lib-json=y +CONFIG_PACKAGE_luci-lib-jsonc=y +CONFIG_PACKAGE_luci-lib-nixio=y +CONFIG_PACKAGE_luci-lib-nixio_notls=y +# CONFIG_PACKAGE_luci-lib-nixio_axtls is not set +# CONFIG_PACKAGE_luci-lib-nixio_cyassl is not set +# CONFIG_PACKAGE_luci-lib-nixio_openssl is not set +# end of 6. Libraries + +# CONFIG_PACKAGE_luci-i18n-base-ar is not set +# CONFIG_PACKAGE_luci-i18n-base-bg is not set +# CONFIG_PACKAGE_luci-i18n-base-bn is not set +# CONFIG_PACKAGE_luci-i18n-base-ca is not set +# CONFIG_PACKAGE_luci-i18n-base-cs is not set +# CONFIG_PACKAGE_luci-i18n-base-da is not set +# CONFIG_PACKAGE_luci-i18n-base-de is not set +# CONFIG_PACKAGE_luci-i18n-base-el is not set +CONFIG_PACKAGE_luci-i18n-base-en=y +# CONFIG_PACKAGE_luci-i18n-base-es is not set +# CONFIG_PACKAGE_luci-i18n-base-fi is not set +# CONFIG_PACKAGE_luci-i18n-base-fr is not set +# CONFIG_PACKAGE_luci-i18n-base-he is not set +# CONFIG_PACKAGE_luci-i18n-base-hi is not set +# CONFIG_PACKAGE_luci-i18n-base-hu is not set +# CONFIG_PACKAGE_luci-i18n-base-it is not set +# CONFIG_PACKAGE_luci-i18n-base-ja is not set +# CONFIG_PACKAGE_luci-i18n-base-ko is not set +# CONFIG_PACKAGE_luci-i18n-base-mr is not set +# CONFIG_PACKAGE_luci-i18n-base-ms is not set +# CONFIG_PACKAGE_luci-i18n-base-nl is not set +# CONFIG_PACKAGE_luci-i18n-base-no is not set +# CONFIG_PACKAGE_luci-i18n-base-pl is not set +# CONFIG_PACKAGE_luci-i18n-base-pt is not set +# CONFIG_PACKAGE_luci-i18n-base-pt-br is not set +# CONFIG_PACKAGE_luci-i18n-base-ro is not set +# CONFIG_PACKAGE_luci-i18n-base-ru is not set +# CONFIG_PACKAGE_luci-i18n-base-sk is not set +# CONFIG_PACKAGE_luci-i18n-base-sv is not set +# CONFIG_PACKAGE_luci-i18n-base-tr is not set +# CONFIG_PACKAGE_luci-i18n-base-uk is not set +# CONFIG_PACKAGE_luci-i18n-base-vi is not set +CONFIG_PACKAGE_luci-i18n-base-zh-cn=y +# CONFIG_PACKAGE_luci-i18n-base-zh-tw is not set +# CONFIG_PACKAGE_luci-i18n-firewall-ar is not set +# CONFIG_PACKAGE_luci-i18n-firewall-bg is not set +# CONFIG_PACKAGE_luci-i18n-firewall-bn is not set +# CONFIG_PACKAGE_luci-i18n-firewall-ca is not set +# CONFIG_PACKAGE_luci-i18n-firewall-cs is not set +# CONFIG_PACKAGE_luci-i18n-firewall-da is not set +# CONFIG_PACKAGE_luci-i18n-firewall-de is not set +# CONFIG_PACKAGE_luci-i18n-firewall-el is not set +CONFIG_PACKAGE_luci-i18n-firewall-en=y +# CONFIG_PACKAGE_luci-i18n-firewall-es is not set +# CONFIG_PACKAGE_luci-i18n-firewall-fi is not set +# CONFIG_PACKAGE_luci-i18n-firewall-fr is not set +# CONFIG_PACKAGE_luci-i18n-firewall-he is not set +# CONFIG_PACKAGE_luci-i18n-firewall-hi is not set +# CONFIG_PACKAGE_luci-i18n-firewall-hu is not set +# CONFIG_PACKAGE_luci-i18n-firewall-it is not set +# CONFIG_PACKAGE_luci-i18n-firewall-ja is not set +# CONFIG_PACKAGE_luci-i18n-firewall-ko is not set +# CONFIG_PACKAGE_luci-i18n-firewall-mr is not set +# CONFIG_PACKAGE_luci-i18n-firewall-ms is not set +# CONFIG_PACKAGE_luci-i18n-firewall-no is not set +# CONFIG_PACKAGE_luci-i18n-firewall-pl is not set +# CONFIG_PACKAGE_luci-i18n-firewall-pt is not set +# CONFIG_PACKAGE_luci-i18n-firewall-pt-br is not set +# CONFIG_PACKAGE_luci-i18n-firewall-ro is not set +# CONFIG_PACKAGE_luci-i18n-firewall-ru is not set +# CONFIG_PACKAGE_luci-i18n-firewall-sk is not set +# CONFIG_PACKAGE_luci-i18n-firewall-sv is not set +# CONFIG_PACKAGE_luci-i18n-firewall-tr is not set +# CONFIG_PACKAGE_luci-i18n-firewall-uk is not set +# CONFIG_PACKAGE_luci-i18n-firewall-vi is not set +CONFIG_PACKAGE_luci-i18n-firewall-zh-cn=y +# CONFIG_PACKAGE_luci-i18n-firewall-zh-tw is not set +CONFIG_PACKAGE_luci-i18n-mtk-zh-cn=y +# CONFIG_PACKAGE_luci-i18n-opkg-ar is not set +# CONFIG_PACKAGE_luci-i18n-opkg-bg is not set +# CONFIG_PACKAGE_luci-i18n-opkg-bn is not set +# CONFIG_PACKAGE_luci-i18n-opkg-ca is not set +# CONFIG_PACKAGE_luci-i18n-opkg-cs is not set +# CONFIG_PACKAGE_luci-i18n-opkg-da is not set +# CONFIG_PACKAGE_luci-i18n-opkg-de is not set +# CONFIG_PACKAGE_luci-i18n-opkg-el is not set +CONFIG_PACKAGE_luci-i18n-opkg-en=y +# CONFIG_PACKAGE_luci-i18n-opkg-es is not set +# CONFIG_PACKAGE_luci-i18n-opkg-fi is not set +# CONFIG_PACKAGE_luci-i18n-opkg-fr is not set +# CONFIG_PACKAGE_luci-i18n-opkg-he is not set +# CONFIG_PACKAGE_luci-i18n-opkg-hi is not set +# CONFIG_PACKAGE_luci-i18n-opkg-hu is not set +# CONFIG_PACKAGE_luci-i18n-opkg-it is not set +# CONFIG_PACKAGE_luci-i18n-opkg-ja is not set +# CONFIG_PACKAGE_luci-i18n-opkg-ko is not set +# CONFIG_PACKAGE_luci-i18n-opkg-mr is not set +# CONFIG_PACKAGE_luci-i18n-opkg-ms is not set +# CONFIG_PACKAGE_luci-i18n-opkg-no is not set +# CONFIG_PACKAGE_luci-i18n-opkg-pl is not set +# CONFIG_PACKAGE_luci-i18n-opkg-pt is not set +# CONFIG_PACKAGE_luci-i18n-opkg-pt-br is not set +# CONFIG_PACKAGE_luci-i18n-opkg-ro is not set +# CONFIG_PACKAGE_luci-i18n-opkg-ru is not set +# CONFIG_PACKAGE_luci-i18n-opkg-sk is not set +# CONFIG_PACKAGE_luci-i18n-opkg-sv is not set +# CONFIG_PACKAGE_luci-i18n-opkg-tr is not set +# CONFIG_PACKAGE_luci-i18n-opkg-uk is not set +# CONFIG_PACKAGE_luci-i18n-opkg-vi is not set +CONFIG_PACKAGE_luci-i18n-opkg-zh-cn=y +# CONFIG_PACKAGE_luci-i18n-opkg-zh-tw is not set +CONFIG_PACKAGE_luci-i18n-passwall-zh-cn=y +CONFIG_PACKAGE_luci-i18n-ssr-plus-zh-cn=y +# CONFIG_PACKAGE_luci-i18n-upnp-ar is not set +# CONFIG_PACKAGE_luci-i18n-upnp-bg is not set +# CONFIG_PACKAGE_luci-i18n-upnp-bn is not set +# CONFIG_PACKAGE_luci-i18n-upnp-ca is not set +# CONFIG_PACKAGE_luci-i18n-upnp-cs is not set +# CONFIG_PACKAGE_luci-i18n-upnp-da is not set +# CONFIG_PACKAGE_luci-i18n-upnp-de is not set +# CONFIG_PACKAGE_luci-i18n-upnp-el is not set +CONFIG_PACKAGE_luci-i18n-upnp-en=y +# CONFIG_PACKAGE_luci-i18n-upnp-es is not set +# CONFIG_PACKAGE_luci-i18n-upnp-fi is not set +# CONFIG_PACKAGE_luci-i18n-upnp-fr is not set +# CONFIG_PACKAGE_luci-i18n-upnp-he is not set +# CONFIG_PACKAGE_luci-i18n-upnp-hi is not set +# CONFIG_PACKAGE_luci-i18n-upnp-hu is not set +# CONFIG_PACKAGE_luci-i18n-upnp-it is not set +# CONFIG_PACKAGE_luci-i18n-upnp-ja is not set +# CONFIG_PACKAGE_luci-i18n-upnp-ko is not set +# CONFIG_PACKAGE_luci-i18n-upnp-mr is not set +# CONFIG_PACKAGE_luci-i18n-upnp-ms is not set +# CONFIG_PACKAGE_luci-i18n-upnp-no is not set +# CONFIG_PACKAGE_luci-i18n-upnp-pl is not set +# CONFIG_PACKAGE_luci-i18n-upnp-pt is not set +# CONFIG_PACKAGE_luci-i18n-upnp-pt-br is not set +# CONFIG_PACKAGE_luci-i18n-upnp-ro is not set +# CONFIG_PACKAGE_luci-i18n-upnp-ru is not set +# CONFIG_PACKAGE_luci-i18n-upnp-sk is not set +# CONFIG_PACKAGE_luci-i18n-upnp-sv is not set +# CONFIG_PACKAGE_luci-i18n-upnp-tr is not set +# CONFIG_PACKAGE_luci-i18n-upnp-uk is not set +# CONFIG_PACKAGE_luci-i18n-upnp-vi is not set +CONFIG_PACKAGE_luci-i18n-upnp-zh-cn=y +# CONFIG_PACKAGE_luci-i18n-upnp-zh-tw is not set +# end of LuCI + +# +# Mail +# +CONFIG_PACKAGE_ssmtp=y +# end of Mail + +# +# MTK Properties +# + +# +# Applications +# +CONFIG_PACKAGE_datconf=y +CONFIG_PACKAGE_datconf-lua=y +CONFIG_PACKAGE_mii_mgr=y +CONFIG_PACKAGE_regs=y +# end of Applications + +# +# Drivers +# +CONFIG_PACKAGE_kmod-conninfra=y +CONFIG_MTK_CONNINFRA_APSOC=y +CONFIG_MTK_CONNINFRA_APSOC_MT7986=y +# CONFIG_MTK_CONNINFRA_APSOC_MT7981 is not set +CONFIG_CONNINFRA_EMI_SUPPORT=y +# CONFIG_FPGA_EARLY_PORTING is not set +CONFIG_CONNINFRA_AUTO_UP=y +CONFIG_PACKAGE_kmod-mt_wifi=y +CONFIG_MTK_SUPPORT_OPENWRT=y +CONFIG_MTK_WIFI_DRIVER=y +# CONFIG_MTK_FIRST_IF_NONE is not set +# CONFIG_MTK_FIRST_IF_MT7615E is not set +# CONFIG_MTK_FIRST_IF_MT7622 is not set +# CONFIG_MTK_FIRST_IF_MT7626 is not set +# CONFIG_MTK_FIRST_IF_AXE is not set +# CONFIG_MTK_FIRST_IF_MT7915 is not set +CONFIG_MTK_FIRST_IF_MT7986=y +# CONFIG_MTK_FIRST_IF_MT7916 is not set +# CONFIG_MTK_FIRST_IF_MT7981 is not set +CONFIG_MTK_SECOND_IF_NONE=y +# CONFIG_MTK_SECOND_IF_MT7615E is not set +# CONFIG_MTK_SECOND_IF_AXE is not set +# CONFIG_MTK_SECOND_IF_MT7915 is not set +# CONFIG_MTK_SECOND_IF_MT7916 is not set +CONFIG_MTK_THIRD_IF_NONE=y +# CONFIG_MTK_THIRD_IF_MT7615E is not set +# CONFIG_MTK_THIRD_IF_MT7915 is not set +# CONFIG_MTK_THIRD_IF_MT7916 is not set +CONFIG_MTK_RT_FIRST_IF_RF_OFFSET=0xc0000 +CONFIG_MTK_MT_WIFI=m +CONFIG_MTK_MT_WIFI_PATH="mt_wifi" + +# +# WiFi Generic Feature Options +# +CONFIG_MTK_FIRST_IF_EEPROM_FLASH=y +# CONFIG_MTK_FIRST_IF_EEPROM_PROM is not set +# CONFIG_MTK_FIRST_IF_EEPROM_EFUSE is not set +CONFIG_MTK_RT_FIRST_CARD_EEPROM="flash" +CONFIG_MTK_WIFI_BASIC_FUNC=y +CONFIG_MTK_DOT11_N_SUPPORT=y +CONFIG_MTK_DOT11_VHT_AC=y +CONFIG_MTK_DOT11_HE_AX=y +CONFIG_MTK_CFG_SUPPORT_FALCON_MURU=y +CONFIG_MTK_CFG_SUPPORT_FALCON_TXCMD_DBG=y +CONFIG_MTK_CFG_SUPPORT_FALCON_SR=y +CONFIG_MTK_CFG_SUPPORT_FALCON_PP=y +CONFIG_MTK_WIFI_TWT_SUPPORT=y +CONFIG_MTK_G_BAND_256QAM_SUPPORT=y +# CONFIG_MTK_BRCM_256QAM_SUPPORT is not set +# CONFIG_MTK_VHT_TXBF_2G_EPIGRAM_IE_SUPPORT is not set +CONFIG_MTK_TPC_SUPPORT=y +CONFIG_MTK_ICAP_SUPPORT=y +CONFIG_MTK_SPECTRUM_SUPPORT=y +CONFIG_MTK_PHY_ICS_SUPPORT=y +CONFIG_MTK_BACKGROUND_SCAN_SUPPORT=y +CONFIG_MTK_SMART_CARRIER_SENSE_SUPPORT=y +# CONFIG_MTK_THERMAL_PROTECT_SUPPORT is not set +CONFIG_MTK_SCS_FW_OFFLOAD=y +CONFIG_MTK_MT_DFS_SUPPORT=y +CONFIG_MTK_OFFCHANNEL_SCAN_FEATURE=y +CONFIG_MTK_HDR_TRANS_TX_SUPPORT=y +CONFIG_MTK_HDR_TRANS_RX_SUPPORT=y +CONFIG_MTK_DBDC_MODE=y +CONFIG_MTK_MULTI_PROFILE_SUPPORT=y +# CONFIG_MTK_DEFAULT_5G_PROFILE is not set +CONFIG_MTK_WSC_INCLUDED=y +CONFIG_MTK_WSC_V2_SUPPORT=y +CONFIG_MTK_DOT11W_PMF_SUPPORT=y +CONFIG_MTK_TXBF_SUPPORT=y +CONFIG_MTK_FAST_NAT_SUPPORT=y +CONFIG_MTK_WHNAT_SUPPORT=m +CONFIG_MTK_WARP_V2=y +# CONFIG_MTK_WIFI_SKB_USES_SLAB is not set +# CONFIG_MTK_FTM_SUPPORT is not set +# CONFIG_MTK_IGMP_SNOOP_SUPPORT is not set +# CONFIG_MTK_MEMORY_SHRINK is not set +CONFIG_MTK_RTMP_FLASH_SUPPORT=y +# CONFIG_MTK_PRE_CAL_TRX_SET1_SUPPORT is not set +# CONFIG_MTK_RLM_CAL_CACHE_SUPPORT is not set +# CONFIG_MTK_PRE_CAL_TRX_SET2_SUPPORT is not set +CONFIG_MTK_CAL_BIN_FILE_SUPPORT=y +# CONFIG_MTK_RF_LOCKDOWN_SUPPORT is not set +# CONFIG_MTK_LINK_TEST_SUPPORT is not set +CONFIG_MTK_ATE_SUPPORT=y +CONFIG_MTK_WLAN_SERVICE=y +# CONFIG_MTK_PASSPOINT_R2 is not set +CONFIG_MTK_MBO_SUPPORT=y +CONFIG_MTK_OCE_SUPPORT=y +CONFIG_MTK_MAP_SUPPORT=y +CONFIG_MTK_MAP_R2_VER_SUPPORT=y +CONFIG_MTK_MAP_R3_VER_SUPPORT=y +# CONFIG_MTK_MAP_R2_6E_SUPPORT is not set +CONFIG_MTK_UAPSD=y +# CONFIG_MTK_TCP_RACK_SUPPORT is not set +CONFIG_MTK_RED_SUPPORT=y +# CONFIG_MTK_CTXD_MEM_CPY_SUPPORT is not set +# CONFIG_MTK_CTXD_SCATTER_AND_GATHER_SUPPORT is not set +# CONFIG_MTK_FDB_SUPPORT is not set +# CONFIG_MTK_FIRST_IF_EPAELNA is not set +CONFIG_MTK_FIRST_IF_IPAILNA=y +# CONFIG_MTK_FIRST_IF_IPAELNA is not set +CONFIG_MTK_WIFI_FW_BIN_LOAD=y +CONFIG_MTK_WIFI_SKU_TYPE="AX6000" +CONFIG_MTK_WIFI_ADIE_TYPE="mt7975" +# CONFIG_MTK_RLT_MAC is not set +# CONFIG_MTK_RTMP_MAC is not set +# end of WiFi Generic Feature Options + +# +# WiFi Operation Modes +# +CONFIG_MTK_WIFI_MODE_AP=m +# CONFIG_MTK_WIFI_MODE_STA is not set +# CONFIG_MTK_WIFI_MODE_BOTH is not set +CONFIG_MTK_MT_AP_SUPPORT=m +CONFIG_MTK_WDS_SUPPORT=y +CONFIG_MTK_MBSS_SUPPORT=y +CONFIG_MTK_APCLI_SUPPORT=y +CONFIG_MTK_APCLI_CERT_SUPPORT=y +CONFIG_MTK_MAC_REPEATER_SUPPORT=y +# CONFIG_MTK_APCLI_CONNECTION_TRIAL is not set +CONFIG_MTK_MWDS=y +# CONFIG_MTK_WIFI_SYSDVT is not set +CONFIG_MTK_MUMIMO_SUPPORT=y +CONFIG_MTK_MU_RA_SUPPORT=y +CONFIG_MTK_DOT11R_FT_SUPPORT=y +CONFIG_MTK_DOT11K_RRM_SUPPORT=y +# CONFIG_MTK_ENTERPRISE_AP_SUPPORT is not set +CONFIG_MTK_MLME_MULTI_QUEUE_SUPPORT=y +CONFIG_MTK_WIFI_EAP_FEATURE=y +CONFIG_MTK_VLAN_SUPPORT=y +# CONFIG_MTK_SNIFFER_SUPPORT is not set +# CONFIG_MTK_HIGHPRI_RATE_SPECIFIC is not set +CONFIG_MTK_SNIFFER_RADIOTAP_SUPPORT=y +# CONFIG_MTK_WF_RESET_SUPPORT is not set +# CONFIG_MTK_TXRX_STAT_SUPPORT is not set +CONFIG_MTK_ANTENNA_CONTROL_SUPPORT=y +CONFIG_MTK_MGMT_TXPWR_CTRL=y +# CONFIG_MTK_TXD_MGMT_TXPWR_CTRL is not set +# CONFIG_MTK_CHUTIL_SUPPORT is not set +# CONFIG_MTK_NF_SUPPORT is not set +CONFIG_MTK_RA_PHY_RATE_SUPPORT=y +CONFIG_MTK_AMPDU_CONF_SUPPORT=y +CONFIG_MTK_ACK_CTS_TIMEOUT_SUPPORT=y +CONFIG_MTK_MBSS_DTIM_SUPPORT=y +# CONFIG_ZERO_LOSS_CSA_SUPPORT is not set +# CONFIG_MTK_CFG80211_SUPPORT is not set +# CONFIG_MTK_DBDC_ONE_BAND_SUPPORT is not set +# CONFIG_MTK_MBSS_AS_WDS_AP_SUPPORT is not set +# CONFIG_MTK_DSCP_QOS_MAP_SUPPORT is not set +CONFIG_MTK_QOS_R1_SUPPORT=y +CONFIG_MTK_DSCP_PRI_SUPPORT=y +# CONFIG_MTK_MIN_PHY_RATE_SUPPORT is not set +# CONFIG_MTK_FAST_UP_RATE_SUPPORT is not set +CONFIG_MTK_CON_WPS_SUPPORT=y +CONFIG_MTK_MCAST_RATE_SPECIFIC=y +CONFIG_MTK_VOW_SUPPORT=y +CONFIG_MTK_BAND_STEERING=y +# CONFIG_MTK_LED_CONTROL_SUPPORT is not set +CONFIG_MTK_WLAN_HOOK=y +# CONFIG_MTK_RADIUS_ACCOUNTING_SUPPORT is not set +# CONFIG_MTK_GREENAP_SUPPORT is not set +# CONFIG_MTK_WIFI_CSI_CN_INFO_SUPPORT is not set +# CONFIG_MTK_VENDOR_FEATURE11_SUPPORT is not set +# CONFIG_MTK_PCIE_ASPM_DYM_CTRL_SUPPORT is not set +# CONFIG_MTK_COEX_SUPPORT is not set +# CONFIG_MTK_EASY_SETUP_SUPPORT is not set +# CONFIG_MTK_EVENT_NOTIFIER_SUPPORT is not set +CONFIG_MTK_AIR_MONITOR=y +CONFIG_MTK_WNM_SUPPORT=y +CONFIG_MTK_INTERWORKING=y +# CONFIG_MTK_LINUX_NET_TXQ_SUPPORT is not set +CONFIG_MTK_WPA3_SUPPORT=y +CONFIG_MTK_OWE_SUPPORT=y +# CONFIG_MTK_SINGLE_SKU is not set +# CONFIG_MTK_PROFILING_SUPPORT is not set +# CONFIG_MTK_6G_SUPPORT is not set +# end of WiFi Operation Modes + +CONFIG_MTK_WIFI_MT_MAC=y +CONFIG_MTK_MT_MAC=y +# CONFIG_MTK_CHIP_MT7603E is not set +# CONFIG_MTK_CHIP_MT7615E is not set +# CONFIG_MTK_CHIP_MT7622 is not set +# CONFIG_MTK_CHIP_MT7663E is not set +# CONFIG_MTK_CHIP_MT7626 is not set +# CONFIG_MTK_CHIP_AXE is not set +# CONFIG_MTK_CHIP_MT7915 is not set +CONFIG_MTK_CHIP_MT7986=y +# CONFIG_MTK_CHIP_MT7916 is not set +# CONFIG_MTK_CHIP_MT7981 is not set +CONFIG_PACKAGE_kmod-warp=y +CONFIG_WARP_VERSION=2 +# CONFIG_WARP_ATC_SUPPORT is not set +CONFIG_WARP_DBG_SUPPORT=y +# CONFIG_WARP_WDMA_RECYCLE_SUPPORT is not set +CONFIG_WED_HW_RRO_SUPPORT=y +CONFIG_WARP_MEMORY_LEAK_DBG=y +CONFIG_WARP_CHIPSET="mt7986" +# CONFIG_WARP_WO_EMBEDDED_LOAD is not set +CONFIG_PACKAGE_wifi-profile=y +CONFIG_first_card=y +CONFIG_first_card_name="MT7981" +# CONFIG_second_card is not set +# CONFIG_third_card is not set +# CONFIG_WIFI_NORMAL_SETTING is not set +CONFIG_WIFI_QUICK_SETTING=y +# end of Drivers +# end of MTK Properties + +# +# Multimedia +# +# CONFIG_PACKAGE_ffmpeg is not set +# CONFIG_PACKAGE_ffprobe is not set +CONFIG_PACKAGE_minidlna=y +# end of Multimedia + +# +# Network +# + +# +# File Transfer +# +CONFIG_PACKAGE_curl=y +# CONFIG_PACKAGE_vsftpd is not set +CONFIG_PACKAGE_vsftpd-tls=y +# end of File Transfer + +# +# Filesystem +# +CONFIG_PACKAGE_nfs-kernel-server=y + +# +# Select nfs-kernel-server configuration options +# +CONFIG_NFS_KERNEL_SERVER_V4=y +# end of Select nfs-kernel-server configuration options + +CONFIG_PACKAGE_nfs-kernel-server-utils=y +# end of Filesystem + +# +# Firewall +# +# CONFIG_PACKAGE_arptables is not set +CONFIG_PACKAGE_conntrack=y +# CONFIG_PACKAGE_conntrackd is not set +# CONFIG_PACKAGE_ebtables is not set +CONFIG_PACKAGE_ip6tables=y +# CONFIG_PACKAGE_ip6tables-extra is not set +# CONFIG_PACKAGE_ip6tables-mod-nat is not set +CONFIG_PACKAGE_iptables=y +# CONFIG_IPTABLES_CONNLABEL is not set +# CONFIG_IPTABLES_NFTABLES is not set +# CONFIG_PACKAGE_iptables-mod-checksum is not set +# CONFIG_PACKAGE_iptables-mod-cluster is not set +# CONFIG_PACKAGE_iptables-mod-clusterip is not set +CONFIG_PACKAGE_iptables-mod-conntrack-extra=y +CONFIG_PACKAGE_iptables-mod-filter=y +CONFIG_PACKAGE_iptables-mod-fullconenat=y +# CONFIG_PACKAGE_iptables-mod-hashlimit is not set +CONFIG_PACKAGE_iptables-mod-ipopt=y +CONFIG_PACKAGE_iptables-mod-iprange=y +# CONFIG_PACKAGE_iptables-mod-ipsec is not set +# CONFIG_PACKAGE_iptables-mod-led is not set +# CONFIG_PACKAGE_iptables-mod-nat-extra is not set +# CONFIG_PACKAGE_iptables-mod-nflog is not set +# CONFIG_PACKAGE_iptables-mod-nfqueue is not set +# CONFIG_PACKAGE_iptables-mod-physdev is not set +# CONFIG_PACKAGE_iptables-mod-rpfilter is not set +# CONFIG_PACKAGE_iptables-mod-tee is not set +# CONFIG_PACKAGE_iptables-mod-trace is not set +# CONFIG_PACKAGE_iptables-mod-u32 is not set +# CONFIG_PACKAGE_iptables-mod-ulog is not set +# CONFIG_PACKAGE_miniupnpc is not set +CONFIG_PACKAGE_miniupnpd=y +# CONFIG_MINIUPNPD_IGDv2 is not set +# CONFIG_PACKAGE_natpmpc is not set +# CONFIG_PACKAGE_nftables-json is not set +# CONFIG_PACKAGE_nftables-nojson is not set +# end of Firewall + +# +# IP Addresses and Names +# +# CONFIG_PACKAGE_bind-check is not set +# CONFIG_PACKAGE_bind-client is not set +# CONFIG_PACKAGE_bind-dig is not set +# CONFIG_PACKAGE_bind-dnssec is not set +# CONFIG_PACKAGE_bind-host is not set +# CONFIG_PACKAGE_bind-nslookup is not set +# CONFIG_PACKAGE_bind-rndc is not set +# CONFIG_PACKAGE_bind-server is not set +# CONFIG_PACKAGE_bind-tools is not set +CONFIG_PACKAGE_chinadns-ng=y +CONFIG_PACKAGE_ddns-scripts=y +# CONFIG_PACKAGE_ddns-scripts-cloudflare is not set +# CONFIG_PACKAGE_ddns-scripts-cnkuai is not set +# CONFIG_PACKAGE_ddns-scripts-digitalocean is not set +# CONFIG_PACKAGE_ddns-scripts-freedns is not set +# CONFIG_PACKAGE_ddns-scripts-gandi is not set +# CONFIG_PACKAGE_ddns-scripts-godaddy is not set +# CONFIG_PACKAGE_ddns-scripts-noip is not set +# CONFIG_PACKAGE_ddns-scripts-nsupdate is not set +# CONFIG_PACKAGE_ddns-scripts-route53 is not set +CONFIG_PACKAGE_ddns-scripts-services=y +CONFIG_PACKAGE_dns2socks=y +CONFIG_PACKAGE_dns2tcp=y +# CONFIG_PACKAGE_dnscrypt-proxy is not set +# CONFIG_PACKAGE_dnscrypt-proxy-resolvers is not set +# CONFIG_PACKAGE_drill is not set +# CONFIG_PACKAGE_hostip is not set +# CONFIG_PACKAGE_idn2 is not set +# CONFIG_PACKAGE_ldns-examples is not set +# CONFIG_PACKAGE_mdns-utils is not set +# CONFIG_PACKAGE_mdnsd is not set +# CONFIG_PACKAGE_mdnsresponder is not set +CONFIG_PACKAGE_stubby=y +# CONFIG_PACKAGE_unbound-anchor is not set +# CONFIG_PACKAGE_unbound-checkconf is not set +# CONFIG_PACKAGE_unbound-control is not set +# CONFIG_PACKAGE_unbound-control-setup is not set +# CONFIG_PACKAGE_unbound-daemon is not set +# CONFIG_PACKAGE_unbound-host is not set +# CONFIG_PACKAGE_v2ray-geoip is not set +# CONFIG_PACKAGE_v2ray-geosite is not set +# end of IP Addresses and Names + +# +# Linux ATM tools +# +# CONFIG_PACKAGE_atm-aread is not set +# CONFIG_PACKAGE_atm-atmaddr is not set +# CONFIG_PACKAGE_atm-atmdiag is not set +# CONFIG_PACKAGE_atm-atmdump is not set +# CONFIG_PACKAGE_atm-atmloop is not set +# CONFIG_PACKAGE_atm-atmsigd is not set +# CONFIG_PACKAGE_atm-atmswitch is not set +# CONFIG_PACKAGE_atm-atmtcp is not set +# CONFIG_PACKAGE_atm-awrite is not set +# CONFIG_PACKAGE_atm-bus is not set +# CONFIG_PACKAGE_atm-debug-tools is not set +# CONFIG_PACKAGE_atm-diagnostics is not set +# CONFIG_PACKAGE_atm-esi is not set +# CONFIG_PACKAGE_atm-ilmid is not set +# CONFIG_PACKAGE_atm-ilmidiag is not set +# CONFIG_PACKAGE_atm-lecs is not set +# CONFIG_PACKAGE_atm-les is not set +# CONFIG_PACKAGE_atm-mpcd is not set +# CONFIG_PACKAGE_atm-saaldump is not set +# CONFIG_PACKAGE_atm-sonetdiag is not set +# CONFIG_PACKAGE_atm-svc_recv is not set +# CONFIG_PACKAGE_atm-svc_send is not set +# CONFIG_PACKAGE_atm-tools is not set +# CONFIG_PACKAGE_atm-ttcp_atm is not set +# CONFIG_PACKAGE_atm-zeppelin is not set +# CONFIG_PACKAGE_br2684ctl is not set +# end of Linux ATM tools + +# +# OpenLDAP +# +# CONFIG_PACKAGE_libopenldap is not set +CONFIG_OPENLDAP_DEBUG=y +# CONFIG_OPENLDAP_CRYPT is not set +# CONFIG_OPENLDAP_MONITOR is not set +# CONFIG_OPENLDAP_DB47 is not set +# CONFIG_OPENLDAP_ICU is not set +# CONFIG_PACKAGE_openldap-server is not set +# CONFIG_PACKAGE_openldap-utils is not set +# end of OpenLDAP + +# +# Routing and Redirection +# +# CONFIG_PACKAGE_devlink is not set +# CONFIG_PACKAGE_genl is not set +# CONFIG_PACKAGE_igmpproxy is not set +# CONFIG_PACKAGE_ip-bridge is not set +CONFIG_PACKAGE_ip-full=y +# CONFIG_PACKAGE_ip-tiny is not set +# CONFIG_PACKAGE_lldpd is not set +CONFIG_PACKAGE_mwan3=y +# CONFIG_PACKAGE_nstat is not set +# CONFIG_PACKAGE_rdma is not set +CONFIG_PACKAGE_relayd=y +# CONFIG_PACKAGE_ss is not set +# CONFIG_PACKAGE_tc-full is not set +CONFIG_PACKAGE_tc-mod-iptables=y +CONFIG_PACKAGE_tc-tiny=y +# end of Routing and Redirection + +# +# THC-IPv6 attack and analyzing toolkit +# +# CONFIG_PACKAGE_thc-ipv6-address6 is not set +# CONFIG_PACKAGE_thc-ipv6-alive6 is not set +# CONFIG_PACKAGE_thc-ipv6-covert-send6 is not set +# CONFIG_PACKAGE_thc-ipv6-covert-send6d is not set +# CONFIG_PACKAGE_thc-ipv6-denial6 is not set +# CONFIG_PACKAGE_thc-ipv6-detect-new-ip6 is not set +# CONFIG_PACKAGE_thc-ipv6-detect-sniffer6 is not set +# CONFIG_PACKAGE_thc-ipv6-dnsdict6 is not set +# CONFIG_PACKAGE_thc-ipv6-dnsrevenum6 is not set +# CONFIG_PACKAGE_thc-ipv6-dos-new-ip6 is not set +# CONFIG_PACKAGE_thc-ipv6-dump-router6 is not set +# CONFIG_PACKAGE_thc-ipv6-exploit6 is not set +# CONFIG_PACKAGE_thc-ipv6-fake-advertise6 is not set +# CONFIG_PACKAGE_thc-ipv6-fake-dhcps6 is not set +# CONFIG_PACKAGE_thc-ipv6-fake-dns6d is not set +# CONFIG_PACKAGE_thc-ipv6-fake-dnsupdate6 is not set +# CONFIG_PACKAGE_thc-ipv6-fake-mipv6 is not set +# CONFIG_PACKAGE_thc-ipv6-fake-mld26 is not set +# CONFIG_PACKAGE_thc-ipv6-fake-mld6 is not set +# CONFIG_PACKAGE_thc-ipv6-fake-mldrouter6 is not set +# CONFIG_PACKAGE_thc-ipv6-fake-router26 is not set +# CONFIG_PACKAGE_thc-ipv6-fake-router6 is not set +# CONFIG_PACKAGE_thc-ipv6-fake-solicitate6 is not set +# CONFIG_PACKAGE_thc-ipv6-flood-advertise6 is not set +# CONFIG_PACKAGE_thc-ipv6-flood-dhcpc6 is not set +# CONFIG_PACKAGE_thc-ipv6-flood-mld26 is not set +# CONFIG_PACKAGE_thc-ipv6-flood-mld6 is not set +# CONFIG_PACKAGE_thc-ipv6-flood-mldrouter6 is not set +# CONFIG_PACKAGE_thc-ipv6-flood-router26 is not set +# CONFIG_PACKAGE_thc-ipv6-flood-router6 is not set +# CONFIG_PACKAGE_thc-ipv6-flood-solicitate6 is not set +# CONFIG_PACKAGE_thc-ipv6-fragmentation6 is not set +# CONFIG_PACKAGE_thc-ipv6-fuzz-dhcpc6 is not set +# CONFIG_PACKAGE_thc-ipv6-fuzz-dhcps6 is not set +# CONFIG_PACKAGE_thc-ipv6-fuzz-ip6 is not set +# CONFIG_PACKAGE_thc-ipv6-implementation6 is not set +# CONFIG_PACKAGE_thc-ipv6-implementation6d is not set +# CONFIG_PACKAGE_thc-ipv6-inverse-lookup6 is not set +# CONFIG_PACKAGE_thc-ipv6-kill-router6 is not set +# CONFIG_PACKAGE_thc-ipv6-ndpexhaust6 is not set +# CONFIG_PACKAGE_thc-ipv6-node-query6 is not set +# CONFIG_PACKAGE_thc-ipv6-parasite6 is not set +# CONFIG_PACKAGE_thc-ipv6-passive-discovery6 is not set +# CONFIG_PACKAGE_thc-ipv6-randicmp6 is not set +# CONFIG_PACKAGE_thc-ipv6-redir6 is not set +# CONFIG_PACKAGE_thc-ipv6-rsmurf6 is not set +# CONFIG_PACKAGE_thc-ipv6-sendpees6 is not set +# CONFIG_PACKAGE_thc-ipv6-sendpeesmp6 is not set +# CONFIG_PACKAGE_thc-ipv6-smurf6 is not set +# CONFIG_PACKAGE_thc-ipv6-thcping6 is not set +# CONFIG_PACKAGE_thc-ipv6-toobig6 is not set +# CONFIG_PACKAGE_thc-ipv6-trace6 is not set +# end of THC-IPv6 attack and analyzing toolkit + +# +# VPN +# +# CONFIG_PACKAGE_openvpn-mbedtls is not set +CONFIG_PACKAGE_openvpn-openssl=y +CONFIG_OPENVPN_openssl_ENABLE_LZO=y +CONFIG_OPENVPN_openssl_ENABLE_LZ4=y +# CONFIG_OPENVPN_openssl_ENABLE_X509_ALT_USERNAME is not set +# CONFIG_OPENVPN_openssl_ENABLE_MANAGEMENT is not set +CONFIG_OPENVPN_openssl_ENABLE_FRAGMENT=y +CONFIG_OPENVPN_openssl_ENABLE_MULTIHOME=y +CONFIG_OPENVPN_openssl_ENABLE_PORT_SHARE=y +CONFIG_OPENVPN_openssl_ENABLE_DEF_AUTH=y +CONFIG_OPENVPN_openssl_ENABLE_PF=y +# CONFIG_OPENVPN_openssl_ENABLE_IPROUTE2 is not set +CONFIG_OPENVPN_openssl_ENABLE_SMALL=y +CONFIG_PACKAGE_tailscale=y +CONFIG_PACKAGE_tailscaled=y +CONFIG_PACKAGE_wireguard-tools=y +CONFIG_PACKAGE_zerotier=y + +# +# Configuration +# +# CONFIG_ZEROTIER_ENABLE_DEBUG is not set +# CONFIG_ZEROTIER_ENABLE_SELFTEST is not set +# end of Configuration +# end of VPN + +# +# WWAN +# +# CONFIG_PACKAGE_adb-enablemodem is not set +CONFIG_PACKAGE_comgt=y +# CONFIG_PACKAGE_comgt-directip is not set +CONFIG_PACKAGE_comgt-ncm=y +# CONFIG_PACKAGE_umbim is not set +CONFIG_PACKAGE_uqmi=y +# end of WWAN + +# +# Web Servers/Proxies +# +CONFIG_PACKAGE_cgi-io=y +# CONFIG_PACKAGE_kcptun-client is not set +# CONFIG_PACKAGE_kcptun-server is not set +CONFIG_PACKAGE_microsocks=y +# CONFIG_PACKAGE_naiveproxy is not set +# CONFIG_PACKAGE_nginx is not set +# CONFIG_NGINX_DAV is not set +CONFIG_NGINX_UBUS=y +# CONFIG_NGINX_FLV is not set +# CONFIG_NGINX_STUB_STATUS is not set +# CONFIG_NGINX_HTTP_CHARSET is not set +# CONFIG_NGINX_HTTP_GZIP is not set +# CONFIG_NGINX_HTTP_SSI is not set +# CONFIG_NGINX_HTTP_USERID is not set +# CONFIG_NGINX_HTTP_ACCESS is not set +# CONFIG_NGINX_HTTP_AUTH_BASIC is not set +# CONFIG_NGINX_HTTP_AUTH_REQUEST is not set +# CONFIG_NGINX_HTTP_AUTOINDEX is not set +# CONFIG_NGINX_HTTP_GEO is not set +# CONFIG_NGINX_HTTP_MAP is not set +# CONFIG_NGINX_HTTP_SPLIT_CLIENTS is not set +# CONFIG_NGINX_HTTP_REFERER is not set +CONFIG_NGINX_HTTP_REWRITE=y +CONFIG_NGINX_HTTP_PROXY=y +CONFIG_NGINX_HTTP_FASTCGI=y +CONFIG_NGINX_HTTP_UWSGI=y +# CONFIG_NGINX_HTTP_SCGI is not set +# CONFIG_NGINX_HTTP_MEMCACHED is not set +# CONFIG_NGINX_HTTP_LIMIT_CONN is not set +# CONFIG_NGINX_HTTP_LIMIT_REQ is not set +# CONFIG_NGINX_HTTP_EMPTY_GIF is not set +# CONFIG_NGINX_HTTP_BROWSER is not set +# CONFIG_NGINX_HTTP_UPSTREAM_HASH is not set +# CONFIG_NGINX_HTTP_UPSTREAM_IP_HASH is not set +# CONFIG_NGINX_HTTP_UPSTREAM_LEAST_CONN is not set +# CONFIG_NGINX_HTTP_UPSTREAM_KEEPALIVE is not set +# CONFIG_NGINX_HTTP_CACHE is not set +# CONFIG_NGINX_HTTP_V2 is not set +CONFIG_NGINX_PCRE=y +# CONFIG_NGINX_NAXSI is not set +CONFIG_NGINX_LUA=y +# CONFIG_NGINX_HTTP_REAL_IP is not set +# CONFIG_NGINX_HTTP_SECURE_LINK is not set +# CONFIG_NGINX_HTTP_SUB is not set +# CONFIG_NGINX_HEADERS_MORE is not set +# CONFIG_NGINX_HTTP_BROTLI is not set +# CONFIG_NGINX_STREAM_CORE_MODULE is not set +# CONFIG_NGINX_RTMP_MODULE is not set +# CONFIG_NGINX_TS_MODULE is not set +# CONFIG_PACKAGE_nginx-all-module is not set +# CONFIG_PACKAGE_nginx-mod-luci is not set +# CONFIG_PACKAGE_nginx-mod-luci-ssl is not set +CONFIG_PACKAGE_nginx-ssl=y + +# +# Configuration +# +# end of Configuration + +# CONFIG_PACKAGE_redsocks2 is not set +CONFIG_PACKAGE_shadowsocks-libev-config=y +CONFIG_PACKAGE_shadowsocks-libev-ss-local=y +CONFIG_PACKAGE_shadowsocks-libev-ss-redir=y +# CONFIG_PACKAGE_shadowsocks-libev-ss-rules is not set +CONFIG_PACKAGE_shadowsocks-libev-ss-server=y +# CONFIG_PACKAGE_shadowsocks-libev-ss-tunnel is not set +CONFIG_PACKAGE_shadowsocks-rust-sslocal=y +# CONFIG_PACKAGE_shadowsocks-rust-ssmanager is not set +CONFIG_PACKAGE_shadowsocks-rust-ssserver=y +# CONFIG_PACKAGE_shadowsocks-rust-ssservice is not set +# CONFIG_PACKAGE_shadowsocks-rust-ssurl is not set +CONFIG_PACKAGE_shadowsocksr-libev-ssr-check=y +CONFIG_PACKAGE_shadowsocksr-libev-ssr-local=y +# CONFIG_PACKAGE_shadowsocksr-libev-ssr-nat is not set +CONFIG_PACKAGE_shadowsocksr-libev-ssr-redir=y +CONFIG_PACKAGE_shadowsocksr-libev-ssr-server=y +# CONFIG_PACKAGE_sockd is not set +# CONFIG_PACKAGE_socksify is not set +# CONFIG_PACKAGE_trojan is not set +# CONFIG_PACKAGE_tuic-client is not set +CONFIG_PACKAGE_uhttpd=y +# CONFIG_PACKAGE_uhttpd-mod-lua is not set +CONFIG_PACKAGE_uhttpd-mod-ubus=y +# CONFIG_PACKAGE_uwsgi is not set +# CONFIG_PACKAGE_v2ray-plugin is not set +# CONFIG_PACKAGE_v2raya is not set +# CONFIG_PACKAGE_xray-plugin is not set +# end of Web Servers/Proxies + +# +# Wireless +# +# CONFIG_PACKAGE_mtkiappd is not set +# end of Wireless + +# +# WirelessAPD +# +# CONFIG_PACKAGE_eapol-test is not set +# CONFIG_PACKAGE_eapol-test-openssl is not set +# CONFIG_PACKAGE_eapol-test-wolfssl is not set +# CONFIG_PACKAGE_hostapd is not set +# CONFIG_PACKAGE_hostapd-basic is not set +# CONFIG_PACKAGE_hostapd-basic-openssl is not set +# CONFIG_PACKAGE_hostapd-basic-wolfssl is not set +CONFIG_PACKAGE_hostapd-common=y +# CONFIG_PACKAGE_hostapd-mini is not set +# CONFIG_PACKAGE_hostapd-openssl is not set +# CONFIG_PACKAGE_hostapd-utils is not set +# CONFIG_PACKAGE_hostapd-wolfssl is not set +# CONFIG_PACKAGE_wpa-cli is not set +# CONFIG_PACKAGE_wpa-supplicant is not set +# CONFIG_WPA_RFKILL_SUPPORT is not set +CONFIG_WPA_MSG_MIN_PRIORITY=3 +# CONFIG_WPA_WOLFSSL is not set +# CONFIG_DRIVER_WEXT_SUPPORT is not set +# CONFIG_DRIVER_11N_SUPPORT is not set +# CONFIG_DRIVER_11AC_SUPPORT is not set +# CONFIG_DRIVER_11AX_SUPPORT is not set +# CONFIG_WPA_ENABLE_WEP is not set +# CONFIG_PACKAGE_wpa-supplicant-basic is not set +# CONFIG_PACKAGE_wpa-supplicant-mini is not set +# CONFIG_PACKAGE_wpa-supplicant-openssl is not set +# CONFIG_PACKAGE_wpa-supplicant-wolfssl is not set +# CONFIG_PACKAGE_wpad is not set +# CONFIG_PACKAGE_wpad-basic is not set +# CONFIG_PACKAGE_wpad-basic-openssl is not set +# CONFIG_PACKAGE_wpad-basic-wolfssl is not set +# CONFIG_PACKAGE_wpad-mini is not set +CONFIG_PACKAGE_wpad-openssl=y +# CONFIG_PACKAGE_wpad-wolfssl is not set +# end of WirelessAPD + +# +# arp-scan +# +CONFIG_PACKAGE_arp-scan=y +# CONFIG_PACKAGE_arp-scan-database is not set +# end of arp-scan + +# CONFIG_PACKAGE_464xlat is not set +# CONFIG_PACKAGE_6in4 is not set +# CONFIG_PACKAGE_6rd is not set +# CONFIG_PACKAGE_6to4 is not set +# CONFIG_PACKAGE_bpftool-full is not set +# CONFIG_PACKAGE_bpftool-minimal is not set +CONFIG_PACKAGE_chat=y +CONFIG_PACKAGE_dhcpdiscover=y +CONFIG_PACKAGE_dnscrypt-proxy2=y +# CONFIG_PACKAGE_ds-lite is not set +CONFIG_PACKAGE_ethtool=y +# CONFIG_ETHTOOL_PRETTY_DUMP is not set +# CONFIG_PACKAGE_gre is not set +CONFIG_PACKAGE_httping=y +# CONFIG_PACKAGE_httping-nossl is not set +# CONFIG_PACKAGE_hysteria is not set +# CONFIG_PACKAGE_ipip is not set +CONFIG_PACKAGE_ipset=y +# CONFIG_PACKAGE_ipset-dns is not set +CONFIG_PACKAGE_ipt2socks=y +# CONFIG_PACKAGE_iw is not set +# CONFIG_PACKAGE_iw-full is not set +CONFIG_PACKAGE_libipset=y +# CONFIG_PACKAGE_map is not set +# CONFIG_PACKAGE_mosquitto-client-nossl is not set +# CONFIG_PACKAGE_mosquitto-client-ssl is not set +# CONFIG_PACKAGE_mosquitto-nossl is not set +# CONFIG_PACKAGE_mosquitto-ssl is not set +CONFIG_PACKAGE_mtkhnat_util=y +CONFIG_PACKAGE_odhcp6c=y +CONFIG_PACKAGE_odhcp6c_ext_cer_id=0 +# CONFIG_PACKAGE_odhcpd is not set +CONFIG_PACKAGE_odhcpd-ipv6only=y + +# +# Configuration +# +CONFIG_PACKAGE_odhcpd_ipv6only_ext_cer_id=0 +# end of Configuration + +# CONFIG_PACKAGE_omcproxy is not set +CONFIG_PACKAGE_ppp=y +# CONFIG_PACKAGE_ppp-mod-passwordfd is not set +# CONFIG_PACKAGE_ppp-mod-pppoa is not set +CONFIG_PACKAGE_ppp-mod-pppoe=y +# CONFIG_PACKAGE_ppp-mod-pppol2tp is not set +# CONFIG_PACKAGE_ppp-mod-pptp is not set +# CONFIG_PACKAGE_ppp-mod-radius is not set +# CONFIG_PACKAGE_ppp-multilink is not set +# CONFIG_PACKAGE_pppdump is not set +# CONFIG_PACKAGE_pppoe-discovery is not set +# CONFIG_PACKAGE_pppstats is not set +# CONFIG_PACKAGE_rpcapd is not set +CONFIG_PACKAGE_rpcbind=y +CONFIG_RPCBIND_LIBWRAP=y +CONFIG_RPCBIND_RMTCALLS=y +# CONFIG_PACKAGE_rssileds is not set +CONFIG_PACKAGE_simple-obfs-client=y +# CONFIG_PACKAGE_simple-obfs-server is not set +# CONFIG_PACKAGE_snmp-mibs is not set +# CONFIG_PACKAGE_snmp-utils is not set +# CONFIG_PACKAGE_snmpd is not set +# CONFIG_PACKAGE_snmptrapd is not set +# CONFIG_PACKAGE_soloscli is not set +# CONFIG_PACKAGE_tcpdump is not set +# CONFIG_PACKAGE_tcpdump-mini is not set +CONFIG_PACKAGE_tcping=y +CONFIG_PACKAGE_tor=y +# CONFIG_PACKAGE_tor-gencert is not set +CONFIG_PACKAGE_tor-geoip=y +# CONFIG_PACKAGE_tor-resolve is not set +# CONFIG_PACKAGE_totd is not set +CONFIG_PACKAGE_uclient-fetch=y +# CONFIG_PACKAGE_umdns is not set +CONFIG_PACKAGE_v2ray-core=y +# CONFIG_PACKAGE_v2ray-extra is not set +# CONFIG_PACKAGE_vti is not set +# CONFIG_PACKAGE_vxlan is not set +# CONFIG_PACKAGE_wpan-tools is not set +CONFIG_PACKAGE_wwan=y +# CONFIG_PACKAGE_xray-core is not set +# end of Network + +# +# Sound +# +# CONFIG_PACKAGE_aserver is not set +# CONFIG_PACKAGE_fdk-aac is not set +# CONFIG_PACKAGE_lame is not set +# CONFIG_PACKAGE_lame-lib is not set +# CONFIG_PACKAGE_shine is not set +# end of Sound + +# +# Utilities +# + +# +# Boot Loaders +# +# CONFIG_PACKAGE_fconfig is not set +CONFIG_PACKAGE_uboot-envtools=y +# end of Boot Loaders + +# +# Compression +# +# CONFIG_PACKAGE_bzip2 is not set +CONFIG_PACKAGE_unzip=y +# CONFIG_PACKAGE_xz-utils is not set +# CONFIG_PACKAGE_zstd is not set +# end of Compression + +# +# Database +# +# CONFIG_PACKAGE_sqlite3-cli is not set +# end of Database + +# +# Disc +# +# CONFIG_PACKAGE_blkdiscard is not set +CONFIG_PACKAGE_blkid=y +# CONFIG_PACKAGE_blockdev is not set +# CONFIG_PACKAGE_cfdisk is not set +# CONFIG_PACKAGE_eject is not set +# CONFIG_PACKAGE_fdisk is not set +# CONFIG_PACKAGE_findfs is not set +# CONFIG_PACKAGE_lsblk is not set +# CONFIG_PACKAGE_lvm2 is not set +# CONFIG_PACKAGE_lvm2-selinux is not set +# CONFIG_PACKAGE_mdadm is not set +# CONFIG_PACKAGE_partx-utils is not set +# CONFIG_PACKAGE_sfdisk is not set +# CONFIG_PACKAGE_wipefs is not set +# end of Disc + +# +# Encryption +# +# CONFIG_PACKAGE_certtool is not set +# CONFIG_PACKAGE_gnutls-utils is not set +# CONFIG_PACKAGE_keyctl is not set +# CONFIG_PACKAGE_keyutils is not set +# CONFIG_PACKAGE_px5g-mbedtls is not set +# CONFIG_PACKAGE_px5g-standalone is not set +# CONFIG_PACKAGE_px5g-wolfssl is not set +# end of Encryption + +# +# Filesystem +# +# CONFIG_PACKAGE_acl is not set +# CONFIG_PACKAGE_attr is not set +# CONFIG_PACKAGE_badblocks is not set +# CONFIG_PACKAGE_chattr is not set +# CONFIG_PACKAGE_debugfs is not set +CONFIG_PACKAGE_dosfstools=y +# CONFIG_PACKAGE_dumpe2fs is not set +# CONFIG_PACKAGE_e2freefrag is not set +CONFIG_PACKAGE_e2fsprogs=y +# CONFIG_PACKAGE_e4crypt is not set +# CONFIG_PACKAGE_f2fs-tools is not set +# CONFIG_PACKAGE_f2fs-tools-selinux is not set +# CONFIG_PACKAGE_f2fsck is not set +# CONFIG_PACKAGE_f2fsck-selinux is not set +# CONFIG_PACKAGE_filefrag is not set +# CONFIG_PACKAGE_fstrim is not set +# CONFIG_PACKAGE_fuse-utils is not set +# CONFIG_PACKAGE_lsattr is not set +# CONFIG_PACKAGE_mkf2fs is not set +# CONFIG_PACKAGE_mkf2fs-selinux is not set +# CONFIG_PACKAGE_nfs-utils is not set +CONFIG_PACKAGE_nfs-utils-libs=y +CONFIG_PACKAGE_ntfs-3g=y +# CONFIG_PACKAGE_NTFS-3G_USE_LIBFUSE is not set +CONFIG_PACKAGE_NTFS-3G_HAS_PROBE=y +# CONFIG_PACKAGE_ntfs-3g-low is not set +CONFIG_PACKAGE_ntfs-3g-utils=y +# CONFIG_PACKAGE_resize2fs is not set +# CONFIG_PACKAGE_swap-utils is not set +# CONFIG_PACKAGE_sysfsutils is not set +# CONFIG_PACKAGE_tune2fs is not set +# end of Filesystem + +# +# Image Manipulation +# +# CONFIG_PACKAGE_libjpeg-turbo-utils is not set +# end of Image Manipulation + +# +# Shells +# +CONFIG_PACKAGE_bash=y +# end of Shells + +# +# Terminal +# +# CONFIG_PACKAGE_agetty is not set +# CONFIG_PACKAGE_rtty-mbedtls is not set +# CONFIG_PACKAGE_rtty-nossl is not set +CONFIG_PACKAGE_rtty-openssl=y +# CONFIG_PACKAGE_rtty-wolfssl is not set +# CONFIG_PACKAGE_script-utils is not set +# CONFIG_PACKAGE_setterm is not set +# CONFIG_PACKAGE_wall is not set +# end of Terminal + +# +# libimobiledevice +# +# CONFIG_PACKAGE_libimobiledevice-utils is not set +# CONFIG_PACKAGE_libusbmuxd-utils is not set +# CONFIG_PACKAGE_plistutil is not set +CONFIG_PACKAGE_usbmuxd=y +# end of libimobiledevice + +# +# libselinux tools +# +# CONFIG_PACKAGE_libselinux-avcstat is not set +# CONFIG_PACKAGE_libselinux-compute_av is not set +# CONFIG_PACKAGE_libselinux-compute_create is not set +# CONFIG_PACKAGE_libselinux-compute_member is not set +# CONFIG_PACKAGE_libselinux-compute_relabel is not set +# CONFIG_PACKAGE_libselinux-getconlist is not set +# CONFIG_PACKAGE_libselinux-getdefaultcon is not set +# CONFIG_PACKAGE_libselinux-getenforce is not set +# CONFIG_PACKAGE_libselinux-getfilecon is not set +# CONFIG_PACKAGE_libselinux-getpidcon is not set +# CONFIG_PACKAGE_libselinux-getsebool is not set +# CONFIG_PACKAGE_libselinux-getseuser is not set +# CONFIG_PACKAGE_libselinux-matchpathcon is not set +# CONFIG_PACKAGE_libselinux-policyvers is not set +# CONFIG_PACKAGE_libselinux-sefcontext_compile is not set +# CONFIG_PACKAGE_libselinux-selabel_digest is not set +# CONFIG_PACKAGE_libselinux-selabel_get_digests_all_partial_matches is not set +# CONFIG_PACKAGE_libselinux-selabel_lookup is not set +# CONFIG_PACKAGE_libselinux-selabel_lookup_best_match is not set +# CONFIG_PACKAGE_libselinux-selabel_partial_match is not set +# CONFIG_PACKAGE_libselinux-selinux_check_access is not set +# CONFIG_PACKAGE_libselinux-selinux_check_securetty_context is not set +# CONFIG_PACKAGE_libselinux-selinuxenabled is not set +# CONFIG_PACKAGE_libselinux-selinuxexeccon is not set +# CONFIG_PACKAGE_libselinux-setenforce is not set +# CONFIG_PACKAGE_libselinux-setfilecon is not set +# CONFIG_PACKAGE_libselinux-togglesebool is not set +# CONFIG_PACKAGE_libselinux-validatetrans is not set +# end of libselinux tools + +# CONFIG_PACKAGE_adb is not set +# CONFIG_PACKAGE_bluez-daemon is not set +# CONFIG_PACKAGE_bluez-utils is not set +# CONFIG_PACKAGE_bluez-utils-extra is not set +# CONFIG_PACKAGE_bsdiff is not set +# CONFIG_PACKAGE_bspatch is not set +# CONFIG_PACKAGE_cal is not set +# CONFIG_PACKAGE_checkpolicy is not set +# CONFIG_PACKAGE_chkcon is not set +CONFIG_PACKAGE_coreutils=y +# CONFIG_PACKAGE_coreutils-b2sum is not set +# CONFIG_PACKAGE_coreutils-base32 is not set +CONFIG_PACKAGE_coreutils-base64=y +# CONFIG_PACKAGE_coreutils-basename is not set +# CONFIG_PACKAGE_coreutils-basenc is not set +# CONFIG_PACKAGE_coreutils-cat is not set +# CONFIG_PACKAGE_coreutils-chcon is not set +# CONFIG_PACKAGE_coreutils-chgrp is not set +# CONFIG_PACKAGE_coreutils-chmod is not set +# CONFIG_PACKAGE_coreutils-chown is not set +# CONFIG_PACKAGE_coreutils-chroot is not set +# CONFIG_PACKAGE_coreutils-cksum is not set +# CONFIG_PACKAGE_coreutils-comm is not set +# CONFIG_PACKAGE_coreutils-cp is not set +# CONFIG_PACKAGE_coreutils-csplit is not set +# CONFIG_PACKAGE_coreutils-cut is not set +# CONFIG_PACKAGE_coreutils-date is not set +# CONFIG_PACKAGE_coreutils-dd is not set +# CONFIG_PACKAGE_coreutils-df is not set +# CONFIG_PACKAGE_coreutils-dir is not set +# CONFIG_PACKAGE_coreutils-dircolors is not set +# CONFIG_PACKAGE_coreutils-dirname is not set +# CONFIG_PACKAGE_coreutils-du is not set +# CONFIG_PACKAGE_coreutils-echo is not set +# CONFIG_PACKAGE_coreutils-env is not set +# CONFIG_PACKAGE_coreutils-expand is not set +# CONFIG_PACKAGE_coreutils-expr is not set +# CONFIG_PACKAGE_coreutils-factor is not set +# CONFIG_PACKAGE_coreutils-false is not set +# CONFIG_PACKAGE_coreutils-fmt is not set +# CONFIG_PACKAGE_coreutils-fold is not set +# CONFIG_PACKAGE_coreutils-groups is not set +# CONFIG_PACKAGE_coreutils-head is not set +# CONFIG_PACKAGE_coreutils-hostid is not set +# CONFIG_PACKAGE_coreutils-id is not set +# CONFIG_PACKAGE_coreutils-install is not set +# CONFIG_PACKAGE_coreutils-join is not set +# CONFIG_PACKAGE_coreutils-kill is not set +# CONFIG_PACKAGE_coreutils-link is not set +# CONFIG_PACKAGE_coreutils-ln is not set +# CONFIG_PACKAGE_coreutils-logname is not set +# CONFIG_PACKAGE_coreutils-ls is not set +# CONFIG_PACKAGE_coreutils-md5sum is not set +# CONFIG_PACKAGE_coreutils-mkdir is not set +# CONFIG_PACKAGE_coreutils-mkfifo is not set +# CONFIG_PACKAGE_coreutils-mknod is not set +# CONFIG_PACKAGE_coreutils-mktemp is not set +# CONFIG_PACKAGE_coreutils-mv is not set +# CONFIG_PACKAGE_coreutils-nice is not set +# CONFIG_PACKAGE_coreutils-nl is not set +CONFIG_PACKAGE_coreutils-nohup=y +# CONFIG_PACKAGE_coreutils-nproc is not set +# CONFIG_PACKAGE_coreutils-numfmt is not set +# CONFIG_PACKAGE_coreutils-od is not set +# CONFIG_PACKAGE_coreutils-paste is not set +# CONFIG_PACKAGE_coreutils-pathchk is not set +# CONFIG_PACKAGE_coreutils-pinky is not set +# CONFIG_PACKAGE_coreutils-pr is not set +# CONFIG_PACKAGE_coreutils-printenv is not set +# CONFIG_PACKAGE_coreutils-printf is not set +# CONFIG_PACKAGE_coreutils-ptx is not set +# CONFIG_PACKAGE_coreutils-pwd is not set +# CONFIG_PACKAGE_coreutils-readlink is not set +# CONFIG_PACKAGE_coreutils-realpath is not set +# CONFIG_PACKAGE_coreutils-rm is not set +# CONFIG_PACKAGE_coreutils-rmdir is not set +# CONFIG_PACKAGE_coreutils-runcon is not set +# CONFIG_PACKAGE_coreutils-seq is not set +# CONFIG_PACKAGE_coreutils-sha1sum is not set +# CONFIG_PACKAGE_coreutils-sha224sum is not set +# CONFIG_PACKAGE_coreutils-sha256sum is not set +# CONFIG_PACKAGE_coreutils-sha384sum is not set +# CONFIG_PACKAGE_coreutils-sha512sum is not set +# CONFIG_PACKAGE_coreutils-shred is not set +# CONFIG_PACKAGE_coreutils-shuf is not set +# CONFIG_PACKAGE_coreutils-sleep is not set +# CONFIG_PACKAGE_coreutils-sort is not set +# CONFIG_PACKAGE_coreutils-split is not set +# CONFIG_PACKAGE_coreutils-stat is not set +# CONFIG_PACKAGE_coreutils-stdbuf is not set +# CONFIG_PACKAGE_coreutils-stty is not set +# CONFIG_PACKAGE_coreutils-sum is not set +# CONFIG_PACKAGE_coreutils-sync is not set +# CONFIG_PACKAGE_coreutils-tac is not set +# CONFIG_PACKAGE_coreutils-tail is not set +# CONFIG_PACKAGE_coreutils-tee is not set +# CONFIG_PACKAGE_coreutils-test is not set +# CONFIG_PACKAGE_coreutils-timeout is not set +# CONFIG_PACKAGE_coreutils-touch is not set +# CONFIG_PACKAGE_coreutils-tr is not set +# CONFIG_PACKAGE_coreutils-true is not set +# CONFIG_PACKAGE_coreutils-truncate is not set +# CONFIG_PACKAGE_coreutils-tsort is not set +# CONFIG_PACKAGE_coreutils-tty is not set +# CONFIG_PACKAGE_coreutils-uname is not set +# CONFIG_PACKAGE_coreutils-unexpand is not set +# CONFIG_PACKAGE_coreutils-uniq is not set +# CONFIG_PACKAGE_coreutils-unlink is not set +# CONFIG_PACKAGE_coreutils-uptime is not set +# CONFIG_PACKAGE_coreutils-users is not set +# CONFIG_PACKAGE_coreutils-vdir is not set +# CONFIG_PACKAGE_coreutils-wc is not set +# CONFIG_PACKAGE_coreutils-who is not set +# CONFIG_PACKAGE_coreutils-whoami is not set +# CONFIG_PACKAGE_coreutils-yes is not set +# CONFIG_PACKAGE_csstidy is not set +# CONFIG_PACKAGE_ct-bugcheck is not set +# CONFIG_PACKAGE_dbus is not set +# CONFIG_PACKAGE_dbus-utils is not set +# CONFIG_PACKAGE_dmesg is not set +# CONFIG_PACKAGE_dropbearconvert is not set +# CONFIG_PACKAGE_dtc is not set +# CONFIG_PACKAGE_fdt-utils is not set +# CONFIG_PACKAGE_flock is not set +# CONFIG_PACKAGE_fritz-caldata is not set +# CONFIG_PACKAGE_fritz-tffs is not set +# CONFIG_PACKAGE_fritz-tffs-nand is not set +# CONFIG_PACKAGE_getopt is not set +# CONFIG_PACKAGE_giflib-utils is not set +# CONFIG_PACKAGE_hwclock is not set +# CONFIG_PACKAGE_iconv is not set +# CONFIG_PACKAGE_iwcap is not set +CONFIG_PACKAGE_iwinfo=y +CONFIG_PACKAGE_jshn=y +# CONFIG_PACKAGE_kmod is not set +CONFIG_PACKAGE_kvcedit=y +CONFIG_PACKAGE_libjson-script=y +# CONFIG_PACKAGE_libxml2-utils is not set +# CONFIG_PACKAGE_logger is not set +# CONFIG_PACKAGE_look is not set +# CONFIG_PACKAGE_losetup is not set +# CONFIG_PACKAGE_lscpu is not set +# CONFIG_PACKAGE_mbedtls-util is not set +# CONFIG_PACKAGE_mcookie is not set +# CONFIG_PACKAGE_mmc-utils is not set +# CONFIG_PACKAGE_more is not set +# CONFIG_PACKAGE_mount-utils is not set +CONFIG_PACKAGE_mqtt=y +# CONFIG_PACKAGE_namei is not set +# CONFIG_PACKAGE_nand-utils is not set +# CONFIG_PACKAGE_nsenter is not set +CONFIG_PACKAGE_openssl-util=y +# CONFIG_PACKAGE_pciids is not set +# CONFIG_PACKAGE_pciutils is not set +# CONFIG_PACKAGE_policycoreutils is not set +# CONFIG_PACKAGE_prlimit is not set +# CONFIG_PACKAGE_ravpower-mcu is not set +# CONFIG_PACKAGE_rename is not set +# CONFIG_PACKAGE_secilc is not set +CONFIG_PACKAGE_smstools3=y +# CONFIG_PACKAGE_spidev-test is not set +# CONFIG_PACKAGE_strace is not set +CONFIG_STRACE_NONE=y +# CONFIG_STRACE_LIBDW is not set +# CONFIG_STRACE_LIBUNWIND is not set +CONFIG_PACKAGE_ubi-utils=y +# CONFIG_PACKAGE_udns-dnsget is not set +# CONFIG_PACKAGE_udns-ex-rdns is not set +# CONFIG_PACKAGE_udns-rblcheck is not set +# CONFIG_PACKAGE_ugps is not set +# CONFIG_PACKAGE_unshare is not set +CONFIG_PACKAGE_usb-modeswitch=y +# CONFIG_PACKAGE_usbids is not set +# CONFIG_PACKAGE_uuidd is not set +# CONFIG_PACKAGE_uuidgen is not set +# CONFIG_PACKAGE_whereis is not set +# end of Utilities diff --git a/package/connectivity/conninfra/src/Makefile b/package/connectivity/conninfra/src/Makefile deleted file mode 100644 index 1ecdbb0..0000000 --- a/package/connectivity/conninfra/src/Makefile +++ /dev/null @@ -1 +0,0 @@ -obj-m += conninfra.o \ No newline at end of file diff --git a/package/connectivity/conninfra/src/conninfra.o b/package/connectivity/conninfra/src/conninfra.o deleted file mode 100644 index 93ce00f5a2584eb842d53bca24622f8124ccef1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 908096 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%0AQtG;2P{#=xwl^ffqZ9eoYW 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�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

u3=_KHD1Q_p_%jZa2) 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 z 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 CtwM1C diff --git a/package/connectivity/conninfra/Makefile b/package/conninfra/Makefile similarity index 96% rename from package/connectivity/conninfra/Makefile rename to package/conninfra/Makefile index 95c247e..17db624 100644 --- a/package/connectivity/conninfra/Makefile +++ b/package/conninfra/Makefile @@ -5,12 +5,11 @@ # See /LICENSE for more information. # - include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=conninfra -PKG_VERSION:= +PKG_VERSION:=bbf588 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME) PKG_MAINTAINER:=Kun-Ze Syue @@ -22,6 +21,8 @@ PKG_KCONFIG:= \ FPGA_EARLY_PORTING \ CONNINFRA_AUTO_UP +PKG_CONFIG_DEPENDS:=$(foreach c, $(PKG_KCONFIG),$(if $(CONFIG_$c),CONFIG_$(c))) + include $(INCLUDE_DIR)/package.mk # Specify package information for this program. diff --git a/package/conninfra/src/Makefile b/package/conninfra/src/Makefile new file mode 100644 index 0000000..b0a81db --- /dev/null +++ b/package/conninfra/src/Makefile @@ -0,0 +1,66 @@ +############################################################################### +# Necessary Check + +#ifeq ($(AUTOCONF_H),) +# $(error AUTOCONF_H is not defined) +#endif + +#ccflags-y += -imacros $(AUTOCONF_H) + +# Force build fail on modpost warning +KBUILD_MODPOST_FAIL_ON_WARNINGS := y + +############################################################################### +ccflags-y += -Werror +ccflags-y += -Wno-error=format +ccflags-y += -Wno-error=format-extra-args +ccflags-y += -Wframe-larger-than=1024 + +############################################################################### +MODULE_NAME := conninfra +obj-m += $(MODULE_NAME).o + +############################################################################### +# common_main +############################################################################### +ccflags-y += \ + -I$(SUBDIRS)/include \ + -I$(SUBDIRS)/base/include \ + -I$(SUBDIRS)/core/include \ + -I$(SUBDIRS)/conf/include \ + -I$(SUBDIRS)/platform/include + +$(MODULE_NAME)-objs += base/ring.o +$(MODULE_NAME)-objs += base/osal.o +$(MODULE_NAME)-objs += base/msg_thread.o +$(MODULE_NAME)-objs += core/conninfra_core.o +$(MODULE_NAME)-objs += src/conninfra_dev.o +$(MODULE_NAME)-objs += src/conninfra.o +$(MODULE_NAME)-objs += platform/consys_hw.o +$(MODULE_NAME)-objs += platform/consys_hw_plat_data.o +$(MODULE_NAME)-objs += platform/pmic_mng.o +$(MODULE_NAME)-objs += platform/emi_mng.o +$(MODULE_NAME)-objs += platform/consys_reg_mng.o + +# By Plaftfrom +# MT7986 +ifeq ($(CONFIG_MTK_CONNINFRA_APSOC_MT7986),y) +ccflags-y += \ + -I$(SUBDIRS)/platform/mt7986/include -DCONNINFRA_APSOC_MT7986 +$(MODULE_NAME)-objs += platform/mt7986/mt7986.o +$(MODULE_NAME)-objs += platform/mt7986/mt7986_pmic.o +$(MODULE_NAME)-objs += platform/mt7986/mt7986_consys_reg.o +$(MODULE_NAME)-objs += platform/mt7986/mt7986_pos.o +$(MODULE_NAME)-objs += platform/mt7986/mt7986_emi.o +endif + +# MT7981 +ifeq ($(CONFIG_MTK_CONNINFRA_APSOC_MT7981),y) +ccflags-y += \ + -I$(SUBDIRS)/platform/mt7981/include -DCONNINFRA_APSOC_MT7981 +$(MODULE_NAME)-objs += platform/mt7981/mt7981.o +$(MODULE_NAME)-objs += platform/mt7981/mt7981_pmic.o +$(MODULE_NAME)-objs += platform/mt7981/mt7981_consys_reg.o +$(MODULE_NAME)-objs += platform/mt7981/mt7981_pos.o +$(MODULE_NAME)-objs += platform/mt7981/mt7981_emi.o +endif \ No newline at end of file diff --git a/package/conninfra/src/NOTICE b/package/conninfra/src/NOTICE new file mode 100644 index 0000000..52c1cac --- /dev/null +++ b/package/conninfra/src/NOTICE @@ -0,0 +1,202 @@ +The GNU General Public License (GPL) + +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU +General Public License is intended to guarantee your freedom to share and change free software--to make sure the +software is free for all its users. This General Public License applies to most of the Free Software Foundation's +software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is +covered by the GNU Library General Public License instead.) You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make +sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you +receive source code or can get it if you want it, that you can change the software or use pieces of it in new free +programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to +surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the +software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all +the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them +these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty +for this free software. If the software is modified by someone else and passed on, we want its recipients to know that +what they have is not the original, so that any problems introduced by others will not reflect on the original authors' +reputations. + +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors +of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, +we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it +may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or +work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to +say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into +another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is +addressed as "you". + +Activities other than copying, distribution and modification are not covered by this License; they are outside its +scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents +constitute a work based on the Program (independent of having been made by running the Program). Whether that is true +depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided +that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of +warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other +recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection +in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and +copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of +these conditions: + +a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any +change. + +b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the +Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this +License. + +c) If the modified program normally reads commands interactively when run, you must cause it, when started running for +such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright +notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may +redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if +the Program itself is interactive but does not normally print such an announcement, your work based on the Program is +not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the +Program, and can be reasonably considered independent and separate works in themselves, then this License, and its +terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same +sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part +regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; +rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the +Program. + +In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the +Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms +of Sections 1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than +your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source +code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; +or, + +c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This +alternative is allowed only for noncommercial distribution and only if you received the program in object code or +executable form with such an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for making modifications to it. For an executable work, +complete source code means all the source code for all modules it contains, plus any associated interface definition +files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, +the source code distributed need not include anything that is normally distributed (in either source or binary form) +with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless +that component itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy from a designated place, then offering +equivalent access to copy the source code from the same place counts as distribution of the source code, even though +third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your +rights under this License. However, parties who have received copies, or rights, from you under this License will not +have their licenses terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. However, nothing else grants you +permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do +not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you +indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or +modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a +license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You +may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not +responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to +patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the +conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as +to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence +you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution +of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy +both it and this License would be to refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the +section is intended to apply and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest +validity of any such claims; this section has the sole purpose of protecting the integrity of the free software +distribution system, which is implemented by public license practices. Many people have made generous contributions to +the wide range of software distributed through that system in reliance on consistent application of that system; it is +up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee +cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted +interfaces, the original copyright holder who places the Program under this License may add an explicit geographical +distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. +Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or +concerns. + +Each version is given a distinguishing version number. If the Program specifies a version number of this License which +applies to it and "any later version", you have the option of following the terms and conditions either of that version +or of any later version published by the Free Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are +different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, +write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two +goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of +software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM +"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY +WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, +SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT +LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF +THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY +OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + + + + diff --git a/package/conninfra/src/base/include/msg_thread.h b/package/conninfra/src/base/include/msg_thread.h new file mode 100644 index 0000000..6cb4628 --- /dev/null +++ b/package/conninfra/src/base/include/msg_thread.h @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _BASE_MSG_THREAD_H_ +#define _BASE_MSG_THREAD_H_ + +#include "osal.h" + +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + + +#define MSG_THREAD_OP_DATA_SIZE 8 +#define MSG_THREAD_OP_BUF_SIZE 64 + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + +struct msg_op_data { + unsigned int op_id; /* Event ID */ + unsigned int info_bit; /* Reserved */ + size_t op_data[MSG_THREAD_OP_DATA_SIZE]; /* OP Data */ +}; + +struct msg_op { + struct msg_op_data op; + OSAL_SIGNAL signal; + int result; + atomic_t ref_count; +}; + + +struct msg_op_q { + OSAL_SLEEPABLE_LOCK lock; + unsigned int write; + unsigned int read; + unsigned int size; + struct msg_op *queue[MSG_THREAD_OP_BUF_SIZE]; +}; + +typedef OSAL_OP_DAT msg_evt_op; +typedef int(*msg_opid_func) (struct msg_op_data *); + +struct msg_thread_ctx { + OSAL_THREAD thread; /* core thread */ + OSAL_EVENT evt; + + struct msg_op_q free_op_q; /* free op queue */ + struct msg_op_q active_op_q; /* active op queue */ + struct msg_op op_q_inst[MSG_THREAD_OP_BUF_SIZE]; /* real op instances */ + struct msg_op *cur_op; /* current op */ + + int op_func_size; + const msg_opid_func *op_func; + + struct osal_op_history op_history; +}; + + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +#define MSG_OP_TIMEOUT 20000 + +int msg_thread_init(struct msg_thread_ctx *ctx, const char *name, + const msg_opid_func *func, int op_size); +int msg_thread_deinit(struct msg_thread_ctx *ctx); + +/* timeout: + * 0: default value (by MSG_OP_TIMEOUT define) + * >0: cutom timeout (ms) + */ +int msg_thread_send(struct msg_thread_ctx *ctx, int opid); +int msg_thread_send_1(struct msg_thread_ctx *ctx, int opid, + size_t param1); +int msg_thread_send_2(struct msg_thread_ctx *ctx, int opid, + size_t param1, size_t param2); + +int msg_thread_send_wait(struct msg_thread_ctx *ctx, int opid, + int timeout); +int msg_thread_send_wait_1(struct msg_thread_ctx *ctx, int opid, + int timeout, size_t param1); +int msg_thread_send_wait_2(struct msg_thread_ctx *ctx, int opid, + int timeout, size_t param1, size_t param2); +int msg_thread_send_wait_3(struct msg_thread_ctx *ctx, int opid, int timeout, size_t param1, + size_t param2,size_t param3); + +int msg_thread_dump(struct msg_thread_ctx *ctx); + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +#endif /* _BASE_MSG_THREAD_H_ */ diff --git a/package/conninfra/src/base/include/osal.h b/package/conninfra/src/base/include/osal.h new file mode 100644 index 0000000..2eb2a75 --- /dev/null +++ b/package/conninfra/src/base/include/osal.h @@ -0,0 +1,399 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ + + +/*! \file + * \brief Declaration of library functions + * Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. + */ + +#ifndef _OSAL_H_ +#define _OSAL_H_ + +#include +#include +#include +#include +#include "ring.h" +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + +#define OS_BIT_OPS_SUPPORT 1 + +#ifndef MTK_CONN_BOOL_TRUE +#define MTK_CONN_BOOL_FALSE ((MTK_CONN_BOOL) 0) +#define MTK_CONN_BOOL_TRUE ((MTK_CONN_BOOL) 1) +#endif + +#define _osal_inline_ inline + +#define MAX_THREAD_NAME_LEN 16 +#define MAX_HISTORY_NAME_LEN 16 +#define OSAL_OP_BUF_SIZE 64 + + +#if (defined(CONFIG_MTK_GMO_RAM_OPTIMIZE) && !defined(CONFIG_MTK_ENG_BUILD)) +#define OSAL_OP_DATA_SIZE 8 +#else +#define OSAL_OP_DATA_SIZE 32 +#endif + +#define DBG_LOG_STR_SIZE 256 + +#define osal_sizeof(x) sizeof(x) + +#define osal_array_size(x) ARRAY_SIZE(x) + +#ifndef NAME_MAX +#define NAME_MAX 256 +#endif + +#define WMT_OP_BIT(x) (0x1UL << x) +#define WMT_OP_HIF_BIT WMT_OP_BIT(0) + +#define GET_BIT_MASK(value, mask) ((value) & (mask)) +#define SET_BIT_MASK(pdest, value, mask) (*(pdest) = (GET_BIT_MASK(*(pdest), ~(mask)) | GET_BIT_MASK(value, mask))) +#define GET_BIT_RANGE(data, end, begin) ((data) & GENMASK(end, begin)) +#define SET_BIT_RANGE(pdest, data, end, begin) (SET_BIT_MASK(pdest, data, GENMASK(end, begin))) + +#define RB_LATEST(prb) ((prb)->write - 1) +#define RB_SIZE(prb) ((prb)->size) +#define RB_MASK(prb) (RB_SIZE(prb) - 1) +#define RB_COUNT(prb) ((prb)->write - (prb)->read) +#define RB_FULL(prb) (RB_COUNT(prb) >= RB_SIZE(prb)) +#define RB_EMPTY(prb) ((prb)->write == (prb)->read) + +#define RB_INIT(prb, qsize) \ +do { \ + (prb)->read = (prb)->write = 0; \ + (prb)->size = (qsize); \ +} while (0) + +#define RB_PUT(prb, value) \ +do { \ + if (!RB_FULL(prb)) { \ + (prb)->queue[(prb)->write & RB_MASK(prb)] = value; \ + ++((prb)->write); \ + } \ + else { \ + pr_warn("RB is full!"); \ + } \ +} while (0) + +#define RB_GET(prb, value) \ +do { \ + if (!RB_EMPTY(prb)) { \ + value = (prb)->queue[(prb)->read & RB_MASK(prb)]; \ + ++((prb)->read); \ + if (RB_EMPTY(prb)) { \ + (prb)->read = (prb)->write = 0; \ + } \ + } \ + else { \ + value = NULL; \ + pr_warn("RB is empty!"); \ + } \ +} while (0) + +#define RB_GET_LATEST(prb, value) \ +do { \ + if (!RB_EMPTY(prb)) { \ + value = (prb)->queue[RB_LATEST(prb) & RB_MASK(prb)]; \ + if (RB_EMPTY(prb)) { \ + (prb)->read = (prb)->write = 0; \ + } \ + } \ + else { \ + value = NULL; \ + } \ +} while (0) + + + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + +typedef int MTK_CONN_BOOL; + +typedef int(*P_COND) (void *); + +typedef struct _OSAL_UNSLEEPABLE_LOCK_ { + spinlock_t lock; + unsigned long flag; +} OSAL_UNSLEEPABLE_LOCK, *P_OSAL_UNSLEEPABLE_LOCK; + +typedef struct _OSAL_SLEEPABLE_LOCK_ { + struct mutex lock; +} OSAL_SLEEPABLE_LOCK, *P_OSAL_SLEEPABLE_LOCK; + +typedef struct _OSAL_SIGNAL_ { + struct completion comp; + unsigned int timeoutValue; + unsigned int timeoutExtension; /* max number of timeout caused by thread not able to acquire CPU */ +} OSAL_SIGNAL, *P_OSAL_SIGNAL; + +typedef struct _OSAL_EVENT_ { + wait_queue_head_t waitQueue; + unsigned int timeoutValue; + int waitFlag; + +} OSAL_EVENT, *P_OSAL_EVENT; + +/* Data collected from sched_entity and sched_statistics */ +typedef struct _OSAL_THREAD_SCHEDSTATS_ { + unsigned long long time; /* when marked: the profiling start time(ms), when unmarked: total duration(ms) */ + unsigned long long exec; /* time spent in exec (sum_exec_runtime) */ + unsigned long long runnable; /* time spent in run-queue while not being scheduled (wait_sum) */ + unsigned long long iowait; /* time spent waiting for I/O (iowait_sum) */ +} OSAL_THREAD_SCHEDSTATS, *P_OSAL_THREAD_SCHEDSTATS; + +typedef struct _OSAL_THREAD_ { + struct task_struct *pThread; + void *pThreadFunc; + void *pThreadData; + char threadName[MAX_THREAD_NAME_LEN]; +} OSAL_THREAD, *P_OSAL_THREAD; + + +typedef struct _OSAL_FIFO_ { + /*fifo definition */ + void *pFifoBody; + spinlock_t fifoSpinlock; + /*fifo operations */ + int (*FifoInit)(struct _OSAL_FIFO_ *pFifo, unsigned char *buf, unsigned int); + int (*FifoDeInit)(struct _OSAL_FIFO_ *pFifo); + int (*FifoReset)(struct _OSAL_FIFO_ *pFifo); + int (*FifoSz)(struct _OSAL_FIFO_ *pFifo); + int (*FifoAvailSz)(struct _OSAL_FIFO_ *pFifo); + int (*FifoLen)(struct _OSAL_FIFO_ *pFifo); + int (*FifoIsEmpty)(struct _OSAL_FIFO_ *pFifo); + int (*FifoIsFull)(struct _OSAL_FIFO_ *pFifo); + int (*FifoDataIn)(struct _OSAL_FIFO_ *pFifo, const void *buf, unsigned int len); + int (*FifoDataOut)(struct _OSAL_FIFO_ *pFifo, void *buf, unsigned int len); +} OSAL_FIFO, *P_OSAL_FIFO; + +typedef struct firmware osal_firmware; + +typedef struct _OSAL_OP_DAT { + unsigned int opId; /* Event ID */ + unsigned int u4InfoBit; /* Reserved */ + size_t au4OpData[OSAL_OP_DATA_SIZE]; /* OP Data */ +} OSAL_OP_DAT, *P_OSAL_OP_DAT; + +typedef struct _OSAL_LXOP_ { + OSAL_OP_DAT op; + OSAL_SIGNAL signal; + int result; + atomic_t ref_count; +} OSAL_OP, *P_OSAL_OP; + +typedef struct _OSAL_LXOP_Q { + OSAL_SLEEPABLE_LOCK sLock; + unsigned int write; + unsigned int read; + unsigned int size; + P_OSAL_OP queue[OSAL_OP_BUF_SIZE]; +} OSAL_OP_Q, *P_OSAL_OP_Q; + +typedef struct _OSAL_BIT_OP_VAR_ { + unsigned long data; + OSAL_UNSLEEPABLE_LOCK opLock; +} OSAL_BIT_OP_VAR, *P_OSAL_BIT_OP_VAR; + +typedef unsigned int (*P_OSAL_EVENT_CHECKER) (P_OSAL_THREAD pThread); + +struct osal_op_history_entry { + void *opbuf_address; + unsigned int op_id; + unsigned int opbuf_ref_count; + unsigned int op_info_bit; + size_t param_0; + size_t param_1; + size_t param_2; + size_t param_3; + unsigned long long ts; + unsigned long usec; +}; + +struct osal_op_history { + struct ring ring_buffer; + struct osal_op_history_entry *queue; + spinlock_t lock; + struct ring dump_ring_buffer; + struct work_struct dump_work; + unsigned char name[MAX_HISTORY_NAME_LEN]; +}; + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ +void FlashRead(char *name,unsigned char *value, unsigned long offset, unsigned long size); +void FlashWrite(char *name, unsigned char *p, unsigned long a, unsigned long b); + +unsigned int osal_strlen(const char *str); +int osal_strcmp(const char *dst, const char *src); +int osal_strncmp(const char *dst, const char *src, unsigned int len); +char *osal_strcpy(char *dst, const char *src); +char *osal_strncpy(char *dst, const char *src, unsigned int len); +char *osal_strcat(char *dst, const char *src); +char *osal_strncat(char *dst, const char *src, unsigned int len); +char *osal_strchr(const char *str, unsigned char c); +char *osal_strsep(char **str, const char *c); +int osal_strtol(const char *str, unsigned int adecimal, long *res); +char *osal_strstr(char *str1, const char *str2); +char *osal_strnstr(char *str1, const char *str2, int n); + +void osal_bug_on(unsigned int val); + +int osal_snprintf(char *buf, unsigned int len, const char *fmt, ...); + +int osal_sprintf(char *str, const char *format, ...); +void *osal_malloc(unsigned int size); +void osal_free(const void *dst); +void *osal_memset(void *buf, int i, unsigned int len); +void *osal_memcpy(void *dst, const void *src, unsigned int len); +void osal_memcpy_fromio(void *dst, const void *src, unsigned int len); +void osal_memcpy_toio(void *dst, const void *src, unsigned int len); +int osal_memcmp(const void *buf1, const void *buf2, unsigned int len); + +int osal_sleep_ms(unsigned int ms); +int osal_udelay(unsigned int us); +int osal_usleep_range(unsigned long min, unsigned long max); + +int osal_fifo_init(P_OSAL_FIFO pFifo, unsigned char *buffer, unsigned int size); +void osal_fifo_deinit(P_OSAL_FIFO pFifo); +int osal_fifo_reset(P_OSAL_FIFO pFifo); +unsigned int osal_fifo_in(P_OSAL_FIFO pFifo, unsigned char *buffer, + unsigned int size); +unsigned int osal_fifo_out(P_OSAL_FIFO pFifo, unsigned char *buffer, + unsigned int size); +unsigned int osal_fifo_len(P_OSAL_FIFO pFifo); +unsigned int osal_fifo_sz(P_OSAL_FIFO pFifo); +unsigned int osal_fifo_avail(P_OSAL_FIFO pFifo); +unsigned int osal_fifo_is_empty(P_OSAL_FIFO pFifo); +unsigned int osal_fifo_is_full(P_OSAL_FIFO pFifo); + +#if defined(CONFIG_PROVE_LOCKING) +#define osal_unsleepable_lock_init(l) { spin_lock_init(&((l)->lock)); } +#else +int osal_unsleepable_lock_init(P_OSAL_UNSLEEPABLE_LOCK); +#endif +int osal_lock_unsleepable_lock(P_OSAL_UNSLEEPABLE_LOCK); +int osal_unlock_unsleepable_lock(P_OSAL_UNSLEEPABLE_LOCK); +int osal_unsleepable_lock_deinit(P_OSAL_UNSLEEPABLE_LOCK); + +#if defined(CONFIG_PROVE_LOCKING) +#define osal_sleepable_lock_init(l) { mutex_init(&((l)->lock)); } +#else +int osal_sleepable_lock_init(P_OSAL_SLEEPABLE_LOCK); +#endif +int osal_lock_sleepable_lock(P_OSAL_SLEEPABLE_LOCK); +int osal_unlock_sleepable_lock(P_OSAL_SLEEPABLE_LOCK); +int osal_trylock_sleepable_lock(P_OSAL_SLEEPABLE_LOCK); +int osal_sleepable_lock_deinit(P_OSAL_SLEEPABLE_LOCK); + +int osal_signal_init(P_OSAL_SIGNAL); +int osal_wait_for_signal(P_OSAL_SIGNAL); +int osal_wait_for_signal_timeout(P_OSAL_SIGNAL, P_OSAL_THREAD); +int osal_raise_signal(P_OSAL_SIGNAL); +int osal_signal_active_state(P_OSAL_SIGNAL pSignal); +int osal_signal_deinit(P_OSAL_SIGNAL); + +int osal_event_init(P_OSAL_EVENT); +int osal_wait_for_event(P_OSAL_EVENT, P_COND, void*); +int osal_wait_for_event_timeout(P_OSAL_EVENT, P_COND, void*); +extern int osal_trigger_event(P_OSAL_EVENT); + +int osal_event_deinit(P_OSAL_EVENT); +long osal_wait_for_event_bit_set(P_OSAL_EVENT pEvent, unsigned long *pState, unsigned int bitOffset); +long osal_wait_for_event_bit_clr(P_OSAL_EVENT pEvent, unsigned long *pState, unsigned int bitOffset); + +int osal_thread_create(P_OSAL_THREAD); +int osal_thread_run(P_OSAL_THREAD); +int osal_thread_should_stop(P_OSAL_THREAD); +int osal_thread_stop(P_OSAL_THREAD); +/*int osal_thread_wait_for_event(P_OSAL_THREAD, P_OSAL_EVENT);*/ +int osal_thread_wait_for_event(P_OSAL_THREAD, P_OSAL_EVENT, P_OSAL_EVENT_CHECKER); +/*check pOsalLxOp and OSAL_THREAD_SHOULD_STOP*/ +int osal_thread_destroy(P_OSAL_THREAD); +int osal_thread_sched_mark(P_OSAL_THREAD, P_OSAL_THREAD_SCHEDSTATS schedstats); +int osal_thread_sched_unmark(P_OSAL_THREAD pThread, P_OSAL_THREAD_SCHEDSTATS schedstats); + +int osal_clear_bit(unsigned int bitOffset, P_OSAL_BIT_OP_VAR pData); +int osal_set_bit(unsigned int bitOffset, P_OSAL_BIT_OP_VAR pData); +int osal_test_bit(unsigned int bitOffset, P_OSAL_BIT_OP_VAR pData); +int osal_test_and_clear_bit(unsigned int bitOffset, P_OSAL_BIT_OP_VAR pData); +int osal_test_and_set_bit(unsigned int bitOffset, P_OSAL_BIT_OP_VAR pData); + +int osal_gettimeofday(int *sec, int *usec); +int osal_gettimeofday2(struct timeval *tv); + +//int osal_printtimeofday(const unsigned char *prefix); +void osal_get_local_time(unsigned long long *sec, unsigned long *nsec); +unsigned long long osal_elapsed_us(unsigned long long ts, unsigned long usec); + +void osal_buffer_dump(const unsigned char *buf, const unsigned char *title, unsigned int len, unsigned int limit); +void osal_buffer_dump_data(const unsigned int *buf, const unsigned char *title, const unsigned int len, const unsigned int limit, + const int flag); + +unsigned int osal_op_get_id(P_OSAL_OP pOp); +MTK_CONN_BOOL osal_op_is_wait_for_signal(P_OSAL_OP pOp); +void osal_op_raise_signal(P_OSAL_OP pOp, int result); +void osal_set_op_result(P_OSAL_OP pOp, int result); +void osal_opq_dump(const char *qName, P_OSAL_OP_Q pOpQ); +void osal_opq_dump_locked(const char *qName, P_OSAL_OP_Q pOpQ); +MTK_CONN_BOOL osal_opq_has_op(P_OSAL_OP_Q pOpQ, P_OSAL_OP pOp); + +int osal_ftrace_print(const char *str, ...); +int osal_ftrace_print_ctrl(int flag); + +void osal_dump_thread_state(const unsigned char *name); +void osal_op_history_init(struct osal_op_history *log_history, int queue_size); +void osal_op_history_save(struct osal_op_history *log_history, P_OSAL_OP pOp); +void osal_op_history_print(struct osal_op_history *log_history, char *name); +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +#endif /* _OSAL_H_ */ diff --git a/package/conninfra/src/base/include/ring.h b/package/conninfra/src/base/include/ring.h new file mode 100644 index 0000000..81168ce --- /dev/null +++ b/package/conninfra/src/base/include/ring.h @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +#ifndef _RING_H_ +#define _RING_H_ + +struct ring { + /* addr where ring buffer starts */ + void *base; + /* addr storing the next writable pos, guaranteed to be >= read except when write overflow, but it's ok. */ + unsigned int write; + /* addr storing the next readable pos, except when read == write as buffer empty */ + unsigned int read; + /* must be power of 2 */ + unsigned int max_size; +}; + +struct ring_segment { + /* addr points into ring buffer for read/write */ + void *ring_pt; + /* size to read/write */ + unsigned int sz; + /* pos in external data buffer to read/write */ + unsigned int data_pos; + /* the size to be read/write after this segment completed */ + unsigned int remain; +}; + +void ring_init(void *base, unsigned int max_size, unsigned int read, + unsigned int write, struct ring *ring); +unsigned int ring_read_prepare(unsigned int sz, struct ring_segment *seg, struct ring *ring); +#define ring_read_all_prepare(seg, ring) ring_read_prepare((ring)->max_size, seg, ring) +unsigned int ring_write_prepare(unsigned int sz, struct ring_segment *seg, struct ring *ring); +unsigned int ring_overwrite_prepare(unsigned int sz, + struct ring_segment *seg, struct ring *ring); + +/* making sure max_size is power of 2 */ +#define RING_VALIDATE_SIZE(max_size) WARN_ON(!max_size || (max_size & (max_size - 1))) + +#define RING_EMPTY(ring) ((ring)->read == (ring)->write) +/* equation works even when write overflow */ +#define RING_SIZE(ring) ((ring)->write - (ring)->read) +#define RING_FULL(ring) (RING_SIZE(ring) == (ring)->max_size) +#define RING_WRITE_REMAIN_SIZE(ring) ((ring)->max_size - RING_SIZE(ring)) + +#define RING_READ_FOR_EACH(_sz, _seg, _ring) \ + for (ring_read_prepare(_sz, &(_seg), _ring), \ + _ring_segment_prepare((_ring)->read, &(_seg), (_ring)); \ + (_seg).sz > 0; \ + _ring_read_commit(&(_seg), (_ring)), _ring_segment_prepare((_ring)->read, \ + &(_seg), (_ring))) + +#define RING_READ_ALL_FOR_EACH(seg, ring) RING_READ_FOR_EACH((ring)->max_size, seg, ring) + +#define RING_READ_FOR_EACH_ITEM(_sz, _seg, _ring) \ + for (ring_read_prepare(_sz, &(_seg), _ring), \ + _ring_segment_prepare_item((_ring)->read, &(_seg), (_ring)); \ + (_seg).sz > 0; \ + _ring_read_commit(&(_seg), (_ring)), _ring_segment_prepare_item((_ring)->read, \ + &(_seg), (_ring))) + +#define RING_WRITE_FOR_EACH(_sz, _seg, _ring) \ + for (ring_write_prepare(_sz, &(_seg), _ring),\ + _ring_segment_prepare((_ring)->write, &(_seg), (_ring)); \ + (_seg).sz > 0; \ + _ring_write_commit(&(_seg), (_ring)), _ring_segment_prepare((_ring)->write, \ + &(_seg), (_ring))) + +#define RING_OVERWRITE_FOR_EACH(_sz, _seg, _ring) \ + for (ring_overwrite_prepare(_sz, &(_seg), _ring), \ + _ring_segment_prepare((_ring)->write, &(_seg), (_ring)); \ + (_seg).sz > 0; \ + _ring_write_commit(&(_seg), (_ring)), _ring_segment_prepare((_ring)->write, \ + &(_seg), (_ring))) + +void ring_dump(const char *title, struct ring *ring); +void ring_dump_segment(const char *title, struct ring_segment *seg); + + +/* ring Buffer Internal API */ +void _ring_segment_prepare(unsigned int from, struct ring_segment *seg, struct ring *ring); +void _ring_segment_prepare_item(unsigned int from, struct ring_segment *seg, struct ring *ring); +void _ring_read_commit(struct ring_segment *seg, struct ring *ring); +void _ring_write_commit(struct ring_segment *seg, struct ring *ring); + +#endif diff --git a/package/conninfra/src/base/msg_thread.c b/package/conninfra/src/base/msg_thread.c new file mode 100644 index 0000000..4a9c0cb --- /dev/null +++ b/package/conninfra/src/base/msg_thread.c @@ -0,0 +1,716 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#define pr_fmt(fmt) KBUILD_MODNAME "@(%s:%d) " fmt, __func__, __LINE__ +#include +#include "msg_thread.h" + +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ +static void msg_opq_dump(const char *qName, struct msg_op_q *op_q); +static void _msg_opq_dump(const char *qName, struct msg_op_q *op_q); + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +#define MSG_OP_SIZE(prb) ((prb)->size) +#define MSG_OP_MASK(prb) (MSG_OP_SIZE(prb) - 1) +#define MSG_OP_COUNT(prb) ((prb)->write - (prb)->read) +#define MSG_OP_FULL(prb) (MSG_OP_COUNT(prb) >= MSG_OP_SIZE(prb)) +#define MSG_OP_EMPTY(prb) ((prb)->write == (prb)->read) + +#define MSG_OP_INIT(prb, qsize) \ +do { \ + (prb)->read = (prb)->write = 0; \ + (prb)->size = (qsize); \ +} while (0) + +#define MSG_OP_PUT(prb, value) \ +do { \ + if (!MSG_OP_FULL(prb)) { \ + (prb)->queue[(prb)->write & MSG_OP_MASK(prb)] = value; \ + ++((prb)->write); \ + } \ + else { \ + pr_warn("Message queue is full.\n"); \ + } \ +} while (0) + +#define MSG_OP_GET(prb, value) \ +do { \ + if (!MSG_OP_EMPTY(prb)) { \ + value = (prb)->queue[(prb)->read & MSG_OP_MASK(prb)]; \ + ++((prb)->read); \ + if (MSG_OP_EMPTY(prb)) { \ + (prb)->read = (prb)->write = 0; \ + } \ + } \ + else { \ + value = NULL; \ + pr_warn("Message queue is empty.\n"); \ + } \ +} while (0) + + + +#if defined(CONFIG_MTK_ENG_BUILD) || defined(CONFIG_MT_ENG_BUILD) +static bool msg_evt_opq_has_op(struct msg_op_q *op_q, struct msg_op *op) +{ + unsigned int rd; + unsigned int wt; + struct msg_op *tmp_op; + + rd = op_q->read; + wt = op_q->write; + + while (rd != wt) { + tmp_op = op_q->queue[rd & MSG_OP_MASK(op_q)]; + if (op == tmp_op) + return true; + rd++; + } + return false; +} +#endif + +/* + * Utility functions + */ +static int msg_evt_put_op_to_q(struct msg_op_q *op_q, struct msg_op *op) +{ + int ret; + + if (!op_q || !op) { + pr_err("invalid input param: pOpQ(0x%p), pLxOp(0x%p)\n", op_q, op); + return -1; + } + + ret = osal_lock_sleepable_lock(&op_q->lock); + if (ret) { + pr_warn("osal_lock_sleepable_lock iRet(%d)\n", ret); + return -2; + } + +#if defined(CONFIG_MTK_ENG_BUILD) || defined(CONFIG_MT_ENG_BUILD) + if (msg_evt_opq_has_op(op_q, op)) { + pr_err("Op(%p) already exists in queue(%p)\n", op, op_q); + ret = -3; + } +#endif + + /* acquire lock success */ + if (!MSG_OP_FULL(op_q)) + MSG_OP_PUT(op_q, op); + else { + pr_warn("MSG_OP_FULL(%p -> %p)\n", op, op_q); + ret = -4; + } + + osal_unlock_sleepable_lock(&op_q->lock); + + if (ret) { + //osal_opq_dump("FreeOpQ", &g_conninfra_ctx.rFreeOpQ); + //osal_opq_dump("ActiveOpQ", &g_conninfra_ctx.rActiveOpQ); + return ret; + } + return 0; +} + + +/* + * Utility functions + */ +static struct msg_op *msg_evt_get_op_from_q(struct msg_op_q *op_q) +{ + struct msg_op *op; + int ret; + + if (op_q == NULL) { + pr_err("pOpQ = NULL\n"); + return NULL; + } + + ret = osal_lock_sleepable_lock(&op_q->lock); + if (ret) { + pr_err("osal_lock_sleepable_lock iRet(%d)\n", ret); + return NULL; + } + + /* acquire lock success */ + MSG_OP_GET(op_q, op); + osal_unlock_sleepable_lock(&op_q->lock); + + if (op == NULL) { + pr_warn("MSG_OP_GET(%p) return NULL\n", op_q); + //osal_opq_dump("FreeOpQ", &g_conninfra_ctx.rFreeOpQ); + //osal_opq_dump("ActiveOpQ", &g_conninfra_ctx.rActiveOpQ); + } + + return op; +} + +static void _msg_opq_dump(const char *qName, struct msg_op_q *op_q) +{ + /* Line format: + * [LogicalIdx(PhysicalIdx)]Address:OpId(Ref)(Result)-Info-OpData0,OpData1,OpData2,OpData3,OpData5_ + * [LogicalIdx] max 10+2=12 chars (decimal) + * (PhysicalIdx) max 10+2=12 chars (decimal) + * Address: max 16+1=17 chars (hex) + * OpId max 10 chars (decimal) + * (Ref) max 2+2=4 chars (should only be 1 digit, reserve 2 in case of negative number) + * (Result) max 11+2=13 chars (signed decimal) + * -Info- max 8+2=10 chars (hex) + * OpData, max 16+1=17 chars (hex) + */ +#define OPQ_DUMP_OP_PER_LINE 1 +#define OPQ_DUMP_OPDATA_PER_OP 6 +#define OPQ_DUMP_OP_BUF_SIZE (12 + 12 + 17 + 10 + 4 + 13 + 10 + (17 * (OPQ_DUMP_OPDATA_PER_OP)) + 1) +#define OPQ_DUMP_LINE_BUF_SIZE ((OPQ_DUMP_OP_BUF_SIZE * OPQ_DUMP_OP_PER_LINE) + 1) + unsigned int rd; + unsigned int wt; + unsigned int idx = 0; + unsigned int op_data_idx; + unsigned int buf_idx; + int printed; + struct msg_op *op; + char buf[OPQ_DUMP_LINE_BUF_SIZE]; + + rd = op_q->read; + wt = op_q->write; + + pr_info("%s(%p), sz:%u/%u, rd:%u, wt:%u\n", + qName, op_q, RB_COUNT(op_q), RB_SIZE(op_q), rd, wt); + while (rd != wt && idx < RB_SIZE(op_q)) { + buf_idx = idx % OPQ_DUMP_OP_PER_LINE; + op = op_q->queue[rd & RB_MASK(op_q)]; + + if (buf_idx == 0) { + printed = 0; + buf[0] = 0; + } + + if (op) { + printed += snprintf(buf + printed, OPQ_DUMP_LINE_BUF_SIZE - printed, + "[%u(%u)]%p:%u(%d)(%d)-%u-", + idx, + (rd & RB_MASK(op_q)), + op, + op->op.op_id, + atomic_read(&op->ref_count), + op->result, + op->op.info_bit); + for (op_data_idx = 0; op_data_idx < OPQ_DUMP_OPDATA_PER_OP; op_data_idx++) + printed += snprintf(buf + printed, OPQ_DUMP_LINE_BUF_SIZE - printed, + "%zx,", op->op.op_data[op_data_idx]); + buf[printed-1] = ' '; + } else { + printed += snprintf(buf + printed, OPQ_DUMP_LINE_BUF_SIZE - printed, + "[%u(%u)]%p ", idx, (rd & RB_MASK(op_q)), op); + } + buf[printed++] = ' '; + + if (buf_idx == OPQ_DUMP_OP_PER_LINE - 1 || rd == wt - 1) { + buf[printed - 1] = 0; + pr_info("%s\n", buf); + } + rd++; + idx++; + } +} + +void msg_opq_dump(const char *qName, struct msg_op_q *op_q) +{ + int err; + + err = osal_lock_sleepable_lock(&op_q->lock); + if (err) { + pr_info("Failed to lock queue (%d)\n", err); + return; + } + + _msg_opq_dump(qName, op_q); + + osal_unlock_sleepable_lock(&op_q->lock); +} + +/* + * msg_evt_thread API + */ + +int msg_evt_put_op_to_free_queue(struct msg_thread_ctx *ctx, struct msg_op *op) +{ + if (msg_evt_put_op_to_q(&ctx->free_op_q, op)) + return -1; + return 0; +} + + +struct msg_op *msg_evt_get_free_op(struct msg_thread_ctx *ctx) +{ + struct msg_op *op = NULL; + + if (ctx == NULL) { + pr_warn("ctx is null.\n"); + return op; + } + op = msg_evt_get_op_from_q(&ctx->free_op_q); + if (op) + osal_memset(op, 0, osal_sizeof(struct msg_op)); + return op; +} + +int msg_evt_put_op_to_active(struct msg_thread_ctx *ctx, struct msg_op *op) +{ + P_OSAL_SIGNAL signal = NULL; + int wait_ret = -1; + int ret = 0; + + do { + if (!ctx || !op) { + pr_err("msg_thread_ctx(0x%p), op(0x%p)\n", ctx, op); + break; + } + + signal = &op->signal; + if (signal->timeoutValue) { + op->result = -9; + osal_signal_init(signal); + atomic_set(&op->ref_count, 1); + } else + atomic_set(&op->ref_count, 0); + + /* Increment ref_count by 1 as wmtd thread will hold a reference also, + * this must be done here instead of on target thread, because + * target thread might not be scheduled until a much later time, + * allowing current thread to decrement ref_count at the end of function, + * putting op back to free queue before target thread has a chance to process. + */ + atomic_inc(&op->ref_count); + + /* put to active Q */ + ret = msg_evt_put_op_to_q(&ctx->active_op_q, op); + if (ret) { + pr_warn("put to active queue fail\n"); + atomic_dec(&op->ref_count); + break; + } + + /* wake up conninfra_cored */ + osal_trigger_event(&ctx->evt); + + if (signal->timeoutValue == 0) { + //ret = -1; + /* Not set timeout, don't wait */ + /* pr_info("[%s] timeout is zero", __func__);*/ + break; + } + + /* check result */ + wait_ret = osal_wait_for_signal_timeout(signal, &ctx->thread); + /*pr_info("osal_wait_for_signal_timeout:%d result=[%d]\n", + wait_ret, op->result);*/ + + if (wait_ret == 0) + pr_warn("opId(%d) completion timeout\n", op->op.op_id); + else if (op->result) + pr_info("opId(%d) result:%d\n", + op->op.op_id, op->result); + + /* op completes, check result */ + ret = op->result; + } while (0); + + if (op != NULL && signal != NULL && signal->timeoutValue && + atomic_dec_and_test(&op->ref_count)) { + /* put Op back to freeQ */ + msg_evt_put_op_to_free_queue(ctx, op); + } + + return ret; +} + + +int msg_thread_send(struct msg_thread_ctx *ctx, int opid) +{ + return msg_thread_send_2(ctx, opid, 0, 0); +} + +int msg_thread_send_1(struct msg_thread_ctx *ctx, int opid, + size_t param1) +{ + return msg_thread_send_2(ctx, opid, param1, 0); +} + +int msg_thread_send_2(struct msg_thread_ctx *ctx, int opid, + size_t param1, size_t param2) +{ + struct msg_op *op = NULL; + P_OSAL_SIGNAL signal; + int ret; + + op = msg_evt_get_free_op(ctx); + if (!op) { + pr_err("[%s] can't get free op\n", __func__); + return -1; + } + op->op.op_id = opid; + op->op.op_data[0] = param1; + op->op.op_data[1] = param2; + + signal = &op->signal; + //signal->timeoutValue = timeout > 0 ? timeout : MSG_OP_TIMEOUT; + signal->timeoutValue = 0; + ret = msg_evt_put_op_to_active(ctx, op); + + return ret; +} + +int msg_thread_send_wait(struct msg_thread_ctx *ctx, int opid, + int timeout) +{ + return msg_thread_send_wait_3(ctx, opid, timeout, 0, 0, 0); +} + +int msg_thread_send_wait_1(struct msg_thread_ctx *ctx, + int opid, int timeout, + size_t param1) +{ + return msg_thread_send_wait_3(ctx, opid, timeout, param1, 0, 0); +} + + +int msg_thread_send_wait_2(struct msg_thread_ctx *ctx, + int opid, int timeout, + size_t param1, + size_t param2) +{ + return msg_thread_send_wait_3(ctx, opid, timeout, param1, param2, 0); +} + +int msg_thread_send_wait_3(struct msg_thread_ctx *ctx, + int opid, int timeout, + size_t param1, + size_t param2, + size_t param3) +{ + struct msg_op *op = NULL; + P_OSAL_SIGNAL signal; + int ret; + + op = msg_evt_get_free_op(ctx); + if (!op) { + pr_err("can't get free op for 0x%x\n", opid); + return -1; + } + op->op.op_id = opid; + op->op.op_data[0] = param1; + op->op.op_data[1] = param2; + op->op.op_data[2] = param3; + + signal = &op->signal; + signal->timeoutValue = timeout > 0 ? timeout : MSG_OP_TIMEOUT; + ret = msg_evt_put_op_to_active(ctx, op); + return ret; + +} + +void msg_op_history_save(struct osal_op_history *log_history, struct msg_op *op) +{ + struct osal_op_history_entry *entry = NULL; + struct ring_segment seg; + int index; + unsigned long long sec = 0; + unsigned long usec = 0; + unsigned long flags; + + if (log_history->queue == NULL) + return; + + osal_get_local_time(&sec, &usec); + + spin_lock_irqsave(&(log_history->lock), flags); + RING_OVERWRITE_FOR_EACH(1, seg, &log_history->ring_buffer) { + index = seg.ring_pt - log_history->ring_buffer.base; + entry = &log_history->queue[index]; + } + + if (entry == NULL) { + pr_info("Entry is null, size %d\n", + RING_SIZE(&log_history->ring_buffer)); + spin_unlock_irqrestore(&(log_history->lock), flags); + return; + } + + entry->opbuf_address = op; + entry->op_id = op->op.op_id; + entry->opbuf_ref_count = atomic_read(&op->ref_count); + entry->op_info_bit = op->op.info_bit; + entry->param_0 = op->op.op_data[0]; + entry->param_1 = op->op.op_data[1]; + entry->param_2 = op->op.op_data[2]; + entry->param_3 = op->op.op_data[3]; + entry->ts = sec; + entry->usec = usec; + spin_unlock_irqrestore(&(log_history->lock), flags); +} + +unsigned int msg_evt_wait_event_checker(P_OSAL_THREAD thread) +{ + struct msg_thread_ctx *ctx = NULL; + + if (thread) { + ctx = (struct msg_thread_ctx *) (thread->pThreadData); + return !MSG_OP_EMPTY(&ctx->active_op_q); + } + return 0; +} + +int msg_evt_set_current_op(struct msg_thread_ctx *ctx, struct msg_op *op) +{ + ctx->cur_op = op; + return 0; +} + +int msg_evt_opid_handler(struct msg_thread_ctx *ctx, struct msg_op_data *op) +{ + int opid, ret; + + /*sanity check */ + if (op == NULL) { + pr_warn("null op\n"); + return -1; + } + if (ctx == NULL) { + pr_warn("null evt thread ctx\n"); + return -2; + } + + opid = op->op_id; + + if (opid >= ctx->op_func_size) { + pr_err("msg_evt_thread invalid OPID(%d)\n", opid); + return -3; + } + + if (ctx->op_func[opid] == NULL) { + pr_err("null handler (%d)\n", opid); + return -4; + } + ret = (*(ctx->op_func[opid])) (op); + return ret; +} + +static int msg_evt_thread(void *pvData) +{ + struct msg_thread_ctx *ctx = (struct msg_thread_ctx *)pvData; + P_OSAL_EVENT evt = NULL; + struct msg_op *op; + int ret; + + if (ctx == NULL) { + pr_err("msg_evt_thread (NULL)\n"); + return -1; + } + + evt = &(ctx->evt); + + for (;;) { + op = NULL; + evt->timeoutValue = 0; + + osal_thread_wait_for_event(&ctx->thread, evt, msg_evt_wait_event_checker); + + if (osal_thread_should_stop(&ctx->thread)) { + pr_info("msg_evt_thread thread should stop now...\n"); + /* TODO: clean up active opQ */ + break; + } + /* get Op from activeQ */ + op = msg_evt_get_op_from_q(&ctx->active_op_q); + if (!op) { + pr_warn("get op from activeQ fail\n"); + continue; + } + + /* TODO: save op history */ + msg_op_history_save(&ctx->op_history, op); + msg_evt_set_current_op(ctx, op); + ret = msg_evt_opid_handler(ctx, &op->op); + msg_evt_set_current_op(ctx, NULL); + + if (ret) + pr_warn("opid (0x%x) failed, ret(%d)\n", + op->op.op_id, ret); + + if (atomic_dec_and_test(&op->ref_count)) { + /* msg_evt_free_op(ctx) */ + msg_evt_put_op_to_free_queue(ctx, op); + } else if (op->signal.timeoutValue) { + op->result = ret; + osal_raise_signal(&op->signal); + } + } + + pr_debug("msg evt thread exists\n"); + return 0; +} + +int msg_thread_dump(struct msg_thread_ctx *ctx) +{ + P_OSAL_THREAD p_thread; + struct msg_op *cur_op; + + if (ctx == NULL) { + pr_err("get NULL input\n"); + return 0; + } + p_thread = &ctx->thread; + pr_info("Dump msg_thread_ctx: %s\n", p_thread->threadName); + cur_op = ctx->cur_op; + if (cur_op) { + pr_info("cur_op: %x(%x)-%zx,%zx,%zx,%zx\n", + cur_op->op.op_id, cur_op->op.info_bit, + cur_op->op.op_data[0], cur_op->op.op_data[1], + cur_op->op.op_data[2], cur_op->op.op_data[3]); + } + osal_dump_thread_state(p_thread->threadName); + osal_op_history_print(&(ctx->op_history), p_thread->threadName); + msg_opq_dump("ActiveOpQ", &ctx->active_op_q); + + return 0; +} + +int msg_thread_init(struct msg_thread_ctx *ctx, + const char *thread_name, const msg_opid_func *funcs, + int op_size) +{ + int r = 0, i; + P_OSAL_THREAD p_thread; + + osal_memset(ctx, 0, sizeof(struct msg_thread_ctx)); + + ctx->op_func = funcs; + ctx->op_func_size = op_size; + + /* init thread inst */ + p_thread = &ctx->thread; + + osal_strncpy(p_thread->threadName, thread_name, + sizeof(p_thread->threadName)); + + p_thread->pThreadData = (void *) ctx; + p_thread->pThreadFunc = (void *) msg_evt_thread; + r = osal_thread_create(p_thread); + + if (r) { + pr_err("osal_thread_create(0x%p) fail(%d)\n", p_thread, r); + return -1; + } + + osal_event_init(&ctx->evt); + osal_sleepable_lock_init(&ctx->active_op_q.lock); + osal_sleepable_lock_init(&ctx->free_op_q.lock); + + /* Initialize op queue */ + MSG_OP_INIT(&ctx->free_op_q, MSG_THREAD_OP_BUF_SIZE); + MSG_OP_INIT(&ctx->active_op_q, MSG_THREAD_OP_BUF_SIZE); + + /* Put all to free Q */ + for (i = 0; i < MSG_THREAD_OP_BUF_SIZE; i++) { + osal_signal_init(&(ctx->op_q_inst[i].signal)); + msg_evt_put_op_to_free_queue(ctx, &(ctx->op_q_inst[i])); + } + + osal_op_history_init(&ctx->op_history, 16); + + r = osal_thread_run(p_thread); + if (r) { + pr_err("osal_thread_run(evt_thread 0x%p) fail(%d)\n", + p_thread, r); + return -2; + } + return r; +} + +int msg_thread_deinit(struct msg_thread_ctx *ctx) +{ + int r, i; + P_OSAL_THREAD p_thraed = &ctx->thread; + + r = osal_thread_stop(p_thraed); + if (r) { + pr_err("osal_thread_stop(0x%p) fail(%d)\n", p_thraed, r); + return -1; + } + + for (i = 0; i < MSG_THREAD_OP_BUF_SIZE; i++) + osal_signal_deinit(&(ctx->op_q_inst[i].signal)); + + osal_sleepable_lock_deinit(&ctx->free_op_q.lock); + osal_sleepable_lock_deinit(&ctx->active_op_q.lock); + + r = osal_thread_destroy(p_thraed); + if (r) { + pr_err("osal_thread_stop(0x%p) fail(%d)\n", p_thraed, r); + return -2; + } + + osal_memset(ctx, 0, sizeof(struct msg_thread_ctx)); + + pr_debug("[%s] DONE\n", __func__); + return 0; +} diff --git a/package/conninfra/src/base/osal.c b/package/conninfra/src/base/osal.c new file mode 100644 index 0000000..3cdacfd --- /dev/null +++ b/package/conninfra/src/base/osal.c @@ -0,0 +1,1595 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ + +/*! \file + * \brief Declaration of library functions + * Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. + */ + +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ +#define pr_fmt(fmt) KBUILD_MODNAME "@(%s:%d) " fmt, __func__, __LINE__ +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_MTD +#include +#include +#include +#include +#endif /* CONFIG_MTD */ +#include "osal.h" + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +#define TO_STR(_x) #_x +#define BIN_TO_STR(_x) TO_STR(_x) +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +int ftrace_flag = 1; +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + + +int get_default_bin_image_file(char *path) +{ + if(osal_strlen(BIN_TO_STR(EEPROM_NAME))) + osal_sprintf(path, "/lib/firmware/%s", BIN_TO_STR(EEPROM_NAME)); + else + osal_sprintf(path, "/lib/firmware/e2p"); + + pr_info("Use default BIN from:%s.\n", path); + + return 0; +} + +void FlashRead(char *name, unsigned char *value, unsigned long offset, unsigned long size) +{ +#ifdef CONFIG_MTD + int ret; + size_t rdlen; + struct mtd_info *mtd; + + mtd = get_mtd_device_nm(name); + if (IS_ERR(mtd)) { + pr_err("Can't get mtd device!\n"); + return; + } else { + ret = mtd_read(mtd, offset, size, &rdlen, value); + if (rdlen != size) { + pr_err("mtd_read: rdlen is not equal to size!\n"); + } + put_mtd_device(mtd); + } +#endif /* CONFIG_WIFI_MTD */ +} + +void FlashWrite(char *name, unsigned char *p, unsigned long a, unsigned long b) +{ + return; +} + +/*string operations*/ +unsigned int osal_strlen(const char *str) +{ + return strlen(str); +} + +int osal_strcmp(const char *dst, const char *src) +{ + return strcmp(dst, src); +} + +int osal_strncmp(const char *dst, const char *src, unsigned int len) +{ + return strncmp(dst, src, len); +} + +char *osal_strcpy(char *dst, const char *src) +{ + return strncpy(dst, src, strlen(src)+1); +} + +char *osal_strncpy(char *dst, const char *src, unsigned int len) +{ + return strncpy(dst, src, len); +} + +char *osal_strcat(char *dst, const char *src) +{ + return strncat(dst, src, strlen(src)); +} + +char *osal_strncat(char *dst, const char *src, unsigned int len) +{ + return strncat(dst, src, len); +} + +char *osal_strchr(const char *str, unsigned char c) +{ + return strchr(str, c); +} + +char *osal_strsep(char **str, const char *c) +{ + return strsep(str, c); +} + +int osal_strtol(const char *str, unsigned int adecimal, long *res) +{ + if (sizeof(long) == 4) + return kstrtou32(str, adecimal, (unsigned int *) res); + else + return kstrtol(str, adecimal, res); +} + +char *osal_strstr(char *str1, const char *str2) +{ + return strstr(str1, str2); +} + +char *osal_strnstr(char *str1, const char *str2, int n) +{ + return strnstr(str1, str2, n); +} + +void osal_bug_on(unsigned int val) +{ + WARN_ON(val); +} + +int osal_snprintf(char *buf, unsigned int len, const char *fmt, ...) +{ + int iRet = 0; + va_list args; + + /*va_start(args, fmt); */ + va_start(args, fmt); + /*iRet = snprintf(buf, len, fmt, args); */ + iRet = vsnprintf(buf, len, fmt, args); + va_end(args); + + return iRet; +} + +int osal_sprintf(char *str, const char *format, ...) +{ + int iRet = 0; + va_list args; + + va_start(args, format); + iRet = vsnprintf(str, DBG_LOG_STR_SIZE, format, args); + va_end(args); + + return iRet; +} + +void *osal_malloc(unsigned int size) +{ + return vmalloc(size); +} + +void osal_free(const void *dst) +{ + vfree(dst); +} + +void *osal_memset(void *buf, int i, unsigned int len) +{ + return memset(buf, i, len); +} + +void *osal_memcpy(void *dst, const void *src, unsigned int len) +{ + return memcpy(dst, src, len); +} + +void osal_memcpy_fromio(void *dst, const void *src, unsigned int len) +{ + return memcpy_fromio(dst, src, len); +} + +void osal_memcpy_toio(void *dst, const void *src, unsigned int len) +{ + return memcpy_toio(dst, src, len); +} + +int osal_memcmp(const void *buf1, const void *buf2, unsigned int len) +{ + return memcmp(buf1, buf2, len); +} + +void osal_dump_thread_state(const unsigned char *name) +{ + //TODO + return; +} + +static inline bool __osal_is_valid_thread(P_OSAL_THREAD pThread) +{ + if ((pThread) && !IS_ERR_OR_NULL(pThread->pThread)) + return true; + else + return false; +} + +/* + * OSAL layer Thread Opeartion related APIs + * + */ +int osal_thread_create(P_OSAL_THREAD pThread) +{ + struct task_struct *task; + + if (!pThread) + return -1; + + task = kthread_create(pThread->pThreadFunc, + pThread->pThreadData, pThread->threadName); + if (IS_ERR(task)) { + pr_err("[%s] create %s thread fail\n", __func__, pThread->threadName); + return -1; + } + + pThread->pThread = task; + return 0; +} + +int osal_thread_run(P_OSAL_THREAD pThread) +{ + if (__osal_is_valid_thread(pThread)) { + wake_up_process(pThread->pThread); + return 0; + } else { + return -1; + } +} + +int osal_thread_stop(P_OSAL_THREAD pThread) +{ + int iRet; + + if (__osal_is_valid_thread(pThread)) { + iRet = kthread_stop(pThread->pThread); + pThread->pThread = NULL; + return iRet; + } + return -1; +} + +int osal_thread_should_stop(P_OSAL_THREAD pThread) +{ + if (__osal_is_valid_thread(pThread)) + return kthread_should_stop(); + else + return 1; + +} + +int osal_thread_wait_for_event(P_OSAL_THREAD pThread, + P_OSAL_EVENT pEvent, P_OSAL_EVENT_CHECKER pChecker) +{ + /* P_DEV_WMT pDevWmt;*/ + + if (__osal_is_valid_thread(pThread) && (pEvent) && (pChecker)) { + return wait_event_interruptible(pEvent->waitQueue, ( + osal_thread_should_stop(pThread) + || (*pChecker) (pThread))); + } + return -1; +} + +int osal_thread_destroy(P_OSAL_THREAD pThread) +{ + if (__osal_is_valid_thread(pThread)) { + kthread_stop(pThread->pThread); + pThread->pThread = NULL; + } + return 0; +} + +/* + * osal_thread_sched_retrieve + * Retrieve thread's current scheduling statistics and stored in output "sched". + * Return value: + * 0 : Schedstats successfully retrieved + * -1 : Kernel's schedstats feature not enabled + * -2 : pThread not yet initialized or sched is a NULL pointer + */ +static int osal_thread_sched_retrieve(P_OSAL_THREAD pThread, + P_OSAL_THREAD_SCHEDSTATS sched) +{ +#ifdef CONFIG_SCHEDSTATS + struct sched_entity se; + unsigned long long sec; + unsigned long usec; + + if (!sched) + return -2; + + /* always clear sched to simplify error handling at caller side */ + memset(sched, 0, sizeof(OSAL_THREAD_SCHEDSTATS)); + + if (!__osal_is_valid_thread(pThread)) + return -2; + + memcpy(&se, &pThread->pThread->se, sizeof(struct sched_entity)); + osal_get_local_time(&sec, &usec); + + sched->time = sec*1000 + usec/1000; + sched->exec = se.sum_exec_runtime; + sched->runnable = se.statistics.wait_sum; + sched->iowait = se.statistics.iowait_sum; + + return 0; +#else + /* always clear sched to simplify error handling at caller side */ + if (sched) + memset(sched, 0, sizeof(OSAL_THREAD_SCHEDSTATS)); + return -1; +#endif +} + +/* + * osal_thread_sched_mark + * Record the thread's current schedstats and stored + * in output "schedstats" parameter for profiling at + * later time. + * Return value: + * 0 : Schedstats successfully recorded + * -1 : Kernel's schedstats feature not enabled + * -2 : pThread not yet initialized or invalid parameters + */ +int osal_thread_sched_mark(P_OSAL_THREAD pThread, + P_OSAL_THREAD_SCHEDSTATS schedstats) +{ + return osal_thread_sched_retrieve(pThread, schedstats); +} + +/* + * osal_thread_sched_unmark + * Calculate scheduling statistics against the previously marked point. + * The result will be filled back into the schedstats output parameter. + * Return value: + * 0 : Schedstats successfully calculated + * -1 : Kernel's schedstats feature not enabled + * -2 : pThread not yet initialized or invalid parameters + */ +int osal_thread_sched_unmark(P_OSAL_THREAD pThread, + P_OSAL_THREAD_SCHEDSTATS schedstats) +{ + int ret; + OSAL_THREAD_SCHEDSTATS sched_now; + + if (unlikely(!schedstats)) { + ret = -2; + } else { + ret = osal_thread_sched_retrieve(pThread, &sched_now); + if (ret == 0) { + schedstats->time = sched_now.time - schedstats->time; + schedstats->exec = sched_now.exec - schedstats->exec; + schedstats->runnable = + sched_now.runnable - schedstats->runnable; + schedstats->iowait = + sched_now.iowait - schedstats->iowait; + } + } + return ret; +} + +/* + * OSAL layer Signal Opeartion related APIs + * initialization + * wait for signal + * wait for signal timerout + * raise signal + * destroy a signal + * + */ + +int osal_signal_init(P_OSAL_SIGNAL pSignal) +{ + if (pSignal) { + init_completion(&pSignal->comp); + return 0; + } else { + return -1; + } +} + +int osal_wait_for_signal(P_OSAL_SIGNAL pSignal) +{ + if (pSignal) { + wait_for_completion_interruptible(&pSignal->comp); + return 0; + } else { + return -1; + } +} + +/* + * osal_wait_for_signal_timeout + * + * Wait for a signal to be triggered by the corresponding thread, within the + * expected timeout specified by the signal's timeoutValue. + * When the pThread parameter is specified, the thread's scheduling ability is + * considered, the timeout will be extended when thread cannot acquire CPU + * resource, and will only extend for a number of times specified by the + * signal's timeoutExtension should the situation continues. + * + * Return value: + * 0 : timeout + * >0 : signal triggered + */ +int osal_wait_for_signal_timeout(P_OSAL_SIGNAL pSignal, P_OSAL_THREAD pThread) +{ + OSAL_THREAD_SCHEDSTATS schedstats; + int waitRet; + + /* [ChangeFeature][George] gps driver may be closed by -ERESTARTSYS. + * Avoid using *interruptible" version in order to complete our jobs, + * such as function off gracefully. + */ + if (!pThread || !pThread->pThread) + return wait_for_completion_timeout(&pSignal->comp, + msecs_to_jiffies(pSignal->timeoutValue)); + + do { + osal_thread_sched_mark(pThread, &schedstats); + waitRet = wait_for_completion_timeout(&pSignal->comp, + msecs_to_jiffies(pSignal->timeoutValue)); + osal_thread_sched_unmark(pThread, &schedstats); + + if (waitRet > 0) + break; + + if (schedstats.runnable > schedstats.exec) { + pr_err( + "[E]%s:wait completion timeout, %s cannot get CPU, extension(%d), show backtrace:\n", + __func__, + pThread->threadName, + pSignal->timeoutExtension); + } else { + pr_err( + "[E]%s:wait completion timeout, show %s backtrace:\n", + __func__, + pThread->threadName); + pSignal->timeoutExtension = 0; + } + pr_err( + "[E]%s:\tduration:%llums, sched(x%llu/r%llu/i%llu)\n", + __func__, + schedstats.time, + schedstats.exec, + schedstats.runnable, + schedstats.iowait); + /* + * no need to disginguish combo or A/D die projects + * osal_dump_thread_state will just return if target + * thread does not exist + */ + osal_dump_thread_state("mtk_wmtd"); + osal_dump_thread_state("mtk_wmtd_worker"); + osal_dump_thread_state("btif_rxd"); + osal_dump_thread_state("mtk_stp_psm"); + osal_dump_thread_state("mtk_stp_btm"); + osal_dump_thread_state("stp_sdio_tx_rx"); + } while (pSignal->timeoutExtension--); + return waitRet; +} + +int osal_raise_signal(P_OSAL_SIGNAL pSignal) +{ + if (pSignal) { + complete(&pSignal->comp); + return 0; + } else + return -1; +} + +int osal_signal_active_state(P_OSAL_SIGNAL pSignal) +{ + if (pSignal) + return pSignal->timeoutValue; + else + return -1; +} + +int osal_signal_deinit(P_OSAL_SIGNAL pSignal) +{ + if (pSignal) { + pSignal->timeoutValue = 0; + return 0; + } else + return -1; +} + +/* + * OSAL layer Event Opeartion related APIs + * initialization + * wait for signal + * wait for signal timerout + * raise signal + * destroy a signal + * + */ + +int osal_event_init(P_OSAL_EVENT pEvent) +{ + if (pEvent) { + init_waitqueue_head(&pEvent->waitQueue); + return 0; + } + return -1; +} + +int osal_trigger_event(P_OSAL_EVENT pEvent) +{ + int ret = 0; + + if (pEvent) { + wake_up_interruptible(&pEvent->waitQueue); + return ret; + } + return -1; +} + +int osal_wait_for_event(P_OSAL_EVENT pEvent, + int (*condition)(void *), void *cond_pa) +{ + if (pEvent) + return wait_event_interruptible(pEvent->waitQueue, + condition(cond_pa)); + else + return -1; +} + +int osal_wait_for_event_timeout(P_OSAL_EVENT pEvent, + int (*condition)(void *), void *cond_pa) +{ + if (pEvent) + return wait_event_interruptible_timeout(pEvent->waitQueue, + condition(cond_pa), + msecs_to_jiffies(pEvent->timeoutValue)); + return -1; +} + + +int osal_event_deinit(P_OSAL_EVENT pEvent) +{ + return 0; +} + +long osal_wait_for_event_bit_set(P_OSAL_EVENT pEvent, + unsigned long *pState, unsigned int bitOffset) +{ + unsigned int ms = 0; + + if (pEvent) { + ms = pEvent->timeoutValue; + if (ms != 0) + return wait_event_interruptible_timeout( + pEvent->waitQueue, + test_bit(bitOffset, pState), + msecs_to_jiffies(ms)); + else + return wait_event_interruptible(pEvent->waitQueue, + test_bit(bitOffset, pState)); + } else + return -1; + +} + +long osal_wait_for_event_bit_clr(P_OSAL_EVENT pEvent, + unsigned long *pState, unsigned int bitOffset) +{ + unsigned int ms = 0; + + if (pEvent) { + ms = pEvent->timeoutValue; + if (ms != 0) + return wait_event_interruptible_timeout( + pEvent->waitQueue, + !test_bit(bitOffset, pState), + msecs_to_jiffies(ms)); + else + return wait_event_interruptible(pEvent->waitQueue, + !test_bit(bitOffset, pState)); + } else + return -1; +} + +/* + * bit test and set/clear operations APIs + */ +#if OS_BIT_OPS_SUPPORT +#define osal_bit_op_lock(x) +#define osal_bit_op_unlock(x) +#else + +int osal_bit_op_lock(P_OSAL_UNSLEEPABLE_LOCK pLock) +{ + + return 0; +} + +int osal_bit_op_unlock(P_OSAL_UNSLEEPABLE_LOCK pLock) +{ + + return 0; +} +#endif +int osal_clear_bit(unsigned int bitOffset, P_OSAL_BIT_OP_VAR pData) +{ + osal_bit_op_lock(&(pData->opLock)); + clear_bit(bitOffset, &pData->data); + osal_bit_op_unlock(&(pData->opLock)); + return 0; +} + +int osal_set_bit(unsigned int bitOffset, P_OSAL_BIT_OP_VAR pData) +{ + osal_bit_op_lock(&(pData->opLock)); + set_bit(bitOffset, &pData->data); + osal_bit_op_unlock(&(pData->opLock)); + return 0; +} + +int osal_test_bit(unsigned int bitOffset, P_OSAL_BIT_OP_VAR pData) +{ + unsigned int iRet = 0; + + osal_bit_op_lock(&(pData->opLock)); + iRet = test_bit(bitOffset, &pData->data); + osal_bit_op_unlock(&(pData->opLock)); + return iRet; +} + +int osal_test_and_clear_bit(unsigned int bitOffset, P_OSAL_BIT_OP_VAR pData) +{ + unsigned int iRet = 0; + + osal_bit_op_lock(&(pData->opLock)); + iRet = test_and_clear_bit(bitOffset, &pData->data); + osal_bit_op_unlock(&(pData->opLock)); + return iRet; + +} + +int osal_test_and_set_bit(unsigned int bitOffset, P_OSAL_BIT_OP_VAR pData) +{ + unsigned int iRet = 0; + + osal_bit_op_lock(&(pData->opLock)); + iRet = test_and_set_bit(bitOffset, &pData->data); + osal_bit_op_unlock(&(pData->opLock)); + return iRet; +} + +int _osal_fifo_init(OSAL_FIFO *pFifo, unsigned char *buf, unsigned int size) +{ + struct kfifo *fifo = NULL; + int ret = -1; + + if (!pFifo) { + pr_err("pFifo must be !NULL\n"); + return -1; + } + if (pFifo->pFifoBody) { + pr_err("pFifo->pFifoBody must be NULL\n"); + pr_err("pFifo(0x%p), pFifo->pFifoBody(0x%p)\n", + pFifo, pFifo->pFifoBody); + return -1; + } + fifo = kzalloc(sizeof(struct kfifo), GFP_ATOMIC); + if (!buf) { + /*fifo's buffer is not ready, we allocate automatically */ + ret = kfifo_alloc(fifo, size, /*GFP_KERNEL */ GFP_ATOMIC); + } else { + if (is_power_of_2(size)) { + kfifo_init(fifo, buf, size); + ret = 0; + } else { + kfifo_free(fifo); + fifo = NULL; + ret = -1; + } + } + + pFifo->pFifoBody = fifo; + return (ret < 0) ? (-1) : (0); +} + +int _osal_fifo_deinit(OSAL_FIFO *pFifo) +{ + struct kfifo *fifo = NULL; + + if (!pFifo || !pFifo->pFifoBody) { + pr_err("%s:pFifo = NULL or pFifo->pFifoBody = NULL, error\n", + __func__); + return -1; + } + + fifo = (struct kfifo *)pFifo->pFifoBody; + + if (fifo) + kfifo_free(fifo); + + return 0; +} + +int _osal_fifo_size(OSAL_FIFO *pFifo) +{ + struct kfifo *fifo = NULL; + int ret = 0; + + if (!pFifo || !pFifo->pFifoBody) { + pr_err("%s:pFifo = NULL or pFifo->pFifoBody = NULL, error\n", + __func__); + return -1; + } + + fifo = (struct kfifo *)pFifo->pFifoBody; + + if (fifo) + ret = kfifo_size(fifo); + + return ret; +} + +/*returns unused bytes in fifo*/ +int _osal_fifo_avail_size(OSAL_FIFO *pFifo) +{ + struct kfifo *fifo = NULL; + int ret = 0; + + if (!pFifo || !pFifo->pFifoBody) { + pr_err("%s:pFifo = NULL or pFifo->pFifoBody = NULL, error\n", + __func__); + return -1; + } + + fifo = (struct kfifo *)pFifo->pFifoBody; + + if (fifo) + ret = kfifo_avail(fifo); + + return ret; +} + +/*returns used bytes in fifo*/ +int _osal_fifo_len(OSAL_FIFO *pFifo) +{ + struct kfifo *fifo = NULL; + int ret = 0; + + if (!pFifo || !pFifo->pFifoBody) { + pr_err("%s:pFifo = NULL or pFifo->pFifoBody = NULL, error\n", + __func__); + return -1; + } + + fifo = (struct kfifo *)pFifo->pFifoBody; + + if (fifo) + ret = kfifo_len(fifo); + + return ret; +} + +int _osal_fifo_is_empty(OSAL_FIFO *pFifo) +{ + struct kfifo *fifo = NULL; + int ret = 0; + + if (!pFifo || !pFifo->pFifoBody) { + pr_err("%s:pFifo = NULL or pFifo->pFifoBody = NULL, error\n", + __func__); + return -1; + } + + fifo = (struct kfifo *)pFifo->pFifoBody; + + if (fifo) + ret = kfifo_is_empty(fifo); + + return ret; +} + +int _osal_fifo_is_full(OSAL_FIFO *pFifo) +{ + struct kfifo *fifo = NULL; + int ret = 0; + + if (!pFifo || !pFifo->pFifoBody) { + pr_err("%s:pFifo = NULL or pFifo->pFifoBody = NULL, error\n", + __func__); + return -1; + } + + fifo = (struct kfifo *)pFifo->pFifoBody; + + if (fifo) + ret = kfifo_is_full(fifo); + + return ret; +} + +int _osal_fifo_data_in(OSAL_FIFO *pFifo, const void *buf, unsigned int len) +{ + struct kfifo *fifo = NULL; + int ret = 0; + + if (!pFifo || !pFifo->pFifoBody) { + pr_err("%s:pFifo = NULL or pFifo->pFifoBody = NULL, error\n", + __func__); + return -1; + } + + fifo = (struct kfifo *)pFifo->pFifoBody; + + if (fifo && buf && (len <= _osal_fifo_avail_size(pFifo))) { + ret = kfifo_in(fifo, buf, len); + } else { + pr_err("%s: kfifo_in, error, len = %d, _osal_fifo_avail_size = %d, buf=%p\n", + __func__, len, _osal_fifo_avail_size(pFifo), buf); + + ret = 0; + } + + return ret; +} + +int _osal_fifo_data_out(OSAL_FIFO *pFifo, void *buf, unsigned int len) +{ + struct kfifo *fifo = NULL; + int ret = 0; + + if (!pFifo || !pFifo->pFifoBody) { + pr_err("%s:pFifo = NULL or pFifo->pFifoBody = NULL, error\n" + , __func__); + return -1; + } + + fifo = (struct kfifo *)pFifo->pFifoBody; + + if (fifo && buf && (len <= _osal_fifo_len(pFifo))) { + ret = kfifo_out(fifo, buf, len); + } else { + pr_err("%s: kfifo_out, error, len = %d, osal_fifo_len = %d, buf=%p\n", + __func__, len, _osal_fifo_len(pFifo), buf); + + ret = 0; + } + + return ret; +} + +int _osal_fifo_reset(OSAL_FIFO *pFifo) +{ + struct kfifo *fifo = NULL; + + if (!pFifo || !pFifo->pFifoBody) { + pr_err("%s:pFifo = NULL or pFifo->pFifoBody = NULL, error\n", + __func__); + return -1; + } + + fifo = (struct kfifo *)pFifo->pFifoBody; + + if (fifo) + kfifo_reset(fifo); + + return 0; +} + +int osal_fifo_init(P_OSAL_FIFO pFifo, unsigned char *buffer, unsigned int size) +{ + if (!pFifo) { + pr_err("%s:pFifo = NULL, error\n", __func__); + return -1; + } + + pFifo->FifoInit = _osal_fifo_init; + pFifo->FifoDeInit = _osal_fifo_deinit; + pFifo->FifoSz = _osal_fifo_size; + pFifo->FifoAvailSz = _osal_fifo_avail_size; + pFifo->FifoLen = _osal_fifo_len; + pFifo->FifoIsEmpty = _osal_fifo_is_empty; + pFifo->FifoIsFull = _osal_fifo_is_full; + pFifo->FifoDataIn = _osal_fifo_data_in; + pFifo->FifoDataOut = _osal_fifo_data_out; + pFifo->FifoReset = _osal_fifo_reset; + + if (pFifo->pFifoBody != NULL) { + pr_err("%s:Because pFifo room is avialable, we clear the room and allocate them again.\n", __func__); + pFifo->FifoDeInit(pFifo->pFifoBody); + pFifo->pFifoBody = NULL; + } + + pFifo->FifoInit(pFifo, buffer, size); + + return 0; +} + +void osal_fifo_deinit(P_OSAL_FIFO pFifo) +{ + if (pFifo) + pFifo->FifoDeInit(pFifo); + else { + pr_err("%s:pFifo = NULL, error\n", __func__); + return; + } + kfree(pFifo->pFifoBody); +} + +int osal_fifo_reset(P_OSAL_FIFO pFifo) +{ + int ret = -1; + + if (pFifo) { + ret = pFifo->FifoReset(pFifo); + } else { + pr_err("%s:pFifo = NULL, error\n", __func__); + ret = -1; + } + return ret; +} + +unsigned int osal_fifo_in(P_OSAL_FIFO pFifo, + unsigned char *buffer, unsigned int size) +{ + unsigned int ret = 0; + + if (pFifo) { + ret = pFifo->FifoDataIn(pFifo, buffer, size); + } else { + pr_err("%s:pFifo = NULL, error\n", __func__); + ret = 0; + } + + return ret; +} + +unsigned int osal_fifo_out(P_OSAL_FIFO pFifo, + unsigned char *buffer, unsigned int size) +{ + unsigned int ret = 0; + + if (pFifo) { + ret = pFifo->FifoDataOut(pFifo, buffer, size); + } else { + pr_err("%s:pFifo = NULL, error\n", __func__); + ret = 0; + } + + return ret; +} + +unsigned int osal_fifo_len(P_OSAL_FIFO pFifo) +{ + unsigned int ret = 0; + + if (pFifo) { + ret = pFifo->FifoLen(pFifo); + } else { + pr_err("%s:pFifo = NULL, error\n", __func__); + ret = 0; + } + + return ret; +} + +unsigned int osal_fifo_sz(P_OSAL_FIFO pFifo) +{ + unsigned int ret = 0; + + if (pFifo) { + ret = pFifo->FifoSz(pFifo); + } else { + pr_err("%s:pFifo = NULL, error\n", __func__); + ret = 0; + } + + return ret; +} + +unsigned int osal_fifo_avail(P_OSAL_FIFO pFifo) +{ + unsigned int ret = 0; + + if (pFifo) { + ret = pFifo->FifoAvailSz(pFifo); + } else { + pr_err("%s:pFifo = NULL, error\n", __func__); + ret = 0; + } + + return ret; +} + +unsigned int osal_fifo_is_empty(P_OSAL_FIFO pFifo) +{ + unsigned int ret = 0; + + if (pFifo) { + ret = pFifo->FifoIsEmpty(pFifo); + } else { + pr_err("%s:pFifo = NULL, error\n", __func__); + ret = 0; + } + + return ret; +} + +unsigned int osal_fifo_is_full(P_OSAL_FIFO pFifo) +{ + unsigned int ret = 0; + + if (pFifo) { + ret = pFifo->FifoIsFull(pFifo); + } else { + pr_err("%s:pFifo = NULL, error\n", __func__); + ret = 0; + } + return ret; +} + +/* + * sleepable lock operations APIs + * init + * lock + * unlock + * destroy + * + */ +#if !defined(CONFIG_PROVE_LOCKING) +int osal_unsleepable_lock_init(P_OSAL_UNSLEEPABLE_LOCK pUSL) +{ + spin_lock_init(&(pUSL->lock)); + return 0; +} +#endif + +int osal_lock_unsleepable_lock(P_OSAL_UNSLEEPABLE_LOCK pUSL) +{ + spin_lock_irqsave(&(pUSL->lock), pUSL->flag); + return 0; +} + +int osal_unlock_unsleepable_lock(P_OSAL_UNSLEEPABLE_LOCK pUSL) +{ + spin_unlock_irqrestore(&(pUSL->lock), pUSL->flag); + return 0; +} + +int osal_unsleepable_lock_deinit(P_OSAL_UNSLEEPABLE_LOCK pUSL) +{ + return 0; +} + +/* + * unsleepable operations APIs + * init + * lock + * unlock + * destroy + * + */ + +#if !defined(CONFIG_PROVE_LOCKING) +int osal_sleepable_lock_init(P_OSAL_SLEEPABLE_LOCK pSL) +{ + mutex_init(&pSL->lock); + return 0; +} +#endif + +int osal_lock_sleepable_lock(P_OSAL_SLEEPABLE_LOCK pSL) +{ + return mutex_lock_killable(&pSL->lock); +} + +int osal_unlock_sleepable_lock(P_OSAL_SLEEPABLE_LOCK pSL) +{ + mutex_unlock(&pSL->lock); + return 0; +} + +int osal_trylock_sleepable_lock(P_OSAL_SLEEPABLE_LOCK pSL) +{ + return mutex_trylock(&pSL->lock); +} + +int osal_sleepable_lock_deinit(P_OSAL_SLEEPABLE_LOCK pSL) +{ + mutex_destroy(&pSL->lock); + return 0; +} + +int osal_sleep_ms(unsigned int ms) +{ + msleep(ms); + return 0; +} + +int osal_udelay(unsigned int us) +{ + udelay(us); + return 0; +} + +int osal_usleep_range(unsigned long min, unsigned long max) +{ + usleep_range(min, max); + return 0; +} + +int osal_gettimeofday(int *sec, int *usec) +{ + int ret = 0; + struct timespec64 now; + + ktime_get_real_ts64(&now); + + if (sec != NULL) + *sec = now.tv_sec; + else + ret = -1; + + if (usec != NULL) + *usec = (now.tv_nsec / 1000); + else + ret = -1; + + return ret; +} + +int osal_gettimeofday2(struct timeval *tv) +{ + int ret = 0; + struct timespec64 now; + + if (tv == NULL) + return -1; + + ktime_get_real_ts64(&now); + tv->tv_sec = now.tv_sec; + tv->tv_usec = (now.tv_nsec / 1000); + return ret; +} + +void osal_get_local_time(unsigned long long *sec, unsigned long *nsec) +{ + if (sec != NULL && nsec != NULL) { + *sec = local_clock(); + *nsec = do_div(*sec, 1000000000)/1000; + } else + pr_err("The input parameters error when get local time\n"); +} + +unsigned long long osal_elapsed_us(unsigned long long ts, unsigned long usec) +{ + unsigned long long current_ts = 0; + unsigned long current_usec = 0; + + osal_get_local_time(¤t_ts, ¤t_usec); + return (current_ts*1000000 + current_usec) - (ts*1000000 + usec); +} + +void osal_buffer_dump(const unsigned char *buf, + const unsigned char *title, const unsigned int len, + const unsigned int limit) +{ + int k; + unsigned int dump_len; + char str[DBG_LOG_STR_SIZE] = {""}; + int strlen = 0; + + pr_info("[%s] len=%d, limit=%d, start dump\n", title, len, limit); + + dump_len = ((limit != 0) && (len > limit)) ? limit : len; + for (k = 0; k < dump_len; k++) { + if ((k+1) % 16 != 0) { + strlen += osal_snprintf(str + strlen, DBG_LOG_STR_SIZE - strlen, + "%02x ", buf[k]); + } else { + strlen += osal_snprintf(str + strlen, DBG_LOG_STR_SIZE - strlen, + "%02x ", buf[k]); + + pr_info("%s", str); + strlen = 0; + } + } + if (k % 16 != 0) + pr_info("%s\n", str); + + pr_info("end of dump\n"); +} + +void osal_buffer_dump_data(const unsigned int *buf, + const unsigned char *title, const unsigned int len, + const unsigned int limit, + const int flag) +{ + int k; + unsigned int dump_len; + char str[DBG_LOG_STR_SIZE] = {""}; + int strlen = 0; + + dump_len = ((limit != 0) && (len > limit)) ? limit : len; + for (k = 0; k < dump_len; k++) { + if (((k+1) % 8 != 0) && (k < (dump_len - 1))) { + strlen += osal_snprintf(str + strlen, DBG_LOG_STR_SIZE - strlen, + "0x%08x,", buf[k]); + } else { + strlen += osal_snprintf(str + strlen, DBG_LOG_STR_SIZE - strlen, + "0x%08x,", buf[k]); + if (flag) + osal_ftrace_print("%s%s", title, str); + else + pr_info("%s%s", title, str); + strlen = 0; + } + } + if (k % 8 != 0) { + if (flag) + osal_ftrace_print("%s%s", title, str); + else + pr_info("%s%s", title, str); + } +} + +unsigned int osal_op_get_id(P_OSAL_OP pOp) +{ + return (pOp) ? pOp->op.opId : 0xFFFFFFFF; +} + +MTK_CONN_BOOL osal_op_is_wait_for_signal(P_OSAL_OP pOp) +{ + return (pOp && pOp->signal.timeoutValue) + ? MTK_CONN_BOOL_TRUE : MTK_CONN_BOOL_FALSE; +} + +void osal_op_raise_signal(P_OSAL_OP pOp, int result) +{ + if (pOp) { + pOp->result = result; + osal_raise_signal(&pOp->signal); + } +} + +int osal_ftrace_print(const char *str, ...) +{ +#ifdef CONFIG_TRACING + va_list args; + char tempString[DBG_LOG_STR_SIZE]; + + if (ftrace_flag) { + va_start(args, str); + vsnprintf(tempString, DBG_LOG_STR_SIZE, str, args); + va_end(args); + + trace_printk("%s\n", tempString); + } +#endif + return 0; +} + +int osal_ftrace_print_ctrl(int flag) +{ +#ifdef CONFIG_TRACING + if (flag) + ftrace_flag = 1; + else + ftrace_flag = 0; +#endif + return 0; +} + +void osal_set_op_result(P_OSAL_OP pOp, int result) +{ + if (pOp) + pOp->result = result; + +} + +static void _osal_opq_dump(const char *qName, P_OSAL_OP_Q pOpQ) +{ + /* Line format: + * [LogicalIdx(PhysicalIdx)]Address:OpId(Ref)(Result)-Info-OpData0,OpData1,OpData2,OpData3,OpData5_ + * [LogicalIdx] max 10+2=12 chars (decimal) + * (PhysicalIdx) max 10+2=12 chars (decimal) + * Address: max 16+1=17 chars (hex) + * OpId max 10 chars (decimal) + * (Ref) max 2+2=4 chars (should only be 1 digit, reserve 2 in case of negative number) + * (Result) max 11+2=13 chars (signed decimal) + * -Info- max 8+2=10 chars (hex) + * OpData, max 16+1=17 chars (hex) + */ +#define OPQ_DUMP_OP_PER_LINE 1 +#define OPQ_DUMP_OPDATA_PER_OP 6 +#define OPQ_DUMP_OP_BUF_SIZE (12 + 12 + 17 + 10 + 4 + 13 + 10 + (17 * (OPQ_DUMP_OPDATA_PER_OP)) + 1) +#define OPQ_DUMP_LINE_BUF_SIZE ((OPQ_DUMP_OP_BUF_SIZE * OPQ_DUMP_OP_PER_LINE) + 1) + unsigned int rd; + unsigned int wt; + unsigned int idx = 0; + unsigned int opDataIdx; + unsigned int idxInBuf; + int printed; + P_OSAL_OP op; + char buf[OPQ_DUMP_LINE_BUF_SIZE]; + + rd = pOpQ->read; + wt = pOpQ->write; + + pr_info("%s(%p), sz:%u/%u, rd:%u, wt:%u\n", + qName, pOpQ, RB_COUNT(pOpQ), RB_SIZE(pOpQ), rd, wt); + while (rd != wt && idx < RB_SIZE(pOpQ)) { + idxInBuf = idx % OPQ_DUMP_OP_PER_LINE; + op = pOpQ->queue[rd & RB_MASK(pOpQ)]; + + if (idxInBuf == 0) { + printed = 0; + buf[0] = 0; + } + + if (op) { + printed += snprintf(buf + printed, OPQ_DUMP_LINE_BUF_SIZE - printed, + "[%u(%u)]%p:%u(%d)(%d)-%u-", + idx, + (rd & RB_MASK(pOpQ)), + op, + op->op.opId, + atomic_read(&op->ref_count), + op->result, + op->op.u4InfoBit); + for (opDataIdx = 0; opDataIdx < OPQ_DUMP_OPDATA_PER_OP; opDataIdx++) + printed += snprintf(buf + printed, OPQ_DUMP_LINE_BUF_SIZE - printed, + "%zx,", op->op.au4OpData[opDataIdx]); + buf[printed-1] = ' '; + } else { + printed += snprintf(buf + printed, OPQ_DUMP_LINE_BUF_SIZE - printed, + "[%u(%u)]%p ", idx, (rd & RB_MASK(pOpQ)), op); + } + buf[printed++] = ' '; + + if (idxInBuf == OPQ_DUMP_OP_PER_LINE - 1 || rd == wt - 1) { + buf[printed - 1] = 0; + pr_info("%s\n", buf); + } + rd++; + idx++; + } +} + +void osal_opq_dump(const char *qName, P_OSAL_OP_Q pOpQ) +{ + int err; + + err = osal_lock_sleepable_lock(&pOpQ->sLock); + if (err) { + pr_info("Failed to lock queue (%d)\n", err); + return; + } + + _osal_opq_dump(qName, pOpQ); + + osal_unlock_sleepable_lock(&pOpQ->sLock); +} + +void osal_opq_dump_locked(const char *qName, P_OSAL_OP_Q pOpQ) +{ + _osal_opq_dump(qName, pOpQ); +} + +MTK_CONN_BOOL osal_opq_has_op(P_OSAL_OP_Q pOpQ, P_OSAL_OP pOp) +{ + unsigned int rd; + unsigned int wt; + P_OSAL_OP op; + + rd = pOpQ->read; + wt = pOpQ->write; + + while (rd != wt) { + op = pOpQ->queue[rd & RB_MASK(pOpQ)]; + if (op == pOp) + return MTK_CONN_BOOL_TRUE; + rd++; + } + return MTK_CONN_BOOL_FALSE; +} + +static void osal_op_history_print_work(struct work_struct *work) +{ + struct osal_op_history *log_history + = container_of(work, struct osal_op_history, dump_work); + struct ring *ring_buffer = &log_history->dump_ring_buffer; + struct ring_segment seg; + struct osal_op_history_entry *queue = ring_buffer->base; + struct osal_op_history_entry *entry; + int index = 0; + + if (queue == NULL) { + pr_info("queue shouldn't be NULL, %s", log_history->name); + return; + } + + if (RING_EMPTY(ring_buffer)) + pr_info("History of %s is empty.\n", log_history->name); + + RING_READ_FOR_EACH_ITEM(RING_SIZE(ring_buffer), seg, ring_buffer) { + index = seg.ring_pt - ring_buffer->base; + entry = &queue[index]; + pr_info("(%llu.%06lu) %s: pOp(%p):%u(%d)-%x-%zx,%zx,%zx,%zx\n", + entry->ts, + entry->usec, + log_history->name, + entry->opbuf_address, + entry->op_id, + entry->opbuf_ref_count, + entry->op_info_bit, + entry->param_0, + entry->param_1, + entry->param_2, + entry->param_3); + } + kfree(queue); + ring_buffer->base = NULL; +} + +void osal_op_history_init(struct osal_op_history *log_history, int queue_size) +{ + int size = queue_size * sizeof(struct osal_op_history_entry); + + spin_lock_init(&(log_history->lock)); + + log_history->queue = kzalloc(size, GFP_ATOMIC); + if (log_history->queue == NULL) + return; + + /* queue_size must be power of 2 */ + ring_init( + &log_history->queue, + queue_size, + 0, + 0, + &log_history->ring_buffer); + + INIT_WORK(&log_history->dump_work, osal_op_history_print_work); +} + +void osal_op_history_print(struct osal_op_history *log_history, char *name) +{ + struct osal_op_history_entry *queue; + struct ring *ring_buffer, *dump_ring_buffer; + int queue_size; + unsigned long flags; + struct work_struct *work = &log_history->dump_work; + spinlock_t *lock = &(log_history->lock); + + if (log_history->queue == NULL) { + pr_info("Queue is NULL, name: %s\n", name); + return; + } + + ring_buffer = &log_history->ring_buffer; + queue_size = sizeof(struct osal_op_history_entry) + * RING_SIZE(ring_buffer); + + /* Allocate memory before getting lock to save time of holding lock */ + queue = kmalloc(queue_size, GFP_KERNEL); + if (queue == NULL) + return; + + dump_ring_buffer = &log_history->dump_ring_buffer; + + spin_lock_irqsave(lock, flags); + if (dump_ring_buffer->base != NULL) { + spin_unlock_irqrestore(lock, flags); + kfree(queue); + pr_info("print is ongoing: %s\n", name); + return; + } + + osal_snprintf(log_history->name, sizeof(log_history->name), "%s", name); + osal_memcpy(queue, log_history->queue, queue_size); + osal_memcpy(dump_ring_buffer, ring_buffer, sizeof(struct ring)); + /* assign value to base after memory copy */ + dump_ring_buffer->base = queue; + spin_unlock_irqrestore(lock, flags); + schedule_work(work); +} + +void osal_op_history_save(struct osal_op_history *log_history, P_OSAL_OP pOp) +{ + struct osal_op_history_entry *entry = NULL; + struct ring_segment seg; + int index; + unsigned long long sec = 0; + unsigned long usec = 0; + unsigned long flags; + + if (log_history->queue == NULL) + return; + + osal_get_local_time(&sec, &usec); + + spin_lock_irqsave(&(log_history->lock), flags); + RING_OVERWRITE_FOR_EACH(1, seg, &log_history->ring_buffer) { + index = seg.ring_pt - log_history->ring_buffer.base; + entry = &log_history->queue[index]; + } + + if (entry == NULL) { + pr_info("Entry is null, size %d\n", + RING_SIZE(&log_history->ring_buffer)); + spin_unlock_irqrestore(&(log_history->lock), flags); + return; + } + + entry->opbuf_address = pOp; + entry->op_id = pOp->op.opId; + entry->opbuf_ref_count = atomic_read(&pOp->ref_count); + entry->op_info_bit = pOp->op.u4InfoBit; + entry->param_0 = pOp->op.au4OpData[0]; + entry->param_1 = pOp->op.au4OpData[1]; + entry->param_2 = pOp->op.au4OpData[2]; + entry->param_3 = pOp->op.au4OpData[3]; + entry->ts = sec; + entry->usec = usec; + spin_unlock_irqrestore(&(log_history->lock), flags); +} + diff --git a/package/conninfra/src/base/ring.c b/package/conninfra/src/base/ring.c new file mode 100644 index 0000000..24cad3b --- /dev/null +++ b/package/conninfra/src/base/ring.c @@ -0,0 +1,150 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +#include "ring.h" +#include +#include +#include + + +void ring_init(void *base, unsigned int max_size, unsigned int read, + unsigned int write, struct ring *ring) +{ + WARN_ON(!base); + + /* making sure max_size is power of 2 */ + WARN_ON(!max_size || (max_size & (max_size - 1))); + + /* making sure write largger than read */ + WARN_ON(read > write); + + ring->base = base; + ring->read = read; + ring->write = write; + ring->max_size = max_size; +} + +void ring_dump(const char *title, struct ring *ring) +{ + pr_info("[%s] ring:{write=%d, read=%d, max_size=%d}\n", + title, ring->write, ring->read, ring->max_size); +} + +void ring_dump_segment(const char *title, struct ring_segment *seg) +{ + pr_info("[%s] seg:{ring_pt=0x%p, data_pos=%d, sz=%d, remain=%d}\n", + title, seg->ring_pt, seg->data_pos, + seg->sz, seg->remain); +} + +/* + * Function prepares the ring_segment and + * returns the number of valid bytes for read. + */ +unsigned int ring_read_prepare(unsigned int sz, + struct ring_segment *seg, + struct ring *ring) +{ + unsigned int wt = ring->write; + unsigned int rd = ring->read; + + memset(seg, 0, sizeof(struct ring_segment)); + if (sz > wt - rd) + sz = wt - rd; + seg->remain = sz; + /* ring_dump(__func__, ring); */ + /* ring_dump_segment(__func__, seg); */ + return seg->remain; +} + +/* + * Function prepares the ring_segment and + * returns the number of bytes available for write. + */ +unsigned int ring_write_prepare(unsigned int sz, + struct ring_segment *seg, + struct ring *ring) +{ + unsigned int wt = ring->write; + unsigned int rd = ring->read; + + memset(seg, 0, sizeof(struct ring_segment)); + if (sz > ring->max_size - (wt - rd)) + sz = ring->max_size - (wt - rd); + seg->remain = sz; + /* ring_dump(__func__, ring); */ + /* ring_dump_segment(__func__, seg); */ + return seg->remain; +} + +unsigned int ring_overwrite_prepare(unsigned int sz, struct ring_segment *seg, + struct ring *ring) +{ + unsigned int wt = ring->write; + unsigned int rd = ring->read; + + memset(seg, 0, sizeof(struct ring_segment)); + if (sz > ring->max_size - (wt - rd)) + ring->read += sz - (ring->max_size - (wt - rd)); + seg->remain = sz; + /* ring_dump(__func__, ring); */ + /* ring_dump_segment(__func__, seg); */ + return seg->remain; +} + +void __ring_segment_prepare(unsigned int from, unsigned int sz, + struct ring_segment *seg, + struct ring *ring) +{ + unsigned int ring_pos = from & (ring->max_size - 1); + + seg->ring_pt = ring->base + ring_pos; + seg->data_pos = (seg->sz ? seg->data_pos + seg->sz : 0); + if (ring_pos + sz <= ring->max_size) + seg->sz = sz; + else + seg->sz = ring->max_size - ring_pos; + seg->remain -= seg->sz; + /* ring_dump(__func__, ring); */ + /* ring_dump_segment(__func__, seg); */ +} + +void _ring_segment_prepare(unsigned int from, + struct ring_segment *seg, + struct ring *ring) +{ + __ring_segment_prepare(from, seg->remain, seg, ring); +} + +void _ring_segment_prepare_item(unsigned int from, + struct ring_segment *seg, + struct ring *ring) +{ + unsigned int size; + + size = (seg->remain ? 1 : 0); + __ring_segment_prepare(from, size, seg, ring); +} + +void _ring_read_commit(struct ring_segment *seg, struct ring *ring) +{ + ring->read += seg->sz; + /* ring_dump(__func__, ring); */ + /* ring_dump_segment(__func__, seg); */ +} +void _ring_write_commit(struct ring_segment *seg, struct ring *ring) +{ + ring->write += seg->sz; + /* ring_dump(__func__, ring); */ + /* ring_dump_segment(__func__, seg); */ +} + diff --git a/package/conninfra/src/core/conninfra_core.c b/package/conninfra/src/core/conninfra_core.c new file mode 100644 index 0000000..0f0a771 --- /dev/null +++ b/package/conninfra/src/core/conninfra_core.c @@ -0,0 +1,1244 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#define pr_fmt(fmt) KBUILD_MODNAME "@(%s:%d) " fmt, __func__, __LINE__ + +#include "consys_hw.h" +#include "conninfra_core.h" +#include "msg_thread.h" +#include "consys_reg_mng.h" + +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ +#define CONNINFRA_EVENT_TIMEOUT 3000 +#define CONNINFRA_RESET_TIMEOUT 500 + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ +#include + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + +static int opfunc_power_on(struct msg_op_data *op); +static int opfunc_power_off(struct msg_op_data *op); +static int opfunc_chip_rst(struct msg_op_data *op); +static int opfunc_rfspi_read(struct msg_op_data *op); +static int opfunc_rfspi_write(struct msg_op_data *op); +static int opfunc_adie_top_ck_en_on(struct msg_op_data *op); +static int opfunc_adie_top_ck_en_off(struct msg_op_data *op); +static int opfunc_spi_clock_switch(struct msg_op_data *op); +static int opfunc_force_conninfra_wakeup(struct msg_op_data *op); +static int opfunc_force_conninfra_sleep(struct msg_op_data *op); +static int opfunc_dump_power_state(struct msg_op_data *op); +static int opfunc_subdrv_pre_reset(struct msg_op_data *op); +static int opfunc_subdrv_post_reset(struct msg_op_data *op); +static void _conninfra_core_update_rst_status(enum chip_rst_status status); + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +struct conninfra_ctx g_conninfra_ctx; + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ +static const msg_opid_func conninfra_core_opfunc[] = { + [CONNINFRA_OPID_PWR_ON] = opfunc_power_on, + [CONNINFRA_OPID_PWR_OFF] = opfunc_power_off, + [CONNINFRA_OPID_RFSPI_READ] = opfunc_rfspi_read, + [CONNINFRA_OPID_RFSPI_WRITE] = opfunc_rfspi_write, + [CONNINFRA_OPID_ADIE_TOP_CK_EN_ON] = opfunc_adie_top_ck_en_on, + [CONNINFRA_OPID_ADIE_TOP_CK_EN_OFF] = opfunc_adie_top_ck_en_off, + [CONNINFRA_OPID_SPI_CLOCK_SWITCH] = opfunc_spi_clock_switch, + [CONNINFRA_OPID_FORCE_CONNINFRA_WAKUP] = opfunc_force_conninfra_wakeup, + [CONNINFRA_OPID_FORCE_CONNINFRA_SLEEP] = opfunc_force_conninfra_sleep, + [CONNINFRA_OPID_DUMP_POWER_STATE] = opfunc_dump_power_state, +}; + +static const msg_opid_func conninfra_core_cb_opfunc[] = { + [CONNINFRA_CB_OPID_CHIP_RST] = opfunc_chip_rst, +}; + + +/* subsys ops */ +static char *drv_thread_name[] = { + [CONNDRV_TYPE_BT] = "sub_bt_thrd", + [CONNDRV_TYPE_FM] = "sub_fm_thrd", + [CONNDRV_TYPE_GPS] = "sub_gps_thrd", + [CONNDRV_TYPE_WIFI] = "sub_wifi_thrd", + [CONNDRV_TYPE_CONNINFRA] = "sub_conninfra_thrd", +}; + +static char *drv_name[] = { + [CONNDRV_TYPE_BT] = "BT", + [CONNDRV_TYPE_FM] = "FM", + [CONNDRV_TYPE_GPS] = "GPS", + [CONNDRV_TYPE_WIFI] = "WIFI", + [CONNDRV_TYPE_CONNINFRA] = "CONNINFRA", +}; + +typedef enum { + INFRA_SUBDRV_OPID_PRE_RESET = 0, + INFRA_SUBDRV_OPID_POST_RESET = 1, + INFRA_SUBDRV_OPID_MAX +} infra_subdrv_op; + + +static const msg_opid_func infra_subdrv_opfunc[] = { + [INFRA_SUBDRV_OPID_PRE_RESET] = opfunc_subdrv_pre_reset, + [INFRA_SUBDRV_OPID_POST_RESET] = opfunc_subdrv_post_reset, +}; + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +static void reset_chip_rst_trg_data(void) +{ + g_conninfra_ctx.trg_drv = CONNDRV_TYPE_MAX; + memset(g_conninfra_ctx.trg_reason, '\0', CHIP_RST_REASON_MAX_LEN); +} + +static unsigned long timeval_to_ms(struct timeval *begin, struct timeval *end) +{ + unsigned long time_diff; + + time_diff = (end->tv_sec - begin->tv_sec) * 1000; + time_diff += (end->tv_usec - begin->tv_usec) / 1000; + + return time_diff; +} + +static unsigned int opfunc_get_current_status(void) +{ + unsigned int ret = 0; + unsigned int i; + + for (i = 0; i < CONNDRV_TYPE_MAX; i++) { + ret |= (g_conninfra_ctx.drv_inst[i].drv_status << i); + } + + return ret; +} + +static void opfunc_vcn_control_internal(unsigned int drv_type, bool on) +{ + /* VCNx enable */ + switch (drv_type) { + case CONNDRV_TYPE_BT: + consys_hw_bt_power_ctl(on); + break; + case CONNDRV_TYPE_FM: + consys_hw_fm_power_ctl(on); + break; + case CONNDRV_TYPE_GPS: + consys_hw_gps_power_ctl(on); + break; + case CONNDRV_TYPE_WIFI: + consys_hw_wifi_power_ctl(on); + break; + case CONNDRV_TYPE_CONNINFRA: + break; + default: + pr_err("Wrong parameter: drv_type(%d)\n", drv_type); + break; + } +} + +static int opfunc_power_on_internal(unsigned int drv_type) +{ + int ret; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + + /* Check abnormal type */ + if (drv_type >= CONNDRV_TYPE_MAX) { + pr_err("abnormal Fun(%d)\n", drv_type); + return -EINVAL; + } + + /* Check abnormal state */ + if ((g_conninfra_ctx.drv_inst[drv_type].drv_status < DRV_STS_POWER_OFF) + || (g_conninfra_ctx.drv_inst[drv_type].drv_status >= DRV_STS_MAX)) { + pr_err("func(%d) status[0x%x] abnormal\n", drv_type, + g_conninfra_ctx.drv_inst[drv_type].drv_status); + return -EINVAL; + } + + ret = osal_lock_sleepable_lock(&infra_ctx->core_lock); + if (ret) { + pr_err("core_lock fail!!\n"); + return ret; + } + + /* check if func already on */ + if (g_conninfra_ctx.drv_inst[drv_type].drv_status == DRV_STS_POWER_ON) { + pr_warn("func(%d) already on\n", drv_type); + osal_unlock_sleepable_lock(&infra_ctx->core_lock); + return 0; + } + + ret = consys_hw_pwr_on(opfunc_get_current_status(), drv_type); + if (ret) { + pr_err("Conninfra power on fail. drv(%d) ret=(%d)\n", + drv_type, ret); + osal_unlock_sleepable_lock(&infra_ctx->core_lock); + return -3; + } + + /* POWER ON SEQUENCE */ + g_conninfra_ctx.infra_drv_status = DRV_STS_POWER_ON; + g_conninfra_ctx.drv_inst[drv_type].drv_status = DRV_STS_POWER_ON; + + /* VCNx enable */ + opfunc_vcn_control_internal(drv_type, true); + + pr_info("[Conninfra Pwr On] BT=[%d] FM=[%d] GPS=[%d] WF=[%d] CONNINFRA=[%d]\n", + infra_ctx->drv_inst[CONNDRV_TYPE_BT].drv_status, + infra_ctx->drv_inst[CONNDRV_TYPE_FM].drv_status, + infra_ctx->drv_inst[CONNDRV_TYPE_GPS].drv_status, + infra_ctx->drv_inst[CONNDRV_TYPE_WIFI].drv_status, + infra_ctx->drv_inst[CONNDRV_TYPE_CONNINFRA].drv_status); + + osal_unlock_sleepable_lock(&infra_ctx->core_lock); + + return 0; +} + +static int opfunc_power_on(struct msg_op_data *op) +{ + unsigned int drv_type = op->op_data[0]; + + return opfunc_power_on_internal(drv_type); +} + +static int opfunc_power_off_internal(unsigned int drv_type) +{ + int i, ret; + bool try_power_off = true; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + unsigned int curr_status = opfunc_get_current_status(); + + /* Check abnormal type */ + if (drv_type >= CONNDRV_TYPE_MAX) { + pr_err("abnormal Fun(%d)\n", drv_type); + return -EINVAL; + } + + ret = osal_lock_sleepable_lock(&infra_ctx->core_lock); + if (ret) { + pr_err("core_lock fail!!\n"); + return ret; + } + + /* Check abnormal state */ + if ((g_conninfra_ctx.drv_inst[drv_type].drv_status < DRV_STS_POWER_OFF) + || (g_conninfra_ctx.drv_inst[drv_type].drv_status >= DRV_STS_MAX)) { + pr_err("func(%d) status[0x%x] abnormal\n", drv_type, + g_conninfra_ctx.drv_inst[drv_type].drv_status); + osal_unlock_sleepable_lock(&infra_ctx->core_lock); + return -2; + } + + /* Special case for force power off */ + if (drv_type == CONNDRV_TYPE_CONNINFRA) { + if (g_conninfra_ctx.infra_drv_status == DRV_STS_POWER_OFF) { + pr_warn("Connsys already off, do nothing for force off\n"); + return 0; + } + /* Turn off subsys VCN and update record */ + for (i = 0; i < CONNDRV_TYPE_MAX; i++) { + if (g_conninfra_ctx.drv_inst[i].drv_status == DRV_STS_POWER_ON) { + opfunc_vcn_control_internal(i, false); + g_conninfra_ctx.drv_inst[i].drv_status = DRV_STS_POWER_OFF; + } + } + /* POWER OFF SEQUENCE */ + ret = consys_hw_pwr_off(0, drv_type); + /* For force power off operation, ignore err code */ + if (ret) + pr_err("Force power off fail. ret=%d\n", ret); + try_power_off = true; + } else { + /* check if func already off */ + if (g_conninfra_ctx.drv_inst[drv_type].drv_status + == DRV_STS_POWER_OFF) { + pr_warn("func(%d) already off\n", drv_type); + osal_unlock_sleepable_lock(&infra_ctx->core_lock); + return 0; + } + /* VCNx disable */ + opfunc_vcn_control_internal(drv_type, false); + g_conninfra_ctx.drv_inst[drv_type].drv_status = DRV_STS_POWER_OFF; + /* is there subsys on ? */ + for (i = 0; i < CONNDRV_TYPE_MAX; i++) + if (g_conninfra_ctx.drv_inst[i].drv_status == DRV_STS_POWER_ON) + try_power_off = false; + + /* POWER OFF SEQUENCE */ + ret = consys_hw_pwr_off(curr_status, drv_type); + if (ret) { + pr_err("Conninfra power on fail. drv(%d) ret=(%d)\n", + drv_type, ret); + osal_unlock_sleepable_lock(&infra_ctx->core_lock); + return -3; + } + } + + if (try_power_off) + g_conninfra_ctx.infra_drv_status = DRV_STS_POWER_OFF; + + pr_info("[Conninfra Pwr Off] Conninfra=[%d] BT=[%d] FM=[%d] GPS=[%d] WF=[%d]\n", + infra_ctx->infra_drv_status, + infra_ctx->drv_inst[CONNDRV_TYPE_BT].drv_status, + infra_ctx->drv_inst[CONNDRV_TYPE_FM].drv_status, + infra_ctx->drv_inst[CONNDRV_TYPE_GPS].drv_status, + infra_ctx->drv_inst[CONNDRV_TYPE_WIFI].drv_status); + + osal_unlock_sleepable_lock(&infra_ctx->core_lock); + return 0; +} + +static int opfunc_power_off(struct msg_op_data *op) +{ + unsigned int drv_type = op->op_data[0]; + + return opfunc_power_off_internal(drv_type); +} + +static int opfunc_chip_rst(struct msg_op_data *op) +{ + int i, ret, cur_rst_state; + struct subsys_drv_inst *drv_inst; + unsigned int drv_pwr_state[CONNDRV_TYPE_MAX]; + const unsigned int subdrv_all_done = (0x1 << CONNDRV_TYPE_MAX) - 1; + struct timeval pre_begin, pre_end, reset_end, done_end; + + if (g_conninfra_ctx.infra_drv_status == DRV_STS_POWER_OFF) { + pr_info("No subsys on, just return\n"); + _conninfra_core_update_rst_status(CHIP_RST_NONE); + return 0; + } + + osal_gettimeofday2(&pre_begin); + + atomic_set(&g_conninfra_ctx.rst_state, 0); + sema_init(&g_conninfra_ctx.rst_sema, 1); + + _conninfra_core_update_rst_status(CHIP_RST_PRE_CB); + + /* pre */ + for (i = 0; i < CONNDRV_TYPE_MAX; i++) { + drv_inst = &g_conninfra_ctx.drv_inst[i]; + drv_pwr_state[i] = drv_inst->drv_status; + pr_info("subsys %d is %d\n", i, drv_inst->drv_status); + ret = msg_thread_send_1(&drv_inst->msg_ctx, INFRA_SUBDRV_OPID_PRE_RESET, i); + } + + pr_info("[chip_rst] pre vvvvvvvvvvvvv\n"); + while (atomic_read(&g_conninfra_ctx.rst_state) != subdrv_all_done) { + ret = down_timeout(&g_conninfra_ctx.rst_sema, msecs_to_jiffies(CONNINFRA_RESET_TIMEOUT)); + pr_info("sema ret=[%d]\n", ret); + if (ret == 0) + continue; + cur_rst_state = atomic_read(&g_conninfra_ctx.rst_state); + pr_info("cur_rst state =[%d]\n", cur_rst_state); + for (i = 0; i < CONNDRV_TYPE_MAX; i++) { + if ((cur_rst_state & (0x1 << i)) == 0) { + pr_info("[chip_rst] [%s] pre-callback is not back\n", drv_thread_name[i]); + } + } + } + + _conninfra_core_update_rst_status(CHIP_RST_RESET); + + osal_gettimeofday2(&pre_end); + + pr_info("[chip_rst] reset ++++++++++++\n"); + /*******************************************************/ + /* reset */ + /* call consys_hw */ + /*******************************************************/ + /* Special power-off function, turn off connsys directly */ + ret = opfunc_power_off_internal(CONNDRV_TYPE_CONNINFRA); + pr_info("Force conninfra power off, ret=%d\n", ret); + pr_info("conninfra status should be power off. Status=%d\n", g_conninfra_ctx.infra_drv_status); + + /* Turn on subsys */ + for (i = 0; i < CONNDRV_TYPE_MAX; i++) { + if (drv_pwr_state[i]) { + ret = opfunc_power_on_internal(i); + pr_info("Call subsys(%d) power on ret=%d\n", i, ret); + } + } + pr_info("conninfra status should be power on. Status=%d\n", g_conninfra_ctx.infra_drv_status); + + pr_info("[chip_rst] reset --------------\n"); + + _conninfra_core_update_rst_status(CHIP_RST_POST_CB); + + osal_gettimeofday2(&reset_end); + + /* post */ + atomic_set(&g_conninfra_ctx.rst_state, 0); + sema_init(&g_conninfra_ctx.rst_sema, 1); + for (i = 0; i < CONNDRV_TYPE_MAX; i++) { + drv_inst = &g_conninfra_ctx.drv_inst[i]; + ret = msg_thread_send_1(&drv_inst->msg_ctx, INFRA_SUBDRV_OPID_POST_RESET, i); + } + + while (atomic_read(&g_conninfra_ctx.rst_state) != subdrv_all_done) { + ret = down_timeout(&g_conninfra_ctx.rst_sema, msecs_to_jiffies(CONNINFRA_RESET_TIMEOUT)); + if (ret == 0) + continue; + cur_rst_state = atomic_read(&g_conninfra_ctx.rst_state); + for (i = 0; i < CONNDRV_TYPE_MAX; i++) { + if ((cur_rst_state & (0x1 << i)) == 0) { + pr_info("[chip_rst] [%s] post-callback is not back\n", drv_thread_name[i]); + } + } + } + pr_info("[chip_rst] post ^^^^^^^^^^^^^^\n"); + + reset_chip_rst_trg_data(); + //_conninfra_core_update_rst_status(CHIP_RST_DONE); + _conninfra_core_update_rst_status(CHIP_RST_NONE); + osal_gettimeofday2(&done_end); + + pr_info("[chip_rst] summary pre=[%lu] reset=[%lu] post=[%lu]\n", + timeval_to_ms(&pre_begin, &pre_end), + timeval_to_ms(&pre_end, &reset_end), + timeval_to_ms(&reset_end, &done_end)); + + return 0; +} + +static int opfunc_rfspi_read(struct msg_op_data *op) +{ + int ret = 0; + unsigned int data = 0; + unsigned int* data_pt = (unsigned int*)op->op_data[2]; + + ret = osal_lock_sleepable_lock(&g_conninfra_ctx.core_lock); + if (ret) { + pr_err("core_lock fail!!\n"); + return CONNINFRA_SPI_OP_FAIL; + } + + if (g_conninfra_ctx.infra_drv_status != DRV_STS_POWER_ON) { + pr_err("Connsys didn't power on\n"); + ret = CONNINFRA_SPI_OP_FAIL; + goto err; + } + + if (consys_hw_reg_readable() == 0) { + pr_err("connsys reg not readable\n"); + ret = CONNINFRA_SPI_OP_FAIL; + goto err; + } + + /* DO read spi */ + ret = consys_hw_spi_read(op->op_data[0], op->op_data[1], &data); + if (data_pt) + *(data_pt) = data; +err: + osal_unlock_sleepable_lock(&g_conninfra_ctx.core_lock); + return ret; +} + +static int opfunc_rfspi_write(struct msg_op_data *op) +{ + int ret = 0; + + ret = osal_lock_sleepable_lock(&g_conninfra_ctx.core_lock); + if (ret) { + pr_err("core_lock fail!!\n"); + return CONNINFRA_SPI_OP_FAIL; + } + + if (g_conninfra_ctx.infra_drv_status != DRV_STS_POWER_ON) { + pr_err("Connsys didn't power on\n"); + ret = CONNINFRA_SPI_OP_FAIL; + goto err; + } + + if (consys_hw_reg_readable() == 0) { + pr_err("connsys reg not readable\n"); + ret = CONNINFRA_SPI_OP_FAIL; + goto err; + } + + /* DO spi write */ + ret = consys_hw_spi_write(op->op_data[0], op->op_data[1], op->op_data[2]); +err: + osal_unlock_sleepable_lock(&g_conninfra_ctx.core_lock); + return ret; +} + +static int opfunc_adie_top_ck_en_on(struct msg_op_data *op) +{ + int ret = 0; + unsigned int type = op->op_data[0]; + + if (type >= CONNDRV_TYPE_MAX) { + pr_err("wrong parameter %d\n", type); + return -EINVAL; + } + + ret = osal_lock_sleepable_lock(&g_conninfra_ctx.core_lock); + if (ret) { + pr_err("core_lock fail!!\n"); + ret = -1; + goto err; + } + + if (g_conninfra_ctx.infra_drv_status != DRV_STS_POWER_ON) { + pr_err("Connsys didn't power on\n"); + ret = -2; + goto err; + } + + ret = consys_hw_adie_top_ck_en_on(type); + +err: + osal_unlock_sleepable_lock(&g_conninfra_ctx.core_lock); + return ret; +} + + +static int opfunc_adie_top_ck_en_off(struct msg_op_data *op) +{ + int ret = 0; + unsigned int type = op->op_data[0]; + + if (type >= CONNDRV_TYPE_MAX) { + pr_err("wrong parameter %d\n", type); + return -EINVAL; + } + + ret = osal_lock_sleepable_lock(&g_conninfra_ctx.core_lock); + if (ret) { + pr_err("core_lock fail!!\n"); + ret = -1; + goto err; + } + if (g_conninfra_ctx.infra_drv_status != DRV_STS_POWER_ON) { + pr_err("Connsys didn't power on\n"); + ret = -2; + goto err; + } + + ret = consys_hw_adie_top_ck_en_off(type); +err: + osal_unlock_sleepable_lock(&g_conninfra_ctx.core_lock); + return ret; +} + +static int opfunc_spi_clock_switch(struct msg_op_data *op) +{ + int ret = 0; + unsigned int type = op->op_data[0]; + + if (type >= CONNSYS_SPI_SPEED_MAX) { + pr_err("wrong parameter %d\n", type); + return -EINVAL; + } + + ret = osal_lock_sleepable_lock(&g_conninfra_ctx.core_lock); + if (ret) { + pr_err("core_lock fail!!\n"); + ret = -2; + goto err; + } + if (g_conninfra_ctx.infra_drv_status != DRV_STS_POWER_ON) { + pr_err("Connsys didn't power on\n"); + ret = -2; + goto err; + } + + ret = consys_hw_spi_clock_switch(type); +err: + osal_unlock_sleepable_lock(&g_conninfra_ctx.core_lock); + return ret; +} + +static int opfunc_force_conninfra_wakeup(struct msg_op_data *op) +{ + int ret; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + + ret = osal_lock_sleepable_lock(&infra_ctx->core_lock); + if (ret) { + pr_err("core_lock fail!!\n"); + return ret; + } + + /* check if conninfra already on */ + if (g_conninfra_ctx.infra_drv_status != DRV_STS_POWER_ON) { + ret = -1; + goto err; + } + + ret = consys_hw_force_conninfra_wakeup(); + if (ret) + pr_err("force conninfra wakeup fail\n"); + +err: + osal_unlock_sleepable_lock(&infra_ctx->core_lock); + return ret; +} + +static int opfunc_force_conninfra_sleep(struct msg_op_data *op) +{ + int ret; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + + ret = osal_lock_sleepable_lock(&infra_ctx->core_lock); + if (ret) { + pr_err("core_lock fail!!\n"); + return ret; + } + + /* check if conninfra already on */ + if (g_conninfra_ctx.infra_drv_status != DRV_STS_POWER_ON) { + ret = -1; + goto err; + } + + ret = consys_hw_force_conninfra_sleep(); + if (ret) + pr_err("force conninfra sleep fail\n"); + +err: + osal_unlock_sleepable_lock(&infra_ctx->core_lock); + return ret; +} + + +static int opfunc_dump_power_state(struct msg_op_data *op) +{ + int ret; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + + ret = osal_lock_sleepable_lock(&infra_ctx->core_lock); + if (ret) { + pr_err("core_lock fail!!\n"); + return ret; + } + + /* check if conninfra already on */ + if (g_conninfra_ctx.infra_drv_status != DRV_STS_POWER_ON) { + ret = -1; + goto err; + } + + ret = consys_hw_dump_power_state(); + if (ret) + pr_err("dump power state fail\n"); + +err: + osal_unlock_sleepable_lock(&infra_ctx->core_lock); + return ret; + +} + +static int opfunc_subdrv_pre_reset(struct msg_op_data *op) +{ + int ret, cur_rst_state; + unsigned int drv_type = op->op_data[0]; + struct subsys_drv_inst *drv_inst; + + + /* TODO: should be locked, to avoid cb was reset */ + drv_inst = &g_conninfra_ctx.drv_inst[drv_type]; + if (/*drv_inst->drv_status == DRV_ST_POWER_ON &&*/ + drv_inst->ops_cb.rst_cb.pre_whole_chip_rst) { + + ret = drv_inst->ops_cb.rst_cb.pre_whole_chip_rst(g_conninfra_ctx.trg_drv, g_conninfra_ctx.trg_reason); + if (ret) + pr_err("[%s] fail [%d]\n", __func__, ret); + } + + atomic_add(0x1 << drv_type, &g_conninfra_ctx.rst_state); + cur_rst_state = atomic_read(&g_conninfra_ctx.rst_state); + + pr_info("[%s] rst_state=[%d]\n", drv_thread_name[drv_type], cur_rst_state); + + up(&g_conninfra_ctx.rst_sema); + return 0; +} + +static int opfunc_subdrv_post_reset(struct msg_op_data *op) +{ + int ret; + unsigned int drv_type = op->op_data[0]; + struct subsys_drv_inst *drv_inst; + + /* TODO: should be locked, to avoid cb was reset */ + drv_inst = &g_conninfra_ctx.drv_inst[drv_type]; + if (/*drv_inst->drv_status == DRV_ST_POWER_ON &&*/ + drv_inst->ops_cb.rst_cb.post_whole_chip_rst) { + ret = drv_inst->ops_cb.rst_cb.post_whole_chip_rst(); + if (ret) + pr_warn("[%s] fail [%d]\n", __func__, ret); + } + + atomic_add(0x1 << drv_type, &g_conninfra_ctx.rst_state); + up(&g_conninfra_ctx.rst_sema); + return 0; +} + +/* + * CONNINFRA API + */ +int conninfra_core_power_on(enum consys_drv_type type) +{ + int ret = 0; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + + ret = msg_thread_send_wait_1(&infra_ctx->msg_ctx, + CONNINFRA_OPID_PWR_ON, 0, type); + if (ret) { + pr_err("[%s] fail, ret = %d\n", __func__, ret); + return -1; + } + return 0; +} + +int conninfra_core_power_off(enum consys_drv_type type) +{ + int ret = 0; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + + ret = msg_thread_send_wait_1(&infra_ctx->msg_ctx, + CONNINFRA_OPID_PWR_OFF, 0, type); + if (ret) { + pr_err("[%s] send msg fail, ret = %d\n", __func__, ret); + return -1; + } + return 0; +} + +int conninfra_core_reg_readable(void) +{ + int ret = 0, rst_status; + unsigned long flag; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + + + /* check if in reseting, can not read */ + spin_lock_irqsave(&g_conninfra_ctx.rst_lock, flag); + rst_status = g_conninfra_ctx.rst_status; + spin_unlock_irqrestore(&g_conninfra_ctx.rst_lock, flag); + + if (rst_status >= CHIP_RST_RESET && + rst_status < CHIP_RST_POST_CB) + return 0; + + ret = osal_lock_sleepable_lock(&infra_ctx->core_lock); + if (ret) { + pr_err("core_lock fail!!\n"); + return 0; + } + + if (infra_ctx->infra_drv_status == DRV_STS_POWER_ON) + ret = consys_hw_reg_readable(); + osal_unlock_sleepable_lock(&infra_ctx->core_lock); + + return ret; +} + +int conninfra_core_reg_readable_no_lock(void) +{ + int rst_status; + unsigned long flag; + + /* check if in reseting, can not read */ + spin_lock_irqsave(&g_conninfra_ctx.rst_lock, flag); + rst_status = g_conninfra_ctx.rst_status; + spin_unlock_irqrestore(&g_conninfra_ctx.rst_lock, flag); + + if (rst_status >= CHIP_RST_RESET && + rst_status < CHIP_RST_POST_CB) + return 0; + + return consys_hw_reg_readable(); +} + +int conninfra_core_is_bus_hang(void) +{ + int ret = 0; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + + ret = osal_lock_sleepable_lock(&infra_ctx->core_lock); + if (ret) { + pr_err("core_lock fail!!\n"); + return 0; + } + + if (infra_ctx->infra_drv_status == DRV_STS_POWER_ON) + ret = consys_hw_is_bus_hang(); + osal_unlock_sleepable_lock(&infra_ctx->core_lock); + + return ret; + +} + +int conninfra_core_is_consys_reg(phys_addr_t addr) +{ + return consys_hw_is_connsys_reg(addr); +} + +int conninfra_core_reg_read(unsigned long address, unsigned int *value, unsigned int mask) +{ + int ret = 0; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + + ret = osal_lock_sleepable_lock(&infra_ctx->core_lock); + if (ret) { + pr_err("core_lock fail!!\n"); + return 0; + } + + if (infra_ctx->infra_drv_status == DRV_STS_POWER_ON) { + if (consys_reg_mng_is_host_csr(address)) + ret = consys_reg_mng_reg_read(address, value, mask); + else if (consys_hw_reg_readable()) + ret = consys_reg_mng_reg_read(address, value, mask); + else + pr_info("CR (%lx) is not readable\n", address); + } else + pr_info("CR (%lx) cannot read. conninfra is off\n", address); + + osal_unlock_sleepable_lock(&infra_ctx->core_lock); + return ret; +} + +int conninfra_core_reg_write(unsigned long address, unsigned int value, unsigned int mask) +{ + int ret = 0; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + + ret = osal_lock_sleepable_lock(&infra_ctx->core_lock); + if (ret) { + pr_err("core_lock fail!!\n"); + return 0; + } + + if (infra_ctx->infra_drv_status == DRV_STS_POWER_ON) { + if (consys_reg_mng_is_host_csr(address)) + ret = consys_reg_mng_reg_write(address, value, mask); + else if (consys_hw_reg_readable()) + ret = consys_reg_mng_reg_write(address, value, mask); + else + pr_info("CR (%p) is not readable\n", (void*)address); + } else + pr_info("CR (%p) cannot read. conninfra is off\n", (void*)address); + + osal_unlock_sleepable_lock(&infra_ctx->core_lock); + return ret; + +} + +int conninfra_core_lock_rst(void) +{ + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + int ret = 0; + unsigned long flag; + + spin_lock_irqsave(&infra_ctx->rst_lock, flag); + + ret = infra_ctx->rst_status; + if (infra_ctx->rst_status > CHIP_RST_NONE && + infra_ctx->rst_status < CHIP_RST_DONE) { + /* do nothing */ + } else { + infra_ctx->rst_status = CHIP_RST_START; + } + spin_unlock_irqrestore(&infra_ctx->rst_lock, flag); + + pr_info("[%s] ret=[%d]\n", __func__, ret); + return ret; +} + +int conninfra_core_unlock_rst(void) +{ + unsigned long flag; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + + spin_lock_irqsave(&infra_ctx->rst_lock, flag); + infra_ctx->rst_status = CHIP_RST_NONE; + spin_unlock_irqrestore(&infra_ctx->rst_lock, flag); + return 0; +} + +int conninfra_core_trg_chip_rst(enum consys_drv_type drv, char *reason) +{ + int ret = 0; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + + infra_ctx->trg_drv = drv; + snprintf(infra_ctx->trg_reason, CHIP_RST_REASON_MAX_LEN, "%s", reason); + ret = msg_thread_send_1(&infra_ctx->cb_ctx, + CONNINFRA_CB_OPID_CHIP_RST, drv); + if (ret) { + pr_err("send msg fail, ret = %d\n", ret); + return -1; + } + pr_info("trg_reset DONE!\n"); + return 0; +} + +static inline char* conninfra_core_spi_subsys_string(enum sys_spi_subsystem subsystem) +{ + static char* subsys_name[] = { + "SYS_SPI_WF1", + "SYS_SPI_WF", + "SYS_SPI_BT", + "SYS_SPI_FM", + "SYS_SPI_GPS", + "SYS_SPI_TOP", + "SYS_SPI_WF2", + "SYS_SPI_WF3", + "SYS_SPI_2ND_ADIE_WF1", + "SYS_SPI_2ND_ADIE_WF", + "SYS_SPI_2ND_ADIE_BT", + "SYS_SPI_2ND_ADIE_FM", + "SYS_SPI_2ND_ADIE_GPS", + "SYS_SPI_2ND_ADIE_TOP", + "SYS_SPI_2ND_ADIE_WF2", + "SYS_SPI_2ND_ADIE_WF3", + "SYS_SPI_MAX" + }; + return subsys_name[subsystem]; +} + +int conninfra_core_spi_read(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int *data) +{ + int ret = 0; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + size_t data_ptr = (size_t)data; + + ret = msg_thread_send_wait_3(&infra_ctx->msg_ctx, CONNINFRA_OPID_RFSPI_READ, 0, + subsystem, addr, data_ptr); + if (ret) { + pr_err("failed (ret = %d). subsystem=%s addr=%x\n", + ret, conninfra_core_spi_subsys_string(subsystem), addr); + return CONNINFRA_SPI_OP_FAIL; + } + return 0; +} + +int conninfra_core_spi_write(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int data) +{ + int ret; + ret = msg_thread_send_wait_3(&(g_conninfra_ctx.msg_ctx), CONNINFRA_OPID_RFSPI_WRITE, 0, + subsystem, addr, data); + if (ret) { + pr_err("failed (ret = %d). subsystem=%s addr=0x%x data=%d\n", + ret, conninfra_core_spi_subsys_string(subsystem), addr, data); + return CONNINFRA_SPI_OP_FAIL; + } + return 0; +} + +int conninfra_core_adie_top_ck_en_on(enum consys_drv_type type) +{ + int ret = 0; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + + ret = msg_thread_send_wait_1(&infra_ctx->msg_ctx, + CONNINFRA_OPID_ADIE_TOP_CK_EN_ON, 0, type); + if (ret) { + pr_err("fail, ret = %d\n", ret); + return -1; + } + return 0; +} + +int conninfra_core_adie_top_ck_en_off(enum consys_drv_type type) +{ + int ret = 0; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + + ret = msg_thread_send_wait_1(&infra_ctx->msg_ctx, + CONNINFRA_OPID_ADIE_TOP_CK_EN_OFF, 0, type); + if (ret) { + pr_err("fail, ret = %d\n", ret); + return -1; + } + return 0; +} + +int conninfra_core_force_conninfra_wakeup(void) +{ + int ret = 0; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + + /* if in conninfra_cored thread */ + if (current == infra_ctx->msg_ctx.thread.pThread) + return opfunc_force_conninfra_wakeup(NULL); + + ret = msg_thread_send_wait(&infra_ctx->msg_ctx, + CONNINFRA_OPID_FORCE_CONNINFRA_WAKUP, 0); + if (ret) { + pr_err("fail, ret = %d\n", ret); + return -1; + } + return 0; +} + +int conninfra_core_force_conninfra_sleep(void) +{ + int ret = 0; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + + /* if in conninfra_cored thread */ + if (current == infra_ctx->msg_ctx.thread.pThread) + return opfunc_force_conninfra_sleep(NULL); + + ret = msg_thread_send_wait(&infra_ctx->msg_ctx, + CONNINFRA_OPID_FORCE_CONNINFRA_SLEEP, 0); + if (ret) { + pr_err("fail, ret = %d\n", ret); + return -1; + } + return 0; +} + +int conninfra_core_spi_clock_switch(enum connsys_spi_speed_type type) +{ + int ret = 0; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + + ret = msg_thread_send_wait_1(&infra_ctx->msg_ctx, + CONNINFRA_OPID_SPI_CLOCK_SWITCH, 0, type); + if (ret) { + pr_err("fail, ret = %d\n", ret); + return -1; + } + return 0; +} + +int conninfra_core_subsys_ops_reg(enum consys_drv_type type, + struct sub_drv_ops_cb *cb) +{ + unsigned long flag; + struct subsys_drv_inst *drv_inst; + int ret = 0; + + spin_lock_irqsave(&g_conninfra_ctx.infra_lock, flag); + drv_inst = &g_conninfra_ctx.drv_inst[type]; + memcpy(&g_conninfra_ctx.drv_inst[type].ops_cb, cb, sizeof(struct sub_drv_ops_cb)); + spin_unlock_irqrestore(&g_conninfra_ctx.infra_lock, flag); + + pr_info("[pre_cal] type=[%s] cb rst=[%p][%p]\n", + drv_name[type], cb->rst_cb.pre_whole_chip_rst, cb->rst_cb.post_whole_chip_rst); + + return ret; +} + +int conninfra_core_subsys_ops_unreg(enum consys_drv_type type) +{ + unsigned long flag; + + spin_lock_irqsave(&g_conninfra_ctx.infra_lock, flag); + memset(&g_conninfra_ctx.drv_inst[type].ops_cb, 0, + sizeof(struct sub_drv_ops_cb)); + spin_unlock_irqrestore(&g_conninfra_ctx.infra_lock, flag); + + return 0; +} + +static void _conninfra_core_update_rst_status(enum chip_rst_status status) +{ + unsigned long flag; + + spin_lock_irqsave(&g_conninfra_ctx.rst_lock, flag); + g_conninfra_ctx.rst_status = status; + spin_unlock_irqrestore(&g_conninfra_ctx.rst_lock, flag); +} + + +int conninfra_core_is_rst_locking(void) +{ + unsigned long flag; + int ret = 0; + + spin_lock_irqsave(&g_conninfra_ctx.rst_lock, flag); + + if (g_conninfra_ctx.rst_status > CHIP_RST_NONE && + g_conninfra_ctx.rst_status < CHIP_RST_POST_CB) + ret = 1; + spin_unlock_irqrestore(&g_conninfra_ctx.rst_lock, flag); + return ret; +} + +int conninfra_core_dump_power_state(void) +{ + int ret = 0; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + + ret = msg_thread_send(&infra_ctx->msg_ctx, + CONNINFRA_OPID_DUMP_POWER_STATE); + if (ret) { + pr_err("fail, ret = %d\n", ret); + return -1; + } + + return 0; + +} + +int conninfra_core_pmic_event_cb(unsigned int id, unsigned int event) +{ + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + int ret; + + if (conninfra_core_is_rst_locking()) { + return 0; + } + + ret = osal_lock_sleepable_lock(&infra_ctx->core_lock); + if (ret) { + pr_err("core_lock fail!!\n"); + return 0; + } + + if (infra_ctx->infra_drv_status == DRV_STS_POWER_ON) + consys_hw_pmic_event_cb(id, event); + + osal_unlock_sleepable_lock(&infra_ctx->core_lock); + + return 0; +} + +int conninfra_core_debug_dump(void) +{ + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + int ret = -1; + unsigned int i; + + ret = osal_lock_sleepable_lock(&infra_ctx->core_lock); + if (ret) { + pr_err("core_lock fail, ret=%d\n", ret); + return -1; + } + + msg_thread_dump(&infra_ctx->msg_ctx); + msg_thread_dump(&infra_ctx->cb_ctx); + for (i = 0; i < CONNDRV_TYPE_MAX; i++) { + msg_thread_dump(&(infra_ctx->drv_inst[i].msg_ctx)); + } + + osal_unlock_sleepable_lock(&infra_ctx->core_lock); + + return ret; +} + +int conninfra_core_init(void) +{ + int ret = 0, i; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + + osal_memset(&g_conninfra_ctx, 0, sizeof(g_conninfra_ctx)); + + reset_chip_rst_trg_data(); + + spin_lock_init(&infra_ctx->infra_lock); + osal_sleepable_lock_init(&infra_ctx->core_lock); + spin_lock_init(&infra_ctx->rst_lock); + + + ret = msg_thread_init(&infra_ctx->msg_ctx, "conninfra_cored", + conninfra_core_opfunc, CONNINFRA_OPID_MAX); + if (ret) { + pr_err("msg_thread init fail(%d)\n", ret); + return -1; + } + + ret = msg_thread_init(&infra_ctx->cb_ctx, "conninfra_cb", + conninfra_core_cb_opfunc, CONNINFRA_CB_OPID_MAX); + if (ret) { + pr_err("callback msg thread init fail(%d)\n", ret); + return -1; + } + + /* init subsys drv state */ + for (i = 0; i < CONNDRV_TYPE_MAX; i++) { + ret += msg_thread_init(&infra_ctx->drv_inst[i].msg_ctx, + drv_thread_name[i], infra_subdrv_opfunc, + INFRA_SUBDRV_OPID_MAX); + } + + if (ret) { + pr_err("subsys callback thread init fail.\n"); + return -1; + } + + return ret; +} + +int conninfra_core_deinit(void) +{ + int ret, i; + struct conninfra_ctx *infra_ctx = &g_conninfra_ctx; + + for (i = 0; i < CONNDRV_TYPE_MAX; i++) { + ret = msg_thread_deinit(&infra_ctx->drv_inst[i].msg_ctx); + if (ret) + pr_warn("subdrv [%d] msg_thread deinit fail (%d)\n", + i, ret); + } + + ret = msg_thread_deinit(&infra_ctx->msg_ctx); + if (ret) { + pr_err("msg_thread_deinit fail(%d)\n", ret); + return -1; + } + + osal_sleepable_lock_deinit(&infra_ctx->core_lock); + + return 0; +} + diff --git a/package/conninfra/src/core/include/conninfra_core.h b/package/conninfra/src/core/include/conninfra_core.h new file mode 100644 index 0000000..555c8de --- /dev/null +++ b/package/conninfra/src/core/include/conninfra_core.h @@ -0,0 +1,193 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _CONNINFRA_CORE_H_ +#define _CONNINFRA_CORE_H_ + +#include +#include +#include +#include + +#include "osal.h" +#include "msg_thread.h" +#include "conninfra.h" + +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + +#define CHIP_RST_REASON_MAX_LEN 128 + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ +typedef enum _ENUM_DRV_STS_ { + DRV_STS_POWER_OFF = 0, /* initial state */ + DRV_STS_POWER_ON = 1, /* powered on */ + DRV_STS_MAX +} ENUM_DRV_STS, *P_ENUM_DRV_STS; + +enum chip_rst_status { + CHIP_RST_NONE = 0, + CHIP_RST_START = 1, + CHIP_RST_PRE_CB = 2, + CHIP_RST_RESET = 3, + CHIP_RST_POST_CB = 4, + CHIP_RST_DONE = 5 +}; + +struct subsys_drv_inst { + ENUM_DRV_STS drv_status; /* Controlled driver status */ + unsigned int rst_state; + struct sub_drv_ops_cb ops_cb; + struct msg_thread_ctx msg_ctx; +}; + +/* + * state of conninfra + * + */ +struct conninfra_ctx { + ENUM_DRV_STS infra_drv_status; + + struct subsys_drv_inst drv_inst[CONNDRV_TYPE_MAX]; + /*struct spinlock infra_lock;*/ + spinlock_t infra_lock; + + OSAL_SLEEPABLE_LOCK core_lock; + + /* chip reset */ + enum chip_rst_status rst_status; + spinlock_t rst_lock; + + struct semaphore rst_sema; + atomic_t rst_state; + enum consys_drv_type trg_drv; + char trg_reason[CHIP_RST_REASON_MAX_LEN]; + + struct msg_thread_ctx msg_ctx; + struct msg_thread_ctx cb_ctx; + + unsigned int hw_ver; + unsigned int fw_ver; + unsigned int ip_ver; +}; + +//typedef enum _ENUM_CONNINFRA_CORE_OPID_T { +typedef enum { + CONNINFRA_OPID_PWR_ON = 0, + CONNINFRA_OPID_PWR_OFF = 1, + CONNINFRA_OPID_RFSPI_READ = 2, + CONNINFRA_OPID_RFSPI_WRITE = 3, + CONNINFRA_OPID_ADIE_TOP_CK_EN_ON = 4, + CONNINFRA_OPID_ADIE_TOP_CK_EN_OFF = 5, + CONNINFRA_OPID_SPI_CLOCK_SWITCH = 6, + CONNINFRA_OPID_FORCE_CONNINFRA_WAKUP = 7, + CONNINFRA_OPID_FORCE_CONNINFRA_SLEEP = 8, + CONNINFRA_OPID_DUMP_POWER_STATE = 9, + CONNINFRA_OPID_MAX +} conninfra_core_opid; + +/* For the operation which may callback subsys driver */ +typedef enum { + CONNINFRA_CB_OPID_CHIP_RST = 0, + CONNINFRA_CB_OPID_MAX +} conninfra_core_cb_opid; + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + +extern int conninfra_core_init(void); +extern int conninfra_core_deinit(void); + +int conninfra_core_power_on(enum consys_drv_type type); +int conninfra_core_power_off(enum consys_drv_type type); + +int conninfra_core_lock_rst(void); +int conninfra_core_unlock_rst(void); +int conninfra_core_trg_chip_rst(enum consys_drv_type drv, char *reason); + +int conninfra_core_subsys_ops_reg(enum consys_drv_type type, struct sub_drv_ops_cb *cb); +int conninfra_core_subsys_ops_unreg(enum consys_drv_type type); + +/* reg control */ +/* NOTE: NOT thread-safe + * return value + * 1 : Yes, 0: NO + */ +int conninfra_core_reg_readable(void); +int conninfra_core_reg_readable_no_lock(void); +int conninfra_core_is_bus_hang(void); + +int conninfra_core_is_consys_reg(phys_addr_t addr); +int conninfra_core_reg_read(unsigned long address, unsigned int *value, unsigned int mask); +int conninfra_core_reg_write(unsigned long address, unsigned int value, unsigned int mask); + +int conninfra_core_is_rst_locking(void); + +int conninfra_core_spi_read(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int *data); +int conninfra_core_spi_write(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int data); + +int conninfra_core_adie_top_ck_en_on(enum consys_drv_type type); +int conninfra_core_adie_top_ck_en_off(enum consys_drv_type type); + +int conninfra_core_force_conninfra_wakeup(void); +int conninfra_core_force_conninfra_sleep(void); + +int conninfra_core_spi_clock_switch(enum connsys_spi_speed_type type); + +int conninfra_core_dump_power_state(void); +int conninfra_core_pmic_event_cb(unsigned int, unsigned int); +int conninfra_core_debug_dump(void); + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +#endif /* _CONNINFRA_CORE_H_ */ diff --git a/package/conninfra/src/include/conninfra.h b/package/conninfra/src/include/conninfra.h new file mode 100644 index 0000000..b8577bd --- /dev/null +++ b/package/conninfra/src/include/conninfra.h @@ -0,0 +1,216 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ + +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _CONNINFRA_H_ +#define _CONNINFRA_H_ + + +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ +#define AIDE_NUM_MAX 2 +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ +enum consys_drv_type { + CONNDRV_TYPE_BT = 0, + CONNDRV_TYPE_FM = 1, + CONNDRV_TYPE_GPS = 2, + CONNDRV_TYPE_WIFI = 3, + CONNDRV_TYPE_CONNINFRA = 4, + CONNDRV_TYPE_MAX +}; + +/* HW-specific, need sync with FW. DO NOT MODIFY */ +enum sys_spi_subsystem +{ + SYS_SPI_WF1 = 0x00, + SYS_SPI_WF = 0x01, + SYS_SPI_BT = 0x02, + SYS_SPI_FM = 0x03, + SYS_SPI_GPS = 0x04, + SYS_SPI_TOP = 0x05, + SYS_SPI_WF2 = 0x06, + SYS_SPI_WF3 = 0x07, + SYS_SPI_2ND_ADIE_WF1 = 0x10, + SYS_SPI_2ND_ADIE_WF = 0x11, + SYS_SPI_2ND_ADIE_BT = 0x12, + SYS_SPI_2ND_ADIE_FM = 0x13, + SYS_SPI_2ND_ADIE_GPS = 0x14, + SYS_SPI_2ND_ADIE_TOP = 0x15, + SYS_SPI_2ND_ADIE_WF2 = 0x16, + SYS_SPI_2ND_ADIE_WF3 = 0x17, + SYS_SPI_MAX +}; + +enum connsys_spi_speed_type { + CONNSYS_SPI_SPEED_26M, + CONNSYS_SPI_SPEED_64M, + CONNSYS_SPI_SPEED_MAX +}; + +/* Conninfra driver allocate EMI for FW and WFDAM + * (FW includes: BT, WIFI and their MCU) + * +-----------+ + + * | | | + * | FW | | + * | | | + * +-----------+ v + * | | + * | | FW_WFDMA + * | | ^ + * | WFDMA | | + * | | | + * | | | + * +-----------+ + + * + * MCIF region is provided by MD + * +-----------+ + * | | + * | | + * | MCIF | + * | | + * +-----------+ + */ +enum connsys_emi_type +{ + CONNSYS_EMI_FW = 0, + CONNSYS_EMI_MAX, +}; + +#define CONNINFRA_SPI_OP_FAIL 0x1 + +#define CONNINFRA_CB_RET_CAL_PASS_POWER_OFF 0x0 +#define CONNINFRA_CB_RET_CAL_PASS_POWER_ON 0x2 +#define CONNINFRA_CB_RET_CAL_FAIL_POWER_OFF 0x1 +#define CONNINFRA_CB_RET_CAL_FAIL_POWER_ON 0x3 + +#define CONNINFRA_BUS_CLOCK_WPLL 0x1 +#define CONNINFRA_BUS_CLOCK_ALL (CONNINFRA_BUS_CLOCK_WPLL) + +/* bus hang error define */ +#define CONNINFRA_INFRA_BUS_HANG 0x1 +#define CONNINFRA_AP2CONN_RX_SLP_PROT_ERR 0x2 +#define CONNINFRA_AP2CONN_TX_SLP_PROT_ERR 0x4 +#define CONNINFRA_AP2CONN_CLK_ERR 0x8 +#define CONNINFRA_INFRA_BUS_HANG_IRQ 0x10 + +#define CONNINFRA_ERR_RST_ONGOING -0x7788 +#define CONNINFRA_ERR_WAKEUP_FAIL -0x5566 +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + +/* SPI clock switch */ +int conninfra_spi_clock_switch(enum connsys_spi_speed_type type); + +/* A-die top_ck_en control, only for MT6885 */ +int conninfra_adie_top_ck_en_on(enum consys_drv_type type); +int conninfra_adie_top_ck_en_off(enum consys_drv_type type); + +/* RFSPI */ +int conninfra_spi_read(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int *data); +int conninfra_spi_write(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int data); + +/* EMI */ +void conninfra_get_emi_phy_addr(enum connsys_emi_type type, phys_addr_t* base, unsigned int *size); + +/* power on/off */ +int conninfra_pwr_on(enum consys_drv_type drv_type); +int conninfra_pwr_off(enum consys_drv_type drv_type); + +/* To setup config relative data, ex: debug flag */ +void conninfra_config_setup(void); + +/* + * 0 : NO hang + * > 0 : HANG!! + * CONNINFRA_ERR_RST_ONGOING: whole chip reset is ongoing + */ +int conninfra_is_bus_hang(void); + +/* chip reset +* return: +* <0: error +* =0: triggered +* =1: ongoing +*/ +int conninfra_trigger_whole_chip_rst(enum consys_drv_type drv, char *reason); + +int conninfra_debug_dump(void); + +struct whole_chip_rst_cb { + int (*pre_whole_chip_rst)(enum consys_drv_type drv, char *reason); + int (*post_whole_chip_rst)(void); +}; + +/* driver state query */ + +/* VCN control */ + +/* Thermal */ + +/* Config */ + +/* semaphore */ + +/* calibration */ + +struct sub_drv_ops_cb { + /* chip reset */ + struct whole_chip_rst_cb rst_cb; +}; + +int conninfra_sub_drv_ops_register(enum consys_drv_type drv_type, struct sub_drv_ops_cb *cb); +int conninfra_sub_drv_ops_unregister(enum consys_drv_type drv_type); + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +#endif /* _CONNINFRA_H_ */ diff --git a/package/conninfra/src/platform/consys_hw.c b/package/conninfra/src/platform/consys_hw.c new file mode 100644 index 0000000..7f8e02e --- /dev/null +++ b/package/conninfra/src/platform/consys_hw.c @@ -0,0 +1,663 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#define pr_fmt(fmt) KBUILD_MODNAME "@(%s:%d) " fmt, __func__, __LINE__ + + +#include +#include +#include + +#include "osal.h" +#include "consys_hw.h" +#include "emi_mng.h" +#include "pmic_mng.h" +#include "consys_reg_mng.h" + +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + +static int mtk_conninfra_probe(struct platform_device *pdev); +static int mtk_conninfra_remove(struct platform_device *pdev); +static int mtk_conninfra_suspend(struct platform_device *pdev, pm_message_t state); +static int mtk_conninfra_resume(struct platform_device *pdev); + +static int consys_hw_init(struct platform_device *pdev); +static int consys_hw_deinit(void); +static int _consys_hw_conninfra_wakeup(void); +static int _consys_hw_conninfra_sleep(void); + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +extern const struct of_device_id apconninfra_of_ids[]; + +static struct platform_driver mtk_conninfra_dev_drv = { + .probe = mtk_conninfra_probe, + .remove = mtk_conninfra_remove, + .suspend = mtk_conninfra_suspend, + .resume = mtk_conninfra_resume, + .driver = { + .name = "mtk_conninfra", + .owner = THIS_MODULE, + .of_match_table = apconninfra_of_ids, + }, +}; + + +struct consys_hw_env conn_hw_env[AIDE_NUM_MAX]; + +const struct consys_hw_ops_struct *consys_hw_ops; +struct platform_device *g_pdev; + +int g_conninfra_wakeup_ref_cnt; + +struct work_struct ap_resume_work; + +struct conninfra_dev_cb *g_conninfra_dev_cb; +const struct conninfra_plat_data *g_conninfra_plat_data = NULL; + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ +struct platform_device *get_consys_device(void) +{ + return g_pdev; +} + +int consys_hw_get_clock_schematic(void) +{ + if (consys_hw_ops->consys_plt_co_clock_type) + return consys_hw_ops->consys_plt_co_clock_type(); + else + pr_err("consys_hw_ops->consys_co_clock_type not supported\n"); + + return -1; +} + +unsigned int consys_hw_chipid_get(void) +{ + if (g_conninfra_plat_data && g_conninfra_plat_data->chip_id) + return g_conninfra_plat_data->chip_id; + else if (consys_hw_ops->consys_plt_soc_chipid_get) + return consys_hw_ops->consys_plt_soc_chipid_get(); + else + pr_err("consys_plt_soc_chipid_get not supported\n"); + + return 0; +} + +unsigned int consys_hw_get_hw_ver(void) +{ + if (consys_hw_ops->consys_plt_get_hw_ver) + return consys_hw_ops->consys_plt_get_hw_ver(); + return 0; +} + + +int consys_hw_reg_readable(void) +{ + return consys_reg_mng_reg_readable(); +} + +int consys_hw_is_connsys_reg(phys_addr_t addr) +{ + return consys_reg_mng_is_connsys_reg(addr); +} + +int consys_hw_is_bus_hang(void) +{ + return consys_reg_mng_is_bus_hang(); +} + +int consys_hw_dump_bus_status(void) +{ + return consys_reg_mng_dump_bus_status(); +} + +int consys_hw_dump_cpupcr(enum conn_dump_cpupcr_type dump_type, int times, unsigned long interval_us) +{ + return consys_reg_mng_dump_cpupcr(dump_type, times, interval_us); +} + +int consys_hw_pwr_on(unsigned int curr_status, unsigned int on_radio) +{ + //unsigned int next_status = (curr_status | (0x1 << on_radio)); + + /* first power on */ + if (curr_status == 0) { + /* POS PART 0: + * Set PMIC to turn on the power that AFE WBG circuit in D-die, + * OSC or crystal component, and A-die need. + */ + if (consys_hw_ops->consys_plt_xtal_ctrl_fast_mode) + consys_hw_ops->consys_plt_xtal_ctrl_fast_mode(); + + if (consys_hw_ops->consys_plt_connsys_sw_reset_ctrl) + consys_hw_ops->consys_plt_connsys_sw_reset_ctrl(false); + + /* POS PART 1: + * 1. Pinmux setting + * 2. Turn on MTCMOS + * 3. Enable AHB bus + */ + if (consys_hw_ops->consys_plt_set_if_pinmux) + consys_hw_ops->consys_plt_set_if_pinmux(true); + + udelay(500); + + if (consys_hw_ops->consys_plt_tx_rx_bus_slp_prot_ctrl) + consys_hw_ops->consys_plt_tx_rx_bus_slp_prot_ctrl(true); + + if (consys_hw_ops->consys_plt_polling_consys_chipid) + consys_hw_ops->consys_plt_polling_consys_chipid(); + + /* POS PART 2: + * 1. Set connsys EMI mapping + * 2. d_die_cfg + * 3. spi_master_cfg + * 4. a_die_cfg + * 5. afe_wbg_cal + * 6. patch default value + * 7. CONN_INFRA low power setting (srcclken wait time, mtcmos HW ctl...) + */ + if (consys_hw_ops->consys_plt_bus_clock_ctrl) + consys_hw_ops->consys_plt_bus_clock_ctrl(on_radio, CONNINFRA_BUS_CLOCK_ALL); + + emi_mng_set_remapping_reg(); + emi_mng_set_region_protection(); + + if (consys_hw_ops->consys_plt_d_die_cfg) + consys_hw_ops->consys_plt_d_die_cfg(); + + if (consys_hw_ops->consys_plt_conninfra_sysram_hw_ctrl) + consys_hw_ops->consys_plt_conninfra_sysram_hw_ctrl(); + + if (consys_hw_ops->consys_plt_spi_master_cfg) + consys_hw_ops->consys_plt_spi_master_cfg(); + +#ifndef CONFIG_FPGA_EARLY_PORTING + if (consys_hw_ops->consys_plt_adie_type_check) + consys_hw_ops->consys_plt_adie_type_check(); + + if (consys_hw_ops->consys_plt_a_die_cfg) + consys_hw_ops->consys_plt_a_die_cfg(); +#endif + + if (consys_hw_ops->consys_plt_afe_wbg_cal) + consys_hw_ops->consys_plt_afe_wbg_cal(); + + if (consys_hw_ops->consys_plt_subsys_pll_initial) + consys_hw_ops->consys_plt_subsys_pll_initial(); + + if (consys_hw_ops->consys_plt_osc_legacy_mode) + consys_hw_ops->consys_plt_osc_legacy_mode(); + +#ifndef CONFIG_FPGA_EARLY_PORTING + if (consys_hw_ops->consys_plt_top_pwr_ctrl) + consys_hw_ops->consys_plt_top_pwr_ctrl(); +#endif + + if (consys_hw_ops->consys_plt_conn_infra_bus_timeout) + consys_hw_ops->consys_plt_conn_infra_bus_timeout(); + + if (consys_hw_ops->consys_plt_clkgen_wpll_hw_ctrl) + consys_hw_ops->consys_plt_clkgen_wpll_hw_ctrl(); + + /* POS PART 3: + * 1. A-die low power setting + * 2. bgfsys power on(BT/GPS on) + */ + consys_hw_force_conninfra_wakeup(); +#ifndef CONFIG_FPGA_EARLY_PORTING + consys_hw_adie_top_ck_en_on(on_radio); + //consys_hw_adie_top_ck_en_off(on_radio); +#endif + consys_hw_force_conninfra_sleep(); + }else { + switch (on_radio) { + case CONNDRV_TYPE_WIFI: + /* Power on WFSYS PART 0: + * 1. wake up conn_infra + * 2. turn on MTCMOS power switch of "wfsys_top_on" and "wfsys_top_off" circuit in D-die ("wfsys_top_off" is turned on by "wfsys_top_on" automatically) + * 3. enable AHB bus(WF2conn/conn2WF) + * 4. downlad CONNSYS EMI code + * 5. patch default value + */ + if (consys_hw_ops->consys_plt_conninfra_wf_wakeup) + consys_hw_ops->consys_plt_conninfra_wf_wakeup(); + + if (consys_hw_ops->consys_plt_conn_wmcpu_sw_reset) + consys_hw_ops->consys_plt_conn_wmcpu_sw_reset(true); + + if (consys_hw_ops->consys_plt_wf_bus_slp_prot_ctrl) + consys_hw_ops->consys_plt_wf_bus_slp_prot_ctrl(false); + + if (consys_hw_ops->consys_plt_wfsys_top_on_ctrl) + consys_hw_ops->consys_plt_wfsys_top_on_ctrl(true); + + if (consys_hw_ops->consys_plt_wfsys_bus_slp_prot_check) + consys_hw_ops->consys_plt_wfsys_bus_slp_prot_check(true); + + if (consys_hw_ops->consys_plt_wfsys_bus_timeout_ctrl) + consys_hw_ops->consys_plt_wfsys_bus_timeout_ctrl(); + + if (consys_hw_ops->consys_plt_conn_wmcpu_sw_reset) + consys_hw_ops->consys_plt_conn_wmcpu_sw_reset(false); + +#ifndef CONFIG_FPGA_EARLY_PORTING + if (consys_hw_ops->consys_plt_conn_wmcpu_idle_loop_check) + consys_hw_ops->consys_plt_conn_wmcpu_idle_loop_check(); + + if (consys_hw_ops->consys_plt_adie_type_cfg) + consys_hw_ops->consys_plt_adie_type_cfg(); +#endif + /* No sleep requiremenct for rebb AP */ +#if 0 + if (consys_hw_ops->consys_plt_conninfra_wf_sleep) + consys_hw_ops->consys_plt_conninfra_wf_sleep(); +#endif + break; + + default: + pr_err("Not support type now (on_radio = %d)\n", on_radio); + break; + } + } + + return 0; +} + +int consys_hw_pwr_off(unsigned int curr_status, unsigned int off_radio) +{ + //int ret = 0; + unsigned int next_status = curr_status & ~(0x1 << off_radio); + + if (next_status == 0) { + pr_info("Last pwoer off: %d\n", off_radio); + + /* Power off CONNSYS PART 0: + * 1. A-die low power setting + */ + consys_hw_force_conninfra_wakeup(); +#ifndef CONFIG_FPGA_EARLY_PORTING + //consys_hw_adie_top_ck_en_off(off_radio); +#endif + consys_hw_force_conninfra_sleep(); + + /* Power off CONNSYS PART 1: + * 1. disable AXI bus + * 2. turn off MTCMOS power switch of "conn_top_on" and "conn_top_off" circuit in D-die + */ + if (consys_hw_ops->consys_plt_tx_rx_bus_slp_prot_ctrl) + consys_hw_ops->consys_plt_tx_rx_bus_slp_prot_ctrl(false); + + if (consys_hw_ops->consys_plt_connsys_sw_reset_ctrl) + consys_hw_ops->consys_plt_connsys_sw_reset_ctrl(true); + + udelay(1); + } else { + switch (off_radio) { + case CONNDRV_TYPE_WIFI: + /* Power off WFSYS PART 1: + * 1. disable AXI bus(wf2conn/conn2wf) + * 2. turn off MTCMOS power switch of "wf_top_on" and "wf_top_off" circuit in D-die ("wf_top_off" is turned off by "wf_top_on" automatically) + */ + if (consys_hw_ops->consys_plt_conninfra_wf_wakeup) + consys_hw_ops->consys_plt_conninfra_wf_wakeup(); + + if (consys_hw_ops->consys_plt_wf_bus_slp_prot_ctrl) + consys_hw_ops->consys_plt_wf_bus_slp_prot_ctrl(true); + + if (consys_hw_ops->consys_plt_wfsys_bus_slp_prot_check) + consys_hw_ops->consys_plt_wfsys_bus_slp_prot_check(false); + + if (consys_hw_ops->consys_plt_wpll_ctrl) + consys_hw_ops->consys_plt_wpll_ctrl(false); + + if (consys_hw_ops->consys_plt_wfsys_top_on_ctrl) + consys_hw_ops->consys_plt_wfsys_top_on_ctrl(false); + + if (consys_hw_ops->consys_plt_wpll_ctrl) + consys_hw_ops->consys_plt_wpll_ctrl(true); + + consys_hw_adie_top_ck_en_off(off_radio); + + if (consys_hw_ops->consys_plt_conninfra_wf_req_clr) + consys_hw_ops->consys_plt_conninfra_wf_req_clr(); + + if (consys_hw_ops->consys_plt_conninfra_wf_sleep) + consys_hw_ops->consys_plt_conninfra_wf_sleep(); + break; + + default: + consys_hw_force_conninfra_wakeup(); + consys_hw_adie_top_ck_en_off(off_radio); + consys_hw_force_conninfra_sleep(); + break; + } + } + + return 0; +} + +int consys_hw_wifi_power_ctl(unsigned int enable) +{ + return pmic_mng_wifi_power_ctrl(enable); +} + +int consys_hw_bt_power_ctl(unsigned int enable) +{ + return pmic_mng_bt_power_ctrl(enable); +} + +int consys_hw_gps_power_ctl(unsigned int enable) +{ + return pmic_mng_gps_power_ctrl(enable); +} + +int consys_hw_fm_power_ctl(unsigned int enable) +{ + return pmic_mng_fm_power_ctrl(enable); +} + +int consys_hw_dump_power_state(void) +{ + if (consys_hw_ops && consys_hw_ops->consys_plt_power_state) + consys_hw_ops->consys_plt_power_state(); + return 0; +} + +int consys_hw_spi_read(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int *data) +{ + if (consys_hw_ops->consys_plt_spi_read) + return consys_hw_ops->consys_plt_spi_read(subsystem, addr, data); + return -1; +} + +int consys_hw_spi_write(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int data) +{ + if (consys_hw_ops->consys_plt_spi_write) + return consys_hw_ops->consys_plt_spi_write(subsystem, addr, data); + return -1; +} + +int consys_hw_adie_top_ck_en_on(enum consys_drv_type type) +{ + if (consys_hw_ops->consys_plt_adie_top_ck_en_on_off_ctrl) + return consys_hw_ops->consys_plt_adie_top_ck_en_on_off_ctrl(type, 1); + return -1; +} + +int consys_hw_adie_top_ck_en_off(enum consys_drv_type type) +{ + if (consys_hw_ops->consys_plt_adie_top_ck_en_on_off_ctrl) + return consys_hw_ops->consys_plt_adie_top_ck_en_on_off_ctrl(type, 0); + return -1; +} + + +static int _consys_hw_conninfra_wakeup(void) +{ + int ref = g_conninfra_wakeup_ref_cnt; + bool wakeup = false, ret; + + if (consys_hw_ops->consys_plt_conninfra_wakeup) { + if (g_conninfra_wakeup_ref_cnt == 0) { + ret = consys_hw_ops->consys_plt_conninfra_wakeup(); + if (ret) { + pr_err("wakeup fail!! ret=[%d]\n", ret); + return ret; + } + wakeup = true; + } + + g_conninfra_wakeup_ref_cnt++; + } + + pr_info("conninfra_wakeup refcnt=[%d]->[%d] %s\n", + ref, g_conninfra_wakeup_ref_cnt, (wakeup ? "wakeup!!" : "")); + + return 0; +} + +static int _consys_hw_conninfra_sleep(void) +{ + int ref = g_conninfra_wakeup_ref_cnt; + bool sleep = false; + + if (consys_hw_ops->consys_plt_conninfra_sleep && + --g_conninfra_wakeup_ref_cnt == 0) { + sleep = true; + consys_hw_ops->consys_plt_conninfra_sleep(); + } + + if (g_conninfra_wakeup_ref_cnt < 0) + g_conninfra_wakeup_ref_cnt = 0; + + pr_info("conninfra_sleep refcnt=[%d]->[%d] %s\n", + ref, g_conninfra_wakeup_ref_cnt, (sleep ? "sleep!!" : "")); + + return 0; +} + +int consys_hw_force_conninfra_wakeup(void) +{ + return _consys_hw_conninfra_wakeup(); +} + +int consys_hw_force_conninfra_sleep(void) +{ + return _consys_hw_conninfra_sleep(); +} + +int consys_hw_spi_clock_switch(enum connsys_spi_speed_type type) +{ + if (consys_hw_ops->consys_plt_spi_clock_switch) + return consys_hw_ops->consys_plt_spi_clock_switch(type); + return -1; +} + +int consys_hw_pmic_event_cb(unsigned int id, unsigned int event) +{ + pmic_mng_event_cb(id, event); + return 0; +} + +int mtk_conninfra_probe(struct platform_device *pdev) +{ + int ret = -1; + + if (pdev) + g_pdev = pdev; + else { + pr_err("pdev is NULL\n"); + return -1; + } + + g_conninfra_plat_data = (const struct conninfra_plat_data*)of_device_get_match_data(&pdev->dev); + if (g_conninfra_plat_data == NULL) { + pr_err("Get platform data fail.\n"); + return -2; + } + + if (consys_hw_ops == NULL) + consys_hw_ops = (const struct consys_hw_ops_struct*)g_conninfra_plat_data->hw_ops; + if (consys_hw_ops == NULL) { + pr_err("Get HW op fail\n"); + return -3; + } + + /* Read device node */ + if (consys_reg_mng_init(pdev, g_conninfra_plat_data) != 0) { + pr_err("consys_plt_read_reg_from_dts fail\n"); + return -4; + } + + if (consys_hw_ops->consys_plt_clk_get_from_dts) { + if (consys_hw_ops->consys_plt_clk_get_from_dts(pdev) != 0) { + pr_err("consys_plt_clk_get_from_dts fail\n"); + return -5; + } + } + + /* HW operation init */ + if (consys_hw_init(pdev) != 0) { + pr_err("consys_hw_init fail\n"); + return -6; + } + + /* emi mng init */ + ret = emi_mng_init(pdev, g_conninfra_plat_data); + if (ret) { + pr_err("emi_mng init fail, %d\n", ret); + return -7; + } + + ret = pmic_mng_init(pdev, g_conninfra_dev_cb, g_conninfra_plat_data); + if (ret) { + pr_err("pmic_mng init fail, %d\n", ret); + return -8; + } + + return ret; +} + +int mtk_conninfra_remove(struct platform_device *pdev) +{ + int ret; + + ret = pmic_mng_deinit(); + pr_info("pmic_mng_deinit ret=%d\n", ret); + + ret = emi_mng_deinit(); + pr_info("emi_mng_deinit ret=%d\n", ret); + + if (consys_hw_ops->consys_plt_clk_detach) + consys_hw_ops->consys_plt_clk_detach(); + else + pr_err("consys_plt_clk_detach is null\n"); + + ret = consys_reg_mng_deinit(); + pr_info("consys_reg_mng_deinit ret=%d\n", ret); + + ret = consys_hw_deinit(); + pr_info("consys_hw_deinit ret=%d\n", ret); + + if (g_pdev) + g_pdev = NULL; + + return 0; +} + +int mtk_conninfra_suspend(struct platform_device *pdev, pm_message_t state) +{ + return 0; +} + +int mtk_conninfra_resume(struct platform_device *pdev) +{ + /* suspend callback is in atomic context, use schedule work to execute STEP */ + + schedule_work(&ap_resume_work); + return 0; +} + +static void consys_hw_ap_resume_handler(struct work_struct *work) +{ + if (g_conninfra_dev_cb && g_conninfra_dev_cb->conninfra_resume_cb) + (*g_conninfra_dev_cb->conninfra_resume_cb)(); +} + +int consys_hw_init(struct platform_device *pdev) +{ + int iRet = 0; + + if (consys_hw_ops->consys_plt_hw_init) + iRet = consys_hw_ops->consys_plt_hw_init(); + + return iRet; +} + +int consys_hw_deinit(void) +{ + return 0; +} + +int mtk_conninfra_drv_init(struct conninfra_dev_cb *dev_cb) +{ + int iRet = 0; + + g_conninfra_dev_cb = dev_cb; + + pr_info("Before platform_driver_register\n"); + + iRet = platform_driver_register(&mtk_conninfra_dev_drv); + if (iRet) + pr_err("Conninfra platform driver registered failed(%d)\n", iRet); + + pr_info("After platform_driver_register\n"); + + INIT_WORK(&ap_resume_work, consys_hw_ap_resume_handler); + + return iRet; +} + +int mtk_conninfra_drv_deinit(void) +{ + platform_driver_unregister(&mtk_conninfra_dev_drv); + g_conninfra_dev_cb = NULL; + return 0; +} + diff --git a/package/conninfra/src/platform/consys_hw_plat_data.c b/package/conninfra/src/platform/consys_hw_plat_data.c new file mode 100644 index 0000000..1841b53 --- /dev/null +++ b/package/conninfra/src/platform/consys_hw_plat_data.c @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2019 MediaTek Inc. + */ +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ +#include + +#include "consys_hw.h" + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +/* Platform data */ +#ifdef CONNINFRA_APSOC_MT7986 +extern struct conninfra_plat_data mt7986_plat_data; +const struct of_device_id apconninfra_of_ids[] = { + { + .compatible = "mediatek,mt7986-consys", + .data = (void*)&mt7986_plat_data, + }, + {} +}; +#endif + +#ifdef CONNINFRA_APSOC_MT7981 +extern struct conninfra_plat_data mt7981_plat_data; +const struct of_device_id apconninfra_of_ids[] = { + { + .compatible = "mediatek,mt7981-consys", + .data = (void*)&mt7981_plat_data, + }, + {} +}; +#endif diff --git a/package/conninfra/src/platform/consys_reg_mng.c b/package/conninfra/src/platform/consys_reg_mng.c new file mode 100644 index 0000000..e92a99d --- /dev/null +++ b/package/conninfra/src/platform/consys_reg_mng.c @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#define pr_fmt(fmt) KBUILD_MODNAME "@(%s:%d) " fmt, __func__, __LINE__ + +#include "consys_hw.h" +#include "consys_reg_mng.h" +#include "consys_reg_util.h" + +const struct consys_reg_mng_ops* g_consys_reg_ops = NULL; + +int consys_reg_mng_reg_readable(void) +{ + if (g_consys_reg_ops && + g_consys_reg_ops->consys_reg_mng_check_reable) + return g_consys_reg_ops->consys_reg_mng_check_reable(); + + return -1; +} + +int consys_reg_mng_is_connsys_reg(phys_addr_t addr) +{ + if (g_consys_reg_ops && + g_consys_reg_ops->consys_reg_mng_is_consys_reg) + return g_consys_reg_ops->consys_reg_mng_is_consys_reg(addr); + + return -1; +} + + +int consys_reg_mng_is_bus_hang(void) +{ + if (g_consys_reg_ops && + g_consys_reg_ops->consys_reg_mng_is_bus_hang) + return g_consys_reg_ops->consys_reg_mng_is_bus_hang(); + + return -1; +} + +int consys_reg_mng_dump_bus_status(void) +{ + if (g_consys_reg_ops && + g_consys_reg_ops->consys_reg_mng_dump_bus_status) + return g_consys_reg_ops->consys_reg_mng_dump_bus_status(); + + return -1; +} + +int consys_reg_mng_dump_conninfra_status(void) +{ + if (g_consys_reg_ops && + g_consys_reg_ops->consys_reg_mng_dump_conninfra_status) + return g_consys_reg_ops->consys_reg_mng_dump_conninfra_status(); + + return -1; +} + +int consys_reg_mng_dump_cpupcr(enum conn_dump_cpupcr_type dump_type, int times, unsigned long interval_us) +{ + if (g_consys_reg_ops && + g_consys_reg_ops->consys_reg_mng_dump_cpupcr) + return g_consys_reg_ops->consys_reg_mng_dump_cpupcr(dump_type, times, interval_us); + + return -1; +} + +int consys_reg_mng_init(struct platform_device *pdev, const struct conninfra_plat_data* plat_data) +{ + int ret = 0; + if (g_consys_reg_ops == NULL) + g_consys_reg_ops = (const struct consys_reg_mng_ops*)plat_data->reg_ops; + + if (g_consys_reg_ops && + g_consys_reg_ops->consys_reg_mng_init) + ret = g_consys_reg_ops->consys_reg_mng_init(pdev); + else + ret = EFAULT; + + return ret; +} + +int consys_reg_mng_deinit(void) +{ + if (g_consys_reg_ops&& + g_consys_reg_ops->consys_reg_mng_deinit) + g_consys_reg_ops->consys_reg_mng_deinit(); + + return 0; +} + +int consys_reg_mng_reg_read(unsigned long addr, unsigned int *value, unsigned int mask) +{ + void __iomem *vir_addr = NULL; + + vir_addr = ioremap_nocache(addr, 0x100); + if (!vir_addr) { + pr_err("ioremap fail\n"); + return -1; + } + + *value = (unsigned int)CONSYS_REG_READ(vir_addr) & mask; + + pr_info("[%x] mask=[%x]\n", *value, mask); + + iounmap(vir_addr); + return 0; +} + +int consys_reg_mng_reg_write(unsigned long addr, unsigned int value, unsigned int mask) +{ + void __iomem *vir_addr = NULL; + + vir_addr = ioremap_nocache(addr, 0x100); + if (!vir_addr) { + pr_err("ioremap fail\n"); + return -1; + } + + CONSYS_REG_WRITE_MASK(vir_addr, value, mask); + + iounmap(vir_addr); + return 0; +} + + +int consys_reg_mng_is_host_csr(unsigned long addr) +{ + if (g_consys_reg_ops && + g_consys_reg_ops->consys_reg_mng_is_host_csr) + return g_consys_reg_ops->consys_reg_mng_is_host_csr(addr); + + return -1; +} diff --git a/package/conninfra/src/platform/emi_mng.c b/package/conninfra/src/platform/emi_mng.c new file mode 100644 index 0000000..15a9028 --- /dev/null +++ b/package/conninfra/src/platform/emi_mng.c @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#include +#include +#include +#include +#include "osal.h" + +#include "consys_hw.h" +#include "emi_mng.h" + +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +unsigned long long gConEmiSize = 0; +phys_addr_t gConEmiPhyBase = 0x0; + +const struct consys_platform_emi_ops* consys_platform_emi_ops = NULL; + +struct consys_emi_addr_info connsys_emi_addr_info = { + .emi_ap_phy_base = 0, + .emi_ap_phy_size = 0, + .fw_emi_size = 0, +}; + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +int emi_mng_set_region_protection(void) +{ + if (consys_platform_emi_ops && + consys_platform_emi_ops->consys_ic_emi_set_region_protection) + return consys_platform_emi_ops->consys_ic_emi_set_region_protection(); + + return -1; +} + +int emi_mng_set_remapping_reg(void) +{ + if (consys_platform_emi_ops && + consys_platform_emi_ops->consys_ic_emi_set_remapping_reg) + return consys_platform_emi_ops->consys_ic_emi_set_remapping_reg(); + + return -1; +} + +struct consys_emi_addr_info* emi_mng_get_phy_addr(void) +{ + return &connsys_emi_addr_info; +} + +int emi_mng_init(struct platform_device *pdev, const struct conninfra_plat_data* plat_data) +{ + unsigned int fw_emi_size = 0; + +#ifdef CONFIG_CONNINFRA_EMI_SUPPORT + struct device_node *np; + struct reserved_mem *rmem; + + np = of_parse_phandle(pdev->dev.of_node, "memory-region", 0); + if (!np) { + pr_info("[%s] memory region not found.\n", __func__); + return -1; + } + + rmem = of_reserved_mem_lookup(np); + if (!rmem) { + pr_info("[%s] no memory-region\n", __func__); + return -1; + } else { + gConEmiPhyBase = rmem->base; + gConEmiSize = rmem->size; + } +#else + pr_info("Conninfra not support EMI reservation for %04x\n", plat_data->chip_id); +#endif /* CONFIG_CONNINFRA_EMI_SUPPORT */ + + if (consys_platform_emi_ops == NULL) { + consys_platform_emi_ops = (const struct consys_platform_emi_ops*)plat_data->platform_emi_ops; + } + + if (consys_platform_emi_ops && consys_platform_emi_ops->consys_ic_emi_get_fw_emi_size) + fw_emi_size = consys_platform_emi_ops->consys_ic_emi_get_fw_emi_size(); + + pr_info("[emi_mng_init] gConEmiPhyBase = [0x%llx] size = [0x%llx] fw size = [0x%x] ops=[%p]\n", + gConEmiPhyBase, gConEmiSize, fw_emi_size, consys_platform_emi_ops); + + if (gConEmiPhyBase) { + connsys_emi_addr_info.emi_ap_phy_base = gConEmiPhyBase; + connsys_emi_addr_info.emi_ap_phy_size = gConEmiSize; + connsys_emi_addr_info.fw_emi_size = fw_emi_size; + } else { + pr_err("consys emi memory address gConEmiPhyBase invalid\n"); + } + + return 0; +} + +int emi_mng_deinit(void) +{ + return 0; +} diff --git a/package/conninfra/src/platform/include/consys_hw.h b/package/conninfra/src/platform/include/consys_hw.h new file mode 100644 index 0000000..ab2ea88 --- /dev/null +++ b/package/conninfra/src/platform/include/consys_hw.h @@ -0,0 +1,255 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _PLATFORM_CONSYS_HW_H_ +#define _PLATFORM_CONSYS_HW_H_ + +#include +#include "conninfra.h" + +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + +#define CONN_SEMA_GET_SUCCESS 0 +#define CONN_SEMA_GET_FAIL 1 + +#define CONN_SEMA_TIMEOUT (1*1000) /* 1ms */ + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + +struct conninfra_dev_cb { + int (*conninfra_suspend_cb) (void); + int (*conninfra_resume_cb) (void); + int (*conninfra_pmic_event_notifier) (unsigned int, unsigned int); +}; + +typedef int(*CONSYS_PLT_HW_INIT)(void); +typedef int(*CONSYS_PLT_XTAL_CTRL_FAST_MODE)(void); +typedef int(*CONSYS_PLT_CONNSYS_SW_RESET_CTRL)(bool bassert); +typedef void(*CONSYS_PLT_SET_IF_PINMUX)(bool enable); +typedef int(*CONSYS_PLT_TX_RX_BUS_SLP_PROT_CTRL)(bool enable); +typedef int(*CONSYS_PLT_POLLING_CONSYS_CHIPID)(void); +typedef int(*CONSYS_PLT_BUS_CLOCK_CTRL)(enum consys_drv_type drv_type, unsigned int bus_clock); +typedef int(*CONSYS_PLT_D_DIE_CFG)(void); +typedef int(*CONSYS_PLT_CONNINFRA_SYSRAM_HW_CTRL)(void); +typedef int(*CONSYS_PLT_SPI_MASTER_CFG)(void); +typedef int(*CONSYS_PLT_A_DIE_CFG)(void); +typedef int(*CONSYS_PLT_AFE_WBG_CAL)(void); +typedef int(*CONSYS_PLT_SUBSYS_PLL_INITIAL)(void); +typedef int(*CONSYS_PLT_OSC_LEGACY_MODE)(void); +typedef int(*CONSYS_PLT_TOP_PWR_CTRL)(void); +typedef int(*CONSYS_PLT_CONN_INFRA_BUS_TIMEOUT)(void); +typedef int(*CONSYS_PLT_CLKGEN_WPLL_HW_CTRL)(void); +typedef int(*CONSYS_PLT_CONNINFRA_TOP_WAKEUP) (void); +typedef int(*CONSYS_PLT_CONNINFRA_TOP_SLEEP) (void); +typedef int(*CONSYS_PLT_ADIE_TOP_CK_EN_ON_OFF_CTRL)(enum consys_drv_type type, unsigned char on); +typedef int(*CONSYS_PLT_CONNINFRA_WF_WAKEUP) (void); +typedef int(*CONSYS_PLT_CONNINFRA_WF_SLEEP) (void); +typedef int(*CONSYS_PLT_CONN_WMCPU_SW_RESET) (bool bassert); +typedef int(*CONSYS_PLT_WF_BUS_SLP_PROT_CTRL)(bool enable); +typedef int(*CONSYS_PLT_WFSYS_TOP_ON_CTRL) (bool enable); +typedef int(*CONSYS_PLT_WFSYS_BUS_SLP_PROT_CHECK)(bool enable); +typedef int(*CONSYS_PLT_WFSYS_BUS_TIMEOUT_CTRL) (void); +typedef int(*CONSYS_PLT_CONN_WMCPU_IDLE_LOOP_CHECK) (void); +typedef int(*CONSYS_PLT_WPLL_CTRL)(bool enable); +typedef int(*CONSYS_PLT_CONNINFRA_WF_REQ_CLR) (void); +typedef int(*CONSYS_PLT_CLK_GET_FROM_DTS) (struct platform_device *pdev); +typedef int(*CONSYS_PLT_CLK_DETACH) (void); +typedef int(*CONSYS_PLT_CO_CLOCK_TYPE) (void); +typedef unsigned int(*CONSYS_PLT_SOC_CHIPID_GET) (void); +typedef unsigned int(*CONSYS_PLT_GET_HW_VER)(void); +typedef int(*CONSYS_PLT_SPI_READ)(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int *data); +typedef int(*CONSYS_PLT_SPI_WRITE)(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int data); +typedef int(*CONSYS_PLT_SPI_CLOCK_SWITCH)(enum connsys_spi_speed_type type); +typedef int(*CONSYS_PLT_POWER_STATE)(void); +typedef int(*CONSYS_PLT_AIDE_TYPE_CHECK)(void); +typedef int(*CONSYS_PLT_AIDE_TYPE_CFG)(void); + +struct consys_hw_ops_struct { + /* HW init */ + CONSYS_PLT_HW_INIT consys_plt_hw_init; + + /* Power on/off CONNSYS PART (by Conn_infra Driver) */ + CONSYS_PLT_XTAL_CTRL_FAST_MODE consys_plt_xtal_ctrl_fast_mode; + CONSYS_PLT_CONNSYS_SW_RESET_CTRL consys_plt_connsys_sw_reset_ctrl; + CONSYS_PLT_SET_IF_PINMUX consys_plt_set_if_pinmux; + CONSYS_PLT_TX_RX_BUS_SLP_PROT_CTRL consys_plt_tx_rx_bus_slp_prot_ctrl; + CONSYS_PLT_POLLING_CONSYS_CHIPID consys_plt_polling_consys_chipid; + CONSYS_PLT_BUS_CLOCK_CTRL consys_plt_bus_clock_ctrl; + CONSYS_PLT_D_DIE_CFG consys_plt_d_die_cfg; + CONSYS_PLT_CONNINFRA_SYSRAM_HW_CTRL consys_plt_conninfra_sysram_hw_ctrl; + CONSYS_PLT_SPI_MASTER_CFG consys_plt_spi_master_cfg; + CONSYS_PLT_A_DIE_CFG consys_plt_a_die_cfg; + CONSYS_PLT_AFE_WBG_CAL consys_plt_afe_wbg_cal; + CONSYS_PLT_SUBSYS_PLL_INITIAL consys_plt_subsys_pll_initial; + CONSYS_PLT_OSC_LEGACY_MODE consys_plt_osc_legacy_mode; + CONSYS_PLT_TOP_PWR_CTRL consys_plt_top_pwr_ctrl; + CONSYS_PLT_CONN_INFRA_BUS_TIMEOUT consys_plt_conn_infra_bus_timeout; + CONSYS_PLT_CLKGEN_WPLL_HW_CTRL consys_plt_clkgen_wpll_hw_ctrl; + CONSYS_PLT_CONNINFRA_TOP_WAKEUP consys_plt_conninfra_wakeup; + CONSYS_PLT_CONNINFRA_TOP_SLEEP consys_plt_conninfra_sleep; + CONSYS_PLT_ADIE_TOP_CK_EN_ON_OFF_CTRL consys_plt_adie_top_ck_en_on_off_ctrl; + CONSYS_PLT_WPLL_CTRL consys_plt_wpll_ctrl; + + /* Power on/off WFSYS PART 0 (by WF Driver) */ + CONSYS_PLT_CONNINFRA_WF_WAKEUP consys_plt_conninfra_wf_wakeup; + CONSYS_PLT_CONNINFRA_WF_SLEEP consys_plt_conninfra_wf_sleep; + CONSYS_PLT_CONN_WMCPU_SW_RESET consys_plt_conn_wmcpu_sw_reset; + CONSYS_PLT_WF_BUS_SLP_PROT_CTRL consys_plt_wf_bus_slp_prot_ctrl; + CONSYS_PLT_WFSYS_TOP_ON_CTRL consys_plt_wfsys_top_on_ctrl; + CONSYS_PLT_WFSYS_BUS_SLP_PROT_CHECK consys_plt_wfsys_bus_slp_prot_check; + CONSYS_PLT_WFSYS_BUS_TIMEOUT_CTRL consys_plt_wfsys_bus_timeout_ctrl; + CONSYS_PLT_CONN_WMCPU_IDLE_LOOP_CHECK consys_plt_conn_wmcpu_idle_loop_check; + CONSYS_PLT_CONNINFRA_WF_REQ_CLR consys_plt_conninfra_wf_req_clr; + + /* load from dts */ + CONSYS_PLT_CLK_GET_FROM_DTS consys_plt_clk_get_from_dts; + CONSYS_PLT_CLK_DETACH consys_plt_clk_detach; + + /* clock */ + CONSYS_PLT_CO_CLOCK_TYPE consys_plt_co_clock_type; + + CONSYS_PLT_SOC_CHIPID_GET consys_plt_soc_chipid_get; + + /* debug */ + CONSYS_PLT_GET_HW_VER consys_plt_get_hw_ver; + + /* For SPI operation */ + CONSYS_PLT_SPI_READ consys_plt_spi_read; + CONSYS_PLT_SPI_WRITE consys_plt_spi_write; + + /* For SPI clock switch */ + CONSYS_PLT_SPI_CLOCK_SWITCH consys_plt_spi_clock_switch; + + /* power state */ + CONSYS_PLT_POWER_STATE consys_plt_power_state; + + /* others */ + CONSYS_PLT_AIDE_TYPE_CHECK consys_plt_adie_type_check; + CONSYS_PLT_AIDE_TYPE_CFG consys_plt_adie_type_cfg; +}; + +struct consys_hw_env { + bool valid; + unsigned int adie_hw_version; + unsigned int adie_id; + int is_rc_mode; +}; + +struct conninfra_plat_data { + const unsigned int chip_id; + const void* hw_ops; + const void* reg_ops; + const void* platform_emi_ops; + const void* platform_pmic_ops; +}; + +extern struct consys_hw_env conn_hw_env[AIDE_NUM_MAX]; +extern struct consys_base_addr conn_reg; +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ +int mtk_conninfra_drv_init(struct conninfra_dev_cb *dev_cb); +int mtk_conninfra_drv_deinit(void); + +int consys_hw_pwr_on(unsigned int curr_status, unsigned int on_radio); +int consys_hw_pwr_off(unsigned int curr_status, unsigned int off_radio); + +int consys_hw_wifi_power_ctl(unsigned int enable); +int consys_hw_bt_power_ctl(unsigned int enable); +int consys_hw_gps_power_ctl(unsigned int enable); +int consys_hw_fm_power_ctl(unsigned int enable); +int consys_hw_pmic_event_cb(unsigned int id, unsigned int event); + +unsigned int consys_hw_chipid_get(void); + +int consys_hw_get_clock_schematic(void); +unsigned int consys_hw_get_hw_ver(void); + +/******************************************************************************* +* tempoary for STEP +******************************************************************************** +*/ +/* + * return + * 1 : can read + * 0 : can't read + * -1: not consys register + */ +int consys_hw_reg_readable(void); +int consys_hw_is_connsys_reg(phys_addr_t addr); +/* + * 0 means NO hang + * > 0 means hang!! + */ +int consys_hw_is_bus_hang(void); +int consys_hw_dump_bus_status(void); + +int consys_hw_spi_read(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int *data); +int consys_hw_spi_write(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int data); + +int consys_hw_adie_top_ck_en_on(enum consys_drv_type type); +int consys_hw_adie_top_ck_en_off(enum consys_drv_type type); + +/* NOTE: debug only*/ +int consys_hw_force_conninfra_wakeup(void); +int consys_hw_force_conninfra_sleep(void); + +int consys_hw_spi_clock_switch(enum connsys_spi_speed_type type); + +struct platform_device *get_consys_device(void); +struct consys_base_addr *get_conn_reg_base_addr(void); + +int consys_hw_dump_power_state(void); +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +#endif /* _PLATFORM_CONSYS_HW_H_ */ diff --git a/package/conninfra/src/platform/include/consys_reg_base.h b/package/conninfra/src/platform/include/consys_reg_base.h new file mode 100644 index 0000000..b16dc62 --- /dev/null +++ b/package/conninfra/src/platform/include/consys_reg_base.h @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _PLATFORM_CONSYS_REG_BASE_H_ +#define _PLATFORM_CONSYS_REG_BASE_H_ + +struct consys_reg_base_addr { + unsigned long phy_addr; + unsigned long long size; + unsigned long vir_addr; +}; + +#endif /* _PLATFORM_CONSYS_REG_BASE_H_ */ diff --git a/package/conninfra/src/platform/include/consys_reg_mng.h b/package/conninfra/src/platform/include/consys_reg_mng.h new file mode 100644 index 0000000..57f08af --- /dev/null +++ b/package/conninfra/src/platform/include/consys_reg_mng.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _PLATFORM_CONSYS_REG_MNG_H_ +#define _PLATFORM_CONSYS_REG_MNG_H_ + +#include + +#include "consys_hw.h" + +enum conn_dump_cpupcr_type +{ + CONN_DUMP_CPUPCR_TYPE_BT = 1, + CONN_DUMP_CPUPCR_TYPE_WF = 2, + CONN_DUMP_CPUPCR_TYPE_ALL = 3, +}; + +struct consys_reg_mng_ops { + int(*consys_reg_mng_init) (struct platform_device *pdev); + int(*consys_reg_mng_deinit) (void); + int(*consys_reg_mng_check_reable) (void); + int(*consys_reg_mng_is_consys_reg) (unsigned int addr); + int(*consys_reg_mng_is_bus_hang) (void); + int(*consys_reg_mng_dump_bus_status) (void); + int(*consys_reg_mng_dump_conninfra_status) (void); + int(*consys_reg_mng_dump_cpupcr) (enum conn_dump_cpupcr_type, int times, unsigned long interval_us); + int(*consys_reg_mng_is_host_csr) (unsigned long addr); +}; + +int consys_reg_mng_init(struct platform_device *pdev, const struct conninfra_plat_data* plat_data); +int consys_reg_mng_deinit(void); +int consys_reg_mng_reg_readable(void); +int consys_reg_mng_is_connsys_reg(phys_addr_t addr); +int consys_reg_mng_reg_read(unsigned long addr, unsigned int *value, unsigned int mask); +int consys_reg_mng_reg_write(unsigned long addr, unsigned int value, unsigned int mask); +int consys_reg_mng_is_bus_hang(void); +int consys_reg_mng_dump_bus_status(void); +int consys_reg_mng_dump_conninfra_status(void); +int consys_reg_mng_dump_cpupcr(enum conn_dump_cpupcr_type dump_type, int times, unsigned long interval_us); +int consys_reg_mng_is_host_csr(unsigned long addr); + +#endif /* _PLATFORM_CONSYS_REG_MNG_H_ */ diff --git a/package/conninfra/src/platform/include/consys_reg_util.h b/package/conninfra/src/platform/include/consys_reg_util.h new file mode 100644 index 0000000..65ddc05 --- /dev/null +++ b/package/conninfra/src/platform/include/consys_reg_util.h @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _PLATFORM_CONSYS_REG_UTIL_H_ +#define _PLATFORM_CONSYS_REG_UTIL_H_ + +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ +/* platform dependent */ +#include "plat_def.h" + +#ifndef BIT +#define BIT(x) (1<<(x)) +#endif + +#define KBYTE (1024*sizeof(char)) +#ifndef GENMASK +#define GENMASK(h, l) \ + (((~0UL) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1 - (h)))) +#endif + +#define GET_BIT_MASK(value, mask) ((value) & (mask)) +#define SET_BIT_MASK(pdest, value, mask) (*(pdest) = (GET_BIT_MASK(*(pdest), ~(mask)) | GET_BIT_MASK(value, mask))) +#define GET_BIT_RANGE(data, end, begin) ((data) & GENMASK(end, begin)) +#define SET_BIT_RANGE(pdest, data, end, begin) (SET_BIT_MASK(pdest, data, GENMASK(end, begin))) + +#define CONSYS_SET_BIT(REG, BITVAL) (*((volatile unsigned int *)(REG)) |= ((unsigned int)(BITVAL))) +#define CONSYS_CLR_BIT(REG, BITVAL) ((*(volatile unsigned int *)(REG)) &= ~((unsigned int)(BITVAL))) +#define CONSYS_CLR_BIT_WITH_KEY(REG, BITVAL, KEY) {\ + unsigned int val = (*(volatile unsigned int *)(REG)); \ + val &= ~((unsigned int)(BITVAL)); \ + val |= ((unsigned int)(KEY)); \ + (*(volatile unsigned int *)(REG)) = val;\ +} +#define CONSYS_REG_READ(addr) (*((volatile unsigned int *)(addr))) +#define CONSYS_REG_READ_BIT(addr, BITVAL) (*((volatile unsigned int *)(addr)) & ((unsigned int)(BITVAL))) +#define CONSYS_REG_WRITE(addr, data) mt_reg_sync_writel(data, addr) +#define CONSYS_REG_WRITE_RANGE(reg, data, end, begin) {\ + unsigned int val = CONSYS_REG_READ(reg); \ + SET_BIT_RANGE(&val, data, end, begin); \ + CONSYS_REG_WRITE(reg, val); \ +} +#define CONSYS_REG_WRITE_MASK(reg, data, mask) {\ + unsigned int val = CONSYS_REG_READ(reg); \ + SET_BIT_MASK(&val, data, mask); \ + CONSYS_REG_WRITE(reg, val); \ +} + +/* + * Write value with value_offset bits of right shift and size bits, + * to the reg_offset-th bit of address reg + * value -----------XXXXXXXXXXXX------------------- + * |<--size-->|<--value_offset-->| + * reg -------------OOOOOOOOOOOO----------------- + * |<--size-->|<--reg_offset-->| + * result -------------XXXXXXXXXXXX----------------- + */ +#define CONSYS_REG_WRITE_OFFSET_RANGE(reg, value, reg_offset, value_offset, size) ({\ + unsigned int data = (value) >> (value_offset); \ + data = GET_BIT_RANGE(data, size, 0); \ + data = data << (reg_offset); \ + CONSYS_REG_WRITE_RANGE(reg, data, ((reg_offset) + ((size) - 1)), reg_offset); \ +}) + +#define CONSYS_REG_WRITE_BIT(reg, offset, val) CONSYS_REG_WRITE_OFFSET_RANGE(reg, ((val) & 1), offset, 0, 1) + +#define CONSYS_REG_BIT_POLLING(addr, bit_index, exp_val, loop, delay, success) {\ + unsigned int polling_count = 0; \ + unsigned int reg_value = 0; \ + success = 0; \ + reg_value = (CONSYS_REG_READ_BIT(addr, (0x1 << bit_index)) >> bit_index); \ + while (reg_value != exp_val) { \ + if (polling_count > loop) { \ + success = -1; \ + break; \ + } \ + reg_value = (CONSYS_REG_READ_BIT(addr, (0x1 << bit_index)) >> bit_index); \ + udelay(delay); \ + polling_count++; \ + } \ +} + +#define CONSYS_REG_POLLING_LARGER_OR_EQUAL(addr, mask, bit_index, exp_val, loop, delay, success) {\ + unsigned int polling_count = 0; \ + unsigned int reg_value = 0; \ + success = 0; \ + reg_value = ((CONSYS_REG_READ(addr) & mask) >> bit_index); \ + while (reg_value < exp_val) { \ + if (polling_count > loop) { \ + success = -1; \ + break; \ + } \ + reg_value = ((CONSYS_REG_READ(addr) & mask) >> bit_index); \ + udelay(delay); \ + polling_count++; \ + } \ +} + +#define CONSYS_REG_POLLING_EQUAL(addr, mask, bit_index, exp_val, loop, delay, success) {\ + unsigned int polling_count = 0; \ + unsigned int reg_value = 0; \ + success = 0; \ + reg_value = ((CONSYS_REG_READ(addr) & mask) >> bit_index); \ + while (reg_value != exp_val) { \ + if (polling_count > loop) { \ + success = -1; \ + break; \ + } \ + reg_value = ((CONSYS_REG_READ(addr) & mask) >> bit_index); \ + udelay(delay); \ + polling_count++; \ + } \ +} + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +#endif /* _PLATFORM_CONSYS_REG_UTIL_H_ */ diff --git a/package/conninfra/src/platform/include/emi_mng.h b/package/conninfra/src/platform/include/emi_mng.h new file mode 100644 index 0000000..93e619e --- /dev/null +++ b/package/conninfra/src/platform/include/emi_mng.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _PLATFORM_EMI_MNG_H_ +#define _PLATFORM_EMI_MNG_H_ + +#include +#include +#include "osal.h" + +#include "consys_hw.h" + +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + +struct consys_emi_addr_info { + /* This include BT/WF FW and WFDMA */ + phys_addr_t emi_ap_phy_base; + unsigned int emi_ap_phy_size; + unsigned int fw_emi_size; +}; + +typedef int(*CONSYS_IC_EMI_SET_REGION_PROTECTION) (void); +typedef int(*CONSYS_IC_EMI_SET_REMAPPING_REG) (void); +typedef unsigned int (*CONSYS_IC_GET_FW_EMI_SIZE)(void); + +struct consys_platform_emi_ops { + CONSYS_IC_EMI_SET_REGION_PROTECTION consys_ic_emi_set_region_protection; + CONSYS_IC_EMI_SET_REMAPPING_REG consys_ic_emi_set_remapping_reg; + CONSYS_IC_GET_FW_EMI_SIZE consys_ic_emi_get_fw_emi_size; +}; + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + +int emi_mng_init(struct platform_device *pdev, const struct conninfra_plat_data* plat_data); +int emi_mng_deinit(void); + +int emi_mng_set_region_protection(void); +int emi_mng_set_remapping_reg(void); +struct consys_emi_addr_info* emi_mng_get_phy_addr(void); + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +#endif /* _PLATFORM_EMI_MNG_H_ */ + diff --git a/package/conninfra/src/platform/include/plat_def.h b/package/conninfra/src/platform/include/plat_def.h new file mode 100644 index 0000000..7c2a4f6 --- /dev/null +++ b/package/conninfra/src/platform/include/plat_def.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _PLATFORM_DEF_H_ +#define _PLATFORM_DEF_H_ + +#include +#include + +#define mt_reg_sync_writel(v, a) \ + do { \ + writel((v), (void __force __iomem *)((a))); \ + mb(); \ + } while (0) + +#endif /* _PLATFORM_DEF_H_ */ diff --git a/package/conninfra/src/platform/include/pmic_mng.h b/package/conninfra/src/platform/include/pmic_mng.h new file mode 100644 index 0000000..8ee3243 --- /dev/null +++ b/package/conninfra/src/platform/include/pmic_mng.h @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _PLATFORM_PMIC_MNG_H_ +#define _PLATFORM_PMIC_MNG_H_ + +#include + +#include "consys_hw.h" + +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + +typedef int(*CONSYS_PMIC_GET_FROM_DTS) ( + struct platform_device *pdev, + struct conninfra_dev_cb* dev_cb); + +typedef int(*CONSYS_PMIC_COMMON_POWER_CTRL) (unsigned int enable); + +typedef int(*CONSYS_PMIC_WIFI_POWER_CTRL) (unsigned int enable); +typedef int(*CONSYS_PMIC_BT_POWER_CTRL) (unsigned int enable); +typedef int(*CONSYS_PMIC_GPS_POWER_CTRL) (unsigned int enable); +typedef int(*CONSYS_PMIC_FM_POWER_CTRL) (unsigned int enable); +typedef int(*CONSYS_PMIC_EVENT_NOTIFIER) (unsigned int id, unsigned int event); + +struct consys_platform_pmic_ops { + CONSYS_PMIC_GET_FROM_DTS consys_pmic_get_from_dts; + /* vcn 18 */ + CONSYS_PMIC_COMMON_POWER_CTRL consys_pmic_common_power_ctrl; + CONSYS_PMIC_WIFI_POWER_CTRL consys_pmic_wifi_power_ctrl; + CONSYS_PMIC_BT_POWER_CTRL consys_pmic_bt_power_ctrl; + CONSYS_PMIC_GPS_POWER_CTRL consys_pmic_gps_power_ctrl; + CONSYS_PMIC_FM_POWER_CTRL consys_pmic_fm_power_ctrl; + CONSYS_PMIC_EVENT_NOTIFIER consys_pmic_event_notifier; +}; + + + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + +int pmic_mng_init( + struct platform_device *pdev, + struct conninfra_dev_cb* dev_cb, + const struct conninfra_plat_data* plat_data); +int pmic_mng_deinit(void); + +int pmic_mng_common_power_ctrl(unsigned int enable); +int pmic_mng_wifi_power_ctrl(unsigned int enable); +int pmic_mng_bt_power_ctrl(unsigned int enable); +int pmic_mng_gps_power_ctrl(unsigned int enable); +int pmic_mng_fm_power_ctrl(unsigned int enable); +int pmic_mng_event_cb(unsigned int id, unsigned int event); + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +#endif /* _PLATFORM_PMIC_MNG_H_ */ diff --git a/package/conninfra/src/platform/mt7981/include/mt7981.h b/package/conninfra/src/platform/mt7981/include/mt7981.h new file mode 100644 index 0000000..48b1e27 --- /dev/null +++ b/package/conninfra/src/platform/mt7981/include/mt7981.h @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _PLATFORM_MT7981_H_ +#define _PLATFORM_MT7981_H_ + +enum +{ + ADIE_TYPE_NONE = 0, + ADIE_TYPE_ONE, + ADIE_TYPE_TWO, + ADIE_TYPE_NUM_MAX +}; + +enum conn_semaphore_type +{ + CONN_SEMA_CHIP_POWER_ON_INDEX = 0, + CONN_SEMA_CALIBRATION_INDEX = 1, + CONN_SEMA_FW_DL_INDEX = 2, + CONN_SEMA_CLOCK_SWITCH_INDEX = 3, + CONN_SEMA_CCIF_INDEX = 4, + CONN_SEMA_COEX_INDEX = 5, + CONN_SEMA_USB_EP0_INDEX = 6, + CONN_SEMA_USB_SHARED_INFO_INDEX = 7, + CONN_SEMA_USB_SUSPEND_INDEX = 8, + CONN_SEMA_USB_RESUME_INDEX = 9, + CONN_SEMA_PCIE_INDEX = 10, + CONN_SEMA_RFSPI_INDEX = 11, + CONN_SEMA_EFUSE_INDEX = 12, + CONN_SEMA_THERMAL_INDEX = 13, + CONN_SEMA_FLASH_INDEX = 14, + CONN_SEMA_DEBUG_INDEX = 15, + CONN_SEMA_WIFI_LP_INDEX = 16, + CONN_SEMA_PATCH_DL_INDEX = 17, + CONN_SEMA_SHARED_VAR_INDEX = 18, + CONN_SEMA_CONN_INFRA_COMMON_SYSRAM_INDEX = 19, + CONN_SEMA_NUM_MAX = 32 /* can't be omitted */ +}; + +unsigned int consys_soc_chipid_get(void); +unsigned int consys_get_hw_ver(void); + + +#endif /* _PLATFORM_MT7981_H_ */ diff --git a/package/conninfra/src/platform/mt7981/include/mt7981_consys_reg.h b/package/conninfra/src/platform/mt7981/include/mt7981_consys_reg.h new file mode 100644 index 0000000..ffa8b5c --- /dev/null +++ b/package/conninfra/src/platform/mt7981/include/mt7981_consys_reg.h @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _PLATFORM_MT7981_CONSYS_REG_H_ +#define _PLATFORM_MT7981_CONSYS_REG_H_ + +#include "consys_reg_base.h" +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ +enum consys_base_addr_index { + TOP_MISC_BASE = 0, /* top_misc */ + TOPRGU_BASE = 1, /* TOPRGU */ + GPIO_BASE = 2, /* GPIO */ + IOCFG_TM_BASE = 3, /* IOCFG_TM */ + IOCFG_LT_BASE = 4, /* IOCFG_LT */ + INFRACFG_AO_BASE = 5, /* infracfg_ao_auto_gen_reg */ + CONN_INFRA_CFG_BASE = 6, /* conn_infra_cfg */ + CONN_INFRA_SYSRAM_BASE = 7, /* conn_infra_sysram */ + CONN_INFRA_CLKGEN_ON_TOP_BASE = 8, /* conn_infra_clkgen_on_top */ + CONN_HOST_CSR_TOP_BASE = 9, /* conn_host_csr_top */ + CONN_INFRA_BUS_CR_BASE = 10, /* conn_infra_bus_cr */ + CONN_INFRA_RGU_BASE = 11, /* conn_infra_rgu */ + CONN_WT_SLP_CTL_REG_BASE = 12, /* conn_wt_slp_ctl_reg */ + INST2_CONN_WT_SLP_CTL_REG_BASE = 13, /* Inst2_conn_wt_slp_ctl_reg */ + CONN_RF_SPI_MST_REG_BASE = 14, /* conn_rf_spi_mst_reg */ + INST2_CONN_RF_SPI_MST_REG_BASE = 15, /* Inst2_conn_rf_spi_mst_reg */ + CONN_SEMAPHORE_BASE = 16, /* conn_semaphore */ + CONN_AFE_CTL_BASE = 17, /* conn_afe_ctl */ + CONN_AFE_CTL_2ND_BASE = 18, /* conn_afe_ctl_2nd */ + WF_TOP_SLPPROT_ON_BASE = 19, /* wf_top_slpprot_on by remapping to 0x81020000 */ + WF_TOP_CFG_BASE = 20, /* wf_top_cfg by remapping to 0x80020000 */ + WF_MCU_CONFIG_LS_BASE = 21, /* wf_mcu_confg_ls by remapping to 0x88000000 */ + WF_MCU_BUS_CR_BASE = 22, /* wf_mcu_bus_cr by remapping to 0x830C0XXX */ + WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_BASE = 23, /* wf_mcusys_infra_bus_full_u_debug_ctrl_ao by remapping to 0x810F0000 */ + WF_TOP_CFG_ON_BASE = 24, /* wf_top_cfg_on by remapping to 0x81021000 */ + CONSYS_BASE_ADDR_MAX +}; + +struct consys_base_addr { + struct consys_reg_base_addr reg_base_addr[CONSYS_BASE_ADDR_MAX]; +}; + +extern struct consys_base_addr conn_reg; + +#define REG_TOP_MISC_ADDR conn_reg.reg_base_addr[TOP_MISC_BASE].vir_addr +#define REG_TOP_RGU_ADDR conn_reg.reg_base_addr[TOPRGU_BASE].vir_addr +#define REG_GPIO_BASE_ADDR conn_reg.reg_base_addr[GPIO_BASE].vir_addr +#define REG_IOCFG_TM_ADDR conn_reg.reg_base_addr[IOCFG_TM_BASE].vir_addr +#define REG_IOCFG_LT_ADDR conn_reg.reg_base_addr[IOCFG_LT_BASE].vir_addr +#define REG_INFRACFG_AO_ADDR conn_reg.reg_base_addr[INFRACFG_AO_BASE].vir_addr +#define REG_CONN_INFRA_CFG_ADDR conn_reg.reg_base_addr[CONN_INFRA_CFG_BASE].vir_addr +#define REG_CONN_INFRA_SYSRAM_ADDR conn_reg.reg_base_addr[CONN_INFRA_SYSRAM_BASE].vir_addr +#define REG_CONN_INFRA_CLKGEN_ON_TOP_ADDR conn_reg.reg_base_addr[CONN_INFRA_CLKGEN_ON_TOP_BASE].vir_addr +#define REG_CONN_HOST_CSR_TOP_ADDR conn_reg.reg_base_addr[CONN_HOST_CSR_TOP_BASE].vir_addr +#define REG_CONN_INFRA_BUS_CR_ADDR conn_reg.reg_base_addr[CONN_INFRA_BUS_CR_BASE].vir_addr +#define REG_CONN_INFRA_RGU_ADDR conn_reg.reg_base_addr[CONN_INFRA_RGU_BASE].vir_addr +#define REG_CONN_WT_SLP_CTL_REG_ADDR conn_reg.reg_base_addr[CONN_WT_SLP_CTL_REG_BASE].vir_addr +#define REG_INST2_CONN_WT_SLP_CTL_REG_ADDR conn_reg.reg_base_addr[INST2_CONN_WT_SLP_CTL_REG_BASE].vir_addr +#define REG_CONN_RF_SPI_MST_REG_ADDR conn_reg.reg_base_addr[CONN_RF_SPI_MST_REG_BASE].vir_addr +#define REG_INST2_CONN_RF_SPI_MST_REG_ADDR conn_reg.reg_base_addr[INST2_CONN_RF_SPI_MST_REG_BASE].vir_addr +#define REG_CONN_SEMAPHORE_ADDR conn_reg.reg_base_addr[CONN_SEMAPHORE_BASE].vir_addr +#define REG_CONN_AFE_CTL_ADDR conn_reg.reg_base_addr[CONN_AFE_CTL_BASE].vir_addr +#define REG_CONN_AFE_CTL_2ND_ADDR conn_reg.reg_base_addr[CONN_AFE_CTL_2ND_BASE].vir_addr +#define REG_WF_TOP_SLPPROT_ON_ADDR conn_reg.reg_base_addr[WF_TOP_SLPPROT_ON_BASE].vir_addr +#define REG_WF_TOP_CFG_ADDR conn_reg.reg_base_addr[WF_TOP_CFG_BASE].vir_addr +#define REG_WF_MCU_CONFIG_LS_ADDR conn_reg.reg_base_addr[WF_MCU_CONFIG_LS_BASE].vir_addr +#define REG_WF_MCU_BUS_CR_ADDR conn_reg.reg_base_addr[WF_MCU_BUS_CR_BASE].vir_addr +#define REG_WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_ADDR conn_reg.reg_base_addr[WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_BASE].vir_addr +#define REG_WF_TOP_CFG_ON_ADDR conn_reg.reg_base_addr[WF_TOP_CFG_ON_BASE].vir_addr + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +struct consys_base_addr* get_conn_reg_base_addr(void); + +#endif /* _PLATFORM_MT7981_CONSYS_REG_H_ */ diff --git a/package/conninfra/src/platform/mt7981/include/mt7981_consys_reg_offset.h b/package/conninfra/src/platform/mt7981/include/mt7981_consys_reg_offset.h new file mode 100644 index 0000000..bd50361 --- /dev/null +++ b/package/conninfra/src/platform/mt7981/include/mt7981_consys_reg_offset.h @@ -0,0 +1,243 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _PLATFORM_MT7981_CONSYS_REG_OFFSET_H_ +#define _PLATFORM_MT7981_CONSYS_REG_OFFSET_H_ + +/**********************************************************************/ +/* Base: TOP_MISC (0x11D1_0000) */ +/**********************************************************************/ +#define CONNSYS_MISC 0x0114 +#define TOP_MISC_RSRV_ALL1_3 0x021C + + +/**********************************************************************/ +/* Base: TOP RGU (0x1001_C000) */ +/**********************************************************************/ +#define TOP_RGU_WDT_SWSYSRST 0x0018 + +/**********************************************************************/ +/* Base: GPIO (0x11D0_0000) */ +/**********************************************************************/ +#define GPIO_MODE5 0x0350 +#define GPIO_MODE6 0x0360 +#define GPIO_MODE7 0x0370 + +/**********************************************************************/ +/* Base: IOCFG_TM (0x11F0_0000) */ +/**********************************************************************/ +#define IOCFG_TM_DRV_CFG0 0x0000 +#define IOCFG_TM_DRV_CFG1 0x0010 + +/**********************************************************************/ +/* Base: IOCFG_LT (0x11F1_0000) */ +/**********************************************************************/ +#define IOCFG_LT_DRV_CFG0 0x0000 +#define IOCFG_LT_DRV_CFG1 0x0010 + +/**********************************************************************/ +/* Base: INFRACFG_AO (0x1000_3000) */ +/**********************************************************************/ +#define CONN2AP_GALS_SLPPROT 0x00D0 +#define AP2CONN_GALS_SLPPROT 0x00D4 + +/**********************************************************************/ +/* Base: CONN_INFRA_CFG (0x1800_1000) */ +/**********************************************************************/ +#define CONN_INFRA_CFG_IP_VERSION 0x0000 +#define EFUSE 0x0020 +#define ADIE_CTL 0x0030 +#define CONN_INFRA_CFG_PWRCTRL0 0x0200 +#define CONN_INFRA_CFG_RC_CTL_0 0x0380 +#define OSC_CTL_0 0x0300 +#define EMI_CTL_WF 0x0414 +#define CONN_INFRA_WF_SLP_CTRL 0x0540 +#define CONN_INFRA_WF_SLP_STATUS 0x0544 + +/**********************************************************************/ +/* Base: CONN_INFRA_SYSRAM (0x1805_0000) */ +/**********************************************************************/ +#define SYSRAM_BASE_ADDR 0x0000 + +/**********************************************************************/ +/* Base: CONN_INFRA_CLKGEN_ON_TOP (0x1800_9000) */ +/**********************************************************************/ +#define CKGEN_BUS_WPLL_DIV_1 0x0008 +#define CKGEN_BUS_WPLL_DIV_2 0x000C +#define CKGEN_RFSPI_WPLL_DIV 0x0040 +#define CKGEN_BUS 0x0A00 + +/**********************************************************************/ +/* Base: CONN_HOST_CSR_TOP (0x1806_0000) */ +/**********************************************************************/ +#define CONN_INFRA_WAKEPU_TOP 0x01A0 +#define CONN_INFRA_WAKEPU_WF 0x01A4 +#define CONN2AP_REMAP_MCU_EMI 0x01C4 +#define CONN2AP_REMAP_WF_PERI 0x01D4 +#define CONN2AP_RSVD_PERI_REGION1 0x01D8 +#define DBG_DUMMY_3 0x02CC + +/**********************************************************************/ +/* Base: CONN_INFRA_BUS_CR (0x1800_E000) */ +/**********************************************************************/ +#define CONN_INFRA_BUS_OFF_TIMEOUT_CTRL 0x0300 +#define CONN_INFRA_BUS_ON_TIMEOUT_CTRL 0x031C +#define CONN2AP_EMI_PATH_ADDR_START 0x0360 +#define CONN2AP_EMI_PATH_ADDR_END 0x0364 + +/**********************************************************************/ +/* Base: CONN_INFRA_RGU (0x1800_0000) */ +/**********************************************************************/ +#define WFSYS_ON_TOP_PWR_CTL 0x0010 +#define BGFYS_ON_TOP_PWR_CTL 0x0020 +#define SYSRAM_HWCTL_PDN 0x0050 +#define SYSRAM_HWCTL_SLP 0x0054 +#define WFSYS_CPU_SW_RST_B 0x0120 + +/**********************************************************************/ +/* Base: CONN_WT_SLP_CTL_REG (0x1800_5000) */ +/* Base: INST2_CONN_WT_SLP_CTL_REG (0x1808_5000) */ +/**********************************************************************/ +#define WB_WF_CK_ADDR 0x0070 +#define WB_WF_WAKE_ADDR 0x0074 +#define WB_WF_ZPS_ADDR 0x0078 +#define WB_TOP_CK_ADDR 0x0084 +#define WB_WF_B0_CMD_ADDR 0x008C +#define WB_WF_B1_CMD_ADDR 0x0090 +#define WB_SLP_TOP_CK_0 0x0120 +#define WB_SLP_TOP_CK_1 0x0124 + +/**********************************************************************/ +/* Base: CONN_RF_SPI_MST_REG (0x1800_4000) */ +/* Base: INST2_CONN_RF_SPI_MST_REG (0x1808_4000) */ +/**********************************************************************/ +#define SPI_STA 0x0000 +#define SPI_WF_ADDR 0x0010 +#define SPI_WF_WDAT 0x0014 +#define SPI_WF_RDAT 0x0018 +#define SPI_BT_ADDR 0x0020 +#define SPI_BT_WDAT 0x0024 +#define SPI_BT_RDAT 0x0028 +#define SPI_FM_ADDR 0x0030 +#define SPI_FM_WDAT 0x0034 +#define SPI_FM_RDAT 0x0038 +#define SPI_GPS_ADDR 0x0040 +#define SPI_GPS_WDAT 0x0044 +#define SPI_GPS_RDAT 0x0048 +#define SPI_TOP_ADDR 0x0050 +#define SPI_TOP_WDAT 0x0054 +#define SPI_TOP_RDAT 0x0058 + +/**********************************************************************/ +/* Base: CONN_SEMAPHORE_BASE (0x1807_0000) */ +/**********************************************************************/ +#define CONN_SEMA00_M2_OWN_STA 0x2000 +#define CONN_SEMA00_M2_OWN_REL 0x2200 +#define CONN_SEMA_OWN_BY_M0_STA_REP 0x0400 +#define CONN_SEMA_OWN_BY_M1_STA_REP 0x1400 +#define CONN_SEMA_OWN_BY_M2_STA_REP 0x2400 +#define CONN_SEMA_OWN_BY_M3_STA_REP 0x3400 +#define CONN_SEMA_OWN_BY_M4_STA_REP 0x4400 +#define CONN_SEMA_OWN_BY_M5_STA_REP 0x5400 +#define CONN_SEMA_OWN_BY_M6_STA_REP 0x6400 +#define CONN_SEMA_OWN_BY_M7_STA_REP 0x7400 + +/**********************************************************************/ +/* Base: CONN_AFE_CTL_BASE (0x1800_3000) */ +/* Base: CONN_AFE_CTL_2ND_BASE (0x1808_3000) */ +/**********************************************************************/ +#define RG_DIG_EN_01 0x0000 +#define RG_DIG_EN_02 0x0004 +#define RG_DIG_EN_03 0x0008 +#define RG_DIG_TOP_01 0x000C +#define RG_PLL_STB_TIME 0x00F4 + +/**********************************************************************/ +/* Base: WF_TOP_SLPPROT_ON_BASE (0x8102_0000 remap to 0x184C_0000) */ +/**********************************************************************/ +#define WF_TOP_SLPPROT_ON_STATUS_READ 0x300C + +/**********************************************************************/ +/* Base: WF_TOP_CFG_BASE (0x8002_0000 remap to 0x184B_0000) */ +/**********************************************************************/ +#define WF_TOP_CFG_IP_VERSION 0x0010 + +/**********************************************************************/ +/* Base: WF_MCU_CONFIG_LS_BASE (0x8800_0000 remap to 0x184F_0000) */ +/**********************************************************************/ +#define BUSHANGCR 0x0440 + +/**********************************************************************/ +/* Base: WF_MCU_BUS_CR_BASE (0x830C_0XXX remap to 0x1840_0XXX) */ +/**********************************************************************/ +#define AP2WF_REMAP_1 0x0120 + +/**********************************************************************/ +/* Base: WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_BASE (0x810F_0000 remap to 0x1850_0000) */ +/**********************************************************************/ +#define WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_WFMCU_PWA_CTRL0 0x0000 + +/**********************************************************************/ +/* Base: WF_TOP_CFG_ON_BASE (0x8102_1000 remap to 0x184C_0000) */ +/**********************************************************************/ +#define ROMCODE_INDEX 0x1604 + +/**********************************************************************/ +/* A-die CR */ +/**********************************************************************/ +#define ATOP_CHIP_ID 0x02C +#define ATOP_TOP_CLK_EN 0xA00 +#define ATOP_RG_ENCAL_WBTAC_IF_SW 0x070 +#define ATOP_RG_WRI_CK_SELECT 0x4AC +#define ATOP_EFUSE_CTRL_1 0x108 +#define ATOP_EFUSE_CTRL_2 0x148 +#define ATOP_EFUSE_CTRL_3 0x14C +#define ATOP_EFUSE_CTRL_4 0x15C +#define ATOP_EFUSE_RDATA0 0x130 +#define ATOP_EFUSE_RDATA1 0x134 +#define ATOP_EFUSE_RDATA2 0x138 +#define ATOP_EFUSE_RDATA3 0x13C +#define ATOP_RG_EFUSE_CFG5 0x144 +#define ATOP_THADC_ANALOG 0x3A6 +#define ATOP_THADC_SLOP 0x3A7 +#define ATOP_RG_TOP_THADC_BG 0x034 +#define ATOP_RG_TOP_THADC_00 0x038 + +#define ATOP_XTAL_TRIM_FLOW 0x3AC +#define ATOP_XTAL_CR_C1_SEL_AXM_80M_OSC 0x390 +#define ATOP_XTAL_CR_C1_SEL_AXM_40M_OSC 0x391 +#define ATOP_XTAL_CR_C1_SEL_AXM_TRIM1_80M_OSC 0x398 +#define ATOP_XTAL_CR_C1_SEL_AXM_TRIM1_40M_OSC 0x399 +#define ATOP_RG_STRAP_PIN_IN 0x4FC +#define ATOP_RG_XO_01 0x65C +#define ATOP_RG_XO_03 0x664 + + +#define ATOP_7975_XTAL_CALIBRATION 0x3A1 +#define ATOP_7975_XTAL_TRIM2_COMPENSATION 0x3A2 +#define ATOP_7975_XTAL_TRIM3_COMPENSATION 0x3A3 +#define ATOP_7975_XTAL_TRIM4_COMPENSATION 0x3A4 +#define ATOP_7975_XTAL_TRIM_FLOW 0x3A5 +#define ATOP_7975_CR_C1_C2_A94 0xA94 +#define ATOP_7975_CR_C1_C2_A18 0xA18 +#define ATOP_7975_CR_C1_C2_A84 0xA84 +#define ATOP_7975_CR_C1_C2_AA4 0xAA4 + + + +#endif /* _PLATFORM_MT7981_CONSYS_REG_OFFSET_H_ */ diff --git a/package/conninfra/src/platform/mt7981/include/mt7981_emi.h b/package/conninfra/src/platform/mt7981/include/mt7981_emi.h new file mode 100644 index 0000000..6d39574 --- /dev/null +++ b/package/conninfra/src/platform/mt7981/include/mt7981_emi.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _PLATFORM_MT7981_EMI_H_ +#define _PLATFORM_MT7981_EMI_H_ + +#include "osal.h" +#include "emi_mng.h" +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + +struct consys_platform_emi_ops* get_consys_platform_emi_ops(void); + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +#endif /* _PLATFORM_MT7981_EMI_H_ */ diff --git a/package/conninfra/src/platform/mt7981/include/mt7981_pmic.h b/package/conninfra/src/platform/mt7981/include/mt7981_pmic.h new file mode 100644 index 0000000..8f59791 --- /dev/null +++ b/package/conninfra/src/platform/mt7981/include/mt7981_pmic.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _PLATFORM_MT7981_PMIC_H_ +#define _PLATFORM_MT7981_PMIC_H_ + +#include "osal.h" +#include "pmic_mng.h" +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +struct consys_platform_pmic_ops* get_consys_platform_pmic_ops(void); + +#endif /* _PLATFORM_MT7981_PMIC_H_ */ diff --git a/package/conninfra/src/platform/mt7981/include/mt7981_pos.h b/package/conninfra/src/platform/mt7981/include/mt7981_pos.h new file mode 100644 index 0000000..997e684 --- /dev/null +++ b/package/conninfra/src/platform/mt7981/include/mt7981_pos.h @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _PLATFORM_MT7981_POS_H_ +#define _PLATFORM_MT7981_POS_H_ + +int consys_plt_hw_init(void); +int consys_xtal_ctrl_fast_mode(void); +int consys_sw_reset_ctrl(bool bassert); +int consys_tx_rx_bus_slp_prot_ctrl(bool enable); +void consys_set_if_pinmux(bool enable); +int consys_polling_chipid(void); +int consys_plt_adie_type_cfg(void); +int consys_bus_clock_ctrl(enum consys_drv_type drv_type, unsigned int bus_clock); +int consys_emi_set_remapping_reg(void); +int consys_emi_set_region_protection(void); +int connsys_d_die_cfg(void); +int connsys_conninfra_sysram_hw_ctrl(void); +int connsys_spi_master_cfg(void); +int consys_sema_acquire_timeout(unsigned int index, unsigned int usec); +void consys_sema_release(unsigned int index); +int consys_spi_read(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int *data); +int consys_spi_write(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int data); +int consys_spi_write_offset_range(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int value, + unsigned int reg_offset, unsigned int value_offset, unsigned int size); +int connsys_a_die_cfg(void); +int connsys_afe_wbg_cal(void); +int connsys_subsys_pll_initial(void); +int connsys_osc_legacy_mode(void); +int connsys_top_pwr_ctrl(void); +int connsys_conn_infra_bus_timeout(void); +int connsys_clkgen_wpll_hw_ctrl(void); +int consys_conninfra_top_wakeup(void); +int consys_conninfra_top_sleep(void); +int consys_adie_top_ck_en_on_off_ctrl(enum consys_drv_type type, unsigned char on); +int consys_conninfra_wf_wakeup(void); +int consys_conninfra_wf_sleep(void); +int consys_conn_wmcpu_sw_reset(bool bassert); +int consys_wf_bus_slp_prot_ctrl(bool enable); +int consys_wfsys_top_on_ctrl(bool enable); +int consys_wfsys_bus_slp_prot_check(bool enable); +int consys_wfsys_bus_timeout_ctrl(void); +int consys_wmcpu_idle_loop_check(void); +int consys_wpll_ctrl(bool enable); +int consys_conninfra_wf_req_clr(void); + + +#endif /* _PLATFORM_MT7981_POS_H_ */ diff --git a/package/conninfra/src/platform/mt7981/mt7981.c b/package/conninfra/src/platform/mt7981/mt7981.c new file mode 100644 index 0000000..ac00ebc --- /dev/null +++ b/package/conninfra/src/platform/mt7981/mt7981.c @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#define pr_fmt(fmt) KBUILD_MODNAME "@(%s:%d) " fmt, __func__, __LINE__ + +#include +#include +#include +#include +#include +#include +#include + +#include "osal.h" +#include "conninfra.h" +#include "consys_hw.h" +#include "consys_reg_mng.h" +#include "consys_reg_util.h" +#include "mt7981.h" +#include "mt7981_pos.h" +#include "emi_mng.h" +#include "mt7981_consys_reg.h" +#include "mt7981_consys_reg_offset.h" + +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ +#define PLATFORM_SOC_CHIP 0x7981 +#define CONN_IP_VER 0x02090000 + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ +struct consys_hw_ops_struct g_consys_hw_ops_mt7981 = { + /* HW init */ + .consys_plt_hw_init = consys_plt_hw_init, + + /* POS */ + .consys_plt_xtal_ctrl_fast_mode = consys_xtal_ctrl_fast_mode, + .consys_plt_connsys_sw_reset_ctrl = consys_sw_reset_ctrl, + .consys_plt_set_if_pinmux = consys_set_if_pinmux, + .consys_plt_tx_rx_bus_slp_prot_ctrl = consys_tx_rx_bus_slp_prot_ctrl, + .consys_plt_polling_consys_chipid = consys_polling_chipid, + .consys_plt_bus_clock_ctrl = consys_bus_clock_ctrl, + .consys_plt_d_die_cfg = connsys_d_die_cfg, + .consys_plt_conninfra_sysram_hw_ctrl = connsys_conninfra_sysram_hw_ctrl, + .consys_plt_spi_master_cfg = connsys_spi_master_cfg, + .consys_plt_a_die_cfg = connsys_a_die_cfg, + .consys_plt_afe_wbg_cal = connsys_afe_wbg_cal, + .consys_plt_subsys_pll_initial = connsys_subsys_pll_initial, + .consys_plt_osc_legacy_mode = connsys_osc_legacy_mode, + .consys_plt_top_pwr_ctrl = connsys_top_pwr_ctrl, + .consys_plt_conn_infra_bus_timeout = connsys_conn_infra_bus_timeout, + .consys_plt_clkgen_wpll_hw_ctrl = connsys_clkgen_wpll_hw_ctrl, + .consys_plt_conninfra_wakeup = consys_conninfra_top_wakeup, + .consys_plt_conninfra_sleep = consys_conninfra_top_sleep, + .consys_plt_adie_top_ck_en_on_off_ctrl = consys_adie_top_ck_en_on_off_ctrl, + .consys_plt_conninfra_wf_wakeup = consys_conninfra_wf_wakeup, + .consys_plt_conninfra_wf_sleep = consys_conninfra_wf_sleep, + .consys_plt_conn_wmcpu_sw_reset = consys_conn_wmcpu_sw_reset, + .consys_plt_wf_bus_slp_prot_ctrl = consys_wf_bus_slp_prot_ctrl, + .consys_plt_wfsys_top_on_ctrl = consys_wfsys_top_on_ctrl, + .consys_plt_wfsys_bus_slp_prot_check = consys_wfsys_bus_slp_prot_check, + .consys_plt_wfsys_bus_timeout_ctrl = consys_wfsys_bus_timeout_ctrl, + .consys_plt_conn_wmcpu_idle_loop_check = consys_wmcpu_idle_loop_check, + .consys_plt_wpll_ctrl = consys_wpll_ctrl, + .consys_plt_conninfra_wf_req_clr = consys_conninfra_wf_req_clr, + + /* load from dts */ + /* TODO: mtcmos should move to a independent module */ + .consys_plt_clk_get_from_dts = NULL, + .consys_plt_clk_detach = NULL, + + /* clock */ + .consys_plt_soc_chipid_get = consys_soc_chipid_get, + + /* debug */ + .consys_plt_get_hw_ver = consys_get_hw_ver, + .consys_plt_spi_read = consys_spi_read, + .consys_plt_spi_write = consys_spi_write, + .consys_plt_spi_clock_switch = NULL, + .consys_plt_power_state = NULL, + + /* others */ + .consys_plt_adie_type_cfg = consys_plt_adie_type_cfg, +}; + +/* For mt7981 */ +extern struct consys_hw_ops_struct g_consys_hw_ops_mt7981; +extern struct consys_reg_mng_ops g_dev_consys_reg_ops_mt7981; +extern struct consys_platform_emi_ops g_consys_platform_emi_ops_mt7981; +extern struct consys_platform_pmic_ops g_consys_platform_pmic_ops_mt7981; + +const struct conninfra_plat_data mt7981_plat_data = { + .chip_id = PLATFORM_SOC_CHIP, + .hw_ops = &g_consys_hw_ops_mt7981, + .reg_ops = &g_dev_consys_reg_ops_mt7981, + .platform_emi_ops = &g_consys_platform_emi_ops_mt7981, + .platform_pmic_ops = &g_consys_platform_pmic_ops_mt7981, +}; + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ +unsigned int consys_soc_chipid_get(void) +{ + return PLATFORM_SOC_CHIP; +} + +unsigned int consys_get_hw_ver(void) +{ + return CONN_IP_VER; +} + diff --git a/package/conninfra/src/platform/mt7981/mt7981_consys_reg.c b/package/conninfra/src/platform/mt7981/mt7981_consys_reg.c new file mode 100644 index 0000000..fddcd1b --- /dev/null +++ b/package/conninfra/src/platform/mt7981/mt7981_consys_reg.c @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#include +#include +#include +#include +#include +#include +#include "consys_reg_mng.h" +#include "mt7981_consys_reg.h" +#include "mt7981_consys_reg_offset.h" +#include "consys_hw.h" +#include "consys_reg_util.h" + +#define CFG_REG_LOAD_FROM_DTS_CTRL 0 + +static int consys_reg_init(struct platform_device *pdev); +static int consys_reg_deinit(void); + +struct consys_base_addr conn_reg = { + .reg_base_addr[TOP_MISC_BASE] = {0x11D10000, 0x1000, 0}, + .reg_base_addr[TOPRGU_BASE] = {0x1001C000, 0x1000, 0}, + .reg_base_addr[GPIO_BASE] = {0x11D00000, 0x1000, 0}, + .reg_base_addr[IOCFG_TM_BASE] = {0x11F00000, 0x1000, 0}, + .reg_base_addr[IOCFG_LT_BASE] = {0x11F10000, 0x1000, 0}, + .reg_base_addr[INFRACFG_AO_BASE] = {0x10003000, 0x1000, 0}, + .reg_base_addr[CONN_INFRA_CFG_BASE] = {0x18001000, 0x1000, 0}, + .reg_base_addr[CONN_INFRA_SYSRAM_BASE] = {0x18050000, 0x1000, 0}, + .reg_base_addr[CONN_INFRA_CLKGEN_ON_TOP_BASE] = {0x18009000, 0x1000, 0}, + .reg_base_addr[CONN_HOST_CSR_TOP_BASE] = {0x18060000, 0x1000, 0}, + .reg_base_addr[CONN_INFRA_BUS_CR_BASE] = {0x1800E000, 0x1000, 0}, + .reg_base_addr[CONN_INFRA_RGU_BASE] = {0x18000000, 0x1000, 0}, + .reg_base_addr[CONN_WT_SLP_CTL_REG_BASE] = {0x18005000, 0x1000, 0}, + .reg_base_addr[INST2_CONN_WT_SLP_CTL_REG_BASE] = {0x18085000, 0x1000, 0}, + .reg_base_addr[CONN_RF_SPI_MST_REG_BASE] = {0x18004000, 0x1000, 0}, + .reg_base_addr[INST2_CONN_RF_SPI_MST_REG_BASE] = {0x18084000, 0x1000, 0}, + .reg_base_addr[CONN_SEMAPHORE_BASE] = {0x18070000, 0x10000, 0}, + .reg_base_addr[CONN_AFE_CTL_BASE] = {0x18003000, 0x1000, 0}, + .reg_base_addr[CONN_AFE_CTL_2ND_BASE] = {0x18083000, 0x1000, 0}, + .reg_base_addr[WF_TOP_SLPPROT_ON_BASE] = {0x184C0000, 0x10000, 0}, + .reg_base_addr[WF_TOP_CFG_BASE] = {0x184B0000, 0x1000, 0}, + .reg_base_addr[WF_MCU_CONFIG_LS_BASE] = {0x184F0000, 0x1000, 0}, + .reg_base_addr[WF_MCU_BUS_CR_BASE] = {0x18400000, 0x1000, 0}, + .reg_base_addr[WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_BASE] = {0x18500000, 0x1000, 0}, + .reg_base_addr[WF_TOP_CFG_ON_BASE] = {0x184C0000, 0x10000, 0}, +}; + +const char* consys_base_addr_index_to_str[CONSYS_BASE_ADDR_MAX] = { + "TOP_MISC_BASE", + "TOPRGU_BASE", + "GPIO_BASE", + "IOCFG_TR_BASE", + "IOCFG_TL_BASE", + "INFRACFG_AO_BASE", + "CONN_INFRA_CFG_BASE", + "CONN_INFRA_SYSRAM_BASE", + "CONN_INFRA_CLKGEN_ON_TOP_BASE", + "CONN_HOST_CSR_TOP_BASE", + "CONN_INFRA_BUS_CR_BASE", + "CONN_INFRA_RGU_BASE", + "CONN_WT_SLP_CTL_REG_BASE", + "INST2_CONN_WT_SLP_CTL_REG_BASE", + "CONN_RF_SPI_MST_REG_BASE", + "INST2_CONN_RF_SPI_MST_REG_BASE", + "CONN_SEMAPHORE_BASE", + "CONN_AFE_CTL_BASE", + "CONN_AFE_CTL_2ND_BASE", + "WF_TOP_SLPPROT_ON_BASE", + "WF_TOP_CFG_BASE", + "WF_MCU_CONFIG_LS_BASE", + "WF_MCU_BUS_CR_BASE", + "WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_BASE", + "WF_TOP_CFG_ON_BASE" +}; + +struct consys_reg_mng_ops g_dev_consys_reg_ops_mt7981 = { + .consys_reg_mng_init = consys_reg_init, + .consys_reg_mng_deinit = consys_reg_deinit, + .consys_reg_mng_check_reable = NULL, + .consys_reg_mng_is_consys_reg = NULL, + .consys_reg_mng_is_bus_hang = NULL, + .consys_reg_mng_dump_bus_status = NULL, + .consys_reg_mng_dump_conninfra_status = NULL, + .consys_reg_mng_dump_cpupcr = NULL, + .consys_reg_mng_is_host_csr = NULL, +}; + +struct consys_base_addr* get_conn_reg_base_addr() +{ + return &conn_reg; +} + +static int consys_reg_init(struct platform_device *pdev) +{ + int ret = -1; + struct device_node *node = NULL; + struct consys_reg_base_addr *base_addr = NULL; + int i = 0; + + node = pdev->dev.of_node; + if (node) { +#if (CFG_REG_LOAD_FROM_DTS_CTRL == 1) + struct resource res; + int flag; + + for (i = 0; i < CONSYS_BASE_ADDR_MAX; i++) { + base_addr = &conn_reg.reg_base_addr[i]; + ret = of_address_to_resource(node, i, &res); + if (ret) { + pr_err("Get Reg Index(%d-%s) failed\n", i, consys_base_addr_index_to_str[i]); + continue; + } + base_addr->phy_addr = res.start; + base_addr->vir_addr = (unsigned long)of_iomap(node, i); + of_get_address(node, i, &(base_addr->size), &flag); +#if 0 + pr_info("Get Index(%d-%s) phy_addr(0x%zx) vir_addr=(0x%zx) size=(0x%zx)\n", + i, consys_base_addr_index_to_str[i], base_addr->phy_addr, + base_addr->vir_addr, base_addr->size); +#endif + } +#else + for (i = 0; i < CONSYS_BASE_ADDR_MAX; i++) { + base_addr = &conn_reg.reg_base_addr[i]; + if (base_addr->vir_addr == 0) + base_addr->vir_addr = (unsigned long)ioremap(base_addr->phy_addr, base_addr->size); + + pr_info("Get Index(%d-%s) phy_addr(0x%zx) vir_addr=(0x%zx) size=(0x%zx)\n", + i, consys_base_addr_index_to_str[i], base_addr->phy_addr, + base_addr->vir_addr, base_addr->size); + } +#endif + } else { + pr_err("[%s] can't find CONSYS compatible node\n", __func__); + return ret; + } + + return 0; +} + +static int consys_reg_deinit(void) +{ + int i = 0; + + for (i = 0; i < CONSYS_BASE_ADDR_MAX; i++) { + if (conn_reg.reg_base_addr[i].vir_addr) { + pr_info("[%d] Unmap %s (0x%zx)\n", i, consys_base_addr_index_to_str[i], + conn_reg.reg_base_addr[i].vir_addr); + iounmap((void __iomem*)conn_reg.reg_base_addr[i].vir_addr); + conn_reg.reg_base_addr[i].vir_addr = 0; + } + } + + return 0; +} + diff --git a/package/conninfra/src/platform/mt7981/mt7981_emi.c b/package/conninfra/src/platform/mt7981/mt7981_emi.c new file mode 100644 index 0000000..c291b0e --- /dev/null +++ b/package/conninfra/src/platform/mt7981/mt7981_emi.c @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#define pr_fmt(fmt) KBUILD_MODNAME "@(%s:%d) " fmt, __func__, __LINE__ + +#include +#include +#include +#include "mt7981_emi.h" +#include "mt7981.h" +#include "mt7981_consys_reg.h" +#include "consys_hw.h" +#include "consys_reg_util.h" +#include "mt7981_pos.h" + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ +unsigned int consys_emi_get_fw_emi_size(void) +{ + return 0x100000; +} + +struct consys_platform_emi_ops g_consys_platform_emi_ops_mt7981 = { + .consys_ic_emi_set_region_protection = consys_emi_set_region_protection, + .consys_ic_emi_set_remapping_reg = consys_emi_set_remapping_reg, + .consys_ic_emi_get_fw_emi_size = consys_emi_get_fw_emi_size, +}; + +struct consys_platform_emi_ops* get_consys_platform_emi_ops(void) +{ + return &g_consys_platform_emi_ops_mt7981; +} + diff --git a/package/conninfra/src/platform/mt7981/mt7981_pmic.c b/package/conninfra/src/platform/mt7981/mt7981_pmic.c new file mode 100644 index 0000000..c46da4c --- /dev/null +++ b/package/conninfra/src/platform/mt7981/mt7981_pmic.c @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#define pr_fmt(fmt) KBUILD_MODNAME "@(%s:%d) " fmt, __func__, __LINE__ + +#include +#include +#include +#include +#include + +#include "consys_hw.h" +#include "consys_reg_util.h" +#include "osal.h" +#include "mt7981_pmic.h" +#include "mt7981_pos.h" +#include "mt7981_consys_reg.h" +#include "mt7981_consys_reg_offset.h" + +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +struct consys_platform_pmic_ops g_consys_platform_pmic_ops_mt7981 = { + .consys_pmic_get_from_dts = NULL, + .consys_pmic_common_power_ctrl = NULL, + .consys_pmic_wifi_power_ctrl = NULL, + .consys_pmic_bt_power_ctrl = NULL, + .consys_pmic_gps_power_ctrl = NULL, + .consys_pmic_fm_power_ctrl = NULL, + .consys_pmic_event_notifier = NULL, +}; + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +struct consys_platform_pmic_ops* get_consys_platform_pmic_ops(void) +{ + return &g_consys_platform_pmic_ops_mt7981; +} + diff --git a/package/conninfra/src/platform/mt7981/mt7981_pos.c b/package/conninfra/src/platform/mt7981/mt7981_pos.c new file mode 100644 index 0000000..4050b66 --- /dev/null +++ b/package/conninfra/src/platform/mt7981/mt7981_pos.c @@ -0,0 +1,1715 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2019 MediaTek Inc. + */ + +#define pr_fmt(fmt) KBUILD_MODNAME "@(%s:%d) " fmt, __func__, __LINE__ + +#include +#include "plat_def.h" +#include "consys_reg_util.h" +#include "consys_reg_mng.h" +#include "mt7981_consys_reg.h" +#include "mt7981_consys_reg_offset.h" +#include "mt7981_pos.h" +#include "mt7981.h" +#include "mt7981_emi.h" + + + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ +#define MTD_WIFI_NM "Factory" +#define EEPROM_CHIPID_OFFSET 0x0 + +#define EEPROM_BAND0_STREAM_OFFSET 0x190 +#define EEPROM_BAND0_STREAM_TX_MASK 0x7 +#define EEPROM_BAND0_STREAM_TX_BIT_OFFSET 0 +#define EEPROM_BAND0_STREAM_RX_MASK 0x7 +#define EEPROM_BAND0_STREAM_RX_BIT_OFFSET 3 + +#define _TO_STR(_x) #_x +#define TO_STR(_x) _TO_STR(_x) +#define RED(_text) "\033[1;31m"_text"\033[0m" +#define GRN(_text) "\033[1;32m"_text"\033[0m" + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ +bool one_adie_dbdc = false; +bool adie_7976 = false; +unsigned int adie_cfg_type = ADIE_TYPE_NONE; + +struct spi_op { + unsigned int busy_cr; + unsigned int polling_bit; + unsigned int addr_cr; + unsigned int read_addr_format; + unsigned int write_addr_format; + unsigned int write_data_cr; + unsigned int read_data_cr; + unsigned int read_data_mask; +}; + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ +const static char* g_spi_system_name[SYS_SPI_MAX] = { + "SYS_SPI_WF1", + "SYS_SPI_WF", + "SYS_SPI_BT", + "SYS_SPI_FM", + "SYS_SPI_GPS", + "SYS_SPI_TOP", + "SYS_SPI_WF2", + "SYS_SPI_WF3", +}; + +static const struct spi_op spi_op_array[SYS_SPI_MAX] = { + /* SYS_SPI_WF1 */ + { + SPI_STA, 1, SPI_WF_ADDR, 0x00001000, 0x00000000, + SPI_WF_WDAT, SPI_WF_RDAT, 0xFFFFFFFF + }, + /* SYS_SPI_WF */ + { + SPI_STA, 1, SPI_WF_ADDR, 0x00003000, 0x00002000, + SPI_WF_WDAT, SPI_WF_RDAT, 0xFFFFFFFF + }, + /* SYS_SPI_BT */ + { + SPI_STA, 2, SPI_BT_ADDR, 0x00005000, 0x00004000, + SPI_BT_WDAT, SPI_BT_RDAT, 0xFFFFFFFF + }, + /* SYS_SPI_FM */ + { + SPI_STA, 3, SPI_FM_ADDR, 0x00007000, 0x00006000, + SPI_FM_WDAT, SPI_FM_RDAT, 0x0000FFFF + }, + /* SYS_SPI_GPS */ + { + SPI_STA, 4, SPI_GPS_ADDR, 0x00009000, 0x00008000, + SPI_GPS_WDAT, SPI_GPS_RDAT, 0x0000FFFF + }, + /* SYS_SPI_TOP */ + { + SPI_STA, 5, SPI_TOP_ADDR, 0x0000B000, 0x0000A000, + SPI_TOP_WDAT, SPI_TOP_RDAT, 0xFFFFFFFF + }, + /* SYS_SPI_WF2 */ + { + SPI_STA, 1, SPI_WF_ADDR, 0x0000D000, 0x0000C000, + SPI_WF_WDAT, SPI_WF_RDAT, 0xFFFFFFFF + }, + /* SYS_SPI_WF3 */ + { + SPI_STA, 1, SPI_WF_ADDR, 0x0000F000, 0x0000E000, + SPI_WF_WDAT, SPI_WF_RDAT, 0xFFFFFFFF + }, +}; + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ +bool _is_flash_content_valid(void) +{ + unsigned short eeFlashId = 0; + + FlashRead(MTD_WIFI_NM, (unsigned char*)&eeFlashId, EEPROM_CHIPID_OFFSET, sizeof(eeFlashId)); + + if (eeFlashId == consys_soc_chipid_get()) + return true; + else + return false; +} + +int _consys_check_adie_cfg(void) +{ + int ret = 0; + unsigned int hw_adie_type = 0; + unsigned int i = 0; + bool found = false; + + for (i = 0; i < AIDE_NUM_MAX; i++) { + if (conn_hw_env[i].valid) { + hw_adie_type = conn_hw_env[i].adie_id; + found = true; + break; + } + } + + if (found) { + printk(GRN("Adie Type: 0x%x"), hw_adie_type); + } else { + printk(RED("No Adie found!!!")); + ret = -1; + } + + return ret; +} + +int consys_plt_hw_init(void) +{ + /* Cheetah only has a-die 7976 and one-adie-dbdc */ + adie_7976 = true; + one_adie_dbdc = true; + adie_cfg_type = ADIE_TYPE_ONE; + pr_info("adie_cfg_type = %d, one_adie_dbdc = %d\n", adie_cfg_type, one_adie_dbdc); + return 0; +} + +int consys_xtal_ctrl_fast_mode(void) +{ + /* Setting fast mode to xtal control */ + CONSYS_SET_BIT(REG_TOP_MISC_ADDR + CONNSYS_MISC, (0x1 << 3)); + return 0; +} + +int consys_sw_reset_ctrl(bool bassert) +{ + /* Release CONNSYS software reset */ + if (bassert) { + CONSYS_REG_WRITE_MASK( + REG_TOP_RGU_ADDR + TOP_RGU_WDT_SWSYSRST, + 0x88800000, 0xff800000); + } else { + /* de-assert CONNSYS S/W reset */ + CONSYS_REG_WRITE_MASK( + REG_TOP_RGU_ADDR + TOP_RGU_WDT_SWSYSRST, + 0x88000000, 0xff800000); + } + + return 0; +} + +void consys_set_if_pinmux(bool enable) +{ + if (enable) { + /* One_Adie_DB + set pinmux for the interface between D-die and A-die (Aux1) + PAD_WF0_TOP_CLK(GPIO43) 0x0350[14:12] + PAD_WF0_TOP_DATA(GPIO44) 0x0350[18:16] + PAD_WF0_HB1(GPIO45) 0x0350[22:20] + PAD_WF0_HB2(GPIO46) 0x0350[26:24] + PAD_WF0_HB3(GPIO47) 0x0350[30:28] + PAD_WF0_HB4(GPIO48) 0x0360[2:0] + PAD_WF0_HB0(GPIO49) 0x0360[6:4] + PAD_WF0_HB0_B(GPIO50) 0x0360[10:8] + PAD_WF0_HB5(GPIO51) 0x0360[14:12] + PAD_WF0_HB6(GPIO52) 0x0360[18:16] + PAD_WF0_HB7(GPIO53) 0x0360[22:20] + PAD_WF0_HB8(GPIO54) 0x0360[26:24] + PAD_WF0_HB9(GPIO55) 0x0360[30:28] + PAD_WF0_HB10(GPIO56) 0x0370[2:0] + */ + CONSYS_REG_WRITE_MASK(REG_GPIO_BASE_ADDR + GPIO_MODE5, 0x11111000, 0x77777000); + CONSYS_REG_WRITE_MASK(REG_GPIO_BASE_ADDR + GPIO_MODE6, 0x11111111, 0x77777777); + CONSYS_REG_WRITE_MASK(REG_GPIO_BASE_ADDR + GPIO_MODE7, 0x00000001, 0x00000007); + + /* Set pinmux driving to 4mA */ + CONSYS_REG_WRITE_MASK(REG_IOCFG_TM_ADDR + IOCFG_TM_DRV_CFG0, 0x49249, 0x1FFFFF); + CONSYS_REG_WRITE_MASK(REG_IOCFG_LT_ADDR + IOCFG_LT_DRV_CFG0, 0x1249240, 0x7FFFFC0); + } +} + +int consys_tx_rx_bus_slp_prot_ctrl(bool enable) +{ + int check; + + if (enable) { + /* conn2ap/ap2conn slpprot disable */ + /* Turn off AP2CONN AHB RX bus sleep protect */ + CONSYS_REG_WRITE_MASK(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT, 0x0, 0x10000); + CONSYS_REG_BIT_POLLING(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT, + 24, 0x0, 100, 500, check); + if (check != 0) + pr_err("Polling AP2CONN AHB RX bus sleep protect turn off fail! CR Value = 0x%08x\n", + CONSYS_REG_READ(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT)); + + /* Turn off AP2CONN AHB TX bus sleep protect */ + CONSYS_REG_WRITE_MASK(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT, 0x0, 0x1); + CONSYS_REG_BIT_POLLING(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT, + 4, 0x0, 100, 500, check); + if (check != 0) + pr_err("Polling AP2CONN AHB TX bus sleep protect turn off fail! CR Value = 0x%08x\n", + CONSYS_REG_READ(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT)); + + /* Turn off CONN2AP AXI RX bus sleep protect */ + CONSYS_REG_WRITE_MASK(REG_INFRACFG_AO_ADDR + CONN2AP_GALS_SLPPROT, 0x0, 0x10000); + /* Turn off CONN2AP AXI TX bus sleep protect */ + CONSYS_REG_WRITE_MASK(REG_INFRACFG_AO_ADDR + CONN2AP_GALS_SLPPROT, 0x0, 0x1); + + /* Wait 900us (apply this for CONNSYS XO clock ready) */ + udelay(900); + } else { + /* Turn on AP2CONN AHB TX bus sleep protect */ + CONSYS_REG_WRITE_MASK(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT, 0x1, 0x1); + CONSYS_REG_BIT_POLLING(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT, + 4, 0x1, 100, 500, check); + if (check != 1) + pr_err("Polling AP2CONN AHB TX bus sleep protect turn on fail! CR Value = 0x%08x\n", + CONSYS_REG_READ(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT)); + + /* Turn on AP2CONN AHB RX bus sleep protec */ + CONSYS_REG_WRITE_MASK(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT, 0x1, 0x10000); + CONSYS_REG_BIT_POLLING(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT, + 24, 0x1, 100, 500, check); + if (check !=1) + pr_err("Polling AP2CONN AHB RX bus sleep protect turn on fail! CR Value = 0x%08x\n", + CONSYS_REG_READ(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT)); + + /* Turn on CONN2AP AXI TX bus sleep protect */ + CONSYS_REG_WRITE_MASK(REG_INFRACFG_AO_ADDR + CONN2AP_GALS_SLPPROT, 0x1, 0x1); + CONSYS_REG_BIT_POLLING(REG_INFRACFG_AO_ADDR + CONN2AP_GALS_SLPPROT, + 4, 0x1, 100, 500, check); + if (check != 1) + pr_err("Polling CONN2AP AXI TX bus sleep protect turn on fail! CR Value = 0x%08x\n", + CONSYS_REG_READ(REG_INFRACFG_AO_ADDR + CONN2AP_GALS_SLPPROT)); + + /* Turn on CONN2AP AXI RX bus sleep protect */ + CONSYS_REG_WRITE_MASK(REG_INFRACFG_AO_ADDR + CONN2AP_GALS_SLPPROT, 0x1, 0x10000); + CONSYS_REG_BIT_POLLING(REG_INFRACFG_AO_ADDR + CONN2AP_GALS_SLPPROT, + 24, 0x1, 100, 500, check); + if (check != 1) + pr_err("Polling CONN2AP AXI RX bus sleep protect turn on fail! CR Value = 0x%08x\n", + CONSYS_REG_READ(REG_INFRACFG_AO_ADDR + CONN2AP_GALS_SLPPROT)); + + /* wait 1us*/ + udelay(1); + } + + return 0; +} + +int _consys_polling_chipid_int(unsigned int retry, unsigned int sleep_ms) +{ + unsigned int count = retry + 1; + unsigned int consys_hw_ver = consys_get_hw_ver(); + unsigned int hw_ver = 0; + + while (--count > 0) { + hw_ver = CONSYS_REG_READ(REG_CONN_INFRA_CFG_ADDR + CONN_INFRA_CFG_IP_VERSION); + if ((hw_ver >= consys_hw_ver) && (hw_ver != 0xdeadfeed)) + break; + msleep(sleep_ms); + } + + if (count == 0) { + pr_err("Read CONNSYS HW IP version fail. Expect 0x%x but get 0x%x\n", consys_hw_ver, hw_ver); + return -1; + } else { + pr_info("Read CONNSYS HW IP version successfully! (0x%08x)\n", hw_ver); + } + + return 0; +} + +int consys_polling_chipid(void) +{ + return _consys_polling_chipid_int(10, 1); +} + +int consys_bus_clock_ctrl(enum consys_drv_type drv_type, unsigned int bus_clock) +{ + /* Cheetah doesn't need to do anything according to DE's excel */ + return 0; +} + +int consys_emi_set_remapping_reg(void) +{ + struct consys_emi_addr_info *addr_info = emi_mng_get_phy_addr(); + + /* 0x1806_01C4[19:0], ap_emi_base[19:0] = TBD (related to emi) + 0x1806_01D4[19:0], wf_ap_peri_base[19:0] = 0x0_1100 (un-related to emi) + */ + if (addr_info->emi_ap_phy_base != 0) + CONSYS_REG_WRITE_OFFSET_RANGE(REG_CONN_HOST_CSR_TOP_ADDR + CONN2AP_REMAP_MCU_EMI, + addr_info->emi_ap_phy_base, 0, 16, 20); + + CONSYS_REG_WRITE_OFFSET_RANGE(REG_CONN_HOST_CSR_TOP_ADDR + CONN2AP_REMAP_WF_PERI, + 0x300D0000, 0, 16, 20); + + CONSYS_REG_WRITE_OFFSET_RANGE(REG_CONN_HOST_CSR_TOP_ADDR + CONN2AP_RSVD_PERI_REGION1, + 0x11F20000, 0, 16, 20); + + return 0; +} + +int consys_emi_set_region_protection(void) +{ + struct consys_emi_addr_info *addr_info = emi_mng_get_phy_addr(); + + /* set infra top emi address range */ + if (addr_info->emi_ap_phy_base != 0) { + CONSYS_REG_WRITE(REG_CONN_INFRA_BUS_CR_ADDR + CONN2AP_EMI_PATH_ADDR_START, + addr_info->emi_ap_phy_base); + + if (addr_info->emi_ap_phy_size != 0) + CONSYS_REG_WRITE(REG_CONN_INFRA_BUS_CR_ADDR + CONN2AP_EMI_PATH_ADDR_END, + addr_info->emi_ap_phy_base + addr_info->emi_ap_phy_size); + } + + return 0; +} + +int connsys_d_die_cfg(void) +{ + unsigned int efuse; + + efuse = CONSYS_REG_READ(REG_CONN_INFRA_CFG_ADDR + EFUSE); + pr_info("D-die efuse: 0x%08x\n", efuse); + + return 0; +} + +int connsys_conninfra_sysram_hw_ctrl(void) +{ + /* conn_infra sysram hw control setting -> disable hw power down */ + CONSYS_REG_WRITE(REG_CONN_INFRA_RGU_ADDR + SYSRAM_HWCTL_PDN, 0x0); + + /* conn_infra sysram hw control setting -> enable hw sleep */ + CONSYS_REG_WRITE(REG_CONN_INFRA_RGU_ADDR + SYSRAM_HWCTL_SLP, 0x1); + + return 0; +} + +int connsys_spi_master_cfg(void) +{ + /* wt_slp CR for A-die ck_en/wake_en control */ + /* + RFSPI #0 RFSPI #1 + WF_CK_ADDR 0x18005070[11:0] 0x18085070[11:0] 0xA04 + WF_B1_CK_ADDR 0x18005070[27:16] 0x18085070[27:16] 0xAF4 + WF_WAKE_ADDR 0x18005074[11:0] 0x18085074[11:0] 0x090 + WF_B1_WAKE_ADDR 0x18005074[27:16] 0x18085074[27:16] 0x0A0 + WF_ZPS_ADDR 0x18005078[11:0] 0x18085078[11:0] 0x08C + WF_B1_ZPS_ADDR 0x18005078[27:16] 0x18085078[27:16] 0x09C + TOP_CK_ADDR 0x18005084[11:0] 0x18085084[11:0] 0xA00 + WF_B0_CMD_ADDR 0x1800508c[11:0] 0x1808508c[11:0] 0x0F0 + WF_B1_CMD_ADDR 0x18005090[11:0] 0x18085090[11:0] 0x0F4 + */ + CONSYS_REG_WRITE_MASK(REG_CONN_WT_SLP_CTL_REG_ADDR + WB_WF_CK_ADDR, 0xAF40A04, 0xFFF0FFF); + CONSYS_REG_WRITE_MASK(REG_CONN_WT_SLP_CTL_REG_ADDR + WB_WF_WAKE_ADDR, 0x0A00090, 0xFFF0FFF); + CONSYS_REG_WRITE_MASK(REG_CONN_WT_SLP_CTL_REG_ADDR + WB_WF_ZPS_ADDR, 0x09C008C, 0xFFF0FFF); + CONSYS_REG_WRITE_MASK(REG_CONN_WT_SLP_CTL_REG_ADDR + WB_TOP_CK_ADDR, 0xA00, 0xFFF); + CONSYS_REG_WRITE_MASK(REG_CONN_WT_SLP_CTL_REG_ADDR + WB_WF_B0_CMD_ADDR, 0x0F0, 0xFFF); + CONSYS_REG_WRITE_MASK(REG_CONN_WT_SLP_CTL_REG_ADDR + WB_WF_B1_CMD_ADDR, 0x0F4, 0xFFF); + + /* Cheetah doesn't need to configure RFSPI#1 */ + + return 0; +} + +static int consys_spi_read_nolock(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int *data) +{ + int check = 0; + unsigned long rf_spi_addr = 0; + const struct spi_op *op = NULL; + unsigned char adie_idx = ((subsystem & 0xF0) >> 4); //0: one adie, 1: two adie + unsigned char subsystem_idx = (subsystem & 0xF); + + if (!data) { + pr_err("invalid data ptr\n"); + return CONNINFRA_SPI_OP_FAIL; + } + + op = &spi_op_array[subsystem_idx]; + if (adie_idx != 0) + rf_spi_addr = REG_INST2_CONN_RF_SPI_MST_REG_ADDR; + else + rf_spi_addr = REG_CONN_RF_SPI_MST_REG_ADDR; + + /* Read action: + * 1. Polling busy_cr[polling_bit] should be 0 + * 2. Write addr_cr with data being {read_addr_format | addr[11:0]} + * 3. Trigger SPI by writing write_data_cr as 0 + * 4. Polling busy_cr[polling_bit] as 0 + * 5. Read data_cr[data_mask] + */ + + CONSYS_REG_BIT_POLLING(rf_spi_addr + op->busy_cr, op->polling_bit, 0, 100, 500, check); + if (check != 0) { + pr_err("[%d][STEP1] polling 0x%08lx bit %d fail. Value=0x%08x\n", + subsystem, rf_spi_addr + op->busy_cr, op->polling_bit, + CONSYS_REG_READ(rf_spi_addr + op->busy_cr)); + return CONNINFRA_SPI_OP_FAIL; + } + + CONSYS_REG_WRITE(rf_spi_addr + op->addr_cr, (op->read_addr_format | addr)); + CONSYS_REG_WRITE(rf_spi_addr + op->write_data_cr, 0); + + CONSYS_REG_BIT_POLLING(rf_spi_addr + op->busy_cr, op->polling_bit, 0, 100, 500, check); + if (check != 0) { + pr_err("[%d][STEP4] polling 0x%08lx bit %d fail. Value=0x%08x\n", + subsystem, rf_spi_addr + op->busy_cr, + op->polling_bit, CONSYS_REG_READ(rf_spi_addr + op->busy_cr)); + return CONNINFRA_SPI_OP_FAIL; + } + + check = CONSYS_REG_READ_BIT(rf_spi_addr + op->read_data_cr, op->read_data_mask); + *data = check; + + return 0; +} + +static int consys_spi_write_nolock(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int data) +{ + int check = 0; + unsigned long rf_spi_addr = 0; + const struct spi_op *op = NULL; + unsigned char adie_idx = ((subsystem & 0xF0) >> 4); //0: one adie, 1: two adie + unsigned char subsystem_idx = (subsystem & 0xF); + + op = &spi_op_array[subsystem_idx]; + if (adie_idx != 0) + rf_spi_addr = REG_INST2_CONN_RF_SPI_MST_REG_ADDR; + else + rf_spi_addr = REG_CONN_RF_SPI_MST_REG_ADDR; + + /* Write action: + * 1. Wait busy_cr[polling_bit] as 0 + * 2. Write addr_cr with data being {write_addr_format | addr[11:0] + * 3. Write write_data_cr ad data + * 4. Wait busy_cr[polling_bit] as 0 + */ + + CONSYS_REG_BIT_POLLING(rf_spi_addr + op->busy_cr, op->polling_bit, 0, 100, 500, check); + if (check != 0) { + pr_err("[%d][STEP1] polling 0x%08lx bit %d fail. Value=0x%08x\n", + subsystem, rf_spi_addr + op->busy_cr, + op->polling_bit, CONSYS_REG_READ(rf_spi_addr + op->busy_cr)); + return CONNINFRA_SPI_OP_FAIL; + } + + CONSYS_REG_WRITE(rf_spi_addr + op->addr_cr, (op->write_addr_format | addr)); + CONSYS_REG_WRITE(rf_spi_addr + op->write_data_cr, data); + + check = 0; + CONSYS_REG_BIT_POLLING(rf_spi_addr + op->busy_cr, op->polling_bit, 0, 100, 500, check); + if (check != 0) { + pr_err("[%d][STEP4] polling 0x%08lx bit %d fail. Value=0x%08x\n", + subsystem, rf_spi_addr + op->busy_cr, + op->polling_bit, CONSYS_REG_READ(rf_spi_addr + op->busy_cr)); + return CONNINFRA_SPI_OP_FAIL; + } + + pr_info("addr=0x%04x, val=0x%08x\n", addr, data); + + return 0; +} + +static int consys_sema_acquire(enum conn_semaphore_type index) +{ + if (CONSYS_REG_READ_BIT((REG_CONN_SEMAPHORE_ADDR + CONN_SEMA00_M2_OWN_STA + index*4), 0x1) == 0x1) { + return CONN_SEMA_GET_SUCCESS; + } else { + return CONN_SEMA_GET_FAIL; + } +} + +int consys_sema_acquire_timeout(unsigned int index, unsigned int usec) +{ + int i; + + if (index >= CONN_SEMA_NUM_MAX) { + pr_err("wrong index: %d\n", index); + return CONN_SEMA_GET_FAIL; + } + + for (i = 0; i < usec; i++) { + if (consys_sema_acquire(index) == CONN_SEMA_GET_SUCCESS) { + return CONN_SEMA_GET_SUCCESS; + } + udelay(1); + } + pr_err("Get semaphore 0x%x timeout, dump status:\n", index); + pr_err("M0:[0x%x] M1:[0x%x] M2:[0x%x] M3:[0x%x] M4:[0x%x] M5:[0x%x] M6:[0x%x] M7:[0x%x]\n", + CONSYS_REG_READ(REG_CONN_SEMAPHORE_ADDR + CONN_SEMA_OWN_BY_M0_STA_REP), + CONSYS_REG_READ(REG_CONN_SEMAPHORE_ADDR + CONN_SEMA_OWN_BY_M1_STA_REP), + CONSYS_REG_READ(REG_CONN_SEMAPHORE_ADDR + CONN_SEMA_OWN_BY_M2_STA_REP), + CONSYS_REG_READ(REG_CONN_SEMAPHORE_ADDR + CONN_SEMA_OWN_BY_M3_STA_REP), + CONSYS_REG_READ(REG_CONN_SEMAPHORE_ADDR + CONN_SEMA_OWN_BY_M4_STA_REP), + CONSYS_REG_READ(REG_CONN_SEMAPHORE_ADDR + CONN_SEMA_OWN_BY_M5_STA_REP), + CONSYS_REG_READ(REG_CONN_SEMAPHORE_ADDR + CONN_SEMA_OWN_BY_M6_STA_REP), + CONSYS_REG_READ(REG_CONN_SEMAPHORE_ADDR + CONN_SEMA_OWN_BY_M7_STA_REP)); + + return CONN_SEMA_GET_FAIL; +} + +void consys_sema_release(unsigned int index) +{ + if (index >= CONN_SEMA_NUM_MAX) { + pr_err("wrong index: %d\n", index); + return; + } + + CONSYS_REG_WRITE((REG_CONN_SEMAPHORE_ADDR + CONN_SEMA00_M2_OWN_REL + index*4), 0x1); +} + +int consys_spi_read(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int *data) +{ + int ret; + + /* Get semaphore before read */ + if (consys_sema_acquire_timeout(CONN_SEMA_RFSPI_INDEX, CONN_SEMA_TIMEOUT) == CONN_SEMA_GET_FAIL) { + pr_err("[SPI READ] Require semaphore fail\n"); + return CONNINFRA_SPI_OP_FAIL; + } + + ret = consys_spi_read_nolock(subsystem, addr, data); + + consys_sema_release(CONN_SEMA_RFSPI_INDEX); + + return ret; +} + +int consys_spi_write(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int data) +{ + int ret; + + /* Get semaphore before read */ + if (consys_sema_acquire_timeout(CONN_SEMA_RFSPI_INDEX, CONN_SEMA_TIMEOUT) == CONN_SEMA_GET_FAIL) { + pr_err("[SPI WRITE] Require semaphore fail\n"); + return CONNINFRA_SPI_OP_FAIL; + } + + ret = consys_spi_write_nolock(subsystem, addr, data); + + consys_sema_release(CONN_SEMA_RFSPI_INDEX); + return ret; +} + +static void consys_spi_write_offset_range_nolock( + enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int value, + unsigned int reg_offset, unsigned int value_offset, unsigned int size) +{ + unsigned int data = 0, data2; + unsigned int reg_mask; + int ret; + + pr_info("[%s] addr=0x%04x value=0x%08x reg_offset=%d value_offset=%d size=%d\n", + g_spi_system_name[subsystem], addr, value, reg_offset, value_offset, size); + + value = (value >> value_offset); + value = GET_BIT_RANGE(value, size, 0); + value = (value << reg_offset); + ret = consys_spi_read_nolock(subsystem, addr, &data); + if (ret) { + pr_err("[%s] Get 0x%08x error, ret=%d\n", + g_spi_system_name[subsystem], addr, ret); + return; + } + + reg_mask = GENMASK(reg_offset + size - 1, reg_offset); + data2 = data & (~reg_mask); + data2 = (data2 | value); + consys_spi_write_nolock(subsystem, addr, data2); + + pr_info("[%s] Write CR:0x%08x from 0x%08x to 0x%08x\n", + g_spi_system_name[subsystem], addr, data, data2); +} + +int consys_spi_write_offset_range( + enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int value, + unsigned int reg_offset, unsigned int value_offset, unsigned int size) +{ + if (consys_sema_acquire_timeout(CONN_SEMA_RFSPI_INDEX, CONN_SEMA_TIMEOUT) == CONN_SEMA_GET_FAIL) { + pr_err("[SPI READ] Require semaphore fail\n"); + return CONNINFRA_SPI_OP_FAIL; + } + consys_spi_write_offset_range_nolock(subsystem, addr, value, reg_offset, value_offset, size); + + consys_sema_release(CONN_SEMA_RFSPI_INDEX); + + return 0; +} + +/***************************************************************************** +* FUNCTION +* connsys_a_die_efuse_read +* DESCRIPTION +* Read a-die efuse +* PARAMETERS +* efuse_addr: read address +* RETURNS +* int +* 0: fail, efuse is invalid +* 1: success, efuse is valid +*****************************************************************************/ +static int connsys_a_die_efuse_read_nolock( + enum sys_spi_subsystem subsystem, unsigned int efuse_ctrl, unsigned int efuse_addr, + unsigned int *data0, unsigned int *data1, unsigned int *data2, unsigned int *data3) +{ + int ret = 0; + int retry = 0; + int ret0, ret1, ret2, ret3; + unsigned int efuse_block_sel; + + if (data0 == NULL || data1 == NULL || data2 == NULL || data3 == NULL) { + pr_err("invalid parameter (%p, %p, %p, %p)\n", + data0, data1, data2, data3); + return 0; + } + + switch (efuse_ctrl) { + case ATOP_EFUSE_CTRL_1: + efuse_block_sel = 0x1; + break; + + case ATOP_EFUSE_CTRL_2: + efuse_block_sel = 0x2; + break; + + case ATOP_EFUSE_CTRL_3: + efuse_block_sel = 0x4; + break; + + case ATOP_EFUSE_CTRL_4: + efuse_block_sel = 0x8; + break; + + default: + pr_err("Not support for efuse block No. = %d\n", efuse_ctrl); + return 0; + break; + } + + /* select Efuse block */ + consys_spi_write_nolock(subsystem, ATOP_RG_EFUSE_CFG5, efuse_block_sel); + + /* Efuse control clear, clear Status /trigger + * Address: ATOP EFUSE_CTRL_write_efsrom_kick_and_read_kick_busy_flag (0x108[30]) + * Data: 1'b0 + * Action: TOPSPI_WR + */ + consys_spi_read_nolock(subsystem, efuse_ctrl, &ret); + ret &= ~(0x1 << 30); + consys_spi_write_nolock(subsystem, efuse_ctrl, ret); + + /* Efuse Read 1st 16byte + * Address: + * ATOP EFUSE_CTRL_efsrom_mode (0x108[7:6]) = 2'b00 + * ATOP EFUSE_CTRL_efsrom_ain (0x108[25:16]) = efuse_addr (0) + * ATOP EFUSE_CTRL_write_efsrom_kick_and_read_kick_busy_flag (0x108[30]) = 1'b1 + * Action: TOPSPI_WR + */ + consys_spi_read_nolock(subsystem, efuse_ctrl, &ret); + ret &= ~(0x43FF00C0); + ret |= (0x1 << 30); + ret |= ((efuse_addr << 16) & 0x3FF0000); + consys_spi_write_nolock(subsystem, efuse_ctrl, ret); + + /* Polling EFUSE busy = low + * (each polling interval is "30us" and polling timeout is 2ms) + * Address: + * ATOP EFUSE_CTRL_write_efsrom_kick_and_read_kick_busy_flag (0x108[30]) = 1'b0 + * Action: TOPSPI_Polling + */ + consys_spi_read_nolock(subsystem, efuse_ctrl, &ret); + while ((ret & (0x1 << 30)) != 0 && retry < 70) { + retry++; + udelay(30); + consys_spi_read_nolock(subsystem, efuse_ctrl, &ret); + } + if ((ret & (0x1 << 30)) != 0) { + pr_err("EFUSE busy, retry failed(%d)\n", retry); + } + + /* Check efuse_valid & return + * Address: ATOP EFUSE_CTRL_csri_efsrom_dout_vld_sync_1_ (0x108[29]) + * Action: TOPSPI_RD + */ + /* if (efuse_valid == 1'b1) + * Read Efuse Data to global var + */ + consys_spi_read_nolock(subsystem, efuse_ctrl, &ret); + if (((ret & (0x1 << 29)) >> 29) == 1) { + ret0 = consys_spi_read_nolock(subsystem, ATOP_EFUSE_RDATA0, data0); + ret1 = consys_spi_read_nolock(subsystem, ATOP_EFUSE_RDATA1, data1); + ret2 = consys_spi_read_nolock(subsystem, ATOP_EFUSE_RDATA2, data2); + ret3 = consys_spi_read_nolock(subsystem, ATOP_EFUSE_RDATA3, data3); + + pr_info("efuse = [0x%08x, 0x%08x, 0x%08x, 0x%08x]\n", *data0, *data1, *data2, *data3); + if (ret0 || ret1 || ret2 || ret3) + pr_err("efuse read error: [%d, %d, %d, %d]\n", ret0, ret1, ret2, ret3); + ret = 1; + } else { + pr_err("EFUSE is invalid\n"); + ret = 0; + } + + return ret; +} + +static int _connsys_a_die_thermal_cal(enum sys_spi_subsystem subsystem) +{ + int efuse_valid = 0; + unsigned int efuse0 = 0, efuse1 = 0, efuse2 = 0, efuse3 = 0; + + /* thernal efuse data in 7976&7975 in EFUSE2 */ + efuse_valid = connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_THADC_ANALOG, + &efuse0, &efuse1, &efuse2, &efuse3); + //if (efuse_valid) { + if ((efuse0 & (0x1 << 7))) { + consys_spi_write_offset_range_nolock(subsystem, ATOP_RG_TOP_THADC_BG, efuse0, 12, 3, 4); + consys_spi_write_offset_range_nolock(subsystem, ATOP_RG_TOP_THADC_00, efuse0, 23, 0, 3); + } + //} + + efuse_valid = connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_THADC_SLOP, + &efuse0, &efuse1, &efuse2, &efuse3); + //if (efuse_valid) { + if((efuse0 & (0x1 << 7))) { + consys_spi_write_offset_range_nolock(subsystem, ATOP_RG_TOP_THADC_00, efuse0, 26, 5, 2); + } + //} + + return 0; +} + +static int _connsys_a_die_xtal_trim_7976(enum sys_spi_subsystem subsystem) +{ + unsigned int efuse0 = 0, efuse1 = 0, efuse2 = 0, efuse3 = 0; + int c1c2_trim_result_ax_80m = 0, c1c2_trim_result_ax_40m = 0; + unsigned int cbtop_strap_rdata = 0, xtal_strap_mode = 0, adie_rdata = 0, value = 0; + + connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_XTAL_TRIM_FLOW, + &efuse0, &efuse1, &efuse2, &efuse3); + if ((efuse0 & (0x1 < 1))) { + /* C1C2 80M AX */ + connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_XTAL_CR_C1_SEL_AXM_80M_OSC, + &efuse0, &efuse1, &efuse2, &efuse3); + if ((efuse0 & (0x1 < 7)) == 0) { + c1c2_trim_result_ax_80m = 64; + } else { + c1c2_trim_result_ax_80m = (efuse0 & 0x7F); + connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_XTAL_CR_C1_SEL_AXM_TRIM1_80M_OSC, + &efuse0, &efuse1, &efuse2, &efuse3); + if ((efuse0 & (0x1 < 7)) == 1) { + if ((efuse0 & (0x1 < 6)) == 0) { + c1c2_trim_result_ax_80m += c1c2_trim_result_ax_80m + (efuse0 & 0x3F); + } else { + c1c2_trim_result_ax_80m = c1c2_trim_result_ax_80m - (efuse0 & 0x3F); + } + + if (c1c2_trim_result_ax_80m > 127) + c1c2_trim_result_ax_80m = 127; + else if (c1c2_trim_result_ax_80m < 0) + c1c2_trim_result_ax_80m = 0; + } + } + + /* C1C2 40M AX */ + connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_XTAL_CR_C1_SEL_AXM_40M_OSC, + &efuse0, &efuse1, &efuse2, &efuse3); + if ((efuse0 & (0x1 < 7)) == 0) { + c1c2_trim_result_ax_40m = 64; + } else { + c1c2_trim_result_ax_40m = (efuse0 & 0x7F); + connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_XTAL_CR_C1_SEL_AXM_TRIM1_40M_OSC, + &efuse0, &efuse1, &efuse2, &efuse3); + if ((efuse0 & (0x1 < 7)) == 1) { + if ((efuse0 & (0x1 < 6)) == 0) { + c1c2_trim_result_ax_40m += c1c2_trim_result_ax_40m + (efuse0 & 0x3F); + } else { + c1c2_trim_result_ax_40m = c1c2_trim_result_ax_40m - (efuse0 & 0x3F); + } + + if (c1c2_trim_result_ax_40m > 127) + c1c2_trim_result_ax_40m = 127; + else if (c1c2_trim_result_ax_40m < 0) + c1c2_trim_result_ax_40m = 0; + } + } + + /* Update trim value to C1 and C2 */ + consys_spi_read_nolock(subsystem, ATOP_RG_STRAP_PIN_IN, &cbtop_strap_rdata); + xtal_strap_mode = ((cbtop_strap_rdata & 0x70) >> 4); + if ((xtal_strap_mode == 0x0) || (xtal_strap_mode == 0x2)) { //80m osc + /* C1 */ + consys_spi_read_nolock(subsystem, 0x654, &adie_rdata); + value = (adie_rdata & 0xFFFFFF) | ((c1c2_trim_result_ax_80m & 0xFF) << 24); + consys_spi_write_nolock(subsystem, 0x654, value); + + /* C2 */ + consys_spi_read_nolock(subsystem, 0x658, &adie_rdata); + value = (adie_rdata & 0xFFFFFF) | ((c1c2_trim_result_ax_80m & 0xFF) << 24); + consys_spi_write_nolock(subsystem, 0x658, value); + } else if ((xtal_strap_mode == 0x3) || (xtal_strap_mode == 0x4) || (xtal_strap_mode == 0x6)) { //40m osc + /* C1 */ + consys_spi_read_nolock(subsystem, 0x654, &adie_rdata); + value = (adie_rdata & 0xFF00FFFF) | ((c1c2_trim_result_ax_40m & 0xFF) << 16); + consys_spi_write_nolock(subsystem, 0x654, value); + + /* C2 */ + consys_spi_read_nolock(subsystem, 0x658, &adie_rdata); + value = (adie_rdata & 0xFF00FFFF) | ((c1c2_trim_result_ax_40m & 0xFF) << 16); + consys_spi_write_nolock(subsystem, 0x658, value); + } + } + + return 0; +} + +static int _connsys_a_die_sw_cntl(enum sys_spi_subsystem subsystem, unsigned char adie_idx) +{ + if (conn_hw_env[adie_idx].valid && (conn_hw_env[adie_idx].adie_id == 0x7976)) { + if ((conn_hw_env[adie_idx].adie_hw_version == 0x8A00) + || (conn_hw_env[adie_idx].adie_hw_version == 0x8A10) + || (conn_hw_env[adie_idx].adie_hw_version == 0x8B00)){ + consys_spi_write_nolock(subsystem, ATOP_RG_TOP_THADC_00, 0x4A563B00); + consys_spi_write_nolock(subsystem, ATOP_RG_XO_01, 0x1D59080F); + consys_spi_write_nolock(subsystem, ATOP_RG_XO_03, 0x34C00FE0); + } else { + consys_spi_write_nolock(subsystem, ATOP_RG_TOP_THADC_00, 0x4A563B00); + consys_spi_write_nolock(subsystem, ATOP_RG_XO_01, 0x1959C80F); + consys_spi_write_nolock(subsystem, ATOP_RG_XO_03, 0x34D00FE0); + } + } + + return 0; +} + +int _connsys_a_die_cfg_7976(unsigned char adie_idx) +{ + int check; + unsigned int adie_chip_id = 0x0; + unsigned char subsystem = 0; + + if (adie_idx == 1) + subsystem = SYS_SPI_2ND_ADIE_TOP; + else + subsystem = SYS_SPI_TOP; + + /* release D Die to A Die Digital reset_b */ + if (adie_idx == 1) + CONSYS_SET_BIT(REG_CONN_INFRA_CFG_ADDR + ADIE_CTL, 0x4); + else + CONSYS_SET_BIT(REG_CONN_INFRA_CFG_ADDR + ADIE_CTL, 0x1); + + /* Get semaphore once */ + if (consys_sema_acquire_timeout(CONN_SEMA_RFSPI_INDEX, CONN_SEMA_TIMEOUT) == CONN_SEMA_GET_FAIL) { + pr_err("Require semaphore fail\n"); + return -1; + } + + /* read a-die ID */ + check = consys_spi_read_nolock(subsystem, ATOP_CHIP_ID, &adie_chip_id); + if (check) { + /* Release semaphore */ + consys_sema_release(CONN_SEMA_RFSPI_INDEX); + pr_err("Get ATOP_CHIP_ID fail, check=%d\n", check); + return -1; + } + + if (adie_idx < AIDE_NUM_MAX && ((adie_chip_id & 0xFFFF0000) != 0)) { + conn_hw_env[adie_idx].valid = true; + conn_hw_env[adie_idx].adie_hw_version = (adie_chip_id & 0xFFFF); + conn_hw_env[adie_idx].adie_id = ((adie_chip_id & 0xFFFF0000) >> 16); + conn_hw_env[adie_idx].is_rc_mode = 0; + + pr_info("adie_idx[%d], A-die CHIP ID = 0x%x, HW Version = 0x%x\n", + adie_idx, conn_hw_env[adie_idx].adie_id, conn_hw_env[adie_idx].adie_hw_version); + } + + /* enable TOPDIG CK */ + check = consys_spi_write_nolock(subsystem, ATOP_TOP_CLK_EN, 0xFFFFFFFF); + + /* config WRI CK select */ + if (one_adie_dbdc) + check = consys_spi_write_nolock(subsystem, ATOP_RG_WRI_CK_SELECT, 0x1C); + + /* Thermal Cal (TOP) */ + _connsys_a_die_thermal_cal(subsystem); + + /* XTAL TRIM */ + _connsys_a_die_xtal_trim_7976(subsystem); + + /* SW control part */ + _connsys_a_die_sw_cntl(subsystem, adie_idx); + + /* Release semaphore */ + consys_sema_release(CONN_SEMA_RFSPI_INDEX); + + return 0; +} + +static int _connsys_a_die_xtal_trim_7975(enum sys_spi_subsystem subsystem) +{ + unsigned int efuse0 = 0, efuse1 = 0, efuse2 = 0, efuse3 = 0; + unsigned int trim_result = 0, value = 0; + int ret = 0; + + ret = connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_7975_XTAL_TRIM_FLOW, + &efuse0, &efuse1, &efuse2, &efuse3); + if (((efuse0 & 0x1) == 0) || (ret == 0)) + return 0; + + connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_7975_XTAL_CALIBRATION, + &efuse0, &efuse1, &efuse2, &efuse3); + if ((efuse0 & (0x1 << 7))) { + trim_result = (efuse0 & 0x7F); + trim_result = (trim_result & 0x7F); + } + + connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_7975_XTAL_TRIM2_COMPENSATION, + &efuse0, &efuse1, &efuse2, &efuse3); + if ((efuse0 & (0x1 << 7))){ + if ((efuse0 & (0x1 << 6))) + trim_result -= (efuse0 & 0x3F); + else + trim_result += (efuse0 & 0x3F); + trim_result = (trim_result & 0x7F); + } + + connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_7975_XTAL_TRIM3_COMPENSATION, + &efuse0, &efuse1, &efuse2, &efuse3); + if ((efuse0 & (0x1 << 7))){ + if ((efuse0 & (0x1 << 6))) + trim_result -= (efuse0 & 0x3F); + else + trim_result += (efuse0 & 0x3F); + trim_result = (trim_result & 0x7F); + } + + connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_7975_XTAL_TRIM4_COMPENSATION, + &efuse0, &efuse1, &efuse2, &efuse3); + if ((efuse0 & (0x1 << 7))){ + if ((efuse0 & (0x1 << 6))) + trim_result -= (efuse0 & 0x3F); + else + trim_result += (efuse0 & 0x3F); + trim_result = (trim_result & 0x7F); + } + + /* Update Trim Value to C1 and C2*/ + /* Step 1 */ + consys_spi_read_nolock(subsystem, ATOP_7975_CR_C1_C2_A94, &value); + value = ((value & 0xf8080fff) | ((trim_result << 20) | (trim_result << 12))); + consys_spi_write_nolock(subsystem, ATOP_7975_CR_C1_C2_A94, value); + + /* Step 2 */ + consys_spi_read_nolock(subsystem, ATOP_7975_CR_C1_C2_A18, &value); + if(value & (1<<29)){ + consys_spi_read_nolock(subsystem, ATOP_7975_CR_C1_C2_A84, &value); + value = (value & 0x7fffffff); + consys_spi_write_nolock(subsystem, ATOP_7975_CR_C1_C2_A84, value); + } + + /* Step 3 */ + consys_spi_read_nolock(subsystem, ATOP_7975_CR_C1_C2_AA4, &value); + value = ((value & 0xfffeffff) | 0x10000); + consys_spi_write_nolock(subsystem, ATOP_7975_CR_C1_C2_AA4, value); + + return 0; +} + + +static int _connsys_a_die_form_patch_7975(enum sys_spi_subsystem subsystem) +{ + pr_info("Form 7975 adie Patch\n"); + + /* disable CAL LDO and fine tune RFDIG LDO, 20191218 */ + consys_spi_write_nolock(subsystem, 0x348, 0x00000002); + + /* disable CAL LDO and fine tune RFDIG LDO, 20191218 */ + consys_spi_write_nolock(subsystem, 0x378, 0x00000002); + + /* disable CAL LDO and fine tune RFDIG LDO, 20191218 */ + consys_spi_write_nolock(subsystem, 0x3A8, 0x00000002); + + /* disable CAL LDO and fine tune RFDIG LDO, 20191218 */ + consys_spi_write_nolock(subsystem, 0x3D8, 0x00000002); + + /* set CKA driving and filter */ + consys_spi_write_nolock(subsystem, 0xA1C, 0x30000AAA); + + /* set CKB LDO to 1.4V */ + consys_spi_write_nolock(subsystem, 0xA84, 0x8470008A); + + /* turn on SX0 LTBUF */ + consys_spi_write_nolock(subsystem, 0x074, 0x00000007); + + /* CK_BUF_SW_EN=1 (all buf in manual mode.) */ + consys_spi_write_nolock(subsystem, 0xAA4, 0x01001FC0); + + /* BT mode/WF normal mode 32'h=00000005 */ + consys_spi_write_nolock(subsystem, 0x070, 0x00000005); + + /* BG thermal sensor offset update */ + consys_spi_write_nolock(subsystem, 0x344, 0x00000088); + + /* BG thermal sensor offset update */ + consys_spi_write_nolock(subsystem, 0x374, 0x00000088); + + /* BG thermal sensor offset update */ + consys_spi_write_nolock(subsystem, 0x3A4, 0x00000088); + + /* BG thermal sensor offset update */ + consys_spi_write_nolock(subsystem, 0x3D4, 0x00000088); + + /* set WCON VDD IPTAT to "0000" */ + consys_spi_write_nolock(subsystem, 0xA80, 0x44D07000); + + /* change back LTBUF SX3 drving to default value, 20191113 */ + consys_spi_write_nolock(subsystem, 0xA88, 0x3900AAAA); + + /* SM input cap off */ + consys_spi_write_nolock(subsystem, 0x2C4, 0x00000000); + + + return 0; +} + +int _connsys_a_die_cfg_7975(unsigned char adie_idx) +{ + int check; + unsigned int adie_chip_id = 0x0; + unsigned char subsystem = 0; + + if (adie_idx == 1) + subsystem = SYS_SPI_2ND_ADIE_TOP; + else + subsystem = SYS_SPI_TOP; + + /* release D Die to A Die Digital reset_b */ + if (adie_idx == 1) + CONSYS_SET_BIT(REG_CONN_INFRA_CFG_ADDR + ADIE_CTL, 0x4); + else + CONSYS_SET_BIT(REG_CONN_INFRA_CFG_ADDR + ADIE_CTL, 0x1); + + /* Get semaphore once */ + if (consys_sema_acquire_timeout(CONN_SEMA_RFSPI_INDEX, CONN_SEMA_TIMEOUT) == CONN_SEMA_GET_FAIL) { + pr_err("Require semaphore fail\n"); + return -1; + } + + /* read a-die ID */ + check = consys_spi_read_nolock(subsystem, ATOP_CHIP_ID, &adie_chip_id); + if (check) { + /* Release semaphore */ + consys_sema_release(CONN_SEMA_RFSPI_INDEX); + pr_err("Get ATOP_CHIP_ID fail, check=%d\n", check); + return -1; + } + + if (adie_idx < AIDE_NUM_MAX) { + conn_hw_env[adie_idx].valid = true; + conn_hw_env[adie_idx].adie_hw_version = (adie_chip_id & 0xFFFF); + conn_hw_env[adie_idx].adie_id = ((adie_chip_id & 0xFFFF0000) >> 16); + conn_hw_env[adie_idx].is_rc_mode = 0; + + pr_info("adie_idx[%d], A-die CHIP ID = 0x%x, HW Version = 0x%x\n", + adie_idx, conn_hw_env[adie_idx].adie_id, conn_hw_env[adie_idx].adie_hw_version); + } + + /* enable TOPDIG CK */ + check = consys_spi_write_nolock(subsystem, ATOP_TOP_CLK_EN, 0xFFFFFFFF); + + /* Thermal Cal (TOP) */ + _connsys_a_die_thermal_cal(subsystem); + + /* XTAL TRIM */ + _connsys_a_die_xtal_trim_7975(subsystem); + + /* Form Harrier E2 Patch */ + _connsys_a_die_form_patch_7975(subsystem); + + /* Release semaphore */ + consys_sema_release(CONN_SEMA_RFSPI_INDEX); + + return 0; +} + +int connsys_a_die_cfg(void) +{ + int ret; + memset(&conn_hw_env, 0, sizeof(conn_hw_env)); + + if (adie_7976){ + if (adie_cfg_type == ADIE_TYPE_TWO) { + ret = _connsys_a_die_cfg_7976(0); + ret = _connsys_a_die_cfg_7976(1); + } else { + if (one_adie_dbdc) { + ret = _connsys_a_die_cfg_7976(0); + } else { + ret = _connsys_a_die_cfg_7976(1); + } + } + } else { + if (adie_cfg_type == ADIE_TYPE_TWO) { + ret = _connsys_a_die_cfg_7975(0); + ret = _connsys_a_die_cfg_7975(1); + } else { + if (!one_adie_dbdc) + ret = _connsys_a_die_cfg_7975(1); + } + } + + return ret; +} + +int _connsys_afe_wbg_cal_7976(unsigned char wbg_idx, unsigned char rfspi_idx) +{ + int check; + unsigned long afe_ctl_addr = 0; + unsigned char subsystem = 0; + + if ((wbg_idx == 0) && (rfspi_idx == 0)) { + afe_ctl_addr = REG_CONN_AFE_CTL_ADDR; + subsystem = SYS_SPI_TOP; + } else if ((wbg_idx == 1) && (rfspi_idx == 0)) { + afe_ctl_addr = REG_CONN_AFE_CTL_2ND_ADDR; + subsystem = SYS_SPI_TOP; + } else if ((wbg_idx == 1) && (rfspi_idx == 1)) { + afe_ctl_addr = REG_CONN_AFE_CTL_2ND_ADDR; + subsystem = SYS_SPI_2ND_ADIE_TOP; + } else { + pr_err("Not support for this combination (wbg_idx=%d, rfspi_idx=%d)\n", + wbg_idx, rfspi_idx); + return -1; + } + + /* Get semaphore once */ + if (consys_sema_acquire_timeout(CONN_SEMA_RFSPI_INDEX, CONN_SEMA_TIMEOUT) == CONN_SEMA_GET_FAIL) { + pr_err("Require semaphore fail\n"); + return -1; + } + + /* set WF_PAD to HighZ */ + check = consys_spi_write_nolock(subsystem, ATOP_RG_ENCAL_WBTAC_IF_SW, 0x88888005); + + /* AFE WBG CAL SEQ1 (RC calibration) */ + CONSYS_SET_BIT(afe_ctl_addr + RG_DIG_EN_01, 0x1); + udelay(60); + CONSYS_CLR_BIT(afe_ctl_addr + RG_DIG_EN_01, 0x1); + + /* AFE WBG CAL SEQ2 (TX calibration) */ + CONSYS_SET_BIT(afe_ctl_addr + RG_DIG_EN_03, (0x1 << 21)); + udelay(30); + CONSYS_SET_BIT(afe_ctl_addr + RG_DIG_EN_03, (0x1 << 20)); + udelay(60); + CONSYS_SET_BIT(afe_ctl_addr + RG_DIG_EN_01, 0x203E0000); + udelay(800); + CONSYS_CLR_BIT(afe_ctl_addr + RG_DIG_EN_01, 0x203E0000); + CONSYS_CLR_BIT(afe_ctl_addr + RG_DIG_EN_03, 0x300000); + + /* disable WF_PAD to HighZ */ + check = consys_spi_write_nolock(subsystem, ATOP_RG_ENCAL_WBTAC_IF_SW, 0x00000005); + + /* Release semaphore */ + consys_sema_release(CONN_SEMA_RFSPI_INDEX); + + return 0; +} + +int _connsys_afe_wbg_cal_7975(unsigned char wbg_idx, unsigned char rfspi_idx) +{ + int check; + unsigned long afe_ctl_addr = 0; + unsigned char subsystem = 0; + + if ((wbg_idx == 0) && (rfspi_idx == 0)) { + afe_ctl_addr = REG_CONN_AFE_CTL_ADDR; + subsystem = SYS_SPI_TOP; + } else if ((wbg_idx == 1) && (rfspi_idx == 0)) { + afe_ctl_addr = REG_CONN_AFE_CTL_2ND_ADDR; + subsystem = SYS_SPI_TOP; + } else if ((wbg_idx == 1) && (rfspi_idx == 1)) { + afe_ctl_addr = REG_CONN_AFE_CTL_2ND_ADDR; + subsystem = SYS_SPI_2ND_ADIE_TOP; + } else { + pr_err("Not support for this combination (wbg_idx=%d, rfspi_idx=%d)\n", + wbg_idx, rfspi_idx); + return -1; + } + + /* Get semaphore once */ + if (consys_sema_acquire_timeout(CONN_SEMA_RFSPI_INDEX, CONN_SEMA_TIMEOUT) == CONN_SEMA_GET_FAIL) { + pr_err("Require semaphore fail\n"); + return -1; + } + + /* set WF_PAD to HighZ */ + check = consys_spi_write_nolock(subsystem, ATOP_RG_ENCAL_WBTAC_IF_SW, 0x80000000); + + /* AFE WBG CAL SEQ1 (RC calibration) */ + CONSYS_SET_BIT(afe_ctl_addr + RG_DIG_EN_01, 0x1); + udelay(60); + CONSYS_CLR_BIT(afe_ctl_addr + RG_DIG_EN_01, 0x1); + + /* AFE WBG CAL SEQ2 (TX calibration) */ + CONSYS_SET_BIT(afe_ctl_addr + RG_DIG_EN_03, (0x1 << 21)); + udelay(30); + CONSYS_SET_BIT(afe_ctl_addr + RG_DIG_EN_03, (0x1 << 20)); + udelay(60); + CONSYS_SET_BIT(afe_ctl_addr + RG_DIG_EN_01, 0x3E0000); + udelay(800); + CONSYS_CLR_BIT(afe_ctl_addr + RG_DIG_EN_01, 0x3E0000); + CONSYS_CLR_BIT(afe_ctl_addr + RG_DIG_EN_03, 0x300000); + + /* disable WF_PAD to HighZ */ + check = consys_spi_write_nolock(subsystem, ATOP_RG_ENCAL_WBTAC_IF_SW, 0x00000005); + + /* Release semaphore */ + consys_sema_release(CONN_SEMA_RFSPI_INDEX); + + return 0; +} + +int connsys_afe_wbg_cal(void) +{ + int ret; + + if (adie_7976){ + if (adie_cfg_type == ADIE_TYPE_TWO) { + ret = _connsys_afe_wbg_cal_7976(0, 0); + ret = _connsys_afe_wbg_cal_7976(1, 1); + } else { + if (one_adie_dbdc) { + ret = _connsys_afe_wbg_cal_7976(0, 0); + } else { + ret = _connsys_afe_wbg_cal_7976(1, 1); + } + } + } else { + if (adie_cfg_type == ADIE_TYPE_TWO) { + ret = _connsys_afe_wbg_cal_7975(0, 0); + ret = _connsys_afe_wbg_cal_7975(1, 1); + } else { + if (!one_adie_dbdc) + ret = _connsys_afe_wbg_cal_7975(1, 1); + } + } + + return ret; +} + +int _connsys_subsys_pll_initial(unsigned char wbg_idx) +{ + unsigned long afe_ctl_addr = 0; + + if (wbg_idx == 0) { + afe_ctl_addr = REG_CONN_AFE_CTL_ADDR; + } else if (wbg_idx == 1) { + afe_ctl_addr = REG_CONN_AFE_CTL_2ND_ADDR; + } else { + pr_err("Not support for this wbg index (wbg_idx=%d)\n", wbg_idx); + return -1; + } + + /* SWITCH(xtal_freq) + CASE SYS_XTAL_40000K + */ + /* set BPLL stable time = 30us (value = 30 * 1000 *1.01 / 25ns) */ + CONSYS_REG_WRITE_RANGE(afe_ctl_addr + RG_PLL_STB_TIME, (0x4BC << 16), 30, 16); + /* set WPLL stable time = 50us (value = 50 * 1000 *1.01 / 25ns) */ + CONSYS_REG_WRITE_RANGE(afe_ctl_addr + RG_PLL_STB_TIME, 0x7E4, 14, 0); + /* BT pll_en will turn on BPLL only (may change in different XTAL option) */ + CONSYS_REG_WRITE_RANGE(afe_ctl_addr + RG_DIG_EN_02, (0x1 << 6), 7, 6); + /* WF pll_en will turn on WPLL only (may change in different XTAL option) */ + CONSYS_REG_WRITE_RANGE(afe_ctl_addr + RG_DIG_EN_02, 0x2, 1, 0); + /* MCU pll_en will turn on BPLL (may change in different XTAL option) */ + CONSYS_REG_WRITE_RANGE(afe_ctl_addr + RG_DIG_EN_02, (0x1 << 2), 3, 2); + /* MCU pll_en will turn on BPLL + WPLL (may change in different XTAL option) */ + CONSYS_REG_WRITE_RANGE(afe_ctl_addr + RG_DIG_EN_02, (0x2 << 16), 17, 16); + /* CONN_INFRA CLKGEN WPLL AND BPLL REQUEST */ + CONSYS_REG_WRITE_RANGE(afe_ctl_addr + RG_DIG_TOP_01, (0x9 << 15), 18, 15); + + return 0; +} + +int connsys_subsys_pll_initial(void) +{ + int ret; + + ret = _connsys_subsys_pll_initial(0); + + return ret; +} + +int connsys_osc_legacy_mode(void) +{ + /* disable conn_top rc osc_ctrl_top */ + CONSYS_CLR_BIT(REG_CONN_INFRA_CFG_ADDR + CONN_INFRA_CFG_RC_CTL_0, 0x80); + CONSYS_REG_WRITE_RANGE(REG_CONN_INFRA_CFG_ADDR + OSC_CTL_0, 0x80706, 23, 0); + + return 0; +} + +int connsys_top_pwr_ctrl(void) +{ + /* prevent subsys from power on/of in a short time interval */ + CONSYS_CLR_BIT_WITH_KEY(REG_CONN_INFRA_RGU_ADDR + BGFYS_ON_TOP_PWR_CTL, 0x40, 0x42540000); + CONSYS_CLR_BIT_WITH_KEY(REG_CONN_INFRA_RGU_ADDR + WFSYS_ON_TOP_PWR_CTL, 0x40, 0x57460000); + + return 0; +} + +int connsys_conn_infra_bus_timeout(void) +{ + /* set conn_infra_off bus timeout */ + CONSYS_REG_WRITE_RANGE(REG_CONN_INFRA_BUS_CR_ADDR + CONN_INFRA_BUS_OFF_TIMEOUT_CTRL, (0x2 << 7), 14, 7); + /* enable conn_infra off bus timeout feature */ + CONSYS_REG_WRITE_RANGE(REG_CONN_INFRA_BUS_CR_ADDR + CONN_INFRA_BUS_OFF_TIMEOUT_CTRL, 0xF, 3, 0); + + /* set conn_infra_on bus timeout */ + CONSYS_REG_WRITE_RANGE(REG_CONN_INFRA_BUS_CR_ADDR + CONN_INFRA_BUS_ON_TIMEOUT_CTRL, (0xC << 7), 14, 7); + /* enable conn_infra_on bus timeout feature */ + CONSYS_REG_WRITE_RANGE(REG_CONN_INFRA_BUS_CR_ADDR + CONN_INFRA_BUS_ON_TIMEOUT_CTRL, 0xF, 3, 0); + + return 0; +} + +int connsys_clkgen_wpll_hw_ctrl(void) +{ + /* set hclk_div_1 with wpll div sel */ + CONSYS_REG_WRITE_MASK(REG_CONN_INFRA_CLKGEN_ON_TOP_ADDR + CKGEN_BUS_WPLL_DIV_1, 0x4, 0xFC); + + /* set hclk_div_2 with wpll div sel */ + CONSYS_REG_WRITE_MASK(REG_CONN_INFRA_CLKGEN_ON_TOP_ADDR + CKGEN_BUS_WPLL_DIV_2, 0x4, 0xFC); + +#ifndef CONFIG_FPGA_EARLY_PORTING + /* enable conn_infra bus wpll div_1 */ + CONSYS_SET_BIT(REG_CONN_INFRA_CLKGEN_ON_TOP_ADDR + CKGEN_BUS_WPLL_DIV_1, 0x1); + + /* enable conn_infra bus wpll div_2 */ + CONSYS_SET_BIT(REG_CONN_INFRA_CLKGEN_ON_TOP_ADDR + CKGEN_BUS_WPLL_DIV_2, 0x1); +#endif + +#ifndef CONFIG_FPGA_EARLY_PORTING + /* set rfspi wpll div sel + enable rfspis wpll div + */ + CONSYS_REG_WRITE_MASK(REG_CONN_INFRA_CLKGEN_ON_TOP_ADDR + CKGEN_RFSPI_WPLL_DIV, 0x21, 0xFD); +#else + /* set rfspi wpll div sel */ + CONSYS_REG_WRITE_MASK(REG_CONN_INFRA_CLKGEN_ON_TOP_ADDR + CKGEN_RFSPI_WPLL_DIV, 0x20, 0xFC); +#endif + + /* disable conn_infra bus clock sw control ==> conn_infra bus clock hw control */ + CONSYS_CLR_BIT(REG_CONN_INFRA_CLKGEN_ON_TOP_ADDR + CKGEN_BUS, 0x800000); + + /* Conn_infra HW_CONTROL => conn_infra enter dsleep mode */ + CONSYS_SET_BIT(REG_CONN_INFRA_CFG_ADDR + CONN_INFRA_CFG_PWRCTRL0, 0x1); + + return 0; +} + +int consys_conninfra_top_wakeup(void) +{ + /* wake up conn_infra */ + CONSYS_SET_BIT(REG_CONN_HOST_CSR_TOP_ADDR + CONN_INFRA_WAKEPU_TOP, 0x1); + + /* Wait 900us (apply this for CONNSYS XO clock ready) */ + udelay(900); + + /* Check CONNSYS version ID + * (polling "10 times" for specific project code and each polling interval is "1ms") + */ + if (consys_polling_chipid() != 0) { + pr_err("Polling chip id fail\n"); + return -1; + } + + return 0; +} + +int consys_conninfra_top_sleep(void) +{ + /* release conn_infra force on */ + CONSYS_CLR_BIT(REG_CONN_HOST_CSR_TOP_ADDR + CONN_INFRA_WAKEPU_TOP, 0x1); + + return 0; +} + +int _consys_adie_top_ck_en_on_off_ctrl(unsigned char rfspi_idx, enum consys_drv_type type, unsigned char on) +{ + int check = 0; + unsigned long slp_ctl_addr = 0; + + if (rfspi_idx == 1) + slp_ctl_addr = REG_INST2_CONN_WT_SLP_CTL_REG_ADDR; + else + slp_ctl_addr = REG_CONN_WT_SLP_CTL_REG_ADDR; + + if (type == CONNDRV_TYPE_CONNINFRA) { + if (on) + CONSYS_SET_BIT(slp_ctl_addr + WB_SLP_TOP_CK_0, 0x1); + else + CONSYS_CLR_BIT(slp_ctl_addr + WB_SLP_TOP_CK_0, 0x1); + CONSYS_REG_BIT_POLLING(slp_ctl_addr + WB_SLP_TOP_CK_0, 1, 0, 100, 500, check); + if (check == -1) + pr_err("[type=%d][on=%d] op= fail\n", type, on); + } else if (type == CONNDRV_TYPE_WIFI) { + if (on) + CONSYS_SET_BIT(slp_ctl_addr + WB_SLP_TOP_CK_1, 0x1); + else + CONSYS_CLR_BIT(slp_ctl_addr + WB_SLP_TOP_CK_1, 0x1); + CONSYS_REG_BIT_POLLING(slp_ctl_addr + WB_SLP_TOP_CK_1, 1, 0, 100, 500, check); + if (check == -1) + pr_err("[type=%d][on=%d] op= fail\n", type, on); + } else { + pr_err("Not support for this consys drv type = %d\n", type); + return -1; + } + + return 0; +} + +int consys_adie_top_ck_en_on_off_ctrl(enum consys_drv_type type, unsigned char on) +{ + int ret; + + if (consys_sema_acquire_timeout(CONN_SEMA_CONN_INFRA_COMMON_SYSRAM_INDEX, CONN_SEMA_TIMEOUT) == CONN_SEMA_GET_FAIL) { + pr_err("[type=%d] acquire semaphore (%d) timeout\n", + type, CONN_SEMA_CONN_INFRA_COMMON_SYSRAM_INDEX); + return -1; + } + + if (adie_cfg_type == ADIE_TYPE_TWO) { + ret = _consys_adie_top_ck_en_on_off_ctrl(0, type, on); + ret = _consys_adie_top_ck_en_on_off_ctrl(1, type, on); + } else { + if (one_adie_dbdc) { + ret = _consys_adie_top_ck_en_on_off_ctrl(0, type, on); + } else { + ret = _consys_adie_top_ck_en_on_off_ctrl(1, type, on); + } + } + + consys_sema_release(CONN_SEMA_CONN_INFRA_COMMON_SYSRAM_INDEX); + + return ret; +} + +int consys_conninfra_wf_wakeup(void) +{ + /* wake up conn_infra */ + CONSYS_SET_BIT(REG_CONN_HOST_CSR_TOP_ADDR + CONN_INFRA_WAKEPU_WF, 0x1); + + /* Wait 900us (apply this for CONNSYS XO clock ready) */ + udelay(900); + + /* Check CONNSYS version ID + * (polling "10 times" for specific project code and each polling interval is "1ms") + */ + if (consys_polling_chipid() != 0) { + pr_err("Polling chip id fail\n"); + return -1; + } + + return 0; +} + +int consys_conninfra_wf_sleep(void) +{ + CONSYS_CLR_BIT(REG_CONN_HOST_CSR_TOP_ADDR + CONN_INFRA_WAKEPU_WF, 0x1); + + return 0; +} + +int consys_conn_wmcpu_sw_reset(bool bassert) +{ + if (bassert) + CONSYS_CLR_BIT(REG_CONN_INFRA_RGU_ADDR + WFSYS_CPU_SW_RST_B, 0x1); + else + CONSYS_SET_BIT(REG_CONN_INFRA_RGU_ADDR + WFSYS_CPU_SW_RST_B, 0x1); + + return 0; +} + +int consys_wf_bus_slp_prot_ctrl(bool enable) +{ + /* Turn on/off "conn_infra to wfsys"/wfsys to conn_infra/wfdma2conn" bus sleep protect */ + + if (enable) + CONSYS_SET_BIT(REG_CONN_INFRA_CFG_ADDR + CONN_INFRA_WF_SLP_CTRL, 0x1); + else + CONSYS_CLR_BIT(REG_CONN_INFRA_CFG_ADDR + CONN_INFRA_WF_SLP_CTRL, 0x1); + + return 0; +} + +int consys_wfsys_top_on_ctrl(bool enable) +{ + int check = 0; + + if (enable) { + /* turn on wfsys_top_on */ + CONSYS_SET_BIT(REG_CONN_INFRA_RGU_ADDR + WFSYS_ON_TOP_PWR_CTL, 0x57460080); + + /* polling wfsys_rgu_off_hreset_rst_b */ + CONSYS_REG_BIT_POLLING(REG_CONN_HOST_CSR_TOP_ADDR + DBG_DUMMY_3, 30, 1, 100, 500, check); + if (check == -1) + pr_err("[%d] polling wfsys_rgu_off_hreset_rst_b fail\n", enable); + } else { + /* turn off wfsys_top_on */ + CONSYS_CLR_BIT_WITH_KEY(REG_CONN_INFRA_RGU_ADDR + WFSYS_ON_TOP_PWR_CTL, 0x80, 0x57460000); + + /* polling wfsys_rgu_off_hreset_rst_b */ + CONSYS_REG_BIT_POLLING(REG_CONN_HOST_CSR_TOP_ADDR + DBG_DUMMY_3, 30, 0, 100, 500, check); + if (check == -1) + pr_err("[%d] polling wfsys_rgu_off_hreset_rst_b fail\n", enable); + } + + return 0; +} + +int consys_wfsys_bus_slp_prot_check(bool enable) +{ + int check = 0; + + if (enable) { + /* check "conn_infra to wfsys"/wfsys to conn_infra" bus sleep protect turn off */ + CONSYS_REG_BIT_POLLING(REG_CONN_INFRA_CFG_ADDR + CONN_INFRA_WF_SLP_STATUS, 29, 0, 100, 500, check); + if (check == -1) + pr_err("[bit %d] check conn_infra to wfsys or wfsys to conn_infra bus sleep protect turn off fail\n", 29); + + CONSYS_REG_BIT_POLLING(REG_CONN_INFRA_CFG_ADDR + CONN_INFRA_WF_SLP_STATUS, 31, 0, 100, 500, check); + if (check == -1) + pr_err("[bit %d] check conn_infra to wfsys or wfsys to conn_infra bus sleep protect turn off fail\n", 31); + + /* check WFDMA2CONN AXI TX bus sleep protect turn off */ + CONSYS_REG_BIT_POLLING(REG_WF_TOP_SLPPROT_ON_ADDR + WF_TOP_SLPPROT_ON_STATUS_READ, 23, 0, 100, 500, check); + if (check == -1) + pr_err("check WFDMA2CONN AXI TX bus sleep protect turn off fail\n"); + + /* check WFDMA2CONN AXI RX bus sleep protect turn off */ + CONSYS_REG_BIT_POLLING(REG_WF_TOP_SLPPROT_ON_ADDR + WF_TOP_SLPPROT_ON_STATUS_READ, 21, 0, 100, 500, check); + if (check == -1) + pr_err("check WFDMA2CONN AXI RX bus sleep protect turn off fail\n"); + + /* check WFSYS version ID */ + CONSYS_REG_POLLING_LARGER_OR_EQUAL(REG_WF_TOP_CFG_ADDR + WF_TOP_CFG_IP_VERSION, 0xFFFFFFFF, 0, 0x02060000, 10, 500, check); + if (check == -1) + pr_err("check WFSYS version ID fail\n"); + } else { + /* check WFDMA2CONN AXI RX bus sleep protect turn on */ + CONSYS_REG_BIT_POLLING(REG_CONN_INFRA_CFG_ADDR + CONN_INFRA_WF_SLP_STATUS, 25, 1, 100, 500, check); + if (check == -1) + pr_err("check WFDMA2CONN AXI RX bus sleep protect turn on fail\n"); + + /* check "conn_infra to wfsys"/wfsys to conn_infra" bus sleep protect turn on */ + CONSYS_REG_BIT_POLLING(REG_CONN_INFRA_CFG_ADDR + CONN_INFRA_WF_SLP_STATUS, 29, 1, 100, 500, check); + if (check == -1) + pr_err("[bit %d] check conn_infra to wfsys or wfsys to conn_infra bus sleep protect turn on fail\n", 29); + + CONSYS_REG_BIT_POLLING(REG_CONN_INFRA_CFG_ADDR + CONN_INFRA_WF_SLP_STATUS, 31, 1, 100, 500, check); + if (check == -1) + pr_err("[bit %d] check conn_infra to wfsys or wfsys to conn_infra bus sleep protect turn on fail\n", 31); + } + + return 0; +} + +int consys_wfsys_bus_timeout_ctrl(void) +{ + /* set wfsys bus timeout value (ahb apb timeout) */ + CONSYS_REG_WRITE_MASK(REG_WF_MCU_CONFIG_LS_ADDR + BUSHANGCR, 0x1, 0xFF); + + /* enable wfsys bus timeout (ahb apb timeout) */ + CONSYS_SET_BIT(REG_WF_MCU_CONFIG_LS_ADDR + BUSHANGCR, 0x90000000); + + /* set conn2wf remapping window to wf debug_ctrl_ao CR */ + CONSYS_REG_WRITE(REG_WF_MCU_BUS_CR_ADDR + AP2WF_REMAP_1, 0x810F0000); + + /* set wfsys bus timeout value (debug ctrl ao) */ + CONSYS_REG_WRITE_MASK(REG_WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_ADDR + WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_WFMCU_PWA_CTRL0, + 0x03AA0000, 0xFFFF0000); + + /* enable wfsys bus timeout (debug ctrl ao) */ + CONSYS_SET_BIT(REG_WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_ADDR + WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_WFMCU_PWA_CTRL0, 0xC); + + return 0; +} + +int consys_wmcpu_idle_loop_check(void) +{ + int check = 0; + + /* check CONNSYS power-on completion */ + CONSYS_REG_POLLING_EQUAL(REG_WF_TOP_CFG_ON_ADDR + ROMCODE_INDEX, 0xFFFFFFFF, 0, 0x1D1E, 5000, 1000, check); + if (check == -1) + pr_err("check CONNSYS power-on completion fail\n"); + + return 0; +} + +void _consys_check_sku_cfg(void) +{ + unsigned int hw_sku_type = 0; + + if (one_adie_dbdc) { + if (adie_cfg_type == ADIE_TYPE_ONE) + hw_sku_type = 3000; + } + + if (hw_sku_type) + printk(GRN("SKU Type: %d"), hw_sku_type); + else + printk(GRN("Unknown SKU Type\n")); +} + +int consys_plt_adie_type_cfg(void) +{ + /* + If One_Adie_DB: + then TOP_MISC_CR (0x11D1_021C[31:28]) = 0x7 && 0x18050000 = 0x7 + */ + + if (one_adie_dbdc) { + if (adie_cfg_type == ADIE_TYPE_ONE) { + CONSYS_REG_WRITE_MASK(REG_TOP_MISC_ADDR + TOP_MISC_RSRV_ALL1_3, 0x70000000, 0xF0000000); + CONSYS_REG_WRITE(REG_CONN_INFRA_SYSRAM_ADDR + SYSRAM_BASE_ADDR, 0x7); + } + } + + if (_consys_check_adie_cfg() == 0) + _consys_check_sku_cfg(); + + return 0; +} + +int consys_wpll_ctrl(bool enable) +{ + if (enable) { + /* turn back wpll setting in conn_afe_ctl by setting wpll initial control to 2'b10 */ + CONSYS_REG_WRITE_MASK(REG_CONN_AFE_CTL_ADDR + RG_DIG_EN_02, 0x20002, 0x30003); + } else { + /* Don't need below code check anymore due to new design */ +#if 0 + int check = 0; + /* trun off wpll enable in conn_afe_ctl by setting wpll initial control to 2'b00 */ + CONSYS_REG_WRITE_MASK(REG_CONN_AFE_CTL_ADDR + RG_DIG_EN_02, 0x0, 0x30003); + + /* polling conn_infra bus to non-wpll case */ + CONSYS_REG_POLLING_EQUAL(REG_CONN_INFRA_CLKGEN_ON_TOP_ADDR + CKGEN_BUS, 0x7800, 11, 0x0, 5000, 1000, check); + if (check == -1) + pr_err("polling conn_infra bus to non-wpll case fail\n"); +#endif + } + return 0; +} + +int consys_conninfra_wf_req_clr(void) +{ + /* clear wf_emi_req */ + CONSYS_SET_BIT(REG_CONN_INFRA_CFG_ADDR + EMI_CTL_WF, 0x1); + CONSYS_CLR_BIT(REG_CONN_INFRA_CFG_ADDR + EMI_CTL_WF, 0x1); + + /* clear wf_infra_req */ + CONSYS_SET_BIT(REG_CONN_INFRA_CFG_ADDR + EMI_CTL_WF, 0x20); + CONSYS_CLR_BIT(REG_CONN_INFRA_CFG_ADDR + EMI_CTL_WF, 0x20); + + return 0; +} + diff --git a/package/conninfra/src/platform/mt7986/include/mt7986.h b/package/conninfra/src/platform/mt7986/include/mt7986.h new file mode 100644 index 0000000..a8dc0a2 --- /dev/null +++ b/package/conninfra/src/platform/mt7986/include/mt7986.h @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _PLATFORM_MT7986_H_ +#define _PLATFORM_MT7986_H_ + +enum +{ + ADIE_TYPE_NONE = 0, + ADIE_TYPE_ONE, + ADIE_TYPE_TWO, + ADIE_TYPE_NUM_MAX +}; + +enum conn_semaphore_type +{ + CONN_SEMA_CHIP_POWER_ON_INDEX = 0, + CONN_SEMA_CALIBRATION_INDEX = 1, + CONN_SEMA_FW_DL_INDEX = 2, + CONN_SEMA_CLOCK_SWITCH_INDEX = 3, + CONN_SEMA_CCIF_INDEX = 4, + CONN_SEMA_COEX_INDEX = 5, + CONN_SEMA_USB_EP0_INDEX = 6, + CONN_SEMA_USB_SHARED_INFO_INDEX = 7, + CONN_SEMA_USB_SUSPEND_INDEX = 8, + CONN_SEMA_USB_RESUME_INDEX = 9, + CONN_SEMA_PCIE_INDEX = 10, + CONN_SEMA_RFSPI_INDEX = 11, + CONN_SEMA_EFUSE_INDEX = 12, + CONN_SEMA_THERMAL_INDEX = 13, + CONN_SEMA_FLASH_INDEX = 14, + CONN_SEMA_DEBUG_INDEX = 15, + CONN_SEMA_WIFI_LP_INDEX = 16, + CONN_SEMA_PATCH_DL_INDEX = 17, + CONN_SEMA_SHARED_VAR_INDEX = 18, + CONN_SEMA_CONN_INFRA_COMMON_SYSRAM_INDEX = 19, + CONN_SEMA_NUM_MAX = 32 /* can't be omitted */ +}; + +unsigned int consys_soc_chipid_get(void); +unsigned int consys_get_hw_ver(void); + + +#endif /* _PLATFORM_MT7986_H_ */ diff --git a/package/conninfra/src/platform/mt7986/include/mt7986_consys_reg.h b/package/conninfra/src/platform/mt7986/include/mt7986_consys_reg.h new file mode 100644 index 0000000..475e6f0 --- /dev/null +++ b/package/conninfra/src/platform/mt7986/include/mt7986_consys_reg.h @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _PLATFORM_MT7986_CONSYS_REG_H_ +#define _PLATFORM_MT7986_CONSYS_REG_H_ + +#include "consys_reg_base.h" +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ +enum consys_base_addr_index { + TOP_MISC_BASE = 0, /* top_misc */ + TOPRGU_BASE = 1, /* TOPRGU */ + GPIO_BASE = 2, /* GPIO */ + IOCFG_TR_BASE = 3, /* IOCFG_TR */ + IOCFG_TL_BASE = 4, /* IOCFG_TL */ + INFRACFG_AO_BASE = 5, /* infracfg_ao_auto_gen_reg */ + CONN_INFRA_CFG_BASE = 6, /* conn_infra_cfg */ + CONN_INFRA_SYSRAM_BASE = 7, /* conn_infra_sysram */ + CONN_INFRA_CLKGEN_ON_TOP_BASE = 8, /* conn_infra_clkgen_on_top */ + CONN_HOST_CSR_TOP_BASE = 9, /* conn_host_csr_top */ + CONN_INFRA_BUS_CR_BASE = 10, /* conn_infra_bus_cr */ + CONN_INFRA_RGU_BASE = 11, /* conn_infra_rgu */ + CONN_WT_SLP_CTL_REG_BASE = 12, /* conn_wt_slp_ctl_reg */ + INST2_CONN_WT_SLP_CTL_REG_BASE = 13, /* Inst2_conn_wt_slp_ctl_reg */ + CONN_RF_SPI_MST_REG_BASE = 14, /* conn_rf_spi_mst_reg */ + INST2_CONN_RF_SPI_MST_REG_BASE = 15, /* Inst2_conn_rf_spi_mst_reg */ + CONN_SEMAPHORE_BASE = 16, /* conn_semaphore */ + CONN_AFE_CTL_BASE = 17, /* conn_afe_ctl */ + CONN_AFE_CTL_2ND_BASE = 18, /* conn_afe_ctl_2nd */ + WF_TOP_SLPPROT_ON_BASE = 19, /* wf_top_slpprot_on by remapping to 0x81020000 */ + WF_TOP_CFG_BASE = 20, /* wf_top_cfg by remapping to 0x80020000 */ + WF_MCU_CONFIG_LS_BASE = 21, /* wf_mcu_confg_ls by remapping to 0x88000000 */ + WF_MCU_BUS_CR_BASE = 22, /* wf_mcu_bus_cr by remapping to 0x830C0XXX */ + WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_BASE = 23, /* wf_mcusys_infra_bus_full_u_debug_ctrl_ao by remapping to 0x810F0000 */ + WF_TOP_CFG_ON_BASE = 24, /* wf_top_cfg_on by remapping to 0x81021000 */ + CONSYS_BASE_ADDR_MAX +}; + +struct consys_base_addr { + struct consys_reg_base_addr reg_base_addr[CONSYS_BASE_ADDR_MAX]; +}; + +extern struct consys_base_addr conn_reg; + +#define REG_TOP_MISC_ADDR conn_reg.reg_base_addr[TOP_MISC_BASE].vir_addr +#define REG_TOP_RGU_ADDR conn_reg.reg_base_addr[TOPRGU_BASE].vir_addr +#define REG_GPIO_BASE_ADDR conn_reg.reg_base_addr[GPIO_BASE].vir_addr +#define REG_IOCFG_TR_ADDR conn_reg.reg_base_addr[IOCFG_TR_BASE].vir_addr +#define REG_IOCFG_TL_ADDR conn_reg.reg_base_addr[IOCFG_TL_BASE].vir_addr +#define REG_INFRACFG_AO_ADDR conn_reg.reg_base_addr[INFRACFG_AO_BASE].vir_addr +#define REG_CONN_INFRA_CFG_ADDR conn_reg.reg_base_addr[CONN_INFRA_CFG_BASE].vir_addr +#define REG_CONN_INFRA_SYSRAM_ADDR conn_reg.reg_base_addr[CONN_INFRA_SYSRAM_BASE].vir_addr +#define REG_CONN_INFRA_CLKGEN_ON_TOP_ADDR conn_reg.reg_base_addr[CONN_INFRA_CLKGEN_ON_TOP_BASE].vir_addr +#define REG_CONN_HOST_CSR_TOP_ADDR conn_reg.reg_base_addr[CONN_HOST_CSR_TOP_BASE].vir_addr +#define REG_CONN_INFRA_BUS_CR_ADDR conn_reg.reg_base_addr[CONN_INFRA_BUS_CR_BASE].vir_addr +#define REG_CONN_INFRA_RGU_ADDR conn_reg.reg_base_addr[CONN_INFRA_RGU_BASE].vir_addr +#define REG_CONN_WT_SLP_CTL_REG_ADDR conn_reg.reg_base_addr[CONN_WT_SLP_CTL_REG_BASE].vir_addr +#define REG_INST2_CONN_WT_SLP_CTL_REG_ADDR conn_reg.reg_base_addr[INST2_CONN_WT_SLP_CTL_REG_BASE].vir_addr +#define REG_CONN_RF_SPI_MST_REG_ADDR conn_reg.reg_base_addr[CONN_RF_SPI_MST_REG_BASE].vir_addr +#define REG_INST2_CONN_RF_SPI_MST_REG_ADDR conn_reg.reg_base_addr[INST2_CONN_RF_SPI_MST_REG_BASE].vir_addr +#define REG_CONN_SEMAPHORE_ADDR conn_reg.reg_base_addr[CONN_SEMAPHORE_BASE].vir_addr +#define REG_CONN_AFE_CTL_ADDR conn_reg.reg_base_addr[CONN_AFE_CTL_BASE].vir_addr +#define REG_CONN_AFE_CTL_2ND_ADDR conn_reg.reg_base_addr[CONN_AFE_CTL_2ND_BASE].vir_addr +#define REG_WF_TOP_SLPPROT_ON_ADDR conn_reg.reg_base_addr[WF_TOP_SLPPROT_ON_BASE].vir_addr +#define REG_WF_TOP_CFG_ADDR conn_reg.reg_base_addr[WF_TOP_CFG_BASE].vir_addr +#define REG_WF_MCU_CONFIG_LS_ADDR conn_reg.reg_base_addr[WF_MCU_CONFIG_LS_BASE].vir_addr +#define REG_WF_MCU_BUS_CR_ADDR conn_reg.reg_base_addr[WF_MCU_BUS_CR_BASE].vir_addr +#define REG_WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_ADDR conn_reg.reg_base_addr[WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_BASE].vir_addr +#define REG_WF_TOP_CFG_ON_ADDR conn_reg.reg_base_addr[WF_TOP_CFG_ON_BASE].vir_addr + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +struct consys_base_addr* get_conn_reg_base_addr(void); + +#endif /* _PLATFORM_MT7986_CONSYS_REG_H_ */ diff --git a/package/conninfra/src/platform/mt7986/include/mt7986_consys_reg_offset.h b/package/conninfra/src/platform/mt7986/include/mt7986_consys_reg_offset.h new file mode 100644 index 0000000..19e4a85 --- /dev/null +++ b/package/conninfra/src/platform/mt7986/include/mt7986_consys_reg_offset.h @@ -0,0 +1,243 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _PLATFORM_MT7986_CONSYS_REG_OFFSET_H_ +#define _PLATFORM_MT7986_CONSYS_REG_OFFSET_H_ + +/**********************************************************************/ +/* Base: TOP_MISC (0x11D1_0000) */ +/**********************************************************************/ +#define CONNSYS_MISC 0x0114 +#define TOP_MISC_RSRV_ALL1_3 0x021C + + +/**********************************************************************/ +/* Base: TOP RGU (0x1001_C000) */ +/**********************************************************************/ +#define TOP_RGU_WDT_SWSYSRST 0x0018 + +/**********************************************************************/ +/* Base: GPIO (0x1001_F000) */ +/**********************************************************************/ +#define GPIO_MODE9 0x0390 +#define GPIO_MODE10 0x03A0 +#define GPIO_MODE11 0x03B0 +#define GPIO_MODE12 0x03C0 + +/**********************************************************************/ +/* Base: IOCFG_TR (0x11F0_0000) */ +/**********************************************************************/ +#define IOCFG_TR_DRV_CFG0 0x0000 +#define IOCFG_TR_DRV_CFG1 0x0010 + +/**********************************************************************/ +/* Base: IOCFG_TL (0x11F1_0000) */ +/**********************************************************************/ +#define IOCFG_TL_DRV_CFG0 0x0000 +#define IOCFG_TL_DRV_CFG1 0x0010 + +/**********************************************************************/ +/* Base: INFRACFG_AO (0x1000_3000) */ +/**********************************************************************/ +#define CONN2AP_GALS_SLPPROT 0x00D0 +#define AP2CONN_GALS_SLPPROT 0x00D4 + +/**********************************************************************/ +/* Base: CONN_INFRA_CFG (0x1800_1000) */ +/**********************************************************************/ +#define CONN_INFRA_CFG_IP_VERSION 0x0000 +#define EFUSE 0x0020 +#define ADIE_CTL 0x0030 +#define CONN_INFRA_CFG_PWRCTRL0 0x0200 +#define CONN_INFRA_CFG_RC_CTL_0 0x0380 +#define OSC_CTL_0 0x0300 +#define EMI_CTL_WF 0x0414 +#define CONN_INFRA_WF_SLP_CTRL 0x0540 +#define CONN_INFRA_WF_SLP_STATUS 0x0544 + +/**********************************************************************/ +/* Base: CONN_INFRA_SYSRAM (0x1805_0000) */ +/**********************************************************************/ +#define SYSRAM_BASE_ADDR 0x0000 + +/**********************************************************************/ +/* Base: CONN_INFRA_CLKGEN_ON_TOP (0x1800_9000) */ +/**********************************************************************/ +#define CKGEN_BUS_WPLL_DIV_1 0x0008 +#define CKGEN_BUS_WPLL_DIV_2 0x000C +#define CKGEN_RFSPI_WPLL_DIV 0x0040 +#define CKGEN_BUS 0x0A00 + +/**********************************************************************/ +/* Base: CONN_HOST_CSR_TOP (0x1806_0000) */ +/**********************************************************************/ +#define CONN_INFRA_WAKEPU_TOP 0x01A0 +#define CONN_INFRA_WAKEPU_WF 0x01A4 +#define CONN2AP_REMAP_MCU_EMI 0x01C4 +#define CONN2AP_REMAP_WF_PERI 0x01D4 +#define DBG_DUMMY_3 0x02CC + +/**********************************************************************/ +/* Base: CONN_INFRA_BUS_CR (0x1800_E000) */ +/**********************************************************************/ +#define CONN_INFRA_BUS_OFF_TIMEOUT_CTRL 0x0300 +#define CONN_INFRA_BUS_ON_TIMEOUT_CTRL 0x031C +#define CONN2AP_EMI_PATH_ADDR_START 0x0360 +#define CONN2AP_EMI_PATH_ADDR_END 0x0364 + +/**********************************************************************/ +/* Base: CONN_INFRA_RGU (0x1800_0000) */ +/**********************************************************************/ +#define WFSYS_ON_TOP_PWR_CTL 0x0010 +#define BGFYS_ON_TOP_PWR_CTL 0x0020 +#define SYSRAM_HWCTL_PDN 0x0050 +#define SYSRAM_HWCTL_SLP 0x0054 +#define WFSYS_CPU_SW_RST_B 0x0120 + +/**********************************************************************/ +/* Base: CONN_WT_SLP_CTL_REG (0x1800_5000) */ +/* Base: INST2_CONN_WT_SLP_CTL_REG (0x1808_5000) */ +/**********************************************************************/ +#define WB_WF_CK_ADDR 0x0070 +#define WB_WF_WAKE_ADDR 0x0074 +#define WB_WF_ZPS_ADDR 0x0078 +#define WB_TOP_CK_ADDR 0x0084 +#define WB_WF_B0_CMD_ADDR 0x008C +#define WB_WF_B1_CMD_ADDR 0x0090 +#define WB_SLP_TOP_CK_0 0x0120 +#define WB_SLP_TOP_CK_1 0x0124 + +/**********************************************************************/ +/* Base: CONN_RF_SPI_MST_REG (0x1800_4000) */ +/* Base: INST2_CONN_RF_SPI_MST_REG (0x1808_4000) */ +/**********************************************************************/ +#define SPI_STA 0x0000 +#define SPI_WF_ADDR 0x0010 +#define SPI_WF_WDAT 0x0014 +#define SPI_WF_RDAT 0x0018 +#define SPI_BT_ADDR 0x0020 +#define SPI_BT_WDAT 0x0024 +#define SPI_BT_RDAT 0x0028 +#define SPI_FM_ADDR 0x0030 +#define SPI_FM_WDAT 0x0034 +#define SPI_FM_RDAT 0x0038 +#define SPI_GPS_ADDR 0x0040 +#define SPI_GPS_WDAT 0x0044 +#define SPI_GPS_RDAT 0x0048 +#define SPI_TOP_ADDR 0x0050 +#define SPI_TOP_WDAT 0x0054 +#define SPI_TOP_RDAT 0x0058 + +/**********************************************************************/ +/* Base: CONN_SEMAPHORE_BASE (0x1807_0000) */ +/**********************************************************************/ +#define CONN_SEMA00_M2_OWN_STA 0x2000 +#define CONN_SEMA00_M2_OWN_REL 0x2200 +#define CONN_SEMA_OWN_BY_M0_STA_REP 0x0400 +#define CONN_SEMA_OWN_BY_M1_STA_REP 0x1400 +#define CONN_SEMA_OWN_BY_M2_STA_REP 0x2400 +#define CONN_SEMA_OWN_BY_M3_STA_REP 0x3400 +#define CONN_SEMA_OWN_BY_M4_STA_REP 0x4400 +#define CONN_SEMA_OWN_BY_M5_STA_REP 0x5400 +#define CONN_SEMA_OWN_BY_M6_STA_REP 0x6400 +#define CONN_SEMA_OWN_BY_M7_STA_REP 0x7400 + +/**********************************************************************/ +/* Base: CONN_AFE_CTL_BASE (0x1800_3000) */ +/* Base: CONN_AFE_CTL_2ND_BASE (0x1808_3000) */ +/**********************************************************************/ +#define RG_DIG_EN_01 0x0000 +#define RG_DIG_EN_02 0x0004 +#define RG_DIG_EN_03 0x0008 +#define RG_DIG_TOP_01 0x000C +#define RG_PLL_STB_TIME 0x00F4 + +/**********************************************************************/ +/* Base: WF_TOP_SLPPROT_ON_BASE (0x8102_0000 remap to 0x184C_0000) */ +/**********************************************************************/ +#define WF_TOP_SLPPROT_ON_STATUS_READ 0x300C + +/**********************************************************************/ +/* Base: WF_TOP_CFG_BASE (0x8002_0000 remap to 0x184B_0000) */ +/**********************************************************************/ +#define WF_TOP_CFG_IP_VERSION 0x0010 + +/**********************************************************************/ +/* Base: WF_MCU_CONFIG_LS_BASE (0x8800_0000 remap to 0x184F_0000) */ +/**********************************************************************/ +#define BUSHANGCR 0x0440 + +/**********************************************************************/ +/* Base: WF_MCU_BUS_CR_BASE (0x830C_0XXX remap to 0x1840_0XXX) */ +/**********************************************************************/ +#define AP2WF_REMAP_1 0x0120 + +/**********************************************************************/ +/* Base: WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_BASE (0x810F_0000 remap to 0x1850_0000) */ +/**********************************************************************/ +#define WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_WFMCU_PWA_CTRL0 0x0000 + +/**********************************************************************/ +/* Base: WF_TOP_CFG_ON_BASE (0x8102_1000 remap to 0x184C_0000) */ +/**********************************************************************/ +#define ROMCODE_INDEX 0x1604 + +/**********************************************************************/ +/* A-die CR */ +/**********************************************************************/ +#define ATOP_CHIP_ID 0x02C +#define ATOP_TOP_CLK_EN 0xA00 +#define ATOP_RG_ENCAL_WBTAC_IF_SW 0x070 +#define ATOP_RG_WRI_CK_SELECT 0x4AC +#define ATOP_EFUSE_CTRL_1 0x108 +#define ATOP_EFUSE_CTRL_2 0x148 +#define ATOP_EFUSE_CTRL_3 0x14C +#define ATOP_EFUSE_CTRL_4 0x15C +#define ATOP_EFUSE_RDATA0 0x130 +#define ATOP_EFUSE_RDATA1 0x134 +#define ATOP_EFUSE_RDATA2 0x138 +#define ATOP_EFUSE_RDATA3 0x13C +#define ATOP_RG_EFUSE_CFG5 0x144 +#define ATOP_THADC_ANALOG 0x3A6 +#define ATOP_THADC_SLOP 0x3A7 +#define ATOP_RG_TOP_THADC_BG 0x034 +#define ATOP_RG_TOP_THADC_00 0x038 + +#define ATOP_XTAL_TRIM_FLOW 0x3AC +#define ATOP_XTAL_CR_C1_SEL_AXM_80M_OSC 0x390 +#define ATOP_XTAL_CR_C1_SEL_AXM_40M_OSC 0x391 +#define ATOP_XTAL_CR_C1_SEL_AXM_TRIM1_80M_OSC 0x398 +#define ATOP_XTAL_CR_C1_SEL_AXM_TRIM1_40M_OSC 0x399 +#define ATOP_RG_STRAP_PIN_IN 0x4FC +#define ATOP_RG_XO_01 0x65C +#define ATOP_RG_XO_03 0x664 + + +#define ATOP_7975_XTAL_CALIBRATION 0x3A1 +#define ATOP_7975_XTAL_TRIM2_COMPENSATION 0x3A2 +#define ATOP_7975_XTAL_TRIM3_COMPENSATION 0x3A3 +#define ATOP_7975_XTAL_TRIM4_COMPENSATION 0x3A4 +#define ATOP_7975_XTAL_TRIM_FLOW 0x3A5 +#define ATOP_7975_CR_C1_C2_A94 0xA94 +#define ATOP_7975_CR_C1_C2_A18 0xA18 +#define ATOP_7975_CR_C1_C2_A84 0xA84 +#define ATOP_7975_CR_C1_C2_AA4 0xAA4 +#define ATOP_7975_CO_CLK 0xA1C + + +#endif /* _PLATFORM_MT7986_CONSYS_REG_OFFSET_H_ */ diff --git a/package/conninfra/src/platform/mt7986/include/mt7986_emi.h b/package/conninfra/src/platform/mt7986/include/mt7986_emi.h new file mode 100644 index 0000000..663a4a0 --- /dev/null +++ b/package/conninfra/src/platform/mt7986/include/mt7986_emi.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _PLATFORM_MT7986_EMI_H_ +#define _PLATFORM_MT7986_EMI_H_ + +#include "osal.h" +#include "emi_mng.h" +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + +struct consys_platform_emi_ops* get_consys_platform_emi_ops(void); + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +#endif /* _PLATFORM_MT7986_EMI_H_ */ diff --git a/package/conninfra/src/platform/mt7986/include/mt7986_pmic.h b/package/conninfra/src/platform/mt7986/include/mt7986_pmic.h new file mode 100644 index 0000000..165816d --- /dev/null +++ b/package/conninfra/src/platform/mt7986/include/mt7986_pmic.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _PLATFORM_MT7986_PMIC_H_ +#define _PLATFORM_MT7986_PMIC_H_ + +#include "osal.h" +#include "pmic_mng.h" +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +struct consys_platform_pmic_ops* get_consys_platform_pmic_ops(void); + +#endif /* _PLATFORM_MT7986_PMIC_H_ */ diff --git a/package/conninfra/src/platform/mt7986/include/mt7986_pos.h b/package/conninfra/src/platform/mt7986/include/mt7986_pos.h new file mode 100644 index 0000000..fc182c5 --- /dev/null +++ b/package/conninfra/src/platform/mt7986/include/mt7986_pos.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#ifndef _PLATFORM_MT7986_POS_H_ +#define _PLATFORM_MT7986_POS_H_ + +int consys_plt_hw_init(void); +int consys_xtal_ctrl_fast_mode(void); +int consys_sw_reset_ctrl(bool bassert); +int consys_tx_rx_bus_slp_prot_ctrl(bool enable); +void consys_set_if_pinmux(bool enable); +int consys_polling_chipid(void); +int consys_plt_adie_type_check(void); +int consys_plt_adie_type_cfg(void); +int consys_bus_clock_ctrl(enum consys_drv_type drv_type, unsigned int bus_clock); +int consys_emi_set_remapping_reg(void); +int consys_emi_set_region_protection(void); +int connsys_d_die_cfg(void); +int connsys_conninfra_sysram_hw_ctrl(void); +int connsys_spi_master_cfg(void); +int consys_sema_acquire_timeout(unsigned int index, unsigned int usec); +void consys_sema_release(unsigned int index); +int consys_spi_read(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int *data); +int consys_spi_write(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int data); +int consys_spi_write_offset_range(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int value, + unsigned int reg_offset, unsigned int value_offset, unsigned int size); +int connsys_a_die_cfg(void); +int connsys_afe_wbg_cal(void); +int connsys_subsys_pll_initial(void); +int connsys_osc_legacy_mode(void); +int connsys_top_pwr_ctrl(void); +int connsys_conn_infra_bus_timeout(void); +int connsys_clkgen_wpll_hw_ctrl(void); +int consys_conninfra_top_wakeup(void); +int consys_conninfra_top_sleep(void); +int consys_adie_top_ck_en_on_off_ctrl(enum consys_drv_type type, unsigned char on); +int consys_conninfra_wf_wakeup(void); +int consys_conninfra_wf_sleep(void); +int consys_conn_wmcpu_sw_reset(bool bassert); +int consys_wf_bus_slp_prot_ctrl(bool enable); +int consys_wfsys_top_on_ctrl(bool enable); +int consys_wfsys_bus_slp_prot_check(bool enable); +int consys_wfsys_bus_timeout_ctrl(void); +int consys_wmcpu_idle_loop_check(void); +int consys_wpll_ctrl(bool enable); +int consys_conninfra_wf_req_clr(void); + + +#endif /* _PLATFORM_MT7986_POS_H_ */ diff --git a/package/conninfra/src/platform/mt7986/mt7986.c b/package/conninfra/src/platform/mt7986/mt7986.c new file mode 100644 index 0000000..9329eda --- /dev/null +++ b/package/conninfra/src/platform/mt7986/mt7986.c @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#define pr_fmt(fmt) KBUILD_MODNAME "@(%s:%d) " fmt, __func__, __LINE__ + +#include +#include +#include +#include +#include +#include +#include + +#include "osal.h" +#include "conninfra.h" +#include "consys_hw.h" +#include "consys_reg_mng.h" +#include "consys_reg_util.h" +#include "mt7986.h" +#include "mt7986_pos.h" +#include "emi_mng.h" +#include "mt7986_consys_reg.h" +#include "mt7986_consys_reg_offset.h" + +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ +#define PLATFORM_SOC_CHIP 0x7986 +#define CONN_IP_VER 0x02070000 + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ +struct consys_hw_ops_struct g_consys_hw_ops_mt7986 = { + /* HW init */ + .consys_plt_hw_init = consys_plt_hw_init, + + /* POS */ + .consys_plt_xtal_ctrl_fast_mode = consys_xtal_ctrl_fast_mode, + .consys_plt_connsys_sw_reset_ctrl = consys_sw_reset_ctrl, + .consys_plt_set_if_pinmux = consys_set_if_pinmux, + .consys_plt_tx_rx_bus_slp_prot_ctrl = consys_tx_rx_bus_slp_prot_ctrl, + .consys_plt_polling_consys_chipid = consys_polling_chipid, + .consys_plt_bus_clock_ctrl = consys_bus_clock_ctrl, + .consys_plt_d_die_cfg = connsys_d_die_cfg, + .consys_plt_conninfra_sysram_hw_ctrl = connsys_conninfra_sysram_hw_ctrl, + .consys_plt_spi_master_cfg = connsys_spi_master_cfg, + .consys_plt_a_die_cfg = connsys_a_die_cfg, + .consys_plt_afe_wbg_cal = connsys_afe_wbg_cal, + .consys_plt_subsys_pll_initial = connsys_subsys_pll_initial, + .consys_plt_osc_legacy_mode = connsys_osc_legacy_mode, + .consys_plt_top_pwr_ctrl = connsys_top_pwr_ctrl, + .consys_plt_conn_infra_bus_timeout = connsys_conn_infra_bus_timeout, + .consys_plt_clkgen_wpll_hw_ctrl = connsys_clkgen_wpll_hw_ctrl, + .consys_plt_conninfra_wakeup = consys_conninfra_top_wakeup, + .consys_plt_conninfra_sleep = consys_conninfra_top_sleep, + .consys_plt_adie_top_ck_en_on_off_ctrl = consys_adie_top_ck_en_on_off_ctrl, + .consys_plt_conninfra_wf_wakeup = consys_conninfra_wf_wakeup, + .consys_plt_conninfra_wf_sleep = consys_conninfra_wf_sleep, + .consys_plt_conn_wmcpu_sw_reset = consys_conn_wmcpu_sw_reset, + .consys_plt_wf_bus_slp_prot_ctrl = consys_wf_bus_slp_prot_ctrl, + .consys_plt_wfsys_top_on_ctrl = consys_wfsys_top_on_ctrl, + .consys_plt_wfsys_bus_slp_prot_check = consys_wfsys_bus_slp_prot_check, + .consys_plt_wfsys_bus_timeout_ctrl = consys_wfsys_bus_timeout_ctrl, + .consys_plt_conn_wmcpu_idle_loop_check = consys_wmcpu_idle_loop_check, + .consys_plt_wpll_ctrl = consys_wpll_ctrl, + .consys_plt_conninfra_wf_req_clr = consys_conninfra_wf_req_clr, + + /* load from dts */ + /* TODO: mtcmos should move to a independent module */ + .consys_plt_clk_get_from_dts = NULL, + .consys_plt_clk_detach = NULL, + + /* clock */ + .consys_plt_soc_chipid_get = consys_soc_chipid_get, + + /* debug */ + .consys_plt_get_hw_ver = consys_get_hw_ver, + .consys_plt_spi_read = consys_spi_read, + .consys_plt_spi_write = consys_spi_write, + .consys_plt_spi_clock_switch = NULL, + .consys_plt_power_state = NULL, + + /* others */ + .consys_plt_adie_type_check = consys_plt_adie_type_check, + .consys_plt_adie_type_cfg = consys_plt_adie_type_cfg, +}; + +/* For mt7986 */ +extern struct consys_hw_ops_struct g_consys_hw_ops_mt7986; +extern struct consys_reg_mng_ops g_dev_consys_reg_ops_mt7986; +extern struct consys_platform_emi_ops g_consys_platform_emi_ops_mt7986; +extern struct consys_platform_pmic_ops g_consys_platform_pmic_ops_mt7986; + +const struct conninfra_plat_data mt7986_plat_data = { + .chip_id = PLATFORM_SOC_CHIP, + .hw_ops = &g_consys_hw_ops_mt7986, + .reg_ops = &g_dev_consys_reg_ops_mt7986, + .platform_emi_ops = &g_consys_platform_emi_ops_mt7986, + .platform_pmic_ops = &g_consys_platform_pmic_ops_mt7986, +}; + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ +unsigned int consys_soc_chipid_get(void) +{ + return PLATFORM_SOC_CHIP; +} + +unsigned int consys_get_hw_ver(void) +{ + return CONN_IP_VER; +} + diff --git a/package/conninfra/src/platform/mt7986/mt7986_consys_reg.c b/package/conninfra/src/platform/mt7986/mt7986_consys_reg.c new file mode 100644 index 0000000..290cc9a --- /dev/null +++ b/package/conninfra/src/platform/mt7986/mt7986_consys_reg.c @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#include +#include +#include +#include +#include +#include +#include "consys_reg_mng.h" +#include "mt7986_consys_reg.h" +#include "mt7986_consys_reg_offset.h" +#include "consys_hw.h" +#include "consys_reg_util.h" + +#define CFG_REG_LOAD_FROM_DTS_CTRL 0 + +static int consys_reg_init(struct platform_device *pdev); +static int consys_reg_deinit(void); + +struct consys_base_addr conn_reg = { + .reg_base_addr[TOP_MISC_BASE] = {0x11D10000, 0x1000, 0}, + .reg_base_addr[TOPRGU_BASE] = {0x1001C000, 0x1000, 0}, + .reg_base_addr[GPIO_BASE] = {0x1001F000, 0x1000, 0}, + .reg_base_addr[IOCFG_TR_BASE] = {0x11F00000, 0x1000, 0}, + .reg_base_addr[IOCFG_TL_BASE] = {0x11F10000, 0x1000, 0}, + .reg_base_addr[INFRACFG_AO_BASE] = {0x10003000, 0x1000, 0}, + .reg_base_addr[CONN_INFRA_CFG_BASE] = {0x18001000, 0x1000, 0}, + .reg_base_addr[CONN_INFRA_SYSRAM_BASE] = {0x18050000, 0x1000, 0}, + .reg_base_addr[CONN_INFRA_CLKGEN_ON_TOP_BASE] = {0x18009000, 0x1000, 0}, + .reg_base_addr[CONN_HOST_CSR_TOP_BASE] = {0x18060000, 0x1000, 0}, + .reg_base_addr[CONN_INFRA_BUS_CR_BASE] = {0x1800E000, 0x1000, 0}, + .reg_base_addr[CONN_INFRA_RGU_BASE] = {0x18000000, 0x1000, 0}, + .reg_base_addr[CONN_WT_SLP_CTL_REG_BASE] = {0x18005000, 0x1000, 0}, + .reg_base_addr[INST2_CONN_WT_SLP_CTL_REG_BASE] = {0x18085000, 0x1000, 0}, + .reg_base_addr[CONN_RF_SPI_MST_REG_BASE] = {0x18004000, 0x1000, 0}, + .reg_base_addr[INST2_CONN_RF_SPI_MST_REG_BASE] = {0x18084000, 0x1000, 0}, + .reg_base_addr[CONN_SEMAPHORE_BASE] = {0x18070000, 0x10000, 0}, + .reg_base_addr[CONN_AFE_CTL_BASE] = {0x18003000, 0x1000, 0}, + .reg_base_addr[CONN_AFE_CTL_2ND_BASE] = {0x18083000, 0x1000, 0}, + .reg_base_addr[WF_TOP_SLPPROT_ON_BASE] = {0x184C0000, 0x10000, 0}, + .reg_base_addr[WF_TOP_CFG_BASE] = {0x184B0000, 0x1000, 0}, + .reg_base_addr[WF_MCU_CONFIG_LS_BASE] = {0x184F0000, 0x1000, 0}, + .reg_base_addr[WF_MCU_BUS_CR_BASE] = {0x18400000, 0x1000, 0}, + .reg_base_addr[WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_BASE] = {0x18500000, 0x1000, 0}, + .reg_base_addr[WF_TOP_CFG_ON_BASE] = {0x184C0000, 0x10000, 0}, +}; + +const char* consys_base_addr_index_to_str[CONSYS_BASE_ADDR_MAX] = { + "TOP_MISC_BASE", + "TOPRGU_BASE", + "GPIO_BASE", + "IOCFG_TR_BASE", + "IOCFG_TL_BASE", + "INFRACFG_AO_BASE", + "CONN_INFRA_CFG_BASE", + "CONN_INFRA_SYSRAM_BASE", + "CONN_INFRA_CLKGEN_ON_TOP_BASE", + "CONN_HOST_CSR_TOP_BASE", + "CONN_INFRA_BUS_CR_BASE", + "CONN_INFRA_RGU_BASE", + "CONN_WT_SLP_CTL_REG_BASE", + "INST2_CONN_WT_SLP_CTL_REG_BASE", + "CONN_RF_SPI_MST_REG_BASE", + "INST2_CONN_RF_SPI_MST_REG_BASE", + "CONN_SEMAPHORE_BASE", + "CONN_AFE_CTL_BASE", + "CONN_AFE_CTL_2ND_BASE", + "WF_TOP_SLPPROT_ON_BASE", + "WF_TOP_CFG_BASE", + "WF_MCU_CONFIG_LS_BASE", + "WF_MCU_BUS_CR_BASE", + "WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_BASE", + "WF_TOP_CFG_ON_BASE" +}; + +struct consys_reg_mng_ops g_dev_consys_reg_ops_mt7986 = { + .consys_reg_mng_init = consys_reg_init, + .consys_reg_mng_deinit = consys_reg_deinit, + .consys_reg_mng_check_reable = NULL, + .consys_reg_mng_is_consys_reg = NULL, + .consys_reg_mng_is_bus_hang = NULL, + .consys_reg_mng_dump_bus_status = NULL, + .consys_reg_mng_dump_conninfra_status = NULL, + .consys_reg_mng_dump_cpupcr = NULL, + .consys_reg_mng_is_host_csr = NULL, +}; + +struct consys_base_addr* get_conn_reg_base_addr() +{ + return &conn_reg; +} + +static int consys_reg_init(struct platform_device *pdev) +{ + int ret = -1; + struct device_node *node = NULL; + struct consys_reg_base_addr *base_addr = NULL; + int i = 0; + + node = pdev->dev.of_node; + if (node) { +#if (CFG_REG_LOAD_FROM_DTS_CTRL == 1) + struct resource res; + int flag; + + for (i = 0; i < CONSYS_BASE_ADDR_MAX; i++) { + base_addr = &conn_reg.reg_base_addr[i]; + ret = of_address_to_resource(node, i, &res); + if (ret) { + pr_err("Get Reg Index(%d-%s) failed\n", i, consys_base_addr_index_to_str[i]); + continue; + } + base_addr->phy_addr = res.start; + base_addr->vir_addr = (unsigned long)of_iomap(node, i); + of_get_address(node, i, &(base_addr->size), &flag); +#if 0 + pr_info("Get Index(%d-%s) phy_addr(0x%zx) vir_addr=(0x%zx) size=(0x%zx)\n", + i, consys_base_addr_index_to_str[i], base_addr->phy_addr, + base_addr->vir_addr, base_addr->size); +#endif + } +#else + for (i = 0; i < CONSYS_BASE_ADDR_MAX; i++) { + base_addr = &conn_reg.reg_base_addr[i]; + if (base_addr->vir_addr == 0) + base_addr->vir_addr = (unsigned long)ioremap(base_addr->phy_addr, base_addr->size); + + pr_info("Get Index(%d-%s) phy_addr(0x%zx) vir_addr=(0x%zx) size=(0x%zx)\n", + i, consys_base_addr_index_to_str[i], base_addr->phy_addr, + base_addr->vir_addr, base_addr->size); + } +#endif + } else { + pr_err("[%s] can't find CONSYS compatible node\n", __func__); + return ret; + } + + return 0; +} + +static int consys_reg_deinit(void) +{ + int i = 0; + + for (i = 0; i < CONSYS_BASE_ADDR_MAX; i++) { + if (conn_reg.reg_base_addr[i].vir_addr) { + pr_info("[%d] Unmap %s (0x%zx)\n", i, consys_base_addr_index_to_str[i], + conn_reg.reg_base_addr[i].vir_addr); + iounmap((void __iomem*)conn_reg.reg_base_addr[i].vir_addr); + conn_reg.reg_base_addr[i].vir_addr = 0; + } + } + + return 0; +} + diff --git a/package/conninfra/src/platform/mt7986/mt7986_emi.c b/package/conninfra/src/platform/mt7986/mt7986_emi.c new file mode 100644 index 0000000..754174e --- /dev/null +++ b/package/conninfra/src/platform/mt7986/mt7986_emi.c @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#define pr_fmt(fmt) KBUILD_MODNAME "@(%s:%d) " fmt, __func__, __LINE__ + +#include +#include +#include +#include "mt7986_emi.h" +#include "mt7986.h" +#include "mt7986_consys_reg.h" +#include "consys_hw.h" +#include "consys_reg_util.h" +#include "mt7986_pos.h" + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ +unsigned int consys_emi_get_fw_emi_size(void) +{ + return 0x100000; +} + +struct consys_platform_emi_ops g_consys_platform_emi_ops_mt7986 = { + .consys_ic_emi_set_region_protection = consys_emi_set_region_protection, + .consys_ic_emi_set_remapping_reg = consys_emi_set_remapping_reg, + .consys_ic_emi_get_fw_emi_size = consys_emi_get_fw_emi_size, +}; + +struct consys_platform_emi_ops* get_consys_platform_emi_ops(void) +{ + return &g_consys_platform_emi_ops_mt7986; +} + diff --git a/package/conninfra/src/platform/mt7986/mt7986_pmic.c b/package/conninfra/src/platform/mt7986/mt7986_pmic.c new file mode 100644 index 0000000..d2576b6 --- /dev/null +++ b/package/conninfra/src/platform/mt7986/mt7986_pmic.c @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#define pr_fmt(fmt) KBUILD_MODNAME "@(%s:%d) " fmt, __func__, __LINE__ + +#include +#include +#include +#include +#include + +#include "consys_hw.h" +#include "consys_reg_util.h" +#include "osal.h" +#include "mt7986_pmic.h" +#include "mt7986_pos.h" +#include "mt7986_consys_reg.h" +#include "mt7986_consys_reg_offset.h" + +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +struct consys_platform_pmic_ops g_consys_platform_pmic_ops_mt7986 = { + .consys_pmic_get_from_dts = NULL, + .consys_pmic_common_power_ctrl = NULL, + .consys_pmic_wifi_power_ctrl = NULL, + .consys_pmic_bt_power_ctrl = NULL, + .consys_pmic_gps_power_ctrl = NULL, + .consys_pmic_fm_power_ctrl = NULL, + .consys_pmic_event_notifier = NULL, +}; + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +struct consys_platform_pmic_ops* get_consys_platform_pmic_ops(void) +{ + return &g_consys_platform_pmic_ops_mt7986; +} + diff --git a/package/conninfra/src/platform/mt7986/mt7986_pos.c b/package/conninfra/src/platform/mt7986/mt7986_pos.c new file mode 100644 index 0000000..c439395 --- /dev/null +++ b/package/conninfra/src/platform/mt7986/mt7986_pos.c @@ -0,0 +1,2043 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2019 MediaTek Inc. + */ + +#define pr_fmt(fmt) KBUILD_MODNAME "@(%s:%d) " fmt, __func__, __LINE__ + +#include +#include "plat_def.h" +#include "consys_reg_util.h" +#include "consys_reg_mng.h" +#include "mt7986_consys_reg.h" +#include "mt7986_consys_reg_offset.h" +#include "mt7986_pos.h" +#include "mt7986.h" +#include "mt7986_emi.h" + + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ +#define MTD_WIFI_NM "Factory" +#define EEPROM_CHIPID_OFFSET 0x0 + +#define EEPROM_BAND0_STREAM_OFFSET 0x190 +#define EEPROM_BAND0_STREAM_TX_MASK 0x7 +#define EEPROM_BAND0_STREAM_TX_BIT_OFFSET 0 +#define EEPROM_BAND0_STREAM_RX_MASK 0x7 +#define EEPROM_BAND0_STREAM_RX_BIT_OFFSET 3 +#define EEPROM_LNA_PA_SELECT_OFFSET 0x197 +#define EEPROM_LNA_PA_SELECT_BAND0_MASK 0x3 +#define EEPROM_LNA_PA_SELECT_BAND0_BIT_OFFSET 2 +#define EEPROM_LNA_PA_SELECT_BAND1_MASK 0x3 +#define EEPROM_LNA_PA_SELECT_BAND1_BIT_OFFSET 4 + + +#define _TO_STR(_x) #_x +#define TO_STR(_x) _TO_STR(_x) +#define RED(_text) "\033[1;31m"_text"\033[0m" +#define GRN(_text) "\033[1;32m"_text"\033[0m" + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ +bool EEPROM_content_valid = false; +bool one_adie_dbdc = false; +unsigned int adie_cfg_type = ADIE_TYPE_NONE; +unsigned int tx_stream = 0; +unsigned int rx_stream = 0; +unsigned int band0_pa_type = 0; +unsigned int band1_pa_type = 0; + +enum LNA_PA_TYPE { + iPAiLNA = 0x0, /* 2b'00 */ + iPAeLNA = 0x1, /* 2b'01 */ + ePAiLNA = 0x2, /* 2b'10 */ + ePAeLNA = 0x3 /* 2b'11 */ +}; + + +struct spi_op { + unsigned int busy_cr; + unsigned int polling_bit; + unsigned int addr_cr; + unsigned int read_addr_format; + unsigned int write_addr_format; + unsigned int write_data_cr; + unsigned int read_data_cr; + unsigned int read_data_mask; +}; + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ +const static char* g_spi_system_name[SYS_SPI_MAX] = { + "SYS_SPI_WF1", + "SYS_SPI_WF", + "SYS_SPI_BT", + "SYS_SPI_FM", + "SYS_SPI_GPS", + "SYS_SPI_TOP", + "SYS_SPI_WF2", + "SYS_SPI_WF3", +}; + +static const struct spi_op spi_op_array[SYS_SPI_MAX] = { + /* SYS_SPI_WF1 */ + { + SPI_STA, 1, SPI_WF_ADDR, 0x00001000, 0x00000000, + SPI_WF_WDAT, SPI_WF_RDAT, 0xFFFFFFFF + }, + /* SYS_SPI_WF */ + { + SPI_STA, 1, SPI_WF_ADDR, 0x00003000, 0x00002000, + SPI_WF_WDAT, SPI_WF_RDAT, 0xFFFFFFFF + }, + /* SYS_SPI_BT */ + { + SPI_STA, 2, SPI_BT_ADDR, 0x00005000, 0x00004000, + SPI_BT_WDAT, SPI_BT_RDAT, 0xFFFFFFFF + }, + /* SYS_SPI_FM */ + { + SPI_STA, 3, SPI_FM_ADDR, 0x00007000, 0x00006000, + SPI_FM_WDAT, SPI_FM_RDAT, 0x0000FFFF + }, + /* SYS_SPI_GPS */ + { + SPI_STA, 4, SPI_GPS_ADDR, 0x00009000, 0x00008000, + SPI_GPS_WDAT, SPI_GPS_RDAT, 0x0000FFFF + }, + /* SYS_SPI_TOP */ + { + SPI_STA, 5, SPI_TOP_ADDR, 0x0000B000, 0x0000A000, + SPI_TOP_WDAT, SPI_TOP_RDAT, 0xFFFFFFFF + }, + /* SYS_SPI_WF2 */ + { + SPI_STA, 1, SPI_WF_ADDR, 0x0000D000, 0x0000C000, + SPI_WF_WDAT, SPI_WF_RDAT, 0xFFFFFFFF + }, + /* SYS_SPI_WF3 */ + { + SPI_STA, 1, SPI_WF_ADDR, 0x0000F000, 0x0000E000, + SPI_WF_WDAT, SPI_WF_RDAT, 0xFFFFFFFF + }, +}; + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ +bool _is_flash_content_valid(void) +{ + unsigned short eeFlashId = 0; + + FlashRead(MTD_WIFI_NM, (unsigned char*)&eeFlashId, EEPROM_CHIPID_OFFSET, sizeof(eeFlashId)); + if (eeFlashId == consys_soc_chipid_get()) { + EEPROM_content_valid = true; + printk(GRN("eeFlashId: 0x%x, EEPROM_content_valid = %d"), eeFlashId, EEPROM_content_valid); + return true; + } else { + printk(RED("eeFlashId(0x%x) isn't match with 0x%x!"), eeFlashId, consys_soc_chipid_get()); + return false; + } +} + +int _consys_check_adie_cfg(void) +{ + int ret = 0; + unsigned int hw_adie_type = 0; + unsigned int i = 0; + bool found = false; + + for (i = 0; i < AIDE_NUM_MAX; i++) { + if (conn_hw_env[i].valid) { + hw_adie_type = conn_hw_env[i].adie_id; + found = true; + break; + } + } + + if (found) { + printk(GRN("Adie Type: 0x%x"), hw_adie_type); + } else { + printk(RED("No Adie found!!!")); + ret = -1; + } + + return ret; +} + +void _consys_check_sku_cfg(void) +{ + unsigned int hw_sku_type; + + if (!one_adie_dbdc) { + if (adie_cfg_type == ADIE_TYPE_TWO) + hw_sku_type = 6000; + else + hw_sku_type = 7800; + + printk(GRN("SKU Type: %d"), hw_sku_type); + } else { + printk(GRN("SKU Type: One_Adie_DBDC")); + } +} + +int consys_plt_hw_init(void) +{ + unsigned int value = 0; + + value = CONSYS_REG_READ_BIT(REG_TOP_MISC_ADDR + TOP_MISC_RSRV_ALL1_3, (0x1 << 2)); + if (value != 0) + one_adie_dbdc = true; + else + one_adie_dbdc = false; + + if (_is_flash_content_valid()) { + FlashRead(MTD_WIFI_NM, (unsigned char*)&value, EEPROM_BAND0_STREAM_OFFSET, sizeof(value)); + tx_stream = ((value >> EEPROM_BAND0_STREAM_TX_BIT_OFFSET) & EEPROM_BAND0_STREAM_TX_MASK); + rx_stream = ((value >> EEPROM_BAND0_STREAM_RX_BIT_OFFSET) & EEPROM_BAND0_STREAM_RX_MASK); + + FlashRead(MTD_WIFI_NM, (unsigned char*)&value, EEPROM_LNA_PA_SELECT_OFFSET, sizeof(value)); + band0_pa_type = ((value >> EEPROM_LNA_PA_SELECT_BAND0_BIT_OFFSET) & EEPROM_LNA_PA_SELECT_BAND0_MASK); + band1_pa_type = ((value >> EEPROM_LNA_PA_SELECT_BAND1_BIT_OFFSET) & EEPROM_LNA_PA_SELECT_BAND1_MASK); + + if (one_adie_dbdc) { + adie_cfg_type = ADIE_TYPE_ONE; + } else { + if (tx_stream >= 2) { + adie_cfg_type = ADIE_TYPE_TWO; + } else { + adie_cfg_type = ADIE_TYPE_ONE; + } + } + pr_info("tx_stream = 0x%x, rx_stream = 0x%x, band0_pa_type = 0x%x, band1_pa_type = 0x%x\n", + tx_stream, rx_stream, band0_pa_type, band1_pa_type); + } else { + if (one_adie_dbdc) { + adie_cfg_type = ADIE_TYPE_ONE; + } else { + adie_cfg_type = ADIE_TYPE_TWO; + printk(RED("Flash content is empty, so use AX6000 configuration by default!")); + } + } + pr_info("adie_cfg_type = %d, one_adie_dbdc = %d\n", adie_cfg_type, one_adie_dbdc); + + return 0; +} + +int consys_xtal_ctrl_fast_mode(void) +{ + /* Setting fast mode to xtal control */ + CONSYS_SET_BIT(REG_TOP_MISC_ADDR + CONNSYS_MISC, (0x1 << 3)); + return 0; +} + +int consys_sw_reset_ctrl(bool bassert) +{ + /* Release CONNSYS software reset */ + if (bassert) { + CONSYS_REG_WRITE_MASK( + REG_TOP_RGU_ADDR + TOP_RGU_WDT_SWSYSRST, + 0x88800000, 0xff800000); + } else { + /* de-assert CONNSYS S/W reset */ + CONSYS_REG_WRITE_MASK( + REG_TOP_RGU_ADDR + TOP_RGU_WDT_SWSYSRST, + 0x88000000, 0xff800000); + } + + return 0; +} + +void consys_set_if_pinmux(bool enable) +{ + if (enable) { + /* Set PAD_WF*_HB* to GPIO mode by default. (Aux0) */ + CONSYS_REG_WRITE_MASK(REG_GPIO_BASE_ADDR + GPIO_MODE9, 0x0, 0x77777700); + CONSYS_REG_WRITE_MASK(REG_GPIO_BASE_ADDR + GPIO_MODE10, 0x0, 0x777777); + CONSYS_REG_WRITE_MASK(REG_GPIO_BASE_ADDR + GPIO_MODE11, 0x0, 0x77777000); + CONSYS_REG_WRITE_MASK(REG_GPIO_BASE_ADDR + GPIO_MODE12, 0x0, 0x77770); + + if (adie_cfg_type == ADIE_TYPE_TWO) { + /* Two_Adie + set pinmux for the interface between D-die and A-die (Aux1) + PAD_WF0_HB1(GPIO74) 0x0390[10:8] + PAD_WF0_HB2(GPIO75) 0x0390[14:12] + PAD_WF0_HB3(GPIO76) 0x0390[18:16] + PAD_WF0_HB4(GPIO77) 0x0390[22:20] + PAD_WF0_HB0(GPIO78) 0x0390[26:24] + PAD_WF0_HB5(GPIO80) 0x03A0[2:0] + PAD_WF0_HB6(GPIO81) 0x03A0[6:4] + PAD_WF0_HB7(GPIO82) 0x03A0[10:8] + PAD_WF0_HB8(GPIO83) 0x03A0[14:12] + PAD_WF1_HB1(GPIO91) 0x03B0[14:12] + PAD_WF1_HB2(GPIO92) 0x03B0[18:16] + PAD_WF1_HB3(GPIO93) 0x03B0[22:20] + PAD_WF1_HB4(GPIO94) 0x03B0[26:24] + PAD_WF1_HB0(GPIO95) 0x03B0[30:28] + PAD_WF1_HB5(GPIO97) 0x03C0[6:4] + PAD_WF1_HB6(GPIO98) 0x03C0[10:8] + PAD_WF1_HB7(GPIO99) 0x03C0[14:12] + PAD_WF1_HB8(GPIO100) 0x03C0[18:16] + */ + CONSYS_REG_WRITE_MASK(REG_GPIO_BASE_ADDR + GPIO_MODE9, 0x1111100, 0x7777700); + CONSYS_REG_WRITE_MASK(REG_GPIO_BASE_ADDR + GPIO_MODE10, 0x1111, 0x7777); + CONSYS_REG_WRITE_MASK(REG_GPIO_BASE_ADDR + GPIO_MODE11, 0x11111000, 0x77777000); + CONSYS_REG_WRITE_MASK(REG_GPIO_BASE_ADDR + GPIO_MODE12, 0x11110, 0x77770); + } else { + if (one_adie_dbdc) { + /* One_Adie_DB + set pinmux for the interface between D-die and A-die (Aux2) + PAD_WF0_HB1(GPIO74) 0x0390[10:8] + PAD_WF0_HB2(GPIO75) 0x0390[14:12] + PAD_WF0_HB3(GPIO76) 0x0390[18:16] + PAD_WF0_HB4(GPIO77) 0x0390[22:20] + PAD_WF0_HB0(GPIO78) 0x0390[26:24] + PAD_WF0_HB0_B(GPIO79) 0x0390[30:28] + PAD_WF0_HB5(GPIO80) 0x03A0[2:0] + PAD_WF0_HB6(GPIO81) 0x03A0[6:4] + PAD_WF0_HB7(GPIO82) 0x03A0[10:8] + PAD_WF0_HB8(GPIO83) 0x03A0[14:12] + PAD_WF0_HB9(GPIO84) 0x03A0[18:16] + PAD_WF0_HB10(GPIO85) 0x03A0[22:20] + */ + CONSYS_REG_WRITE_MASK(REG_GPIO_BASE_ADDR + GPIO_MODE9, 0x22222200, 0x77777700); + CONSYS_REG_WRITE_MASK(REG_GPIO_BASE_ADDR + GPIO_MODE10, 0x222222, 0x777777); + } else { + /* One_Adie_SB + set pinmux for the interface between D-die and A-die (Aux1) + PAD_WF1_HB1(GPIO91) 0x03B0[14:12] + PAD_WF1_HB2(GPIO92) 0x03B0[18:16] + PAD_WF1_HB3(GPIO93) 0x03B0[22:20] + PAD_WF1_HB4(GPIO94) 0x03B0[26:24] + PAD_WF1_HB0(GPIO95) 0x03B0[30:28] + PAD_WF1_HB5(GPIO97) 0x03C0[6:4] + PAD_WF1_HB6(GPIO98) 0x03C0[10:8] + PAD_WF1_HB7(GPIO99) 0x03C0[14:12] + PAD_WF1_HB8(GPIO100) 0x03C0[18:16] + */ + CONSYS_REG_WRITE_MASK(REG_GPIO_BASE_ADDR + GPIO_MODE11, 0x11111000, 0x77777000); + CONSYS_REG_WRITE_MASK(REG_GPIO_BASE_ADDR + GPIO_MODE12, 0x11110, 0x77770); + } + } + /* Set pinmux driving to 4mA + 2mA: [000] + 4mA: [001] + 6mA: [010] + 8mA: [011] + 10mA: [100] + 12mA: [101] + 14mA: [110] + 16mA: [111] + PAD_WF0_HB1 0x0000[17:15] + PAD_WF0_HB2 0x0000[20:18] + PAD_WF0_HB3 0x0000[23:21] + PAD_WF0_HB4 0x0000[26:24] + PAD_WF0_HB0 0x0000[8:6] + PAD_WF0_HB0_B 0x0000[11:9] + PAD_WF0_HB5 0x0000[29:27] + PAD_WF0_HB6 0x0010[2:0] + PAD_WF0_HB7 0x0010[5:3] + PAD_WF0_HB8 0x0010[8:6] + PAD_WF0_HB9 0x0010[11:9] + PAD_WF0_HB10 0x0000[14:12] + PAD_WF0_TOP_CLK 0x0010[14:12] + PAD_WF0_TOP_DATA 0x0010[17:15] + + PAD_WF1_HB1 0x0000[14:12] + PAD_WF1_HB2 0x0000[17:15] + PAD_WF1_HB3 0x0000[20:18] + PAD_WF1_HB4 0x0000[23:21] + PAD_WF1_HB0 0x0000[8:6] + PAD_WF1_HB5 0x0000[26:24] + PAD_WF1_HB6 0x0000[29:27] + PAD_WF1_HB7 0x0010[2:0] + PAD_WF1_HB8 0x0010[5:3] + PAD_WF1_TOP_CLK 0x0010[8:6] + PAD_WF1_TOP_DATA 0x0010[11:9] + */ + CONSYS_REG_WRITE_MASK(REG_IOCFG_TR_ADDR + IOCFG_TR_DRV_CFG0, 0x9249240, 0x3FFFFFC0); + CONSYS_REG_WRITE_MASK(REG_IOCFG_TR_ADDR + IOCFG_TR_DRV_CFG1, 0x9249, 0x3FFF); + CONSYS_REG_WRITE_MASK(REG_IOCFG_TL_ADDR + IOCFG_TL_DRV_CFG0, 0x9249040, 0x3FFFF1C0); + CONSYS_REG_WRITE_MASK(REG_IOCFG_TL_ADDR + IOCFG_TL_DRV_CFG1, 0x249, 0xFFF); + } +} + +int consys_tx_rx_bus_slp_prot_ctrl(bool enable) +{ + int check; + + if (enable) { + /* conn2ap/ap2conn slpprot disable */ + /* Turn off AP2CONN AHB RX bus sleep protect */ + CONSYS_REG_WRITE_MASK(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT, 0x0, 0x10000); + CONSYS_REG_BIT_POLLING(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT, + 24, 0x0, 100, 500, check); + if (check != 0) + pr_err("Polling AP2CONN AHB RX bus sleep protect turn off fail! CR Value = 0x%08x\n", + CONSYS_REG_READ(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT)); + + /* Turn off AP2CONN AHB TX bus sleep protect */ + CONSYS_REG_WRITE_MASK(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT, 0x0, 0x1); + CONSYS_REG_BIT_POLLING(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT, + 4, 0x0, 100, 500, check); + if (check != 0) + pr_err("Polling AP2CONN AHB TX bus sleep protect turn off fail! CR Value = 0x%08x\n", + CONSYS_REG_READ(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT)); + + /* Turn off CONN2AP AXI RX bus sleep protect */ + CONSYS_REG_WRITE_MASK(REG_INFRACFG_AO_ADDR + CONN2AP_GALS_SLPPROT, 0x0, 0x10000); + /* Turn off CONN2AP AXI TX bus sleep protect */ + CONSYS_REG_WRITE_MASK(REG_INFRACFG_AO_ADDR + CONN2AP_GALS_SLPPROT, 0x0, 0x1); + + /* Wait 900us (apply this for CONNSYS XO clock ready) */ + udelay(900); + } else { + /* Turn on AP2CONN AHB TX bus sleep protect */ + CONSYS_REG_WRITE_MASK(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT, 0x1, 0x1); + CONSYS_REG_BIT_POLLING(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT, + 4, 0x1, 100, 500, check); + if (check != 1) + pr_err("Polling AP2CONN AHB TX bus sleep protect turn on fail! CR Value = 0x%08x\n", + CONSYS_REG_READ(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT)); + + /* Turn on AP2CONN AHB RX bus sleep protec */ + CONSYS_REG_WRITE_MASK(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT, 0x1, 0x10000); + CONSYS_REG_BIT_POLLING(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT, + 24, 0x1, 100, 500, check); + if (check !=1) + pr_err("Polling AP2CONN AHB RX bus sleep protect turn on fail! CR Value = 0x%08x\n", + CONSYS_REG_READ(REG_INFRACFG_AO_ADDR + AP2CONN_GALS_SLPPROT)); + + /* Turn on CONN2AP AXI TX bus sleep protect */ + CONSYS_REG_WRITE_MASK(REG_INFRACFG_AO_ADDR + CONN2AP_GALS_SLPPROT, 0x1, 0x1); + CONSYS_REG_BIT_POLLING(REG_INFRACFG_AO_ADDR + CONN2AP_GALS_SLPPROT, + 4, 0x1, 100, 500, check); + if (check != 1) + pr_err("Polling CONN2AP AXI TX bus sleep protect turn on fail! CR Value = 0x%08x\n", + CONSYS_REG_READ(REG_INFRACFG_AO_ADDR + CONN2AP_GALS_SLPPROT)); + + /* Turn on CONN2AP AXI RX bus sleep protect */ + CONSYS_REG_WRITE_MASK(REG_INFRACFG_AO_ADDR + CONN2AP_GALS_SLPPROT, 0x1, 0x10000); + CONSYS_REG_BIT_POLLING(REG_INFRACFG_AO_ADDR + CONN2AP_GALS_SLPPROT, + 24, 0x1, 100, 500, check); + if (check != 1) + pr_err("Polling CONN2AP AXI RX bus sleep protect turn on fail! CR Value = 0x%08x\n", + CONSYS_REG_READ(REG_INFRACFG_AO_ADDR + CONN2AP_GALS_SLPPROT)); + + /* wait 1us*/ + udelay(1); + } + + return 0; +} + +int _consys_polling_chipid_int(unsigned int retry, unsigned int sleep_ms) +{ + unsigned int count = retry + 1; + unsigned int consys_hw_ver = consys_get_hw_ver(); + unsigned int hw_ver = 0; + + while (--count > 0) { + hw_ver = CONSYS_REG_READ(REG_CONN_INFRA_CFG_ADDR + CONN_INFRA_CFG_IP_VERSION); + if ((hw_ver >= consys_hw_ver) && (hw_ver != 0xdeadfeed)) + break; + msleep(sleep_ms); + } + + if (count == 0) { + pr_err("Read CONNSYS HW IP version fail. Expect 0x%x but get 0x%x\n", consys_hw_ver, hw_ver); + return -1; + } else { + pr_info("Read CONNSYS HW IP version successfully! (0x%08x)\n", hw_ver); + } + + return 0; +} + +int consys_polling_chipid(void) +{ + return _consys_polling_chipid_int(10, 1); +} + +int consys_bus_clock_ctrl(enum consys_drv_type drv_type, unsigned int bus_clock) +{ + static unsigned int conninfra_bus_clock_wpll_state = 0; + unsigned int wpll_state = conninfra_bus_clock_wpll_state; + bool wpll_switch = false; + + /* switch conn_infra bus clock pll ready check to pll-1 */ + if (bus_clock & CONNINFRA_BUS_CLOCK_WPLL) { + if (conninfra_bus_clock_wpll_state == 0) { + CONSYS_SET_BIT(REG_CONN_INFRA_CLKGEN_ON_TOP_ADDR + CKGEN_BUS, (0x1 << 29)); + wpll_switch = true; + } + conninfra_bus_clock_wpll_state |= (0x1 << drv_type); + } + pr_info("drv=[%d] conninfra_bus_clock_wpll=[%u]->[%u] %s\n", + drv_type, wpll_state, conninfra_bus_clock_wpll_state, (wpll_switch ? "enable" : "")); + + return 0; +} + +int consys_emi_set_remapping_reg(void) +{ + struct consys_emi_addr_info *addr_info = emi_mng_get_phy_addr(); + + /* 0x1806_01C4[19:0], ap_emi_base[19:0] = TBD (related to emi) + 0x1806_01D4[19:0], wf_ap_peri_base[19:0] = 0x0_1100 (un-related to emi) + */ + if (addr_info->emi_ap_phy_base != 0) + CONSYS_REG_WRITE_OFFSET_RANGE(REG_CONN_HOST_CSR_TOP_ADDR + CONN2AP_REMAP_MCU_EMI, + addr_info->emi_ap_phy_base, 0, 16, 20); + /* + CONSYS_REG_WRITE_OFFSET_RANGE(REG_CONN_HOST_CSR_TOP_ADDR + CONN2AP_REMAP_WF_PERI, + 0x300D0000, 0, 16, 20); + */ + + return 0; +} + +int consys_emi_set_region_protection(void) +{ + struct consys_emi_addr_info *addr_info = emi_mng_get_phy_addr(); + + /* set infra top emi address range */ + if (addr_info->emi_ap_phy_base != 0) { + CONSYS_REG_WRITE(REG_CONN_INFRA_BUS_CR_ADDR + CONN2AP_EMI_PATH_ADDR_START, + addr_info->emi_ap_phy_base); + + if (addr_info->emi_ap_phy_size != 0) + CONSYS_REG_WRITE(REG_CONN_INFRA_BUS_CR_ADDR + CONN2AP_EMI_PATH_ADDR_END, + addr_info->emi_ap_phy_base + addr_info->emi_ap_phy_size); + } + + return 0; +} + +int connsys_d_die_cfg(void) +{ + unsigned int efuse; + + efuse = CONSYS_REG_READ(REG_CONN_INFRA_CFG_ADDR + EFUSE); + pr_info("D-die efuse: 0x%08x\n", efuse); + + return 0; +} + +int connsys_conninfra_sysram_hw_ctrl(void) +{ + /* conn_infra sysram hw control setting -> disable hw power down */ + CONSYS_REG_WRITE(REG_CONN_INFRA_RGU_ADDR + SYSRAM_HWCTL_PDN, 0x0); + + /* conn_infra sysram hw control setting -> enable hw sleep */ + CONSYS_REG_WRITE(REG_CONN_INFRA_RGU_ADDR + SYSRAM_HWCTL_SLP, 0x1); + + return 0; +} + +int connsys_spi_master_cfg(void) +{ + /* wt_slp CR for A-die ck_en/wake_en control */ + /* + RFSPI #0 RFSPI #1 + WF_CK_ADDR 0x18005070[11:0] 0x18085070[11:0] 0xA04 + WF_B1_CK_ADDR 0x18005070[27:16] 0x18085070[27:16] 0xAF4 + WF_WAKE_ADDR 0x18005074[11:0] 0x18085074[11:0] 0x090 + WF_B1_WAKE_ADDR 0x18005074[27:16] 0x18085074[27:16] 0x0A0 + WF_ZPS_ADDR 0x18005078[11:0] 0x18085078[11:0] 0x08C + WF_B1_ZPS_ADDR 0x18005078[27:16] 0x18085078[27:16] 0x09C + TOP_CK_ADDR 0x18005084[11:0] 0x18085084[11:0] 0xA00 + WF_B0_CMD_ADDR 0x1800508c[11:0] 0x1808508c[11:0] 0x0F0 + WF_B1_CMD_ADDR 0x18005090[11:0] 0x18085090[11:0] 0x0F4 + */ + CONSYS_REG_WRITE_MASK(REG_CONN_WT_SLP_CTL_REG_ADDR + WB_WF_CK_ADDR, 0xAF40A04, 0xFFF0FFF); + CONSYS_REG_WRITE_MASK(REG_CONN_WT_SLP_CTL_REG_ADDR + WB_WF_WAKE_ADDR, 0x0A00090, 0xFFF0FFF); + CONSYS_REG_WRITE_MASK(REG_CONN_WT_SLP_CTL_REG_ADDR + WB_WF_ZPS_ADDR, 0x09C008C, 0xFFF0FFF); + CONSYS_REG_WRITE_MASK(REG_CONN_WT_SLP_CTL_REG_ADDR + WB_TOP_CK_ADDR, 0xA00, 0xFFF); + CONSYS_REG_WRITE_MASK(REG_CONN_WT_SLP_CTL_REG_ADDR + WB_WF_B0_CMD_ADDR, 0x0F0, 0xFFF); + CONSYS_REG_WRITE_MASK(REG_CONN_WT_SLP_CTL_REG_ADDR + WB_WF_B1_CMD_ADDR, 0x0F4, 0xFFF); + CONSYS_REG_WRITE_MASK(REG_INST2_CONN_WT_SLP_CTL_REG_ADDR + WB_WF_CK_ADDR, 0xAF40A04, 0xFFF0FFF); + CONSYS_REG_WRITE_MASK(REG_INST2_CONN_WT_SLP_CTL_REG_ADDR + WB_WF_WAKE_ADDR, 0x0A00090, 0xFFF0FFF); + CONSYS_REG_WRITE_MASK(REG_INST2_CONN_WT_SLP_CTL_REG_ADDR + WB_WF_ZPS_ADDR, 0x09C008C, 0xFFF0FFF); + CONSYS_REG_WRITE_MASK(REG_INST2_CONN_WT_SLP_CTL_REG_ADDR + WB_TOP_CK_ADDR, 0xA00, 0xFFF); + CONSYS_REG_WRITE_MASK(REG_INST2_CONN_WT_SLP_CTL_REG_ADDR + WB_WF_B0_CMD_ADDR, 0x0F0, 0xFFF); + CONSYS_REG_WRITE_MASK(REG_INST2_CONN_WT_SLP_CTL_REG_ADDR + WB_WF_B1_CMD_ADDR, 0x0F4, 0xFFF); + + return 0; +} + +static int consys_spi_read_nolock(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int *data) +{ + int check = 0; + unsigned long rf_spi_addr = 0; + const struct spi_op *op = NULL; + unsigned char adie_idx = ((subsystem & 0xF0) >> 4); //0: one adie, 1: two adie + unsigned char subsystem_idx = (subsystem & 0xF); + + if (!data) { + pr_err("invalid data ptr\n"); + return CONNINFRA_SPI_OP_FAIL; + } + + op = &spi_op_array[subsystem_idx]; + if (adie_idx != 0) + rf_spi_addr = REG_INST2_CONN_RF_SPI_MST_REG_ADDR; + else + rf_spi_addr = REG_CONN_RF_SPI_MST_REG_ADDR; + + /* Read action: + * 1. Polling busy_cr[polling_bit] should be 0 + * 2. Write addr_cr with data being {read_addr_format | addr[11:0]} + * 3. Trigger SPI by writing write_data_cr as 0 + * 4. Polling busy_cr[polling_bit] as 0 + * 5. Read data_cr[data_mask] + */ + + CONSYS_REG_BIT_POLLING(rf_spi_addr + op->busy_cr, op->polling_bit, 0, 100, 500, check); + if (check != 0) { + pr_err("[%d][STEP1] polling 0x%08lx bit %d fail. Value=0x%08x\n", + subsystem, rf_spi_addr + op->busy_cr, op->polling_bit, + CONSYS_REG_READ(rf_spi_addr + op->busy_cr)); + return CONNINFRA_SPI_OP_FAIL; + } + + CONSYS_REG_WRITE(rf_spi_addr + op->addr_cr, (op->read_addr_format | addr)); + CONSYS_REG_WRITE(rf_spi_addr + op->write_data_cr, 0); + + CONSYS_REG_BIT_POLLING(rf_spi_addr + op->busy_cr, op->polling_bit, 0, 100, 500, check); + if (check != 0) { + pr_err("[%d][STEP4] polling 0x%08lx bit %d fail. Value=0x%08x\n", + subsystem, rf_spi_addr + op->busy_cr, + op->polling_bit, CONSYS_REG_READ(rf_spi_addr + op->busy_cr)); + return CONNINFRA_SPI_OP_FAIL; + } + + check = CONSYS_REG_READ_BIT(rf_spi_addr + op->read_data_cr, op->read_data_mask); + *data = check; + + return 0; +} + +static int consys_spi_write_nolock(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int data) +{ + int check = 0; + unsigned long rf_spi_addr = 0; + const struct spi_op *op = NULL; + unsigned char adie_idx = ((subsystem & 0xF0) >> 4); //0: one adie, 1: two adie + unsigned char subsystem_idx = (subsystem & 0xF); + + op = &spi_op_array[subsystem_idx]; + if (adie_idx != 0) + rf_spi_addr = REG_INST2_CONN_RF_SPI_MST_REG_ADDR; + else + rf_spi_addr = REG_CONN_RF_SPI_MST_REG_ADDR; + + /* Write action: + * 1. Wait busy_cr[polling_bit] as 0 + * 2. Write addr_cr with data being {write_addr_format | addr[11:0] + * 3. Write write_data_cr ad data + * 4. Wait busy_cr[polling_bit] as 0 + */ + + CONSYS_REG_BIT_POLLING(rf_spi_addr + op->busy_cr, op->polling_bit, 0, 100, 500, check); + if (check != 0) { + pr_err("[%d][STEP1] polling 0x%08lx bit %d fail. Value=0x%08x\n", + subsystem, rf_spi_addr + op->busy_cr, + op->polling_bit, CONSYS_REG_READ(rf_spi_addr + op->busy_cr)); + return CONNINFRA_SPI_OP_FAIL; + } + + CONSYS_REG_WRITE(rf_spi_addr + op->addr_cr, (op->write_addr_format | addr)); + CONSYS_REG_WRITE(rf_spi_addr + op->write_data_cr, data); + + check = 0; + CONSYS_REG_BIT_POLLING(rf_spi_addr + op->busy_cr, op->polling_bit, 0, 100, 500, check); + if (check != 0) { + pr_err("[%d][STEP4] polling 0x%08lx bit %d fail. Value=0x%08x\n", + subsystem, rf_spi_addr + op->busy_cr, + op->polling_bit, CONSYS_REG_READ(rf_spi_addr + op->busy_cr)); + return CONNINFRA_SPI_OP_FAIL; + } + + pr_info("addr = 0x%04x, val = 0x%08x\n", addr, data); + + return 0; +} + +static int consys_sema_acquire(enum conn_semaphore_type index) +{ + if (CONSYS_REG_READ_BIT((REG_CONN_SEMAPHORE_ADDR + CONN_SEMA00_M2_OWN_STA + index*4), 0x1) == 0x1) { + return CONN_SEMA_GET_SUCCESS; + } else { + return CONN_SEMA_GET_FAIL; + } +} + +int consys_sema_acquire_timeout(unsigned int index, unsigned int usec) +{ + int i; + + if (index >= CONN_SEMA_NUM_MAX) { + pr_err("wrong index: %d\n", index); + return CONN_SEMA_GET_FAIL; + } + + for (i = 0; i < usec; i++) { + if (consys_sema_acquire(index) == CONN_SEMA_GET_SUCCESS) { + return CONN_SEMA_GET_SUCCESS; + } + udelay(1); + } + pr_err("Get semaphore 0x%x timeout, dump status:\n", index); + pr_err("M0:[0x%x] M1:[0x%x] M2:[0x%x] M3:[0x%x] M4:[0x%x] M5:[0x%x] M6:[0x%x] M7:[0x%x]\n", + CONSYS_REG_READ(REG_CONN_SEMAPHORE_ADDR + CONN_SEMA_OWN_BY_M0_STA_REP), + CONSYS_REG_READ(REG_CONN_SEMAPHORE_ADDR + CONN_SEMA_OWN_BY_M1_STA_REP), + CONSYS_REG_READ(REG_CONN_SEMAPHORE_ADDR + CONN_SEMA_OWN_BY_M2_STA_REP), + CONSYS_REG_READ(REG_CONN_SEMAPHORE_ADDR + CONN_SEMA_OWN_BY_M3_STA_REP), + CONSYS_REG_READ(REG_CONN_SEMAPHORE_ADDR + CONN_SEMA_OWN_BY_M4_STA_REP), + CONSYS_REG_READ(REG_CONN_SEMAPHORE_ADDR + CONN_SEMA_OWN_BY_M5_STA_REP), + CONSYS_REG_READ(REG_CONN_SEMAPHORE_ADDR + CONN_SEMA_OWN_BY_M6_STA_REP), + CONSYS_REG_READ(REG_CONN_SEMAPHORE_ADDR + CONN_SEMA_OWN_BY_M7_STA_REP)); + + return CONN_SEMA_GET_FAIL; +} + +void consys_sema_release(unsigned int index) +{ + if (index >= CONN_SEMA_NUM_MAX) { + pr_err("wrong index: %d\n", index); + return; + } + + CONSYS_REG_WRITE((REG_CONN_SEMAPHORE_ADDR + CONN_SEMA00_M2_OWN_REL + index*4), 0x1); +} + +int consys_spi_read(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int *data) +{ + int ret; + + /* Get semaphore before read */ + if (consys_sema_acquire_timeout(CONN_SEMA_RFSPI_INDEX, CONN_SEMA_TIMEOUT) == CONN_SEMA_GET_FAIL) { + pr_err("[SPI READ] Require semaphore fail\n"); + return CONNINFRA_SPI_OP_FAIL; + } + + ret = consys_spi_read_nolock(subsystem, addr, data); + + consys_sema_release(CONN_SEMA_RFSPI_INDEX); + + return ret; +} + +int consys_spi_write(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int data) +{ + int ret; + + /* Get semaphore before read */ + if (consys_sema_acquire_timeout(CONN_SEMA_RFSPI_INDEX, CONN_SEMA_TIMEOUT) == CONN_SEMA_GET_FAIL) { + pr_err("[SPI WRITE] Require semaphore fail\n"); + return CONNINFRA_SPI_OP_FAIL; + } + + ret = consys_spi_write_nolock(subsystem, addr, data); + + consys_sema_release(CONN_SEMA_RFSPI_INDEX); + return ret; +} + +static void consys_spi_write_offset_range_nolock( + enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int value, + unsigned int reg_offset, unsigned int value_offset, unsigned int size) +{ + unsigned int data = 0, data2; + unsigned int reg_mask; + int ret; + + pr_info("[%s] addr=0x%04x value=0x%08x reg_offset=%d value_offset=%d size=%d\n", + g_spi_system_name[subsystem], addr, value, reg_offset, value_offset, size); + + value = (value >> value_offset); + value = GET_BIT_RANGE(value, size, 0); + value = (value << reg_offset); + ret = consys_spi_read_nolock(subsystem, addr, &data); + if (ret) { + pr_err("[%s] Get 0x%08x error, ret=%d\n", + g_spi_system_name[subsystem], addr, ret); + return; + } + + reg_mask = GENMASK(reg_offset + size - 1, reg_offset); + data2 = data & (~reg_mask); + data2 = (data2 | value); + consys_spi_write_nolock(subsystem, addr, data2); + + pr_info("[%s] Write CR:0x%08x from 0x%08x to 0x%08x\n", + g_spi_system_name[subsystem], addr, data, data2); +} + +int consys_spi_write_offset_range( + enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int value, + unsigned int reg_offset, unsigned int value_offset, unsigned int size) +{ + if (consys_sema_acquire_timeout(CONN_SEMA_RFSPI_INDEX, CONN_SEMA_TIMEOUT) == CONN_SEMA_GET_FAIL) { + pr_err("[SPI READ] Require semaphore fail\n"); + return CONNINFRA_SPI_OP_FAIL; + } + consys_spi_write_offset_range_nolock(subsystem, addr, value, reg_offset, value_offset, size); + + consys_sema_release(CONN_SEMA_RFSPI_INDEX); + + return 0; +} + +/***************************************************************************** +* FUNCTION +* connsys_a_die_efuse_read +* DESCRIPTION +* Read a-die efuse +* PARAMETERS +* efuse_addr: read address +* RETURNS +* int +* 0: fail, efuse is invalid +* 1: success, efuse is valid +*****************************************************************************/ +static int connsys_a_die_efuse_read_nolock( + enum sys_spi_subsystem subsystem, unsigned int efuse_ctrl, unsigned int efuse_addr, + unsigned int *data0, unsigned int *data1, unsigned int *data2, unsigned int *data3) +{ + int ret = 0; + int retry = 0; + int ret0, ret1, ret2, ret3; + unsigned int efuse_block_sel; + + if (data0 == NULL || data1 == NULL || data2 == NULL || data3 == NULL) { + pr_err("invalid parameter (%p, %p, %p, %p)\n", + data0, data1, data2, data3); + return 0; + } + + switch (efuse_ctrl) { + case ATOP_EFUSE_CTRL_1: + efuse_block_sel = 0x1; + break; + + case ATOP_EFUSE_CTRL_2: + efuse_block_sel = 0x2; + break; + + case ATOP_EFUSE_CTRL_3: + efuse_block_sel = 0x4; + break; + + case ATOP_EFUSE_CTRL_4: + efuse_block_sel = 0x8; + break; + + default: + pr_err("No support for efuse block No. = %d\n", efuse_ctrl); + return 0; + break; + } + + /* select Efuse block */ + consys_spi_write_nolock(subsystem, ATOP_RG_EFUSE_CFG5, efuse_block_sel); + + /* Efuse control clear, clear Status /trigger + * Address: ATOP EFUSE_CTRL_write_efsrom_kick_and_read_kick_busy_flag (0x108[30]) + * Data: 1'b0 + * Action: TOPSPI_WR + */ + consys_spi_read_nolock(subsystem, efuse_ctrl, &ret); + ret &= ~(0x1 << 30); + consys_spi_write_nolock(subsystem, efuse_ctrl, ret); + + /* Efuse Read 1st 16byte + * Address: + * ATOP EFUSE_CTRL_efsrom_mode (0x108[7:6]) = 2'b00 + * ATOP EFUSE_CTRL_efsrom_ain (0x108[25:16]) = efuse_addr (0) + * ATOP EFUSE_CTRL_write_efsrom_kick_and_read_kick_busy_flag (0x108[30]) = 1'b1 + * Action: TOPSPI_WR + */ + consys_spi_read_nolock(subsystem, efuse_ctrl, &ret); + ret &= ~(0x43FF00C0); + ret |= (0x1 << 30); + ret |= ((efuse_addr << 16) & 0x3FF0000); + consys_spi_write_nolock(subsystem, efuse_ctrl, ret); + + /* Polling EFUSE busy = low + * (each polling interval is "30us" and polling timeout is 2ms) + * Address: + * ATOP EFUSE_CTRL_write_efsrom_kick_and_read_kick_busy_flag (0x108[30]) = 1'b0 + * Action: TOPSPI_Polling + */ + consys_spi_read_nolock(subsystem, efuse_ctrl, &ret); + while ((ret & (0x1 << 30)) != 0 && retry < 70) { + retry++; + udelay(30); + consys_spi_read_nolock(subsystem, efuse_ctrl, &ret); + } + if ((ret & (0x1 << 30)) != 0) { + pr_err("EFUSE busy, retry failed(%d)\n", retry); + } + + /* Check efuse_valid & return + * Address: ATOP EFUSE_CTRL_csri_efsrom_dout_vld_sync_1_ (0x108[29]) + * Action: TOPSPI_RD + */ + /* if (efuse_valid == 1'b1) + * Read Efuse Data to global var + */ + consys_spi_read_nolock(subsystem, efuse_ctrl, &ret); + if (((ret & (0x1 << 29)) >> 29) == 1) { + ret0 = consys_spi_read_nolock(subsystem, ATOP_EFUSE_RDATA0, data0); + ret1 = consys_spi_read_nolock(subsystem, ATOP_EFUSE_RDATA1, data1); + ret2 = consys_spi_read_nolock(subsystem, ATOP_EFUSE_RDATA2, data2); + ret3 = consys_spi_read_nolock(subsystem, ATOP_EFUSE_RDATA3, data3); + + pr_info("efuse = [0x%08x, 0x%08x, 0x%08x, 0x%08x]\n", *data0, *data1, *data2, *data3); + if (ret0 || ret1 || ret2 || ret3) + pr_err("efuse read error: [%d, %d, %d, %d]\n", ret0, ret1, ret2, ret3); + ret = 1; + } else { + pr_err("EFUSE is invalid\n"); + ret = 0; + } + + return ret; +} + +static int _connsys_a_die_thermal_cal(enum sys_spi_subsystem subsystem) +{ + int efuse_valid = 0; + unsigned int efuse0 = 0, efuse1 = 0, efuse2 = 0, efuse3 = 0; + + /* thernal efuse data in 7976&7975 in EFUSE2 */ + efuse_valid = connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_THADC_ANALOG, + &efuse0, &efuse1, &efuse2, &efuse3); + //if (efuse_valid) { + if ((efuse0 & (0x1 << 7))) { + consys_spi_write_offset_range_nolock(subsystem, ATOP_RG_TOP_THADC_BG, efuse0, 12, 3, 4); + consys_spi_write_offset_range_nolock(subsystem, ATOP_RG_TOP_THADC_00, efuse0, 23, 0, 3); + } + //} + + efuse_valid = connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_THADC_SLOP, + &efuse0, &efuse1, &efuse2, &efuse3); + //if (efuse_valid) { + if((efuse0 & (0x1 << 7))) { + consys_spi_write_offset_range_nolock(subsystem, ATOP_RG_TOP_THADC_00, efuse0, 26, 5, 2); + } + //} + + return 0; +} + +static int _connsys_a_die_xtal_trim_7976(enum sys_spi_subsystem subsystem) +{ + unsigned int efuse0 = 0, efuse1 = 0, efuse2 = 0, efuse3 = 0; + int c1c2_trim_result_ax_80m = 0, c1c2_trim_result_ax_40m = 0; + unsigned int cbtop_strap_rdata = 0, xtal_strap_mode = 0, adie_rdata = 0, value = 0; + + connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_XTAL_TRIM_FLOW, + &efuse0, &efuse1, &efuse2, &efuse3); + if ((efuse0 & (0x1 < 1))) { + /* C1C2 80M AX */ + connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_XTAL_CR_C1_SEL_AXM_80M_OSC, + &efuse0, &efuse1, &efuse2, &efuse3); + if ((efuse0 & (0x1 < 7)) == 0) { + c1c2_trim_result_ax_80m = 64; + } else { + c1c2_trim_result_ax_80m = (efuse0 & 0x7F); + connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_XTAL_CR_C1_SEL_AXM_TRIM1_80M_OSC, + &efuse0, &efuse1, &efuse2, &efuse3); + if ((efuse0 & (0x1 < 7)) == 1) { + if ((efuse0 & (0x1 < 6)) == 0) { + c1c2_trim_result_ax_80m = c1c2_trim_result_ax_80m + (efuse0 & 0x3F); + } else { + c1c2_trim_result_ax_80m = c1c2_trim_result_ax_80m - (efuse0 & 0x3F); + } + + if (c1c2_trim_result_ax_80m > 127) + c1c2_trim_result_ax_80m = 127; + else if (c1c2_trim_result_ax_80m < 0) + c1c2_trim_result_ax_80m = 0; + } + } + + /* C1C2 40M AX */ + connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_XTAL_CR_C1_SEL_AXM_40M_OSC, + &efuse0, &efuse1, &efuse2, &efuse3); + if ((efuse0 & (0x1 < 7)) == 0) { + c1c2_trim_result_ax_40m = 64; + } else { + c1c2_trim_result_ax_40m = (efuse0 & 0x7F); + connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_XTAL_CR_C1_SEL_AXM_TRIM1_40M_OSC, + &efuse0, &efuse1, &efuse2, &efuse3); + if ((efuse0 & (0x1 < 7)) == 1) { + if ((efuse0 & (0x1 < 6)) == 0) { + c1c2_trim_result_ax_40m = c1c2_trim_result_ax_40m + (efuse0 & 0x3F); + } else { + c1c2_trim_result_ax_40m = c1c2_trim_result_ax_40m - (efuse0 & 0x3F); + } + + if (c1c2_trim_result_ax_40m > 127) + c1c2_trim_result_ax_40m = 127; + else if (c1c2_trim_result_ax_40m < 0) + c1c2_trim_result_ax_40m = 0; + } + } + + /* Update trim value to C1 and C2 */ + consys_spi_read_nolock(subsystem, ATOP_RG_STRAP_PIN_IN, &cbtop_strap_rdata); + xtal_strap_mode = ((cbtop_strap_rdata & 0x70) >> 4); + if ((xtal_strap_mode == 0x0) || (xtal_strap_mode == 0x2)) { //80m osc + /* C1 */ + consys_spi_read_nolock(subsystem, 0x654, &adie_rdata); + value = (adie_rdata & 0xFFFFFF) | ((c1c2_trim_result_ax_80m & 0xFF) << 24); + consys_spi_write_nolock(subsystem, 0x654, value); + + /* C2 */ + consys_spi_read_nolock(subsystem, 0x658, &adie_rdata); + value = (adie_rdata & 0xFFFFFF) | ((c1c2_trim_result_ax_80m & 0xFF) << 24); + consys_spi_write_nolock(subsystem, 0x658, value); + } else if ((xtal_strap_mode == 0x3) || (xtal_strap_mode == 0x4) || (xtal_strap_mode == 0x6)) { //40m osc + /* C1 */ + consys_spi_read_nolock(subsystem, 0x654, &adie_rdata); + value = (adie_rdata & 0xFF00FFFF) | ((c1c2_trim_result_ax_40m & 0xFF) << 16); + consys_spi_write_nolock(subsystem, 0x654, value); + + /* C2 */ + consys_spi_read_nolock(subsystem, 0x658, &adie_rdata); + value = (adie_rdata & 0xFF00FFFF) | ((c1c2_trim_result_ax_40m & 0xFF) << 16); + consys_spi_write_nolock(subsystem, 0x658, value); + } + } + + return 0; +} + +static int _connsys_a_die_sw_cntl(enum sys_spi_subsystem subsystem, unsigned char adie_idx) +{ + if (conn_hw_env[adie_idx].valid && (conn_hw_env[adie_idx].adie_id == 0x7976)) { + if ((conn_hw_env[adie_idx].adie_hw_version == 0x8A00) + || (conn_hw_env[adie_idx].adie_hw_version == 0x8A10) + || (conn_hw_env[adie_idx].adie_hw_version == 0x8B00)){ + consys_spi_write_nolock(subsystem, ATOP_RG_TOP_THADC_00, 0x4A563B00); + consys_spi_write_nolock(subsystem, ATOP_RG_XO_01, 0x1D59080F); + consys_spi_write_nolock(subsystem, ATOP_RG_XO_03, 0x34C00FE0); + } else { + consys_spi_write_nolock(subsystem, ATOP_RG_TOP_THADC_00, 0x4A563B00); + consys_spi_write_nolock(subsystem, ATOP_RG_XO_01, 0x1959F80F); + consys_spi_write_nolock(subsystem, ATOP_RG_XO_03, 0x34D00FE0); + } + } + + return 0; +} + +int _connsys_a_die_cfg_7976(unsigned char adie_idx) +{ + int check; + unsigned int adie_chip_id = 0x0; + unsigned char subsystem = 0; + + if (adie_idx == 1) + subsystem = SYS_SPI_2ND_ADIE_TOP; + else + subsystem = SYS_SPI_TOP; + + /* release D Die to A Die Digital reset_b */ + if (adie_idx == 1) + CONSYS_SET_BIT(REG_CONN_INFRA_CFG_ADDR + ADIE_CTL, 0x4); + else + CONSYS_SET_BIT(REG_CONN_INFRA_CFG_ADDR + ADIE_CTL, 0x1); + + /* Get semaphore once */ + if (consys_sema_acquire_timeout(CONN_SEMA_RFSPI_INDEX, CONN_SEMA_TIMEOUT) == CONN_SEMA_GET_FAIL) { + pr_err("Require semaphore fail\n"); + return -1; + } + + /* read a-die ID */ + check = consys_spi_read_nolock(subsystem, ATOP_CHIP_ID, &adie_chip_id); + if (check) { + /* Release semaphore */ + consys_sema_release(CONN_SEMA_RFSPI_INDEX); + pr_err("Get ATOP_CHIP_ID fail, check = %d\n", check); + return -1; + } + + /* enable TOPDIG CK */ + check = consys_spi_write_nolock(subsystem, ATOP_TOP_CLK_EN, 0xFFFFFFFF); + + /* config WRI CK select */ + if (one_adie_dbdc) + check = consys_spi_write_nolock(subsystem, ATOP_RG_WRI_CK_SELECT, 0x1C); + + /* Thermal Cal (TOP) */ + _connsys_a_die_thermal_cal(subsystem); + + /* XTAL TRIM */ + _connsys_a_die_xtal_trim_7976(subsystem); + + /* SW control part */ + _connsys_a_die_sw_cntl(subsystem, adie_idx); + + /* Release semaphore */ + consys_sema_release(CONN_SEMA_RFSPI_INDEX); + + return 0; +} + +static int _connsys_a_die_xtal_trim_7975(enum sys_spi_subsystem subsystem) +{ + unsigned int efuse0 = 0, efuse1 = 0, efuse2 = 0, efuse3 = 0; + unsigned int trim_result = 0, value = 0; + int ret = 0; + + ret = connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_7975_XTAL_TRIM_FLOW, + &efuse0, &efuse1, &efuse2, &efuse3); + if (((efuse0 & 0x1) == 0) || (ret == 0)) + return 0; + + connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_7975_XTAL_CALIBRATION, + &efuse0, &efuse1, &efuse2, &efuse3); + if ((efuse0 & (0x1 << 7))) { + trim_result = (efuse0 & 0x7F); + trim_result = (trim_result & 0x7F); + } + + connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_7975_XTAL_TRIM2_COMPENSATION, + &efuse0, &efuse1, &efuse2, &efuse3); + if ((efuse0 & (0x1 << 7))){ + if ((efuse0 & (0x1 << 6))) + trim_result -= (efuse0 & 0x3F); + else + trim_result += (efuse0 & 0x3F); + trim_result = (trim_result & 0x7F); + } + + connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_7975_XTAL_TRIM3_COMPENSATION, + &efuse0, &efuse1, &efuse2, &efuse3); + if ((efuse0 & (0x1 << 7))){ + if ((efuse0 & (0x1 << 6))) + trim_result -= (efuse0 & 0x3F); + else + trim_result += (efuse0 & 0x3F); + trim_result = (trim_result & 0x7F); + } + + connsys_a_die_efuse_read_nolock(subsystem, ATOP_EFUSE_CTRL_2, ATOP_7975_XTAL_TRIM4_COMPENSATION, + &efuse0, &efuse1, &efuse2, &efuse3); + if ((efuse0 & (0x1 << 7))){ + if ((efuse0 & (0x1 << 6))) + trim_result -= (efuse0 & 0x3F); + else + trim_result += (efuse0 & 0x3F); + trim_result = (trim_result & 0x7F); + } + + /* Update Trim Value to C1 and C2*/ + /* Step 1 */ + consys_spi_read_nolock(subsystem, ATOP_7975_CR_C1_C2_A94, &value); + value = ((value & 0xf8080fff) | ((trim_result << 20) | (trim_result << 12))); + consys_spi_write_nolock(subsystem, ATOP_7975_CR_C1_C2_A94, value); + + /* Step 2 */ + consys_spi_read_nolock(subsystem, ATOP_7975_CR_C1_C2_A18, &value); + if(value & (1<<29)){ + consys_spi_read_nolock(subsystem, ATOP_7975_CR_C1_C2_A84, &value); + value = (value & 0x7fffffff); + consys_spi_write_nolock(subsystem, ATOP_7975_CR_C1_C2_A84, value); + } + + /* Step 3 */ + consys_spi_read_nolock(subsystem, ATOP_7975_CR_C1_C2_AA4, &value); + value = ((value & 0xfffeffff) | 0x10000); + consys_spi_write_nolock(subsystem, ATOP_7975_CR_C1_C2_AA4, value); + + return 0; +} + + +static int _connsys_a_die_form_patch_7975(enum sys_spi_subsystem subsystem) +{ + pr_info("Form 7975 adie Patch\n"); + + /* disable CAL LDO and fine tune RFDIG LDO, 20191218 */ + consys_spi_write_nolock(subsystem, 0x348, 0x00000002); + + /* disable CAL LDO and fine tune RFDIG LDO, 20191218 */ + consys_spi_write_nolock(subsystem, 0x378, 0x00000002); + + /* disable CAL LDO and fine tune RFDIG LDO, 20191218 */ + consys_spi_write_nolock(subsystem, 0x3A8, 0x00000002); + + /* disable CAL LDO and fine tune RFDIG LDO, 20191218 */ + consys_spi_write_nolock(subsystem, 0x3D8, 0x00000002); + + /* set CKA driving and filter */ + consys_spi_write_nolock(subsystem, 0xA1C, 0x30000AAA); + + /* set CKB LDO to 1.4V */ + consys_spi_write_nolock(subsystem, 0xA84, 0x8470008A); + + /* turn on SX0 LTBUF */ + consys_spi_write_nolock(subsystem, 0x074, 0x00000002); + + /* CK_BUF_SW_EN=1 (all buf in manual mode.) */ + consys_spi_write_nolock(subsystem, 0xAA4, 0x01001FC0); + + /* BT mode/WF normal mode 32?™h=00000005 */ + consys_spi_write_nolock(subsystem, 0x070, 0x00000005); + + /* BG thermal sensor offset update */ + consys_spi_write_nolock(subsystem, 0x344, 0x00000088); + + /* BG thermal sensor offset update */ + consys_spi_write_nolock(subsystem, 0x374, 0x00000088); + + /* BG thermal sensor offset update */ + consys_spi_write_nolock(subsystem, 0x3A4, 0x00000088); + + /* BG thermal sensor offset update */ + consys_spi_write_nolock(subsystem, 0x3D4, 0x00000088); + + /* set WCON VDD IPTAT to "0000" */ + consys_spi_write_nolock(subsystem, 0xA80, 0x44D07000); + + /* change back LTBUF SX3 drving to default value, 20191113 */ + consys_spi_write_nolock(subsystem, 0xA88, 0x3900AAAA); + + /* SM input cap off */ + consys_spi_write_nolock(subsystem, 0x2C4, 0x00000000); + + /* set CKB driving and filter */ + consys_spi_write_nolock(subsystem, 0x2C8, 0x00000072); + + return 0; +} + +int _connsys_a_die_cfg_7975(unsigned char adie_idx) +{ + int check; + unsigned int adie_chip_id = 0x0; + unsigned int value = 0x0; + unsigned char subsystem = 0; + + if (adie_idx == 1) + subsystem = SYS_SPI_2ND_ADIE_TOP; + else + subsystem = SYS_SPI_TOP; + + /* release D Die to A Die Digital reset_b */ + if (adie_idx == 1) + CONSYS_SET_BIT(REG_CONN_INFRA_CFG_ADDR + ADIE_CTL, 0x4); + else + CONSYS_SET_BIT(REG_CONN_INFRA_CFG_ADDR + ADIE_CTL, 0x1); + + /* Get semaphore once */ + if (consys_sema_acquire_timeout(CONN_SEMA_RFSPI_INDEX, CONN_SEMA_TIMEOUT) == CONN_SEMA_GET_FAIL) { + pr_err("Require semaphore fail\n"); + return -1; + } + + /* read a-die ID */ + check = consys_spi_read_nolock(subsystem, ATOP_CHIP_ID, &adie_chip_id); + if (check) { + /* Release semaphore */ + consys_sema_release(CONN_SEMA_RFSPI_INDEX); + pr_err("Get ATOP_CHIP_ID fail, check = %d\n", check); + return -1; + } + + /* enable TOPDIG CK */ + check = consys_spi_write_nolock(subsystem, ATOP_TOP_CLK_EN, 0xFFFFFFFF); + + /* Disable XO_OUT_B */ + check = consys_spi_read_nolock(subsystem, ATOP_7975_CO_CLK, &value); + check = consys_spi_write_nolock(subsystem, ATOP_7975_CO_CLK, value | 0x02); + + /* Thermal Cal (TOP) */ + _connsys_a_die_thermal_cal(subsystem); + + /* XTAL TRIM */ + _connsys_a_die_xtal_trim_7975(subsystem); + + /* Form Harrier E2 Patch */ + _connsys_a_die_form_patch_7975(subsystem); + + /* Release semaphore */ + consys_sema_release(CONN_SEMA_RFSPI_INDEX); + + return 0; +} + +int connsys_a_die_cfg(void) +{ + int ret = 0; + unsigned int i; + + if (one_adie_dbdc) { + /* use adie_idx = 0 */ + if (conn_hw_env[0].valid) { + if (conn_hw_env[0].adie_id == 0x7976) { + ret = _connsys_a_die_cfg_7976(0); + } else if (conn_hw_env[0].adie_id == 0x7975) { + printk(RED("%s: Error(%d): No support!!!"), __func__, __LINE__); + } else { + printk(RED("%s: Error(%d): Unknown Adie type!!!"), __func__, __LINE__); + return -1; + } + } + } else { + for (i = 0; i < AIDE_NUM_MAX; i++) { + if (conn_hw_env[i].valid) { + if (conn_hw_env[i].adie_id == 0x7976) { + ret = _connsys_a_die_cfg_7976(i); + } else if (conn_hw_env[i].adie_id == 0x7975) { + ret = _connsys_a_die_cfg_7975(i); + } else { + printk(RED("%s: Error(%d): Unknown Adie type!!!"), __func__, __LINE__); + return -1; + } + } + } + } + + return ret; +} + +int _connsys_afe_wbg_cal_7976(unsigned char wbg_idx, unsigned char rfspi_idx) +{ + int check; + unsigned long afe_ctl_addr = 0; + unsigned char subsystem = 0; + + if ((wbg_idx == 0) && (rfspi_idx == 0)) { + afe_ctl_addr = REG_CONN_AFE_CTL_ADDR; + subsystem = SYS_SPI_TOP; + } else if ((wbg_idx == 1) && (rfspi_idx == 0)) { + afe_ctl_addr = REG_CONN_AFE_CTL_2ND_ADDR; + subsystem = SYS_SPI_TOP; + } else if ((wbg_idx == 1) && (rfspi_idx == 1)) { + afe_ctl_addr = REG_CONN_AFE_CTL_2ND_ADDR; + subsystem = SYS_SPI_2ND_ADIE_TOP; + } else { + pr_err("No support for this combination (wbg_idx = %d, rfspi_idx = %d)\n", + wbg_idx, rfspi_idx); + return -1; + } + + /* Get semaphore once */ + if (consys_sema_acquire_timeout(CONN_SEMA_RFSPI_INDEX, CONN_SEMA_TIMEOUT) == CONN_SEMA_GET_FAIL) { + pr_err("Require semaphore fail\n"); + return -1; + } + + /* set WF_PAD to HighZ */ + check = consys_spi_write_nolock(subsystem, ATOP_RG_ENCAL_WBTAC_IF_SW, 0x88888005); + + /* AFE WBG CAL SEQ1 (RC calibration) */ + CONSYS_SET_BIT(afe_ctl_addr + RG_DIG_EN_01, 0x1); + udelay(60); + CONSYS_CLR_BIT(afe_ctl_addr + RG_DIG_EN_01, 0x1); + + /* AFE WBG CAL SEQ2 (TX calibration) */ + CONSYS_SET_BIT(afe_ctl_addr + RG_DIG_EN_03, (0x1 << 21)); + udelay(30); + CONSYS_SET_BIT(afe_ctl_addr + RG_DIG_EN_03, (0x1 << 20)); + udelay(60); + CONSYS_SET_BIT(afe_ctl_addr + RG_DIG_EN_01, 0x3E0000); + udelay(800); + CONSYS_CLR_BIT(afe_ctl_addr + RG_DIG_EN_01, 0x3E0000); + CONSYS_CLR_BIT(afe_ctl_addr + RG_DIG_EN_03, 0x300000); + + /* disable WF_PAD to HighZ */ + check = consys_spi_write_nolock(subsystem, ATOP_RG_ENCAL_WBTAC_IF_SW, 0x00000005); + + /* Release semaphore */ + consys_sema_release(CONN_SEMA_RFSPI_INDEX); + + return 0; +} + +int _connsys_afe_wbg_cal_7975(unsigned char wbg_idx, unsigned char rfspi_idx) +{ + int check; + unsigned long afe_ctl_addr = 0; + unsigned char subsystem = 0; + + if ((wbg_idx == 0) && (rfspi_idx == 0)) { + afe_ctl_addr = REG_CONN_AFE_CTL_ADDR; + subsystem = SYS_SPI_TOP; + } else if ((wbg_idx == 1) && (rfspi_idx == 0)) { + afe_ctl_addr = REG_CONN_AFE_CTL_2ND_ADDR; + subsystem = SYS_SPI_TOP; + } else if ((wbg_idx == 1) && (rfspi_idx == 1)) { + afe_ctl_addr = REG_CONN_AFE_CTL_2ND_ADDR; + subsystem = SYS_SPI_2ND_ADIE_TOP; + } else { + pr_err("No support for this combination (wbg_idx = %d, rfspi_idx = %d)\n", + wbg_idx, rfspi_idx); + return -1; + } + + /* Get semaphore once */ + if (consys_sema_acquire_timeout(CONN_SEMA_RFSPI_INDEX, CONN_SEMA_TIMEOUT) == CONN_SEMA_GET_FAIL) { + pr_err("Require semaphore fail\n"); + return -1; + } + + /* set WF_PAD to HighZ */ + check = consys_spi_write_nolock(subsystem, ATOP_RG_ENCAL_WBTAC_IF_SW, 0x80000000); + + /* AFE WBG CAL SEQ1 (RC calibration) */ + CONSYS_SET_BIT(afe_ctl_addr + RG_DIG_EN_01, 0x1); + udelay(60); + CONSYS_CLR_BIT(afe_ctl_addr + RG_DIG_EN_01, 0x1); + + /* AFE WBG CAL SEQ2 (TX calibration) */ + CONSYS_SET_BIT(afe_ctl_addr + RG_DIG_EN_03, (0x1 << 21)); + udelay(30); + CONSYS_SET_BIT(afe_ctl_addr + RG_DIG_EN_03, (0x1 << 20)); + udelay(60); + CONSYS_SET_BIT(afe_ctl_addr + RG_DIG_EN_01, 0x3E0000); + udelay(800); + CONSYS_CLR_BIT(afe_ctl_addr + RG_DIG_EN_01, 0x3E0000); + CONSYS_CLR_BIT(afe_ctl_addr + RG_DIG_EN_03, 0x300000); + + /* disable WF_PAD to HighZ */ + check = consys_spi_write_nolock(subsystem, ATOP_RG_ENCAL_WBTAC_IF_SW, 0x00000005); + + /* Release semaphore */ + consys_sema_release(CONN_SEMA_RFSPI_INDEX); + + return 0; +} + +int connsys_afe_wbg_cal(void) +{ + int ret; + unsigned int i; + + if (adie_cfg_type == ADIE_TYPE_TWO) { + for (i = 0; i < AIDE_NUM_MAX; i++) { + if (conn_hw_env[i].valid) { + if (conn_hw_env[i].adie_id == 0x7976) { + ret = _connsys_afe_wbg_cal_7976(i, i); + } else if (conn_hw_env[i].adie_id == 0x7975) { + ret = _connsys_afe_wbg_cal_7975(i, i); + } else { + printk(RED("%s: Error(%d): Unknown Adie type!!!"), __func__, __LINE__); + return -1; + } + } + } + } else { + if (one_adie_dbdc) { + /* use adie_idx = 0 */ + if (conn_hw_env[0].valid) { + if (conn_hw_env[0].adie_id == 0x7976) { + ret = _connsys_afe_wbg_cal_7976(0, 0); + ret = _connsys_afe_wbg_cal_7976(1, 0); + } else if (conn_hw_env[0].adie_id == 0x7975) { + printk(RED("%s: Error(%d): No support!!!"), __func__, __LINE__); + } else { + printk(RED("%s: Error(%d): Unknown Adie type!!!"), __func__, __LINE__); + return -1; + } + } + } else { + /* use adie_idx = 1 */ + if (conn_hw_env[1].valid) { + if (conn_hw_env[1].adie_id == 0x7976) { + ret = _connsys_afe_wbg_cal_7976(1, 1); + } else if (conn_hw_env[1].adie_id == 0x7975) { + ret = _connsys_afe_wbg_cal_7975(1, 1); + } else { + printk(RED("%s: Error(%d): Unknown Adie type!!!"), __func__, __LINE__); + return -1; + } + } + } + } + + return ret; +} + +int _connsys_subsys_pll_initial(unsigned char wbg_idx) +{ + unsigned long afe_ctl_addr = 0; + + if (wbg_idx == 0) { + afe_ctl_addr = REG_CONN_AFE_CTL_ADDR; + } else if (wbg_idx == 1) { + afe_ctl_addr = REG_CONN_AFE_CTL_2ND_ADDR; + } else { + pr_err("Not support for this wbg index (wbg_idx=%d)\n", wbg_idx); + return -1; + } + + /* SWITCH(xtal_freq) + CASE SYS_XTAL_40000K + */ + /* set BPLL stable time = 30us (value = 30 * 1000 *1.01 / 25ns) */ + CONSYS_REG_WRITE_RANGE(afe_ctl_addr + RG_PLL_STB_TIME, (0x4BC << 16), 30, 16); + /* set WPLL stable time = 50us (value = 50 * 1000 *1.01 / 25ns) */ + CONSYS_REG_WRITE_RANGE(afe_ctl_addr + RG_PLL_STB_TIME, 0x7E4, 14, 0); + /* BT pll_en will turn on BPLL only (may change in different XTAL option) */ + CONSYS_REG_WRITE_RANGE(afe_ctl_addr + RG_DIG_EN_02, (0x1 << 6), 7, 6); + /* WF pll_en will turn on WPLL only (may change in different XTAL option) */ + CONSYS_REG_WRITE_RANGE(afe_ctl_addr + RG_DIG_EN_02, 0x2, 1, 0); + /* MCU pll_en will turn on BPLL (may change in different XTAL option) */ + CONSYS_REG_WRITE_RANGE(afe_ctl_addr + RG_DIG_EN_02, (0x1 << 2), 3, 2); + /* MCU pll_en will turn on BPLL + WPLL (may change in different XTAL option) */ + CONSYS_REG_WRITE_RANGE(afe_ctl_addr + RG_DIG_EN_02, (0x2 << 16), 17, 16); + /* CONN_INFRA CLKGEN WPLL AND BPLL REQUEST */ + CONSYS_REG_WRITE_RANGE(afe_ctl_addr + RG_DIG_TOP_01, (0x9 << 15), 18, 15); + + return 0; +} + +int connsys_subsys_pll_initial(void) +{ + int ret; + + ret = _connsys_subsys_pll_initial(0); + ret = _connsys_subsys_pll_initial(1); + + return ret; +} + +int connsys_osc_legacy_mode(void) +{ + /* disable conn_top rc osc_ctrl_top */ + CONSYS_CLR_BIT(REG_CONN_INFRA_CFG_ADDR + CONN_INFRA_CFG_RC_CTL_0, 0x80); + CONSYS_REG_WRITE_RANGE(REG_CONN_INFRA_CFG_ADDR + OSC_CTL_0, 0x80706, 23, 0); + + return 0; +} + +int connsys_top_pwr_ctrl(void) +{ + /* prevent subsys from power on/of in a short time interval */ + CONSYS_CLR_BIT_WITH_KEY(REG_CONN_INFRA_RGU_ADDR + BGFYS_ON_TOP_PWR_CTL, 0x40, 0x42540000); + CONSYS_CLR_BIT_WITH_KEY(REG_CONN_INFRA_RGU_ADDR + WFSYS_ON_TOP_PWR_CTL, 0x40, 0x57460000); + + return 0; +} + +int connsys_conn_infra_bus_timeout(void) +{ + /* set conn_infra_off bus timeout */ + CONSYS_REG_WRITE_RANGE(REG_CONN_INFRA_BUS_CR_ADDR + CONN_INFRA_BUS_OFF_TIMEOUT_CTRL, (0x2 << 7), 14, 7); + /* enable conn_infra off bus timeout feature */ + CONSYS_REG_WRITE_RANGE(REG_CONN_INFRA_BUS_CR_ADDR + CONN_INFRA_BUS_OFF_TIMEOUT_CTRL, 0xF, 3, 0); + + /* set conn_infra_on bus timeout */ + CONSYS_REG_WRITE_RANGE(REG_CONN_INFRA_BUS_CR_ADDR + CONN_INFRA_BUS_ON_TIMEOUT_CTRL, (0xC << 7), 14, 7); + /* enable conn_infra_on bus timeout feature */ + CONSYS_REG_WRITE_RANGE(REG_CONN_INFRA_BUS_CR_ADDR + CONN_INFRA_BUS_ON_TIMEOUT_CTRL, 0xF, 3, 0); + + return 0; +} + +int connsys_clkgen_wpll_hw_ctrl(void) +{ + /* set hclk_div_1 with wpll div sel */ + CONSYS_REG_WRITE_MASK(REG_CONN_INFRA_CLKGEN_ON_TOP_ADDR + CKGEN_BUS_WPLL_DIV_1, 0x4, 0xFC); + + /* set hclk_div_2 with wpll div sel */ + CONSYS_REG_WRITE_MASK(REG_CONN_INFRA_CLKGEN_ON_TOP_ADDR + CKGEN_BUS_WPLL_DIV_2, 0x4, 0xFC); + +#ifndef CONFIG_FPGA_EARLY_PORTING + /* enable conn_infra bus wpll div_1 */ + CONSYS_SET_BIT(REG_CONN_INFRA_CLKGEN_ON_TOP_ADDR + CKGEN_BUS_WPLL_DIV_1, 0x1); + + /* enable conn_infra bus wpll div_2 */ + CONSYS_SET_BIT(REG_CONN_INFRA_CLKGEN_ON_TOP_ADDR + CKGEN_BUS_WPLL_DIV_2, 0x1); +#endif + +#ifndef CONFIG_FPGA_EARLY_PORTING + /* set rfspi wpll div sel + enable rfspis wpll div + */ + CONSYS_REG_WRITE_MASK(REG_CONN_INFRA_CLKGEN_ON_TOP_ADDR + CKGEN_RFSPI_WPLL_DIV, 0x21, 0xFD); +#else + /* set rfspi wpll div sel */ + CONSYS_REG_WRITE_MASK(REG_CONN_INFRA_CLKGEN_ON_TOP_ADDR + CKGEN_RFSPI_WPLL_DIV, 0x20, 0xFC); +#endif + + /* disable conn_infra bus clock sw control ==> conn_infra bus clock hw control */ + CONSYS_CLR_BIT(REG_CONN_INFRA_CLKGEN_ON_TOP_ADDR + CKGEN_BUS, 0x800000); + + /* Conn_infra HW_CONTROL => conn_infra enter dsleep mode */ + CONSYS_SET_BIT(REG_CONN_INFRA_CFG_ADDR + CONN_INFRA_CFG_PWRCTRL0, 0x1); + + return 0; +} + +int consys_conninfra_top_wakeup(void) +{ + /* wake up conn_infra */ + CONSYS_SET_BIT(REG_CONN_HOST_CSR_TOP_ADDR + CONN_INFRA_WAKEPU_TOP, 0x1); + + /* Wait 900us (apply this for CONNSYS XO clock ready) */ + udelay(900); + + /* Check CONNSYS version ID + * (polling "10 times" for specific project code and each polling interval is "1ms") + */ + if (consys_polling_chipid() != 0) { + pr_err("Polling chip id fail\n"); + return -1; + } + + return 0; +} + +int consys_conninfra_top_sleep(void) +{ + /* release conn_infra force on */ + CONSYS_CLR_BIT(REG_CONN_HOST_CSR_TOP_ADDR + CONN_INFRA_WAKEPU_TOP, 0x1); + + return 0; +} + +int _consys_adie_top_ck_en_on_off_ctrl(unsigned char rfspi_idx, enum consys_drv_type type, unsigned char on) +{ + int check = 0; + unsigned long slp_ctl_addr = 0; + + if (rfspi_idx == 1) + slp_ctl_addr = REG_INST2_CONN_WT_SLP_CTL_REG_ADDR; + else + slp_ctl_addr = REG_CONN_WT_SLP_CTL_REG_ADDR; + + if (type == CONNDRV_TYPE_CONNINFRA) { + if (on) + CONSYS_SET_BIT(slp_ctl_addr + WB_SLP_TOP_CK_0, 0x1); + else + CONSYS_CLR_BIT(slp_ctl_addr + WB_SLP_TOP_CK_0, 0x1); + CONSYS_REG_BIT_POLLING(slp_ctl_addr + WB_SLP_TOP_CK_0, 1, 0, 100, 500, check); + if (check == -1) + pr_err("[type=%d][on=%d] op fail\n", type, on); + } else if (type == CONNDRV_TYPE_WIFI) { + if (on) + CONSYS_SET_BIT(slp_ctl_addr + WB_SLP_TOP_CK_1, 0x1); + else + CONSYS_CLR_BIT(slp_ctl_addr + WB_SLP_TOP_CK_1, 0x1); + CONSYS_REG_BIT_POLLING(slp_ctl_addr + WB_SLP_TOP_CK_1, 1, 0, 100, 500, check); + if (check == -1) + pr_err("[type=%d][on=%d] op fail\n", type, on); + } else { + pr_err("Not support for this consys drv type = %d\n", type); + return -1; + } + + return 0; +} + +int consys_adie_top_ck_en_on_off_ctrl(enum consys_drv_type type, unsigned char on) +{ + int ret; + + if (consys_sema_acquire_timeout(CONN_SEMA_CONN_INFRA_COMMON_SYSRAM_INDEX, CONN_SEMA_TIMEOUT) == CONN_SEMA_GET_FAIL) { + pr_err("[type=%d] acquire semaphore (%d) timeout\n", + type, CONN_SEMA_CONN_INFRA_COMMON_SYSRAM_INDEX); + return -1; + } + + if (adie_cfg_type == ADIE_TYPE_TWO) { + ret = _consys_adie_top_ck_en_on_off_ctrl(0, type, on); + ret = _consys_adie_top_ck_en_on_off_ctrl(1, type, on); + } else { + if (one_adie_dbdc) { + ret = _consys_adie_top_ck_en_on_off_ctrl(0, type, on); + } else { + ret = _consys_adie_top_ck_en_on_off_ctrl(1, type, on); + } + } + + consys_sema_release(CONN_SEMA_CONN_INFRA_COMMON_SYSRAM_INDEX); + + return ret; +} + +bool _is_wmcpu_run_allow(void) +{ + if (EEPROM_content_valid) { + if (one_adie_dbdc) { + if ((band0_pa_type == iPAiLNA) || + (band0_pa_type == iPAeLNA) || + (band1_pa_type == iPAiLNA) || + (band1_pa_type == iPAeLNA)) { + if ((conn_hw_env[0].valid && + (conn_hw_env[0].adie_id == 0x7976) && + (conn_hw_env[0].adie_hw_version == 0x8A20))) { + printk(RED("Wrong EEPROM PA type for this sku!")); + return false; + } + } + } else { + if (adie_cfg_type == ADIE_TYPE_TWO) { + if ((band0_pa_type == iPAiLNA) || + (band0_pa_type == iPAeLNA) || + (band1_pa_type == iPAiLNA) || + (band1_pa_type == iPAeLNA)) { + if ((conn_hw_env[0].valid && (conn_hw_env[0].adie_id == 0x7976)) && + (conn_hw_env[1].valid && (conn_hw_env[1].adie_id == 0x7976))) { + printk(RED("Wrong EEPROM PA type for this sku!")); + return false; + } + } + } + } + } + + return true; +} + +int consys_conninfra_wf_wakeup(void) +{ + /* wake up conn_infra */ + CONSYS_SET_BIT(REG_CONN_HOST_CSR_TOP_ADDR + CONN_INFRA_WAKEPU_WF, 0x1); + + /* Wait 900us (apply this for CONNSYS XO clock ready) */ + udelay(900); + + /* Check CONNSYS version ID + * (polling "10 times" for specific project code and each polling interval is "1ms") + */ + if (consys_polling_chipid() != 0) { + pr_err("Polling chip id fail\n"); + return -1; + } + + return 0; +} + +int consys_conninfra_wf_sleep(void) +{ + CONSYS_CLR_BIT(REG_CONN_HOST_CSR_TOP_ADDR + CONN_INFRA_WAKEPU_WF, 0x1); + + return 0; +} + +int consys_conn_wmcpu_sw_reset(bool bassert) +{ + if (bassert) { + CONSYS_CLR_BIT(REG_CONN_INFRA_RGU_ADDR + WFSYS_CPU_SW_RST_B, 0x1); + } else { + if (_is_wmcpu_run_allow()) + CONSYS_SET_BIT(REG_CONN_INFRA_RGU_ADDR + WFSYS_CPU_SW_RST_B, 0x1); + } + + return 0; +} + +int consys_wf_bus_slp_prot_ctrl(bool enable) +{ + /* Turn on/off "conn_infra to wfsys"/wfsys to conn_infra/wfdma2conn" bus sleep protect */ + + if (enable) + CONSYS_SET_BIT(REG_CONN_INFRA_CFG_ADDR + CONN_INFRA_WF_SLP_CTRL, 0x1); + else + CONSYS_CLR_BIT(REG_CONN_INFRA_CFG_ADDR + CONN_INFRA_WF_SLP_CTRL, 0x1); + + return 0; +} + +int consys_wfsys_top_on_ctrl(bool enable) +{ + int check = 0; + + if (enable) { + /* turn on wfsys_top_on */ + CONSYS_SET_BIT(REG_CONN_INFRA_RGU_ADDR + WFSYS_ON_TOP_PWR_CTL, 0x57460080); + + /* polling wfsys_rgu_off_hreset_rst_b */ + CONSYS_REG_BIT_POLLING(REG_CONN_HOST_CSR_TOP_ADDR + DBG_DUMMY_3, 30, 1, 100, 500, check); + if (check == -1) + pr_err("[%d] polling wfsys_rgu_off_hreset_rst_b fail\n", enable); + } else { + /* turn off wfsys_top_on */ + CONSYS_CLR_BIT_WITH_KEY(REG_CONN_INFRA_RGU_ADDR + WFSYS_ON_TOP_PWR_CTL, 0x80, 0x57460000); + + /* polling wfsys_rgu_off_hreset_rst_b */ + CONSYS_REG_BIT_POLLING(REG_CONN_HOST_CSR_TOP_ADDR + DBG_DUMMY_3, 30, 0, 100, 500, check); + if (check == -1) + pr_err("[%d] polling wfsys_rgu_off_hreset_rst_b fail\n", enable); + } + + return 0; +} + +int consys_wfsys_bus_slp_prot_check(bool enable) +{ + int check = 0; + + if (enable) { + /* check "conn_infra to wfsys"/wfsys to conn_infra" bus sleep protect turn off */ + CONSYS_REG_BIT_POLLING(REG_CONN_INFRA_CFG_ADDR + CONN_INFRA_WF_SLP_STATUS, 29, 0, 100, 500, check); + if (check == -1) + pr_err("[bit %d] check conn_infra to wfsys or wfsys to conn_infra bus sleep protect turn off fail\n", 29); + + CONSYS_REG_BIT_POLLING(REG_CONN_INFRA_CFG_ADDR + CONN_INFRA_WF_SLP_STATUS, 31, 0, 100, 500, check); + if (check == -1) + pr_err("[bit %d] check conn_infra to wfsys or wfsys to conn_infra bus sleep protect turn off fail\n", 31); + + /* check WFDMA2CONN AXI TX bus sleep protect turn off */ + CONSYS_REG_BIT_POLLING(REG_WF_TOP_SLPPROT_ON_ADDR + WF_TOP_SLPPROT_ON_STATUS_READ, 23, 0, 100, 500, check); + if (check == -1) + pr_err("check WFDMA2CONN AXI TX bus sleep protect turn off fail\n"); + + /* check WFDMA2CONN AXI RX bus sleep protect turn off */ + CONSYS_REG_BIT_POLLING(REG_WF_TOP_SLPPROT_ON_ADDR + WF_TOP_SLPPROT_ON_STATUS_READ, 21, 0, 100, 500, check); + if (check == -1) + pr_err("check WFDMA2CONN AXI RX bus sleep protect turn off fail\n"); + + /* check WFSYS version ID */ + CONSYS_REG_POLLING_LARGER_OR_EQUAL(REG_WF_TOP_CFG_ADDR + WF_TOP_CFG_IP_VERSION, 0xFFFFFFFF, 0, 0x02060000, 10, 500, check); + if (check == -1) + pr_err("check WFSYS version ID fail\n"); + } else { + /* check WFDMA2CONN AXI RX bus sleep protect turn on */ + CONSYS_REG_BIT_POLLING(REG_CONN_INFRA_CFG_ADDR + CONN_INFRA_WF_SLP_STATUS, 25, 1, 100, 500, check); + if (check == -1) + pr_err("check WFDMA2CONN AXI RX bus sleep protect turn on fail\n"); + + /* check "conn_infra to wfsys"/wfsys to conn_infra" bus sleep protect turn on */ + CONSYS_REG_BIT_POLLING(REG_CONN_INFRA_CFG_ADDR + CONN_INFRA_WF_SLP_STATUS, 29, 1, 100, 500, check); + if (check == -1) + pr_err("[bit %d] check conn_infra to wfsys or wfsys to conn_infra bus sleep protect turn on fail\n", 29); + + CONSYS_REG_BIT_POLLING(REG_CONN_INFRA_CFG_ADDR + CONN_INFRA_WF_SLP_STATUS, 31, 1, 100, 500, check); + if (check == -1) + pr_err("[bit %d] check conn_infra to wfsys or wfsys to conn_infra bus sleep protect turn on fail\n", 31); + } + + return 0; +} + +int consys_wfsys_bus_timeout_ctrl(void) +{ + /* set wfsys bus timeout value (ahb apb timeout) */ + CONSYS_REG_WRITE_MASK(REG_WF_MCU_CONFIG_LS_ADDR + BUSHANGCR, 0x1, 0xFF); + + /* enable wfsys bus timeout (ahb apb timeout) */ + CONSYS_SET_BIT(REG_WF_MCU_CONFIG_LS_ADDR + BUSHANGCR, 0x90000000); + + /* set conn2wf remapping window to wf debug_ctrl_ao CR */ + CONSYS_REG_WRITE(REG_WF_MCU_BUS_CR_ADDR + AP2WF_REMAP_1, 0x810F0000); + + /* set wfsys bus timeout value (debug ctrl ao) */ + CONSYS_REG_WRITE_MASK(REG_WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_ADDR + WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_WFMCU_PWA_CTRL0, + 0x03AA0000, 0xFFFF0000); + + /* enable wfsys bus timeout (debug ctrl ao) */ + CONSYS_SET_BIT(REG_WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_ADDR + WF_MCUSYS_INFRA_BUS_FULL_U_DEBUG_CTRL_AO_WFMCU_PWA_CTRL0, 0xC); + + return 0; +} + +int consys_wmcpu_idle_loop_check(void) +{ + int check = 0; + + /* check CONNSYS power-on completion */ + CONSYS_REG_POLLING_EQUAL(REG_WF_TOP_CFG_ON_ADDR + ROMCODE_INDEX, 0xFFFFFFFF, 0, 0x1D1E, 5000, 1000, check); + if (check == -1) + pr_err("check CONNSYS power-on completion fail\n"); + + return 0; +} + +int _connsys_a_die_chip_id_confirm(unsigned char adie_idx) +{ + int check; + unsigned int adie_chip_id = 0x0; + unsigned char subsystem = 0; + + if (adie_idx == 1) + subsystem = SYS_SPI_2ND_ADIE_TOP; + else + subsystem = SYS_SPI_TOP; + + /* release D Die to A Die Digital reset_b if need */ + if (adie_idx == 1) { + if (CONSYS_REG_READ_BIT(REG_CONN_INFRA_CFG_ADDR + ADIE_CTL, 0x4) == 0) + CONSYS_SET_BIT(REG_CONN_INFRA_CFG_ADDR + ADIE_CTL, 0x4); + } else { + if (CONSYS_REG_READ_BIT(REG_CONN_INFRA_CFG_ADDR + ADIE_CTL, 0x1) == 0) + CONSYS_SET_BIT(REG_CONN_INFRA_CFG_ADDR + ADIE_CTL, 0x1); + } + + /* Get semaphore once */ + if (consys_sema_acquire_timeout(CONN_SEMA_RFSPI_INDEX, CONN_SEMA_TIMEOUT) == CONN_SEMA_GET_FAIL) { + pr_err("Require semaphore fail\n"); + return -1; + } + + /* read a-die ID */ + check = consys_spi_read_nolock(subsystem, ATOP_CHIP_ID, &adie_chip_id); + if (check) { + /* Release semaphore */ + consys_sema_release(CONN_SEMA_RFSPI_INDEX); + pr_err("adie_idx[%d]: Get ATOP_CHIP_ID fail, check = %d\n", adie_idx, check); + return -1; + } + + /* Release semaphore */ + consys_sema_release(CONN_SEMA_RFSPI_INDEX); + + if (adie_idx < AIDE_NUM_MAX && (adie_chip_id & 0xFFFF0000) != 0) { + conn_hw_env[adie_idx].valid = true; + conn_hw_env[adie_idx].adie_hw_version = (adie_chip_id & 0xFFFF); + conn_hw_env[adie_idx].adie_id = ((adie_chip_id & 0xFFFF0000) >> 16); + conn_hw_env[adie_idx].is_rc_mode = 0; + + pr_info("adie_idx[%d]: A-die CHIP ID = 0x%x, HW Version = 0x%x\n", + adie_idx, conn_hw_env[adie_idx].adie_id, conn_hw_env[adie_idx].adie_hw_version); + } + + return 0; +} + +int consys_plt_adie_type_check(void) +{ + int ret = 0; + + memset(&conn_hw_env, 0, sizeof(conn_hw_env)); + + if (adie_cfg_type == ADIE_TYPE_TWO) { + ret = _connsys_a_die_chip_id_confirm(0); + ret = _connsys_a_die_chip_id_confirm(1); + if (!(conn_hw_env[0].valid && conn_hw_env[1].valid)){ + adie_cfg_type = ADIE_TYPE_ONE; + printk(RED("%s: Change adie type to one adie"), __func__); + } + } else { + if (one_adie_dbdc) + ret = _connsys_a_die_chip_id_confirm(0); + else + ret = _connsys_a_die_chip_id_confirm(1); + } + + return ret; +} + +int consys_plt_adie_type_cfg(void) +{ + /* + a. Check if One Adie DBDC mode from GPIO8 (0x11D1_021C[2]) + b. To read from falsh EEPROM to decide stream number for several skus + c. + 1. If Strap_GPIO8 == 0 && Read EEPROM Stream Num. + case 1: 2G: 0T0R => One_Adie_SB_AX7800 + then + case 1: A-die is 7976 => + TOP_MISC_CR (0x11D1_021C[31:28]) = 0xA && 0x18050000 = 0xA + case 2: A-die is 7975 => + TOP_MISC_CR (0x11D1_021C[31:28]) = 0x8 && 0x18050000 = 0x8 + 2. If Strap_GPIO8 == 0 && Read EEPROM Stream Num. + case 1: 2G: 2T4R => Two_Adie_SB_AX5400 + case 2: 2G: 4T4R => Two_Adie_SB_AX6000 + then + case 1: A-die is 7976 => + TOP_MISC_CR (0x11D1_021C[31:28]) = 0xF && 0x18050000 = 0xF + case 2: A-die is 7975 => + TOP_MISC_CR (0x11D1_021C[31:28]) = 0xD && 0x18050000 = 0xD + 3. If Strap_GPIO8 == 1 && Read EEPROM Stream Num. + case 1: 2G: 2T2R => One_Adie_DB + then TOP_MISC_CR (0x11D1_021C[31:28]) = 0x7 && 0x18050000 = 0x7 + */ + + if (one_adie_dbdc) { + if (adie_cfg_type == ADIE_TYPE_ONE) { + if ((conn_hw_env[0].valid && (conn_hw_env[0].adie_id == 0x7976))) { + CONSYS_REG_WRITE_MASK(REG_TOP_MISC_ADDR + TOP_MISC_RSRV_ALL1_3, 0x70000000, 0xF0000000); + CONSYS_REG_WRITE(REG_CONN_INFRA_SYSRAM_ADDR + SYSRAM_BASE_ADDR, 0x7); + } else { + printk(RED("%s: Error(%d): Unknown sku type!!!"), __func__, __LINE__); + } + } + } else { + if (adie_cfg_type == ADIE_TYPE_TWO) { + if ((conn_hw_env[0].valid && (conn_hw_env[0].adie_id == 0x7976)) && + (conn_hw_env[1].valid && (conn_hw_env[1].adie_id == 0x7976))) { + CONSYS_REG_WRITE_MASK(REG_TOP_MISC_ADDR + TOP_MISC_RSRV_ALL1_3, 0xF0000000, 0xF0000000); + CONSYS_REG_WRITE(REG_CONN_INFRA_SYSRAM_ADDR + SYSRAM_BASE_ADDR, 0xF); + } else if ((conn_hw_env[0].valid && (conn_hw_env[0].adie_id == 0x7975)) && + (conn_hw_env[1].valid && (conn_hw_env[1].adie_id == 0x7975))) { + CONSYS_REG_WRITE_MASK(REG_TOP_MISC_ADDR + TOP_MISC_RSRV_ALL1_3, 0xD0000000, 0xF0000000); + CONSYS_REG_WRITE(REG_CONN_INFRA_SYSRAM_ADDR + SYSRAM_BASE_ADDR, 0xD); + } else { + printk(RED("%s: Error(%d): Unknown sku type!!!"), __func__, __LINE__); + } + } else { + if ((conn_hw_env[0].valid && (conn_hw_env[0].adie_id == 0x7976)) || + (conn_hw_env[1].valid && (conn_hw_env[1].adie_id == 0x7976))) { + CONSYS_REG_WRITE_MASK(REG_TOP_MISC_ADDR + TOP_MISC_RSRV_ALL1_3, 0xA0000000, 0xF0000000); + CONSYS_REG_WRITE(REG_CONN_INFRA_SYSRAM_ADDR + SYSRAM_BASE_ADDR, 0xA); + } else if ((conn_hw_env[0].valid && (conn_hw_env[0].adie_id == 0x7975)) || + (conn_hw_env[1].valid && (conn_hw_env[1].adie_id == 0x7975))) { + CONSYS_REG_WRITE_MASK(REG_TOP_MISC_ADDR + TOP_MISC_RSRV_ALL1_3, 0x80000000, 0xF0000000); + CONSYS_REG_WRITE(REG_CONN_INFRA_SYSRAM_ADDR + SYSRAM_BASE_ADDR, 0x8); + } else { + printk(RED("%s: Error(%d): Unknown sku type!!!"), __func__, __LINE__); + } + } + } + + if (_consys_check_adie_cfg() == 0) + _consys_check_sku_cfg(); + + return 0; +} + +int consys_wpll_ctrl(bool enable) +{ + if (enable) { + /* turn back wpll setting in conn_afe_ctl by setting wpll initial control to 2'b10 */ + CONSYS_REG_WRITE_MASK(REG_CONN_AFE_CTL_ADDR + RG_DIG_EN_02, 0x20002, 0x30003); + } else { + /* Don't need below code check anymore due to new design */ +#if 0 + int check = 0; + /* trun off wpll enable in conn_afe_ctl by setting wpll initial control to 2'b00 */ + CONSYS_REG_WRITE_MASK(REG_CONN_AFE_CTL_ADDR + RG_DIG_EN_02, 0x0, 0x30003); + + /* polling conn_infra bus to non-wpll case */ + CONSYS_REG_POLLING_EQUAL(REG_CONN_INFRA_CLKGEN_ON_TOP_ADDR + CKGEN_BUS, 0x7800, 11, 0x0, 5000, 1000, check); + if (check == -1) + pr_err("polling conn_infra bus to non-wpll case fail\n"); +#endif + } + + return 0; +} + +int consys_conninfra_wf_req_clr(void) +{ + /* clear wf_emi_req */ + CONSYS_SET_BIT(REG_CONN_INFRA_CFG_ADDR + EMI_CTL_WF, 0x1); + CONSYS_CLR_BIT(REG_CONN_INFRA_CFG_ADDR + EMI_CTL_WF, 0x1); + + /* clear wf_infra_req */ + CONSYS_SET_BIT(REG_CONN_INFRA_CFG_ADDR + EMI_CTL_WF, 0x20); + CONSYS_CLR_BIT(REG_CONN_INFRA_CFG_ADDR + EMI_CTL_WF, 0x20); + + return 0; +} + diff --git a/package/conninfra/src/platform/pmic_mng.c b/package/conninfra/src/platform/pmic_mng.c new file mode 100644 index 0000000..0e8d034 --- /dev/null +++ b/package/conninfra/src/platform/pmic_mng.c @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#include "consys_hw.h" +#include "pmic_mng.h" +#include "osal.h" +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +const struct consys_platform_pmic_ops* consys_platform_pmic_ops = NULL; + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +int pmic_mng_init( + struct platform_device *pdev, + struct conninfra_dev_cb* dev_cb, + const struct conninfra_plat_data* plat_data) +{ + if (consys_platform_pmic_ops == NULL) { + consys_platform_pmic_ops = (const struct consys_platform_pmic_ops*)plat_data->platform_pmic_ops; + } + + if (consys_platform_pmic_ops && consys_platform_pmic_ops->consys_pmic_get_from_dts) + consys_platform_pmic_ops->consys_pmic_get_from_dts(pdev, dev_cb); + + return 0; +} + +int pmic_mng_deinit(void) +{ + return 0; +} + +int pmic_mng_common_power_ctrl(unsigned int enable) +{ + int ret = 0; + + if (consys_platform_pmic_ops && + consys_platform_pmic_ops->consys_pmic_common_power_ctrl) + ret = consys_platform_pmic_ops->consys_pmic_common_power_ctrl(enable); + + return ret; +} + +int pmic_mng_wifi_power_ctrl(unsigned int enable) +{ + int ret = 0; + if (consys_platform_pmic_ops && + consys_platform_pmic_ops->consys_pmic_wifi_power_ctrl) + ret = consys_platform_pmic_ops->consys_pmic_wifi_power_ctrl(enable); + return ret; + +} + +int pmic_mng_bt_power_ctrl(unsigned int enable) +{ + int ret = 0; + if (consys_platform_pmic_ops && + consys_platform_pmic_ops->consys_pmic_bt_power_ctrl) + ret = consys_platform_pmic_ops->consys_pmic_bt_power_ctrl(enable); + return ret; +} + +int pmic_mng_gps_power_ctrl(unsigned int enable) +{ + int ret = 0; + if (consys_platform_pmic_ops && + consys_platform_pmic_ops->consys_pmic_gps_power_ctrl) + ret = consys_platform_pmic_ops->consys_pmic_gps_power_ctrl(enable); + return ret; +} + +int pmic_mng_fm_power_ctrl(unsigned int enable) +{ + int ret = 0; + if (consys_platform_pmic_ops && + consys_platform_pmic_ops->consys_pmic_fm_power_ctrl) + ret = consys_platform_pmic_ops->consys_pmic_fm_power_ctrl(enable); + return ret; +} + + +int pmic_mng_event_cb(unsigned int id, unsigned int event) +{ + if (consys_platform_pmic_ops && + consys_platform_pmic_ops->consys_pmic_event_notifier) + consys_platform_pmic_ops->consys_pmic_event_notifier(id, event); + return 0; +} diff --git a/package/conninfra/src/src/conninfra.c b/package/conninfra/src/src/conninfra.c new file mode 100644 index 0000000..4a48679 --- /dev/null +++ b/package/conninfra/src/src/conninfra.c @@ -0,0 +1,263 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#define pr_fmt(fmt) KBUILD_MODNAME "@(%s:%d) " fmt, __func__, __LINE__ + +#include +#include +#include +#include +#include +#include +#include +#include "conninfra.h" +#include "emi_mng.h" +#include "conninfra_core.h" +#include "consys_hw.h" + +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +#define CONNINFRA_RST_RATE_LIMIT 0 + +#if CONNINFRA_RST_RATE_LIMIT +DEFINE_RATELIMIT_STATE(g_rs, HZ, 1); + +#define DUMP_LOG() if (__ratelimit(&g_rs)) \ + pr_info("rst is ongoing\n") + +#else +#define DUMP_LOG() +#endif + +struct conninfra_rst_data { + enum consys_drv_type drv; + char *reason; +}; + +struct conninfra_rst_data rst_data; + +void conninfra_get_emi_phy_addr(enum connsys_emi_type type, phys_addr_t* base, unsigned int *size) +{ + struct consys_emi_addr_info* addr_info = emi_mng_get_phy_addr(); + + switch (type) { + case CONNSYS_EMI_FW: + if (base) + *base = addr_info->emi_ap_phy_base; + + if (size) + *size = addr_info->fw_emi_size; + break; + + default: + pr_err("Wrong EMI type: %d\n", type); + if (base) + *base = 0x0; + + if (size) + *size = 0; + break; + } +} +EXPORT_SYMBOL(conninfra_get_emi_phy_addr); + +int conninfra_pwr_on(enum consys_drv_type drv_type) +{ + pr_info("[%s] drv=[%d]\n", __func__, drv_type); + + if (conninfra_core_is_rst_locking()) { + DUMP_LOG(); + return CONNINFRA_ERR_RST_ONGOING; + } + + return conninfra_core_power_on(drv_type); +} +EXPORT_SYMBOL(conninfra_pwr_on); + +int conninfra_pwr_off(enum consys_drv_type drv_type) +{ + if (conninfra_core_is_rst_locking()) { + DUMP_LOG(); + return CONNINFRA_ERR_RST_ONGOING; + } + + return conninfra_core_power_off(drv_type); +} +EXPORT_SYMBOL(conninfra_pwr_off); + +int conninfra_is_bus_hang(void) +{ + if (conninfra_core_is_rst_locking()) { + DUMP_LOG(); + return CONNINFRA_ERR_RST_ONGOING; + } + return conninfra_core_is_bus_hang(); +} +EXPORT_SYMBOL(conninfra_is_bus_hang); + +int conninfra_trigger_whole_chip_rst(enum consys_drv_type who, char *reason) +{ + /* use schedule worker to trigger ??? */ + /* so that function can be returned immediately */ + int r; + + r = conninfra_core_lock_rst(); + if (r >= CHIP_RST_START) { + /* reset is ongoing */ + pr_warn("r=[%d] chip rst is ongoing\n", r); + return 1; + } + pr_info("rst lock [%d] [%d] reason=%s\n", r, who, reason); + + conninfra_core_trg_chip_rst(who, reason); + + return 0; +} +EXPORT_SYMBOL(conninfra_trigger_whole_chip_rst); + +int conninfra_sub_drv_ops_register(enum consys_drv_type type, + struct sub_drv_ops_cb *cb) +{ + /* type validation */ + if (type < 0 || type >= CONNDRV_TYPE_MAX) { + pr_err("incorrect drv type [%d]\n", type); + return -EINVAL; + } + pr_info("----\n"); + conninfra_core_subsys_ops_reg(type, cb); + return 0; +} +EXPORT_SYMBOL(conninfra_sub_drv_ops_register); + +int conninfra_sub_drv_ops_unregister(enum consys_drv_type type) +{ + /* type validation */ + if (type < 0 || type >= CONNDRV_TYPE_MAX) { + pr_err("[%s] incorrect drv type [%d]\n", __func__, type); + return -EINVAL; + } + pr_info("----\n"); + conninfra_core_subsys_ops_unreg(type); + return 0; +} +EXPORT_SYMBOL(conninfra_sub_drv_ops_unregister); + +int conninfra_spi_read(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int *data) +{ + if (conninfra_core_is_rst_locking()) { + DUMP_LOG(); + return CONNINFRA_ERR_RST_ONGOING; + } + if (subsystem >= SYS_SPI_MAX) { + pr_err("wrong subsys %d\n", subsystem); + return -EINVAL; + } + conninfra_core_spi_read(subsystem, addr, data); + return 0; +} +EXPORT_SYMBOL(conninfra_spi_read); + +int conninfra_spi_write(enum sys_spi_subsystem subsystem, unsigned int addr, unsigned int data) +{ + if (conninfra_core_is_rst_locking()) { + DUMP_LOG(); + return CONNINFRA_ERR_RST_ONGOING; + } + + if (subsystem >= SYS_SPI_MAX) { + pr_err("wrong subsys %d\n", subsystem); + return -EINVAL; + } + conninfra_core_spi_write(subsystem, addr, data); + return 0; +} +EXPORT_SYMBOL(conninfra_spi_write); + +int conninfra_adie_top_ck_en_on(enum consys_drv_type type) +{ + if (conninfra_core_is_rst_locking()) { + DUMP_LOG(); + return CONNINFRA_ERR_RST_ONGOING; + } + + return conninfra_core_adie_top_ck_en_on(type); +} +EXPORT_SYMBOL(conninfra_adie_top_ck_en_on); + +int conninfra_adie_top_ck_en_off(enum consys_drv_type type) +{ + if (conninfra_core_is_rst_locking()) { + DUMP_LOG(); + return CONNINFRA_ERR_RST_ONGOING; + } + + return conninfra_core_adie_top_ck_en_off(type); +} +EXPORT_SYMBOL(conninfra_adie_top_ck_en_off); + +int conninfra_spi_clock_switch(enum connsys_spi_speed_type type) +{ + return conninfra_core_spi_clock_switch(type); +} +EXPORT_SYMBOL(conninfra_spi_clock_switch); + +int conninfra_debug_dump(void) +{ + return conninfra_core_debug_dump(); + +} +EXPORT_SYMBOL(conninfra_debug_dump); diff --git a/package/conninfra/src/src/conninfra_dev.c b/package/conninfra/src/src/conninfra_dev.c new file mode 100644 index 0000000..0f525dd --- /dev/null +++ b/package/conninfra/src/src/conninfra_dev.c @@ -0,0 +1,344 @@ +/* + * Copyright (C) 2016 MediaTek Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See http://www.gnu.org/licenses/gpl-2.0.html for more details. + */ +/*! \file +* \brief Declaration of library functions +* +* Any definitions in this file will be shared among GLUE Layer and internal Driver Stack. +*/ + +#include +#include +#include +#include +#include +#include +#include "conninfra.h" +#include "conninfra_core.h" +#include "consys_hw.h" +#include "emi_mng.h" + +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ + +#define CONNINFRA_DEV_MAJOR 164 +#define CONNINFRA_DEV_NUM 1 +#define CONNINFRA_DRVIER_NAME "conninfra_drv" +#define CONNINFRA_DEVICE_NAME "conninfra_dev" + +#define CONNINFRA_DEV_IOC_MAGIC 0xc2 +#define CONNINFRA_IOCTL_GET_CHIP_ID _IOR(CONNINFRA_DEV_IOC_MAGIC, 0, int) + +#define CONNINFRA_DEV_INIT_TO_MS (2 * 1000) + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ + +enum conninfra_init_status { + CONNINFRA_INIT_NOT_START, + CONNINFRA_INIT_START, + CONNINFRA_INIT_DONE, +}; +static int g_conninfra_init_status = CONNINFRA_INIT_NOT_START; +static wait_queue_head_t g_conninfra_init_wq; + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ +static int conninfra_dev_open(struct inode *inode, struct file *file); +static int conninfra_dev_close(struct inode *inode, struct file *file); +static ssize_t conninfra_dev_read(struct file *filp, char __user *buf, + size_t count, loff_t *f_pos); +static ssize_t conninfra_dev_write(struct file *filp, + const char __user *buf, size_t count, + loff_t *f_pos); +static long conninfra_dev_unlocked_ioctl( + struct file *filp, unsigned int cmd, unsigned long arg); +#ifdef CONFIG_COMPAT +static long conninfra_dev_compat_ioctl( + struct file *filp, unsigned int cmd, unsigned long arg); +#endif /* CONFIG_COMPAT */ + +static int conninfra_dev_suspend_cb(void); +static int conninfra_dev_resume_cb(void); +static int conninfra_dev_pmic_event_cb(unsigned int, unsigned int); +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +struct class *pConninfraClass; +struct device *pConninfraDev; +static struct cdev gConninfraCdev; + +const struct file_operations gConninfraDevFops = { + .open = conninfra_dev_open, + .release = conninfra_dev_close, + .read = conninfra_dev_read, + .write = conninfra_dev_write, + .unlocked_ioctl = conninfra_dev_unlocked_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = conninfra_dev_compat_ioctl, +#endif /* CONFIG_COMPAT */ +}; + +static int gConnInfraMajor = CONNINFRA_DEV_MAJOR; + +/* screen on/off notification */ + +static struct conninfra_dev_cb gConninfraDevCb = { + .conninfra_suspend_cb = conninfra_dev_suspend_cb, + .conninfra_resume_cb = conninfra_dev_resume_cb, + .conninfra_pmic_event_notifier = conninfra_dev_pmic_event_cb, +}; + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +int conninfra_dev_open(struct inode *inode, struct file *file) +{ + static DEFINE_RATELIMIT_STATE(_rs, HZ, 1); + + if (!wait_event_timeout(g_conninfra_init_wq, g_conninfra_init_status == CONNINFRA_INIT_DONE, + msecs_to_jiffies(CONNINFRA_DEV_INIT_TO_MS))) { + if (__ratelimit(&_rs)) { + pr_warn("wait_event_timeout (%d)ms,(%lu)jiffies,return -EIO\n", + CONNINFRA_DEV_INIT_TO_MS, msecs_to_jiffies(CONNINFRA_DEV_INIT_TO_MS)); + } + return -EIO; + } + + pr_info("open major %d minor %d (pid %d)\n", + imajor(inode), iminor(inode), current->pid); + + return 0; +} + +int conninfra_dev_close(struct inode *inode, struct file *file) +{ + pr_info("close major %d minor %d (pid %d)\n", + imajor(inode), iminor(inode), current->pid); + + return 0; +} + +ssize_t conninfra_dev_read(struct file *filp, char __user *buf, + size_t count, loff_t *f_pos) +{ + return 0; +} + +ssize_t conninfra_dev_write(struct file *filp, + const char __user *buf, size_t count, loff_t *f_pos) +{ + return 0; +} + +static long conninfra_dev_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + int retval = 0; + + pr_info("[%s] cmd (%d),arg(%ld)\n", __func__, cmd, arg); + switch (cmd) { + case CONNINFRA_IOCTL_GET_CHIP_ID: + retval = consys_hw_chipid_get(); + break; + } + return retval; + +} + +#ifdef CONFIG_COMPAT +static long conninfra_dev_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + long ret; + + pr_info("[%s] cmd (%d)\n", __func__, cmd); + ret = conninfra_dev_unlocked_ioctl(filp, cmd, arg); + return ret; +} +#endif /* CONFIG_COMPAT */ + +static int conninfra_dev_suspend_cb(void) +{ + return 0; +} + +static int conninfra_dev_resume_cb(void) +{ + conninfra_core_dump_power_state(); + return 0; +} + +static int conninfra_dev_pmic_event_cb(unsigned int id, unsigned int event) +{ + conninfra_core_pmic_event_cb(id, event); + + return 0; +} + +/************************************************************************/ + +static int conninfra_dev_init(void) +{ + dev_t devID = MKDEV(gConnInfraMajor, 0); + int cdevErr = -1; + int iret = 0; + + g_conninfra_init_status = CONNINFRA_INIT_START; + init_waitqueue_head((wait_queue_head_t *)&g_conninfra_init_wq); + + iret = register_chrdev_region(devID, CONNINFRA_DEV_NUM, CONNINFRA_DRVIER_NAME); + if (iret) { + pr_err("fail to register chrdev\n"); + g_conninfra_init_status = CONNINFRA_INIT_NOT_START; + return -1; + } + + cdev_init(&gConninfraCdev, &gConninfraDevFops); + gConninfraCdev.owner = THIS_MODULE; + + cdevErr = cdev_add(&gConninfraCdev, devID, CONNINFRA_DEV_NUM); + if (cdevErr) { + pr_err("cdev_add() fails (%d)\n", cdevErr); + goto err1; + } + + pConninfraClass = class_create(THIS_MODULE, CONNINFRA_DEVICE_NAME); + if (IS_ERR(pConninfraClass)) { + pr_err("class create fail, error code(%ld)\n", PTR_ERR(pConninfraClass)); + goto err1; + } + + pConninfraDev = device_create(pConninfraClass, NULL, devID, NULL, CONNINFRA_DEVICE_NAME); + if (IS_ERR(pConninfraDev)) { + pr_err("device create fail, error code(%ld)\n", PTR_ERR(pConninfraDev)); + goto err2; + } + + iret = mtk_conninfra_drv_init(&gConninfraDevCb); + if (iret) { + pr_err("init consys_hw fail, ret = %d\n", iret); + g_conninfra_init_status = CONNINFRA_INIT_NOT_START; + return -2; + } + + iret = conninfra_core_init(); + if (iret) { + pr_err("conninfra init fail\n"); + g_conninfra_init_status = CONNINFRA_INIT_NOT_START; + return -3; + } + + pr_info("ConnInfra Dev: init (%d)\n", iret); + g_conninfra_init_status = CONNINFRA_INIT_DONE; + +#ifdef CONFIG_CONNINFRA_AUTO_UP + iret = conninfra_core_power_on(CONNDRV_TYPE_CONNINFRA); + if (iret) { + pr_err("conninfra auto load power on fail\n"); + return -4; + } +#endif /* CONFIG_CONNINFRA_AUTO_UP */ + + return 0; + +err2: + + pr_err("[conninfra_dev_init] err2\n"); + if (pConninfraClass) { + class_destroy(pConninfraClass); + pConninfraClass = NULL; + } +err1: + pr_err("[conninfra_dev_init] err1\n"); + if (cdevErr == 0) + cdev_del(&gConninfraCdev); + + if (iret == 0) { + unregister_chrdev_region(devID, CONNINFRA_DEV_NUM); + gConnInfraMajor = -1; + } + + g_conninfra_init_status = CONNINFRA_INIT_NOT_START; + return -2; +} + +static void conninfra_dev_deinit(void) +{ + dev_t dev = MKDEV(gConnInfraMajor, 0); + int iret = 0; + +#ifdef CONFIG_CONNINFRA_AUTO_UP + iret = conninfra_core_power_off(CONNDRV_TYPE_CONNINFRA); + if (iret) { + pr_err("conninfra auto load power off fail\n"); + } +#endif /* CONFIG_CONNINFRA_AUTO_UP */ + + g_conninfra_init_status = CONNINFRA_INIT_NOT_START; + + iret = conninfra_core_deinit(); + + iret = mtk_conninfra_drv_deinit(); + + if (pConninfraDev) { + device_destroy(pConninfraClass, dev); + pConninfraDev = NULL; + } + + if (pConninfraClass) { + class_destroy(pConninfraClass); + pConninfraClass = NULL; + } + + cdev_del(&gConninfraCdev); + unregister_chrdev_region(dev, CONNINFRA_DEV_NUM); + + pr_info("ConnInfra: platform init (%d)\n", iret); +} + +module_init(conninfra_dev_init); +module_exit(conninfra_dev_deinit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Willy.Yu @ CTD/SE5/CS5"); + +module_param(gConnInfraMajor, uint, 0644); + diff --git a/package/kernel/leds-ws2812b/Makefile b/package/kernel/leds-ws2812b/Makefile new file mode 100644 index 0000000..50dfe9a --- /dev/null +++ b/package/kernel/leds-ws2812b/Makefile @@ -0,0 +1,33 @@ +# +# Copyright (C) 2008-2010 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/kernel.mk + +PKG_NAME:=leds-ws2812b +PKG_RELEASE:=1 +PKG_LICENSE:=GPL-2.0 + +include $(INCLUDE_DIR)/package.mk + +define KernelPackage/leds-ws2812b + SUBMENU:=LED modules + TITLE:=Worldsemi WS2812B (NeoPixel) LED support + FILES:= \ + $(PKG_BUILD_DIR)/leds-ws2812b.ko + AUTOLOAD:=$(call AutoProbe,leds-ws2812b,1) +endef + +define KernelPackage/leds-ws2812b/description + LED support for driving WS2812B (NeoPixel) using SPI MOSI. +endef + +define Build/Compile + $(KERNEL_MAKE) M="$(PKG_BUILD_DIR)" modules +endef + +$(eval $(call KernelPackage,leds-ws2812b)) diff --git a/package/kernel/leds-ws2812b/src/Makefile b/package/kernel/leds-ws2812b/src/Makefile new file mode 100644 index 0000000..718a9f7 --- /dev/null +++ b/package/kernel/leds-ws2812b/src/Makefile @@ -0,0 +1 @@ +obj-m := leds-ws2812b.o diff --git a/package/kernel/leds-ws2812b/src/leds-ws2812b.c b/package/kernel/leds-ws2812b/src/leds-ws2812b.c new file mode 100644 index 0000000..691240e --- /dev/null +++ b/package/kernel/leds-ws2812b/src/leds-ws2812b.c @@ -0,0 +1,240 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * WorldSemi WS2812B individually-addressable LED driver using SPI + * + * Copyright 2022 Chuanhong Guo + * + * This driver simulates WS2812B protocol using SPI MOSI pin. A one pulse + * is transferred as 3'b110 and a zero pulse is 3'b100. For this driver to + * work properly, the SPI frequency should be 2.105MHz~2.85MHz and it needs + * to transfer all the bytes continuously. + */ + +#include +#include +#include +#include +#include +#include +#include + +#define WS2812B_BYTES_PER_COLOR 3 +#define WS2812B_NUM_COLORS 3 +/* A continuous 0 for 50us+ as the 'reset' signal */ +#define WS2812B_RESET_LEN 14 + +struct ws2812b_led { + struct led_classdev_mc mc_cdev; + struct mc_subled subled[WS2812B_NUM_COLORS]; + int cascade; +}; + +struct ws2812b_priv { + struct led_classdev ldev; + struct spi_device *spi; + struct mutex mutex; + int num_leds; + size_t data_len; + u8 *data_buf; + struct ws2812b_led leds[]; +}; + +/** + * ws2812b_set_byte - convert a byte of data to 3-byte SPI data for pulses + * @priv: pointer to the private data structure + * @offset: offset of the target byte in the data stream + * @val: 1-byte data to be set + * + * WS2812B receives a stream of bytes from DI, takes the first 3 byte as LED + * brightness and pases the rest to the next LED through the DO pin. + * This function assembles a single byte of data to the LED: + * A bit is represented with a pulse of specific length. A long pulse is a 1 + * and a short pulse is a 0. + * SPI transfers data continuously, MSB first. We can send 3'b100 to create a + * 0 pulse and 3'b110 for a 1 pulse. In this way, a byte of data takes up 3 + * bytes in a SPI transfer: + * 1x0 1x0 1x0 1x0 1x0 1x0 1x0 1x0 + * Let's rearrange it in 8 bits: + * 1x01x01x 01x01x01 x01x01x0 + * The higher 3 bits, middle 2 bits and lower 3 bits are represented with the + * 1st, 2nd and 3rd byte in the SPI transfer respectively. + * There are only 8 combinations for 3 bits and 4 for 2 bits, so we can create + * a lookup table for the 3 bytes. + * e.g. For 0x6b -> 2'b01101011: + * Bit 7-5: 3'b011 -> 10011011 -> 0x9b + * Bit 4-3: 2'b01 -> 01001101 -> 0x4d + * Bit 2-0: 3'b011 -> 00110110 -> 0x36 + */ +static void ws2812b_set_byte(struct ws2812b_priv *priv, size_t offset, u8 val) +{ + /* The lookup table for Bit 7-5 4-3 2-0 */ + const u8 h3b[] = { 0x92, 0x93, 0x9a, 0x9b, 0xd2, 0xd3, 0xda, 0xdb }; + const u8 m2b[] = { 0x49, 0x4d, 0x69, 0x6d }; + const u8 l3b[] = { 0x24, 0x26, 0x34, 0x36, 0xa4, 0xa6, 0xb4, 0xb6 }; + u8 *p = priv->data_buf + WS2812B_RESET_LEN + (offset * WS2812B_BYTES_PER_COLOR); + + p[0] = h3b[val >> 5]; /* Bit 7-5 */ + p[1] = m2b[(val >> 3) & 0x3]; /* Bit 4-3 */ + p[2] = l3b[val & 0x7]; /* Bit 2-0 */ +} + +static int ws2812b_set(struct led_classdev *cdev, + enum led_brightness brightness) +{ + struct led_classdev_mc *mc_cdev = lcdev_to_mccdev(cdev); + struct ws2812b_led *led = + container_of(mc_cdev, struct ws2812b_led, mc_cdev); + struct ws2812b_priv *priv = dev_get_drvdata(cdev->dev->parent); + int ret; + int i; + + led_mc_calc_color_components(mc_cdev, brightness); + + mutex_lock(&priv->mutex); + for (i = 0; i < WS2812B_NUM_COLORS; i++) + ws2812b_set_byte(priv, led->cascade * WS2812B_NUM_COLORS + i, + led->subled[i].brightness); + ret = spi_write(priv->spi, priv->data_buf, priv->data_len); + mutex_unlock(&priv->mutex); + + return ret; +} + +static int ws2812b_probe(struct spi_device *spi) +{ + struct device *dev = &spi->dev; + int cur_led = 0; + struct ws2812b_priv *priv; + struct fwnode_handle *led_node; + int num_leds, i, cnt, ret; + + num_leds = device_get_child_node_count(dev); + + priv = devm_kzalloc(dev, struct_size(priv, leds, num_leds), GFP_KERNEL); + if (!priv) + return -ENOMEM; + priv->data_len = + num_leds * WS2812B_BYTES_PER_COLOR * WS2812B_NUM_COLORS + + WS2812B_RESET_LEN; + priv->data_buf = kzalloc(priv->data_len, GFP_KERNEL); + if (!priv->data_buf) + return -ENOMEM; + + for (i = 0; i < num_leds * WS2812B_NUM_COLORS; i++) + ws2812b_set_byte(priv, i, 0); + + mutex_init(&priv->mutex); + priv->num_leds = num_leds; + priv->spi = spi; + + device_for_each_child_node(dev, led_node) { + struct led_init_data init_data = { + .fwnode = led_node, + }; + /* WS2812B LEDs usually come with GRB color */ + u32 color_idx[WS2812B_NUM_COLORS] = { + LED_COLOR_ID_GREEN, + LED_COLOR_ID_RED, + LED_COLOR_ID_BLUE, + }; + + u32 color_intensity[WS2812B_NUM_COLORS] = { 255, 255, 255, }; + u32 cascade; + + ret = fwnode_property_read_u32(led_node, "reg", &cascade); + if (ret) { + dev_err(dev, "failed to obtain numerical LED index for %s", + fwnode_get_name(led_node)); + goto ERR_UNREG_LEDS; + } + if (cascade >= num_leds) { + dev_err(dev, "LED index of %s is larger than the number of LEDs.", + fwnode_get_name(led_node)); + ret = -EINVAL; + goto ERR_UNREG_LEDS; + } + + cnt = fwnode_property_count_u32(led_node, "color-index"); + if (cnt > 0 && cnt <= WS2812B_NUM_COLORS) + fwnode_property_read_u32_array(led_node, "color-index", + color_idx, (size_t)cnt); + + cnt = fwnode_property_count_u32(led_node, "color-intensity"); + if (cnt > 0 && cnt <= WS2812B_NUM_COLORS) + fwnode_property_read_u32_array(led_node, "color-intensity", + color_intensity, (size_t)cnt); + + priv->leds[cur_led].mc_cdev.subled_info = + priv->leds[cur_led].subled; + priv->leds[cur_led].mc_cdev.num_colors = WS2812B_NUM_COLORS; + priv->leds[cur_led].mc_cdev.led_cdev.max_brightness = 255; + priv->leds[cur_led].mc_cdev.led_cdev.brightness_set_blocking = ws2812b_set; + + for (i = 0; i < WS2812B_NUM_COLORS; i++) { + priv->leds[cur_led].subled[i].color_index = color_idx[i]; + priv->leds[cur_led].subled[i].intensity = color_intensity[i]; + } + + priv->leds[cur_led].cascade = cascade; + + ret = led_classdev_multicolor_register_ext( + dev, &priv->leds[cur_led].mc_cdev, &init_data); + if (ret) { + dev_err(dev, "registration of %s failed.", + fwnode_get_name(led_node)); + goto ERR_UNREG_LEDS; + } + cur_led++; + } + + spi_set_drvdata(spi, priv); + + return 0; +ERR_UNREG_LEDS: + for (; cur_led >= 0; cur_led--) + led_classdev_multicolor_unregister(&priv->leds[cur_led].mc_cdev); + mutex_destroy(&priv->mutex); + kfree(priv->data_buf); + return ret; +} + +static int ws2812b_remove(struct spi_device *spi) +{ + struct ws2812b_priv *priv = spi_get_drvdata(spi); + int cur_led; + + for (cur_led = priv->num_leds - 1; cur_led >= 0; cur_led--) + led_classdev_multicolor_unregister(&priv->leds[cur_led].mc_cdev); + kfree(priv->data_buf); + mutex_destroy(&priv->mutex); + + return 0; +} + +static const struct spi_device_id ws2812b_spi_ids[] = { + { "ws2812b" }, + {}, +}; +MODULE_DEVICE_TABLE(spi, ws2812b_spi_ids); + +static const struct of_device_id ws2812b_dt_ids[] = { + { .compatible = "worldsemi,ws2812b" }, + {}, +}; +MODULE_DEVICE_TABLE(of, ws2812b_dt_ids); + +static struct spi_driver ws2812b_driver = { + .probe = ws2812b_probe, + .remove = ws2812b_remove, + .id_table = ws2812b_spi_ids, + .driver = { + .name = KBUILD_MODNAME, + .of_match_table = ws2812b_dt_ids, + }, +}; + +module_spi_driver(ws2812b_driver); + +MODULE_AUTHOR("Chuanhong Guo "); +MODULE_DESCRIPTION("WS2812B LED driver using SPI"); +MODULE_LICENSE("GPL"); diff --git a/package/luci-app-upnp/Makefile b/package/luci-app-upnp/Makefile new file mode 100644 index 0000000..eb966e6 --- /dev/null +++ b/package/luci-app-upnp/Makefile @@ -0,0 +1,14 @@ +# +# Copyright (C) 2008-2014 The LuCI Team +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=Universal Plug & Play configuration module +LUCI_DEPENDS:=+miniupnpd + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/package/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js b/package/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js new file mode 100644 index 0000000..b5446ec --- /dev/null +++ b/package/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js @@ -0,0 +1,74 @@ +'use strict'; +'require baseclass'; +'require dom'; +'require rpc'; +'require uci'; + +var callUpnpGetStatus, callUpnpDeleteRule, handleDelRule; + +callUpnpGetStatus = rpc.declare({ + object: 'luci.upnp', + method: 'get_status', + expect: { } +}); + +callUpnpDeleteRule = rpc.declare({ + object: 'luci.upnp', + method: 'delete_rule', + params: [ 'token' ], + expect: { result : "OK" }, +}); + +handleDelRule = function(num, ev) { + dom.parent(ev.currentTarget, '.tr').style.opacity = 0.5; + ev.currentTarget.classList.add('spinning'); + ev.currentTarget.disabled = true; + ev.currentTarget.blur(); + callUpnpDeleteRule(num); +}; + +return baseclass.extend({ + title: _('Active UPnP Redirects'), + + load: function() { + return Promise.all([ + callUpnpGetStatus(), + ]); + }, + + render: function(data) { + + var table = E('table', { 'class': 'table', 'id': 'upnp_status_table' }, [ + E('tr', { 'class': 'tr table-titles' }, [ + E('th', { 'class': 'th' }, _('Protocol')), + E('th', { 'class': 'th' }, _('External Port')), + E('th', { 'class': 'th' }, _('Client Address')), + E('th', { 'class': 'th' }, _('Host')), + E('th', { 'class': 'th' }, _('Client Port')), + E('th', { 'class': 'th' }, _('Description')), + E('th', { 'class': 'th cbi-section-actions' }, '') + ]) + ]); + + var rules = Array.isArray(data[0].rules) ? data[0].rules : []; + + var rows = rules.map(function(rule) { + return [ + rule.proto, + rule.extport, + rule.intaddr, + rule.host_hint || _('Unknown'), + rule.intport, + rule.descr, + E('button', { + 'class': 'btn cbi-button-remove', + 'click': L.bind(handleDelRule, this, rule.num) + }, [ _('Delete') ]) + ]; + }); + + cbi_update_table(table, rows, E('em', _('There are no active redirects.'))); + + return table; + } +}); diff --git a/package/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js b/package/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js new file mode 100644 index 0000000..e0a326d --- /dev/null +++ b/package/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js @@ -0,0 +1,215 @@ +'use strict'; +'require view'; +'require dom'; +'require poll'; +'require uci'; +'require rpc'; +'require form'; + +var callInitAction, callUpnpGetStatus, callUpnpDeleteRule, handleDelRule; + +callInitAction = rpc.declare({ + object: 'luci', + method: 'setInitAction', + params: [ 'name', 'action' ], + expect: { result: false } +}); + +callUpnpGetStatus = rpc.declare({ + object: 'luci.upnp', + method: 'get_status', + expect: { } +}); + +callUpnpDeleteRule = rpc.declare({ + object: 'luci.upnp', + method: 'delete_rule', + params: [ 'token' ], + expect: { result : "OK" }, +}); + +handleDelRule = function(num, ev) { + dom.parent(ev.currentTarget, '.tr').style.opacity = 0.5; + ev.currentTarget.classList.add('spinning'); + ev.currentTarget.disabled = true; + ev.currentTarget.blur(); + callUpnpDeleteRule(num); +}; + +return view.extend({ + load: function() { + return Promise.all([ + callUpnpGetStatus(), + uci.load('upnpd') + ]); + }, + + poll_status: function(nodes, data) { + + var rules = Array.isArray(data[0].rules) ? data[0].rules : []; + + var rows = rules.map(function(rule) { + return [ + rule.proto, + rule.extport, + rule.intaddr, + rule.host_hint || _('Unknown'), + rule.intport, + rule.descr, + E('button', { + 'class': 'btn cbi-button-remove', + 'click': L.bind(handleDelRule, this, rule.num) + }, [ _('Delete') ]) + ]; + }); + + cbi_update_table(nodes.querySelector('#upnp_status_table'), rows, E('em', _('There are no active redirects.'))); + + return; + }, + + render: function(data) { + + var m, s, o; + + m = new form.Map('upnpd', [_('Universal Plug & Play')], + _('UPnP allows clients in the local network to automatically configure the router.')); + + s = m.section(form.GridSection, '_active_rules'); + + s.render = L.bind(function(view, section_id) { + var table = E('table', { 'class': 'table cbi-section-table', 'id': 'upnp_status_table' }, [ + E('tr', { 'class': 'tr table-titles' }, [ + E('th', { 'class': 'th' }, _('Protocol')), + E('th', { 'class': 'th' }, _('External Port')), + E('th', { 'class': 'th' }, _('Client Address')), + E('th', { 'class': 'th' }, _('Host')), + E('th', { 'class': 'th' }, _('Client Port')), + E('th', { 'class': 'th' }, _('Description')), + E('th', { 'class': 'th cbi-section-actions' }, '') + ]) + ]); + + var rules = Array.isArray(data[0].rules) ? data[0].rules : []; + + var rows = rules.map(function(rule) { + return [ + rule.proto, + rule.extport, + rule.intaddr, + rule.host_hint || _('Unknown'), + rule.intport, + rule.descr, + E('button', { + 'class': 'btn cbi-button-remove', + 'click': L.bind(handleDelRule, this, rule.num) + }, [ _('Delete') ]) + ]; + }); + + cbi_update_table(table, rows, E('em', _('There are no active redirects.'))); + + return E('div', { 'class': 'cbi-section cbi-tblsection' }, [ + E('h3', _('Active UPnP Redirects')), table ]); + }, o, this); + + s = m.section(form.NamedSection, 'config', 'upnpd', _('MiniUPnP settings')); + s.addremove = false; + s.tab('general', _('General Settings')); + s.tab('advanced', _('Advanced Settings')); + + o = s.taboption('general', form.Flag, 'enabled', _('Start UPnP and NAT-PMP service')); + o.rmempty = false; + + s.taboption('general', form.Flag, 'enable_upnp', _('Enable UPnP functionality')).default = '1' + s.taboption('general', form.Flag, 'enable_natpmp', _('Enable NAT-PMP functionality')).default = '1' + + s.taboption('general', form.Flag, 'secure_mode', _('Enable secure mode'), + _('Allow adding forwards only to requesting ip addresses')).default = '1' + + s.taboption('general', form.Flag, 'igdv1', _('Enable IGDv1 mode'), + _('Advertise as IGDv1 device instead of IGDv2')).default = '0' + + s.taboption('general', form.Flag, 'log_output', _('Enable additional logging'), + _('Puts extra debugging information into the system log')) + + s.taboption('general', form.Value, 'download', _('Downlink'), + _('Value in KByte/s, informational only')).rmempty = true + + s.taboption('general', form.Value, 'upload', _('Uplink'), + _('Value in KByte/s, informational only')).rmempty = true + + o = s.taboption('general', form.Value, 'port', _('Port')) + o.datatype = 'port' + o.default = 5000 + + s.taboption('advanced', form.Flag, 'system_uptime', _('Report system instead of daemon uptime')).default = '1' + + s.taboption('advanced', form.Value, 'uuid', _('Device UUID')) + s.taboption('advanced', form.Value, 'serial_number', _('Announced serial number')) + s.taboption('advanced', form.Value, 'model_number', _('Announced model number')) + + o = s.taboption('advanced', form.Value, 'notify_interval', _('Notify interval')) + o.datatype = 'uinteger' + o.placeholder = 30 + + o = s.taboption('advanced', form.Value, 'clean_ruleset_threshold', _('Clean rules threshold')) + o.datatype = 'uinteger' + o.placeholder = 20 + + o = s.taboption('advanced', form.Value, 'clean_ruleset_interval', _('Clean rules interval')) + o.datatype = 'uinteger' + o.placeholder = 600 + + o = s.taboption('advanced', form.Value, 'presentation_url', _('Presentation URL')) + o.placeholder = 'http://192.168.1.1/' + + o = s.taboption('advanced', form.Value, 'upnp_lease_file', _('UPnP lease file')) + o.placeholder = '/var/run/miniupnpd.leases' + + s.taboption('advanced', form.Flag, 'use_stun', _('Use STUN')) + + o = s.taboption('advanced', form.Value, 'stun_host', _('STUN Host')) + o.depends('use_stun', '1'); + o.datatype = 'host' + + o = s.taboption('advanced', form.Value, 'stun_port', _('STUN Port')) + o.depends('use_stun', '1'); + o.datatype = 'port' + o.placeholder = '0-65535' + + s = m.section(form.GridSection, 'perm_rule', _('MiniUPnP ACLs'), + _('ACLs specify which external ports may be redirected to which internal addresses and ports')) + + s.sortable = true + s.anonymous = true + s.addremove = true + + s.option(form.Value, 'comment', _('Comment')) + + o = s.option(form.Value, 'ext_ports', _('External ports')) + o.datatype = 'portrange' + o.placeholder = '0-65535' + + o = s.option(form.Value, 'int_addr', _('Internal addresses')) + o.datatype = 'ip4addr' + o.placeholder = '0.0.0.0/0' + + o = s.option(form.Value, 'int_ports', _('Internal ports')) + o.datatype = 'portrange' + o.placeholder = '0-65535' + + o = s.option(form.ListValue, 'action', _('Action')) + o.value('allow') + o.value('deny') + + return m.render().then(L.bind(function(m, nodes) { + poll.add(L.bind(function() { + return Promise.all([ + callUpnpGetStatus() + ]).then(L.bind(this.poll_status, this, nodes)); + }, this), 5); + return nodes; + }, this, m)); + } +}); diff --git a/package/luci-app-upnp/po/ar/upnp.po b/package/luci-app-upnp/po/ar/upnp.po new file mode 100644 index 0000000..93c2fab --- /dev/null +++ b/package/luci-app-upnp/po/ar/upnp.po @@ -0,0 +1,230 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-19 19:36+0200\n" +"PO-Revision-Date: 2021-03-04 13:50+0000\n" +"Last-Translator: Said Zakaria \n" +"Language-Team: Arabic \n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" +"X-Generator: Weblate 4.5.1-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "إجراء" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "إعدادات متقدمة" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "تعليق" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "احدÙ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "الوصÙ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "الاعدادات العامة" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "ضيÙ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "Ø§Ù„Ù…Ù†ÙØ°" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "بروتوكول" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "" + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "مجهول" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "" diff --git a/package/luci-app-upnp/po/bg/upnp.po b/package/luci-app-upnp/po/bg/upnp.po new file mode 100644 index 0000000..95fc7b4 --- /dev/null +++ b/package/luci-app-upnp/po/bg/upnp.po @@ -0,0 +1,229 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-19 19:36+0200\n" +"PO-Revision-Date: 2021-09-27 22:36+0000\n" +"Last-Translator: Iskren Mihaylov \n" +"Language-Team: Bulgarian \n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.9-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "ДейÑтвие" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Разширени наÑтройки" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Коментар" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "Изтрий" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "ОпиÑание" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "ОÑновни наÑтройки" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Протокол" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "" + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "" diff --git a/package/luci-app-upnp/po/bn_BD/upnp.po b/package/luci-app-upnp/po/bn_BD/upnp.po new file mode 100644 index 0000000..ad3b17f --- /dev/null +++ b/package/luci-app-upnp/po/bn_BD/upnp.po @@ -0,0 +1,229 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-19 19:36+0200\n" +"PO-Revision-Date: 2021-10-08 18:54+0000\n" +"Last-Translator: Rayhan Nabi \n" +"Language-Team: Bengali (Bangladesh) \n" +"Language: bn_BD\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.9-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "উনà§à¦¨à¦¤ সেটিংস" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "বরà§à¦£à¦¨à¦¾" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "সাধারণ সেটিংস" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "পোরà§à¦Ÿ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "পà§à¦°à§‹à¦Ÿà§‹à¦•ল" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "" + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "অজানা" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "" diff --git a/package/luci-app-upnp/po/ca/upnp.po b/package/luci-app-upnp/po/ca/upnp.po new file mode 100644 index 0000000..f604675 --- /dev/null +++ b/package/luci-app-upnp/po/ca/upnp.po @@ -0,0 +1,235 @@ +# upnp.pot +# generated from ./applications/luci-upnp/luasrc/i18n/upnp.en.lua +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-06-10 03:40+0200\n" +"PO-Revision-Date: 2021-09-17 06:52+0000\n" +"Last-Translator: Roger Pueyo Centelles \n" +"Language-Team: Catalan \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.9-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" +"Els ACL especifiquen quins ports externs es poden redirigir a quines adreces " +"i ports interns" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "Acció" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "Redireccions UPnP actives" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Configuració avançada" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "Permet que s'afegeixin redireccions només a les adreces IP peticionant" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "Número de model anunciat" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "Número de sèrie anunciat" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "Interval de neteja de regles" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "Llindar de neteja de regles" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "Adreça de client" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "Port de client" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Commentari" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "Suprimeix" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "Descripció" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "UUID de dispositiu" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "Enllaç de baixada" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "Habilita la funcionalitat NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "Habilita la funcionalitat UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "Habilita el registre addicional" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "Habilita mode segur" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "Port extern" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "Ports externs" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "Paràmetres generals" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "Amfitrió" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "Adreces internes" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "Ports interns" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "ACLs de MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "Ajusts de MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "Interval de notificació" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "Port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Protocol" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "Posa informació extra de depuració en el registre de sistema" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "Reporta el temps actiu del sistema en lloc del del dimoni" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "Inicia el servei UPnP i NAP-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "No hi ha redireccions actives." + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" +"UPnP permet als clients de la xarxa local configurar automàticament el " +"router." + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "Fitxer d'arrendament UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "Universal Plug & Play" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "Desconegut" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "Enllaç de pujada" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "Valor en KByte/s, només per informació" diff --git a/package/luci-app-upnp/po/cs/upnp.po b/package/luci-app-upnp/po/cs/upnp.po new file mode 100644 index 0000000..33019b8 --- /dev/null +++ b/package/luci-app-upnp/po/cs/upnp.po @@ -0,0 +1,230 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2020-10-27 21:26+0000\n" +"Last-Translator: Lukas Jelinek \n" +"Language-Team: Czech \n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Weblate 4.3.2-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" +"ACL stanovují, které vnÄ›jší porty by mÄ›ly být pÅ™esmÄ›rovány na které vnitÅ™ní " +"adresy a porty" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "Akce" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "Aktivní pÅ™esmÄ›rování UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "PokroÄilá nastavení" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "Inzerovat jako IGDv1 zařízení místo IGDv2" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "Povolit pÅ™esmÄ›rování pouze na dotazující ip adresy" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "Oznámené Äíslo modelu" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "Oznámené sériové Äíslo" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "Interval ÄiÅ¡tÄ›ní pravidel" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "Práh ÄiÅ¡tÄ›ní pravidel" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "Adresa klienta" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "Port klienta" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Komentář" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "Odstranit" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "Popis" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "UUID zařízení" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "Downlink" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "Povolit režim IGDv1" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "Povolit funkÄnost NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "Povolit funkÄnost UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "Povolit přídavné logování" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "Povolit bezpeÄný režim" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "VnÄ›jší port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "VnÄ›jší porty" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "Obecná nastavení" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "Hostitel" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "VnitÅ™ní adresy" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "VnitÅ™ní porty" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "MiniUPnP ACL listy" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "Nastavení MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "Interval oznamování" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "Port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "PrezentaÄní URL" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Protokol" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "Vypisovat extra ladící informace do systémového záznamu" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "Hlásit uptime systému namísto uptime daemonu" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "Spustit službu UPnP a NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "Neexistují žádná aktivní pÅ™esmÄ›rování." + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" +"UPnP umožňuje klientům v místní síti automaticky nakonfigurovat router." + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "Soubor UPnP výpůjÄek" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "Univerzální Plug & Play" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "Neznámé" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "Uplink" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "Pouze informaÄní hodnoty (v KByte/s)" diff --git a/package/luci-app-upnp/po/da/upnp.po b/package/luci-app-upnp/po/da/upnp.po new file mode 100644 index 0000000..d554ed0 --- /dev/null +++ b/package/luci-app-upnp/po/da/upnp.po @@ -0,0 +1,233 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-19 19:36+0200\n" +"PO-Revision-Date: 2021-11-13 08:12+0000\n" +"Last-Translator: drax red \n" +"Language-Team: Danish \n" +"Language: da\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.9.1-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" +"ACL'er angiver, hvilke eksterne porte der kan omdirigeres til hvilke interne " +"adresser og porte" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "Handling" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "Aktive UPnP-omdirigeringer" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Avancerede indstillinger" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "Annoncerer som IGDv1-enhed i stedet for IGDv2" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "Tillad kun at tilføje viderestillinger til ip-adresser, der anmoder om" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "Annonceret modelnummer" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "Annonceret serienummer" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "Interval for rene regler" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "Tærskel for rene regler" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "Klient adresse" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "Klient port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Kommentar" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "Slet" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "Beskrivelse" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "Enhedens UUID" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "Downlink" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "Aktiver IGDv1-tilstand" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "Aktiver NAT-PMP-funktionalitet" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "Aktiver UPnP-funktionalitet" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "Aktiver yderligere logning" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "Aktiver sikker tilstand" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "Ekstern port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "Eksterne porte" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "Generelle indstillinger" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "Giv adgang til upnp-procedurer" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "Vært" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "Interne adresser" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "Interne porte" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "MiniUPnP ACL'er" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "MiniUPnP-indstillinger" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "Underretningsinterval" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "Port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "URL til præsentation" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Protokol" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "Sætter ekstra fejlfindingsoplysninger i systemloggen" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "Rapportere system i stedet for dæmonens oppetid" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "STUN vært" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "STUN Port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "Start UPnP- og NAT-PMP-tjenesten" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "Der er ingen aktive omdirigeringer." + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" +"UPnP gør det muligt for klienter i det lokale netværk at konfigurere " +"routeren automatisk." + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "UPnP-lease-fil" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "Universelt plug &play" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "Ukendt" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "Uplink" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "Brug STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "Værdi i KByte/s, kun til information" diff --git a/package/luci-app-upnp/po/de/upnp.po b/package/luci-app-upnp/po/de/upnp.po new file mode 100644 index 0000000..9b0af23 --- /dev/null +++ b/package/luci-app-upnp/po/de/upnp.po @@ -0,0 +1,233 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-26 17:57+0200\n" +"PO-Revision-Date: 2022-02-24 06:56+0000\n" +"Last-Translator: ssantos \n" +"Language-Team: German \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.11-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" +"ACLs definieren, welche externen Ports zu welchen internen Adressen und " +"Ports weitergeleitet werden dürfen" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "Aktion" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "Aktive UPnP-Weiterleitungen" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Erweiterte Einstellungen" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "Als IGDv1-Gerät anstelle von IGDv2 bekanntgeben" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "Nur Weiterleitungen zurück zum anfordernden Client zulassen" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "Angekündigte Modellnummer" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "Angekündigte Seriennummer" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "Aufräumintervall für Weiterleitungen" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "Aufräumschwellenwert für Weiterleitungen" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "Clientadresse" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "Clientport" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Kommentar" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "Löschen" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "Beschreibung" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "Geräte-UUID" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "Download-Bandbreite" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "IGDv1 Modus aktivieren" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "NAT-PMP Funktionalität aktivieren" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "UPnP Funktionalität aktivieren" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "Erweiterte Protokollierung aktivieren" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "Sicheren Modus aktivieren" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "Externer Port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "Externe Ports" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "Allgemeine Einstellungen" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "Zugriff auf UPNP-Prozeduren gewähren" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "Host" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "Interne Adressen" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "Interne Ports" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "ACLs der MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "MiniUPnP-Einstellungen" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "Benachrichtigungsintervall" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "Port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "Präsentations-URL" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Protokoll" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "Schreibt zusätzliche Debug-Informationen in das Systemprotokoll" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "Systemlaufzeit statt Prozesslaufzeit melden" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "STUN-Host" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "STUN-Port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "UPnP und NAT-PMP Dienst starten" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "Es gibt keine aktiven Weiterleitungen." + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" +"UPnP erlaubt es Clients im lokalen Netzwerk automatisch Port-Weiterleitungen " +"auf diesem Router einzurichten." + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "UPnP Lease-Datei" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "Universal Plug & Play" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "Unbekannt" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "Uplink" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "STUN verwenden" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "Wert in Kilobyte/s, nur informativ" diff --git a/package/luci-app-upnp/po/el/upnp.po b/package/luci-app-upnp/po/el/upnp.po new file mode 100644 index 0000000..555949c --- /dev/null +++ b/package/luci-app-upnp/po/el/upnp.po @@ -0,0 +1,229 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-28 02:08+0200\n" +"PO-Revision-Date: 2022-10-03 08:34+0000\n" +"Last-Translator: TakissX \n" +"Language-Team: Greek \n" +"Language: el\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.14.1\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "ΔÏάση" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Ρυθμίσεις για Ï€ÏοχωÏημένους" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Σχόλιο" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "ΠεÏιγÏαφή" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "Γενικές Ïυθμίσεις" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "ΘÏÏα" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "ΠÏωτόκολλο" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "" + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "" diff --git a/package/luci-app-upnp/po/en/upnp.po b/package/luci-app-upnp/po/en/upnp.po new file mode 100644 index 0000000..ca74fd0 --- /dev/null +++ b/package/luci-app-upnp/po/en/upnp.po @@ -0,0 +1,229 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-19 19:36+0200\n" +"PO-Revision-Date: 2021-06-24 10:23+0000\n" +"Last-Translator: Hannu Nyman \n" +"Language-Team: English \n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.7.1-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Advanced Settings" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "Downlink" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "Enable secure mode" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "Port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "" + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "Universal Plug & Play" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "Uplink" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "" diff --git a/package/luci-app-upnp/po/es/upnp.po b/package/luci-app-upnp/po/es/upnp.po new file mode 100644 index 0000000..5fc0081 --- /dev/null +++ b/package/luci-app-upnp/po/es/upnp.po @@ -0,0 +1,233 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-06-10 03:41+0200\n" +"PO-Revision-Date: 2020-11-15 19:47+0000\n" +"Last-Translator: Franco Castillo \n" +"Language-Team: Spanish \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.4-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" +"Los ACL especifican qué puertos externos pueden ser redirigidos hacia qué " +"direcciones y puertos internos" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "Acción" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "Redirecciones UPnP activas" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Configuración avanzada" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "Anunciarse como dispositivo IGDv1 en lugar de IGDv2" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "Permitir añadir redirecciones sólo a IPs que lo soliciten" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "Número de modelo declarado" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "Número de serie declarado" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "Intervalo de borrado de reglas" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "Umbral de borrado de reglas" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "Dirección del cliente" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "Puerto del cliente" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Comentario" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "Eliminar" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "Descripción" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "UUID del dispositivo" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "Enlace descendente" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "Activar modo IGDv1" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "Activar la funcionalidad NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "Activar la funcionalidad UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "Activar registro adicional" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "Activar modo seguro" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "Puerto externo" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "Puertos externos" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "Configuración general" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "Conceder acceso a los procedimientos de upnp" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "Host" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "Direcciones internas" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "Puertos internos" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "ACLs MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "Configuración MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "Intervalo de notificación" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "Puerto" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "URL de presentación" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Protocolo" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "Escribe información de depuración extra en el registro del sistema" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "Informar del tiempo activo del sistema en vez de el del demonio" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "Host STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "Puerto STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "Iniciar servicio UPnP y NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "Sin redirecciones activas." + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" +"UPnP permite a los clientes en la red local configurar automáticamente el " +"enrutador." + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "Tiempo de conexión UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "Plug & Play universal" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "Desconocido" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "Enlace ascendente" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "Utilice STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "Valor en KBytes/s (sólo informativo)" diff --git a/package/luci-app-upnp/po/fi/upnp.po b/package/luci-app-upnp/po/fi/upnp.po new file mode 100644 index 0000000..210d355 --- /dev/null +++ b/package/luci-app-upnp/po/fi/upnp.po @@ -0,0 +1,229 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-19 19:36+0200\n" +"PO-Revision-Date: 2022-04-21 23:00+0000\n" +"Last-Translator: Jiri Grönroos \n" +"Language-Team: Finnish \n" +"Language: fi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.12-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "Toiminta" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "Aktiivise UPnP-uudelleenohjaukset" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Lisäasetukset" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Kommentti" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "Poista" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "Kuvaus" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "Laitteen UUID" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "Käytä IGDv1-tilaa" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "Käytä NAT-PMP-toiminnallisuutta" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "Käytä UPnP-toiminnallisuutta" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "Ulkoinen portti" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "Ulkoiset portit" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "Yleiset asetukset" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "Palvelin" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "Sisäiset osoitteet" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "Sisäiset portit" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "MiniUPnP-asetukset" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "Ilmoitusväli" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "Portti" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Protokolla" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "Käynnistä UPnP- ja NAT-PMP-palvelu" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "Ei aktiivisia uudelleenohjauksia." + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "UPnP-lainatiedosto" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "Tuntematon" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "Lähetysyhteys" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "Käytä STUN:ia" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "" diff --git a/package/luci-app-upnp/po/fr/upnp.po b/package/luci-app-upnp/po/fr/upnp.po new file mode 100644 index 0000000..ba3a058 --- /dev/null +++ b/package/luci-app-upnp/po/fr/upnp.po @@ -0,0 +1,236 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-19 19:36+0200\n" +"PO-Revision-Date: 2022-02-04 18:56+0000\n" +"Last-Translator: ButterflyOfFire \n" +"Language-Team: French \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.11-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" +"Les ACLs définissent quels ports externes peuvent être redirigés, vers " +"quelles adresses et ports internes" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "Action" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "Redirections UPnP actives" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Paramètres avancés" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "Annoncer comme dispositif IGDv1 au lieu de IGDv2" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "" +"Permet d'ajouter des redirections seulement vers les adresses IP qui font " +"des demandes" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "Numéro de modèle annoncé" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "Numéro de série annoncé" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "Intervalle des règles de nettoyage" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "Niveau des règles de nettoyage" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "Adresse du client" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "Port du client" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Commentaire" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "Effacer" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "Description" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "UUID du périphérique" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "Liaison descendante" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "Activer le mode IGDv1" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "Activer la fonctionnalité NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "Activer la fonctionnalité UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "Activer la journalisation additionnelle" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "Activer le mode sécurisé" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "Port externe" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "Ports externes" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "Paramètres généraux" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "Accorder l'accès aux procédures de upnp" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "Hôte" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "Adresses internes" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "Ports internes" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "ACLs MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "Paramètres MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "Intervalle de notification" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "Port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "URL de présentation" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Protocole" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "Rajoute des informations de debug dans le journal-système" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "" +"Indiquer la durée de fonctionnement du système plutôt que celle du démon UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "Hôte STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "Port STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "Démarrer les services UPnP et NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "Il n'y a pas de redirections actives." + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" +"UPnP permet à des clients du réseau local de configurer automatiquement le " +"routeur." + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "Fichier des baux UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "Plug & Play universel" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "Inconnue" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "Liaison montante" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "Utiliser STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "Valeur en Ko/s, pour information seulement" diff --git a/package/luci-app-upnp/po/he/upnp.po b/package/luci-app-upnp/po/he/upnp.po new file mode 100644 index 0000000..c072107 --- /dev/null +++ b/package/luci-app-upnp/po/he/upnp.po @@ -0,0 +1,227 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2021-01-15 22:31+0000\n" +"Last-Translator: Yaron Shahrabani \n" +"Language-Team: Hebrew \n" +"Language: he\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Weblate 4.5-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "הגדרות מתקדמות" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "תי×ור" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "פתחה" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "" + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "" diff --git a/package/luci-app-upnp/po/hi/upnp.po b/package/luci-app-upnp/po/hi/upnp.po new file mode 100644 index 0000000..63cadd6 --- /dev/null +++ b/package/luci-app-upnp/po/hi/upnp.po @@ -0,0 +1,227 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-19 19:36+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: hi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Translate Toolkit 1.1.1\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "" + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "" diff --git a/package/luci-app-upnp/po/hu/upnp.po b/package/luci-app-upnp/po/hu/upnp.po new file mode 100644 index 0000000..83a1155 --- /dev/null +++ b/package/luci-app-upnp/po/hu/upnp.po @@ -0,0 +1,233 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2021-08-12 12:55+0000\n" +"Last-Translator: Tudós Péter \n" +"Language-Team: Hungarian \n" +"Language: hu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.8-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" +"Az ACL-ek határozzák meg, hogy melyik külsÅ‘ portok melyik belsÅ‘ portokra és " +"címekre kerülhetnek továbbításra" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "Művelet" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "Aktív UPnP átirányítások" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Haladó Beállítások" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "Hirdetés IGDv1 eszközként IGDv2 helyett" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "" +"Kizárólag a kérést küldÅ‘ IP címre történÅ‘ továbbítás hozzáadásának " +"engedélyezése" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "Bejelentett modellszám" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "Bejelentett sorozatszám" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "Szabály törlési idÅ‘köz" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "Szabály törlési küszöbérték" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "Ügyfél cím" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "Ügyfél port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Megjegyzés" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "Törlés" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "Leírás" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "Eszköz UUID" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "Befelé jövÅ‘ kapcsolat" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "IGDv1 mód engedélyezése" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "NAT-PMP funkció engedélyezése" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "UPnP funkció engedélyezése" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "További naplózás engedélyezése" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "Biztonságos mód engedélyezése" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "KülsÅ‘ port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "KülsÅ‘ portok" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "Ãltalános Beállítások" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "Gép" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "BelsÅ‘ címek" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "BelsÅ‘ portok" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "MiniUPnP ACL-ek" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "MiniUPnP beállítások" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "Értesítési idÅ‘köz" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "Port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "Bemutató URL" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Protokol" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "További hibakeresési információkat tesz a rendszernaplóba" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "A démon helyett a rendszer működési idejét jeleníti meg" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "UPnP és NAT-PMP szolgáltatás elindítása" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "Nincsenek aktív átírányítások." + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" +"Az UPnP lehetÅ‘vé teszi a hálózatban lévÅ‘ ügyfelek számára hogy automatikusan " +"beállítsák a routert." + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "UPnP bérlet fájl" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "Univerzális Plug and Play" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "Ismeretlen" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "Kifelé menÅ‘ kapcsolat" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "Érték KByte/s-ban, csak tájékoztató jellegű" diff --git a/package/luci-app-upnp/po/it/upnp.po b/package/luci-app-upnp/po/it/upnp.po new file mode 100644 index 0000000..eaa0700 --- /dev/null +++ b/package/luci-app-upnp/po/it/upnp.po @@ -0,0 +1,233 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-19 19:36+0200\n" +"PO-Revision-Date: 2022-02-18 20:58+0000\n" +"Last-Translator: pisquan8 \n" +"Language-Team: Italian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.11-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" +"Le ACL specificano quali porte esterne possono essere redirezionate a quali " +"indirizzi e porte interni" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "Azione" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "Attiva reindirizzamento UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Impostazioni Avanzate" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "Pubblicizza come dispositivo IGDv1 anziché IGDv2" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "Permetti l'aggiunta della mappatura solo agli indirizzi IP richiedenti" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "Numero modello annunciato" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "Numero seriale annunciato" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "Cancella le regole" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "Pulisci le regole degli eventi" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "Indirizzo IP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "Porta" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Commento" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "Elimina" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "Descrizione" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "UUID del dispositivo" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "Downlink" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "Abilita modalità IGDv1" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "Abilita il protocollo NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "Abilita il protocollo UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "Abilita log addizionale" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "Abilita la modalità sicura" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "Porta Esterna" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "Porte Esterne" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "Impostazioni Generali" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "Concedere l'accesso alle procedure upnp" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "Host" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "Indirizzi Interni" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "Porte Interne" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "ACL MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "Opzioni di MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "Intervallo di notifica" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "Porta" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "URL di presentazione" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Protocollo" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "Scrivi nel log di sistema le informazioni di extra debugging" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "Mostra l'uptime del sistema invece del demone" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "Host STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "Porta STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "Avvia il servizo UPnP e NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "Non ci sono mappature attive." + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" +"UPnP permette ai dispositivi nella rete locale di configurare " +"automaticamente il router." + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "File di leasing UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "Plug & Play universale" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "Sconosciuto" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "Uplink" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "Usare STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "Valori in KByte/s, (informativo)" diff --git a/package/luci-app-upnp/po/ja/upnp.po b/package/luci-app-upnp/po/ja/upnp.po new file mode 100644 index 0000000..c8ca9a2 --- /dev/null +++ b/package/luci-app-upnp/po/ja/upnp.po @@ -0,0 +1,233 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-19 19:36+0200\n" +"PO-Revision-Date: 2021-02-07 07:33+0000\n" +"Last-Translator: Satoru Yoshida \n" +"Language-Team: Japanese \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.5-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" +"アクセス制御リスト(ACL)ã¯ã€ã©ã®å¤–部ãƒãƒ¼ãƒˆã‹ã‚‰ã©ã®å†…部アドレスåŠã³ãƒãƒ¼ãƒˆã¸ãƒª" +"ダイレクトã™ã‚‹ã‹ã‚’設定ã—ã¾ã™ã€‚" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "アクション" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "稼åƒä¸­ã®UPnPリダイレクト" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "詳細設定" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "IGDv2 ã§ã¯ãªã IGDv1 デãƒã‚¤ã‚¹ã¨ã—ã¦ã‚¢ãƒ‰ãƒã‚¿ã‚¤ã‚º" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "è¦æ±‚å…ƒIPアドレスã¸ã®è»¢é€ã®ã¿ã€è¿½åŠ ã‚’è¨±å¯ã—ã¾ã™ã€‚" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "通知ã™ã‚‹ãƒ¢ãƒ‡ãƒ«ç•ªå·" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "通知ã™ã‚‹ã‚·ãƒªã‚¢ãƒ«ç•ªå·" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "ルール消去間隔" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "ルール消去ã—ãã„値" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "クライアント・アドレス" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "クライアント・ãƒãƒ¼ãƒˆ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "コメント" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "削除" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "説明" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "デãƒã‚¤ã‚¹ UUID" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "ダウンリンク" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "IGDv1 モードを有効化" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "NAT-PMP機能を有効ã«ã™ã‚‹" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "UPnP機能を有効ã«ã™ã‚‹" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "ログ機能を有効ã«ã™ã‚‹" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "セキュアモードを有効ã«ã™ã‚‹" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "外部ãƒãƒ¼ãƒˆ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "外部ãƒãƒ¼ãƒˆ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "一般設定" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "upnp プロシージャã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "ホスト" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "内部アドレス" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "内部ãƒãƒ¼ãƒˆ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "MiniUPnPアクセス制御リスト(ACL)" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "MiniUPnP 設定" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "通知間隔" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "ãƒãƒ¼ãƒˆ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "プレゼンテーションURL" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "プロトコル" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "追加ã®ãƒ‡ãƒãƒƒã‚°æƒ…å ±ã‚’ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°ã¸æŒ¿å…¥ã™ã‚‹" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "サービスã®èµ·å‹•時間ã®ä»£ã‚りã«ã‚·ã‚¹ãƒ†ãƒ ã®èµ·å‹•時間を使用ã™ã‚‹" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "STUN ホスト" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "STUN ãƒãƒ¼ãƒˆ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "UPnPåŠã³NAT-PMPサービスを開始ã™ã‚‹" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "有効ãªãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã¯ã‚りã¾ã›ã‚“。" + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" +"UPnPを使用ã™ã‚‹ã“ã¨ã§ã€ãƒ­ãƒ¼ã‚«ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å†…ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒè‡ªå‹•çš„ã«ãƒ«ãƒ¼ã‚¿ã‚’" +"æ§‹æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "UPnP リースファイル" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "ユニãƒãƒ¼ã‚µãƒ« プラグ & プレイ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "䏿˜Ž" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "アップリンク" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "STUN を使用" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "クライアントã¸ã®æƒ…å ±æä¾›ã®ã¿ã«ä½¿ç”¨ã•れるã€KByte/sã®å€¤ã§ã™ã€‚" diff --git a/package/luci-app-upnp/po/ko/upnp.po b/package/luci-app-upnp/po/ko/upnp.po new file mode 100644 index 0000000..e494069 --- /dev/null +++ b/package/luci-app-upnp/po/ko/upnp.po @@ -0,0 +1,229 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-19 19:36+0200\n" +"PO-Revision-Date: 2022-12-27 13:49+0000\n" +"Last-Translator: somni \n" +"Language-Team: Korean \n" +"Language: ko\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.15.1-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "ì•¡ì…˜" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "고급 설정" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "메모" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "ì‚­ì œ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "설명" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "기본 설정" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "í¬íЏ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "프로토콜" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "" + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "" diff --git a/package/luci-app-upnp/po/mr/upnp.po b/package/luci-app-upnp/po/mr/upnp.po new file mode 100644 index 0000000..c2eb0e2 --- /dev/null +++ b/package/luci-app-upnp/po/mr/upnp.po @@ -0,0 +1,229 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-19 19:36+0200\n" +"PO-Revision-Date: 2020-02-07 09:18+0000\n" +"Last-Translator: Prachi Joshi \n" +"Language-Team: Marathi \n" +"Language: mr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.11-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "पà¥à¤°à¤—त सेटिंगà¥à¤œ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "टिपà¥à¤ªà¤£à¥€" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "हटवा" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "वरà¥à¤£à¤¨" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "सामानà¥à¤¯ सेटिंगà¥à¤œ" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "पोरà¥à¤Ÿ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "पà¥à¤°à¥‹à¤Ÿà¥‹à¤•ॉल" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "" + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "अजà¥à¤žà¤¾à¤¤" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "अपलिंक" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "" diff --git a/package/luci-app-upnp/po/ms/upnp.po b/package/luci-app-upnp/po/ms/upnp.po new file mode 100644 index 0000000..96bcb06 --- /dev/null +++ b/package/luci-app-upnp/po/ms/upnp.po @@ -0,0 +1,227 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2021-03-31 12:26+0000\n" +"Last-Translator: Faruki Ramly \n" +"Language-Team: Malay \n" +"Language: ms\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.6-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "Tindakan" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Tetapan Lanjutan" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "Keterangan" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "" + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "" diff --git a/package/luci-app-upnp/po/nb_NO/upnp.po b/package/luci-app-upnp/po/nb_NO/upnp.po new file mode 100644 index 0000000..6a07b20 --- /dev/null +++ b/package/luci-app-upnp/po/nb_NO/upnp.po @@ -0,0 +1,229 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2021-02-27 05:11+0000\n" +"Last-Translator: Allan Nordhøy \n" +"Language-Team: Norwegian BokmÃ¥l \n" +"Language: nb_NO\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.5\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" +"ACL angir hvilke eksterne porter som kan bli viderekoblet, og til hvilke " +"interne adresser og porter." + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "Handling" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "Aktive UPnP Viderekoblinger" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Avanserte innstillinger" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "Tillat videkobling kun til IP adresser som ber om det" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "Annonsert modellnummer" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "Annonsert serienummer" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "Nullstill UPnP Viderekoblinger intervall" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "Nullstill UPnP terskel" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "Klient adresse" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "Klient port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Kommentar" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "Slett" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "Beskrivelse" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "Enhet UUID" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "Nedlinje" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "Aktiver NAT-PMP funksjonalitet" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "Aktiver UPnP funksjonalitet" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "Aktiver tilleggs logging" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "Aktiver sikker modus" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "Ekstern port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "Eksterne porter" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "Generelle innstillinger" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "Interne adresser" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "Interne porter" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "MiniUPnP ACL'er" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "MiniUPnP Innstillinger" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "Informasjons intervall" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "Port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "Presentasjon URL" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Protokoll" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "Setter ekstra debugging informasjon i systemloggen" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "Rapporter systemets oppetid istedenfor daemon oppetid" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "Start UPnP og NAT-PMP tjenesten" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "Det finnes ingen aktive viderekoblinger" + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" +"UPnP gjør at klientene i det lokale nettverket automatisk kan konfigurere " +"ruteren." + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "UPnP leie fil" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "Universal Plug & Play" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "Opplinje" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "Verdi i KByte/sek, kun for informasjon" diff --git a/package/luci-app-upnp/po/pl/upnp.po b/package/luci-app-upnp/po/pl/upnp.po new file mode 100644 index 0000000..f1385bf --- /dev/null +++ b/package/luci-app-upnp/po/pl/upnp.po @@ -0,0 +1,232 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2022-06-10 13:18+0000\n" +"Last-Translator: Matthaiks \n" +"Language-Team: Polish \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.13-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" +"Listy kontroli dostÄ™pu (ang. ACL) okreÅ›lajÄ… jakie porty mogÄ… być " +"przekierowane do jakich wewnÄ™trznych adresów i portów" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "Akcja" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "Aktywne przekierowania UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Ustawienia zaawansowane" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "RozgÅ‚aszanie jako urzÄ…dzenie IGDv1 zamiast jako IGDv2" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "Zezwól na dodawanie przekazywaÅ„ tylko do odpytujÄ…cych adresów IP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "RozgÅ‚aszany numer modelu" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "RozgÅ‚aszany numer seryjny" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "InterwaÅ‚ czyszczenia reguÅ‚" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "Próg czyszczenia reguÅ‚" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "Adres klienta" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "Port klienta" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Komentarz" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "UsuÅ„" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "Opis" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "UUID urzÄ…dzenia" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "Pobieranie" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "Włącz tryb IGDv1" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "Włącz funkcjonalność NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "Włącz funkcjonalność UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "Włącz rozszerzone raportowanie" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "Włącz tryb bezpieczny" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "Port zewnÄ™trzny" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "Porty zewnÄ™trzne" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "Ustawienia główne" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "Udziel dostÄ™pu do procedur UPNP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "Host" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "Adresy wewnÄ™trzne" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "Porty wewnÄ™trzne" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "Listy kontroli dostÄ™pu MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "Ustawienia MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "InterwaÅ‚ powiadamiania" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "Port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "URL prezentacji" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Protokół" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "" +"Umieszcza dodatkowe informacje dotyczÄ…ce debugowania w dzienniku systemowym" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "ZgÅ‚aszaj czas pracy systemu zamiast czas pracy usÅ‚ugi" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "Host STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "Port STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "Uruchom usÅ‚ugi UPnP i NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "Nie ma aktywnych przekierowaÅ„." + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" +"UPnP umożliwia klientom w sieci lokalnej automatyczne konfigurowanie routera." + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "Plik dzierżawy UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "Universal Plug & Play" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "Nieznany" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "WysyÅ‚anie" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "Użyj STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "Wartość w KB/s, tylko informacyjna" diff --git a/package/luci-app-upnp/po/pt/upnp.po b/package/luci-app-upnp/po/pt/upnp.po new file mode 100644 index 0000000..17702f7 --- /dev/null +++ b/package/luci-app-upnp/po/pt/upnp.po @@ -0,0 +1,234 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-26 19:03+0200\n" +"PO-Revision-Date: 2021-03-13 09:19+0000\n" +"Last-Translator: ssantos \n" +"Language-Team: Portuguese \n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.5.2-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" +"Os ACL especificam quais as portas externas que podem ser redirecionadas " +"para que endereços internos e portas" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "Ação" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "Redirecionamentos ativos da UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Definições Avançadas" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "Anuncie como aparelho IGDv1 em vez de IGDv2" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "" +"Permitir a adição de encaminhamentos apenas para solicitar endereços IP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "Número modelo anunciado" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "Número de série anunciado" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "Limpar intervalo de regras" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "Limpar limiar de regras" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "Endereço do Cliente" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "Porta do Cliente" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Comentário" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "Apagar" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "Descrição" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "UUID do aparelho" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "Downlink" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "Ativar o modo IGDv1" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "Ativar a funcionalidade NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "Ativar a funcionalidade UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "Ativar log adicional" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "Ativar o modo seguro" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "Porta Externa" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "Portas externas" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "Configurações gerais" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "Conceder acesso UCI aos procedimentos upnp" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "Host" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "Endereços internos" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "Portas internas" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "ACLs MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "Definições MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "Intervalo de Notificação" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "Porta" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "URL de apresentação" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Protocolo" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "Põe informações de depuração extras no log do sistema" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "Relata uptime do sistema ao invés da do daemon" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "Host STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "Porta STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "Iniciar serviço UPnP e NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "Não há redirecionamentos ativos." + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" +"UPnP permite que os clientes da rede local configurem o router " +"automaticamente." + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "Ficheiro de concessão UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "Plug & Play Universal" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "Desconhecido" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "Ligação ascendente" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "Utilizar STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "Valor em KByte/s, apenas informativo" diff --git a/package/luci-app-upnp/po/pt_BR/upnp.po b/package/luci-app-upnp/po/pt_BR/upnp.po new file mode 100644 index 0000000..4faae47 --- /dev/null +++ b/package/luci-app-upnp/po/pt_BR/upnp.po @@ -0,0 +1,233 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-06-10 03:41+0200\n" +"PO-Revision-Date: 2023-03-08 10:38+0000\n" +"Last-Translator: Wellington Terumi Uemura \n" +"Language-Team: Portuguese (Brazil) \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.16.2-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" +"ACLs especificam quais portas externas podem ser redirecionadas para quais " +"endereços e portas internos" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "Ação" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "Redirecionamentos UPnP Ativos" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Configurações avançadas" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "Anuncie-se como um dispositivo IGDv1 ao invés de um IGDv2" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "" +"Permite adicionar encaminhamento apenas para o endereço IP requisitante" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "Número do modelo anunciado" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "Número de série anunciado" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "Intervalo de limpeza das regras" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "Limiar de limpeza das regras" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "Endereço do cliente" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "Porta do Cliente" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Comentário" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "Apagar" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "Descrição" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "UUID do Dispositivo" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "Velocidade de recebimento do enlace (downlink)" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "Habilitar o modo IGDv1" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "Habilite a função NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "Habilite a função UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "Habilite registros adicionais" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "Habilite modo seguro" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "Porta externa" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "Portas Externas" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "Configurações gerais" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "Conceda acesso UCI aos procedimentos upnp" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "Host" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "Endereços internos" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "Portas internas" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "ACLs do MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "Configurações do MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "Intervalo de notificação" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "Porta" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "URL de Apresentação" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Protocolo" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "Envie informações extra de depuração ao registro do sistema" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "Informe o tempo de vida do sistema ao invés do tempo do processo" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "Host STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "Porta STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "Dispare os serviços de UPnP e NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "Não existe redirecionamentos ativos." + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" +"UPnP permite os clientes da rede local configurem automaticamente o roteador." + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "Arquivo de concessão do UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "Plug & Play Universal" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "Desconhecido" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "Velocidade de envio do enlace (uplink)" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "Use o STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "Valores em KByte/s, apenas informativas" diff --git a/package/luci-app-upnp/po/ro/upnp.po b/package/luci-app-upnp/po/ro/upnp.po new file mode 100644 index 0000000..e07f90a --- /dev/null +++ b/package/luci-app-upnp/po/ro/upnp.po @@ -0,0 +1,231 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2022-01-25 22:56+0000\n" +"Last-Translator: CRISTIAN ANDREI \n" +"Language-Team: Romanian \n" +"Language: ro\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " +"20)) ? 1 : 2;\n" +"X-Generator: Weblate 4.11-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" +"ACL-urile specifica porturile externe care pot fi redirectate si spre ce " +"adrese si porturi interne" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "AcÈ›iune" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "Redirecturi active UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Setări avansate" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "Publicitate ca dispozitiv IGDv1 în loc de IGDv2" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "Permite adaugarea forward-urilor doar catre adresele ip solicitante" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "Numărul modelului anunÈ›at" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "Număr de serie anunÈ›at" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "Intervalul de curatare reguli" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "Limita de curatare reguli" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "Adresa client" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "Port client" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Comentariu" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "ȘtergeÈ›i" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "Descriere" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "UUID al dispozitivului" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "Link în jos" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "Activează modul IGDv1" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "Activeaza functionalitatea NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "Activeaza functionalitatea UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "Activeaza log-area aditionala" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "Activeaza modul securizat" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "Port extern" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "Porturi externe" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "Setări generale" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "Acordarea accesului la procedurile upnp" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "Gazdă" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "Adrese interne" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "Porturi interne" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "Liste de acces mini UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "Setari mini UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "Interval de notificare" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "Port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "Adresa de prezentare" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Protocol" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "Pune informatii utile suplimentare in log-ul de sistem" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "Raporteaza timpul de functionare de sistem in loc de serviciu" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "Gazda STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "Portul STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "PorniÈ›i UPnP È™i serviciul NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "Nu exista redirecturi active." + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" +"UPNP permite clientulor din reteaua locala sa configureze automat routerul." + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "Fisierul de conexiuni UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "Plug & Play universal" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "Necunoscut" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "Legătură ascendentă" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "UtilizaÈ›i STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "Valorea in KOcteti/s , doar informational" diff --git a/package/luci-app-upnp/po/ru/upnp.po b/package/luci-app-upnp/po/ru/upnp.po new file mode 100644 index 0000000..76eb6cf --- /dev/null +++ b/package/luci-app-upnp/po/ru/upnp.po @@ -0,0 +1,235 @@ +msgid "" +msgstr "" +"Project-Id-Version: LuCI: upnp\n" +"POT-Creation-Date: 2009-05-19 19:36+0200\n" +"PO-Revision-Date: 2021-10-26 14:59+0000\n" +"Last-Translator: Darin Avdeyeva \n" +"Language-Team: Russian \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.9-dev\n" +"Project-Info: Это техничеÑкий перевод, не доÑловный. Главное-удобный руÑÑкий " +"интерфейÑ, вÑе проверÑлоÑÑŒ в графичеÑком режиме, ÑовмеÑтим Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ apps\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" +"СпиÑок доÑтупа задает внешние порты Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð° внутренние адреÑа " +"и порты" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "ДейÑтвие" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "Ðктивные UPnP-переадреÑации" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Дополнительные наÑтройки" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "ОбъÑвить как IGDv1 уÑтройÑтво вмеÑто IGDv2" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "Разрешить перенаправление только Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð°ÑˆÐ¸Ð²Ð°ÑŽÑ‰Ð¸Ñ… IP-адреÑов" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "ОбъÑвить номер модели" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "ОбъÑвить Ñерийный номер" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "Интервал очиÑтки правил" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "Порог очиÑтки правил" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "ÐÐ´Ñ€ÐµÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "Порт клиента" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Комментарий" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "Удалить" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "ОпиÑание" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "UUID уÑтройÑтва" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "Внутреннее Ñоединение" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "IGDv1 режим" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "Включить NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "Включить UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "Дополнительное журналирование" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "Защищённый режим" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "Внешний порт" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "Внешние порты" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "Общие наÑтройки" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "ПредоÑтавить доÑтуп к процедурам UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "УÑтройÑтво" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "Внутренние адреÑа" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "Внутренние порты" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "СпиÑок доÑтупа MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "ÐаÑтройки MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "Интервал уведомлениÑ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "Порт" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "Задать URL-адреÑ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Протокол" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "ДобавлÑть дополнительную отладочную информацию в ÑиÑтемный журнал" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "Сообщать Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ ÑиÑтемы вмеÑто Ñлужбы" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "ХоÑÑ‚ STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "Порт STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "ЗапуÑтить Ñлужбы
UPnP и NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "Ðктивные переадреÑации отÑутÑтвуют." + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" +"UPnP позволÑет клиентам в локальной Ñети автоматичеÑки наÑтраивать " +"маршрутизатор." + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "Файл аренды UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "Universal Plug & Play" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "ÐеизвеÑтно" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "Внешнее Ñоединение" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "ИÑпользуйте STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "Значение в КБ/Ñ, только Ð´Ð»Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸" diff --git a/package/luci-app-upnp/po/sk/upnp.po b/package/luci-app-upnp/po/sk/upnp.po new file mode 100644 index 0000000..4b7cb4d --- /dev/null +++ b/package/luci-app-upnp/po/sk/upnp.po @@ -0,0 +1,227 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2020-04-04 17:34+0000\n" +"Last-Translator: DuÅ¡an Kazik \n" +"Language-Team: Slovak \n" +"Language: sk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Weblate 4.0-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "Akcia" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "Aktívne presmerovania UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "PokroÄilé nastavenia" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "UmožniÅ¥ pridanie preposielaní iba požadovaným adresám IP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "Ohlásené Äíslo modelu" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "Ohlásené sériové Äíslo" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "VymazaÅ¥ interval pravidiel" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "VymazaÅ¥ prah pravidiel" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "Adresa klienta" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "Port klienta" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Komentár" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "OdstrániÅ¥" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "Popis" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "UUID zariadenia" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "PovoliÅ¥ režim IGDv1" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "PovoliÅ¥ funkcionalitu NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "PovoliÅ¥ funkcionalitu UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "PovoliÅ¥ dodatoÄné zaznamenávanie" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "PovoliÅ¥ zabezpeÄený režim" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "Externý port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "Externé porty" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "VÅ¡eobecné nastavenia" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "Hostiteľ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "Interné adresy" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "Interné porty" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "Nastavenia MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "Interval upozornení" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "Port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "PrezentaÄná URL" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Protokol" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "SpustiÅ¥ službu UPnP a NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "Neexistujú žiadne aktívne presmerovania." + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "UPnP umožňuje klientom v miestnej sieti automaticky nastaviÅ¥ smerovaÄ." + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "Neznáme" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "Hodnota v KBajtoch za sekundu, iba informatívne" diff --git a/package/luci-app-upnp/po/sv/upnp.po b/package/luci-app-upnp/po/sv/upnp.po new file mode 100644 index 0000000..3a44c7f --- /dev/null +++ b/package/luci-app-upnp/po/sv/upnp.po @@ -0,0 +1,231 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2022-12-06 01:48+0000\n" +"Last-Translator: Kristoffer Grundström \n" +"Language-Team: Swedish \n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.15-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" +"ACL:er anger vilka externa portar som ska omdirigeras till vilka interna " +"adresser och portar" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "Ã…tgärd" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "Aktivera UPnP-omdirigeringar" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Avancerade inställningar" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "Aviserat modellnummer" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "Aviserat serienummer" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "Klient-adress" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "Klient-port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Kommentera" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "Ta bort" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "Beskrivning" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "Enhetens UUID" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "Nerlänk" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "Aktivera NAT-PMP-funktionalitet" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "Aktivera UPnP-funktionalitet" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "Aktivera ytterligare loggning" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "Aktivera säkert läge" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "Extern port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "Externa portar" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "Generella inställningar" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "Värd" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "Interna adresser" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "Interna portar" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "ACL:er för MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "Inställningar för MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "Intervall för avisering" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "Port" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "Presentationens URL" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Protokoll" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "Lägger extra felsökningsinformation till system-loggen" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "Rapportera systemet iställer för demonens upptid" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "Starta UPnP och NAT-PMP-tjänsten" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "Det finns inga aktiva omdirigeringar." + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" +"UPnP tillÃ¥ter klienter i det lokala nätverket att automatiskt ställa in " +"routern." + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "Hyr-fil för UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "Universiell Plug & Play" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "Okänd" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "Upplänk" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "Värde i KByte/s, endast informell" diff --git a/package/luci-app-upnp/po/templates/upnp.pot b/package/luci-app-upnp/po/templates/upnp.pot new file mode 100644 index 0000000..1728a18 --- /dev/null +++ b/package/luci-app-upnp/po/templates/upnp.pot @@ -0,0 +1,216 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "" + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "" diff --git a/package/luci-app-upnp/po/tr/upnp.po b/package/luci-app-upnp/po/tr/upnp.po new file mode 100644 index 0000000..fab7222 --- /dev/null +++ b/package/luci-app-upnp/po/tr/upnp.po @@ -0,0 +1,231 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2021-05-14 02:32+0000\n" +"Last-Translator: semih \n" +"Language-Team: Turkish \n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.7-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" +"ACL'ler, hangi harici baÄŸlantı noktalarının hangi dahili adreslere ve " +"baÄŸlantı noktalarına yeniden yönlendirilebileceÄŸini belirtir" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "Eylem" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "Aktif UPnP Yönlendirmeleri" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "GeliÅŸmiÅŸ Ayarlar" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "IGDv2 yerine IGDv1 cihazı olarak duyuru yap" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "Yalnızca istekte bulunan ip adreslerine yönlendirme eklemeye izin ver" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "Açıklanan model numarası" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "Açıklanan seri numarası" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "Temiz kurallar aralığı" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "Temiz kural eÅŸiÄŸi" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "İstemci Adresi" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "İstemci BaÄŸlantı Noktası" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Açıklama" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "Sil" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "Açıklama" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "Cihaz UUID'si" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "Downlink" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "IGDv1 modunu etkinleÅŸtir" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "NAT-PMP iÅŸlevselliÄŸini etkinleÅŸtirin" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "UPnP iÅŸlevselliÄŸini etkinleÅŸtirin" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "Ek günlük kaydını etkinleÅŸtir" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "Güvenli modu etkinleÅŸtir" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "Harici BaÄŸlantı Noktası" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "Harici baÄŸlantı noktaları" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "Genel Ayarlar" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "Upnp prosedürlerine eriÅŸim izni verin" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "Ana bilgisayar" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "Dahili adresler" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "Dahili baÄŸlantı noktaları" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "MiniUPnP ACL'leri" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "MiniUPnP ayarları" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "Bildirme aralığı" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "BaÄŸlantı noktası" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "Sunum URL'si" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Protokol" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "Sistem günlüğüne fazladan hata ayıklama bilgisi koyar" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "Arka plan programı çalışma süresi yerine sistemi rapor et" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "STUN Ana Bilgisayarı" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "STUN BaÄŸlantı Noktası" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "UPnP ve NAT-PMP hizmetini baÅŸlatın" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "Etkin yönlendirme yok." + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" +"UPnP, yerel aÄŸdaki istemcilerin yönlendiriciyi otomatik olarak " +"yapılandırmasına izin verir." + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "UPnP kira dosyası" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "Evrensel Tak ve Çalıştır" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "Bilinmiyor" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "Uplink" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "STUN kullan" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "KBayt/sn cinsinden deÄŸer, yalnızca bilgi amaçlı" diff --git a/package/luci-app-upnp/po/uk/upnp.po b/package/luci-app-upnp/po/uk/upnp.po new file mode 100644 index 0000000..cf65eb9 --- /dev/null +++ b/package/luci-app-upnp/po/uk/upnp.po @@ -0,0 +1,233 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2022-12-22 22:51+0000\n" +"Last-Translator: Bohdan \n" +"Language-Team: Ukrainian \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.15.1-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" +"СпиÑки контролю доÑтупу (ACL) визначають, Ñкі зовнішні порти можуть бути " +"переÑпрÑмовані на Ñкі внутрішні адреÑи й порти" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "ДіÑ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "Ðктивні переÑпрÑÐ¼ÑƒÐ²Ð°Ð½Ð½Ñ UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Додаткові налаштуваннÑ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "Оголошувати Ñк приÑтрій IGDv1 заміÑть IGDv2" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "" +"Дозволити Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÑпрÑÐ¼ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ Ð´Ð»Ñ IP-адреÑ, що надÑилають запити" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "Оголошуваний номер моделі" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "Оголошуваний Ñерійний номер" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "Інтервал Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "Поріг Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "ÐдреÑа клієнта" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "Порт клієнта" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Примітка" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "Видалити" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "ОпиÑ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "UUID приÑтрою" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "Ðизхідне з'єднаннÑ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "Увімкнути режим IGDv1" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "Увімкнути функцію NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "Увімкнути функцію UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "Увімкнути додаткове журналюваннÑ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "Увімкнути захищений режим" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "Зовнішній порт" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "Зовнішні порти" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "Загальні налаштуваннÑ" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "Ðадати доÑтуп до процедур upnp" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "Вузол" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "Внутрішні адреÑи" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "Внутрішні порти" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "СпиÑок контролю доÑтупу MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "ÐаÑтройки MiniUPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "Інтервал ÑповіщеннÑ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "Порт" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "URL презентації" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Протокол" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "Включати додаткові відомоÑті Ð´Ð»Ñ Ð½Ð°Ð»Ð°Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ð¾ ÑиÑтемного журналу" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "ПовідомлÑти Ñ‡Ð°Ñ Ð±ÐµÐ·Ð²Ñ–Ð´Ð¼Ð¾Ð²Ð½Ð¾Ñ— роботи ÑиÑтеми, а не ÑервіÑу" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "ХоÑÑ‚ STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "Порт STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "ЗапуÑкати Ñлужби UPnP та NAT-PMP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "Ðемає активних переÑпрÑмувань." + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" +"UPnP надає клієнтам у локальній мережі змогу автоматично наÑтроювати " +"маршрутизатор." + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "Файл оренд UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "Universal Plug & Play" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "Ðевідомо" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "ВиÑхідне з'єднаннÑ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "ВикориÑтовувати STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ (КБ/Ñ), тільки Ð´Ð»Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ—" diff --git a/package/luci-app-upnp/po/vi/upnp.po b/package/luci-app-upnp/po/vi/upnp.po new file mode 100644 index 0000000..fb73550 --- /dev/null +++ b/package/luci-app-upnp/po/vi/upnp.po @@ -0,0 +1,233 @@ +# upnp.pot +# generated from ./applications/luci-upnp/luasrc/i18n/upnp.en.lua +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-08-16 06:59+0200\n" +"PO-Revision-Date: 2023-02-20 15:36+0000\n" +"Last-Translator: Nguyá»…n văn tuyên \n" +"Language-Team: Vietnamese \n" +"Language: vi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.16-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" +"ACLs chỉ định cổng bên ngoài nào có thể được chuyển hướng đến địa chỉ và " +"cổng ná»™i bá»™ nào" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "Hành động" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "Cài đặt nâng cao" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "Bình luận" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "Mô tả" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "Downlink" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "Kích hoạt chế độ an toàn" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "Giao thức" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "" + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "Universal Plug & Play" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "Uplink" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "" diff --git a/package/luci-app-upnp/po/zh_Hans/upnp.po b/package/luci-app-upnp/po/zh_Hans/upnp.po new file mode 100644 index 0000000..39a2135 --- /dev/null +++ b/package/luci-app-upnp/po/zh_Hans/upnp.po @@ -0,0 +1,232 @@ +# +# Yangfl , 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-06-10 03:40+0200\n" +"PO-Revision-Date: 2023-03-11 03:53+0000\n" +"Last-Translator: Eric \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_Hans\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.16.2-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "访问控制列表指定哪些外部端å£å¯ä»¥è¢«é‡å®šå‘至哪些内部地å€åŠç«¯å£" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "æ“作" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "活动的 UPnP é‡å®šå‘" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "高级设置" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "广播为 IGDv1 è®¾å¤‡ï¼Œè€Œä¸æ˜¯ IGDv2" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "ä»…å…许请求的 IP åœ°å€æ·»åŠ è‡ªå·±çš„è½¬å‘" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "通告的设备型å·" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "通告的设备åºåˆ—å·" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "定时清除规则" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "清除规则阈值" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "客户端地å€" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "客户端端å£" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "备注" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "删除" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "æè¿°" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "设备 UUID" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "下行速率" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "å¯ç”¨ IGDv1 模å¼" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "å¯ç”¨ NAT-PMP 功能" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "å¯ç”¨ UPnP 功能" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "å¯ç”¨é¢å¤–的日志" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "å¯ç”¨å®‰å…¨æ¨¡å¼" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "外部端å£" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "外部端å£" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "常规设置" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "授予访问 UPnP 程åºçš„æƒé™" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "主机" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "内部地å€" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "内部端å£" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "MiniUPnP 访问控制列表" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "MiniUPnP 设置" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "通知的时间间隔" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "端å£" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "æœåŠ¡ç½‘å€" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "åè®®" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "å°†é¢å¤–çš„è°ƒè¯•ä¿¡æ¯æ‰“å°è‡³ç³»ç»Ÿæ—¥å¿—中" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "用系统è¿è¡Œæ—¶é—´ä»£æ›¿è¿›ç¨‹è¿è¡Œæ—¶é—´" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "STUN 主机" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "STUN 端å£" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "å¯åЍ UPnP 与 NAT-PMP æœåŠ¡" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "没有活动的é‡å®šå‘。" + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "UPnP å…许局域网内客户端自动设置路由器上的端å£è½¬å‘。" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "UPnP 租约文件" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "é€šç”¨å³æ’å³ç”¨ï¼ˆUPnP)" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "未知" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "上行速率" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "使用 STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "å•ä½ä¸º KByte/s,仅供å‚考" diff --git a/package/luci-app-upnp/po/zh_Hant/upnp.po b/package/luci-app-upnp/po/zh_Hant/upnp.po new file mode 100644 index 0000000..d8dab78 --- /dev/null +++ b/package/luci-app-upnp/po/zh_Hant/upnp.po @@ -0,0 +1,233 @@ +# +# Yangfl , 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2022-02-05 09:21+0000\n" +"Last-Translator: Hulen \n" +"Language-Team: Chinese (Traditional) \n" +"Language: zh_Hant\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.11-dev\n" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:182 +msgid "" +"ACLs specify which external ports may be redirected to which internal " +"addresses and ports" +msgstr "" +"您å¯ä»¥ä½¿ç”¨ ACLï¼ˆå­˜å–æŽ§åˆ¶ä¸²åˆ—ï¼‰ä¾†è¦å®šå“ªäº›ã€Œå¤–部埠ã€å¯è¢«é‡æ–°å°Žå‘到哪些「內部ä½" +"å€ã€å’Œã€Œå…§éƒ¨åŸ ã€" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:202 +msgid "Action" +msgstr "動作" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:31 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:113 +msgid "Active UPnP Redirects" +msgstr "å‹•æ…‹ UPnP 釿–°å°Žå‘" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:119 +msgid "Advanced Settings" +msgstr "進階設定" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:131 +msgid "Advertise as IGDv1 device instead of IGDv2" +msgstr "宣傳為 IGDv1 è£ç½®ï¼Œè€Œéž IGDv2" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:128 +msgid "Allow adding forwards only to requesting ip addresses" +msgstr "åªå®¹è¨±å‘請求的IPä½å€æ–°å¢žè½‰ç™¼" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:150 +msgid "Announced model number" +msgstr "發布的型號" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:149 +msgid "Announced serial number" +msgstr "發布的åºåˆ—號" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:160 +msgid "Clean rules interval" +msgstr "清除è¦å‰‡é–“éš”" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:156 +msgid "Clean rules threshold" +msgstr "清除è¦å‰‡é–€æª»å€¼" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:45 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:85 +msgid "Client Address" +msgstr "客戶端ä½å€" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:47 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:87 +msgid "Client Port" +msgstr "客戶端埠" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:188 +msgid "Comment" +msgstr "註解" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:62 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:106 +msgid "Delete" +msgstr "刪除" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:48 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:88 +msgid "Description" +msgstr "æè¿°" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:148 +msgid "Device UUID" +msgstr "è£ç½® UUID" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:136 +msgid "Downlink" +msgstr "下行éˆè·¯" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:130 +msgid "Enable IGDv1 mode" +msgstr "啟用 IGDv1 模å¼" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:125 +msgid "Enable NAT-PMP functionality" +msgstr "啓用 NAT-PMP 功能" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:124 +msgid "Enable UPnP functionality" +msgstr "啓用 UPnP 功能" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:133 +msgid "Enable additional logging" +msgstr "啓用附加日誌" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:127 +msgid "Enable secure mode" +msgstr "啓用安全模å¼" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:44 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:84 +msgid "External Port" +msgstr "外部埠" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:190 +msgid "External ports" +msgstr "外部埠範åœ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:118 +msgid "General Settings" +msgstr "一般設定" + +#: applications/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json:3 +msgid "Grant access to upnp procedures" +msgstr "æŽˆäºˆå­˜å– UPnP 程åºçš„æ¬Šé™" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:46 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:86 +msgid "Host" +msgstr "主機" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:194 +msgid "Internal addresses" +msgstr "內部ä½å€ç¯„åœ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:198 +msgid "Internal ports" +msgstr "內部埠範åœ" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:181 +msgid "MiniUPnP ACLs" +msgstr "MiniUPnP ACL" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:116 +msgid "MiniUPnP settings" +msgstr "MiniUPnP 設定" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:152 +msgid "Notify interval" +msgstr "通知時間間隔" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:142 +msgid "Port" +msgstr "連接埠" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:164 +msgid "Presentation URL" +msgstr "存在 URL" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:43 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:83 +msgid "Protocol" +msgstr "å”定" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:134 +msgid "Puts extra debugging information into the system log" +msgstr "å°‡é¡å¤–的除錯資訊寫入系統日誌" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:146 +msgid "Report system instead of daemon uptime" +msgstr "報告使用系統上線時間,而éžç¨‹åºä¸Šç·šæ™‚é–“" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:172 +msgid "STUN Host" +msgstr "STUN 主機" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:176 +msgid "STUN Port" +msgstr "STUN 埠" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:121 +msgid "Start UPnP and NAT-PMP service" +msgstr "啟動æœå‹™" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:70 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:66 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:110 +msgid "There are no active redirects." +msgstr "沒有活èºçš„釿–°å°Žå‘。" + +#: applications/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json:3 +msgid "UPnP" +msgstr "UPnP" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:76 +msgid "" +"UPnP allows clients in the local network to automatically configure the " +"router." +msgstr "" +"UPnP(通用隨æ’å³ç”¨ï¼‰å…許本地網絡中的客戶端é…ç½®è·¯ç”±å™¨ï¼Œè‡ªå‹•è¨­å®šåŸ çš„é‡æ–°å°Žå‘。" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:167 +msgid "UPnP lease file" +msgstr "UPnP 租約檔" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:75 +msgid "Universal Plug & Play" +msgstr "通用隨æ’å³ç”¨ (UPnP)" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/status/include/80_upnp.js:60 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:56 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:100 +msgid "Unknown" +msgstr "未知" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:139 +msgid "Uplink" +msgstr "上行éˆè·¯" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:170 +msgid "Use STUN" +msgstr "使用 STUN" + +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:137 +#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:140 +msgid "Value in KByte/s, informational only" +msgstr "值 (KByte/s) 僅供åƒè€ƒ" diff --git a/package/luci-app-upnp/root/etc/uci-defaults/40_luci-miniupnp b/package/luci-app-upnp/root/etc/uci-defaults/40_luci-miniupnp new file mode 100755 index 0000000..f63d648 --- /dev/null +++ b/package/luci-app-upnp/root/etc/uci-defaults/40_luci-miniupnp @@ -0,0 +1,10 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@upnpd[-1] + add ucitrack upnpd + set ucitrack.@upnpd[-1].init=miniupnpd + commit ucitrack +EOF + +exit 0 diff --git a/package/luci-app-upnp/root/usr/libexec/rpcd/luci.upnp b/package/luci-app-upnp/root/usr/libexec/rpcd/luci.upnp new file mode 100755 index 0000000..a122360 --- /dev/null +++ b/package/luci-app-upnp/root/usr/libexec/rpcd/luci.upnp @@ -0,0 +1,155 @@ +#!/usr/bin/env lua + +local json = require "luci.jsonc" +local UCI = require "luci.model.uci" +local fs = require "nixio.fs" +local sys = require "luci.sys" + +local methods = { + get_status = { + call = function() + local uci = UCI.cursor() + local lease_file = uci:get("upnpd", "config", "upnp_lease_file") + + local ipv4_hints = sys.net.ipv4_hints() + local rule = { } + + local ipt = io.popen("iptables --line-numbers -t nat -xnvL MINIUPNPD 2>/dev/null") + if ipt then + local upnpf = lease_file and io.open(lease_file, "r") + while true do + local ln = ipt:read("*l") + if not ln then + break + elseif ln:match("^%d+") then + local num, proto, extport, intaddr, intport = + ln:match("^(%d+).-([a-z]+).-dpt:(%d+) to:(%S-):(%d+)") + local descr = "" + + if num and proto and extport and intaddr and intport then + extport = tonumber(extport) + intport = tonumber(intport) + + if upnpf then + local uln = upnpf:read("*l") + if uln then descr = uln:match(string.format("^%s:%d:%s:%d:%%d*:(.*)$", proto:upper(), extport, intaddr, intport)) end + if not descr then descr = "" end + end + + local host_hint, _, e + + for _,e in pairs(ipv4_hints) do + if e[1] == intaddr then + host_hint = e[2] + break + end + end + + rule[#rule+1] = { + num = num, + proto = proto:upper(), + extport = extport, + intaddr = intaddr, + host_hint = host_hint, + intport = intport, + descr = descr + } + end + end + end + + if upnpf then upnpf:close() end + ipt:close() + end + + return { rules = rule } + end + }, + delete_rule = { + args = { token = "token" }, + call = function(args) + local util = require "luci.util" + local idx = args and tonumber(args.token) + local res = {} + + if idx and idx > 0 then + local uci = UCI.cursor() + + sys.call("iptables -t filter -D MINIUPNPD %d 2>/dev/null" % idx) + sys.call("iptables -t nat -D MINIUPNPD %d 2>/dev/null" % idx) + + local lease_file = uci:get("upnpd", "config", "upnp_lease_file") + if lease_file and fs.access(lease_file) then + sys.call("sed -i -e '%dd' %s" %{ idx, util.shellquote(lease_file) }) + end + + uci.unload() + + return { result = "OK" } + end + + return { result = "Bad request" } + end + } +} + +local function parseInput() + local parse = json.new() + local done, err + + while true do + local chunk = io.read(4096) + if not chunk then + break + elseif not done and not err then + done, err = parse:parse(chunk) + end + end + + if not done then + print(json.stringify({ error = err or "Incomplete input" })) + os.exit(1) + end + + return parse:get() +end + +local function validateArgs(func, uargs) + local method = methods[func] + if not method then + print(json.stringify({ error = "Method not found" })) + os.exit(1) + end + + if type(uargs) ~= "table" then + print(json.stringify({ error = "Invalid arguments" })) + os.exit(1) + end + + uargs.ubus_rpc_session = nil + + local k, v + local margs = method.args or {} + for k, v in pairs(uargs) do + if margs[k] == nil or + (v ~= nil and type(v) ~= type(margs[k])) + then + print(json.stringify({ error = "Invalid arguments" })) + os.exit(1) + end + end + + return method +end + +if arg[1] == "list" then + local _, method, rv = nil, nil, {} + for _, method in pairs(methods) do rv[_] = method.args or {} end + print((json.stringify(rv):gsub(":%[%]", ":{}"))) +elseif arg[1] == "call" then + local args = parseInput() + local method = validateArgs(arg[2], args) + local result, code = method.call(args) + print((json.stringify(result):gsub("^%[%]$", "{}"))) + os.exit(code or 0) +end \ No newline at end of file diff --git a/package/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json b/package/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json new file mode 100644 index 0000000..63a5c59 --- /dev/null +++ b/package/luci-app-upnp/root/usr/share/luci/menu.d/luci-app-upnp.json @@ -0,0 +1,13 @@ +{ + "admin/services/upnp": { + "title": "UPnP", + "action": { + "type": "view", + "path": "upnp/upnp" + }, + "depends": { + "acl": [ "luci-app-ddns" ], + "uci": { "upnpd": true } + } + } +} diff --git a/package/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json b/package/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json new file mode 100644 index 0000000..ffe4090 --- /dev/null +++ b/package/luci-app-upnp/root/usr/share/rpcd/acl.d/luci-app-upnp.json @@ -0,0 +1,18 @@ +{ + "luci-app-ddns": { + "description": "Grant access to upnp procedures", + "read": { + "ubus": { + "luci.upnp": [ "get_status" ], + "luci": [ "setInitAction" ] + }, + "uci": [ "upnpd" ] + }, + "write": { + "ubus": { + "luci.upnp": [ "delete_rule" ] + }, + "uci": [ "upnpd" ] + } + } +} diff --git a/package/miniupnpd/Makefile b/package/miniupnpd/Makefile new file mode 100644 index 0000000..1dc144a --- /dev/null +++ b/package/miniupnpd/Makefile @@ -0,0 +1,80 @@ +# +# Copyright (C) 2006-2014 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=miniupnpd +PKG_VERSION:=2.0.20170421 +PKG_RELEASE:=4 + +PKG_SOURCE_URL:=http://miniupnp.free.fr/files +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_HASH:=9677aeccadf73b4bf8bb9d832c32b5da8266b4d58eed888f3fd43d7656405643 + +PKG_MAINTAINER:=Markus Stenberg +PKG_LICENSE:=BSD-3-Clause + +include $(INCLUDE_DIR)/package.mk + +define Package/miniupnpd + SECTION:=net + CATEGORY:=Network + DEPENDS:=+iptables +libip4tc +libuuid + TITLE:=Lightweight UPnP IGD, NAT-PMP & PCP daemon + SUBMENU:=Firewall + URL:=http://miniupnp.free.fr/ +endef + +define Package/miniupnpd/config +config MINIUPNPD_IGDv2 + bool + default n + prompt "Enable IGDv2" +endef + +define Package/miniupnpd/conffiles +/etc/config/upnpd +endef + +define Package/miniupnpd/postinst +#!/bin/sh + +if [ -z "$$IPKG_INSTROOT" ]; then + ( . /etc/uci-defaults/99-miniupnpd ) + rm -f /etc/uci-defaults/99-miniupnpd +fi + +exit 0 +endef + +define Build/Prepare + $(call Build/Prepare/Default) + echo "OpenWrt" | tr \(\)\ _ >$(PKG_BUILD_DIR)/os.openwrt +endef + +MAKE_FLAGS += \ + TARGET_OPENWRT=1 TEST=0 \ + LIBS="" \ + CC="$(TARGET_CC) -DIPTABLES_143 \ + -lip4tc -luuid" \ + CONFIG_OPTIONS="--portinuse --leasefile \ + $(if $(CONFIG_MINIUPNPD_IGDv2),--igd2)" \ + -f Makefile.linux \ + miniupnpd + + +define Package/miniupnpd/install + $(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/init.d $(1)/etc/config $(1)/etc/uci-defaults $(1)/etc/hotplug.d/iface $(1)/usr/share/miniupnpd + $(INSTALL_BIN) $(PKG_BUILD_DIR)/miniupnpd $(1)/usr/sbin/miniupnpd + $(INSTALL_BIN) ./files/miniupnpd.init $(1)/etc/init.d/miniupnpd + $(INSTALL_CONF) ./files/upnpd.config $(1)/etc/config/upnpd + $(INSTALL_DATA) ./files/miniupnpd.hotplug $(1)/etc/hotplug.d/iface/50-miniupnpd + $(INSTALL_DATA) ./files/miniupnpd.defaults $(1)/etc/uci-defaults/99-miniupnpd + $(INSTALL_DATA) ./files/firewall.include $(1)/usr/share/miniupnpd/firewall.include +endef + +$(eval $(call BuildPackage,miniupnpd)) diff --git a/package/miniupnpd/files/firewall.include b/package/miniupnpd/files/firewall.include new file mode 100644 index 0000000..0eb96d7 --- /dev/null +++ b/package/miniupnpd/files/firewall.include @@ -0,0 +1,57 @@ +#!/bin/sh +# miniupnpd integration for firewall3 + +IP6TABLES=/usr/sbin/ip6tables + +iptables -t filter -N MINIUPNPD 2>/dev/null +iptables -t nat -N MINIUPNPD 2>/dev/null +iptables -t nat -N MINIUPNPD-POSTROUTING 2>/dev/null + +[ -x $IP6TABLES ] && $IP6TABLES -t filter -N MINIUPNPD 2>/dev/null + +. /lib/functions/network.sh + +ADDED=0 + +add_extzone_rules() { + local ext_zone=$1 + + [ -z "$ext_zone" ] && return + + # IPv4 - due to NAT, need to add both to nat and filter table + iptables -t filter -I zone_${ext_zone}_forward -j MINIUPNPD + iptables -t nat -I zone_${ext_zone}_prerouting -j MINIUPNPD + iptables -t nat -I zone_${ext_zone}_postrouting -j MINIUPNPD-POSTROUTING + + # IPv6 if available - filter only + [ -x $IP6TABLES ] && { + $IP6TABLES -t filter -I zone_${ext_zone}_forward -j MINIUPNPD + } + ADDED=$(($ADDED + 1)) +} + +# By default, user configuration is king. + +for ext_iface in $(uci -q get upnpd.config.external_iface); do + add_extzone_rules $(fw3 -q network "$ext_iface") +done + +add_extzone_rules $(uci -q get upnpd.config.external_zone) + +[ ! $ADDED = 0 ] && exit 0 + + +# If really nothing is available, resort to network_find_wan{,6} and +# assume external interfaces all have same firewall zone. + +# (This heuristic may fail horribly, in case of e.g. multihoming, so +# please set external_zone in that case!) + +network_find_wan wan_iface +network_find_wan6 wan6_iface + +for ext_iface in $wan_iface $wan6_iface; do + # fw3 -q network fails on sub-interfaces => map to device first + network_get_device ext_device $ext_iface + add_extzone_rules $(fw3 -q device "$ext_device") +done diff --git a/package/miniupnpd/files/miniupnpd.defaults b/package/miniupnpd/files/miniupnpd.defaults new file mode 100644 index 0000000..7271389 --- /dev/null +++ b/package/miniupnpd/files/miniupnpd.defaults @@ -0,0 +1,13 @@ +#!/bin/sh + +uci -q batch <<-EOT + delete firewall.miniupnpd + set firewall.miniupnpd=include + set firewall.miniupnpd.type=script + set firewall.miniupnpd.path=/usr/share/miniupnpd/firewall.include + set firewall.miniupnpd.family=any + set firewall.miniupnpd.reload=1 + commit firewall +EOT + +exit 0 diff --git a/package/miniupnpd/files/miniupnpd.hotplug b/package/miniupnpd/files/miniupnpd.hotplug new file mode 100644 index 0000000..b320056 --- /dev/null +++ b/package/miniupnpd/files/miniupnpd.hotplug @@ -0,0 +1,39 @@ +#!/bin/sh + +/etc/init.d/miniupnpd enabled || exit 0 + +. /lib/functions/service.sh + +# If miniupnpd is not running: +# - check on _any_ event (even updates may contribute to network_find_wan*) + +# If miniupnpd _is_ running: +# - check only on ifup (otherwise lease updates etc would cause +# miniupnpd state loss) + +[ ! "$ACTION" = "ifup" ] && service_check /usr/sbin/miniupnpd && exit 0 + +tmpconf="/var/etc/miniupnpd.conf" +extiface=$(uci -q get upnpd.config.external_iface) +extzone=$(uci -q get upnpd.config.external_zone) + +. /lib/functions/network.sh + +for iface in $(uci -q get upnpd.config.internal_iface); do + network_get_device device $iface + [ "$DEVICE" = "$device" ] && /etc/init.d/miniupnpd restart && exit 0 +done + + +if [ -z "$extiface" ] ; then + # manual external zone (if dynamically find interfaces + # belonging to it) overrides network_find_wan* + if [ -n "$extzone" ] ; then + ifname=$(fw3 -q zone $extzone | head -1) + fi + [ -n "$extiface" ] || network_find_wan extiface + [ -n "$extiface" ] || network_find_wan6 extiface +fi + +[ -n "$ifname" ] || network_get_device ifname ${extiface} +grep -qs "ext_ifname=$ifname" $tmpconf || /etc/init.d/miniupnpd restart diff --git a/package/miniupnpd/files/miniupnpd.init b/package/miniupnpd/files/miniupnpd.init new file mode 100644 index 0000000..c934a28 --- /dev/null +++ b/package/miniupnpd/files/miniupnpd.init @@ -0,0 +1,212 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2006-2014 OpenWrt.org + +START=94 +STOP=15 + +SERVICE_USE_PID=1 + +upnpd_get_port_range() { + local _var="$1"; shift + local _val + + config_get _val "$@" + + case "$_val" in + [0-9]*[:-][0-9]*) + export -n -- "${_var}_start=${_val%%[:-]*}" + export -n -- "${_var}_end=${_val##*[:-]}" + ;; + [0-9]*) + export -n -- "${_var}_start=$_val" + export -n -- "${_var}_end=" + ;; + esac +} + +conf_rule_add() { + local cfg="$1" + local tmpconf="$2" + local action external_port_start external_port_end int_addr + local internal_port_start internal_port_end + + config_get action "$cfg" action "deny" # allow or deny + upnpd_get_port_range "ext" "$cfg" ext_ports "0-65535" # external ports: x, x-y, x:y + config_get int_addr "$cfg" int_addr "0.0.0.0/0" # ip or network and subnet mask (internal) + upnpd_get_port_range "int" "$cfg" int_ports "0-65535" # internal ports: x, x-y, x:y or range + + # Make a single IP IP/32 so that miniupnpd.conf can use it. + case "$int_addr" in + */*) ;; + *) int_addr="$int_addr/32" ;; + esac + + echo "${action} ${ext_start}${ext_end:+-}${ext_end} ${int_addr} ${int_start}${int_end:+-}${int_end}" >>$tmpconf +} + +upnpd_write_bool() { + local opt="$1" + local def="${2:-0}" + local alt="$3" + local val + + config_get_bool val config "$opt" "$def" + if [ "$val" -eq 0 ]; then + echo "${alt:-$opt}=no" >> $tmpconf + else + echo "${alt:-$opt}=yes" >> $tmpconf + fi +} + +boot() { + return +} + +start() { + config_load "upnpd" + local extiface intiface upload download logging secure enabled natpmp + local extip port usesysuptime conffile serial_number model_number + local uuid notify_interval presentation_url enable_upnp + local upnp_lease_file clean_ruleset_threshold clean_ruleset_interval + local ipv6_listening_ip enabled + + config_get_bool enabled config enabled 1 + + [ "$enabled" -gt 0 ] || return 1 + + config_get extiface config external_iface + config_get extzone config external_zone + config_get intiface config internal_iface + config_get extip config external_ip + config_get port config port 5000 + config_get upload config upload + config_get download config download + config_get_bool logging config log_output 0 + config_get conffile config config_file + config_get serial_number config serial_number + config_get model_number config model_number + config_get uuid config uuid + config_get notify_interval config notify_interval + config_get presentation_url config presentation_url + config_get upnp_lease_file config upnp_lease_file + config_get clean_ruleset_threshold config clean_ruleset_threshold + config_get clean_ruleset_interval config clean_ruleset_interval + config_get ipv6_listening_ip config ipv6_listening_ip + + local args + + . /lib/functions/network.sh + + local ifname + + # manual external interface overrides everything + if [ -z "$extiface" ] ; then + # manual external zone (if dynamically find interfaces + # belonging to it) overrides network_find_wan* + if [ -n "$extzone" ] ; then + ifname=$(fw3 -q zone $extzone | head -1) + fi + [ -n "$extiface" ] || network_find_wan extiface + [ -n "$extiface" ] || network_find_wan6 extiface + fi + + [ -n "$ifname" ] || network_get_device ifname ${extiface} + + if [ -n "$conffile" ]; then + args="-f $conffile" + else + local tmpconf="/var/etc/miniupnpd.conf" + args="-f $tmpconf" + mkdir -p /var/etc + + echo "ext_ifname=$ifname" >$tmpconf + + [ -n "$extip" ] && \ + echo "ext_ip=$extip" >>$tmpconf + + local iface + for iface in ${intiface:-lan}; do + local device + network_get_device device "$iface" && { + echo "listening_ip=$device" >>$tmpconf + } + done + + [ "$port" != "auto" ] && \ + echo "port=$port" >>$tmpconf + + config_load "upnpd" + upnpd_write_bool enable_natpmp 1 + upnpd_write_bool enable_upnp 1 + upnpd_write_bool secure_mode 1 + upnpd_write_bool pcp_allow_thirdparty 0 + upnpd_write_bool system_uptime 1 + + [ -n "$upnp_lease_file" ] && \ + echo "lease_file=$upnp_lease_file" >>$tmpconf + + [ -n "$upload" -a -n "$download" ] && { + echo "bitrate_down=$(($download * 1024 * 8))" >>$tmpconf + echo "bitrate_up=$(($upload * 1024 * 8))" >>$tmpconf + } + + [ -n "${presentation_url}" ] && \ + echo "presentation_url=${presentation_url}" >>$tmpconf + + [ -n "${notify_interval}" ] && \ + echo "notify_interval=${notify_interval}" >>$tmpconf + + [ -n "${clean_ruleset_threshold}" ] && \ + echo "clean_ruleset_threshold=${clean_ruleset_threshold}" >>$tmpconf + + [ -n "${clean_ruleset_interval}" ] && \ + echo "clean_ruleset_interval=${clean_ruleset_interval}" >>$tmpconf + + [ -n "${ipv6_listening_ip}" ] && \ + echo "ipv6_listening_ip=${ipv6_listening_ip}" >>$tmpconf + + [ -z "$uuid" ] && { + uuid="$(cat /proc/sys/kernel/random/uuid)" + uci set upnpd.config.uuid=$uuid + uci commit upnpd + } + + [ "$uuid" = "nocli" ] || \ + echo "uuid=$uuid" >>$tmpconf + + [ -n "${serial_number}" ] && \ + echo "serial=${serial_number}" >>$tmpconf + + [ -n "${model_number}" ] && \ + echo "model_number=${model_number}" >>$tmpconf + + config_foreach conf_rule_add perm_rule "$tmpconf" + fi + + + if [ -n "$ifname" ]; then + # start firewall + iptables -L MINIUPNPD >/dev/null 2>/dev/null || fw3 reload + + if [ "$logging" = "1" ]; then + SERVICE_DAEMONIZE=1 \ + service_start /usr/sbin/miniupnpd $args -d + else + SERVICE_DAEMONIZE= \ + service_start /usr/sbin/miniupnpd $args + fi + else + logger -t "upnp daemon" "external interface not found, not starting" + fi +} + +stop() { + service_stop /usr/sbin/miniupnpd + + iptables -t nat -F MINIUPNPD 2>/dev/null + iptables -t filter -F MINIUPNPD 2>/dev/null + + [ -x /usr/sbin/ip6tables ] && { + ip6tables -t filter -F MINIUPNPD 2>/dev/null + } +} diff --git a/package/miniupnpd/files/upnpd.config b/package/miniupnpd/files/upnpd.config new file mode 100644 index 0000000..42635e9 --- /dev/null +++ b/package/miniupnpd/files/upnpd.config @@ -0,0 +1,27 @@ +config upnpd config + option enabled 1 + option enable_natpmp 1 + option enable_upnp 1 + option secure_mode 0 + option log_output 0 + option download 20480 + option upload 2048 + #by default, looked up dynamically from ubus + #option external_iface wan + option internal_iface lan + option port 5000 + option upnp_lease_file /var/upnp.leases + +config perm_rule + option action allow + option ext_ports 1024-65535 + option int_addr 0.0.0.0/0 # Does not override secure_mode + option int_ports 1024-65535 + option comment "Allow high ports" + +config perm_rule + option action deny + option ext_ports 0-65535 + option int_addr 0.0.0.0/0 + option int_ports 0-65535 + option comment "Default deny" diff --git a/package/miniupnpd/patches/101-no-ssl-uuid.patch b/package/miniupnpd/patches/101-no-ssl-uuid.patch new file mode 100644 index 0000000..81cea10 --- /dev/null +++ b/package/miniupnpd/patches/101-no-ssl-uuid.patch @@ -0,0 +1,23 @@ +We do not need to autodetect SSL/UUID; SSL we do not support, UUID we always do. + +--- a/Makefile.linux ++++ b/Makefile.linux +@@ -153,14 +153,18 @@ LDLIBS += $(shell $(PKG_CONFIG) --static + LDLIBS += $(shell $(PKG_CONFIG) --static --libs-only-l libnetfilter_conntrack) + endif # ($(TEST),1) + ++ifeq ($(TARGET_OPENWRT),) ++# n/a - we don't enable https server for IGD v2 anyway in OpenWrt + LDLIBS += $(shell $(PKG_CONFIG) --static --libs-only-l libssl) + ++# n/a - we hardcodedly support libuuid + TEST := $(shell $(PKG_CONFIG) --exists uuid && echo 1) + ifeq ($(TEST),1) + LDLIBS += $(shell $(PKG_CONFIG) --static --libs-only-l uuid) + else + $(info please install uuid-dev package / libuuid) + endif # ($(TEST),1) ++endif + + TESTUPNPDESCGENOBJS = testupnpdescgen.o upnpdescgen.o + diff --git a/package/miniupnpd/patches/102-ipv6-ext-port.patch b/package/miniupnpd/patches/102-ipv6-ext-port.patch new file mode 100644 index 0000000..806c7fd --- /dev/null +++ b/package/miniupnpd/patches/102-ipv6-ext-port.patch @@ -0,0 +1,10 @@ +--- a/pcpserver.c ++++ b/pcpserver.c +@@ -982,6 +982,7 @@ static int CreatePCPMap_NAT(pcp_info_t * + timestamp); + if (r < 0) + return PCP_ERR_NO_RESOURCES; ++ pcp_msg_info->ext_port = pcp_msg_info->int_port; + return PCP_SUCCESS; + } + diff --git a/package/miniupnpd/patches/103-no-ipv6-autodetection.patch b/package/miniupnpd/patches/103-no-ipv6-autodetection.patch new file mode 100644 index 0000000..50d5a39 --- /dev/null +++ b/package/miniupnpd/patches/103-no-ipv6-autodetection.patch @@ -0,0 +1,27 @@ +The miniupnpd makefile tries to autodetect iptables capabilities. +This will incorrectly detect capabilities such as ipv6 support even though it is disabled for the target build. + +As the OpenWRT buildsystem already passes the right compile flags, we can skip the autodetection. + + +--- a/netfilter/Makefile ++++ b/netfilter/Makefile +@@ -38,8 +38,6 @@ endif + endif + endif + +-LIBS += /lib/libip4tc.so /lib/libip6tc.so +- + all: iptcrdr.o testiptcrdr iptpinhole.o \ + testiptcrdr_peer testiptcrdr_dscp test_nfct_get + # testiptpinhole +--- a/Makefile.linux ++++ b/Makefile.linux +@@ -73,7 +73,6 @@ CPPFLAGS += -DIPTABLES_143 + endif + + CFLAGS += $(shell $(PKG_CONFIG) --cflags libiptc) +-LDLIBS += $(shell $(PKG_CONFIG) --static --libs-only-l libiptc) + LDFLAGS += $(shell $(PKG_CONFIG) --libs-only-L libiptc) + LDFLAGS += $(shell $(PKG_CONFIG) --libs-only-other libiptc) + else diff --git a/package/miniupnpd/patches/104-always-libuuid.patch b/package/miniupnpd/patches/104-always-libuuid.patch new file mode 100644 index 0000000..e7ff79f --- /dev/null +++ b/package/miniupnpd/patches/104-always-libuuid.patch @@ -0,0 +1,20 @@ +As it turns out, the 'magic' libuuid/bsd uuid check just checks +outside buildtree altogether for the uuid_generate. So we just +hardcode it. + +--- a/genconfig.sh ++++ b/genconfig.sh +@@ -379,12 +379,7 @@ case $FW in + esac + + # UUID API +-if grep uuid_create /usr/include/uuid.h > /dev/null 2>&1 ; then +- echo "#define BSD_UUID" >> ${CONFIGFILE} +-fi +-if grep uuid_generate /usr/include/uuid/uuid.h > /dev/null 2>&1 ; then +- echo "#define LIB_UUID" >> ${CONFIGFILE} +-fi ++echo "#define LIB_UUID" >> ${CONFIGFILE} + + # set V6SOCKETS_ARE_V6ONLY to 0 if it was not set above + if [ -z "$V6SOCKETS_ARE_V6ONLY" ] ; then diff --git a/package/miniupnpd/patches/105-no_ssdp_warn.patch b/package/miniupnpd/patches/105-no_ssdp_warn.patch new file mode 100644 index 0000000..6ca86d0 --- /dev/null +++ b/package/miniupnpd/patches/105-no_ssdp_warn.patch @@ -0,0 +1,13 @@ +--- a/minissdp.c ++++ b/minissdp.c +@@ -865,8 +865,8 @@ ProcessSSDPData(int s, const char *bufr, + lan_addr = get_lan_for_peer(sender); + if(lan_addr == NULL) + { +- syslog(LOG_WARNING, "SSDP packet sender %s not from a LAN, ignoring", +- sender_str); ++ /* syslog(LOG_WARNING, "SSDP packet sender %s not from a LAN, ignoring", ++ sender_str); */ + return; + } + diff --git a/package/miniupnpd/patches/106-fix-build-with-linux-kernel-5_0.patch b/package/miniupnpd/patches/106-fix-build-with-linux-kernel-5_0.patch new file mode 100644 index 0000000..9a5e5ef --- /dev/null +++ b/package/miniupnpd/patches/106-fix-build-with-linux-kernel-5_0.patch @@ -0,0 +1,111 @@ +From 6106111972b44d5ebe29c4a3e8479c783b6ec1b7 Mon Sep 17 00:00:00 2001 +From: Thomas Bernard +Date: Sun, 3 Feb 2019 13:26:27 +0100 +Subject: [PATCH] netfilter: build with linux kernel 5.0 + +should fix #346 +--- + Changelog.txt | 3 +++ + netfilter/iptcrdr.c | 38 +++++++++++++++++++++++++---------- + 2 files changed, 30 insertions(+), 11 deletions(-) + +--- a/Changelog.txt ++++ b/Changelog.txt +@@ -1,5 +1,8 @@ + $Id: Changelog.txt,v 1.431 2017/04/21 11:30:23 nanard Exp $ + ++2019/02/03: ++ netfilter: fix build with linux kernel 5.0 ++ + 2017/03/13: + default to client address for AddPortMapping when + is empty +--- a/netfilter/iptcrdr.c ++++ b/netfilter/iptcrdr.c +@@ -1,7 +1,7 @@ + /* $Id: iptcrdr.c,v 1.59 2016/03/08 09:23:52 nanard Exp $ */ + /* MiniUPnP project + * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ +- * (c) 2006-2016 Thomas Bernard ++ * (c) 2006-2019 Thomas Bernard + * This software is subject to the conditions detailed + * in the LICENCE file provided within the distribution */ + #include +@@ -1116,9 +1116,11 @@ addnatrule(int proto, unsigned short epo + } else { + match = get_udp_match(eport, 0); + } +- e->nfcache = NFC_IP_DST_PT; ++ e->nfcache = NFC_UNKNOWN; + target = get_dnat_target(iaddr, iport); +- e->nfcache |= NFC_UNKNOWN; ++#ifdef NFC_IP_DST_PT ++ e->nfcache |= NFC_IP_DST_PT; ++#endif + tmp = realloc(e, sizeof(struct ipt_entry) + + match->u.match_size + + target->u.target_size); +@@ -1186,9 +1188,11 @@ addmasqueraderule(int proto, + } else { + match = get_udp_match(0, iport); + } +- e->nfcache = NFC_IP_DST_PT; ++ e->nfcache = NFC_UNKNOWN; + target = get_masquerade_target(eport); +- e->nfcache |= NFC_UNKNOWN; ++#ifdef NFC_IP_DST_PT ++ e->nfcache |= NFC_IP_DST_PT; ++#endif + tmp = realloc(e, sizeof(struct ipt_entry) + + match->u.match_size + + target->u.target_size); +@@ -1266,9 +1270,14 @@ addpeernatrule(int proto, + } else { + match = get_udp_match(rport, iport); + } +- e->nfcache = NFC_IP_DST_PT | NFC_IP_SRC_PT; ++ e->nfcache = NFC_UNKNOWN; + target = get_snat_target(eaddr, eport); +- e->nfcache |= NFC_UNKNOWN; ++#ifdef NFC_IP_DST_PT ++ e->nfcache |= NFC_IP_DST_PT; ++#endif ++#ifdef NFC_IP_SRC_PT ++ e->nfcache |= NFC_IP_SRC_PT; ++#endif + tmp = realloc(e, sizeof(struct ipt_entry) + + match->u.match_size + + target->u.target_size); +@@ -1337,9 +1346,14 @@ addpeerdscprule(int proto, unsigned char + } else { + match = get_udp_match(rport, iport); + } +- e->nfcache = NFC_IP_DST_PT | NFC_IP_SRC_PT; ++ e->nfcache = NFC_UNKNOWN; + target = get_dscp_target(dscp); +- e->nfcache |= NFC_UNKNOWN; ++#ifdef NFC_IP_DST_PT ++ e->nfcache |= NFC_IP_DST_PT; ++#endif ++#ifdef NFC_IP_SRC_PT ++ e->nfcache |= NFC_IP_SRC_PT; ++#endif + tmp = realloc(e, sizeof(struct ipt_entry) + + match->u.match_size + + target->u.target_size); +@@ -1420,11 +1434,13 @@ add_filter_rule(int proto, const char * + } else { + match = get_udp_match(iport,0); + } +- e->nfcache = NFC_IP_DST_PT; + e->ip.dst.s_addr = inet_addr(iaddr); + e->ip.dmsk.s_addr = INADDR_NONE; ++ e->nfcache = NFC_UNKNOWN; + target = get_accept_target(); +- e->nfcache |= NFC_UNKNOWN; ++#ifdef NFC_IP_DST_PT ++ e->nfcache |= NFC_IP_DST_PT; ++#endif + tmp = realloc(e, sizeof(struct ipt_entry) + + match->u.match_size + + target->u.target_size); diff --git a/package/miniupnpd/patches/107-conditionnaly-use-NFC_UNKNOWN-as-well.patch b/package/miniupnpd/patches/107-conditionnaly-use-NFC_UNKNOWN-as-well.patch new file mode 100644 index 0000000..d8cff28 --- /dev/null +++ b/package/miniupnpd/patches/107-conditionnaly-use-NFC_UNKNOWN-as-well.patch @@ -0,0 +1,63 @@ +From f7d65cdaad40c45b3ea308c5083ede0fa2e6b829 Mon Sep 17 00:00:00 2001 +From: Thomas Bernard +Date: Sun, 3 Feb 2019 19:04:44 +0100 +Subject: [PATCH] netfilter/ipctcrdr.c: conditionnaly use NFC_UNKNOWN + as well + +fix #346 +--- + netfilter/iptcrdr.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +--- a/netfilter/iptcrdr.c ++++ b/netfilter/iptcrdr.c +@@ -1116,7 +1116,9 @@ addnatrule(int proto, unsigned short epo + } else { + match = get_udp_match(eport, 0); + } ++#ifdef NFC_UNKNOWN + e->nfcache = NFC_UNKNOWN; ++#endif + target = get_dnat_target(iaddr, iport); + #ifdef NFC_IP_DST_PT + e->nfcache |= NFC_IP_DST_PT; +@@ -1188,7 +1190,9 @@ addmasqueraderule(int proto, + } else { + match = get_udp_match(0, iport); + } ++#ifdef NFC_UNKNOWN + e->nfcache = NFC_UNKNOWN; ++#endif + target = get_masquerade_target(eport); + #ifdef NFC_IP_DST_PT + e->nfcache |= NFC_IP_DST_PT; +@@ -1270,7 +1274,9 @@ addpeernatrule(int proto, + } else { + match = get_udp_match(rport, iport); + } ++#ifdef NFC_UNKNOWN + e->nfcache = NFC_UNKNOWN; ++#endif + target = get_snat_target(eaddr, eport); + #ifdef NFC_IP_DST_PT + e->nfcache |= NFC_IP_DST_PT; +@@ -1346,7 +1352,9 @@ addpeerdscprule(int proto, unsigned char + } else { + match = get_udp_match(rport, iport); + } ++#ifdef NFC_UNKNOWN + e->nfcache = NFC_UNKNOWN; ++#endif + target = get_dscp_target(dscp); + #ifdef NFC_IP_DST_PT + e->nfcache |= NFC_IP_DST_PT; +@@ -1436,7 +1444,9 @@ add_filter_rule(int proto, const char * + } + e->ip.dst.s_addr = inet_addr(iaddr); + e->ip.dmsk.s_addr = INADDR_NONE; ++#ifdef NFC_UNKNOWN + e->nfcache = NFC_UNKNOWN; ++#endif + target = get_accept_target(); + #ifdef NFC_IP_DST_PT + e->nfcache |= NFC_IP_DST_PT; diff --git a/package/miniupnpd/patches/108-memory-allocation-fix-in-get_portmappings_in_range.patch b/package/miniupnpd/patches/108-memory-allocation-fix-in-get_portmappings_in_range.patch new file mode 100644 index 0000000..ad27d3b --- /dev/null +++ b/package/miniupnpd/patches/108-memory-allocation-fix-in-get_portmappings_in_range.patch @@ -0,0 +1,32 @@ +From a77d1ff9d3b6af27ea5dae235f0ed74c0b256c47 Mon Sep 17 00:00:00 2001 +From: Thomas Bernard +Date: Sat, 24 Aug 2019 10:54:46 +0200 +Subject: [PATCH] iptcrdr.c: memory allocation fix in + get_portmappings_in_range() + +fixes #394 +--- + netfilter/iptcrdr.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +--- a/netfilter/iptcrdr.c ++++ b/netfilter/iptcrdr.c +@@ -1,6 +1,6 @@ +-/* $Id: iptcrdr.c,v 1.59 2016/03/08 09:23:52 nanard Exp $ */ ++/* $Id: iptcrdr.c,v 1.62 2019/08/24 07:06:22 nanard Exp $ */ + /* MiniUPnP project +- * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ ++ * http://miniupnp.free.fr/ or https://miniupnp.tuxfamily.org/ + * (c) 2006-2019 Thomas Bernard + * This software is subject to the conditions detailed + * in the LICENCE file provided within the distribution */ +@@ -1553,6 +1553,9 @@ get_portmappings_in_range(unsigned short + { + unsigned short * tmp; + /* need to increase the capacity of the array */ ++ capacity += 128; ++ if (capacity <= *number) ++ capacity = *number + 1; + tmp = realloc(array, sizeof(unsigned short)*capacity); + if(!tmp) + { diff --git a/package/wifi-profile/files/mt7981/l1profile.dat b/package/wifi-profile/files/mt7981/l1profile.dat index 1df110d..0d0a281 100644 --- a/package/wifi-profile/files/mt7981/l1profile.dat +++ b/package/wifi-profile/files/mt7981/l1profile.dat @@ -1,5 +1,5 @@ Default -INDEX0=MT7981 +INDEX0=MT7986 INDEX0_profile_path=/etc/wireless/mediatek/mt7981.dbdc.b0.dat;/etc/wireless/mediatek/mt7981.dbdc.b1.dat INDEX0_init_script=/lib/wifi/mtwifi.lua;/lib/wifi/mtwifi.lua INDEX0_init_compatible=mtwifi;mtwifi @@ -14,4 +14,20 @@ INDEX0_mesh_ifname=mesh;meshx INDEX0_nvram_zone=dev1;dev2 INDEX0_single_sku_path=/etc/wireless/mediatek/mt7981-sku.dat INDEX0_bf_sku_path=/etc/wireless/mediatek/mt7981-sku-bf.dat +INDEX1=MT7981 +INDEX1_profile_path=/etc/wireless/mediatek/mt7981.dbdc.b0.dat;/etc/wireless/mediatek/mt7981.dbdc.b1.dat +INDEX1_init_script=/lib/wifi/mtwifi.lua;/lib/wifi/mtwifi.lua +INDEX1_init_compatible=mtwifi;mtwifi +INDEX1_EEPROM_offset=0x0 +INDEX1_EEPROM_size=0xA0000 +INDEX1_EEPROM_name=e2p +INDEX1_main_ifname=ra0;rax0 +INDEX1_ext_ifname=ra;rax +INDEX1_wds_ifname=wds;wdsx +INDEX1_apcli_ifname=apcli;apclix +INDEX1_mesh_ifname=mesh;meshx +INDEX1_nvram_zone=dev1;dev2 +INDEX1_single_sku_path=/etc/wireless/mediatek/mt7981-sku.dat +INDEX1_bf_sku_path=/etc/wireless/mediatek/mt7981-sku-bf.dat + diff --git a/package/wifi-profile/files/mt7981/mt7981.dbdc.b0.dat b/package/wifi-profile/files/mt7981/mt7981.dbdc.b0.dat index f7cdebe..0cce7c8 100644 --- a/package/wifi-profile/files/mt7981/mt7981.dbdc.b0.dat +++ b/package/wifi-profile/files/mt7981/mt7981.dbdc.b0.dat @@ -139,9 +139,9 @@ HT_MpduDensity=4 HT_OpMode=0 HT_PROTECT=1 HT_RDG=0 -HT_RxStream=2 +HT_RxStream=4 HT_STBC=1 -HT_TxStream=2 +HT_TxStream=4 IcapMode=0 idle_timeout_interval=0 IEEE80211H=1 diff --git a/package/wifi-profile/files/mt7981/mt7981.dbdc.b1.dat b/package/wifi-profile/files/mt7981/mt7981.dbdc.b1.dat index ec0f47b..70c43b0 100644 --- a/package/wifi-profile/files/mt7981/mt7981.dbdc.b1.dat +++ b/package/wifi-profile/files/mt7981/mt7981.dbdc.b1.dat @@ -142,9 +142,9 @@ HT_MpduDensity=4 HT_OpMode=0 HT_PROTECT=1 HT_RDG=0 -HT_RxStream=2 +HT_RxStream=4 HT_STBC=1 -HT_TxStream=2 +HT_TxStream=4 IcapMode=0 idle_timeout_interval=0 IEEE80211H=1 diff --git a/target/linux/generic/backport-5.4/901-add-fwnode_get_name.patch b/target/linux/generic/backport-5.4/901-add-fwnode_get_name.patch new file mode 100644 index 0000000..8c5de17 --- /dev/null +++ b/target/linux/generic/backport-5.4/901-add-fwnode_get_name.patch @@ -0,0 +1,175 @@ +From bc0500c1e43d95cca5352d2345fb0769f314ba22 Mon Sep 17 00:00:00 2001 +From: Sakari Ailus +Date: Thu, 3 Oct 2019 15:32:12 +0300 +Subject: [PATCH] device property: Add fwnode_get_name for returning the name + of a node + +The fwnode framework did not have means to obtain the name of a node. Add +that now, in form of the fwnode_get_name() function and a corresponding +get_name fwnode op. OF and ACPI support is included. + +Signed-off-by: Sakari Ailus +Acked-by: Rob Herring (for OF) +Reviewed-by: Andy Shevchenko +Signed-off-by: Rafael J. Wysocki +--- + drivers/acpi/property.c | 26 ++++++++++++++++++++++++++ + drivers/base/property.c | 11 +++++++++++ + drivers/base/swnode.c | 12 ++++++++++++ + drivers/of/property.c | 6 ++++++ + include/linux/fwnode.h | 2 ++ + include/linux/property.h | 1 + + 6 files changed, 58 insertions(+) + +diff --git a/drivers/acpi/property.c b/drivers/acpi/property.c +index 3eacf474e1e39b..a501c1c584b5ce 100644 +--- a/drivers/acpi/property.c ++++ b/drivers/acpi/property.c +@@ -1317,6 +1317,31 @@ acpi_fwnode_get_reference_args(const struct fwnode_handle *fwnode, + args_count, args); + } + ++static const char *acpi_fwnode_get_name(const struct fwnode_handle *fwnode) ++{ ++ const struct acpi_device *adev; ++ struct fwnode_handle *parent; ++ ++ /* Is this the root node? */ ++ parent = fwnode_get_parent(fwnode); ++ if (!parent) ++ return "\\"; ++ ++ fwnode_handle_put(parent); ++ ++ if (is_acpi_data_node(fwnode)) { ++ const struct acpi_data_node *dn = to_acpi_data_node(fwnode); ++ ++ return dn->name; ++ } ++ ++ adev = to_acpi_device_node(fwnode); ++ if (WARN_ON(!adev)) ++ return NULL; ++ ++ return acpi_device_bid(adev); ++} ++ + static struct fwnode_handle * + acpi_fwnode_get_parent(struct fwnode_handle *fwnode) + { +@@ -1357,6 +1382,7 @@ acpi_fwnode_device_get_match_data(const struct fwnode_handle *fwnode, + .get_parent = acpi_node_get_parent, \ + .get_next_child_node = acpi_get_next_subnode, \ + .get_named_child_node = acpi_fwnode_get_named_child_node, \ ++ .get_name = acpi_fwnode_get_name, \ + .get_reference_args = acpi_fwnode_get_reference_args, \ + .graph_get_next_endpoint = \ + acpi_graph_get_next_endpoint, \ +diff --git a/drivers/base/property.c b/drivers/base/property.c +index f2e555e68b56a4..9b5ec88e72d8bf 100644 +--- a/drivers/base/property.c ++++ b/drivers/base/property.c +@@ -556,6 +556,17 @@ int device_add_properties(struct device *dev, + } + EXPORT_SYMBOL_GPL(device_add_properties); + ++/** ++ * fwnode_get_name - Return the name of a node ++ * @fwnode: The firmware node ++ * ++ * Returns a pointer to the node name. ++ */ ++const char *fwnode_get_name(const struct fwnode_handle *fwnode) ++{ ++ return fwnode_call_ptr_op(fwnode, get_name); ++} ++ + /** + * fwnode_get_parent - Return parent firwmare node + * @fwnode: Firmware whose parent is retrieved +diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c +index 9cde143201f5f4..eacca6a6626b7a 100644 +--- a/drivers/base/swnode.c ++++ b/drivers/base/swnode.c +@@ -515,6 +515,17 @@ static int software_node_read_string_array(const struct fwnode_handle *fwnode, + propname, val, nval); + } + ++static const char * ++software_node_get_name(const struct fwnode_handle *fwnode) ++{ ++ const struct swnode *swnode = to_swnode(fwnode); ++ ++ if (!swnode) ++ return "(null)"; ++ ++ return kobject_name(&swnode->kobj); ++} ++ + static struct fwnode_handle * + software_node_get_parent(const struct fwnode_handle *fwnode) + { +@@ -615,6 +626,7 @@ static const struct fwnode_operations software_node_ops = { + .property_present = software_node_property_present, + .property_read_int_array = software_node_read_int_array, + .property_read_string_array = software_node_read_string_array, ++ .get_name = software_node_get_name, + .get_parent = software_node_get_parent, + .get_next_child_node = software_node_get_next_child, + .get_named_child_node = software_node_get_named_child_node, +diff --git a/drivers/of/property.c b/drivers/of/property.c +index d7fa75e31f2241..5bed634551ea65 100644 +--- a/drivers/of/property.c ++++ b/drivers/of/property.c +@@ -872,6 +872,11 @@ of_fwnode_property_read_string_array(const struct fwnode_handle *fwnode, + of_property_count_strings(node, propname); + } + ++static const char *of_fwnode_get_name(const struct fwnode_handle *fwnode) ++{ ++ return kbasename(to_of_node(fwnode)->full_name); ++} ++ + static struct fwnode_handle * + of_fwnode_get_parent(const struct fwnode_handle *fwnode) + { +@@ -993,6 +998,7 @@ const struct fwnode_operations of_fwnode_ops = { + .property_present = of_fwnode_property_present, + .property_read_int_array = of_fwnode_property_read_int_array, + .property_read_string_array = of_fwnode_property_read_string_array, ++ .get_name = of_fwnode_get_name, + .get_parent = of_fwnode_get_parent, + .get_next_child_node = of_fwnode_get_next_child_node, + .get_named_child_node = of_fwnode_get_named_child_node, +diff --git a/include/linux/fwnode.h b/include/linux/fwnode.h +index ababd6bc82f33c..2bbf55739a5736 100644 +--- a/include/linux/fwnode.h ++++ b/include/linux/fwnode.h +@@ -56,6 +56,7 @@ struct fwnode_reference_args { + * otherwise. + * @property_read_string_array: Read an array of string properties. Return zero + * on success, a negative error code otherwise. ++ * @get_name: Return the name of an fwnode. + * @get_parent: Return the parent of an fwnode. + * @get_next_child_node: Return the next child node in an iteration. + * @get_named_child_node: Return a child node with a given name. +@@ -82,6 +83,7 @@ struct fwnode_operations { + (*property_read_string_array)(const struct fwnode_handle *fwnode_handle, + const char *propname, const char **val, + size_t nval); ++ const char *(*get_name)(const struct fwnode_handle *fwnode); + struct fwnode_handle *(*get_parent)(const struct fwnode_handle *fwnode); + struct fwnode_handle * + (*get_next_child_node)(const struct fwnode_handle *fwnode, +diff --git a/include/linux/property.h b/include/linux/property.h +index ea27c5811e1b32..afa84c47bf169a 100644 +--- a/include/linux/property.h ++++ b/include/linux/property.h +@@ -80,6 +80,7 @@ struct fwnode_handle *fwnode_find_reference(const struct fwnode_handle *fwnode, + const char *name, + unsigned int index); + ++const char *fwnode_get_name(const struct fwnode_handle *fwnode); + struct fwnode_handle *fwnode_get_parent(const struct fwnode_handle *fwnode); + struct fwnode_handle *fwnode_get_next_parent( + struct fwnode_handle *fwnode); diff --git a/target/linux/generic/backport-5.4/902-export-fwnode-get-name.patch b/target/linux/generic/backport-5.4/902-export-fwnode-get-name.patch new file mode 100644 index 0000000..664d771 --- /dev/null +++ b/target/linux/generic/backport-5.4/902-export-fwnode-get-name.patch @@ -0,0 +1,10 @@ +--- a/drivers/base/property.c ++++ b/drivers/base/property.c +@@ -566,6 +566,7 @@ const char *fwnode_get_name(const struct + { + return fwnode_call_ptr_op(fwnode, get_name); + } ++EXPORT_SYMBOL_GPL(fwnode_get_name); + + /** + * fwnode_get_next_parent - Iterate to the node's parent diff --git a/target/linux/generic/files-5.4/drivers/leds/led-class-multicolor.c b/target/linux/generic/files-5.4/drivers/leds/led-class-multicolor.c new file mode 100644 index 0000000..e317408 --- /dev/null +++ b/target/linux/generic/files-5.4/drivers/leds/led-class-multicolor.c @@ -0,0 +1,203 @@ +// SPDX-License-Identifier: GPL-2.0 +// LED Multicolor class interface +// Copyright (C) 2019-20 Texas Instruments Incorporated - http://www.ti.com/ +// Author: Dan Murphy + +#include +#include +#include +#include +#include +#include + +#include "leds.h" + +int led_mc_calc_color_components(struct led_classdev_mc *mcled_cdev, + enum led_brightness brightness) +{ + struct led_classdev *led_cdev = &mcled_cdev->led_cdev; + int i; + + for (i = 0; i < mcled_cdev->num_colors; i++) + mcled_cdev->subled_info[i].brightness = brightness * + mcled_cdev->subled_info[i].intensity / + led_cdev->max_brightness; + + return 0; +} +EXPORT_SYMBOL_GPL(led_mc_calc_color_components); + +static ssize_t multi_intensity_store(struct device *dev, + struct device_attribute *intensity_attr, + const char *buf, size_t size) +{ + struct led_classdev *led_cdev = dev_get_drvdata(dev); + struct led_classdev_mc *mcled_cdev = lcdev_to_mccdev(led_cdev); + int nrchars, offset = 0; + int intensity_value[LED_COLOR_ID_MAX]; + int i; + ssize_t ret; + + mutex_lock(&led_cdev->led_access); + + for (i = 0; i < mcled_cdev->num_colors; i++) { + ret = sscanf(buf + offset, "%i%n", + &intensity_value[i], &nrchars); + if (ret != 1) { + ret = -EINVAL; + goto err_out; + } + offset += nrchars; + } + + offset++; + if (offset < size) { + ret = -EINVAL; + goto err_out; + } + + for (i = 0; i < mcled_cdev->num_colors; i++) + mcled_cdev->subled_info[i].intensity = intensity_value[i]; + + led_set_brightness(led_cdev, led_cdev->brightness); + ret = size; +err_out: + mutex_unlock(&led_cdev->led_access); + return ret; +} + +static ssize_t multi_intensity_show(struct device *dev, + struct device_attribute *intensity_attr, + char *buf) +{ + struct led_classdev *led_cdev = dev_get_drvdata(dev); + struct led_classdev_mc *mcled_cdev = lcdev_to_mccdev(led_cdev); + int len = 0; + int i; + + for (i = 0; i < mcled_cdev->num_colors; i++) { + len += sprintf(buf + len, "%d", + mcled_cdev->subled_info[i].intensity); + if (i < mcled_cdev->num_colors - 1) + len += sprintf(buf + len, " "); + } + + buf[len++] = '\n'; + return len; +} +static DEVICE_ATTR_RW(multi_intensity); + +static ssize_t multi_index_show(struct device *dev, + struct device_attribute *multi_index_attr, + char *buf) +{ + struct led_classdev *led_cdev = dev_get_drvdata(dev); + struct led_classdev_mc *mcled_cdev = lcdev_to_mccdev(led_cdev); + int len = 0; + int index; + int i; + + for (i = 0; i < mcled_cdev->num_colors; i++) { + index = mcled_cdev->subled_info[i].color_index; + len += sprintf(buf + len, "%s", led_colors[index]); + if (i < mcled_cdev->num_colors - 1) + len += sprintf(buf + len, " "); + } + + buf[len++] = '\n'; + return len; +} +static DEVICE_ATTR_RO(multi_index); + +static struct attribute *led_multicolor_attrs[] = { + &dev_attr_multi_intensity.attr, + &dev_attr_multi_index.attr, + NULL, +}; +ATTRIBUTE_GROUPS(led_multicolor); + +int led_classdev_multicolor_register_ext(struct device *parent, + struct led_classdev_mc *mcled_cdev, + struct led_init_data *init_data) +{ + struct led_classdev *led_cdev; + + if (!mcled_cdev) + return -EINVAL; + + if (mcled_cdev->num_colors <= 0) + return -EINVAL; + + if (mcled_cdev->num_colors > LED_COLOR_ID_MAX) + return -EINVAL; + + led_cdev = &mcled_cdev->led_cdev; + mcled_cdev->led_cdev.groups = led_multicolor_groups; + + return led_classdev_register_ext(parent, led_cdev, init_data); +} +EXPORT_SYMBOL_GPL(led_classdev_multicolor_register_ext); + +void led_classdev_multicolor_unregister(struct led_classdev_mc *mcled_cdev) +{ + if (!mcled_cdev) + return; + + led_classdev_unregister(&mcled_cdev->led_cdev); +} +EXPORT_SYMBOL_GPL(led_classdev_multicolor_unregister); + +static void devm_led_classdev_multicolor_release(struct device *dev, void *res) +{ + led_classdev_multicolor_unregister(*(struct led_classdev_mc **)res); +} + +int devm_led_classdev_multicolor_register_ext(struct device *parent, + struct led_classdev_mc *mcled_cdev, + struct led_init_data *init_data) +{ + struct led_classdev_mc **dr; + int ret; + + dr = devres_alloc(devm_led_classdev_multicolor_release, + sizeof(*dr), GFP_KERNEL); + if (!dr) + return -ENOMEM; + + ret = led_classdev_multicolor_register_ext(parent, mcled_cdev, + init_data); + if (ret) { + devres_free(dr); + return ret; + } + + *dr = mcled_cdev; + devres_add(parent, dr); + + return 0; +} +EXPORT_SYMBOL_GPL(devm_led_classdev_multicolor_register_ext); + +static int devm_led_classdev_multicolor_match(struct device *dev, + void *res, void *data) +{ + struct led_classdev_mc **p = res; + + if (WARN_ON(!p || !*p)) + return 0; + + return *p == data; +} + +void devm_led_classdev_multicolor_unregister(struct device *dev, + struct led_classdev_mc *mcled_cdev) +{ + WARN_ON(devres_release(dev, + devm_led_classdev_multicolor_release, + devm_led_classdev_multicolor_match, mcled_cdev)); +} +EXPORT_SYMBOL_GPL(devm_led_classdev_multicolor_unregister); + +MODULE_AUTHOR("Dan Murphy "); +MODULE_DESCRIPTION("Multicolor LED class interface"); +MODULE_LICENSE("GPL v2"); diff --git a/target/linux/generic/files/include/linux/led-class-multicolor.h b/target/linux/generic/files/include/linux/led-class-multicolor.h new file mode 100644 index 0000000..210d57b --- /dev/null +++ b/target/linux/generic/files/include/linux/led-class-multicolor.h @@ -0,0 +1,109 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* LED Multicolor class interface + * Copyright (C) 2019-20 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#ifndef _LINUX_MULTICOLOR_LEDS_H_INCLUDED +#define _LINUX_MULTICOLOR_LEDS_H_INCLUDED + +#include +#include + +struct mc_subled { + unsigned int color_index; + unsigned int brightness; + unsigned int intensity; + unsigned int channel; +}; + +struct led_classdev_mc { + /* led class device */ + struct led_classdev led_cdev; + unsigned int num_colors; + + struct mc_subled *subled_info; +}; + +static inline struct led_classdev_mc *lcdev_to_mccdev( + struct led_classdev *led_cdev) +{ + return container_of(led_cdev, struct led_classdev_mc, led_cdev); +} + +#if IS_ENABLED(CONFIG_LEDS_CLASS_MULTICOLOR) +/** + * led_classdev_multicolor_register_ext - register a new object of led_classdev + * class with support for multicolor LEDs + * @parent: the multicolor LED to register + * @mcled_cdev: the led_classdev_mc structure for this device + * @init_data: the LED class multicolor device initialization data + * + * Returns: 0 on success or negative error value on failure + */ +int led_classdev_multicolor_register_ext(struct device *parent, + struct led_classdev_mc *mcled_cdev, + struct led_init_data *init_data); + +/** + * led_classdev_multicolor_unregister - unregisters an object of led_classdev + * class with support for multicolor LEDs + * @mcled_cdev: the multicolor LED to unregister + * + * Unregister a previously registered via led_classdev_multicolor_register + * object + */ +void led_classdev_multicolor_unregister(struct led_classdev_mc *mcled_cdev); + +/* Calculate brightness for the monochrome LED cluster */ +int led_mc_calc_color_components(struct led_classdev_mc *mcled_cdev, + enum led_brightness brightness); + +int devm_led_classdev_multicolor_register_ext(struct device *parent, + struct led_classdev_mc *mcled_cdev, + struct led_init_data *init_data); + +void devm_led_classdev_multicolor_unregister(struct device *parent, + struct led_classdev_mc *mcled_cdev); +#else + +static inline int led_classdev_multicolor_register_ext(struct device *parent, + struct led_classdev_mc *mcled_cdev, + struct led_init_data *init_data) +{ + return 0; +} + +static inline void led_classdev_multicolor_unregister(struct led_classdev_mc *mcled_cdev) {}; +static inline int led_mc_calc_color_components(struct led_classdev_mc *mcled_cdev, + enum led_brightness brightness) +{ + return 0; +} + +static inline int devm_led_classdev_multicolor_register_ext(struct device *parent, + struct led_classdev_mc *mcled_cdev, + struct led_init_data *init_data) +{ + return 0; +} + +static inline void devm_led_classdev_multicolor_unregister(struct device *parent, + struct led_classdev_mc *mcled_cdev) +{}; + +#endif /* IS_ENABLED(CONFIG_LEDS_CLASS_MULTICOLOR) */ + +static inline int led_classdev_multicolor_register(struct device *parent, + struct led_classdev_mc *mcled_cdev) +{ + return led_classdev_multicolor_register_ext(parent, mcled_cdev, NULL); +} + +static inline int devm_led_classdev_multicolor_register(struct device *parent, + struct led_classdev_mc *mcled_cdev) +{ + return devm_led_classdev_multicolor_register_ext(parent, mcled_cdev, + NULL); +} + +#endif /* _LINUX_MULTICOLOR_LEDS_H_INCLUDED */ diff --git a/target/linux/generic/pending-5.4/841-add-leds-class-multicolor.patch b/target/linux/generic/pending-5.4/841-add-leds-class-multicolor.patch new file mode 100644 index 0000000..08f2053 --- /dev/null +++ b/target/linux/generic/pending-5.4/841-add-leds-class-multicolor.patch @@ -0,0 +1,30 @@ +--- a/drivers/leds/Kconfig ++++ b/drivers/leds/Kconfig +@@ -30,6 +30,17 @@ config LEDS_CLASS_FLASH + for the flash related features of a LED device. It can be built + as a module. + ++config LEDS_CLASS_MULTICOLOR ++ tristate "LED Multicolor Class Support" ++ depends on LEDS_CLASS ++ default n ++ help ++ This option enables the multicolor LED sysfs class in /sys/class/leds. ++ It wraps LED class and adds multicolor LED specific sysfs attributes ++ and kernel internal API to it. You'll need this to provide support ++ for multicolor LEDs that are grouped together. This class is not ++ intended for single color LEDs. It can be built as a module. ++ + config LEDS_BRIGHTNESS_HW_CHANGED + bool "LED Class brightness_hw_changed attribute support" + depends on LEDS_CLASS +--- a/drivers/leds/Makefile ++++ b/drivers/leds/Makefile +@@ -4,6 +4,7 @@ + obj-$(CONFIG_NEW_LEDS) += led-core.o + obj-$(CONFIG_LEDS_CLASS) += led-class.o + obj-$(CONFIG_LEDS_CLASS_FLASH) += led-class-flash.o ++obj-$(CONFIG_LEDS_CLASS_MULTICOLOR) += led-class-multicolor.o + obj-$(CONFIG_LEDS_TRIGGERS) += led-triggers.o + + # LED Platform Drivers diff --git a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-360-t7-108M.dts b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-360-t7-108M.dts index c174944..4ec31c1 100644 --- a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-360-t7-108M.dts +++ b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-360-t7-108M.dts @@ -28,9 +28,11 @@ partition@180000 { label = "Factory"; - reg = <0x180000 0x200000>; + reg = <0x180000 0x0200000>; }; + + partition@380000 { label = "FIP"; reg = <0x380000 0x200000>; diff --git a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-cetron-ct3003.dts b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-cetron-ct3003.dts index d4396fc..f2a1a8e 100644 --- a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-cetron-ct3003.dts +++ b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-cetron-ct3003.dts @@ -58,7 +58,7 @@ switch-button = "gpio-455"; reset-button = "gpio-456"; radio = "mt798111 mt798112"; - cfg-partition = "/dev/mtd7"; + cfg-partition = "/dev/mtd3"; flash_size = <128>; factory_data { device_mac = "stock-factory", "0xb0"; @@ -95,7 +95,7 @@ }; partition@180000 { - label = "ART"; + label = "stock-factory"; reg = <0x180000 0x0100000>; }; @@ -198,9 +198,9 @@ }; &hnat { - mtketh-wan = "eth1"; - mtketh-lan = "eth0"; - mtketh-max-gmac = <2>; + mtketh-wan = "eth0.2"; + mtketh-lan = "eth0.1"; + mtketh-max-gmac = <1>; status = "okay"; }; diff --git a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-cmcc-a10.dts b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-cmcc-a10.dts new file mode 100644 index 0000000..b9f93e3 --- /dev/null +++ b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-cmcc-a10.dts @@ -0,0 +1,285 @@ +/dts-v1/; +#include "mt7981.dtsi" +/ { + model = "CMCC A10"; + compatible = "cmcc,a10", "mediatek,mt7981"; + chosen { + bootargs = "console=ttyS0,115200n1 loglevel=8 earlycon=uart8250,mmio32,0x11002000"; + }; + + memory { + reg = <0 0x40000000 0 0x10000000>; + }; + + gl-hw { + compatible = "gl-hw-info"; + model = "mt3000"; + wan = "eth1"; + lan = "eth0"; + temperature = "/sys/devices/virtual/thermal/thermal_zone0/temp"; + switch-button = "gpio-455"; + reset-button = "gpio-456"; + radio = "mt798111 mt798112"; + cfg-partition = "/dev/mtd4"; + flash_size = <128>; + factory_data { + device_mac = "stock-factory", "0xb0"; + device_ddns = "stock-factory", "0xc0"; + device_sn_bak = "stock-factory", "0xd0"; + device_sn = "stock-factory", "0xe0"; + country_code = "stock-factory", "0x7a"; + }; + }; + + + leds { + compatible = "gpio-leds"; + + led_wan_internet { + label = "a10:blue"; + gpios = <&pio 10 GPIO_ACTIVE_LOW>; + }; + + led_lan3 { + label = "a10:green"; + gpios = <&pio 9 GPIO_ACTIVE_LOW>; + }; + led_sys { + label = "a10:red"; + gpios = <&pio 11 GPIO_ACTIVE_LOW>; + }; + }; + + gpio-keys { + compatible = "gpio-keys"; + reset { + label = "reset"; + linux,code = ; + gpios = <&pio 1 GPIO_ACTIVE_LOW>; + }; + + wps { + label = "wps"; + linux,code = ; + gpios = <&pio 0 GPIO_ACTIVE_LOW>; + }; + }; + + gsw: gsw@0 { + compatible = "mediatek,mt753x"; + mediatek,ethsys = <ðsys>; + #address-cells = <1>; + #size-cells = <0>; + }; + + nmbm_spim_nand { + compatible = "generic,nmbm"; + #address-cells = <1>; + #size-cells = <1>; + + lower-mtd-device = <&spi_nand>; + forced-create; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <0x01>; + #size-cells = <0x01>; + + partition@0 { + label = "BL2"; + reg = <0x00 0x100000>; + read-only; + }; + + partition@100000 { + label = "u-boot-env"; + reg = <0x100000 0x80000>; + }; + + partition@180000 { + label = "Factory"; + reg = <0x180000 0x100000>; + }; + + partition@280000 { + label = "stock-factory"; + reg = <0x280000 0x100000>; + }; + + + partition@380000 { + label = "FIP"; + reg = <0x380000 0x200000>; + }; + + partition@580000 { + label = "ubi"; + reg = <0x580000 0x7000000>; + }; + + partition@7600000 { + label = "stock-factory"; + reg = <0x7580000 0x80000>; + }; + }; + }; +}; + +&uart0 { + status = "okay"; +}; + +&watchdog { + status = "okay"; +}; + +ð { + status = "okay"; + + gmac0: mac@0 { + compatible = "mediatek,eth-mac"; + reg = <0>; + phy-mode = "2500base-x"; + + fixed-link { + speed = <2500>; + full-duplex; + pause; + }; + }; + + gmac1: mac@1 { + compatible = "mediatek,eth-mac"; + reg = <1>; + phy-mode = "2500base-x"; + + fixed-link { + speed = <2500>; + full-duplex; + pause; + }; + }; + + mdio: mdio-bus { + #address-cells = <1>; + #size-cells = <0>; + }; +}; + +&gsw { + mediatek,mdio = <&mdio>; + mediatek,portmap = "llllw"; + mediatek,mdio_master_pinmux = <0>; + reset-gpios = <&pio 54 0>; + interrupt-parent = <&pio>; + interrupts = <38 IRQ_TYPE_LEVEL_HIGH>; + status = "okay"; + + port5: port@5 { + compatible = "mediatek,mt753x-port"; + reg = <5>; + phy-mode = "sgmii"; + + fixed-link { + speed = <2500>; + full-duplex; + }; + }; + + port6: port@6 { + compatible = "mediatek,mt753x-port"; + mediatek,ssc-on; + reg = <6>; + phy-mode = "sgmii"; + + fixed-link { + speed = <2500>; + full-duplex; + }; + }; +}; + +&hnat { + mtketh-wan = "eth1"; + mtketh-lan = "eth0"; + mtketh-max-gmac = <2>; + status = "okay"; +}; + +&spi0 { + pinctrl-names = "default"; + pinctrl-0 = <&spi0_flash_pins>; + status = "okay"; + + spi_nand: spi_nand@0 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "spi-nand"; + reg = <0>; + spi-max-frequency = <52000000>; + spi-tx-buswidth = <4>; + spi-rx-buswidth = <4>; + spi-cal-enable; + spi-cal-mode = "read-data"; + spi-cal-datalen = <7>; + spi-cal-data = /bits/ 8 <0x53 0x50 0x49 0x4E 0x41 0x4E 0x44>; /* 'SPINAND' */ + spi-cal-addrlen = <5>; + spi-cal-addr = /bits/ 32 <0x0 0x0 0x0 0x0 0x0>; + }; +}; + +&pio { + pwm0_pin: pwm0-pin-g0 { + mux { + function = "pwm"; + groups = "pwm0_0"; + }; + }; + + pwm1_pin: pwm1-pin-g0 { + mux { + function = "pwm"; + groups = "pwm1_0"; + }; + }; + + pwm2_pin: pwm2-pin { + mux { + function = "pwm"; + groups = "pwm2"; + }; + }; + + spi0_flash_pins: spi0-pins { + mux { + function = "spi"; + groups = "spi0", "spi0_wp_hold"; + }; + + conf-pu { + pins = "SPI0_CS", "SPI0_HOLD", "SPI0_WP"; + drive-strength = ; + bias-pull-up = ; + }; + + conf-pd { + pins = "SPI0_CLK", "SPI0_MOSI", "SPI0_MISO"; + drive-strength = ; + bias-pull-down = ; + }; + }; + + uart1_pins: uart1-pins-g1 { + mux { + function = "uart"; + groups = "uart1_1"; + }; + }; + + uart2_pins: uart2-pins-g1 { + mux { + function = "uart"; + groups = "uart2_1"; + }; + }; +}; diff --git a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-cmcc-rax3000m.dts b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-cmcc-rax3000m.dts index ee88e08..3281d73 100644 --- a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-cmcc-rax3000m.dts +++ b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-cmcc-rax3000m.dts @@ -21,7 +21,7 @@ switch-button = "gpio-455"; reset-button = "gpio-456"; radio = "mt798111 mt798112"; - cfg-partition = "/dev/mtd6"; + cfg-partition = "/dev/mtd4"; flash_size = <128>; factory_data { device_mac = "stock-factory", "0xb0"; @@ -102,9 +102,15 @@ partition@180000 { label = "Factory"; - reg = <0x180000 0x0200000>; + reg = <0x180000 0x0100000>; }; + partition@280000 { + label = "stock-factory"; + reg = <0x280000 0x100000>; + }; + + partition@380000 { label = "FIP"; @@ -116,10 +122,6 @@ reg = <0x580000 0x4000000>; }; - partition@7400000 { - label = "stock-factory"; - reg = <0x7400000 0x80000>; - }; }; }; }; diff --git a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-jcg-q30.dts b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-jcg-q30.dts index c062758..05ad729 100644 --- a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-jcg-q30.dts +++ b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-jcg-q30.dts @@ -57,7 +57,7 @@ switch-button = "gpio-455"; reset-button = "gpio-456"; radio = "mt798111 mt798112"; - cfg-partition = "/dev/mtd6"; + cfg-partition = "/dev/mtd4"; flash_size = <128>; factory_data { device_mac = "stock-factory", "0xb0"; @@ -95,9 +95,14 @@ partition@180000 { label = "Factory"; - reg = <0x180000 0x0200000>; + reg = <0x180000 0x100000>; }; + partition@280000 { + label = "stock-factory"; + reg = <0x280000 0x100000>; + }; + partition@380000 { label = "FIP"; reg = <0x380000 0x0200000>; @@ -108,10 +113,6 @@ reg = <0x580000 0x6e80000>; }; - partition@7400000 { - label = "stock-factory"; - reg = <0x7400000 0x80000>; - }; }; }; }; @@ -190,9 +191,9 @@ }; &hnat { - mtketh-wan = "eth1"; - mtketh-lan = "eth0"; - mtketh-max-gmac = <2>; + mtketh-wan = "eth0.2"; + mtketh-lan = "eth0.1"; + mtketh-max-gmac = <1>; status = "okay"; }; diff --git a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-komi-a31-base.dtsi b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-komi-a31-base.dtsi index 9240fad..ee3bfd9 100644 --- a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-komi-a31-base.dtsi +++ b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-komi-a31-base.dtsi @@ -22,7 +22,7 @@ switch-button = "gpio-455"; reset-button = "gpio-456"; radio = "mt798111 mt798112"; - cfg-partition = "/dev/mtd6"; + cfg-partition = "/dev/mtd4"; flash_size = <128>; factory_data { device_mac = "stock-factory", "0xb0"; diff --git a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-komi-a31.dts b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-komi-a31.dts index d603b09..d5d1cb8 100644 --- a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-komi-a31.dts +++ b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-komi-a31.dts @@ -26,9 +26,15 @@ }; partition@180000 { - label = "Factory"; - reg = <0x180000 0x200000>; - }; + label = "Factory"; + reg = <0x180000 0x0100000>; + }; + + partition@280000 { + label = "stock-factory"; + reg = <0x280000 0x100000>; + }; + partition@380000 { label = "FIP"; diff --git a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-xiaomi-wr30u-112M.dts b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-xiaomi-wr30u-112M.dts index 9c73b3b..546d97d 100644 --- a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-xiaomi-wr30u-112M.dts +++ b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-xiaomi-wr30u-112M.dts @@ -56,7 +56,7 @@ }; partition@7600000 { - label = "KF"; + label = "stock-factory"; reg = <0x7600000 0x40000>; }; }; diff --git a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-xiaomi-wr30u-base.dtsi b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-xiaomi-wr30u-base.dtsi index c3a5341..b907f12 100644 --- a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-xiaomi-wr30u-base.dtsi +++ b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-xiaomi-wr30u-base.dtsi @@ -25,11 +25,11 @@ cfg-partition = "/dev/mtd9"; flash_size = <128>; factory_data { - device_mac = "KF", "0xb0"; - device_ddns = "KF", "0xc0"; - device_sn_bak = "KF", "0xd0"; - device_sn = "KF", "0xe0"; - country_code = "KF", "0x7a"; + device_mac = "stock-factory", "0xb0"; + device_ddns = "stock-factory", "0xc0"; + device_sn_bak = "stock-factory", "0xd0"; + device_sn = "stock-factory", "0xe0"; + country_code = "stock-factory", "0x7a"; }; }; diff --git a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-tl-xdr-common.dtsi b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-tl-xdr-common.dtsi new file mode 100755 index 0000000..e04e454 --- /dev/null +++ b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-tl-xdr-common.dtsi @@ -0,0 +1,347 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR MIT) +/dts-v1/; + +#include +#include +#include + +#include "mt7986a.dtsi" +#include "mt7986a-pinctrl.dtsi" +/ { + + aliases { + serial0 = &uart0; + led-boot = &led_status_red; + led-failsafe = &led_status_red; + led-running = &led_status_green; + led-upgrade = &led_status_green; + }; + + chosen { + bootargs = "console=ttyS0,115200n1 loglevel=8 + earlycon=uart8250,mmio32,0x11002000"; + }; + + + memory { + reg = <0 0x40000000 0 0x10000000>; + }; + + gl-hw { + compatible = "gl-hw-info"; + model = "mt3000"; + wan = "eth1"; + lan = "eth0"; + temperature = "/sys/devices/virtual/thermal/thermal_zone0/temp"; + switch-button = "gpio-455"; + reset-button = "gpio-456"; + radio = "mt798111 mt798112"; + cfg-partition = "/dev/mtd7"; + flash_size = <128>; + factory_data { + device_mac = "stock-factory", "0xb0"; + device_ddns = "stock-factory", "0xc0"; + device_sn_bak = "stock-factory", "0xd0"; + device_sn = "stock-factory", "0xe0"; + country_code = "stock-factory", "0x7a"; + }; + }; + + + gpio-keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + linux,code = ; + gpios = <&pio 9 GPIO_ACTIVE_LOW>; + }; + + wps { + label = "wps"; + linux,code = ; + gpios = <&pio 10 GPIO_ACTIVE_LOW>; + }; + + turbo { + label = "turbo"; + linux,code = ; + gpios = <&pio 11 GPIO_ACTIVE_LOW>; + }; + }; + + + gsw: gsw@0 { + compatible = "mediatek,mt753x"; + mediatek,ethsys = <ðsys>; + #address-cells = <1>; + #size-cells = <0>; + }; + + leds { + compatible = "gpio-leds"; + + led_status_red: status_red { + label = "red:status"; + gpios = <&pio 7 GPIO_ACTIVE_HIGH>; + }; + + led_status_green: status_green { + label = "green:status"; + gpios = <&pio 8 GPIO_ACTIVE_HIGH>; + }; + + turbo { + label = "green:turbo"; + gpios = <&pio 12 GPIO_ACTIVE_HIGH>; + }; + }; + +}; + +ð { + status = "okay"; + + gmac0: mac@0 { + compatible = "mediatek,eth-mac"; + reg = <0>; + phy-mode = "2500base-x"; + ext-phy-reset-gpios = <&pio 13 0>; + fixed-link { + speed = <2500>; + full-duplex; + pause; + }; + }; + + gmac1: mac@1 { + compatible = "mediatek,eth-mac"; + reg = <1>; + phy-mode = "2500base-x"; + ext-phy-reset-gpios = <&pio 17 0>; + fixed-link { + speed = <2500>; + full-duplex; + pause; + }; + }; + + mdio: mdio-bus { + #address-cells = <1>; + #size-cells = <0>; + reset-gpios = <&pio 6 1>; + reset-delay-us = <600>; + + phy5: phy@5 { + compatible = "ethernet-phy-id67c9.de0a"; + reg = <5>; + }; + + phy6: phy@6 { + compatible = "ethernet-phy-ieee802.3-c45"; + reg = <6>; + }; + }; +}; + +&gsw { + mediatek,mdio = <&mdio>; + mediatek,portmap = "lllll"; + mediatek,mdio_master_pinmux = <0>; + reset-gpios = <&pio 5 0>; + interrupt-parent = <&pio>; + interrupts = <66 IRQ_TYPE_LEVEL_HIGH>; + status = "okay"; + + port5: port@5 { + compatible = "mediatek,mt753x-port"; + reg = <5>; + phy-mode = "sgmii"; + + fixed-link { + speed = <2500>; + full-duplex; + }; + }; + + port6: port@6 { + compatible = "mediatek,mt753x-port"; + mediatek,ssc-on; + reg = <6>; + phy-mode = "sgmii"; + fixed-link { + speed = <2500>; + full-duplex; + }; + }; +}; + + +&hnat { + mtketh-wan = "eth1"; + mtketh-lan = "eth0"; + mtketh-max-gmac = <2>; + mtketh-ppe-num = <2>; + status = "okay"; +}; + +&pio { + spi_flash_pins: spi-flash-pins-33-to-38 { + mux { + function = "flash"; + groups = "spi0", "spi0_wp_hold"; + }; + conf-pu { + pins = "SPI2_CS", "SPI2_HOLD", "SPI2_WP"; + drive-strength = <8>; + mediatek,pull-up-adv = <0>; + }; + conf-pd { + pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO"; + drive-strength = <8>; + mediatek,pull-down-adv = <0>; + }; + }; + + wf_2g_5g_pins: wf_2g_5g-pins { + mux { + function = "wifi"; + groups = "wf_2g", "wf_5g"; + }; + conf { + pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4", + "WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6", + "WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10", + "WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1", + "WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0", + "WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8", + "WF1_TOP_CLK", "WF1_TOP_DATA"; + drive-strength = ; + }; + }; + + wf_dbdc_pins: wf_dbdc-pins { + mux { + function = "wifi"; + groups = "wf_dbdc"; + }; + conf { + pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4", + "WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6", + "WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10", + "WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1", + "WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0", + "WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8", + "WF1_TOP_CLK", "WF1_TOP_DATA"; + drive-strength = ; + }; + }; +}; + +&pcie0 { + pinctrl-names = "default"; + pinctrl-0 = <&pcie0_pins>; + status = "okay"; +}; + +&uart0 { + status = "okay"; +}; + + +&xhci { + status = "okay"; +}; + + +&spi0 { + pinctrl-names = "default"; + pinctrl-0 = <&spi_flash_pins>; + status = "okay"; + cs-gpios = <0>, <0>; + spi_nand: spi_nand@0 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "spi-nand"; + reg = <1>; + spi-max-frequency = <20000000>; + spi-tx-buswidth = <4>; + spi-rx-buswidth = <4>; + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "bl2"; + reg = <0x000000 0x0100000>; + // read-only; + }; + + partition@100000 { + label = "config"; + reg = <0x100000 0x0060000>; + read-only; + }; + + Factory: partition@160000 { + label = "Factory"; + reg = <0x160000 0x00a0000>; + read-only; + }; + + partition@200000 { + label = "reserved"; + reg = <0x200000 0x0180000>; + read-only; + }; + + partition@380000 { + label = "fip"; + reg = <0x380000 0x0180000>; + // read-only; + }; + + partition@500000 { + label = "ubi"; + reg = <0x500000 0x7300000>; + }; + + partition@7800000 { + label = "stock-factory"; + reg = <0x7800000 0x80000>; + }; + }; + }; +}; + +&wbsys { + status = "okay"; + mediatek,mtd-eeprom = <&Factory 0x0000>; +/* + pinctrl-names = "default", "dbdc"; + pinctrl-0 = <&wf_2g_5g_pins>; + pinctrl-1 = <&wf_dbdc_pins>; +*/ +}; + + + +&watchdog { + status = "okay"; +}; + +&i2c0 { + pinctrl-names = "default"; + pinctrl-0 = <&i2c_pins>; + status = "okay"; + + wm8960: wm8960@1a { + compatible = "wlf,wm8960"; + reg = <0x1a>; + }; +}; + +&auxadc { + status = "okay"; +}; diff --git a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-tl-xdr6086.dts b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-tl-xdr6086.dts new file mode 100644 index 0000000..ee4ce9e --- /dev/null +++ b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-tl-xdr6086.dts @@ -0,0 +1,8 @@ +/dts-v1/; +#include "mt7986a-tl-xdr-common.dtsi" + +/ + { + model = "TP-Link TL-XDR6086"; + compatible = "tplink,tl-xdr6086", "mediatek,mt7986a"; + }; diff --git a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-tl-xdr6088.dts b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-tl-xdr6088.dts new file mode 100644 index 0000000..90c1127 --- /dev/null +++ b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-tl-xdr6088.dts @@ -0,0 +1,8 @@ +/dts-v1/; +#include "mt7986a-tl-xdr-common.dtsi" + +/ + { + model = "TP-Link TL-XDR6088"; + compatible = "tplink,tl-xdr6088", "mediatek,mt7986a"; + }; diff --git a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-xiaomi-redmi-router-ax6000-uboot.dts b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-xiaomi-redmi-router-ax6000-uboot.dts new file mode 100755 index 0000000..3e044be --- /dev/null +++ b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-xiaomi-redmi-router-ax6000-uboot.dts @@ -0,0 +1,375 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR MIT) +/dts-v1/; + +#include +#include +#include + +#include "mt7986a.dtsi" +#include "mt7986a-pinctrl.dtsi" +/ { + model = "Xiaomi Redmi Router AX6000"; + compatible = "xiaomi,redmi-router-ax6000-uboot", "mediatek,mt7986a"; + + aliases { + serial0 = &uart0; + led-boot = &led_status_rgb; + led-failsafe = &led_status_rgb; + led-running = &led_status_rgb; + led-upgrade = &led_status_rgb; + }; + + + chosen { + bootargs = "console=ttyS0,115200n1 loglevel=8 + earlycon=uart8250,mmio32,0x11002000"; + }; + memory { + reg = <0 0x40000000 0 0x10000000>; + }; + + + gl-hw { + compatible = "gl-hw-info"; + model = "mt3000"; + wan = "eth1"; + lan = "eth0"; + temperature = "/sys/devices/virtual/thermal/thermal_zone0/temp"; + switch-button = "gpio-455"; + reset-button = "gpio-456"; + radio = "mt798111 mt798112"; + cfg-partition = "/dev/mtd5"; + flash_size = <128>; + factory_data { + device_mac = "crash_log", "0xb0"; + device_ddns = "crash_log", "0xc0"; + device_sn_bak = "crash_log", "0xd0"; + device_sn = "crash_log", "0xe0"; + country_code = "crash_log", "0x7a"; + }; + }; + + gpio-keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + gpios = <&pio 9 GPIO_ACTIVE_LOW>; + linux,code = ; + }; + + wps { + label = "wps"; + gpios = <&pio 10 GPIO_ACTIVE_LOW>; + linux,code = ; + linux,input-type = ; + }; + }; + + nmbm_spim_nand { + compatible = "generic,nmbm"; + + #address-cells = <1>; + #size-cells = <1>; + + lower-mtd-device = <&spi_nand>; + forced-create; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "BL2"; + reg = <0x0 0x100000>; + read-only; + }; + + partition@100000 { + label = "Nvram"; + reg = <0x100000 0x40000>; + }; + + partition@140000 { + label = "Bdata"; + reg = <0x140000 0x40000>; + }; + + partition@180000 { + label = "Factory"; + reg = <0x180000 0x100000>; + }; + + partition@280000 { + label = "stock-factory"; + reg = <0x280000 0x100000>; + }; + + + partition@380000 { + label = "FIP"; + reg = <0x380000 0x200000>; + }; + + partition@580000 { + label = "crash"; + reg = <0x580000 0x40000>; + read-only; + }; + + partition@5c0000 { + label = "crash_log"; + reg = <0x5c0000 0x40000>; + read-only; + }; + + + /* ubi partition is the result of squashing + * consecutive stock partitions: + * - ubi + * - ubi1 + * - overlay + */ + + partition@600000 { + label = "ubi"; + reg = <0x600000 0x6e00000>; + }; + + /* last 12 MiB is reserved for NMBM bad block table */ + }; + + + }; + + gsw: gsw@0 { + compatible = "mediatek,mt753x"; + mediatek,ethsys = <ðsys>; + #address-cells = <1>; + #size-cells = <0>; + }; +}; + +ð { + status = "okay"; + + gmac0: mac@0 { + compatible = "mediatek,eth-mac"; + reg = <0>; + phy-mode = "2500base-x"; + + fixed-link { + speed = <2500>; + full-duplex; + pause; + }; + }; + + gmac1: mac@1 { + compatible = "mediatek,eth-mac"; + reg = <1>; + phy-mode = "2500base-x"; + + fixed-link { + speed = <2500>; + full-duplex; + pause; + }; + }; + + mdio: mdio-bus { + #address-cells = <1>; + #size-cells = <0>; + reset-gpios = <&pio 6 1>; + reset-delay-us = <600>; + + phy5: phy@5 { + compatible = "ethernet-phy-id67c9.de0a"; + reg = <5>; + }; + + phy6: phy@6 { + compatible = "ethernet-phy-ieee802.3-c45"; + reg = <6>; + }; + }; +}; + +&gsw { + mediatek,mdio = <&mdio>; + mediatek,portmap = "llllw"; + mediatek,mdio_master_pinmux = <0>; + reset-gpios = <&pio 5 0>; + interrupt-parent = <&pio>; + interrupts = <66 IRQ_TYPE_LEVEL_HIGH>; + status = "okay"; + + port5: port@5 { + compatible = "mediatek,mt753x-port"; + reg = <5>; + phy-mode = "sgmii"; + + fixed-link { + speed = <2500>; + full-duplex; + }; + }; + + port6: port@6 { + compatible = "mediatek,mt753x-port"; + mediatek,ssc-on; + reg = <6>; + phy-mode = "sgmii"; + fixed-link { + speed = <2500>; + full-duplex; + }; + }; +}; + + +&hnat { + mtketh-wan = "eth1"; + mtketh-lan = "eth0"; + mtketh-max-gmac = <2>; + mtketh-ppe-num = <2>; + status = "okay"; +}; + +&pio { + spi_flash_pins: spi-flash-pins-33-to-38 { + mux { + function = "flash"; + groups = "spi0", "spi0_wp_hold"; + }; + conf-pu { + pins = "SPI2_CS", "SPI2_HOLD", "SPI2_WP"; + drive-strength = <8>; + mediatek,pull-up-adv = <0>; + }; + conf-pd { + pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO"; + drive-strength = <8>; + mediatek,pull-down-adv = <0>; + }; + }; + + wf_2g_5g_pins: wf_2g_5g-pins { + mux { + function = "wifi"; + groups = "wf_2g", "wf_5g"; + }; + conf { + pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4", + "WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6", + "WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10", + "WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1", + "WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0", + "WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8", + "WF1_TOP_CLK", "WF1_TOP_DATA"; + drive-strength = ; + }; + }; + + wf_dbdc_pins: wf_dbdc-pins { + mux { + function = "wifi"; + groups = "wf_dbdc"; + }; + conf { + pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4", + "WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6", + "WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10", + "WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1", + "WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0", + "WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8", + "WF1_TOP_CLK", "WF1_TOP_DATA"; + drive-strength = ; + }; + }; +}; + +&pcie0 { + pinctrl-names = "default"; + pinctrl-0 = <&pcie0_pins>; + status = "okay"; +}; + +&uart0 { + status = "okay"; +}; + +&spi0 { + pinctrl-names = "default"; + pinctrl-0 = <&spi_flash_pins>; + status = "okay"; + cs-gpios = <0>, <0>; + spi_nand: spi_nand@0 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "spi-nand"; + reg = <1>; + spi-max-frequency = <20000000>; + spi-tx-buswidth = <4>; + spi-rx-buswidth = <4>; + }; +}; + +&wbsys { + status = "okay"; + mediatek,mtd-eeprom = <&Factory 0x0000>; +/* + pinctrl-names = "default", "dbdc"; + pinctrl-0 = <&wf_2g_5g_pins>; + pinctrl-1 = <&wf_dbdc_pins>; +*/ +}; + +&spi1 { + pinctrl-names = "default"; + pinctrl-0 = <&spic_pins_g2>; + status = "okay"; + + ws2812b@0 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "worldsemi,ws2812b"; + reg = <0>; + spi-max-frequency = <3000000>; + + led_status_rgb: led@0 { + reg = <0>; + label = "rgb:status"; + color-index = ; + color-intensity = <0 255 0>; /* GREEN */ + }; + + led_network_rgb: led@1 { + reg = <1>; + label = "rgb:network"; + color-index = ; + color-intensity = <0 0 255>; /* BLUE */ + }; + }; + }; + + +&watchdog { + status = "okay"; +}; + +&i2c0 { + pinctrl-names = "default"; + pinctrl-0 = <&i2c_pins>; + status = "okay"; + + wm8960: wm8960@1a { + compatible = "wlf,wm8960"; + reg = <0x1a>; + }; +}; + +&auxadc { + status = "okay"; +}; diff --git a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-xiaomi-redmi-router-ax6000.dts b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-xiaomi-redmi-router-ax6000.dts new file mode 100755 index 0000000..967de45 --- /dev/null +++ b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-xiaomi-redmi-router-ax6000.dts @@ -0,0 +1,351 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR MIT) +/dts-v1/; + +#include +#include +#include + +#include "mt7986a.dtsi" +#include "mt7986a-pinctrl.dtsi" +/ { + model = "Xiaomi Redmi Router AX6000"; + compatible = "xiaomi,redmi-router-ax6000", "mediatek,mt7986a"; + + + aliases { + serial0 = &uart0; + led-boot = &led_status_rgb; + led-failsafe = &led_status_rgb; + led-running = &led_status_rgb; + led-upgrade = &led_status_rgb; + }; + + chosen { + bootargs = "console=ttyS0,115200n1 loglevel=8 + earlycon=uart8250,mmio32,0x11002000"; + }; + memory { + reg = <0 0x40000000 0 0x10000000>; + }; + + + gpio-keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + gpios = <&pio 9 GPIO_ACTIVE_LOW>; + linux,code = ; + }; + + wps { + label = "wps"; + gpios = <&pio 10 GPIO_ACTIVE_LOW>; + linux,code = ; + linux,input-type = ; + }; + }; + + nmbm_spim_nand { + compatible = "generic,nmbm"; + + #address-cells = <1>; + #size-cells = <1>; + + lower-mtd-device = <&spi_nand>; + forced-create; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "BL2"; + reg = <0x0 0x100000>; + read-only; + }; + + partition@100000 { + label = "Nvram"; + reg = <0x100000 0x40000>; + }; + + partition@140000 { + label = "Bdata"; + reg = <0x140000 0x40000>; + }; + + Factory:partition@180000 { + label = "Factory"; + reg = <0x180000 0x200000>; + read-only; + }; + + partition@380000 { + label = "FIP"; + reg = <0x380000 0x200000>; + }; + + partition@580000 { + label = "crash"; + reg = <0x580000 0x40000>; + read-only; + }; + + partition@5c0000 { + label = "crash_log"; + reg = <0x5c0000 0x40000>; + read-only; + }; + + partition@600000 { + label = "ubi_kernel"; + reg = <0x600000 0x1e00000>; + }; + + /* ubi partition is the result of squashing + * consecutive stock partitions: + * - ubi + * - ubi1 + * - overlay + */ + partition@2400000 { + label = "ubi"; + reg = <0x2400000 0x5000000>; + }; + + /* last 12 MiB is reserved for NMBM bad block table */ + }; + }; + + gsw: gsw@0 { + compatible = "mediatek,mt753x"; + mediatek,ethsys = <ðsys>; + #address-cells = <1>; + #size-cells = <0>; + }; +}; + +ð { + status = "okay"; + + gmac0: mac@0 { + compatible = "mediatek,eth-mac"; + reg = <0>; + phy-mode = "2500base-x"; + + fixed-link { + speed = <2500>; + full-duplex; + pause; + }; + }; + + gmac1: mac@1 { + compatible = "mediatek,eth-mac"; + reg = <1>; + phy-mode = "2500base-x"; + + fixed-link { + speed = <2500>; + full-duplex; + pause; + }; + }; + + mdio: mdio-bus { + #address-cells = <1>; + #size-cells = <0>; + reset-gpios = <&pio 6 1>; + reset-delay-us = <600>; + + phy5: phy@5 { + compatible = "ethernet-phy-id67c9.de0a"; + reg = <5>; + }; + + phy6: phy@6 { + compatible = "ethernet-phy-ieee802.3-c45"; + reg = <6>; + }; + }; +}; + +&gsw { + mediatek,mdio = <&mdio>; + mediatek,portmap = "llllw"; + mediatek,mdio_master_pinmux = <0>; + reset-gpios = <&pio 5 0>; + interrupt-parent = <&pio>; + interrupts = <66 IRQ_TYPE_LEVEL_HIGH>; + status = "okay"; + + port5: port@5 { + compatible = "mediatek,mt753x-port"; + reg = <5>; + phy-mode = "sgmii"; + + fixed-link { + speed = <2500>; + full-duplex; + }; + }; + + port6: port@6 { + compatible = "mediatek,mt753x-port"; + mediatek,ssc-on; + reg = <6>; + phy-mode = "sgmii"; + fixed-link { + speed = <2500>; + full-duplex; + }; + }; +}; + + +&hnat { + mtketh-wan = "eth1"; + mtketh-lan = "eth0"; + mtketh-max-gmac = <2>; + mtketh-ppe-num = <2>; + status = "okay"; +}; + +&pio { + spi_flash_pins: spi-flash-pins-33-to-38 { + mux { + function = "flash"; + groups = "spi0", "spi0_wp_hold"; + }; + conf-pu { + pins = "SPI2_CS", "SPI2_HOLD", "SPI2_WP"; + drive-strength = <8>; + mediatek,pull-up-adv = <0>; + }; + conf-pd { + pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO"; + drive-strength = <8>; + mediatek,pull-down-adv = <0>; + }; + }; + + wf_2g_5g_pins: wf_2g_5g-pins { + mux { + function = "wifi"; + groups = "wf_2g", "wf_5g"; + }; + conf { + pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4", + "WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6", + "WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10", + "WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1", + "WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0", + "WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8", + "WF1_TOP_CLK", "WF1_TOP_DATA"; + drive-strength = ; + }; + }; + + wf_dbdc_pins: wf_dbdc-pins { + mux { + function = "wifi"; + groups = "wf_dbdc"; + }; + conf { + pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4", + "WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6", + "WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10", + "WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1", + "WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0", + "WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8", + "WF1_TOP_CLK", "WF1_TOP_DATA"; + drive-strength = ; + }; + }; +}; + +&pcie0 { + pinctrl-names = "default"; + pinctrl-0 = <&pcie0_pins>; + status = "okay"; +}; + +&uart0 { + status = "okay"; +}; + +&spi0 { + pinctrl-names = "default"; + pinctrl-0 = <&spi_flash_pins>; + status = "okay"; + cs-gpios = <0>, <0>; + spi_nand: spi_nand@0 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "spi-nand"; + reg = <1>; + spi-max-frequency = <20000000>; + spi-tx-buswidth = <4>; + spi-rx-buswidth = <4>; + }; +}; + +&wbsys { + status = "okay"; + mediatek,mtd-eeprom = <&Factory 0x0000>; +/* + pinctrl-names = "default", "dbdc"; + pinctrl-0 = <&wf_2g_5g_pins>; + pinctrl-1 = <&wf_dbdc_pins>; +*/ +}; + +&spi1 { + pinctrl-names = "default"; + pinctrl-0 = <&spic_pins_g2>; + status = "okay"; + + ws2812b@0 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "worldsemi,ws2812b"; + reg = <0>; + spi-max-frequency = <3000000>; + + led_status_rgb: led@0 { + reg = <0>; + label = "rgb:status"; + color-index = ; + color-intensity = <0 255 0>; /* GREEN */ + }; + + led_network_rgb: led@1 { + reg = <1>; + label = "rgb:network"; + color-index = ; + color-intensity = <0 0 255>; /* BLUE */ + }; + }; + }; + + +&watchdog { + status = "okay"; +}; + +&i2c0 { + pinctrl-names = "default"; + pinctrl-0 = <&i2c_pins>; + status = "okay"; + + wm8960: wm8960@1a { + compatible = "wlf,wm8960"; + reg = <0x1a>; + }; +}; + +&auxadc { + status = "okay"; +}; diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/Kconfig b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/Kconfig index 42e6b38..1a9a41f 100755 --- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/Kconfig +++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/Kconfig @@ -27,5 +27,12 @@ config NET_MEDIATEK_HNAT This driver supports the hardward Network Address Translation in the MediaTek MT7986/MT2701/MT7622/MT7629/MT7621 chipset family. + +config NET_MEDIATEK_EXT_PHY_RTL822X + tristate "MediaTek SOC PHY RTL822X" + depends on NET_MEDIATEK_SOC + select PHYLIB + ---help--- + This driver supports the gigabit ethernet rtl phy rtl822x endif #NET_VENDOR_MEDIATEK diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/Makefile b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/Makefile index 13c5b4e..9a5706d 100755 --- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/Makefile +++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/Makefile @@ -6,3 +6,4 @@ obj-$(CONFIG_NET_MEDIATEK_SOC) += mtk_eth.o mtk_eth-y := mtk_eth_soc.o mtk_sgmii.o mtk_eth_path.o mtk_eth_dbg.o mtk_eth_reset.o obj-$(CONFIG_NET_MEDIATEK_HNAT) += mtk_hnat/ +obj-$(CONFIG_NET_MEDIATEK_EXT_PHY_RTL822X) += rtl822x/ diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c index 3cd1e3b..79d0714 100755 --- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c @@ -20,7 +20,9 @@ #include #include #include - +#include +#include +#include #include "mtk_eth_soc.h" #include "mtk_eth_dbg.h" #include "mtk_eth_reset.h" @@ -28,10 +30,15 @@ #if defined(CONFIG_NET_MEDIATEK_HNAT) || defined(CONFIG_NET_MEDIATEK_HNAT_MODULE) #include "mtk_hnat/nf_hnat_mtk.h" #endif - +#if defined (CONFIG_NET_MEDIATEK_EXT_PHY_RTL822X) +#include "rtl822x/rtl_adapter.h" +#include "rtl822x/rtl8226_typedef.h" +#include "rtl822x/nic_rtl8226b_init.h" +#endif static int mtk_msg_level = -1; atomic_t reset_lock = ATOMIC_INIT(0); atomic_t force = ATOMIC_INIT(0); +static struct mtk_eth *sg_eth; module_param_named(msg_level, mtk_msg_level, int, 0); MODULE_PARM_DESC(msg_level, "Message level (-1=defaults,0=none,...,16=all)"); @@ -187,6 +194,233 @@ static int mtk_mdio_read(struct mii_bus *bus, int phy_addr, int phy_reg) return _mtk_mdio_read(eth, phy_addr, phy_reg); } +int mtk_mii_rw(struct mtk_eth *eth, int phy, int reg, u16 data, + u32 cmd, u32 st) +{ +#define PHY_IAC MTK_PHY_IAC +#define PHY_ACS_ST BIT(31) +#define MDIO_REG_ADDR_S 25 +#define MDIO_REG_ADDR_M 0x3e000000 +#define MDIO_PHY_ADDR_S 20 +#define MDIO_PHY_ADDR_M 0x1f00000 +#define MDIO_CMD_S 18 +#define MDIO_CMD_M 0xc0000 +#define MDIO_ST_S 16 +#define MDIO_ST_M 0x30000 +#define MDIO_RW_DATA_S 0 +#define MDIO_RW_DATA_M 0xffff +#define MDIO_CMD_ADDR 0 +#define MDIO_CMD_WRITE 1 +#define MDIO_CMD_READ 2 +#define MDIO_CMD_READ_C45 3 +#define MDIO_ST_C45 0 +#define MDIO_ST_C22 1 + u32 val = 0; + int ret = 0; + + if (mtk_mdio_busy_wait(eth)) + return -1; + + val = (st << MDIO_ST_S) | + ((cmd << MDIO_CMD_S) & MDIO_CMD_M) | + ((phy << MDIO_PHY_ADDR_S) & MDIO_PHY_ADDR_M) | + ((reg << MDIO_REG_ADDR_S) & MDIO_REG_ADDR_M); + + if (cmd == MDIO_CMD_WRITE || cmd == MDIO_CMD_ADDR) + val |= data & MDIO_RW_DATA_M; + + mtk_w32(eth, val | PHY_ACS_ST, PHY_IAC); + + if (mtk_mdio_busy_wait(eth)) + return -1; + + if (cmd == MDIO_CMD_READ || cmd == MDIO_CMD_READ_C45) { + val = mtk_r32(eth, PHY_IAC); + ret = val & MDIO_RW_DATA_M; + } + + return ret; +} + +int mtk_mmd_read(struct mtk_eth *eth, int addr, int devad, u16 reg) +{ + int val; + + mutex_lock(ð->mii_bus->mdio_lock); + mtk_mii_rw(eth, addr, devad, reg, MDIO_CMD_ADDR, MDIO_ST_C45); + val = mtk_mii_rw(eth, addr, devad, 0, MDIO_CMD_READ_C45, + MDIO_ST_C45); + mutex_unlock(ð->mii_bus->mdio_lock); + + return val; +} + +void mtk_mmd_write(struct mtk_eth *eth, int addr, int devad, u16 reg, + u16 val) +{ + mutex_lock(ð->mii_bus->mdio_lock); + mtk_mii_rw(eth, addr, devad, reg, MDIO_CMD_ADDR, MDIO_ST_C45); + mtk_mii_rw(eth, addr, devad, val, MDIO_CMD_WRITE, MDIO_ST_C45); + mutex_unlock(ð->mii_bus->mdio_lock); +} + +u32 mtk_cl45_ind_read(struct mtk_eth *eth, u16 port, u16 devad, u16 reg, u16 *data) +{ + mutex_lock(ð->mii_bus->mdio_lock); + _mtk_mdio_write(eth, port, MII_MMD_ACC_CTL_REG, devad); + _mtk_mdio_write(eth, port, MII_MMD_ADDR_DATA_REG, reg); + _mtk_mdio_write(eth, port, MII_MMD_ACC_CTL_REG, MMD_OP_MODE_DATA | devad); + *data = _mtk_mdio_read(eth, port, MII_MMD_ADDR_DATA_REG); + mutex_unlock(ð->mii_bus->mdio_lock); + return 0; +} +u32 mtk_cl45_ind_write(struct mtk_eth *eth, u16 port, u16 devad, u16 reg, u16 data) +{ + mutex_lock(ð->mii_bus->mdio_lock); + _mtk_mdio_write(eth, port, MII_MMD_ACC_CTL_REG, devad); + _mtk_mdio_write(eth, port, MII_MMD_ADDR_DATA_REG, reg); + _mtk_mdio_write(eth, port, MII_MMD_ACC_CTL_REG, MMD_OP_MODE_DATA | devad); + _mtk_mdio_write(eth, port, MII_MMD_ADDR_DATA_REG, data); + mutex_unlock(ð->mii_bus->mdio_lock); + return 0; +} + +int mtk_soc_mmd_read(int phyad, int devad, int regad) +{ + struct mtk_eth *eth = sg_eth; + return mtk_mmd_read(eth, phyad, devad, regad); +} + +void mtk_soc_mmd_write(int phyad, int devad, int regad, int val) +{ + struct mtk_eth *eth = sg_eth; + mtk_mmd_write(eth, phyad, devad, regad, val); +} +static int mtk_mdio_busy_wait(struct mtk_eth *eth); + +static int rtl822x_init(struct mtk_eth *eth, int addr) +{ +#if defined(CONFIG_NET_MEDIATEK_EXT_PHY_RTL822X) + u32 val; + + val = mtk_mmd_read(eth, addr, 30, 0x75F3); + val &= ~(1 << 0); + mtk_mmd_write(eth, addr, 30, 0x75F3, val); + + val = mtk_mmd_read(eth, addr, 30, 0x697A); + val &= ~(0x3F); + val |= 0x2; + val |= (1 << 15); + mtk_mmd_write(eth, addr, 30, 0x697A, val); + + msleep(500); + + val = mtk_mmd_read(eth, addr, 7, 0); + val |= (1 << 9); + mtk_mmd_write(eth, addr, 7, 0, val); + + msleep(500); + + // set led + + // led0 at 10/100/1000/2.5G + mtk_mmd_write(eth, addr, 31, 0xd032, 0x0027); + // led on time = 400ms, duty = 12.5%, freq = 60ms, Enable 10M LPI, modeA, act + mtk_mmd_write(eth, addr, 31, 0xd040, 0x321f); + // all led enable, polar = low + mtk_mmd_write(eth, addr, 31, 0xd044, 0xf8); + + msleep(500); + dev_info(eth->dev, "RTL822x init success!\n"); + + Rtl8226b_phy_init((HANDLE){eth, addr}, NULL, 1); + + return 0; +#else + dev_info(eth->dev, "RTL822x init failed!\n"); + return 1; +#endif +} + +static struct mtk_extphy_id extphy_tbl[] = { + {0x001CC840, 0x0fffffff0, 1, rtl822x_init}, +}; + +static u32 get_cl22_phy_id(struct mtk_eth *eth, int addr) +{ + int phy_reg; + u32 phy_id = 0; + + phy_reg = _mtk_mdio_read(eth, addr, MII_PHYSID1); + if (phy_reg < 0) + return 0; + phy_id = (phy_reg & 0xffff) << 16; + + /* Grab the bits from PHYIR2, and put them in the lower half */ + phy_reg = _mtk_mdio_read(eth, addr, MII_PHYSID2); + if (phy_reg < 0) + return 0; + + phy_id |= (phy_reg & 0xffff); + + return phy_id; +} + +static u32 get_cl45_phy_id(struct mtk_eth *eth, int addr) +{ + u16 phy_reg; + u32 phy_id = 0; + + mtk_cl45_ind_read(eth, addr, 1, MII_PHYSID1, &phy_reg); + if (phy_reg < 0) + return 0; + phy_id = (phy_reg & 0xffff) << 16; + + /* Grab the bits from PHYIR2, and put them in the lower half */ + mtk_cl45_ind_read(eth, addr, 1, MII_PHYSID2, &phy_reg); + if (phy_reg < 0) + return 0; + + phy_id |= (phy_reg & 0xffff); + + return phy_id; +} + +static inline bool phy_id_is_match(u32 id, struct mtk_extphy_id *phy) +{ + return ((id & phy->phy_id_mask) == (phy->phy_id & phy->phy_id_mask)); +} + +static int extphy_init(struct mtk_eth *eth, int addr) +{ + int i; + u32 phy_id; + struct mtk_extphy_id *extphy; + + for (i = 0; i < ARRAY_SIZE(extphy_tbl); i++) + { + extphy = &extphy_tbl[i]; + if (extphy->is_c45) + { + phy_id = get_cl45_phy_id(eth, addr); + + } + else + { + phy_id = get_cl22_phy_id(eth, addr); + + } + + printk("8221 phy id is %u",phy_id); + if (phy_id_is_match(phy_id, extphy)) + {extphy->init(eth, addr);} + + + } + + return 0; +} + static int mt7621_gmac0_rgmii_adjust(struct mtk_eth *eth, phy_interface_t interface) { @@ -1409,7 +1643,6 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget, mac = (trxd.rxd4 & RX_DMA_SPECIAL_TAG) ? 0 : RX_DMA_GET_SPORT(trxd.rxd4) - 1; } - if (unlikely(mac < 0 || mac >= MTK_MAC_COUNT || !eth->netdev[mac])) goto release_desc; @@ -3495,11 +3728,13 @@ static int mtk_probe(struct platform_device *pdev) struct device_node *mac_np; struct mtk_eth *eth; int err, i; - + #if defined(CONFIG_NET_MEDIATEK_EXT_PHY_RTL822X) + static int ext_init = 0; + #endif eth = devm_kzalloc(&pdev->dev, sizeof(*eth), GFP_KERNEL); if (!eth) return -ENOMEM; - + sg_eth = eth; eth->soc = of_device_get_match_data(&pdev->dev); eth->dev = &pdev->dev; @@ -3614,6 +3849,8 @@ static int mtk_probe(struct platform_device *pdev) eth->hwlro = MTK_HAS_CAPS(eth->soc->caps, MTK_HWLRO); for_each_child_of_node(pdev->dev.of_node, mac_np) { + int ext_reset_pin = -1; + int ret = -1; if (!of_device_is_compatible(mac_np, "mediatek,eth-mac")) continue; @@ -3625,6 +3862,20 @@ static int mtk_probe(struct platform_device *pdev) if (err) { of_node_put(mac_np); goto err_deinit_hw; + } + ext_reset_pin = of_get_named_gpio(mac_np, "ext-phy-reset-gpios", 0); + if (ext_reset_pin >= 0) + { + dev_info(&pdev->dev, "Ext-phy gpio : %d\n", ext_reset_pin); + ret = devm_gpio_request(&pdev->dev, ext_reset_pin, "mt753x-reset"); + if (!ret) + { + + gpio_direction_output(ext_reset_pin, 0); + msleep(300); + gpio_set_value(ext_reset_pin, 1); + msleep(500); + } } } @@ -3721,6 +3972,16 @@ static int mtk_probe(struct platform_device *pdev) add_timer(ð->mtk_dma_monitor_timer); #endif +#if defined (CONFIG_NET_MEDIATEK_EXT_PHY_RTL822X) + if (!ext_init) + { + // For TP-Link XDR6086 and XDR6088, we have two RTL822X at reg 5 and reg 7 respectively. + extphy_init(eth, 5); + extphy_init(eth, 7); + extphy_init(eth, 6); + ext_init = 1; + } +#endif return 0; err_deinit_mdio: diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.h index b6380ff..8f36f20 100755 --- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.h @@ -768,6 +768,25 @@ #define MT7628_SDM_MAC_ADRL (MT7628_SDM_OFFSET + 0x0c) #define MT7628_SDM_MAC_ADRH (MT7628_SDM_OFFSET + 0x10) +/*MDIO control*/ +#define MII_MMD_ACC_CTL_REG 0x0d +#define MII_MMD_ADDR_DATA_REG 0x0e +#define MMD_OP_MODE_DATA BIT(14) +struct mtk_eth; +/* mmd */ +int mtk_mmd_read(struct mtk_eth *eth, int addr, int devad, u16 reg); +void mtk_mmd_write(struct mtk_eth *eth, int addr, int devad, u16 reg, + u16 val); + + +struct mtk_extphy_id +{ + u32 phy_id; + u32 phy_id_mask; + u32 is_c45; + int (*init)(struct mtk_eth *, int addr); +}; + struct mtk_rx_dma { unsigned int rxd1; unsigned int rxd2; diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/Makefile b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/Makefile new file mode 100755 index 0000000..6f84daf --- /dev/null +++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/Makefile @@ -0,0 +1,4 @@ +ccflags-y=-Wall + +obj-$(CONFIG_NET_MEDIATEK_EXT_PHY_RTL822X) += rtl822x_phy.o +rtl822x_phy-objs := rtl_adapter.o nic_rtl8226b_init.o diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/nic_rtl8226b.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/nic_rtl8226b.c new file mode 100755 index 0000000..a361c23 --- /dev/null +++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/nic_rtl8226b.c @@ -0,0 +1,2699 @@ +/* + * Copyright (C) 2019 Realtek Semiconductor Corp. + * All Rights Reserved. + * + * This program is the proprietary software of Realtek Semiconductor + * Corporation and/or its licensors, and only be used, duplicated, + * modified or distributed under the authorized license from Realtek. + * + * ANY USE OF THE SOFTWARE OTHER THAN AS AUTHORIZED UNDER + * THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + * + * Purpose : PHY 8226 Driver + * + * Feature : PHY 8226 Driver + * + */ + + +//#include "typedef.h" +//#include "rtl8156_mmd.h" +//#include "phy_rtl8226.h" +#include +#include +#include +#include +#include +//#include +#include + + + + + +BOOLEAN +Rtl8226b_phy_reset( + IN HANDLE hDevice + ) +{ + BOOL status = FAILURE; + UINT16 phydata0 = 0, phydata1 = 0; + UINT16 waitcount = 0; + + status = MmdPhyRead(hDevice, MMD_PMAPMD, 0x0, &phydata0); + if (status != SUCCESS) + goto exit; + + phydata1 |= BIT_15; + + status = MmdPhyWrite(hDevice, MMD_PMAPMD, 0x0, phydata1); + if (status != SUCCESS) + goto exit; + + while(TRUE) + { + status = MmdPhyRead(hDevice, MMD_PMAPMD, 0x0, &phydata1); + if (status != SUCCESS) + goto exit; + + if (!(phydata1 & BIT_15)) + break; + + if (++waitcount == 500) + { + status = FAILURE; + goto exit; + } + } + + status = MmdPhyWrite(hDevice, MMD_PMAPMD, 0x0, phydata0); + if (status != SUCCESS) + goto exit; + +exit: + return status; +} + +BOOLEAN +Rtl8226b_autoNegoEnable_get( + IN HANDLE hDevice, + OUT BOOL *pEnable + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_AN, 0, &phydata); + if (status != SUCCESS) + goto exit; + + *pEnable = (phydata & BIT_12) ? (TRUE) : (FALSE); + +exit: + return status; +} + +BOOLEAN +Rtl8226b_autoNegoEnable_set( + IN HANDLE hDevice, + IN BOOL Enable + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + // AutoNegotiationEnable + status = MmdPhyRead(hDevice, MMD_AN, 0, &phydata); + if (status != SUCCESS) + goto exit; + + if (Enable) + phydata |= BIT_12; + else + phydata &= (~BIT_12); + + status = MmdPhyWrite(hDevice, MMD_AN, 0, phydata); + if (status != SUCCESS) + goto exit; + + // RestartAutoNegotiation + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA400, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= BIT_9; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA400, phydata); + if (status != SUCCESS) + goto exit; + +exit: + return status; +} + +BOOLEAN +Rtl8226b_autoNegoAbility_get( + IN HANDLE hDevice, + OUT PHY_LINK_ABILITY *pPhyAbility + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_AN, 16, &phydata); + if (status != SUCCESS) + goto exit; + + // 10M + pPhyAbility->Half_10 = (phydata & BIT_5) ? (1) : (0); + pPhyAbility->Full_10 = (phydata & BIT_6) ? (1) : (0); + + // 100M + pPhyAbility->Half_100 = (phydata & BIT_7) ? (1) : (0); + pPhyAbility->Full_100 = (phydata & BIT_8) ? (1) : (0); + + pPhyAbility->FC = (phydata & BIT_10) ? (1) : (0); + pPhyAbility->AsyFC = (phydata & BIT_11) ? (1) : (0); + + // 1G + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA412, &phydata); + if (status != SUCCESS) + goto exit; + + pPhyAbility->Full_1000 = (phydata & BIT_9) ? (1) : (0); + + // 2.5G + status = MmdPhyRead(hDevice, MMD_AN, 32, &phydata); + if (status != SUCCESS) + goto exit; + + pPhyAbility->adv_2_5G = (phydata & BIT_7) ? (1) : (0); + +exit: + return status; +} + +BOOLEAN +Rtl8226b_autoNegoAbility_set( + IN HANDLE hDevice, + IN PHY_LINK_ABILITY *pPhyAbility + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_AN, 16, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~(BIT_5 | BIT_6 | BIT_7 | BIT_8 | BIT_10 | BIT_11)); + + // 10M + phydata |= (pPhyAbility->Half_10 ? (BIT_5) : (0)); + phydata |= (pPhyAbility->Full_10 ? (BIT_6) : (0)); + + // 100M + phydata |= (pPhyAbility->Half_100 ? (BIT_7) : (0)); + phydata |= (pPhyAbility->Full_100 ? (BIT_8) : (0)); + + phydata |= (pPhyAbility->FC ? (BIT_10) : (0)); + phydata |= (pPhyAbility->AsyFC ? (BIT_11) : (0)); + + status = MmdPhyWrite(hDevice, MMD_AN, 16, phydata); + if (status != SUCCESS) + goto exit; + + // 1G + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA412, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~BIT_9); + + phydata |= (pPhyAbility->Full_1000 ? (BIT_9) : (0)); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA412, phydata); + if (status != SUCCESS) + goto exit; + + // 2.5G + status = MmdPhyRead(hDevice, MMD_AN, 32, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~BIT_7); + + phydata |= (pPhyAbility->adv_2_5G ? (BIT_7) : (0)); + status = MmdPhyWrite(hDevice, MMD_AN, 32, phydata); + if (status != SUCCESS) + goto exit; + + if (MmdPhyRead(hDevice, MMD_AN, 0, &phydata) == SUCCESS) + { + if (phydata & BIT_12) /* AN_ENABLE */ + { + phydata |= BIT_9; /* RESTART_AN */ + MmdPhyWrite(hDevice, MMD_AN, 0, phydata); + } + } + +exit: + return status; +} + +BOOLEAN +Rtl8226b_duplex_get( + IN HANDLE hDevice, + OUT BOOL *pEnable + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA434, &phydata); + if (status != SUCCESS) + goto exit; + + *pEnable = (phydata & BIT_3) ? (TRUE) : (FALSE); + +exit: + return status; +} + + +BOOLEAN +Rtl8226b_duplex_set( // christy add 0430 + IN HANDLE hDevice, + IN BOOL Enable + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA400, &phydata); + if (status != SUCCESS) + goto exit; + + if (Enable) + phydata |= BIT_8; + else + phydata &= (~BIT_8); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA400, phydata); + if (status != SUCCESS) + goto exit; + +exit: + return status; +} + + + +BOOLEAN +Rtl8226b_is_link( + IN HANDLE hDevice, + OUT BOOL *plinkOK + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + UINT8 i = 0; + + // must read twice + for(i=0;i<2;i++) + { + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA402, &phydata); + if (status != SUCCESS) + goto exit; + } + + *plinkOK = (phydata & BIT_2) ? (TRUE) : (FALSE); + +exit: + return status; +} + +BOOLEAN +Rtl8226b_speed_get( + IN HANDLE hDevice, + OUT UINT16 *pSpeed + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + UINT8 speed_grp = 0; + UINT8 speed = NO_LINK; + +// int i = 0; + + BOOL linkOK = FALSE; + + status = Rtl8226b_is_link(hDevice, &linkOK); + if (status != SUCCESS) + goto exit; + + if (linkOK) + { + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA434, &phydata); + if (status != SUCCESS) + goto exit; + + speed_grp = (phydata & (BIT_9 | BIT_10)) >> 9; + speed = (phydata & (BIT_4 | BIT_5)) >> 4; + + switch(speed_grp) + { + case 0: + { + switch(speed) + { + case 0: + *pSpeed = LINK_SPEED_10M; + break; + case 1: + *pSpeed = LINK_SPEED_100M; + break; + case 2: + *pSpeed = LINK_SPEED_1G; + break; + case 3: + *pSpeed = LINK_SPEED_500M; + break; + + default: + status = FAILURE; + break; + } + break; + } + + case 1: + { + switch(speed) + { + case 1: + *pSpeed = LINK_SPEED_2P5G; + break; + case 3: + *pSpeed = LINK_SPEED_1G; // 2.5G lite + break; + default: + status = FAILURE; + break; + } + break; + } + + default: + status = FAILURE; + break; + } + } + else + { + *pSpeed = NO_LINK; + } + +exit: + return status; +} + +BOOLEAN +Rtl8226b_enable_set( + IN HANDLE hDevice, + IN BOOL Enable + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_PMAPMD, 0, &phydata); + if (status != SUCCESS) + goto exit; + + if (Enable) + phydata &= (~BIT_11); // set as 0 + else + phydata |= BIT_11; // set as 1 + + + status = MmdPhyWrite(hDevice, MMD_PMAPMD, 0, phydata); + if (status != SUCCESS) + goto exit; + +exit: + return status; +} + +BOOLEAN +Rtl8226b_force_speed_set( + IN HANDLE hDevice, + IN UINT16 Speed + ) +{ + BOOL status = FAILURE; + UINT16 phydata0 = 0, phydata1 = 0; + BOOL support = 0; + + status = MmdPhyRead(hDevice, MMD_PMAPMD, 0, &phydata0); + if (status != SUCCESS) + goto exit; + + phydata0 &= (~(BIT_6 | BIT_13)); + + switch(Speed) + { + case 10: + support = TRUE; + phydata0 &= (~BIT_6); + phydata0 &= (~BIT_13); + break; + + case 100: + support = TRUE; + phydata0 &= (~BIT_6); + phydata0 |= BIT_13; + break; + + + + default: + status = FAILURE; + support = FALSE; + break; + } + + if (support) + { + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA5B4, &phydata1); + if (status != SUCCESS) + goto exit; + + phydata1 |= (BIT_15); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA5B4, phydata1); + if (status != SUCCESS) + goto exit; + + status = MmdPhyWrite(hDevice, MMD_PMAPMD, 0, phydata0); + if (status != SUCCESS) + goto exit; + + status = Rtl8226b_autoNegoEnable_set(hDevice, FALSE); + if (status != SUCCESS) + goto exit; + } + else + status = FAILURE; + +exit: + return status; +} + +BOOLEAN +Rtl8226b_force_speed_get( + IN HANDLE hDevice, + OUT UINT16 *force_speed + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + BOOL AnEnable = 0; + + status = Rtl8226b_autoNegoEnable_get(hDevice, &AnEnable); + if (status != SUCCESS) + goto exit; + + + + if(AnEnable==0) + { + status = MmdPhyRead(hDevice, MMD_PMAPMD, 0, &phydata); + if (status != SUCCESS) + goto exit; + + if(((phydata & (BIT_6))==0 )&&((phydata & (BIT_13))==0)) + *force_speed = LINK_SPEED_10M; + + else if(((phydata &(BIT_6))==0 )&&((phydata & (BIT_13))==BIT_13)) + *force_speed = LINK_SPEED_100M; + else + *force_speed = NO_LINK; + + } + else + status = FAILURE; + +exit: + return status; +} + + + + + +BOOLEAN +Rtl8226b_greenEnable_get( + IN HANDLE hDevice, + OUT BOOL *pEnable + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA436, 0x8011); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA438, &phydata); + if (status != SUCCESS) + goto exit; + + *pEnable = (phydata & BIT_15) ? (TRUE) : (FALSE); + +exit: + return status; +} + +BOOLEAN +Rtl8226b_greenEnable_set( + IN HANDLE hDevice, + IN BOOL Enable + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA436, 0x8011); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA438, &phydata); + if (status != SUCCESS) + goto exit; + + if (Enable) + phydata |= (BIT_15); + else + phydata &= (~BIT_15); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA438, phydata); + if (status != SUCCESS) + goto exit; + +exit: + return status; +} + + + + +BOOLEAN +Rtl8226b_eeeEnable_get( + IN HANDLE hDevice, + OUT PHY_EEE_ENABLE *pEeeEnable + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_AN, 60, &phydata); + if (status != SUCCESS) + goto exit; + + pEeeEnable->EEE_100 = (phydata & BIT_1) ? (TRUE) : (FALSE); + pEeeEnable->EEE_1000 = (phydata & BIT_2) ? (TRUE) : (FALSE); + + status = MmdPhyRead(hDevice, MMD_AN, 62, &phydata); + if (status != SUCCESS) + goto exit; + + pEeeEnable->EEE_2_5G = (phydata & BIT_0) ? (TRUE) : (FALSE); + +exit: + return status; +} + +BOOLEAN +Rtl8226b_eeeEnable_set( + IN HANDLE hDevice, + IN PHY_EEE_ENABLE *pEeeEnable + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + BOOL AnEnable = 0; + + status = Rtl8226b_autoNegoEnable_get(hDevice, &AnEnable); + if (status != SUCCESS) + goto exit; + + // 100M/1G EEE + status = MmdPhyRead(hDevice, MMD_AN, 60, &phydata); + if (status != SUCCESS) + goto exit; + + if (pEeeEnable->EEE_100) + phydata |= BIT_1; + else + phydata &= (~BIT_1); + + + if (pEeeEnable->EEE_1000) + phydata |= BIT_2; + else + phydata &= (~BIT_2); + + status = MmdPhyWrite(hDevice, MMD_AN, 60, phydata); + if (status != SUCCESS) + goto exit; + + // 2.5G EEE + status = MmdPhyRead(hDevice, MMD_AN, 62, &phydata); + if (status != SUCCESS) + goto exit; + + if (pEeeEnable->EEE_2_5G) + phydata |= BIT_0; + else + phydata &= (~BIT_0); + + status = MmdPhyWrite(hDevice, MMD_AN, 62, phydata); + if (status != SUCCESS) + goto exit; + + // RestartAutoNegotiation + if (AnEnable) + { + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA400, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= BIT_9; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA400, phydata); + if (status != SUCCESS) + goto exit; + } + +exit: + return status; +} + + + + + +BOOLEAN +Rtl8226b_PHYmodeEEE_set(IN HANDLE hDevice,int on_off) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + if(on_off){ + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA432, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= BIT_5; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA432, phydata); + if (status != SUCCESS) + goto exit; + + + } + else{ + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA432, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~BIT_5); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA432, phydata); + if (status != SUCCESS) + goto exit; + + } + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA400, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= BIT_9; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA400, phydata); + if (status != SUCCESS) + goto exit; + + + + +exit: + return status; + + +} + +BOOLEAN +Rtl8226b_10M_PHYmodeEEEP_set(IN HANDLE hDevice,int on_off) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + if(on_off){ + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA432, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= BIT_2; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA432, phydata); + if (status != SUCCESS) + goto exit; + + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xC842, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= BIT_2; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xC842, phydata); + if (status != SUCCESS) + goto exit; + + + + + + } + else{ + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA432, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~BIT_2); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA432, phydata); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xC842, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~BIT_2); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xC842, phydata); + if (status != SUCCESS) + goto exit; + + + + } + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA400, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= BIT_9; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA400, phydata); + if (status != SUCCESS) + goto exit; + + + + +exit: + return status; + + +} + + + + +BOOLEAN +Rtl8226b_crossOverMode_get( + IN HANDLE hDevice, + OUT PHY_CROSSPVER_MODE *CrossOverMode + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA430, &phydata); + if (status != SUCCESS) + goto exit; + + if((phydata & BIT_9) >> 9) + { + switch((phydata & BIT_8) >> 8) + { + case 1: + *CrossOverMode = PHY_CROSSPVER_MODE_MDI; + break; + case 0: + *CrossOverMode = PHY_CROSSPVER_MODE_MDIX; + break; + default: + status = FAILURE; + break; + } + } + else + *CrossOverMode = PHY_CROSSPVER_MODE_AUTO; + +exit: + return status; +} + +BOOLEAN +Rtl8226b_crossOverMode_set( + IN HANDLE hDevice, + IN PHY_CROSSPVER_MODE CrossOverMode + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA430, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~(BIT_8 | BIT_9)); + + switch(CrossOverMode) + { + case PHY_CROSSPVER_MODE_MDI: + phydata |= (BIT_8 | BIT_9); + break; + case PHY_CROSSPVER_MODE_MDIX: + phydata |= BIT_9; + break; + case PHY_CROSSPVER_MODE_AUTO: + break; + default: + status = FAILURE; + goto exit; + } + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA430, phydata); + if (status != SUCCESS) + goto exit; + +exit: + return status; +} + +BOOLEAN +Rtl8226b_crossOverStatus_get( + IN HANDLE hDevice, + OUT PHY_CROSSPVER_STATUS *pCrossOverStatus + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA434, &phydata); + if (status != SUCCESS) + goto exit; + + *pCrossOverStatus = (phydata & BIT_1) ? (PHY_CROSSPVER_STATUS_MDI) : (PHY_CROSSPVER_STATUS_MDIX); + +exit: + return status; +} + +BOOLEAN +Rtl8226b_masterSlave_get( + IN HANDLE hDevice, + OUT PHY_MASTERSLAVE_MODE *MasterSlaveMode + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_AN, 33, &phydata); + if (status != SUCCESS) + goto exit; + + switch((phydata >> 14) & 0x3) + { + case 0: // 0:Slave, 1:Master + *MasterSlaveMode = PHY_SLAVE_MODE; + break; + case 1: + *MasterSlaveMode = PHY_MASTER_MODE; + break; + default: + status = FAILURE; + break; + } + +exit: + return status; +} + +BOOLEAN +Rtl8226b_masterSlave_set( + IN HANDLE hDevice, + IN PHY_MASTERSLAVE_MODE MasterSlaveMode + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_AN, 32, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~(BIT_14 | BIT_15)); + + switch(MasterSlaveMode) + { + case PHY_AUTO_MODE: + break; + case PHY_SLAVE_MODE: + phydata |= BIT_15; + break; + case PHY_MASTER_MODE: + phydata |= (BIT_14 | BIT_15); + break; + default: + status = FAILURE; + goto exit; + } + + status = MmdPhyWrite(hDevice, MMD_AN, 32, phydata); + if (status != SUCCESS) + goto exit; + +exit: + return status; +} + +BOOLEAN +Rtl8226b_loopback_get( + IN HANDLE hDevice, + OUT BOOL *pEnable + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_PCS, 0x0, &phydata); + if (status != SUCCESS) + goto exit; + + *pEnable = (phydata & BIT_14) ? (TRUE) : (FALSE); + +exit: + return status; +} + +BOOLEAN +Rtl8226b_loopback_set( + IN HANDLE hDevice, + IN BOOL Enable + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_PCS, 0x0, &phydata); + if (status != SUCCESS) + goto exit; + + if (Enable) + phydata |= BIT_14; + else + phydata &= (~BIT_14); + + status = MmdPhyWrite(hDevice, MMD_PCS, 0x0, phydata); + if (status != SUCCESS) + goto exit; + +exit: + return status; +} + +BOOLEAN +Rtl8226b_downSpeedEnable_get( + IN HANDLE hDevice, + OUT BOOL *pEnable + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA442, &phydata); + if (status != SUCCESS) + goto exit; + + *pEnable = (phydata & BIT_3) ? (TRUE) : (FALSE); + +exit: + return status; +} + +BOOLEAN +Rtl8226b_downSpeedEnable_set( + IN HANDLE hDevice, + IN BOOL Enable + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA442, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~BIT_5); + + if (Enable) + phydata |= BIT_3; + else + phydata &= (~BIT_3); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA442, phydata); + if (status != SUCCESS) + goto exit; + +exit: + return status; +} + +BOOLEAN +Rtl8226b_gigaLiteEnable_get( + IN HANDLE hDevice, + OUT BOOL *pEnable + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA428, &phydata); + if (status != SUCCESS) + goto exit; + + *pEnable = (phydata & BIT_9) ? (TRUE) : (FALSE); + +exit: + return status; +} + +BOOLEAN +Rtl8226b_gigaLiteEnable_set( + IN HANDLE hDevice, + IN BOOL Enable + ) +{ + BOOL status = FAILURE; + UINT16 phydata0 = 0, phydata1 = 0; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA442, &phydata0); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA428, &phydata1); + if (!status) + goto exit; + + if (Enable) + { + phydata0 |= (BIT_2 | BIT_9); + phydata1 |= BIT_9; + } + else + { + phydata0 &= (~(BIT_2 | BIT_9)); + phydata1 &= (~BIT_9); + } + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA442, phydata0); + if (status != SUCCESS) + goto exit; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA428, phydata1); + if (status != SUCCESS) + goto exit; + +exit: + return status; +} + + + + +BOOLEAN +Rtl8226b_mdiSwapEnable_get( + IN HANDLE hDevice, + OUT BOOL *pEnable + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_VEND1, 0x6A21, &phydata); + if (status != SUCCESS) + goto exit; + + *pEnable = (phydata & BIT_5) ? (TRUE) : (FALSE); + +exit: + return status; +} + +BOOLEAN +Rtl8226b_mdiSwapEnable_set( + IN HANDLE hDevice, + IN BOOL Enable + ) +{ + BOOL status = FAILURE; + UINT16 phydata0 = 0; + + status = MmdPhyRead(hDevice, MMD_VEND1, 0x6A21, &phydata0); + if (status != SUCCESS) + goto exit; + + if (Enable) + { + phydata0 |= (BIT_5); + } + else + { + phydata0 &= (~(BIT_5)); + } + + status = MmdPhyWrite(hDevice, MMD_VEND1, 0x6A21, phydata0); + if (status != SUCCESS) + goto exit; + + +exit: + return status; +} + + + + +BOOLEAN +Rtl8226b_rtct_start( + IN HANDLE hDevice + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + BOOL linkOK; + UINT16 Speed; + + status = Rtl8226b_is_link(hDevice, &linkOK); + if (status != SUCCESS) + goto exit; + + if (linkOK) + { + status = Rtl8226b_speed_get(hDevice, &Speed); + if (status != SUCCESS) + goto exit; + + //RTCT is not supported when port link at 10M. + if (Speed == 10) + { + osal_printf("RTCT is not supported when port link at 10M.\n"); + status = FAILURE; + goto exit; + } + } + else + { + // MMD 31.0xA422[15] = 0 // clear rtct_done + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA422, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~BIT_15); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA422, phydata); + if (status != SUCCESS) + goto exit; + + // wait 1ms for chip reset the states + Sleep(1); + + // MMD 31.0xA422[4] = 1 // RTCT_CH_A + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA422, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= (BIT_4); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA422, phydata); + if (status != SUCCESS) + goto exit; + + // MMD 31.0xA422[5] = 1 // RTCT_CH_B + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA422, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= (BIT_5); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA422, phydata); + if (status != SUCCESS) + goto exit; + + // MMD 31.0xA422[6] = 1 // RTCT_CH_C + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA422, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= (BIT_6); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA422, phydata); + if (status != SUCCESS) + goto exit; + + // MMD 31.0xA422[7] = 1 // RTCT_CH_D + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA422, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= (BIT_7); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA422, phydata); + if (status != SUCCESS) + goto exit; + + // MMD 31.0xA422[0] = 1 // RTCT_ENABLE + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA422, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= (BIT_0); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA422, phydata); + if (status != SUCCESS) + goto exit; + } + +exit: + return status; +} + +BOOLEAN +Rtl8226b_rtctResult_convert( + IN UINT16 phydata, + OUT PHY_RTCT_STATUS *pRtctStatus + ) +{ + BOOL status = SUCCESS; + + switch(phydata) + { + case 0x60: // Normal + break; + case 0x48: + pRtctStatus->Open = TRUE; + break; + case 0x50: + pRtctStatus->Short = TRUE; + break; + case 0x42: + pRtctStatus->Mismatch = MIS_MATCH_OPEN; + break; + case 0x44: + pRtctStatus->Mismatch = MIS_MATCH_SHORT; + break; + + default: + status = FAILURE; + break; + } + + return status; +} + +BOOLEAN +Rtl8226b_rtctResult_get( + IN HANDLE hDevice, + OUT PHY_RTCT_RESULT *pRtctResult + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + BOOL linkOK = FALSE; + + UINT16 Speed = NO_LINK; + + BOOL rtct_done; + + status = Rtl8226b_is_link(hDevice, &linkOK); + if (status != SUCCESS) + goto exit; + + if (linkOK) + { + status = Rtl8226b_speed_get(hDevice, &Speed); + if (status != SUCCESS) + goto exit; + + pRtctResult->linkType = Speed; + if (Speed == 10) + { + osal_printf("RTCT is not supported when port link at 10M.\n"); + status = FAILURE; + goto exit; + } + switch(Speed) + { + case LINK_SPEED_100M: + // rxLen = MMD 31.0xA880[7:0] * 100 // unit is meter + // txLen = MMD 31.0xA880[7:0] * 100 + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA880, &phydata); + if (status != SUCCESS) + goto exit; + + pRtctResult->rxLen = (phydata & 0xff) * 100; + pRtctResult->txLen = (phydata & 0xff) * 100; + break; + + case LINK_SPEED_1G: + // channelALen = MMD 31.0xA880[7:0] * 100 // unit is meter + // channelBLen = MMD 31.0xA880[7:0] * 100 + // channelCLen = MMD 31.0xA880[7:0] * 100 + // channelDLen = MMD 31.0xA880[7:0] * 100 + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA880, &phydata); + if (status != SUCCESS) + goto exit; + + pRtctResult->channelALen = (phydata & 0xff) * 100; + pRtctResult->channelBLen = (phydata & 0xff) * 100; + pRtctResult->channelCLen = (phydata & 0xff) * 100; + pRtctResult->channelDLen = (phydata & 0xff) * 100; + break; + + case LINK_SPEED_2P5G: + //channelALen = MMD 31.0xACBA[9:2] * 100 // cablen for XG + status = MmdPhyRead(hDevice, MMD_VEND2, 0xACBA, &phydata); + if (status != SUCCESS) + goto exit; + + pRtctResult->channelALen = ((phydata & 0x3fc) >> 2 ) * 100; + pRtctResult->channelBLen = ((phydata & 0x3fc) >> 2 ) * 100; + pRtctResult->channelCLen = ((phydata & 0x3fc) >> 2 ) * 100; + pRtctResult->channelDLen = ((phydata & 0x3fc) >> 2 ) * 100; + break; + + //RTCT is not supported when port link at 10M. + default: + status = FAILURE; + break; + } + } + else + { + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA422, &phydata); + if (status != SUCCESS) + goto exit; + + rtct_done = (phydata & BIT_15) ? (TRUE) : (FALSE); + if (!rtct_done) + { + status = FAILURE; + goto exit; + } + + // MMD 31.0A436[15:0] = 0x8029 + // phyData = read MMD 31.0A438[15:0] + // channelALen = phyData * 100 / 80 + // channelALen (unit: cm) + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA436, 0x8029); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0x0A438, &phydata); + if (status != SUCCESS) + goto exit; + + pRtctResult->channelALen = (phydata * 100) / 80; + + // MMD 31.0A436[15:0] = 0x802D + // phyData = read MMD 31.0A438[15:0] + // channelBLen = phyData * 100 / 80 + // channelBLen (unit: cm) + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA436, 0x802D); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0x0A438, &phydata); + if (status != SUCCESS) + goto exit; + + pRtctResult->channelBLen = (phydata * 100) / 80; + + // MMD 31.0A436[15:0] = 0x8031 + // phyData = read MMD 31.0A438[15:0] + // channelCLen = phyData * 100 / 80 + // channelCLen (unit: cm) + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA436, 0x8031); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0x0A438, &phydata); + if (status != SUCCESS) + goto exit; + + pRtctResult->channelCLen = (phydata * 100) / 80; + + // MMD 31.0A436[15:0] = 0x8035 + // phyData = read MMD 31.0A438[15:0] + // channelDLen = phyData * 100 / 80 + // channelDLen (unit: cm) + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA436, 0x8035); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0x0A438, &phydata); + if (status != SUCCESS) + goto exit; + + pRtctResult->channelDLen = (phydata * 100) / 80; + + // channelA status + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA436, 0x8027); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0x0A438, &phydata); + if (status != SUCCESS) + goto exit; + + status = Rtl8226b_rtctResult_convert(phydata, &pRtctResult->channelAStatus); + if (status != SUCCESS) + goto exit; + + // channelA status + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA436, 0x802B); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0x0A438, &phydata); + if (status != SUCCESS) + goto exit; + + status = Rtl8226b_rtctResult_convert(phydata, &pRtctResult->channelBStatus); + if (status != SUCCESS) + goto exit; + + // channelC status + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA436, 0x802F); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0x0A438, &phydata); + if (status != SUCCESS) + goto exit; + + status = Rtl8226b_rtctResult_convert(phydata, &pRtctResult->channelCStatus); + if (status != SUCCESS) + goto exit; + + // channelD status + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA436, 0x8033); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0x0A438, &phydata); + if (status != SUCCESS) + goto exit; + + status = Rtl8226b_rtctResult_convert(phydata, &pRtctResult->channelDStatus); + if (status != SUCCESS) + goto exit; + } + +exit: + return status; +} + + + + +BOOLEAN +Rtl8226b_rtctdone_get( + IN HANDLE hDevice, + OUT BOOL *prtct_done + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA422, &phydata); + if (status != SUCCESS) + goto exit; + + *prtct_done = (phydata & BIT_15) ? (TRUE) : (FALSE); + +exit: + return status; +} + + + + +BOOLEAN +Rtl8226b_linkDownPowerSavingEnable_get( + IN HANDLE hDevice, + OUT BOOL *pEnable + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA430, &phydata); + if (status != SUCCESS) + goto exit; + + *pEnable = (phydata & BIT_2) ? (TRUE) : (FALSE); + +exit: + return status; +} + +BOOLEAN +Rtl8226b_linkDownPowerSavingEnable_set( + IN HANDLE hDevice, + IN BOOL Enable + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA430, &phydata); + if (status != SUCCESS) + goto exit; + + if (Enable) + phydata |= BIT_2; + else + phydata &= (~BIT_2); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA430, phydata); + if (status != SUCCESS) + goto exit; + +exit: + return status; +} + +BOOLEAN +Rtl8226b_2p5gLiteEnable_get( + IN HANDLE hDevice, + OUT BOOL *pEnable + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA5EA, &phydata); + if (status != SUCCESS) + goto exit; + + *pEnable = (phydata & BIT_0) ? (TRUE) : (FALSE); + +exit: + return status; +} + +BOOLEAN +Rtl8226b_2p5gLiteEnable_set( + IN HANDLE hDevice, + IN BOOL Enable + ) +{ + BOOL status = FAILURE; + UINT16 phydata0 = 0, phydata1 = 0, phydata2 = 0; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA442, &phydata0); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA5FA, &phydata1); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA5EA, &phydata2); + if (status != SUCCESS) + goto exit; + + phydata0 &= (~BIT_2); + phydata1 &= (~BIT_1); + phydata2 &= (~BIT_0); + + if (Enable) + { + phydata0 |= BIT_2; + phydata1 |= BIT_1; + phydata2 |= BIT_0; + } + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA442, phydata0); + if (status != SUCCESS) + goto exit; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA5FA, phydata1); + if (status != SUCCESS) + goto exit; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA5EA, phydata2); + if (status != SUCCESS) + goto exit; + +exit: + return status; +} + +BOOLEAN +Rtl8226b_ThermalSensorEnable_get( + IN HANDLE hDevice, + OUT BOOL *pEnable + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA436, 0x817D); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA438, &phydata); + if (status != SUCCESS) + goto exit; + + *pEnable = (phydata & BIT_12) ? (TRUE) : (FALSE); + +exit: + return status; +} + +BOOLEAN +Rtl8226b_ThermalSensorEnable_set( + IN HANDLE hDevice, + IN BOOL Enable, + IN UINT16 threshold + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA436, 0x817D); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA438, &phydata); + if (status != SUCCESS) + goto exit; + + if (Enable) + phydata |= BIT_12; + else + phydata &= (~BIT_12); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA438, phydata); + if (status != SUCCESS) + goto exit; + + //Set the thermal thershold, default = 120 degree C + if(threshold <= 120) + { + status = MmdPhyRead(hDevice, MMD_VEND2, 0xB54C, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~(BIT_15 | BIT_14 | BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_9 | BIT_8 | BIT_7 | BIT_6)); + phydata |= ((threshold * 2) << 6); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xB54C, phydata); + if (status != SUCCESS) + goto exit; + }else + { + status = FAILURE; + } + + +exit: + return status; +} + +BOOLEAN +Rtl8226b_ieeeTestMode_set( + IN HANDLE hDevice, + IN UINT16 Speed, + IN PHY_IEEE_TEST_MODE *pIEEEtestmode + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0, phydata_w = 0, phydata2 = 0; + + switch(Speed) + { + case LINK_SPEED_10M: + { + //initial setting + //Write MMD1, reg 0x0000, data=0x0000 + status = MmdPhyWrite(hDevice, MMD_PMAPMD, 0x0000, 0x0000); + if (status != SUCCESS) + goto exit; + + // wait 1ms + Sleep(1); + + //Write MMD7, reg 0x0000, bit[12]=0x0 + status = MmdPhyRead(hDevice, MMD_AN, 0x0000, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~BIT_12); + + status = MmdPhyWrite(hDevice, MMD_AN, 0x0000, phydata); + if (status != SUCCESS) + goto exit; + + // wait 1ms + Sleep(1); + + //Write MMD31, reg 0xA412, bit[15:13]=0x0 + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA412, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~(BIT_15 | BIT_14 | BIT_13)); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA412, phydata); + if (status != SUCCESS) + goto exit; + + // wait 1ms + Sleep(1); + + if(pIEEEtestmode -> channel == TESTMODE_CHANNEL_A) + Rtl8226b_crossOverMode_set(hDevice,PHY_CROSSPVER_MODE_MDI); + else if(pIEEEtestmode -> channel == TESTMODE_CHANNEL_B) + Rtl8226b_crossOverMode_set(hDevice,PHY_CROSSPVER_MODE_MDIX); + + if(pIEEEtestmode -> NORMAL) + { + //Write MMD31, reg 0xC804, data=0x0115 + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xC804, 0x0115); + if (status != SUCCESS) + goto exit; + + //Write MMD31, reg 0xC800, data=0x5a21 + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xC800, 0x5a21); + if (status != SUCCESS) + goto exit; + } + + if(pIEEEtestmode -> HARMONIC) + { + //Write MMD31, reg 0xC804, data=0x0015 + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xC804, 0x0015); + if (status != SUCCESS) + goto exit; + + //Write MMD31, reg 0xC800, data=0xff21 + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xC800, 0xff21); + if (status != SUCCESS) + goto exit; + } + + if(pIEEEtestmode -> LINKPLUSE) + { + //Write MMD31, reg 0xC804, data=0x0115 + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xC804, 0x0115); + if (status != SUCCESS) + goto exit; + + //Write MMD31, reg 0xC800, data=0x5a00 + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xC800, 0x5a00); + if (status != SUCCESS) + goto exit; + } + + if (pIEEEtestmode->TMFINISH) + { + //MMD31, reg 0xA430, bit[9:8]=0x0 + Rtl8226b_crossOverMode_set(hDevice,PHY_CROSSPVER_MODE_AUTO); + + // wait 1ms + Sleep(1); + + //Write MMD31, reg 0xC804, data=0x0115 + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xC804, 0x0115); + if (status != SUCCESS) + goto exit; + + // wait 1ms + Sleep(1); + + //Write MMD31, reg 0xC800, data=0x5a00 + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xC800, 0x5a00); + if (status != SUCCESS) + goto exit; + + // wait 1ms + Sleep(1); + + //Write MMD7, reg 0x0000, bit[12]=0x1 + status = MmdPhyRead(hDevice, MMD_AN, 0x0000, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= BIT_12; + + status = MmdPhyWrite(hDevice, MMD_AN, 0x0000, phydata); + if (status != SUCCESS) + goto exit; + // wait 1ms + Sleep(1); + + //Write MMD1, reg 0x0000, bit[15]=0x1, PMA reset + status = MmdPhyRead(hDevice, MMD_PMAPMD, 0x0000, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= BIT_15; + + status = MmdPhyWrite(hDevice, MMD_PMAPMD, 0x0000, phydata); + if (status != SUCCESS) + goto exit; + } + + break; + } + case LINK_SPEED_100M: + { + //initial setting + //Write MMD1, reg 0x0000, data=0x2000 + status = MmdPhyWrite(hDevice, MMD_PMAPMD, 0x0000, 0x2000); + if (status != SUCCESS) + goto exit; + // wait 1ms + Sleep(1); + + //Write MMD7, reg 0x0000, bit[12]=0x0 + status = MmdPhyRead(hDevice, MMD_AN, 0x0000, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~BIT_12); + + status = MmdPhyWrite(hDevice, MMD_AN, 0x0000, phydata); + if (status != SUCCESS) + goto exit; + // wait 1ms + Sleep(1); + + //Write MMD31, reg 0xA412, bit[15:13]=0x0 + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA412, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~(BIT_15 | BIT_14 | BIT_13)); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA412, phydata); + if (status != SUCCESS) + goto exit; + + // wait 1ms + Sleep(1); + + if(pIEEEtestmode -> channel == TESTMODE_CHANNEL_A) + Rtl8226b_crossOverMode_set(hDevice,PHY_CROSSPVER_MODE_MDI); + else if(pIEEEtestmode -> channel == TESTMODE_CHANNEL_B) + Rtl8226b_crossOverMode_set(hDevice,PHY_CROSSPVER_MODE_MDIX); + + + if (pIEEEtestmode->TMFINISH) + { + //MMD31, reg 0xA430, bit[9:8]=0x0 + Rtl8226b_crossOverMode_set(hDevice,PHY_CROSSPVER_MODE_AUTO); + + // wait 1ms + Sleep(1); + + //Write MMD7, reg 0x0000, bit[12]=0x1 + status = MmdPhyRead(hDevice, MMD_AN, 0x0000, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= BIT_12; + + status = MmdPhyWrite(hDevice, MMD_AN, 0x0000, phydata); + if (status != SUCCESS) + goto exit; + // wait 1ms + Sleep(1); + + //Write MMD1, reg 0x0000, bit[15]=0x1, PMA reset + status = MmdPhyRead(hDevice, MMD_PMAPMD, 0x0000, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= BIT_15; + + status = MmdPhyWrite(hDevice, MMD_PMAPMD, 0x0000, phydata); + if (status != SUCCESS) + goto exit; + } + + break; + } + case LINK_SPEED_1G: + { + //initial setting + //Write MMD1, reg 0x0000, bit[15]=0x1, PMA reset + status = MmdPhyRead(hDevice, MMD_PMAPMD, 0x0000, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= BIT_15; + + status = MmdPhyWrite(hDevice, MMD_PMAPMD, 0x0000, phydata); + if (status != SUCCESS) + goto exit; + // wait 1ms + Sleep(1); + + //Write MMD7, reg 0x0000, bit[12]=0x1 + status = MmdPhyRead(hDevice, MMD_AN, 0x0000, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= BIT_12; + + status = MmdPhyWrite(hDevice, MMD_AN, 0x0000, phydata); + if (status != SUCCESS) + goto exit; + // wait 1ms + Sleep(1); + + //Config channel + status = MmdPhyRead(hDevice, MMD_VEND2, 0xBD2C, &phydata); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xBD32, &phydata2); + if (status != SUCCESS) + goto exit; + + if(pIEEEtestmode -> channel == TESTMODE_CHANNEL_NONE){ + phydata &= (~(BIT_10)); + } + else{ + phydata |= BIT_10; + + if(pIEEEtestmode -> channel == TESTMODE_CHANNEL_A) + phydata_w = 1 << 8; + else if(pIEEEtestmode -> channel == TESTMODE_CHANNEL_B) + phydata_w = 2 << 8; + else if(pIEEEtestmode -> channel == TESTMODE_CHANNEL_C) + phydata_w = 4 << 8; + else if(pIEEEtestmode -> channel == TESTMODE_CHANNEL_D) + phydata_w = 8 << 8; + + phydata2 &= (~(BIT_11 | BIT_10 | BIT_9 | BIT_8)); + phydata2 |= phydata_w; + } + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xBD32, phydata2); + if (status != SUCCESS) + goto exit; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xBD2C, phydata); + if (status != SUCCESS) + goto exit; + + //1G Test Mode + if (pIEEEtestmode->TM1) + { + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA412, 0x2000); + if (status != SUCCESS) + goto exit; + } + + if (pIEEEtestmode->TM2) + { + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA412, 0x4000); + if (status != SUCCESS) + goto exit; + } + + if (pIEEEtestmode->TM4) + { + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA412, 0x8000); + if (status != SUCCESS) + goto exit; + } + + if (pIEEEtestmode->TMFINISH) + { + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA412, 0x0000); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xBD2C, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~(BIT_10)); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xBD2C, phydata); + if (status != SUCCESS) + goto exit; + } + + break; + } + + case LINK_SPEED_2P5G: + { + //initial setting + //Write MMD7, reg 0x0000, bit[12]=0x1 + status = MmdPhyRead(hDevice, MMD_AN, 0x0000, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= BIT_12; + + status = MmdPhyWrite(hDevice, MMD_AN, 0x0000, phydata); + if (status != SUCCESS) + goto exit; + // wait 1ms + Sleep(1); + + //Write MMD31, reg 0xA412, bit[15:13]=0x0 + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA412, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~(BIT_15 | BIT_14 | BIT_13)); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA412, phydata); + if (status != SUCCESS) + goto exit; + // wait 1ms + Sleep(1); + + //Write MMD1, reg 0x0000, data 0x2058 + status = MmdPhyWrite(hDevice, MMD_PMAPMD, 0x0000, 0x2058); + if (status != SUCCESS) + goto exit; + + // wait 1ms + Sleep(1); + + //Config channel + status = MmdPhyRead(hDevice, MMD_VEND2, 0xBD2C, &phydata); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xBD32, &phydata2); + if (status != SUCCESS) + goto exit; + + if(pIEEEtestmode -> channel == TESTMODE_CHANNEL_NONE){ + phydata &= (~(BIT_8)); + } + else{ + phydata |= BIT_8; + + if(pIEEEtestmode -> channel == TESTMODE_CHANNEL_A) + phydata_w = 1; + else if(pIEEEtestmode -> channel == TESTMODE_CHANNEL_B) + phydata_w = 2; + else if(pIEEEtestmode -> channel == TESTMODE_CHANNEL_C) + phydata_w = 4; + else if(pIEEEtestmode -> channel == TESTMODE_CHANNEL_D) + phydata_w = 8; + + phydata2 &= (~(BIT_3 | BIT_2 | BIT_1 | BIT_0)); + phydata2 |= phydata_w; + } + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xBD32, phydata2); + if (status != SUCCESS) + goto exit; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xBD2C, phydata); + if (status != SUCCESS) + goto exit; + + + // 2.5G Test Mode + if (pIEEEtestmode->TM1) + { + status = MmdPhyWrite(hDevice, MMD_PMAPMD, 132, 0x2400); + if (status != SUCCESS) + goto exit; + } + + if (pIEEEtestmode->TM2) + { + status = MmdPhyWrite(hDevice, MMD_PMAPMD, 132, 0x4400); + if (status != SUCCESS) + goto exit; + } + + if (pIEEEtestmode->TM3) + { + status = MmdPhyWrite(hDevice, MMD_PMAPMD, 132, 0x6400); + if (status != SUCCESS) + goto exit; + } + + if (pIEEEtestmode->TM4) + { + if (pIEEEtestmode->TONE1) + { + status = MmdPhyWrite(hDevice, MMD_PMAPMD, 132, 0x8400); + if (status != SUCCESS) + goto exit; + } + + if (pIEEEtestmode->TONE2) + { + status = MmdPhyWrite(hDevice, MMD_PMAPMD, 132, 0x8800); + if (status != SUCCESS) + goto exit; + } + + if (pIEEEtestmode->TONE3) + { + status = MmdPhyWrite(hDevice, MMD_PMAPMD, 132, 0x9000); + if (status != SUCCESS) + goto exit; + } + + if (pIEEEtestmode->TONE4) + { + status = MmdPhyWrite(hDevice, MMD_PMAPMD, 132, 0x9400); + if (status != SUCCESS) + goto exit; + } + + if (pIEEEtestmode->TONE5) + { + status = MmdPhyWrite(hDevice, MMD_PMAPMD, 132, 0x9800); + if (status != SUCCESS) + goto exit; + } + } + + if (pIEEEtestmode->TM5) + { + status = MmdPhyWrite(hDevice, MMD_PMAPMD, 132, 0xA400); + if (status != SUCCESS) + goto exit; + } + + if (pIEEEtestmode->TM6) + { + status = MmdPhyWrite(hDevice, MMD_PMAPMD, 132, 0xC400); + if (status != SUCCESS) + goto exit; + } + + if (pIEEEtestmode->TMFINISH) + { + status = MmdPhyRead(hDevice, MMD_VEND2, 0xBD2C, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~(BIT_8)); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xBD2C, phydata); + if (status != SUCCESS) + goto exit; + + //re-nway and set phy_rst) + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA400, 0x9200); + if (status != SUCCESS) + goto exit; + } + + break; + } + default: + break; + } + + + + +exit: + return status; +} + +BOOLEAN +Rtl8226b_serdes_rst( + IN HANDLE hDevice + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_VEND1, 0x7581, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~BIT_4); + + status = MmdPhyWrite(hDevice, MMD_VEND1, 0x7581, phydata); + if (status != SUCCESS) + goto exit; + + // wait 1ms + Sleep(1); + + status = MmdPhyRead(hDevice, MMD_VEND1, 0x7581, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= BIT_4; + + status = MmdPhyWrite(hDevice, MMD_VEND1, 0x7581, phydata); + if (status != SUCCESS) + goto exit; + + // wait 1ms + Sleep(1); +exit: + return status; +} + +BOOLEAN +Rtl8226b_serdes_link_get( + IN HANDLE hDevice, + OUT BOOL *perdesLink, + OUT PHY_SERDES_MODE *SerdesMode + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + // serdes link + status = MmdPhyRead(hDevice, MMD_VEND1, 0x758D, &phydata); + if (status != SUCCESS) + goto exit; + + *perdesLink = (phydata & BIT_1) ? (TRUE) : (FALSE); + + status = MmdPhyRead(hDevice, MMD_VEND1, 0x758B, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= BIT_0; + + if (phydata == 1){ + + //serdes mode + status = MmdPhyRead(hDevice, MMD_VEND1, 0x7580, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0); + + if(phydata == 2) + *SerdesMode = PHY_SERDES_MODE_SGMII; + else if(phydata == 13) + *SerdesMode = PHY_SERDES_MODE_USXGMII; + else if(phydata == 18) + *SerdesMode = PHY_SERDES_MODE_HiSGMII; + else if(phydata == 22) + *SerdesMode = PHY_SERDES_MODE_2500BASEX; + else if(phydata == 31) + *SerdesMode = PHY_SERDES_MODE_NO_SDS; + else + *SerdesMode = PHY_SERDES_MODE_OTHER; + } + else{ + *SerdesMode = PHY_SERDES_MODE_NO_SDS; + } + +exit: + return status; +} + +BOOLEAN +Rtl8226b_serdes_option_set( + IN HANDLE hDevice, + IN UINT8 functioninput + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + if ((functioninput >= 0) && (functioninput <= 5)) + { + status = MmdPhyRead(hDevice, MMD_VEND1, 0x697A, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~(BIT_0 | BIT_1 | BIT_2 | BIT_3 | BIT_4 | BIT_5)); + phydata |= functioninput; + + status = MmdPhyWrite(hDevice, MMD_VEND1, 0x697A, phydata); + if (status != SUCCESS) + goto exit; + } + +exit: + return status; +} + + +BOOLEAN +Rtl8226b_serdes_option_get( + IN HANDLE hDevice, + OUT PHY_SERDES_OPTION *SerdesOption + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + //serdes option + status = MmdPhyRead(hDevice, MMD_VEND1, 0x697A, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (BIT_5 |BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0); + + if(phydata == 0) + *SerdesOption = PHY_SERDES_OPTION_2500BASEX_SGMII; + else if(phydata == 1) + *SerdesOption = PHY_SERDES_OPTION_HiSGMII_SGMII; + else if(phydata == 2) + *SerdesOption = PHY_SERDES_OPTION_2500BASEX; + else if(phydata == 3) + *SerdesOption = PHY_SERDES_OPTION_HiSGMII; + else + *SerdesOption = PHY_SERDES_OPTION_OTHER; +exit: + return status; +} + +BOOLEAN +Rtl8226b_serdes_polarity_swap( + IN HANDLE hDevice, + IN PHY_SERDES_POLARITY_SWAP *ppolarityswap + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyWrite(hDevice, MMD_VEND1, 0x7588, 0x0); + if (status != SUCCESS) + goto exit; + + if (ppolarityswap->TX_SWAP && ppolarityswap->RX_SWAP) + phydata = 0x1703; + else if (ppolarityswap->TX_SWAP) + phydata = 0x1503; + else if (ppolarityswap->RX_SWAP) + phydata = 0x1603; + else + phydata = 0x1403; + + status = MmdPhyWrite(hDevice, MMD_VEND1, 0x7589, phydata); + if (status != SUCCESS) + goto exit; + + status = MmdPhyWrite(hDevice, MMD_VEND1, 0x7587, 0x0003); + if (status != SUCCESS) + goto exit; + +exit: + return status; +} + +BOOLEAN +Rtl8226b_serdes_autoNego_set( + IN HANDLE hDevice, + IN BOOL Enable + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyWrite(hDevice, MMD_VEND1, 0x7588, 0x0002); + if (status != SUCCESS) + goto exit; + + if (Enable) + phydata = 0x70D0; + else + phydata = 0x71D0; + + status = MmdPhyWrite(hDevice, MMD_VEND1, 0x7589, phydata); + if (status != SUCCESS) + goto exit; + + status = MmdPhyWrite(hDevice, MMD_VEND1, 0x7587, 0x0003); + if (status != SUCCESS) + goto exit; + +exit: + return status; +} + +BOOLEAN +Rtl8226b_wol_set( + IN HANDLE hDevice, + IN PHY_WOL_EVENT *pwolevent + ) +{ + BOOL status = FAILURE; + BOOL linkOK; + UINT16 speed; + UINT16 phydata = 0, phydata2=0; + + status = Rtl8226b_is_link(hDevice, &linkOK); + if (status != SUCCESS) + goto exit; + + if (linkOK) + { + status = Rtl8226b_speed_get(hDevice, &speed); + if (status != SUCCESS) + goto exit; + + //WOL is not supported when port link at 2.5G. + if (speed == LINK_SPEED_2P5G) + { + osal_printf("WOL/PME is not supported when port link at 2.5G.\n"); + status = FAILURE; + goto exit; + } + } + + //Set INTB/PMEB pinas PMEB(optional) MMD31, reg 0xD05C, bit0=1 + status = MmdPhyRead(hDevice, MMD_VEND2, 0xD05C, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= BIT_0; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD05C, phydata); + if (status != SUCCESS) + goto exit; + + // wait 1ms + Sleep(1); + + //Set MAC address MMD31, reg 0xD8C0,0xD8C2,0xD8C4 + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD8C0, pwolevent->macaddress.ADDR15_0); + if (status != SUCCESS) + goto exit; + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD8C2, pwolevent->macaddress.ADDR31_16); + if (status != SUCCESS) + goto exit; + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD8C4, pwolevent->macaddress.ADDR47_32); + if (status != SUCCESS) + goto exit; + + //Set Max packet length MMD31, reg 0xD8A2 + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD8A2, pwolevent->MAXPKTLENGTH); + if (status != SUCCESS) + goto exit; + + //WOL event select and enable MMD31, reg 0xD8A0 + if(pwolevent->LINKCHG) + phydata2 |= BIT_13; + if(pwolevent->MAGIC) + phydata2 |= BIT_12; + if(pwolevent->ARBITRARY) + phydata2 |= BIT_11; + if(pwolevent->UNICAST) + phydata2 |= BIT_10; + if(pwolevent->MULTICAST) + phydata2 |= BIT_9; + if(pwolevent->BROADCAST) + phydata2 |= BIT_8; + if(pwolevent->FRAME7) + phydata2 |= BIT_7; + if(pwolevent->FRAME6) + phydata2 |= BIT_6; + if(pwolevent->FRAME5) + phydata2 |= BIT_5; + if(pwolevent->FRAME4) + phydata2 |= BIT_4; + if(pwolevent->FRAME3) + phydata2 |= BIT_3; + if(pwolevent->FRAME2) + phydata2 |= BIT_2; + if(pwolevent->FRAME1) + phydata2 |= BIT_1; + if(pwolevent->FRAME0) + phydata2 |= BIT_0; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD8A0, phydata2); + if (status != SUCCESS) + goto exit; + + if(pwolevent->MULTICAST) + { + //Set Multicast register MMD31, reg 0xD8C6,0xD8C8,0xD8CA,0xD8CC + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD8C6, pwolevent->multicast.REG15_0); + if (status != SUCCESS) + goto exit; + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD8C8, pwolevent->multicast.REG31_16); + if (status != SUCCESS) + goto exit; + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD8CA, pwolevent->multicast.REG47_32); + if (status != SUCCESS) + goto exit; + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD8CC, pwolevent->multicast.REG63_48); + if (status != SUCCESS) + goto exit; + } + + //Set Wakeup Frame #0 + if(pwolevent->FRAME0) + { + //Set Mask + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD800, pwolevent->wakeframe0.MASK15_0); + if (status != SUCCESS) + goto exit; + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD802, pwolevent->wakeframe0.MASK31_16); + if (status != SUCCESS) + goto exit; + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD804, pwolevent->wakeframe0.MASK47_32); + if (status != SUCCESS) + goto exit; + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD806, pwolevent->wakeframe0.MASK63_48); + if (status != SUCCESS) + goto exit; + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD808, pwolevent->wakeframe0.MASK79_64); + if (status != SUCCESS) + goto exit; + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD80A, pwolevent->wakeframe0.MASK95_80); + if (status != SUCCESS) + goto exit; + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD80C, pwolevent->wakeframe0.MASK111_96); + if (status != SUCCESS) + goto exit; + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD80E, pwolevent->wakeframe0.MASK127_112); + if (status != SUCCESS) + goto exit; + + //Set CRC + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD880, pwolevent->wakeframe0.CRC); + if (status != SUCCESS) + goto exit; + } + +exit: + return status; +} + +BOOLEAN +Rtl8226b_wol_exit( + IN HANDLE hDevice + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + //Disable all WOL events + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD8A0, 0x0000); + if (status != SUCCESS) + goto exit; + + //WOL reset + status = MmdPhyRead(hDevice, MMD_VEND2, 0xD8A2, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~BIT_15); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xD8A2, phydata); + if (status != SUCCESS) + goto exit; + +exit: + return status; +} +BOOLEAN +Rtl8226b_ThermalSensor_get( + IN HANDLE hDevice, + OUT PHY_THERMAL_RESULT *pTsResult + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA436, 0x817D); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA438, &phydata); + if (status != SUCCESS) + goto exit; + + pTsResult->Enable = (phydata & BIT_12) ? (TRUE) : (FALSE); + + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xBD84, &phydata); + if (status != SUCCESS) + goto exit; + + pTsResult->Temperature = (phydata & 0x03ff)/2; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xB54C, &phydata); + if (status != SUCCESS) + goto exit; + + pTsResult->Temperature_threshold = ((phydata & 0xffc0)>>6)/2; + +exit: + return status; +} + +BOOLEAN +Rtl8226b_ThermalSensor_resume_2P5G( + IN HANDLE hDevice + ) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + status = MmdPhyRead(hDevice, MMD_VEND2,0xA662, &phydata); + if (status != SUCCESS) + goto exit; + + phydata &= (~(BIT_1 | BIT_0)); + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA662, phydata); + if (status != SUCCESS) + goto exit; + + //The setting will take effect after a link change event + Rtl8226b_enable_set(hDevice, FALSE); + Sleep (1); + Rtl8226b_enable_set(hDevice, TRUE); + + +exit: + return status; +} diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/nic_rtl8226b.h b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/nic_rtl8226b.h new file mode 100755 index 0000000..d5e4a27 --- /dev/null +++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/nic_rtl8226b.h @@ -0,0 +1,336 @@ +/* + * Copyright (C) 2019 Realtek Semiconductor Corp. + * All Rights Reserved. + * + * This program is the proprietary software of Realtek Semiconductor + * Corporation and/or its licensors, and only be used, duplicated, + * modified or distributed under the authorized license from Realtek. + * + * ANY USE OF THE SOFTWARE OTHER THAN AS AUTHORIZED UNDER + * THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + * + * Purpose : PHY 8226 Driver + * + * Feature : PHY 8226 Driver + * + */ +#ifndef __NIC_RTL8226B_H__ +#define __NIC_RTL8226B_H__ + +#include + + +BOOLEAN +Rtl8226b_ThermalSensor_get( + IN HANDLE hDevice, + OUT PHY_THERMAL_RESULT *pTsResult + ); + +BOOLEAN +Rtl8226b_ThermalSensor_resume_2P5G( + IN HANDLE hDevice + ); + +BOOLEAN +Rtl8226b_wol_set( + IN HANDLE hDevice, + IN PHY_WOL_EVENT *pwolevent + ); + +BOOLEAN +Rtl8226b_wol_exit( + IN HANDLE hDevice + ); + +BOOLEAN +Rtl8226b_phy_reset( + IN HANDLE hDevice + ); + +BOOLEAN +Rtl8226b_autoNegoEnable_get( + IN HANDLE hDevice, + OUT BOOL *pEnable + ); + +BOOLEAN +Rtl8226b_autoNegoEnable_set( + IN HANDLE hDevice, + IN BOOL Enable + ); + +BOOLEAN +Rtl8226b_autoNegoAbility_get( + IN HANDLE hDevice, + OUT PHY_LINK_ABILITY *pPhyAbility + ); + +BOOLEAN +Rtl8226b_autoNegoAbility_set( + IN HANDLE hDevice, + IN PHY_LINK_ABILITY *pPhyAbility + ); + +BOOLEAN +Rtl8226b_duplex_get( + IN HANDLE hDevice, + OUT BOOL *pEnable + ); + +BOOLEAN +Rtl8226b_duplex_set( + IN HANDLE hDevice, + IN BOOL Enable + ); + +BOOLEAN +Rtl8226b_is_link( + IN HANDLE hDevice, + OUT BOOL *plinkok + ); + +BOOLEAN +Rtl8226b_speed_get( + IN HANDLE hDevice, + OUT UINT16 *pSpeed + ); + +BOOLEAN +Rtl8226b_force_speed_set( + IN HANDLE hDevice, + IN UINT16 Speed + ); + +BOOLEAN +Rtl8226b_force_speed_get( + IN HANDLE hDevice, + OUT UINT16 *force_speed + ); + + + +BOOLEAN +Rtl8226b_enable_set( + IN HANDLE hDevice, + IN BOOL Enable + ); + +BOOLEAN +Rtl8226b_greenEnable_get( + IN HANDLE hDevice, + OUT BOOL *pEnable + ); + +BOOLEAN +Rtl8226b_greenEnable_set( + IN HANDLE hDevice, + IN BOOL Enable + ); + +BOOLEAN +Rtl8226b_eeeEnable_get( + IN HANDLE hDevice, + OUT PHY_EEE_ENABLE *pEeeEnable + ); + +BOOLEAN +Rtl8226b_eeeEnable_set( + IN HANDLE hDevice, + IN PHY_EEE_ENABLE *pEeeEnable + ); + +BOOLEAN +Rtl8226b_PHYmodeEEE_set( + IN HANDLE hDevice, + int on_off + ); + +BOOLEAN +Rtl8226b_10M_PHYmodeEEEP_set( + IN HANDLE hDevice, + int on_off + ); + + + +BOOLEAN +Rtl8226b_crossOverMode_get( + IN HANDLE hDevice, + OUT PHY_CROSSPVER_MODE *CrossOverMode + ); + +BOOLEAN +Rtl8226b_crossOverMode_set( + IN HANDLE hDevice, + IN PHY_CROSSPVER_MODE CrossOverMode + ); + +BOOLEAN +Rtl8226b_crossOverStatus_get( + IN HANDLE hDevice, + OUT PHY_CROSSPVER_STATUS *pCrossOverStatus + ); + +BOOLEAN +Rtl8226b_masterSlave_get( + IN HANDLE hDevice, + OUT PHY_MASTERSLAVE_MODE *MasterSlaveMode + ); + +BOOLEAN +Rtl8226b_masterSlave_set( + IN HANDLE hDevice, + IN PHY_MASTERSLAVE_MODE MasterSlaveMode + ); + +BOOLEAN +Rtl8226b_loopback_get( + IN HANDLE hDevice, + OUT BOOL *pEnable + ); + +BOOLEAN +Rtl8226b_loopback_set( + IN HANDLE hDevice, + IN BOOL Enable + ); + +BOOLEAN +Rtl8226b_downSpeedEnable_get( + IN HANDLE hDevice, + OUT BOOL *pEnable + ); + +BOOLEAN +Rtl8226b_downSpeedEnable_set( + IN HANDLE hDevice, + IN BOOL Enable + ); + +BOOLEAN +Rtl8226b_gigaLiteEnable_get( + IN HANDLE hDevice, + OUT BOOL *pEnable + ); + +BOOLEAN +Rtl8226b_gigaLiteEnable_set( + IN HANDLE hDevice, + IN BOOL Enable + ); + +BOOLEAN +Rtl8226b_mdiSwapEnable_get( + IN HANDLE hDevice, + OUT BOOL *pEnable + ); + +BOOLEAN +Rtl8226b_mdiSwapEnable_set( + IN HANDLE hDevice, + IN BOOL Enable + ); + +BOOLEAN +Rtl8226b_rtct_start( + IN HANDLE hDevice + ); + +BOOLEAN +Rtl8226b_rtctResult_get( + IN HANDLE hDevice, + OUT PHY_RTCT_RESULT *pRtctResult + ); + +BOOLEAN +Rtl8226b_rtctdone_get( + IN HANDLE hDevice, + OUT BOOL *prtct_done + ); + + +BOOLEAN +Rtl8226b_linkDownPowerSavingEnable_get( + IN HANDLE hDevice, + OUT BOOL *pEnable + ); + +BOOLEAN +Rtl8226b_linkDownPowerSavingEnable_set( + IN HANDLE hDevice, + IN BOOL Enable + ); + +BOOLEAN +Rtl8226b_2p5gLiteEnable_get( + IN HANDLE hDevice, + OUT BOOL *pEnable + ); + +BOOLEAN +Rtl8226b_2p5gLiteEnable_set( + IN HANDLE hDevice, + IN BOOL Enable + ); + +BOOLEAN +Rtl8226b_ThermalSensorEnable_get( + IN HANDLE hDevice, + OUT BOOL *pEnable + ); + +BOOLEAN +Rtl8226b_ThermalSensorEnable_set( + IN HANDLE hDevice, + IN BOOL Enable, + IN UINT16 threshold + ); + +BOOLEAN +Rtl8226b_ieeeTestMode_set( + IN HANDLE hDevice, + IN UINT16 Speed, + IN PHY_IEEE_TEST_MODE *pIEEEtestmode + ); + +BOOLEAN +Rtl8226b_serdes_rst( + IN HANDLE hDevice + ); + +BOOLEAN +Rtl8226b_serdes_link_get( + IN HANDLE hDevice, + OUT BOOL *perdesLink, + OUT PHY_SERDES_MODE *SerdesMode + ); + +BOOLEAN +Rtl8226b_serdes_option_set( + IN HANDLE hDevice, + IN UINT8 functioninput + ); + +BOOLEAN +Rtl8226b_serdes_option_get( + IN HANDLE hDevice, + OUT PHY_SERDES_OPTION *SerdesOption + ); + +BOOLEAN +Rtl8226b_serdes_polarity_swap( + IN HANDLE hDevice, + IN PHY_SERDES_POLARITY_SWAP *ppolarityswap + ); + +BOOLEAN +Rtl8226b_serdes_autoNego_set( + IN HANDLE hDevice, + IN BOOL Enable + ); + + + + +#endif /* __NIC_RTL8226_H__ */ + diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/nic_rtl8226b_init.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/nic_rtl8226b_init.c new file mode 100755 index 0000000..a97c9e9 --- /dev/null +++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/nic_rtl8226b_init.c @@ -0,0 +1,1642 @@ + +/* SW_SDK: include files */ +//#include +//#include +//#include +//#include +//#include +#include "rtl_adapter.h" +#include "rtl8226_typedef.h" + +static const MMD_REG Rtl8226b_n0_ramcode[] = +{ + { 31, 0xa436, 0XA016, }, + { 31, 0xa438, 0X0000, }, + { 31, 0xa436, 0XA012, }, + { 31, 0xa438, 0X0000, }, + { 31, 0xa436, 0XA014, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X8010, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X801a, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X8024, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X802f, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X8051, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X8057, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X8063, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X8068, }, + { 31, 0xa438, 0Xd093, }, + { 31, 0xa438, 0Xd1c4, }, + { 31, 0xa438, 0X1000, }, + { 31, 0xa438, 0X135c, }, + { 31, 0xa438, 0Xd704, }, + { 31, 0xa438, 0X5fbc, }, + { 31, 0xa438, 0Xd504, }, + { 31, 0xa438, 0Xc9f1, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X0fc9, }, + { 31, 0xa438, 0Xbb50, }, + { 31, 0xa438, 0Xd505, }, + { 31, 0xa438, 0Xa202, }, + { 31, 0xa438, 0Xd504, }, + { 31, 0xa438, 0X8c0f, }, + { 31, 0xa438, 0Xd500, }, + { 31, 0xa438, 0X1000, }, + { 31, 0xa438, 0X1519, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X1548, }, + { 31, 0xa438, 0X2f70, }, + { 31, 0xa438, 0X802a, }, + { 31, 0xa438, 0X2f73, }, + { 31, 0xa438, 0X156a, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X155c, }, + { 31, 0xa438, 0Xd505, }, + { 31, 0xa438, 0Xa202, }, + { 31, 0xa438, 0Xd500, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X1551, }, + { 31, 0xa438, 0Xc0c1, }, + { 31, 0xa438, 0Xc0c0, }, + { 31, 0xa438, 0Xd05a, }, + { 31, 0xa438, 0Xd1ba, }, + { 31, 0xa438, 0Xd701, }, + { 31, 0xa438, 0X2529, }, + { 31, 0xa438, 0X022a, }, + { 31, 0xa438, 0Xd0a7, }, + { 31, 0xa438, 0Xd1b9, }, + { 31, 0xa438, 0Xa208, }, + { 31, 0xa438, 0X1000, }, + { 31, 0xa438, 0X080e, }, + { 31, 0xa438, 0Xd701, }, + { 31, 0xa438, 0X408b, }, + { 31, 0xa438, 0X1000, }, + { 31, 0xa438, 0X0a65, }, + { 31, 0xa438, 0Xf003, }, + { 31, 0xa438, 0X1000, }, + { 31, 0xa438, 0X0a6b, }, + { 31, 0xa438, 0Xd701, }, + { 31, 0xa438, 0X1000, }, + { 31, 0xa438, 0X0920, }, + { 31, 0xa438, 0X1000, }, + { 31, 0xa438, 0X0915, }, + { 31, 0xa438, 0X1000, }, + { 31, 0xa438, 0X0909, }, + { 31, 0xa438, 0X228f, }, + { 31, 0xa438, 0X8038, }, + { 31, 0xa438, 0X9801, }, + { 31, 0xa438, 0Xd71e, }, + { 31, 0xa438, 0X5d61, }, + { 31, 0xa438, 0Xd701, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X022a, }, + { 31, 0xa438, 0X2005, }, + { 31, 0xa438, 0X091a, }, + { 31, 0xa438, 0X3bd9, }, + { 31, 0xa438, 0X0919, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X0916, }, + { 31, 0xa438, 0X1000, }, + { 31, 0xa438, 0X14c5, }, + { 31, 0xa438, 0Xd703, }, + { 31, 0xa438, 0X3181, }, + { 31, 0xa438, 0X8061, }, + { 31, 0xa438, 0X60ad, }, + { 31, 0xa438, 0X1000, }, + { 31, 0xa438, 0X135c, }, + { 31, 0xa438, 0Xd703, }, + { 31, 0xa438, 0X5fba, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X0cc7, }, + { 31, 0xa438, 0Xd096, }, + { 31, 0xa438, 0Xd1a9, }, + { 31, 0xa438, 0Xd503, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X0c94, }, + { 31, 0xa438, 0Xa802, }, + { 31, 0xa438, 0Xa301, }, + { 31, 0xa438, 0Xa801, }, + { 31, 0xa438, 0Xc004, }, + { 31, 0xa438, 0Xd710, }, + { 31, 0xa438, 0X4000, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X1e79, }, + { 31, 0xa436, 0XA026, }, + { 31, 0xa438, 0X1e78, }, + { 31, 0xa436, 0XA024, }, + { 31, 0xa438, 0X0c93, }, + { 31, 0xa436, 0XA022, }, + { 31, 0xa438, 0X0cc5, }, + { 31, 0xa436, 0XA020, }, + { 31, 0xa438, 0X0915, }, + { 31, 0xa436, 0XA006, }, + { 31, 0xa438, 0X020a, }, + { 31, 0xa436, 0XA004, }, + { 31, 0xa438, 0X155b, }, + { 31, 0xa436, 0XA002, }, + { 31, 0xa438, 0X1542, }, + { 31, 0xa436, 0XA000, }, + { 31, 0xa438, 0X0fc7, }, + { 31, 0xa436, 0XA008, }, + { 31, 0xa438, 0Xff00, }, + + +}; + + +static const MMD_REG Rtl8226b_n1_ramcode[] = +{ + { 31, 0xa436, 0XA016, }, + { 31, 0xa438, 0X0010, }, + { 31, 0xa436, 0XA012, }, + { 31, 0xa438, 0X0000, }, + { 31, 0xa436, 0XA014, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X8010, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X801d, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X802c, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X802c, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X802c, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X802c, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X802c, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X802c, }, + { 31, 0xa438, 0Xd700, }, + { 31, 0xa438, 0X6090, }, + { 31, 0xa438, 0X60d1, }, + { 31, 0xa438, 0Xc95c, }, + { 31, 0xa438, 0Xf007, }, + { 31, 0xa438, 0X60b1, }, + { 31, 0xa438, 0Xc95a, }, + { 31, 0xa438, 0Xf004, }, + { 31, 0xa438, 0Xc956, }, + { 31, 0xa438, 0Xf002, }, + { 31, 0xa438, 0Xc94e, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X00cd, }, + { 31, 0xa438, 0Xd700, }, + { 31, 0xa438, 0X6090, }, + { 31, 0xa438, 0X60d1, }, + { 31, 0xa438, 0Xc95c, }, + { 31, 0xa438, 0Xf007, }, + { 31, 0xa438, 0X60b1, }, + { 31, 0xa438, 0Xc95a, }, + { 31, 0xa438, 0Xf004, }, + { 31, 0xa438, 0Xc956, }, + { 31, 0xa438, 0Xf002, }, + { 31, 0xa438, 0Xc94e, }, + { 31, 0xa438, 0X1000, }, + { 31, 0xa438, 0X022a, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X0132, }, + { 31, 0xa436, 0XA08E, }, + { 31, 0xa438, 0Xffff, }, + { 31, 0xa436, 0XA08C, }, + { 31, 0xa438, 0Xffff, }, + { 31, 0xa436, 0XA08A, }, + { 31, 0xa438, 0Xffff, }, + { 31, 0xa436, 0XA088, }, + { 31, 0xa438, 0Xffff, }, + { 31, 0xa436, 0XA086, }, + { 31, 0xa438, 0Xffff, }, + { 31, 0xa436, 0XA084, }, + { 31, 0xa438, 0Xffff, }, + { 31, 0xa436, 0XA082, }, + { 31, 0xa438, 0X012f, }, + { 31, 0xa436, 0XA080, }, + { 31, 0xa438, 0X00cc, }, + { 31, 0xa436, 0XA090, }, + { 31, 0xa438, 0X0103, }, +}; + + +static const MMD_REG Rtl8226b_n2_ramcode[] = +{ + { 31, 0xa436, 0XA016, }, + { 31, 0xa438, 0X0020, }, + { 31, 0xa436, 0XA012, }, + { 31, 0xa438, 0X0000, }, + { 31, 0xa436, 0XA014, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X8010, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X8020, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X802a, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X8035, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X803c, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X803c, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X803c, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X803c, }, + { 31, 0xa438, 0Xd107, }, + { 31, 0xa438, 0Xd042, }, + { 31, 0xa438, 0Xa404, }, + { 31, 0xa438, 0X1000, }, + { 31, 0xa438, 0X09df, }, + { 31, 0xa438, 0Xd700, }, + { 31, 0xa438, 0X5fb4, }, + { 31, 0xa438, 0X8280, }, + { 31, 0xa438, 0Xd700, }, + { 31, 0xa438, 0X6065, }, + { 31, 0xa438, 0Xd125, }, + { 31, 0xa438, 0Xf002, }, + { 31, 0xa438, 0Xd12b, }, + { 31, 0xa438, 0Xd040, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X077f, }, + { 31, 0xa438, 0X0cf0, }, + { 31, 0xa438, 0X0c50, }, + { 31, 0xa438, 0Xd104, }, + { 31, 0xa438, 0Xd040, }, + { 31, 0xa438, 0X1000, }, + { 31, 0xa438, 0X0aa8, }, + { 31, 0xa438, 0Xd700, }, + { 31, 0xa438, 0X5fb4, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X0a2e, }, + { 31, 0xa438, 0Xcb9b, }, + { 31, 0xa438, 0Xd110, }, + { 31, 0xa438, 0Xd040, }, + { 31, 0xa438, 0X1000, }, + { 31, 0xa438, 0X0b7b, }, + { 31, 0xa438, 0X1000, }, + { 31, 0xa438, 0X09df, }, + { 31, 0xa438, 0Xd700, }, + { 31, 0xa438, 0X5fb4, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X081b, }, + { 31, 0xa438, 0X1000, }, + { 31, 0xa438, 0X09df, }, + { 31, 0xa438, 0Xd704, }, + { 31, 0xa438, 0X7fb8, }, + { 31, 0xa438, 0Xa718, }, + { 31, 0xa438, 0X1800, }, + { 31, 0xa438, 0X074e, }, + { 31, 0xa436, 0XA10E, }, + { 31, 0xa438, 0Xffff, }, + { 31, 0xa436, 0XA10C, }, + { 31, 0xa438, 0Xffff, }, + { 31, 0xa436, 0XA10A, }, + { 31, 0xa438, 0Xffff, }, + { 31, 0xa436, 0XA108, }, + { 31, 0xa438, 0Xffff, }, + { 31, 0xa436, 0XA106, }, + { 31, 0xa438, 0X074d, }, + { 31, 0xa436, 0XA104, }, + { 31, 0xa438, 0X0818, }, + { 31, 0xa436, 0XA102, }, + { 31, 0xa438, 0X0a2c, }, + { 31, 0xa436, 0XA100, }, + { 31, 0xa438, 0X077e, }, + { 31, 0xa436, 0XA110, }, + { 31, 0xa438, 0X000f, }, + +}; + +static const MMD_REG Rtl8226b_uc2_ramcode[] = +{ + { 31, 0xa436, 0Xb87c, }, + { 31, 0xa438, 0X8625, }, + { 31, 0xa436, 0Xb87e, }, + { 31, 0xa438, 0Xaf86, }, + { 31, 0xa438, 0X3daf, }, + { 31, 0xa438, 0X8689, }, + { 31, 0xa438, 0Xaf88, }, + { 31, 0xa438, 0X69af, }, + { 31, 0xa438, 0X8887, }, + { 31, 0xa438, 0Xaf88, }, + { 31, 0xa438, 0X9caf, }, + { 31, 0xa438, 0X889c, }, + { 31, 0xa438, 0Xaf88, }, + { 31, 0xa438, 0X9caf, }, + { 31, 0xa438, 0X889c, }, + { 31, 0xa438, 0Xbf86, }, + { 31, 0xa438, 0X49d7, }, + { 31, 0xa438, 0X0040, }, + { 31, 0xa438, 0X0277, }, + { 31, 0xa438, 0X7daf, }, + { 31, 0xa438, 0X2727, }, + { 31, 0xa438, 0X0000, }, + { 31, 0xa438, 0X7205, }, + { 31, 0xa438, 0X0000, }, + { 31, 0xa438, 0X7208, }, + { 31, 0xa438, 0X0000, }, + { 31, 0xa438, 0X71f3, }, + { 31, 0xa438, 0X0000, }, + { 31, 0xa438, 0X71f6, }, + { 31, 0xa438, 0X0000, }, + { 31, 0xa438, 0X7229, }, + { 31, 0xa438, 0X0000, }, + { 31, 0xa438, 0X722c, }, + { 31, 0xa438, 0X0000, }, + { 31, 0xa438, 0X7217, }, + { 31, 0xa438, 0X0000, }, + { 31, 0xa438, 0X721a, }, + { 31, 0xa438, 0X0000, }, + { 31, 0xa438, 0X721d, }, + { 31, 0xa438, 0X0000, }, + { 31, 0xa438, 0X7211, }, + { 31, 0xa438, 0X0000, }, + { 31, 0xa438, 0X7220, }, + { 31, 0xa438, 0X0000, }, + { 31, 0xa438, 0X7214, }, + { 31, 0xa438, 0X0000, }, + { 31, 0xa438, 0X722f, }, + { 31, 0xa438, 0X0000, }, + { 31, 0xa438, 0X7223, }, + { 31, 0xa438, 0X0000, }, + { 31, 0xa438, 0X7232, }, + { 31, 0xa438, 0X0000, }, + { 31, 0xa438, 0X7226, }, + { 31, 0xa438, 0Xf8f9, }, + { 31, 0xa438, 0Xfae0, }, + { 31, 0xa438, 0X85b3, }, + { 31, 0xa438, 0X3802, }, + { 31, 0xa438, 0Xad27, }, + { 31, 0xa438, 0X02ae, }, + { 31, 0xa438, 0X03af, }, + { 31, 0xa438, 0X8830, }, + { 31, 0xa438, 0X1f66, }, + { 31, 0xa438, 0Xef65, }, + { 31, 0xa438, 0Xbfc2, }, + { 31, 0xa438, 0X1f1a, }, + { 31, 0xa438, 0X96f7, }, + { 31, 0xa438, 0X05ee, }, + { 31, 0xa438, 0Xffd2, }, + { 31, 0xa438, 0X00da, }, + { 31, 0xa438, 0Xf605, }, + { 31, 0xa438, 0Xbfc2, }, + { 31, 0xa438, 0X2f1a, }, + { 31, 0xa438, 0X96f7, }, + { 31, 0xa438, 0X05ee, }, + { 31, 0xa438, 0Xffd2, }, + { 31, 0xa438, 0X00db, }, + { 31, 0xa438, 0Xf605, }, + { 31, 0xa438, 0Xef02, }, + { 31, 0xa438, 0X1f11, }, + { 31, 0xa438, 0X0d42, }, + { 31, 0xa438, 0Xbf88, }, + { 31, 0xa438, 0X4202, }, + { 31, 0xa438, 0X6e7d, }, + { 31, 0xa438, 0Xef02, }, + { 31, 0xa438, 0X1b03, }, + { 31, 0xa438, 0X1f11, }, + { 31, 0xa438, 0X0d42, }, + { 31, 0xa438, 0Xbf88, }, + { 31, 0xa438, 0X4502, }, + { 31, 0xa438, 0X6e7d, }, + { 31, 0xa438, 0Xef02, }, + { 31, 0xa438, 0X1a03, }, + { 31, 0xa438, 0X1f11, }, + { 31, 0xa438, 0X0d42, }, + { 31, 0xa438, 0Xbf88, }, + { 31, 0xa438, 0X4802, }, + { 31, 0xa438, 0X6e7d, }, + { 31, 0xa438, 0Xbfc2, }, + { 31, 0xa438, 0X3f1a, }, + { 31, 0xa438, 0X96f7, }, + { 31, 0xa438, 0X05ee, }, + { 31, 0xa438, 0Xffd2, }, + { 31, 0xa438, 0X00da, }, + { 31, 0xa438, 0Xf605, }, + { 31, 0xa438, 0Xbfc2, }, + { 31, 0xa438, 0X4f1a, }, + { 31, 0xa438, 0X96f7, }, + { 31, 0xa438, 0X05ee, }, + { 31, 0xa438, 0Xffd2, }, + { 31, 0xa438, 0X00db, }, + { 31, 0xa438, 0Xf605, }, + { 31, 0xa438, 0Xef02, }, + { 31, 0xa438, 0X1f11, }, + { 31, 0xa438, 0X0d42, }, + { 31, 0xa438, 0Xbf88, }, + { 31, 0xa438, 0X4b02, }, + { 31, 0xa438, 0X6e7d, }, + { 31, 0xa438, 0Xef02, }, + { 31, 0xa438, 0X1b03, }, + { 31, 0xa438, 0X1f11, }, + { 31, 0xa438, 0X0d42, }, + { 31, 0xa438, 0Xbf88, }, + { 31, 0xa438, 0X4e02, }, + { 31, 0xa438, 0X6e7d, }, + { 31, 0xa438, 0Xef02, }, + { 31, 0xa438, 0X1a03, }, + { 31, 0xa438, 0X1f11, }, + { 31, 0xa438, 0X0d42, }, + { 31, 0xa438, 0Xbf88, }, + { 31, 0xa438, 0X5102, }, + { 31, 0xa438, 0X6e7d, }, + { 31, 0xa438, 0Xef56, }, + { 31, 0xa438, 0Xd020, }, + { 31, 0xa438, 0X1f11, }, + { 31, 0xa438, 0Xbf88, }, + { 31, 0xa438, 0X5402, }, + { 31, 0xa438, 0X6e7d, }, + { 31, 0xa438, 0Xbf88, }, + { 31, 0xa438, 0X5702, }, + { 31, 0xa438, 0X6e7d, }, + { 31, 0xa438, 0Xbf88, }, + { 31, 0xa438, 0X5a02, }, + { 31, 0xa438, 0X6e7d, }, + { 31, 0xa438, 0Xe185, }, + { 31, 0xa438, 0Xa0ef, }, + { 31, 0xa438, 0X0348, }, + { 31, 0xa438, 0X0a28, }, + { 31, 0xa438, 0X05ef, }, + { 31, 0xa438, 0X201b, }, + { 31, 0xa438, 0X01ad, }, + { 31, 0xa438, 0X2735, }, + { 31, 0xa438, 0X1f44, }, + { 31, 0xa438, 0Xe085, }, + { 31, 0xa438, 0X88e1, }, + { 31, 0xa438, 0X8589, }, + { 31, 0xa438, 0Xbf88, }, + { 31, 0xa438, 0X5d02, }, + { 31, 0xa438, 0X6e7d, }, + { 31, 0xa438, 0Xe085, }, + { 31, 0xa438, 0X8ee1, }, + { 31, 0xa438, 0X858f, }, + { 31, 0xa438, 0Xbf88, }, + { 31, 0xa438, 0X6002, }, + { 31, 0xa438, 0X6e7d, }, + { 31, 0xa438, 0Xe085, }, + { 31, 0xa438, 0X94e1, }, + { 31, 0xa438, 0X8595, }, + { 31, 0xa438, 0Xbf88, }, + { 31, 0xa438, 0X6302, }, + { 31, 0xa438, 0X6e7d, }, + { 31, 0xa438, 0Xe085, }, + { 31, 0xa438, 0X9ae1, }, + { 31, 0xa438, 0X859b, }, + { 31, 0xa438, 0Xbf88, }, + { 31, 0xa438, 0X6602, }, + { 31, 0xa438, 0X6e7d, }, + { 31, 0xa438, 0Xaf88, }, + { 31, 0xa438, 0X3cbf, }, + { 31, 0xa438, 0X883f, }, + { 31, 0xa438, 0X026e, }, + { 31, 0xa438, 0X9cad, }, + { 31, 0xa438, 0X2835, }, + { 31, 0xa438, 0X1f44, }, + { 31, 0xa438, 0Xe08f, }, + { 31, 0xa438, 0Xf8e1, }, + { 31, 0xa438, 0X8ff9, }, + { 31, 0xa438, 0Xbf88, }, + { 31, 0xa438, 0X5d02, }, + { 31, 0xa438, 0X6e7d, }, + { 31, 0xa438, 0Xe08f, }, + { 31, 0xa438, 0Xfae1, }, + { 31, 0xa438, 0X8ffb, }, + { 31, 0xa438, 0Xbf88, }, + { 31, 0xa438, 0X6002, }, + { 31, 0xa438, 0X6e7d, }, + { 31, 0xa438, 0Xe08f, }, + { 31, 0xa438, 0Xfce1, }, + { 31, 0xa438, 0X8ffd, }, + { 31, 0xa438, 0Xbf88, }, + { 31, 0xa438, 0X6302, }, + { 31, 0xa438, 0X6e7d, }, + { 31, 0xa438, 0Xe08f, }, + { 31, 0xa438, 0Xfee1, }, + { 31, 0xa438, 0X8fff, }, + { 31, 0xa438, 0Xbf88, }, + { 31, 0xa438, 0X6602, }, + { 31, 0xa438, 0X6e7d, }, + { 31, 0xa438, 0Xaf88, }, + { 31, 0xa438, 0X3ce1, }, + { 31, 0xa438, 0X85a1, }, + { 31, 0xa438, 0X1b21, }, + { 31, 0xa438, 0Xad37, }, + { 31, 0xa438, 0X341f, }, + { 31, 0xa438, 0X44e0, }, + { 31, 0xa438, 0X858a, }, + { 31, 0xa438, 0Xe185, }, + { 31, 0xa438, 0X8bbf, }, + { 31, 0xa438, 0X885d, }, + { 31, 0xa438, 0X026e, }, + { 31, 0xa438, 0X7de0, }, + { 31, 0xa438, 0X8590, }, + { 31, 0xa438, 0Xe185, }, + { 31, 0xa438, 0X91bf, }, + { 31, 0xa438, 0X8860, }, + { 31, 0xa438, 0X026e, }, + { 31, 0xa438, 0X7de0, }, + { 31, 0xa438, 0X8596, }, + { 31, 0xa438, 0Xe185, }, + { 31, 0xa438, 0X97bf, }, + { 31, 0xa438, 0X8863, }, + { 31, 0xa438, 0X026e, }, + { 31, 0xa438, 0X7de0, }, + { 31, 0xa438, 0X859c, }, + { 31, 0xa438, 0Xe185, }, + { 31, 0xa438, 0X9dbf, }, + { 31, 0xa438, 0X8866, }, + { 31, 0xa438, 0X026e, }, + { 31, 0xa438, 0X7dae, }, + { 31, 0xa438, 0X401f, }, + { 31, 0xa438, 0X44e0, }, + { 31, 0xa438, 0X858c, }, + { 31, 0xa438, 0Xe185, }, + { 31, 0xa438, 0X8dbf, }, + { 31, 0xa438, 0X885d, }, + { 31, 0xa438, 0X026e, }, + { 31, 0xa438, 0X7de0, }, + { 31, 0xa438, 0X8592, }, + { 31, 0xa438, 0Xe185, }, + { 31, 0xa438, 0X93bf, }, + { 31, 0xa438, 0X8860, }, + { 31, 0xa438, 0X026e, }, + { 31, 0xa438, 0X7de0, }, + { 31, 0xa438, 0X8598, }, + { 31, 0xa438, 0Xe185, }, + { 31, 0xa438, 0X99bf, }, + { 31, 0xa438, 0X8863, }, + { 31, 0xa438, 0X026e, }, + { 31, 0xa438, 0X7de0, }, + { 31, 0xa438, 0X859e, }, + { 31, 0xa438, 0Xe185, }, + { 31, 0xa438, 0X9fbf, }, + { 31, 0xa438, 0X8866, }, + { 31, 0xa438, 0X026e, }, + { 31, 0xa438, 0X7dae, }, + { 31, 0xa438, 0X0ce1, }, + { 31, 0xa438, 0X85b3, }, + { 31, 0xa438, 0X3904, }, + { 31, 0xa438, 0Xac2f, }, + { 31, 0xa438, 0X04ee, }, + { 31, 0xa438, 0X85b3, }, + { 31, 0xa438, 0X00af, }, + { 31, 0xa438, 0X39d9, }, + { 31, 0xa438, 0X22ac, }, + { 31, 0xa438, 0Xeaf0, }, + { 31, 0xa438, 0Xacf6, }, + { 31, 0xa438, 0Xf0ac, }, + { 31, 0xa438, 0Xfaf0, }, + { 31, 0xa438, 0Xacf8, }, + { 31, 0xa438, 0Xf0ac, }, + { 31, 0xa438, 0Xfcf0, }, + { 31, 0xa438, 0Xad00, }, + { 31, 0xa438, 0Xf0ac, }, + { 31, 0xa438, 0Xfef0, }, + { 31, 0xa438, 0Xacf0, }, + { 31, 0xa438, 0Xf0ac, }, + { 31, 0xa438, 0Xf4f0, }, + { 31, 0xa438, 0Xacf2, }, + { 31, 0xa438, 0Xf0ac, }, + { 31, 0xa438, 0Xb0f0, }, + { 31, 0xa438, 0Xacae, }, + { 31, 0xa438, 0Xf0ac, }, + { 31, 0xa438, 0Xacf0, }, + { 31, 0xa438, 0Xacaa, }, + { 31, 0xa438, 0Xa100, }, + { 31, 0xa438, 0X0ce1, }, + { 31, 0xa438, 0X8ff7, }, + { 31, 0xa438, 0Xbf88, }, + { 31, 0xa438, 0X8402, }, + { 31, 0xa438, 0X6e7d, }, + { 31, 0xa438, 0Xaf26, }, + { 31, 0xa438, 0Xe9e1, }, + { 31, 0xa438, 0X8ff6, }, + { 31, 0xa438, 0Xbf88, }, + { 31, 0xa438, 0X8402, }, + { 31, 0xa438, 0X6e7d, }, + { 31, 0xa438, 0Xaf26, }, + { 31, 0xa438, 0Xf520, }, + { 31, 0xa438, 0Xac86, }, + { 31, 0xa438, 0Xbf88, }, + { 31, 0xa438, 0X3f02, }, + { 31, 0xa438, 0X6e9c, }, + { 31, 0xa438, 0Xad28, }, + { 31, 0xa438, 0X03af, }, + { 31, 0xa438, 0X3324, }, + { 31, 0xa438, 0Xad38, }, + { 31, 0xa438, 0X03af, }, + { 31, 0xa438, 0X32e6, }, + { 31, 0xa438, 0Xaf32, }, + { 31, 0xa438, 0Xfb00, }, + { 31, 0xa436, 0Xb87c, }, + { 31, 0xa438, 0X8ff6, }, + { 31, 0xa436, 0Xb87e, }, + { 31, 0xa438, 0X0705, }, + { 31, 0xa436, 0Xb87c, }, + { 31, 0xa438, 0X8ff8, }, + { 31, 0xa436, 0Xb87e, }, + { 31, 0xa438, 0X19cc, }, + { 31, 0xa436, 0Xb87c, }, + { 31, 0xa438, 0X8ffa, }, + { 31, 0xa436, 0Xb87e, }, + { 31, 0xa438, 0X28e3, }, + { 31, 0xa436, 0Xb87c, }, + { 31, 0xa438, 0X8ffc, }, + { 31, 0xa436, 0Xb87e, }, + { 31, 0xa438, 0X1047, }, + { 31, 0xa436, 0Xb87c, }, + { 31, 0xa438, 0X8ffe, }, + { 31, 0xa436, 0Xb87e, }, + { 31, 0xa438, 0X0a45, }, + { 31, 0xa436, 0Xb85e, }, + { 31, 0xa438, 0X271E, }, + { 31, 0xa436, 0Xb860, }, + { 31, 0xa438, 0X3846, }, + { 31, 0xa436, 0Xb862, }, + { 31, 0xa438, 0X26E6, }, + { 31, 0xa436, 0Xb864, }, + { 31, 0xa438, 0X32E3, }, + { 31, 0xa436, 0Xb886, }, + { 31, 0xa438, 0Xffff, }, + { 31, 0xa436, 0Xb888, }, + { 31, 0xa438, 0Xffff, }, + { 31, 0xa436, 0Xb88a, }, + { 31, 0xa438, 0Xffff, }, + { 31, 0xa436, 0Xb88c, }, + { 31, 0xa438, 0Xffff, }, + { 31, 0xa436, 0Xb838, }, + { 31, 0xa438, 0X000f, }, + +}; + +static const MMD_REG Rtl8226b_uc_ramcode[] = +{ + { 31, 0xa436, 0X846e, }, + { 31, 0xa438, 0Xaf84, }, + { 31, 0xa438, 0X86af, }, + { 31, 0xa438, 0X8690, }, + { 31, 0xa438, 0Xaf86, }, + { 31, 0xa438, 0Xa4af, }, + { 31, 0xa438, 0X86a4, }, + { 31, 0xa438, 0Xaf86, }, + { 31, 0xa438, 0Xa4af, }, + { 31, 0xa438, 0X86a4, }, + { 31, 0xa438, 0Xaf86, }, + { 31, 0xa438, 0Xa4af, }, + { 31, 0xa438, 0X86a4, }, + { 31, 0xa438, 0Xee82, }, + { 31, 0xa438, 0X5f00, }, + { 31, 0xa438, 0X0284, }, + { 31, 0xa438, 0X90af, }, + { 31, 0xa438, 0X0441, }, + { 31, 0xa438, 0Xf8e0, }, + { 31, 0xa438, 0X8ff3, }, + { 31, 0xa438, 0Xa000, }, + { 31, 0xa438, 0X0502, }, + { 31, 0xa438, 0X84a4, }, + { 31, 0xa438, 0Xae06, }, + { 31, 0xa438, 0Xa001, }, + { 31, 0xa438, 0X0302, }, + { 31, 0xa438, 0X84c8, }, + { 31, 0xa438, 0Xfc04, }, + { 31, 0xa438, 0Xf8f9, }, + { 31, 0xa438, 0Xef59, }, + { 31, 0xa438, 0Xe080, }, + { 31, 0xa438, 0X15ad, }, + { 31, 0xa438, 0X2702, }, + { 31, 0xa438, 0Xae03, }, + { 31, 0xa438, 0Xaf84, }, + { 31, 0xa438, 0Xc3bf, }, + { 31, 0xa438, 0X53ca, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xc8ad, }, + { 31, 0xa438, 0X2807, }, + { 31, 0xa438, 0X0285, }, + { 31, 0xa438, 0X2cee, }, + { 31, 0xa438, 0X8ff3, }, + { 31, 0xa438, 0X01ef, }, + { 31, 0xa438, 0X95fd, }, + { 31, 0xa438, 0Xfc04, }, + { 31, 0xa438, 0Xf8f9, }, + { 31, 0xa438, 0Xfaef, }, + { 31, 0xa438, 0X69bf, }, + { 31, 0xa438, 0X53ca, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xc8ac, }, + { 31, 0xa438, 0X2822, }, + { 31, 0xa438, 0Xd480, }, + { 31, 0xa438, 0X00bf, }, + { 31, 0xa438, 0X8684, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xa9bf, }, + { 31, 0xa438, 0X8687, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xa9bf, }, + { 31, 0xa438, 0X868a, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xa9bf, }, + { 31, 0xa438, 0X868d, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xa9ee, }, + { 31, 0xa438, 0X8ff3, }, + { 31, 0xa438, 0X00af, }, + { 31, 0xa438, 0X8526, }, + { 31, 0xa438, 0Xe08f, }, + { 31, 0xa438, 0Xf4e1, }, + { 31, 0xa438, 0X8ff5, }, + { 31, 0xa438, 0Xe28f, }, + { 31, 0xa438, 0Xf6e3, }, + { 31, 0xa438, 0X8ff7, }, + { 31, 0xa438, 0X1b45, }, + { 31, 0xa438, 0Xac27, }, + { 31, 0xa438, 0X0eee, }, + { 31, 0xa438, 0X8ff4, }, + { 31, 0xa438, 0X00ee, }, + { 31, 0xa438, 0X8ff5, }, + { 31, 0xa438, 0X0002, }, + { 31, 0xa438, 0X852c, }, + { 31, 0xa438, 0Xaf85, }, + { 31, 0xa438, 0X26e0, }, + { 31, 0xa438, 0X8ff4, }, + { 31, 0xa438, 0Xe18f, }, + { 31, 0xa438, 0Xf52c, }, + { 31, 0xa438, 0X0001, }, + { 31, 0xa438, 0Xe48f, }, + { 31, 0xa438, 0Xf4e5, }, + { 31, 0xa438, 0X8ff5, }, + { 31, 0xa438, 0Xef96, }, + { 31, 0xa438, 0Xfefd, }, + { 31, 0xa438, 0Xfc04, }, + { 31, 0xa438, 0Xf8f9, }, + { 31, 0xa438, 0Xef59, }, + { 31, 0xa438, 0Xbf53, }, + { 31, 0xa438, 0X2202, }, + { 31, 0xa438, 0X52c8, }, + { 31, 0xa438, 0Xa18b, }, + { 31, 0xa438, 0X02ae, }, + { 31, 0xa438, 0X03af, }, + { 31, 0xa438, 0X85da, }, + { 31, 0xa438, 0Xbf57, }, + { 31, 0xa438, 0X7202, }, + { 31, 0xa438, 0X52c8, }, + { 31, 0xa438, 0Xe48f, }, + { 31, 0xa438, 0Xf8e5, }, + { 31, 0xa438, 0X8ff9, }, + { 31, 0xa438, 0Xbf57, }, + { 31, 0xa438, 0X7502, }, + { 31, 0xa438, 0X52c8, }, + { 31, 0xa438, 0Xe48f, }, + { 31, 0xa438, 0Xfae5, }, + { 31, 0xa438, 0X8ffb, }, + { 31, 0xa438, 0Xbf57, }, + { 31, 0xa438, 0X7802, }, + { 31, 0xa438, 0X52c8, }, + { 31, 0xa438, 0Xe48f, }, + { 31, 0xa438, 0Xfce5, }, + { 31, 0xa438, 0X8ffd, }, + { 31, 0xa438, 0Xbf57, }, + { 31, 0xa438, 0X7b02, }, + { 31, 0xa438, 0X52c8, }, + { 31, 0xa438, 0Xe48f, }, + { 31, 0xa438, 0Xfee5, }, + { 31, 0xa438, 0X8fff, }, + { 31, 0xa438, 0Xbf57, }, + { 31, 0xa438, 0X6c02, }, + { 31, 0xa438, 0X52c8, }, + { 31, 0xa438, 0Xa102, }, + { 31, 0xa438, 0X13ee, }, + { 31, 0xa438, 0X8ffc, }, + { 31, 0xa438, 0X80ee, }, + { 31, 0xa438, 0X8ffd, }, + { 31, 0xa438, 0X00ee, }, + { 31, 0xa438, 0X8ffe, }, + { 31, 0xa438, 0X80ee, }, + { 31, 0xa438, 0X8fff, }, + { 31, 0xa438, 0X00af, }, + { 31, 0xa438, 0X8599, }, + { 31, 0xa438, 0Xa101, }, + { 31, 0xa438, 0X0cbf, }, + { 31, 0xa438, 0X534c, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xc8a1, }, + { 31, 0xa438, 0X0303, }, + { 31, 0xa438, 0Xaf85, }, + { 31, 0xa438, 0X77bf, }, + { 31, 0xa438, 0X5322, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xc8a1, }, + { 31, 0xa438, 0X8b02, }, + { 31, 0xa438, 0Xae03, }, + { 31, 0xa438, 0Xaf86, }, + { 31, 0xa438, 0X64e0, }, + { 31, 0xa438, 0X8ff8, }, + { 31, 0xa438, 0Xe18f, }, + { 31, 0xa438, 0Xf9bf, }, + { 31, 0xa438, 0X8684, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xa9e0, }, + { 31, 0xa438, 0X8ffa, }, + { 31, 0xa438, 0Xe18f, }, + { 31, 0xa438, 0Xfbbf, }, + { 31, 0xa438, 0X8687, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xa9e0, }, + { 31, 0xa438, 0X8ffc, }, + { 31, 0xa438, 0Xe18f, }, + { 31, 0xa438, 0Xfdbf, }, + { 31, 0xa438, 0X868a, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xa9e0, }, + { 31, 0xa438, 0X8ffe, }, + { 31, 0xa438, 0Xe18f, }, + { 31, 0xa438, 0Xffbf, }, + { 31, 0xa438, 0X868d, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xa9af, }, + { 31, 0xa438, 0X867f, }, + { 31, 0xa438, 0Xbf53, }, + { 31, 0xa438, 0X2202, }, + { 31, 0xa438, 0X52c8, }, + { 31, 0xa438, 0Xa144, }, + { 31, 0xa438, 0X3cbf, }, + { 31, 0xa438, 0X547b, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xc8e4, }, + { 31, 0xa438, 0X8ff8, }, + { 31, 0xa438, 0Xe58f, }, + { 31, 0xa438, 0Xf9bf, }, + { 31, 0xa438, 0X547e, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xc8e4, }, + { 31, 0xa438, 0X8ffa, }, + { 31, 0xa438, 0Xe58f, }, + { 31, 0xa438, 0Xfbbf, }, + { 31, 0xa438, 0X5481, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xc8e4, }, + { 31, 0xa438, 0X8ffc, }, + { 31, 0xa438, 0Xe58f, }, + { 31, 0xa438, 0Xfdbf, }, + { 31, 0xa438, 0X5484, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xc8e4, }, + { 31, 0xa438, 0X8ffe, }, + { 31, 0xa438, 0Xe58f, }, + { 31, 0xa438, 0Xffbf, }, + { 31, 0xa438, 0X5322, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xc8a1, }, + { 31, 0xa438, 0X4448, }, + { 31, 0xa438, 0Xaf85, }, + { 31, 0xa438, 0Xa7bf, }, + { 31, 0xa438, 0X5322, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xc8a1, }, + { 31, 0xa438, 0X313c, }, + { 31, 0xa438, 0Xbf54, }, + { 31, 0xa438, 0X7b02, }, + { 31, 0xa438, 0X52c8, }, + { 31, 0xa438, 0Xe48f, }, + { 31, 0xa438, 0Xf8e5, }, + { 31, 0xa438, 0X8ff9, }, + { 31, 0xa438, 0Xbf54, }, + { 31, 0xa438, 0X7e02, }, + { 31, 0xa438, 0X52c8, }, + { 31, 0xa438, 0Xe48f, }, + { 31, 0xa438, 0Xfae5, }, + { 31, 0xa438, 0X8ffb, }, + { 31, 0xa438, 0Xbf54, }, + { 31, 0xa438, 0X8102, }, + { 31, 0xa438, 0X52c8, }, + { 31, 0xa438, 0Xe48f, }, + { 31, 0xa438, 0Xfce5, }, + { 31, 0xa438, 0X8ffd, }, + { 31, 0xa438, 0Xbf54, }, + { 31, 0xa438, 0X8402, }, + { 31, 0xa438, 0X52c8, }, + { 31, 0xa438, 0Xe48f, }, + { 31, 0xa438, 0Xfee5, }, + { 31, 0xa438, 0X8fff, }, + { 31, 0xa438, 0Xbf53, }, + { 31, 0xa438, 0X2202, }, + { 31, 0xa438, 0X52c8, }, + { 31, 0xa438, 0Xa131, }, + { 31, 0xa438, 0X03af, }, + { 31, 0xa438, 0X85a7, }, + { 31, 0xa438, 0Xd480, }, + { 31, 0xa438, 0X00bf, }, + { 31, 0xa438, 0X8684, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xa9bf, }, + { 31, 0xa438, 0X8687, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xa9bf, }, + { 31, 0xa438, 0X868a, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xa9bf, }, + { 31, 0xa438, 0X868d, }, + { 31, 0xa438, 0X0252, }, + { 31, 0xa438, 0Xa9ef, }, + { 31, 0xa438, 0X95fd, }, + { 31, 0xa438, 0Xfc04, }, + { 31, 0xa438, 0Xf0d1, }, + { 31, 0xa438, 0X2af0, }, + { 31, 0xa438, 0Xd12c, }, + { 31, 0xa438, 0Xf0d1, }, + { 31, 0xa438, 0X44f0, }, + { 31, 0xa438, 0Xd146, }, + { 31, 0xa438, 0Xbf86, }, + { 31, 0xa438, 0Xa102, }, + { 31, 0xa438, 0X52c8, }, + { 31, 0xa438, 0Xbf86, }, + { 31, 0xa438, 0Xa102, }, + { 31, 0xa438, 0X52c8, }, + { 31, 0xa438, 0Xd101, }, + { 31, 0xa438, 0Xaf06, }, + { 31, 0xa438, 0Xa570, }, + { 31, 0xa438, 0Xce42, }, + { 31, 0xa436, 0Xb818, }, + { 31, 0xa438, 0X043d, }, + { 31, 0xa436, 0Xb81a, }, + { 31, 0xa438, 0X06a3, }, + { 31, 0xa436, 0Xb81c, }, + { 31, 0xa438, 0Xffff, }, + { 31, 0xa436, 0Xb81e, }, + { 31, 0xa438, 0Xffff, }, + { 31, 0xa436, 0Xb850, }, + { 31, 0xa438, 0Xffff, }, + { 31, 0xa436, 0Xb852, }, + { 31, 0xa438, 0Xffff, }, + { 31, 0xa436, 0Xb878, }, + { 31, 0xa438, 0Xffff, }, + { 31, 0xa436, 0Xb884, }, + { 31, 0xa438, 0Xffff, }, + { 31, 0xa436, 0Xb832, }, + { 31, 0xa438, 0X0003, }, + +}; + +static const MMD_REG Rtl8226b_data_ramcode[] = +{ + +}; + +static const MMD_REG Rtl8226b_isram_patch[] = +{ + +}; + +static BOOL +Rtl8226b_wait_for_bit( + IN HANDLE hDevice, + IN UINT16 dev, + IN UINT16 addr, + IN UINT16 mask, + IN BOOL set, + IN UINT16 timeoutms) +{ + BOOL status = FAILURE; + UINT16 phydata = 0; + + while (--timeoutms) { + status = MmdPhyRead(hDevice, MMD_VEND2, addr, &phydata); + if (!status) + goto exit; + + if (!set) + phydata = ~phydata; + + if ((phydata & mask) == mask) + return 1; + + Sleep(1); + } + + osal_printf("Timeout (dev=%02x addr=0x%02x mask=0x%02x timeout=%d)\n", + dev, addr, mask, timeoutms); + +exit: + return 0; +} + +BOOLEAN +Rtl8226b_phy_init( + IN HANDLE hDevice, + IN PHY_LINK_ABILITY *pphylinkability, + IN BOOL singlephy + ) +{ + BOOL status = FAILURE; + UINT16 i = 0; /* SW_SDK: use UINT16 instead of UINT8, for MMD_REG array may over 255 entries */ + UINT16 phydata = 0; + const UINT16 patchver = 0x0019, patchaddr = 0x8024; + + // Polling PHY Status + status = Rtl8226b_wait_for_bit(hDevice, MMD_VEND2, 0xA420, 0x3, 1, 100); + if (status != SUCCESS) + goto exit; + + // MMD 31.0xA436[15:0] = 0x801E + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA436, 0x801E); + if (status != SUCCESS) + goto exit; + + status = MmdPhyRead(hDevice, MMD_VEND2, 0xA438, &phydata); + if (status != SUCCESS) + goto exit; + + // Already patched. + if (phydata == patchver) + { + status = 1; + goto exit; + } + else + { + // Patch request & wait patch_rdy (for normal patch flow - Driver Initialize) + // MMD 31.0xB820[4] = 1'b1 //(patch request) + status = MmdPhyRead(hDevice, MMD_VEND2, 0xB820, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= BIT_4; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xB820, phydata); + if (status != SUCCESS) + goto exit; + + //wait for patch ready = 1 (MMD 31.0xB800[6]) + status = Rtl8226b_wait_for_bit(hDevice, MMD_VEND2, 0xB800, BIT_6, 1, 100); + if (status != SUCCESS) + goto exit; + + //Set patch_key & patch_lock + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA436, patchaddr); + if (status != SUCCESS) + goto exit; + + // MMD 31.0xA438[15:0] = 0x3701 + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA438, 0x3701); + if (status != SUCCESS) + goto exit; + + // MMD 31.0xA436[15:0] = 0xB82E + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA436, 0xB82E); + if (status != SUCCESS) + goto exit; + + // MMD 31.0xA438[15:0] = 0x0001 + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xA438, 0x0001); + if (status != SUCCESS) + goto exit; + + // NC & UC patch + status = MmdPhyRead(hDevice, MMD_VEND2, 0xB820, &phydata); + if (status != SUCCESS) + goto exit; + + phydata |= BIT_7; + + status = MmdPhyWrite(hDevice, MMD_VEND2, 0xB820, phydata); + if (status != SUCCESS) + goto exit; + + // patch nc0 + for(i=0; i + +/* from typedef.h and rtl8156_mmd.h */ + +#define BIT_0 0x0001 +#define BIT_1 0x0002 +#define BIT_2 0x0004 +#define BIT_3 0x0008 +#define BIT_4 0x0010 +#define BIT_5 0x0020 +#define BIT_6 0x0040 +#define BIT_7 0x0080 +#define BIT_8 0x0100 +#define BIT_9 0x0200 +#define BIT_10 0x0400 +#define BIT_11 0x0800 +#define BIT_12 0x1000 +#define BIT_13 0x2000 +#define BIT_14 0x4000 +#define BIT_15 0x8000 + +#define SUCCESS TRUE +#define FAILURE FALSE + + + +typedef struct { + struct mtk_eth *eth; + int addr; +} HANDLE; + +#define BOOLEAN bool +#define BOOL uint32 +#define UINT32 uint32 +#define UINT16 uint16 +#define UINT8 uint8 +#define Sleep(_t) osal_time_udelay(_t*1000) +#define IN +#define OUT + + +#define MMD_PMAPMD 1 +#define MMD_PCS 3 +#define MMD_AN 7 +#define MMD_VEND1 30 /* Vendor specific 2 */ +#define MMD_VEND2 31 /* Vendor specific 2 */ + + +typedef struct +{ + UINT16 dev; + UINT16 addr; + UINT16 value; +} MMD_REG; + + +#define NO_LINK 0 +#define LINK_SPEED_10M 10 +#define LINK_SPEED_100M 100 +#define LINK_SPEED_500M 500 +#define LINK_SPEED_1G 1000 +#define LINK_SPEED_2P5G 2500 + +typedef enum +{ + PHY_CROSSPVER_MODE_AUTO = 0, + PHY_CROSSPVER_MODE_MDI, + PHY_CROSSPVER_MODE_MDIX, + PHY_CROSSPVER_MODE_END +} PHY_CROSSPVER_MODE; + +typedef enum +{ + PHY_CROSSPVER_STATUS_MDI = 0, + PHY_CROSSPVER_STATUS_MDIX, + PHY_CROSSPVER_STATUS_END +} PHY_CROSSPVER_STATUS; + +typedef enum +{ + PHY_AUTO_MODE = 0, + PHY_SLAVE_MODE, + PHY_MASTER_MODE, + PHY_MASTER_SLAVE_END +} PHY_MASTERSLAVE_MODE; + +typedef struct +{ + UINT32 Half_10:1; + UINT32 Full_10:1; + + UINT32 Half_100:1; + UINT32 Full_100:1; + + UINT32 Full_1000:1; + + UINT32 adv_2_5G:1; + + UINT32 FC:1; + UINT32 AsyFC:1; +} PHY_LINK_ABILITY; + +typedef struct +{ + UINT8 EEE_100:1; + UINT8 EEE_1000:1; + UINT8 EEE_2_5G:1; +} PHY_EEE_ENABLE; + +typedef struct +{ + UINT8 TX_SWAP:1; + UINT8 RX_SWAP:1; +} PHY_SERDES_POLARITY_SWAP; + +typedef enum +{ + TESTMODE_CHANNEL_NONE = 0, + TESTMODE_CHANNEL_A, + TESTMODE_CHANNEL_B, + TESTMODE_CHANNEL_C, + TESTMODE_CHANNEL_D, + TESTMODE_CHANNEL_END +} PHY_TESTMODE_CHANNEL; + +typedef struct +{ + UINT32 TM1:1; + UINT32 TM2:1; + UINT32 TM3:1; + UINT32 TM4:1; + UINT32 TM5:1; + UINT32 TM6:1; + + UINT32 TONE1:1; + UINT32 TONE2:1; + UINT32 TONE3:1; + UINT32 TONE4:1; + UINT32 TONE5:1; + + UINT32 TMFINISH:1; + + UINT32 NORMAL:1; + UINT32 HARMONIC:1; + UINT32 LINKPLUSE:1; + + PHY_TESTMODE_CHANNEL channel:3; +} PHY_IEEE_TEST_MODE; + +typedef enum +{ + MIS_MATCH_OPEN = 1, // Mis-Match_Open, larger_than_130ohm + MIS_MATCH_SHORT = 2, // Mis-Match_short, less_than_77ohm +} PHY_RTCT_STATUS_MISMATCH; + +typedef struct +{ + BOOL Open; + BOOL Short; + PHY_RTCT_STATUS_MISMATCH Mismatch; +} PHY_RTCT_STATUS; + +typedef struct +{ + + UINT16 linkType; + + UINT32 rxLen; + UINT32 txLen; + + UINT32 channelALen; + UINT32 channelBLen; + UINT32 channelCLen; + UINT32 channelDLen; + + PHY_RTCT_STATUS channelAStatus; + PHY_RTCT_STATUS channelBStatus; + PHY_RTCT_STATUS channelCStatus; + PHY_RTCT_STATUS channelDStatus; +} PHY_RTCT_RESULT; + +typedef enum +{ + PHY_SERDES_MODE_OTHER = 0, + PHY_SERDES_MODE_SGMII, + PHY_SERDES_MODE_HiSGMII, + PHY_SERDES_MODE_2500BASEX, + PHY_SERDES_MODE_USXGMII, + PHY_SERDES_MODE_NO_SDS, + PHY_SERDES_MODE_END +} PHY_SERDES_MODE; + +typedef enum +{ + PHY_SERDES_OPTION_2500BASEX_SGMII = 0, + PHY_SERDES_OPTION_HiSGMII_SGMII, + PHY_SERDES_OPTION_2500BASEX, + PHY_SERDES_OPTION_HiSGMII, + PHY_SERDES_OPTION_OTHER, +} PHY_SERDES_OPTION; + +typedef struct +{ + UINT16 MASK15_0; + UINT16 MASK31_16; + UINT16 MASK47_32; + UINT16 MASK63_48; + UINT16 MASK79_64; + UINT16 MASK95_80; + UINT16 MASK111_96; + UINT16 MASK127_112; + UINT16 CRC; +} PHY_WAKEUP_FRAME; + +typedef struct +{ + UINT16 REG15_0; + UINT16 REG31_16; + UINT16 REG47_32; + UINT16 REG63_48; +} PHY_MULTICAST_REG; + +typedef struct +{ + UINT16 ADDR15_0; + UINT16 ADDR31_16; + UINT16 ADDR47_32; +} PHY_MAC_ADDRESS; + +typedef struct +{ + UINT32 LINKCHG:1; + UINT32 MAGIC:1; + UINT32 ARBITRARY:1; + UINT32 UNICAST:1; + UINT32 MULTICAST:1; + UINT32 BROADCAST:1; + + UINT32 FRAME0:1; + UINT32 FRAME1:1; + UINT32 FRAME2:1; + UINT32 FRAME3:1; + UINT32 FRAME4:1; + UINT32 FRAME5:1; + UINT32 FRAME6:1; + UINT32 FRAME7:1; + + UINT32 MAXPKTLENGTH; + PHY_MAC_ADDRESS macaddress; + PHY_MULTICAST_REG multicast; + + PHY_WAKEUP_FRAME wakeframe0; + +} PHY_WOL_EVENT; + +typedef struct +{ + bool Enable; + UINT16 Temperature; + UINT16 Temperature_threshold; +}PHY_THERMAL_RESULT; + + +BOOLEAN +MmdPhyRead( + IN HANDLE hDevice, + IN UINT16 dev, + IN UINT16 addr, + OUT UINT16 *data); + +BOOLEAN +MmdPhyWrite( + IN HANDLE hDevice, + IN UINT16 dev, + IN UINT16 addr, + IN UINT16 data); + + + + +#endif /* __NIC_RTL8226_TYPEDEF_H__ */ + + diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/rtl_adapter.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/rtl_adapter.c new file mode 100755 index 0000000..bd3d025 --- /dev/null +++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/rtl_adapter.c @@ -0,0 +1,42 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../mtk_eth_soc.h" +#include "rtl_adapter.h" +#include "rtl8226_typedef.h" + +bool MmdPhyWrite(HANDLE unit, uint16_t devad, uint16_t addr, uint16_t value) +{ + struct mtk_eth *eth = unit.eth; + if (eth != NULL) + { + mtk_mmd_write(eth, unit.addr, devad, addr, value); + } + return TRUE; +} + +bool MmdPhyRead(HANDLE unit, uint16_t devad, uint16_t addr, uint16_t *value) +{ + struct mtk_eth *eth = unit.eth; + if (eth != NULL) + { + int val = mtk_mmd_read(eth, unit.addr, devad, addr); + *value = (uint16_t)val; + } + return TRUE; +} \ No newline at end of file diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/rtl_adapter.h b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/rtl_adapter.h new file mode 100755 index 0000000..cfb1665 --- /dev/null +++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/rtl822x/rtl_adapter.h @@ -0,0 +1,40 @@ +#ifndef __RTL_ADAPTER_LOAD__ +#define __RTL_ADAPTER_LOAD__ + +#ifdef __KERNEL__ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + + +#define uint32 uint32_t +#define uint16 uint16_t +#define uint8 uint8_t +#ifdef __KERNEL__ +#define osal_time_udelay(aa) msleep((aa)/1000) +#define phy_osal_printf printk +#define osal_printf printk +#else +#define osal_time_udelay(aa) usleep(aa) +#define phy_osal_printf printf +#define osal_printf printf +#endif +#endif \ No newline at end of file diff --git a/target/linux/mediatek/image/mt7986.mk b/target/linux/mediatek/image/mt7986.mk index 3922833..6ffd65f 100644 --- a/target/linux/mediatek/image/mt7986.mk +++ b/target/linux/mediatek/image/mt7986.mk @@ -366,3 +366,58 @@ define Device/mediatek_mt7986-fpga-ubi IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata endef TARGET_DEVICES += mediatek_mt7986-fpga-ubi + +define Device/xiaomi_redmi-router-ax6000-uboot + DEVICE_VENDOR := Xiaomi + DEVICE_MODEL := Redmi Router AX6000 (uboot layout) + DEVICE_DTS := mt7986a-xiaomi-redmi-router-ax6000-uboot + DEVICE_DTS_DIR := $(DTS_DIR)/mediatek + DEVICE_PACKAGES :=luci-app-mtk l1profile wireless-tools kmod-conninfra kmod-warp kmod-mt_wifi ipv6helper kmod-mediatek_hnat bash autocore-arm mtkhnat_util kmod-leds-ws2812b + UBINIZE_OPTS := -E 5 + BLOCKSIZE := 128k + PAGESIZE := 2048 + KERNEL_IN_UBI := 1 + IMAGES := factory.bin sysupgrade.bin + IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE) + IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata + endef + TARGET_DEVICES += xiaomi_redmi-router-ax6000-uboot + +define Device/xiaomi_redmi-router-ax6000 + DEVICE_VENDOR := Xiaomi + DEVICE_MODEL := Redmi Router AX6000 + DEVICE_DTS := mt7986a-xiaomi-redmi-router-ax6000 + DEVICE_DTS_DIR := $(DTS_DIR)/mediatek + DEVICE_PACKAGES :=luci-app-mtk l1profile wireless-tools kmod-conninfra kmod-warp kmod-mt_wifi ipv6helper kmod-mediatek_hnat bash autocore-arm mtkhnat_util kmod-leds-ws2812b + UBINIZE_OPTS := -E 5 + BLOCKSIZE := 128k + PAGESIZE := 2048 + IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata + endef + TARGET_DEVICES += xiaomi_redmi-router-ax6000 + + define Device/tplink_tl-common + DEVICE_VENDOR := TP-Link + DEVICE_DTS_DIR := $(DTS_DIR)/mediatek + UBINIZE_OPTS := -E 5 + BLOCKSIZE := 128k + PAGESIZE := 2048 + KERNEL_IN_UBI := 1 + IMAGES := factory.bin sysupgrade.bin + IMAGE/factory.bin := append-ubi | check-size $$$$(IMAGE_SIZE) + IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata +endef + +define Device/tplink_tl-xdr6086 + DEVICE_MODEL := TL-XDR6086 + DEVICE_DTS := mt7986a-tl-xdr6086 + $(call Device/tplink_tl-common) +endef +TARGET_DEVICES += tplink_tl-xdr6086 + +define Device/tplink_tl-xdr6088 + DEVICE_MODEL := TL-XDR6088 + DEVICE_DTS := mt7986a-tl-xdr6088 + $(call Device/tplink_tl-common) +endef +TARGET_DEVICES += tplink_tl-xdr6088 diff --git a/target/linux/mediatek/mt7981/base-files/etc/board.d/02_network b/target/linux/mediatek/mt7981/base-files/etc/board.d/02_network index 5040c12..4a7056b 100755 --- a/target/linux/mediatek/mt7981/base-files/etc/board.d/02_network +++ b/target/linux/mediatek/mt7981/base-files/etc/board.d/02_network @@ -58,7 +58,7 @@ mediatek_setup_interfaces() *jcg,q30*) ucidef_set_interfaces_lan_wan "eth0.1" "eth0.2" ucidef_add_switch "switch0" \ - "1:lan" "2:lan" "3:lan" "0:wan" "6t@eth0" + "1:lan" "2:lan" "3:lan" "0:wan" "6t@eth0" ;; *) ucidef_set_interfaces_lan_wan "eth0" "eth1" diff --git a/target/linux/mediatek/mt7981/config-5.4 b/target/linux/mediatek/mt7981/config-5.4 index d79d4ff..0c191fc 100644 --- a/target/linux/mediatek/mt7981/config-5.4 +++ b/target/linux/mediatek/mt7981/config-5.4 @@ -458,6 +458,7 @@ CONFIG_USB_XHCI_HCD=y CONFIG_USB_XHCI_MTK=y CONFIG_USB_XHCI_MTK_DEBUGFS=y # CONFIG_USB_XHCI_PLATFORM is not set +CONFIG_NET_MEDIATEK_EXT_PHY_RTL822X=y CONFIG_VMAP_STACK=y CONFIG_WATCHDOG_CORE=y CONFIG_WATCHDOG_PRETIMEOUT_DEFAULT_GOV_PANIC=y diff --git a/target/linux/mediatek/mt7986/base-files/etc/board.d/01_leds b/target/linux/mediatek/mt7986/base-files/etc/board.d/01_leds new file mode 100755 index 0000000..6c52654 --- /dev/null +++ b/target/linux/mediatek/mt7986/base-files/etc/board.d/01_leds @@ -0,0 +1,21 @@ +#!/bin/sh + +. /lib/functions.sh +. /lib/functions/leds.sh +. /lib/functions/uci-defaults.sh + +board=$(board_name) + +board_config_update + +case $board in +xiaomi,redmi-router-ax6000|\ + xiaomi,redmi-router-ax6000-uboot) + ucidef_set_led_default "status" "status" "rgb:status" "1" + ucidef_set_led_netdev "wan" "wan" "rgb:network" "eth1" + ;; +esac + +board_config_flush + +exit 0 diff --git a/target/linux/mediatek/mt7986/base-files/etc/board.d/02_network b/target/linux/mediatek/mt7986/base-files/etc/board.d/02_network index 0b61e50..c9e51ba 100755 --- a/target/linux/mediatek/mt7986/base-files/etc/board.d/02_network +++ b/target/linux/mediatek/mt7986/base-files/etc/board.d/02_network @@ -19,12 +19,59 @@ mediatek_setup_interfaces() ucidef_add_switch "switch0" \ "0:lan" "1:lan" "2:lan" "3:lan" "4:lan" "5:lan" "6u@eth0" ;; - *) - ucidef_set_interfaces_lan_wan "lan0 lan1 lan2 lan3 lan4 lan5" eth1 + xiaomi,redmi-router-ax6000|\ + xiaomi,redmi-router-ax6000-uboot) + ucidef_set_interfaces_lan_wan "eth0 ra0 rai0 ra1 rai1" "eth1" + ucidef_add_switch "switch0" \ + "1:lan:4" "2:lan:3" "3:lan:2" "4:wan" "6u@eth0" "5u@eth1" + ;; + *) + ucidef_set_interfaces_lan_wan "ra0 rai0 eth0" "eth1" + ucidef_add_switch "switch0" \ + "0:lan" "1:lan" "2:lan" "3:lan" "4:lan" "5:lan" "6u@eth0" ;; esac } +mtk_facrory_write_mac() +{ + local part_name=$1 + local offset=$2 + local macaddr=$3 #aa:bb:cc:dd:ee:ff + local data="" + + part=$(find_mtd_part $part_name) + if [ -n "$part" ] && [ -n "$macaddr" ]; then + local i=1 + for x in ${macaddr//:/ }; do + [ $i -gt 6 ] && break + data=${data}"\x${x}" + i=$((i+1)) + done + dd if=$part of=/tmp/Factory.backup + printf "${data}" | dd conv=notrunc of=/tmp/Factory.backup bs=1 seek=$((${offset})) + mtd write /tmp/Factory.backup $part_name + rm -rf /tmp/Factory.backup + fi +} + +mtk_factory_get_byte() +{ + local part_name=$1 + local offset=$2 + local len=$3 + + part=$(find_mtd_part $part_name) + if [ -n "$part" ]; then + hexdump -n $len -s $offset -e ''`expr ${len} - 1`'/1 "%02x-" "%02x"' $part + fi +} + +mtk_factory_read() +{ +dd if=/dev/mmcblk0p3 of=/lib/firmware/MT7986_ePAeLNA_EEPROM_AX6000.bin +} + mediatek_setup_macs() { local board="$1" @@ -41,8 +88,23 @@ mediatek_setup_macs() ;; esac - lan_mac=$(mtd_get_mac_binary $part_name $lan_mac_offset) + wan_mac=$(mtd_get_mac_binary $part_name $wan_mac_offset) + + case $board in + tplink,tl-xdr6086|\ + tplink,tl-xdr6088) + wan_mac=$(mtd_get_mac_binary config 0x1c) + lan_mac=$(macaddr_add "$wan_mac" 1) + if [ "$(mtk_factory_get_byte "Factory" 4 2)" = "00-0c" ]; then + local wifi_mac="$(macaddr_add $lan_mac 0x2)" + mtk_facrory_write_mac "Factory" 4 $wifi_mac + fi + ;; + *) + mtk_factory_read + ;; + esac case "$lan_mac" in 00:00:00:00:00:00);; diff --git a/target/linux/mediatek/mt7986/base-files/etc/init.d/bootcount b/target/linux/mediatek/mt7986/base-files/etc/init.d/bootcount new file mode 100755 index 0000000..d22f170 --- /dev/null +++ b/target/linux/mediatek/mt7986/base-files/etc/init.d/bootcount @@ -0,0 +1,17 @@ +#!/bin/sh /etc/rc.common + +START=99 + +boot() { + mv /etc/wireless/mediatek/wifi.lua /usr/lib/lua/gl/ + mv /etc/wireless/mediatek/gl_eqos /usr/bin + iwpriv rax0 set AutoChannelSel=3 + sleep 5 + iwpriv rax0 set Channel=44 + sleep 5 + iwpriv ra0 set AutoChannelSel=3 + sleep 5 + iwpriv ra0 set Channel=6 + iwpirv rax0 set SiteSurvey=1 + iwpirv ra0 set SiteSurvey=1 +} diff --git a/target/linux/mediatek/mt7986/config-5.4 b/target/linux/mediatek/mt7986/config-5.4 index a6664da..571a627 100644 --- a/target/linux/mediatek/mt7986/config-5.4 +++ b/target/linux/mediatek/mt7986/config-5.4 @@ -178,6 +178,7 @@ CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y CONFIG_CRYPTO_TEST=m +CONFIG_LEDS_CLASS_MULTICOLOR=y CONFIG_DCACHE_WORD_ACCESS=y CONFIG_DEBUG_MISC=y CONFIG_DEVTMPFS=y @@ -384,6 +385,7 @@ CONFIG_OF_NET=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_PADATA=y CONFIG_PARTITION_PERCPU=y +CONFIG_PARTITION_SPLIT=y CONFIG_PCI=y # CONFIG_PCIE_MEDIATEK is not set CONFIG_PCIE_MEDIATEK_GEN3=y @@ -515,6 +517,7 @@ CONFIG_USB_UAS=y CONFIG_USB_XHCI_HCD=y CONFIG_USB_XHCI_MTK=y CONFIG_USB_XHCI_MTK_DEBUGFS=y +CONFIG_NET_MEDIATEK_EXT_PHY_RTL822X=y # CONFIG_USB_XHCI_PLATFORM is not set CONFIG_VMAP_STACK=y CONFIG_WATCHDOG_CORE=y @@ -531,6 +534,7 @@ CONFIG_XPS=y CONFIG_ZLIB_DEFLATE=y CONFIG_ZLIB_INFLATE=y CONFIG_ZONE_DMA32=y +# CONFIG_SHORTCUT_FE is not set # CONFIG_BPF_KPROBE_OVERRIDE is not set # CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set # CONFIG_PREEMPTIRQ_DELAY_TEST is not set diff --git a/target/linux/mediatek/patches-5.4/751-m7531-ext-irq.patch b/target/linux/mediatek/patches-5.4/751-m7531-ext-irq.patch new file mode 100644 index 0000000..8184219 --- /dev/null +++ b/target/linux/mediatek/patches-5.4/751-m7531-ext-irq.patch @@ -0,0 +1,272 @@ +--- a/drivers/net/phy/mtk/mt753x/mt753x_common.c 2023-03-07 00:22:57.479706000 +0800 ++++ b/drivers/net/phy/mtk/mt753x/mt753x_common.c 2023-03-07 10:46:18.601420368 +0800 +@@ -6,10 +6,23 @@ + + #include + #include +- ++#include ++#include ++#include ++#include + #include "mt753x.h" + #include "mt753x_regs.h" ++ ++ ++static struct proc_dir_entry *proc_dir = NULL; ++static struct proc_dir_entry *proc_link_dir = NULL; ++#define MT753X_GSW_DIR "mtk_gsw" ++#define MT753X_GSW_LINK_ENTRY "link_time_stamp" ++__kernel_time_t link_sec[MT753X_NUM_PORTS]; ++__kernel_time_t ext_link = 0; + ++int mtk_soc_mmd_read(int phyad, int devad, int regad); ++void mtk_soc_mmd_write(int phyad, int devad, int regad, int val); + void mt753x_irq_enable(struct gsw_mt753x *gsw) + { + u32 val; +@@ -31,7 +44,7 @@ + { + u32 pmsr, speed_bits; + const char *speed; +- ++ struct timespec64 tp; + pmsr = mt753x_reg_read(gsw, PMSR(port)); + + speed_bits = (pmsr & MAC_SPD_STS_M) >> MAC_SPD_STS_S; +@@ -53,9 +66,17 @@ + + if (pmsr & MAC_LNK_STS) { + dev_info(gsw->dev, "Port %d Link is Up - %s/%s\n", +- port, speed, (pmsr & MAC_DPX_STS) ? "Full" : "Half"); ++ port, speed, (pmsr & MAC_DPX_STS) ? "Full" : "Half"); ++ ktime_get_boottime_ts64(&tp); ++ if (port < MT753X_NUM_PORTS) ++ { ++ link_sec[port] = tp.tv_sec + (tp.tv_nsec ? 1 : 0); ++ } + } else { +- dev_info(gsw->dev, "Port %d Link is Down\n", port); ++ if (port < MT753X_NUM_PORTS) ++ { ++ link_sec[port] = 0; ++ } + } + } + +@@ -88,3 +109,75 @@ + + enable_irq(gsw->irq); + } ++ ++void mt753x_ext_phy_irq_worker(struct work_struct *work) ++{ ++ struct gsw_mt753x *gsw; ++ int val = 0; ++ struct timespec64 tp; ++ gsw = container_of(work, struct gsw_mt753x, ext_irq_worker); ++ mtk_soc_mmd_read(7, 31, 0xA4D4); ++ val = mtk_soc_mmd_read(7, 31, 0xA434); ++ if (val & 0x4) ++ { ++ dev_info(gsw->dev, "Port %d Link is Up\n", 5); ++ ktime_get_boottime_ts64(&tp); ++ ext_link = tp.tv_sec + (tp.tv_nsec ? 1 : 0); ++ } ++ else ++ { ++ dev_info(gsw->dev, "Port %d Link is Down\n", 5); ++ ext_link = 0; ++ } ++ enable_irq(gsw->ext_phy_irq); ++} ++ ++static int link_time_stamp_read(struct seq_file *seq, void *v) ++{ ++ int i = 0; ++ for (i = 0; i < MT753X_NUM_PORTS; i++) ++ { ++ if (i != 5) ++ { ++ seq_printf(seq, "%ld ", link_sec[i]); ++ } ++ else ++ { ++ seq_printf(seq, "%ld ", ext_link); ++ } ++ } ++ return 0; ++} ++ ++static int link_time_stamp_open(struct inode *inode, struct file *file) ++{ ++ return single_open(file, link_time_stamp_read, 0); ++} ++ ++static const struct file_operations mt753x_link_stamp_fops = { ++ .owner = THIS_MODULE, ++ .open = link_time_stamp_open, ++ .read = seq_read, ++ .llseek = seq_lseek, ++ .release = single_release}; ++ ++int mt753x_debug_proc_init(void) ++{ ++ ++ if (!proc_dir) ++ proc_dir = proc_mkdir(MT753X_GSW_DIR, NULL); ++ ++ proc_link_dir = ++ proc_create(MT753X_GSW_LINK_ENTRY, 0, proc_dir, &mt753x_link_stamp_fops); ++ ++ if (!proc_link_dir) ++ printk("!! FAIL to create %s PROC !!\n", MT753X_GSW_LINK_ENTRY); ++ ++ return 0; ++} ++ ++void mt753x_debug_proc_exit(void) ++{ ++ if (proc_dir) ++ remove_proc_entry(MT753X_GSW_DIR, proc_dir); ++} + +--- a/drivers/net/phy/mtk/mt753x/mt753x.h 2023-03-07 03:27:42.925587000 +0800 ++++ b/drivers/net/phy/mtk/mt753x/mt753x.h 2023-03-07 10:27:40.846233008 +0800 +@@ -81,9 +81,10 @@ + int phy_link_sts; + + int irq; ++ int ext_phy_irq; + int reset_pin; + struct work_struct irq_worker; +- ++ struct work_struct ext_irq_worker; + #ifdef CONFIG_SWCONFIG + struct switch_dev swdev; + u32 cpu_port; +@@ -142,13 +143,14 @@ + + void mt753x_irq_worker(struct work_struct *work); + void mt753x_irq_enable(struct gsw_mt753x *gsw); +- ++void mt753x_ext_phy_irq_worker(struct work_struct *work); + int mt753x_phy_calibration(struct gsw_mt753x *gsw, u8 phyaddr); + int extphy_init(struct gsw_mt753x *gsw, int addr); + + int mt753x_phy_calibration(struct gsw_mt753x *gsw, u8 phyaddr); + int extphy_init(struct gsw_mt753x *gsw, int addr); +- ++int mt753x_debug_proc_init(void); ++void mt753x_debug_proc_exit(void); + /* MDIO Indirect Access Registers */ + #define MII_MMD_ACC_CTL_REG 0x0d + #define MMD_CMD_S 14 + +--- a/drivers/net/phy/mtk/mt753x/mt753x_mdio.c 2023-03-07 00:22:57.479706000 +0800 ++++ b/drivers/net/phy/mtk/mt753x/mt753x_mdio.c 2023-03-07 10:51:15.679805023 +0800 +@@ -29,7 +29,8 @@ + static u32 mt753x_id; + struct list_head mt753x_devs; + static DEFINE_MUTEX(mt753x_devs_lock); +- ++int mtk_soc_mmd_read(int phyad, int devad, int regad); ++void mtk_soc_mmd_write(int phyad, int devad, int regad, int val); + static struct mt753x_sw_id *mt753x_sw_ids[] = { + &mt7530_id, + &mt7531_id, +@@ -691,6 +692,17 @@ + return IRQ_HANDLED; + } + ++static irqreturn_t mt753x_ext_phy_irq_handler(int irq, void *dev) ++{ ++ struct gsw_mt753x *gsw = dev; ++ ++ disable_irq_nosync(gsw->ext_phy_irq); ++ ++ schedule_work(&gsw->ext_irq_worker); ++ ++ return IRQ_HANDLED; ++} ++ + static int mt753x_probe(struct platform_device *pdev) + { + struct gsw_mt753x *gsw; +@@ -777,7 +789,35 @@ + + INIT_WORK(&gsw->irq_worker, mt753x_irq_worker); + } +- ++#if defined(CONFIG_NET_MEDIATEK_EXT_PHY_RTL822X) ++ if (mtk_soc_mmd_read(7, 1, 2) == 0x1C && (mtk_soc_mmd_read(7, 1, 3) & 0xFF00) == 0xC800) ++ { ++ mtk_soc_mmd_write(7, 31, 0xA4D2, 0); ++ mtk_soc_mmd_write(7, 31, 0xE402, 0); ++ mtk_soc_mmd_read(7, 31, 0xA4D4); ++ mtk_soc_mmd_read(7, 31, 0xE404); ++ ++ dev_info(gsw->dev, "PHY is Realtek 822x, attach its IRQ\n"); ++ gsw->ext_phy_irq = platform_get_irq(pdev, 1); ++ if (gsw->ext_phy_irq >= 0) ++ { ++ ret = devm_request_irq(gsw->dev, gsw->ext_phy_irq, mt753x_ext_phy_irq_handler, ++ 0, "rtl822x_irq", gsw); ++ if (ret) ++ { ++ dev_err(gsw->dev, "Failed to request ext_phy_irq %d\n", ++ gsw->ext_phy_irq); ++ goto fail; ++ } ++ else ++ { ++ dev_info(gsw->dev, "IRQ %d attached!\n", gsw->ext_phy_irq); ++ } ++ ++ INIT_WORK(&gsw->ext_irq_worker, mt753x_ext_phy_irq_worker); ++ } ++ } ++#endif + platform_set_drvdata(pdev, gsw); + + gsw->phy_status_poll = +@@ -789,7 +829,7 @@ + #endif + + mt753x_nl_init(); +- ++ mt753x_debug_proc_init(); + mt753x_swconfig_init(gsw); + + if (sw->post_init) +@@ -797,7 +837,10 @@ + + if (gsw->irq >= 0) + mt753x_irq_enable(gsw); +- ++ #if defined(CONFIG_NET_MEDIATEK_EXT_PHY_RTL822X) ++ if (gsw->ext_phy_irq >= 0) ++ mtk_soc_mmd_write(7, 31, 0xA4D2, 0x30); ++ #endif + return 0; + + fail: +@@ -812,7 +855,8 @@ + + if (gsw->irq >= 0) + cancel_work_sync(&gsw->irq_worker); +- ++ if (gsw->ext_phy_irq >= 0) ++ cancel_work_sync(&gsw->ext_irq_worker); + if (gsw->reset_pin >= 0) + devm_gpio_free(&pdev->dev, gsw->reset_pin); + +@@ -827,7 +871,7 @@ + #endif + + mt753x_nl_exit(); +- ++ mt753x_debug_proc_exit(); + mt753x_remove_gsw(gsw); + + platform_set_drvdata(pdev, NULL); diff --git a/target/linux/mediatek/patches-5.4/930-spi-mt65xx-enable-sel-clk.patch b/target/linux/mediatek/patches-5.4/930-spi-mt65xx-enable-sel-clk.patch new file mode 100644 index 0000000..9829965 --- /dev/null +++ b/target/linux/mediatek/patches-5.4/930-spi-mt65xx-enable-sel-clk.patch @@ -0,0 +1,15 @@ +--- a/drivers/spi/spi-mt65xx.c ++++ b/drivers/spi/spi-mt65xx.c +@@ -1156,6 +1156,12 @@ static int mtk_spi_probe(struct platform + goto err_put_master; + } + ++ ret = clk_prepare_enable(mdata->sel_clk); ++ if (ret < 0) { ++ dev_err(&pdev->dev, "failed to enable sel_clk (%d)\n", ret); ++ goto err_put_master; ++ } ++ + ret = clk_set_parent(mdata->sel_clk, mdata->parent_clk); + if (ret < 0) { + dev_err(&pdev->dev, "failed to clk_set_parent (%d)\n", ret);