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