#!/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 }