cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

rs.h (12625B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/******************************************************************************
      3 *
      4 * Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved.
      5 *****************************************************************************/
      6
      7#ifndef __iwl_agn_rs_h__
      8#define __iwl_agn_rs_h__
      9
     10#include <net/mac80211.h>
     11
     12#include "iwl-config.h"
     13
     14#include "commands.h"
     15
     16struct iwl_rate_info {
     17	u8 plcp;	/* uCode API:  IWL_RATE_6M_PLCP, etc. */
     18	u8 plcp_siso;	/* uCode API:  IWL_RATE_SISO_6M_PLCP, etc. */
     19	u8 plcp_mimo2;	/* uCode API:  IWL_RATE_MIMO2_6M_PLCP, etc. */
     20	u8 plcp_mimo3;  /* uCode API:  IWL_RATE_MIMO3_6M_PLCP, etc. */
     21	u8 ieee;	/* MAC header:  IWL_RATE_6M_IEEE, etc. */
     22	u8 prev_ieee;    /* previous rate in IEEE speeds */
     23	u8 next_ieee;    /* next rate in IEEE speeds */
     24	u8 prev_rs;      /* previous rate used in rs algo */
     25	u8 next_rs;      /* next rate used in rs algo */
     26	u8 prev_rs_tgg;  /* previous rate used in TGG rs algo */
     27	u8 next_rs_tgg;  /* next rate used in TGG rs algo */
     28};
     29
     30/*
     31 * These serve as indexes into
     32 * struct iwl_rate_info iwl_rates[IWL_RATE_COUNT];
     33 */
     34enum {
     35	IWL_RATE_1M_INDEX = 0,
     36	IWL_RATE_2M_INDEX,
     37	IWL_RATE_5M_INDEX,
     38	IWL_RATE_11M_INDEX,
     39	IWL_RATE_6M_INDEX,
     40	IWL_RATE_9M_INDEX,
     41	IWL_RATE_12M_INDEX,
     42	IWL_RATE_18M_INDEX,
     43	IWL_RATE_24M_INDEX,
     44	IWL_RATE_36M_INDEX,
     45	IWL_RATE_48M_INDEX,
     46	IWL_RATE_54M_INDEX,
     47	IWL_RATE_60M_INDEX,
     48	IWL_RATE_COUNT, /*FIXME:RS:change to IWL_RATE_INDEX_COUNT,*/
     49	IWL_RATE_COUNT_LEGACY = IWL_RATE_COUNT - 1,	/* Excluding 60M */
     50	IWL_RATE_INVM_INDEX = IWL_RATE_COUNT,
     51	IWL_RATE_INVALID = IWL_RATE_COUNT,
     52};
     53
     54enum {
     55	IWL_RATE_6M_INDEX_TABLE = 0,
     56	IWL_RATE_9M_INDEX_TABLE,
     57	IWL_RATE_12M_INDEX_TABLE,
     58	IWL_RATE_18M_INDEX_TABLE,
     59	IWL_RATE_24M_INDEX_TABLE,
     60	IWL_RATE_36M_INDEX_TABLE,
     61	IWL_RATE_48M_INDEX_TABLE,
     62	IWL_RATE_54M_INDEX_TABLE,
     63	IWL_RATE_1M_INDEX_TABLE,
     64	IWL_RATE_2M_INDEX_TABLE,
     65	IWL_RATE_5M_INDEX_TABLE,
     66	IWL_RATE_11M_INDEX_TABLE,
     67	IWL_RATE_INVM_INDEX_TABLE = IWL_RATE_INVM_INDEX - 1,
     68};
     69
     70enum {
     71	IWL_FIRST_OFDM_RATE = IWL_RATE_6M_INDEX,
     72	IWL_LAST_OFDM_RATE = IWL_RATE_60M_INDEX,
     73	IWL_FIRST_CCK_RATE = IWL_RATE_1M_INDEX,
     74	IWL_LAST_CCK_RATE = IWL_RATE_11M_INDEX,
     75};
     76
     77/* #define vs. enum to keep from defaulting to 'large integer' */
     78#define	IWL_RATE_6M_MASK   (1 << IWL_RATE_6M_INDEX)
     79#define	IWL_RATE_9M_MASK   (1 << IWL_RATE_9M_INDEX)
     80#define	IWL_RATE_12M_MASK  (1 << IWL_RATE_12M_INDEX)
     81#define	IWL_RATE_18M_MASK  (1 << IWL_RATE_18M_INDEX)
     82#define	IWL_RATE_24M_MASK  (1 << IWL_RATE_24M_INDEX)
     83#define	IWL_RATE_36M_MASK  (1 << IWL_RATE_36M_INDEX)
     84#define	IWL_RATE_48M_MASK  (1 << IWL_RATE_48M_INDEX)
     85#define	IWL_RATE_54M_MASK  (1 << IWL_RATE_54M_INDEX)
     86#define IWL_RATE_60M_MASK  (1 << IWL_RATE_60M_INDEX)
     87#define	IWL_RATE_1M_MASK   (1 << IWL_RATE_1M_INDEX)
     88#define	IWL_RATE_2M_MASK   (1 << IWL_RATE_2M_INDEX)
     89#define	IWL_RATE_5M_MASK   (1 << IWL_RATE_5M_INDEX)
     90#define	IWL_RATE_11M_MASK  (1 << IWL_RATE_11M_INDEX)
     91
     92/* uCode API values for legacy bit rates, both OFDM and CCK */
     93enum {
     94	IWL_RATE_6M_PLCP  = 13,
     95	IWL_RATE_9M_PLCP  = 15,
     96	IWL_RATE_12M_PLCP = 5,
     97	IWL_RATE_18M_PLCP = 7,
     98	IWL_RATE_24M_PLCP = 9,
     99	IWL_RATE_36M_PLCP = 11,
    100	IWL_RATE_48M_PLCP = 1,
    101	IWL_RATE_54M_PLCP = 3,
    102	IWL_RATE_60M_PLCP = 3,/*FIXME:RS:should be removed*/
    103	IWL_RATE_1M_PLCP  = 10,
    104	IWL_RATE_2M_PLCP  = 20,
    105	IWL_RATE_5M_PLCP  = 55,
    106	IWL_RATE_11M_PLCP = 110,
    107	/*FIXME:RS:change to IWL_RATE_LEGACY_??M_PLCP */
    108	/*FIXME:RS:add IWL_RATE_LEGACY_INVM_PLCP = 0,*/
    109};
    110
    111/* uCode API values for OFDM high-throughput (HT) bit rates */
    112enum {
    113	IWL_RATE_SISO_6M_PLCP = 0,
    114	IWL_RATE_SISO_12M_PLCP = 1,
    115	IWL_RATE_SISO_18M_PLCP = 2,
    116	IWL_RATE_SISO_24M_PLCP = 3,
    117	IWL_RATE_SISO_36M_PLCP = 4,
    118	IWL_RATE_SISO_48M_PLCP = 5,
    119	IWL_RATE_SISO_54M_PLCP = 6,
    120	IWL_RATE_SISO_60M_PLCP = 7,
    121	IWL_RATE_MIMO2_6M_PLCP  = 0x8,
    122	IWL_RATE_MIMO2_12M_PLCP = 0x9,
    123	IWL_RATE_MIMO2_18M_PLCP = 0xa,
    124	IWL_RATE_MIMO2_24M_PLCP = 0xb,
    125	IWL_RATE_MIMO2_36M_PLCP = 0xc,
    126	IWL_RATE_MIMO2_48M_PLCP = 0xd,
    127	IWL_RATE_MIMO2_54M_PLCP = 0xe,
    128	IWL_RATE_MIMO2_60M_PLCP = 0xf,
    129	IWL_RATE_MIMO3_6M_PLCP  = 0x10,
    130	IWL_RATE_MIMO3_12M_PLCP = 0x11,
    131	IWL_RATE_MIMO3_18M_PLCP = 0x12,
    132	IWL_RATE_MIMO3_24M_PLCP = 0x13,
    133	IWL_RATE_MIMO3_36M_PLCP = 0x14,
    134	IWL_RATE_MIMO3_48M_PLCP = 0x15,
    135	IWL_RATE_MIMO3_54M_PLCP = 0x16,
    136	IWL_RATE_MIMO3_60M_PLCP = 0x17,
    137	IWL_RATE_SISO_INVM_PLCP,
    138	IWL_RATE_MIMO2_INVM_PLCP = IWL_RATE_SISO_INVM_PLCP,
    139	IWL_RATE_MIMO3_INVM_PLCP = IWL_RATE_SISO_INVM_PLCP,
    140};
    141
    142/* MAC header values for bit rates */
    143enum {
    144	IWL_RATE_6M_IEEE  = 12,
    145	IWL_RATE_9M_IEEE  = 18,
    146	IWL_RATE_12M_IEEE = 24,
    147	IWL_RATE_18M_IEEE = 36,
    148	IWL_RATE_24M_IEEE = 48,
    149	IWL_RATE_36M_IEEE = 72,
    150	IWL_RATE_48M_IEEE = 96,
    151	IWL_RATE_54M_IEEE = 108,
    152	IWL_RATE_60M_IEEE = 120,
    153	IWL_RATE_1M_IEEE  = 2,
    154	IWL_RATE_2M_IEEE  = 4,
    155	IWL_RATE_5M_IEEE  = 11,
    156	IWL_RATE_11M_IEEE = 22,
    157};
    158
    159#define IWL_RATES_MASK ((1 << IWL_RATE_COUNT) - 1)
    160
    161#define IWL_INVALID_VALUE    -1
    162
    163#define IWL_MIN_RSSI_VAL                 -100
    164#define IWL_MAX_RSSI_VAL                    0
    165
    166/* These values specify how many Tx frame attempts before
    167 * searching for a new modulation mode */
    168#define IWL_LEGACY_FAILURE_LIMIT	160
    169#define IWL_LEGACY_SUCCESS_LIMIT	480
    170#define IWL_LEGACY_TABLE_COUNT		160
    171
    172#define IWL_NONE_LEGACY_FAILURE_LIMIT	400
    173#define IWL_NONE_LEGACY_SUCCESS_LIMIT	4500
    174#define IWL_NONE_LEGACY_TABLE_COUNT	1500
    175
    176/* Success ratio (ACKed / attempted tx frames) values (perfect is 128 * 100) */
    177#define IWL_RS_GOOD_RATIO		12800	/* 100% */
    178#define IWL_RATE_SCALE_SWITCH		10880	/*  85% */
    179#define IWL_RATE_HIGH_TH		10880	/*  85% */
    180#define IWL_RATE_INCREASE_TH		6400	/*  50% */
    181#define IWL_RATE_DECREASE_TH		1920	/*  15% */
    182
    183/* possible actions when in legacy mode */
    184#define IWL_LEGACY_SWITCH_ANTENNA1      0
    185#define IWL_LEGACY_SWITCH_ANTENNA2      1
    186#define IWL_LEGACY_SWITCH_SISO          2
    187#define IWL_LEGACY_SWITCH_MIMO2_AB      3
    188#define IWL_LEGACY_SWITCH_MIMO2_AC      4
    189#define IWL_LEGACY_SWITCH_MIMO2_BC      5
    190#define IWL_LEGACY_SWITCH_MIMO3_ABC     6
    191
    192/* possible actions when in siso mode */
    193#define IWL_SISO_SWITCH_ANTENNA1        0
    194#define IWL_SISO_SWITCH_ANTENNA2        1
    195#define IWL_SISO_SWITCH_MIMO2_AB        2
    196#define IWL_SISO_SWITCH_MIMO2_AC        3
    197#define IWL_SISO_SWITCH_MIMO2_BC        4
    198#define IWL_SISO_SWITCH_GI              5
    199#define IWL_SISO_SWITCH_MIMO3_ABC       6
    200
    201
    202/* possible actions when in mimo mode */
    203#define IWL_MIMO2_SWITCH_ANTENNA1       0
    204#define IWL_MIMO2_SWITCH_ANTENNA2       1
    205#define IWL_MIMO2_SWITCH_SISO_A         2
    206#define IWL_MIMO2_SWITCH_SISO_B         3
    207#define IWL_MIMO2_SWITCH_SISO_C         4
    208#define IWL_MIMO2_SWITCH_GI             5
    209#define IWL_MIMO2_SWITCH_MIMO3_ABC      6
    210
    211
    212/* possible actions when in mimo3 mode */
    213#define IWL_MIMO3_SWITCH_ANTENNA1       0
    214#define IWL_MIMO3_SWITCH_ANTENNA2       1
    215#define IWL_MIMO3_SWITCH_SISO_A         2
    216#define IWL_MIMO3_SWITCH_SISO_B         3
    217#define IWL_MIMO3_SWITCH_SISO_C         4
    218#define IWL_MIMO3_SWITCH_MIMO2_AB       5
    219#define IWL_MIMO3_SWITCH_MIMO2_AC       6
    220#define IWL_MIMO3_SWITCH_MIMO2_BC       7
    221#define IWL_MIMO3_SWITCH_GI             8
    222
    223
    224#define IWL_MAX_11N_MIMO3_SEARCH IWL_MIMO3_SWITCH_GI
    225#define IWL_MAX_SEARCH IWL_MIMO2_SWITCH_MIMO3_ABC
    226
    227/*FIXME:RS:add possible actions for MIMO3*/
    228
    229#define IWL_ACTION_LIMIT		3	/* # possible actions */
    230
    231#define LQ_SIZE		2	/* 2 mode tables:  "Active" and "Search" */
    232
    233/* load per tid defines for A-MPDU activation */
    234#define IWL_AGG_TPT_THREHOLD	0
    235#define IWL_AGG_LOAD_THRESHOLD	10
    236#define IWL_AGG_ALL_TID		0xff
    237#define TID_QUEUE_CELL_SPACING	50	/*mS */
    238#define TID_QUEUE_MAX_SIZE	20
    239#define TID_ROUND_VALUE		5	/* mS */
    240
    241#define TID_MAX_TIME_DIFF ((TID_QUEUE_MAX_SIZE - 1) * TID_QUEUE_CELL_SPACING)
    242#define TIME_WRAP_AROUND(x, y) (((y) > (x)) ? (y) - (x) : (0-(x)) + (y))
    243
    244extern const struct iwl_rate_info iwl_rates[IWL_RATE_COUNT];
    245
    246enum iwl_table_type {
    247	LQ_NONE,
    248	LQ_G,		/* legacy types */
    249	LQ_A,
    250	LQ_SISO,	/* high-throughput types */
    251	LQ_MIMO2,
    252	LQ_MIMO3,
    253	LQ_MAX,
    254};
    255
    256#define is_legacy(tbl) (((tbl) == LQ_G) || ((tbl) == LQ_A))
    257#define is_siso(tbl) ((tbl) == LQ_SISO)
    258#define is_mimo2(tbl) ((tbl) == LQ_MIMO2)
    259#define is_mimo3(tbl) ((tbl) == LQ_MIMO3)
    260#define is_mimo(tbl) (is_mimo2(tbl) || is_mimo3(tbl))
    261#define is_Ht(tbl) (is_siso(tbl) || is_mimo(tbl))
    262#define is_a_band(tbl) ((tbl) == LQ_A)
    263#define is_g_and(tbl) ((tbl) == LQ_G)
    264
    265#define IWL_MAX_MCS_DISPLAY_SIZE	12
    266
    267struct iwl_rate_mcs_info {
    268	char	mbps[IWL_MAX_MCS_DISPLAY_SIZE];
    269	char	mcs[IWL_MAX_MCS_DISPLAY_SIZE];
    270};
    271
    272/**
    273 * struct iwl_rate_scale_data -- tx success history for one rate
    274 */
    275struct iwl_rate_scale_data {
    276	u64 data;		/* bitmap of successful frames */
    277	s32 success_counter;	/* number of frames successful */
    278	s32 success_ratio;	/* per-cent * 128  */
    279	s32 counter;		/* number of frames attempted */
    280	s32 average_tpt;	/* success ratio * expected throughput */
    281	unsigned long stamp;
    282};
    283
    284/**
    285 * struct iwl_scale_tbl_info -- tx params and success history for all rates
    286 *
    287 * There are two of these in struct iwl_lq_sta,
    288 * one for "active", and one for "search".
    289 */
    290struct iwl_scale_tbl_info {
    291	enum iwl_table_type lq_type;
    292	u8 ant_type;
    293	u8 is_SGI;	/* 1 = short guard interval */
    294	u8 is_ht40;	/* 1 = 40 MHz channel width */
    295	u8 is_dup;	/* 1 = duplicated data streams */
    296	u8 action;	/* change modulation; IWL_[LEGACY/SISO/MIMO]_SWITCH_* */
    297	u8 max_search;	/* maximun number of tables we can search */
    298	const u16 *expected_tpt;	/* throughput metrics; expected_tpt_G, etc. */
    299	u32 current_rate;  /* rate_n_flags, uCode API format */
    300	struct iwl_rate_scale_data win[IWL_RATE_COUNT]; /* rate histories */
    301};
    302
    303struct iwl_traffic_load {
    304	unsigned long time_stamp;	/* age of the oldest statistics */
    305	u32 packet_count[TID_QUEUE_MAX_SIZE];   /* packet count in this time
    306						 * slice */
    307	u32 total;			/* total num of packets during the
    308					 * last TID_MAX_TIME_DIFF */
    309	u8 queue_count;			/* number of queues that has
    310					 * been used since the last cleanup */
    311	u8 head;			/* start of the circular buffer */
    312};
    313
    314/**
    315 * struct iwl_lq_sta -- driver's rate scaling private structure
    316 *
    317 * Pointer to this gets passed back and forth between driver and mac80211.
    318 */
    319struct iwl_lq_sta {
    320	u8 active_tbl;		/* index of active table, range 0-1 */
    321	u8 enable_counter;	/* indicates HT mode */
    322	u8 stay_in_tbl;		/* 1: disallow, 0: allow search for new mode */
    323	u8 search_better_tbl;	/* 1: currently trying alternate mode */
    324	s32 last_tpt;
    325
    326	/* The following determine when to search for a new mode */
    327	u32 table_count_limit;
    328	u32 max_failure_limit;	/* # failed frames before new search */
    329	u32 max_success_limit;	/* # successful frames before new search */
    330	u32 table_count;
    331	u32 total_failed;	/* total failed frames, any/all rates */
    332	u32 total_success;	/* total successful frames, any/all rates */
    333	u64 flush_timer;	/* time staying in mode before new search */
    334
    335	u8 action_counter;	/* # mode-switch actions tried */
    336	u8 is_green;
    337	u8 is_dup;
    338	enum nl80211_band band;
    339
    340	/* The following are bitmaps of rates; IWL_RATE_6M_MASK, etc. */
    341	u32 supp_rates;
    342	u16 active_legacy_rate;
    343	u16 active_siso_rate;
    344	u16 active_mimo2_rate;
    345	u16 active_mimo3_rate;
    346	s8 max_rate_idx;     /* Max rate set by user */
    347	u8 missed_rate_counter;
    348
    349	struct iwl_link_quality_cmd lq;
    350	struct iwl_scale_tbl_info lq_info[LQ_SIZE]; /* "active", "search" */
    351	struct iwl_traffic_load load[IWL_MAX_TID_COUNT];
    352	u8 tx_agg_tid_en;
    353#ifdef CONFIG_MAC80211_DEBUGFS
    354	u32 dbg_fixed_rate;
    355#endif
    356	struct iwl_priv *drv;
    357
    358	/* used to be in sta_info */
    359	int last_txrate_idx;
    360	/* last tx rate_n_flags */
    361	u32 last_rate_n_flags;
    362	/* packets destined for this STA are aggregated */
    363	u8 is_agg;
    364	/* BT traffic this sta was last updated in */
    365	u8 last_bt_traffic;
    366};
    367
    368static inline u8 first_antenna(u8 mask)
    369{
    370	if (mask & ANT_A)
    371		return ANT_A;
    372	if (mask & ANT_B)
    373		return ANT_B;
    374	return ANT_C;
    375}
    376
    377
    378/* Initialize station's rate scaling information after adding station */
    379void iwl_rs_rate_init(struct iwl_priv *priv, struct ieee80211_sta *sta,
    380		      u8 sta_id);
    381
    382/**
    383 * iwl_rate_control_register - Register the rate control algorithm callbacks
    384 *
    385 * Since the rate control algorithm is hardware specific, there is no need
    386 * or reason to place it as a stand alone module.  The driver can call
    387 * iwl_rate_control_register in order to register the rate control callbacks
    388 * with the mac80211 subsystem.  This should be performed prior to calling
    389 * ieee80211_register_hw
    390 *
    391 */
    392int iwlagn_rate_control_register(void);
    393
    394/**
    395 * iwl_rate_control_unregister - Unregister the rate control callbacks
    396 *
    397 * This should be called after calling ieee80211_unregister_hw, but before
    398 * the driver is unloaded.
    399 */
    400void iwlagn_rate_control_unregister(void);
    401
    402#endif /* __iwl_agn__rs__ */