From 9dd685fb495fdbf23aef974fab57f7f04898b12a Mon Sep 17 00:00:00 2001 From: Christian Lamparter Date: Tue, 31 Jul 2012 21:12:16 +0000 Subject: [PATCH] --- yaml --- r: 327679 b: refs/heads/master c: 33dd7699cefd175c3a5d3d6077db9c8d8322c9a7 h: refs/heads/master i: 327677: 3b1e1a97d1b5a9321421505cec7a8457d92fbfee 327675: 15c0f9032c1eeaabf702f3874728d21f6a51a38a 327671: 7e80a7f84a5d81f3068fc86ea0c901abf210d685 327663: 12af1a48a4ec553b7070c5c7aa4572f03bb0f6b4 327647: 05535b9995aae994c14fd1f0fa0bced873c8b939 327615: 188fe701a49b852a6999cec4a2782c69955e65ba 327551: 6d63e39ebd9661bcc89950737091a2c1fb8fe2dd 327423: 5186ad1aece7ed148ada83636a46f2a4a087844c 327167: 647ee453280cce1f1a7f4cb9fa6c5d4c531fdbdb 326655: 4e221374f2bff633168a9e3b57d55f9afbf445df 325631: 5c660b610b258c62739e58ceb18d238d19932b36 323583: 375e9e592b0105b5df2a309561edfe803bd6ef7b 319487: d09cb989ffa8800a3477e11992a2dc4609747e6f 311295: de550706fd0d95da2db70795dad6a9a747602e17 294911: 35f6dac3f64b3fad7bff5dbe7847545534ed4009 262143: 10438bb1a705ac6f20e9ec7238d8999978d135f3 v: v3 --- [refs] | 2 +- .../drivers/net/wireless/ath/carl9170/carl9170.h | 1 + trunk/drivers/net/wireless/ath/carl9170/rx.c | 15 +++++++++++---- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index d8f57117eb76..4cf313b674bd 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6957802944ec8244cdcfbf50ffbfccf8eceaa413 +refs/heads/master: 33dd7699cefd175c3a5d3d6077db9c8d8322c9a7 diff --git a/trunk/drivers/net/wireless/ath/carl9170/carl9170.h b/trunk/drivers/net/wireless/ath/carl9170/carl9170.h index 8f0cbc35816f..2aa4a59c72c8 100644 --- a/trunk/drivers/net/wireless/ath/carl9170/carl9170.h +++ b/trunk/drivers/net/wireless/ath/carl9170/carl9170.h @@ -425,6 +425,7 @@ struct ar9170 { bool rx_has_plcp; struct sk_buff *rx_failover; int rx_failover_missing; + u32 ampdu_ref; /* FIFO for collecting outstanding BlockAckRequest */ struct list_head bar_list[__AR9170_NUM_TXQ]; diff --git a/trunk/drivers/net/wireless/ath/carl9170/rx.c b/trunk/drivers/net/wireless/ath/carl9170/rx.c index b813f43061f5..a0b723078547 100644 --- a/trunk/drivers/net/wireless/ath/carl9170/rx.c +++ b/trunk/drivers/net/wireless/ath/carl9170/rx.c @@ -624,7 +624,8 @@ static void carl9170_ba_check(struct ar9170 *ar, void *data, unsigned int len) #undef TID_CHECK } -static bool carl9170_ampdu_check(struct ar9170 *ar, u8 *buf, u8 ms) +static bool carl9170_ampdu_check(struct ar9170 *ar, u8 *buf, u8 ms, + struct ieee80211_rx_status *rx_status) { __le16 fc; @@ -637,6 +638,9 @@ static bool carl9170_ampdu_check(struct ar9170 *ar, u8 *buf, u8 ms) return true; } + rx_status->flag |= RX_FLAG_AMPDU_DETAILS | RX_FLAG_AMPDU_LAST_KNOWN; + rx_status->ampdu_reference = ar->ampdu_ref; + /* * "802.11n - 7.4a.3 A-MPDU contents" describes in which contexts * certain frame types can be part of an aMPDU. @@ -685,12 +689,15 @@ static void carl9170_handle_mpdu(struct ar9170 *ar, u8 *buf, int len) if (unlikely(len < sizeof(*mac))) goto drop; + memset(&status, 0, sizeof(status)); + mpdu_len = len - sizeof(*mac); mac = (void *)(buf + mpdu_len); mac_status = mac->status; switch (mac_status & AR9170_RX_STATUS_MPDU) { case AR9170_RX_STATUS_MPDU_FIRST: + ar->ampdu_ref++; /* Aggregated MPDUs start with an PLCP header */ if (likely(mpdu_len >= sizeof(struct ar9170_rx_head))) { head = (void *) buf; @@ -721,12 +728,13 @@ static void carl9170_handle_mpdu(struct ar9170 *ar, u8 *buf, int len) break; case AR9170_RX_STATUS_MPDU_LAST: + status.flag |= RX_FLAG_AMPDU_IS_LAST; + /* * The last frame of an A-MPDU has an extra tail * which does contain the phy status of the whole * aggregate. */ - if (likely(mpdu_len >= sizeof(struct ar9170_rx_phystatus))) { mpdu_len -= sizeof(struct ar9170_rx_phystatus); phy = (void *)(buf + mpdu_len); @@ -774,11 +782,10 @@ static void carl9170_handle_mpdu(struct ar9170 *ar, u8 *buf, int len) if (unlikely(mpdu_len < (2 + 2 + ETH_ALEN + FCS_LEN))) goto drop; - memset(&status, 0, sizeof(status)); if (unlikely(carl9170_rx_mac_status(ar, head, mac, &status))) goto drop; - if (!carl9170_ampdu_check(ar, buf, mac_status)) + if (!carl9170_ampdu_check(ar, buf, mac_status, &status)) goto drop; if (phy)