162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/****************************************************************************** 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved. 562306a36Sopenharmony_ci *****************************************************************************/ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef __iwl_agn_rs_h__ 862306a36Sopenharmony_ci#define __iwl_agn_rs_h__ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <net/mac80211.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include "iwl-config.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include "commands.h" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_cistruct iwl_rate_info { 1762306a36Sopenharmony_ci u8 plcp; /* uCode API: IWL_RATE_6M_PLCP, etc. */ 1862306a36Sopenharmony_ci u8 plcp_siso; /* uCode API: IWL_RATE_SISO_6M_PLCP, etc. */ 1962306a36Sopenharmony_ci u8 plcp_mimo2; /* uCode API: IWL_RATE_MIMO2_6M_PLCP, etc. */ 2062306a36Sopenharmony_ci u8 plcp_mimo3; /* uCode API: IWL_RATE_MIMO3_6M_PLCP, etc. */ 2162306a36Sopenharmony_ci u8 ieee; /* MAC header: IWL_RATE_6M_IEEE, etc. */ 2262306a36Sopenharmony_ci u8 prev_ieee; /* previous rate in IEEE speeds */ 2362306a36Sopenharmony_ci u8 next_ieee; /* next rate in IEEE speeds */ 2462306a36Sopenharmony_ci u8 prev_rs; /* previous rate used in rs algo */ 2562306a36Sopenharmony_ci u8 next_rs; /* next rate used in rs algo */ 2662306a36Sopenharmony_ci u8 prev_rs_tgg; /* previous rate used in TGG rs algo */ 2762306a36Sopenharmony_ci u8 next_rs_tgg; /* next rate used in TGG rs algo */ 2862306a36Sopenharmony_ci}; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci/* 3162306a36Sopenharmony_ci * These serve as indexes into 3262306a36Sopenharmony_ci * struct iwl_rate_info iwl_rates[IWL_RATE_COUNT]; 3362306a36Sopenharmony_ci */ 3462306a36Sopenharmony_cienum { 3562306a36Sopenharmony_ci IWL_RATE_1M_INDEX = 0, 3662306a36Sopenharmony_ci IWL_RATE_2M_INDEX, 3762306a36Sopenharmony_ci IWL_RATE_5M_INDEX, 3862306a36Sopenharmony_ci IWL_RATE_11M_INDEX, 3962306a36Sopenharmony_ci IWL_RATE_6M_INDEX, 4062306a36Sopenharmony_ci IWL_RATE_9M_INDEX, 4162306a36Sopenharmony_ci IWL_RATE_12M_INDEX, 4262306a36Sopenharmony_ci IWL_RATE_18M_INDEX, 4362306a36Sopenharmony_ci IWL_RATE_24M_INDEX, 4462306a36Sopenharmony_ci IWL_RATE_36M_INDEX, 4562306a36Sopenharmony_ci IWL_RATE_48M_INDEX, 4662306a36Sopenharmony_ci IWL_RATE_54M_INDEX, 4762306a36Sopenharmony_ci IWL_RATE_60M_INDEX, 4862306a36Sopenharmony_ci IWL_RATE_COUNT, /*FIXME:RS:change to IWL_RATE_INDEX_COUNT,*/ 4962306a36Sopenharmony_ci IWL_RATE_COUNT_LEGACY = IWL_RATE_COUNT - 1, /* Excluding 60M */ 5062306a36Sopenharmony_ci IWL_RATE_INVM_INDEX = IWL_RATE_COUNT, 5162306a36Sopenharmony_ci IWL_RATE_INVALID = IWL_RATE_COUNT, 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cienum { 5562306a36Sopenharmony_ci IWL_RATE_6M_INDEX_TABLE = 0, 5662306a36Sopenharmony_ci IWL_RATE_9M_INDEX_TABLE, 5762306a36Sopenharmony_ci IWL_RATE_12M_INDEX_TABLE, 5862306a36Sopenharmony_ci IWL_RATE_18M_INDEX_TABLE, 5962306a36Sopenharmony_ci IWL_RATE_24M_INDEX_TABLE, 6062306a36Sopenharmony_ci IWL_RATE_36M_INDEX_TABLE, 6162306a36Sopenharmony_ci IWL_RATE_48M_INDEX_TABLE, 6262306a36Sopenharmony_ci IWL_RATE_54M_INDEX_TABLE, 6362306a36Sopenharmony_ci IWL_RATE_1M_INDEX_TABLE, 6462306a36Sopenharmony_ci IWL_RATE_2M_INDEX_TABLE, 6562306a36Sopenharmony_ci IWL_RATE_5M_INDEX_TABLE, 6662306a36Sopenharmony_ci IWL_RATE_11M_INDEX_TABLE, 6762306a36Sopenharmony_ci IWL_RATE_INVM_INDEX_TABLE = IWL_RATE_INVM_INDEX - 1, 6862306a36Sopenharmony_ci}; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cienum { 7162306a36Sopenharmony_ci IWL_FIRST_OFDM_RATE = IWL_RATE_6M_INDEX, 7262306a36Sopenharmony_ci IWL_LAST_OFDM_RATE = IWL_RATE_60M_INDEX, 7362306a36Sopenharmony_ci IWL_FIRST_CCK_RATE = IWL_RATE_1M_INDEX, 7462306a36Sopenharmony_ci IWL_LAST_CCK_RATE = IWL_RATE_11M_INDEX, 7562306a36Sopenharmony_ci}; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci/* #define vs. enum to keep from defaulting to 'large integer' */ 7862306a36Sopenharmony_ci#define IWL_RATE_6M_MASK (1 << IWL_RATE_6M_INDEX) 7962306a36Sopenharmony_ci#define IWL_RATE_9M_MASK (1 << IWL_RATE_9M_INDEX) 8062306a36Sopenharmony_ci#define IWL_RATE_12M_MASK (1 << IWL_RATE_12M_INDEX) 8162306a36Sopenharmony_ci#define IWL_RATE_18M_MASK (1 << IWL_RATE_18M_INDEX) 8262306a36Sopenharmony_ci#define IWL_RATE_24M_MASK (1 << IWL_RATE_24M_INDEX) 8362306a36Sopenharmony_ci#define IWL_RATE_36M_MASK (1 << IWL_RATE_36M_INDEX) 8462306a36Sopenharmony_ci#define IWL_RATE_48M_MASK (1 << IWL_RATE_48M_INDEX) 8562306a36Sopenharmony_ci#define IWL_RATE_54M_MASK (1 << IWL_RATE_54M_INDEX) 8662306a36Sopenharmony_ci#define IWL_RATE_60M_MASK (1 << IWL_RATE_60M_INDEX) 8762306a36Sopenharmony_ci#define IWL_RATE_1M_MASK (1 << IWL_RATE_1M_INDEX) 8862306a36Sopenharmony_ci#define IWL_RATE_2M_MASK (1 << IWL_RATE_2M_INDEX) 8962306a36Sopenharmony_ci#define IWL_RATE_5M_MASK (1 << IWL_RATE_5M_INDEX) 9062306a36Sopenharmony_ci#define IWL_RATE_11M_MASK (1 << IWL_RATE_11M_INDEX) 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci/* uCode API values for legacy bit rates, both OFDM and CCK */ 9362306a36Sopenharmony_cienum { 9462306a36Sopenharmony_ci IWL_RATE_6M_PLCP = 13, 9562306a36Sopenharmony_ci IWL_RATE_9M_PLCP = 15, 9662306a36Sopenharmony_ci IWL_RATE_12M_PLCP = 5, 9762306a36Sopenharmony_ci IWL_RATE_18M_PLCP = 7, 9862306a36Sopenharmony_ci IWL_RATE_24M_PLCP = 9, 9962306a36Sopenharmony_ci IWL_RATE_36M_PLCP = 11, 10062306a36Sopenharmony_ci IWL_RATE_48M_PLCP = 1, 10162306a36Sopenharmony_ci IWL_RATE_54M_PLCP = 3, 10262306a36Sopenharmony_ci IWL_RATE_60M_PLCP = 3,/*FIXME:RS:should be removed*/ 10362306a36Sopenharmony_ci IWL_RATE_1M_PLCP = 10, 10462306a36Sopenharmony_ci IWL_RATE_2M_PLCP = 20, 10562306a36Sopenharmony_ci IWL_RATE_5M_PLCP = 55, 10662306a36Sopenharmony_ci IWL_RATE_11M_PLCP = 110, 10762306a36Sopenharmony_ci /*FIXME:RS:change to IWL_RATE_LEGACY_??M_PLCP */ 10862306a36Sopenharmony_ci /*FIXME:RS:add IWL_RATE_LEGACY_INVM_PLCP = 0,*/ 10962306a36Sopenharmony_ci}; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci/* uCode API values for OFDM high-throughput (HT) bit rates */ 11262306a36Sopenharmony_cienum { 11362306a36Sopenharmony_ci IWL_RATE_SISO_6M_PLCP = 0, 11462306a36Sopenharmony_ci IWL_RATE_SISO_12M_PLCP = 1, 11562306a36Sopenharmony_ci IWL_RATE_SISO_18M_PLCP = 2, 11662306a36Sopenharmony_ci IWL_RATE_SISO_24M_PLCP = 3, 11762306a36Sopenharmony_ci IWL_RATE_SISO_36M_PLCP = 4, 11862306a36Sopenharmony_ci IWL_RATE_SISO_48M_PLCP = 5, 11962306a36Sopenharmony_ci IWL_RATE_SISO_54M_PLCP = 6, 12062306a36Sopenharmony_ci IWL_RATE_SISO_60M_PLCP = 7, 12162306a36Sopenharmony_ci IWL_RATE_MIMO2_6M_PLCP = 0x8, 12262306a36Sopenharmony_ci IWL_RATE_MIMO2_12M_PLCP = 0x9, 12362306a36Sopenharmony_ci IWL_RATE_MIMO2_18M_PLCP = 0xa, 12462306a36Sopenharmony_ci IWL_RATE_MIMO2_24M_PLCP = 0xb, 12562306a36Sopenharmony_ci IWL_RATE_MIMO2_36M_PLCP = 0xc, 12662306a36Sopenharmony_ci IWL_RATE_MIMO2_48M_PLCP = 0xd, 12762306a36Sopenharmony_ci IWL_RATE_MIMO2_54M_PLCP = 0xe, 12862306a36Sopenharmony_ci IWL_RATE_MIMO2_60M_PLCP = 0xf, 12962306a36Sopenharmony_ci IWL_RATE_MIMO3_6M_PLCP = 0x10, 13062306a36Sopenharmony_ci IWL_RATE_MIMO3_12M_PLCP = 0x11, 13162306a36Sopenharmony_ci IWL_RATE_MIMO3_18M_PLCP = 0x12, 13262306a36Sopenharmony_ci IWL_RATE_MIMO3_24M_PLCP = 0x13, 13362306a36Sopenharmony_ci IWL_RATE_MIMO3_36M_PLCP = 0x14, 13462306a36Sopenharmony_ci IWL_RATE_MIMO3_48M_PLCP = 0x15, 13562306a36Sopenharmony_ci IWL_RATE_MIMO3_54M_PLCP = 0x16, 13662306a36Sopenharmony_ci IWL_RATE_MIMO3_60M_PLCP = 0x17, 13762306a36Sopenharmony_ci IWL_RATE_SISO_INVM_PLCP, 13862306a36Sopenharmony_ci IWL_RATE_MIMO2_INVM_PLCP = IWL_RATE_SISO_INVM_PLCP, 13962306a36Sopenharmony_ci IWL_RATE_MIMO3_INVM_PLCP = IWL_RATE_SISO_INVM_PLCP, 14062306a36Sopenharmony_ci}; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci/* MAC header values for bit rates */ 14362306a36Sopenharmony_cienum { 14462306a36Sopenharmony_ci IWL_RATE_6M_IEEE = 12, 14562306a36Sopenharmony_ci IWL_RATE_9M_IEEE = 18, 14662306a36Sopenharmony_ci IWL_RATE_12M_IEEE = 24, 14762306a36Sopenharmony_ci IWL_RATE_18M_IEEE = 36, 14862306a36Sopenharmony_ci IWL_RATE_24M_IEEE = 48, 14962306a36Sopenharmony_ci IWL_RATE_36M_IEEE = 72, 15062306a36Sopenharmony_ci IWL_RATE_48M_IEEE = 96, 15162306a36Sopenharmony_ci IWL_RATE_54M_IEEE = 108, 15262306a36Sopenharmony_ci IWL_RATE_60M_IEEE = 120, 15362306a36Sopenharmony_ci IWL_RATE_1M_IEEE = 2, 15462306a36Sopenharmony_ci IWL_RATE_2M_IEEE = 4, 15562306a36Sopenharmony_ci IWL_RATE_5M_IEEE = 11, 15662306a36Sopenharmony_ci IWL_RATE_11M_IEEE = 22, 15762306a36Sopenharmony_ci}; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci#define IWL_RATES_MASK ((1 << IWL_RATE_COUNT) - 1) 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci#define IWL_INVALID_VALUE -1 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci#define IWL_MIN_RSSI_VAL -100 16462306a36Sopenharmony_ci#define IWL_MAX_RSSI_VAL 0 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci/* These values specify how many Tx frame attempts before 16762306a36Sopenharmony_ci * searching for a new modulation mode */ 16862306a36Sopenharmony_ci#define IWL_LEGACY_FAILURE_LIMIT 160 16962306a36Sopenharmony_ci#define IWL_LEGACY_SUCCESS_LIMIT 480 17062306a36Sopenharmony_ci#define IWL_LEGACY_TABLE_COUNT 160 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci#define IWL_NONE_LEGACY_FAILURE_LIMIT 400 17362306a36Sopenharmony_ci#define IWL_NONE_LEGACY_SUCCESS_LIMIT 4500 17462306a36Sopenharmony_ci#define IWL_NONE_LEGACY_TABLE_COUNT 1500 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci/* Success ratio (ACKed / attempted tx frames) values (perfect is 128 * 100) */ 17762306a36Sopenharmony_ci#define IWL_RS_GOOD_RATIO 12800 /* 100% */ 17862306a36Sopenharmony_ci#define IWL_RATE_SCALE_SWITCH 10880 /* 85% */ 17962306a36Sopenharmony_ci#define IWL_RATE_HIGH_TH 10880 /* 85% */ 18062306a36Sopenharmony_ci#define IWL_RATE_INCREASE_TH 6400 /* 50% */ 18162306a36Sopenharmony_ci#define IWL_RATE_DECREASE_TH 1920 /* 15% */ 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci/* possible actions when in legacy mode */ 18462306a36Sopenharmony_ci#define IWL_LEGACY_SWITCH_ANTENNA1 0 18562306a36Sopenharmony_ci#define IWL_LEGACY_SWITCH_ANTENNA2 1 18662306a36Sopenharmony_ci#define IWL_LEGACY_SWITCH_SISO 2 18762306a36Sopenharmony_ci#define IWL_LEGACY_SWITCH_MIMO2_AB 3 18862306a36Sopenharmony_ci#define IWL_LEGACY_SWITCH_MIMO2_AC 4 18962306a36Sopenharmony_ci#define IWL_LEGACY_SWITCH_MIMO2_BC 5 19062306a36Sopenharmony_ci#define IWL_LEGACY_SWITCH_MIMO3_ABC 6 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci/* possible actions when in siso mode */ 19362306a36Sopenharmony_ci#define IWL_SISO_SWITCH_ANTENNA1 0 19462306a36Sopenharmony_ci#define IWL_SISO_SWITCH_ANTENNA2 1 19562306a36Sopenharmony_ci#define IWL_SISO_SWITCH_MIMO2_AB 2 19662306a36Sopenharmony_ci#define IWL_SISO_SWITCH_MIMO2_AC 3 19762306a36Sopenharmony_ci#define IWL_SISO_SWITCH_MIMO2_BC 4 19862306a36Sopenharmony_ci#define IWL_SISO_SWITCH_GI 5 19962306a36Sopenharmony_ci#define IWL_SISO_SWITCH_MIMO3_ABC 6 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci/* possible actions when in mimo mode */ 20362306a36Sopenharmony_ci#define IWL_MIMO2_SWITCH_ANTENNA1 0 20462306a36Sopenharmony_ci#define IWL_MIMO2_SWITCH_ANTENNA2 1 20562306a36Sopenharmony_ci#define IWL_MIMO2_SWITCH_SISO_A 2 20662306a36Sopenharmony_ci#define IWL_MIMO2_SWITCH_SISO_B 3 20762306a36Sopenharmony_ci#define IWL_MIMO2_SWITCH_SISO_C 4 20862306a36Sopenharmony_ci#define IWL_MIMO2_SWITCH_GI 5 20962306a36Sopenharmony_ci#define IWL_MIMO2_SWITCH_MIMO3_ABC 6 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci/* possible actions when in mimo3 mode */ 21362306a36Sopenharmony_ci#define IWL_MIMO3_SWITCH_ANTENNA1 0 21462306a36Sopenharmony_ci#define IWL_MIMO3_SWITCH_ANTENNA2 1 21562306a36Sopenharmony_ci#define IWL_MIMO3_SWITCH_SISO_A 2 21662306a36Sopenharmony_ci#define IWL_MIMO3_SWITCH_SISO_B 3 21762306a36Sopenharmony_ci#define IWL_MIMO3_SWITCH_SISO_C 4 21862306a36Sopenharmony_ci#define IWL_MIMO3_SWITCH_MIMO2_AB 5 21962306a36Sopenharmony_ci#define IWL_MIMO3_SWITCH_MIMO2_AC 6 22062306a36Sopenharmony_ci#define IWL_MIMO3_SWITCH_MIMO2_BC 7 22162306a36Sopenharmony_ci#define IWL_MIMO3_SWITCH_GI 8 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci#define IWL_MAX_11N_MIMO3_SEARCH IWL_MIMO3_SWITCH_GI 22562306a36Sopenharmony_ci#define IWL_MAX_SEARCH IWL_MIMO2_SWITCH_MIMO3_ABC 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci/*FIXME:RS:add possible actions for MIMO3*/ 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci#define IWL_ACTION_LIMIT 3 /* # possible actions */ 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci#define LQ_SIZE 2 /* 2 mode tables: "Active" and "Search" */ 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci/* load per tid defines for A-MPDU activation */ 23462306a36Sopenharmony_ci#define IWL_AGG_TPT_THREHOLD 0 23562306a36Sopenharmony_ci#define IWL_AGG_LOAD_THRESHOLD 10 23662306a36Sopenharmony_ci#define IWL_AGG_ALL_TID 0xff 23762306a36Sopenharmony_ci#define TID_QUEUE_CELL_SPACING 50 /*mS */ 23862306a36Sopenharmony_ci#define TID_QUEUE_MAX_SIZE 20 23962306a36Sopenharmony_ci#define TID_ROUND_VALUE 5 /* mS */ 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci#define TID_MAX_TIME_DIFF ((TID_QUEUE_MAX_SIZE - 1) * TID_QUEUE_CELL_SPACING) 24262306a36Sopenharmony_ci#define TIME_WRAP_AROUND(x, y) (((y) > (x)) ? (y) - (x) : (0-(x)) + (y)) 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ciextern const struct iwl_rate_info iwl_rates[IWL_RATE_COUNT]; 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_cienum iwl_table_type { 24762306a36Sopenharmony_ci LQ_NONE, 24862306a36Sopenharmony_ci LQ_G, /* legacy types */ 24962306a36Sopenharmony_ci LQ_A, 25062306a36Sopenharmony_ci LQ_SISO, /* high-throughput types */ 25162306a36Sopenharmony_ci LQ_MIMO2, 25262306a36Sopenharmony_ci LQ_MIMO3, 25362306a36Sopenharmony_ci LQ_MAX, 25462306a36Sopenharmony_ci}; 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci#define is_legacy(tbl) (((tbl) == LQ_G) || ((tbl) == LQ_A)) 25762306a36Sopenharmony_ci#define is_siso(tbl) ((tbl) == LQ_SISO) 25862306a36Sopenharmony_ci#define is_mimo2(tbl) ((tbl) == LQ_MIMO2) 25962306a36Sopenharmony_ci#define is_mimo3(tbl) ((tbl) == LQ_MIMO3) 26062306a36Sopenharmony_ci#define is_mimo(tbl) (is_mimo2(tbl) || is_mimo3(tbl)) 26162306a36Sopenharmony_ci#define is_Ht(tbl) (is_siso(tbl) || is_mimo(tbl)) 26262306a36Sopenharmony_ci#define is_a_band(tbl) ((tbl) == LQ_A) 26362306a36Sopenharmony_ci#define is_g_and(tbl) ((tbl) == LQ_G) 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci#define IWL_MAX_MCS_DISPLAY_SIZE 12 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_cistruct iwl_rate_mcs_info { 26862306a36Sopenharmony_ci char mbps[IWL_MAX_MCS_DISPLAY_SIZE]; 26962306a36Sopenharmony_ci char mcs[IWL_MAX_MCS_DISPLAY_SIZE]; 27062306a36Sopenharmony_ci}; 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci/** 27362306a36Sopenharmony_ci * struct iwl_rate_scale_data -- tx success history for one rate 27462306a36Sopenharmony_ci */ 27562306a36Sopenharmony_cistruct iwl_rate_scale_data { 27662306a36Sopenharmony_ci u64 data; /* bitmap of successful frames */ 27762306a36Sopenharmony_ci s32 success_counter; /* number of frames successful */ 27862306a36Sopenharmony_ci s32 success_ratio; /* per-cent * 128 */ 27962306a36Sopenharmony_ci s32 counter; /* number of frames attempted */ 28062306a36Sopenharmony_ci s32 average_tpt; /* success ratio * expected throughput */ 28162306a36Sopenharmony_ci unsigned long stamp; 28262306a36Sopenharmony_ci}; 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ci/** 28562306a36Sopenharmony_ci * struct iwl_scale_tbl_info -- tx params and success history for all rates 28662306a36Sopenharmony_ci * 28762306a36Sopenharmony_ci * There are two of these in struct iwl_lq_sta, 28862306a36Sopenharmony_ci * one for "active", and one for "search". 28962306a36Sopenharmony_ci */ 29062306a36Sopenharmony_cistruct iwl_scale_tbl_info { 29162306a36Sopenharmony_ci enum iwl_table_type lq_type; 29262306a36Sopenharmony_ci u8 ant_type; 29362306a36Sopenharmony_ci u8 is_SGI; /* 1 = short guard interval */ 29462306a36Sopenharmony_ci u8 is_ht40; /* 1 = 40 MHz channel width */ 29562306a36Sopenharmony_ci u8 is_dup; /* 1 = duplicated data streams */ 29662306a36Sopenharmony_ci u8 action; /* change modulation; IWL_[LEGACY/SISO/MIMO]_SWITCH_* */ 29762306a36Sopenharmony_ci u8 max_search; /* maximun number of tables we can search */ 29862306a36Sopenharmony_ci const u16 *expected_tpt; /* throughput metrics; expected_tpt_G, etc. */ 29962306a36Sopenharmony_ci u32 current_rate; /* rate_n_flags, uCode API format */ 30062306a36Sopenharmony_ci struct iwl_rate_scale_data win[IWL_RATE_COUNT]; /* rate histories */ 30162306a36Sopenharmony_ci}; 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_cistruct iwl_traffic_load { 30462306a36Sopenharmony_ci unsigned long time_stamp; /* age of the oldest statistics */ 30562306a36Sopenharmony_ci u32 packet_count[TID_QUEUE_MAX_SIZE]; /* packet count in this time 30662306a36Sopenharmony_ci * slice */ 30762306a36Sopenharmony_ci u32 total; /* total num of packets during the 30862306a36Sopenharmony_ci * last TID_MAX_TIME_DIFF */ 30962306a36Sopenharmony_ci u8 queue_count; /* number of queues that has 31062306a36Sopenharmony_ci * been used since the last cleanup */ 31162306a36Sopenharmony_ci u8 head; /* start of the circular buffer */ 31262306a36Sopenharmony_ci}; 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ci/** 31562306a36Sopenharmony_ci * struct iwl_lq_sta -- driver's rate scaling private structure 31662306a36Sopenharmony_ci * 31762306a36Sopenharmony_ci * Pointer to this gets passed back and forth between driver and mac80211. 31862306a36Sopenharmony_ci */ 31962306a36Sopenharmony_cistruct iwl_lq_sta { 32062306a36Sopenharmony_ci u8 active_tbl; /* index of active table, range 0-1 */ 32162306a36Sopenharmony_ci u8 enable_counter; /* indicates HT mode */ 32262306a36Sopenharmony_ci u8 stay_in_tbl; /* 1: disallow, 0: allow search for new mode */ 32362306a36Sopenharmony_ci u8 search_better_tbl; /* 1: currently trying alternate mode */ 32462306a36Sopenharmony_ci s32 last_tpt; 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci /* The following determine when to search for a new mode */ 32762306a36Sopenharmony_ci u32 table_count_limit; 32862306a36Sopenharmony_ci u32 max_failure_limit; /* # failed frames before new search */ 32962306a36Sopenharmony_ci u32 max_success_limit; /* # successful frames before new search */ 33062306a36Sopenharmony_ci u32 table_count; 33162306a36Sopenharmony_ci u32 total_failed; /* total failed frames, any/all rates */ 33262306a36Sopenharmony_ci u32 total_success; /* total successful frames, any/all rates */ 33362306a36Sopenharmony_ci u64 flush_timer; /* time staying in mode before new search */ 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci u8 action_counter; /* # mode-switch actions tried */ 33662306a36Sopenharmony_ci u8 is_green; 33762306a36Sopenharmony_ci u8 is_dup; 33862306a36Sopenharmony_ci enum nl80211_band band; 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ci /* The following are bitmaps of rates; IWL_RATE_6M_MASK, etc. */ 34162306a36Sopenharmony_ci u32 supp_rates; 34262306a36Sopenharmony_ci u16 active_legacy_rate; 34362306a36Sopenharmony_ci u16 active_siso_rate; 34462306a36Sopenharmony_ci u16 active_mimo2_rate; 34562306a36Sopenharmony_ci u16 active_mimo3_rate; 34662306a36Sopenharmony_ci s8 max_rate_idx; /* Max rate set by user */ 34762306a36Sopenharmony_ci u8 missed_rate_counter; 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci struct iwl_link_quality_cmd lq; 35062306a36Sopenharmony_ci struct iwl_scale_tbl_info lq_info[LQ_SIZE]; /* "active", "search" */ 35162306a36Sopenharmony_ci struct iwl_traffic_load load[IWL_MAX_TID_COUNT]; 35262306a36Sopenharmony_ci u8 tx_agg_tid_en; 35362306a36Sopenharmony_ci#ifdef CONFIG_MAC80211_DEBUGFS 35462306a36Sopenharmony_ci u32 dbg_fixed_rate; 35562306a36Sopenharmony_ci#endif 35662306a36Sopenharmony_ci struct iwl_priv *drv; 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci /* used to be in sta_info */ 35962306a36Sopenharmony_ci int last_txrate_idx; 36062306a36Sopenharmony_ci /* last tx rate_n_flags */ 36162306a36Sopenharmony_ci u32 last_rate_n_flags; 36262306a36Sopenharmony_ci /* packets destined for this STA are aggregated */ 36362306a36Sopenharmony_ci u8 is_agg; 36462306a36Sopenharmony_ci /* BT traffic this sta was last updated in */ 36562306a36Sopenharmony_ci u8 last_bt_traffic; 36662306a36Sopenharmony_ci}; 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_cistatic inline u8 first_antenna(u8 mask) 36962306a36Sopenharmony_ci{ 37062306a36Sopenharmony_ci if (mask & ANT_A) 37162306a36Sopenharmony_ci return ANT_A; 37262306a36Sopenharmony_ci if (mask & ANT_B) 37362306a36Sopenharmony_ci return ANT_B; 37462306a36Sopenharmony_ci return ANT_C; 37562306a36Sopenharmony_ci} 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ci/* Initialize station's rate scaling information after adding station */ 37962306a36Sopenharmony_civoid iwl_rs_rate_init(struct iwl_priv *priv, struct ieee80211_sta *sta, 38062306a36Sopenharmony_ci u8 sta_id); 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci/** 38362306a36Sopenharmony_ci * iwl_rate_control_register - Register the rate control algorithm callbacks 38462306a36Sopenharmony_ci * 38562306a36Sopenharmony_ci * Since the rate control algorithm is hardware specific, there is no need 38662306a36Sopenharmony_ci * or reason to place it as a stand alone module. The driver can call 38762306a36Sopenharmony_ci * iwl_rate_control_register in order to register the rate control callbacks 38862306a36Sopenharmony_ci * with the mac80211 subsystem. This should be performed prior to calling 38962306a36Sopenharmony_ci * ieee80211_register_hw 39062306a36Sopenharmony_ci * 39162306a36Sopenharmony_ci */ 39262306a36Sopenharmony_ciint iwlagn_rate_control_register(void); 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci/** 39562306a36Sopenharmony_ci * iwl_rate_control_unregister - Unregister the rate control callbacks 39662306a36Sopenharmony_ci * 39762306a36Sopenharmony_ci * This should be called after calling ieee80211_unregister_hw, but before 39862306a36Sopenharmony_ci * the driver is unloaded. 39962306a36Sopenharmony_ci */ 40062306a36Sopenharmony_civoid iwlagn_rate_control_unregister(void); 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_ci#endif /* __iwl_agn__rs__ */ 403