lantiq: set up DSL front-end GPIOs if they exist
[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.2 Annex A
20 # G.992.3 Annex A / L-US1 / L_US-2 / M
21 # G.992.5 Annex A / M
22 # G.993.2 Annex A/B/C
23 # G.993.5 Annex A/B/C
24 xtse_xdsl_a="05_01_04_00_4C_01_04_07"
25
26 # G.992.1 Annex B
27 # G.992.3 Annex B
28 # G.992.5 Annex B
29 # G.993.2 Annex A/B/C
30 # G.993.5 Annex A/B/C
31 xtse_xdsl_b="10_00_10_00_00_04_00_07"
32
33 # G.992.1 Annex B
34 # G.992.3 Annex B
35 # G.992.3 Annex J
36 # G.992.5 Annex B
37 # G.992.5 Annex J
38 # G.993.2 Annex A/B/C
39 # G.993.5 Annex A/B/C
40 xtse_xdsl_j="10_00_10_40_00_04_01_07"
41
42 # G.992.1 Annex B
43 xtse_xdsl_bdmt="10_00_00_00_00_00_00_00"
44
45 # G.992.3 Annex B
46 xtse_xdsl_b2="00_00_10_00_00_00_00_00"
47
48 # G.992.5 Annex B
49 xtse_xdsl_b2p="00_00_00_00_00_04_00_00"
50
51 # ANSI T1.413
52 xtse_xdsl_at1="01_00_00_00_00_00_00_00"
53
54 # G.992.2 Annex A
55 xtse_xdsl_alite="00_01_00_00_00_00_00_00"
56
57 # G.992.1 Annex A
58 xtse_xdsl_admt="04_00_00_00_00_00_00_00"
59
60 # G.992.3 Annex A
61 xtse_xdsl_a2="00_00_04_00_00_00_00_00"
62
63 # G.992.5 Annex A
64 xtse_xdsl_a2p="00_00_00_00_00_01_00_00"
65
66 # G.992.3 Annex L
67 xtse_xdsl_l="00_00_00_00_0C_00_00_00"
68
69 # G.992.3 Annex M
70 # G.992.5 Annex M
71 xtse_xdsl_m="00_00_00_00_40_00_04_00"
72
73 # G.992.3 Annex M
74 xtse_xdsl_m2="00_00_00_00_40_00_00_00"
75
76 # G.992.5 Annex M
77 xtse_xdsl_m2p="00_00_00_00_00_00_04_00"
78
79 #
80 # ITU-T G.994.1 (06/2012) - Table 2 (Mandatory carrier sets)
81 #
82
83 # A43
84 tone_adsl_a="0x142" # A43C + J43 + A43
85 tone_vdsl_a="0x142" # A43C + J43 + A43
86
87 # A43 + V43
88 tone_adsl_av="0x142" # A43C + J43 + A43
89 tone_vdsl_av="0x146" # A43C + J43 + A43 + V43
90
91 # B43
92 tone_adsl_b="0x81" # B43 + B43c
93 tone_vdsl_b="0x1" # B43
94
95 # B43 + V43
96 tone_adsl_bv="0x81" # B43 + B43c
97 tone_vdsl_bv="0x5" # B43 + V43
98
99 # create ADSL autoboot script. Used for SNR margin tweak
100 autoboot_script() {
101 echo "[WaitForConfiguration]={
102 locs 0 $1
103 }
104
105 [WaitForLinkActivate]={
106 }
107
108 [WaitForRestart]={
109 }
110
111 [Common]={
112 }" > /tmp/adsl.scr
113 }
114
115 lowlevel_cfg() {
116 echo "# VRX Low Level Configuration File
117 #
118 # Parameters must be separated by tabs or spaces.
119 # Empty lines and comments will be ignored.
120 #
121
122 # nFilter
123 #
124 # NA = -1
125 # OFF = 0
126 # ISDN = 1
127 # POTS = 2
128 # POTS_2 = 3
129 # POTS_3 = 4
130 #
131 # (dec)
132 -1
133
134 # nHsToneGroupMode nHsToneGroup_A nHsToneGroup_V nHsToneGroup_AV
135 #
136 # NA = -1 NA = -1 see see
137 # AUTO = 0 VDSL2_B43 = 0x0001 nHsToneGroup_A nHsToneGroup_A
138 # MANUAL = 1 VDSL2_A43 = 0x0002
139 # VDSL2_V43 = 0x0004
140 # VDSL1_V43P = 0x0008
141 # VDSL1_V43I = 0x0010
142 # ADSL1_C43 = 0x0020
143 # ADSL2_J43 = 0x0040
144 # ADSL2_B43C = 0x0080
145 # ADSL2_A43C = 0x0100
146 #
147 # (dec) (hex) (hex) (hex)
148 1 $1 $2 0x0
149
150 # nBaseAddr nIrqNum
151 #
152 # (hex) (dec)
153 0x1e116000 63
154
155 # nUtopiaPhyAdr nUtopiaBusWidth nPosPhyParity
156 # default(16b) = 0 NA = -1
157 # 8-bit = 1 ODD = 0
158 # 16-bit = 2
159 #
160 #
161 # (hex) (dec) (dec)
162 0xFF 0 0
163
164 # bNtrEnable
165 #
166 # (dec)
167 0" > /tmp/lowlevel.cfg
168 }
169
170 service_triggers() {
171 procd_add_reload_trigger network
172 }
173
174 start_service() {
175 local annex
176 local firmware
177 local tone
178 local tone_adsl
179 local tone_vdsl
180 local xtse
181 local xfer_mode
182 local line_mode
183 local mode
184 local lowlevel
185 local snr
186
187 config_load network
188 config_get tone dsl tone
189 config_get annex dsl annex
190 config_get firmware dsl firmware
191 config_get xfer_mode dsl xfer_mode
192 config_get line_mode dsl line_mode
193 config_get snr dsl ds_snr_offset
194
195 eval "xtse=\"\${xtse_xdsl_$annex}\""
196
197 [ -z "${xfer_mode}" ] && xfer_mode=ptm
198
199 case "${xfer_mode}" in
200 atm)
201 LOAD=ltq_atm_vr9
202 UNLOAD=ltq_ptm_vr9
203
204 # in most cases atm is used on top of adsl
205 [ -z "${line_mode}" ] && line_mode=adsl
206 ;;
207 *)
208 LOAD=ltq_ptm_vr9
209 UNLOAD=ltq_atm_vr9
210
211 # in most cases ptm is used on top of vdsl
212 [ -z "${line_mode}" ] && line_mode=vdsl
213 ;;
214 esac
215
216 case "${line_mode}" in
217 adsl)
218 mode=1
219
220 # mask out VDSL bits when ATM is requested
221 xtse="${xtse%_*}_00"
222 ;;
223 *)
224 mode=2
225 ;;
226 esac
227
228 local annexgpio="/sys/class/gpio/annex"
229 if [ -d "${annexgpio}a" ] && [ -d "${annexgpio}b" ]; then
230 case "${annex}" in
231 a*|l*|m*)
232 echo 1 > "${annexgpio}a/value"
233 echo 0 > "${annexgpio}b/value"
234 ;;
235 b*|j*)
236 echo 0 > "${annexgpio}a/value"
237 echo 1 > "${annexgpio}b/value"
238 ;;
239 esac
240 fi
241
242 if [ -z "${firmware}" ]; then
243 # search for the firmware provided by dsl-vrx200-firmware-xdsl-*
244 if grep -qE "system type.*: (VR9|xRX200)" /proc/cpuinfo; then
245 case "${annex}" in
246 a*|l*|m*)
247 if [ -f "/lib/firmware/lantiq-vrx200-a.bin" ]; then
248 firmware="/lib/firmware/lantiq-vrx200-a.bin"
249 elif [ -f "/tmp/lantiq-vrx200-a.bin" ]; then
250 firmware="/tmp/lantiq-vrx200-a.bin"
251 elif [ -f "/lib/firmware/lantiq-vrx200-b.bin" ] && [ -f "/lib/firmware/lantiq-vrx200-b-to-a.bspatch" ]; then
252 bspatch /lib/firmware/lantiq-vrx200-b.bin \
253 /tmp/lantiq-vrx200-a.bin \
254 /lib/firmware/lantiq-vrx200-b-to-a.bspatch
255 firmware="/tmp/lantiq-vrx200-a.bin"
256 else
257 echo "firmware for annex a not found"
258 return 1
259 fi
260 ;;
261 b*|j*)
262 if [ -f "/lib/firmware/lantiq-vrx200-b.bin" ]; then
263 firmware="/lib/firmware/lantiq-vrx200-b.bin"
264 elif [ -f "/tmp/lantiq-vrx200-b.bin" ]; then
265 firmware="/tmp/lantiq-vrx200-b.bin"
266 elif [ -f "/lib/firmware/lantiq-vrx200-a.bin" ] && [ -f "/lib/firmware/lantiq-vrx200-a-to-b.bspatch" ]; then
267 bspatch /lib/firmware/lantiq-vrx200-a.bin \
268 /tmp/lantiq-vrx200-b.bin \
269 /lib/firmware/lantiq-vrx200-a-to-b.bspatch
270 firmware="/tmp/lantiq-vrx200-b.bin"
271 else
272 echo "firmware for annex b not found"
273 return 1
274 fi
275 ;;
276 *)
277 echo "annex type not supported use a or b"
278 return 1
279 ;;
280 esac
281 fi
282 fi
283
284 [ -z "${firmware}" ] && firmware=/lib/firmware/vdsl.bin
285 [ -f "${firmware}" ] || {
286 echo failed to find $firmware
287 return 1
288 }
289
290 eval "tone_adsl=\"\${tone_adsl_$tone}\""
291 eval "tone_vdsl=\"\${tone_vdsl_$tone}\""
292 [ -n "${tone_adsl}" ] && [ -n "${tone_vdsl}" ] && {
293 lowlevel_cfg "${tone_adsl}" "${tone_vdsl}"
294 lowlevel="-l /tmp/lowlevel.cfg"
295 }
296
297 [ -z "${snr}" ] || {
298 # for SNR offset setting
299 autoboot_script "$snr"
300 autoboot="-a /tmp/adsl.scr"
301 }
302
303 procd_open_instance
304 procd_set_param command /sbin/vdsl_cpe_control_wrapper \
305 -i$xtse \
306 -n /sbin/dsl_notify.sh \
307 -f ${firmware} \
308 $lowlevel \
309 -M ${mode} \
310 $autoboot
311 procd_append_param env "LOAD=$LOAD" "UNLOAD=$UNLOAD"
312 procd_close_instance
313 }
314
315 stop_service() {
316 # do not use dsl_cmd to not block when this is locked up by some other proess
317 echo quit > /tmp/pipe/dsl_cpe0_cmd
318 DSL_NOTIFICATION_TYPE="DSL_INTERFACE_STATUS" \
319 DSL_INTERFACE_STATUS="DOWN" \
320 /sbin/dsl_notify.sh
321 }