diff options
-rw-r--r-- | net/mac80211/rx.c | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 446a327b3de0..9f1bd692589b 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -554,11 +554,11 @@ static inline u16 seq_sub(u16 sq1, u16 sq2) | |||
554 | } | 554 | } |
555 | 555 | ||
556 | 556 | ||
557 | static void ieee80211_release_reorder_frame(struct ieee80211_hw *hw, | 557 | static void ieee80211_release_reorder_frame(struct ieee80211_sub_if_data *sdata, |
558 | struct tid_ampdu_rx *tid_agg_rx, | 558 | struct tid_ampdu_rx *tid_agg_rx, |
559 | int index) | 559 | int index) |
560 | { | 560 | { |
561 | struct ieee80211_local *local = hw_to_local(hw); | 561 | struct ieee80211_local *local = sdata->local; |
562 | struct sk_buff *skb = tid_agg_rx->reorder_buf[index]; | 562 | struct sk_buff *skb = tid_agg_rx->reorder_buf[index]; |
563 | struct ieee80211_rx_status *status; | 563 | struct ieee80211_rx_status *status; |
564 | 564 | ||
@@ -578,7 +578,7 @@ no_frame: | |||
578 | tid_agg_rx->head_seq_num = seq_inc(tid_agg_rx->head_seq_num); | 578 | tid_agg_rx->head_seq_num = seq_inc(tid_agg_rx->head_seq_num); |
579 | } | 579 | } |
580 | 580 | ||
581 | static void ieee80211_release_reorder_frames(struct ieee80211_hw *hw, | 581 | static void ieee80211_release_reorder_frames(struct ieee80211_sub_if_data *sdata, |
582 | struct tid_ampdu_rx *tid_agg_rx, | 582 | struct tid_ampdu_rx *tid_agg_rx, |
583 | u16 head_seq_num) | 583 | u16 head_seq_num) |
584 | { | 584 | { |
@@ -589,7 +589,7 @@ static void ieee80211_release_reorder_frames(struct ieee80211_hw *hw, | |||
589 | while (seq_less(tid_agg_rx->head_seq_num, head_seq_num)) { | 589 | while (seq_less(tid_agg_rx->head_seq_num, head_seq_num)) { |
590 | index = seq_sub(tid_agg_rx->head_seq_num, tid_agg_rx->ssn) % | 590 | index = seq_sub(tid_agg_rx->head_seq_num, tid_agg_rx->ssn) % |
591 | tid_agg_rx->buf_size; | 591 | tid_agg_rx->buf_size; |
592 | ieee80211_release_reorder_frame(hw, tid_agg_rx, index); | 592 | ieee80211_release_reorder_frame(sdata, tid_agg_rx, index); |
593 | } | 593 | } |
594 | } | 594 | } |
595 | 595 | ||
@@ -604,7 +604,7 @@ static void ieee80211_release_reorder_frames(struct ieee80211_hw *hw, | |||
604 | */ | 604 | */ |
605 | #define HT_RX_REORDER_BUF_TIMEOUT (HZ / 10) | 605 | #define HT_RX_REORDER_BUF_TIMEOUT (HZ / 10) |
606 | 606 | ||
607 | static void ieee80211_sta_reorder_release(struct ieee80211_hw *hw, | 607 | static void ieee80211_sta_reorder_release(struct ieee80211_sub_if_data *sdata, |
608 | struct tid_ampdu_rx *tid_agg_rx) | 608 | struct tid_ampdu_rx *tid_agg_rx) |
609 | { | 609 | { |
610 | int index, j; | 610 | int index, j; |
@@ -634,10 +634,10 @@ static void ieee80211_sta_reorder_release(struct ieee80211_hw *hw, | |||
634 | 634 | ||
635 | #ifdef CONFIG_MAC80211_HT_DEBUG | 635 | #ifdef CONFIG_MAC80211_HT_DEBUG |
636 | if (net_ratelimit()) | 636 | if (net_ratelimit()) |
637 | wiphy_debug(hw->wiphy, | 637 | wiphy_debug(sdata->local->hw.wiphy, |
638 | "release an RX reorder frame due to timeout on earlier frames\n"); | 638 | "release an RX reorder frame due to timeout on earlier frames\n"); |
639 | #endif | 639 | #endif |
640 | ieee80211_release_reorder_frame(hw, tid_agg_rx, j); | 640 | ieee80211_release_reorder_frame(sdata, tid_agg_rx, j); |
641 | 641 | ||
642 | /* | 642 | /* |
643 | * Increment the head seq# also for the skipped slots. | 643 | * Increment the head seq# also for the skipped slots. |
@@ -647,7 +647,7 @@ static void ieee80211_sta_reorder_release(struct ieee80211_hw *hw, | |||
647 | skipped = 0; | 647 | skipped = 0; |
648 | } | 648 | } |
649 | } else while (tid_agg_rx->reorder_buf[index]) { | 649 | } else while (tid_agg_rx->reorder_buf[index]) { |
650 | ieee80211_release_reorder_frame(hw, tid_agg_rx, index); | 650 | ieee80211_release_reorder_frame(sdata, tid_agg_rx, index); |
651 | index = seq_sub(tid_agg_rx->head_seq_num, tid_agg_rx->ssn) % | 651 | index = seq_sub(tid_agg_rx->head_seq_num, tid_agg_rx->ssn) % |
652 | tid_agg_rx->buf_size; | 652 | tid_agg_rx->buf_size; |
653 | } | 653 | } |
@@ -677,7 +677,7 @@ static void ieee80211_sta_reorder_release(struct ieee80211_hw *hw, | |||
677 | * rcu_read_lock protection. It returns false if the frame | 677 | * rcu_read_lock protection. It returns false if the frame |
678 | * can be processed immediately, true if it was consumed. | 678 | * can be processed immediately, true if it was consumed. |
679 | */ | 679 | */ |
680 | static bool ieee80211_sta_manage_reorder_buf(struct ieee80211_hw *hw, | 680 | static bool ieee80211_sta_manage_reorder_buf(struct ieee80211_sub_if_data *sdata, |
681 | struct tid_ampdu_rx *tid_agg_rx, | 681 | struct tid_ampdu_rx *tid_agg_rx, |
682 | struct sk_buff *skb) | 682 | struct sk_buff *skb) |
683 | { | 683 | { |
@@ -706,7 +706,8 @@ static bool ieee80211_sta_manage_reorder_buf(struct ieee80211_hw *hw, | |||
706 | if (!seq_less(mpdu_seq_num, head_seq_num + buf_size)) { | 706 | if (!seq_less(mpdu_seq_num, head_seq_num + buf_size)) { |
707 | head_seq_num = seq_inc(seq_sub(mpdu_seq_num, buf_size)); | 707 | head_seq_num = seq_inc(seq_sub(mpdu_seq_num, buf_size)); |
708 | /* release stored frames up to new head to stack */ | 708 | /* release stored frames up to new head to stack */ |
709 | ieee80211_release_reorder_frames(hw, tid_agg_rx, head_seq_num); | 709 | ieee80211_release_reorder_frames(sdata, tid_agg_rx, |
710 | head_seq_num); | ||
710 | } | 711 | } |
711 | 712 | ||
712 | /* Now the new frame is always in the range of the reordering buffer */ | 713 | /* Now the new frame is always in the range of the reordering buffer */ |
@@ -736,7 +737,7 @@ static bool ieee80211_sta_manage_reorder_buf(struct ieee80211_hw *hw, | |||
736 | tid_agg_rx->reorder_buf[index] = skb; | 737 | tid_agg_rx->reorder_buf[index] = skb; |
737 | tid_agg_rx->reorder_time[index] = jiffies; | 738 | tid_agg_rx->reorder_time[index] = jiffies; |
738 | tid_agg_rx->stored_mpdu_num++; | 739 | tid_agg_rx->stored_mpdu_num++; |
739 | ieee80211_sta_reorder_release(hw, tid_agg_rx); | 740 | ieee80211_sta_reorder_release(sdata, tid_agg_rx); |
740 | 741 | ||
741 | out: | 742 | out: |
742 | spin_unlock(&tid_agg_rx->reorder_lock); | 743 | spin_unlock(&tid_agg_rx->reorder_lock); |
@@ -751,7 +752,6 @@ static void ieee80211_rx_reorder_ampdu(struct ieee80211_rx_data *rx) | |||
751 | { | 752 | { |
752 | struct sk_buff *skb = rx->skb; | 753 | struct sk_buff *skb = rx->skb; |
753 | struct ieee80211_local *local = rx->local; | 754 | struct ieee80211_local *local = rx->local; |
754 | struct ieee80211_hw *hw = &local->hw; | ||
755 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | 755 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; |
756 | struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); | 756 | struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); |
757 | struct sta_info *sta = rx->sta; | 757 | struct sta_info *sta = rx->sta; |
@@ -813,7 +813,7 @@ static void ieee80211_rx_reorder_ampdu(struct ieee80211_rx_data *rx) | |||
813 | * sure that we cannot get to it any more before doing | 813 | * sure that we cannot get to it any more before doing |
814 | * anything with it. | 814 | * anything with it. |
815 | */ | 815 | */ |
816 | if (ieee80211_sta_manage_reorder_buf(hw, tid_agg_rx, skb)) | 816 | if (ieee80211_sta_manage_reorder_buf(rx->sdata, tid_agg_rx, skb)) |
817 | return; | 817 | return; |
818 | 818 | ||
819 | dont_reorder: | 819 | dont_reorder: |
@@ -2058,8 +2058,6 @@ ieee80211_rx_h_data(struct ieee80211_rx_data *rx) | |||
2058 | static ieee80211_rx_result debug_noinline | 2058 | static ieee80211_rx_result debug_noinline |
2059 | ieee80211_rx_h_ctrl(struct ieee80211_rx_data *rx) | 2059 | ieee80211_rx_h_ctrl(struct ieee80211_rx_data *rx) |
2060 | { | 2060 | { |
2061 | struct ieee80211_local *local = rx->local; | ||
2062 | struct ieee80211_hw *hw = &local->hw; | ||
2063 | struct sk_buff *skb = rx->skb; | 2061 | struct sk_buff *skb = rx->skb; |
2064 | struct ieee80211_bar *bar = (struct ieee80211_bar *)skb->data; | 2062 | struct ieee80211_bar *bar = (struct ieee80211_bar *)skb->data; |
2065 | struct tid_ampdu_rx *tid_agg_rx; | 2063 | struct tid_ampdu_rx *tid_agg_rx; |
@@ -2096,7 +2094,8 @@ ieee80211_rx_h_ctrl(struct ieee80211_rx_data *rx) | |||
2096 | 2094 | ||
2097 | spin_lock(&tid_agg_rx->reorder_lock); | 2095 | spin_lock(&tid_agg_rx->reorder_lock); |
2098 | /* release stored frames up to start of BAR */ | 2096 | /* release stored frames up to start of BAR */ |
2099 | ieee80211_release_reorder_frames(hw, tid_agg_rx, start_seq_num); | 2097 | ieee80211_release_reorder_frames(rx->sdata, tid_agg_rx, |
2098 | start_seq_num); | ||
2100 | spin_unlock(&tid_agg_rx->reorder_lock); | 2099 | spin_unlock(&tid_agg_rx->reorder_lock); |
2101 | 2100 | ||
2102 | kfree_skb(skb); | 2101 | kfree_skb(skb); |
@@ -2747,7 +2746,7 @@ void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid) | |||
2747 | return; | 2746 | return; |
2748 | 2747 | ||
2749 | spin_lock(&tid_agg_rx->reorder_lock); | 2748 | spin_lock(&tid_agg_rx->reorder_lock); |
2750 | ieee80211_sta_reorder_release(&sta->local->hw, tid_agg_rx); | 2749 | ieee80211_sta_reorder_release(sta->sdata, tid_agg_rx); |
2751 | spin_unlock(&tid_agg_rx->reorder_lock); | 2750 | spin_unlock(&tid_agg_rx->reorder_lock); |
2752 | 2751 | ||
2753 | ieee80211_rx_handlers(&rx); | 2752 | ieee80211_rx_handlers(&rx); |