diff options
-rw-r--r-- | drivers/net/wireless/ath/wil6210/rx_reorder.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath/wil6210/rx_reorder.c b/drivers/net/wireless/ath/wil6210/rx_reorder.c index e3d1be82f314..32031e7a11d5 100644 --- a/drivers/net/wireless/ath/wil6210/rx_reorder.c +++ b/drivers/net/wireless/ath/wil6210/rx_reorder.c | |||
@@ -261,9 +261,19 @@ struct wil_tid_ampdu_rx *wil_tid_ampdu_rx_alloc(struct wil6210_priv *wil, | |||
261 | void wil_tid_ampdu_rx_free(struct wil6210_priv *wil, | 261 | void wil_tid_ampdu_rx_free(struct wil6210_priv *wil, |
262 | struct wil_tid_ampdu_rx *r) | 262 | struct wil_tid_ampdu_rx *r) |
263 | { | 263 | { |
264 | int i; | ||
265 | |||
264 | if (!r) | 266 | if (!r) |
265 | return; | 267 | return; |
266 | wil_release_reorder_frames(wil, r, r->head_seq_num + r->buf_size); | 268 | |
269 | /* Do not pass remaining frames to the network stack - it may be | ||
270 | * not expecting to get any more Rx. Rx from here may lead to | ||
271 | * kernel OOPS since some per-socket accounting info was already | ||
272 | * released. | ||
273 | */ | ||
274 | for (i = 0; i < r->buf_size; i++) | ||
275 | kfree_skb(r->reorder_buf[i]); | ||
276 | |||
267 | kfree(r->reorder_buf); | 277 | kfree(r->reorder_buf); |
268 | kfree(r->reorder_time); | 278 | kfree(r->reorder_time); |
269 | kfree(r); | 279 | kfree(r); |