[Make-wifi-fast] [RFC/RFT 5/5] ath9k: Count RX airtime in airtime deficit

Adrian Chadd adrian at freebsd.org
Sat Jun 4 13:06:08 EDT 2016


hi,

I've been working on something similar in freebsd, so cool to see this
happening here!

The only thing missing atm is STBC and LDPC. My RX airtime code looks
basically like this one too; but I have TODO items for ensuring
LDPC/STBC calculations are sane.



-adrian


On 3 June 2016 at 09:51, Toke Høiland-Jørgensen <toke at toke.dk> wrote:
> This adds RX airtime to the airtime deficit used in the scheduler. This
> is not a definite win, but I have only done very limited testing where
> it has been included. Feel free to skip this patch when testing.
>
> Signed-off-by: Toke Høiland-Jørgensen <toke at toke.dk>
> ---
>  drivers/net/wireless/ath/ath9k/recv.c | 51 ++++++++++++++++++++++++++++++++++-
>  1 file changed, 50 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
> index 7eb8980..23d6ebe 100644
> --- a/drivers/net/wireless/ath/ath9k/recv.c
> +++ b/drivers/net/wireless/ath/ath9k/recv.c
> @@ -991,6 +991,55 @@ static void ath9k_apply_ampdu_details(struct ath_softc *sc,
>         }
>  }
>
> +static void ath_rx_count_airtime(struct ath_softc *sc,
> +                                struct ath_rx_status *rs,
> +                                struct sk_buff *skb)
> +{
> +       struct ath_node *an;
> +       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
> +       struct ath_hw *ah = sc->sc_ah;
> +       struct ath_common *common = ath9k_hw_common(ah);
> +       struct ieee80211_sta *sta;
> +       struct ieee80211_rx_status *rxs;
> +       const struct ieee80211_rate *rate;
> +       bool is_sgi, is_40, is_sp;
> +       int phy;
> +       u32 airtime = 0;
> +
> +       if (!ieee80211_is_data(hdr->frame_control))
> +               return;
> +
> +       rcu_read_lock();
> +
> +       sta = ieee80211_find_sta_by_ifaddr(sc->hw, hdr->addr2, NULL);
> +       if (!sta)
> +               goto exit;
> +       an = (struct ath_node *) sta->drv_priv;
> +       rxs = IEEE80211_SKB_RXCB(skb);
> +
> +       is_sgi = !!(rxs->flag & RX_FLAG_SHORT_GI);
> +       is_40 = !!(rxs->flag & RX_FLAG_40MHZ);
> +       is_sp = !!(rxs->flag & RX_FLAG_SHORTPRE);
> +
> +       if (!!(rxs->flag & RX_FLAG_HT)) {
> +               /* MCS rates */
> +
> +               airtime += ath_pkt_duration(sc, rxs->rate_idx, rs->rs_datalen,
> +                                       is_40, is_sgi, is_sp);
> +       } else {
> +
> +               phy = IS_CCK_RATE(rs->rs_rate) ? WLAN_RC_PHY_CCK : WLAN_RC_PHY_OFDM;
> +               rate = &common->sbands[rxs->band].bitrates[rxs->rate_idx];
> +               airtime += ath9k_hw_computetxtime(ah, phy, rate->bitrate * 100,
> +                                               rs->rs_datalen, rxs->rate_idx, is_sp);
> +       }
> +
> +       an->airtime_deficit -= airtime;
> +       ath_debug_airtime(sc, an, airtime, 0);
> +exit:
> +       rcu_read_unlock();
> +}
> +
>  int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
>  {
>         struct ath_rxbuf *bf;
> @@ -1137,7 +1186,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
>                 ath9k_antenna_check(sc, &rs);
>                 ath9k_apply_ampdu_details(sc, &rs, rxs);
>                 ath_debug_rate_stats(sc, &rs, skb);
> -               ath_debug_rx_airtime(sc, &rs, skb);
> +               ath_rx_count_airtime(sc, &rs, skb);
>
>                 hdr = (struct ieee80211_hdr *)skb->data;
>                 if (ieee80211_is_ack(hdr->frame_control))
> --
> 2.7.4
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


More information about the Make-wifi-fast mailing list