diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-5000.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-5000.c | 455 |
1 files changed, 455 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c new file mode 100644 index 00000000000..c95cefd529d --- /dev/null +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c | |||
@@ -0,0 +1,455 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Copyright(c) 2007 - 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/sched.h> | ||
32 | #include <linux/skbuff.h> | ||
33 | #include <linux/netdevice.h> | ||
34 | #include <linux/wireless.h> | ||
35 | #include <net/mac80211.h> | ||
36 | #include <linux/etherdevice.h> | ||
37 | #include <asm/unaligned.h> | ||
38 | #include <linux/stringify.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-helpers.h" | ||
46 | #include "iwl-agn.h" | ||
47 | #include "iwl-agn-hw.h" | ||
48 | #include "iwl-5000-hw.h" | ||
49 | #include "iwl-trans.h" | ||
50 | |||
51 | /* Highest firmware API version supported */ | ||
52 | #define IWL5000_UCODE_API_MAX 5 | ||
53 | #define IWL5150_UCODE_API_MAX 2 | ||
54 | |||
55 | /* Lowest firmware API version supported */ | ||
56 | #define IWL5000_UCODE_API_MIN 1 | ||
57 | #define IWL5150_UCODE_API_MIN 1 | ||
58 | |||
59 | #define IWL5000_FW_PRE "iwlwifi-5000-" | ||
60 | #define IWL5000_MODULE_FIRMWARE(api) IWL5000_FW_PRE __stringify(api) ".ucode" | ||
61 | |||
62 | #define IWL5150_FW_PRE "iwlwifi-5150-" | ||
63 | #define IWL5150_MODULE_FIRMWARE(api) IWL5150_FW_PRE __stringify(api) ".ucode" | ||
64 | |||
65 | /* NIC configuration for 5000 series */ | ||
66 | static void iwl5000_nic_config(struct iwl_priv *priv) | ||
67 | { | ||
68 | unsigned long flags; | ||
69 | |||
70 | iwl_rf_config(priv); | ||
71 | |||
72 | spin_lock_irqsave(&priv->lock, flags); | ||
73 | |||
74 | /* W/A : NIC is stuck in a reset state after Early PCIe power off | ||
75 | * (PCIe power is lost before PERST# is asserted), | ||
76 | * causing ME FW to lose ownership and not being able to obtain it back. | ||
77 | */ | ||
78 | iwl_set_bits_mask_prph(priv, APMG_PS_CTRL_REG, | ||
79 | APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS, | ||
80 | ~APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS); | ||
81 | |||
82 | |||
83 | spin_unlock_irqrestore(&priv->lock, flags); | ||
84 | } | ||
85 | |||
86 | static struct iwl_sensitivity_ranges iwl5000_sensitivity = { | ||
87 | .min_nrg_cck = 95, | ||
88 | .max_nrg_cck = 0, /* not used, set to 0 */ | ||
89 | .auto_corr_min_ofdm = 90, | ||
90 | .auto_corr_min_ofdm_mrc = 170, | ||
91 | .auto_corr_min_ofdm_x1 = 120, | ||
92 | .auto_corr_min_ofdm_mrc_x1 = 240, | ||
93 | |||
94 | .auto_corr_max_ofdm = 120, | ||
95 | .auto_corr_max_ofdm_mrc = 210, | ||
96 | .auto_corr_max_ofdm_x1 = 120, | ||
97 | .auto_corr_max_ofdm_mrc_x1 = 240, | ||
98 | |||
99 | .auto_corr_min_cck = 125, | ||
100 | .auto_corr_max_cck = 200, | ||
101 | .auto_corr_min_cck_mrc = 170, | ||
102 | .auto_corr_max_cck_mrc = 400, | ||
103 | .nrg_th_cck = 95, | ||
104 | .nrg_th_ofdm = 95, | ||
105 | |||
106 | .barker_corr_th_min = 190, | ||
107 | .barker_corr_th_min_mrc = 390, | ||
108 | .nrg_th_cca = 62, | ||
109 | }; | ||
110 | |||
111 | static struct iwl_sensitivity_ranges iwl5150_sensitivity = { | ||
112 | .min_nrg_cck = 95, | ||
113 | .max_nrg_cck = 0, /* not used, set to 0 */ | ||
114 | .auto_corr_min_ofdm = 90, | ||
115 | .auto_corr_min_ofdm_mrc = 170, | ||
116 | .auto_corr_min_ofdm_x1 = 105, | ||
117 | .auto_corr_min_ofdm_mrc_x1 = 220, | ||
118 | |||
119 | .auto_corr_max_ofdm = 120, | ||
120 | .auto_corr_max_ofdm_mrc = 210, | ||
121 | /* max = min for performance bug in 5150 DSP */ | ||
122 | .auto_corr_max_ofdm_x1 = 105, | ||
123 | .auto_corr_max_ofdm_mrc_x1 = 220, | ||
124 | |||
125 | .auto_corr_min_cck = 125, | ||
126 | .auto_corr_max_cck = 200, | ||
127 | .auto_corr_min_cck_mrc = 170, | ||
128 | .auto_corr_max_cck_mrc = 400, | ||
129 | .nrg_th_cck = 95, | ||
130 | .nrg_th_ofdm = 95, | ||
131 | |||
132 | .barker_corr_th_min = 190, | ||
133 | .barker_corr_th_min_mrc = 390, | ||
134 | .nrg_th_cca = 62, | ||
135 | }; | ||
136 | |||
137 | static void iwl5150_set_ct_threshold(struct iwl_priv *priv) | ||
138 | { | ||
139 | const s32 volt2temp_coef = IWL_5150_VOLTAGE_TO_TEMPERATURE_COEFF; | ||
140 | s32 threshold = (s32)CELSIUS_TO_KELVIN(CT_KILL_THRESHOLD_LEGACY) - | ||
141 | iwl_temp_calib_to_offset(priv); | ||
142 | |||
143 | priv->hw_params.ct_kill_threshold = threshold * volt2temp_coef; | ||
144 | } | ||
145 | |||
146 | static void iwl5000_set_ct_threshold(struct iwl_priv *priv) | ||
147 | { | ||
148 | /* want Celsius */ | ||
149 | priv->hw_params.ct_kill_threshold = CT_KILL_THRESHOLD_LEGACY; | ||
150 | } | ||
151 | |||
152 | static int iwl5000_hw_set_hw_params(struct iwl_priv *priv) | ||
153 | { | ||
154 | if (iwlagn_mod_params.num_of_queues >= IWL_MIN_NUM_QUEUES && | ||
155 | iwlagn_mod_params.num_of_queues <= IWLAGN_NUM_QUEUES) | ||
156 | priv->cfg->base_params->num_of_queues = | ||
157 | iwlagn_mod_params.num_of_queues; | ||
158 | |||
159 | priv->hw_params.max_txq_num = priv->cfg->base_params->num_of_queues; | ||
160 | priv->hw_params.scd_bc_tbls_size = | ||
161 | priv->cfg->base_params->num_of_queues * | ||
162 | sizeof(struct iwlagn_scd_bc_tbl); | ||
163 | priv->hw_params.tfd_size = sizeof(struct iwl_tfd); | ||
164 | priv->hw_params.max_stations = IWLAGN_STATION_COUNT; | ||
165 | priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id = IWLAGN_BROADCAST_ID; | ||
166 | |||
167 | priv->hw_params.max_data_size = IWLAGN_RTC_DATA_SIZE; | ||
168 | priv->hw_params.max_inst_size = IWLAGN_RTC_INST_SIZE; | ||
169 | |||
170 | priv->hw_params.ht40_channel = BIT(IEEE80211_BAND_2GHZ) | | ||
171 | BIT(IEEE80211_BAND_5GHZ); | ||
172 | |||
173 | priv->hw_params.tx_chains_num = num_of_ant(priv->cfg->valid_tx_ant); | ||
174 | priv->hw_params.rx_chains_num = num_of_ant(priv->cfg->valid_rx_ant); | ||
175 | priv->hw_params.valid_tx_ant = priv->cfg->valid_tx_ant; | ||
176 | priv->hw_params.valid_rx_ant = priv->cfg->valid_rx_ant; | ||
177 | |||
178 | iwl5000_set_ct_threshold(priv); | ||
179 | |||
180 | /* Set initial sensitivity parameters */ | ||
181 | /* Set initial calibration set */ | ||
182 | priv->hw_params.sens = &iwl5000_sensitivity; | ||
183 | priv->hw_params.calib_init_cfg = | ||
184 | BIT(IWL_CALIB_XTAL) | | ||
185 | BIT(IWL_CALIB_LO) | | ||
186 | BIT(IWL_CALIB_TX_IQ) | | ||
187 | BIT(IWL_CALIB_TX_IQ_PERD) | | ||
188 | BIT(IWL_CALIB_BASE_BAND); | ||
189 | |||
190 | priv->hw_params.beacon_time_tsf_bits = IWLAGN_EXT_BEACON_TIME_POS; | ||
191 | |||
192 | return 0; | ||
193 | } | ||
194 | |||
195 | static int iwl5150_hw_set_hw_params(struct iwl_priv *priv) | ||
196 | { | ||
197 | if (iwlagn_mod_params.num_of_queues >= IWL_MIN_NUM_QUEUES && | ||
198 | iwlagn_mod_params.num_of_queues <= IWLAGN_NUM_QUEUES) | ||
199 | priv->cfg->base_params->num_of_queues = | ||
200 | iwlagn_mod_params.num_of_queues; | ||
201 | |||
202 | priv->hw_params.max_txq_num = priv->cfg->base_params->num_of_queues; | ||
203 | priv->hw_params.scd_bc_tbls_size = | ||
204 | priv->cfg->base_params->num_of_queues * | ||
205 | sizeof(struct iwlagn_scd_bc_tbl); | ||
206 | priv->hw_params.tfd_size = sizeof(struct iwl_tfd); | ||
207 | priv->hw_params.max_stations = IWLAGN_STATION_COUNT; | ||
208 | priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id = IWLAGN_BROADCAST_ID; | ||
209 | |||
210 | priv->hw_params.max_data_size = IWLAGN_RTC_DATA_SIZE; | ||
211 | priv->hw_params.max_inst_size = IWLAGN_RTC_INST_SIZE; | ||
212 | |||
213 | priv->hw_params.ht40_channel = BIT(IEEE80211_BAND_2GHZ) | | ||
214 | BIT(IEEE80211_BAND_5GHZ); | ||
215 | |||
216 | priv->hw_params.tx_chains_num = num_of_ant(priv->cfg->valid_tx_ant); | ||
217 | priv->hw_params.rx_chains_num = num_of_ant(priv->cfg->valid_rx_ant); | ||
218 | priv->hw_params.valid_tx_ant = priv->cfg->valid_tx_ant; | ||
219 | priv->hw_params.valid_rx_ant = priv->cfg->valid_rx_ant; | ||
220 | |||
221 | iwl5150_set_ct_threshold(priv); | ||
222 | |||
223 | /* Set initial sensitivity parameters */ | ||
224 | /* Set initial calibration set */ | ||
225 | priv->hw_params.sens = &iwl5150_sensitivity; | ||
226 | priv->hw_params.calib_init_cfg = | ||
227 | BIT(IWL_CALIB_LO) | | ||
228 | BIT(IWL_CALIB_TX_IQ) | | ||
229 | BIT(IWL_CALIB_BASE_BAND); | ||
230 | if (priv->cfg->need_dc_calib) | ||
231 | priv->hw_params.calib_init_cfg |= BIT(IWL_CALIB_DC); | ||
232 | |||
233 | priv->hw_params.beacon_time_tsf_bits = IWLAGN_EXT_BEACON_TIME_POS; | ||
234 | |||
235 | return 0; | ||
236 | } | ||
237 | |||
238 | static void iwl5150_temperature(struct iwl_priv *priv) | ||
239 | { | ||
240 | u32 vt = 0; | ||
241 | s32 offset = iwl_temp_calib_to_offset(priv); | ||
242 | |||
243 | vt = le32_to_cpu(priv->statistics.common.temperature); | ||
244 | vt = vt / IWL_5150_VOLTAGE_TO_TEMPERATURE_COEFF + offset; | ||
245 | /* now vt hold the temperature in Kelvin */ | ||
246 | priv->temperature = KELVIN_TO_CELSIUS(vt); | ||
247 | iwl_tt_handler(priv); | ||
248 | } | ||
249 | |||
250 | static int iwl5000_hw_channel_switch(struct iwl_priv *priv, | ||
251 | struct ieee80211_channel_switch *ch_switch) | ||
252 | { | ||
253 | /* | ||
254 | * MULTI-FIXME | ||
255 | * See iwl_mac_channel_switch. | ||
256 | */ | ||
257 | struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; | ||
258 | struct iwl5000_channel_switch_cmd cmd; | ||
259 | const struct iwl_channel_info *ch_info; | ||
260 | u32 switch_time_in_usec, ucode_switch_time; | ||
261 | u16 ch; | ||
262 | u32 tsf_low; | ||
263 | u8 switch_count; | ||
264 | u16 beacon_interval = le16_to_cpu(ctx->timing.beacon_interval); | ||
265 | struct ieee80211_vif *vif = ctx->vif; | ||
266 | struct iwl_host_cmd hcmd = { | ||
267 | .id = REPLY_CHANNEL_SWITCH, | ||
268 | .len = { sizeof(cmd), }, | ||
269 | .flags = CMD_SYNC, | ||
270 | .data = { &cmd, }, | ||
271 | }; | ||
272 | |||
273 | cmd.band = priv->band == IEEE80211_BAND_2GHZ; | ||
274 | ch = ch_switch->channel->hw_value; | ||
275 | IWL_DEBUG_11H(priv, "channel switch from %d to %d\n", | ||
276 | ctx->active.channel, ch); | ||
277 | cmd.channel = cpu_to_le16(ch); | ||
278 | cmd.rxon_flags = ctx->staging.flags; | ||
279 | cmd.rxon_filter_flags = ctx->staging.filter_flags; | ||
280 | switch_count = ch_switch->count; | ||
281 | tsf_low = ch_switch->timestamp & 0x0ffffffff; | ||
282 | /* | ||
283 | * calculate the ucode channel switch time | ||
284 | * adding TSF as one of the factor for when to switch | ||
285 | */ | ||
286 | if ((priv->ucode_beacon_time > tsf_low) && beacon_interval) { | ||
287 | if (switch_count > ((priv->ucode_beacon_time - tsf_low) / | ||
288 | beacon_interval)) { | ||
289 | switch_count -= (priv->ucode_beacon_time - | ||
290 | tsf_low) / beacon_interval; | ||
291 | } else | ||
292 | switch_count = 0; | ||
293 | } | ||
294 | if (switch_count <= 1) | ||
295 | cmd.switch_time = cpu_to_le32(priv->ucode_beacon_time); | ||
296 | else { | ||
297 | switch_time_in_usec = | ||
298 | vif->bss_conf.beacon_int * switch_count * TIME_UNIT; | ||
299 | ucode_switch_time = iwl_usecs_to_beacons(priv, | ||
300 | switch_time_in_usec, | ||
301 | beacon_interval); | ||
302 | cmd.switch_time = iwl_add_beacon_time(priv, | ||
303 | priv->ucode_beacon_time, | ||
304 | ucode_switch_time, | ||
305 | beacon_interval); | ||
306 | } | ||
307 | IWL_DEBUG_11H(priv, "uCode time for the switch is 0x%x\n", | ||
308 | cmd.switch_time); | ||
309 | ch_info = iwl_get_channel_info(priv, priv->band, ch); | ||
310 | if (ch_info) | ||
311 | cmd.expect_beacon = is_channel_radar(ch_info); | ||
312 | else { | ||
313 | IWL_ERR(priv, "invalid channel switch from %u to %u\n", | ||
314 | ctx->active.channel, ch); | ||
315 | return -EFAULT; | ||
316 | } | ||
317 | |||
318 | return trans_send_cmd(&priv->trans, &hcmd); | ||
319 | } | ||
320 | |||
321 | static struct iwl_lib_ops iwl5000_lib = { | ||
322 | .set_hw_params = iwl5000_hw_set_hw_params, | ||
323 | .set_channel_switch = iwl5000_hw_channel_switch, | ||
324 | .nic_config = iwl5000_nic_config, | ||
325 | .eeprom_ops = { | ||
326 | .regulatory_bands = { | ||
327 | EEPROM_REG_BAND_1_CHANNELS, | ||
328 | EEPROM_REG_BAND_2_CHANNELS, | ||
329 | EEPROM_REG_BAND_3_CHANNELS, | ||
330 | EEPROM_REG_BAND_4_CHANNELS, | ||
331 | EEPROM_REG_BAND_5_CHANNELS, | ||
332 | EEPROM_REG_BAND_24_HT40_CHANNELS, | ||
333 | EEPROM_REG_BAND_52_HT40_CHANNELS | ||
334 | }, | ||
335 | }, | ||
336 | .temperature = iwlagn_temperature, | ||
337 | }; | ||
338 | |||
339 | static struct iwl_lib_ops iwl5150_lib = { | ||
340 | .set_hw_params = iwl5150_hw_set_hw_params, | ||
341 | .set_channel_switch = iwl5000_hw_channel_switch, | ||
342 | .nic_config = iwl5000_nic_config, | ||
343 | .eeprom_ops = { | ||
344 | .regulatory_bands = { | ||
345 | EEPROM_REG_BAND_1_CHANNELS, | ||
346 | EEPROM_REG_BAND_2_CHANNELS, | ||
347 | EEPROM_REG_BAND_3_CHANNELS, | ||
348 | EEPROM_REG_BAND_4_CHANNELS, | ||
349 | EEPROM_REG_BAND_5_CHANNELS, | ||
350 | EEPROM_REG_BAND_24_HT40_CHANNELS, | ||
351 | EEPROM_REG_BAND_52_HT40_CHANNELS | ||
352 | }, | ||
353 | }, | ||
354 | .temperature = iwl5150_temperature, | ||
355 | }; | ||
356 | |||
357 | static struct iwl_base_params iwl5000_base_params = { | ||
358 | .eeprom_size = IWLAGN_EEPROM_IMG_SIZE, | ||
359 | .num_of_queues = IWLAGN_NUM_QUEUES, | ||
360 | .num_of_ampdu_queues = IWLAGN_NUM_AMPDU_QUEUES, | ||
361 | .pll_cfg_val = CSR50_ANA_PLL_CFG_VAL, | ||
362 | .led_compensation = 51, | ||
363 | .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS, | ||
364 | .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF, | ||
365 | .chain_noise_scale = 1000, | ||
366 | .wd_timeout = IWL_LONG_WD_TIMEOUT, | ||
367 | .max_event_log_size = 512, | ||
368 | .no_idle_support = true, | ||
369 | }; | ||
370 | static struct iwl_ht_params iwl5000_ht_params = { | ||
371 | .ht_greenfield_support = true, | ||
372 | }; | ||
373 | |||
374 | #define IWL_DEVICE_5000 \ | ||
375 | .fw_name_pre = IWL5000_FW_PRE, \ | ||
376 | .ucode_api_max = IWL5000_UCODE_API_MAX, \ | ||
377 | .ucode_api_min = IWL5000_UCODE_API_MIN, \ | ||
378 | .eeprom_ver = EEPROM_5000_EEPROM_VERSION, \ | ||
379 | .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, \ | ||
380 | .lib = &iwl5000_lib, \ | ||
381 | .base_params = &iwl5000_base_params, \ | ||
382 | .led_mode = IWL_LED_BLINK | ||
383 | |||
384 | struct iwl_cfg iwl5300_agn_cfg = { | ||
385 | .name = "Intel(R) Ultimate N WiFi Link 5300 AGN", | ||
386 | IWL_DEVICE_5000, | ||
387 | /* at least EEPROM 0x11A has wrong info */ | ||
388 | .valid_tx_ant = ANT_ABC, /* .cfg overwrite */ | ||
389 | .valid_rx_ant = ANT_ABC, /* .cfg overwrite */ | ||
390 | .ht_params = &iwl5000_ht_params, | ||
391 | }; | ||
392 | |||
393 | struct iwl_cfg iwl5100_bgn_cfg = { | ||
394 | .name = "Intel(R) WiFi Link 5100 BGN", | ||
395 | IWL_DEVICE_5000, | ||
396 | .valid_tx_ant = ANT_B, /* .cfg overwrite */ | ||
397 | .valid_rx_ant = ANT_AB, /* .cfg overwrite */ | ||
398 | .ht_params = &iwl5000_ht_params, | ||
399 | }; | ||
400 | |||
401 | struct iwl_cfg iwl5100_abg_cfg = { | ||
402 | .name = "Intel(R) WiFi Link 5100 ABG", | ||
403 | IWL_DEVICE_5000, | ||
404 | .valid_tx_ant = ANT_B, /* .cfg overwrite */ | ||
405 | .valid_rx_ant = ANT_AB, /* .cfg overwrite */ | ||
406 | }; | ||
407 | |||
408 | struct iwl_cfg iwl5100_agn_cfg = { | ||
409 | .name = "Intel(R) WiFi Link 5100 AGN", | ||
410 | IWL_DEVICE_5000, | ||
411 | .valid_tx_ant = ANT_B, /* .cfg overwrite */ | ||
412 | .valid_rx_ant = ANT_AB, /* .cfg overwrite */ | ||
413 | .ht_params = &iwl5000_ht_params, | ||
414 | }; | ||
415 | |||
416 | struct iwl_cfg iwl5350_agn_cfg = { | ||
417 | .name = "Intel(R) WiMAX/WiFi Link 5350 AGN", | ||
418 | .fw_name_pre = IWL5000_FW_PRE, | ||
419 | .ucode_api_max = IWL5000_UCODE_API_MAX, | ||
420 | .ucode_api_min = IWL5000_UCODE_API_MIN, | ||
421 | .eeprom_ver = EEPROM_5050_EEPROM_VERSION, | ||
422 | .eeprom_calib_ver = EEPROM_5050_TX_POWER_VERSION, | ||
423 | .lib = &iwl5000_lib, | ||
424 | .base_params = &iwl5000_base_params, | ||
425 | .ht_params = &iwl5000_ht_params, | ||
426 | .led_mode = IWL_LED_BLINK, | ||
427 | .internal_wimax_coex = true, | ||
428 | }; | ||
429 | |||
430 | #define IWL_DEVICE_5150 \ | ||
431 | .fw_name_pre = IWL5150_FW_PRE, \ | ||
432 | .ucode_api_max = IWL5150_UCODE_API_MAX, \ | ||
433 | .ucode_api_min = IWL5150_UCODE_API_MIN, \ | ||
434 | .eeprom_ver = EEPROM_5050_EEPROM_VERSION, \ | ||
435 | .eeprom_calib_ver = EEPROM_5050_TX_POWER_VERSION, \ | ||
436 | .lib = &iwl5150_lib, \ | ||
437 | .base_params = &iwl5000_base_params, \ | ||
438 | .need_dc_calib = true, \ | ||
439 | .led_mode = IWL_LED_BLINK, \ | ||
440 | .internal_wimax_coex = true | ||
441 | |||
442 | struct iwl_cfg iwl5150_agn_cfg = { | ||
443 | .name = "Intel(R) WiMAX/WiFi Link 5150 AGN", | ||
444 | IWL_DEVICE_5150, | ||
445 | .ht_params = &iwl5000_ht_params, | ||
446 | |||
447 | }; | ||
448 | |||
449 | struct iwl_cfg iwl5150_abg_cfg = { | ||
450 | .name = "Intel(R) WiMAX/WiFi Link 5150 ABG", | ||
451 | IWL_DEVICE_5150, | ||
452 | }; | ||
453 | |||
454 | MODULE_FIRMWARE(IWL5000_MODULE_FIRMWARE(IWL5000_UCODE_API_MAX)); | ||
455 | MODULE_FIRMWARE(IWL5150_MODULE_FIRMWARE(IWL5150_UCODE_API_MAX)); | ||