Wifi don't autoopen after reboot or start,

I can open wifi via wifi up .
How to make wifi autostart when start ?
Add wifi up to /etc/rc.local ? is that right?

root@OpenWrt:~# ls -l /etc/rc.d/
lrwxrwxrwx    1 root     root            21 Oct 18 19:05 K10gpio_switch -> ../init.d/gpio_switch
lrwxrwxrwx    1 root     root            18 Oct 18 19:05 K50dropbear -> ../init.d/dropbear
lrwxrwxrwx    1 root     root            16 Oct 18 19:05 K85odhcpd -> ../init.d/odhcpd
lrwxrwxrwx    1 root     root            13 Oct 18 19:05 K89log -> ../init.d/log
lrwxrwxrwx    1 root     root            14 Oct 18 19:05 K90boot -> ../init.d/boot
lrwxrwxrwx    1 root     root            17 Oct 18 19:05 K90network -> ../init.d/network
lrwxrwxrwx    1 root     root            20 Oct 18 19:05 K90sysfixtime -> ../init.d/sysfixtime
lrwxrwxrwx    1 root     root            16 Oct 18 19:05 K90umount -> ../init.d/umount
lrwxrwxrwx    1 root     root            20 Oct 18 19:05 S00sysfixtime -> ../init.d/sysfixtime
lrwxrwxrwx    1 root     root            15 Oct 18 19:05 S00urngd -> ../init.d/urngd
lrwxrwxrwx    1 root     root            14 Oct 18 19:05 S10boot -> ../init.d/boot
lrwxrwxrwx    1 root     root            16 Oct 18 19:05 S10system -> ../init.d/system
lrwxrwxrwx    1 root     root            16 Oct 18 19:05 S11sysctl -> ../init.d/sysctl
lrwxrwxrwx    1 root     root            13 Oct 18 19:05 S12log -> ../init.d/log
lrwxrwxrwx    1 root     root            14 Oct 25 09:02 S12rpcd -> ../init.d/rpcd
lrwxrwxrwx    1 root     root            17 Oct 18 19:05 S19dnsmasq -> ../init.d/dnsmasq
lrwxrwxrwx    1 root     root            18 Oct 18 19:05 S19dropbear -> ../init.d/dropbear
lrwxrwxrwx    1 root     root            18 Oct 18 19:05 S19firewall -> ../init.d/firewall
lrwxrwxrwx    1 root     root            17 Oct 18 19:05 S20network -> ../init.d/network
lrwxrwxrwx    1 root     root            16 Oct 18 19:05 S35odhcpd -> ../init.d/odhcpd
lrwxrwxrwx    1 root     root            14 Oct 18 19:05 S50cron -> ../init.d/cron
lrwxrwxrwx    1 root     root            16 Oct 26 08:54 S50uhttpd -> ../init.d/uhttpd
lrwxrwxrwx    1 root     root            15 Oct 25 10:52 S79uwsgi -> ../init.d/uwsgi
lrwxrwxrwx    1 root     root            15 Oct 25 10:47 S80nginx -> ../init.d/nginx
lrwxrwxrwx    1 root     root            18 Oct 25 09:02 S80ucitrack -> ../init.d/ucitrack
lrwxrwxrwx    1 root     root            21 Oct 18 19:05 S94gpio_switch -> ../init.d/gpio_switch
lrwxrwxrwx    1 root     root            14 Oct 18 19:05 S95done -> ../init.d/done
lrwxrwxrwx    1 root     root            13 Oct 18 19:05 S96led -> ../init.d/led
lrwxrwxrwx    1 root     root            17 Oct 26 08:52 S98sysntpd -> ../init.d/sysntpd
lrwxrwxrwx    1 root     root            19 Oct 18 19:05 S99bootcount -> ../init.d/bootcount
lrwxrwxrwx    1 root     root            26 Oct 18 19:05 S99set-irq-affinity -> ../init.d/set-irq-affinity
lrwxrwxrwx    1 root     root            22 Oct 18 19:05 S99urandom_seed -> ../init.d/urandom_seed


root@OpenWrt:~# cat /etc/init.d/network
#!/bin/sh /etc/rc.common

START=20
STOP=90

USE_PROCD=1

init_switch() {
        setup_switch() { return 0; }

        include /lib/network
        setup_switch
}

