27
27
#include <linux/kernel.h>
28
28
#include <linux/module.h>
29
29
#include <linux/init.h>
30
#include <linux/pci.h>
31
#include <linux/dma-mapping.h>
32
30
#include <linux/delay.h>
33
31
#include <linux/sched.h>
34
32
#include <linux/skbuff.h>
35
33
#include <linux/netdevice.h>
36
#include <linux/wireless.h>
37
34
#include <net/mac80211.h>
38
35
#include <linux/etherdevice.h>
39
36
#include <asm/unaligned.h>
67
64
static void iwl5000_nic_config(struct iwl_priv *priv)
69
66
unsigned long flags;
72
spin_lock_irqsave(&priv->lock, flags);
74
radio_cfg = iwl_eeprom_query16(priv, EEPROM_RADIO_CONFIG);
76
/* write radio config values to register */
77
if (EEPROM_RF_CFG_TYPE_MSK(radio_cfg) < EEPROM_RF_CONFIG_TYPE_MAX)
78
iwl_set_bit(priv, CSR_HW_IF_CONFIG_REG,
79
EEPROM_RF_CFG_TYPE_MSK(radio_cfg) |
80
EEPROM_RF_CFG_STEP_MSK(radio_cfg) |
81
EEPROM_RF_CFG_DASH_MSK(radio_cfg));
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);
70
spin_lock_irqsave(&priv->shrd->lock, flags);
88
72
/* W/A : NIC is stuck in a reset state after Early PCIe power off
89
73
* (PCIe power is lost before PERST# is asserted),
90
74
* causing ME FW to lose ownership and not being able to obtain it back.
92
iwl_set_bits_mask_prph(priv, APMG_PS_CTRL_REG,
76
iwl_set_bits_mask_prph(bus(priv), APMG_PS_CTRL_REG,
93
77
APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS,
94
78
~APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS);
97
spin_unlock_irqrestore(&priv->lock, flags);
81
spin_unlock_irqrestore(&priv->shrd->lock, flags);
100
84
static struct iwl_sensitivity_ranges iwl5000_sensitivity = {
102
86
.max_nrg_cck = 0, /* not used, set to 0 */
103
87
.auto_corr_min_ofdm = 90,
104
88
.auto_corr_min_ofdm_mrc = 170,
105
.auto_corr_min_ofdm_x1 = 120,
106
.auto_corr_min_ofdm_mrc_x1 = 240,
89
.auto_corr_min_ofdm_x1 = 105,
90
.auto_corr_min_ofdm_mrc_x1 = 220,
108
92
.auto_corr_max_ofdm = 120,
109
93
.auto_corr_max_ofdm_mrc = 210,
113
97
.auto_corr_min_cck = 125,
114
98
.auto_corr_max_cck = 200,
115
.auto_corr_min_cck_mrc = 170,
99
.auto_corr_min_cck_mrc = 200,
116
100
.auto_corr_max_cck_mrc = 400,
120
104
.barker_corr_th_min = 190,
121
105
.barker_corr_th_min_mrc = 390,
148
132
.nrg_th_cca = 62,
135
#define IWL_5150_VOLTAGE_TO_TEMPERATURE_COEFF (-5)
137
static s32 iwl_temp_calib_to_offset(struct iwl_priv *priv)
139
u16 temperature, voltage;
140
__le16 *temp_calib = (__le16 *)iwl_eeprom_query_addr(priv,
141
EEPROM_KELVIN_TEMPERATURE);
143
temperature = le16_to_cpu(temp_calib[0]);
144
voltage = le16_to_cpu(temp_calib[1]);
146
/* offset = temp - volt / coeff */
147
return (s32)(temperature - voltage / IWL_5150_VOLTAGE_TO_TEMPERATURE_COEFF);
151
150
static void iwl5150_set_ct_threshold(struct iwl_priv *priv)
153
152
const s32 volt2temp_coef = IWL_5150_VOLTAGE_TO_TEMPERATURE_COEFF;
154
153
s32 threshold = (s32)CELSIUS_TO_KELVIN(CT_KILL_THRESHOLD_LEGACY) -
155
154
iwl_temp_calib_to_offset(priv);
157
priv->hw_params.ct_kill_threshold = threshold * volt2temp_coef;
156
hw_params(priv).ct_kill_threshold = threshold * volt2temp_coef;
160
159
static void iwl5000_set_ct_threshold(struct iwl_priv *priv)
162
161
/* want Celsius */
163
priv->hw_params.ct_kill_threshold = CT_KILL_THRESHOLD_LEGACY;
162
hw_params(priv).ct_kill_threshold = CT_KILL_THRESHOLD_LEGACY;
166
165
static int iwl5000_hw_set_hw_params(struct iwl_priv *priv)
170
169
priv->cfg->base_params->num_of_queues =
171
170
iwlagn_mod_params.num_of_queues;
173
priv->hw_params.max_txq_num = priv->cfg->base_params->num_of_queues;
174
priv->hw_params.dma_chnl_num = FH50_TCSR_CHNL_NUM;
175
priv->hw_params.scd_bc_tbls_size =
176
priv->cfg->base_params->num_of_queues *
177
sizeof(struct iwlagn_scd_bc_tbl);
178
priv->hw_params.tfd_size = sizeof(struct iwl_tfd);
179
priv->hw_params.max_stations = IWLAGN_STATION_COUNT;
172
hw_params(priv).max_txq_num = priv->cfg->base_params->num_of_queues;
180
173
priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id = IWLAGN_BROADCAST_ID;
182
priv->hw_params.max_data_size = IWLAGN_RTC_DATA_SIZE;
183
priv->hw_params.max_inst_size = IWLAGN_RTC_INST_SIZE;
175
hw_params(priv).max_data_size = IWLAGN_RTC_DATA_SIZE;
176
hw_params(priv).max_inst_size = IWLAGN_RTC_INST_SIZE;
185
priv->hw_params.ht40_channel = BIT(IEEE80211_BAND_2GHZ) |
178
hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ) |
186
179
BIT(IEEE80211_BAND_5GHZ);
187
priv->hw_params.rx_wrt_ptr_reg = FH_RSCSR_CHNL0_WPTR;
189
priv->hw_params.tx_chains_num = num_of_ant(priv->cfg->valid_tx_ant);
190
priv->hw_params.rx_chains_num = num_of_ant(priv->cfg->valid_rx_ant);
191
priv->hw_params.valid_tx_ant = priv->cfg->valid_tx_ant;
192
priv->hw_params.valid_rx_ant = priv->cfg->valid_rx_ant;
181
hw_params(priv).tx_chains_num = num_of_ant(priv->cfg->valid_tx_ant);
182
hw_params(priv).rx_chains_num = num_of_ant(priv->cfg->valid_rx_ant);
183
hw_params(priv).valid_tx_ant = priv->cfg->valid_tx_ant;
184
hw_params(priv).valid_rx_ant = priv->cfg->valid_rx_ant;
194
186
iwl5000_set_ct_threshold(priv);
196
188
/* Set initial sensitivity parameters */
197
189
/* Set initial calibration set */
198
priv->hw_params.sens = &iwl5000_sensitivity;
199
priv->hw_params.calib_init_cfg =
190
hw_params(priv).sens = &iwl5000_sensitivity;
191
hw_params(priv).calib_init_cfg =
200
192
BIT(IWL_CALIB_XTAL) |
201
193
BIT(IWL_CALIB_LO) |
202
194
BIT(IWL_CALIB_TX_IQ) |
203
195
BIT(IWL_CALIB_TX_IQ_PERD) |
204
196
BIT(IWL_CALIB_BASE_BAND);
206
priv->hw_params.beacon_time_tsf_bits = IWLAGN_EXT_BEACON_TIME_POS;
215
205
priv->cfg->base_params->num_of_queues =
216
206
iwlagn_mod_params.num_of_queues;
218
priv->hw_params.max_txq_num = priv->cfg->base_params->num_of_queues;
219
priv->hw_params.dma_chnl_num = FH50_TCSR_CHNL_NUM;
220
priv->hw_params.scd_bc_tbls_size =
221
priv->cfg->base_params->num_of_queues *
222
sizeof(struct iwlagn_scd_bc_tbl);
223
priv->hw_params.tfd_size = sizeof(struct iwl_tfd);
224
priv->hw_params.max_stations = IWLAGN_STATION_COUNT;
208
hw_params(priv).max_txq_num = priv->cfg->base_params->num_of_queues;
225
209
priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id = IWLAGN_BROADCAST_ID;
227
priv->hw_params.max_data_size = IWLAGN_RTC_DATA_SIZE;
228
priv->hw_params.max_inst_size = IWLAGN_RTC_INST_SIZE;
211
hw_params(priv).max_data_size = IWLAGN_RTC_DATA_SIZE;
212
hw_params(priv).max_inst_size = IWLAGN_RTC_INST_SIZE;
230
priv->hw_params.ht40_channel = BIT(IEEE80211_BAND_2GHZ) |
214
hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ) |
231
215
BIT(IEEE80211_BAND_5GHZ);
232
priv->hw_params.rx_wrt_ptr_reg = FH_RSCSR_CHNL0_WPTR;
234
priv->hw_params.tx_chains_num = num_of_ant(priv->cfg->valid_tx_ant);
235
priv->hw_params.rx_chains_num = num_of_ant(priv->cfg->valid_rx_ant);
236
priv->hw_params.valid_tx_ant = priv->cfg->valid_tx_ant;
237
priv->hw_params.valid_rx_ant = priv->cfg->valid_rx_ant;
217
hw_params(priv).tx_chains_num = num_of_ant(priv->cfg->valid_tx_ant);
218
hw_params(priv).rx_chains_num = num_of_ant(priv->cfg->valid_rx_ant);
219
hw_params(priv).valid_tx_ant = priv->cfg->valid_tx_ant;
220
hw_params(priv).valid_rx_ant = priv->cfg->valid_rx_ant;
239
222
iwl5150_set_ct_threshold(priv);
241
224
/* Set initial sensitivity parameters */
242
225
/* Set initial calibration set */
243
priv->hw_params.sens = &iwl5150_sensitivity;
244
priv->hw_params.calib_init_cfg =
226
hw_params(priv).sens = &iwl5150_sensitivity;
227
hw_params(priv).calib_init_cfg =
245
228
BIT(IWL_CALIB_LO) |
246
229
BIT(IWL_CALIB_TX_IQ) |
247
230
BIT(IWL_CALIB_BASE_BAND);
248
231
if (priv->cfg->need_dc_calib)
249
priv->hw_params.calib_init_cfg |= BIT(IWL_CALIB_DC);
251
priv->hw_params.beacon_time_tsf_bits = IWLAGN_EXT_BEACON_TIME_POS;
232
hw_params(priv).calib_init_cfg |= BIT(IWL_CALIB_DC);
336
return iwl_send_cmd_sync(priv, &hcmd);
317
return iwl_trans_send_cmd(trans(priv), &hcmd);
339
320
static struct iwl_lib_ops iwl5000_lib = {
340
321
.set_hw_params = iwl5000_hw_set_hw_params,
341
.rx_handler_setup = iwlagn_rx_handler_setup,
342
.setup_deferred_work = iwlagn_setup_deferred_work,
343
.is_valid_rtc_data_addr = iwlagn_hw_valid_rtc_data_addr,
344
.send_tx_power = iwlagn_send_tx_power,
345
.update_chain_flags = iwl_update_chain_flags,
346
322
.set_channel_switch = iwl5000_hw_channel_switch,
348
.init = iwl_apm_init,
349
.config = iwl5000_nic_config,
323
.nic_config = iwl5000_nic_config,
352
325
.regulatory_bands = {
353
326
EEPROM_REG_BAND_1_CHANNELS,
358
331
EEPROM_REG_BAND_24_HT40_CHANNELS,
359
332
EEPROM_REG_BAND_52_HT40_CHANNELS
361
.query_addr = iwlagn_eeprom_query_addr,
364
.temperature = iwlagn_temperature,
366
.txfifo_flush = iwlagn_txfifo_flush,
367
.dev_txfifo_flush = iwlagn_dev_txfifo_flush,
335
.temperature = iwlagn_temperature,
370
338
static struct iwl_lib_ops iwl5150_lib = {
371
339
.set_hw_params = iwl5150_hw_set_hw_params,
372
.rx_handler_setup = iwlagn_rx_handler_setup,
373
.setup_deferred_work = iwlagn_setup_deferred_work,
374
.is_valid_rtc_data_addr = iwlagn_hw_valid_rtc_data_addr,
375
.send_tx_power = iwlagn_send_tx_power,
376
.update_chain_flags = iwl_update_chain_flags,
377
340
.set_channel_switch = iwl5000_hw_channel_switch,
379
.init = iwl_apm_init,
380
.config = iwl5000_nic_config,
341
.nic_config = iwl5000_nic_config,
383
343
.regulatory_bands = {
384
344
EEPROM_REG_BAND_1_CHANNELS,
389
349
EEPROM_REG_BAND_24_HT40_CHANNELS,
390
350
EEPROM_REG_BAND_52_HT40_CHANNELS
392
.query_addr = iwlagn_eeprom_query_addr,
395
.temperature = iwl5150_temperature,
397
.txfifo_flush = iwlagn_txfifo_flush,
398
.dev_txfifo_flush = iwlagn_dev_txfifo_flush,
401
static const struct iwl_ops iwl5000_ops = {
403
.hcmd = &iwlagn_hcmd,
404
.utils = &iwlagn_hcmd_utils,
407
static const struct iwl_ops iwl5150_ops = {
409
.hcmd = &iwlagn_hcmd,
410
.utils = &iwlagn_hcmd_utils,
353
.temperature = iwl5150_temperature,
413
356
static struct iwl_base_params iwl5000_base_params = {
416
359
.num_of_ampdu_queues = IWLAGN_NUM_AMPDU_QUEUES,
417
360
.pll_cfg_val = CSR50_ANA_PLL_CFG_VAL,
418
361
.led_compensation = 51,
419
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
420
362
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
421
363
.chain_noise_scale = 1000,
422
364
.wd_timeout = IWL_LONG_WD_TIMEOUT,
433
375
.ucode_api_min = IWL5000_UCODE_API_MIN, \
434
376
.eeprom_ver = EEPROM_5000_EEPROM_VERSION, \
435
377
.eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, \
436
.ops = &iwl5000_ops, \
378
.lib = &iwl5000_lib, \
437
379
.base_params = &iwl5000_base_params, \
438
380
.led_mode = IWL_LED_BLINK
476
418
.ucode_api_min = IWL5000_UCODE_API_MIN,
477
419
.eeprom_ver = EEPROM_5050_EEPROM_VERSION,
478
420
.eeprom_calib_ver = EEPROM_5050_TX_POWER_VERSION,
480
422
.base_params = &iwl5000_base_params,
481
423
.ht_params = &iwl5000_ht_params,
482
424
.led_mode = IWL_LED_BLINK,
489
431
.ucode_api_min = IWL5150_UCODE_API_MIN, \
490
432
.eeprom_ver = EEPROM_5050_EEPROM_VERSION, \
491
433
.eeprom_calib_ver = EEPROM_5050_TX_POWER_VERSION, \
492
.ops = &iwl5150_ops, \
434
.lib = &iwl5150_lib, \
493
435
.base_params = &iwl5000_base_params, \
494
436
.need_dc_calib = true, \
495
437
.led_mode = IWL_LED_BLINK, \