浏览代码

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>
Ilan Peer 12 年之前
父节点
当前提交
3d5839b6aa
共有 1 个文件被更改,包括 13 次插入0 次删除
  1. 13 0
      net/mac80211/sta_info.c

+ 13 - 0
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));
 	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)
 static unsigned long ieee80211_tids_for_ac(int ac)
 {
 {
 	/* If we ever support TIDs > 7, this obviously needs to be adjusted */
 	/* 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:
  done:
 	spin_lock_bh(&local->tim_lock);
 	spin_lock_bh(&local->tim_lock);
 
 
+	if (indicate_tim == __bss_tim_get(ps->tim, id))
+		goto out_unlock;
+
 	if (indicate_tim)
 	if (indicate_tim)
 		__bss_tim_set(ps->tim, id);
 		__bss_tim_set(ps->tim, id);
 	else
 	else
@@ -647,6 +659,7 @@ void sta_info_recalc_tim(struct sta_info *sta)
 		local->tim_in_locked_section = false;
 		local->tim_in_locked_section = false;
 	}
 	}
 
 
+out_unlock:
 	spin_unlock_bh(&local->tim_lock);
 	spin_unlock_bh(&local->tim_lock);
 }
 }