start_service() {
        init_switch

        procd_open_instance
        procd_set_param command /sbin/netifd
        procd_set_param respawn
        procd_set_param watch network.interface
        [ -e /proc/sys/kernel/core_pattern ] && {
                procd_set_param limits core="unlimited"
        }
        procd_close_instance
}

reload_service() {
        local rv=0

        init_switch
        ubus call network reload || rv=1
        /sbin/wifi reload_legacy
        return $rv
}

stop_service() {
        /sbin/wifi down
        ifdown -a
        sleep 1
}

validate_atm_bridge_section()
{
        uci_validate_section network "atm-bridge" "${1}" \
                'unit:uinteger:0' \
                'vci:range(32, 65535):35' \
                'vpi:range(0, 255):8' \
                'atmdev:uinteger:0' \
                'encaps:or("llc", "vc"):llc' \
                'payload:or("bridged", "routed"):bridged'
}

validate_route_section()
{
        uci_validate_section network route "${1}" \
                'interface:string' \
                'target:cidr4' \
                'netmask:netmask4' \
                'gateway:ip4addr' \
                'metric:uinteger' \
                'mtu:uinteger' \
                'table:or(range(0,65535),string)'
}

validate_route6_section()
{
        uci_validate_section network route6 "${1}" \
                'interface:string' \
                'target:cidr6' \
                'gateway:ip6addr' \
                'metric:uinteger' \
                'mtu:uinteger' \
                'table:or(range(0,65535),string)'
}

validate_rule_section()
{
        uci_validate_section network rule "${1}" \
                'in:string' \
                'out:string' \
                'src:cidr4' \
                'dest:cidr4' \
                'tos:range(0,31)' \
                'mark:string' \
                'invert:bool' \
                'lookup:or(range(0,65535),string)' \
                'goto:range(0,65535)' \
                'action:or("prohibit", "unreachable", "blackhole", "throw")'
}

validate_rule6_section()
{
        uci_validate_section network rule6 "${1}" \
                'in:string' \
                'out:string' \
                'src:cidr6' \
                'dest:cidr6' \
                'tos:range(0,31)' \
                'mark:string' \
                'invert:bool' \
                'lookup:or(range(0,65535),string)' \
                'goto:range(0,65535)' \
                'action:or("prohibit", "unreachable", "blackhole", "throw")'
}

validate_switch_section()
{
        uci_validate_section network switch "${1}" \
                'name:string' \
                'enable:bool' \
                'enable_vlan:bool' \
                'reset:bool' \
                'ar8xxx_mib_poll_interval:uinteger' \
                'ar8xxx_mib_type:range(0,1)'
}

validate_switch_vlan()
{
        uci_validate_section network switch_vlan "${1}" \
                'device:string' \
                'vlan:uinteger' \
                'ports:list(ports)'
}

service_triggers()
{
        procd_add_reload_trigger network wireless

        procd_open_validate
        validate_atm_bridge_section
        validate_route_section
        [ -e /proc/sys/net/ipv6 ] && validate_route6_section
        validate_rule_section
        [ -e /proc/sys/net/ipv6 ] && validate_rule6_section
        validate_switch_section
        validate_switch_vlan
        procd_close_validate
}

shutdown() {
        ifdown -a
        sleep 1
}

root@OpenWrt:~# cat /etc/config/wireless

config wifi-device 'radio0'
        option type 'mac80211'
        option hwmode '11g'
        option path 'pci0000:00/0000:00:00.0/0000:01:00.0'
        option country '**'
        option htmode 'HT20'
        option channel '13'
        option disabled '0'

config wifi-iface 'default_radio0'
        option device 'radio0'
        option network 'lan'
        option mode 'ap'
        option key '3333333333333333333333'
        option ssid '4444444444444444'
        option encryption 'psk2+ccmp'
        option disabled '0'

config wifi-device 'radio1'
        option type 'mac80211'
        option hwmode '11a'
        option path 'pci0000:00/0000:00:01.0/0000:02:00.0'
        option country '**'
        option noscan '1'
        option txpower '22'
        option channel '48'
        option htmode 'VHT160'
        option disabled '0'

config wifi-iface 'default_radio1'
        option device 'radio1'
        option network 'lan'
        option mode 'ap'
        option key '111111111111111111111'
        option ssid '222222222222222222'
        option encryption 'psk2+ccmp'
        option disabled '0'


