carl9170: Fix tx aggregation problems with some clients
Some clients seem to rely upon the reception of BlockAckReqs to flush their rx reorder buffer. In order to fix aggregation for these clients carl9170 should set IEEE80211_TX_STAT_AMPDU_NO_BACK to generate a BlockAckReq if the transmission of an AMPDU subframe fails. This fixes aggregation problems with Intel 5100 Windows STAs (and maybe others as well). Signed-off-by: Christian Lamparter <chunkeey@googlemail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:

committed by
John W. Linville

parent
0263aa4529
commit
24047e2c4f
@@ -383,6 +383,7 @@ static void carl9170_tx_status_process_ampdu(struct ar9170 *ar,
|
||||
|
||||
if (sta_info->stats[tid].clear) {
|
||||
sta_info->stats[tid].clear = false;
|
||||
sta_info->stats[tid].req = false;
|
||||
sta_info->stats[tid].ampdu_len = 0;
|
||||
sta_info->stats[tid].ampdu_ack_len = 0;
|
||||
}
|
||||
@@ -391,10 +392,16 @@ static void carl9170_tx_status_process_ampdu(struct ar9170 *ar,
|
||||
if (txinfo->status.rates[0].count == 1)
|
||||
sta_info->stats[tid].ampdu_ack_len++;
|
||||
|
||||
if (!(txinfo->flags & IEEE80211_TX_STAT_ACK))
|
||||
sta_info->stats[tid].req = true;
|
||||
|
||||
if (super->f.mac_control & cpu_to_le16(AR9170_TX_MAC_IMM_BA)) {
|
||||
super->s.rix = sta_info->stats[tid].ampdu_len;
|
||||
super->s.cnt = sta_info->stats[tid].ampdu_ack_len;
|
||||
txinfo->flags |= IEEE80211_TX_STAT_AMPDU;
|
||||
if (sta_info->stats[tid].req)
|
||||
txinfo->flags |= IEEE80211_TX_STAT_AMPDU_NO_BACK;
|
||||
|
||||
sta_info->stats[tid].clear = true;
|
||||
}
|
||||
spin_unlock_bh(&tid_info->lock);
|
||||
|
Reference in New Issue
Block a user