linux/drivers/net/wireless/iwlwifi/iwl-6000.c
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * Copyright(c) 2008 - 2010 Intel Corporation. All rights reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms of version 2 of the GNU General Public License as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it will be useful, but WITHOUT
  10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  12 * more details.
  13 *
  14 * You should have received a copy of the GNU General Public License along with
  15 * this program; if not, write to the Free Software Foundation, Inc.,
  16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  17 *
  18 * The full GNU General Public License is included in this distribution in the
  19 * file called LICENSE.
  20 *
  21 * Contact Information:
  22 *  Intel Linux Wireless <ilw@linux.intel.com>
  23 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
  24 *
  25 *****************************************************************************/
  26
  27#include <linux/kernel.h>
  28#include <linux/module.h>
  29#include <linux/init.h>
  30#include <linux/pci.h>
  31#include <linux/dma-mapping.h>
  32#include <linux/delay.h>
  33#include <linux/skbuff.h>
  34#include <linux/netdevice.h>
  35#include <linux/wireless.h>
  36#include <net/mac80211.h>
  37#include <linux/etherdevice.h>
  38#include <asm/unaligned.h>
  39
  40#include "iwl-eeprom.h"
  41#include "iwl-dev.h"
  42#include "iwl-core.h"
  43#include "iwl-io.h"
  44#include "iwl-sta.h"
  45#include "iwl-agn.h"
  46#include "iwl-helpers.h"
  47#include "iwl-agn-hw.h"
  48#include "iwl-6000-hw.h"
  49#include "iwl-agn-led.h"
  50#include "iwl-agn-debugfs.h"
  51
  52/* Highest firmware API version supported */
  53#define IWL6000_UCODE_API_MAX 4
  54#define IWL6050_UCODE_API_MAX 5
  55#define IWL6000G2_UCODE_API_MAX 5
  56
  57/* Lowest firmware API version supported */
  58#define IWL6000_UCODE_API_MIN 4
  59#define IWL6050_UCODE_API_MIN 4
  60#define IWL6000G2_UCODE_API_MIN 4
  61
  62#define IWL6000_FW_PRE "iwlwifi-6000-"
  63#define _IWL6000_MODULE_FIRMWARE(api) IWL6000_FW_PRE #api ".ucode"
  64#define IWL6000_MODULE_FIRMWARE(api) _IWL6000_MODULE_FIRMWARE(api)
  65
  66#define IWL6050_FW_PRE "iwlwifi-6050-"
  67#define _IWL6050_MODULE_FIRMWARE(api) IWL6050_FW_PRE #api ".ucode"
  68#define IWL6050_MODULE_FIRMWARE(api) _IWL6050_MODULE_FIRMWARE(api)
  69
  70#define IWL6000G2A_FW_PRE "iwlwifi-6000g2a-"
  71#define _IWL6000G2A_MODULE_FIRMWARE(api) IWL6000G2A_FW_PRE #api ".ucode"
  72#define IWL6000G2A_MODULE_FIRMWARE(api) _IWL6000G2A_MODULE_FIRMWARE(api)
  73
  74#define IWL6000G2B_FW_PRE "iwlwifi-6000g2b-"
  75#define _IWL6000G2B_MODULE_FIRMWARE(api) IWL6000G2B_FW_PRE #api ".ucode"
  76#define IWL6000G2B_MODULE_FIRMWARE(api) _IWL6000G2B_MODULE_FIRMWARE(api)
  77
  78static void iwl6000_set_ct_threshold(struct iwl_priv *priv)
  79{
  80        /* want Celsius */
  81        priv->hw_params.ct_kill_threshold = CT_KILL_THRESHOLD;
  82        priv->hw_params.ct_kill_exit_threshold = CT_KILL_EXIT_THRESHOLD;
  83}
  84
  85static void iwl6050_additional_nic_config(struct iwl_priv *priv)
  86{
  87        /* Indicate calibration version to uCode. */
  88        if (priv->cfg->ops->lib->eeprom_ops.calib_version(priv) >= 6)
  89                iwl_set_bit(priv, CSR_GP_DRIVER_REG,
  90                                CSR_GP_DRIVER_REG_BIT_CALIB_VERSION6);
  91}
  92
  93static void iwl6050g2_additional_nic_config(struct iwl_priv *priv)
  94{
  95        /* Indicate calibration version to uCode. */
  96        if (priv->cfg->ops->lib->eeprom_ops.calib_version(priv) >= 6)
  97                iwl_set_bit(priv, CSR_GP_DRIVER_REG,
  98                                CSR_GP_DRIVER_REG_BIT_CALIB_VERSION6);
  99        iwl_set_bit(priv, CSR_GP_DRIVER_REG,
 100                    CSR_GP_DRIVER_REG_BIT_6050_1x2);
 101}
 102
 103/* NIC configuration for 6000 series */
 104static void iwl6000_nic_config(struct iwl_priv *priv)
 105{
 106        u16 radio_cfg;
 107
 108        radio_cfg = iwl_eeprom_query16(priv, EEPROM_RADIO_CONFIG);
 109
 110        /* write radio config values to register */
 111        if (EEPROM_RF_CFG_TYPE_MSK(radio_cfg) <= EEPROM_RF_CONFIG_TYPE_MAX)
 112                iwl_set_bit(priv, CSR_HW_IF_CONFIG_REG,
 113                            EEPROM_RF_CFG_TYPE_MSK(radio_cfg) |
 114                            EEPROM_RF_CFG_STEP_MSK(radio_cfg) |
 115                            EEPROM_RF_CFG_DASH_MSK(radio_cfg));
 116
 117        /* set CSR_HW_CONFIG_REG for uCode use */
 118        iwl_set_bit(priv, CSR_HW_IF_CONFIG_REG,
 119                    CSR_HW_IF_CONFIG_REG_BIT_RADIO_SI |
 120                    CSR_HW_IF_CONFIG_REG_BIT_MAC_SI);
 121
 122        /* no locking required for register write */
 123        if (priv->cfg->pa_type == IWL_PA_INTERNAL) {
 124                /* 2x2 IPA phy type */
 125                iwl_write32(priv, CSR_GP_DRIVER_REG,
 126                             CSR_GP_DRIVER_REG_BIT_RADIO_SKU_2x2_IPA);
 127        }
 128        /* do additional nic configuration if needed */
 129        if (priv->cfg->ops->nic &&
 130                priv->cfg->ops->nic->additional_nic_config) {
 131                        priv->cfg->ops->nic->additional_nic_config(priv);
 132        }
 133}
 134
 135static struct iwl_sensitivity_ranges iwl6000_sensitivity = {
 136        .min_nrg_cck = 97,
 137        .max_nrg_cck = 0, /* not used, set to 0 */
 138        .auto_corr_min_ofdm = 80,
 139        .auto_corr_min_ofdm_mrc = 128,
 140        .auto_corr_min_ofdm_x1 = 105,
 141        .auto_corr_min_ofdm_mrc_x1 = 192,
 142
 143        .auto_corr_max_ofdm = 145,
 144        .auto_corr_max_ofdm_mrc = 232,
 145        .auto_corr_max_ofdm_x1 = 110,
 146        .auto_corr_max_ofdm_mrc_x1 = 232,
 147
 148        .auto_corr_min_cck = 125,
 149        .auto_corr_max_cck = 175,
 150        .auto_corr_min_cck_mrc = 160,
 151        .auto_corr_max_cck_mrc = 310,
 152        .nrg_th_cck = 97,
 153        .nrg_th_ofdm = 100,
 154
 155        .barker_corr_th_min = 190,
 156        .barker_corr_th_min_mrc = 390,
 157        .nrg_th_cca = 62,
 158};
 159
 160static int iwl6000_hw_set_hw_params(struct iwl_priv *priv)
 161{
 162        if (priv->cfg->mod_params->num_of_queues >= IWL_MIN_NUM_QUEUES &&
 163            priv->cfg->mod_params->num_of_queues <= IWLAGN_NUM_QUEUES)
 164                priv->cfg->base_params->num_of_queues =
 165                        priv->cfg->mod_params->num_of_queues;
 166
 167        priv->hw_params.max_txq_num = priv->cfg->base_params->num_of_queues;
 168        priv->hw_params.dma_chnl_num = FH50_TCSR_CHNL_NUM;
 169        priv->hw_params.scd_bc_tbls_size =
 170                        priv->cfg->base_params->num_of_queues *
 171                        sizeof(struct iwlagn_scd_bc_tbl);
 172        priv->hw_params.tfd_size = sizeof(struct iwl_tfd);
 173        priv->hw_params.max_stations = IWLAGN_STATION_COUNT;
 174        priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id = IWLAGN_BROADCAST_ID;
 175
 176        priv->hw_params.max_data_size = IWL60_RTC_DATA_SIZE;
 177        priv->hw_params.max_inst_size = IWL60_RTC_INST_SIZE;
 178
 179        priv->hw_params.max_bsm_size = 0;
 180        priv->hw_params.ht40_channel =  BIT(IEEE80211_BAND_2GHZ) |
 181                                        BIT(IEEE80211_BAND_5GHZ);
 182        priv->hw_params.rx_wrt_ptr_reg = FH_RSCSR_CHNL0_WPTR;
 183
 184        priv->hw_params.tx_chains_num = num_of_ant(priv->cfg->valid_tx_ant);
 185        if (priv->cfg->rx_with_siso_diversity)
 186                priv->hw_params.rx_chains_num = 1;
 187        else
 188                priv->hw_params.rx_chains_num =
 189                        num_of_ant(priv->cfg->valid_rx_ant);
 190        priv->hw_params.valid_tx_ant = priv->cfg->valid_tx_ant;
 191        priv->hw_params.valid_rx_ant = priv->cfg->valid_rx_ant;
 192
 193        iwl6000_set_ct_threshold(priv);
 194
 195        /* Set initial sensitivity parameters */
 196        /* Set initial calibration set */
 197        priv->hw_params.sens = &iwl6000_sensitivity;
 198        priv->hw_params.calib_init_cfg =
 199                BIT(IWL_CALIB_XTAL)             |
 200                BIT(IWL_CALIB_LO)               |
 201                BIT(IWL_CALIB_TX_IQ)            |
 202                BIT(IWL_CALIB_BASE_BAND);
 203        if (priv->cfg->need_dc_calib)
 204                priv->hw_params.calib_rt_cfg |= BIT(IWL_CALIB_CFG_DC_IDX);
 205        if (priv->cfg->need_temp_offset_calib)
 206                priv->hw_params.calib_init_cfg |= BIT(IWL_CALIB_TEMP_OFFSET);
 207
 208        priv->hw_params.beacon_time_tsf_bits = IWLAGN_EXT_BEACON_TIME_POS;
 209
 210        return 0;
 211}
 212
 213static int iwl6000_hw_channel_switch(struct iwl_priv *priv,
 214                                     struct ieee80211_channel_switch *ch_switch)
 215{
 216        /*
 217         * MULTI-FIXME
 218         * See iwl_mac_channel_switch.
 219         */
 220        struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
 221        struct iwl6000_channel_switch_cmd cmd;
 222        const struct iwl_channel_info *ch_info;
 223        u32 switch_time_in_usec, ucode_switch_time;
 224        u16 ch;
 225        u32 tsf_low;
 226        u8 switch_count;
 227        u16 beacon_interval = le16_to_cpu(ctx->timing.beacon_interval);
 228        struct ieee80211_vif *vif = ctx->vif;
 229        struct iwl_host_cmd hcmd = {
 230                .id = REPLY_CHANNEL_SWITCH,
 231                .len = sizeof(cmd),
 232                .flags = CMD_SYNC,
 233                .data = &cmd,
 234        };
 235
 236        cmd.band = priv->band == IEEE80211_BAND_2GHZ;
 237        ch = ch_switch->channel->hw_value;
 238        IWL_DEBUG_11H(priv, "channel switch from %u to %u\n",
 239                      ctx->active.channel, ch);
 240        cmd.channel = cpu_to_le16(ch);
 241        cmd.rxon_flags = ctx->staging.flags;
 242        cmd.rxon_filter_flags = ctx->staging.filter_flags;
 243        switch_count = ch_switch->count;
 244        tsf_low = ch_switch->timestamp & 0x0ffffffff;
 245        /*
 246         * calculate the ucode channel switch time
 247         * adding TSF as one of the factor for when to switch
 248         */
 249        if ((priv->ucode_beacon_time > tsf_low) && beacon_interval) {
 250                if (switch_count > ((priv->ucode_beacon_time - tsf_low) /
 251                    beacon_interval)) {
 252                        switch_count -= (priv->ucode_beacon_time -
 253                                tsf_low) / beacon_interval;
 254                } else
 255                        switch_count = 0;
 256        }
 257        if (switch_count <= 1)
 258                cmd.switch_time = cpu_to_le32(priv->ucode_beacon_time);
 259        else {
 260                switch_time_in_usec =
 261                        vif->bss_conf.beacon_int * switch_count * TIME_UNIT;
 262                ucode_switch_time = iwl_usecs_to_beacons(priv,
 263                                                         switch_time_in_usec,
 264                                                         beacon_interval);
 265                cmd.switch_time = iwl_add_beacon_time(priv,
 266                                                      priv->ucode_beacon_time,
 267                                                      ucode_switch_time,
 268                                                      beacon_interval);
 269        }
 270        IWL_DEBUG_11H(priv, "uCode time for the switch is 0x%x\n",
 271                      cmd.switch_time);
 272        ch_info = iwl_get_channel_info(priv, priv->band, ch);
 273        if (ch_info)
 274                cmd.expect_beacon = is_channel_radar(ch_info);
 275        else {
 276                IWL_ERR(priv, "invalid channel switch from %u to %u\n",
 277                        ctx->active.channel, ch);
 278                return -EFAULT;
 279        }
 280        priv->switch_rxon.channel = cmd.channel;
 281        priv->switch_rxon.switch_in_progress = true;
 282
 283        return iwl_send_cmd_sync(priv, &hcmd);
 284}
 285
 286static struct iwl_lib_ops iwl6000_lib = {
 287        .set_hw_params = iwl6000_hw_set_hw_params,
 288        .txq_update_byte_cnt_tbl = iwlagn_txq_update_byte_cnt_tbl,
 289        .txq_inval_byte_cnt_tbl = iwlagn_txq_inval_byte_cnt_tbl,
 290        .txq_set_sched = iwlagn_txq_set_sched,
 291        .txq_agg_enable = iwlagn_txq_agg_enable,
 292        .txq_agg_disable = iwlagn_txq_agg_disable,
 293        .txq_attach_buf_to_tfd = iwl_hw_txq_attach_buf_to_tfd,
 294        .txq_free_tfd = iwl_hw_txq_free_tfd,
 295        .txq_init = iwl_hw_tx_queue_init,
 296        .rx_handler_setup = iwlagn_rx_handler_setup,
 297        .setup_deferred_work = iwlagn_setup_deferred_work,
 298        .is_valid_rtc_data_addr = iwlagn_hw_valid_rtc_data_addr,
 299        .load_ucode = iwlagn_load_ucode,
 300        .dump_nic_event_log = iwl_dump_nic_event_log,
 301        .dump_nic_error_log = iwl_dump_nic_error_log,
 302        .dump_csr = iwl_dump_csr,
 303        .dump_fh = iwl_dump_fh,
 304        .init_alive_start = iwlagn_init_alive_start,
 305        .alive_notify = iwlagn_alive_notify,
 306        .send_tx_power = iwlagn_send_tx_power,
 307        .update_chain_flags = iwl_update_chain_flags,
 308        .set_channel_switch = iwl6000_hw_channel_switch,
 309        .apm_ops = {
 310                .init = iwl_apm_init,
 311                .config = iwl6000_nic_config,
 312        },
 313        .eeprom_ops = {
 314                .regulatory_bands = {
 315                        EEPROM_REG_BAND_1_CHANNELS,
 316                        EEPROM_REG_BAND_2_CHANNELS,
 317                        EEPROM_REG_BAND_3_CHANNELS,
 318                        EEPROM_REG_BAND_4_CHANNELS,
 319                        EEPROM_REG_BAND_5_CHANNELS,
 320                        EEPROM_6000_REG_BAND_24_HT40_CHANNELS,
 321                        EEPROM_REG_BAND_52_HT40_CHANNELS
 322                },
 323                .acquire_semaphore = iwlcore_eeprom_acquire_semaphore,
 324                .release_semaphore = iwlcore_eeprom_release_semaphore,
 325                .calib_version  = iwlagn_eeprom_calib_version,
 326                .query_addr = iwlagn_eeprom_query_addr,
 327                .update_enhanced_txpower = iwlcore_eeprom_enhanced_txpower,
 328        },
 329        .isr_ops = {
 330                .isr = iwl_isr_ict,
 331                .free = iwl_free_isr_ict,
 332                .alloc = iwl_alloc_isr_ict,
 333                .reset = iwl_reset_ict,
 334                .disable = iwl_disable_ict,
 335        },
 336        .temp_ops = {
 337                .temperature = iwlagn_temperature,
 338         },
 339        .debugfs_ops = {
 340                .rx_stats_read = iwl_ucode_rx_stats_read,
 341                .tx_stats_read = iwl_ucode_tx_stats_read,
 342                .general_stats_read = iwl_ucode_general_stats_read,
 343                .bt_stats_read = iwl_ucode_bt_stats_read,
 344                .reply_tx_error = iwl_reply_tx_error_read,
 345        },
 346        .check_plcp_health = iwl_good_plcp_health,
 347        .check_ack_health = iwl_good_ack_health,
 348        .txfifo_flush = iwlagn_txfifo_flush,
 349        .dev_txfifo_flush = iwlagn_dev_txfifo_flush,
 350        .tt_ops = {
 351                .lower_power_detection = iwl_tt_is_low_power_state,
 352                .tt_power_mode = iwl_tt_current_power_mode,
 353                .ct_kill_check = iwl_check_for_ct_kill,
 354        }
 355};
 356
 357static struct iwl_lib_ops iwl6000g2b_lib = {
 358        .set_hw_params = iwl6000_hw_set_hw_params,
 359        .txq_update_byte_cnt_tbl = iwlagn_txq_update_byte_cnt_tbl,
 360        .txq_inval_byte_cnt_tbl = iwlagn_txq_inval_byte_cnt_tbl,
 361        .txq_set_sched = iwlagn_txq_set_sched,
 362        .txq_agg_enable = iwlagn_txq_agg_enable,
 363        .txq_agg_disable = iwlagn_txq_agg_disable,
 364        .txq_attach_buf_to_tfd = iwl_hw_txq_attach_buf_to_tfd,
 365        .txq_free_tfd = iwl_hw_txq_free_tfd,
 366        .txq_init = iwl_hw_tx_queue_init,
 367        .rx_handler_setup = iwlagn_bt_rx_handler_setup,
 368        .setup_deferred_work = iwlagn_bt_setup_deferred_work,
 369        .cancel_deferred_work = iwlagn_bt_cancel_deferred_work,
 370        .is_valid_rtc_data_addr = iwlagn_hw_valid_rtc_data_addr,
 371        .load_ucode = iwlagn_load_ucode,
 372        .dump_nic_event_log = iwl_dump_nic_event_log,
 373        .dump_nic_error_log = iwl_dump_nic_error_log,
 374        .dump_csr = iwl_dump_csr,
 375        .dump_fh = iwl_dump_fh,
 376        .init_alive_start = iwlagn_init_alive_start,
 377        .alive_notify = iwlagn_alive_notify,
 378        .send_tx_power = iwlagn_send_tx_power,
 379        .update_chain_flags = iwl_update_chain_flags,
 380        .set_channel_switch = iwl6000_hw_channel_switch,
 381        .apm_ops = {
 382                .init = iwl_apm_init,
 383                .config = iwl6000_nic_config,
 384        },
 385        .eeprom_ops = {
 386                .regulatory_bands = {
 387                        EEPROM_REG_BAND_1_CHANNELS,
 388                        EEPROM_REG_BAND_2_CHANNELS,
 389                        EEPROM_REG_BAND_3_CHANNELS,
 390                        EEPROM_REG_BAND_4_CHANNELS,
 391                        EEPROM_REG_BAND_5_CHANNELS,
 392                        EEPROM_6000_REG_BAND_24_HT40_CHANNELS,
 393                        EEPROM_REG_BAND_52_HT40_CHANNELS
 394                },
 395                .acquire_semaphore = iwlcore_eeprom_acquire_semaphore,
 396                .release_semaphore = iwlcore_eeprom_release_semaphore,
 397                .calib_version  = iwlagn_eeprom_calib_version,
 398                .query_addr = iwlagn_eeprom_query_addr,
 399                .update_enhanced_txpower = iwlcore_eeprom_enhanced_txpower,
 400        },
 401        .isr_ops = {
 402                .isr = iwl_isr_ict,
 403                .free = iwl_free_isr_ict,
 404                .alloc = iwl_alloc_isr_ict,
 405                .reset = iwl_reset_ict,
 406                .disable = iwl_disable_ict,
 407        },
 408        .temp_ops = {
 409                .temperature = iwlagn_temperature,
 410         },
 411        .debugfs_ops = {
 412                .rx_stats_read = iwl_ucode_rx_stats_read,
 413                .tx_stats_read = iwl_ucode_tx_stats_read,
 414                .general_stats_read = iwl_ucode_general_stats_read,
 415                .bt_stats_read = iwl_ucode_bt_stats_read,
 416                .reply_tx_error = iwl_reply_tx_error_read,
 417        },
 418        .check_plcp_health = iwl_good_plcp_health,
 419        .check_ack_health = iwl_good_ack_health,
 420        .txfifo_flush = iwlagn_txfifo_flush,
 421        .dev_txfifo_flush = iwlagn_dev_txfifo_flush,
 422        .tt_ops = {
 423                .lower_power_detection = iwl_tt_is_low_power_state,
 424                .tt_power_mode = iwl_tt_current_power_mode,
 425                .ct_kill_check = iwl_check_for_ct_kill,
 426        }
 427};
 428
 429static struct iwl_nic_ops iwl6050_nic_ops = {
 430        .additional_nic_config = &iwl6050_additional_nic_config,
 431};
 432
 433static struct iwl_nic_ops iwl6050g2_nic_ops = {
 434        .additional_nic_config = &iwl6050g2_additional_nic_config,
 435};
 436
 437static const struct iwl_ops iwl6000_ops = {
 438        .lib = &iwl6000_lib,
 439        .hcmd = &iwlagn_hcmd,
 440        .utils = &iwlagn_hcmd_utils,
 441        .led = &iwlagn_led_ops,
 442        .ieee80211_ops = &iwlagn_hw_ops,
 443};
 444
 445static const struct iwl_ops iwl6050_ops = {
 446        .lib = &iwl6000_lib,
 447        .hcmd = &iwlagn_hcmd,
 448        .utils = &iwlagn_hcmd_utils,
 449        .led = &iwlagn_led_ops,
 450        .nic = &iwl6050_nic_ops,
 451        .ieee80211_ops = &iwlagn_hw_ops,
 452};
 453
 454static const struct iwl_ops iwl6050g2_ops = {
 455        .lib = &iwl6000_lib,
 456        .hcmd = &iwlagn_hcmd,
 457        .utils = &iwlagn_hcmd_utils,
 458        .led = &iwlagn_led_ops,
 459        .nic = &iwl6050g2_nic_ops,
 460        .ieee80211_ops = &iwlagn_hw_ops,
 461};
 462
 463static const struct iwl_ops iwl6000g2b_ops = {
 464        .lib = &iwl6000g2b_lib,
 465        .hcmd = &iwlagn_bt_hcmd,
 466        .utils = &iwlagn_hcmd_utils,
 467        .led = &iwlagn_led_ops,
 468        .ieee80211_ops = &iwlagn_hw_ops,
 469};
 470
 471static struct iwl_base_params iwl6000_base_params = {
 472        .eeprom_size = OTP_LOW_IMAGE_SIZE,
 473        .num_of_queues = IWLAGN_NUM_QUEUES,
 474        .num_of_ampdu_queues = IWLAGN_NUM_AMPDU_QUEUES,
 475        .pll_cfg_val = 0,
 476        .set_l0s = true,
 477        .use_bsm = false,
 478        .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
 479        .shadow_ram_support = true,
 480        .led_compensation = 51,
 481        .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
 482        .supports_idle = true,
 483        .adv_thermal_throttle = true,
 484        .support_ct_kill_exit = true,
 485        .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
 486        .chain_noise_scale = 1000,
 487        .wd_timeout = IWL_DEF_WD_TIMEOUT,
 488        .max_event_log_size = 512,
 489        .ucode_tracing = true,
 490        .sensitivity_calib_by_driver = true,
 491        .chain_noise_calib_by_driver = true,
 492        .shadow_reg_enable = true,
 493};
 494
 495static struct iwl_base_params iwl6050_base_params = {
 496        .eeprom_size = OTP_LOW_IMAGE_SIZE,
 497        .num_of_queues = IWLAGN_NUM_QUEUES,
 498        .num_of_ampdu_queues = IWLAGN_NUM_AMPDU_QUEUES,
 499        .pll_cfg_val = 0,
 500        .set_l0s = true,
 501        .use_bsm = false,
 502        .max_ll_items = OTP_MAX_LL_ITEMS_6x50,
 503        .shadow_ram_support = true,
 504        .led_compensation = 51,
 505        .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
 506        .supports_idle = true,
 507        .adv_thermal_throttle = true,
 508        .support_ct_kill_exit = true,
 509        .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
 510        .chain_noise_scale = 1500,
 511        .wd_timeout = IWL_DEF_WD_TIMEOUT,
 512        .max_event_log_size = 1024,
 513        .ucode_tracing = true,
 514        .sensitivity_calib_by_driver = true,
 515        .chain_noise_calib_by_driver = true,
 516        .shadow_reg_enable = true,
 517};
 518static struct iwl_base_params iwl6000_g2_base_params = {
 519        .eeprom_size = OTP_LOW_IMAGE_SIZE,
 520        .num_of_queues = IWLAGN_NUM_QUEUES,
 521        .num_of_ampdu_queues = IWLAGN_NUM_AMPDU_QUEUES,
 522        .pll_cfg_val = 0,
 523        .set_l0s = true,
 524        .use_bsm = false,
 525        .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
 526        .shadow_ram_support = true,
 527        .led_compensation = 57,
 528        .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
 529        .supports_idle = true,
 530        .adv_thermal_throttle = true,
 531        .support_ct_kill_exit = true,
 532        .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
 533        .chain_noise_scale = 1000,
 534        .wd_timeout = IWL_LONG_WD_TIMEOUT,
 535        .max_event_log_size = 512,
 536        .ucode_tracing = true,
 537        .sensitivity_calib_by_driver = true,
 538        .chain_noise_calib_by_driver = true,
 539        .shadow_reg_enable = true,
 540};
 541
 542static struct iwl_ht_params iwl6000_ht_params = {
 543        .ht_greenfield_support = true,
 544        .use_rts_for_aggregation = true, /* use rts/cts protection */
 545};
 546
 547static struct iwl_bt_params iwl6000_bt_params = {
 548        .bt_statistics = true,
 549        /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
 550        .advanced_bt_coexist = true,
 551        .agg_time_limit = BT_AGG_THRESHOLD_DEF,
 552        .bt_init_traffic_load = IWL_BT_COEX_TRAFFIC_LOAD_NONE,
 553        .bt_prio_boost = IWLAGN_BT_PRIO_BOOST_DEFAULT,
 554        .bt_sco_disable = true,
 555};
 556
 557#define IWL_DEVICE_6005                                         \
 558        .fw_name_pre = IWL6000G2A_FW_PRE,                       \
 559        .ucode_api_max = IWL6000G2_UCODE_API_MAX,               \
 560        .ucode_api_min = IWL6000G2_UCODE_API_MIN,               \
 561        .eeprom_ver = EEPROM_6000G2_EEPROM_VERSION,             \
 562        .eeprom_calib_ver = EEPROM_6000G2_TX_POWER_VERSION,     \
 563        .ops = &iwl6000_ops,                                    \
 564        .mod_params = &iwlagn_mod_params,                       \
 565        .base_params = &iwl6000_g2_base_params,                 \
 566        .need_dc_calib = true,                                  \
 567        .need_temp_offset_calib = true,                         \
 568        .led_mode = IWL_LED_RF_STATE
 569
 570struct iwl_cfg iwl6005_2agn_cfg = {
 571        .name = "Intel(R) Centrino(R) Advanced-N 6205 AGN",
 572        IWL_DEVICE_6005,
 573        .ht_params = &iwl6000_ht_params,
 574};
 575
 576struct iwl_cfg iwl6005_2abg_cfg = {
 577        .name = "Intel(R) Centrino(R) Advanced-N 6205 ABG",
 578        IWL_DEVICE_6005,
 579};
 580
 581struct iwl_cfg iwl6005_2bg_cfg = {
 582        .name = "Intel(R) Centrino(R) Advanced-N 6205 BG",
 583        IWL_DEVICE_6005,
 584};
 585
 586#define IWL_DEVICE_6030                                         \
 587        .fw_name_pre = IWL6000G2B_FW_PRE,                       \
 588        .ucode_api_max = IWL6000G2_UCODE_API_MAX,               \
 589        .ucode_api_min = IWL6000G2_UCODE_API_MIN,               \
 590        .eeprom_ver = EEPROM_6000G2_EEPROM_VERSION,             \
 591        .eeprom_calib_ver = EEPROM_6000G2_TX_POWER_VERSION,     \
 592        .ops = &iwl6000g2b_ops,                                 \
 593        .mod_params = &iwlagn_mod_params,                       \
 594        .base_params = &iwl6000_g2_base_params,                 \
 595        .bt_params = &iwl6000_bt_params,                        \
 596        .need_dc_calib = true,                                  \
 597        .need_temp_offset_calib = true,                         \
 598        .led_mode = IWL_LED_RF_STATE,                           \
 599        .adv_pm = true                                          \
 600
 601struct iwl_cfg iwl6030_2agn_cfg = {
 602        .name = "Intel(R) Centrino(R) Advanced-N 6230 AGN",
 603        IWL_DEVICE_6030,
 604        .ht_params = &iwl6000_ht_params,
 605};
 606
 607struct iwl_cfg iwl6030_2abg_cfg = {
 608        .name = "Intel(R) Centrino(R) Advanced-N 6230 ABG",
 609        IWL_DEVICE_6030,
 610};
 611
 612struct iwl_cfg iwl6030_2bgn_cfg = {
 613        .name = "Intel(R) Centrino(R) Advanced-N 6230 BGN",
 614        IWL_DEVICE_6030,
 615        .ht_params = &iwl6000_ht_params,
 616};
 617
 618struct iwl_cfg iwl6030_2bg_cfg = {
 619        .name = "Intel(R) Centrino(R) Advanced-N 6230 BG",
 620        IWL_DEVICE_6030,
 621};
 622
 623struct iwl_cfg iwl1030_bgn_cfg = {
 624        .name = "Intel(R) Centrino(R) Wireless-N 1030 BGN",
 625        IWL_DEVICE_6030,
 626        .ht_params = &iwl6000_ht_params,
 627};
 628
 629struct iwl_cfg iwl1030_bg_cfg = {
 630        .name = "Intel(R) Centrino(R) Wireless-N 1030 BG",
 631        IWL_DEVICE_6030,
 632};
 633
 634struct iwl_cfg iwl130_bgn_cfg = {
 635        .name = "Intel(R) Centrino(R) Wireless-N 130 BGN",
 636        IWL_DEVICE_6030,
 637        .ht_params = &iwl6000_ht_params,
 638        .rx_with_siso_diversity = true,
 639};
 640
 641struct iwl_cfg iwl130_bg_cfg = {
 642        .name = "Intel(R) Centrino(R) Wireless-N 130 BG",
 643        IWL_DEVICE_6030,
 644        .rx_with_siso_diversity = true,
 645};
 646
 647/*
 648 * "i": Internal configuration, use internal Power Amplifier
 649 */
 650#define IWL_DEVICE_6000i                                        \
 651        .fw_name_pre = IWL6000_FW_PRE,                          \
 652        .ucode_api_max = IWL6000_UCODE_API_MAX,                 \
 653        .ucode_api_min = IWL6000_UCODE_API_MIN,                 \
 654        .valid_tx_ant = ANT_BC,         /* .cfg overwrite */    \
 655        .valid_rx_ant = ANT_BC,         /* .cfg overwrite */    \
 656        .eeprom_ver = EEPROM_6000_EEPROM_VERSION,               \
 657        .eeprom_calib_ver = EEPROM_6000_TX_POWER_VERSION,       \
 658        .ops = &iwl6000_ops,                                    \
 659        .mod_params = &iwlagn_mod_params,                       \
 660        .base_params = &iwl6000_base_params,                    \
 661        .pa_type = IWL_PA_INTERNAL,                             \
 662        .led_mode = IWL_LED_BLINK
 663
 664struct iwl_cfg iwl6000i_2agn_cfg = {
 665        .name = "Intel(R) Centrino(R) Advanced-N 6200 AGN",
 666        IWL_DEVICE_6000i,
 667        .ht_params = &iwl6000_ht_params,
 668};
 669
 670struct iwl_cfg iwl6000i_2abg_cfg = {
 671        .name = "Intel(R) Centrino(R) Advanced-N 6200 ABG",
 672        IWL_DEVICE_6000i,
 673};
 674
 675struct iwl_cfg iwl6000i_2bg_cfg = {
 676        .name = "Intel(R) Centrino(R) Advanced-N 6200 BG",
 677        IWL_DEVICE_6000i,
 678};
 679
 680#define IWL_DEVICE_6050                                         \
 681        .fw_name_pre = IWL6050_FW_PRE,                          \
 682        .ucode_api_max = IWL6050_UCODE_API_MAX,                 \
 683        .ucode_api_min = IWL6050_UCODE_API_MIN,                 \
 684        .valid_tx_ant = ANT_AB,         /* .cfg overwrite */    \
 685        .valid_rx_ant = ANT_AB,         /* .cfg overwrite */    \
 686        .ops = &iwl6050_ops,                                    \
 687        .eeprom_ver = EEPROM_6050_EEPROM_VERSION,               \
 688        .eeprom_calib_ver = EEPROM_6050_TX_POWER_VERSION,       \
 689        .mod_params = &iwlagn_mod_params,                       \
 690        .base_params = &iwl6050_base_params,                    \
 691        .need_dc_calib = true,                                  \
 692        .led_mode = IWL_LED_BLINK,                              \
 693        .internal_wimax_coex = true
 694
 695struct iwl_cfg iwl6050_2agn_cfg = {
 696        .name = "Intel(R) Centrino(R) Advanced-N + WiMAX 6250 AGN",
 697        IWL_DEVICE_6050,
 698        .ht_params = &iwl6000_ht_params,
 699};
 700
 701struct iwl_cfg iwl6050_2abg_cfg = {
 702        .name = "Intel(R) Centrino(R) Advanced-N + WiMAX 6250 ABG",
 703        IWL_DEVICE_6050,
 704};
 705
 706struct iwl_cfg iwl6150_bgn_cfg = {
 707        .name = "Intel(R) Centrino(R) Wireless-N + WiMAX 6150 BGN",
 708        .fw_name_pre = IWL6050_FW_PRE,
 709        .ucode_api_max = IWL6050_UCODE_API_MAX,
 710        .ucode_api_min = IWL6050_UCODE_API_MIN,
 711        .eeprom_ver = EEPROM_6050G2_EEPROM_VERSION,
 712        .eeprom_calib_ver = EEPROM_6050G2_TX_POWER_VERSION,
 713        .ops = &iwl6050g2_ops,
 714        .mod_params = &iwlagn_mod_params,
 715        .base_params = &iwl6050_base_params,
 716        .ht_params = &iwl6000_ht_params,
 717        .need_dc_calib = true,
 718        .led_mode = IWL_LED_RF_STATE,
 719        .internal_wimax_coex = true,
 720};
 721
 722struct iwl_cfg iwl6000_3agn_cfg = {
 723        .name = "Intel(R) Centrino(R) Ultimate-N 6300 AGN",
 724        .fw_name_pre = IWL6000_FW_PRE,
 725        .ucode_api_max = IWL6000_UCODE_API_MAX,
 726        .ucode_api_min = IWL6000_UCODE_API_MIN,
 727        .eeprom_ver = EEPROM_6000_EEPROM_VERSION,
 728        .eeprom_calib_ver = EEPROM_6000_TX_POWER_VERSION,
 729        .ops = &iwl6000_ops,
 730        .mod_params = &iwlagn_mod_params,
 731        .base_params = &iwl6000_base_params,
 732        .ht_params = &iwl6000_ht_params,
 733        .need_dc_calib = true,
 734        .led_mode = IWL_LED_BLINK,
 735};
 736
 737MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX));
 738MODULE_FIRMWARE(IWL6050_MODULE_FIRMWARE(IWL6050_UCODE_API_MAX));
 739MODULE_FIRMWARE(IWL6000G2A_MODULE_FIRMWARE(IWL6000G2_UCODE_API_MAX));
 740MODULE_FIRMWARE(IWL6000G2B_MODULE_FIRMWARE(IWL6000G2_UCODE_API_MAX));
 741