root@OpenWrt:~# cat /etc/config/wifitoggle
config wifitoggle
        option button   'wps'

        option persistent       '0'
        option timer            '600'

        #option led_sysfs               'wrt160nl:amber:wps'
        # Leaving this option empty, makes sure that no LED is touched
        option led_sysfs                ''
        option led_enable_trigger       'timer'
        option led_enable_delayon       '500'
        option led_enable_delayoff      '500'
        option led_disable_default      '0'

https://openwrt.org/toh/xiaomi/xiaomi_r3p_pro

I think bootlog would be more beneficial for anyone trying to help you. Please also provide more detail about your device.

As it seems the devices are being identified during boot but somehow drivers fail to load the WiFi and that is the reason it's not coming up on its own. I am not an expert in this matter but maybe there is a bug somewhere.

Have you tried resetting the device to see maybe there is a configuration error somewhere?

I don't want to reset anymore , the internet is censored and slow sometimes blocked .

I found /sbin/wifi is a sh file, wifi up use mac80211's function--- wifi_updown(). So the driver must load successfuly or wifi up won't work after start.

root@OpenWrt:~#  cat /sbin/wifi
#!/bin/sh
# Copyright (C) 2006 OpenWrt.org

. /lib/functions.sh
. /usr/share/libubox/jshn.sh

usage() {
        cat <<EOF
Usage: $0 [config|up|down|reload|status]
enables (default), disables or configures devices not yet configured.
EOF
        exit 1
}

ubus_wifi_cmd() {
        local cmd="$1"
        local dev="$2"

        json_init
        [ -n "$2" ] && json_add_string device "$2"
        ubus call network.wireless "$1" "$(json_dump)"
}

find_net_config() {(
        local vif="$1"
        local cfg
        local ifname

        config_get cfg "$vif" network

        [ -z "$cfg" ] && {
                include /lib/network
                scan_interfaces

                config_get ifname "$vif" ifname

                cfg="$(find_config "$ifname")"
        }
        [ -z "$cfg" ] && return 0
        echo "$cfg"
)}


bridge_interface() {(
        local cfg="$1"
        [ -z "$cfg" ] && return 0

        include /lib/network
        scan_interfaces

        for cfg in $cfg; do
                config_get iftype "$cfg" type
                [ "$iftype" = bridge ] && config_get "$cfg" ifname
                prepare_interface_bridge "$cfg"
                return $?
        done
)}

prepare_key_wep() {
        local key="$1"
        local hex=1

        echo -n "$key" | grep -qE "[^a-fA-F0-9]" && hex=0
        [ "${#key}" -eq 10 -a $hex -eq 1 ] || \
        [ "${#key}" -eq 26 -a $hex -eq 1 ] || {
                [ "${key:0:2}" = "s:" ] && key="${key#s:}"
                key="$(echo -n "$key" | hexdump -ve '1/1 "%02x" ""')"
        }
        echo "$key"
}

wifi_fixup_hwmode() {
        local device="$1"
        local default="$2"
        local hwmode hwmode_11n

        config_get channel "$device" channel
        config_get hwmode "$device" hwmode
        case "$hwmode" in
                11bg) hwmode=bg;;
                11a) hwmode=a;;
                11b) hwmode=b;;
                11g) hwmode=g;;
                11n*)
                        hwmode_11n="${hwmode##11n}"
                        case "$hwmode_11n" in
                                a|g) ;;
                                default) hwmode_11n="$default"
                        esac
                        config_set "$device" hwmode_11n "$hwmode_11n"
                ;;
                *)
                        hwmode=
                        if [ "${channel:-0}" -gt 0 ]; then
                                if [ "${channel:-0}" -gt 14 ]; then
                                        hwmode=a
                                else
                                        hwmode=g
                                fi
                        else
                                hwmode="$default"
                        fi
                ;;
        esac
        config_set "$device" hwmode "$hwmode"
}

