Commit 62a40a15 authored by Johannes Berg's avatar Johannes Berg

mac80211: fix LED in idle handling

feng xiangjun reports that my

commit 382a103b
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Fri Mar 22 22:30:09 2013 +0100

    mac80211: fix idle handling sequence

broke the wireless status LED. The reason is that
we now call ieee80211_idle_off() when the channel
context is assigned, and that doesn't recalculate
the LED state. Fix this by making that function a
wrapper around most of idle recalculation while
forcing active.
Reported-by: default avatarfeng xiangjun <fengxj325@gmail.com>
Tested-by: default avatarfeng xiangjun <fengxj325@gmail.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 90e0970f
...@@ -78,7 +78,7 @@ void ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata) ...@@ -78,7 +78,7 @@ void ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata)
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_TXPOWER); ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_TXPOWER);
} }
u32 ieee80211_idle_off(struct ieee80211_local *local) static u32 __ieee80211_idle_off(struct ieee80211_local *local)
{ {
if (!(local->hw.conf.flags & IEEE80211_CONF_IDLE)) if (!(local->hw.conf.flags & IEEE80211_CONF_IDLE))
return 0; return 0;
...@@ -87,7 +87,7 @@ u32 ieee80211_idle_off(struct ieee80211_local *local) ...@@ -87,7 +87,7 @@ u32 ieee80211_idle_off(struct ieee80211_local *local)
return IEEE80211_CONF_CHANGE_IDLE; return IEEE80211_CONF_CHANGE_IDLE;
} }
static u32 ieee80211_idle_on(struct ieee80211_local *local) static u32 __ieee80211_idle_on(struct ieee80211_local *local)
{ {
if (local->hw.conf.flags & IEEE80211_CONF_IDLE) if (local->hw.conf.flags & IEEE80211_CONF_IDLE)
return 0; return 0;
...@@ -98,16 +98,18 @@ static u32 ieee80211_idle_on(struct ieee80211_local *local) ...@@ -98,16 +98,18 @@ static u32 ieee80211_idle_on(struct ieee80211_local *local)
return IEEE80211_CONF_CHANGE_IDLE; return IEEE80211_CONF_CHANGE_IDLE;
} }
void ieee80211_recalc_idle(struct ieee80211_local *local) static u32 __ieee80211_recalc_idle(struct ieee80211_local *local,
bool force_active)
{ {
bool working = false, scanning, active; bool working = false, scanning, active;
unsigned int led_trig_start = 0, led_trig_stop = 0; unsigned int led_trig_start = 0, led_trig_stop = 0;
struct ieee80211_roc_work *roc; struct ieee80211_roc_work *roc;
u32 change;
lockdep_assert_held(&local->mtx); lockdep_assert_held(&local->mtx);
active = !list_empty(&local->chanctx_list) || local->monitors; active = force_active ||
!list_empty(&local->chanctx_list) ||
local->monitors;
if (!local->ops->remain_on_channel) { if (!local->ops->remain_on_channel) {
list_for_each_entry(roc, &local->roc_list, list) { list_for_each_entry(roc, &local->roc_list, list) {
...@@ -132,9 +134,18 @@ void ieee80211_recalc_idle(struct ieee80211_local *local) ...@@ -132,9 +134,18 @@ void ieee80211_recalc_idle(struct ieee80211_local *local)
ieee80211_mod_tpt_led_trig(local, led_trig_start, led_trig_stop); ieee80211_mod_tpt_led_trig(local, led_trig_start, led_trig_stop);
if (working || scanning || active) if (working || scanning || active)
change = ieee80211_idle_off(local); return __ieee80211_idle_off(local);
else return __ieee80211_idle_on(local);
change = ieee80211_idle_on(local); }
u32 ieee80211_idle_off(struct ieee80211_local *local)
{
return __ieee80211_recalc_idle(local, true);
}
void ieee80211_recalc_idle(struct ieee80211_local *local)
{
u32 change = __ieee80211_recalc_idle(local, false);
if (change) if (change)
ieee80211_hw_config(local, change); ieee80211_hw_config(local, change);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment