1e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg/****************************************************************************** 2e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * 3901069c71415a76d731857ccda814e18ded062f7Wey-Yi Guy * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. 4e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * 5e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * This program is free software; you can redistribute it and/or modify it 6e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * under the terms of version 2 of the GNU General Public License as 7e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * published by the Free Software Foundation. 8e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * 9e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * This program is distributed in the hope that it will be useful, but WITHOUT 10e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * more details. 13e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * 14e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * You should have received a copy of the GNU General Public License along with 15e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * this program; if not, write to the Free Software Foundation, Inc., 16e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA 17e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * 18e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * The full GNU General Public License is included in this distribution in the 19e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * file called LICENSE. 20e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * 21e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * Contact Information: 22e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * Intel Linux Wireless <ilw@linux.intel.com> 23e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 24e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg * 25e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg *****************************************************************************/ 26e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg 27e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg#include <linux/kernel.h> 28e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg#include <linux/module.h> 29e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg#include <linux/init.h> 30e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg#include <linux/delay.h> 31e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg#include <linux/skbuff.h> 32e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg#include <linux/netdevice.h> 33e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg#include <net/mac80211.h> 34e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg#include <linux/etherdevice.h> 35e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg#include <asm/unaligned.h> 368fcbd4dc7a1b338b393dcd6869deb1725cf1a9f3Evgeni Golov#include <linux/stringify.h> 37e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg 38e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg#include "iwl-eeprom.h" 39e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg#include "iwl-dev.h" 40e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg#include "iwl-core.h" 41e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg#include "iwl-io.h" 42a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg#include "iwl-agn.h" 4319e6cda094002e9756a3d181cbb4c31ef2a9b6bbWey-Yi Guy#include "iwl-agn-hw.h" 44bdfbf0924ab05e02d28e50bd2d5024097642a78dEmmanuel Grumbach#include "iwl-trans.h" 4548f20d354e729afcfb29ff41aca7583ebb94613dEmmanuel Grumbach#include "iwl-shared.h" 46cebcbd752a2e8b3a4da1d554cc570fc5310af057Johannes Berg#include "iwl-cfg.h" 47e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg 48e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg/* Highest firmware API version supported */ 49b914811524fbe9e91fe50845f5d7bd4316b8a6eeJohannes Berg#define IWL6000_UCODE_API_MAX 6 5062cb3c6ac47a5ab7d8c67dbbf8cbdcd5ae735410Wey-Yi Guy#define IWL6050_UCODE_API_MAX 5 51ca9a46056908d3cade6957b3d5b2e698356b29fcJohannes Berg#define IWL6000G2_UCODE_API_MAX 6 52ca9a46056908d3cade6957b3d5b2e698356b29fcJohannes Berg 53ca9a46056908d3cade6957b3d5b2e698356b29fcJohannes Berg/* Oldest version we won't warn about */ 54b914811524fbe9e91fe50845f5d7bd4316b8a6eeJohannes Berg#define IWL6000_UCODE_API_OK 4 55ca9a46056908d3cade6957b3d5b2e698356b29fcJohannes Berg#define IWL6000G2_UCODE_API_OK 5 56e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg 57e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg/* Lowest firmware API version supported */ 58442464218d93aa0aacc55c3a7ac908ae00abff5fWey-Yi Guy#define IWL6000_UCODE_API_MIN 4 59442464218d93aa0aacc55c3a7ac908ae00abff5fWey-Yi Guy#define IWL6050_UCODE_API_MIN 4 604b3e8062807822271e02aafc0432e9a2497cb46cShanyu Zhao#define IWL6000G2_UCODE_API_MIN 4 61e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg 62e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg#define IWL6000_FW_PRE "iwlwifi-6000-" 638fcbd4dc7a1b338b393dcd6869deb1725cf1a9f3Evgeni Golov#define IWL6000_MODULE_FIRMWARE(api) IWL6000_FW_PRE __stringify(api) ".ucode" 64e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg 65e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg#define IWL6050_FW_PRE "iwlwifi-6050-" 668fcbd4dc7a1b338b393dcd6869deb1725cf1a9f3Evgeni Golov#define IWL6050_MODULE_FIRMWARE(api) IWL6050_FW_PRE __stringify(api) ".ucode" 67e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg 681956e1ad6292d257219d0f98a53f0a78ef282070Wey-Yi Guy#define IWL6005_FW_PRE "iwlwifi-6000g2a-" 698fcbd4dc7a1b338b393dcd6869deb1725cf1a9f3Evgeni Golov#define IWL6005_MODULE_FIRMWARE(api) IWL6005_FW_PRE __stringify(api) ".ucode" 7095b13014bb761a267db8bc1a47cbb35ddde587efShanyu Zhao 711956e1ad6292d257219d0f98a53f0a78ef282070Wey-Yi Guy#define IWL6030_FW_PRE "iwlwifi-6000g2b-" 728fcbd4dc7a1b338b393dcd6869deb1725cf1a9f3Evgeni Golov#define IWL6030_MODULE_FIRMWARE(api) IWL6030_FW_PRE __stringify(api) ".ucode" 731808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao 74672639de13c4db92ed6a47e68043a4317e219902Wey-Yi Guystatic void iwl6000_set_ct_threshold(struct iwl_priv *priv) 75672639de13c4db92ed6a47e68043a4317e219902Wey-Yi Guy{ 76672639de13c4db92ed6a47e68043a4317e219902Wey-Yi Guy /* want Celsius */ 77d618912417fbce4f6514fe1cbef7df2e73bdb6c2Emmanuel Grumbach hw_params(priv).ct_kill_threshold = CT_KILL_THRESHOLD; 78d618912417fbce4f6514fe1cbef7df2e73bdb6c2Emmanuel Grumbach hw_params(priv).ct_kill_exit_threshold = CT_KILL_EXIT_THRESHOLD; 79672639de13c4db92ed6a47e68043a4317e219902Wey-Yi Guy} 80672639de13c4db92ed6a47e68043a4317e219902Wey-Yi Guy 816b5ce501428942d9dec864a41ee223307f421574Shanyu Zhaostatic void iwl6050_additional_nic_config(struct iwl_priv *priv) 82d5755939e810f38c969a1d1b0effb2b75095b94eAbhijeet Kolekar{ 836b5ce501428942d9dec864a41ee223307f421574Shanyu Zhao /* Indicate calibration version to uCode. */ 84ab36eab24e7847d6d92872c55b46554c8ac4c4b3Don Fry if (iwl_eeprom_calib_version(priv->shrd) >= 6) 8583ed90155f98bd949735c2cc22d832b557a6d7d1Emmanuel Grumbach iwl_set_bit(bus(priv), CSR_GP_DRIVER_REG, 86d5755939e810f38c969a1d1b0effb2b75095b94eAbhijeet Kolekar CSR_GP_DRIVER_REG_BIT_CALIB_VERSION6); 87d5755939e810f38c969a1d1b0effb2b75095b94eAbhijeet Kolekar} 88d5755939e810f38c969a1d1b0effb2b75095b94eAbhijeet Kolekar 891956e1ad6292d257219d0f98a53f0a78ef282070Wey-Yi Guystatic void iwl6150_additional_nic_config(struct iwl_priv *priv) 9002796d77cb4cfb64b9465eabbdb13b3b7d1679e9Shanyu Zhao{ 9102796d77cb4cfb64b9465eabbdb13b3b7d1679e9Shanyu Zhao /* Indicate calibration version to uCode. */ 92ab36eab24e7847d6d92872c55b46554c8ac4c4b3Don Fry if (iwl_eeprom_calib_version(priv->shrd) >= 6) 9383ed90155f98bd949735c2cc22d832b557a6d7d1Emmanuel Grumbach iwl_set_bit(bus(priv), CSR_GP_DRIVER_REG, 9402796d77cb4cfb64b9465eabbdb13b3b7d1679e9Shanyu Zhao CSR_GP_DRIVER_REG_BIT_CALIB_VERSION6); 9583ed90155f98bd949735c2cc22d832b557a6d7d1Emmanuel Grumbach iwl_set_bit(bus(priv), CSR_GP_DRIVER_REG, 9602796d77cb4cfb64b9465eabbdb13b3b7d1679e9Shanyu Zhao CSR_GP_DRIVER_REG_BIT_6050_1x2); 9702796d77cb4cfb64b9465eabbdb13b3b7d1679e9Shanyu Zhao} 9802796d77cb4cfb64b9465eabbdb13b3b7d1679e9Shanyu Zhao 9965b7998a9be418482493e9448bb83ff2914ed050Wey-Yi Guy/* NIC configuration for 6000 series */ 10065b7998a9be418482493e9448bb83ff2914ed050Wey-Yi Guystatic void iwl6000_nic_config(struct iwl_priv *priv) 10165b7998a9be418482493e9448bb83ff2914ed050Wey-Yi Guy{ 10286cb3b4e08a106594ee79c94dec9c7ca289cf999Wey-Yi Guy iwl_rf_config(priv); 10365b7998a9be418482493e9448bb83ff2914ed050Wey-Yi Guy 10465b7998a9be418482493e9448bb83ff2914ed050Wey-Yi Guy /* no locking required for register write */ 1053862241945026a8fa165ab73c57739df77b8e1fbDon Fry if (cfg(priv)->pa_type == IWL_PA_INTERNAL) { 10665b7998a9be418482493e9448bb83ff2914ed050Wey-Yi Guy /* 2x2 IPA phy type */ 10783ed90155f98bd949735c2cc22d832b557a6d7d1Emmanuel Grumbach iwl_write32(bus(priv), CSR_GP_DRIVER_REG, 10865b7998a9be418482493e9448bb83ff2914ed050Wey-Yi Guy CSR_GP_DRIVER_REG_BIT_RADIO_SKU_2x2_IPA); 10965b7998a9be418482493e9448bb83ff2914ed050Wey-Yi Guy } 1106b5ce501428942d9dec864a41ee223307f421574Shanyu Zhao /* do additional nic configuration if needed */ 1113862241945026a8fa165ab73c57739df77b8e1fbDon Fry if (cfg(priv)->additional_nic_config) 1123862241945026a8fa165ab73c57739df77b8e1fbDon Fry cfg(priv)->additional_nic_config(priv); 11365b7998a9be418482493e9448bb83ff2914ed050Wey-Yi Guy} 11465b7998a9be418482493e9448bb83ff2914ed050Wey-Yi Guy 115f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guystatic struct iwl_sensitivity_ranges iwl6000_sensitivity = { 116e7515ba154b63c87d987fb2a30bcbe8814c3f317Wey-Yi Guy .min_nrg_cck = 110, 117f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy .max_nrg_cck = 0, /* not used, set to 0 */ 118f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy .auto_corr_min_ofdm = 80, 119f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy .auto_corr_min_ofdm_mrc = 128, 120f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy .auto_corr_min_ofdm_x1 = 105, 121f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy .auto_corr_min_ofdm_mrc_x1 = 192, 122f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy 123f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy .auto_corr_max_ofdm = 145, 124f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy .auto_corr_max_ofdm_mrc = 232, 1252494f63cc7394fc4424c4833b83d1831f52e54c8Wey-Yi Guy .auto_corr_max_ofdm_x1 = 110, 126f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy .auto_corr_max_ofdm_mrc_x1 = 232, 127f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy 128f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy .auto_corr_min_cck = 125, 129f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy .auto_corr_max_cck = 175, 130f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy .auto_corr_min_cck_mrc = 160, 131f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy .auto_corr_max_cck_mrc = 310, 132e7515ba154b63c87d987fb2a30bcbe8814c3f317Wey-Yi Guy .nrg_th_cck = 110, 133e7515ba154b63c87d987fb2a30bcbe8814c3f317Wey-Yi Guy .nrg_th_ofdm = 110, 13455036d6602679fb88dd7b1c19bb7203a0213b684Wey-Yi Guy 13555036d6602679fb88dd7b1c19bb7203a0213b684Wey-Yi Guy .barker_corr_th_min = 190, 136e7515ba154b63c87d987fb2a30bcbe8814c3f317Wey-Yi Guy .barker_corr_th_min_mrc = 336, 13755036d6602679fb88dd7b1c19bb7203a0213b684Wey-Yi Guy .nrg_th_cca = 62, 138f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy}; 139f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy 140f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guystatic int iwl6000_hw_set_hw_params(struct iwl_priv *priv) 141f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy{ 1429d143e9a0d68025efe902d86eb6207cbec36dcdbDon Fry if (iwlagn_mod_params.num_of_queues >= IWL_MIN_NUM_QUEUES && 1439d143e9a0d68025efe902d86eb6207cbec36dcdbDon Fry iwlagn_mod_params.num_of_queues <= IWLAGN_NUM_QUEUES) 1443862241945026a8fa165ab73c57739df77b8e1fbDon Fry cfg(priv)->base_params->num_of_queues = 1459d143e9a0d68025efe902d86eb6207cbec36dcdbDon Fry iwlagn_mod_params.num_of_queues; 146f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy 1473862241945026a8fa165ab73c57739df77b8e1fbDon Fry hw_params(priv).max_txq_num = cfg(priv)->base_params->num_of_queues; 148a194e3249baf954dc34c67cdad5b8bed36f49e72Johannes Berg priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id = IWLAGN_BROADCAST_ID; 149f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy 150d618912417fbce4f6514fe1cbef7df2e73bdb6c2Emmanuel Grumbach hw_params(priv).max_data_size = IWL60_RTC_DATA_SIZE; 151d618912417fbce4f6514fe1cbef7df2e73bdb6c2Emmanuel Grumbach hw_params(priv).max_inst_size = IWL60_RTC_INST_SIZE; 152f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy 153d618912417fbce4f6514fe1cbef7df2e73bdb6c2Emmanuel Grumbach hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ) | 154f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy BIT(IEEE80211_BAND_5GHZ); 155f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy 1563862241945026a8fa165ab73c57739df77b8e1fbDon Fry hw_params(priv).tx_chains_num = num_of_ant(cfg(priv)->valid_tx_ant); 1573862241945026a8fa165ab73c57739df77b8e1fbDon Fry if (cfg(priv)->rx_with_siso_diversity) 158d618912417fbce4f6514fe1cbef7df2e73bdb6c2Emmanuel Grumbach hw_params(priv).rx_chains_num = 1; 15917423ea8776362100b0a9a162cdd4b16b886a4a2Wey-Yi Guy else 160d618912417fbce4f6514fe1cbef7df2e73bdb6c2Emmanuel Grumbach hw_params(priv).rx_chains_num = 1613862241945026a8fa165ab73c57739df77b8e1fbDon Fry num_of_ant(cfg(priv)->valid_rx_ant); 1623862241945026a8fa165ab73c57739df77b8e1fbDon Fry hw_params(priv).valid_tx_ant = cfg(priv)->valid_tx_ant; 1633862241945026a8fa165ab73c57739df77b8e1fbDon Fry hw_params(priv).valid_rx_ant = cfg(priv)->valid_rx_ant; 164f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy 1650453674c90be7b39c8925ba5e1d746447905f8eeJohannes Berg iwl6000_set_ct_threshold(priv); 166f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy 167f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy /* Set initial sensitivity parameters */ 168d618912417fbce4f6514fe1cbef7df2e73bdb6c2Emmanuel Grumbach hw_params(priv).sens = &iwl6000_sensitivity; 16907f33f92e8e1e6ed2ec9d4de048142e7a1d96856Abhijeet Kolekar 170f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy return 0; 171f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy} 172f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy 17379d07325502e73508f917475bc1617b60979dd94Wey-Yi Guystatic int iwl6000_hw_channel_switch(struct iwl_priv *priv, 17479d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy struct ieee80211_channel_switch *ch_switch) 1754a56e9652ec2ffce87b099aa2fc5b4eb2d5b2666Wey-Yi Guy{ 176246ed355221076884d225f9d8a4c30a048be8162Johannes Berg /* 177246ed355221076884d225f9d8a4c30a048be8162Johannes Berg * MULTI-FIXME 178ade4c649a0e9e862751fe1c98f43fbee86554c8aWey-Yi Guy * See iwlagn_mac_channel_switch. 179246ed355221076884d225f9d8a4c30a048be8162Johannes Berg */ 180246ed355221076884d225f9d8a4c30a048be8162Johannes Berg struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; 1814a56e9652ec2ffce87b099aa2fc5b4eb2d5b2666Wey-Yi Guy struct iwl6000_channel_switch_cmd cmd; 1824a56e9652ec2ffce87b099aa2fc5b4eb2d5b2666Wey-Yi Guy const struct iwl_channel_info *ch_info; 18379d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy u32 switch_time_in_usec, ucode_switch_time; 18479d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy u16 ch; 18579d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy u32 tsf_low; 18679d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy u8 switch_count; 187246ed355221076884d225f9d8a4c30a048be8162Johannes Berg u16 beacon_interval = le16_to_cpu(ctx->timing.beacon_interval); 1888bd413e611d4324f17e54a2a89b4d09216c22a37Johannes Berg struct ieee80211_vif *vif = ctx->vif; 1894a56e9652ec2ffce87b099aa2fc5b4eb2d5b2666Wey-Yi Guy struct iwl_host_cmd hcmd = { 1904a56e9652ec2ffce87b099aa2fc5b4eb2d5b2666Wey-Yi Guy .id = REPLY_CHANNEL_SWITCH, 1913fa507386dc4cdf731344cb9361e9cca373cedb9Johannes Berg .len = { sizeof(cmd), }, 1923839f7ce6dc749e3170e1bfa656cfac748528117Wey-Yi Guy .flags = CMD_SYNC, 1933fa507386dc4cdf731344cb9361e9cca373cedb9Johannes Berg .data = { &cmd, }, 1944a56e9652ec2ffce87b099aa2fc5b4eb2d5b2666Wey-Yi Guy }; 1954a56e9652ec2ffce87b099aa2fc5b4eb2d5b2666Wey-Yi Guy 1964a56e9652ec2ffce87b099aa2fc5b4eb2d5b2666Wey-Yi Guy cmd.band = priv->band == IEEE80211_BAND_2GHZ; 19781e95430aaa898799421617c2db2882386bab69aShanyu Zhao ch = ch_switch->channel->hw_value; 19879d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy IWL_DEBUG_11H(priv, "channel switch from %u to %u\n", 199246ed355221076884d225f9d8a4c30a048be8162Johannes Berg ctx->active.channel, ch); 20079d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy cmd.channel = cpu_to_le16(ch); 201246ed355221076884d225f9d8a4c30a048be8162Johannes Berg cmd.rxon_flags = ctx->staging.flags; 202246ed355221076884d225f9d8a4c30a048be8162Johannes Berg cmd.rxon_filter_flags = ctx->staging.filter_flags; 20379d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy switch_count = ch_switch->count; 20479d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy tsf_low = ch_switch->timestamp & 0x0ffffffff; 20579d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy /* 20679d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy * calculate the ucode channel switch time 20779d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy * adding TSF as one of the factor for when to switch 20879d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy */ 20979d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy if ((priv->ucode_beacon_time > tsf_low) && beacon_interval) { 21079d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy if (switch_count > ((priv->ucode_beacon_time - tsf_low) / 21179d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy beacon_interval)) { 21279d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy switch_count -= (priv->ucode_beacon_time - 21379d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy tsf_low) / beacon_interval; 21479d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy } else 21579d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy switch_count = 0; 21679d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy } 21779d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy if (switch_count <= 1) 21879d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy cmd.switch_time = cpu_to_le32(priv->ucode_beacon_time); 21979d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy else { 22079d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy switch_time_in_usec = 22179d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy vif->bss_conf.beacon_int * switch_count * TIME_UNIT; 22279d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy ucode_switch_time = iwl_usecs_to_beacons(priv, 22379d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy switch_time_in_usec, 22479d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy beacon_interval); 22579d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy cmd.switch_time = iwl_add_beacon_time(priv, 22679d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy priv->ucode_beacon_time, 22779d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy ucode_switch_time, 22879d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy beacon_interval); 22979d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy } 23079d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy IWL_DEBUG_11H(priv, "uCode time for the switch is 0x%x\n", 23179d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy cmd.switch_time); 23279d07325502e73508f917475bc1617b60979dd94Wey-Yi Guy ch_info = iwl_get_channel_info(priv, priv->band, ch); 2334a56e9652ec2ffce87b099aa2fc5b4eb2d5b2666Wey-Yi Guy if (ch_info) 2344a56e9652ec2ffce87b099aa2fc5b4eb2d5b2666Wey-Yi Guy cmd.expect_beacon = is_channel_radar(ch_info); 2354a56e9652ec2ffce87b099aa2fc5b4eb2d5b2666Wey-Yi Guy else { 2364a56e9652ec2ffce87b099aa2fc5b4eb2d5b2666Wey-Yi Guy IWL_ERR(priv, "invalid channel switch from %u to %u\n", 237246ed355221076884d225f9d8a4c30a048be8162Johannes Berg ctx->active.channel, ch); 2384a56e9652ec2ffce87b099aa2fc5b4eb2d5b2666Wey-Yi Guy return -EFAULT; 2394a56e9652ec2ffce87b099aa2fc5b4eb2d5b2666Wey-Yi Guy } 2404a56e9652ec2ffce87b099aa2fc5b4eb2d5b2666Wey-Yi Guy 241e6bb4c9c00892c488f3218ea317dc6a71674faf4Emmanuel Grumbach return iwl_trans_send_cmd(trans(priv), &hcmd); 2424a56e9652ec2ffce87b099aa2fc5b4eb2d5b2666Wey-Yi Guy} 2434a56e9652ec2ffce87b099aa2fc5b4eb2d5b2666Wey-Yi Guy 244672639de13c4db92ed6a47e68043a4317e219902Wey-Yi Guystatic struct iwl_lib_ops iwl6000_lib = { 245f3a2a42470c1c362b9a7b4e933a15a274d4b090eWey-Yi Guy .set_hw_params = iwl6000_hw_set_hw_params, 2464a56e9652ec2ffce87b099aa2fc5b4eb2d5b2666Wey-Yi Guy .set_channel_switch = iwl6000_hw_channel_switch, 247e4c598b7ce36f4416f7672617265bc1fa92e5a5fFry, Donald H .nic_config = iwl6000_nic_config, 248672639de13c4db92ed6a47e68043a4317e219902Wey-Yi Guy .eeprom_ops = { 249672639de13c4db92ed6a47e68043a4317e219902Wey-Yi Guy .regulatory_bands = { 250e04ed0a5bb62520345c73587d7ebf51e426642eeWey-Yi Guy EEPROM_REG_BAND_1_CHANNELS, 251e04ed0a5bb62520345c73587d7ebf51e426642eeWey-Yi Guy EEPROM_REG_BAND_2_CHANNELS, 252e04ed0a5bb62520345c73587d7ebf51e426642eeWey-Yi Guy EEPROM_REG_BAND_3_CHANNELS, 253e04ed0a5bb62520345c73587d7ebf51e426642eeWey-Yi Guy EEPROM_REG_BAND_4_CHANNELS, 254e04ed0a5bb62520345c73587d7ebf51e426642eeWey-Yi Guy EEPROM_REG_BAND_5_CHANNELS, 255f2fa1b015e9c199e45c836c769d94db595150731Shanyu Zhao EEPROM_6000_REG_BAND_24_HT40_CHANNELS, 256e04ed0a5bb62520345c73587d7ebf51e426642eeWey-Yi Guy EEPROM_REG_BAND_52_HT40_CHANNELS 257672639de13c4db92ed6a47e68043a4317e219902Wey-Yi Guy }, 258b39488a9bd00c520e46682bf75ba484aadc82af7Wey-Yi Guy .update_enhanced_txpower = iwl_eeprom_enhanced_txpower, 259672639de13c4db92ed6a47e68043a4317e219902Wey-Yi Guy }, 260909fc3cba374560ada33a7dc3ab242d0f1d2a135Wey-Yi Guy .temperature = iwlagn_temperature, 261672639de13c4db92ed6a47e68043a4317e219902Wey-Yi Guy}; 262672639de13c4db92ed6a47e68043a4317e219902Wey-Yi Guy 2631956e1ad6292d257219d0f98a53f0a78ef282070Wey-Yi Guystatic struct iwl_lib_ops iwl6030_lib = { 2649e4afc21895476114f131b70d1e8fdc3a9c75bb3Johannes Berg .set_hw_params = iwl6000_hw_set_hw_params, 2658d30119346d52516f289016e1c57f853a835cb4aEmmanuel Grumbach .bt_rx_handler_setup = iwlagn_bt_rx_handler_setup, 2666bd4dba3d2b8a90d27dfd32b306fa965650599b4Emmanuel Grumbach .bt_setup_deferred_work = iwlagn_bt_setup_deferred_work, 267b6e116e8bf7d749b0743c167bd47930c22c77a82Wey-Yi Guy .cancel_deferred_work = iwlagn_bt_cancel_deferred_work, 2689e4afc21895476114f131b70d1e8fdc3a9c75bb3Johannes Berg .set_channel_switch = iwl6000_hw_channel_switch, 269e4c598b7ce36f4416f7672617265bc1fa92e5a5fFry, Donald H .nic_config = iwl6000_nic_config, 2709e4afc21895476114f131b70d1e8fdc3a9c75bb3Johannes Berg .eeprom_ops = { 2719e4afc21895476114f131b70d1e8fdc3a9c75bb3Johannes Berg .regulatory_bands = { 2729e4afc21895476114f131b70d1e8fdc3a9c75bb3Johannes Berg EEPROM_REG_BAND_1_CHANNELS, 2739e4afc21895476114f131b70d1e8fdc3a9c75bb3Johannes Berg EEPROM_REG_BAND_2_CHANNELS, 2749e4afc21895476114f131b70d1e8fdc3a9c75bb3Johannes Berg EEPROM_REG_BAND_3_CHANNELS, 2759e4afc21895476114f131b70d1e8fdc3a9c75bb3Johannes Berg EEPROM_REG_BAND_4_CHANNELS, 2769e4afc21895476114f131b70d1e8fdc3a9c75bb3Johannes Berg EEPROM_REG_BAND_5_CHANNELS, 2779e4afc21895476114f131b70d1e8fdc3a9c75bb3Johannes Berg EEPROM_6000_REG_BAND_24_HT40_CHANNELS, 2789e4afc21895476114f131b70d1e8fdc3a9c75bb3Johannes Berg EEPROM_REG_BAND_52_HT40_CHANNELS 2799e4afc21895476114f131b70d1e8fdc3a9c75bb3Johannes Berg }, 280b39488a9bd00c520e46682bf75ba484aadc82af7Wey-Yi Guy .update_enhanced_txpower = iwl_eeprom_enhanced_txpower, 2819e4afc21895476114f131b70d1e8fdc3a9c75bb3Johannes Berg }, 282909fc3cba374560ada33a7dc3ab242d0f1d2a135Wey-Yi Guy .temperature = iwlagn_temperature, 2839e4afc21895476114f131b70d1e8fdc3a9c75bb3Johannes Berg}; 2849e4afc21895476114f131b70d1e8fdc3a9c75bb3Johannes Berg 2857cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guystatic struct iwl_base_params iwl6000_base_params = { 2860b5af201b25334f7b9c991b2800693dd4cb4b5f7Jay Sternberg .eeprom_size = OTP_LOW_IMAGE_SIZE, 2870b5af201b25334f7b9c991b2800693dd4cb4b5f7Jay Sternberg .num_of_queues = IWLAGN_NUM_QUEUES, 2880b5af201b25334f7b9c991b2800693dd4cb4b5f7Jay Sternberg .num_of_ampdu_queues = IWLAGN_NUM_AMPDU_QUEUES, 2890b5af201b25334f7b9c991b2800693dd4cb4b5f7Jay Sternberg .pll_cfg_val = 0, 2900b5af201b25334f7b9c991b2800693dd4cb4b5f7Jay Sternberg .max_ll_items = OTP_MAX_LL_ITEMS_6x00, 2910b5af201b25334f7b9c991b2800693dd4cb4b5f7Jay Sternberg .shadow_ram_support = true, 2920b5af201b25334f7b9c991b2800693dd4cb4b5f7Jay Sternberg .led_compensation = 51, 2930b5af201b25334f7b9c991b2800693dd4cb4b5f7Jay Sternberg .adv_thermal_throttle = true, 2940b5af201b25334f7b9c991b2800693dd4cb4b5f7Jay Sternberg .support_ct_kill_exit = true, 2950b5af201b25334f7b9c991b2800693dd4cb4b5f7Jay Sternberg .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, 2960b5af201b25334f7b9c991b2800693dd4cb4b5f7Jay Sternberg .chain_noise_scale = 1000, 29722de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka .wd_timeout = IWL_DEF_WD_TIMEOUT, 29895b13014bb761a267db8bc1a47cbb35ddde587efShanyu Zhao .max_event_log_size = 512, 299f81c1f48384d398dbe8f6c5b10377c7158086791Wey-Yi Guy .shadow_reg_enable = true, 3000b5af201b25334f7b9c991b2800693dd4cb4b5f7Jay Sternberg}; 3010b5af201b25334f7b9c991b2800693dd4cb4b5f7Jay Sternberg 3027cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guystatic struct iwl_base_params iwl6050_base_params = { 3031808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao .eeprom_size = OTP_LOW_IMAGE_SIZE, 3041808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao .num_of_queues = IWLAGN_NUM_QUEUES, 3051808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao .num_of_ampdu_queues = IWLAGN_NUM_AMPDU_QUEUES, 3061808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao .pll_cfg_val = 0, 3077cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy .max_ll_items = OTP_MAX_LL_ITEMS_6x50, 3081808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao .shadow_ram_support = true, 3091808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao .led_compensation = 51, 3101808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao .adv_thermal_throttle = true, 3111808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao .support_ct_kill_exit = true, 3121808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, 3137cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy .chain_noise_scale = 1500, 31422de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka .wd_timeout = IWL_DEF_WD_TIMEOUT, 3157cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy .max_event_log_size = 1024, 316f81c1f48384d398dbe8f6c5b10377c7158086791Wey-Yi Guy .shadow_reg_enable = true, 3177cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy}; 3184fb33244d17b973f17cbc7cf8b7efd0875950474Wey-Yi Guystatic struct iwl_base_params iwl6000_g2_base_params = { 319de05ead8f8649788603afc470eb1c2ea2b8b1655Wey-Yi Guy .eeprom_size = OTP_LOW_IMAGE_SIZE, 320de05ead8f8649788603afc470eb1c2ea2b8b1655Wey-Yi Guy .num_of_queues = IWLAGN_NUM_QUEUES, 321de05ead8f8649788603afc470eb1c2ea2b8b1655Wey-Yi Guy .num_of_ampdu_queues = IWLAGN_NUM_AMPDU_QUEUES, 322de05ead8f8649788603afc470eb1c2ea2b8b1655Wey-Yi Guy .pll_cfg_val = 0, 323de05ead8f8649788603afc470eb1c2ea2b8b1655Wey-Yi Guy .max_ll_items = OTP_MAX_LL_ITEMS_6x00, 324de05ead8f8649788603afc470eb1c2ea2b8b1655Wey-Yi Guy .shadow_ram_support = true, 3254fb33244d17b973f17cbc7cf8b7efd0875950474Wey-Yi Guy .led_compensation = 57, 326de05ead8f8649788603afc470eb1c2ea2b8b1655Wey-Yi Guy .adv_thermal_throttle = true, 327de05ead8f8649788603afc470eb1c2ea2b8b1655Wey-Yi Guy .support_ct_kill_exit = true, 328de05ead8f8649788603afc470eb1c2ea2b8b1655Wey-Yi Guy .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, 329de05ead8f8649788603afc470eb1c2ea2b8b1655Wey-Yi Guy .chain_noise_scale = 1000, 33022de94de7de78b8de2fb1f2df5aa85b5556cfcfdStanislaw Gruszka .wd_timeout = IWL_LONG_WD_TIMEOUT, 331de05ead8f8649788603afc470eb1c2ea2b8b1655Wey-Yi Guy .max_event_log_size = 512, 332f81c1f48384d398dbe8f6c5b10377c7158086791Wey-Yi Guy .shadow_reg_enable = true, 333de05ead8f8649788603afc470eb1c2ea2b8b1655Wey-Yi Guy}; 3347cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy 3357cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guystatic struct iwl_ht_params iwl6000_ht_params = { 3367cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy .ht_greenfield_support = true, 3377cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy .use_rts_for_aggregation = true, /* use rts/cts protection */ 3387cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy}; 3397cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy 3407cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guystatic struct iwl_bt_params iwl6000_bt_params = { 3417cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ 3427cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy .advanced_bt_coexist = true, 34366e863a527f9ed3a871797862aaf0d62b0954813Wey-Yi Guy .agg_time_limit = BT_AGG_THRESHOLD_DEF, 3447cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy .bt_init_traffic_load = IWL_BT_COEX_TRAFFIC_LOAD_NONE, 3457cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy .bt_prio_boost = IWLAGN_BT_PRIO_BOOST_DEFAULT, 346e366176e5c7f37d2d4cd0708e63b939e3fa3b5c6Wey-Yi Guy .bt_sco_disable = true, 3477cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy}; 3487cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy 34965af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy#define IWL_DEVICE_6005 \ 350ca9a46056908d3cade6957b3d5b2e698356b29fcJohannes Berg .fw_name_pre = IWL6005_FW_PRE, \ 35165af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .ucode_api_max = IWL6000G2_UCODE_API_MAX, \ 352ca9a46056908d3cade6957b3d5b2e698356b29fcJohannes Berg .ucode_api_ok = IWL6000G2_UCODE_API_OK, \ 35365af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .ucode_api_min = IWL6000G2_UCODE_API_MIN, \ 3541956e1ad6292d257219d0f98a53f0a78ef282070Wey-Yi Guy .eeprom_ver = EEPROM_6005_EEPROM_VERSION, \ 3551956e1ad6292d257219d0f98a53f0a78ef282070Wey-Yi Guy .eeprom_calib_ver = EEPROM_6005_TX_POWER_VERSION, \ 35690c300cbd89e76789dbff101a1cb1ec226af277fWey-Yi Guy .lib = &iwl6000_lib, \ 35765af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .base_params = &iwl6000_g2_base_params, \ 35865af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .need_temp_offset_calib = true, \ 35965af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .led_mode = IWL_LED_RF_STATE 36065af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy 3618b3ee29626031155c7844988ebe4321c151c03a2Wey-Yi Guystruct iwl_cfg iwl6005_2agn_cfg = { 36255017ab87831b3ca449b81b83b180baac2895666Wey-Yi Guy .name = "Intel(R) Centrino(R) Advanced-N 6205 AGN", 36365af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy IWL_DEVICE_6005, 3647cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy .ht_params = &iwl6000_ht_params, 3657cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy}; 3667cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy 3678b3ee29626031155c7844988ebe4321c151c03a2Wey-Yi Guystruct iwl_cfg iwl6005_2abg_cfg = { 36855017ab87831b3ca449b81b83b180baac2895666Wey-Yi Guy .name = "Intel(R) Centrino(R) Advanced-N 6205 ABG", 36965af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy IWL_DEVICE_6005, 3701808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao}; 3711808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao 3728b3ee29626031155c7844988ebe4321c151c03a2Wey-Yi Guystruct iwl_cfg iwl6005_2bg_cfg = { 37355017ab87831b3ca449b81b83b180baac2895666Wey-Yi Guy .name = "Intel(R) Centrino(R) Advanced-N 6205 BG", 37465af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy IWL_DEVICE_6005, 37565af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy}; 37665af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy 3776a9ae0dc1d4ed6a2007aea14e41d9ba0ae1e3fd4Wey-Yi Guystruct iwl_cfg iwl6005_2agn_sff_cfg = { 3786a9ae0dc1d4ed6a2007aea14e41d9ba0ae1e3fd4Wey-Yi Guy .name = "Intel(R) Centrino(R) Advanced-N 6205S AGN", 3796a9ae0dc1d4ed6a2007aea14e41d9ba0ae1e3fd4Wey-Yi Guy IWL_DEVICE_6005, 3806a9ae0dc1d4ed6a2007aea14e41d9ba0ae1e3fd4Wey-Yi Guy .ht_params = &iwl6000_ht_params, 3816a9ae0dc1d4ed6a2007aea14e41d9ba0ae1e3fd4Wey-Yi Guy}; 3826a9ae0dc1d4ed6a2007aea14e41d9ba0ae1e3fd4Wey-Yi Guy 3835131a600f044bc2a85cadda1eeef684fdb6b190cWey-Yi Guystruct iwl_cfg iwl6005_2agn_d_cfg = { 3845131a600f044bc2a85cadda1eeef684fdb6b190cWey-Yi Guy .name = "Intel(R) Centrino(R) Advanced-N 6205D AGN", 3855131a600f044bc2a85cadda1eeef684fdb6b190cWey-Yi Guy IWL_DEVICE_6005, 3865131a600f044bc2a85cadda1eeef684fdb6b190cWey-Yi Guy .ht_params = &iwl6000_ht_params, 3875131a600f044bc2a85cadda1eeef684fdb6b190cWey-Yi Guy}; 3885131a600f044bc2a85cadda1eeef684fdb6b190cWey-Yi Guy 38965af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy#define IWL_DEVICE_6030 \ 390ca9a46056908d3cade6957b3d5b2e698356b29fcJohannes Berg .fw_name_pre = IWL6030_FW_PRE, \ 39165af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .ucode_api_max = IWL6000G2_UCODE_API_MAX, \ 392ca9a46056908d3cade6957b3d5b2e698356b29fcJohannes Berg .ucode_api_ok = IWL6000G2_UCODE_API_OK, \ 39365af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .ucode_api_min = IWL6000G2_UCODE_API_MIN, \ 3941956e1ad6292d257219d0f98a53f0a78ef282070Wey-Yi Guy .eeprom_ver = EEPROM_6030_EEPROM_VERSION, \ 3951956e1ad6292d257219d0f98a53f0a78ef282070Wey-Yi Guy .eeprom_calib_ver = EEPROM_6030_TX_POWER_VERSION, \ 39690c300cbd89e76789dbff101a1cb1ec226af277fWey-Yi Guy .lib = &iwl6030_lib, \ 39765af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .base_params = &iwl6000_g2_base_params, \ 39865af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .bt_params = &iwl6000_bt_params, \ 39965af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .need_temp_offset_calib = true, \ 40065af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .led_mode = IWL_LED_RF_STATE, \ 401cd017f25e391dfabaca185bb4a5aefd02fd6c0caStanislaw Gruszka .adv_pm = true \ 4021808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao 4038b3ee29626031155c7844988ebe4321c151c03a2Wey-Yi Guystruct iwl_cfg iwl6030_2agn_cfg = { 404d2eceef02e717751d4f6a01eddea6f241d63c213Wey-Yi Guy .name = "Intel(R) Centrino(R) Advanced-N 6230 AGN", 40565af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy IWL_DEVICE_6030, 4067cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy .ht_params = &iwl6000_ht_params, 4071808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao}; 4081808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao 4098b3ee29626031155c7844988ebe4321c151c03a2Wey-Yi Guystruct iwl_cfg iwl6030_2abg_cfg = { 410d2eceef02e717751d4f6a01eddea6f241d63c213Wey-Yi Guy .name = "Intel(R) Centrino(R) Advanced-N 6230 ABG", 41165af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy IWL_DEVICE_6030, 4121808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao}; 4131808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao 4148b3ee29626031155c7844988ebe4321c151c03a2Wey-Yi Guystruct iwl_cfg iwl6030_2bgn_cfg = { 415d2eceef02e717751d4f6a01eddea6f241d63c213Wey-Yi Guy .name = "Intel(R) Centrino(R) Advanced-N 6230 BGN", 41665af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy IWL_DEVICE_6030, 4177cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy .ht_params = &iwl6000_ht_params, 4189f6e1bafac4f3c58c8a670496adcc4d313d3c7f7Shanyu Zhao}; 4199f6e1bafac4f3c58c8a670496adcc4d313d3c7f7Shanyu Zhao 4208b3ee29626031155c7844988ebe4321c151c03a2Wey-Yi Guystruct iwl_cfg iwl6030_2bg_cfg = { 421d2eceef02e717751d4f6a01eddea6f241d63c213Wey-Yi Guy .name = "Intel(R) Centrino(R) Advanced-N 6230 BG", 42265af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy IWL_DEVICE_6030, 4231808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao}; 4241808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao 425d103e3448a3ecb9f81babd1f6d7f5a678e213c82Wey-Yi Guystruct iwl_cfg iwl6035_2agn_cfg = { 4266195d135b78e4067c24b5340552c89e7acf88d22Don Fry .name = "Intel(R) Centrino(R) Advanced-N 6235 AGN", 427d103e3448a3ecb9f81babd1f6d7f5a678e213c82Wey-Yi Guy IWL_DEVICE_6030, 428d103e3448a3ecb9f81babd1f6d7f5a678e213c82Wey-Yi Guy .ht_params = &iwl6000_ht_params, 429d103e3448a3ecb9f81babd1f6d7f5a678e213c82Wey-Yi Guy}; 430d103e3448a3ecb9f81babd1f6d7f5a678e213c82Wey-Yi Guy 4318b3ee29626031155c7844988ebe4321c151c03a2Wey-Yi Guystruct iwl_cfg iwl1030_bgn_cfg = { 432d2eceef02e717751d4f6a01eddea6f241d63c213Wey-Yi Guy .name = "Intel(R) Centrino(R) Wireless-N 1030 BGN", 43365af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy IWL_DEVICE_6030, 4347cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy .ht_params = &iwl6000_ht_params, 4351808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao}; 4361808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao 4378b3ee29626031155c7844988ebe4321c151c03a2Wey-Yi Guystruct iwl_cfg iwl1030_bg_cfg = { 438d2eceef02e717751d4f6a01eddea6f241d63c213Wey-Yi Guy .name = "Intel(R) Centrino(R) Wireless-N 1030 BG", 43965af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy IWL_DEVICE_6030, 44065af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy}; 44165af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy 44265af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guystruct iwl_cfg iwl130_bgn_cfg = { 44365af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .name = "Intel(R) Centrino(R) Wireless-N 130 BGN", 44465af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy IWL_DEVICE_6030, 44565af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .ht_params = &iwl6000_ht_params, 44665af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .rx_with_siso_diversity = true, 44765af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy}; 44865af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy 44965af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guystruct iwl_cfg iwl130_bg_cfg = { 45065af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .name = "Intel(R) Centrino(R) Wireless-N 130 BG", 45165af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy IWL_DEVICE_6030, 45265af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .rx_with_siso_diversity = true, 4531808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao}; 4541808972f16adba592ceb10a47dee42ef8ee39ceeShanyu Zhao 45595b13014bb761a267db8bc1a47cbb35ddde587efShanyu Zhao/* 45695b13014bb761a267db8bc1a47cbb35ddde587efShanyu Zhao * "i": Internal configuration, use internal Power Amplifier 45795b13014bb761a267db8bc1a47cbb35ddde587efShanyu Zhao */ 45865af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy#define IWL_DEVICE_6000i \ 45965af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .fw_name_pre = IWL6000_FW_PRE, \ 46065af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .ucode_api_max = IWL6000_UCODE_API_MAX, \ 461b914811524fbe9e91fe50845f5d7bd4316b8a6eeJohannes Berg .ucode_api_ok = IWL6000_UCODE_API_OK, \ 46265af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .ucode_api_min = IWL6000_UCODE_API_MIN, \ 46365af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .valid_tx_ant = ANT_BC, /* .cfg overwrite */ \ 46465af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .valid_rx_ant = ANT_BC, /* .cfg overwrite */ \ 46565af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .eeprom_ver = EEPROM_6000_EEPROM_VERSION, \ 46665af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .eeprom_calib_ver = EEPROM_6000_TX_POWER_VERSION, \ 46790c300cbd89e76789dbff101a1cb1ec226af277fWey-Yi Guy .lib = &iwl6000_lib, \ 46865af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .base_params = &iwl6000_base_params, \ 46965af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .pa_type = IWL_PA_INTERNAL, \ 47065af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .led_mode = IWL_LED_BLINK 47165af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy 47265b7998a9be418482493e9448bb83ff2914ed050Wey-Yi Guystruct iwl_cfg iwl6000i_2agn_cfg = { 473c11362c01b280f8b2c728bc64793d484282b8734Shanyu Zhao .name = "Intel(R) Centrino(R) Advanced-N 6200 AGN", 47465af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy IWL_DEVICE_6000i, 4757cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy .ht_params = &iwl6000_ht_params, 476e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg}; 477e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg 4785953a62e7df064a5d7ba7e790d590f27c65ddf4cWey-Yi Guystruct iwl_cfg iwl6000i_2abg_cfg = { 479c11362c01b280f8b2c728bc64793d484282b8734Shanyu Zhao .name = "Intel(R) Centrino(R) Advanced-N 6200 ABG", 48065af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy IWL_DEVICE_6000i, 4815953a62e7df064a5d7ba7e790d590f27c65ddf4cWey-Yi Guy}; 4825953a62e7df064a5d7ba7e790d590f27c65ddf4cWey-Yi Guy 4835953a62e7df064a5d7ba7e790d590f27c65ddf4cWey-Yi Guystruct iwl_cfg iwl6000i_2bg_cfg = { 484c11362c01b280f8b2c728bc64793d484282b8734Shanyu Zhao .name = "Intel(R) Centrino(R) Advanced-N 6200 BG", 48565af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy IWL_DEVICE_6000i, 48665af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy}; 48765af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy 48865af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy#define IWL_DEVICE_6050 \ 48965af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .fw_name_pre = IWL6050_FW_PRE, \ 49065af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .ucode_api_max = IWL6050_UCODE_API_MAX, \ 49165af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .ucode_api_min = IWL6050_UCODE_API_MIN, \ 492ff458edc0c5ec42b299547fb7eb9790a4aecc632Wey-Yi Guy .valid_tx_ant = ANT_AB, /* .cfg overwrite */ \ 493ff458edc0c5ec42b299547fb7eb9790a4aecc632Wey-Yi Guy .valid_rx_ant = ANT_AB, /* .cfg overwrite */ \ 49490c300cbd89e76789dbff101a1cb1ec226af277fWey-Yi Guy .lib = &iwl6000_lib, \ 495e4305fe91f986aa3c56fbc18f0a8ecf05d65f26dWey-Yi Guy .additional_nic_config = iwl6050_additional_nic_config, \ 49665af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .eeprom_ver = EEPROM_6050_EEPROM_VERSION, \ 49765af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .eeprom_calib_ver = EEPROM_6050_TX_POWER_VERSION, \ 49865af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .base_params = &iwl6050_base_params, \ 49965af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .led_mode = IWL_LED_BLINK, \ 50065af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .internal_wimax_coex = true 5015953a62e7df064a5d7ba7e790d590f27c65ddf4cWey-Yi Guy 502e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternbergstruct iwl_cfg iwl6050_2agn_cfg = { 503c11362c01b280f8b2c728bc64793d484282b8734Shanyu Zhao .name = "Intel(R) Centrino(R) Advanced-N + WiMAX 6250 AGN", 50465af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy IWL_DEVICE_6050, 5057cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy .ht_params = &iwl6000_ht_params, 50665af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy}; 50765af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy 50865af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guystruct iwl_cfg iwl6050_2abg_cfg = { 50965af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy .name = "Intel(R) Centrino(R) Advanced-N + WiMAX 6250 ABG", 51065af8dea26aa89ae4a810bdaa05545a8e670b636Wey-Yi Guy IWL_DEVICE_6050, 5110326433995ad43b64ebabdd2390a5d11f33f025bShanyu Zhao}; 5120326433995ad43b64ebabdd2390a5d11f33f025bShanyu Zhao 5131144181c1bc054dc5e001a6f10b4820167e6c883Wey-Yi Guy#define IWL_DEVICE_6150 \ 5141144181c1bc054dc5e001a6f10b4820167e6c883Wey-Yi Guy .fw_name_pre = IWL6050_FW_PRE, \ 5151144181c1bc054dc5e001a6f10b4820167e6c883Wey-Yi Guy .ucode_api_max = IWL6050_UCODE_API_MAX, \ 5161144181c1bc054dc5e001a6f10b4820167e6c883Wey-Yi Guy .ucode_api_min = IWL6050_UCODE_API_MIN, \ 51790c300cbd89e76789dbff101a1cb1ec226af277fWey-Yi Guy .lib = &iwl6000_lib, \ 518e4305fe91f986aa3c56fbc18f0a8ecf05d65f26dWey-Yi Guy .additional_nic_config = iwl6150_additional_nic_config, \ 5191144181c1bc054dc5e001a6f10b4820167e6c883Wey-Yi Guy .eeprom_ver = EEPROM_6150_EEPROM_VERSION, \ 5201144181c1bc054dc5e001a6f10b4820167e6c883Wey-Yi Guy .eeprom_calib_ver = EEPROM_6150_TX_POWER_VERSION, \ 5211144181c1bc054dc5e001a6f10b4820167e6c883Wey-Yi Guy .base_params = &iwl6050_base_params, \ 5221144181c1bc054dc5e001a6f10b4820167e6c883Wey-Yi Guy .led_mode = IWL_LED_BLINK, \ 5231144181c1bc054dc5e001a6f10b4820167e6c883Wey-Yi Guy .internal_wimax_coex = true 5241144181c1bc054dc5e001a6f10b4820167e6c883Wey-Yi Guy 5258b3ee29626031155c7844988ebe4321c151c03a2Wey-Yi Guystruct iwl_cfg iwl6150_bgn_cfg = { 526f9dc6467223319acaea64d95ff208409e4e48d07Wey-Yi Guy .name = "Intel(R) Centrino(R) Wireless-N + WiMAX 6150 BGN", 5271144181c1bc054dc5e001a6f10b4820167e6c883Wey-Yi Guy IWL_DEVICE_6150, 5287cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy .ht_params = &iwl6000_ht_params, 5291144181c1bc054dc5e001a6f10b4820167e6c883Wey-Yi Guy}; 5301144181c1bc054dc5e001a6f10b4820167e6c883Wey-Yi Guy 5311144181c1bc054dc5e001a6f10b4820167e6c883Wey-Yi Guystruct iwl_cfg iwl6150_bg_cfg = { 5321144181c1bc054dc5e001a6f10b4820167e6c883Wey-Yi Guy .name = "Intel(R) Centrino(R) Wireless-N + WiMAX 6150 BG", 5331144181c1bc054dc5e001a6f10b4820167e6c883Wey-Yi Guy IWL_DEVICE_6150, 534e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg}; 535e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg 536e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternbergstruct iwl_cfg iwl6000_3agn_cfg = { 537c11362c01b280f8b2c728bc64793d484282b8734Shanyu Zhao .name = "Intel(R) Centrino(R) Ultimate-N 6300 AGN", 538e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg .fw_name_pre = IWL6000_FW_PRE, 539e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg .ucode_api_max = IWL6000_UCODE_API_MAX, 540b914811524fbe9e91fe50845f5d7bd4316b8a6eeJohannes Berg .ucode_api_ok = IWL6000_UCODE_API_OK, 541e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg .ucode_api_min = IWL6000_UCODE_API_MIN, 5421f4b9665032c4a1d60efd9ceaad2781cae6c7e92Wey-Yi Guy .eeprom_ver = EEPROM_6000_EEPROM_VERSION, 54300e70590dc2707043b82c0cf9a6929b81e640feeWey-Yi Guy .eeprom_calib_ver = EEPROM_6000_TX_POWER_VERSION, 54490c300cbd89e76789dbff101a1cb1ec226af277fWey-Yi Guy .lib = &iwl6000_lib, 5457cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy .base_params = &iwl6000_base_params, 5467cb1b0887fcc61918e3d64827fbef968bb67a57aWey-Yi Guy .ht_params = &iwl6000_ht_params, 547564b344c10b694d433cef5b89f8ff8ac5e33898dWey-Yi Guy .led_mode = IWL_LED_BLINK, 548e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg}; 549e1228374d648efe451973bc5f3d1f9a8e943ec0bJay Sternberg 550b914811524fbe9e91fe50845f5d7bd4316b8a6eeJohannes BergMODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_OK)); 551e1228374d648efe451973bc5f3d1f9a8e943ec0bJay SternbergMODULE_FIRMWARE(IWL6050_MODULE_FIRMWARE(IWL6050_UCODE_API_MAX)); 5521956e1ad6292d257219d0f98a53f0a78ef282070Wey-Yi GuyMODULE_FIRMWARE(IWL6005_MODULE_FIRMWARE(IWL6000G2_UCODE_API_MAX)); 5531956e1ad6292d257219d0f98a53f0a78ef282070Wey-Yi GuyMODULE_FIRMWARE(IWL6030_MODULE_FIRMWARE(IWL6000G2_UCODE_API_MAX)); 554