|
@@ -537,6 +537,7 @@ static void ieee80211_release_reorder_frame(struct ieee80211_hw *hw,
|
|
struct sk_buff_head *frames)
|
|
struct sk_buff_head *frames)
|
|
{
|
|
{
|
|
struct sk_buff *skb = tid_agg_rx->reorder_buf[index];
|
|
struct sk_buff *skb = tid_agg_rx->reorder_buf[index];
|
|
|
|
+ struct ieee80211_rx_status *status;
|
|
|
|
|
|
lockdep_assert_held(&tid_agg_rx->reorder_lock);
|
|
lockdep_assert_held(&tid_agg_rx->reorder_lock);
|
|
|
|
|
|
@@ -546,6 +547,8 @@ static void ieee80211_release_reorder_frame(struct ieee80211_hw *hw,
|
|
/* release the frame from the reorder ring buffer */
|
|
/* release the frame from the reorder ring buffer */
|
|
tid_agg_rx->stored_mpdu_num--;
|
|
tid_agg_rx->stored_mpdu_num--;
|
|
tid_agg_rx->reorder_buf[index] = NULL;
|
|
tid_agg_rx->reorder_buf[index] = NULL;
|
|
|
|
+ status = IEEE80211_SKB_RXCB(skb);
|
|
|
|
+ status->rx_flags |= IEEE80211_RX_DEFERRED_RELEASE;
|
|
__skb_queue_tail(frames, skb);
|
|
__skb_queue_tail(frames, skb);
|
|
|
|
|
|
no_frame:
|
|
no_frame:
|
|
@@ -1189,6 +1192,7 @@ ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx)
|
|
* exchange sequence.
|
|
* exchange sequence.
|
|
*/
|
|
*/
|
|
if (!ieee80211_has_morefrags(hdr->frame_control) &&
|
|
if (!ieee80211_has_morefrags(hdr->frame_control) &&
|
|
|
|
+ !(status->rx_flags & IEEE80211_RX_DEFERRED_RELEASE) &&
|
|
(rx->sdata->vif.type == NL80211_IFTYPE_AP ||
|
|
(rx->sdata->vif.type == NL80211_IFTYPE_AP ||
|
|
rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN)) {
|
|
rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN)) {
|
|
if (test_sta_flags(sta, WLAN_STA_PS_STA)) {
|
|
if (test_sta_flags(sta, WLAN_STA_PS_STA)) {
|