diff options
| author | Johannes Berg <johannes.berg@intel.com> | 2013-04-08 05:52:34 -0400 |
|---|---|---|
| committer | Johannes Berg <johannes.berg@intel.com> | 2013-04-08 07:12:05 -0400 |
| commit | 62a40a15554d6924a58b3e9f8756e0d683dc9c0c (patch) | |
| tree | 01bab4faf01a83f551dd1ac70ae86e8505776607 /net | |
| parent | 90e0970f8788cef2c8f5183af5a98f4f94600faf (diff) | |
mac80211: fix LED in idle handling
feng xiangjun reports that my
commit 382a103b2b528a3085cde4ac56fc69d92a828b72
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: feng xiangjun <fengxj325@gmail.com>
Tested-by: feng xiangjun <fengxj325@gmail.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net')
| -rw-r--r-- | net/mac80211/iface.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index 58150f877ec3..9ed49ad0380f 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c | |||
| @@ -78,7 +78,7 @@ void ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata) | |||
| 78 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_TXPOWER); | 78 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_TXPOWER); |
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | u32 ieee80211_idle_off(struct ieee80211_local *local) | 81 | static u32 __ieee80211_idle_off(struct ieee80211_local *local) |
| 82 | { | 82 | { |
| 83 | if (!(local->hw.conf.flags & IEEE80211_CONF_IDLE)) | 83 | if (!(local->hw.conf.flags & IEEE80211_CONF_IDLE)) |
| 84 | return 0; | 84 | return 0; |
| @@ -87,7 +87,7 @@ u32 ieee80211_idle_off(struct ieee80211_local *local) | |||
| 87 | return IEEE80211_CONF_CHANGE_IDLE; | 87 | return IEEE80211_CONF_CHANGE_IDLE; |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | static u32 ieee80211_idle_on(struct ieee80211_local *local) | 90 | static u32 __ieee80211_idle_on(struct ieee80211_local *local) |
| 91 | { | 91 | { |
| 92 | if (local->hw.conf.flags & IEEE80211_CONF_IDLE) | 92 | if (local->hw.conf.flags & IEEE80211_CONF_IDLE) |
| 93 | return 0; | 93 | return 0; |
| @@ -98,16 +98,18 @@ static u32 ieee80211_idle_on(struct ieee80211_local *local) | |||
| 98 | return IEEE80211_CONF_CHANGE_IDLE; | 98 | return IEEE80211_CONF_CHANGE_IDLE; |
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | void ieee80211_recalc_idle(struct ieee80211_local *local) | 101 | static u32 __ieee80211_recalc_idle(struct ieee80211_local *local, |
| 102 | bool force_active) | ||
| 102 | { | 103 | { |
| 103 | bool working = false, scanning, active; | 104 | bool working = false, scanning, active; |
| 104 | unsigned int led_trig_start = 0, led_trig_stop = 0; | 105 | unsigned int led_trig_start = 0, led_trig_stop = 0; |
| 105 | struct ieee80211_roc_work *roc; | 106 | struct ieee80211_roc_work *roc; |
| 106 | u32 change; | ||
| 107 | 107 | ||
| 108 | lockdep_assert_held(&local->mtx); | 108 | lockdep_assert_held(&local->mtx); |
| 109 | 109 | ||
| 110 | active = !list_empty(&local->chanctx_list) || local->monitors; | 110 | active = force_active || |
| 111 | !list_empty(&local->chanctx_list) || | ||
| 112 | local->monitors; | ||
| 111 | 113 | ||
| 112 | if (!local->ops->remain_on_channel) { | 114 | if (!local->ops->remain_on_channel) { |
| 113 | list_for_each_entry(roc, &local->roc_list, list) { | 115 | list_for_each_entry(roc, &local->roc_list, list) { |
| @@ -132,9 +134,18 @@ void ieee80211_recalc_idle(struct ieee80211_local *local) | |||
| 132 | ieee80211_mod_tpt_led_trig(local, led_trig_start, led_trig_stop); | 134 | ieee80211_mod_tpt_led_trig(local, led_trig_start, led_trig_stop); |
| 133 | 135 | ||
| 134 | if (working || scanning || active) | 136 | if (working || scanning || active) |
| 135 | change = ieee80211_idle_off(local); | 137 | return __ieee80211_idle_off(local); |
| 136 | else | 138 | return __ieee80211_idle_on(local); |
| 137 | change = ieee80211_idle_on(local); | 139 | } |
| 140 | |||
| 141 | u32 ieee80211_idle_off(struct ieee80211_local *local) | ||
| 142 | { | ||
| 143 | return __ieee80211_recalc_idle(local, true); | ||
| 144 | } | ||
| 145 | |||
| 146 | void ieee80211_recalc_idle(struct ieee80211_local *local) | ||
| 147 | { | ||
| 148 | u32 change = __ieee80211_recalc_idle(local, false); | ||
| 138 | if (change) | 149 | if (change) |
| 139 | ieee80211_hw_config(local, change); | 150 | ieee80211_hw_config(local, change); |
| 140 | } | 151 | } |
