--- 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 {