51 lines
1.9 KiB
Diff
51 lines
1.9 KiB
Diff
|
From c3e5d7181afb66657393066bccce0956fab09ab3 Mon Sep 17 00:00:00 2001
|
||
|
From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
|
||
|
Date: Wed, 9 Jan 2013 10:20:36 +0200
|
||
|
Subject: [PATCH] iwlwifi: audit single frames from AGG queue in RS
|
||
|
|
||
|
The rate scaling won't treat the information in a frame
|
||
|
with IEEE80211_TX_CTL_AMPDU set if IEEE80211_TX_STAT_AMPDU
|
||
|
is cleared. But all the frames coming from an AGG tx queue
|
||
|
have IEEE80211_TX_CTL_AMPDU set, and IEEE80211_TX_STAT_AMPDU
|
||
|
is set only if the frame was sent in an AMPDU.
|
||
|
This means that all the data in frames in AGG tx queues that
|
||
|
aren't sent as an AMPDU is thrown away.
|
||
|
This is even more harmful when in bad link conditions, the
|
||
|
frames are sent in an AMPDU and then finally sent as single
|
||
|
frame. So a lot of failures weren't reported and the rate
|
||
|
scaling got stuck in high rates leading to very poor
|
||
|
connectivity.
|
||
|
|
||
|
Fix that by clearing IEEE80211_TX_CTL_AMPDU when the frame
|
||
|
isn't part of an AMPDU.
|
||
|
|
||
|
This bug was introduced by
|
||
|
|
||
|
2eb81a40aa521035ff9c8c8309e482dff523f8c9
|
||
|
iwlwifi: don't clear CTL_AMPDU on frame status
|
||
|
|
||
|
This fix basically reverts the aforementioned commit.
|
||
|
|
||
|
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
|
||
|
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||
|
---
|
||
|
drivers/net/wireless/iwlwifi/dvm/tx.c | 2 ++
|
||
|
1 files changed, 2 insertions(+), 0 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/net/wireless/iwlwifi/dvm/tx.c b/drivers/net/wireless/iwlwifi/dvm/tx.c
|
||
|
index a790599..31534f7 100644
|
||
|
--- a/drivers/net/wireless/iwlwifi/dvm/tx.c
|
||
|
+++ b/drivers/net/wireless/iwlwifi/dvm/tx.c
|
||
|
@@ -1079,6 +1079,8 @@ static void iwlagn_set_tx_status(struct iwl_priv *priv,
|
||
|
{
|
||
|
u16 status = le16_to_cpu(tx_resp->status.status);
|
||
|
|
||
|
+ info->flags &= ~IEEE80211_TX_CTL_AMPDU;
|
||
|
+
|
||
|
info->status.rates[0].count = tx_resp->failure_frame + 1;
|
||
|
info->flags |= iwl_tx_status_to_mac80211(status);
|
||
|
iwlagn_hwrate_to_tx_control(priv, le32_to_cpu(tx_resp->rate_n_flags),
|
||
|
--
|
||
|
1.7.6.5
|
||
|
|