ltq-vdsl-app: make the dsl_control application stop cleanly
[openwrt/openwrt.git] / package / network / config / ltq-vdsl-app / files / dsl_control
1 #!/bin/sh /etc/rc.common
2 # Copyright (C) 2012 OpenWrt.org
3
4 # needs to start before the atm layer which starts at 50
5 START=48
6 USE_PROCD=1
7
8 EXTRA_COMMANDS="status lucistat"
9 EXTRA_HELP=" status Get DSL status information
10 lucistat Get status information if lua friendly format"
11
12 [ -f /lib/functions/lantiq_dsl.sh ] && . /lib/functions/lantiq_dsl.sh
13
14 #
15 # ITU-T G.997.1 (06/2012) - Section 7.3.1.1.1 (xTU transmission system enabling (XTSE))
16 # ITU-T G.997.1 Amendment 2 (04/2013) - Section 2.1 - (Vectoring mode enable (VECTORMODE_ENABLE))
17 #
18 # G.992.1 Annex A
19 # G.992.3 Annex A / L-US1 / L_US-2 / M
20 # G.992.5 Annex A / M
21 # G.993.2 Annex A/B/C
22 # G.993.5 Annex A/B/C
23 xtse_xdsl_a="05_00_04_00_4C_01_04_0F"
24
25 # G.992.1 Annex B
26 # G.992.3 Annex B
27 # G.992.5 Annex B
28 # G.993.2 Annex A/B/C
29 # G.993.5 Annex A/B/C
30 xtse_xdsl_b="10_00_10_00_00_04_00_0F"
31
32 # G.992.1 Annex B
33 # G.992.3 Annex B
34 # G.992.3 Annex J
35 # G.992.5 Annex B
36 # G.992.5 Annex J
37 # G.993.2 Annex A/B/C
38 # G.993.5 Annex A/B/C
39 xtse_xdsl_j="10_00_10_40_00_04_01_0F"
40
41 #
42 # ITU-T G.994.1 (06/2012) - Table 2 (Mandatory carrier sets)
43 #
44
45 # A43
46 tone_adsl_a="0x142" # A43C + J43 + A43
47 tone_vdsl_a="0x142" # A43C + J43 + A43
48
49 # A43 + V43
50 tone_adsl_av="0x142" # A43C + J43 + A43
51 tone_vdsl_av="0x146" # A43C + J43 + A43 + V43
52
53 # B43
54 tone_adsl_b="0x81" # B43 + B43c
55 tone_vdsl_b="0x1" # B43
56
57 # B43 + V43
58 tone_adsl_bv="0x81" # B43 + B43c
59 tone_vdsl_bv="0x5" # B43 + V43
60
61 lowlevel_cfg() {
62 echo "# VRX Low Level Configuration File
63 #
64 # Parameters must be separated by tabs or spaces.
65 # Empty lines and comments will be ignored.
66 #
67
68 # nFilter
69 #
70 # NA = -1
71 # OFF = 0
72 # ISDN = 1
73 # POTS = 2
74 # POTS_2 = 3
75 # POTS_3 = 4
76 #
77 # (dec)
78 -1
79
80 # nHsToneGroupMode nHsToneGroup_A nHsToneGroup_V nHsToneGroup_AV
81 #
82 # NA = -1 NA = -1 see see
83 # AUTO = 0 VDSL2_B43 = 0x0001 nHsToneGroup_A nHsToneGroup_A
84 # MANUAL = 1 VDSL2_A43 = 0x0002
85 # VDSL2_V43 = 0x0004
86 # VDSL1_V43P = 0x0008
87 # VDSL1_V43I = 0x0010
88 # ADSL1_C43 = 0x0020
89 # ADSL2_J43 = 0x0040
90 # ADSL2_B43C = 0x0080
91 # ADSL2_A43C = 0x0100
92 #
93 # (dec) (hex) (hex) (hex)
94 1 $1 $2 0x0
95
96 # nBaseAddr nIrqNum
97 #
98 # (hex) (dec)
99 0x1e116000 63
100
101 # nUtopiaPhyAdr nUtopiaBusWidth nPosPhyParity
102 # default(16b) = 0 NA = -1
103 # 8-bit = 1 ODD = 0
104 # 16-bit = 2
105 #
106 #
107 # (hex) (dec) (dec)
108 0xFF 0 0
109
110 # bNtrEnable
111 #
112 # (dec)
113 0" > /tmp/lowlevel.cfg
114 }
115
116 service_triggers() {
117 procd_add_reload_trigger network
118 }
119
120 start_service() {
121 local annex
122 local firmware
123 local tone
124 local tone_adsl
125 local tone_vdsl
126 local xtse
127 local mode
128 local lowlevel
129
130 config_load network
131 config_get tone dsl tone
132 config_get annex dsl annex
133 config_get firmware dsl firmware
134 config_get xfer_mode dsl xfer_mode
135
136 eval "xtse=\"\${xtse_xdsl_$annex}\""
137
138 [ -z "${xfer_mode}" ] && xfer_mode=ptm
139
140 case "${xfer_mode}" in
141 atm)
142 LOAD=ltq_atm_vr9
143 UNLOAD=ltq_ptm_vr9
144 mode=1
145
146 # mask out VDSL bits when ATM is requested
147 xtse="${xtse%_*}_00"
148 ;;
149 *)
150 LOAD=ltq_ptm_vr9
151 UNLOAD=ltq_atm_vr9
152 mode=2
153 ;;
154 esac
155
156 if [ -z "${firmware}" ]; then
157 # search for the firmware provided by dsl-vrx200-firmware-xdsl-*
158 if grep -qE "system type.*: (VR9|xRX200)" /proc/cpuinfo; then
159 case "${annex}" in
160 a|l|m)
161 if [ -f "/lib/firmware/lantiq-vrx200-a.bin" ]; then
162 firmware="/lib/firmware/lantiq-vrx200-a.bin"
163 elif [ -f "/tmp/lantiq-vrx200-a.bin" ]; then
164 firmware="/tmp/lantiq-vrx200-a.bin"
165 elif [ -f "/lib/firmware/lantiq-vrx200-b.bin" ] && [ -f "/lib/firmware/lantiq-vrx200-b-to-a.bspatch" ]; then
166 bspatch /lib/firmware/lantiq-vrx200-b.bin \
167 /tmp/lantiq-vrx200-a.bin \
168 /lib/firmware/lantiq-vrx200-b-to-a.bspatch
169 firmware="/tmp/lantiq-vrx200-a.bin"
170 else
171 echo "firmware for annex a not found"
172 return 1
173 fi
174 ;;
175 b|j)
176 if [ -f "/lib/firmware/lantiq-vrx200-b.bin" ]; then
177 firmware="/lib/firmware/lantiq-vrx200-b.bin"
178 elif [ -f "/tmp/lantiq-vrx200-b.bin" ]; then
179 firmware="/tmp/lantiq-vrx200-b.bin"
180 elif [ -f "/lib/firmware/lantiq-vrx200-a.bin" ] && [ -f "/lib/firmware/lantiq-vrx200-a-to-b.bspatch" ]; then
181 bspatch /lib/firmware/lantiq-vrx200-a.bin \
182 /tmp/lantiq-vrx200-b.bin \
183 /lib/firmware/lantiq-vrx200-a-to-b.bspatch
184 firmware="/tmp/lantiq-vrx200-b.bin"
185 else
186 echo "firmware for annex b not found"
187 return 1
188 fi
189 ;;
190 *)
191 echo "annex type not supported use a or b"
192 return 1
193 ;;
194 esac
195 fi
196 fi
197
198 [ -z "${firmware}" ] && firmware=/lib/firmware/vdsl.bin
199 [ -f "${firmware}" ] || {
200 echo failed to find $firmware
201 return 1
202 }
203
204 eval "tone_adsl=\"\${tone_adsl_$tone}\""
205 eval "tone_vdsl=\"\${tone_vdsl_$tone}\""
206 [ -n "${tone_adsl}" ] && [ -n "${tone_vdsl}" ] && {
207 lowlevel_cfg "${tone_adsl}" "${tone_vdsl}"
208 lowlevel="-l /tmp/lowlevel.cfg"
209 }
210
211 procd_open_instance
212 procd_set_param command /sbin/vdsl_cpe_control_wrapper \
213 -i$xtse \
214 -n /sbin/dsl_notify.sh \
215 -f ${firmware} \
216 $lowlevel \
217 -M ${mode}
218 procd_append_param env "LOAD=$LOAD" "UNLOAD=$UNLOAD"
219 procd_close_instance
220 }
221
222 stop_service() {
223 # do not use dsl_cmd to not block when this is locked up by some other proess
224 echo quit > /tmp/pipe/dsl_cpe0_cmd
225 DSL_NOTIFICATION_TYPE="DSL_INTERFACE_STATUS" \
226 DSL_INTERFACE_STATUS="DOWN" \
227 /sbin/dsl_notify.sh
228 }