Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 313eb87f authored by Sven Eckelmann's avatar Sven Eckelmann Committed by John W. Linville
Browse files

ath9k: raise aggregation limit to 64k for HT IBSS



mac80211 adds stations in HT IBSS as soon as a frame comes by,
even if the HT capabilities are not known yet (they are often
received later, e.g. in beacons). So far, ampdu factor/density
are only calculated when the station is initially added.

This patch changes this to update ampdu factor/density settings
when starting a blockack session.

Using this patch, we had performance boosts from 60 to 150 MBit/s
between two 2x2 Atheros devices in 5 GHz HT IBSS mode.

Signed-off-by: default avatarSven Eckelmann <sven@narfation.org>
Signed-off-by: default avatarSimon Wunderlich <siwu@hrz.tu-chemnitz.de>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 46e5129b
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -721,6 +721,7 @@ extern int ath9k_modparam_nohwcrypt;
extern int led_blink;
extern int led_blink;
extern bool is_ath9k_unloaded;
extern bool is_ath9k_unloaded;


u8 ath9k_parse_mpdudensity(u8 mpdudensity);
irqreturn_t ath_isr(int irq, void *dev);
irqreturn_t ath_isr(int irq, void *dev);
int ath9k_init_device(u16 devid, struct ath_softc *sc,
int ath9k_init_device(u16 devid, struct ath_softc *sc,
		    const struct ath_bus_ops *bus_ops);
		    const struct ath_bus_ops *bus_ops);
+4 −2
Original line number Original line Diff line number Diff line
@@ -19,7 +19,7 @@
#include "ath9k.h"
#include "ath9k.h"
#include "btcoex.h"
#include "btcoex.h"


static u8 parse_mpdudensity(u8 mpdudensity)
u8 ath9k_parse_mpdudensity(u8 mpdudensity)
{
{
	/*
	/*
	 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
	 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
@@ -320,6 +320,7 @@ static void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta,
			    struct ieee80211_vif *vif)
			    struct ieee80211_vif *vif)
{
{
	struct ath_node *an;
	struct ath_node *an;
	u8 density;
	an = (struct ath_node *)sta->drv_priv;
	an = (struct ath_node *)sta->drv_priv;


#ifdef CONFIG_ATH9K_DEBUGFS
#ifdef CONFIG_ATH9K_DEBUGFS
@@ -334,7 +335,8 @@ static void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta,
		ath_tx_node_init(sc, an);
		ath_tx_node_init(sc, an);
		an->maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
		an->maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
				     sta->ht_cap.ampdu_factor);
				     sta->ht_cap.ampdu_factor);
		an->mpdudensity = parse_mpdudensity(sta->ht_cap.ampdu_density);
		density = ath9k_parse_mpdudensity(sta->ht_cap.ampdu_density);
		an->mpdudensity = density;
	}
	}
}
}


+12 −0
Original line number Original line Diff line number Diff line
@@ -1175,6 +1175,7 @@ int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
{
{
	struct ath_atx_tid *txtid;
	struct ath_atx_tid *txtid;
	struct ath_node *an;
	struct ath_node *an;
	u8 density;


	an = (struct ath_node *)sta->drv_priv;
	an = (struct ath_node *)sta->drv_priv;
	txtid = ATH_AN_2_TID(an, tid);
	txtid = ATH_AN_2_TID(an, tid);
@@ -1182,6 +1183,17 @@ int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
	if (txtid->state & (AGGR_CLEANUP | AGGR_ADDBA_COMPLETE))
	if (txtid->state & (AGGR_CLEANUP | AGGR_ADDBA_COMPLETE))
		return -EAGAIN;
		return -EAGAIN;


	/* update ampdu factor/density, they may have changed. This may happen
	 * in HT IBSS when a beacon with HT-info is received after the station
	 * has already been added.
	 */
	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) {
		an->maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
				     sta->ht_cap.ampdu_factor);
		density = ath9k_parse_mpdudensity(sta->ht_cap.ampdu_density);
		an->mpdudensity = density;
	}

	txtid->state |= AGGR_ADDBA_PROGRESS;
	txtid->state |= AGGR_ADDBA_PROGRESS;
	txtid->paused = true;
	txtid->paused = true;
	*ssn = txtid->seq_start = txtid->seq_next;
	*ssn = txtid->seq_start = txtid->seq_next;