|
@@ -91,6 +91,22 @@ void wil_rx_reorder(struct wil6210_priv *wil, struct sk_buff *skb)
|
|
|
|
|
|
spin_lock(&r->reorder_lock);
|
|
|
|
|
|
+ /** Due to the race between WMI events, where BACK establishment
|
|
|
+ * reported, and data Rx, few packets may be pass up before reorder
|
|
|
+ * buffer get allocated. Catch up by pretending SSN is what we
|
|
|
+ * see in the 1-st Rx packet
|
|
|
+ */
|
|
|
+ if (r->first_time) {
|
|
|
+ r->first_time = false;
|
|
|
+ if (seq != r->head_seq_num) {
|
|
|
+ wil_err(wil, "Error: 1-st frame with wrong sequence"
|
|
|
+ " %d, should be %d. Fixing...\n", seq,
|
|
|
+ r->head_seq_num);
|
|
|
+ r->head_seq_num = seq;
|
|
|
+ r->ssn = seq;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/* frame with out of date sequence number */
|
|
|
if (seq_less(seq, r->head_seq_num)) {
|
|
|
dev_kfree_skb(skb);
|
|
@@ -162,6 +178,7 @@ struct wil_tid_ampdu_rx *wil_tid_ampdu_rx_alloc(struct wil6210_priv *wil,
|
|
|
r->head_seq_num = ssn;
|
|
|
r->buf_size = size;
|
|
|
r->stored_mpdu_num = 0;
|
|
|
+ r->first_time = true;
|
|
|
return r;
|
|
|
}
|
|
|
|