ltq-vdsl-app: rename to ltq-vdsl-vr9-app
authorAndre Heider <a.heider@gmail.com>
Tue, 23 Aug 2022 13:18:49 +0000 (15:18 +0200)
committerHauke Mehrtens <hauke@hauke-m.de>
Sat, 17 Sep 2022 15:39:23 +0000 (17:39 +0200)
This matches the scheme used by other target packages and will avoid
confusion with any future version.

Signed-off-by: Andre Heider <a.heider@gmail.com>
26 files changed:
package/kernel/lantiq/ltq-vdsl-vr9-mei/Makefile
package/network/config/ltq-adsl-app/Makefile
package/network/config/ltq-adsl-app/patches/100-add-more-script-notifications.patch
package/network/config/ltq-vdsl-app/Makefile [deleted file]
package/network/config/ltq-vdsl-app/files/10_atm.sh [deleted file]
package/network/config/ltq-vdsl-app/files/10_ptm.sh [deleted file]
package/network/config/ltq-vdsl-app/files/dsl_control [deleted file]
package/network/config/ltq-vdsl-app/files/dsl_cpe_pipe.sh [deleted file]
package/network/config/ltq-vdsl-app/patches/100-compat.patch [deleted file]
package/network/config/ltq-vdsl-app/patches/101-musl.patch [deleted file]
package/network/config/ltq-vdsl-app/patches/200-autoboot.patch [deleted file]
package/network/config/ltq-vdsl-app/patches/201-sigterm.patch [deleted file]
package/network/config/ltq-vdsl-app/patches/300-ubus.patch [deleted file]
package/network/config/ltq-vdsl-app/src/src/dsl_cpe_ubus.c [deleted file]
package/network/config/ltq-vdsl-vr9-app/Makefile [new file with mode: 0644]
package/network/config/ltq-vdsl-vr9-app/files/10_atm.sh [new file with mode: 0755]
package/network/config/ltq-vdsl-vr9-app/files/10_ptm.sh [new file with mode: 0755]
package/network/config/ltq-vdsl-vr9-app/files/dsl_control [new file with mode: 0644]
package/network/config/ltq-vdsl-vr9-app/files/dsl_cpe_pipe.sh [new file with mode: 0755]
package/network/config/ltq-vdsl-vr9-app/patches/100-compat.patch [new file with mode: 0644]
package/network/config/ltq-vdsl-vr9-app/patches/101-musl.patch [new file with mode: 0644]
package/network/config/ltq-vdsl-vr9-app/patches/200-autoboot.patch [new file with mode: 0644]
package/network/config/ltq-vdsl-vr9-app/patches/201-sigterm.patch [new file with mode: 0644]
package/network/config/ltq-vdsl-vr9-app/patches/300-ubus.patch [new file with mode: 0644]
package/network/config/ltq-vdsl-vr9-app/src/src/dsl_cpe_ubus.c [new file with mode: 0644]
target/linux/lantiq/xrx200/target.mk

index 040c02f899cea057f9c779cf031835b8d43e2abb..e9c5a681fd0098a32e95ddaf0207fa848ca13f3d 100644 (file)
@@ -56,10 +56,10 @@ MAKE_FLAGS += \
        $(KERNEL_MAKE_FLAGS) \
        SHELL="$(BASH)"
 
        $(KERNEL_MAKE_FLAGS) \
        SHELL="$(BASH)"
 
-# ltq-vdsl-app uses a header provided by the MEI driver which has some
+# ltq-vdsl-vr9-app uses a header provided by the MEI driver which has some
 # conditionals.
 # Define the conditionals here to have the same view on both sides. If you
 # conditionals.
 # Define the conditionals here to have the same view on both sides. If you
-# change them, you need to change them for the ltq-vdsl-app as well
+# change them, you need to change them for the ltq-vdsl-vr9-app as well
 MEI_DRV_CFLAGS = \
        -DMEI_DRV_ATM_PTM_INTERFACE_ENABLE=1 \
        -DMEI_SUPPORT_DEBUG_STREAMS=1 \
 MEI_DRV_CFLAGS = \
        -DMEI_DRV_ATM_PTM_INTERFACE_ENABLE=1 \
        -DMEI_SUPPORT_DEBUG_STREAMS=1 \
index 2e4792266c19d91977b740d232ba5ef4636e0f0d..3bc247dfb00291f27b7f128b4aed34b8f5c4f26b 100644 (file)
@@ -77,7 +77,7 @@ TARGET_CFLAGS += -I$(LINUX_DIR)/include
 
 define Build/Prepare
        $(call Build/Prepare/Default)
 
 define Build/Prepare
        $(call Build/Prepare/Default)
-       $(CP) ../ltq-vdsl-app/src/src/dsl_cpe_ubus.c $(PKG_BUILD_DIR)/src/
+       $(CP) ../ltq-vdsl-vr9-app/src/src/dsl_cpe_ubus.c $(PKG_BUILD_DIR)/src/
 endef
 
 define Package/ltq-adsl-app/install
 endef
 
 define Package/ltq-adsl-app/install
index 9d611c1caff58142d4e6d10358a59c72dcf60fc4..875b7ecbf573622dc861ccfedef865184275514d 100644 (file)
@@ -3,7 +3,7 @@ From: Mathias Kresin <dev@kresin.me>
 Date: Mon, 16 Oct 2017 21:08:26 +0200
 Subject: ltq-adsl-app: add more script notifications
 
 Date: Mon, 16 Oct 2017 21:08:26 +0200
 Subject: ltq-adsl-app: add more script notifications
 
-Backport HANDSHAKE and TRAINING notification from ltq-vdsl-app. It
+Backport HANDSHAKE and TRAINING notification from ltq-vdsl-vr9-app. It
 unifies the dsl led blinking pattern accross all subtargets and allows
 to get the current line status from the dsl led.
 
 unifies the dsl led blinking pattern accross all subtargets and allows
 to get the current line status from the dsl led.
 
