openwrt/package/network/utils/wwan/files/wwan.sh
David Thornley cb262b0939 wwan: Add support for Gemalto Cinterion cellular modules
Includes specific support for PH8(1e2d-0053) / ELS61(1e2d-005b) modules.

Note for ELS61, the serial driver changes from serial option(ttyUSB) to usb-cdc (ttyACM).

Two additional fixes in this commit resolve issues with ttyACM devices: -

* wwan.sh - sys-fs has a subdirectory indirection (*/tty/ttyACMx) which was not handled properly
* wwan.usb - dependent scripts were not included, so this never actually called proto_set_available for example (and relied on inadvertent call for ttyUSB case)

Signed-off-by: David Thornley <david.thornley@touchstargroup.com>
2018-06-22 09:31:32 +02:00

120 lines
3.4 KiB
Bash
Executable File

#!/bin/sh
. /lib/functions.sh
. ../netifd-proto.sh
init_proto "$@"
INCLUDE_ONLY=1
ctl_device=""
dat_device=""
proto_mbim_setup() { echo "wwan[$$] mbim proto is missing"; }
proto_qmi_setup() { echo "wwan[$$] qmi proto is missing"; }
proto_ncm_setup() { echo "wwan[$$] ncm proto is missing"; }
proto_3g_setup() { echo "wwan[$$] 3g proto is missing"; }
proto_directip_setup() { echo "wwan[$$] directip proto is missing"; }
[ -f ./mbim.sh ] && . ./mbim.sh
[ -f ./ncm.sh ] && . ./ncm.sh
[ -f ./qmi.sh ] && . ./qmi.sh
[ -f ./3g.sh ] && { . ./ppp.sh; . ./3g.sh; }
[ -f ./directip.sh ] && . ./directip.sh
proto_wwan_init_config() {
available=1
no_device=1
proto_config_add_string apn
proto_config_add_string auth
proto_config_add_string username
proto_config_add_string password
proto_config_add_string pincode
proto_config_add_string delay
proto_config_add_string modes
}
proto_wwan_setup() {
local driver usb devicename desc
for a in `ls /sys/bus/usb/devices`; do
local vendor product
[ -z "$usb" -a -f /sys/bus/usb/devices/$a/idVendor -a -f /sys/bus/usb/devices/$a/idProduct ] || continue
vendor=$(cat /sys/bus/usb/devices/$a/idVendor)
product=$(cat /sys/bus/usb/devices/$a/idProduct)
[ -f /lib/network/wwan/$vendor:$product ] && {
usb=/lib/network/wwan/$vendor:$product
devicename=$a
}
done
[ -n "$usb" ] && {
local old_cb control data
json_set_namespace wwan old_cb
json_init
json_load "$(cat $usb)"
json_select
json_get_vars desc control data
json_set_namespace $old_cb
[ -n "$control" -a -n "$data" ] && {
ttys=$(ls -d /sys/bus/usb/devices/$devicename/${devicename}*/tty?* /sys/bus/usb/devices/$devicename/${devicename}*/tty/tty?* | sed "s/.*\///g" | tr "\n" " ")
ctl_device=/dev/$(echo $ttys | cut -d" " -f $((control + 1)))
dat_device=/dev/$(echo $ttys | cut -d" " -f $((data + 1)))
driver=comgt
}
}
[ -z "$ctl_device" ] && for net in $(ls /sys/class/net/ | grep -e wwan -e usb); do
[ -z "$ctl_device" ] || continue
driver=$(grep DRIVER /sys/class/net/$net/device/uevent | cut -d= -f2)
case "$driver" in
qmi_wwan|cdc_mbim)
ctl_device=/dev/$(ls /sys/class/net/$net/device/usbmisc)
;;
sierra_net|cdc_ether|*cdc_ncm)
ctl_device=/dev/$(cd /sys/class/net/$net/; find ../../../ -name ttyUSB* |xargs -n1 basename | head -n1)
;;
*) continue;;
esac
echo "wwan[$$]" "Using proto:$proto device:$ctl_device iface:$net desc:$desc"
done
[ -n "$ctl_device" ] || {
echo "wwan[$$]" "No valid device was found"
proto_notify_error "$interface" NO_DEVICE
proto_block_restart "$interface"
return 1
}
uci_set_state network $interface driver "$driver"
uci_set_state network $interface ctl_device "$ctl_device"
uci_set_state network $interface dat_device "$dat_device"
case $driver in
qmi_wwan) proto_qmi_setup $@ ;;
cdc_mbim) proto_mbim_setup $@ ;;
sierra_net) proto_directip_setup $@ ;;
comgt) proto_3g_setup $@ ;;
cdc_ether|*cdc_ncm) proto_ncm_setup $@ ;;
esac
}
proto_wwan_teardown() {
local interface=$1
local driver=$(uci_get_state network $interface driver)
ctl_device=$(uci_get_state network $interface ctl_device)
dat_device=$(uci_get_state network $interface dat_device)
case $driver in
qmi_wwan) proto_qmi_teardown $@ ;;
cdc_mbim) proto_mbim_teardown $@ ;;
sierra_net) proto_mbim_teardown $@ ;;
comgt) proto_3g_teardown $@ ;;
cdc_ether|*cdc_ncm) proto_ncm_teardown $@ ;;
esac
}
add_protocol wwan