|
@@ -719,6 +719,22 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm,
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * release immediately if there are no stored frames, and the sn is
|
|
|
+ * equal to the head.
|
|
|
+ * This can happen due to reorder timer, where NSSN is behind head_sn.
|
|
|
+ * When we released everything, and we got the next frame in the
|
|
|
+ * sequence, according to the NSSN we can't release immediately,
|
|
|
+ * while technically there is no hole and we can move forward.
|
|
|
+ */
|
|
|
+ if (!buffer->num_stored && sn == buffer->head_sn) {
|
|
|
+ if (!amsdu || last_subframe)
|
|
|
+ buffer->head_sn = ieee80211_sn_inc(buffer->head_sn);
|
|
|
+ /* No need to update AMSDU last SN - we are moving the head */
|
|
|
+ spin_unlock_bh(&buffer->lock);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
index = sn % buffer->buf_size;
|
|
|
|
|
|
/*
|