154 lines
3.7 KiB
Bash
Executable File
154 lines
3.7 KiB
Bash
Executable File
#!/bin/sh /etc/rc.common
|
|
START=80
|
|
STOP=30
|
|
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
|
|
config_get enable_pcie_scan main enable_pcie_scan 0
|
|
config_get enable_usb_scan main enable_usb_scan 0
|
|
config_get try_preset_usb main try_preset_usb 1
|
|
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
|
|
fi
|
|
if [ "$try_preset_usb" -eq 1 ];then
|
|
_try_vendor_preset_usb
|
|
fi
|
|
|
|
#not enabled by default
|
|
if [ "$enable_usb_scan" -eq 1 ];then
|
|
_scan_usb
|
|
fi
|
|
if [ "$enable_pcie_scan" -eq 1 ];then
|
|
_scan_pcie
|
|
fi
|
|
}
|
|
|
|
_try_vendor_preset_usb()
|
|
{
|
|
config_foreach _try_usb_device modem-device
|
|
config_foreach _try_usb_slot modem-slot
|
|
}
|
|
|
|
_try_vendor_preset_pcie()
|
|
{
|
|
config_foreach _try_pcie_device modem-device
|
|
config_foreach _try_pcie_slot modem-slot
|
|
}
|
|
|
|
_try_pcie_slot()
|
|
{
|
|
config_get type "$1" type
|
|
[ "$type" == "pcie" ] && _try_slot $1
|
|
}
|
|
|
|
_try_usb_slot()
|
|
{
|
|
config_get type "$1" type
|
|
[ "$type" == "usb" ] && _try_slot $1
|
|
}
|
|
|
|
_try_usb_device()
|
|
{
|
|
config_get data_interface $1 data_interface
|
|
[ "$data_interface" == "usb" ] && _try_device
|
|
}
|
|
|
|
_try_pcie_device()
|
|
{
|
|
config_get data_interface $1 data_interface
|
|
[ "$data_interface" == "pcie" ] && _try_device
|
|
}
|
|
|
|
_scan_usb()
|
|
{
|
|
procd_open_instance "scan_usb"
|
|
#delay 15 second ,scan all usb device
|
|
procd_set_param command "ash" "/usr/share/qmodem/modem_scan.sh" "scan" "15" "usb"
|
|
procd_close_instance
|
|
}
|
|
|
|
_scan_pcie()
|
|
{
|
|
procd_open_instance "scan_pcie"
|
|
#delay 3 second ,scan all pcie device
|
|
procd_set_param command "ash" "/usr/share/qmodem/modem_scan.sh" "scan" "3" "pcie"
|
|
procd_close_instance
|
|
}
|
|
|
|
_mk_rundir()
|
|
{
|
|
modem_cfg="$1"
|
|
mkdir -p "/var/run/qmodem/${modem_cfg}_dir"
|
|
}
|
|
|
|
_try_slot()
|
|
{
|
|
config_get slot "$1" slot
|
|
config_get type "$1" type
|
|
case "$type" in
|
|
usb)
|
|
path="/sys/bus/usb/devices/${slot}"
|
|
;;
|
|
pcie)
|
|
path="/sys/bus/pci/devices/${slot}"
|
|
;;
|
|
esac
|
|
|
|
if [ -d "$path" ]; then
|
|
logger -t modem_init "try modem $1"
|
|
procd_open_instance "try_$1"
|
|
procd_set_param command "ash" "/usr/share/qmodem/modem_scan.sh" "add" "$slot" "$type"
|
|
procd_close_instance
|
|
else
|
|
/usr/share/qmodem/modem_scan.sh disable "$slot"
|
|
fi
|
|
}
|
|
|
|
_try_device()
|
|
{
|
|
config_get path "$1" path
|
|
config_get type "$1" type
|
|
case "$type" in
|
|
usb)
|
|
path="/sys/bus/usb/devices/${path}"
|
|
;;
|
|
pcie)
|
|
path="/sys/bus/pci/devices/${path}"
|
|
;;
|
|
esac
|
|
if [ ! -d "$path" ]; then
|
|
/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
|
|
} |