diff options
Diffstat (limited to 'drivers/net/wireless/mwifiex/11n_rxreorder.c')
-rw-r--r-- | drivers/net/wireless/mwifiex/11n_rxreorder.c | 211 |
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 | */ |
36 | static void | 37 | static void |
37 | mwifiex_11n_dispatch_pkt_until_start_win(struct mwifiex_private *priv, | 38 | mwifiex_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 | */ |
84 | static void | 83 | static void |
85 | mwifiex_11n_scan_and_dispatch(struct mwifiex_private *priv, | 84 | mwifiex_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 | */ |
128 | static void | 125 | static void |
129 | mwifiex_11n_delete_rx_reorder_tbl_entry(struct mwifiex_private *priv, | 126 | mwifiex_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, | |||
157 | static struct mwifiex_rx_reorder_tbl * | 151 | static struct mwifiex_rx_reorder_tbl * |
158 | mwifiex_11n_get_rx_reorder_tbl(struct mwifiex_private *priv, int tid, u8 *ta) | 152 | mwifiex_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) | |||
200 | static void | 193 | static void |
201 | mwifiex_flush_data(unsigned long context) | 194 | mwifiex_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 | */ |
228 | static void | 221 | static void |
229 | mwifiex_11n_create_rx_reorder_tbl(struct mwifiex_private *priv, u8 *ta, | 222 | mwifiex_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 | */ |
482 | void | 474 | void |
483 | mwifiex_11n_delete_ba_stream_tbl(struct mwifiex_private *priv, int tid, | 475 | mwifiex_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); |