2010-05-13 18:48:03 +04:00
/*
* Copyright ( C ) 2010 Felix Fietkau < nbd @ openwrt . org >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# ifndef __RC_MINSTREL_HT_H
# define __RC_MINSTREL_HT_H
/*
* The number of streams can be changed to 2 to reduce code
* size and memory footprint .
*/
2014-10-20 17:46:00 +04:00
# define MINSTREL_MAX_STREAMS 3
# define MINSTREL_HT_STREAM_GROUPS 4 /* BW(=2) * SGI(=2) */
2014-10-21 12:38:38 +04:00
# ifdef CONFIG_MAC80211_RC_MINSTREL_VHT
# define MINSTREL_VHT_STREAM_GROUPS 6 /* BW(=3) * SGI(=2) */
# else
# define MINSTREL_VHT_STREAM_GROUPS 0
# endif
2014-10-20 17:46:00 +04:00
# define MINSTREL_HT_GROUPS_NB (MINSTREL_MAX_STREAMS * \
MINSTREL_HT_STREAM_GROUPS )
2014-10-21 12:38:38 +04:00
# define MINSTREL_VHT_GROUPS_NB (MINSTREL_MAX_STREAMS * \
MINSTREL_VHT_STREAM_GROUPS )
2014-10-20 17:46:00 +04:00
# define MINSTREL_CCK_GROUPS_NB 1
# define MINSTREL_GROUPS_NB (MINSTREL_HT_GROUPS_NB + \
2014-10-21 12:38:38 +04:00
MINSTREL_VHT_GROUPS_NB + \
2014-10-20 17:46:00 +04:00
MINSTREL_CCK_GROUPS_NB )
# define MINSTREL_HT_GROUP_0 0
# define MINSTREL_CCK_GROUP (MINSTREL_HT_GROUP_0 + MINSTREL_HT_GROUPS_NB)
2014-10-21 12:38:38 +04:00
# define MINSTREL_VHT_GROUP_0 (MINSTREL_CCK_GROUP + 1)
2010-05-13 18:48:03 +04:00
2014-10-21 12:38:38 +04:00
# ifdef CONFIG_MAC80211_RC_MINSTREL_VHT
# define MCS_GROUP_RATES 10
# else
# define MCS_GROUP_RATES 8
# endif
2010-05-13 18:48:03 +04:00
struct mcs_group {
u32 flags ;
unsigned int streams ;
unsigned int duration [ MCS_GROUP_RATES ] ;
} ;
2010-06-24 21:03:14 +04:00
extern const struct mcs_group minstrel_mcs_groups [ ] ;
2010-05-13 18:48:03 +04:00
struct minstrel_mcs_group_data {
u8 index ;
u8 column ;
/* bitfield of supported MCS rates of this group */
2014-10-21 12:38:38 +04:00
u16 supported ;
2010-05-13 18:48:03 +04:00
2014-09-10 01:22:14 +04:00
/* sorted rate set within a MCS group*/
2014-10-20 17:45:59 +04:00
u16 max_group_tp_rate [ MAX_THR_RATES ] ;
u16 max_group_prob_rate ;
2010-05-13 18:48:03 +04:00
/* MCS rate statistics */
struct minstrel_rate_stats rates [ MCS_GROUP_RATES ] ;
} ;
struct minstrel_ht_sta {
2013-04-22 18:14:42 +04:00
struct ieee80211_sta * sta ;
2010-05-13 18:48:03 +04:00
/* ampdu length (average, per sampling interval) */
unsigned int ampdu_len ;
unsigned int ampdu_packets ;
/* ampdu length (EWMA) */
unsigned int avg_ampdu_len ;
2014-09-10 01:22:14 +04:00
/* overall sorted rate set */
2014-10-20 17:45:59 +04:00
u16 max_tp_rate [ MAX_THR_RATES ] ;
u16 max_prob_rate ;
2010-05-13 18:48:03 +04:00
/* time of last status update */
2015-03-24 23:09:39 +03:00
unsigned long last_stats_update ;
2010-05-13 18:48:03 +04:00
/* overhead time in usec for each frame */
unsigned int overhead ;
unsigned int overhead_rtscts ;
unsigned int total_packets ;
unsigned int sample_packets ;
/* tx flags to add for frames for this sta */
u32 tx_flags ;
u8 sample_wait ;
u8 sample_tries ;
u8 sample_count ;
u8 sample_slow ;
/* current MCS group to be sampled */
u8 sample_group ;
2013-02-13 13:51:08 +04:00
u8 cck_supported ;
u8 cck_supported_short ;
2010-05-13 18:48:03 +04:00
/* MCS rate group info and statistics */
2014-10-20 17:46:00 +04:00
struct minstrel_mcs_group_data groups [ MINSTREL_GROUPS_NB ] ;
2010-05-13 18:48:03 +04:00
} ;
struct minstrel_ht_sta_priv {
union {
struct minstrel_ht_sta ht ;
struct minstrel_sta_info legacy ;
} ;
# ifdef CONFIG_MAC80211_DEBUGFS
struct dentry * dbg_stats ;
2015-03-24 23:09:37 +03:00
struct dentry * dbg_stats_csv ;
2010-05-13 18:48:03 +04:00
# endif
void * ratelist ;
void * sample_table ;
bool is_ht ;
} ;
void minstrel_ht_add_sta_debugfs ( void * priv , void * priv_sta , struct dentry * dir ) ;
void minstrel_ht_remove_sta_debugfs ( void * priv , void * priv_sta ) ;
2015-03-24 23:09:41 +03:00
int minstrel_ht_get_tp_avg ( struct minstrel_ht_sta * mi , int group , int rate ,
int prob_ewma ) ;
2010-05-13 18:48:03 +04:00
# endif