OSDN Git Service

iwlwifi: mvm: support multi tid ba notif
authorLiad Kaufman <liad.kaufman@intel.com>
Thu, 13 Apr 2017 14:10:33 +0000 (17:10 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Thu, 29 Jun 2017 10:26:25 +0000 (13:26 +0300)
When receiving a BA_NOTIF on new TX API, it can
contain BAs for several TIDs. Go over them and
reclaim TX for every TID.

Note that although the small API change, the API
version still isn't bumped forward, as this NIC
isn't still officially released.

Signed-off-by: Liad Kaufman <liad.kaufman@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/fw-api-tx.h
drivers/net/wireless/intel/iwlwifi/mvm/tx.c

index 9d2a991..97d7eed 100644 (file)
@@ -668,13 +668,15 @@ struct iwl_mvm_ba_notif {
  * @q_num: TFD queue number
  * @tfd_index: Index of first un-acked frame in the  TFD queue
  * @scd_queue: For debug only - the physical queue the TFD queue is bound to
+ * @tid: TID of the queue (0-7)
  * @reserved: reserved for alignment
  */
 struct iwl_mvm_compressed_ba_tfd {
        __le16 q_num;
        __le16 tfd_index;
        u8 scd_queue;
-       u8 reserved[3];
+       u8 tid;
+       u8 reserved[2];
 } __packed; /* COMPRESSED_BA_TFD_API_S_VER_1 */
 
 /**
index c89bb45..627befb 100644 (file)
@@ -1813,6 +1813,7 @@ void iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb)
        if (iwl_mvm_has_new_tx_api(mvm)) {
                struct iwl_mvm_compressed_ba_notif *ba_res =
                        (void *)pkt->data;
+               int i;
 
                sta_id = ba_res->sta_id;
                ba_info.status.ampdu_ack_len = (u8)le16_to_cpu(ba_res->done);
@@ -1825,22 +1826,17 @@ void iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb)
                if (!le16_to_cpu(ba_res->tfd_cnt))
                        goto out;
 
-               /*
-                * TODO:
-                * When supporting multi TID aggregations - we need to move
-                * next_reclaimed to be per TXQ and not per TID or handle it
-                * in a different way.
-                * This will go together with SN and AddBA offload and cannot
-                * be handled properly for now.
-                */
-               WARN_ON(le16_to_cpu(ba_res->ra_tid_cnt) != 1);
-               tid = ba_res->ra_tid[0].tid;
-               if (tid == IWL_MGMT_TID)
-                       tid = IWL_MAX_TID_COUNT;
-               iwl_mvm_tx_reclaim(mvm, sta_id, tid,
-                                  (int)(le16_to_cpu(ba_res->tfd[0].q_num)),
-                                  le16_to_cpu(ba_res->tfd[0].tfd_index),
-                                  &ba_info, le32_to_cpu(ba_res->tx_rate));
+               /* Free per TID */
+               for (i = 0; i < le16_to_cpu(ba_res->tfd_cnt); i++) {
+                       struct iwl_mvm_compressed_ba_tfd *ba_tfd =
+                               &ba_res->tfd[i];
+
+                       iwl_mvm_tx_reclaim(mvm, sta_id, ba_tfd->tid,
+                                          (int)(le16_to_cpu(ba_tfd->q_num)),
+                                          le16_to_cpu(ba_tfd->tfd_index),
+                                          &ba_info,
+                                          le32_to_cpu(ba_res->tx_rate));
+               }
 
 out:
                IWL_DEBUG_TX_REPLY(mvm,