aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAvinash Patil <patila@marvell.com>2014-02-07 19:30:37 -0500
committerJohn W. Linville <linville@tuxdriver.com>2014-02-12 15:36:23 -0500
commitdaeb5bb48256d7488246d48453b2315281ce9c75 (patch)
tree0ce912edf00067073f3a23536c955f82f2835825
parentd63bf5e5e00dc025c71532e9244a96966ac8e252 (diff)
mwifiex: AMPDU support for TDLS link
This patch adds AMPDU support for TDLS link. We have set 11n capabilities including AMPDU parameters during ENABLE_LINK. We set a variable in RA list to indicate this as TDLS link. This patch uses these capabilities to know if AMPDU is allowed on TDLS link and enables AMPDU aggregation for TX and RX reording support for RA list for this peer. 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>
-rw-r--r--drivers/net/wireless/mwifiex/11n.h18
-rw-r--r--drivers/net/wireless/mwifiex/11n_rxreorder.c6
-rw-r--r--drivers/net/wireless/mwifiex/main.h1
-rw-r--r--drivers/net/wireless/mwifiex/tdls.c1
-rw-r--r--drivers/net/wireless/mwifiex/wmm.c9
5 files changed, 31 insertions, 4 deletions
diff --git a/drivers/net/wireless/mwifiex/11n.h b/drivers/net/wireless/mwifiex/11n.h
index fde39fedf0c0..12bb6acbdd58 100644
--- a/drivers/net/wireless/mwifiex/11n.h
+++ b/drivers/net/wireless/mwifiex/11n.h
@@ -81,11 +81,15 @@ static inline u8
81mwifiex_is_ampdu_allowed(struct mwifiex_private *priv, 81mwifiex_is_ampdu_allowed(struct mwifiex_private *priv,
82 struct mwifiex_ra_list_tbl *ptr, int tid) 82 struct mwifiex_ra_list_tbl *ptr, int tid)
83{ 83{
84 if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP) 84 if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP) {
85 return mwifiex_is_station_ampdu_allowed(priv, ptr, tid); 85 return mwifiex_is_station_ampdu_allowed(priv, ptr, tid);
86 else 86 } else {
87 if (ptr->tdls_link)
88 return mwifiex_is_station_ampdu_allowed(priv, ptr, tid);
89
87 return (priv->aggr_prio_tbl[tid].ampdu_ap != 90 return (priv->aggr_prio_tbl[tid].ampdu_ap !=
88 BA_STREAM_NOT_ALLOWED) ? true : false; 91 BA_STREAM_NOT_ALLOWED) ? true : false;
92 }
89} 93}
90 94
91/* 95/*
@@ -179,4 +183,14 @@ static inline int mwifiex_is_sta_11n_enabled(struct mwifiex_private *priv,
179 183
180 return node->is_11n_enabled; 184 return node->is_11n_enabled;
181} 185}
186
187static inline u8
188mwifiex_tdls_peer_11n_enabled(struct mwifiex_private *priv, u8 *ra)
189{
190 struct mwifiex_sta_node *node = mwifiex_get_sta_entry(priv, ra);
191 if (node)
192 return node->is_11n_enabled;
193
194 return false;
195}
182#endif /* !_MWIFIEX_11N_H_ */ 196#endif /* !_MWIFIEX_11N_H_ */
diff --git a/drivers/net/wireless/mwifiex/11n_rxreorder.c b/drivers/net/wireless/mwifiex/11n_rxreorder.c
index ada809f576fe..3767399576b3 100644
--- a/drivers/net/wireless/mwifiex/11n_rxreorder.c
+++ b/drivers/net/wireless/mwifiex/11n_rxreorder.c
@@ -290,7 +290,11 @@ mwifiex_11n_create_rx_reorder_tbl(struct mwifiex_private *priv, u8 *ta,
290 last_seq = node->rx_seq[tid]; 290 last_seq = node->rx_seq[tid];
291 } 291 }
292 } else { 292 } else {
293 last_seq = priv->rx_seq[tid]; 293 node = mwifiex_get_sta_entry(priv, ta);
294 if (node)
295 last_seq = node->rx_seq[tid];
296 else
297 last_seq = priv->rx_seq[tid];
294 } 298 }
295 299
296 if (last_seq != MWIFIEX_DEF_11N_RX_SEQ_NUM && 300 if (last_seq != MWIFIEX_DEF_11N_RX_SEQ_NUM &&
diff --git a/drivers/net/wireless/mwifiex/main.h b/drivers/net/wireless/mwifiex/main.h
index 3001332191a3..6d49d99045c0 100644
--- a/drivers/net/wireless/mwifiex/main.h
+++ b/drivers/net/wireless/mwifiex/main.h
@@ -210,6 +210,7 @@ struct mwifiex_ra_list_tbl {
210 u16 ba_pkt_count; 210 u16 ba_pkt_count;
211 u8 ba_packet_thr; 211 u8 ba_packet_thr;
212 u16 total_pkt_count; 212 u16 total_pkt_count;
213 bool tdls_link;
213}; 214};
214 215
215struct mwifiex_tid_tbl { 216struct mwifiex_tid_tbl {
diff --git a/drivers/net/wireless/mwifiex/tdls.c b/drivers/net/wireless/mwifiex/tdls.c
index 7ef3593e2c44..243beaba9160 100644
--- a/drivers/net/wireless/mwifiex/tdls.c
+++ b/drivers/net/wireless/mwifiex/tdls.c
@@ -49,6 +49,7 @@ mwifiex_restore_tdls_packets(struct mwifiex_private *priv, u8 *mac, u8 status)
49 49
50 if (status == TDLS_SETUP_COMPLETE) { 50 if (status == TDLS_SETUP_COMPLETE) {
51 ra_list = mwifiex_wmm_get_queue_raptr(priv, tid, mac); 51 ra_list = mwifiex_wmm_get_queue_raptr(priv, tid, mac);
52 ra_list->tdls_link = true;
52 tx_info->flags |= MWIFIEX_BUF_FLAG_TDLS_PKT; 53 tx_info->flags |= MWIFIEX_BUF_FLAG_TDLS_PKT;
53 } else { 54 } else {
54 tid_list = &priv->wmm.tid_tbl_ptr[tid_down].ra_list; 55 tid_list = &priv->wmm.tid_tbl_ptr[tid_down].ra_list;
diff --git a/drivers/net/wireless/mwifiex/wmm.c b/drivers/net/wireless/mwifiex/wmm.c
index 63496ed10272..e0ba0115e5ae 100644
--- a/drivers/net/wireless/mwifiex/wmm.c
+++ b/drivers/net/wireless/mwifiex/wmm.c
@@ -160,8 +160,15 @@ mwifiex_ralist_add(struct mwifiex_private *priv, u8 *ra)
160 break; 160 break;
161 161
162 ra_list->is_11n_enabled = 0; 162 ra_list->is_11n_enabled = 0;
163 ra_list->tdls_link = false;
163 if (!mwifiex_queuing_ra_based(priv)) { 164 if (!mwifiex_queuing_ra_based(priv)) {
164 ra_list->is_11n_enabled = IS_11N_ENABLED(priv); 165 if (mwifiex_get_tdls_link_status(priv, ra) ==
166 TDLS_SETUP_COMPLETE) {
167 ra_list->is_11n_enabled =
168 mwifiex_tdls_peer_11n_enabled(priv, ra);
169 } else {
170 ra_list->is_11n_enabled = IS_11N_ENABLED(priv);
171 }
165 } else { 172 } else {
166 ra_list->is_11n_enabled = 173 ra_list->is_11n_enabled =
167 mwifiex_is_sta_11n_enabled(priv, node); 174 mwifiex_is_sta_11n_enabled(priv, node);