1b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/****************************************************************************** 2b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * 3fb4961dbc27d40cdbed297aa9bd74fa4a0e2ba6cWey-Yi Guy * Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved. 4b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * 5b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * This program is free software; you can redistribute it and/or modify it 6b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * under the terms of version 2 of the GNU General Public License as 7b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * published by the Free Software Foundation. 8b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * 9b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * This program is distributed in the hope that it will be useful, but WITHOUT 10b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * more details. 13b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * 14b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * You should have received a copy of the GNU General Public License along with 15b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * this program; if not, write to the Free Software Foundation, Inc., 16b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA 17b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * 18b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * The full GNU General Public License is included in this distribution in the 19b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * file called LICENSE. 20b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * 21b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * Contact Information: 22759ef89fb096c4a6ef078d3cfd5682ac037bd789Winkler, Tomas * Intel Linux Wireless <ilw@linux.intel.com> 23b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 24b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * 25b481de9ca074528fe8c429604e2777db8b89806aZhu Yi *****************************************************************************/ 26b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 27e227ceac8429ecd775c213838f0415700727b7b4Tomas Winkler#ifndef __iwl_agn_rs_h__ 28e227ceac8429ecd775c213838f0415700727b7b4Tomas Winkler#define __iwl_agn_rs_h__ 29b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 307bd9897e1a07d97e6297f38f741e2d1851e243b8Emmanuel Grumbach#include <net/mac80211.h> 317bd9897e1a07d97e6297f38f741e2d1851e243b8Emmanuel Grumbach 327bd9897e1a07d97e6297f38f741e2d1851e243b8Emmanuel Grumbach#include "iwl-commands.h" 337bd9897e1a07d97e6297f38f741e2d1851e243b8Emmanuel Grumbach 341826dcc094466a39c82d4370ccfba694be0bc05bTomas Winklerstruct iwl_rate_info { 357762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill u8 plcp; /* uCode API: IWL_RATE_6M_PLCP, etc. */ 367762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill u8 plcp_siso; /* uCode API: IWL_RATE_SISO_6M_PLCP, etc. */ 37fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen u8 plcp_mimo2; /* uCode API: IWL_RATE_MIMO2_6M_PLCP, etc. */ 38fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen u8 plcp_mimo3; /* uCode API: IWL_RATE_MIMO3_6M_PLCP, etc. */ 397762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill u8 ieee; /* MAC header: IWL_RATE_6M_IEEE, etc. */ 40b481de9ca074528fe8c429604e2777db8b89806aZhu Yi u8 prev_ieee; /* previous rate in IEEE speeds */ 41b481de9ca074528fe8c429604e2777db8b89806aZhu Yi u8 next_ieee; /* next rate in IEEE speeds */ 42b481de9ca074528fe8c429604e2777db8b89806aZhu Yi u8 prev_rs; /* previous rate used in rs algo */ 43b481de9ca074528fe8c429604e2777db8b89806aZhu Yi u8 next_rs; /* next rate used in rs algo */ 44b481de9ca074528fe8c429604e2777db8b89806aZhu Yi u8 prev_rs_tgg; /* previous rate used in TGG rs algo */ 45b481de9ca074528fe8c429604e2777db8b89806aZhu Yi u8 next_rs_tgg; /* next rate used in TGG rs algo */ 46b481de9ca074528fe8c429604e2777db8b89806aZhu Yi}; 47b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 489fbab5163aa8cb3a5aef845fbf67b0c1c85030b6Ben M Cahill/* 499fbab5163aa8cb3a5aef845fbf67b0c1c85030b6Ben M Cahill * These serve as indexes into 501826dcc094466a39c82d4370ccfba694be0bc05bTomas Winkler * struct iwl_rate_info iwl_rates[IWL_RATE_COUNT]; 519fbab5163aa8cb3a5aef845fbf67b0c1c85030b6Ben M Cahill */ 52b481de9ca074528fe8c429604e2777db8b89806aZhu Yienum { 53b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_1M_INDEX = 0, 54b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_2M_INDEX, 55b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_5M_INDEX, 56b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_11M_INDEX, 57b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_6M_INDEX, 58b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_9M_INDEX, 59b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_12M_INDEX, 60b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_18M_INDEX, 61b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_24M_INDEX, 62b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_36M_INDEX, 63b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_48M_INDEX, 64b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_54M_INDEX, 65b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_60M_INDEX, 66fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_COUNT, /*FIXME:RS:change to IWL_RATE_INDEX_COUNT,*/ 675027309b5581e9c251a46f0ecbf88996d5e0f1e0Daniel C Halperin IWL_RATE_COUNT_LEGACY = IWL_RATE_COUNT - 1, /* Excluding 60M */ 68b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_INVM_INDEX = IWL_RATE_COUNT, 69fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_INVALID = IWL_RATE_COUNT, 70b481de9ca074528fe8c429604e2777db8b89806aZhu Yi}; 71b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 72b481de9ca074528fe8c429604e2777db8b89806aZhu Yienum { 73d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz IWL_RATE_6M_INDEX_TABLE = 0, 74d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz IWL_RATE_9M_INDEX_TABLE, 75d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz IWL_RATE_12M_INDEX_TABLE, 76d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz IWL_RATE_18M_INDEX_TABLE, 77d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz IWL_RATE_24M_INDEX_TABLE, 78d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz IWL_RATE_36M_INDEX_TABLE, 79d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz IWL_RATE_48M_INDEX_TABLE, 80d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz IWL_RATE_54M_INDEX_TABLE, 81d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz IWL_RATE_1M_INDEX_TABLE, 82d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz IWL_RATE_2M_INDEX_TABLE, 83d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz IWL_RATE_5M_INDEX_TABLE, 84d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz IWL_RATE_11M_INDEX_TABLE, 85d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz IWL_RATE_INVM_INDEX_TABLE = IWL_RATE_INVM_INDEX - 1, 86d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz}; 87d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortiz 88d9829a67f953379b5cab6b78ae8f7a879a591eb1Samuel Ortizenum { 89b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_FIRST_OFDM_RATE = IWL_RATE_6M_INDEX, 90b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_LAST_OFDM_RATE = IWL_RATE_60M_INDEX, 91b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_FIRST_CCK_RATE = IWL_RATE_1M_INDEX, 92b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_LAST_CCK_RATE = IWL_RATE_11M_INDEX, 93b481de9ca074528fe8c429604e2777db8b89806aZhu Yi}; 94b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 95b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/* #define vs. enum to keep from defaulting to 'large integer' */ 968a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define IWL_RATE_6M_MASK (1 << IWL_RATE_6M_INDEX) 978a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define IWL_RATE_9M_MASK (1 << IWL_RATE_9M_INDEX) 988a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define IWL_RATE_12M_MASK (1 << IWL_RATE_12M_INDEX) 998a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define IWL_RATE_18M_MASK (1 << IWL_RATE_18M_INDEX) 1008a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define IWL_RATE_24M_MASK (1 << IWL_RATE_24M_INDEX) 1018a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define IWL_RATE_36M_MASK (1 << IWL_RATE_36M_INDEX) 1028a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define IWL_RATE_48M_MASK (1 << IWL_RATE_48M_INDEX) 1038a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define IWL_RATE_54M_MASK (1 << IWL_RATE_54M_INDEX) 1048a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define IWL_RATE_60M_MASK (1 << IWL_RATE_60M_INDEX) 1058a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define IWL_RATE_1M_MASK (1 << IWL_RATE_1M_INDEX) 1068a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define IWL_RATE_2M_MASK (1 << IWL_RATE_2M_INDEX) 1078a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define IWL_RATE_5M_MASK (1 << IWL_RATE_5M_INDEX) 1088a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define IWL_RATE_11M_MASK (1 << IWL_RATE_11M_INDEX) 109b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 110e227ceac8429ecd775c213838f0415700727b7b4Tomas Winkler/* uCode API values for legacy bit rates, both OFDM and CCK */ 111b481de9ca074528fe8c429604e2777db8b89806aZhu Yienum { 112b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_6M_PLCP = 13, 113b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_9M_PLCP = 15, 114b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_12M_PLCP = 5, 115b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_18M_PLCP = 7, 116b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_24M_PLCP = 9, 117b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_36M_PLCP = 11, 118b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_48M_PLCP = 1, 119b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_54M_PLCP = 3, 120fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_60M_PLCP = 3,/*FIXME:RS:should be removed*/ 121b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_1M_PLCP = 10, 122b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_2M_PLCP = 20, 123b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_5M_PLCP = 55, 124b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_11M_PLCP = 110, 125fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen /*FIXME:RS:change to IWL_RATE_LEGACY_??M_PLCP */ 126fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen /*FIXME:RS:add IWL_RATE_LEGACY_INVM_PLCP = 0,*/ 127b481de9ca074528fe8c429604e2777db8b89806aZhu Yi}; 128b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 129e227ceac8429ecd775c213838f0415700727b7b4Tomas Winkler/* uCode API values for OFDM high-throughput (HT) bit rates */ 130b481de9ca074528fe8c429604e2777db8b89806aZhu Yienum { 131b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_SISO_6M_PLCP = 0, 132b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_SISO_12M_PLCP = 1, 133b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_SISO_18M_PLCP = 2, 134b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_SISO_24M_PLCP = 3, 135b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_SISO_36M_PLCP = 4, 136b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_SISO_48M_PLCP = 5, 137b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_SISO_54M_PLCP = 6, 138b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_SISO_60M_PLCP = 7, 139fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_MIMO2_6M_PLCP = 0x8, 140fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_MIMO2_12M_PLCP = 0x9, 141fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_MIMO2_18M_PLCP = 0xa, 142fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_MIMO2_24M_PLCP = 0xb, 143fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_MIMO2_36M_PLCP = 0xc, 144fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_MIMO2_48M_PLCP = 0xd, 145fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_MIMO2_54M_PLCP = 0xe, 146fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_MIMO2_60M_PLCP = 0xf, 147fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_MIMO3_6M_PLCP = 0x10, 148fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_MIMO3_12M_PLCP = 0x11, 149fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_MIMO3_18M_PLCP = 0x12, 150fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_MIMO3_24M_PLCP = 0x13, 151fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_MIMO3_36M_PLCP = 0x14, 152fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_MIMO3_48M_PLCP = 0x15, 153fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_MIMO3_54M_PLCP = 0x16, 154fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_MIMO3_60M_PLCP = 0x17, 155b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_SISO_INVM_PLCP, 156fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_MIMO2_INVM_PLCP = IWL_RATE_SISO_INVM_PLCP, 157fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen IWL_RATE_MIMO3_INVM_PLCP = IWL_RATE_SISO_INVM_PLCP, 158b481de9ca074528fe8c429604e2777db8b89806aZhu Yi}; 159b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 1607762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill/* MAC header values for bit rates */ 161b481de9ca074528fe8c429604e2777db8b89806aZhu Yienum { 162b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_6M_IEEE = 12, 163b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_9M_IEEE = 18, 164b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_12M_IEEE = 24, 165b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_18M_IEEE = 36, 166b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_24M_IEEE = 48, 167b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_36M_IEEE = 72, 168b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_48M_IEEE = 96, 169b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_54M_IEEE = 108, 170b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_60M_IEEE = 120, 171b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_1M_IEEE = 2, 172b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_2M_IEEE = 4, 173b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_5M_IEEE = 11, 174b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_11M_IEEE = 22, 175b481de9ca074528fe8c429604e2777db8b89806aZhu Yi}; 176b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 177b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_CCK_BASIC_RATES_MASK \ 178b481de9ca074528fe8c429604e2777db8b89806aZhu Yi (IWL_RATE_1M_MASK | \ 179b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_2M_MASK) 180b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 181b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_CCK_RATES_MASK \ 1827ae810776a51dc4dc6580013b0f6ba0f34d2b165Johannes Berg (IWL_CCK_BASIC_RATES_MASK | \ 183b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_5M_MASK | \ 184b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_11M_MASK) 185b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 186b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_OFDM_BASIC_RATES_MASK \ 187b481de9ca074528fe8c429604e2777db8b89806aZhu Yi (IWL_RATE_6M_MASK | \ 188b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_12M_MASK | \ 189b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_24M_MASK) 190b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 191b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_OFDM_RATES_MASK \ 192b481de9ca074528fe8c429604e2777db8b89806aZhu Yi (IWL_OFDM_BASIC_RATES_MASK | \ 193b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_9M_MASK | \ 194b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_18M_MASK | \ 195b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_36M_MASK | \ 196b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_48M_MASK | \ 197b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_RATE_54M_MASK) 198b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 199b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_BASIC_RATES_MASK \ 200b481de9ca074528fe8c429604e2777db8b89806aZhu Yi (IWL_OFDM_BASIC_RATES_MASK | \ 201b481de9ca074528fe8c429604e2777db8b89806aZhu Yi IWL_CCK_BASIC_RATES_MASK) 202b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 2038a1b02452862dd30980ad0ef493eed687bc81474Reinette Chatre#define IWL_RATES_MASK ((1 << IWL_RATE_COUNT) - 1) 204b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 205b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_INVALID_VALUE -1 206b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 207b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_MIN_RSSI_VAL -100 208b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_MAX_RSSI_VAL 0 209b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 2107762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill/* These values specify how many Tx frame attempts before 2117762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill * searching for a new modulation mode */ 212b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_LEGACY_FAILURE_LIMIT 160 213b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_LEGACY_SUCCESS_LIMIT 480 214b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_LEGACY_TABLE_COUNT 160 215b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 216b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_NONE_LEGACY_FAILURE_LIMIT 400 217b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_NONE_LEGACY_SUCCESS_LIMIT 4500 218b481de9ca074528fe8c429604e2777db8b89806aZhu Yi#define IWL_NONE_LEGACY_TABLE_COUNT 1500 219b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 2207762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill/* Success ratio (ACKed / attempted tx frames) values (perfect is 128 * 100) */ 2217762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill#define IWL_RS_GOOD_RATIO 12800 /* 100% */ 2227762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill#define IWL_RATE_SCALE_SWITCH 10880 /* 85% */ 2237762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill#define IWL_RATE_HIGH_TH 10880 /* 85% */ 2248fe723117a8ef543b6e68ba24e50e1c15250f6c5Wey-Yi Guy#define IWL_RATE_INCREASE_TH 6400 /* 50% */ 2257762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill#define IWL_RATE_DECREASE_TH 1920 /* 15% */ 226b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 2277762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill/* possible actions when in legacy mode */ 2283110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_LEGACY_SWITCH_ANTENNA1 0 2293110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_LEGACY_SWITCH_ANTENNA2 1 2303110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_LEGACY_SWITCH_SISO 2 2313110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_LEGACY_SWITCH_MIMO2_AB 3 2323110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_LEGACY_SWITCH_MIMO2_AC 4 2333110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_LEGACY_SWITCH_MIMO2_BC 5 234584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_LEGACY_SWITCH_MIMO3_ABC 6 2357762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill 2367762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill/* possible actions when in siso mode */ 2373110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_SISO_SWITCH_ANTENNA1 0 2383110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_SISO_SWITCH_ANTENNA2 1 2393110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_SISO_SWITCH_MIMO2_AB 2 2403110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_SISO_SWITCH_MIMO2_AC 3 2413110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_SISO_SWITCH_MIMO2_BC 4 2423110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_SISO_SWITCH_GI 5 243584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_SISO_SWITCH_MIMO3_ABC 6 244584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy 245b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 2467762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill/* possible actions when in mimo mode */ 2473110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_MIMO2_SWITCH_ANTENNA1 0 2483110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_MIMO2_SWITCH_ANTENNA2 1 2493110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_MIMO2_SWITCH_SISO_A 2 2503110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_MIMO2_SWITCH_SISO_B 3 2513110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_MIMO2_SWITCH_SISO_C 4 2523110bef78cb4282c58245bc8fd6d95d9ccb19749Guy Cohen#define IWL_MIMO2_SWITCH_GI 5 253584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_MIMO2_SWITCH_MIMO3_ABC 6 254584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy 255584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy 256584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy/* possible actions when in mimo3 mode */ 257584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_MIMO3_SWITCH_ANTENNA1 0 258584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_MIMO3_SWITCH_ANTENNA2 1 259584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_MIMO3_SWITCH_SISO_A 2 260584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_MIMO3_SWITCH_SISO_B 3 261584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_MIMO3_SWITCH_SISO_C 4 262584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_MIMO3_SWITCH_MIMO2_AB 5 263584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_MIMO3_SWITCH_MIMO2_AC 6 264584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_MIMO3_SWITCH_MIMO2_BC 7 265584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy#define IWL_MIMO3_SWITCH_GI 8 266584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy 267584a0f00636d34f71a80f5b550a305f1a1620693Wey-Yi Guy 268d6e933993fdad4a270c557fa5317f668bef1d824Mohamed Abbas#define IWL_MAX_11N_MIMO3_SEARCH IWL_MIMO3_SWITCH_GI 269d6e933993fdad4a270c557fa5317f668bef1d824Mohamed Abbas#define IWL_MAX_SEARCH IWL_MIMO2_SWITCH_MIMO3_ABC 270fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen 271a96a27f97f2bbfc1fca54bc3c0b0d41484152740Tomas Winkler/*FIXME:RS:add possible actions for MIMO3*/ 272fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen 2737762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill#define IWL_ACTION_LIMIT 3 /* # possible actions */ 2747762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill 2757762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill#define LQ_SIZE 2 /* 2 mode tables: "Active" and "Search" */ 276b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 2770c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky/* load per tid defines for A-MPDU activation */ 2780c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky#define IWL_AGG_TPT_THREHOLD 0 2790c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky#define IWL_AGG_LOAD_THRESHOLD 10 2800c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky#define IWL_AGG_ALL_TID 0xff 2810c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky#define TID_QUEUE_CELL_SPACING 50 /*mS */ 2820c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky#define TID_QUEUE_MAX_SIZE 20 2830c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky#define TID_ROUND_VALUE 5 /* mS */ 2840c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky 2850c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky#define TID_MAX_TIME_DIFF ((TID_QUEUE_MAX_SIZE - 1) * TID_QUEUE_CELL_SPACING) 2860c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky#define TIME_WRAP_AROUND(x, y) (((y) > (x)) ? (y) - (x) : (0-(x)) + (y)) 2870c11b4de5d81771ba0fdc8a5d13d59ed01d41252Ron Rindjunsky 2881826dcc094466a39c82d4370ccfba694be0bc05bTomas Winklerextern const struct iwl_rate_info iwl_rates[IWL_RATE_COUNT]; 289b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 290fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohenenum iwl_table_type { 291b481de9ca074528fe8c429604e2777db8b89806aZhu Yi LQ_NONE, 2927762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill LQ_G, /* legacy types */ 293b481de9ca074528fe8c429604e2777db8b89806aZhu Yi LQ_A, 2947762635547ad31ecb045e7073989e76ae13e6c54Ben M Cahill LQ_SISO, /* high-throughput types */ 295fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen LQ_MIMO2, 296fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen LQ_MIMO3, 297b481de9ca074528fe8c429604e2777db8b89806aZhu Yi LQ_MAX, 298b481de9ca074528fe8c429604e2777db8b89806aZhu Yi}; 299b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 30081cd110d818dd4649cbac17f95f698a24c7acc45Ben M Cahill#define is_legacy(tbl) (((tbl) == LQ_G) || ((tbl) == LQ_A)) 301fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define is_siso(tbl) ((tbl) == LQ_SISO) 302fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define is_mimo2(tbl) ((tbl) == LQ_MIMO2) 303fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define is_mimo3(tbl) ((tbl) == LQ_MIMO3) 304fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define is_mimo(tbl) (is_mimo2(tbl) || is_mimo3(tbl)) 30581cd110d818dd4649cbac17f95f698a24c7acc45Ben M Cahill#define is_Ht(tbl) (is_siso(tbl) || is_mimo(tbl)) 306fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define is_a_band(tbl) ((tbl) == LQ_A) 307fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define is_g_and(tbl) ((tbl) == LQ_G) 308fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen 309fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define ANT_NONE 0x0 310fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define ANT_A BIT(0) 311fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define ANT_B BIT(1) 312fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define ANT_AB (ANT_A | ANT_B) 313fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define ANT_C BIT(2) 314fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define ANT_AC (ANT_A | ANT_C) 315fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define ANT_BC (ANT_B | ANT_C) 316fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen#define ANT_ABC (ANT_AB | ANT_C) 317fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen 31812b9681721adb34b7ec42aa973ab96692998153dWey-Yi Guy#define IWL_MAX_MCS_DISPLAY_SIZE 12 31912b9681721adb34b7ec42aa973ab96692998153dWey-Yi Guy 32012b9681721adb34b7ec42aa973ab96692998153dWey-Yi Guystruct iwl_rate_mcs_info { 32112b9681721adb34b7ec42aa973ab96692998153dWey-Yi Guy char mbps[IWL_MAX_MCS_DISPLAY_SIZE]; 32212b9681721adb34b7ec42aa973ab96692998153dWey-Yi Guy char mcs[IWL_MAX_MCS_DISPLAY_SIZE]; 32312b9681721adb34b7ec42aa973ab96692998153dWey-Yi Guy}; 32412b9681721adb34b7ec42aa973ab96692998153dWey-Yi Guy 325cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre/** 326cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre * struct iwl_rate_scale_data -- tx success history for one rate 327cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre */ 328cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatrestruct iwl_rate_scale_data { 329cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u64 data; /* bitmap of successful frames */ 330cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre s32 success_counter; /* number of frames successful */ 331cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre s32 success_ratio; /* per-cent * 128 */ 332cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre s32 counter; /* number of frames attempted */ 333cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre s32 average_tpt; /* success ratio * expected throughput */ 334cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre unsigned long stamp; 335cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre}; 336cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre 337cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre/** 338cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre * struct iwl_scale_tbl_info -- tx params and success history for all rates 339cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre * 340cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre * There are two of these in struct iwl_lq_sta, 341cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre * one for "active", and one for "search". 342cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre */ 343cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatrestruct iwl_scale_tbl_info { 344cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre enum iwl_table_type lq_type; 345cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u8 ant_type; 346cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u8 is_SGI; /* 1 = short guard interval */ 347cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u8 is_ht40; /* 1 = 40 MHz channel width */ 348cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u8 is_dup; /* 1 = duplicated data streams */ 349cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u8 action; /* change modulation; IWL_[LEGACY/SISO/MIMO]_SWITCH_* */ 350cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u8 max_search; /* maximun number of tables we can search */ 351cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre s32 *expected_tpt; /* throughput metrics; expected_tpt_G, etc. */ 352cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u32 current_rate; /* rate_n_flags, uCode API format */ 353cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre struct iwl_rate_scale_data win[IWL_RATE_COUNT]; /* rate histories */ 354cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre}; 355cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre 356cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatrestruct iwl_traffic_load { 357cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre unsigned long time_stamp; /* age of the oldest statistics */ 358cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u32 packet_count[TID_QUEUE_MAX_SIZE]; /* packet count in this time 359cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre * slice */ 360cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u32 total; /* total num of packets during the 361cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre * last TID_MAX_TIME_DIFF */ 362cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u8 queue_count; /* number of queues that has 363cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre * been used since the last cleanup */ 364cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u8 head; /* start of the circular buffer */ 365cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre}; 366cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre 367cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre/** 368cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre * struct iwl_lq_sta -- driver's rate scaling private structure 369cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre * 370cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre * Pointer to this gets passed back and forth between driver and mac80211. 371cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre */ 372cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatrestruct iwl_lq_sta { 373cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u8 active_tbl; /* index of active table, range 0-1 */ 374cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u8 enable_counter; /* indicates HT mode */ 375cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u8 stay_in_tbl; /* 1: disallow, 0: allow search for new mode */ 376cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u8 search_better_tbl; /* 1: currently trying alternate mode */ 377cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre s32 last_tpt; 378cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre 379cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre /* The following determine when to search for a new mode */ 380cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u32 table_count_limit; 381cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u32 max_failure_limit; /* # failed frames before new search */ 382cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u32 max_success_limit; /* # successful frames before new search */ 383cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u32 table_count; 384cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u32 total_failed; /* total failed frames, any/all rates */ 385cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u32 total_success; /* total successful frames, any/all rates */ 386cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u64 flush_timer; /* time staying in mode before new search */ 387cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre 388cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u8 action_counter; /* # mode-switch actions tried */ 389cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u8 is_green; 390cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u8 is_dup; 391cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre enum ieee80211_band band; 392cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre 393cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre /* The following are bitmaps of rates; IWL_RATE_6M_MASK, etc. */ 394cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u32 supp_rates; 395cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u16 active_legacy_rate; 396cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u16 active_siso_rate; 397cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u16 active_mimo2_rate; 398cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u16 active_mimo3_rate; 399cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre s8 max_rate_idx; /* Max rate set by user */ 400cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u8 missed_rate_counter; 401cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre 402cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre struct iwl_link_quality_cmd lq; 403cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre struct iwl_scale_tbl_info lq_info[LQ_SIZE]; /* "active", "search" */ 404a844855344b035338bfbcb1d2b7ed0aaca241a95Johannes Berg struct iwl_traffic_load load[IWL_MAX_TID_COUNT]; 405cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u8 tx_agg_tid_en; 406cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre#ifdef CONFIG_MAC80211_DEBUGFS 407cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre struct dentry *rs_sta_dbgfs_scale_table_file; 408cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre struct dentry *rs_sta_dbgfs_stats_table_file; 409cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre struct dentry *rs_sta_dbgfs_rate_scale_data_file; 410cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre struct dentry *rs_sta_dbgfs_tx_agg_tid_en_file; 411cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u32 dbg_fixed_rate; 412cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre#endif 413cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre struct iwl_priv *drv; 414cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre 415cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre /* used to be in sta_info */ 416cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre int last_txrate_idx; 417cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre /* last tx rate_n_flags */ 418cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u32 last_rate_n_flags; 419cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre /* packets destined for this STA are aggregated */ 420cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre u8 is_agg; 421290f599cc6ee8c769355486b7d98fd1dc5115d76Johannes Berg /* BT traffic this sta was last updated in */ 422290f599cc6ee8c769355486b7d98fd1dc5115d76Johannes Berg u8 last_bt_traffic; 423cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre}; 424cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6Reinette Chatre 425fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohenstatic inline u8 num_of_ant(u8 mask) 426fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen{ 427fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen return !!((mask) & ANT_A) + 428fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen !!((mask) & ANT_B) + 429fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen !!((mask) & ANT_C); 430fde0db310fd4979e0d8e6ba009975d23cc7e65acGuy Cohen} 431b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 4325d664a41a0a8c612f66bcb3c2a6f395e9afa6bebTomas Winklerstatic inline u8 first_antenna(u8 mask) 4335d664a41a0a8c612f66bcb3c2a6f395e9afa6bebTomas Winkler{ 4345d664a41a0a8c612f66bcb3c2a6f395e9afa6bebTomas Winkler if (mask & ANT_A) 4355d664a41a0a8c612f66bcb3c2a6f395e9afa6bebTomas Winkler return ANT_A; 4365d664a41a0a8c612f66bcb3c2a6f395e9afa6bebTomas Winkler if (mask & ANT_B) 4375d664a41a0a8c612f66bcb3c2a6f395e9afa6bebTomas Winkler return ANT_B; 4385d664a41a0a8c612f66bcb3c2a6f395e9afa6bebTomas Winkler return ANT_C; 4395d664a41a0a8c612f66bcb3c2a6f395e9afa6bebTomas Winkler} 4405d664a41a0a8c612f66bcb3c2a6f395e9afa6bebTomas Winkler 4415d664a41a0a8c612f66bcb3c2a6f395e9afa6bebTomas Winkler 442fe6b23dd361199bfbc50b0cbce6bed37c5797c75Reinette Chatre/* Initialize station's rate scaling information after adding station */ 443fe6b23dd361199bfbc50b0cbce6bed37c5797c75Reinette Chatreextern void iwl_rs_rate_init(struct iwl_priv *priv, 444fe6b23dd361199bfbc50b0cbce6bed37c5797c75Reinette Chatre struct ieee80211_sta *sta, u8 sta_id); 445fe6b23dd361199bfbc50b0cbce6bed37c5797c75Reinette Chatre 446b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/** 447eb4779c40549f8e0dd45c9a30f279134c9a86131Winkler, Tomas * iwl_rate_control_register - Register the rate control algorithm callbacks 448b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * 449b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * Since the rate control algorithm is hardware specific, there is no need 450b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * or reason to place it as a stand alone module. The driver can call 451eb4779c40549f8e0dd45c9a30f279134c9a86131Winkler, Tomas * iwl_rate_control_register in order to register the rate control callbacks 452b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * with the mac80211 subsystem. This should be performed prior to calling 453b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * ieee80211_register_hw 454b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * 455b481de9ca074528fe8c429604e2777db8b89806aZhu Yi */ 456e227ceac8429ecd775c213838f0415700727b7b4Tomas Winklerextern int iwlagn_rate_control_register(void); 457b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 458b481de9ca074528fe8c429604e2777db8b89806aZhu Yi/** 459eb4779c40549f8e0dd45c9a30f279134c9a86131Winkler, Tomas * iwl_rate_control_unregister - Unregister the rate control callbacks 460b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * 461b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * This should be called after calling ieee80211_unregister_hw, but before 462b481de9ca074528fe8c429604e2777db8b89806aZhu Yi * the driver is unloaded. 463b481de9ca074528fe8c429604e2777db8b89806aZhu Yi */ 464e227ceac8429ecd775c213838f0415700727b7b4Tomas Winklerextern void iwlagn_rate_control_unregister(void); 465b481de9ca074528fe8c429604e2777db8b89806aZhu Yi 466e227ceac8429ecd775c213838f0415700727b7b4Tomas Winkler#endif /* __iwl_agn__rs__ */ 467