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