iwlagn: update beacon smarter
authorJohannes Berg <johannes.berg@intel.com>
Mon, 10 Oct 2011 14:26:52 +0000 (07:26 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 14 Oct 2011 18:48:09 +0000 (14:48 -0400)
Updating the beacon every time right after one was
transmitted is pointless, most of the time we might
not even have to update it. We will update it every
time it changes, which includes from set_tim(), a
callback iwlwifi didn't implement so far.

This also reduces latency for clients, previously
we would update the beacon right after the previous
one was transmitted, and then a TIM change would
only take effect after that again -- updating the
beacon right after the TIM changes makes the TIM
change go out to the air faster.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/iwlwifi/iwl-agn.c
drivers/net/wireless/iwlwifi/iwl-rx.c

index 3af49ae6297989b7f1cb89623fff74bf72cf6eff..30a4ba6770425125e53b10c2dcb076374c3005c7 100644 (file)
@@ -3074,6 +3074,16 @@ static void iwl_mac_rssi_callback(struct ieee80211_hw *hw,
        mutex_unlock(&priv->shrd->mutex);
 }
 
+static int iwl_mac_set_tim(struct ieee80211_hw *hw,
+                          struct ieee80211_sta *sta, bool set)
+{
+       struct iwl_priv *priv = hw->priv;
+
+       queue_work(priv->shrd->workqueue, &priv->beacon_update);
+
+       return 0;
+}
+
 struct ieee80211_ops iwlagn_hw_ops = {
        .tx = iwlagn_mac_tx,
        .start = iwlagn_mac_start,
@@ -3107,6 +3117,7 @@ struct ieee80211_ops iwlagn_hw_ops = {
        CFG80211_TESTMODE_DUMP(iwl_testmode_dump)
        .tx_sync = iwl_mac_tx_sync,
        .finish_tx_sync = iwl_mac_finish_tx_sync,
+       .set_tim = iwl_mac_set_tim,
 };
 
 static u32 iwl_hw_detect(struct iwl_priv *priv)
index bbd674061d2e6f93c05c3d46fb55802fa29ace67..1d781bc60663e65508361ee889622a9a2ec7366d 100644 (file)
@@ -243,8 +243,6 @@ static int iwl_rx_beacon_notif(struct iwl_priv *priv,
 
        priv->ibss_manager = le32_to_cpu(beacon->ibss_mgr_status);
 
-       if (!test_bit(STATUS_EXIT_PENDING, &priv->shrd->status))
-               queue_work(priv->shrd->workqueue, &priv->beacon_update);
        return 0;
 }