kernel: fq_codel: dont reinit flow state
[openwrt.git] / package / comgt / files / 3g.sh
index 500269c..2ed74b4 100644 (file)
@@ -1,87 +1,84 @@
-set_3g_led() {
-       grep WRT54G3G /proc/diag/model >/dev/null || return 0
-       echo "$1" > /proc/diag/led/3g_green
-       echo "$2" > /proc/diag/led/3g_blue
-       echo "$3" > /proc/diag/led/3g_blink
-}
-
-scan_3g() {
-       local device
+#!/bin/sh
+INCLUDE_ONLY=1
 
-       scan_ppp "$@"
-       config_get device "$1" device
+. ../netifd-proto.sh
+. ./ppp.sh
+init_proto "$@"
 
-       # try to figure out the device if it's invalid
-       [ -n "$device" -a -e "$device" ] || {
-               for device in /dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2 /dev/tts/2 /dev/usb/tts/0 /dev/noz0; do
-                       [ -e "$device" ] && {
-                               config_set "$1" device "$device"
-                               break
-                       }
-               done
-       }
-
-       # enable 3G with the 3G button by default
-       config_get button "$1" button
-       [ -z "$button" ] && {
-               config_set "$1" button 1
-       }
+proto_3g_init_config() {
+       no_device=1
+       available=1
+       ppp_generic_init_config
+       proto_config_add_string "device"
+       proto_config_add_string "apn"
+       proto_config_add_string "service"
+       proto_config_add_string "pincode"
 }
 
-stop_interface_3g() {
-       set_3g_led 0 0 0
-       killall gcom >/dev/null 2>/dev/null
-}
+proto_3g_setup() {
+       local interface="$1"
+       local chat
 
-setup_interface_3g() {
-       local iface="$1"
-       local config="$2"
-       local chat="/etc/chatscripts/3g.chat"
-       
-       config_get device "$config" device
+       json_get_var device device
+       json_get_var apn apn
+       json_get_var service service
+       json_get_var pincode pincode
 
-       for module in slhc ppp_generic ppp_async; do
-               /sbin/insmod $module 2>&- >&-
-       done
+       [ -e "$device" ] || {
+               proto_set_available "$interface" 0
+               return 1
+       }
 
-       config_get apn "$cfg" apn
-       config_get service "$cfg" service
-       config_get pincode "$cfg" pincode
-       config_get mtu "$cfg" mtu
+       case "$service" in
+               cdma|evdo)
+                       chat="/etc/chatscripts/evdo.chat"
+               ;;
+               *)
+                       chat="/etc/chatscripts/3g.chat"
+                       cardinfo=$(gcom -d "$device" -s /etc/gcom/getcardinfo.gcom)
+                       if echo "$cardinfo" | grep -q Novatel; then
+                               case "$service" in
+                                       umts_only) CODE=2;;
+                                       gprs_only) CODE=1;;
+                                       *) CODE=0;;
+                               esac
+                               export MODE="AT\$NWRAT=${CODE},2"
+                       elif echo "$cardinfo" | grep -q Option; then
+                               case "$service" in
+                                       umts_only) CODE=1;;
+                                       gprs_only) CODE=0;;
+                                       *) CODE=3;;
+                               esac
+                               export MODE="AT_OPSYS=${CODE}"
+                       elif echo "$cardinfo" | grep -q "Sierra Wireless"; then
+                               SIERRA=1
+                       elif echo "$cardinfo" | grep -qi huawei; then
+                               case "$service" in
+                                       umts_only) CODE="14,2";;
+                                       gprs_only) CODE="13,1";;
+                                       *) CODE="2,2";;
+                               esac
+                               export MODE="AT^SYSCFG=${CODE},3FFFFFFF,2,4"
+                       fi
 
-       set_3g_led 1 0 1
+                       if [ -n "$pincode" ]; then
+                               PINCODE="$pincode" gcom -d "$device" -s /etc/gcom/setpin.gcom || {
+                                       proto_notify_error "$interface" PIN_FAILED
+                                       proto_block_restart "$interface"
+                                       return 1
+                               }
+                       fi
+                       [ -n "$MODE" ] && gcom -d "$device" -s /etc/gcom/setmode.gcom
 
-       # figure out hardware specific commands for the card
-       case "$service" in
-               cdma|evdo) chat="/etc/chatscripts/evdo.chat";;
-       *)
-               if gcom -d "$device" -s /etc/gcom/getcardinfo.gcom | grep Novatel 2>/dev/null >/dev/null; then
-                       case "$service" in
-                               umts_only) CODE=2;;
-                               gprs_only) CODE=1;;
-                               *) CODE=0;;
-                       esac
-                       mode="AT\$NWRAT=${CODE},2"
-               else
-                       case "$service" in
-                               umts_only) CODE=1;;
-                               gprs_only) CODE=0;;
-                               *) CODE=3;;
-                       esac
-                       mode="AT_OPSYS=${CODE}"
-               fi
-               
-               PINCODE="$pincode" gcom -d "$device" -s /etc/gcom/setpin.gcom || {
-                       echo "$cfg(3g): Failed to set the PIN code."
-                       set_3g_led 0 0 0
-                       return 1
-               }
-               MODE="$mode" gcom -d "$device" -s /etc/gcom/setmode.gcom
+                       # wait for carrier to avoid firmware stability bugs
+                       [ -n "$SIERRA" ] && {
+                               gcom -d "$device" -s /etc/gcom/getcarrier.gcom || return 1
+                       }
+               ;;
        esac
-       set_3g_led 1 0 0
 
-       config_set "$config" "connect" "${apn:+USE_APN=$apn }/usr/sbin/chat -t5 -f $chat"
-       start_pppd "$config" \
+       connect="${apn:+USE_APN=$apn }/usr/sbin/chat -t5 -v -E -f $chat"
+       ppp_generic_setup "$interface" \
                noaccomp \
                nopcomp \
                novj \
@@ -89,6 +86,12 @@ setup_interface_3g() {
                noauth \
                lock \
                crtscts \
-               ${mtu:+mtu $mtu mru $mtu} \
                115200 "$device"
+       return 0
 }
+
+proto_3g_teardown() {
+       proto_kill_command "$interface"
+}
+
+add_protocol 3g