wlan_tx_complete(super, success);
+ if (ieee80211_is_back_req(super->f.data.i3e.frame_control)) {
+ fw.wlan.queued_bar--;
+ }
+
/* recycle freed descriptors */
dma_reclaim(&fw.pta.down_queue, desc);
down_trigger();
{
struct carl9170_tx_superframe *super = DESC_PAYLOAD(desc);
+ if (ieee80211_is_back_req(super->f.data.i3e.frame_control)) {
+ fw.wlan.queued_bar++;
+ }
+
/* initialize rate control struct */
super->s.rix = 0;
super->s.cnt = 1;
switch (le16_to_cpu(hdr->frame_control) & IEEE80211_FCTL_STYPE) {
case IEEE80211_STYPE_BACK_REQ:
handle_bar(desc, hdr, data_len, mac_err);
- /* fallthrough */
rx_filter |= CARL9170_RX_FILTER_CTL_BACKR;
break;
case IEEE80211_STYPE_PSPOLL:
rx_filter |= CARL9170_RX_FILTER_CTL_PSPOLL;
break;
+ case IEEE80211_STYPE_BACK:
+ if (fw.wlan.queued_bar) {
+ /*
+ * Don't filter block acks when the application
+ * has queued BARs. This is because the firmware
+ * can't do the accouting and the application
+ * has to sort out if the BA belongs to any BARs.
+ */
+ break;
+ }
+ /* otherwise fall through */
default:
rx_filter |= CARL9170_RX_FILTER_CTL_OTHER;
break;