X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=carlfw%2Fsrc%2Fwlan.c;h=eba6222d6281e276853682ffcec36c421070cab2;hb=ebbded98bb17ae48a0a48065dd458eed2161c124;hp=cc2b917d35e30e6c07a58499c5769ec1324d9bc3;hpb=42f3ffb244e5cabba181fe6c59042caa61b650cb;p=carl9170fw.git diff --git a/carlfw/src/wlan.c b/carlfw/src/wlan.c index cc2b917..eba6222 100644 --- a/carlfw/src/wlan.c +++ b/carlfw/src/wlan.c @@ -235,13 +235,19 @@ static inline bool same_aggr(struct ieee80211_hdr *a, struct ieee80211_hdr *b) return (get_tid(a) == get_tid(b)) || same_hdr(a, b); } +static void wlan_tx_ampdu_reset(unsigned int qidx) +{ + fw.wlan.ampdu_prev[qidx] = NULL; +} + static void wlan_tx_ampdu_end(unsigned int qidx) { struct carl9170_tx_superframe *ht_prev = fw.wlan.ampdu_prev[qidx]; - fw.wlan.ampdu_prev[qidx] = NULL; if (ht_prev) ht_prev->f.hdr.mac.ba_end = 1; + + wlan_tx_ampdu_reset(qidx); } static void wlan_tx_ampdu(struct carl9170_tx_superframe *super) @@ -249,16 +255,16 @@ static void wlan_tx_ampdu(struct carl9170_tx_superframe *super) unsigned int qidx = super->s.queue; struct carl9170_tx_superframe *ht_prev = fw.wlan.ampdu_prev[qidx]; - if (!super->f.hdr.mac.ampdu) { - wlan_tx_ampdu_end(qidx); - } else { - fw.wlan.ampdu_prev[qidx] = super; - + if (super->f.hdr.mac.ampdu) { if (ht_prev && !same_aggr(&super->f.data.i3e, &ht_prev->f.data.i3e)) ht_prev->f.hdr.mac.ba_end = 1; else super->f.hdr.mac.ba_end = 0; + + fw.wlan.ampdu_prev[qidx] = super; + } else { + wlan_tx_ampdu_end(qidx); } } @@ -463,6 +469,9 @@ static void handle_tx_completion(void) } } + + wlan_tx_ampdu_reset(i); + for_each_desc(desc, &fw.wlan.tx_retry) __wlan_tx(desc); @@ -698,12 +707,10 @@ static unsigned int wlan_rx_filter(struct dma_desc *desc) rx_filter |= CARL9170_RX_FILTER_MGMT; } -#ifdef CONFIG_CARL9170FW_WOL if (unlikely(fw.suspend_mode == CARL9170_HOST_SUSPENDED)) { wol_rx(rx_filter, hdr, min(data_len, (unsigned int)AR9170_BLOCK_SIZE)); } -#endif /* CONFIG_CARL9170FW_WOL */ #undef AR9170_RX_ERROR_BAD