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 93ce00f..0000000 Binary files a/package/connectivity/conninfra/src/conninfra.o and /dev/null differ 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);