8c6482f41fca20970690df72819d6dc9d52b9e9f
[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 -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 #
68 # convert vendorid into human readable form
69 #
70 parse_vendorid() {
71         local val=$1
72         local name
73         local version
74
75         case "$val" in
76                 B5,00,41,4C,43,42*)
77                         name="Alcatel"
78                         version=${val##*B5,00,41,4C,43,42,}
79                         ;;
80                 B5,00,41,4E,44,56*)
81                         name="Analog Devices"
82                         version=${val##*B5,00,41,4E,44,56,}
83                         ;;
84                 B5,00,42,44,43,4D*)
85                         name="Broadcom"
86                         version=${val##*B5,00,42,44,43,4D,}
87                         ;;
88                 B5,00,43,45,4E,54*)
89                         name="Centillium"
90                         version=${val##*B5,00,43,45,4E,54,}
91                         ;;
92                 B5,00,47,53,50,4E*)
93                         name="Globespan"
94                         version=${val##*B5,00,47,53,50,4E,}
95                         ;;
96                 B5,00,49,4B,4E,53*)
97                         name="Ikanos"
98                         version=${val##*B5,00,49,4B,4E,53,}
99                         ;;
100                 B5,00,49,46,54,4E*)
101                         name="Infineon"
102                         version=${val##*B5,00,49,46,54,4E,}
103                         ;;
104                 B5,00,54,53,54,43*)
105                         name="Texas Instruments"
106                         version=${val##*B5,00,54,53,54,43,}
107                         ;;
108                 B5,00,54,4D,4D,42*)
109                         name="Thomson MultiMedia Broadband"
110                         version=${val##*B5,00,54,4D,4D,42,}
111                         ;;
112                 B5,00,54,43,54,4E*)
113                         name="Trend Chip Technologies"
114                         version=${val##*B5,00,54,43,54,4E,}
115                         ;;
116                 B5,00,53,54,4D,49*)
117                         name="ST Micro"
118                         version=${val##*B5,00,53,54,4D,49,}
119                         ;;
120         esac
121
122         [ -n "$name" ] && {
123                 val="$name"
124
125                 [ "$version" != "00,00" ] && val="$(printf "%s %d.%d" "$val" 0x${version//,/ 0x})"
126         }
127
128         echo "$val"
129 }
130
131 #
132 # Read the data rates for both directions
133 #
134 data_rates() {
135         local csg
136         local dru
137         local drd
138         local sdru
139         local sdrd
140
141         csg=$(dsl_cmd g997csg 0 1)
142         drd=$(dsl_val "$csg" ActualDataRate)
143
144         csg=$(dsl_cmd g997csg 0 0)
145         dru=$(dsl_val "$csg" ActualDataRate)
146
147         [ -z "$drd" ] && drd=0
148         [ -z "$dru" ] && dru=0
149
150         sdrd=$(scale $drd)
151         sdru=$(scale $dru)
152
153         if [ "$action" = "lucistat" ]; then
154                 echo "dsl.data_rate_down=$drd"
155                 echo "dsl.data_rate_up=$dru"
156                 echo "dsl.data_rate_down_s=\"$sdrd\""
157                 echo "dsl.data_rate_up_s=\"$sdru\""
158         else
159                 echo "Data Rate:                                Down: ${sdrd}/s / Up: ${sdru}/s"
160         fi
161 }
162
163 #
164 # Chipset
165 #
166 chipset() {
167         local vig
168         local cs
169         local csv
170
171         vig=$(dsl_cmd vig)
172         cs=$(dsl_val "$vig" DSL_ChipSetType)
173         csv=$(dsl_val "$vig" DSL_ChipSetHWVersion)
174         csfw=$(dsl_val "$vig" DSL_ChipSetFWVersion)
175         csapi=$(dsl_val "$vig" DSL_DriverVersionApi)
176
177         if [ "$action" = "lucistat" ]; then
178                 echo "dsl.chipset=\"${cs} ${csv}\""
179                 echo "dsl.firmware_version=\"${csfw}\""
180                 echo "dsl.api_version=\"${csapi}\""
181         else
182                 echo "Chipset:                                  ${cs} ${csv}"
183                 echo "Firmware Version:                         ${csfw}"
184                 echo "API Version:                              ${csapi}"
185         fi
186 }
187
188 #
189 # Vendor information
190 #
191 vendor() {
192         local lig
193         local vid
194         local svid
195
196         lig=$(dsl_cmd g997lig 1)
197         vid=$(dsl_string "$lig" G994VendorID)
198         svid=$(dsl_string "$lig" SystemVendorID)
199
200         vid=$(parse_vendorid $vid)
201         svid=$(parse_vendorid $svid)
202
203         if [ "$action" = "lucistat" ]; then
204                 echo "dsl.atuc_vendor_id=\"${vid}\""
205                 echo "dsl.atuc_system_vendor_id=\"${svid}\""
206         else
207                 echo "ATU-C Vendor ID:                          ${vid}"
208                 echo "ATU-C System Vendor ID:                   ${svid}"
209         fi
210 }
211
212 #
213 # XTSE capabilities
214 #
215 xtse() {
216         local xtusesg
217         local xtse1
218         local xtse2
219         local xtse3
220         local xtse4
221         local xtse5
222         local xtse6
223         local xtse7
224         local xtse8
225
226         local xtse_s=""
227
228         local annex_s=""
229         local line_mode_s=""
230         local vector_s=""
231
232         local dsmsg=""
233         local cmd=""
234
235         xtusesg=$(dsl_cmd g997xtusesg)
236         xtse1=$(dsl_val "$xtusesg" XTSE1)
237         xtse2=$(dsl_val "$xtusesg" XTSE2)
238         xtse3=$(dsl_val "$xtusesg" XTSE3)
239         xtse4=$(dsl_val "$xtusesg" XTSE4)
240         xtse5=$(dsl_val "$xtusesg" XTSE5)
241         xtse6=$(dsl_val "$xtusesg" XTSE6)
242         xtse7=$(dsl_val "$xtusesg" XTSE7)
243         xtse8=$(dsl_val "$xtusesg" XTSE8)
244
245         # Evaluate Annex (according to G.997.1, 7.3.1.1.1)
246         if [ $((xtse1 & 13)) != 0 \
247         -o $((xtse2 & 1)) != 0 \
248         -o $((xtse3 & 12)) != 0 \
249         -o $((xtse4 & 3)) != 0 \
250         -o $((xtse6 & 3)) != 0 \
251         -o $((xtse8 & 1)) != 0 ]; then
252                 annex_s=" A,"
253         fi
254
255         if [ $((xtse1 & 48)) != 0 \
256         -o $((xtse2 & 2)) != 0 \
257         -o $((xtse3 & 48)) != 0 \
258         -o $((xtse6 & 12)) != 0 \
259         -o $((xtse8 & 2)) != 0 ]; then
260                 annex_s="$annex_s B,"
261         fi
262
263         if [ $((xtse1 & 194)) != 0 \
264         -o $((xtse2 & 12)) != 0 \
265         -o $((xtse8 & 4)) != 0 ]; then
266                 annex_s="$annex_s C,"
267         fi
268
269         if [ $((xtse4 & 48)) != 0 \
270         -o $((xtse5 & 3)) != 0 \
271         -o $((xtse6 & 192)) != 0 ]; then
272                 annex_s="$annex_s I,"
273         fi
274
275         if [ $((xtse4 & 192)) != 0 \
276         -o $((xtse7 & 3)) != 0 ]; then
277                 annex_s="$annex_s J,"
278         fi
279
280         if [ $((xtse5 & 60)) != 0 ]; then
281                 annex_s="$annex_s L,"
282         fi
283
284         if [ $((xtse5 & 192)) != 0 \
285         -o $((xtse7 & 12)) != 0 ]; then
286                 annex_s="$annex_s M,"
287         fi
288
289         annex_s=`echo ${annex_s:1}`
290         annex_s=`echo ${annex_s%?}`
291
292         # Evaluate Line Mode (according to G.997.1, 7.3.1.1.1)
293
294         # Regional standard: ANSI T1.413
295         if [ $((xtse1 & 1)) != 0  ]; then
296                 line_mode_s=" T1.413,"
297         fi
298
299         # Regional standard: TS 101 388
300         if [ $((xtse1 & 1)) != 0  ]; then
301                 line_mode_s="$line_mode_s TS 101 388,"
302         fi
303
304         if [ $((xtse1 & 252)) != 0  ]; then
305                 line_mode_s="$line_mode_s G.992.1 (ADSL),"
306         fi
307
308         if [ $((xtse2 & 15)) != 0  ]; then
309                 line_mode_s="$line_mode_s G.992.2 (ADSL lite),"
310         fi
311
312         if [ $((xtse3 & 60)) != 0 \
313         -o $((xtse4 & 240)) != 0 \
314         -o $((xtse5 & 252)) != 0  ]; then
315                 line_mode_s="$line_mode_s G.992.3 (ADSL2),"
316         fi
317
318         if [ $((xtse4 & 3)) != 0 \
319         -o $((xtse5 & 3)) != 0  ]; then
320                 line_mode_s="$line_mode_s G.992.4 (ADSL2 lite),"
321         fi
322
323         if [ $((xtse6 & 199)) != 0 \
324         -o $((xtse7 & 15)) != 0  ]; then
325                 line_mode_s="$line_mode_s G.992.5 (ADSL2+),"
326         fi
327
328         if [ $((xtse8 & 7)) != 0  ]; then
329                 dsmsg=$(dsl_cmd dsmsg)
330                 vector_s=$(dsl_val "$dsmsg" eVectorStatus)
331
332                 case "$vector_s" in
333                         "0")    line_mode_s="$line_mode_s G.993.2 (VDSL2)," ;;
334                         "1")    line_mode_s="$line_mode_s G.993.5 (VDSL2 with downstream vectoring)," ;;
335                         "2")    line_mode_s="$line_mode_s G.993.5 (VDSL2 with down- and upstream vectoring)," ;;
336                         *)      line_mode_s="$line_mode_s unknown," ;;
337                 esac
338         fi
339
340         #!!! PROPRIETARY & INTERMEDIATE USE !!!
341         if [ $((xtse8 & 128)) != 0  ]; then
342                 line_mode_s="$line_mode_s G.993.1 (VDSL),"
343         fi
344
345         line_mode_s=`echo ${line_mode_s:1}`
346         line_mode_s=`echo ${line_mode_s%?}`
347
348         xtse_s="${xtse1}, ${xtse2}, ${xtse3}, ${xtse4}, ${xtse5}, ${xtse6}, ${xtse7}, ${xtse8}"
349
350         if [ "$action" = "lucistat" ]; then
351                 echo "dsl.xtse1=${xtse1:-nil}"
352                 echo "dsl.xtse2=${xtse2:-nil}"
353                 echo "dsl.xtse3=${xtse3:-nil}"
354                 echo "dsl.xtse4=${xtse4:-nil}"
355                 echo "dsl.xtse5=${xtse5:-nil}"
356                 echo "dsl.xtse6=${xtse6:-nil}"
357                 echo "dsl.xtse7=${xtse7:-nil}"
358                 echo "dsl.xtse8=${xtse8:-nil}"
359                 echo "dsl.xtse_s=\"$xtse_s\""
360                 echo "dsl.annex_s=\"${annex_s}\""
361                 echo "dsl.line_mode_s=\"${line_mode_s}\""
362         else
363                 echo "XTSE Capabilities:                        ${xtse_s}"
364                 echo "Annex:                                    ${annex_s}"
365                 echo "Line Mode:                                ${line_mode_s}"
366         fi
367 }
368
369 #
370 # Power Management Mode
371 #
372 power_mode() {
373         local pmsg=$(dsl_cmd g997pmsg)
374         local pm=$(dsl_val "$pmsg" nPowerManagementStatus);
375         local s;
376
377         case "$pm" in
378                 "-1")           s="Power management state is not available" ;;
379                 "0")            s="L0 - Synchronized" ;;
380                 "1")            s="L1 - Power Down Data transmission (G.992.2)" ;;
381                 "2")            s="L2 - Power Down Data transmission (G.992.3 and G.992.4)" ;;
382                 "3")            s="L3 - No power" ;;
383                 *)              s="unknown" ;;
384         esac
385
386         if [ "$action" = "lucistat" ]; then
387                 echo "dsl.power_mode_num=${pm:-nil}"
388                 echo "dsl.power_mode_s=\"$s\""
389         else
390                 echo "Power Management Mode:                    $s"
391         fi
392 }
393
394 #
395 # Latency type (interleave delay)
396 #
397 latency_delay() {
398         local csg
399
400         local idu
401         local idu_s;
402         local sidu
403
404         local idd
405         local idd_s;
406         local sidd
407
408         csg=$(dsl_cmd g997csg 0 1)
409         idd=$(dsl_val "$csg" ActualInterleaveDelay)
410
411         csg=$(dsl_cmd g997csg 0 0)
412         idu=$(dsl_val "$csg" ActualInterleaveDelay)
413
414         [ -z "$idd" ] && idd=0
415         [ -z "$idu" ] && idu=0
416
417         if [ "$idd" -gt 100 ]; then
418                 idd_s="Interleave"
419         else
420                 idd_s="Fast"
421         fi
422
423         if [ "$idu" -gt 100 ]; then
424                 idu_s="Interleave"
425         else
426                 idu_s="Fast"
427         fi
428
429         sidu=$(scale_latency $idu)
430         sidd=$(scale_latency $idd)
431
432         if [ "$action" = "lucistat" ]; then
433                 echo "dsl.latency_num_down=\"$sidd\""
434                 echo "dsl.latency_num_up=\"$sidu\""
435                 echo "dsl.latency_s_down=\"$idd_s\""
436                 echo "dsl.latency_s_up=\"$idu_s\""
437         else
438                 echo "Latency / Interleave Delay:               Down: ${idd_s} (${sidd}) / Up: ${idu_s} (${sidu})"
439         fi
440 }
441
442 #
443 # Errors
444 #
445 errors() {
446         local lsctg
447         local dpctg
448         local ccsg
449         local esf
450         local esn
451         local sesf
452         local sesn
453         local lossf
454         local lossn
455         local uasf
456         local uasn
457
458         local crc_pf
459         local crc_pn
460         local crcp_pf
461         local crcp_pn
462         local hecf
463         local hecn
464
465         local fecn
466         local fecf
467
468         lsctg=$(dsl_cmd pmlsctg 1)
469         esf=$(dsl_val "$lsctg" nES)
470         sesf=$(dsl_val "$lsctg" nSES)
471         lossf=$(dsl_val "$lsctg" nLOSS)
472         uasf=$(dsl_val "$lsctg" nUAS)
473
474         lsctg=$(dsl_cmd pmlsctg 0)
475         esn=$(dsl_val "$lsctg" nES)
476         sesn=$(dsl_val "$lsctg" nSES)
477         lossn=$(dsl_val "$lsctg" nLOSS)
478         uasn=$(dsl_val "$lsctg" nUAS)
479
480         dpctg=$(dsl_cmd pmdpctg 0 1)
481         hecf=$(dsl_val "$dpctg" nHEC)
482         crc_pf=$(dsl_val "$dpctg" nCRC_P)
483         crcp_pf=$(dsl_val "$dpctg" nCRCP_P)
484
485         dpctg=$(dsl_cmd pmdpctg 0 0)
486         hecn=$(dsl_val "$dpctg" nHEC)
487         crc_pn=$(dsl_val "$dpctg" nCRC_P)
488         crcp_pn=$(dsl_val "$dpctg" nCRCP_P)
489
490         ccsg=$(dsl_cmd pmccsg 0 1 0)
491         fecf=$(dsl_val "$ccsg" nFEC)
492
493         ccsg=$(dsl_cmd pmccsg 0 0 0)
494         fecn=$(dsl_val "$ccsg" nFEC)
495
496         if [ "$action" = "lucistat" ]; then
497                 echo "dsl.errors_fec_near=${fecn:-nil}"
498                 echo "dsl.errors_fec_far=${fecf:-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: ${fecn} / Far: ${fecf}"
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 }