From 68cf55631f768855b9f0db06194c39316cea155c Mon Sep 17 00:00:00 2001 From: sfwtw Date: Thu, 22 May 2025 16:53:24 +0800 Subject: [PATCH] luci-app-qmodem: perf: auto add option_driver --- .../root/etc/init.d/qmodem_init | 25 +++++++++++-- .../root/etc/init.d/qmodem_reboot | 35 +++++++++++-------- .../usr/share/qmodem/modem_port_rule.json | 4 +++ .../root/usr/share/qmodem/modem_scan.sh | 1 + 4 files changed, 48 insertions(+), 17 deletions(-) diff --git a/luci/luci-app-qmodem/root/etc/init.d/qmodem_init b/luci/luci-app-qmodem/root/etc/init.d/qmodem_init index 8ac6b71..f7c4d0e 100755 --- a/luci/luci-app-qmodem/root/etc/init.d/qmodem_init +++ b/luci/luci-app-qmodem/root/etc/init.d/qmodem_init @@ -6,7 +6,6 @@ USE_PROCD=1 . /lib/functions.sh start_service() { - config_load qmodem config_foreach _mk_rundir modem-device config_get block_auto_probe main block_auto_probe 0 @@ -16,7 +15,10 @@ start_service() { config_get try_preset_pcie main try_preset_pcie 1 #once enabled, skip all check or scan [ "$block_auto_probe" -eq 1 ] && return - + + #auto add option driver for usb device + config_foreach _usb_option_driver modem-device + #enabled by default if [ "$try_preset_pcie" -eq 1 ];then _try_vendor_preset_pcie @@ -131,3 +133,22 @@ _try_device() /usr/share/qmodem/modem_scan.sh disable "$1" fi } + +_usb_option_driver() +{ + [ "$(config_get "$1" data_interface)" = "usb" ] && [ "$(config_get "$1" option_driver)" = "1" ] || return + + local path=$(config_get "$1" path) + local slot_vid=$(cat "${path}/idVendor" 2>/dev/null) + local slot_pid=$(cat "${path}/idProduct" 2>/dev/null) + + if [ -n "$slot_vid" ] && [ -n "$slot_pid" ]; then + if echo "$slot_vid $slot_pid" > /sys/bus/usb-serial/drivers/option1/new_id 2>/dev/null; then + logger -t modem_init "Set option driver for $1 (VID:$slot_vid PID:$slot_pid)" + else + logger -t modem_init "Failed to set option driver for $1 (VID:$slot_vid PID:$slot_pid)" + fi + else + logger -t modem_init "Unable to get VID/PID for device $1" + fi +} \ No newline at end of file diff --git a/luci/luci-app-qmodem/root/etc/init.d/qmodem_reboot b/luci/luci-app-qmodem/root/etc/init.d/qmodem_reboot index 612f825..72ee15b 100755 --- a/luci/luci-app-qmodem/root/etc/init.d/qmodem_reboot +++ b/luci/luci-app-qmodem/root/etc/init.d/qmodem_reboot @@ -11,24 +11,29 @@ stop_service() { procd_set_param timeout 30 config_load qmodem config_foreach _soft_reboot modem-device - } _soft_reboot() { config_get soft_reboot $1 soft_reboot - if [ "$soft_reboot" == "1" ]; then - config_get at_port $1 at_port + [ "$soft_reboot" != "1" ] && return 0 + + config_get at_port $1 at_port + [ -z "$at_port" ] && return 0 + + for i in $(seq 1 3); do response=$(tom_modem -d "$at_port" -o a -c "AT+CFUN=1,1") - retries=3 - while ! echo "$response" | grep -qi "ok" && [ $retries -gt 0 ]; do - sleep 1 - response=$(tom_modem -d "$at_port" -o a -c "AT+CFUN=1,1") - retries=$((retries - 1)) - done - max_retries=15 - while [ -e "$at_port" ] && [ $max_retries -gt 0 ]; do - sleep 1 - max_retries=$((max_retries - 1)) - done - fi + echo "$response" | grep -qi "ok" && break + sleep 1 + done + + for i in $(seq 1 15); do + [ ! -e "$at_port" ] && { + echo "Device disconnected after $i seconds" + return 0 + } + sleep 1 + done + + echo "Device did not disconnect within timeout period" + return 0 } \ No newline at end of file diff --git a/luci/luci-app-qmodem/root/usr/share/qmodem/modem_port_rule.json b/luci/luci-app-qmodem/root/usr/share/qmodem/modem_port_rule.json index 98cc289..34184a2 100644 --- a/luci/luci-app-qmodem/root/usr/share/qmodem/modem_port_rule.json +++ b/luci/luci-app-qmodem/root/usr/share/qmodem/modem_port_rule.json @@ -36,6 +36,10 @@ "3466:3301": { "name": "mt5700m-cn", "option_driver": 1 + }, + "2c7c:8101": { + "name": "rg801", + "option_driver": 1 } } } diff --git a/luci/luci-app-qmodem/root/usr/share/qmodem/modem_scan.sh b/luci/luci-app-qmodem/root/usr/share/qmodem/modem_scan.sh index 5269574..6a3be55 100755 --- a/luci/luci-app-qmodem/root/usr/share/qmodem/modem_scan.sh +++ b/luci/luci-app-qmodem/root/usr/share/qmodem/modem_scan.sh @@ -492,6 +492,7 @@ EOF for at_port in $at_ports; do uci add_list qmodem.$section_name.ports="/dev/$at_port" done + [ "$option_driver" == "1" ] && uci set qmodem.$section_name.option_driver="1" uci commit qmodem mkdir -p /var/run/qmodem/${section_name}_dir lock -u /tmp/lock/modem_add_$slot