]> git.karo-electronics.de Git - linux-beck.git/commitdiff
mwifiex: handle AMPDU supported check for AP interface
authorAvinash Patil <patila@marvell.com>
Sat, 8 Feb 2014 00:27:28 +0000 (16:27 -0800)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 12 Feb 2014 20:36:16 +0000 (15:36 -0500)
This patch fixes a bug where we were checking for AP's AMPDU param
setting even when transmitting traffic to associated station.
Patch adds provision to pass additional parameter ra_list pointer
to function which checks if AMPDU is allowed. If current BSS type is
AP, we check station's AMPDU params else we check AP's AMPDU params.

Signed-off-by: Avinash Patil <patila@marvell.com>
Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/mwifiex/11n.h
drivers/net/wireless/mwifiex/wmm.c

index 375db01442bfd561e08a46a0d47572f5a1d149cd..353032d55ff3c540316715d5c51e12fa181f88a3 100644 (file)
@@ -64,14 +64,28 @@ int mwifiex_cmd_amsdu_aggr_ctrl(struct host_cmd_ds_command *cmd,
                                struct mwifiex_ds_11n_amsdu_aggr_ctrl *aa_ctrl);
 void mwifiex_del_tx_ba_stream_tbl_by_ra(struct mwifiex_private *priv, u8 *ra);
 
-/*
- * This function checks whether AMPDU is allowed or not for a particular TID.
- */
 static inline u8
-mwifiex_is_ampdu_allowed(struct mwifiex_private *priv, int tid)
+mwifiex_is_station_ampdu_allowed(struct mwifiex_private *priv,
+                                struct mwifiex_ra_list_tbl *ptr, int tid)
 {
-       return ((priv->aggr_prio_tbl[tid].ampdu_ap != BA_STREAM_NOT_ALLOWED)
-               ? true : false);
+       struct mwifiex_sta_node *node = mwifiex_get_sta_entry(priv, ptr->ra);
+
+       if (unlikely(!node))
+               return false;
+
+       return (node->ampdu_sta[tid] != BA_STREAM_NOT_ALLOWED) ? true : false;
+}
+
+/* This function checks whether AMPDU is allowed or not for a particular TID. */
+static inline u8
+mwifiex_is_ampdu_allowed(struct mwifiex_private *priv,
+                        struct mwifiex_ra_list_tbl *ptr, int tid)
+{
+       if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP)
+               return mwifiex_is_station_ampdu_allowed(priv, ptr, tid);
+       else
+               return (priv->aggr_prio_tbl[tid].ampdu_ap !=
+                       BA_STREAM_NOT_ALLOWED) ? true : false;
 }
 
 /*
index 13eaeed03898288d43abf107090346d513132820..ee447893fe571dfb48ba51e2c7005f953217c3e1 100644 (file)
@@ -1226,7 +1226,7 @@ mwifiex_dequeue_tx_packet(struct mwifiex_adapter *adapter)
                /* ra_list_spinlock has been freed in
                   mwifiex_send_single_packet() */
        } else {
-               if (mwifiex_is_ampdu_allowed(priv, tid) &&
+               if (mwifiex_is_ampdu_allowed(priv, ptr, tid) &&
                    ptr->ba_pkt_count > ptr->ba_packet_thr) {
                        if (mwifiex_space_avail_for_new_ba_stream(adapter)) {
                                mwifiex_create_ba_tbl(priv, ptr->ra, tid,