wwan: check new uci bus option on proto setup event
authorFlorian Eckert <fe@dev.tdt.de>
Wed, 23 Aug 2017 05:23:52 +0000 (07:23 +0200)
committerJo-Philipp Wich <jo@mein.io>
Fri, 18 Oct 2019 17:46:21 +0000 (19:46 +0200)
If system has more then one and different wwan interface (modem). Then the
wwan protohandler will always take the modem which is discovered first.
The protohandler will always setup the same interface. To fix this add a
new usb "bus" option which is associated with wwan device and so will set
the specified interface up. With this change more then one interface
could be mananged by the wwan protohandler.

If the "bus" option is not set in the uci network config then the protohandler
behaves as before the change. The protohanldler will take the first
interface which he founds.

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
package/network/utils/wwan/Makefile
package/network/utils/wwan/files/wwan.sh

index 8ce9fd224c35b7b8fe3039efb586418d0840d215..16291de0b15766178795654c699a6b12d1eabe3f 100644 (file)
@@ -1,7 +1,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=wwan
-PKG_VERSION:=2014-07-17
+PKG_VERSION:=2019-04-29
 PKG_RELEASE=1
 
 PKG_LICENSE:=GPL-2.0
index 303fa9e99eeace741851ab36b5bf2d76c2c722c4..4843b1dd4746db278e4c3fa35b09b835f8b500d0 100755 (executable)
@@ -32,21 +32,45 @@ proto_wwan_init_config() {
        proto_config_add_string pincode
        proto_config_add_string delay
        proto_config_add_string modes
+       proto_config_add_string bus
 }
 
 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
+       local driver usb devicename desc bus
+
+       json_get_vars bus
+
+       if [ -L "/sys/bus/usb/devices/${bus}" ]; then
+               if [ -f "/sys/bus/usb/devices/${bus}/idVendor" ] \
+                       && [ -f "/sys/bus/usb/devices/${bus}/idProduct" ]; then
+                       local vendor product
+                       vendor=$(cat /sys/bus/usb/devices/${bus}/idVendor)
+                       product=$(cat /sys/bus/usb/devices/${bus}/idProduct)
+                       [ -f /lib/network/wwan/$vendor:$product ] && {
+                               usb=/lib/network/wwan/$vendor:$product
+                               devicename=$bus
+                       }
+               else
+                       echo "wwan[$$]" "Specified usb bus ${bus} was not found"
+                       proto_notify_error "$interface" NO_USB
+                       proto_block_restart "$interface"
+                       return 1
+               fi
+       else
+               echo "wwan[$$]" "Searching for a valid wwan usb device..."
+               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
+       fi
+
+       echo "wwan[$$]" "Using wwan usb device on bus $devicename"
 
        [ -n "$usb" ] && {
                local old_cb control data
@@ -68,6 +92,9 @@ proto_wwan_setup() {
 
        [ -z "$ctl_device" ] && for net in $(ls /sys/class/net/ | grep -e wwan -e usb); do
                [ -z "$ctl_device" ] || continue
+               [ -n "$bus" ] && {
+                       [ $(readlink /sys/class/net/$net | grep $bus) ] || continue
+               }
                driver=$(grep DRIVER /sys/class/net/$net/device/uevent | cut -d= -f2)
                case "$driver" in
                qmi_wwan|cdc_mbim)