diff --git a/package/network/config/ltq-vdsl-app/Makefile b/package/network/config/ltq-vdsl-app/Makefile
deleted file mode 100644 (file)
index 8baf1e8..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-# Copyright (C) 2010 OpenWrt.org
-# Copyright (C) 2015-2016 Lantiq Beteiligungs GmbH & Co KG.
-#
-# 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:=ltq-vdsl-app
-PKG_VERSION:=4.17.18.6
-PKG_RELEASE:=$(AUTORELEASE)
-PKG_BASE_NAME:=dsl_cpe_control
-PKG_SOURCE:=$(PKG_BASE_NAME)_vrx-$(PKG_VERSION).tar.gz
-PKG_SOURCE_URL:=@OPENWRT
-PKG_HASH:=da8bb929526a61aea0e153ef524331fcd472a1ebbc6d88ca017735a4f82ece02
-PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_BASE_NAME)-$(PKG_VERSION)
-PKG_LICENSE:=BSD-2-Clause
-
-PKG_BUILD_DEPENDS:=ltq-vdsl-vr9
-
-PKG_FLAGS:=nonshared
-PKG_FIXUP:=autoreconf
-
-include $(INCLUDE_DIR)/package.mk
-
-define Package/ltq-vdsl-app
-  SECTION:=net
-  CATEGORY:=Network
-  TITLE:=Lantiq VDSL userland tool
-  URL:=http://www.lantiq.com/
-  DEPENDS:=@TARGET_lantiq_xrx200 +libpthread +librt +ltq-dsl-base +libubox +libubus
-endef
-
-define Package/ltq-vdsl-app/description
-  Userland tool needed to control Lantiq VDSL CPE
-endef
-
-# ltq-vdsl-app uses a header provided by the MEI driver which has some
-# conditionals.
-#
-# Define them here with the default values they would get in the MEI driver,
-# have the same view on both sides.
-#
-# If you change them, you need to change them for the ltq-vdsl-app as well
-VDSL_APP_CFLAGS = \
-       -DMAX_CLI_PIPES=1 \
-       -DMEI_SUPPORT_DEBUG_STREAMS=1 \
-       -DMEI_SUPPORT_OPTIMIZED_FW_DL=1
-
-CONFIGURE_ARGS += \
-       --enable-vrx \
-       --enable-vrx-device=vr9 \
-       --enable-driver-include="-I$(STAGING_DIR)/usr/include/drv_vdsl_cpe_api" \
-       --enable-device-driver-include="-I$(STAGING_DIR)/usr/include/vdsl/" \
-       --enable-ifxos \
-       --enable-ifxos-include="-I$(STAGING_DIR)/usr/include/ifxos" \
-       --enable-ifxos-library="-I$(STAGING_DIR)/usr/lib" \
-       --enable-add-appl-cflags="$(VDSL_APP_CFLAGS)"  \
-       --enable-debug \
-       --disable-dti \
-       --with-channels-per-line="1"
-
-CONFIGURE_ARGS += \
-       --enable-model=full \
-       --enable-dsl-ceoc=no
-#CONFIGURE_ARGS += --enable-model=lite
-#CONFIGURE_ARGS += --enable-model=footprint
-#CONFIGURE_ARGS += --enable-model=typical
-#CONFIGURE_ARGS += --enable-model=debug
-
-define Package/ltq-vdsl-app/install
-       $(INSTALL_DIR) $(1)/etc/init.d $(1)/sbin $(1)/etc/hotplug.d/dsl
-       $(INSTALL_BIN) ./files/dsl_control $(1)/etc/init.d/
-       $(INSTALL_BIN) ./files/10_atm.sh $(1)/etc/hotplug.d/dsl
-       $(INSTALL_BIN) ./files/10_ptm.sh $(1)/etc/hotplug.d/dsl
-
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/dsl_cpe_control $(1)/sbin/vdsl_cpe_control
-       $(INSTALL_BIN) ./files/dsl_cpe_pipe.sh $(1)/sbin/
-endef
-
-$(eval $(call BuildPackage,ltq-vdsl-app))
diff --git a/package/network/config/ltq-vdsl-app/files/10_atm.sh b/package/network/config/ltq-vdsl-app/files/10_atm.sh
deleted file mode 100755 (executable)
index e104a14..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-
-[ "$DSL_NOTIFICATION_TYPE" = "DSL_STATUS" ] && \
-[ "$DSL_TC_LAYER_STATUS" = "ATM" ] && \
-! grep -q "ltq_atm_vr9" /proc/modules || exit 0
-
-logger -p daemon.notice -t "dsl-notify" "Switching to TC-Layer ATM"
-
-if grep -q "ltq_ptm_vr9" /proc/modules ; then
-       logger -p daemon.notice -t "dsl-notify" "Loading ATM driver while EFM/PTM driver is loaded is not possible. Reboot is needed."
-       exit
-fi
-
-modprobe ltq_atm_vr9
diff --git a/package/network/config/ltq-vdsl-app/files/10_ptm.sh b/package/network/config/ltq-vdsl-app/files/10_ptm.sh
deleted file mode 100755 (executable)
index 1c62617..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-
-[ "$DSL_NOTIFICATION_TYPE" = "DSL_STATUS" ] && \
-[ "$DSL_TC_LAYER_STATUS" = "EFM" ] && \
-! grep -q "ltq_ptm_vr9" /proc/modules || exit 0
-
-logger -p daemon.notice -t "dsl-notify" "Switching to TC-Layer EFM/PTM"
-
-if grep -q "ltq_atm_vr9" /proc/modules ; then
-       logger -p daemon.notice -t "dsl-notify" "Loading EFM/PTM driver while ATM driver is loaded is not possible. Reboot is needed."
-       exit
-fi
-
-modprobe ltq_ptm_vr9
diff --git a/package/network/config/ltq-vdsl-app/files/dsl_control b/package/network/config/ltq-vdsl-app/files/dsl_control
deleted file mode 100644 (file)
index 34642db..0000000
+++ /dev/null
@@ -1,322 +0,0 @@
-#!/bin/sh /etc/rc.common
-# Copyright (C) 2012 OpenWrt.org
-
-START=97
-USE_PROCD=1
-
-dslstat() {
-       ubus call dsl metrics
-}
-
-extra_command "dslstat" "Get DSL status information"
-
-#
-# ITU-T G.997.1 (06/2012) - Section 7.3.1.1.1 (xTU transmission system enabling (XTSE))
-# ITU-T G.997.1 Amendment 2 (04/2013) - Section 2.1 - (Vectoring mode enable (VECTORMODE_ENABLE))
-#
-# G.992.1 Annex A
-# G.992.2 Annex A
-# G.992.3 Annex A / L-US1 / L_US-2 / M
-# G.992.5 Annex A / M
-# G.993.2 Annex A/B/C
-# G.993.5 Annex A/B/C
-xtse_xdsl_a="05_01_04_00_4C_01_04_07"
-
-# G.992.1 Annex B
-# G.992.3 Annex B
-# G.992.5 Annex B
-# G.993.2 Annex A/B/C
-# G.993.5 Annex A/B/C
-xtse_xdsl_b="10_00_10_00_00_04_00_07"
-
-# G.992.1 Annex B
-# G.992.3 Annex B
-# G.992.3 Annex J
-# G.992.5 Annex B
-# G.992.5 Annex J
-# G.993.2 Annex A/B/C
-# G.993.5 Annex A/B/C
-xtse_xdsl_j="10_00_10_40_00_04_01_07"
-
-# G.992.1 Annex B
-xtse_xdsl_bdmt="10_00_00_00_00_00_00_00"
-
-# G.992.3 Annex B
-xtse_xdsl_b2="00_00_10_00_00_00_00_00"
-
-# G.992.5 Annex B
-xtse_xdsl_b2p="00_00_00_00_00_04_00_00"
-
-# ANSI T1.413
-xtse_xdsl_at1="01_00_00_00_00_00_00_00"
-
-# G.992.2 Annex A
-xtse_xdsl_alite="00_01_00_00_00_00_00_00"
-
-# G.992.1 Annex A
-xtse_xdsl_admt="04_00_00_00_00_00_00_00"
-
-# G.992.3 Annex A
-xtse_xdsl_a2="00_00_04_00_00_00_00_00"
-
-# G.992.5 Annex A
-xtse_xdsl_a2p="00_00_00_00_00_01_00_00"
-
-# G.992.3 Annex L
-xtse_xdsl_l="00_00_00_00_0C_00_00_00"
-
-# G.992.3 Annex M
-# G.992.5 Annex M
-xtse_xdsl_m="00_00_00_00_40_00_04_00"
-
-# G.992.3 Annex M
-xtse_xdsl_m2="00_00_00_00_40_00_00_00"
-
-# G.992.5 Annex M
-xtse_xdsl_m2p="00_00_00_00_00_00_04_00"
-
-#
-# ITU-T G.994.1 (06/2012) - Table 2 (Mandatory carrier sets)
-#
-
-# A43
-tone_adsl_a="0x142" # A43C + J43 + A43
-tone_vdsl_a="0x142" # A43C + J43 + A43
-
-# A43 + V43
-tone_adsl_av="0x142" # A43C + J43 + A43
-tone_vdsl_av="0x146" # A43C + J43 + A43 + V43
-
-# B43
-tone_adsl_b="0x81" # B43 + B43c
-tone_vdsl_b="0x1" # B43
-
-# B43 + V43
-tone_adsl_bv="0x81" # B43 + B43c
-tone_vdsl_bv="0x5" # B43 + V43
-
-# create DSL autoboot script. Used for SNR margin tweak and to set MAC address for vectoring error reports
-autoboot_script() {
-    echo "[WaitForConfiguration]={
-locs 0 $1
-dsmmcs $2
-}
-
-[WaitForLinkActivate]={
-}
-
-[WaitForRestart]={
-}
-
-[Common]={
-}" > /tmp/dsl.scr
-}
-
-lowlevel_cfg() {
-       echo "# VRX Low Level Configuration File
-#
-# Parameters must be separated by tabs or spaces.
-# Empty lines and comments will be ignored.
-#
-
-# nFilter
-#
-# NA     = -1
-# OFF    = 0
-# ISDN   = 1
-# POTS   = 2
-# POTS_2 = 3
-# POTS_3 = 4
-#
-#  (dec)
-    -1
-
-# nHsToneGroupMode nHsToneGroup_A       nHsToneGroup_V    nHsToneGroup_AV
-#
-# NA     = -1      NA         = -1      see               see
-# AUTO   = 0       VDSL2_B43  = 0x0001  nHsToneGroup_A    nHsToneGroup_A
-# MANUAL = 1       VDSL2_A43  = 0x0002
-#                  VDSL2_V43  = 0x0004
-#                  VDSL1_V43P = 0x0008
-#                  VDSL1_V43I = 0x0010
-#                  ADSL1_C43  = 0x0020
-#                  ADSL2_J43  = 0x0040
-#                  ADSL2_B43C = 0x0080
-#                  ADSL2_A43C = 0x0100
-#
-#  (dec)           (hex)                (hex)             (hex)
-     1             $1                  $2               0x0
-
-#   nBaseAddr     nIrqNum
-#
-#     (hex)        (dec)
-    0x1e116000      63
-
-# nUtopiaPhyAdr   nUtopiaBusWidth      nPosPhyParity
-#                 default(16b) = 0     NA   = -1
-#                 8-bit        = 1     ODD  = 0
-#                 16-bit       = 2
-#
-#
-#    (hex)            (dec)                (dec)
-      0xFF              0                    0
-
-# bNtrEnable
-#
-#  (dec)
-    0" > /tmp/lowlevel.cfg
-}
-
-get_macaddr() {
-       local name
-       config_get name $1 name
-       [ "$name" = "dsl0" ] && config_get $2 $1 macaddr
-}
-
-service_triggers() {
-       procd_add_reload_trigger network
-}
-
-start_service() {
-       local annex
-       local firmware
-       local tone
-       local tone_adsl
-       local tone_vdsl
-       local xtse
-       local xfer_mode
-       local line_mode
-       local tc_layer
-       local mode
-       local lowlevel
-       local snr
-       local macaddr
-
-       config_load network
-       config_get tone dsl tone
-       config_get annex dsl annex
-       config_get firmware dsl firmware
-       config_get xfer_mode dsl xfer_mode
-       config_get line_mode dsl line_mode
-       config_get snr dsl ds_snr_offset
-       config_foreach get_macaddr device macaddr
-
-       eval "xtse=\"\${xtse_xdsl_$annex}\""
-
-       case "${xfer_mode}" in
-       atm)
-               tc_layer="-T1:0x1:0x1_1:0x1:0x1"
-               ;;
-       ptm)
-               tc_layer="-T2:0x1:0x1_2:0x1:0x1"
-               ;;
-       esac
-
-       case "${line_mode}" in
-       adsl)
-               mode="-M1"
-
-               # mask out VDSL bits when ADSL is requested
-               xtse="${xtse%_*}_00"
-               ;;
-       vdsl)
-               mode="-M2"
-
-               # mask out ADSL bits when VDSL is requested
-               xtse="00_00_00_00_00_00_00_${xtse##*_}"
-               ;;
-       esac
-
-       local annexgpio="/sys/class/gpio/annex"
-       if [ -d "${annexgpio}a" ] && [ -d "${annexgpio}b" ]; then
-               case "${annex}" in
-                       a*|l*|m*)
-                               echo 1 > "${annexgpio}a/value"
-                               echo 0 > "${annexgpio}b/value"
-                               ;;
-                       b*|j*)
-                               echo 0 > "${annexgpio}a/value"
-                               echo 1 > "${annexgpio}b/value"
-                               ;;
-               esac
-       fi
-
-       if [ -z "${firmware}" ]; then
-               # search for the firmware provided by dsl-vrx200-firmware-xdsl-*
-               if grep -qE "system type.*: (VR9|xRX200)" /proc/cpuinfo; then
-                       case "${annex}" in
-                       a*|l*|m*)
-                               if [ -f "/lib/firmware/lantiq-vrx200-a.bin" ]; then
-                                       firmware="/lib/firmware/lantiq-vrx200-a.bin"
-                               elif [ -f "/tmp/lantiq-vrx200-a.bin" ]; then
-                                       firmware="/tmp/lantiq-vrx200-a.bin"
-                               elif [ -f "/lib/firmware/lantiq-vrx200-b.bin" ] && [ -f "/lib/firmware/lantiq-vrx200-b-to-a.bspatch" ]; then
-                                       bspatch /lib/firmware/lantiq-vrx200-b.bin \
-                                               /tmp/lantiq-vrx200-a.bin \
-                                               /lib/firmware/lantiq-vrx200-b-to-a.bspatch
-                                       firmware="/tmp/lantiq-vrx200-a.bin"
-                               else
-                                       echo "firmware for annex a not found"
-                                       return 1
-                               fi
-                               ;;
-                       b*|j*)
-                               if [ -f "/lib/firmware/vr9_dsl_fw_annex_b.bin" ]; then
-                                       firmware="/lib/firmware/vr9_dsl_fw_annex_b.bin"
-                               elif [ -f "/lib/firmware/lantiq-vrx200-b.bin" ]; then
-                                       firmware="/lib/firmware/lantiq-vrx200-b.bin"
-                               elif [ -f "/tmp/lantiq-vrx200-b.bin" ]; then
-                                       firmware="/tmp/lantiq-vrx200-b.bin"
-                               elif [ -f "/lib/firmware/lantiq-vrx200-a.bin" ] && [ -f "/lib/firmware/lantiq-vrx200-a-to-b.bspatch" ]; then
-                                       bspatch /lib/firmware/lantiq-vrx200-a.bin \
-                                               /tmp/lantiq-vrx200-b.bin \
-                                               /lib/firmware/lantiq-vrx200-a-to-b.bspatch
-                                       firmware="/tmp/lantiq-vrx200-b.bin"
-                               else
-                                       echo "firmware for annex b not found"
-                                       return 1
-                               fi
-                               ;;
-                       *)
-                               echo "annex type not supported use a or b"
-                               return 1
-                               ;;
-                       esac
-               fi
-       fi
-
-       [ -z "${firmware}" ] && firmware=/lib/firmware/vdsl.bin
-       [ -f "${firmware}" ] || {
-               echo failed to find $firmware
-               return 1
-       }
-
-       eval "tone_adsl=\"\${tone_adsl_$tone}\""
-       eval "tone_vdsl=\"\${tone_vdsl_$tone}\""
-       [ -n "${tone_adsl}" ] && [ -n "${tone_vdsl}" ] && {
-               lowlevel_cfg "${tone_adsl}" "${tone_vdsl}"
-               lowlevel="-l /tmp/lowlevel.cfg"
-       }
-
-       [ -z "${snr}" ] && snr=0
-       [ -z "${macaddr}" ] && macaddr="00:00:00:00:00:00"
-       autoboot_script "$snr" "$macaddr"
-       autoboot="-a /tmp/dsl.scr -A /tmp/dsl.scr"
-
-       procd_open_instance
-       procd_set_param command /sbin/vdsl_cpe_control \
-                       -i$xtse \
-                       -n /sbin/dsl_notify.sh \
-                       -f ${firmware} \
-                       $lowlevel \
-                       ${mode} \
-                       ${tc_layer} \
-                       $autoboot
-       procd_close_instance
-}
-
-stop_service() {
-       DSL_NOTIFICATION_TYPE="DSL_INTERFACE_STATUS" \
-       DSL_INTERFACE_STATUS="DOWN" \
-               /sbin/dsl_notify.sh
-}
diff --git a/package/network/config/ltq-vdsl-app/files/dsl_cpe_pipe.sh b/package/network/config/ltq-vdsl-app/files/dsl_cpe_pipe.sh
deleted file mode 100755 (executable)
index 9002b7b..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/sh
-
-pipe_no=0
-
-# use specified pipe no
-case "$1" in
-0|1|2)
-pipe_no=$1; shift; ;;
-esac
-
-
-#echo "Call dsl_pipe with $*"
-lock /var/lock/dsl_pipe
-echo $* > /tmp/pipe/dsl_cpe${pipe_no}_cmd
-result=$(cat /tmp/pipe/dsl_cpe${pipe_no}_ack)
-lock -u /var/lock/dsl_pipe
-
-echo "$result"
diff --git a/package/network/config/ltq-vdsl-app/patches/100-compat.patch b/package/network/config/ltq-vdsl-app/patches/100-compat.patch
deleted file mode 100644 (file)
index 6bc359c..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/src/dsl_cpe_init_cfg.c
-+++ b/src/dsl_cpe_init_cfg.c
-@@ -38,7 +38,7 @@ DSL_InitData_t gInitCfgData =
-       DSL_DEV_HS_TONE_GROUP_CLEANED, \
-       DSL_DEV_HS_TONE_GROUP_CLEANED, \
-       DSL_DEV_HS_TONE_GROUP_CLEANED, \
--      0x1E116000, 0x37, -1),
-+      0x1E116000, 0x3f, -1),
-    DSL_CPE_SIC_SET(DSL_TC_ATM, DSL_EMF_TC_CLEANED, DSL_EMF_TC_CLEANED, DSL_SYSTEMIF_MII, \
-                    DSL_TC_EFM, DSL_EMF_TC_CLEANED, DSL_EMF_TC_CLEANED, DSL_SYSTEMIF_MII),
-    DSL_CPE_MAC_CFG_SET(DSL_EFM_SPEED_100, DSL_EFM_DUPLEX_FULL, DSL_EFM_FLOWCTRL_ON, DSL_EFM_AUTONEG_OFF, \
diff --git a/package/network/config/ltq-vdsl-app/patches/101-musl.patch b/package/network/config/ltq-vdsl-app/patches/101-musl.patch
deleted file mode 100644 (file)
index d66045d..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
---- a/src/dsl_cpe_control.c
-+++ b/src/dsl_cpe_control.c
-@@ -11,6 +11,7 @@
- /*
- Includes
- */
-+#include <limits.h>
- #include "dsl_cpe_control.h"
- #include "dsl_cpe_cli.h"
- #include "dsl_cpe_cli_console.h"
diff --git a/package/network/config/ltq-vdsl-app/patches/200-autoboot.patch b/package/network/config/ltq-vdsl-app/patches/200-autoboot.patch
deleted file mode 100644 (file)
index cc6feb9..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-This enables automatic connection after the control daemon is started,
-and also stops the connection on termination.
-
-Using the autoboot restart command is necessary because the stop command
-doesn't actually stop the connection, and would also leave the driver in
-a state where an explicit start command is necessary to connect again.
-
---- a/src/dsl_cpe_init_cfg.c
-+++ b/src/dsl_cpe_init_cfg.c
-@@ -27,7 +27,7 @@ DSL_InitData_t gInitCfgData =
-    DSL_CPE_FW2_SET(DSL_NULL, 0x0),
-    DSL_CPE_XTU_SET(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7),
-    DSL_CPE_LINE_INV_NE_SET(DSL_NULL),
--   DSL_CPE_AUTOBOOT_CTRL_SET(DSL_AUTOBOOT_CTRL_STOP),
-+   DSL_CPE_AUTOBOOT_CTRL_SET(DSL_AUTOBOOT_CTRL_START),
-    DSL_CPE_AUTOBOOT_CFG_SET(DSL_FALSE, DSL_FALSE, DSL_FALSE),
-    DSL_CPE_TEST_MODE_CTRL_SET(DSL_TESTMODE_DISABLE),
-    DSL_CPE_LINE_ACTIVATE_CTRL_SET(DSL_G997_INHIBIT_LDSF, DSL_G997_INHIBIT_ACSF, DSL_G997_NORMAL_STARTUP),
---- a/src/dsl_cpe_control.c
-+++ b/src/dsl_cpe_control.c
-@@ -6515,10 +6515,13 @@ DSL_CPE_STATIC  void DSL_CPE_Termination
- DSL_CPE_STATIC  DSL_void_t DSL_CPE_Termination (void)
- {
- #ifdef INCLUDE_DSL_CPE_CLI_SUPPORT
--   DSL_int_t nDevice = 0;
-    DSL_char_t buf[32] = "quit";
- #endif
-+   DSL_Error_t nRet = DSL_SUCCESS;
-+   DSL_int_t nDevice = 0;
-+   DSL_AutobootConfig_t sAutobootCfg;
-+   DSL_AutobootControl_t sAutobootCtl;
-    DSL_CPE_Control_Context_t *pCtrlCtx;
-    pCtrlCtx = DSL_CPE_GetGlobalContext();
-@@ -6527,6 +6530,50 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_Termi
-       pCtrlCtx->bRun = DSL_FALSE;
-    }
-+   for (nDevice = 0; nDevice < DSL_CPE_MAX_DSL_ENTITIES; ++nDevice)
-+   {
-+      g_bWaitBeforeConfigWrite[nDevice]    = DSL_TRUE;
-+      g_bWaitBeforeLinkActivation[nDevice] = DSL_TRUE;
-+      g_bWaitBeforeRestart[nDevice]        = DSL_TRUE;
-+
-+      g_bAutoContinueWaitBeforeConfigWrite[nDevice]    = DSL_FALSE;
-+      g_bAutoContinueWaitBeforeLinkActivation[nDevice] = DSL_FALSE;
-+      g_bAutoContinueWaitBeforeRestart[nDevice]        = DSL_FALSE;
-+
-+      memset(&sAutobootCfg, 0x0, sizeof(DSL_AutobootConfig_t));
-+      sAutobootCfg.data.nStateMachineOptions.bWaitBeforeConfigWrite    = DSL_TRUE;
-+      sAutobootCfg.data.nStateMachineOptions.bWaitBeforeLinkActivation = DSL_TRUE;
-+      sAutobootCfg.data.nStateMachineOptions.bWaitBeforeRestart        = DSL_TRUE;
-+
-+      nRet = (DSL_Error_t)DSL_CPE_Ioctl(
-+         DSL_CPE_GetGlobalContext()->fd[nDevice],
-+         DSL_FIO_AUTOBOOT_CONFIG_SET, (DSL_int_t)&sAutobootCfg);
-+
-+      if (nRet < DSL_SUCCESS)
-+      {
-+         DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
-+            "Autoboot configuration for device (%d) failed!, nRet = %d!"
-+            DSL_CPE_CRLF, nDevice, sAutobootCtl.accessCtl.nReturn));
-+      }
-+
-+      memset(&sAutobootCtl, 0, sizeof(DSL_AutobootControl_t));
-+      sAutobootCtl.data.nCommand = DSL_AUTOBOOT_CTRL_RESTART;
-+
-+      nRet = (DSL_Error_t)DSL_CPE_Ioctl(
-+         DSL_CPE_GetGlobalContext()->fd[nDevice],
-+         DSL_FIO_AUTOBOOT_CONTROL_SET, (DSL_int_t)&sAutobootCtl);
-+
-+      if (nRet < DSL_SUCCESS)
-+      {
-+         DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
-+            "Autoboot restart for device (%d) failed!, nRet = %d!"
-+            DSL_CPE_CRLF, nDevice, sAutobootCtl.accessCtl.nReturn));
-+      }
-+   }
-+
-+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
-+      "Autoboot restart executed" DSL_CPE_CRLF));
-+
- #ifdef INCLUDE_DSL_CPE_CLI_SUPPORT
-    for (nDevice = 0; nDevice < DSL_CPE_MAX_DSL_ENTITIES; nDevice++)
-    {
diff --git a/package/network/config/ltq-vdsl-app/patches/201-sigterm.patch b/package/network/config/ltq-vdsl-app/patches/201-sigterm.patch
deleted file mode 100644 (file)
index 4e97835..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
---- a/src/dsl_cpe_control.c
-+++ b/src/dsl_cpe_control.c
-@@ -6504,7 +6504,7 @@ DSL_CPE_STATIC  void DSL_CPE_Termination
-    /* ignore the signal, we'll handle by ourself */
-    signal (sig, SIG_IGN);
--   if (sig == SIGINT)
-+   if (sig == SIGINT || sig == SIGTERM)
-    {
-       DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX "terminated" DSL_CPE_CRLF));
-       DSL_CPE_Termination ();
-@@ -6803,6 +6803,7 @@ DSL_int_t dsl_cpe_daemon (
- #ifndef RTEMS
-    signal (SIGINT, DSL_CPE_TerminationHandler);
-+   signal (SIGTERM, DSL_CPE_TerminationHandler);
- #endif /* RTEMS*/
-    /* Open DSL_CPE_MAX_DSL_ENTITIES devices*/
diff --git a/package/network/config/ltq-vdsl-app/patches/300-ubus.patch b/package/network/config/ltq-vdsl-app/patches/300-ubus.patch
deleted file mode 100644 (file)
index d257ca2..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
---- a/src/dsl_cpe_control.c
-+++ b/src/dsl_cpe_control.c
-@@ -177,6 +177,9 @@ extern DSL_Error_t DSL_CPE_Pipe_StaticRe
- #endif /* INCLUDE_DSL_RESOURCE_STATISTICS*/
- #endif
-+extern void ubus_init();
-+extern void ubus_deinit();
-+
- DSL_char_t *g_sFirmwareName1 = DSL_NULL;
- DSL_FirmwareFeatures_t g_nFwFeatures1 = {DSL_FW_XDSLMODE_CLEANED, DSL_FW_XDSLFEATURE_CLEANED,
-    DSL_FW_XDSLFEATURE_CLEANED};
-@@ -6806,6 +6809,8 @@ DSL_int_t dsl_cpe_daemon (
-    signal (SIGTERM, DSL_CPE_TerminationHandler);
- #endif /* RTEMS*/
-+   ubus_init();
-+
-    /* Open DSL_CPE_MAX_DSL_ENTITIES devices*/
-    for (nDevice = 0; nDevice < DSL_CPE_MAX_DSL_ENTITIES; nDevice++)
-    {
-@@ -7260,6 +7265,7 @@ DSL_int_t dsl_cpe_daemon (
- #endif /* INCLUDE_DSL_CPE_CLI_SUPPORT */
- DSL_CPE_CONTROL_EXIT:
-+   ubus_deinit();
- #ifdef INCLUDE_DSL_BONDING
-    DSL_CPE_BND_Stop((DSL_CPE_BND_Context_t*)pCtrlCtx->pBnd);
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -11,7 +11,7 @@ else
- dsl_cpe_control_common_ldflags =
- endif
--dsl_cpe_control_LDADD = -lpthread -lrt
-+dsl_cpe_control_LDADD = -lpthread -lrt -lubox -lubus
- if INCLUDE_DSL_CPE_DTI_SUPPORT
-     dsl_cpe_control_LDADD += -ldti_agent
-@@ -66,7 +66,8 @@ dsl_cpe_control_SOURCES = \
-       dsl_cpe_control.c \
-       dsl_cpe_init_cfg.c \
-       dsl_cpe_linux.c \
--      dsl_cpe_debug.c
-+      dsl_cpe_debug.c \
-+      dsl_cpe_ubus.c
- dsl_cpe_control_SOURCES += \
-       $(dsl_cpe_control_dti_sources)
diff --git a/package/network/config/ltq-vdsl-app/src/src/dsl_cpe_ubus.c b/package/network/config/ltq-vdsl-app/src/src/dsl_cpe_ubus.c
deleted file mode 100644 (file)
index 61ac770..0000000
+++ /dev/null
@@ -1,883 +0,0 @@
-// SPDX-License-Identifier: BSD-2-Clause
-/*
- * Copyright (C) 2020 Andre Heider <a.heider@gmail.com>
- */
-
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <libubus.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "dsl_cpe_control.h"
-#include <drv_dsl_cpe_api_ioctl.h>
-#ifdef INCLUDE_DSL_CPE_API_VRX
-#include <drv_mei_cpe_interface.h>
-#endif
-
-#define U16(v1, v2) ( \
-       ((uint16_t)(v1) << 8) | \
-       ((uint16_t)(v2)))
-
-#define U32(v1, v2, v3, v4) ( \
-       ((uint32_t)(v1) << 24) | \
-       ((uint32_t)(v2) << 16) | \
-       ((uint32_t)(v3) << 8) | \
-       ((uint32_t)(v4)))
-
-#define STR_CASE(id, text) \
-       case id: \
-               str = text; \
-               break;
-
-#define STR_CASE_MAP(id, text, number) \
-       case id: \
-               str = text; \
-               map = number; \
-               break;
-
-#define IOCTL(type, request) \
-       type out; \
-       memset(&out, 0, sizeof(type)); \
-       if (ioctl(fd, request, &out)) \
-               return;
-
-#define IOCTL_DIR(type, request, dir) \
-       type out; \
-       memset(&out, 0, sizeof(type)); \
-       out.nDirection = dir; \
-       if (ioctl(fd, request, &out)) \
-               return;
-
-#define IOCTL_DIR_DELT(type, request, dir, delt) \
-       type out; \
-       memset(&out, 0, sizeof(type)); \
-       out.nDirection = dir; \
-       out.nDeltDataType = delt; \
-       if (ioctl(fd, request, &out)) \
-               return;
-
-typedef enum {
-       ANNEX_UNKNOWN = 0,
-       ANNEX_A,
-       ANNEX_B,
-       ANNEX_C,
-       ANNEX_I,
-       ANNEX_J,
-       ANNEX_L,
-       ANNEX_M,
-} annex_t;
-
-typedef enum {
-       STD_UNKNOWN = 0,
-       STD_T1_413,
-       STD_TS_101_388,
-       STD_G_992_1,
-       STD_G_992_2,
-       STD_G_992_3,
-       STD_G_992_4,
-       STD_G_992_5,
-       STD_G_993_1,
-       STD_G_993_2,
-} standard_t;
-
-typedef enum {
-       VECTOR_UNKNOWN = 0,
-       VECTOR_OFF,
-       VECTOR_ON_DS,
-       VECTOR_ON_DS_US,
-} vector_t;
-
-typedef enum {
-       PROFILE_UNKNOWN = 0,
-       PROFILE_8A,
-       PROFILE_8B,
-       PROFILE_8C,
-       PROFILE_8D,
-       PROFILE_12A,
-       PROFILE_12B,
-       PROFILE_17A,
-       PROFILE_30A,
-       PROFILE_35B,
-} profile_t;
-
-/* These values are exported via ubus and backwards compability
- * needs to be kept!
- */
-enum {
-       LSTATE_MAP_UNKNOWN = -1,
-       LSTATE_MAP_NOT_INITIALIZED,
-       LSTATE_MAP_EXCEPTION,
-       LSTATE_MAP_IDLE,
-       LSTATE_MAP_SILENT,
-       LSTATE_MAP_HANDSHAKE,
-       LSTATE_MAP_FULL_INIT,
-       LSTATE_MAP_SHOWTIME_NO_SYNC,
-       LSTATE_MAP_SHOWTIME_TC_SYNC,
-       LSTATE_MAP_RESYNC,
-};
-
-/* These values are exported via ubus and backwards compability
- * needs to be kept!
- */
-enum {
-       PSTATE_MAP_UNKNOWN = -2,
-       PSTATE_MAP_NA,
-       PSTATE_MAP_L0,
-       PSTATE_MAP_L1,
-       PSTATE_MAP_L2,
-       PSTATE_MAP_L3,
-};
-
-static DSL_CPE_ThreadCtrl_t thread;
-static struct ubus_context *ctx;
-static struct blob_buf b;
-
-static inline void m_double(const char *id, double value) {
-       blobmsg_add_double(&b, id, value);
-}
-
-static inline void m_bool(const char *id, bool value) {
-       blobmsg_add_u8(&b, id, value);
-}
-
-static inline void m_u32(const char *id, uint32_t value) {
-       blobmsg_add_u64(&b, id, value);
-}
-
-static inline void m_str(const char *id, const char *value) {
-       blobmsg_add_string(&b, id, value);
-}
-
-static inline void m_db(const char *id, int value) {
-       m_double(id, (double)value / 10);
-}
-
-static inline void m_array(const char *id, const uint8_t *value, uint8_t len) {
-       void *c = blobmsg_open_array(&b, id);
-
-       for (uint8_t i = 0; i < len; ++i)
-               blobmsg_add_u16(&b, "", value[i]);
-
-       blobmsg_close_array(&b, c);
-}
-
-static void m_vendor(const char *id, const uint8_t *value) {
-       // ITU-T T.35: U.S.
-       if (U16(value[0], value[1]) != 0xb500)
-               return;
-
-       const char *str = NULL;
-       switch (U32(value[2], value[3], value[4], value[5])) {
-       STR_CASE(0x414C4342, "Alcatel")
-       STR_CASE(0x414E4456, "Analog Devices")
-       STR_CASE(0x4244434D, "Broadcom")
-       STR_CASE(0x43454E54, "Centillium")
-       STR_CASE(0x4753504E, "Globespan")
-       STR_CASE(0x494B4E53, "Ikanos")
-       STR_CASE(0x4946544E, "Infineon")
-       STR_CASE(0x54535443, "Texas Instruments")
-       STR_CASE(0x544D4D42, "Thomson MultiMedia Broadband")
-       STR_CASE(0x5443544E, "Trend Chip Technologies")
-       STR_CASE(0x53544D49, "ST Micro")
-       };
-
-       if (!str)
-               return;
-
-       if ((value[6] == 0) && (value[7] == 0)) {
-               m_str(id, str);
-               return;
-       }
-
-       char buf[64];
-       sprintf(buf, "%s %d.%d", str, value[6], value[7]);
-       m_str(id, buf);
-
-       return;
-}
-
-annex_t get_annex(const uint8_t *xtse) {
-       if ((xtse[0] & XTSE_1_01_A_T1_413) ||
-           (xtse[0] & XTSE_1_03_A_1_NO) ||
-           (xtse[0] & XTSE_1_04_A_1_O) ||
-           (xtse[1] & XTSE_2_01_A_2_NO) ||
-           (xtse[2] & XTSE_3_03_A_3_NO) ||
-           (xtse[2] & XTSE_3_04_A_3_O) ||
-           (xtse[3] & XTSE_4_01_A_4_NO) ||
-           (xtse[3] & XTSE_4_02_A_4_O) ||
-           (xtse[5] & XTSE_6_01_A_5_NO) ||
-           (xtse[5] & XTSE_6_02_A_5_O) ||
-           (xtse[7] & XTSE_8_01_A))
-               return ANNEX_A;
-
-       if ((xtse[0] & XTSE_1_05_B_1_NO) ||
-           (xtse[0] & XTSE_1_06_B_1_O) ||
-           (xtse[1] & XTSE_2_02_B_2_O) ||
-           (xtse[2] & XTSE_3_05_B_3_NO) ||
-           (xtse[2] & XTSE_3_06_B_3_O) ||
-           (xtse[5] & XTSE_6_03_B_5_NO) ||
-           (xtse[5] & XTSE_6_04_B_5_O) ||
-           (xtse[7] & XTSE_8_02_B))
-               return ANNEX_B;
-
-       if ((xtse[0] & XTSE_1_02_C_TS_101388) ||
-           (xtse[0] & XTSE_1_07_C_1_NO) ||
-           (xtse[0] & XTSE_1_08_C_1_O) ||
-           (xtse[1] & XTSE_2_03_C_2_NO) ||
-           (xtse[1] & XTSE_2_04_C_2_O) ||
-           (xtse[7] & XTSE_8_03_C))
-               return ANNEX_C;
-
-       if ((xtse[3] & XTSE_4_05_I_3_NO) ||
-           (xtse[3] & XTSE_4_06_I_3_O) ||
-           (xtse[4] & XTSE_5_01_I_4_NO) ||
-           (xtse[4] & XTSE_5_02_I_4_O) ||
-           (xtse[5] & XTSE_6_07_I_5_NO) ||
-           (xtse[5] & XTSE_6_08_I_5_O))
-               return ANNEX_I;
-
-       if ((xtse[3] & XTSE_4_07_J_3_NO) ||
-           (xtse[3] & XTSE_4_08_J_3_O) ||
-           (xtse[6] & XTSE_7_01_J_5_NO) ||
-           (xtse[6] & XTSE_7_02_J_5_O))
-               return ANNEX_J;
-
-       if ((xtse[4] & XTSE_5_03_L_3_NO) ||
-           (xtse[4] & XTSE_5_04_L_3_NO) ||
-           (xtse[4] & XTSE_5_05_L_3_O) ||
-           (xtse[4] & XTSE_5_06_L_3_O))
-               return ANNEX_L;
-
-       if ((xtse[4] & XTSE_5_07_M_3_NO) ||
-           (xtse[4] & XTSE_5_08_M_3_O) ||
-           (xtse[6] & XTSE_7_03_M_5_NO) ||
-           (xtse[6] & XTSE_7_04_M_5_O))
-               return ANNEX_M;
-
-       return ANNEX_UNKNOWN;
-}
-
-static standard_t get_standard(const uint8_t *xtse) {
-       if (xtse[0] & XTSE_1_01_A_T1_413)
-               return STD_T1_413;
-
-       if (xtse[0] & XTSE_1_02_C_TS_101388)
-               return STD_TS_101_388;
-
-       if ((xtse[0] & XTSE_1_03_A_1_NO) ||
-           (xtse[0] & XTSE_1_04_A_1_O) ||
-           (xtse[0] & XTSE_1_05_B_1_NO) ||
-           (xtse[0] & XTSE_1_06_B_1_O) ||
-           (xtse[0] & XTSE_1_07_C_1_NO) ||
-           (xtse[0] & XTSE_1_08_C_1_O))
-               return STD_G_992_1;
-
-       if ((xtse[1] & XTSE_2_01_A_2_NO) ||
-           (xtse[1] & XTSE_2_02_B_2_O) ||
-           (xtse[1] & XTSE_2_03_C_2_NO) ||
-           (xtse[1] & XTSE_2_04_C_2_O))
-               return STD_G_992_2;
-
-       if ((xtse[2] & XTSE_3_03_A_3_NO) ||
-           (xtse[2] & XTSE_3_04_A_3_O) ||
-           (xtse[2] & XTSE_3_05_B_3_NO) ||
-           (xtse[2] & XTSE_3_06_B_3_O) ||
-           (xtse[3] & XTSE_4_05_I_3_NO) ||
-           (xtse[3] & XTSE_4_06_I_3_O) ||
-           (xtse[3] & XTSE_4_07_J_3_NO) ||
-           (xtse[3] & XTSE_4_08_J_3_O) ||
-           (xtse[4] & XTSE_5_03_L_3_NO) ||
-           (xtse[4] & XTSE_5_04_L_3_NO) ||
-           (xtse[4] & XTSE_5_05_L_3_O) ||
-           (xtse[4] & XTSE_5_06_L_3_O) ||
-           (xtse[4] & XTSE_5_07_M_3_NO) ||
-           (xtse[4] & XTSE_5_08_M_3_O))
-               return STD_G_992_3;
-
-       if ((xtse[3] & XTSE_4_01_A_4_NO) ||
-           (xtse[3] & XTSE_4_02_A_4_O) ||
-           (xtse[4] & XTSE_5_01_I_4_NO) ||
-           (xtse[4] & XTSE_5_02_I_4_O))
-               return STD_G_992_4;
-
-       if ((xtse[5] & XTSE_6_01_A_5_NO) ||
-           (xtse[5] & XTSE_6_02_A_5_O) ||
-           (xtse[5] & XTSE_6_03_B_5_NO) ||
-           (xtse[5] & XTSE_6_04_B_5_O) ||
-           (xtse[5] & XTSE_6_07_I_5_NO) ||
-           (xtse[5] & XTSE_6_08_I_5_O) ||
-           (xtse[6] & XTSE_7_01_J_5_NO) ||
-           (xtse[6] & XTSE_7_02_J_5_O) ||
-           (xtse[6] & XTSE_7_03_M_5_NO) ||
-           (xtse[6] & XTSE_7_04_M_5_O))
-               return STD_G_992_5;
-
-       if (xtse[7] & XTSE_8_08)
-               return STD_G_993_1;
-
-       if ((xtse[7] & XTSE_8_01_A) ||
-           (xtse[7] & XTSE_8_02_B) ||
-           (xtse[7] & XTSE_8_03_C))
-               return STD_G_993_2;
-
-       return STD_UNKNOWN;
-}
-
-static void version_information(int fd) {
-       IOCTL(DSL_VersionInformation_t, DSL_FIO_VERSION_INFORMATION_GET)
-
-       m_str("api_version", out.data.DSL_DriverVersionApi);
-       m_str("firmware_version", out.data.DSL_ChipSetFWVersion);
-       m_str("chipset", out.data.DSL_ChipSetType);
-       m_str("driver_version", out.data.DSL_DriverVersionMeiBsp);
-}
-
-static void line_state(int fd) {
-       IOCTL(DSL_LineState_t, DSL_FIO_LINE_STATE_GET)
-
-       int map = LSTATE_MAP_UNKNOWN;
-       const char *str;
-       switch (out.data.nLineState) {
-       STR_CASE_MAP(DSL_LINESTATE_NOT_INITIALIZED, "Not initialized", LSTATE_MAP_NOT_INITIALIZED)
-       STR_CASE_MAP(DSL_LINESTATE_EXCEPTION, "Exception", LSTATE_MAP_EXCEPTION)
-       STR_CASE(DSL_LINESTATE_NOT_UPDATED, "Not updated")
-       STR_CASE(DSL_LINESTATE_IDLE_REQUEST, "Idle request")
-       STR_CASE_MAP(DSL_LINESTATE_IDLE, "Idle", LSTATE_MAP_IDLE)
-       STR_CASE(DSL_LINESTATE_SILENT_REQUEST, "Silent request")
-       STR_CASE_MAP(DSL_LINESTATE_SILENT, "Silent", LSTATE_MAP_SILENT)
-       STR_CASE_MAP(DSL_LINESTATE_HANDSHAKE, "Handshake", LSTATE_MAP_HANDSHAKE)
-       STR_CASE(DSL_LINESTATE_BONDING_CLR, "Bonding CLR")
-       STR_CASE_MAP(DSL_LINESTATE_FULL_INIT, "Full init", LSTATE_MAP_FULL_INIT)
-       STR_CASE(DSL_LINESTATE_SHORT_INIT_ENTRY, "Short init entry")
-       STR_CASE(DSL_LINESTATE_DISCOVERY, "Discovery")
-       STR_CASE(DSL_LINESTATE_TRAINING, "Training")
-       STR_CASE(DSL_LINESTATE_ANALYSIS, "Analysis")
-       STR_CASE(DSL_LINESTATE_EXCHANGE, "Exchange")
-       STR_CASE_MAP(DSL_LINESTATE_SHOWTIME_NO_SYNC, "Showtime without TC-Layer sync", LSTATE_MAP_SHOWTIME_NO_SYNC)
-       STR_CASE_MAP(DSL_LINESTATE_SHOWTIME_TC_SYNC, "Showtime with TC-Layer sync", LSTATE_MAP_SHOWTIME_TC_SYNC)
-       STR_CASE(DSL_LINESTATE_FASTRETRAIN, "Fastretrain")
-       STR_CASE(DSL_LINESTATE_LOWPOWER_L2, "Lowpower L2")
-       STR_CASE(DSL_LINESTATE_LOOPDIAGNOSTIC_ACTIVE, "Loopdiagnostic active")
-       STR_CASE(DSL_LINESTATE_LOOPDIAGNOSTIC_DATA_EXCHANGE, "Loopdiagnostic data exchange")
-       STR_CASE(DSL_LINESTATE_LOOPDIAGNOSTIC_DATA_REQUEST, "Loopdiagnostic data request")
-       STR_CASE(DSL_LINESTATE_LOOPDIAGNOSTIC_COMPLETE, "Loopdiagnostic complete")
-       STR_CASE_MAP(DSL_LINESTATE_RESYNC, "Resync", LSTATE_MAP_RESYNC)
-       STR_CASE(DSL_LINESTATE_TEST, "Test")
-       STR_CASE(DSL_LINESTATE_TEST_LOOP, "Test loop")
-       STR_CASE(DSL_LINESTATE_TEST_REVERB, "Test reverb")
-       STR_CASE(DSL_LINESTATE_TEST_MEDLEY, "Test medley")
-       STR_CASE(DSL_LINESTATE_TEST_SHOWTIME_LOCK, "Showtime lock")
-       STR_CASE(DSL_LINESTATE_TEST_QUIET, "Quiet")
-       STR_CASE(DSL_LINESTATE_LOWPOWER_L3, "Lowpower L3")
-#ifndef INCLUDE_DSL_CPE_API_DANUBE
-       STR_CASE(DSL_LINESTATE_DISABLED, "Disabled")
-       STR_CASE(DSL_LINESTATE_T1413, "T1413")
-       STR_CASE(DSL_LINESTATE_ORDERLY_SHUTDOWN_REQUEST, "Orderly shutdown request")
-       STR_CASE(DSL_LINESTATE_ORDERLY_SHUTDOWN, "Orderly shutdown")
-       STR_CASE(DSL_LINESTATE_TEST_FILTERDETECTION_ACTIVE, "Test filterdetection active")
-       STR_CASE(DSL_LINESTATE_TEST_FILTERDETECTION_COMPLETE, "Test filterdetection complete")
-#endif
-       default:
-               str = NULL;
-               break;
-       };
-
-       if (str)
-               m_str("state", str);
-
-       if (map != LSTATE_MAP_UNKNOWN )
-               m_u32("state_num", map);
-
-       m_bool("up", out.data.nLineState == DSL_LINESTATE_SHOWTIME_TC_SYNC);
-}
-
-static void pm_channel_counters_showtime(int fd) {
-       IOCTL_DIR(DSL_PM_ChannelCounters_t, DSL_FIO_PM_CHANNEL_COUNTERS_SHOWTIME_GET, DSL_NEAR_END);
-
-       m_u32("uptime", out.interval.nElapsedTime);
-}
-
-static void g997_line_inventory(int fd) {
-       IOCTL_DIR(DSL_G997_LineInventory_t, DSL_FIO_G997_LINE_INVENTORY_GET, DSL_DOWNSTREAM)
-
-       m_array("vendor_id", out.data.G994VendorID, DSL_G997_LI_MAXLEN_VENDOR_ID);
-       m_vendor("vendor", out.data.G994VendorID);
-       m_array("system_vendor_id", out.data.SystemVendorID, DSL_G997_LI_MAXLEN_VENDOR_ID);
-       m_vendor("system_vendor", out.data.SystemVendorID);
-       m_array("version", out.data.VersionNumber, DSL_G997_LI_MAXLEN_VERSION);
-       m_array("serial", out.data.SerialNumber, DSL_G997_LI_MAXLEN_SERIAL);
-}
-
-static void g997_power_management_status(int fd) {
-       IOCTL(DSL_G997_PowerManagementStatus_t, DSL_FIO_G997_POWER_MANAGEMENT_STATUS_GET)
-
-       int map = PSTATE_MAP_UNKNOWN;
-       const char *str;
-       switch (out.data.nPowerManagementStatus) {
-       STR_CASE_MAP(DSL_G997_PMS_NA, "Power management state is not available", PSTATE_MAP_NA)
-       STR_CASE_MAP(DSL_G997_PMS_L0, "L0 - Synchronized", PSTATE_MAP_L0)
-       STR_CASE_MAP(DSL_G997_PMS_L1, "L1 - Power Down Data transmission (G.992.2)", PSTATE_MAP_L1)
-       STR_CASE_MAP(DSL_G997_PMS_L2, "L2 - Power Down Data transmission (G.992.3 and G.992.4)", PSTATE_MAP_L2)
-       STR_CASE_MAP(DSL_G997_PMS_L3, "L3 - No power", PSTATE_MAP_L3)
-       default:
-               str = NULL;
-               break;
-       };
-
-       if (str)
-               m_str("power_state", str);
-
-       if (map != PSTATE_MAP_UNKNOWN)
-               m_u32("power_state_num", map);
-}
-
-static void g997_xtu_system_enabling(int fd, standard_t *standard) {
-       IOCTL(DSL_G997_XTUSystemEnabling_t, DSL_FIO_G997_XTU_SYSTEM_ENABLING_STATUS_GET)
-
-       m_array("xtse", out.data.XTSE, DSL_G997_NUM_XTSE_OCTETS);
-
-       const char *str;
-       switch (get_annex(out.data.XTSE)) {
-       STR_CASE(ANNEX_A, "A")
-       STR_CASE(ANNEX_B, "B")
-       STR_CASE(ANNEX_C, "C")
-       STR_CASE(ANNEX_I, "I")
-       STR_CASE(ANNEX_J, "J")
-       STR_CASE(ANNEX_L, "L")
-       STR_CASE(ANNEX_M, "M")
-       default:
-               str = NULL;
-               break;
-       };
-       if (str)
-               m_str("annex", str);
-
-       *standard = get_standard(out.data.XTSE);
-
-       switch (*standard) {
-       STR_CASE(STD_T1_413, "T1.413")
-       STR_CASE(STD_TS_101_388, "TS 101 388")
-       STR_CASE(STD_G_992_1, "G.992.1")
-       STR_CASE(STD_G_992_2, "G.992.2")
-       STR_CASE(STD_G_992_3, "G.992.3")
-       STR_CASE(STD_G_992_4, "G.992.4")
-       STR_CASE(STD_G_992_5, "G.992.5")
-       STR_CASE(STD_G_993_1, "G.993.1")
-       STR_CASE(STD_G_993_2, "G.993.2")
-       default:
-               str = NULL;
-               break;
-       }
-       if (str)
-               m_str("standard", str);
-}
-
-static void get_vector_status(int fd, vector_t *status) {
-       *status = VECTOR_UNKNOWN;
-
-#ifdef INCLUDE_DSL_CPE_API_VRX
-       if (fd < 0)
-               return;
-
-       IOCTL(IOCTL_MEI_dsmStatus_t, FIO_MEI_DSM_STATUS_GET);
-
-       switch (out.eVectorStatus) {
-       case e_MEI_VECTOR_STAT_OFF:
-               *status = VECTOR_OFF;
-               break;
-       case e_MEI_VECTOR_STAT_ON_DS:
-               *status = VECTOR_ON_DS;
-               break;
-       case e_MEI_VECTOR_STAT_ON_DS_US:
-               *status = VECTOR_ON_DS_US;
-               break;
-       default:
-               break;
-       };
-#endif
-}
-
-static void vector_erb(int fd) {
-#ifdef INCLUDE_DSL_CPE_API_VRX
-       if (fd < 0)
-               return;
-
-       IOCTL(IOCTL_MEI_dsmStatistics_t, FIO_MEI_DSM_STATISTICS_GET);
-
-       m_u32("sent", out.n_processed);
-       m_u32("discarded", out.n_fw_dropped_size + out.n_mei_dropped_size + out.n_mei_dropped_no_pp_cb + out.n_pp_dropped);
-#endif
-}
-
-static void band_plan_status(int fd, profile_t *profile) {
-#if (INCLUDE_DSL_CPE_API_VDSL_SUPPORT == 1)
-       IOCTL(DSL_BandPlanStatus_t, DSL_FIO_BAND_PLAN_STATUS_GET)
-
-       switch (out.data.nProfile) {
-       case DSL_PROFILE_8A:
-               *profile = PROFILE_8A;
-               break;
-       case DSL_PROFILE_8B:
-               *profile = PROFILE_8B;
-               break;
-       case DSL_PROFILE_8C:
-               *profile = PROFILE_8C;
-               break;
-       case DSL_PROFILE_8D:
-               *profile = PROFILE_8D;
-               break;
-       case DSL_PROFILE_12A:
-               *profile = PROFILE_12A;
-               break;
-       case DSL_PROFILE_12B:
-               *profile = PROFILE_12B;
-               break;
-       case DSL_PROFILE_17A:
-               *profile = PROFILE_17A;
-               break;
-       case DSL_PROFILE_30A:
-               *profile = PROFILE_30A;
-               break;
-       case DSL_PROFILE_35B:
-               *profile = PROFILE_35B;
-               break;
-       default:
-               *profile = PROFILE_UNKNOWN;
-               break;
-       };
-
-       const char *str;
-       switch (*profile) {
-       STR_CASE(PROFILE_8A, "8a")
-       STR_CASE(PROFILE_8B, "8b")
-       STR_CASE(PROFILE_8C, "8c")
-       STR_CASE(PROFILE_8D, "8d")
-       STR_CASE(PROFILE_12A, "12a")
-       STR_CASE(PROFILE_12B, "12b")
-       STR_CASE(PROFILE_17A, "17a")
-       STR_CASE(PROFILE_30A, "30a")
-       STR_CASE(PROFILE_35B, "35b")
-       default:
-               str = NULL;
-               break;
-       };
-       if (str)
-               m_str("profile", str);
-#endif
-}
-
-static void line_feature_config(int fd, DSL_AccessDir_t direction) {
-       IOCTL_DIR(DSL_LineFeature_t, DSL_FIO_LINE_FEATURE_STATUS_GET, direction)
-
-       m_bool("trellis", out.data.bTrellisEnable);
-       m_bool("bitswap", out.data.bBitswapEnable);
-       m_bool("retx", out.data.bReTxEnable);
-       m_bool("virtual_noise", out.data.bVirtualNoiseSupport);
-}
-
-static void g997_channel_status(int fd, DSL_AccessDir_t direction) {
-       IOCTL_DIR(DSL_G997_ChannelStatus_t, DSL_FIO_G997_CHANNEL_STATUS_GET, direction);
-
-       m_u32("interleave_delay", out.data.ActualInterleaveDelay * 10);
-#ifndef INCLUDE_DSL_CPE_API_DANUBE
-       // prefer ACTNDR, see comments in drv_dsl_cpe_api_g997.h
-       m_u32("data_rate", out.data.ActualNetDataRate);
-#else
-       m_u32("data_rate", out.data.ActualDataRate);
-#endif
-}
-
-static void g997_line_status(int fd, DSL_AccessDir_t direction) {
-       IOCTL_DIR_DELT(DSL_G997_LineStatus_t, DSL_FIO_G997_LINE_STATUS_GET, direction, DSL_DELT_DATA_SHOWTIME);
-
-       m_db("latn", out.data.LATN);
-       m_db("satn", out.data.SATN);
-       m_db("snr", out.data.SNR);
-       m_db("actps", out.data.ACTPS);
-       m_db("actatp", out.data.ACTATP);
-       m_u32("attndr", out.data.ATTNDR);
-}
-
-static void pm_line_sec_counters_total(int fd, DSL_XTUDir_t direction) {
-       IOCTL_DIR(DSL_PM_LineSecCountersTotal_t, DSL_FIO_PM_LINE_SEC_COUNTERS_TOTAL_GET, direction)
-
-       m_u32("es", out.data.nES);
-       m_u32("ses", out.data.nSES);
-       m_u32("loss", out.data.nLOSS);
-       m_u32("uas", out.data.nUAS);
-       m_u32("lofs", out.data.nLOFS);
-#ifndef INCLUDE_DSL_CPE_API_DANUBE
-       m_u32("fecs", out.data.nFECS);
-#endif
-}
-
-static void pm_data_path_counters_total(int fd, DSL_XTUDir_t direction) {
-       IOCTL_DIR(DSL_PM_DataPathCountersTotal_t, DSL_FIO_PM_DATA_PATH_COUNTERS_TOTAL_GET, direction);
-
-       m_u32("hec", out.data.nHEC);
-       m_u32("ibe", out.data.nIBE);
-       m_u32("crc_p", out.data.nCRC_P);
-       m_u32("crcp_p", out.data.nCRCP_P);
-       m_u32("cv_p", out.data.nCV_P);
-       m_u32("cvp_p", out.data.nCVP_P);
-}
-
-static void retx_statistics(int fd, DSL_XTUDir_t direction) {
-#ifdef INCLUDE_DSL_CPE_PM_RETX_COUNTERS
-#ifdef INCLUDE_DSL_CPE_PM_RETX_THRESHOLDS
-       IOCTL_DIR(DSL_ReTxStatistics_t, DSL_FIO_RETX_STATISTICS_GET, direction);
-
-       m_u32("rx_corrupted", out.data.nRxCorruptedTotal);
-       m_u32("rx_uncorrected_protected", out.data.nRxUncorrectedProtected);
-       m_u32("rx_retransmitted", out.data.nRxRetransmitted);
-       m_u32("rx_corrected", out.data.nRxCorrected);
-       m_u32("tx_retransmitted", out.data.nTxRetransmitted);
-#endif
-#endif
-}
-
-static void describe_mode(standard_t standard, profile_t profile, vector_t vector) {
-       char buf[128];
-
-       switch (standard) {
-       case STD_T1_413:
-               strcpy(buf, "T1.413");
-               break;
-       case STD_TS_101_388:
-               strcpy(buf, "TS 101 388");
-               break;
-       case STD_G_992_1:
-               strcpy(buf, "G.992.1 (ADSL)");
-               break;
-       case STD_G_992_2:
-               strcpy(buf, "G.992.2 (ADSL lite)");
-               break;
-       case STD_G_992_3:
-               strcpy(buf, "G.992.3 (ADSL2)");
-               break;
-       case STD_G_992_4:
-               strcpy(buf, "G.992.4 (ADSL2 lite)");
-               break;
-       case STD_G_992_5:
-               strcpy(buf, "G.992.5 (ADSL2+)");
-               break;
-       case STD_G_993_1:
-               strcpy(buf, "G.993.1 (VDSL)");
-               break;
-       case STD_G_993_2:
-               strcpy(buf, "G.993.2 (VDSL2");
-
-               switch (profile) {
-               case PROFILE_8A:
-                       strcat(buf, ", Profile 8a");
-                       break;
-               case PROFILE_8B:
-                       strcat(buf, ", Profile 8b");
-                       break;
-               case PROFILE_8C:
-                       strcat(buf, ", Profile 8c");
-                       break;
-               case PROFILE_8D:
-                       strcat(buf, ", Profile 8d");
-                       break;
-               case PROFILE_12A:
-                       strcat(buf, ", Profile 12a");
-                       break;
-               case PROFILE_12B:
-                       strcat(buf, ", Profile 12b");
-                       break;
-               case PROFILE_17A:
-                       strcat(buf, ", Profile 17a");
-                       break;
-               case PROFILE_30A:
-                       strcat(buf, ", Profile 30a");
-                       break;
-               case PROFILE_35B:
-                       strcat(buf, ", Profile 35b");
-                       break;
-               default:
-                       break;
-               };
-
-               switch (vector) {
-               case VECTOR_ON_DS:
-                       strcat(buf, ", with downstream vectoring");
-                       break;
-               case VECTOR_ON_DS_US:
-                       strcat(buf, ", with down- and upstream vectoring");
-                       break;
-               default:
-                       break;
-               };
-
-               strcat(buf, ")");
-               break;
-       default:
-               return;
-       };
-
-       m_str("mode", buf);
-}
-
-static int metrics(struct ubus_context *ctx, struct ubus_object *obj,
-                  struct ubus_request_data *req, const char *method,
-                  struct blob_attr *msg)
-{
-       int fd, fd_mei;
-       void *c, *c2;
-       standard_t standard = STD_UNKNOWN;
-       profile_t profile = PROFILE_UNKNOWN;
-       vector_t vector = VECTOR_UNKNOWN;
-
-#ifndef INCLUDE_DSL_CPE_API_DANUBE
-       fd = open(DSL_CPE_DEVICE_NAME "/0", O_RDWR, 0644);
-#else
-       fd = open(DSL_CPE_DEVICE_NAME, O_RDWR, 0644);
-#endif
-       if (fd < 0)
-               return UBUS_STATUS_UNKNOWN_ERROR;
-
-#ifdef INCLUDE_DSL_CPE_API_VRX
-       fd_mei = open(DSL_CPE_DSL_LOW_DEV "/0", O_RDWR, 0644);
-#else
-       fd_mei = -1;
-#endif
-
-       blob_buf_init(&b, 0);
-
-       version_information(fd);
-       line_state(fd);
-       pm_channel_counters_showtime(fd);
-
-       c = blobmsg_open_table(&b, "atu_c");
-       g997_line_inventory(fd);
-       blobmsg_close_table(&b, c);
-
-       g997_power_management_status(fd);
-       g997_xtu_system_enabling(fd, &standard);
-
-       if (standard == STD_G_993_2) {
-               band_plan_status(fd, &profile);
-               get_vector_status(fd_mei, &vector);
-       }
-
-       describe_mode(standard, profile, vector);
-
-       c = blobmsg_open_table(&b, "upstream");
-       switch (vector) {
-       case VECTOR_OFF:
-               m_bool("vector", false);
-               break;
-       case VECTOR_ON_DS_US:
-               m_bool("vector", true);
-               break;
-       default:
-               break;
-       };
-       line_feature_config(fd, DSL_UPSTREAM);
-       g997_channel_status(fd, DSL_UPSTREAM);
-       g997_line_status(fd, DSL_UPSTREAM);
-       blobmsg_close_table(&b, c);
-
-       c = blobmsg_open_table(&b, "downstream");
-       switch (vector) {
-       case VECTOR_OFF:
-               m_bool("vector", false);
-               break;
-       case VECTOR_ON_DS:
-       case VECTOR_ON_DS_US:
-               m_bool("vector", true);
-               break;
-       default:
-               break;
-       };
-       line_feature_config(fd, DSL_DOWNSTREAM);
-       g997_channel_status(fd, DSL_DOWNSTREAM);
-       g997_line_status(fd, DSL_DOWNSTREAM);
-       blobmsg_close_table(&b, c);
-
-       c = blobmsg_open_table(&b, "errors");
-       c2 = blobmsg_open_table(&b, "near");
-       pm_line_sec_counters_total(fd, DSL_NEAR_END);
-       pm_data_path_counters_total(fd, DSL_NEAR_END);
-       retx_statistics(fd, DSL_NEAR_END);
-       blobmsg_close_table(&b, c2);
-
-       c2 = blobmsg_open_table(&b, "far");
-       pm_line_sec_counters_total(fd, DSL_FAR_END);
-       pm_data_path_counters_total(fd, DSL_FAR_END);
-       retx_statistics(fd, DSL_FAR_END);
-       blobmsg_close_table(&b, c2);
-       blobmsg_close_table(&b, c);
-
-       switch (vector) {
-       case VECTOR_ON_DS:
-       case VECTOR_ON_DS_US:
-               c = blobmsg_open_table(&b, "erb");
-               vector_erb(fd_mei);
-               blobmsg_close_table(&b, c);
-               break;
-       default:
-               break;
-       };
-
-       ubus_send_reply(ctx, req, b.head);
-
-       if (fd_mei >= 0)
-               close(fd_mei);
-       close(fd);
-
-       return 0;
-}
-
-static const struct ubus_method dsl_methods[] = {
-       UBUS_METHOD_NOARG("metrics", metrics),
-};
-
-static struct ubus_object_type dsl_object_type =
-       UBUS_OBJECT_TYPE("dsl", dsl_methods);
-
-static struct ubus_object dsl_object = {
-       .name = "dsl",
-       .type = &dsl_object_type,
-       .methods = dsl_methods,
-       .n_methods = ARRAY_SIZE(dsl_methods),
-};
-
-static DSL_int_t ubus_main(DSL_CPE_Thread_Params_t *params) {
-       uloop_run();
-       return 0;
-}
-
-void ubus_init() {
-       uloop_init();
-
-       ctx = ubus_connect(NULL);
-       if (!ctx)
-               return;
-
-       if (ubus_add_object(ctx, &dsl_object)) {
-               ubus_free(ctx);
-               ctx = NULL;
-               return;
-       }
-
-       ubus_add_uloop(ctx);
-
-       DSL_CPE_ThreadInit(&thread, "ubus", ubus_main, DSL_CPE_PIPE_STACK_SIZE, DSL_CPE_PIPE_PRIORITY, 0, 0);
-}
-
-void ubus_deinit() {
-       if (!ctx)
-               return;
-
-       ubus_free(ctx);
-       uloop_done();
-
-       DSL_CPE_ThreadShutdown(&thread, 1000);
-}
diff --git a/package/network/config/ltq-vdsl-vr9-app/Makefile b/package/network/config/ltq-vdsl-vr9-app/Makefile
new file mode 100644 (file)
index 0000000..c799145
--- /dev/null
@@ -0,0 +1,82 @@
+# Copyright (C) 2010 OpenWrt.org
+# Copyright (C) 2015-2016 Lantiq Beteiligungs GmbH & Co KG.
+#
+# 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:=ltq-vdsl-vr9-app
+PKG_VERSION:=4.17.18.6
+PKG_RELEASE:=$(AUTORELEASE)
+PKG_BASE_NAME:=dsl_cpe_control
+PKG_SOURCE:=$(PKG_BASE_NAME)_vrx-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=@OPENWRT
+PKG_HASH:=da8bb929526a61aea0e153ef524331fcd472a1ebbc6d88ca017735a4f82ece02
+PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_BASE_NAME)-$(PKG_VERSION)
+PKG_LICENSE:=BSD-2-Clause
+
+PKG_BUILD_DEPENDS:=ltq-vdsl-vr9
+
+PKG_FLAGS:=nonshared
+PKG_FIXUP:=autoreconf
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/ltq-vdsl-vr9-app
+  SECTION:=net
+  CATEGORY:=Network
+  TITLE:=Lantiq VDSL userland tool
+  URL:=http://www.lantiq.com/
+  DEPENDS:=@TARGET_lantiq_xrx200 +libpthread +librt +ltq-dsl-base +libubox +libubus
+endef
+
+define Package/ltq-vdsl-vr9-app/description
+  Userland tool needed to control Lantiq VDSL CPE
+endef
+
+# ltq-vdsl-vr9-app uses a header provided by the MEI driver which has some
+# conditionals.
+#
+# Define them here with the default values they would get in the MEI driver,
+# have the same view on both sides.
+#
+# If you change them, you need to change them for the ltq-vdsl-vr9-app as well
+VDSL_APP_CFLAGS = \
+       -DMAX_CLI_PIPES=1 \
+       -DMEI_SUPPORT_DEBUG_STREAMS=1 \
+       -DMEI_SUPPORT_OPTIMIZED_FW_DL=1
+
+CONFIGURE_ARGS += \
+       --enable-vrx \
+       --enable-vrx-device=vr9 \
+       --enable-driver-include="-I$(STAGING_DIR)/usr/include/drv_vdsl_cpe_api" \
+       --enable-device-driver-include="-I$(STAGING_DIR)/usr/include/vdsl/" \
+       --enable-ifxos \
+       --enable-ifxos-include="-I$(STAGING_DIR)/usr/include/ifxos" \
+       --enable-ifxos-library="-I$(STAGING_DIR)/usr/lib" \
+       --enable-add-appl-cflags="$(VDSL_APP_CFLAGS)"  \
+       --enable-debug \
+       --disable-dti \
+       --with-channels-per-line="1"
+
+CONFIGURE_ARGS += \
+       --enable-model=full \
+       --enable-dsl-ceoc=no
+#CONFIGURE_ARGS += --enable-model=lite
+#CONFIGURE_ARGS += --enable-model=footprint
+#CONFIGURE_ARGS += --enable-model=typical
+#CONFIGURE_ARGS += --enable-model=debug
+
+define Package/ltq-vdsl-vr9-app/install
+       $(INSTALL_DIR) $(1)/etc/init.d $(1)/sbin $(1)/etc/hotplug.d/dsl
+       $(INSTALL_BIN) ./files/dsl_control $(1)/etc/init.d/
+       $(INSTALL_BIN) ./files/10_atm.sh $(1)/etc/hotplug.d/dsl
+       $(INSTALL_BIN) ./files/10_ptm.sh $(1)/etc/hotplug.d/dsl
+
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/dsl_cpe_control $(1)/sbin/vdsl_cpe_control
+       $(INSTALL_BIN) ./files/dsl_cpe_pipe.sh $(1)/sbin/
+endef
+
+$(eval $(call BuildPackage,ltq-vdsl-vr9-app))
diff --git a/package/network/config/ltq-vdsl-vr9-app/files/10_atm.sh b/package/network/config/ltq-vdsl-vr9-app/files/10_atm.sh
new file mode 100755 (executable)
index 0000000..e104a14
--- /dev/null
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+[ "$DSL_NOTIFICATION_TYPE" = "DSL_STATUS" ] && \
+[ "$DSL_TC_LAYER_STATUS" = "ATM" ] && \
+! grep -q "ltq_atm_vr9" /proc/modules || exit 0
+
+logger -p daemon.notice -t "dsl-notify" "Switching to TC-Layer ATM"
+
+if grep -q "ltq_ptm_vr9" /proc/modules ; then
+       logger -p daemon.notice -t "dsl-notify" "Loading ATM driver while EFM/PTM driver is loaded is not possible. Reboot is needed."
+       exit
+fi
+
+modprobe ltq_atm_vr9
diff --git a/package/network/config/ltq-vdsl-vr9-app/files/10_ptm.sh b/package/network/config/ltq-vdsl-vr9-app/files/10_ptm.sh
new file mode 100755 (executable)
index 0000000..1c62617
--- /dev/null
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+[ "$DSL_NOTIFICATION_TYPE" = "DSL_STATUS" ] && \
+[ "$DSL_TC_LAYER_STATUS" = "EFM" ] && \
+! grep -q "ltq_ptm_vr9" /proc/modules || exit 0
+
+logger -p daemon.notice -t "dsl-notify" "Switching to TC-Layer EFM/PTM"
+
+if grep -q "ltq_atm_vr9" /proc/modules ; then
+       logger -p daemon.notice -t "dsl-notify" "Loading EFM/PTM driver while ATM driver is loaded is not possible. Reboot is needed."
+       exit
+fi
+
+modprobe ltq_ptm_vr9
diff --git a/package/network/config/ltq-vdsl-vr9-app/files/dsl_control b/package/network/config/ltq-vdsl-vr9-app/files/dsl_control
new file mode 100644 (file)
index 0000000..34642db
--- /dev/null
@@ -0,0 +1,322 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2012 OpenWrt.org
+
+START=97
+USE_PROCD=1
+
+dslstat() {
+       ubus call dsl metrics
+}
+
+extra_command "dslstat" "Get DSL status information"
+
+#
+# ITU-T G.997.1 (06/2012) - Section 7.3.1.1.1 (xTU transmission system enabling (XTSE))
+# ITU-T G.997.1 Amendment 2 (04/2013) - Section 2.1 - (Vectoring mode enable (VECTORMODE_ENABLE))
+#
+# G.992.1 Annex A
+# G.992.2 Annex A
+# G.992.3 Annex A / L-US1 / L_US-2 / M
+# G.992.5 Annex A / M
+# G.993.2 Annex A/B/C
+# G.993.5 Annex A/B/C
+xtse_xdsl_a="05_01_04_00_4C_01_04_07"
+
+# G.992.1 Annex B
+# G.992.3 Annex B
+# G.992.5 Annex B
+# G.993.2 Annex A/B/C
+# G.993.5 Annex A/B/C
+xtse_xdsl_b="10_00_10_00_00_04_00_07"
+
+# G.992.1 Annex B
+# G.992.3 Annex B
+# G.992.3 Annex J
+# G.992.5 Annex B
+# G.992.5 Annex J
+# G.993.2 Annex A/B/C
+# G.993.5 Annex A/B/C
+xtse_xdsl_j="10_00_10_40_00_04_01_07"
+
+# G.992.1 Annex B
+xtse_xdsl_bdmt="10_00_00_00_00_00_00_00"
+
+# G.992.3 Annex B
+xtse_xdsl_b2="00_00_10_00_00_00_00_00"
+
+# G.992.5 Annex B
+xtse_xdsl_b2p="00_00_00_00_00_04_00_00"
+
+# ANSI T1.413
+xtse_xdsl_at1="01_00_00_00_00_00_00_00"
+
+# G.992.2 Annex A
+xtse_xdsl_alite="00_01_00_00_00_00_00_00"
+
+# G.992.1 Annex A
+xtse_xdsl_admt="04_00_00_00_00_00_00_00"
+
+# G.992.3 Annex A
+xtse_xdsl_a2="00_00_04_00_00_00_00_00"
+
+# G.992.5 Annex A
+xtse_xdsl_a2p="00_00_00_00_00_01_00_00"
+
+# G.992.3 Annex L
+xtse_xdsl_l="00_00_00_00_0C_00_00_00"
+
+# G.992.3 Annex M
+# G.992.5 Annex M
+xtse_xdsl_m="00_00_00_00_40_00_04_00"
+
+# G.992.3 Annex M
+xtse_xdsl_m2="00_00_00_00_40_00_00_00"
+
+# G.992.5 Annex M
+xtse_xdsl_m2p="00_00_00_00_00_00_04_00"
+
+#
+# ITU-T G.994.1 (06/2012) - Table 2 (Mandatory carrier sets)
+#
+
+# A43
+tone_adsl_a="0x142" # A43C + J43 + A43
+tone_vdsl_a="0x142" # A43C + J43 + A43
+
+# A43 + V43
+tone_adsl_av="0x142" # A43C + J43 + A43
+tone_vdsl_av="0x146" # A43C + J43 + A43 + V43
+
+# B43
+tone_adsl_b="0x81" # B43 + B43c
+tone_vdsl_b="0x1" # B43
+
+# B43 + V43
+tone_adsl_bv="0x81" # B43 + B43c
+tone_vdsl_bv="0x5" # B43 + V43
+
+# create DSL autoboot script. Used for SNR margin tweak and to set MAC address for vectoring error reports
+autoboot_script() {
+    echo "[WaitForConfiguration]={
+locs 0 $1
+dsmmcs $2
+}
+
+[WaitForLinkActivate]={
+}
+
+[WaitForRestart]={
+}
+
+[Common]={
+}" > /tmp/dsl.scr
+}
+
+lowlevel_cfg() {
+       echo "# VRX Low Level Configuration File
+#
+# Parameters must be separated by tabs or spaces.
+# Empty lines and comments will be ignored.
+#
+
+# nFilter
+#
+# NA     = -1
+# OFF    = 0
+# ISDN   = 1
+# POTS   = 2
+# POTS_2 = 3
+# POTS_3 = 4
+#
+#  (dec)
+    -1
+
+# nHsToneGroupMode nHsToneGroup_A       nHsToneGroup_V    nHsToneGroup_AV
+#
+# NA     = -1      NA         = -1      see               see
+# AUTO   = 0       VDSL2_B43  = 0x0001  nHsToneGroup_A    nHsToneGroup_A
+# MANUAL = 1       VDSL2_A43  = 0x0002
+#                  VDSL2_V43  = 0x0004
+#                  VDSL1_V43P = 0x0008
+#                  VDSL1_V43I = 0x0010
+#                  ADSL1_C43  = 0x0020
+#                  ADSL2_J43  = 0x0040
+#                  ADSL2_B43C = 0x0080
+#                  ADSL2_A43C = 0x0100
+#
+#  (dec)           (hex)                (hex)             (hex)
+     1             $1                  $2               0x0
+
+#   nBaseAddr     nIrqNum
+#
+#     (hex)        (dec)
+    0x1e116000      63
+
+# nUtopiaPhyAdr   nUtopiaBusWidth      nPosPhyParity
+#                 default(16b) = 0     NA   = -1
+#                 8-bit        = 1     ODD  = 0
+#                 16-bit       = 2
+#
+#
+#    (hex)            (dec)                (dec)
+      0xFF              0                    0
+
+# bNtrEnable
+#
+#  (dec)
+    0" > /tmp/lowlevel.cfg
+}
+
+get_macaddr() {
+       local name
+       config_get name $1 name
+       [ "$name" = "dsl0" ] && config_get $2 $1 macaddr
+}
+
+service_triggers() {
+       procd_add_reload_trigger network
+}
+
+start_service() {
+       local annex
+       local firmware
+       local tone
+       local tone_adsl
+       local tone_vdsl
+       local xtse
+       local xfer_mode
+       local line_mode
+       local tc_layer
+       local mode
+       local lowlevel
+       local snr
+       local macaddr
+
+       config_load network
+       config_get tone dsl tone
+       config_get annex dsl annex
+       config_get firmware dsl firmware
+       config_get xfer_mode dsl xfer_mode
+       config_get line_mode dsl line_mode
+       config_get snr dsl ds_snr_offset
+       config_foreach get_macaddr device macaddr
+
+       eval "xtse=\"\${xtse_xdsl_$annex}\""
+
+       case "${xfer_mode}" in
+       atm)
+               tc_layer="-T1:0x1:0x1_1:0x1:0x1"
+               ;;
+       ptm)
+               tc_layer="-T2:0x1:0x1_2:0x1:0x1"
+               ;;
+       esac
+
+       case "${line_mode}" in
+       adsl)
+               mode="-M1"
+
+               # mask out VDSL bits when ADSL is requested
+               xtse="${xtse%_*}_00"
+               ;;
+       vdsl)
+               mode="-M2"
+
+               # mask out ADSL bits when VDSL is requested
+               xtse="00_00_00_00_00_00_00_${xtse##*_}"
+               ;;
+       esac
+
+       local annexgpio="/sys/class/gpio/annex"
+       if [ -d "${annexgpio}a" ] && [ -d "${annexgpio}b" ]; then
+               case "${annex}" in
+                       a*|l*|m*)
+                               echo 1 > "${annexgpio}a/value"
+                               echo 0 > "${annexgpio}b/value"
+                               ;;
+                       b*|j*)
+                               echo 0 > "${annexgpio}a/value"
+                               echo 1 > "${annexgpio}b/value"
+                               ;;
+               esac
+       fi
+
+       if [ -z "${firmware}" ]; then
+               # search for the firmware provided by dsl-vrx200-firmware-xdsl-*
+               if grep -qE "system type.*: (VR9|xRX200)" /proc/cpuinfo; then
+                       case "${annex}" in
+                       a*|l*|m*)
+                               if [ -f "/lib/firmware/lantiq-vrx200-a.bin" ]; then
+                                       firmware="/lib/firmware/lantiq-vrx200-a.bin"
+                               elif [ -f "/tmp/lantiq-vrx200-a.bin" ]; then
+                                       firmware="/tmp/lantiq-vrx200-a.bin"
+                               elif [ -f "/lib/firmware/lantiq-vrx200-b.bin" ] && [ -f "/lib/firmware/lantiq-vrx200-b-to-a.bspatch" ]; then
+                                       bspatch /lib/firmware/lantiq-vrx200-b.bin \
+                                               /tmp/lantiq-vrx200-a.bin \
+                                               /lib/firmware/lantiq-vrx200-b-to-a.bspatch
+                                       firmware="/tmp/lantiq-vrx200-a.bin"
+                               else
+                                       echo "firmware for annex a not found"
+                                       return 1
+                               fi
+                               ;;
+                       b*|j*)
+                               if [ -f "/lib/firmware/vr9_dsl_fw_annex_b.bin" ]; then
+                                       firmware="/lib/firmware/vr9_dsl_fw_annex_b.bin"
+                               elif [ -f "/lib/firmware/lantiq-vrx200-b.bin" ]; then
+                                       firmware="/lib/firmware/lantiq-vrx200-b.bin"
+                               elif [ -f "/tmp/lantiq-vrx200-b.bin" ]; then
+                                       firmware="/tmp/lantiq-vrx200-b.bin"
+                               elif [ -f "/lib/firmware/lantiq-vrx200-a.bin" ] && [ -f "/lib/firmware/lantiq-vrx200-a-to-b.bspatch" ]; then
+                                       bspatch /lib/firmware/lantiq-vrx200-a.bin \
+                                               /tmp/lantiq-vrx200-b.bin \
+                                               /lib/firmware/lantiq-vrx200-a-to-b.bspatch
+                                       firmware="/tmp/lantiq-vrx200-b.bin"
+                               else
+                                       echo "firmware for annex b not found"
+                                       return 1
+                               fi
+                               ;;
+                       *)
+                               echo "annex type not supported use a or b"
+                               return 1
+                               ;;
+                       esac
+               fi
+       fi
+
+       [ -z "${firmware}" ] && firmware=/lib/firmware/vdsl.bin
+       [ -f "${firmware}" ] || {
+               echo failed to find $firmware
+               return 1
+       }
+
+       eval "tone_adsl=\"\${tone_adsl_$tone}\""
+       eval "tone_vdsl=\"\${tone_vdsl_$tone}\""
+       [ -n "${tone_adsl}" ] && [ -n "${tone_vdsl}" ] && {
+               lowlevel_cfg "${tone_adsl}" "${tone_vdsl}"
+               lowlevel="-l /tmp/lowlevel.cfg"
+       }
+
+       [ -z "${snr}" ] && snr=0
+       [ -z "${macaddr}" ] && macaddr="00:00:00:00:00:00"
+       autoboot_script "$snr" "$macaddr"
+       autoboot="-a /tmp/dsl.scr -A /tmp/dsl.scr"
+
+       procd_open_instance
+       procd_set_param command /sbin/vdsl_cpe_control \
+                       -i$xtse \
+                       -n /sbin/dsl_notify.sh \
+                       -f ${firmware} \
+                       $lowlevel \
+                       ${mode} \
+                       ${tc_layer} \
+                       $autoboot
+       procd_close_instance
+}
+
+stop_service() {
+       DSL_NOTIFICATION_TYPE="DSL_INTERFACE_STATUS" \
+       DSL_INTERFACE_STATUS="DOWN" \
+               /sbin/dsl_notify.sh
+}
diff --git a/package/network/config/ltq-vdsl-vr9-app/files/dsl_cpe_pipe.sh b/package/network/config/ltq-vdsl-vr9-app/files/dsl_cpe_pipe.sh
new file mode 100755 (executable)
index 0000000..9002b7b
--- /dev/null
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+pipe_no=0
+
+# use specified pipe no
+case "$1" in
+0|1|2)
+pipe_no=$1; shift; ;;
+esac
+
+
+#echo "Call dsl_pipe with $*"
+lock /var/lock/dsl_pipe
+echo $* > /tmp/pipe/dsl_cpe${pipe_no}_cmd
+result=$(cat /tmp/pipe/dsl_cpe${pipe_no}_ack)
+lock -u /var/lock/dsl_pipe
+
+echo "$result"
diff --git a/package/network/config/ltq-vdsl-vr9-app/patches/100-compat.patch b/package/network/config/ltq-vdsl-vr9-app/patches/100-compat.patch
new file mode 100644 (file)
index 0000000..6bc359c
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/src/dsl_cpe_init_cfg.c
++++ b/src/dsl_cpe_init_cfg.c
+@@ -38,7 +38,7 @@ DSL_InitData_t gInitCfgData =
+       DSL_DEV_HS_TONE_GROUP_CLEANED, \
+       DSL_DEV_HS_TONE_GROUP_CLEANED, \
+       DSL_DEV_HS_TONE_GROUP_CLEANED, \
+-      0x1E116000, 0x37, -1),
++      0x1E116000, 0x3f, -1),
+    DSL_CPE_SIC_SET(DSL_TC_ATM, DSL_EMF_TC_CLEANED, DSL_EMF_TC_CLEANED, DSL_SYSTEMIF_MII, \
+                    DSL_TC_EFM, DSL_EMF_TC_CLEANED, DSL_EMF_TC_CLEANED, DSL_SYSTEMIF_MII),
+    DSL_CPE_MAC_CFG_SET(DSL_EFM_SPEED_100, DSL_EFM_DUPLEX_FULL, DSL_EFM_FLOWCTRL_ON, DSL_EFM_AUTONEG_OFF, \
diff --git a/package/network/config/ltq-vdsl-vr9-app/patches/101-musl.patch b/package/network/config/ltq-vdsl-vr9-app/patches/101-musl.patch
new file mode 100644 (file)
index 0000000..d66045d
--- /dev/null
@@ -0,0 +1,10 @@
+--- a/src/dsl_cpe_control.c
++++ b/src/dsl_cpe_control.c
+@@ -11,6 +11,7 @@
+ /*
+ Includes
+ */
++#include <limits.h>
+ #include "dsl_cpe_control.h"
+ #include "dsl_cpe_cli.h"
+ #include "dsl_cpe_cli_console.h"
diff --git a/package/network/config/ltq-vdsl-vr9-app/patches/200-autoboot.patch b/package/network/config/ltq-vdsl-vr9-app/patches/200-autoboot.patch
new file mode 100644 (file)
index 0000000..cc6feb9
--- /dev/null
@@ -0,0 +1,86 @@
+This enables automatic connection after the control daemon is started,
+and also stops the connection on termination.
+
+Using the autoboot restart command is necessary because the stop command
+doesn't actually stop the connection, and would also leave the driver in
+a state where an explicit start command is necessary to connect again.
+
+--- a/src/dsl_cpe_init_cfg.c
++++ b/src/dsl_cpe_init_cfg.c
+@@ -27,7 +27,7 @@ DSL_InitData_t gInitCfgData =
+    DSL_CPE_FW2_SET(DSL_NULL, 0x0),
+    DSL_CPE_XTU_SET(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7),
+    DSL_CPE_LINE_INV_NE_SET(DSL_NULL),
+-   DSL_CPE_AUTOBOOT_CTRL_SET(DSL_AUTOBOOT_CTRL_STOP),
++   DSL_CPE_AUTOBOOT_CTRL_SET(DSL_AUTOBOOT_CTRL_START),
+    DSL_CPE_AUTOBOOT_CFG_SET(DSL_FALSE, DSL_FALSE, DSL_FALSE),
+    DSL_CPE_TEST_MODE_CTRL_SET(DSL_TESTMODE_DISABLE),
+    DSL_CPE_LINE_ACTIVATE_CTRL_SET(DSL_G997_INHIBIT_LDSF, DSL_G997_INHIBIT_ACSF, DSL_G997_NORMAL_STARTUP),
+--- a/src/dsl_cpe_control.c
++++ b/src/dsl_cpe_control.c
+@@ -6515,10 +6515,13 @@ DSL_CPE_STATIC  void DSL_CPE_Termination
+ DSL_CPE_STATIC  DSL_void_t DSL_CPE_Termination (void)
+ {
+ #ifdef INCLUDE_DSL_CPE_CLI_SUPPORT
+-   DSL_int_t nDevice = 0;
+    DSL_char_t buf[32] = "quit";
+ #endif
++   DSL_Error_t nRet = DSL_SUCCESS;
++   DSL_int_t nDevice = 0;
++   DSL_AutobootConfig_t sAutobootCfg;
++   DSL_AutobootControl_t sAutobootCtl;
+    DSL_CPE_Control_Context_t *pCtrlCtx;
+    pCtrlCtx = DSL_CPE_GetGlobalContext();
+@@ -6527,6 +6530,50 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_Termi
+       pCtrlCtx->bRun = DSL_FALSE;
+    }
++   for (nDevice = 0; nDevice < DSL_CPE_MAX_DSL_ENTITIES; ++nDevice)
++   {
++      g_bWaitBeforeConfigWrite[nDevice]    = DSL_TRUE;
++      g_bWaitBeforeLinkActivation[nDevice] = DSL_TRUE;
++      g_bWaitBeforeRestart[nDevice]        = DSL_TRUE;
++
++      g_bAutoContinueWaitBeforeConfigWrite[nDevice]    = DSL_FALSE;
++      g_bAutoContinueWaitBeforeLinkActivation[nDevice] = DSL_FALSE;
++      g_bAutoContinueWaitBeforeRestart[nDevice]        = DSL_FALSE;
++
++      memset(&sAutobootCfg, 0x0, sizeof(DSL_AutobootConfig_t));
++      sAutobootCfg.data.nStateMachineOptions.bWaitBeforeConfigWrite    = DSL_TRUE;
++      sAutobootCfg.data.nStateMachineOptions.bWaitBeforeLinkActivation = DSL_TRUE;
++      sAutobootCfg.data.nStateMachineOptions.bWaitBeforeRestart        = DSL_TRUE;
++
++      nRet = (DSL_Error_t)DSL_CPE_Ioctl(
++         DSL_CPE_GetGlobalContext()->fd[nDevice],
++         DSL_FIO_AUTOBOOT_CONFIG_SET, (DSL_int_t)&sAutobootCfg);
++
++      if (nRet < DSL_SUCCESS)
++      {
++         DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
++            "Autoboot configuration for device (%d) failed!, nRet = %d!"
++            DSL_CPE_CRLF, nDevice, sAutobootCtl.accessCtl.nReturn));
++      }
++
++      memset(&sAutobootCtl, 0, sizeof(DSL_AutobootControl_t));
++      sAutobootCtl.data.nCommand = DSL_AUTOBOOT_CTRL_RESTART;
++
++      nRet = (DSL_Error_t)DSL_CPE_Ioctl(
++         DSL_CPE_GetGlobalContext()->fd[nDevice],
++         DSL_FIO_AUTOBOOT_CONTROL_SET, (DSL_int_t)&sAutobootCtl);
++
++      if (nRet < DSL_SUCCESS)
++      {
++         DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
++            "Autoboot restart for device (%d) failed!, nRet = %d!"
++            DSL_CPE_CRLF, nDevice, sAutobootCtl.accessCtl.nReturn));
++      }
++   }
++
++   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
++      "Autoboot restart executed" DSL_CPE_CRLF));
++
+ #ifdef INCLUDE_DSL_CPE_CLI_SUPPORT
+    for (nDevice = 0; nDevice < DSL_CPE_MAX_DSL_ENTITIES; nDevice++)
+    {
diff --git a/package/network/config/ltq-vdsl-vr9-app/patches/201-sigterm.patch b/package/network/config/ltq-vdsl-vr9-app/patches/201-sigterm.patch
new file mode 100644 (file)
index 0000000..4e97835
--- /dev/null
@@ -0,0 +1,19 @@
+--- a/src/dsl_cpe_control.c
++++ b/src/dsl_cpe_control.c
+@@ -6504,7 +6504,7 @@ DSL_CPE_STATIC  void DSL_CPE_Termination
+    /* ignore the signal, we'll handle by ourself */
+    signal (sig, SIG_IGN);
+-   if (sig == SIGINT)
++   if (sig == SIGINT || sig == SIGTERM)
+    {
+       DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX "terminated" DSL_CPE_CRLF));
+       DSL_CPE_Termination ();
+@@ -6803,6 +6803,7 @@ DSL_int_t dsl_cpe_daemon (
+ #ifndef RTEMS
+    signal (SIGINT, DSL_CPE_TerminationHandler);
++   signal (SIGTERM, DSL_CPE_TerminationHandler);
+ #endif /* RTEMS*/
+    /* Open DSL_CPE_MAX_DSL_ENTITIES devices*/
diff --git a/package/network/config/ltq-vdsl-vr9-app/patches/300-ubus.patch b/package/network/config/ltq-vdsl-vr9-app/patches/300-ubus.patch
new file mode 100644 (file)
index 0000000..d257ca2
--- /dev/null
@@ -0,0 +1,50 @@
+--- a/src/dsl_cpe_control.c
++++ b/src/dsl_cpe_control.c
+@@ -177,6 +177,9 @@ extern DSL_Error_t DSL_CPE_Pipe_StaticRe
+ #endif /* INCLUDE_DSL_RESOURCE_STATISTICS*/
+ #endif
++extern void ubus_init();
++extern void ubus_deinit();
++
+ DSL_char_t *g_sFirmwareName1 = DSL_NULL;
+ DSL_FirmwareFeatures_t g_nFwFeatures1 = {DSL_FW_XDSLMODE_CLEANED, DSL_FW_XDSLFEATURE_CLEANED,
+    DSL_FW_XDSLFEATURE_CLEANED};
+@@ -6806,6 +6809,8 @@ DSL_int_t dsl_cpe_daemon (
+    signal (SIGTERM, DSL_CPE_TerminationHandler);
+ #endif /* RTEMS*/
++   ubus_init();
++
+    /* Open DSL_CPE_MAX_DSL_ENTITIES devices*/
+    for (nDevice = 0; nDevice < DSL_CPE_MAX_DSL_ENTITIES; nDevice++)
+    {
+@@ -7260,6 +7265,7 @@ DSL_int_t dsl_cpe_daemon (
+ #endif /* INCLUDE_DSL_CPE_CLI_SUPPORT */
+ DSL_CPE_CONTROL_EXIT:
++   ubus_deinit();
+ #ifdef INCLUDE_DSL_BONDING
+    DSL_CPE_BND_Stop((DSL_CPE_BND_Context_t*)pCtrlCtx->pBnd);
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -11,7 +11,7 @@ else
+ dsl_cpe_control_common_ldflags =
+ endif
+-dsl_cpe_control_LDADD = -lpthread -lrt
++dsl_cpe_control_LDADD = -lpthread -lrt -lubox -lubus
+ if INCLUDE_DSL_CPE_DTI_SUPPORT
+     dsl_cpe_control_LDADD += -ldti_agent
+@@ -66,7 +66,8 @@ dsl_cpe_control_SOURCES = \
+       dsl_cpe_control.c \
+       dsl_cpe_init_cfg.c \
+       dsl_cpe_linux.c \
+-      dsl_cpe_debug.c
++      dsl_cpe_debug.c \
++      dsl_cpe_ubus.c
+ dsl_cpe_control_SOURCES += \
+       $(dsl_cpe_control_dti_sources)
diff --git a/package/network/config/ltq-vdsl-vr9-app/src/src/dsl_cpe_ubus.c b/package/network/config/ltq-vdsl-vr9-app/src/src/dsl_cpe_ubus.c
new file mode 100644 (file)
index 0000000..61ac770
--- /dev/null
@@ -0,0 +1,883 @@
+// SPDX-License-Identifier: BSD-2-Clause
+/*
+ * Copyright (C) 2020 Andre Heider <a.heider@gmail.com>
+ */
+
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <libubus.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "dsl_cpe_control.h"
+#include <drv_dsl_cpe_api_ioctl.h>
+#ifdef INCLUDE_DSL_CPE_API_VRX
+#include <drv_mei_cpe_interface.h>
+#endif
+
+#define U16(v1, v2) ( \
+       ((uint16_t)(v1) << 8) | \
+       ((uint16_t)(v2)))
+
+#define U32(v1, v2, v3, v4) ( \
+       ((uint32_t)(v1) << 24) | \
+       ((uint32_t)(v2) << 16) | \
+       ((uint32_t)(v3) << 8) | \
+       ((uint32_t)(v4)))
+
+#define STR_CASE(id, text) \
+       case id: \
+               str = text; \
+               break;
+
+#define STR_CASE_MAP(id, text, number) \
+       case id: \
+               str = text; \
+               map = number; \
+               break;
+
+#define IOCTL(type, request) \
+       type out; \
+       memset(&out, 0, sizeof(type)); \
+       if (ioctl(fd, request, &out)) \
+               return;
+
+#define IOCTL_DIR(type, request, dir) \
+       type out; \
+       memset(&out, 0, sizeof(type)); \
+       out.nDirection = dir; \
+       if (ioctl(fd, request, &out)) \
+               return;
+
+#define IOCTL_DIR_DELT(type, request, dir, delt) \
+       type out; \
+       memset(&out, 0, sizeof(type)); \
+       out.nDirection = dir; \
+       out.nDeltDataType = delt; \
+       if (ioctl(fd, request, &out)) \
+               return;
+
+typedef enum {
+       ANNEX_UNKNOWN = 0,
+       ANNEX_A,
+       ANNEX_B,
+       ANNEX_C,
+       ANNEX_I,
+       ANNEX_J,
+       ANNEX_L,
+       ANNEX_M,
+} annex_t;
+
+typedef enum {
+       STD_UNKNOWN = 0,
+       STD_T1_413,
+       STD_TS_101_388,
+       STD_G_992_1,
+       STD_G_992_2,
+       STD_G_992_3,
+       STD_G_992_4,
+       STD_G_992_5,
+       STD_G_993_1,
+       STD_G_993_2,
+} standard_t;
+
+typedef enum {
+       VECTOR_UNKNOWN = 0,
+       VECTOR_OFF,
+       VECTOR_ON_DS,
+       VECTOR_ON_DS_US,
+} vector_t;
+
+typedef enum {
+       PROFILE_UNKNOWN = 0,
+       PROFILE_8A,
+       PROFILE_8B,
+       PROFILE_8C,
+       PROFILE_8D,
+       PROFILE_12A,
+       PROFILE_12B,
+       PROFILE_17A,
+       PROFILE_30A,
+       PROFILE_35B,
+} profile_t;
+
+/* These values are exported via ubus and backwards compability
+ * needs to be kept!
+ */
+enum {
+       LSTATE_MAP_UNKNOWN = -1,
+       LSTATE_MAP_NOT_INITIALIZED,
+       LSTATE_MAP_EXCEPTION,
+       LSTATE_MAP_IDLE,
+       LSTATE_MAP_SILENT,
+       LSTATE_MAP_HANDSHAKE,
+       LSTATE_MAP_FULL_INIT,
+       LSTATE_MAP_SHOWTIME_NO_SYNC,
+       LSTATE_MAP_SHOWTIME_TC_SYNC,
+       LSTATE_MAP_RESYNC,
+};
+
+/* These values are exported via ubus and backwards compability
+ * needs to be kept!
+ */
+enum {
+       PSTATE_MAP_UNKNOWN = -2,
+       PSTATE_MAP_NA,
+       PSTATE_MAP_L0,
+       PSTATE_MAP_L1,
+       PSTATE_MAP_L2,
+       PSTATE_MAP_L3,
+};
+
+static DSL_CPE_ThreadCtrl_t thread;
+static struct ubus_context *ctx;
+static struct blob_buf b;
+
+static inline void m_double(const char *id, double value) {
+       blobmsg_add_double(&b, id, value);
+}
+
+static inline void m_bool(const char *id, bool value) {
+       blobmsg_add_u8(&b, id, value);
+}
+
+static inline void m_u32(const char *id, uint32_t value) {
+       blobmsg_add_u64(&b, id, value);
+}
+
+static inline void m_str(const char *id, const char *value) {
+       blobmsg_add_string(&b, id, value);
+}
+
+static inline void m_db(const char *id, int value) {
+       m_double(id, (double)value / 10);
+}
+
+static inline void m_array(const char *id, const uint8_t *value, uint8_t len) {
+       void *c = blobmsg_open_array(&b, id);
+
+       for (uint8_t i = 0; i < len; ++i)
+               blobmsg_add_u16(&b, "", value[i]);
+
+       blobmsg_close_array(&b, c);
+}
+
+static void m_vendor(const char *id, const uint8_t *value) {
+       // ITU-T T.35: U.S.
+       if (U16(value[0], value[1]) != 0xb500)
+               return;
+
+       const char *str = NULL;
+       switch (U32(value[2], value[3], value[4], value[5])) {
+       STR_CASE(0x414C4342, "Alcatel")
+       STR_CASE(0x414E4456, "Analog Devices")
+       STR_CASE(0x4244434D, "Broadcom")
+       STR_CASE(0x43454E54, "Centillium")
+       STR_CASE(0x4753504E, "Globespan")
+       STR_CASE(0x494B4E53, "Ikanos")
+       STR_CASE(0x4946544E, "Infineon")
+       STR_CASE(0x54535443, "Texas Instruments")
+       STR_CASE(0x544D4D42, "Thomson MultiMedia Broadband")
+       STR_CASE(0x5443544E, "Trend Chip Technologies")
+       STR_CASE(0x53544D49, "ST Micro")
+       };
+
+       if (!str)
+               return;
+
+       if ((value[6] == 0) && (value[7] == 0)) {
+               m_str(id, str);
+               return;
+       }
+
+       char buf[64];
+       sprintf(buf, "%s %d.%d", str, value[6], value[7]);
+       m_str(id, buf);
+
+       return;
+}
+
+annex_t get_annex(const uint8_t *xtse) {
+       if ((xtse[0] & XTSE_1_01_A_T1_413) ||
+           (xtse[0] & XTSE_1_03_A_1_NO) ||
+           (xtse[0] & XTSE_1_04_A_1_O) ||
+           (xtse[1] & XTSE_2_01_A_2_NO) ||
+           (xtse[2] & XTSE_3_03_A_3_NO) ||
+           (xtse[2] & XTSE_3_04_A_3_O) ||
+           (xtse[3] & XTSE_4_01_A_4_NO) ||
+           (xtse[3] & XTSE_4_02_A_4_O) ||
+           (xtse[5] & XTSE_6_01_A_5_NO) ||
+           (xtse[5] & XTSE_6_02_A_5_O) ||
+           (xtse[7] & XTSE_8_01_A))
+               return ANNEX_A;
+
+       if ((xtse[0] & XTSE_1_05_B_1_NO) ||
+           (xtse[0] & XTSE_1_06_B_1_O) ||
+           (xtse[1] & XTSE_2_02_B_2_O) ||
+           (xtse[2] & XTSE_3_05_B_3_NO) ||
+           (xtse[2] & XTSE_3_06_B_3_O) ||
+           (xtse[5] & XTSE_6_03_B_5_NO) ||
+           (xtse[5] & XTSE_6_04_B_5_O) ||
+           (xtse[7] & XTSE_8_02_B))
+               return ANNEX_B;
+
+       if ((xtse[0] & XTSE_1_02_C_TS_101388) ||
+           (xtse[0] & XTSE_1_07_C_1_NO) ||
+           (xtse[0] & XTSE_1_08_C_1_O) ||
+           (xtse[1] & XTSE_2_03_C_2_NO) ||
+           (xtse[1] & XTSE_2_04_C_2_O) ||
+           (xtse[7] & XTSE_8_03_C))
+               return ANNEX_C;
+
+       if ((xtse[3] & XTSE_4_05_I_3_NO) ||
+           (xtse[3] & XTSE_4_06_I_3_O) ||
+           (xtse[4] & XTSE_5_01_I_4_NO) ||
+           (xtse[4] & XTSE_5_02_I_4_O) ||
+           (xtse[5] & XTSE_6_07_I_5_NO) ||
+           (xtse[5] & XTSE_6_08_I_5_O))
+               return ANNEX_I;
+
+       if ((xtse[3] & XTSE_4_07_J_3_NO) ||
+           (xtse[3] & XTSE_4_08_J_3_O) ||
+           (xtse[6] & XTSE_7_01_J_5_NO) ||
+           (xtse[6] & XTSE_7_02_J_5_O))
+               return ANNEX_J;
+
+       if ((xtse[4] & XTSE_5_03_L_3_NO) ||
+           (xtse[4] & XTSE_5_04_L_3_NO) ||
+           (xtse[4] & XTSE_5_05_L_3_O) ||
+           (xtse[4] & XTSE_5_06_L_3_O))
+               return ANNEX_L;
+
+       if ((xtse[4] & XTSE_5_07_M_3_NO) ||
+           (xtse[4] & XTSE_5_08_M_3_O) ||
+           (xtse[6] & XTSE_7_03_M_5_NO) ||
+           (xtse[6] & XTSE_7_04_M_5_O))
+               return ANNEX_M;
+
+       return ANNEX_UNKNOWN;
+}
+
+static standard_t get_standard(const uint8_t *xtse) {
+       if (xtse[0] & XTSE_1_01_A_T1_413)
+               return STD_T1_413;
+
+       if (xtse[0] & XTSE_1_02_C_TS_101388)
+               return STD_TS_101_388;
+
+       if ((xtse[0] & XTSE_1_03_A_1_NO) ||
+           (xtse[0] & XTSE_1_04_A_1_O) ||
+           (xtse[0] & XTSE_1_05_B_1_NO) ||
+           (xtse[0] & XTSE_1_06_B_1_O) ||
+           (xtse[0] & XTSE_1_07_C_1_NO) ||
+           (xtse[0] & XTSE_1_08_C_1_O))
+               return STD_G_992_1;
+
+       if ((xtse[1] & XTSE_2_01_A_2_NO) ||
+           (xtse[1] & XTSE_2_02_B_2_O) ||
+           (xtse[1] & XTSE_2_03_C_2_NO) ||
+           (xtse[1] & XTSE_2_04_C_2_O))
+               return STD_G_992_2;
+
+       if ((xtse[2] & XTSE_3_03_A_3_NO) ||
+           (xtse[2] & XTSE_3_04_A_3_O) ||
+           (xtse[2] & XTSE_3_05_B_3_NO) ||
+           (xtse[2] & XTSE_3_06_B_3_O) ||
+           (xtse[3] & XTSE_4_05_I_3_NO) ||
+           (xtse[3] & XTSE_4_06_I_3_O) ||
+           (xtse[3] & XTSE_4_07_J_3_NO) ||
+           (xtse[3] & XTSE_4_08_J_3_O) ||
+           (xtse[4] & XTSE_5_03_L_3_NO) ||
+           (xtse[4] & XTSE_5_04_L_3_NO) ||
+           (xtse[4] & XTSE_5_05_L_3_O) ||
+           (xtse[4] & XTSE_5_06_L_3_O) ||
+           (xtse[4] & XTSE_5_07_M_3_NO) ||
+           (xtse[4] & XTSE_5_08_M_3_O))
+               return STD_G_992_3;
+
+       if ((xtse[3] & XTSE_4_01_A_4_NO) ||
+           (xtse[3] & XTSE_4_02_A_4_O) ||
+           (xtse[4] & XTSE_5_01_I_4_NO) ||
+           (xtse[4] & XTSE_5_02_I_4_O))
+               return STD_G_992_4;
+
+       if ((xtse[5] & XTSE_6_01_A_5_NO) ||
+           (xtse[5] & XTSE_6_02_A_5_O) ||
+           (xtse[5] & XTSE_6_03_B_5_NO) ||
+           (xtse[5] & XTSE_6_04_B_5_O) ||
+           (xtse[5] & XTSE_6_07_I_5_NO) ||
+           (xtse[5] & XTSE_6_08_I_5_O) ||
+           (xtse[6] & XTSE_7_01_J_5_NO) ||
+           (xtse[6] & XTSE_7_02_J_5_O) ||
+           (xtse[6] & XTSE_7_03_M_5_NO) ||
+           (xtse[6] & XTSE_7_04_M_5_O))
+               return STD_G_992_5;
+
+       if (xtse[7] & XTSE_8_08)
+               return STD_G_993_1;
+
+       if ((xtse[7] & XTSE_8_01_A) ||
+           (xtse[7] & XTSE_8_02_B) ||
+           (xtse[7] & XTSE_8_03_C))
+               return STD_G_993_2;
+
+       return STD_UNKNOWN;
+}
+
+static void version_information(int fd) {
+       IOCTL(DSL_VersionInformation_t, DSL_FIO_VERSION_INFORMATION_GET)
+
+       m_str("api_version", out.data.DSL_DriverVersionApi);
+       m_str("firmware_version", out.data.DSL_ChipSetFWVersion);
+       m_str("chipset", out.data.DSL_ChipSetType);
+       m_str("driver_version", out.data.DSL_DriverVersionMeiBsp);
+}
+
+static void line_state(int fd) {
+       IOCTL(DSL_LineState_t, DSL_FIO_LINE_STATE_GET)
+
+       int map = LSTATE_MAP_UNKNOWN;
+       const char *str;
+       switch (out.data.nLineState) {
+       STR_CASE_MAP(DSL_LINESTATE_NOT_INITIALIZED, "Not initialized", LSTATE_MAP_NOT_INITIALIZED)
+       STR_CASE_MAP(DSL_LINESTATE_EXCEPTION, "Exception", LSTATE_MAP_EXCEPTION)
+       STR_CASE(DSL_LINESTATE_NOT_UPDATED, "Not updated")
+       STR_CASE(DSL_LINESTATE_IDLE_REQUEST, "Idle request")
+       STR_CASE_MAP(DSL_LINESTATE_IDLE, "Idle", LSTATE_MAP_IDLE)
+       STR_CASE(DSL_LINESTATE_SILENT_REQUEST, "Silent request")
+       STR_CASE_MAP(DSL_LINESTATE_SILENT, "Silent", LSTATE_MAP_SILENT)
+       STR_CASE_MAP(DSL_LINESTATE_HANDSHAKE, "Handshake", LSTATE_MAP_HANDSHAKE)
+       STR_CASE(DSL_LINESTATE_BONDING_CLR, "Bonding CLR")
+       STR_CASE_MAP(DSL_LINESTATE_FULL_INIT, "Full init", LSTATE_MAP_FULL_INIT)
+       STR_CASE(DSL_LINESTATE_SHORT_INIT_ENTRY, "Short init entry")
+       STR_CASE(DSL_LINESTATE_DISCOVERY, "Discovery")
+       STR_CASE(DSL_LINESTATE_TRAINING, "Training")
+       STR_CASE(DSL_LINESTATE_ANALYSIS, "Analysis")
+       STR_CASE(DSL_LINESTATE_EXCHANGE, "Exchange")
+       STR_CASE_MAP(DSL_LINESTATE_SHOWTIME_NO_SYNC, "Showtime without TC-Layer sync", LSTATE_MAP_SHOWTIME_NO_SYNC)
+       STR_CASE_MAP(DSL_LINESTATE_SHOWTIME_TC_SYNC, "Showtime with TC-Layer sync", LSTATE_MAP_SHOWTIME_TC_SYNC)
+       STR_CASE(DSL_LINESTATE_FASTRETRAIN, "Fastretrain")
+       STR_CASE(DSL_LINESTATE_LOWPOWER_L2, "Lowpower L2")
+       STR_CASE(DSL_LINESTATE_LOOPDIAGNOSTIC_ACTIVE, "Loopdiagnostic active")
+       STR_CASE(DSL_LINESTATE_LOOPDIAGNOSTIC_DATA_EXCHANGE, "Loopdiagnostic data exchange")
+       STR_CASE(DSL_LINESTATE_LOOPDIAGNOSTIC_DATA_REQUEST, "Loopdiagnostic data request")
+       STR_CASE(DSL_LINESTATE_LOOPDIAGNOSTIC_COMPLETE, "Loopdiagnostic complete")
+       STR_CASE_MAP(DSL_LINESTATE_RESYNC, "Resync", LSTATE_MAP_RESYNC)
+       STR_CASE(DSL_LINESTATE_TEST, "Test")
+       STR_CASE(DSL_LINESTATE_TEST_LOOP, "Test loop")
+       STR_CASE(DSL_LINESTATE_TEST_REVERB, "Test reverb")
+       STR_CASE(DSL_LINESTATE_TEST_MEDLEY, "Test medley")
+       STR_CASE(DSL_LINESTATE_TEST_SHOWTIME_LOCK, "Showtime lock")
+       STR_CASE(DSL_LINESTATE_TEST_QUIET, "Quiet")
+       STR_CASE(DSL_LINESTATE_LOWPOWER_L3, "Lowpower L3")
+#ifndef INCLUDE_DSL_CPE_API_DANUBE
+       STR_CASE(DSL_LINESTATE_DISABLED, "Disabled")
+       STR_CASE(DSL_LINESTATE_T1413, "T1413")
+       STR_CASE(DSL_LINESTATE_ORDERLY_SHUTDOWN_REQUEST, "Orderly shutdown request")
+       STR_CASE(DSL_LINESTATE_ORDERLY_SHUTDOWN, "Orderly shutdown")
+       STR_CASE(DSL_LINESTATE_TEST_FILTERDETECTION_ACTIVE, "Test filterdetection active")
+       STR_CASE(DSL_LINESTATE_TEST_FILTERDETECTION_COMPLETE, "Test filterdetection complete")
+#endif
+       default:
+               str = NULL;
+               break;
+       };
+
+       if (str)
+               m_str("state", str);
+
+       if (map != LSTATE_MAP_UNKNOWN )
+               m_u32("state_num", map);
+
+       m_bool("up", out.data.nLineState == DSL_LINESTATE_SHOWTIME_TC_SYNC);
+}
+
+static void pm_channel_counters_showtime(int fd) {
+       IOCTL_DIR(DSL_PM_ChannelCounters_t, DSL_FIO_PM_CHANNEL_COUNTERS_SHOWTIME_GET, DSL_NEAR_END);
+
+       m_u32("uptime", out.interval.nElapsedTime);
+}
+
+static void g997_line_inventory(int fd) {
+       IOCTL_DIR(DSL_G997_LineInventory_t, DSL_FIO_G997_LINE_INVENTORY_GET, DSL_DOWNSTREAM)
+
+       m_array("vendor_id", out.data.G994VendorID, DSL_G997_LI_MAXLEN_VENDOR_ID);
+       m_vendor("vendor", out.data.G994VendorID);
+       m_array("system_vendor_id", out.data.SystemVendorID, DSL_G997_LI_MAXLEN_VENDOR_ID);
+       m_vendor("system_vendor", out.data.SystemVendorID);
+       m_array("version", out.data.VersionNumber, DSL_G997_LI_MAXLEN_VERSION);
+       m_array("serial", out.data.SerialNumber, DSL_G997_LI_MAXLEN_SERIAL);
+}
+
+static void g997_power_management_status(int fd) {
+       IOCTL(DSL_G997_PowerManagementStatus_t, DSL_FIO_G997_POWER_MANAGEMENT_STATUS_GET)
+
+       int map = PSTATE_MAP_UNKNOWN;
+       const char *str;
+       switch (out.data.nPowerManagementStatus) {
+       STR_CASE_MAP(DSL_G997_PMS_NA, "Power management state is not available", PSTATE_MAP_NA)
+       STR_CASE_MAP(DSL_G997_PMS_L0, "L0 - Synchronized", PSTATE_MAP_L0)
+       STR_CASE_MAP(DSL_G997_PMS_L1, "L1 - Power Down Data transmission (G.992.2)", PSTATE_MAP_L1)
+       STR_CASE_MAP(DSL_G997_PMS_L2, "L2 - Power Down Data transmission (G.992.3 and G.992.4)", PSTATE_MAP_L2)
+       STR_CASE_MAP(DSL_G997_PMS_L3, "L3 - No power", PSTATE_MAP_L3)
+       default:
+               str = NULL;
+               break;
+       };
+
+       if (str)
+               m_str("power_state", str);
+
+       if (map != PSTATE_MAP_UNKNOWN)
+               m_u32("power_state_num", map);
+}
+
+static void g997_xtu_system_enabling(int fd, standard_t *standard) {
+       IOCTL(DSL_G997_XTUSystemEnabling_t, DSL_FIO_G997_XTU_SYSTEM_ENABLING_STATUS_GET)
+
+       m_array("xtse", out.data.XTSE, DSL_G997_NUM_XTSE_OCTETS);
+
+       const char *str;
+       switch (get_annex(out.data.XTSE)) {
+       STR_CASE(ANNEX_A, "A")
+       STR_CASE(ANNEX_B, "B")
+       STR_CASE(ANNEX_C, "C")
+       STR_CASE(ANNEX_I, "I")
+       STR_CASE(ANNEX_J, "J")
+       STR_CASE(ANNEX_L, "L")
+       STR_CASE(ANNEX_M, "M")
+       default:
+               str = NULL;
+               break;
+       };
+       if (str)
+               m_str("annex", str);
+
+       *standard = get_standard(out.data.XTSE);
+
+       switch (*standard) {
+       STR_CASE(STD_T1_413, "T1.413")
+       STR_CASE(STD_TS_101_388, "TS 101 388")
+       STR_CASE(STD_G_992_1, "G.992.1")
+       STR_CASE(STD_G_992_2, "G.992.2")
+       STR_CASE(STD_G_992_3, "G.992.3")
+       STR_CASE(STD_G_992_4, "G.992.4")
+       STR_CASE(STD_G_992_5, "G.992.5")
+       STR_CASE(STD_G_993_1, "G.993.1")
+       STR_CASE(STD_G_993_2, "G.993.2")
+       default:
+               str = NULL;
+               break;
+       }
+       if (str)
+               m_str("standard", str);
+}
+
+static void get_vector_status(int fd, vector_t *status) {
+       *status = VECTOR_UNKNOWN;
+
+#ifdef INCLUDE_DSL_CPE_API_VRX
+       if (fd < 0)
+               return;
+
+       IOCTL(IOCTL_MEI_dsmStatus_t, FIO_MEI_DSM_STATUS_GET);
+
+       switch (out.eVectorStatus) {
+       case e_MEI_VECTOR_STAT_OFF:
+               *status = VECTOR_OFF;
+               break;
+       case e_MEI_VECTOR_STAT_ON_DS:
+               *status = VECTOR_ON_DS;
+               break;
+       case e_MEI_VECTOR_STAT_ON_DS_US:
+               *status = VECTOR_ON_DS_US;
+               break;
+       default:
+               break;
+       };
+#endif
+}
+
+static void vector_erb(int fd) {
+#ifdef INCLUDE_DSL_CPE_API_VRX
+       if (fd < 0)
+               return;
+
+       IOCTL(IOCTL_MEI_dsmStatistics_t, FIO_MEI_DSM_STATISTICS_GET);
+
+       m_u32("sent", out.n_processed);
+       m_u32("discarded", out.n_fw_dropped_size + out.n_mei_dropped_size + out.n_mei_dropped_no_pp_cb + out.n_pp_dropped);
+#endif
+}
+
+static void band_plan_status(int fd, profile_t *profile) {
+#if (INCLUDE_DSL_CPE_API_VDSL_SUPPORT == 1)
+       IOCTL(DSL_BandPlanStatus_t, DSL_FIO_BAND_PLAN_STATUS_GET)
+
+       switch (out.data.nProfile) {
+       case DSL_PROFILE_8A:
+               *profile = PROFILE_8A;
+               break;
+       case DSL_PROFILE_8B:
+               *profile = PROFILE_8B;
+               break;
+       case DSL_PROFILE_8C:
+               *profile = PROFILE_8C;
+               break;
+       case DSL_PROFILE_8D:
+               *profile = PROFILE_8D;
+               break;
+       case DSL_PROFILE_12A:
+               *profile = PROFILE_12A;
+               break;
+       case DSL_PROFILE_12B:
+               *profile = PROFILE_12B;
+               break;
+       case DSL_PROFILE_17A:
+               *profile = PROFILE_17A;
+               break;
+       case DSL_PROFILE_30A:
+               *profile = PROFILE_30A;
+               break;
+       case DSL_PROFILE_35B:
+               *profile = PROFILE_35B;
+               break;
+       default:
+               *profile = PROFILE_UNKNOWN;
+               break;
+       };
+
+       const char *str;
+       switch (*profile) {
+       STR_CASE(PROFILE_8A, "8a")
+       STR_CASE(PROFILE_8B, "8b")
+       STR_CASE(PROFILE_8C, "8c")
+       STR_CASE(PROFILE_8D, "8d")
+       STR_CASE(PROFILE_12A, "12a")
+       STR_CASE(PROFILE_12B, "12b")
+       STR_CASE(PROFILE_17A, "17a")
+       STR_CASE(PROFILE_30A, "30a")
+       STR_CASE(PROFILE_35B, "35b")
+       default:
+               str = NULL;
+               break;
+       };
+       if (str)
+               m_str("profile", str);
+#endif
+}
+
+static void line_feature_config(int fd, DSL_AccessDir_t direction) {
+       IOCTL_DIR(DSL_LineFeature_t, DSL_FIO_LINE_FEATURE_STATUS_GET, direction)
+
+       m_bool("trellis", out.data.bTrellisEnable);
+       m_bool("bitswap", out.data.bBitswapEnable);
+       m_bool("retx", out.data.bReTxEnable);
+       m_bool("virtual_noise", out.data.bVirtualNoiseSupport);
+}
+
+static void g997_channel_status(int fd, DSL_AccessDir_t direction) {
+       IOCTL_DIR(DSL_G997_ChannelStatus_t, DSL_FIO_G997_CHANNEL_STATUS_GET, direction);
+
+       m_u32("interleave_delay", out.data.ActualInterleaveDelay * 10);
+#ifndef INCLUDE_DSL_CPE_API_DANUBE
+       // prefer ACTNDR, see comments in drv_dsl_cpe_api_g997.h
+       m_u32("data_rate", out.data.ActualNetDataRate);
+#else
+       m_u32("data_rate", out.data.ActualDataRate);
+#endif
+}
+
+static void g997_line_status(int fd, DSL_AccessDir_t direction) {
+       IOCTL_DIR_DELT(DSL_G997_LineStatus_t, DSL_FIO_G997_LINE_STATUS_GET, direction, DSL_DELT_DATA_SHOWTIME);
+
+       m_db("latn", out.data.LATN);
+       m_db("satn", out.data.SATN);
+       m_db("snr", out.data.SNR);
+       m_db("actps", out.data.ACTPS);
+       m_db("actatp", out.data.ACTATP);
+       m_u32("attndr", out.data.ATTNDR);
+}
+
+static void pm_line_sec_counters_total(int fd, DSL_XTUDir_t direction) {
+       IOCTL_DIR(DSL_PM_LineSecCountersTotal_t, DSL_FIO_PM_LINE_SEC_COUNTERS_TOTAL_GET, direction)
+
+       m_u32("es", out.data.nES);
+       m_u32("ses", out.data.nSES);
+       m_u32("loss", out.data.nLOSS);
+       m_u32("uas", out.data.nUAS);
+       m_u32("lofs", out.data.nLOFS);
+#ifndef INCLUDE_DSL_CPE_API_DANUBE
+       m_u32("fecs", out.data.nFECS);
+#endif
+}
+
+static void pm_data_path_counters_total(int fd, DSL_XTUDir_t direction) {
+       IOCTL_DIR(DSL_PM_DataPathCountersTotal_t, DSL_FIO_PM_DATA_PATH_COUNTERS_TOTAL_GET, direction);
+
+       m_u32("hec", out.data.nHEC);
+       m_u32("ibe", out.data.nIBE);
+       m_u32("crc_p", out.data.nCRC_P);
+       m_u32("crcp_p", out.data.nCRCP_P);
+       m_u32("cv_p", out.data.nCV_P);
+       m_u32("cvp_p", out.data.nCVP_P);
+}
+
+static void retx_statistics(int fd, DSL_XTUDir_t direction) {
+#ifdef INCLUDE_DSL_CPE_PM_RETX_COUNTERS
+#ifdef INCLUDE_DSL_CPE_PM_RETX_THRESHOLDS
+       IOCTL_DIR(DSL_ReTxStatistics_t, DSL_FIO_RETX_STATISTICS_GET, direction);
+
+       m_u32("rx_corrupted", out.data.nRxCorruptedTotal);
+       m_u32("rx_uncorrected_protected", out.data.nRxUncorrectedProtected);
+       m_u32("rx_retransmitted", out.data.nRxRetransmitted);
+       m_u32("rx_corrected", out.data.nRxCorrected);
+       m_u32("tx_retransmitted", out.data.nTxRetransmitted);
+#endif
+#endif
+}
+
+static void describe_mode(standard_t standard, profile_t profile, vector_t vector) {
+       char buf[128];
+
+       switch (standard) {
+       case STD_T1_413:
+               strcpy(buf, "T1.413");
+               break;
+       case STD_TS_101_388:
+               strcpy(buf, "TS 101 388");
+               break;
+       case STD_G_992_1:
+               strcpy(buf, "G.992.1 (ADSL)");
+               break;
+       case STD_G_992_2:
+               strcpy(buf, "G.992.2 (ADSL lite)");
+               break;
+       case STD_G_992_3:
+               strcpy(buf, "G.992.3 (ADSL2)");
+               break;
+       case STD_G_992_4:
+               strcpy(buf, "G.992.4 (ADSL2 lite)");
+               break;
+       case STD_G_992_5:
+               strcpy(buf, "G.992.5 (ADSL2+)");
+               break;
+       case STD_G_993_1:
+               strcpy(buf, "G.993.1 (VDSL)");
+               break;
+       case STD_G_993_2:
+               strcpy(buf, "G.993.2 (VDSL2");
+
+               switch (profile) {
+               case PROFILE_8A:
+                       strcat(buf, ", Profile 8a");
+                       break;
+               case PROFILE_8B:
+                       strcat(buf, ", Profile 8b");
+                       break;
+               case PROFILE_8C:
+                       strcat(buf, ", Profile 8c");
+                       break;
+               case PROFILE_8D:
+                       strcat(buf, ", Profile 8d");
+                       break;
+               case PROFILE_12A:
+                       strcat(buf, ", Profile 12a");
+                       break;
+               case PROFILE_12B:
+                       strcat(buf, ", Profile 12b");
+                       break;
+               case PROFILE_17A:
+                       strcat(buf, ", Profile 17a");
+                       break;
+               case PROFILE_30A:
+                       strcat(buf, ", Profile 30a");
+                       break;
+               case PROFILE_35B:
+                       strcat(buf, ", Profile 35b");
+                       break;
+               default:
+                       break;
+               };
+
+               switch (vector) {
+               case VECTOR_ON_DS:
+                       strcat(buf, ", with downstream vectoring");
+                       break;
+               case VECTOR_ON_DS_US:
+                       strcat(buf, ", with down- and upstream vectoring");
+                       break;
+               default:
+                       break;
+               };
+
+               strcat(buf, ")");
+               break;
+       default:
+               return;
+       };
+
+       m_str("mode", buf);
+}
+
+static int metrics(struct ubus_context *ctx, struct ubus_object *obj,
+                  struct ubus_request_data *req, const char *method,
+                  struct blob_attr *msg)
+{
+       int fd, fd_mei;
+       void *c, *c2;
+       standard_t standard = STD_UNKNOWN;
+       profile_t profile = PROFILE_UNKNOWN;
+       vector_t vector = VECTOR_UNKNOWN;
+
+#ifndef INCLUDE_DSL_CPE_API_DANUBE
+       fd = open(DSL_CPE_DEVICE_NAME "/0", O_RDWR, 0644);
+#else
+       fd = open(DSL_CPE_DEVICE_NAME, O_RDWR, 0644);
+#endif
+       if (fd < 0)
+               return UBUS_STATUS_UNKNOWN_ERROR;
+
+#ifdef INCLUDE_DSL_CPE_API_VRX
+       fd_mei = open(DSL_CPE_DSL_LOW_DEV "/0", O_RDWR, 0644);
+#else
+       fd_mei = -1;
+#endif
+
+       blob_buf_init(&b, 0);
+
+       version_information(fd);
+       line_state(fd);
+       pm_channel_counters_showtime(fd);
+
+       c = blobmsg_open_table(&b, "atu_c");
+       g997_line_inventory(fd);
+       blobmsg_close_table(&b, c);
+
+       g997_power_management_status(fd);
+       g997_xtu_system_enabling(fd, &standard);
+
+       if (standard == STD_G_993_2) {
+               band_plan_status(fd, &profile);
+               get_vector_status(fd_mei, &vector);
+       }
+
+       describe_mode(standard, profile, vector);
+
+       c = blobmsg_open_table(&b, "upstream");
+       switch (vector) {
+       case VECTOR_OFF:
+               m_bool("vector", false);
+               break;
+       case VECTOR_ON_DS_US:
+               m_bool("vector", true);
+               break;
+       default:
+               break;
+       };
+       line_feature_config(fd, DSL_UPSTREAM);
+       g997_channel_status(fd, DSL_UPSTREAM);
+       g997_line_status(fd, DSL_UPSTREAM);
+       blobmsg_close_table(&b, c);
+
+       c = blobmsg_open_table(&b, "downstream");
+       switch (vector) {
+       case VECTOR_OFF:
+               m_bool("vector", false);
+               break;
+       case VECTOR_ON_DS:
+       case VECTOR_ON_DS_US:
+               m_bool("vector", true);
+               break;
+       default:
+               break;
+       };
+       line_feature_config(fd, DSL_DOWNSTREAM);
+       g997_channel_status(fd, DSL_DOWNSTREAM);
+       g997_line_status(fd, DSL_DOWNSTREAM);
+       blobmsg_close_table(&b, c);
+
+       c = blobmsg_open_table(&b, "errors");
+       c2 = blobmsg_open_table(&b, "near");
+       pm_line_sec_counters_total(fd, DSL_NEAR_END);
+       pm_data_path_counters_total(fd, DSL_NEAR_END);
+       retx_statistics(fd, DSL_NEAR_END);
+       blobmsg_close_table(&b, c2);
+
+       c2 = blobmsg_open_table(&b, "far");
+       pm_line_sec_counters_total(fd, DSL_FAR_END);
+       pm_data_path_counters_total(fd, DSL_FAR_END);
+       retx_statistics(fd, DSL_FAR_END);
+       blobmsg_close_table(&b, c2);
+       blobmsg_close_table(&b, c);
+
+       switch (vector) {
+       case VECTOR_ON_DS:
+       case VECTOR_ON_DS_US:
+               c = blobmsg_open_table(&b, "erb");
+               vector_erb(fd_mei);
+               blobmsg_close_table(&b, c);
+               break;
+       default:
+               break;
+       };
+
+       ubus_send_reply(ctx, req, b.head);
+
+       if (fd_mei >= 0)
+               close(fd_mei);
+       close(fd);
+
+       return 0;
+}
+
+static const struct ubus_method dsl_methods[] = {
+       UBUS_METHOD_NOARG("metrics", metrics),
+};
+
+static struct ubus_object_type dsl_object_type =
+       UBUS_OBJECT_TYPE("dsl", dsl_methods);
+
+static struct ubus_object dsl_object = {
+       .name = "dsl",
+       .type = &dsl_object_type,
+       .methods = dsl_methods,
+       .n_methods = ARRAY_SIZE(dsl_methods),
+};
+
+static DSL_int_t ubus_main(DSL_CPE_Thread_Params_t *params) {
+       uloop_run();
+       return 0;
+}
+
+void ubus_init() {
+       uloop_init();
+
+       ctx = ubus_connect(NULL);
+       if (!ctx)
+               return;
+
+       if (ubus_add_object(ctx, &dsl_object)) {
+               ubus_free(ctx);
+               ctx = NULL;
+               return;
+       }
+
+       ubus_add_uloop(ctx);
+
+       DSL_CPE_ThreadInit(&thread, "ubus", ubus_main, DSL_CPE_PIPE_STACK_SIZE, DSL_CPE_PIPE_PRIORITY, 0, 0);
+}
+
+void ubus_deinit() {
+       if (!ctx)
+               return;
+
+       ubus_free(ctx);
+       uloop_done();
+
+       DSL_CPE_ThreadShutdown(&thread, 1000);
+}
index 8813de8d0452780334bc5a02f77e2f70055a9807..0f119edd6fa50a986bc815ee86b7a81f1c72c895 100644 (file)
@@ -12,7 +12,7 @@ DEFAULT_PACKAGES+=kmod-leds-gpio \
        kmod-ltq-atm-vr9 \
        kmod-ltq-deu-vr9 \
        kmod-ltq-ptm-vr9 \
        kmod-ltq-atm-vr9 \
        kmod-ltq-deu-vr9 \
        kmod-ltq-ptm-vr9 \
-       ltq-vdsl-app \
+       ltq-vdsl-vr9-app \
        dsl-vrx200-firmware-xdsl-a \
        dsl-vrx200-firmware-xdsl-b-patch \
        ppp-mod-pppoa
        dsl-vrx200-firmware-xdsl-a \
        dsl-vrx200-firmware-xdsl-b-patch \
        ppp-mod-pppoa