broadcom-wl: fix led support
[openwrt.git] / package / kernel / broadcom-wl / files / lib / wifi / broadcom.sh
index 892a415..df5072c 100644 (file)
@@ -50,12 +50,6 @@ scan_broadcom() {
        done
        config_set "$device" vifs "${adhoc_if:-$sta_if $ap_if $mon_if}"
 
-       ifdown="down"
-       for vif in 0 1 2 3; do
-               append ifdown "vif $vif" "$N"
-               append ifdown "enabled 0" "$N"
-       done
-
        ap=1
        infra=1
        if [ "$_c" -gt 1 ]; then
@@ -96,7 +90,6 @@ scan_broadcom() {
 disable_broadcom() {
        local device="$1"
        set_wifi_down "$device"
-       wlc ifname "$device" down
        (
                include /lib/network
 
@@ -104,12 +97,31 @@ disable_broadcom() {
                [ -e $pid_file ] && start-stop-daemon -K -q -s SIGKILL -p $pid_file && rm $pid_file
 
                # make sure the interfaces are down and removed from all bridges
-               local dev
-               for dev in $device ${device}-1 ${device}-2 ${device}-3; do
-                       ifconfig "$dev" down 2>/dev/null >/dev/null && {
-                               unbridge "$dev"
-                       }
+               local dev ifname
+               for dev in /sys/class/net/wds${device##wl}-* /sys/class/net/${device}-* /sys/class/net/${device}; do
+                       if [ -e "$dev" ]; then
+                               ifname=${dev##/sys/class/net/}
+                               ifconfig "$ifname" down
+                               unbridge "$ifname"
+                       fi
                done
+
+               # make sure all of the devices are disabled in the driver
+               local ifdown=
+               local bssmax=$(wlc ifname "$device" bssmax)
+               local vif=$((${bssmax:-4} - 1))
+               append ifdown "down" "$N"
+               append ifdown "wds none" "$N"
+               while [ $vif -ge 0 ]; do
+                       append ifdown "vif $vif" "$N"
+                       append ifdown "enabled 0" "$N"
+                       vif=$(($vif - 1))
+               done
+
+               wlc ifname "$device" stdin <<EOF
+$ifdown
+leddc 0xffff
+EOF
        )
        true
 }
@@ -196,12 +208,21 @@ enable_broadcom() {
                esac
        }
 
+       local leddc = $(wlc ifname "$device" leddc)
+       if [ "$leddc" -eq 0xffff ]; then
+               leddc = 0x0;
+       fi
+
        local _c=0
        local nas="$(which nas)"
        local if_pre_up if_up nas_cmd
        local vif vif_pre_up vif_post_up vif_do_up vif_txpower
+       local bssmax=$(wlc ifname "$device" bssmax)
+       bssmax=${bssmax:-4}
 
        for vif in $vifs; do
+               [ $_c -ge $bssmax ] && break
+
                config_get vif_txpower "$vif" txpower
 
                local mode
@@ -343,6 +364,7 @@ enable_broadcom() {
                [ "$ifname" != "${ifname##${device}-}" ] && if_cmd="if_up"
                append $if_cmd "macaddr=\$(wlc ifname '$ifname' cur_etheraddr)" ";$N"
                append $if_cmd "ifconfig '$ifname' \${macaddr:+hw ether \$macaddr}" ";$N"
+               append if_up "ifconfig '$ifname' up" ";$N"
 
                local net_cfg="$(find_net_config "$vif")"
                [ -z "$net_cfg" ] || {
@@ -362,14 +384,13 @@ enable_broadcom() {
                _c=$(($_c + 1))
        done
        wlc ifname "$device" stdin <<EOF
-$ifdown
-
 ${macaddr:+bssid $macaddr}
 ${macaddr:+cur_etheraddr $macaddr}
 band ${band:-0}
 ${nmode:+nmode $nmode}
 ${nmode:+${nreqd:+nreqd $nreqd}}
 ${gmode:+gmode $gmode}
+leddc $leddc
 apsta $apsta
 ap $ap
 ${mssid:+mssid $mssid}
@@ -387,7 +408,6 @@ monitor ${monitor:-0}
 radio ${radio:-1}
 macfilter ${macfilter:-0}
 maclist ${maclist:-none}
-wds none
 ${wds:+wds $wds}
 country ${country:-US}
 ${channel:+channel $channel}