Currently the aggregation is formed till the aggregation limit
is reached and the rate lookup is done for the first frame alone.
But there can be a legacy rated frames in tid queue. This patch
limits the subframe addition based on last MRR's rate and sends
the legacy rated frames as unaggregated one.
Signed-off-by: Rajkumar Manoharan <[email protected]>
---
drivers/net/wireless/ath/ath9k/xmit.c | 23 ++++++++++++++++++++++-
1 files changed, 22 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index 2062672..41d9184 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -571,6 +571,26 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
ath_reset(sc, false);
}
+static bool ath_lookup_lecacy(struct ath_buf *bf)
+{
+ struct sk_buff *skb;
+ struct ieee80211_tx_info *tx_info;
+ struct ieee80211_tx_rate *rates;
+
+ skb = bf->bf_mpdu;
+ tx_info = IEEE80211_SKB_CB(skb);
+ rates = tx_info->control.rates;
+
+ /*
+ * Checking the last MRR's flag is sufficient to
+ * determine legacy or not
+ */
+ if (!(rates[3].flags & IEEE80211_TX_RC_MCS))
+ return true;
+
+ return false;
+}
+
static u32 ath_lookup_rate(struct ath_softc *sc, struct ath_buf *bf,
struct ath_atx_tid *tid)
{
@@ -750,7 +770,8 @@ static enum ATH_AGGR_STATUS ath_tx_form_aggr(struct ath_softc *sc,
al_delta = ATH_AGGR_DELIM_SZ + fi->framelen;
if (nframes &&
- (aggr_limit < (al + bpad + al_delta + prev_al))) {
+ ((aggr_limit < (al + bpad + al_delta + prev_al)) ||
+ ath_lookup_lecacy(bf))) {
status = ATH_AGGR_LIMITED;
break;
}
--
1.7.6
On 2011-08-22 2:37 PM, Rajkumar Manoharan wrote:
> Currently the aggregation is formed till the aggregation limit
> is reached and the rate lookup is done for the first frame alone.
> But there can be a legacy rated frames in tid queue. This patch
> limits the subframe addition based on last MRR's rate and sends
> the legacy rated frames as unaggregated one.
>
> Signed-off-by: Rajkumar Manoharan<[email protected]>
> ---
> drivers/net/wireless/ath/ath9k/xmit.c | 23 ++++++++++++++++++++++-
> 1 files changed, 22 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
> index 2062672..41d9184 100644
> --- a/drivers/net/wireless/ath/ath9k/xmit.c
> +++ b/drivers/net/wireless/ath/ath9k/xmit.c
> @@ -571,6 +571,26 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
> ath_reset(sc, false);
> }
>
> +static bool ath_lookup_lecacy(struct ath_buf *bf)
> +{
> + struct sk_buff *skb;
> + struct ieee80211_tx_info *tx_info;
> + struct ieee80211_tx_rate *rates;
> +
> + skb = bf->bf_mpdu;
> + tx_info = IEEE80211_SKB_CB(skb);
> + rates = tx_info->control.rates;
> +
> + /*
> + * Checking the last MRR's flag is sufficient to
> + * determine legacy or not
> + */
No it isn't. Maybe with ath9k_rate_control, but things may change with
other rate control modules.
- Felix