diff options
author | Christian Lamparter <chunkeey@googlemail.com> | 2012-07-07 21:13:59 +0200 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-07-11 15:38:26 -0400 |
commit | c9122c0d63a50bab0a97dc936a38c0f921b6930e (patch) | |
tree | 7263d06049fc2a21971e363557f7bdc17a26f4ad /drivers/net/wireless/ath/carl9170/carl9170.h | |
parent | 4519a7433835f1a8dda242ad508233fcc5963545 (diff) | |
download | linux-c9122c0d63a50bab0a97dc936a38c0f921b6930e.tar.gz linux-c9122c0d63a50bab0a97dc936a38c0f921b6930e.tar.bz2 linux-c9122c0d63a50bab0a97dc936a38c0f921b6930e.zip |
carl9170: fix HT peer BA session corruption
This patch adds an alternative tx status path
for BlockAck Requests as the hardware doesn't
recognize that a BlockAck Requests is usually
acked with a BlockAck and not a legacy ACK.
Without this patch, the stack would constantly
resent old and stale BARs. So, depending on the
receiver stack, this could lead to:
- "stuck" ba sessions and package loss, as the
stale BAR would reset the sequence each time.
- lots of reorder releases.
- ...
Reported-by: Sean Patrick Santos <quantheory@gmail.com>
Reported-by: MikoĊaj Kuligowski <mikolaj.q@wp.pl>
Reported-by: Per-Erik Westerberg <per-erik.westerberg@bredband.net>
Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/carl9170/carl9170.h')
-rw-r--r-- | drivers/net/wireless/ath/carl9170/carl9170.h | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/carl9170/carl9170.h b/drivers/net/wireless/ath/carl9170/carl9170.h index 0cea20e3e250..376be11161c0 100644 --- a/drivers/net/wireless/ath/carl9170/carl9170.h +++ b/drivers/net/wireless/ath/carl9170/carl9170.h @@ -289,6 +289,7 @@ struct ar9170 { unsigned int mem_block_size; unsigned int rx_size; unsigned int tx_seq_table; + bool ba_filter; } fw; /* interface configuration combinations */ @@ -425,6 +426,10 @@ struct ar9170 { struct sk_buff *rx_failover; int rx_failover_missing; + /* FIFO for collecting outstanding BlockAckRequest */ + struct list_head bar_list[__AR9170_NUM_TXQ]; + spinlock_t bar_list_lock[__AR9170_NUM_TXQ]; + #ifdef CONFIG_CARL9170_WPC struct { bool pbc_state; @@ -468,6 +473,12 @@ enum carl9170_ps_off_override_reasons { PS_OFF_BCN = BIT(1), }; +struct carl9170_bar_list_entry { + struct list_head list; + struct rcu_head head; + struct sk_buff *skb; +}; + struct carl9170_ba_stats { u8 ampdu_len; u8 ampdu_ack_len; |