[PATCH] wifi: mac80211: introduce EHT rate support in AQL airtime

Jonas Gorski jonas.gorski at gmail.com
Sat Aug 31 15:06:18 PDT 2024


Hi,

On Fri, 30 Aug 2024 at 09:33, Mingyen Hsieh <mingyen.hsieh at mediatek.com> wrote:
>
> From: Ming Yen Hsieh <mingyen.hsieh at mediatek.com>
>
> Add definitions related to EHT mode and airtime calculation
> according to the 802.11BE_D4.0.
>
> Co-developed-by: Bo Jiao <Bo.Jiao at mediatek.com>
> Signed-off-by: Bo Jiao <Bo.Jiao at mediatek.com>
> Signed-off-by: Deren Wu <deren.wu at mediatek.com>
> Signed-off-by: Quan Zhou <quan.zhou at mediatek.com>
> Signed-off-by: Ming Yen Hsieh <MingYen.Hsieh at mediatek.com>
> ---
>  net/mac80211/airtime.c | 352 ++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 349 insertions(+), 3 deletions(-)
>
> diff --git a/net/mac80211/airtime.c b/net/mac80211/airtime.c
> index fdf8b658fede..1fd9bea61379 100644
> --- a/net/mac80211/airtime.c
> +++ b/net/mac80211/airtime.c

(snip)

> @@ -55,10 +55,21 @@
>  #define HE_DURATION_S(shift, streams, gi, bps)         \
>         (HE_DURATION(streams, gi, bps) >> shift)
>
> +/* gi in HE/EHT is identical. It matches enum nl80211_eht_gi as well */
> +#define EHT_GI_08 HE_GI_08
> +#define EHT_GI_16 HE_GI_16
> +#define EHT_GI_32 HE_GI_32
> +
> +#define EHT_DURATION(streams, gi, bps)                 \
> +       HE_DURATION(streams, gi, bps)
> +#define EHT_DURATION_S(shift, streams, gi, bps)                \
> +       HE_DURATION_S(shift, streams, gi, bps)
> +
>  #define BW_20                  0
>  #define BW_40                  1
>  #define BW_80                  2
>  #define BW_160                 3
> +#define BW_320                 4
...

> +       EHT_GROUP(16, EHT_GI_32, BW_320),
>  };

You define BW_320 and groups for it, but currently
ieee80211_get_rate_duration() rejects rx_statuses with a bw > 160, so
you will need to allow BW_320 (for EHT only?) as well.

>  static u32
> @@ -443,11 +771,20 @@ static u32 ieee80211_get_rate_duration(struct ieee80211_hw *hw,
>                 idx = status->rate_idx;
>                 group = HE_GROUP_IDX(streams, status->he_gi, bw);
>                 break;
> +       case RX_ENC_EHT:
> +               streams = status->nss;
> +               idx = status->rate_idx;
> +               group = EHT_GROUP_IDX(streams, status->eht.gi, bw);
> +               break;
>         default:
>                 WARN_ON_ONCE(1);
>                 return 0;
>         }
>
> +       if (WARN_ON_ONCE((status->encoding != RX_ENC_EHT && streams > 8) ||
> +                        (status->encoding == RX_ENC_EHT && streams > 16)))
> +               return 0;
> +
>         if (WARN_ON_ONCE((status->encoding != RX_ENC_HE && streams > 4) ||
>                          (status->encoding == RX_ENC_HE && streams > 8)))
>                 return 0;

RX_ENC_EHT with > 4 streams would trigger the existing WARN_ON() and
make this not work. Probably not what you indented.

Best Regards,
Jonas



More information about the Linux-mediatek mailing list