linux/net/mac80211/rc80211_minstrel_ht.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (C) 2010 Felix Fietkau <nbd@openwrt.org>
   4 */
   5
   6#ifndef __RC_MINSTREL_HT_H
   7#define __RC_MINSTREL_HT_H
   8
   9/*
  10 * The number of streams can be changed to 2 to reduce code
  11 * size and memory footprint.
  12 */
  13#define MINSTREL_MAX_STREAMS            4
  14#define MINSTREL_HT_STREAM_GROUPS       4 /* BW(=2) * SGI(=2) */
  15#define MINSTREL_VHT_STREAM_GROUPS      6 /* BW(=3) * SGI(=2) */
  16
  17#define MINSTREL_HT_GROUPS_NB   (MINSTREL_MAX_STREAMS *         \
  18                                 MINSTREL_HT_STREAM_GROUPS)
  19#define MINSTREL_VHT_GROUPS_NB  (MINSTREL_MAX_STREAMS *         \
  20                                 MINSTREL_VHT_STREAM_GROUPS)
  21#define MINSTREL_CCK_GROUPS_NB  1
  22#define MINSTREL_GROUPS_NB      (MINSTREL_HT_GROUPS_NB +        \
  23                                 MINSTREL_VHT_GROUPS_NB +       \
  24                                 MINSTREL_CCK_GROUPS_NB)
  25
  26#define MINSTREL_HT_GROUP_0     0
  27#define MINSTREL_CCK_GROUP      (MINSTREL_HT_GROUP_0 + MINSTREL_HT_GROUPS_NB)
  28#define MINSTREL_VHT_GROUP_0    (MINSTREL_CCK_GROUP + 1)
  29
  30#define MCS_GROUP_RATES         10
  31
  32struct mcs_group {
  33        u16 flags;
  34        u8 streams;
  35        u8 shift;
  36        u8 bw;
  37        u16 duration[MCS_GROUP_RATES];
  38};
  39
  40extern const struct mcs_group minstrel_mcs_groups[];
  41
  42struct minstrel_mcs_group_data {
  43        u8 index;
  44        u8 column;
  45
  46        /* sorted rate set within a MCS group*/
  47        u16 max_group_tp_rate[MAX_THR_RATES];
  48        u16 max_group_prob_rate;
  49
  50        /* MCS rate statistics */
  51        struct minstrel_rate_stats rates[MCS_GROUP_RATES];
  52};
  53
  54enum minstrel_sample_mode {
  55        MINSTREL_SAMPLE_IDLE,
  56        MINSTREL_SAMPLE_ACTIVE,
  57        MINSTREL_SAMPLE_PENDING,
  58};
  59
  60struct minstrel_ht_sta {
  61        struct ieee80211_sta *sta;
  62
  63        /* ampdu length (average, per sampling interval) */
  64        unsigned int ampdu_len;
  65        unsigned int ampdu_packets;
  66
  67        /* ampdu length (EWMA) */
  68        unsigned int avg_ampdu_len;
  69
  70        /* overall sorted rate set */
  71        u16 max_tp_rate[MAX_THR_RATES];
  72        u16 max_prob_rate;
  73
  74        /* time of last status update */
  75        unsigned long last_stats_update;
  76
  77        /* overhead time in usec for each frame */
  78        unsigned int overhead;
  79        unsigned int overhead_rtscts;
  80
  81        unsigned int total_packets_last;
  82        unsigned int total_packets_cur;
  83        unsigned int total_packets;
  84        unsigned int sample_packets;
  85
  86        /* tx flags to add for frames for this sta */
  87        u32 tx_flags;
  88
  89        u8 sample_wait;
  90        u8 sample_tries;
  91        u8 sample_count;
  92        u8 sample_slow;
  93
  94        enum minstrel_sample_mode sample_mode;
  95        u16 sample_rate;
  96
  97        /* current MCS group to be sampled */
  98        u8 sample_group;
  99
 100        u8 cck_supported;
 101        u8 cck_supported_short;
 102
 103        /* Bitfield of supported MCS rates of all groups */
 104        u16 supported[MINSTREL_GROUPS_NB];
 105
 106        /* MCS rate group info and statistics */
 107        struct minstrel_mcs_group_data groups[MINSTREL_GROUPS_NB];
 108};
 109
 110struct minstrel_ht_sta_priv {
 111        union {
 112                struct minstrel_ht_sta ht;
 113                struct minstrel_sta_info legacy;
 114        };
 115        void *ratelist;
 116        void *sample_table;
 117        bool is_ht;
 118};
 119
 120void minstrel_ht_add_sta_debugfs(void *priv, void *priv_sta, struct dentry *dir);
 121int minstrel_ht_get_tp_avg(struct minstrel_ht_sta *mi, int group, int rate,
 122                           int prob_avg);
 123
 124#endif
 125