diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi')
43 files changed, 37912 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c new file mode 100644 index 00000000000..01b49eb8c8e --- /dev/null +++ b/drivers/net/wireless/iwlwifi/iwl-1000.c | |||
| @@ -0,0 +1,251 @@ | |||
| 1 | /****************************************************************************** | ||
| 2 | * | ||
| 3 | * Copyright(c) 2008 - 2011 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/delay.h> | ||
| 31 | #include <linux/skbuff.h> | ||
| 32 | #include <linux/netdevice.h> | ||
| 33 | #include <linux/wireless.h> | ||
| 34 | #include <net/mac80211.h> | ||
| 35 | #include <linux/etherdevice.h> | ||
| 36 | #include <asm/unaligned.h> | ||
| 37 | #include <linux/stringify.h> | ||
| 38 | |||
| 39 | #include "iwl-eeprom.h" | ||
| 40 | #include "iwl-dev.h" | ||
| 41 | #include "iwl-core.h" | ||
| 42 | #include "iwl-io.h" | ||
| 43 | #include "iwl-sta.h" | ||
| 44 | #include "iwl-agn.h" | ||
| 45 | #include "iwl-helpers.h" | ||
| 46 | #include "iwl-agn-hw.h" | ||
| 47 | |||
| 48 | /* Highest firmware API version supported */ | ||
| 49 | #define IWL1000_UCODE_API_MAX 5 | ||
| 50 | #define IWL100_UCODE_API_MAX 5 | ||
| 51 | |||
| 52 | /* Lowest firmware API version supported */ | ||
| 53 | #define IWL1000_UCODE_API_MIN 1 | ||
| 54 | #define IWL100_UCODE_API_MIN 5 | ||
| 55 | |||
| 56 | #define IWL1000_FW_PRE "iwlwifi-1000-" | ||
| 57 | #define IWL1000_MODULE_FIRMWARE(api) IWL1000_FW_PRE __stringify(api) ".ucode" | ||
| 58 | |||
| 59 | #define IWL100_FW_PRE "iwlwifi-100-" | ||
| 60 | #define IWL100_MODULE_FIRMWARE(api) IWL100_FW_PRE __stringify(api) ".ucode" | ||
| 61 | |||
| 62 | |||
| 63 | /* | ||
| 64 | * For 1000, use advance thermal throttling critical temperature threshold, | ||
| 65 | * but legacy thermal management implementation for now. | ||
| 66 | * This is for the reason of 1000 uCode using advance thermal throttling API | ||
| 67 | * but not implement ct_kill_exit based on ct_kill exit temperature | ||
| 68 | * so the thermal throttling will still based on legacy thermal throttling | ||
| 69 | * management. | ||
| 70 | * The code here need to be modified once 1000 uCode has the advanced thermal | ||
| 71 | * throttling algorithm in place | ||
| 72 | */ | ||
| 73 | static void iwl1000_set_ct_threshold(struct iwl_priv *priv) | ||
| 74 | { | ||
| 75 | /* want Celsius */ | ||
| 76 | priv->hw_params.ct_kill_threshold = CT_KILL_THRESHOLD_LEGACY; | ||
| 77 | priv->hw_params.ct_kill_exit_threshold = CT_KILL_EXIT_THRESHOLD; | ||
| 78 | } | ||
| 79 | |||
| 80 | /* NIC configuration for 1000 series */ | ||
| 81 | static void iwl1000_nic_config(struct iwl_priv *priv) | ||
| 82 | { | ||
| 83 | /* set CSR_HW_CONFIG_REG for uCode use */ | ||
| 84 | iwl_set_bit(priv, CSR_HW_IF_CONFIG_REG, | ||
| 85 | CSR_HW_IF_CONFIG_REG_BIT_RADIO_SI | | ||
| 86 | CSR_HW_IF_CONFIG_REG_BIT_MAC_SI); | ||
| 87 | |||
| 88 | /* Setting digital SVR for 1000 card to 1.32V */ | ||
| 89 | /* locking is acquired in iwl_set_bits_mask_prph() function */ | ||
| 90 | iwl_set_bits_mask_prph(priv, APMG_DIGITAL_SVR_REG, | ||
| 91 | APMG_SVR_DIGITAL_VOLTAGE_1_32, | ||
| 92 | ~APMG_SVR_VOLTAGE_CONFIG_BIT_MSK); | ||
| 93 | } | ||
| 94 | |||
| 95 | static struct iwl_sensitivity_ranges iwl1000_sensitivity = { | ||
| 96 | .min_nrg_cck = 95, | ||
| 97 | .max_nrg_cck = 0, /* not used, set to 0 */ | ||
| 98 | .auto_corr_min_ofdm = 90, | ||
| 99 | .auto_corr_min_ofdm_mrc = 170, | ||
| 100 | .auto_corr_min_ofdm_x1 = 120, | ||
| 101 | .auto_corr_min_ofdm_mrc_x1 = 240, | ||
| 102 | |||
| 103 | .auto_corr_max_ofdm = 120, | ||
| 104 | .auto_corr_max_ofdm_mrc = 210, | ||
| 105 | .auto_corr_max_ofdm_x1 = 155, | ||
| 106 | .auto_corr_max_ofdm_mrc_x1 = 290, | ||
| 107 | |||
| 108 | .auto_corr_min_cck = 125, | ||
| 109 | .auto_corr_max_cck = 200, | ||
| 110 | .auto_corr_min_cck_mrc = 170, | ||
| 111 | .auto_corr_max_cck_mrc = 400, | ||
| 112 | .nrg_th_cck = 95, | ||
| 113 | .nrg_th_ofdm = 95, | ||
| 114 | |||
| 115 | .barker_corr_th_min = 190, | ||
| 116 | .barker_corr_th_min_mrc = 390, | ||
| 117 | .nrg_th_cca = 62, | ||
| 118 | }; | ||
| 119 | |||
| 120 | static int iwl1000_hw_set_hw_params(struct iwl_priv *priv) | ||
| 121 | { | ||
| 122 | if (iwlagn_mod_params.num_of_queues >= IWL_MIN_NUM_QUEUES && | ||
| 123 | iwlagn_mod_params.num_of_queues <= IWLAGN_NUM_QUEUES) | ||
| 124 | priv->cfg->base_params->num_of_queues = | ||
| 125 | iwlagn_mod_params.num_of_queues; | ||
| 126 | |||
| 127 | priv->hw_params.max_txq_num = priv->cfg->base_params->num_of_queues; | ||
| 128 | priv->hw_params.scd_bc_tbls_size = | ||
| 129 | priv->cfg->base_params->num_of_queues * | ||
| 130 | sizeof(struct iwlagn_scd_bc_tbl); | ||
| 131 | priv->hw_params.tfd_size = sizeof(struct iwl_tfd); | ||
| 132 | priv->hw_params.max_stations = IWLAGN_STATION_COUNT; | ||
| 133 | priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id = IWLAGN_BROADCAST_ID; | ||
| 134 | |||
| 135 | priv->hw_params.max_data_size = IWLAGN_RTC_DATA_SIZE; | ||
| 136 | priv->hw_params.max_inst_size = IWLAGN_RTC_INST_SIZE; | ||
| 137 | |||
| 138 | priv->hw_params.ht40_channel = BIT(IEEE80211_BAND_2GHZ) | | ||
| 139 | BIT(IEEE80211_BAND_5GHZ); | ||
| 140 | |||
| 141 | priv->hw_params.tx_chains_num = num_of_ant(priv->cfg->valid_tx_ant); | ||
| 142 | if (priv->cfg->rx_with_siso_diversity) | ||
| 143 | priv->hw_params.rx_chains_num = 1; | ||
| 144 | else | ||
| 145 | priv->hw_params.rx_cha | ||
