BIT(CARL9170FW_HANDLE_BACK_REQ) |
BIT(CARL9170FW_RX_FILTER) |
BIT(CARL9170FW_HW_COUNTERS) |
+ BIT(CARL9170FW_RX_BA_FILTER) |
BIT(CARL9170FW_USB_INIT_FIRMWARE) |
#ifdef CONFIG_CARL9170FW_USB_UP_STREAM
BIT(CARL9170FW_USB_UP_STREAM) |
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;
/* HW (ANI, CCA, MIB) tally counters */
CARL9170FW_HW_COUNTERS,
+ /* Firmware will pass BA when BARs are queued */
+ CARL9170FW_RX_BA_FILTER,
+
/* KEEP LAST */
__CARL9170FW_FEATURE_NUM
};
CHECK_FOR_FEATURE(CARL9170FW_WOL),
CHECK_FOR_FEATURE(CARL9170FW_FIXED_5GHZ_PSM),
CHECK_FOR_FEATURE(CARL9170FW_HW_COUNTERS),
+ CHECK_FOR_FEATURE(CARL9170FW_RX_BA_FILTER),
};
static void check_feature_list(const struct carl9170fw_desc_head *head,