diff options
author | Ilan Peer <ilan.peer@intel.com> | 2013-03-05 08:27:20 -0500 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-03-07 08:33:22 -0500 |
commit | 3d5839b6aa6bbf26c04e885956109d1995d01fe2 (patch) | |
tree | b6da5b061acdff19e9e639b23c487990c3d0d316 /net/mac80211/sta_info.c | |
parent | e943789edbb1f9de71b129d9992489eb79ed341f (diff) |
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/mac80211/sta_info.c')
-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) | |||
556 | tim[id / 8] &= ~(1 << (id % 8)); | 556 | tim[id / 8] &= ~(1 << (id % 8)); |
557 | } | 557 | } |
558 | 558 | ||
559 | static inline bool __bss_tim_get(u8 *tim, u16 id) | ||
560 | { | ||
561 | /* | ||
562 | * This format has been mandated by the IEEE specifications, | ||
563 | * so this line may not be changed to use the test_bit() format. | ||
564 | */ | ||
565 | return tim[id / 8] & (1 << (id % 8)); | ||
566 | } | ||
567 | |||
559 | static unsigned long ieee80211_tids_for_ac(int ac) | 568 | static unsigned long ieee80211_tids_for_ac(int ac) |
560 | { | 569 | { |
561 | /* If we ever support TIDs > 7, this obviously needs to be adjusted */ | 570 | /* 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) | |||
636 | done: | 645 | done: |
637 | spin_lock_bh(&local->tim_lock); | 646 | spin_lock_bh(&local->tim_lock); |
638 | 647 | ||
648 | if (indicate_tim == __bss_tim_get(ps->tim, id)) | ||
649 | goto out_unlock; | ||
650 | |||
639 | if (indicate_tim) | 651 | if (indicate_tim) |
640 | __bss_tim_set(ps->tim, id); | 652 | __bss_tim_set(ps->tim, id); |
641 | else | 653 | else |
@@ -647,6 +659,7 @@ void sta_info_recalc_tim(struct sta_info *sta) | |||
647 | local->tim_in_locked_section = false; | 659 | local->tim_in_locked_section = false; |
648 | } | 660 | } |
649 | 661 | ||
662 | out_unlock: | ||
650 | spin_unlock_bh(&local->tim_lock); | 663 | spin_unlock_bh(&local->tim_lock); |
651 | } | 664 | } |
652 | 665 | ||