aboutsummaryrefslogtreecommitdiffstats
path: root/package/mac80211/patches/520-mac80211_minstrel_ht_aggr_delay.patch
blob: c0a6bf3ffdee01676af6b517f66c18d2595a7b57 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
--- a/net/mac80211/rc80211_minstrel_ht.c
+++ b/net/mac80211/rc80211_minstrel_ht.c
@@ -355,10 +355,12 @@ minstrel_downgrade_rate(struct minstrel_
 }
 
 static void
-minstrel_aggr_check(struct minstrel_priv *mp, struct ieee80211_sta *pubsta, struct sk_buff *skb)
+minstrel_aggr_check(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
+		    struct ieee80211_sta *pubsta, struct sk_buff *skb)
 {
 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
 	struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
+	unsigned long t1, t2;
 	u16 tid;
 
 	if (unlikely(!ieee80211_is_data_qos(hdr->frame_control)))
@@ -374,6 +376,12 @@ minstrel_aggr_check(struct minstrel_priv
 	if (skb_get_queue_mapping(skb) == IEEE80211_AC_VO)
 		return;
 
+	t1 = mi->last_aggr_start_time[tid];
+	t2 = t1 + msecs_to_jiffies(5000);
+	if (unlikely(time_in_range(jiffies, t1, t2)))
+		return;
+
+	mi->last_aggr_start_time[tid] = jiffies;
 	ieee80211_start_tx_ba_session(pubsta, tid, 5000);
 }
 
@@ -452,7 +460,7 @@ minstrel_ht_tx_status(void *priv, struct
 
 	if (time_after(jiffies, mi->stats_update + (mp->update_interval / 2 * HZ) / 1000)) {
 		minstrel_ht_update_stats(mp, mi);
-		minstrel_aggr_check(mp, sta, skb);
+		minstrel_aggr_check(mp, mi, sta, skb);
 	}
 }
 
--- a/net/mac80211/rc80211_minstrel_ht.h
+++ b/net/mac80211/rc80211_minstrel_ht.h
@@ -109,6 +109,8 @@ struct minstrel_ht_sta {
 
 	/* MCS rate group info and statistics */
 	struct minstrel_mcs_group_data groups[MINSTREL_MAX_STREAMS * MINSTREL_STREAM_GROUPS];
+
+	unsigned long last_aggr_start_time[IEEE80211_QOS_CTL_TID_MASK + 1];
 };
 
 struct minstrel_ht_sta_priv {