_wifi_updown() {
        for device in ${2:-$DEVICES}; do (
                config_get disabled "$device" disabled
                [ "$disabled" = "1" ] && {
                        echo "'$device' is disabled"
                        set disable
                }
                config_get iftype "$device" type
                if eval "type ${1}_$iftype" 2>/dev/null >/dev/null; then
                        eval "scan_$iftype '$device'"
                        eval "${1}_$iftype '$device'" || echo "$device($iftype): ${1} failed"
                elif [ ! -f /lib/netifd/wireless/$iftype.sh ]; then
                        echo "$device($iftype): Interface type not supported"
                fi
        ); done
}

wifi_updown() {
        cmd=down
        [ enable = "$1" ] && {
                _wifi_updown disable "$2"
                ubus_wifi_cmd "$cmd" "$2"
                scan_wifi
                cmd=up
        }
        ubus_wifi_cmd "$cmd" "$2"
        _wifi_updown "$@"
}

wifi_reload_legacy() {
        _wifi_updown "disable" "$1"
        scan_wifi
        _wifi_updown "enable" "$1"
}

wifi_reload() {
        ubus call network reload
        wifi_reload_legacy
}

wifi_detect_notice() {
        >&2 echo "WARNING: Wifi detect is deprecated. Use wifi config instead"
        >&2 echo "For more information, see commit 5f8f8a366136a07df661e31decce2458357c167a"
        exit 1
}

wifi_config() {
        [ ! -f /etc/config/wireless ] && touch /etc/config/wireless

        for driver in $DRIVERS; do (
                if eval "type detect_$driver" 2>/dev/null >/dev/null; then
                        eval "detect_$driver" || echo "$driver: Detect failed" >&2
                else
                        echo "$driver: Hardware detection not supported" >&2
                fi
        ); done
}

start_net() {(
        local iface="$1"
        local config="$2"
        local vifmac="$3"

        [ -f "/var/run/$iface.pid" ] && kill "$(cat /var/run/${iface}.pid)" 2>/dev/null
        [ -z "$config" ] || {
                include /lib/network
                scan_interfaces
                for config in $config; do
                        setup_interface "$iface" "$config" "" "$vifmac"
                done
        }
)}

set_wifi_up() {
        local cfg="$1"
        local ifname="$2"
        uci_set_state wireless "$cfg" up 1
        uci_set_state wireless "$cfg" ifname "$ifname"
}

set_wifi_down() {
        local cfg="$1"
        local vifs vif vifstr

        [ -f "/var/run/wifi-${cfg}.pid" ] &&
                kill "$(cat "/var/run/wifi-${cfg}.pid")" 2>/dev/null
        uci_revert_state wireless "$cfg"
        config_get vifs "$cfg" vifs
        for vif in $vifs; do
                uci_revert_state wireless "$vif"
        done
}

scan_wifi() {
        local cfgfile="$1"
        DEVICES=
        config_cb() {
                local type="$1"
                local section="$2"

                # section start
                case "$type" in
                        wifi-device)
                                append DEVICES "$section"
                                config_set "$section" vifs ""
                                config_set "$section" ht_capab ""
                        ;;
                esac

                # section end
                config_get TYPE "$CONFIG_SECTION" TYPE
                case "$TYPE" in
                        wifi-iface)
                                config_get device "$CONFIG_SECTION" device
                                config_get vifs "$device" vifs
                                append vifs "$CONFIG_SECTION"
                                config_set "$device" vifs "$vifs"
                        ;;
                esac
        }
        config_load "${cfgfile:-wireless}"
}

DEVICES=
DRIVERS=
include /lib/wifi
scan_wifi

case "$1" in
        down) wifi_updown "disable" "$2";;
        detect) wifi_detect_notice ;;
        config) wifi_config ;;
        status) ubus_wifi_cmd "status" "$2";;
        reload) wifi_reload "$2";;
        reload_legacy) wifi_reload_legacy "$2";;
        --help|help) usage;;
        ''|up) ubus call network reload; wifi_updown "enable" "$2";;
        *) usage; exit 1;;
esac

/sbin/wifi include /lib/wifi , which append driver mac80211(wifi dirver).

root@OpenWrt:~# cat /lib/wifi/mac80211.sh
#!/bin/sh
append DRIVERS "mac80211"

