2012-04-09 17:46:59 -07:00
/******************************************************************************
*
* This file is provided under a dual BSD / GPLv2 license . When using or
* redistributing this file , you may do so under either license .
*
* GPL LICENSE SUMMARY
*
2013-12-30 13:15:54 +02:00
* Copyright ( c ) 2007 - 2014 Intel Corporation . All rights reserved .
2012-04-09 17:46:59 -07:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 ,
* USA
*
* The full GNU General Public License is included in this distribution
2013-02-18 09:22:28 +02:00
* in the file called COPYING .
2012-04-09 17:46:59 -07:00
*
* Contact Information :
* Intel Linux Wireless < ilw @ linux . intel . com >
* Intel Corporation , 5200 N . E . Elam Young Parkway , Hillsboro , OR 97124 - 6497
*
* BSD LICENSE
*
2013-12-30 13:15:54 +02:00
* Copyright ( c ) 2005 - 2014 Intel Corporation . All rights reserved .
2012-04-09 17:46:59 -07:00
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
*
* * Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* * Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in
* the documentation and / or other materials provided with the
* distribution .
* * Neither the name Intel Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* " AS IS " AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT
* LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL ,
* SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT
* LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# ifndef __IWL_CONFIG_H__
# define __IWL_CONFIG_H__
# include <linux/types.h>
# include <net/mac80211.h>
2012-04-09 17:47:00 -07:00
enum iwl_device_family {
IWL_DEVICE_FAMILY_UNDEFINED ,
IWL_DEVICE_FAMILY_1000 ,
IWL_DEVICE_FAMILY_100 ,
IWL_DEVICE_FAMILY_2000 ,
IWL_DEVICE_FAMILY_2030 ,
IWL_DEVICE_FAMILY_105 ,
IWL_DEVICE_FAMILY_135 ,
IWL_DEVICE_FAMILY_5000 ,
IWL_DEVICE_FAMILY_5150 ,
IWL_DEVICE_FAMILY_6000 ,
IWL_DEVICE_FAMILY_6000i ,
IWL_DEVICE_FAMILY_6005 ,
IWL_DEVICE_FAMILY_6030 ,
IWL_DEVICE_FAMILY_6050 ,
IWL_DEVICE_FAMILY_6150 ,
2013-01-24 13:52:01 +01:00
IWL_DEVICE_FAMILY_7000 ,
2013-11-20 07:28:58 +02:00
IWL_DEVICE_FAMILY_8000 ,
2012-04-09 17:47:00 -07:00
} ;
2014-09-29 08:27:56 +02:00
static inline bool iwl_has_secure_boot ( u32 hw_rev ,
enum iwl_device_family family )
{
/* return 1 only for family 8000 B0 */
if ( ( family = = IWL_DEVICE_FAMILY_8000 ) & & ( hw_rev & 0xC ) )
return 1 ;
return 0 ;
}
2012-04-09 17:46:59 -07:00
/*
* LED mode
* IWL_LED_DEFAULT : use device default
* IWL_LED_RF_STATE : turn LED on / off based on RF state
* LED ON = RF ON
* LED OFF = RF OFF
* IWL_LED_BLINK : adjust led blink rate based on blink table
* IWL_LED_DISABLE : led disabled
*/
enum iwl_led_mode {
IWL_LED_DEFAULT ,
IWL_LED_RF_STATE ,
IWL_LED_BLINK ,
IWL_LED_DISABLE ,
} ;
2012-04-03 20:34:46 +02:00
/*
* This is the threshold value of plcp error rate per 100 mSecs . It is
* used to set and check for the validity of plcp_delta .
*/
# define IWL_MAX_PLCP_ERR_THRESHOLD_MIN 1
# define IWL_MAX_PLCP_ERR_THRESHOLD_DEF 50
# define IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF 100
# define IWL_MAX_PLCP_ERR_EXT_LONG_THRESHOLD_DEF 200
# define IWL_MAX_PLCP_ERR_THRESHOLD_MAX 255
# define IWL_MAX_PLCP_ERR_THRESHOLD_DISABLE 0
2012-04-03 20:38:44 +02:00
/* TX queue watchdog timeouts in mSecs */
2012-05-30 09:14:41 +02:00
# define IWL_WATCHDOG_DISABLED 0
2012-04-03 20:38:44 +02:00
# define IWL_DEF_WD_TIMEOUT 2000
# define IWL_LONG_WD_TIMEOUT 10000
# define IWL_MAX_WD_TIMEOUT 120000
2014-08-26 11:23:11 +03:00
# define IWL_DEFAULT_MAX_TX_POWER 22
2012-04-03 20:38:44 +02:00
/* Antenna presence definitions */
# define ANT_NONE 0x0
# define ANT_A BIT(0)
# define ANT_B BIT(1)
# define ANT_C BIT(2)
# define ANT_AB (ANT_A | ANT_B)
# define ANT_AC (ANT_A | ANT_C)
# define ANT_BC (ANT_B | ANT_C)
# define ANT_ABC (ANT_A | ANT_B | ANT_C)
2013-11-07 19:38:04 +02:00
static inline u8 num_of_ant ( u8 mask )
{
return ! ! ( ( mask ) & ANT_A ) +
! ! ( ( mask ) & ANT_B ) +
! ! ( ( mask ) & ANT_C ) ;
}
2012-04-03 20:34:46 +02:00
2012-04-09 17:46:59 -07:00
/*
* @ max_ll_items : max number of OTP blocks
* @ shadow_ram_support : shadow support for OTP memory
* @ led_compensation : compensate on the led on / off time per HW according
* to the deviation to achieve the desired led frequency .
* The detail algorithm is described in iwl - led . c
* @ wd_timeout : TX queues watchdog timeout
* @ max_event_log_size : size of event log buffer size for ucode event logging
2012-05-16 22:54:30 +02:00
* @ shadow_reg_enable : HW shadow register support
2014-03-25 10:00:31 +02:00
* @ apmg_wake_up_wa : should the MAC access REQ be asserted when a command
* is in flight . This is due to a HW bug in 7260 , 3160 and 7265.
2014-04-13 10:49:16 +03:00
* @ scd_chain_ext_wa : should the chain extension feature in SCD be disabled .
2012-04-09 17:46:59 -07:00
*/
struct iwl_base_params {
int eeprom_size ;
int num_of_queues ; /* def: HW dependent */
2012-11-14 14:44:18 +02:00
/* for iwl_pcie_apm_init() */
2012-04-09 17:46:59 -07:00
u32 pll_cfg_val ;
const u16 max_ll_items ;
const bool shadow_ram_support ;
u16 led_compensation ;
unsigned int wd_timeout ;
u32 max_event_log_size ;
const bool shadow_reg_enable ;
2013-07-02 15:47:29 +03:00
const bool pcie_l1_allowed ;
2014-03-25 10:00:31 +02:00
const bool apmg_wake_up_wa ;
2014-04-13 10:49:16 +03:00
const bool scd_chain_ext_wa ;
2012-04-09 17:46:59 -07:00
} ;
2012-05-21 20:03:01 +02:00
2012-04-09 17:46:59 -07:00
/*
2013-11-12 22:37:28 +02:00
* @ stbc : support Tx STBC and 1 * SS Rx STBC
2014-08-09 10:57:59 +03:00
* @ ldpc : support Tx / Rx with LDPC
2012-04-09 17:46:59 -07:00
* @ use_rts_for_aggregation : use rts / cts protection for HT traffic
2012-05-21 20:03:01 +02:00
* @ ht40_bands : bitmap of bands ( using % IEEE80211_BAND_ * ) that support HT40
2012-04-09 17:46:59 -07:00
*/
struct iwl_ht_params {
2012-05-21 20:03:01 +02:00
enum ieee80211_smps_mode smps_mode ;
2012-04-09 17:46:59 -07:00
const bool ht_greenfield_support ; /* if used set to true */
2013-11-12 22:37:28 +02:00
const bool stbc ;
2014-08-09 10:57:59 +03:00
const bool ldpc ;
2012-04-09 17:46:59 -07:00
bool use_rts_for_aggregation ;
2012-05-21 20:03:01 +02:00
u8 ht40_bands ;
2012-04-09 17:46:59 -07:00
} ;
2012-05-21 11:55:54 +02:00
/*
* information on how to parse the EEPROM
*/
# define EEPROM_REG_BAND_1_CHANNELS 0x08
# define EEPROM_REG_BAND_2_CHANNELS 0x26
# define EEPROM_REG_BAND_3_CHANNELS 0x42
# define EEPROM_REG_BAND_4_CHANNELS 0x5C
# define EEPROM_REG_BAND_5_CHANNELS 0x74
# define EEPROM_REG_BAND_24_HT40_CHANNELS 0x82
# define EEPROM_REG_BAND_52_HT40_CHANNELS 0x92
# define EEPROM_6000_REG_BAND_24_HT40_CHANNELS 0x80
# define EEPROM_REGULATORY_BAND_NO_HT40 0
2014-04-22 10:47:48 +03:00
/* lower blocks contain EEPROM image and calibration data */
# define OTP_LOW_IMAGE_SIZE (2 * 512 * sizeof(u16)) /* 2 KB */
2014-05-11 09:44:17 +03:00
# define OTP_LOW_IMAGE_SIZE_FAMILY_7000 (16 * 512 * sizeof(u16)) /* 16 KB */
2014-04-22 10:47:48 +03:00
# define OTP_LOW_IMAGE_SIZE_FAMILY_8000 (32 * 512 * sizeof(u16)) /* 32 KB */
2012-05-21 11:55:54 +02:00
struct iwl_eeprom_params {
const u8 regulatory_bands [ 7 ] ;
bool enhanced_txpower ;
} ;
2014-01-16 21:12:02 -05:00
/* Tx-backoff power threshold
* @ pwr : The power limit in mw
* @ backoff : The tx - backoff in uSec
*/
struct iwl_pwr_tx_backoff {
u32 pwr ;
u32 backoff ;
} ;
2012-04-09 17:46:59 -07:00
/**
* struct iwl_cfg
* @ name : Offical name of the device
* @ fw_name_pre : Firmware filename prefix . The api version and extension
* ( . ucode ) will be added to filename before loading from disk . The
* filename is constructed as fw_name_pre < api > . ucode .
* @ ucode_api_max : Highest version of uCode API supported by driver .
* @ ucode_api_ok : oldest version of the uCode API that is OK to load
* without a warning , for use in transitions
* @ ucode_api_min : Lowest version of uCode API supported by driver .
* @ max_inst_size : The maximal length of the fw inst section
* @ max_data_size : The maximal length of the fw data section
* @ valid_tx_ant : valid transmit antenna
* @ valid_rx_ant : valid receive antenna
2014-09-10 11:00:16 +03:00
* @ non_shared_ant : the antenna that is for WiFi only
2012-12-01 20:59:49 +02:00
* @ nvm_ver : NVM version
* @ nvm_calib_ver : NVM calibration version
2012-04-09 17:46:59 -07:00
* @ lib : pointer to the lib ops
* @ base_params : pointer to basic parameters
2013-05-17 10:36:29 +02:00
* @ ht_params : point to ht parameters
2012-04-09 17:46:59 -07:00
* @ led_mode : 0 = blinking , 1 = On ( RF On ) / Off ( RF Off )
* @ rx_with_siso_diversity : 1 x1 device with rx antenna diversity
* @ internal_wimax_coex : internal wifi / wimax combo device
2013-07-24 14:49:18 +03:00
* @ high_temp : Is this NIC is designated to be in high temperature .
2013-11-11 15:23:01 +02:00
* @ host_interrupt_operation_mode : device needs host interrupt operation
* mode set
2013-11-21 12:28:17 +02:00
* @ d0i3 : device uses d0i3 instead of d3
2014-01-09 08:08:24 +02:00
* @ nvm_hw_section_num : the ID of the HW NVM section
2014-01-16 21:12:02 -05:00
* @ pwr_tx_backoffs : translation table between power limits and backoffs
2014-06-16 10:54:52 +03:00
* @ max_rx_agg_size : max RX aggregation size of the ADDBA request / response
2014-09-02 16:04:58 +02:00
* @ max_tx_agg_size : max TX aggregation size of the ADDBA request / response
2014-09-30 06:42:06 +02:00
* @ max_ht_ampdu_factor : the exponent of the max length of A - MPDU that the
* station can receive in HT
* @ max_vht_ampdu_exponent : the exponent of the max length of A - MPDU that the
* station can receive in VHT
2014-12-01 10:44:18 +02:00
* @ dccm_offset : offset from which DCCM begins
* @ dccm_len : length of DCCM ( including runtime stack CCM )
2014-12-02 11:16:04 +02:00
* @ smem_offset : offset from which the SMEM begins
* @ smem_len : the length of SMEM
2012-04-09 17:46:59 -07:00
*
* We enable the driver to be backward compatible wrt . hardware features .
* API differences in uCode shouldn ' t be handled here but through TLVs
* and / or the uCode API version instead .
*/
struct iwl_cfg {
/* params specific to an individual device within a device family */
const char * name ;
const char * fw_name_pre ;
const unsigned int ucode_api_max ;
const unsigned int ucode_api_ok ;
const unsigned int ucode_api_min ;
2012-04-09 17:47:00 -07:00
const enum iwl_device_family device_family ;
2012-04-09 17:46:59 -07:00
const u32 max_data_size ;
const u32 max_inst_size ;
u8 valid_tx_ant ;
u8 valid_rx_ant ;
2014-09-10 11:00:16 +03:00
u8 non_shared_ant ;
2013-06-18 05:34:58 +03:00
bool bt_shared_single_ant ;
2012-12-01 20:59:49 +02:00
u16 nvm_ver ;
u16 nvm_calib_ver ;
2012-04-09 17:46:59 -07:00
/* params not likely to change within a device family */
const struct iwl_base_params * base_params ;
/* params likely to change within a device family */
const struct iwl_ht_params * ht_params ;
2012-05-21 11:55:54 +02:00
const struct iwl_eeprom_params * eeprom_params ;
2012-04-09 17:46:59 -07:00
enum iwl_led_mode led_mode ;
const bool rx_with_siso_diversity ;
const bool internal_wimax_coex ;
2013-11-11 15:23:01 +02:00
const bool host_interrupt_operation_mode ;
2013-07-24 14:49:18 +03:00
bool high_temp ;
2013-11-21 12:28:17 +02:00
bool d0i3 ;
2014-01-09 08:08:24 +02:00
u8 nvm_hw_section_num ;
2014-02-18 16:45:00 +01:00
bool lp_xtal_workaround ;
2014-01-16 21:12:02 -05:00
const struct iwl_pwr_tx_backoff * pwr_tx_backoffs ;
2014-04-23 10:46:09 +03:00
bool no_power_up_nic_in_init ;
2014-05-07 12:27:10 +03:00
const char * default_nvm_file ;
2014-12-02 15:19:22 +02:00
const char * default_nvm_file_8000A ;
2014-06-16 10:54:52 +03:00
unsigned int max_rx_agg_size ;
2014-07-27 08:03:06 +03:00
bool disable_dummy_notification ;
2014-09-02 16:04:58 +02:00
unsigned int max_tx_agg_size ;
2014-09-30 06:42:06 +02:00
unsigned int max_ht_ampdu_exponent ;
unsigned int max_vht_ampdu_exponent ;
2014-12-01 10:44:18 +02:00
const u32 dccm_offset ;
const u32 dccm_len ;
2014-12-02 11:16:04 +02:00
const u32 smem_offset ;
const u32 smem_len ;
2012-04-09 17:46:59 -07:00
} ;
2013-02-20 12:41:58 +02:00
/*
* This list declares the config structures for all devices .
*/
2013-06-10 16:12:52 +02:00
# if IS_ENABLED(CONFIG_IWLDVM)
2013-02-20 12:41:58 +02:00
extern const struct iwl_cfg iwl5300_agn_cfg ;
extern const struct iwl_cfg iwl5100_agn_cfg ;
extern const struct iwl_cfg iwl5350_agn_cfg ;
extern const struct iwl_cfg iwl5100_bgn_cfg ;
extern const struct iwl_cfg iwl5100_abg_cfg ;
extern const struct iwl_cfg iwl5150_agn_cfg ;
extern const struct iwl_cfg iwl5150_abg_cfg ;
extern const struct iwl_cfg iwl6005_2agn_cfg ;
extern const struct iwl_cfg iwl6005_2abg_cfg ;
extern const struct iwl_cfg iwl6005_2bg_cfg ;
extern const struct iwl_cfg iwl6005_2agn_sff_cfg ;
extern const struct iwl_cfg iwl6005_2agn_d_cfg ;
extern const struct iwl_cfg iwl6005_2agn_mow1_cfg ;
extern const struct iwl_cfg iwl6005_2agn_mow2_cfg ;
extern const struct iwl_cfg iwl1030_bgn_cfg ;
extern const struct iwl_cfg iwl1030_bg_cfg ;
extern const struct iwl_cfg iwl6030_2agn_cfg ;
extern const struct iwl_cfg iwl6030_2abg_cfg ;
extern const struct iwl_cfg iwl6030_2bgn_cfg ;
extern const struct iwl_cfg iwl6030_2bg_cfg ;
extern const struct iwl_cfg iwl6000i_2agn_cfg ;
extern const struct iwl_cfg iwl6000i_2abg_cfg ;
extern const struct iwl_cfg iwl6000i_2bg_cfg ;
extern const struct iwl_cfg iwl6000_3agn_cfg ;
extern const struct iwl_cfg iwl6050_2agn_cfg ;
extern const struct iwl_cfg iwl6050_2abg_cfg ;
extern const struct iwl_cfg iwl6150_bgn_cfg ;
extern const struct iwl_cfg iwl6150_bg_cfg ;
extern const struct iwl_cfg iwl1000_bgn_cfg ;
extern const struct iwl_cfg iwl1000_bg_cfg ;
extern const struct iwl_cfg iwl100_bgn_cfg ;
extern const struct iwl_cfg iwl100_bg_cfg ;
extern const struct iwl_cfg iwl130_bgn_cfg ;
extern const struct iwl_cfg iwl130_bg_cfg ;
extern const struct iwl_cfg iwl2000_2bgn_cfg ;
extern const struct iwl_cfg iwl2000_2bgn_d_cfg ;
extern const struct iwl_cfg iwl2030_2bgn_cfg ;
extern const struct iwl_cfg iwl6035_2agn_cfg ;
2013-09-24 19:34:26 +03:00
extern const struct iwl_cfg iwl6035_2agn_sff_cfg ;
2013-02-20 12:41:58 +02:00
extern const struct iwl_cfg iwl105_bgn_cfg ;
extern const struct iwl_cfg iwl105_bgn_d_cfg ;
extern const struct iwl_cfg iwl135_bgn_cfg ;
2013-06-10 16:12:52 +02:00
# endif /* CONFIG_IWLDVM */
# if IS_ENABLED(CONFIG_IWLMVM)
2013-02-20 12:41:58 +02:00
extern const struct iwl_cfg iwl7260_2ac_cfg ;
2013-07-24 14:49:18 +03:00
extern const struct iwl_cfg iwl7260_2ac_cfg_high_temp ;
2013-04-23 18:19:11 +03:00
extern const struct iwl_cfg iwl7260_2n_cfg ;
extern const struct iwl_cfg iwl7260_n_cfg ;
extern const struct iwl_cfg iwl3160_2ac_cfg ;
extern const struct iwl_cfg iwl3160_2n_cfg ;
extern const struct iwl_cfg iwl3160_n_cfg ;
2014-09-08 08:57:05 +03:00
extern const struct iwl_cfg iwl3165_2ac_cfg ;
2013-10-08 08:03:07 +02:00
extern const struct iwl_cfg iwl7265_2ac_cfg ;
2013-11-19 03:48:19 +02:00
extern const struct iwl_cfg iwl7265_2n_cfg ;
extern const struct iwl_cfg iwl7265_n_cfg ;
2014-11-18 15:39:51 +01:00
extern const struct iwl_cfg iwl7265d_2ac_cfg ;
extern const struct iwl_cfg iwl7265d_2n_cfg ;
extern const struct iwl_cfg iwl7265d_n_cfg ;
2014-09-04 09:16:49 +02:00
extern const struct iwl_cfg iwl8260_2n_cfg ;
2013-11-20 07:28:58 +02:00
extern const struct iwl_cfg iwl8260_2ac_cfg ;
2014-06-01 14:55:21 +03:00
extern const struct iwl_cfg iwl8260_2ac_sdio_cfg ;
2014-12-01 11:40:46 +02:00
extern const struct iwl_cfg iwl4165_2ac_sdio_cfg ;
2013-06-10 16:12:52 +02:00
# endif /* CONFIG_IWLMVM */
2013-02-20 12:41:58 +02:00
2012-04-09 17:46:59 -07:00
# endif /* __IWL_CONFIG_H__ */