iwlagn: update beacon smarter
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>
This commit is contained in:
parent
7e4005cc4a
commit
3bde2b68cf
|
@ -3074,6 +3074,16 @@ static void iwl_mac_rssi_callback(struct ieee80211_hw *hw,
|
||||||
mutex_unlock(&priv->shrd->mutex);
|
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 = {
|
struct ieee80211_ops iwlagn_hw_ops = {
|
||||||
.tx = iwlagn_mac_tx,
|
.tx = iwlagn_mac_tx,
|
||||||
.start = iwlagn_mac_start,
|
.start = iwlagn_mac_start,
|
||||||
|
@ -3107,6 +3117,7 @@ struct ieee80211_ops iwlagn_hw_ops = {
|
||||||
CFG80211_TESTMODE_DUMP(iwl_testmode_dump)
|
CFG80211_TESTMODE_DUMP(iwl_testmode_dump)
|
||||||
.tx_sync = iwl_mac_tx_sync,
|
.tx_sync = iwl_mac_tx_sync,
|
||||||
.finish_tx_sync = iwl_mac_finish_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)
|
static u32 iwl_hw_detect(struct iwl_priv *priv)
|
||||||
|
|
|
@ -243,8 +243,6 @@ static int iwl_rx_beacon_notif(struct iwl_priv *priv,
|
||||||
|
|
||||||
priv->ibss_manager = le32_to_cpu(beacon->ibss_mgr_status);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue