diff options
author | Ilan Peer <ilan.peer@intel.com> | 2013-03-05 17:27:20 +0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-03-07 17:33:22 +0400 |
commit | 3d5839b6aa6bbf26c04e885956109d1995d01fe2 (patch) | |
tree | b6da5b061acdff19e9e639b23c487990c3d0d316 /net | |
parent | e943789edbb1f9de71b129d9992489eb79ed341f (diff) | |
download | linux-3d5839b6aa6bbf26c04e885956109d1995d01fe2.tar.xz |
mac80211: Call drv_set_tim only if there is a change
It is possible that sta_info_recalc_tim() is called consecutively
without changing the station's tim bit. In such cases there is no
need to call the driver's set_tim() callback.
Signed-off-by: Ilan Peer <ilan.peer@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/mac80211/sta_info.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index 852bf45fcfa3..a36ceedf53b3 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c @@ -556,6 +556,15 @@ static inline void __bss_tim_clear(u8 *tim, u16 id) tim[id / 8] &= ~(1 << (id % 8)); } +static inline bool __bss_tim_get(u8 *tim, u16 id) +{ + /* + * This format has been mandated by the IEEE specifications, + * so this line may not be changed to use the test_bit() format. + */ + return tim[id / 8] & (1 << (id % 8)); +} + static unsigned long ieee80211_tids_for_ac(int ac) { /* If we ever support TIDs > 7, this obviously needs to be adjusted */ @@ -636,6 +645,9 @@ void sta_info_recalc_tim(struct sta_info *sta) done: spin_lock_bh(&local->tim_lock); + if (indicate_tim == __bss_tim_get(ps->tim, id)) + goto out_unlock; + if (indicate_tim) __bss_tim_set(ps->tim, id); else @@ -647,6 +659,7 @@ void sta_info_recalc_tim(struct sta_info *sta) local->tim_in_locked_section = false; } +out_unlock: spin_unlock_bh(&local->tim_lock); } |