]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/net/wireless/mwifiex/wmm.c
mwifiex: preprocess packets from TX queue
[karo-tx-linux.git] / drivers / net / wireless / mwifiex / wmm.c
index ef717acec8b76f3fc45cd1b210cccd5b3948f7d7..b2e99569a0f8b659b756179a7cec340de68952e1 100644 (file)
@@ -157,6 +157,8 @@ void mwifiex_ralist_add(struct mwifiex_private *priv, const u8 *ra)
 
                ra_list->is_11n_enabled = 0;
                ra_list->tdls_link = false;
+               ra_list->ba_status = BA_SETUP_NONE;
+               ra_list->amsdu_in_ampdu = false;
                if (!mwifiex_queuing_ra_based(priv)) {
                        if (mwifiex_get_tdls_link_status(priv, ra) ==
                            TDLS_SETUP_COMPLETE) {
@@ -574,7 +576,7 @@ mwifiex_clean_txrx(struct mwifiex_private *priv)
  * This function retrieves a particular RA list node, matching with the
  * given TID and RA address.
  */
-static struct mwifiex_ra_list_tbl *
+struct mwifiex_ra_list_tbl *
 mwifiex_wmm_get_ralist_node(struct mwifiex_private *priv, u8 tid,
                            const u8 *ra_addr)
 {
@@ -730,7 +732,7 @@ mwifiex_wmm_add_buf_txqueue(struct mwifiex_private *priv,
        } else {
                memcpy(ra, skb->data, ETH_ALEN);
                if (ra[0] & 0x01 || mwifiex_is_skb_mgmt_frame(skb))
-                       memset(ra, 0xff, ETH_ALEN);
+                       eth_broadcast_addr(ra);
                ra_list = mwifiex_wmm_get_queue_raptr(priv, tid_down, ra);
        }
 
@@ -942,14 +944,11 @@ mwifiex_wmm_get_highest_priolist_ptr(struct mwifiex_adapter *adapter,
        struct mwifiex_ra_list_tbl *ptr;
        struct mwifiex_tid_tbl *tid_ptr;
        atomic_t *hqp;
-       unsigned long flags_bss, flags_ra;
+       unsigned long flags_ra;
        int i, j;
 
        /* check the BSS with highest priority first */
        for (j = adapter->priv_num - 1; j >= 0; --j) {
-               spin_lock_irqsave(&adapter->bss_prio_tbl[j].bss_prio_lock,
-                                 flags_bss);
-
                /* iterate over BSS with the equal priority */
                list_for_each_entry(adapter->bss_prio_tbl[j].bss_prio_cur,
                                    &adapter->bss_prio_tbl[j].bss_prio_head,
@@ -985,19 +984,15 @@ mwifiex_wmm_get_highest_priolist_ptr(struct mwifiex_adapter *adapter,
                        }
                }
 
-               spin_unlock_irqrestore(&adapter->bss_prio_tbl[j].bss_prio_lock,
-                                      flags_bss);
        }
 
        return NULL;
 
 found:
-       /* holds bss_prio_lock / ra_list_spinlock */
+       /* holds ra_list_spinlock */
        if (atomic_read(hqp) > i)
                atomic_set(hqp, i);
        spin_unlock_irqrestore(&priv_tmp->wmm.ra_list_spinlock, flags_ra);
-       spin_unlock_irqrestore(&adapter->bss_prio_tbl[j].bss_prio_lock,
-                              flags_bss);
 
        *priv = priv_tmp;
        *tid = tos_to_tid[i];
@@ -1179,6 +1174,14 @@ mwifiex_send_processed_packet(struct mwifiex_private *priv,
 
        skb = skb_dequeue(&ptr->skb_head);
 
+       if (adapter->data_sent || adapter->tx_lock_flag) {
+               spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock,
+                                      ra_list_flags);
+               skb_queue_tail(&adapter->tx_data_q, skb);
+               atomic_inc(&adapter->tx_queued);
+               return;
+       }
+
        if (!skb_queue_empty(&ptr->skb_head))
                skb_next = skb_peek(&ptr->skb_head);
        else
@@ -1276,13 +1279,13 @@ mwifiex_dequeue_tx_packet(struct mwifiex_adapter *adapter)
        }
 
        if (!ptr->is_11n_enabled ||
-           mwifiex_is_ba_stream_setup(priv, ptr, tid) ||
-           priv->wps.session_enable) {
+               ptr->ba_status ||
+               priv->wps.session_enable) {
                if (ptr->is_11n_enabled &&
-                   mwifiex_is_ba_stream_setup(priv, ptr, tid) &&
-                   mwifiex_is_amsdu_in_ampdu_allowed(priv, ptr, tid) &&
-                   mwifiex_is_amsdu_allowed(priv, tid) &&
-                   mwifiex_is_11n_aggragation_possible(priv, ptr,
+                       ptr->ba_status &&
+                       ptr->amsdu_in_ampdu &&
+                       mwifiex_is_amsdu_allowed(priv, tid) &&
+                       mwifiex_is_11n_aggragation_possible(priv, ptr,
                                                        adapter->tx_buf_size))
                        mwifiex_11n_aggregate_pkt(priv, ptr, ptr_index, flags);
                        /* ra_list_spinlock has been freed in
@@ -1329,11 +1332,16 @@ void
 mwifiex_wmm_process_tx(struct mwifiex_adapter *adapter)
 {
        do {
-               /* Check if busy */
-               if (adapter->data_sent || adapter->tx_lock_flag)
-                       break;
-
                if (mwifiex_dequeue_tx_packet(adapter))
                        break;
+               if (adapter->iface_type != MWIFIEX_SDIO) {
+                       if (adapter->data_sent ||
+                           adapter->tx_lock_flag)
+                               break;
+               } else {
+                       if (atomic_read(&adapter->tx_queued) >=
+                           MWIFIEX_MAX_PKTS_TXQ)
+                               break;
+               }
        } while (!mwifiex_wmm_lists_empty(adapter));
 }