lookup_phy() {
        [ -n "$phy" ] && {
                [ -d /sys/class/ieee80211/$phy ] && return
        }

        local devpath
        config_get devpath "$device" path
        [ -n "$devpath" ] && {
                for phy in $(ls /sys/class/ieee80211 2>/dev/null); do
                        case "$(readlink -f /sys/class/ieee80211/$phy/device)" in
                                *$devpath) return;;
                        esac
                done
        }

        local macaddr="$(config_get "$device" macaddr | tr 'A-Z' 'a-z')"
        [ -n "$macaddr" ] && {
                for _phy in /sys/class/ieee80211/*; do
                        [ -e "$_phy" ] || continue

                        [ "$macaddr" = "$(cat ${_phy}/macaddress)" ] || continue
                        phy="${_phy##*/}"
                        return
                done
        }
        phy=
        return
}

find_mac80211_phy() {
        local device="$1"

        config_get phy "$device" phy
        lookup_phy
        [ -n "$phy" -a -d "/sys/class/ieee80211/$phy" ] || {
                echo "PHY for wifi device $1 not found"
                return 1
        }
        config_set "$device" phy "$phy"

        config_get macaddr "$device" macaddr
        [ -z "$macaddr" ] && {
                config_set "$device" macaddr "$(cat /sys/class/ieee80211/${phy}/macaddress)"
        }

        return 0
}

check_mac80211_device() {
        config_get phy "$1" phy
        [ -z "$phy" ] && {
                find_mac80211_phy "$1" >/dev/null || return 0
                config_get phy "$1" phy
        }
        [ "$phy" = "$dev" ] && found=1
}

detect_mac80211() {
        devidx=0
        config_load wireless
        while :; do
                config_get type "radio$devidx" type
                [ -n "$type" ] || break
                devidx=$(($devidx + 1))
        done

        for _dev in /sys/class/ieee80211/*; do
                [ -e "$_dev" ] || continue

                dev="${_dev##*/}"

                found=0
                config_foreach check_mac80211_device wifi-device
                [ "$found" -gt 0 ] && continue

                mode_band="g"
                channel="11"
                htmode=""
                ht_capab=""

                iw phy "$dev" info | grep -q 'Capabilities:' && htmode=HT20

                iw phy "$dev" info | grep -q '5180 MHz' && {
                        mode_band="a"
                        channel="36"
                        iw phy "$dev" info | grep -q 'VHT Capabilities' && htmode="VHT80"
                }

                [ -n "$htmode" ] && ht_capab="set wireless.radio${devidx}.htmode=$htmode"

                if [ -x /usr/bin/readlink -a -h /sys/class/ieee80211/${dev} ]; then
                        path="$(readlink -f /sys/class/ieee80211/${dev}/device)"
                else
                        path=""
                fi
                if [ -n "$path" ]; then
                        path="${path##/sys/devices/}"
                        case "$path" in
                                platform*/pci*) path="${path##platform/}";;
                        esac
                        dev_id="set wireless.radio${devidx}.path='$path'"
                else
                        dev_id="set wireless.radio${devidx}.macaddr=$(cat /sys/class/ieee80211/${dev}/macaddress)"
                fi

                uci -q batch <<-EOF
                        set wireless.radio${devidx}=wifi-device
                        set wireless.radio${devidx}.type=mac80211
                        set wireless.radio${devidx}.channel=${channel}
                        set wireless.radio${devidx}.hwmode=11${mode_band}
                        ${dev_id}
                        ${ht_capab}
                        set wireless.radio${devidx}.disabled=1

                        set wireless.default_radio${devidx}=wifi-iface
                        set wireless.default_radio${devidx}.device=radio${devidx}
                        set wireless.default_radio${devidx}.network=lan
                        set wireless.default_radio${devidx}.mode=ap
                        set wireless.default_radio${devidx}.ssid=OpenWrt
                        set wireless.default_radio${devidx}.encryption=none
EOF
                uci -q commit wireless

                devidx=$(($devidx + 1))
        done
}

And I found /etc/init.d/network don't have /sbin/wifi up, I will add and test it

root@OpenWrt:~# find /etc/init.d/ |xargs  grep  /sbin/wifi
/etc/init.d/network:    /sbin/wifi reload_legacy
/etc/init.d/network:    /sbin/wifi down


/etc/init.d/network :
stop_service() {
        /sbin/wifi down
}
reload_service() {
        /sbin/wifi reload_legacy
}
1 Like

it worked . thanks a lot

This topic was automatically closed 10 days after the last reply. New replies are no longer allowed.