lantiq: replace backticks by $(...) and remove useless echo
[oweals/openwrt.git] / target / linux / lantiq / base-files / lib / functions / lantiq_dsl.sh
1 #!/bin/sh /etc/rc.common
2 # Copyright (C) 2012-2014 OpenWrt.org
3
4 if [ "$( which vdsl_cpe_control )" ]; then
5         XDSL_CTRL=vdsl_cpe_control
6 else
7         XDSL_CTRL=dsl_cpe_control
8 fi
9
10 #
11 # Basic functions to send CLI commands to the vdsl_cpe_control daemon
12 #
13 dsl_cmd() {
14         killall -q -0 ${XDSL_CTRL} && (
15                 lock /var/lock/dsl_pipe
16                 echo "$@" > /tmp/pipe/dsl_cpe0_cmd
17                 cat /tmp/pipe/dsl_cpe0_ack
18                 lock -u /var/lock/dsl_pipe
19         )
20 }
21 dsl_val() {
22         echo $(expr "$1" : '.*'$2'=\([-\.[:alnum:]]*\).*')
23 }
24 dsl_string() {
25         echo $(expr "$1" : '.*'$2'=(\([A-Z0-9,]*\))')
26 }
27
28 #
29 # Simple divide by 10 routine to cope with one decimal place
30 #
31 dbt() {
32         local a=$(expr $1 / 10)
33         local b=$(expr $1 % 10)
34         echo "${a}.${b#-}"
35 }
36 #
37 # Take a number and convert to k or meg
38 #
39 scale() {
40         local val=$1
41         local a
42         local b
43
44         if [ "$val" -gt 1000000 ]; then
45                 a=$(expr $val / 1000)
46                 b=$(expr $a % 1000)
47                 a=$(expr $a / 1000)
48                 printf "%d.%03d Mb" ${a} ${b}
49         elif [ "$val" -gt 1000 ]; then
50                 a=$(expr $val / 1000)
51                 printf "%d Kb" ${a}
52         else
53                 echo "${val} b"
54         fi
55 }
56
57 scale_latency() {
58         local val=$1
59         local a
60         local b
61
62         a=$(expr $val / 100)
63         b=$(expr $val % 100)
64         printf "%d.%d ms" ${a} ${b}
65 }
66
67 scale_latency_us() {
68         local val=$1
69
70         expr $val \* 10
71 }
72
73 #
74 # convert vendorid into human readable form
75 #
76 parse_vendorid() {
77         local val=$1
78         local name
79         local version
80
81         case "$val" in
82                 B5,00,41,4C,43,42*)
83                         name="Alcatel"
84                         version=${val##*B5,00,41,4C,43,42,}
85                         ;;
86                 B5,00,41,4E,44,56*)
87                         name="Analog Devices"
88                         version=${val##*B5,00,41,4E,44,56,}
89                         ;;
90                 B5,00,42,44,43,4D*)
91                         name="Broadcom"
92                         version=${val##*B5,00,42,44,43,4D,}
93                         ;;
94                 B5,00,43,45,4E,54*)
95                         name="Centillium"
96                         version=${val##*B5,00,43,45,4E,54,}
97                         ;;
98                 B5,00,47,53,50,4E*)
99                         name="Globespan"
100                         version=${val##*B5,00,47,53,50,4E,}
101                         ;;
102                 B5,00,49,4B,4E,53*)
103                         name="Ikanos"
104                         version=${val##*B5,00,49,4B,4E,53,}
105                         ;;
106                 B5,00,49,46,54,4E*)
107                         name="Infineon"
108                         version=${val##*B5,00,49,46,54,4E,}
109                         ;;
110                 B5,00,54,53,54,43*)
111                         name="Texas Instruments"
112                         version=${val##*B5,00,54,53,54,43,}
113                         ;;
114                 B5,00,54,4D,4D,42*)
115                         name="Thomson MultiMedia Broadband"
116                         version=${val##*B5,00,54,4D,4D,42,}
117                         ;;
118                 B5,00,54,43,54,4E*)
119                         name="Trend Chip Technologies"
120                         version=${val##*B5,00,54,43,54,4E,}
121                         ;;
122                 B5,00,53,54,4D,49*)
123                         name="ST Micro"
124                         version=${val##*B5,00,53,54,4D,49,}
125                         ;;
126         esac
127
128         [ -n "$name" ] && {
129                 val="$name"
130
131                 [ "$version" != "00,00" ] && val="$(printf "%s %d.%d" "$val" 0x${version//,/ 0x})"
132         }
133
134         echo "$val"
135 }
136
137 #
138 # Read the data rates for both directions
139 #
140 data_rates() {
141         local csg
142         local dru
143         local drd
144         local sdru
145         local sdrd
146
147         csg=$(dsl_cmd g997csg 0 1)
148         drd=$(dsl_val "$csg" ActualDataRate)
149
150         csg=$(dsl_cmd g997csg 0 0)
151         dru=$(dsl_val "$csg" ActualDataRate)
152
153         [ -z "$drd" ] && drd=0
154         [ -z "$dru" ] && dru=0
155
156         sdrd=$(scale $drd)
157         sdru=$(scale $dru)
158
159         if [ "$action" = "lucistat" ]; then
160                 echo "dsl.data_rate_down=$drd"
161                 echo "dsl.data_rate_up=$dru"
162                 echo "dsl.data_rate_down_s=\"$sdrd\""
163                 echo "dsl.data_rate_up_s=\"$sdru\""
164         else
165                 echo "Data Rate:                                Down: ${sdrd}/s / Up: ${sdru}/s"
166         fi
167 }
168
169 #
170 # Chipset
171 #
172 chipset() {
173         local vig
174         local cs
175
176         vig=$(dsl_cmd vig)
177         cs=$(dsl_val "$vig" DSL_ChipSetType)
178         csfw=$(dsl_val "$vig" DSL_ChipSetFWVersion)
179         csapi=$(dsl_val "$vig" DSL_DriverVersionApi)
180
181         if [ "$action" = "lucistat" ]; then
182                 echo "dsl.chipset=\"${cs}\""
183                 echo "dsl.firmware_version=\"${csfw}\""
184                 echo "dsl.api_version=\"${csapi}\""
185         else
186                 echo "Chipset:                                  ${cs}"
187                 echo "Firmware Version:                         ${csfw}"
188                 echo "API Version:                              ${csapi}"
189         fi
190 }
191
192 #
193 # Vendor information
194 #
195 vendor() {
196         local lig
197         local vid
198         local svid
199
200         lig=$(dsl_cmd g997lig 1)
201         vid=$(dsl_string "$lig" G994VendorID)
202         svid=$(dsl_string "$lig" SystemVendorID)
203
204         vid=$(parse_vendorid $vid)
205         svid=$(parse_vendorid $svid)
206
207         if [ "$action" = "lucistat" ]; then
208                 echo "dsl.atuc_vendor_id=\"${vid}\""
209                 echo "dsl.atuc_system_vendor_id=\"${svid}\""
210         else
211                 echo "ATU-C Vendor ID:                          ${vid}"
212                 echo "ATU-C System Vendor ID:                   ${svid}"
213         fi
214 }
215
216 #
217 # XTSE capabilities
218 #
219 xtse() {
220         local xtusesg
221         local xtse1
222         local xtse2
223         local xtse3
224         local xtse4
225         local xtse5
226         local xtse6
227         local xtse7
228         local xtse8
229
230         local xtse_s=""
231
232         local annex_s=""
233         local line_mode_s=""
234         local vector_s=""
235
236         local dsmsg=""
237         local cmd=""
238
239         xtusesg=$(dsl_cmd g997xtusesg)
240         xtse1=$(dsl_val "$xtusesg" XTSE1)
241         xtse2=$(dsl_val "$xtusesg" XTSE2)
242         xtse3=$(dsl_val "$xtusesg" XTSE3)
243         xtse4=$(dsl_val "$xtusesg" XTSE4)
244         xtse5=$(dsl_val "$xtusesg" XTSE5)
245         xtse6=$(dsl_val "$xtusesg" XTSE6)
246         xtse7=$(dsl_val "$xtusesg" XTSE7)
247         xtse8=$(dsl_val "$xtusesg" XTSE8)
248
249         # Evaluate Annex (according to G.997.1, 7.3.1.1.1)
250         if [ $((xtse1 & 13)) != 0 \
251         -o $((xtse2 & 1)) != 0 \
252         -o $((xtse3 & 12)) != 0 \
253         -o $((xtse4 & 3)) != 0 \
254         -o $((xtse6 & 3)) != 0 \
255         -o $((xtse8 & 1)) != 0 ]; then
256                 annex_s=" A,"
257         fi
258
259         if [ $((xtse1 & 48)) != 0 \
260         -o $((xtse2 & 2)) != 0 \
261         -o $((xtse3 & 48)) != 0 \
262         -o $((xtse6 & 12)) != 0 \
263         -o $((xtse8 & 2)) != 0 ]; then
264                 annex_s="$annex_s B,"
265         fi
266
267         if [ $((xtse1 & 194)) != 0 \
268         -o $((xtse2 & 12)) != 0 \
269         -o $((xtse8 & 4)) != 0 ]; then
270                 annex_s="$annex_s C,"
271         fi
272
273         if [ $((xtse4 & 48)) != 0 \
274         -o $((xtse5 & 3)) != 0 \
275         -o $((xtse6 & 192)) != 0 ]; then
276                 annex_s="$annex_s I,"
277         fi
278
279         if [ $((xtse4 & 192)) != 0 \
280         -o $((xtse7 & 3)) != 0 ]; then
281                 annex_s="$annex_s J,"
282         fi
283
284         if [ $((xtse5 & 60)) != 0 ]; then
285                 annex_s="$annex_s L,"
286         fi
287
288         if [ $((xtse5 & 192)) != 0 \
289         -o $((xtse7 & 12)) != 0 ]; then
290                 annex_s="$annex_s M,"
291         fi
292
293         annex_s=${annex_s:1}
294         annex_s=${annex_s%?}
295
296         # Evaluate Line Mode (according to G.997.1, 7.3.1.1.1)
297
298         # Regional standard: ANSI T1.413
299         if [ $((xtse1 & 1)) != 0  ]; then
300                 line_mode_s=" T1.413,"
301         fi
302
303         # Regional standard: TS 101 388
304         if [ $((xtse1 & 1)) != 0  ]; then
305                 line_mode_s="$line_mode_s TS 101 388,"
306         fi
307
308         if [ $((xtse1 & 252)) != 0  ]; then
309                 line_mode_s="$line_mode_s G.992.1 (ADSL),"
310         fi
311
312         if [ $((xtse2 & 15)) != 0  ]; then
313                 line_mode_s="$line_mode_s G.992.2 (ADSL lite),"
314         fi
315
316         if [ $((xtse3 & 60)) != 0 \
317         -o $((xtse4 & 240)) != 0 \
318         -o $((xtse5 & 252)) != 0  ]; then
319                 line_mode_s="$line_mode_s G.992.3 (ADSL2),"
320         fi
321
322         if [ $((xtse4 & 3)) != 0 \
323         -o $((xtse5 & 3)) != 0  ]; then
324                 line_mode_s="$line_mode_s G.992.4 (ADSL2 lite),"
325         fi
326
327         if [ $((xtse6 & 199)) != 0 \
328         -o $((xtse7 & 15)) != 0  ]; then
329                 line_mode_s="$line_mode_s G.992.5 (ADSL2+),"
330         fi
331
332         if [ $((xtse8 & 7)) != 0  ]; then
333                 dsmsg=$(dsl_cmd dsmsg)
334                 vector_s=$(dsl_val "$dsmsg" eVectorStatus)
335
336                 case "$vector_s" in
337                         "0")    line_mode_s="$line_mode_s G.993.2 (VDSL2)," ;;
338                         "1")    line_mode_s="$line_mode_s G.993.5 (VDSL2 with downstream vectoring)," ;;
339                         "2")    line_mode_s="$line_mode_s G.993.5 (VDSL2 with down- and upstream vectoring)," ;;
340                         *)      line_mode_s="$line_mode_s unknown," ;;
341                 esac
342         fi
343
344         #!!! PROPRIETARY & INTERMEDIATE USE !!!
345         if [ $((xtse8 & 128)) != 0  ]; then
346                 line_mode_s="$line_mode_s G.993.1 (VDSL),"
347         fi
348
349         line_mode_s=${line_mode_s:1}
350         line_mode_s=${line_mode_s%?}
351
352         xtse_s="${xtse1}, ${xtse2}, ${xtse3}, ${xtse4}, ${xtse5}, ${xtse6}, ${xtse7}, ${xtse8}"
353
354         if [ "$action" = "lucistat" ]; then
355                 echo "dsl.xtse1=${xtse1:-nil}"
356                 echo "dsl.xtse2=${xtse2:-nil}"
357                 echo "dsl.xtse3=${xtse3:-nil}"
358                 echo "dsl.xtse4=${xtse4:-nil}"
359                 echo "dsl.xtse5=${xtse5:-nil}"
360                 echo "dsl.xtse6=${xtse6:-nil}"
361                 echo "dsl.xtse7=${xtse7:-nil}"
362                 echo "dsl.xtse8=${xtse8:-nil}"
363                 echo "dsl.xtse_s=\"$xtse_s\""
364                 echo "dsl.annex_s=\"${annex_s}\""
365                 echo "dsl.line_mode_s=\"${line_mode_s}\""
366         else
367                 echo "XTSE Capabilities:                        ${xtse_s}"
368                 echo "Annex:                                    ${annex_s}"
369                 echo "Line Mode:                                ${line_mode_s}"
370         fi
371 }
372
373 #
374 # Power Management Mode
375 #
376 power_mode() {
377         local pmsg=$(dsl_cmd g997pmsg)
378         local pm=$(dsl_val "$pmsg" nPowerManagementStatus);
379         local s;
380
381         case "$pm" in
382                 "-1")           s="Power management state is not available" ;;
383                 "0")            s="L0 - Synchronized" ;;
384                 "1")            s="L1 - Power Down Data transmission (G.992.2)" ;;
385                 "2")            s="L2 - Power Down Data transmission (G.992.3 and G.992.4)" ;;
386                 "3")            s="L3 - No power" ;;
387                 *)              s="unknown" ;;
388         esac
389
390         if [ "$action" = "lucistat" ]; then
391                 echo "dsl.power_mode_num=${pm:-nil}"
392                 echo "dsl.power_mode_s=\"$s\""
393         else
394                 echo "Power Management Mode:                    $s"
395         fi
396 }
397
398 #
399 # Latency type (interleave delay)
400 #
401 latency_delay() {
402         local csg
403
404         local idu
405         local idu_s;
406         local sidu
407
408         local idd
409         local idd_s;
410         local sidd
411
412         csg=$(dsl_cmd g997csg 0 1)
413         idd=$(dsl_val "$csg" ActualInterleaveDelay)
414
415         csg=$(dsl_cmd g997csg 0 0)
416         idu=$(dsl_val "$csg" ActualInterleaveDelay)
417
418         [ -z "$idd" ] && idd=0
419         [ -z "$idu" ] && idu=0
420
421         if [ "$idd" -gt 100 ]; then
422                 idd_s="Interleave"
423         else
424                 idd_s="Fast"
425         fi
426
427         if [ "$idu" -gt 100 ]; then
428                 idu_s="Interleave"
429         else
430                 idu_s="Fast"
431         fi
432
433         sidu=$(scale_latency $idu)
434         sidd=$(scale_latency $idd)
435
436         if [ "$action" = "lucistat" ]; then
437                 echo "dsl.latency_down=\"$(scale_latency_us $idd)\""
438                 echo "dsl.latency_up=\"$(scale_latency_us $idu)\""
439                 echo "dsl.latency_num_down=\"$sidd\""
440                 echo "dsl.latency_num_up=\"$sidu\""
441                 echo "dsl.latency_s_down=\"$idd_s\""
442                 echo "dsl.latency_s_up=\"$idu_s\""
443         else
444                 echo "Latency [Interleave Delay]:               ${sidd} [${idd_s}]   ${sidu} [${idu_s}]"
445         fi
446 }
447
448 #
449 # Errors
450 #
451 errors() {
452         local lsctg
453         local dpctg
454         local fecsf
455         local fecsn
456         local esf
457         local esn
458         local sesf
459         local sesn
460         local lossf
461         local lossn
462         local uasf
463         local uasn
464
465         local crc_pf
466         local crc_pn
467         local crcp_pf
468         local crcp_pn
469         local hecf
470         local hecn
471
472         lsctg=$(dsl_cmd pmlsctg 1)
473         fecsf=$(dsl_val "$lsctg" nFECS)
474         esf=$(dsl_val "$lsctg" nES)
475         sesf=$(dsl_val "$lsctg" nSES)
476         lossf=$(dsl_val "$lsctg" nLOSS)
477         uasf=$(dsl_val "$lsctg" nUAS)
478
479         lsctg=$(dsl_cmd pmlsctg 0)
480         fecsn=$(dsl_val "$lsctg" nFECS)
481         esn=$(dsl_val "$lsctg" nES)
482         sesn=$(dsl_val "$lsctg" nSES)
483         lossn=$(dsl_val "$lsctg" nLOSS)
484         uasn=$(dsl_val "$lsctg" nUAS)
485
486         dpctg=$(dsl_cmd pmdpctg 0 1)
487         hecf=$(dsl_val "$dpctg" nHEC)
488         crc_pf=$(dsl_val "$dpctg" nCRC_P)
489         crcp_pf=$(dsl_val "$dpctg" nCRCP_P)
490
491         dpctg=$(dsl_cmd pmdpctg 0 0)
492         hecn=$(dsl_val "$dpctg" nHEC)
493         crc_pn=$(dsl_val "$dpctg" nCRC_P)
494         crcp_pn=$(dsl_val "$dpctg" nCRCP_P)
495
496         if [ "$action" = "lucistat" ]; then
497                 echo "dsl.errors_fecs_near=${fecsn:-nil}"
498                 echo "dsl.errors_fecs_far=${fecsf:-nil}"
499                 echo "dsl.errors_es_near=${esn:-nil}"
500                 echo "dsl.errors_es_far=${esf:-nil}"
501                 echo "dsl.errors_ses_near=${sesn:-nil}"
502                 echo "dsl.errors_ses_far=${sesf:-nil}"
503                 echo "dsl.errors_loss_near=${lossn:-nil}"
504                 echo "dsl.errors_loss_far=${lossf:-nil}"
505                 echo "dsl.errors_uas_near=${uasn:-nil}"
506                 echo "dsl.errors_uas_far=${uasf:-nil}"
507                 echo "dsl.errors_hec_near=${hecn:-nil}"
508                 echo "dsl.errors_hec_far=${hecf:-nil}"
509                 echo "dsl.errors_crc_p_near=${crc_pn:-nil}"
510                 echo "dsl.errors_crc_p_far=${crc_pf:-nil}"
511                 echo "dsl.errors_crcp_p_near=${crcp_pn:-nil}"
512                 echo "dsl.errors_crcp_p_far=${crcp_pf:-nil}"
513         else
514                 echo "Forward Error Correction Seconds (FECS):  Near: ${fecsn} / Far: ${fecsf}"
515                 echo "Errored seconds (ES):                     Near: ${esn} / Far: ${esf}"
516                 echo "Severely Errored Seconds (SES):           Near: ${sesn} / Far: ${sesf}"
517                 echo "Loss of Signal Seconds (LOSS):            Near: ${lossn} / Far: ${lossf}"
518                 echo "Unavailable Seconds (UAS):                Near: ${uasn} / Far: ${uasf}"
519                 echo "Header Error Code Errors (HEC):           Near: ${hecn} / Far: ${hecf}"
520                 echo "Non Pre-emtive CRC errors (CRC_P):        Near: ${crc_pn} / Far: ${crc_pf}"
521                 echo "Pre-emtive CRC errors (CRCP_P):           Near: ${crcp_pn} / Far: ${crcp_pf}"
522         fi
523 }
524
525 #
526 # Work out how long the line has been up
527 #
528 line_uptime() {
529         local ccsg
530         local et
531         local etr
532         local d
533         local h
534         local m
535         local s
536         local rc=""
537
538         ccsg=$(dsl_cmd pmccsg 0 0 0)
539         et=$(dsl_val "$ccsg" nElapsedTime)
540
541         [ -z "$et" ] && et=0
542
543         d=$(expr $et / 86400)
544         etr=$(expr $et % 86400)
545         h=$(expr $etr / 3600)
546         etr=$(expr $etr % 3600)
547         m=$(expr $etr / 60)
548         s=$(expr $etr % 60)
549
550
551         [ "${d}${h}${m}${s}" -ne 0 ] && rc="${s}s"
552         [ "${d}${h}${m}" -ne 0 ] && rc="${m}m ${rc}"
553         [ "${d}${h}" -ne 0 ] && rc="${h}h ${rc}"
554         [ "${d}" -ne 0 ] && rc="${d}d ${rc}"
555
556         [ -z "$rc" ] && rc="down"
557
558
559         if [ "$action" = "lucistat" ]; then
560                 echo "dsl.line_uptime=${et}"
561                 echo "dsl.line_uptime_s=\"${rc}\""
562         else
563
564                 echo "Line Uptime Seconds:                      ${et}"
565                 echo "Line Uptime:                              ${rc}"
566         fi
567 }
568
569 #
570 # Get noise and attenuation figures
571 #
572 line_data() {
573         local lsg
574         local latnu
575         local latnd
576         local satnu
577         local satnd
578         local snru
579         local snrd
580         local attndru
581         local attndrd
582         local sattndru
583         local sattndrd
584         local actatpu
585         local actatpd
586
587         lsg=$(dsl_cmd g997lsg 1 1)
588         latnd=$(dsl_val "$lsg" LATN)
589         satnd=$(dsl_val "$lsg" SATN)
590         snrd=$(dsl_val "$lsg" SNR)
591         attndrd=$(dsl_val "$lsg" ATTNDR)
592         actatpd=$(dsl_val "$lsg" ACTATP)
593
594         lsg=$(dsl_cmd g997lsg 0 1)
595         latnu=$(dsl_val "$lsg" LATN)
596         satnu=$(dsl_val "$lsg" SATN)
597         snru=$(dsl_val "$lsg" SNR)
598         attndru=$(dsl_val "$lsg" ATTNDR)
599         actatpu=$(dsl_val "$lsg" ACTATP)
600
601         [ -z "$latnd" ] && latnd=0
602         [ -z "$latnu" ] && latnu=0
603         [ -z "$satnd" ] && satnd=0
604         [ -z "$satnu" ] && satnu=0
605         [ -z "$snrd" ] && snrd=0
606         [ -z "$snru" ] && snru=0
607         [ -z "$actatpd" ] && actatpd=0
608         [ -z "$actatpu" ] && actatpu=0
609
610         latnd=$(dbt $latnd)
611         latnu=$(dbt $latnu)
612         satnd=$(dbt $satnd)
613         satnu=$(dbt $satnu)
614         snrd=$(dbt $snrd)
615         snru=$(dbt $snru)
616         actatpd=$(dbt $actatpd)
617         actatpu=$(dbt $actatpu)
618
619         [ -z "$attndrd" ] && attndrd=0
620         [ -z "$attndru" ] && attndru=0
621
622         sattndrd=$(scale $attndrd)
623         sattndru=$(scale $attndru)
624         
625         if [ "$action" = "lucistat" ]; then
626                 echo "dsl.line_attenuation_down=\"$latnd\""
627                 echo "dsl.line_attenuation_up=\"$latnu\""
628                 echo "dsl.noise_margin_down=\"$snrd\""
629                 echo "dsl.noise_margin_up=\"$snru\""
630                 echo "dsl.signal_attenuation_down=\"$satnd\""
631                 echo "dsl.signal_attenuation_up=\"$satnu\""
632                 echo "dsl.actatp_down=\"$actatpd\""
633                 echo "dsl.actatp_up=\"$actatpu\""
634                 echo "dsl.max_data_rate_down=$attndrd"
635                 echo "dsl.max_data_rate_up=$attndru"
636                 echo "dsl.max_data_rate_down_s=\"$sattndrd\""
637                 echo "dsl.max_data_rate_up_s=\"$sattndru\""
638         else
639                 echo "Line Attenuation (LATN):                  Down: ${latnd} dB / Up: ${latnu} dB"
640                 echo "Signal Attenuation (SATN):                Down: ${satnd} dB / Up: ${satnu} dB"
641                 echo "Noise Margin (SNR):                       Down: ${snrd} dB / Up: ${snru} dB"
642                 echo "Aggregate Transmit Power (ACTATP):        Down: ${actatpd} dB / Up: ${actatpu} dB"
643                 echo "Max. Attainable Data Rate (ATTNDR):       Down: ${sattndrd}/s / Up: ${sattndru}/s"
644         fi
645 }
646
647 #
648 # Is the line up? Or what state is it in?
649 #
650 line_state() {
651         local lsg=$(dsl_cmd lsg)
652         local ls=$(dsl_val "$lsg" nLineState);
653         local s;
654
655         case "$ls" in
656                 "0x0")          s="not initialized" ;;
657                 "0x1")          s="exception" ;;
658                 "0x10")         s="not updated" ;;
659                 "0xff")         s="idle request" ;;
660                 "0x100")        s="idle" ;;
661                 "0x1ff")        s="silent request" ;;
662                 "0x200")        s="silent" ;;
663                 "0x300")        s="handshake" ;;
664                 "0x380")        s="full_init" ;;
665                 "0x400")        s="discovery" ;;
666                 "0x500")        s="training" ;;
667                 "0x600")        s="analysis" ;;
668                 "0x700")        s="exchange" ;;
669                 "0x800")        s="showtime_no_sync" ;;
670                 "0x801")        s="showtime_tc_sync" ;;
671                 "0x900")        s="fastretrain" ;;
672                 "0xa00")        s="lowpower_l2" ;;
673                 "0xb00")        s="loopdiagnostic active" ;;
674                 "0xb10")        s="loopdiagnostic data exchange" ;;
675                 "0xb20")        s="loopdiagnostic data request" ;;
676                 "0xc00")        s="loopdiagnostic complete" ;;
677                 "0x1000000")    s="test" ;;
678                 "0xd00")        s="resync" ;;
679                 "0x3c0")        s="short init entry" ;;
680                 "")             s="not running daemon"; ls="0xfff" ;;
681                 *)              s="unknown" ;;
682         esac
683
684         if [ "$action" = "lucistat" ]; then
685                 echo "dsl.line_state_num=$ls"
686                 echo "dsl.line_state_detail=\"$s\""
687                 if [ "$ls" = "0x801" ]; then
688                         echo "dsl.line_state=\"UP\""
689                 else
690                         echo "dsl.line_state=\"DOWN\""
691                 fi
692         else
693                 if [ "$ls" = "0x801" ]; then
694                         echo "Line State:                               UP [$ls: $s]"
695                 else
696                         echo "Line State:                               DOWN [$ls: $s]"
697                 fi
698         fi
699 }
700
701 #
702 # Which profile is used?
703 #
704 profile() {
705         local bpstg=$(dsl_cmd bpstg)
706         local profile=$(dsl_val "$bpstg" nProfile);
707         local s;
708
709         case "$profile" in
710                 "0")    s="8a" ;;
711                 "1")    s="8b" ;;
712                 "2")    s="8c" ;;
713                 "3")    s="8d" ;;
714                 "4")    s="12a" ;;
715                 "5")    s="12b" ;;
716                 "6")    s="17a" ;;
717                 "7")    s="30a" ;;
718                 "8")    s="17b" ;;
719                 "")             s="";;
720                 *)              s="unknown" ;;
721         esac
722
723         if [ "$action" = "lucistat" ]; then
724                 echo "dsl.profile=${profile:-nil}"
725                 echo "dsl.profile_s=\"${s}\""
726         else
727                 echo "Profile:                                  $s"
728         fi
729 }
730
731 status() {
732         vendor
733         chipset
734         xtse
735         profile
736         line_state
737         errors
738         power_mode
739         latency_delay
740         data_rates
741         line_data
742         line_uptime
743 }
744
745 lucistat() {
746         echo "local dsl={}"
747         status
748         echo "return dsl"
749 }