aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/mwifiex/11n_rxreorder.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/mwifiex/11n_rxreorder.c')
-rw-r--r--drivers/net/wireless/mwifiex/11n_rxreorder.c211
1 files changed, 101 insertions, 110 deletions
diff --git a/drivers/net/wireless/mwifiex/11n_rxreorder.c b/drivers/net/wireless/mwifiex/11n_rxreorder.c
index 681d3f2a4c28..9c44088054dd 100644
--- a/drivers/net/wireless/mwifiex/11n_rxreorder.c
+++ b/drivers/net/wireless/mwifiex/11n_rxreorder.c
@@ -27,31 +27,31 @@
27#include "11n_rxreorder.h" 27#include "11n_rxreorder.h"
28 28
29/* 29/*
30 * This function dispatches all packets in the Rx reorder table. 30 * This function dispatches all packets in the Rx reorder table until the
31 * start window.
31 * 32 *
32 * There could be holes in the buffer, which are skipped by the function. 33 * There could be holes in the buffer, which are skipped by the function.
33 * Since the buffer is linear, the function uses rotation to simulate 34 * Since the buffer is linear, the function uses rotation to simulate
34 * circular buffer. 35 * circular buffer.
35 */ 36 */
36static void 37static void
37mwifiex_11n_dispatch_pkt_until_start_win(struct mwifiex_private *priv, 38mwifiex_11n_dispatch_pkt(struct mwifiex_private *priv,
38 struct mwifiex_rx_reorder_tbl 39 struct mwifiex_rx_reorder_tbl *tbl, int start_win)
39 *rx_reor_tbl_ptr, int start_win)
40{ 40{
41 int no_pkt_to_send, i; 41 int pkt_to_send, i;
42 void *rx_tmp_ptr; 42 void *rx_tmp_ptr;
43 unsigned long flags; 43 unsigned long flags;
44 44
45 no_pkt_to_send = (start_win > rx_reor_tbl_ptr->start_win) ? 45 pkt_to_send = (start_win > tbl->start_win) ?
46 min((start_win - rx_reor_tbl_ptr->start_win), 46 min((start_win - tbl->start_win), tbl->win_size) :
47 rx_reor_tbl_ptr->win_size) : rx_reor_tbl_ptr->win_size; 47 tbl->win_size;
48 48
49 for (i = 0; i < no_pkt_to_send; ++i) { 49 for (i = 0; i < pkt_to_send; ++i) {
50 spin_lock_irqsave(&priv->rx_pkt_lock, flags); 50 spin_lock_irqsave(&priv->rx_pkt_lock, flags);
51 rx_tmp_ptr = NULL; 51 rx_tmp_ptr = NULL;
52 if (rx_reor_tbl_ptr->rx_reorder_ptr[i]) { 52 if (tbl->rx_reorder_ptr[i]) {
53 rx_tmp_ptr = rx_reor_tbl_ptr->rx_reorder_ptr[i]; 53 rx_tmp_ptr = tbl->rx_reorder_ptr[i];
54 rx_reor_tbl_ptr->rx_reorder_ptr[i] = NULL; 54 tbl->rx_reorder_ptr[i] = NULL;
55 } 55 }
56 spin_unlock_irqrestore(&priv->rx_pkt_lock, flags); 56 spin_unlock_irqrestore(&priv->rx_pkt_lock, flags);
57 if (rx_tmp_ptr) 57 if (rx_tmp_ptr)
@@ -63,13 +63,12 @@ mwifiex_11n_dispatch_pkt_until_start_win(struct mwifiex_private *priv,
63 * We don't have a circular buffer, hence use rotation to simulate 63 * We don't have a circular buffer, hence use rotation to simulate
64 * circular buffer 64 * circular buffer
65 */ 65 */
66 for (i = 0; i < rx_reor_tbl_ptr->win_size - no_pkt_to_send; ++i) { 66 for (i = 0; i < tbl->win_size - pkt_to_send; ++i) {
67 rx_reor_tbl_ptr->rx_reorder_ptr[i] = 67 tbl->rx_reorder_ptr[i] = tbl->rx_reorder_ptr[pkt_to_send + i];
68 rx_reor_tbl_ptr->rx_reorder_ptr[no_pkt_to_send + i]; 68 tbl->rx_reorder_ptr[pkt_to_send + i] = NULL;
69 rx_reor_tbl_ptr->rx_reorder_ptr[no_pkt_to_send + i] = NULL;
70 } 69 }
71 70
72 rx_reor_tbl_ptr->start_win = start_win; 71 tbl->start_win = start_win;
73 spin_unlock_irqrestore(&priv->rx_pkt_lock, flags); 72 spin_unlock_irqrestore(&priv->rx_pkt_lock, flags);
74} 73}
75 74
@@ -83,20 +82,20 @@ mwifiex_11n_dispatch_pkt_until_start_win(struct mwifiex_private *priv,
83 */ 82 */
84static void 83static void
85mwifiex_11n_scan_and_dispatch(struct mwifiex_private *priv, 84mwifiex_11n_scan_and_dispatch(struct mwifiex_private *priv,
86 struct mwifiex_rx_reorder_tbl *rx_reor_tbl_ptr) 85 struct mwifiex_rx_reorder_tbl *tbl)
87{ 86{
88 int i, j, xchg; 87 int i, j, xchg;
89 void *rx_tmp_ptr; 88 void *rx_tmp_ptr;
90 unsigned long flags; 89 unsigned long flags;
91 90
92 for (i = 0; i < rx_reor_tbl_ptr->win_size; ++i) { 91 for (i = 0; i < tbl->win_size; ++i) {
93 spin_lock_irqsave(&priv->rx_pkt_lock, flags); 92 spin_lock_irqsave(&priv->rx_pkt_lock, flags);
94 if (!rx_reor_tbl_ptr->rx_reorder_ptr[i]) { 93 if (!tbl->rx_reorder_ptr[i]) {
95 spin_unlock_irqrestore(&priv->rx_pkt_lock, flags); 94 spin_unlock_irqrestore(&priv->rx_pkt_lock, flags);
96 break; 95 break;
97 } 96 }
98 rx_tmp_ptr = rx_reor_tbl_ptr->rx_reorder_ptr[i]; 97 rx_tmp_ptr = tbl->rx_reorder_ptr[i];
99 rx_reor_tbl_ptr->rx_reorder_ptr[i] = NULL; 98 tbl->rx_reorder_ptr[i] = NULL;
100 spin_unlock_irqrestore(&priv->rx_pkt_lock, flags); 99 spin_unlock_irqrestore(&priv->rx_pkt_lock, flags);
101 mwifiex_process_rx_packet(priv->adapter, rx_tmp_ptr); 100 mwifiex_process_rx_packet(priv->adapter, rx_tmp_ptr);
102 } 101 }
@@ -107,15 +106,13 @@ mwifiex_11n_scan_and_dispatch(struct mwifiex_private *priv,
107 * circular buffer 106 * circular buffer
108 */ 107 */
109 if (i > 0) { 108 if (i > 0) {
110 xchg = rx_reor_tbl_ptr->win_size - i; 109 xchg = tbl->win_size - i;
111 for (j = 0; j < xchg; ++j) { 110 for (j = 0; j < xchg; ++j) {
112 rx_reor_tbl_ptr->rx_reorder_ptr[j] = 111 tbl->rx_reorder_ptr[j] = tbl->rx_reorder_ptr[i + j];
113 rx_reor_tbl_ptr->rx_reorder_ptr[i + j]; 112 tbl->rx_reorder_ptr[i + j] = NULL;
114 rx_reor_tbl_ptr->rx_reorder_ptr[i + j] = NULL;
115 } 113 }
116 } 114 }
117 rx_reor_tbl_ptr->start_win = (rx_reor_tbl_ptr->start_win + i) 115 tbl->start_win = (tbl->start_win + i) & (MAX_TID_VALUE - 1);
118 &(MAX_TID_VALUE - 1);
119 spin_unlock_irqrestore(&priv->rx_pkt_lock, flags); 116 spin_unlock_irqrestore(&priv->rx_pkt_lock, flags);
120} 117}
121 118
@@ -126,28 +123,25 @@ mwifiex_11n_scan_and_dispatch(struct mwifiex_private *priv,
126 * pending packets in the Rx reorder table before deletion. 123 * pending packets in the Rx reorder table before deletion.
127 */ 124 */
128static void 125static void
129mwifiex_11n_delete_rx_reorder_tbl_entry(struct mwifiex_private *priv, 126mwifiex_del_rx_reorder_entry(struct mwifiex_private *priv,
130 struct mwifiex_rx_reorder_tbl 127 struct mwifiex_rx_reorder_tbl *tbl)
131 *rx_reor_tbl_ptr)
132{ 128{
133 unsigned long flags; 129 unsigned long flags;
134 130
135 if (!rx_reor_tbl_ptr) 131 if (!tbl)
136 return; 132 return;
137 133
138 mwifiex_11n_dispatch_pkt_until_start_win(priv, rx_reor_tbl_ptr, 134 mwifiex_11n_dispatch_pkt(priv, tbl, (tbl->start_win + tbl->win_size) &
139 (rx_reor_tbl_ptr->start_win + 135 (MAX_TID_VALUE - 1));
140 rx_reor_tbl_ptr->win_size)
141 &(MAX_TID_VALUE - 1));
142 136
143 del_timer(&rx_reor_tbl_ptr->timer_context.timer); 137 del_timer(&tbl->timer_context.timer);
144 138
145 spin_lock_irqsave(&priv->rx_reorder_tbl_lock, flags); 139 spin_lock_irqsave(&priv->rx_reorder_tbl_lock, flags);
146 list_del(&rx_reor_tbl_ptr->list); 140 list_del(&tbl->list);
147 spin_unlock_irqrestore(&priv->rx_reorder_tbl_lock, flags); 141 spin_unlock_irqrestore(&priv->rx_reorder_tbl_lock, flags);
148 142
149 kfree(rx_reor_tbl_ptr->rx_reorder_ptr); 143 kfree(tbl->rx_reorder_ptr);
150 kfree(rx_reor_tbl_ptr); 144 kfree(tbl);
151} 145}
152 146
153/* 147/*
@@ -157,16 +151,15 @@ mwifiex_11n_delete_rx_reorder_tbl_entry(struct mwifiex_private *priv,
157static struct mwifiex_rx_reorder_tbl * 151static struct mwifiex_rx_reorder_tbl *
158mwifiex_11n_get_rx_reorder_tbl(struct mwifiex_private *priv, int tid, u8 *ta) 152mwifiex_11n_get_rx_reorder_tbl(struct mwifiex_private *priv, int tid, u8 *ta)
159{ 153{
160 struct mwifiex_rx_reorder_tbl *rx_reor_tbl_ptr; 154 struct mwifiex_rx_reorder_tbl *tbl;
161 unsigned long flags; 155 unsigned long flags;
162 156
163 spin_lock_irqsave(&priv->rx_reorder_tbl_lock, flags); 157 spin_lock_irqsave(&priv->rx_reorder_tbl_lock, flags);
164 list_for_each_entry(rx_reor_tbl_ptr, &priv->rx_reorder_tbl_ptr, list) { 158 list_for_each_entry(tbl, &priv->rx_reorder_tbl_ptr, list) {
165 if ((!memcmp(rx_reor_tbl_ptr->ta, ta, ETH_ALEN)) 159 if (!memcmp(tbl->ta, ta, ETH_ALEN) && tbl->tid == tid) {
166 && (rx_reor_tbl_ptr->tid == tid)) {
167 spin_unlock_irqrestore(&priv->rx_reorder_tbl_lock, 160 spin_unlock_irqrestore(&priv->rx_reorder_tbl_lock,
168 flags); 161 flags);
169 return rx_reor_tbl_ptr; 162 return tbl;
170 } 163 }
171 } 164 }
172 spin_unlock_irqrestore(&priv->rx_reorder_tbl_lock, flags); 165 spin_unlock_irqrestore(&priv->rx_reorder_tbl_lock, flags);
@@ -200,19 +193,19 @@ mwifiex_11n_find_last_seq_num(struct mwifiex_rx_reorder_tbl *rx_reorder_tbl_ptr)
200static void 193static void
201mwifiex_flush_data(unsigned long context) 194mwifiex_flush_data(unsigned long context)
202{ 195{
203 struct reorder_tmr_cnxt *reorder_cnxt = 196 struct reorder_tmr_cnxt *ctx =
204 (struct reorder_tmr_cnxt *) context; 197 (struct reorder_tmr_cnxt *) context;
205 int start_win; 198 int start_win;
206 199
207 start_win = mwifiex_11n_find_last_seq_num(reorder_cnxt->ptr); 200 start_win = mwifiex_11n_find_last_seq_num(ctx->ptr);
208 if (start_win >= 0) { 201
209 dev_dbg(reorder_cnxt->priv->adapter->dev, 202 if (start_win < 0)
210 "info: flush data %d\n", start_win); 203 return;
211 mwifiex_11n_dispatch_pkt_until_start_win(reorder_cnxt->priv, 204
212 reorder_cnxt->ptr, 205 dev_dbg(ctx->priv->adapter->dev, "info: flush data %d\n", start_win);
213 ((reorder_cnxt->ptr->start_win + 206 mwifiex_11n_dispatch_pkt(ctx->priv, ctx->ptr,
214 start_win + 1) & (MAX_TID_VALUE - 1))); 207 (ctx->ptr->start_win + start_win + 1) &
215 } 208 (MAX_TID_VALUE - 1));
216} 209}
217 210
218/* 211/*
@@ -227,10 +220,10 @@ mwifiex_flush_data(unsigned long context)
227 */ 220 */
228static void 221static void
229mwifiex_11n_create_rx_reorder_tbl(struct mwifiex_private *priv, u8 *ta, 222mwifiex_11n_create_rx_reorder_tbl(struct mwifiex_private *priv, u8 *ta,
230 int tid, int win_size, int seq_num) 223 int tid, int win_size, int seq_num)
231{ 224{
232 int i; 225 int i;
233 struct mwifiex_rx_reorder_tbl *rx_reor_tbl_ptr, *new_node; 226 struct mwifiex_rx_reorder_tbl *tbl, *new_node;
234 u16 last_seq = 0; 227 u16 last_seq = 0;
235 unsigned long flags; 228 unsigned long flags;
236 229
@@ -238,17 +231,16 @@ mwifiex_11n_create_rx_reorder_tbl(struct mwifiex_private *priv, u8 *ta,
238 * If we get a TID, ta pair which is already present dispatch all the 231 * If we get a TID, ta pair which is already present dispatch all the
239 * the packets and move the window size until the ssn 232 * the packets and move the window size until the ssn
240 */ 233 */
241 rx_reor_tbl_ptr = mwifiex_11n_get_rx_reorder_tbl(priv, tid, ta); 234 tbl = mwifiex_11n_get_rx_reorder_tbl(priv, tid, ta);
242 if (rx_reor_tbl_ptr) { 235 if (tbl) {
243 mwifiex_11n_dispatch_pkt_until_start_win(priv, rx_reor_tbl_ptr, 236 mwifiex_11n_dispatch_pkt(priv, tbl, seq_num);
244 seq_num);
245 return; 237 return;
246 } 238 }
247 /* if !rx_reor_tbl_ptr then create one */ 239 /* if !tbl then create one */
248 new_node = kzalloc(sizeof(struct mwifiex_rx_reorder_tbl), GFP_KERNEL); 240 new_node = kzalloc(sizeof(struct mwifiex_rx_reorder_tbl), GFP_KERNEL);
249 if (!new_node) { 241 if (!new_node) {
250 dev_err(priv->adapter->dev, "%s: failed to alloc new_node\n", 242 dev_err(priv->adapter->dev, "%s: failed to alloc new_node\n",
251 __func__); 243 __func__);
252 return; 244 return;
253 } 245 }
254 246
@@ -360,7 +352,8 @@ int mwifiex_cmd_11n_addba_rsp_gen(struct mwifiex_private *priv,
360 cmd_addba_req->block_ack_param_set = cpu_to_le16(block_ack_param_set); 352 cmd_addba_req->block_ack_param_set = cpu_to_le16(block_ack_param_set);
361 353
362 mwifiex_11n_create_rx_reorder_tbl(priv, cmd_addba_req->peer_mac_addr, 354 mwifiex_11n_create_rx_reorder_tbl(priv, cmd_addba_req->peer_mac_addr,
363 tid, win_size, le16_to_cpu(cmd_addba_req->ssn)); 355 tid, win_size,
356 le16_to_cpu(cmd_addba_req->ssn));
364 return 0; 357 return 0;
365} 358}
366 359
@@ -401,35 +394,34 @@ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv,
401 u16 seq_num, u16 tid, 394 u16 seq_num, u16 tid,
402 u8 *ta, u8 pkt_type, void *payload) 395 u8 *ta, u8 pkt_type, void *payload)
403{ 396{
404 struct mwifiex_rx_reorder_tbl *rx_reor_tbl_ptr; 397 struct mwifiex_rx_reorder_tbl *tbl;
405 int start_win, end_win, win_size; 398 int start_win, end_win, win_size;
406 u16 pkt_index; 399 u16 pkt_index;
407 400
408 rx_reor_tbl_ptr = 401 tbl = mwifiex_11n_get_rx_reorder_tbl((struct mwifiex_private *) priv,
409 mwifiex_11n_get_rx_reorder_tbl((struct mwifiex_private *) priv, 402 tid, ta);
410 tid, ta); 403 if (!tbl) {
411 if (!rx_reor_tbl_ptr) {
412 if (pkt_type != PKT_TYPE_BAR) 404 if (pkt_type != PKT_TYPE_BAR)
413 mwifiex_process_rx_packet(priv->adapter, payload); 405 mwifiex_process_rx_packet(priv->adapter, payload);
414 return 0; 406 return 0;
415 } 407 }
416 start_win = rx_reor_tbl_ptr->start_win; 408 start_win = tbl->start_win;
417 win_size = rx_reor_tbl_ptr->win_size; 409 win_size = tbl->win_size;
418 end_win = ((start_win + win_size) - 1) & (MAX_TID_VALUE - 1); 410 end_win = ((start_win + win_size) - 1) & (MAX_TID_VALUE - 1);
419 del_timer(&rx_reor_tbl_ptr->timer_context.timer); 411 del_timer(&tbl->timer_context.timer);
420 mod_timer(&rx_reor_tbl_ptr->timer_context.timer, jiffies 412 mod_timer(&tbl->timer_context.timer,
421 + (MIN_FLUSH_TIMER_MS * win_size * HZ) / 1000); 413 jiffies + (MIN_FLUSH_TIMER_MS * win_size * HZ) / 1000);
422 414
423 /* 415 /*
424 * If seq_num is less then starting win then ignore and drop the 416 * If seq_num is less then starting win then ignore and drop the
425 * packet 417 * packet
426 */ 418 */
427 if ((start_win + TWOPOW11) > (MAX_TID_VALUE - 1)) {/* Wrap */ 419 if ((start_win + TWOPOW11) > (MAX_TID_VALUE - 1)) {/* Wrap */
428 if (seq_num >= ((start_win + (TWOPOW11)) & (MAX_TID_VALUE - 1)) 420 if (seq_num >= ((start_win + TWOPOW11) &
429 && (seq_num < start_win)) 421 (MAX_TID_VALUE - 1)) && (seq_num < start_win))
430 return -1; 422 return -1;
431 } else if ((seq_num < start_win) 423 } else if ((seq_num < start_win) ||
432 || (seq_num > (start_win + (TWOPOW11)))) { 424 (seq_num > (start_win + TWOPOW11))) {
433 return -1; 425 return -1;
434 } 426 }
435 427
@@ -440,17 +432,17 @@ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv,
440 if (pkt_type == PKT_TYPE_BAR) 432 if (pkt_type == PKT_TYPE_BAR)
441 seq_num = ((seq_num + win_size) - 1) & (MAX_TID_VALUE - 1); 433 seq_num = ((seq_num + win_size) - 1) & (MAX_TID_VALUE - 1);
442 434
443 if (((end_win < start_win) 435 if (((end_win < start_win) &&
444 && (seq_num < (TWOPOW11 - (MAX_TID_VALUE - start_win))) 436 (seq_num < (TWOPOW11 - (MAX_TID_VALUE - start_win))) &&
445 && (seq_num > end_win)) || ((end_win > start_win) 437 (seq_num > end_win)) ||
446 && ((seq_num > end_win) || (seq_num < start_win)))) { 438 ((end_win > start_win) && ((seq_num > end_win) ||
439 (seq_num < start_win)))) {
447 end_win = seq_num; 440 end_win = seq_num;
448 if (((seq_num - win_size) + 1) >= 0) 441 if (((seq_num - win_size) + 1) >= 0)
449 start_win = (end_win - win_size) + 1; 442 start_win = (end_win - win_size) + 1;
450 else 443 else
451 start_win = (MAX_TID_VALUE - (win_size - seq_num)) + 1; 444 start_win = (MAX_TID_VALUE - (win_size - seq_num)) + 1;
452 mwifiex_11n_dispatch_pkt_until_start_win(priv, 445 mwifiex_11n_dispatch_pkt(priv, tbl, start_win);
453 rx_reor_tbl_ptr, start_win);
454 } 446 }
455 447
456 if (pkt_type != PKT_TYPE_BAR) { 448 if (pkt_type != PKT_TYPE_BAR) {
@@ -459,17 +451,17 @@ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv,
459 else 451 else
460 pkt_index = (seq_num+MAX_TID_VALUE) - start_win; 452 pkt_index = (seq_num+MAX_TID_VALUE) - start_win;
461 453
462 if (rx_reor_tbl_ptr->rx_reorder_ptr[pkt_index]) 454 if (tbl->rx_reorder_ptr[pkt_index])
463 return -1; 455 return -1;
464 456
465 rx_reor_tbl_ptr->rx_reorder_ptr[pkt_index] = payload; 457 tbl->rx_reorder_ptr[pkt_index] = payload;
466 } 458 }
467 459
468 /* 460 /*
469 * Dispatch all packets sequentially from start_win until a 461 * Dispatch all packets sequentially from start_win until a
470 * hole is found and adjust the start_win appropriately 462 * hole is found and adjust the start_win appropriately
471 */ 463 */
472 mwifiex_11n_scan_and_dispatch(priv, rx_reor_tbl_ptr); 464 mwifiex_11n_scan_and_dispatch(priv, tbl);
473 465
474 return 0; 466 return 0;
475} 467}
@@ -480,10 +472,10 @@ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv,
480 * The TID/TA are taken from del BA event body. 472 * The TID/TA are taken from del BA event body.
481 */ 473 */
482void 474void
483mwifiex_11n_delete_ba_stream_tbl(struct mwifiex_private *priv, int tid, 475mwifiex_del_ba_tbl(struct mwifiex_private *priv, int tid, u8 *peer_mac,
484 u8 *peer_mac, u8 type, int initiator) 476 u8 type, int initiator)
485{ 477{
486 struct mwifiex_rx_reorder_tbl *rx_reor_tbl_ptr; 478 struct mwifiex_rx_reorder_tbl *tbl;
487 struct mwifiex_tx_ba_stream_tbl *ptx_tbl; 479 struct mwifiex_tx_ba_stream_tbl *ptx_tbl;
488 u8 cleanup_rx_reorder_tbl; 480 u8 cleanup_rx_reorder_tbl;
489 unsigned long flags; 481 unsigned long flags;
@@ -493,23 +485,23 @@ mwifiex_11n_delete_ba_stream_tbl(struct mwifiex_private *priv, int tid,
493 else 485 else
494 cleanup_rx_reorder_tbl = (initiator) ? false : true; 486 cleanup_rx_reorder_tbl = (initiator) ? false : true;
495 487
496 dev_dbg(priv->adapter->dev, "event: DELBA: %pM tid=%d, " 488 dev_dbg(priv->adapter->dev, "event: DELBA: %pM tid=%d initiator=%d\n",
497 "initiator=%d\n", peer_mac, tid, initiator); 489 peer_mac, tid, initiator);
498 490
499 if (cleanup_rx_reorder_tbl) { 491 if (cleanup_rx_reorder_tbl) {
500 rx_reor_tbl_ptr = mwifiex_11n_get_rx_reorder_tbl(priv, tid, 492 tbl = mwifiex_11n_get_rx_reorder_tbl(priv, tid,
501 peer_mac); 493 peer_mac);
502 if (!rx_reor_tbl_ptr) { 494 if (!tbl) {
503 dev_dbg(priv->adapter->dev, 495 dev_dbg(priv->adapter->dev,
504 "event: TID, TA not found in table\n"); 496 "event: TID, TA not found in table\n");
505 return; 497 return;
506 } 498 }
507 mwifiex_11n_delete_rx_reorder_tbl_entry(priv, rx_reor_tbl_ptr); 499 mwifiex_del_rx_reorder_entry(priv, tbl);
508 } else { 500 } else {
509 ptx_tbl = mwifiex_11n_get_tx_ba_stream_tbl(priv, tid, peer_mac); 501 ptx_tbl = mwifiex_get_ba_tbl(priv, tid, peer_mac);
510 if (!ptx_tbl) { 502 if (!ptx_tbl) {
511 dev_dbg(priv->adapter->dev, 503 dev_dbg(priv->adapter->dev,
512 "event: TID, RA not found in table\n"); 504 "event: TID, RA not found in table\n");
513 return; 505 return;
514 } 506 }
515 507
@@ -532,7 +524,7 @@ int mwifiex_ret_11n_addba_resp(struct mwifiex_private *priv,
532 (struct host_cmd_ds_11n_addba_rsp *) 524 (struct host_cmd_ds_11n_addba_rsp *)
533 &resp->params.add_ba_rsp; 525 &resp->params.add_ba_rsp;
534 int tid, win_size; 526 int tid, win_size;
535 struct mwifiex_rx_reorder_tbl *rx_reor_tbl_ptr; 527 struct mwifiex_rx_reorder_tbl *tbl;
536 uint16_t block_ack_param_set; 528 uint16_t block_ack_param_set;
537 529
538 block_ack_param_set = le16_to_cpu(add_ba_rsp->block_ack_param_set); 530 block_ack_param_set = le16_to_cpu(add_ba_rsp->block_ack_param_set);
@@ -548,19 +540,18 @@ int mwifiex_ret_11n_addba_resp(struct mwifiex_private *priv,
548 IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK) 540 IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK)
549 >> BLOCKACKPARAM_WINSIZE_POS; 541 >> BLOCKACKPARAM_WINSIZE_POS;
550 542
551 dev_dbg(priv->adapter->dev, "cmd: ADDBA RSP: %pM" 543 dev_dbg(priv->adapter->dev,
552 " tid=%d ssn=%d win_size=%d\n", 544 "cmd: ADDBA RSP: %pM tid=%d ssn=%d win_size=%d\n",
553 add_ba_rsp->peer_mac_addr, 545 add_ba_rsp->peer_mac_addr, tid,
554 tid, add_ba_rsp->ssn, win_size); 546 add_ba_rsp->ssn, win_size);
555 } else { 547 } else {
556 dev_err(priv->adapter->dev, "ADDBA RSP: failed %pM tid=%d)\n", 548 dev_err(priv->adapter->dev, "ADDBA RSP: failed %pM tid=%d)\n",
557 add_ba_rsp->peer_mac_addr, tid); 549 add_ba_rsp->peer_mac_addr, tid);
558 550
559 rx_reor_tbl_ptr = mwifiex_11n_get_rx_reorder_tbl(priv, 551 tbl = mwifiex_11n_get_rx_reorder_tbl(priv, tid,
560 tid, add_ba_rsp->peer_mac_addr); 552 add_ba_rsp->peer_mac_addr);
561 if (rx_reor_tbl_ptr) 553 if (tbl)
562 mwifiex_11n_delete_rx_reorder_tbl_entry(priv, 554 mwifiex_del_rx_reorder_entry(priv, tbl);
563 rx_reor_tbl_ptr);
564 } 555 }
565 556
566 return 0; 557 return 0;
@@ -599,7 +590,7 @@ void mwifiex_11n_cleanup_reorder_tbl(struct mwifiex_private *priv)
599 list_for_each_entry_safe(del_tbl_ptr, tmp_node, 590 list_for_each_entry_safe(del_tbl_ptr, tmp_node,
600 &priv->rx_reorder_tbl_ptr, list) { 591 &priv->rx_reorder_tbl_ptr, list) {
601 spin_unlock_irqrestore(&priv->rx_reorder_tbl_lock, flags); 592 spin_unlock_irqrestore(&priv->rx_reorder_tbl_lock, flags);
602 mwifiex_11n_delete_rx_reorder_tbl_entry(priv, del_tbl_ptr); 593 mwifiex_del_rx_reorder_entry(priv, del_tbl_ptr);
603 spin_lock_irqsave(&priv->rx_reorder_tbl_lock, flags); 594 spin_lock_irqsave(&priv->rx_reorder_tbl_lock, flags);
604 } 595 }
605 spin_unlock_irqrestore(&priv->rx_reorder_tbl_lock, flags); 596 spin_unlock_irqrestore(&priv->rx_reorder_tbl_lock, flags);