Search Linux Wireless

Re: [PATCH 2/2] ath9k: Change rate control to use legacy rate as last MRR

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Is this going to interfere with aggregation, which assumes (iirc) all
rates in the aggregate rate choice are HT?



Adrian

On 20 August 2011 19:52, Rajkumar Manoharan <rmanohar@xxxxxxxxxxxxxxxx> wrote:
> In congested network, having all rate reties at MCS rates
> is failing to transmit the frame offenly. By the time reaching
> the success rate set, the application gets timed out. One such
> scenario is that authentication time out during 4-Way handshake.
> This patch uses a legacy rate as last retry sequnce for
> unaggregated frames or if the first selected rate's PER is ~80%
> of max limit. And also observed from the tx status that the frame
> was trasmitted successfully by using legacy rates.
>
> Signed-off-by: Rajkumar Manoharan <rmanohar@xxxxxxxxxxxxxxxx>
> ---
>  drivers/net/wireless/ath/ath9k/rc.c |   34 +++++++++++++++++++++++++++-------
>  1 files changed, 27 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c
> index 9e3649a..4f13018 100644
> --- a/drivers/net/wireless/ath/ath9k/rc.c
> +++ b/drivers/net/wireless/ath/ath9k/rc.c
> @@ -603,7 +603,8 @@ static u8 ath_rc_setvalid_htrates(struct ath_rate_priv *ath_rc_priv,
>  static u8 ath_rc_get_highest_rix(struct ath_softc *sc,
>                                 struct ath_rate_priv *ath_rc_priv,
>                                 const struct ath_rate_table *rate_table,
> -                                int *is_probing)
> +                                int *is_probing,
> +                                bool legacy)
>  {
>        u32 best_thruput, this_thruput, now_msec;
>        u8 rate, next_rate, best_rate, maxindex, minindex;
> @@ -624,6 +625,8 @@ static u8 ath_rc_get_highest_rix(struct ath_softc *sc,
>                u8 per_thres;
>
>                rate = ath_rc_priv->valid_rate_index[index];
> +               if (legacy && !(rate_table->info[rate].rate_flags & RC_LEGACY))
> +                       continue;
>                if (rate > ath_rc_priv->rate_max_phy)
>                        continue;
>
> @@ -767,7 +770,7 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
>        struct ieee80211_tx_rate *rates = tx_info->control.rates;
>        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
>        __le16 fc = hdr->frame_control;
> -       u8 try_per_rate, i = 0, rix;
> +       u8 try_per_rate, i = 0, rix, high_rix;
>        int is_probe = 0;
>
>        if (rate_control_send_low(sta, priv_sta, txrc))
> @@ -786,7 +789,9 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
>        try_per_rate = 4;
>
>        rate_table = ath_rc_priv->rate_table;
> -       rix = ath_rc_get_highest_rix(sc, ath_rc_priv, rate_table, &is_probe);
> +       rix = ath_rc_get_highest_rix(sc, ath_rc_priv, rate_table,
> +                                    &is_probe, false);
> +       high_rix = rix;
>
>        /*
>         * If we're in HT mode and both us and our peer supports LDPC.
> @@ -822,10 +827,7 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
>        }
>
>        /* Fill in the other rates for multirate retry */
> -       for ( ; i < 4; i++) {
> -               /* Use twice the number of tries for the last MRR segment. */
> -               if (i + 1 == 4)
> -                       try_per_rate = 8;
> +       for ( ; i < 3; i++) {
>
>                ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &rix);
>                /* All other rates in the series have RTS enabled */
> @@ -833,6 +835,24 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
>                                       try_per_rate, rix, 1);
>        }
>
> +       /* Use twice the number of tries for the last MRR segment. */
> +       try_per_rate = 8;
> +
> +       /*
> +        * Use a legacy rate as last retry to ensure that the frame
> +        * is tried in both MCS and legacy rates.
> +        */
> +       if ((rates[2].flags & IEEE80211_TX_RC_MCS) &&
> +           (!(tx_info->flags & IEEE80211_TX_CTL_AMPDU) ||
> +           (ath_rc_priv->per[high_rix] > 45)))
> +               rix = ath_rc_get_highest_rix(sc, ath_rc_priv, rate_table,
> +                               &is_probe, true);
> +       else
> +               ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &rix);
> +
> +       /* All other rates in the series have RTS enabled */
> +       ath_rc_rate_set_series(rate_table, &rates[i], txrc,
> +                              try_per_rate, rix, 1);
>        /*
>         * NB:Change rate series to enable aggregation when operating
>         * at lower MCS rates. When first rate in series is MCS2
> --
> 1.7.6
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux