diff --git a/package/kernel/mac80211/patches/subsys/339-mac80211-remove-legacy-minstrel-rate-control.patch b/package/kernel/mac80211/patches/subsys/339-mac80211-remove-legacy-minstrel-rate-control.patch
new file mode 100644
index 0000000..96ee595
--- /dev/null
+++ b/package/kernel/mac80211/patches/subsys/339-mac80211-remove-legacy-minstrel-rate-control.patch
@@ -0,0 +1,1328 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sat, 26 Dec 2020 14:23:47 +0100
+Subject: [PATCH] mac80211: remove legacy minstrel rate control
+
+Now that minstrel_ht supports legacy rates, it is no longer needed
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ delete mode 100644 net/mac80211/rc80211_minstrel.c
+ delete mode 100644 net/mac80211/rc80211_minstrel.h
+ delete mode 100644 net/mac80211/rc80211_minstrel_debugfs.c
+
+--- a/net/mac80211/Makefile
++++ b/net/mac80211/Makefile
+@@ -55,11 +55,9 @@ mac80211-$(CONFIG_PM) += pm.o
+ CFLAGS_trace.o := -I$(src)
+ 
+ rc80211_minstrel-y := \
+-	rc80211_minstrel.o \
+ 	rc80211_minstrel_ht.o
+ 
+ rc80211_minstrel-$(CPTCFG_MAC80211_DEBUGFS) += \
+-	rc80211_minstrel_debugfs.o \
+ 	rc80211_minstrel_ht_debugfs.o
+ 
+ mac80211-$(CPTCFG_MAC80211_RC_MINSTREL) += $(rc80211_minstrel-y)
+--- a/net/mac80211/rc80211_minstrel.c
++++ /dev/null
+@@ -1,574 +0,0 @@
+-/*
+- * Copyright (C) 2008 Felix Fietkau <nbd@openwrt.org>
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License version 2 as
+- * published by the Free Software Foundation.
+- *
+- * Based on minstrel.c:
+- *   Copyright (C) 2005-2007 Derek Smithies <derek@indranet.co.nz>
+- *   Sponsored by Indranet Technologies Ltd
+- *
+- * Based on sample.c:
+- *   Copyright (c) 2005 John Bicket
+- *   All rights reserved.
+- *
+- *   Redistribution and use in source and binary forms, with or without
+- *   modification, are permitted provided that the following conditions
+- *   are met:
+- *   1. Redistributions of source code must retain the above copyright
+- *      notice, this list of conditions and the following disclaimer,
+- *      without modification.
+- *   2. Redistributions in binary form must reproduce at minimum a disclaimer
+- *      similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+- *      redistribution must be conditioned upon including a substantially
+- *      similar Disclaimer requirement for further binary redistribution.
+- *   3. Neither the names of the above-listed copyright holders nor the names
+- *      of any contributors may be used to endorse or promote products derived
+- *      from this software without specific prior written permission.
+- *
+- *   Alternatively, this software may be distributed under the terms of the
+- *   GNU General Public License ("GPL") version 2 as published by the Free
+- *   Software Foundation.
+- *
+- *   NO WARRANTY
+- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+- *   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+- *   LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+- *   AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+- *   THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+- *   OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+- *   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+- *   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+- *   IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+- *   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+- *   THE POSSIBILITY OF SUCH DAMAGES.
+- */
+-#include <linux/netdevice.h>
+-#include <linux/types.h>
+-#include <linux/skbuff.h>
+-#include <linux/debugfs.h>
+-#include <linux/random.h>
+-#include <linux/ieee80211.h>
+-#include <linux/slab.h>
+-#include <net/mac80211.h>
+-#include "rate.h"
+-#include "rc80211_minstrel.h"
+-
+-#define SAMPLE_TBL(_mi, _idx, _col) \
+-		_mi->sample_table[(_idx * SAMPLE_COLUMNS) + _col]
+-
+-/* convert mac80211 rate index to local array index */
+-static inline int
+-rix_to_ndx(struct minstrel_sta_info *mi, int rix)
+-{
+-	int i = rix;
+-	for (i = rix; i >= 0; i--)
+-		if (mi->r[i].rix == rix)
+-			break;
+-	return i;
+-}
+-
+-/* return current EMWA throughput */
+-int minstrel_get_tp_avg(struct minstrel_rate *mr, int prob_avg)
+-{
+-	int usecs;
+-
+-	usecs = mr->perfect_tx_time;
+-	if (!usecs)
+-		usecs = 1000000;
+-
+-	/* reset thr. below 10% success */
+-	if (mr->stats.prob_avg < MINSTREL_FRAC(10, 100))
+-		return 0;
+-
+-	if (prob_avg > MINSTREL_FRAC(90, 100))
+-		return MINSTREL_TRUNC(100000 * (MINSTREL_FRAC(90, 100) / usecs));
+-	else
+-		return MINSTREL_TRUNC(100000 * (prob_avg / usecs));
+-}
+-
+-/* find & sort topmost throughput rates */
+-static inline void
+-minstrel_sort_best_tp_rates(struct minstrel_sta_info *mi, int i, u8 *tp_list)
+-{
+-	int j;
+-	struct minstrel_rate_stats *tmp_mrs;
+-	struct minstrel_rate_stats *cur_mrs = &mi->r[i].stats;
+-
+-	for (j = MAX_THR_RATES; j > 0; --j) {
+-		tmp_mrs = &mi->r[tp_list[j - 1]].stats;
+-		if (minstrel_get_tp_avg(&mi->r[i], cur_mrs->prob_avg) <=
+-		    minstrel_get_tp_avg(&mi->r[tp_list[j - 1]], tmp_mrs->prob_avg))
+-			break;
+-	}
+-
+-	if (j < MAX_THR_RATES - 1)
+-		memmove(&tp_list[j + 1], &tp_list[j], MAX_THR_RATES - (j + 1));
+-	if (j < MAX_THR_RATES)
+-		tp_list[j] = i;
+-}
+-
+-static void
+-minstrel_set_rate(struct minstrel_sta_info *mi, struct ieee80211_sta_rates *ratetbl,
+-		  int offset, int idx)
+-{
+-	struct minstrel_rate *r = &mi->r[idx];
+-
+-	ratetbl->rate[offset].idx = r->rix;
+-	ratetbl->rate[offset].count = r->adjusted_retry_count;
+-	ratetbl->rate[offset].count_cts = r->retry_count_cts;
+-	ratetbl->rate[offset].count_rts = r->stats.retry_count_rtscts;
+-}
+-
+-static void
+-minstrel_update_rates(struct minstrel_priv *mp, struct minstrel_sta_info *mi)
+-{
+-	struct ieee80211_sta_rates *ratetbl;
+-	int i = 0;
+-
+-	ratetbl = kzalloc(sizeof(*ratetbl), GFP_ATOMIC);
+-	if (!ratetbl)
+-		return;
+-
+-	/* Start with max_tp_rate */
+-	minstrel_set_rate(mi, ratetbl, i++, mi->max_tp_rate[0]);
+-
+-	if (mp->hw->max_rates >= 3) {
+-		/* At least 3 tx rates supported, use max_tp_rate2 next */
+-		minstrel_set_rate(mi, ratetbl, i++, mi->max_tp_rate[1]);
+-	}
+-
+-	if (mp->hw->max_rates >= 2) {
+-		/* At least 2 tx rates supported, use max_prob_rate next */
+-		minstrel_set_rate(mi, ratetbl, i++, mi->max_prob_rate);
+-	}
+-
+-	/* Use lowest rate last */
+-	ratetbl->rate[i].idx = mi->lowest_rix;
+-	ratetbl->rate[i].count = mp->max_retry;
+-	ratetbl->rate[i].count_cts = mp->max_retry;
+-	ratetbl->rate[i].count_rts = mp->max_retry;
+-
+-	rate_control_set_rates(mp->hw, mi->sta, ratetbl);
+-}
+-
+-/*
+-* Recalculate statistics and counters of a given rate
+-*/
+-void
+-minstrel_calc_rate_stats(struct minstrel_priv *mp,
+-			 struct minstrel_rate_stats *mrs)
+-{
+-	unsigned int cur_prob;
+-
+-	if (unlikely(mrs->attempts > 0)) {
+-		mrs->sample_skipped = 0;
+-		cur_prob = MINSTREL_FRAC(mrs->success, mrs->attempts);
+-		if (mp->new_avg) {
+-			minstrel_filter_avg_add(&mrs->prob_avg,
+-						&mrs->prob_avg_1, cur_prob);
+-		} else if (unlikely(!mrs->att_hist)) {
+-			mrs->prob_avg = cur_prob;
+-		} else {
+-			/*update exponential weighted moving avarage */
+-			mrs->prob_avg = minstrel_ewma(mrs->prob_avg,
+-						      cur_prob,
+-						      EWMA_LEVEL);
+-		}
+-		mrs->att_hist += mrs->attempts;
+-		mrs->succ_hist += mrs->success;
+-	} else {
+-		mrs->sample_skipped++;
+-	}
+-
+-	mrs->last_success = mrs->success;
+-	mrs->last_attempts = mrs->attempts;
+-	mrs->success = 0;
+-	mrs->attempts = 0;
+-}
+-
+-static void
+-minstrel_update_stats(struct minstrel_priv *mp, struct minstrel_sta_info *mi)
+-{
+-	u8 tmp_tp_rate[MAX_THR_RATES];
+-	u8 tmp_prob_rate = 0;
+-	int i, tmp_cur_tp, tmp_prob_tp;
+-
+-	for (i = 0; i < MAX_THR_RATES; i++)
+-	    tmp_tp_rate[i] = 0;
+-
+-	for (i = 0; i < mi->n_rates; i++) {
+-		struct minstrel_rate *mr = &mi->r[i];
+-		struct minstrel_rate_stats *mrs = &mi->r[i].stats;
+-		struct minstrel_rate_stats *tmp_mrs = &mi->r[tmp_prob_rate].stats;
+-
+-		/* Update statistics of success probability per rate */
+-		minstrel_calc_rate_stats(mp, mrs);
+-
+-		/* Sample less often below the 10% chance of success.
+-		 * Sample less often above the 95% chance of success. */
+-		if (mrs->prob_avg > MINSTREL_FRAC(95, 100) ||
+-		    mrs->prob_avg < MINSTREL_FRAC(10, 100)) {
+-			mr->adjusted_retry_count = mrs->retry_count >> 1;
+-			if (mr->adjusted_retry_count > 2)
+-				mr->adjusted_retry_count = 2;
+-			mr->sample_limit = 4;
+-		} else {
+-			mr->sample_limit = -1;
+-			mr->adjusted_retry_count = mrs->retry_count;
+-		}
+-		if (!mr->adjusted_retry_count)
+-			mr->adjusted_retry_count = 2;
+-
+-		minstrel_sort_best_tp_rates(mi, i, tmp_tp_rate);
+-
+-		/* To determine the most robust rate (max_prob_rate) used at
+-		 * 3rd mmr stage we distinct between two cases:
+-		 * (1) if any success probabilitiy >= 95%, out of those rates
+-		 * choose the maximum throughput rate as max_prob_rate
+-		 * (2) if all success probabilities < 95%, the rate with
+-		 * highest success probability is chosen as max_prob_rate */
+-		if (mrs->prob_avg >= MINSTREL_FRAC(95, 100)) {
+-			tmp_cur_tp = minstrel_get_tp_avg(mr, mrs->prob_avg);
+-			tmp_prob_tp = minstrel_get_tp_avg(&mi->r[tmp_prob_rate],
+-							  tmp_mrs->prob_avg);
+-			if (tmp_cur_tp >= tmp_prob_tp)
+-				tmp_prob_rate = i;
+-		} else {
+-			if (mrs->prob_avg >= tmp_mrs->prob_avg)
+-				tmp_prob_rate = i;
+-		}
+-	}
+-
+-	/* Assign the new rate set */
+-	memcpy(mi->max_tp_rate, tmp_tp_rate, sizeof(mi->max_tp_rate));
+-	mi->max_prob_rate = tmp_prob_rate;
+-
+-#ifdef CPTCFG_MAC80211_DEBUGFS
+-	/* use fixed index if set */
+-	if (mp->fixed_rate_idx != -1) {
+-		mi->max_tp_rate[0] = mp->fixed_rate_idx;
+-		mi->max_tp_rate[1] = mp->fixed_rate_idx;
+-		mi->max_prob_rate = mp->fixed_rate_idx;
+-	}
+-#endif
+-
+-	/* Reset update timer */
+-	mi->last_stats_update = jiffies;
+-
+-	minstrel_update_rates(mp, mi);
+-}
+-
+-static void
+-minstrel_tx_status(void *priv, struct ieee80211_supported_band *sband,
+-		   void *priv_sta, struct ieee80211_tx_status *st)
+-{
+-	struct ieee80211_tx_info *info = st->info;
+-	struct minstrel_priv *mp = priv;
+-	struct minstrel_sta_info *mi = priv_sta;
+-	struct ieee80211_tx_rate *ar = info->status.rates;
+-	int i, ndx;
+-	int success;
+-
+-	success = !!(info->flags & IEEE80211_TX_STAT_ACK);
+-
+-	for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
+-		if (ar[i].idx < 0 || !ar[i].count)
+-			break;
+-
+-		ndx = rix_to_ndx(mi, ar[i].idx);
+-		if (ndx < 0)
+-			continue;
+-
+-		mi->r[ndx].stats.attempts += ar[i].count;
+-
+-		if ((i != IEEE80211_TX_MAX_RATES - 1) && (ar[i + 1].idx < 0))
+-			mi->r[ndx].stats.success += success;
+-	}
+-
+-	if (time_after(jiffies, mi->last_stats_update +
+-				mp->update_interval / (mp->new_avg ? 2 : 1)))
+-		minstrel_update_stats(mp, mi);
+-}
+-
+-
+-static inline unsigned int
+-minstrel_get_retry_count(struct minstrel_rate *mr,
+-			 struct ieee80211_tx_info *info)
+-{
+-	u8 retry = mr->adjusted_retry_count;
+-
+-	if (info->control.use_rts)
+-		retry = max_t(u8, 2, min(mr->stats.retry_count_rtscts, retry));
+-	else if (info->control.use_cts_prot)
+-		retry = max_t(u8, 2, min(mr->retry_count_cts, retry));
+-	return retry;
+-}
+-
+-
+-static int
+-minstrel_get_next_sample(struct minstrel_sta_info *mi)
+-{
+-	unsigned int sample_ndx;
+-	sample_ndx = SAMPLE_TBL(mi, mi->sample_row, mi->sample_column);
+-	mi->sample_row++;
+-	if ((int) mi->sample_row >= mi->n_rates) {
+-		mi->sample_row = 0;
+-		mi->sample_column++;
+-		if (mi->sample_column >= SAMPLE_COLUMNS)
+-			mi->sample_column = 0;
+-	}
+-	return sample_ndx;
+-}
+-
+-static void
+-minstrel_get_rate(void *priv, struct ieee80211_sta *sta,
+-		  void *priv_sta, struct ieee80211_tx_rate_control *txrc)
+-{
+-	struct sk_buff *skb = txrc->skb;
+-	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
+-	struct minstrel_sta_info *mi = priv_sta;
+-	struct minstrel_priv *mp = priv;
+-	struct ieee80211_tx_rate *rate = &info->control.rates[0];
+-	struct minstrel_rate *msr, *mr;
+-	unsigned int ndx;
+-	bool mrr_capable;
+-	bool prev_sample;
+-	int delta;
+-	int sampling_ratio;
+-
+-	/* check multi-rate-retry capabilities & adjust lookaround_rate */
+-	mrr_capable = mp->has_mrr &&
+-		      !txrc->rts &&
+-		      !txrc->bss_conf->use_cts_prot;
+-	if (mrr_capable)
+-		sampling_ratio = mp->lookaround_rate_mrr;
+-	else
+-		sampling_ratio = mp->lookaround_rate;
+-
+-	/* increase sum packet counter */
+-	mi->total_packets++;
+-
+-#ifdef CPTCFG_MAC80211_DEBUGFS
+-	if (mp->fixed_rate_idx != -1)
+-		return;
+-#endif
+-
+-	/* Don't use EAPOL frames for sampling on non-mrr hw */
+-	if (mp->hw->max_rates == 1 &&
+-	    (info->control.flags & IEEE80211_TX_CTRL_PORT_CTRL_PROTO))
+-		return;
+-
+-	delta = (mi->total_packets * sampling_ratio / 100) -
+-			mi->sample_packets;
+-
+-	/* delta < 0: no sampling required */
+-	prev_sample = mi->prev_sample;
+-	mi->prev_sample = false;
+-	if (delta < 0 || (!mrr_capable && prev_sample))
+-		return;
+-
+-	if (mi->total_packets >= 10000) {
+-		mi->sample_packets = 0;
+-		mi->total_packets = 0;
+-	} else if (delta > mi->n_rates * 2) {
+-		/* With multi-rate retry, not every planned sample
+-		 * attempt actually gets used, due to the way the retry
+-		 * chain is set up - [max_tp,sample,prob,lowest] for
+-		 * sample_rate < max_tp.
+-		 *
+-		 * If there's too much sampling backlog and the link
+-		 * starts getting worse, minstrel would start bursting
+-		 * out lots of sampling frames, which would result
+-		 * in a large throughput loss. */
+-		mi->sample_packets += (delta - mi->n_rates * 2);
+-	}
+-
+-	/* get next random rate sample */
+-	ndx = minstrel_get_next_sample(mi);
+-	msr = &mi->r[ndx];
+-	mr = &mi->r[mi->max_tp_rate[0]];
+-
+-	/* Decide if direct ( 1st mrr stage) or indirect (2nd mrr stage)
+-	 * rate sampling method should be used.
+-	 * Respect such rates that are not sampled for 20 interations.
+-	 */
+-	if (msr->perfect_tx_time < mr->perfect_tx_time ||
+-	    msr->stats.sample_skipped >= 20) {
+-		if (!msr->sample_limit)
+-			return;
+-
+-		mi->sample_packets++;
+-		if (msr->sample_limit > 0)
+-			msr->sample_limit--;
+-	}
+-
+-	/* If we're not using MRR and the sampling rate already
+-	 * has a probability of >95%, we shouldn't be attempting
+-	 * to use it, as this only wastes precious airtime */
+-	if (!mrr_capable &&
+-	   (mi->r[ndx].stats.prob_avg > MINSTREL_FRAC(95, 100)))
+-		return;
+-
+-	mi->prev_sample = true;
+-
+-	rate->idx = mi->r[ndx].rix;
+-	rate->count = minstrel_get_retry_count(&mi->r[ndx], info);
+-	info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE;
+-}
+-
+-
+-static void
+-calc_rate_durations(enum nl80211_band band,
+-		    struct minstrel_rate *d,
+-		    struct ieee80211_rate *rate,
+-		    struct cfg80211_chan_def *chandef)
+-{
+-	int erp = !!(rate->flags & IEEE80211_RATE_ERP_G);
+-	int shift = ieee80211_chandef_get_shift(chandef);
+-
+-	d->perfect_tx_time = ieee80211_frame_duration(band, 1200,
+-			DIV_ROUND_UP(rate->bitrate, 1 << shift), erp, 1,
+-			shift);
+-	d->ack_time = ieee80211_frame_duration(band, 10,
+-			DIV_ROUND_UP(rate->bitrate, 1 << shift), erp, 1,
+-			shift);
+-}
+-
+-static void
+-init_sample_table(struct minstrel_sta_info *mi)
+-{
+-	unsigned int i, col, new_idx;
+-	u8 rnd[8];
+-
+-	mi->sample_column = 0;
+-	mi->sample_row = 0;
+-	memset(mi->sample_table, 0xff, SAMPLE_COLUMNS * mi->n_rates);
+-
+-	for (col = 0; col < SAMPLE_COLUMNS; col++) {
+-		prandom_bytes(rnd, sizeof(rnd));
+-		for (i = 0; i < mi->n_rates; i++) {
+-			new_idx = (i + rnd[i & 7]) % mi->n_rates;
+-			while (SAMPLE_TBL(mi, new_idx, col) != 0xff)
+-				new_idx = (new_idx + 1) % mi->n_rates;
+-
+-			SAMPLE_TBL(mi, new_idx, col) = i;
+-		}
+-	}
+-}
+-
+-static void
+-minstrel_rate_init(void *priv, struct ieee80211_supported_band *sband,
+-		   struct cfg80211_chan_def *chandef,
+-		   struct ieee80211_sta *sta, void *priv_sta)
+-{
+-	struct minstrel_sta_info *mi = priv_sta;
+-	struct minstrel_priv *mp = priv;
+-	struct ieee80211_rate *ctl_rate;
+-	unsigned int i, n = 0;
+-	unsigned int t_slot = 9; /* FIXME: get real slot time */
+-	u32 rate_flags;
+-
+-	mi->sta = sta;
+-	mi->lowest_rix = rate_lowest_index(sband, sta);
+-	ctl_rate = &sband->bitrates[mi->lowest_rix];
+-	mi->sp_ack_dur = ieee80211_frame_duration(sband->band, 10,
+-				ctl_rate->bitrate,
+-				!!(ctl_rate->flags & IEEE80211_RATE_ERP_G), 1,
+-				ieee80211_chandef_get_shift(chandef));
+-
+-	rate_flags = ieee80211_chandef_rate_flags(&mp->hw->conf.chandef);
+-	memset(mi->max_tp_rate, 0, sizeof(mi->max_tp_rate));
+-	mi->max_prob_rate = 0;
+-
+-	for (i = 0; i < sband->n_bitrates; i++) {
+-		struct minstrel_rate *mr = &mi->r[n];
+-		struct minstrel_rate_stats *mrs = &mi->r[n].stats;
+-		unsigned int tx_time = 0, tx_time_cts = 0, tx_time_rtscts = 0;
+-		unsigned int tx_time_single;
+-		unsigned int cw = mp->cw_min;
+-		int shift;
+-
+-		if (!rate_supported(sta, sband->band, i))
+-			continue;
+-		if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
+-			continue;
+-
+-		n++;
+-		memset(mr, 0, sizeof(*mr));
+-		memset(mrs, 0, sizeof(*mrs));
+-
+-		mr->rix = i;
+-		shift = ieee80211_chandef_get_shift(chandef);
+-		mr->bitrate = DIV_ROUND_UP(sband->bitrates[i].bitrate,
+-					   (1 << shift) * 5);
+-		calc_rate_durations(sband->band, mr, &sband->bitrates[i],
+-				    chandef);
+-
+-		/* calculate maximum number of retransmissions before
+-		 * fallback (based on maximum segment size) */
+-		mr->sample_limit = -1;
+-		mrs->retry_count = 1;
+-		mr->retry_count_cts = 1;
+-		mrs->retry_count_rtscts = 1;
+-		tx_time = mr->perfect_tx_time + mi->sp_ack_dur;
+-		do {
+-			/* add one retransmission */
+-			tx_time_single = mr->ack_time + mr->perfect_tx_time;
+-
+-			/* contention window */
+-			tx_time_single += (t_slot * cw) >> 1;
+-			cw = min((cw << 1) | 1, mp->cw_max);
+-
+-			tx_time += tx_time_single;
+-			tx_time_cts += tx_time_single + mi->sp_ack_dur;
+-			tx_time_rtscts += tx_time_single + 2 * mi->sp_ack_dur;
+-			if ((tx_time_cts < mp->segment_size) &&
+-				(mr->retry_count_cts < mp->max_retry))
+-				mr->retry_count_cts++;
+-			if ((tx_time_rtscts < mp->segment_size) &&
+-				(mrs->retry_count_rtscts < mp->max_retry))
+-				mrs->retry_count_rtscts++;
+-		} while ((tx_time < mp->segment_size) &&
+-				(++mr->stats.retry_count < mp->max_retry));
+-		mr->adjusted_retry_count = mrs->retry_count;
+-		if (!(sband->bitrates[i].flags & IEEE80211_RATE_ERP_G))
+-			mr->retry_count_cts = mrs->retry_count;
+-	}
+-
+-	for (i = n; i < sband->n_bitrates; i++) {
+-		struct minstrel_rate *mr = &mi->r[i];
+-		mr->rix = -1;
+-	}
+-
+-	mi->n_rates = n;
+-	mi->last_stats_update = jiffies;
+-
+-	init_sample_table(mi);
+-	minstrel_update_rates(mp, mi);
+-}
+-
+-static u32 minstrel_get_expected_throughput(void *priv_sta)
+-{
+-	struct minstrel_sta_info *mi = priv_sta;
+-	struct minstrel_rate_stats *tmp_mrs;
+-	int idx = mi->max_tp_rate[0];
+-	int tmp_cur_tp;
+-
+-	/* convert pkt per sec in kbps (1200 is the average pkt size used for
+-	 * computing cur_tp
+-	 */
+-	tmp_mrs = &mi->r[idx].stats;
+-	tmp_cur_tp = minstrel_get_tp_avg(&mi->r[idx], tmp_mrs->prob_avg) * 10;
+-	tmp_cur_tp = tmp_cur_tp * 1200 * 8 / 1024;
+-
+-	return tmp_cur_tp;
+-}
+-
+-const struct rate_control_ops mac80211_minstrel = {
+-	.tx_status_ext = minstrel_tx_status,
+-	.get_rate = minstrel_get_rate,
+-	.rate_init = minstrel_rate_init,
+-	.get_expected_throughput = minstrel_get_expected_throughput,
+-};
+--- a/net/mac80211/rc80211_minstrel.h
++++ /dev/null
+@@ -1,185 +0,0 @@
+-/* SPDX-License-Identifier: GPL-2.0-only */
+-/*
+- * Copyright (C) 2008 Felix Fietkau <nbd@openwrt.org>
+- */
+-
+-#ifndef __RC_MINSTREL_H
+-#define __RC_MINSTREL_H
+-
+-#define EWMA_LEVEL	96	/* ewma weighting factor [/EWMA_DIV] */
+-#define EWMA_DIV	128
+-#define SAMPLE_COLUMNS	10	/* number of columns in sample table */
+-
+-/* scaled fraction values */
+-#define MINSTREL_SCALE  12
+-#define MINSTREL_FRAC(val, div) (((val) << MINSTREL_SCALE) / div)
+-#define MINSTREL_TRUNC(val) ((val) >> MINSTREL_SCALE)
+-
+-/* number of highest throughput rates to consider*/
+-#define MAX_THR_RATES 4
+-
+-/*
+- * Coefficients for moving average with noise filter (period=16),
+- * scaled by 10 bits
+- *
+- * a1 = exp(-pi * sqrt(2) / period)
+- * coeff2 = 2 * a1 * cos(sqrt(2) * 2 * pi / period)
+- * coeff3 = -sqr(a1)
+- * coeff1 = 1 - coeff2 - coeff3
+- */
+-#define MINSTREL_AVG_COEFF1		(MINSTREL_FRAC(1, 1) - \
+-					 MINSTREL_AVG_COEFF2 - \
+-					 MINSTREL_AVG_COEFF3)
+-#define MINSTREL_AVG_COEFF2		0x00001499
+-#define MINSTREL_AVG_COEFF3		-0x0000092e
+-
+-/*
+- * Perform EWMA (Exponentially Weighted Moving Average) calculation
+- */
+-static inline int
+-minstrel_ewma(int old, int new, int weight)
+-{
+-	int diff, incr;
+-
+-	diff = new - old;
+-	incr = (EWMA_DIV - weight) * diff / EWMA_DIV;
+-
+-	return old + incr;
+-}
+-
+-static inline int minstrel_filter_avg_add(u16 *prev_1, u16 *prev_2, s32 in)
+-{
+-	s32 out_1 = *prev_1;
+-	s32 out_2 = *prev_2;
+-	s32 val;
+-
+-	if (!in)
+-		in += 1;
+-
+-	if (!out_1) {
+-		val = out_1 = in;
+-		goto out;
+-	}
+-
+-	val = MINSTREL_AVG_COEFF1 * in;
+-	val += MINSTREL_AVG_COEFF2 * out_1;
+-	val += MINSTREL_AVG_COEFF3 * out_2;
+-	val >>= MINSTREL_SCALE;
+-
+-	if (val > 1 << MINSTREL_SCALE)
+-		val = 1 << MINSTREL_SCALE;
+-	if (val < 0)
+-		val = 1;
+-
+-out:
+-	*prev_2 = out_1;
+-	*prev_1 = val;
+-
+-	return val;
+-}
+-
+-struct minstrel_rate_stats {
+-	/* current / last sampling period attempts/success counters */
+-	u16 attempts, last_attempts;
+-	u16 success, last_success;
+-
+-	/* total attempts/success counters */
+-	u32 att_hist, succ_hist;
+-
+-	/* prob_avg - moving average of prob */
+-	u16 prob_avg;
+-	u16 prob_avg_1;
+-
+-	/* maximum retry counts */
+-	u8 retry_count;
+-	u8 retry_count_rtscts;
+-
+-	u8 sample_skipped;
+-	bool retry_updated;
+-};
+-
+-struct minstrel_rate {
+-	int bitrate;
+-
+-	s8 rix;
+-	u8 retry_count_cts;
+-	u8 adjusted_retry_count;
+-
+-	unsigned int perfect_tx_time;
+-	unsigned int ack_time;
+-
+-	int sample_limit;
+-
+-	struct minstrel_rate_stats stats;
+-};
+-
+-struct minstrel_sta_info {
+-	struct ieee80211_sta *sta;
+-
+-	unsigned long last_stats_update;
+-	unsigned int sp_ack_dur;
+-	unsigned int rate_avg;
+-
+-	unsigned int lowest_rix;
+-
+-	u8 max_tp_rate[MAX_THR_RATES];
+-	u8 max_prob_rate;
+-	unsigned int total_packets;
+-	unsigned int sample_packets;
+-
+-	unsigned int sample_row;
+-	unsigned int sample_column;
+-
+-	int n_rates;
+-	struct minstrel_rate *r;
+-	bool prev_sample;
+-
+-	/* sampling table */
+-	u8 *sample_table;
+-};
+-
+-struct minstrel_priv {
+-	struct ieee80211_hw *hw;
+-	bool has_mrr;
+-	bool new_avg;
+-	u32 sample_switch;
+-	unsigned int cw_min;
+-	unsigned int cw_max;
+-	unsigned int max_retry;
+-	unsigned int segment_size;
+-	unsigned int update_interval;
+-	unsigned int lookaround_rate;
+-	unsigned int lookaround_rate_mrr;
+-
+-	u8 cck_rates[4];
+-	u8 ofdm_rates[NUM_NL80211_BANDS][8];
+-
+-#ifdef CPTCFG_MAC80211_DEBUGFS
+-	/*
+-	 * enable fixed rate processing per RC
+-	 *   - write static index to debugfs:ieee80211/phyX/rc/fixed_rate_idx
+-	 *   - write -1 to enable RC processing again
+-	 *   - setting will be applied on next update
+-	 */
+-	u32 fixed_rate_idx;
+-#endif
+-};
+-
+-struct minstrel_debugfs_info {
+-	size_t len;
+-	char buf[];
+-};
+-
+-extern const struct rate_control_ops mac80211_minstrel;
+-void minstrel_add_sta_debugfs(void *priv, void *priv_sta, struct dentry *dir);
+-
+-/* Recalculate success probabilities and counters for a given rate using EWMA */
+-void minstrel_calc_rate_stats(struct minstrel_priv *mp,
+-			      struct minstrel_rate_stats *mrs);
+-int minstrel_get_tp_avg(struct minstrel_rate *mr, int prob_avg);
+-
+-/* debugfs */
+-int minstrel_stats_open(struct inode *inode, struct file *file);
+-int minstrel_stats_csv_open(struct inode *inode, struct file *file);
+-
+-#endif
+--- a/net/mac80211/rc80211_minstrel_debugfs.c
++++ /dev/null
+@@ -1,172 +0,0 @@
+-/*
+- * Copyright (C) 2008 Felix Fietkau <nbd@openwrt.org>
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License version 2 as
+- * published by the Free Software Foundation.
+- *
+- * Based on minstrel.c:
+- *   Copyright (C) 2005-2007 Derek Smithies <derek@indranet.co.nz>
+- *   Sponsored by Indranet Technologies Ltd
+- *
+- * Based on sample.c:
+- *   Copyright (c) 2005 John Bicket
+- *   All rights reserved.
+- *
+- *   Redistribution and use in source and binary forms, with or without
+- *   modification, are permitted provided that the following conditions
+- *   are met:
+- *   1. Redistributions of source code must retain the above copyright
+- *      notice, this list of conditions and the following disclaimer,
+- *      without modification.
+- *   2. Redistributions in binary form must reproduce at minimum a disclaimer
+- *      similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+- *      redistribution must be conditioned upon including a substantially
+- *      similar Disclaimer requirement for further binary redistribution.
+- *   3. Neither the names of the above-listed copyright holders nor the names
+- *      of any contributors may be used to endorse or promote products derived
+- *      from this software without specific prior written permission.
+- *
+- *   Alternatively, this software may be distributed under the terms of the
+- *   GNU General Public License ("GPL") version 2 as published by the Free
+- *   Software Foundation.
+- *
+- *   NO WARRANTY
+- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+- *   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+- *   LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+- *   AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+- *   THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+- *   OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+- *   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+- *   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+- *   IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+- *   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+- *   THE POSSIBILITY OF SUCH DAMAGES.
+- */
+-#include <linux/netdevice.h>
+-#include <linux/types.h>
+-#include <linux/skbuff.h>
+-#include <linux/debugfs.h>
+-#include <linux/ieee80211.h>
+-#include <linux/slab.h>
+-#include <linux/export.h>
+-#include <net/mac80211.h>
+-#include "rc80211_minstrel.h"
+-
+-int
+-minstrel_stats_open(struct inode *inode, struct file *file)
+-{
+-	struct minstrel_sta_info *mi = inode->i_private;
+-	struct minstrel_debugfs_info *ms;
+-	unsigned int i, tp_max, tp_avg, eprob;
+-	char *p;
+-
+-	ms = kmalloc(2048, GFP_KERNEL);
+-	if (!ms)
+-		return -ENOMEM;
+-
+-	file->private_data = ms;
+-	p = ms->buf;
+-	p += sprintf(p, "\n");
+-	p += sprintf(p,
+-		     "best   __________rate_________    ____statistics___    ____last_____    ______sum-of________\n");
+-	p += sprintf(p,
+-		     "rate  [name idx airtime max_tp]  [avg(tp) avg(prob)]  [retry|suc|att]  [#success | #attempts]\n");
+-
+-	for (i = 0; i < mi->n_rates; i++) {
+-		struct minstrel_rate *mr = &mi->r[i];
+-		struct minstrel_rate_stats *mrs = &mi->r[i].stats;
+-
+-		*(p++) = (i == mi->max_tp_rate[0]) ? 'A' : ' ';
+-		*(p++) = (i == mi->max_tp_rate[1]) ? 'B' : ' ';
+-		*(p++) = (i == mi->max_tp_rate[2]) ? 'C' : ' ';
+-		*(p++) = (i == mi->max_tp_rate[3]) ? 'D' : ' ';
+-		*(p++) = (i == mi->max_prob_rate) ? 'P' : ' ';
+-
+-		p += sprintf(p, " %3u%s ", mr->bitrate / 2,
+-				(mr->bitrate & 1 ? ".5" : "  "));
+-		p += sprintf(p, "%3u  ", i);
+-		p += sprintf(p, "%6u ", mr->perfect_tx_time);
+-
+-		tp_max = minstrel_get_tp_avg(mr, MINSTREL_FRAC(100,100));
+-		tp_avg = minstrel_get_tp_avg(mr, mrs->prob_avg);
+-		eprob = MINSTREL_TRUNC(mrs->prob_avg * 1000);
+-
+-		p += sprintf(p, "%4u.%1u    %4u.%1u     %3u.%1u"
+-				"     %3u   %3u %-3u   "
+-				"%9llu   %-9llu\n",
+-				tp_max / 10, tp_max % 10,
+-				tp_avg / 10, tp_avg % 10,
+-				eprob / 10, eprob % 10,
+-				mrs->retry_count,
+-				mrs->last_success,
+-				mrs->last_attempts,
+-				(unsigned long long)mrs->succ_hist,
+-				(unsigned long long)mrs->att_hist);
+-	}
+-	p += sprintf(p, "\nTotal packet count::    ideal %d      "
+-			"lookaround %d\n\n",
+-			mi->total_packets - mi->sample_packets,
+-			mi->sample_packets);
+-	ms->len = p - ms->buf;
+-
+-	WARN_ON(ms->len + sizeof(*ms) > 2048);
+-
+-	return 0;
+-}
+-
+-int
+-minstrel_stats_csv_open(struct inode *inode, struct file *file)
+-{
+-	struct minstrel_sta_info *mi = inode->i_private;
+-	struct minstrel_debugfs_info *ms;
+-	unsigned int i, tp_max, tp_avg, eprob;
+-	char *p;
+-
+-	ms = kmalloc(2048, GFP_KERNEL);
+-	if (!ms)
+-		return -ENOMEM;
+-
+-	file->private_data = ms;
+-	p = ms->buf;
+-
+-	for (i = 0; i < mi->n_rates; i++) {
+-		struct minstrel_rate *mr = &mi->r[i];
+-		struct minstrel_rate_stats *mrs = &mi->r[i].stats;
+-
+-		p += sprintf(p, "%s" ,((i == mi->max_tp_rate[0]) ? "A" : ""));
+-		p += sprintf(p, "%s" ,((i == mi->max_tp_rate[1]) ? "B" : ""));
+-		p += sprintf(p, "%s" ,((i == mi->max_tp_rate[2]) ? "C" : ""));
+-		p += sprintf(p, "%s" ,((i == mi->max_tp_rate[3]) ? "D" : ""));
+-		p += sprintf(p, "%s" ,((i == mi->max_prob_rate) ? "P" : ""));
+-
+-		p += sprintf(p, ",%u%s", mr->bitrate / 2,
+-				(mr->bitrate & 1 ? ".5," : ","));
+-		p += sprintf(p, "%u,", i);
+-		p += sprintf(p, "%u,",mr->perfect_tx_time);
+-
+-		tp_max = minstrel_get_tp_avg(mr, MINSTREL_FRAC(100,100));
+-		tp_avg = minstrel_get_tp_avg(mr, mrs->prob_avg);
+-		eprob = MINSTREL_TRUNC(mrs->prob_avg * 1000);
+-
+-		p += sprintf(p, "%u.%u,%u.%u,%u.%u,%u,%u,%u,"
+-				"%llu,%llu,%d,%d\n",
+-				tp_max / 10, tp_max % 10,
+-				tp_avg / 10, tp_avg % 10,
+-				eprob / 10, eprob % 10,
+-				mrs->retry_count,
+-				mrs->last_success,
+-				mrs->last_attempts,
+-				(unsigned long long)mrs->succ_hist,
+-				(unsigned long long)mrs->att_hist,
+-				mi->total_packets - mi->sample_packets,
+-				mi->sample_packets);
+-
+-	}
+-	ms->len = p - ms->buf;
+-
+-	WARN_ON(ms->len + sizeof(*ms) > 2048);
+-
+-	return 0;
+-}
+--- a/net/mac80211/rc80211_minstrel_ht.c
++++ b/net/mac80211/rc80211_minstrel_ht.c
+@@ -13,7 +13,6 @@
+ #include <net/mac80211.h>
+ #include "rate.h"
+ #include "sta_info.h"
+-#include "rc80211_minstrel.h"
+ #include "rc80211_minstrel_ht.h"
+ 
+ #define AVG_AMPDU_SIZE	16
+@@ -716,6 +715,83 @@ out:
+ 	mi->sample_mode = MINSTREL_SAMPLE_ACTIVE;
+ }
+ 
++static inline int
++minstrel_ewma(int old, int new, int weight)
++{
++	int diff, incr;
++
++	diff = new - old;
++	incr = (EWMA_DIV - weight) * diff / EWMA_DIV;
++
++	return old + incr;
++}
++
++static inline int minstrel_filter_avg_add(u16 *prev_1, u16 *prev_2, s32 in)
++{
++	s32 out_1 = *prev_1;
++	s32 out_2 = *prev_2;
++	s32 val;
++
++	if (!in)
++		in += 1;
++
++	if (!out_1) {
++		val = out_1 = in;
++		goto out;
++	}
++
++	val = MINSTREL_AVG_COEFF1 * in;
++	val += MINSTREL_AVG_COEFF2 * out_1;
++	val += MINSTREL_AVG_COEFF3 * out_2;
++	val >>= MINSTREL_SCALE;
++
++	if (val > 1 << MINSTREL_SCALE)
++		val = 1 << MINSTREL_SCALE;
++	if (val < 0)
++		val = 1;
++
++out:
++	*prev_2 = out_1;
++	*prev_1 = val;
++
++	return val;
++}
++
++/*
++* Recalculate statistics and counters of a given rate
++*/
++static void
++minstrel_ht_calc_rate_stats(struct minstrel_priv *mp,
++			    struct minstrel_rate_stats *mrs)
++{
++	unsigned int cur_prob;
++
++	if (unlikely(mrs->attempts > 0)) {
++		mrs->sample_skipped = 0;
++		cur_prob = MINSTREL_FRAC(mrs->success, mrs->attempts);
++		if (mp->new_avg) {
++			minstrel_filter_avg_add(&mrs->prob_avg,
++						&mrs->prob_avg_1, cur_prob);
++		} else if (unlikely(!mrs->att_hist)) {
++			mrs->prob_avg = cur_prob;
++		} else {
++			/*update exponential weighted moving avarage */
++			mrs->prob_avg = minstrel_ewma(mrs->prob_avg,
++						      cur_prob,
++						      EWMA_LEVEL);
++		}
++		mrs->att_hist += mrs->attempts;
++		mrs->succ_hist += mrs->success;
++	} else {
++		mrs->sample_skipped++;
++	}
++
++	mrs->last_success = mrs->success;
++	mrs->last_attempts = mrs->attempts;
++	mrs->success = 0;
++	mrs->attempts = 0;
++}
++
+ /*
+  * Update rate statistics and select new primary rates
+  *
+@@ -808,7 +884,7 @@ minstrel_ht_update_stats(struct minstrel
+ 
+ 			mrs = &mg->rates[i];
+ 			mrs->retry_updated = false;
+-			minstrel_calc_rate_stats(mp, mrs);
++			minstrel_ht_calc_rate_stats(mp, mrs);
+ 			cur_prob = mrs->prob_avg;
+ 
+ 			if (minstrel_ht_get_tp_avg(mi, group, i, cur_prob) == 0)
+@@ -960,8 +1036,7 @@ minstrel_ht_tx_status(void *priv, struct
+                       void *priv_sta, struct ieee80211_tx_status *st)
+ {
+ 	struct ieee80211_tx_info *info = st->info;
+-	struct minstrel_ht_sta_priv *msp = priv_sta;
+-	struct minstrel_ht_sta *mi = &msp->ht;
++	struct minstrel_ht_sta *mi = priv_sta;
+ 	struct ieee80211_tx_rate *ar = info->status.rates;
+ 	struct minstrel_rate_stats *rate, *rate2, *rate_sample = NULL;
+ 	struct minstrel_priv *mp = priv;
+@@ -1372,8 +1447,7 @@ minstrel_ht_get_rate(void *priv, struct
+ 	const struct mcs_group *sample_group;
+ 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(txrc->skb);
+ 	struct ieee80211_tx_rate *rate = &info->status.rates[0];
+-	struct minstrel_ht_sta_priv *msp = priv_sta;
+-	struct minstrel_ht_sta *mi = &msp->ht;
++	struct minstrel_ht_sta *mi = priv_sta;
+ 	struct minstrel_priv *mp = priv;
+ 	int sample_idx;
+ 
+@@ -1484,8 +1558,7 @@ minstrel_ht_update_caps(void *priv, stru
+ 			struct ieee80211_sta *sta, void *priv_sta)
+ {
+ 	struct minstrel_priv *mp = priv;
+-	struct minstrel_ht_sta_priv *msp = priv_sta;
+-	struct minstrel_ht_sta *mi = &msp->ht;
++	struct minstrel_ht_sta *mi = priv_sta;
+ 	struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs;
+ 	u16 ht_cap = sta->ht_cap.cap;
+ 	struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
+@@ -1647,7 +1720,7 @@ static void *
+ minstrel_ht_alloc_sta(void *priv, struct ieee80211_sta *sta, gfp_t gfp)
+ {
+ 	struct ieee80211_supported_band *sband;
+-	struct minstrel_ht_sta_priv *msp;
++	struct minstrel_ht_sta *mi;
+ 	struct minstrel_priv *mp = priv;
+ 	struct ieee80211_hw *hw = mp->hw;
+ 	int max_rates = 0;
+@@ -1659,35 +1732,13 @@ minstrel_ht_alloc_sta(void *priv, struct
+ 			max_rates = sband->n_bitrates;
+ 	}
+ 
+-	msp = kzalloc(sizeof(*msp), gfp);
+-	if (!msp)
+-		return NULL;
+-
+-	msp->ratelist = kcalloc(max_rates, sizeof(struct minstrel_rate), gfp);
+-	if (!msp->ratelist)
+-		goto error;
+-
+-	msp->sample_table = kmalloc_array(max_rates, SAMPLE_COLUMNS, gfp);
+-	if (!msp->sample_table)
+-		goto error1;
+-
+-	return msp;
+-
+-error1:
+-	kfree(msp->ratelist);
+-error:
+-	kfree(msp);
+-	return NULL;
++	return kzalloc(sizeof(*mi), gfp);
+ }
+ 
+ static void
+ minstrel_ht_free_sta(void *priv, struct ieee80211_sta *sta, void *priv_sta)
+ {
+-	struct minstrel_ht_sta_priv *msp = priv_sta;
+-
+-	kfree(msp->sample_table);
+-	kfree(msp->ratelist);
+-	kfree(msp);
++	kfree(priv_sta);
+ }
+ 
+ static void
+@@ -1768,12 +1819,6 @@ minstrel_ht_alloc(struct ieee80211_hw *h
+ 	mp->cw_min = 15;
+ 	mp->cw_max = 1023;
+ 
+-	/* number of packets (in %) to use for sampling other rates
+-	 * sample less often for non-mrr packets, because the overhead
+-	 * is much higher than with mrr */
+-	mp->lookaround_rate = 5;
+-	mp->lookaround_rate_mrr = 10;
+-
+ 	/* maximum time that the hw is allowed to stay in one MRR segment */
+ 	mp->segment_size = 6000;
+ 
+@@ -1821,8 +1866,7 @@ minstrel_ht_free(void *priv)
+ 
+ static u32 minstrel_ht_get_expected_throughput(void *priv_sta)
+ {
+-	struct minstrel_ht_sta_priv *msp = priv_sta;
+-	struct minstrel_ht_sta *mi = &msp->ht;
++	struct minstrel_ht_sta *mi = priv_sta;
+ 	int i, j, prob, tp_avg;
+ 
+ 	i = mi->max_tp_rate[0] / MCS_GROUP_RATES;
+--- a/net/mac80211/rc80211_minstrel_ht.h
++++ b/net/mac80211/rc80211_minstrel_ht.h
+@@ -6,6 +6,33 @@
+ #ifndef __RC_MINSTREL_HT_H
+ #define __RC_MINSTREL_HT_H
+ 
++/* number of highest throughput rates to consider*/
++#define MAX_THR_RATES 4
++#define SAMPLE_COLUMNS	10	/* number of columns in sample table */
++
++/* scaled fraction values */
++#define MINSTREL_SCALE  12
++#define MINSTREL_FRAC(val, div) (((val) << MINSTREL_SCALE) / div)
++#define MINSTREL_TRUNC(val) ((val) >> MINSTREL_SCALE)
++
++#define EWMA_LEVEL	96	/* ewma weighting factor [/EWMA_DIV] */
++#define EWMA_DIV	128
++
++/*
++ * Coefficients for moving average with noise filter (period=16),
++ * scaled by 10 bits
++ *
++ * a1 = exp(-pi * sqrt(2) / period)
++ * coeff2 = 2 * a1 * cos(sqrt(2) * 2 * pi / period)
++ * coeff3 = -sqr(a1)
++ * coeff1 = 1 - coeff2 - coeff3
++ */
++#define MINSTREL_AVG_COEFF1		(MINSTREL_FRAC(1, 1) - \
++					 MINSTREL_AVG_COEFF2 - \
++					 MINSTREL_AVG_COEFF3)
++#define MINSTREL_AVG_COEFF2		0x00001499
++#define MINSTREL_AVG_COEFF3		-0x0000092e
++
+ /*
+  * The number of streams can be changed to 2 to reduce code
+  * size and memory footprint.
+@@ -30,6 +57,32 @@
+ 
+ #define MCS_GROUP_RATES		10
+ 
++struct minstrel_priv {
++	struct ieee80211_hw *hw;
++	bool has_mrr;
++	bool new_avg;
++	u32 sample_switch;
++	unsigned int cw_min;
++	unsigned int cw_max;
++	unsigned int max_retry;
++	unsigned int segment_size;
++	unsigned int update_interval;
++
++	u8 cck_rates[4];
++	u8 ofdm_rates[NUM_NL80211_BANDS][8];
++
++#ifdef CPTCFG_MAC80211_DEBUGFS
++	/*
++	 * enable fixed rate processing per RC
++	 *   - write static index to debugfs:ieee80211/phyX/rc/fixed_rate_idx
++	 *   - write -1 to enable RC processing again
++	 *   - setting will be applied on next update
++	 */
++	u32 fixed_rate_idx;
++#endif
++};
++
++
+ struct mcs_group {
+ 	u16 flags;
+ 	u8 streams;
+@@ -42,6 +95,26 @@ extern const s16 minstrel_cck_bitrates[4
+ extern const s16 minstrel_ofdm_bitrates[8];
+ extern const struct mcs_group minstrel_mcs_groups[];
+ 
++struct minstrel_rate_stats {
++	/* current / last sampling period attempts/success counters */
++	u16 attempts, last_attempts;
++	u16 success, last_success;
++
++	/* total attempts/success counters */
++	u32 att_hist, succ_hist;
++
++	/* prob_avg - moving average of prob */
++	u16 prob_avg;
++	u16 prob_avg_1;
++
++	/* maximum retry counts */
++	u8 retry_count;
++	u8 retry_count_rtscts;
++
++	u8 sample_skipped;
++	bool retry_updated;
++};
++
+ struct minstrel_mcs_group_data {
+ 	u8 index;
+ 	u8 column;
+@@ -111,12 +184,6 @@ struct minstrel_ht_sta {
+ 	struct minstrel_mcs_group_data groups[MINSTREL_GROUPS_NB];
+ };
+ 
+-struct minstrel_ht_sta_priv {
+-	struct minstrel_ht_sta ht;
+-	void *ratelist;
+-	void *sample_table;
+-};
+-
+ void minstrel_ht_add_sta_debugfs(void *priv, void *priv_sta, struct dentry *dir);
+ int minstrel_ht_get_tp_avg(struct minstrel_ht_sta *mi, int group, int rate,
+ 			   int prob_avg);
+--- a/net/mac80211/rc80211_minstrel_ht_debugfs.c
++++ b/net/mac80211/rc80211_minstrel_ht_debugfs.c
+@@ -9,9 +9,13 @@
+ #include <linux/ieee80211.h>
+ #include <linux/export.h>
+ #include <net/mac80211.h>
+-#include "rc80211_minstrel.h"
+ #include "rc80211_minstrel_ht.h"
+ 
++struct minstrel_debugfs_info {
++	size_t len;
++	char buf[];
++};
++
+ static ssize_t
+ minstrel_stats_read(struct file *file, char __user *buf, size_t len, loff_t *ppos)
+ {
+@@ -127,8 +131,7 @@ minstrel_ht_stats_dump(struct minstrel_h
+ static int
+ minstrel_ht_stats_open(struct inode *inode, struct file *file)
+ {
+-	struct minstrel_ht_sta_priv *msp = inode->i_private;
+-	struct minstrel_ht_sta *mi = &msp->ht;
++	struct minstrel_ht_sta *mi = inode->i_private;
+ 	struct minstrel_debugfs_info *ms;
+ 	unsigned int i;
+ 	char *p;
+@@ -276,8 +279,7 @@ minstrel_ht_stats_csv_dump(struct minstr
+ static int
+ minstrel_ht_stats_csv_open(struct inode *inode, struct file *file)
+ {
+-	struct minstrel_ht_sta_priv *msp = inode->i_private;
+-	struct minstrel_ht_sta *mi = &msp->ht;
++	struct minstrel_ht_sta *mi = inode->i_private;
+ 	struct minstrel_debugfs_info *ms;
+ 	unsigned int i;
+ 	char *p;
+@@ -313,10 +315,8 @@ static const struct file_operations mins
+ void
+ minstrel_ht_add_sta_debugfs(void *priv, void *priv_sta, struct dentry *dir)
+ {
+-	struct minstrel_ht_sta_priv *msp = priv_sta;
+-
+-	debugfs_create_file("rc_stats", 0444, dir, msp,
++	debugfs_create_file("rc_stats", 0444, dir, priv_sta,
+ 			    &minstrel_ht_stat_fops);
+-	debugfs_create_file("rc_stats_csv", 0444, dir, msp,
++	debugfs_create_file("rc_stats_csv", 0444, dir, priv_sta,
+ 			    &minstrel_ht_stat_csv_fops);
+ }
