switch4g: fix non-Hilink support
[tomato.git] / release / src / router / others / switch4g
bloba07fcc30794678ad9c39179158f18d5f6001d351
1 #!/bin/sh
4 # Copyright (C) 2015 shibby
7 MODE=`nvram get wan_proto`
8 LOCK="/tmp/switch4g.lock"
10 if [ ! "$MODE" == "lte" ]; then
11 exit 0
14 connect() {
15 APN=`nvram get modem_apn`
16 DEV=`nvram get modem_dev4g`
17 TYP=`nvram get modem_type`
18 IFA=`nvram get wan_4g`
20 logger 4G MODEM - connecting ...
22 if [ "$TYP" == "non-hilink" ]; then
23 CONNECTED=0
25 if [ -z "$DEV" ]; then
26 logger 4G MODEM - DIAG interface not found - connection terminated
27 exit 0;
30 while [ $CONNECTED == "0" ]; do
31 MODE="AT^NDISDUP=1,1,\"$APN\"" gcom -d $DEV -s /etc/gcom/setverbose.gcom > /tmp/4g.mode
33 MODE="AT+CGCONTRDP" gcom -d $DEV -e -s /etc/gcom/setverbose.gcom > /tmp/4g.check
34 CHECK1=`cat /tmp/4g.check | grep ERROR | wc -l`
35 CHECK2=`cat /tmp/4g.check | grep open | wc -l`
36 if [ "$CHECK1" == "1" ]; then
37 logger 4G MODEM - device $DEV not connected yet ...
38 sleep 5
39 elif [ "$CHECK2" == "1" ]; then
40 logger 4G MODEM - device $DEV not ready ...
41 sleep 5
42 else
43 logger 4G MODEM - connected ...
44 CONNECTED=1
46 done
49 GO=0
50 while [ $GO = "0" ]; do
51 dhcpc-renew
53 CHECKIFA=`ifconfig | grep $IFA | wc -l`
54 if [ "$CHECKIFA" == "1" ]; then
55 GO=1
56 logger 4G MODEM - WAN configured ...
58 done
61 disconnect() {
62 DEV=`nvram get modem_dev4g`
63 TYP=`nvram get modem_type`
65 logger 4G MODEM - disconnecting ...
66 dhcpc-release
68 if [ "$TYP" == "non-hilink" ]; then
69 MODE="AT^NDISDUP=1,0" gcom -d $DEV -s /etc/gcom/setmode.gcom
73 checkLock() {
74 if [ -f $LOCK ]; then #lock exist
75 logger 4G MODEM - previous proces of switch4g still working
76 exit 0
79 touch $LOCK
82 setPIN() {
83 PIN=`nvram get modem_pin`
84 IS_PIN=`nvram get modem_pin | wc -w`
86 #set pin
87 if [ "$IS_PIN" == "1" -a "$TYPE" == "non-hilink" ]; then #only for non-hilink
88 PINCODE="$PIN" gcom -d $DEVNR -s /etc/gcom/setpin.gcom
92 switchMode() {
93 MODULES="cdc_ether cdc_ncm"
95 for MODULE in $MODULES; do
96 modprobe $MODULE
97 done
99 sleep 5
101 COUNT=0
102 FOUND=0
104 while [ $FOUND == "0" ]; do
105 #modem not found, try detect
106 DEVICES=`lsusb | awk '{print $6}'`
108 for SWITCH in $DEVICES; do
109 SEARCH=`ls /etc/usb_modeswitch.d/$SWITCH | wc -l`
111 # vendor:product
113 if [ "$SEARCH" == "1" ]; then
114 logger 4G MODEM FOUND - $SWITCH - Switching ...
115 DV=`echo $SWITCH | cut -d ":" -f1`
116 DP=`echo $SWITCH | cut -d ":" -f2`
117 /usr/sbin/usb_modeswitch -Q -c /etc/usb_modeswitch.d/$SWITCH -v $DV -p $DP
119 TEST1=`cat /etc/usb_modeswitch.d/$SWITCH | grep "TargetVendor" | cut -d "=" -f2 | wc -l`
120 if [ "$TEST1" == "1" ]; then
121 VENDOR=`cat /etc/usb_modeswitch.d/$SWITCH | grep "TargetVendor" | cut -d "=" -f2 | cut -d "x" -f2`
122 else
123 VENDOR=`echo $SWITCH | cut -d ":" -f1`
126 TEST2=`lsusb | awk '{print $6}' | grep $VENDOR | wc -l`
127 if [ "$TEST2" == "1" ]; then
128 PRODUCT=`lsusb | awk '{print $6}' | grep $VENDOR | cut -d ":" -f2`
129 logger 4G MODEM ready - $VENDOR:$PRODUCT
130 echo "$VENDOR:$PRODUCT" > /tmp/4g.detect
133 done
135 # is modem ready?
136 HL=`cat /proc/bus/usb/devices | grep Driver | grep cdc_ether | wc -l`
137 NHL=`cat /proc/bus/usb/devices | grep Driver | grep cdc_ncm | wc -l`
139 if [ "$HL" -gt 0 ]; then
140 logger 4G MODEM found - Hilink - using cdc_ether module
141 FOUND=1
142 break;
143 elif [ "$NHL" -gt 0 ]; then
144 logger 4G MODEM found - non-Hilink - using cdc_ncm module
145 FOUND=1
149 if [ "$COUNT" == "5" ]; then
150 logger 4G MODEM not found - process terminated!
151 break;
152 else
153 logger 4G MODEM not found - count: $COUNT
154 COUNT=`expr $COUNT + 1`
155 sleep 5
157 done
160 searchWAN() {
161 FOUND=0
162 COUNT=0
164 while [ $FOUND == "0" ]; do
165 for MODULE in $MODULES; do
166 SEARCH=`cat /proc/bus/usb/devices | grep Driver | grep $MODULE | wc -l`
168 if [ "$SEARCH" -gt 0 ]; then
169 if [ "$MODULE" == "cdc_ether" ]; then
170 TYPE="hilink"
171 elif [ "$MODULE" == "cdc_ncm" ]; then
172 TYPE="non-hilink"
173 else
174 TYPE="unknown"
177 logger 4G MODEM NDIS found - $TYPE - using $MODULE module
178 nvram set 4g_module=$MODULE
179 FOUND=1
180 break;
181 else
182 if [ "$COUNT" == "5" ]; then
183 logger 4G MODEM NDIS not found - process terminated!
184 rm $LOCK
185 exit 0;
186 else
187 logger 4G MODEM NDIS not found - $MODULE - count: $COUNT
188 COUNT=`expr $COUNT + 1`
189 sleep 5
192 done
193 done
195 #search WAN interface (usbX or ethX)
196 FOUND=0
197 COUNT=0
199 KERNEL=`uname -r | cut -d "." -f1,2,3`
201 while [ $FOUND == "0" ]; do
202 if [ "$KERNEL" == "2.6.36" ]; then #ARM
203 WAN=`dmesg | grep $MODULE | grep register | grep "'" | cut -d " " -f3 | cut -d ":" -f1 | tail -1`
204 else #MIPSEL
205 WAN=`dmesg | grep $MODULE | grep register | grep "'" | cut -d ":" -f1 | tail -1`
208 IS_WAN=`echo $WAN | wc -w`
210 if [ "$IS_WAN" -gt 0 ]; then
211 logger 4G MODEM WAN found - $TYPE - using $WAN as WAN
212 nvram set wan_4g="$WAN"
213 nvram set modem_type=$TYPE
214 FOUND=1
215 else
216 if [ "$COUNT" == "5" ]; then
217 logger 4G MODEM WAN not found - connection process terminated!
218 rm $LOCK
219 exit 0;
220 else
221 logger 4G MODEM WAN not found - count: $COUNT
222 COUNT=`expr $COUNT + 1`
223 sleep 5
226 done
229 searchDiag() {
230 if [ "$TYPE" == "non-hilink" ]; then #only for non-hilink
232 FOUND=0
234 US=`cat /proc/bus/usb/devices | grep Driver | grep usbserial | wc -l`
236 if [ "$US" -gt 0 ]; then
237 logger 4G MODEM found - Diagnostic interface - using usbserial module
238 break;
239 else
240 IS_VENDOR=`echo $VENDOR | wc -w`
241 if [ "$IS_VENDOR" -gt 0 ]; then
242 IS_PRODUCT=`echo $PRODUCT | wc -w`
243 if [ "$IS_PRODUCT" -gt 0 ]; then
244 logger 4G MODEM - loading module usbserial
245 rmmod usbserial
246 insmod usbserial vendor=0x$VENDOR product=0x$PRODUCT
247 echo "$VENDOR:$PRODUCT" > /tmp/4g.detect
251 DEV=`cat /proc/bus/usb/devices | grep Driver | grep usbserial | wc -l`
252 if [ "$DEV" -gt 0 ]; then
253 logger 4G MODEM ready - using usbserial module
254 FOUND=1
255 nvram set 4g_module=usbserial
256 else
257 #last change. try load usbserial for each usb devices
258 DEVICES=`lsusb | awk '{print $6}'`
259 for SWITCH in $DEVICES; do
260 if [ "$FOUND" == "0" ]; then
261 VENDOR=`echo $SWITCH | cut -d ":" -f1`
262 PRODUCT=`echo $SWITCH | cut -d ":" -f2`
263 rmmod usbserial
264 insmod usbserial vendor=0x$VENDOR product=0x$PRODUCT
266 DEV=`cat /proc/bus/usb/devices | grep Driver | grep usbserial | wc -l`
267 if [ "$DEV" -gt 0 ]; then
268 logger 4G MODEM ready - using usbserial module
269 nvram set 4g_module=usbserial
270 echo "$VENDOR:$PRODUCT" > /tmp/4g.detect
271 FOUND=1
272 break;
275 done
279 #search diagnostic device
280 TTY=`ls /dev/ttyUSB*`
282 for i in $TTY; do
283 CHECKTTY=`gcom -d $i -e info | grep OK | wc -l`
284 if [ "$CHECKTTY" == "1" ]; then #found working interface
285 logger 4G MODEM DIAG found - $i
286 nvram set modem_dev4g=$i
287 DEVNR=$i
288 else
289 logger 4G MODEM DIAG not found
291 done
295 signal() {
296 if [ "$TYPE" == "non-hilink" ]; then #only for non-hilink
297 #check signal strength
298 CSQ=`gcom -d $DEVNR -s /etc/gcom/getstrength.gcom | grep "CSQ:" | cut -d " " -f2 | cut -d "," -f1`
299 DBM=$((-113+CSQ*2))
300 logger "4G MODEM Signal Strength: $DBM dBm"
305 ###################################################
307 if [ "$1" == "connect" ]; then
308 connect
309 elif [ "$1" == "disconnect" ]; then
310 disconnect
311 else
312 checkLock
314 switchMode
316 searchWAN
318 searchDiag
320 setPIN
322 signal
324 #force connection after detect 4G modem
325 connect
327 #remove lock
328 rm $LOCK