iwl-6000.c 12.1 KB
Newer Older
1 2
/******************************************************************************
 *
3
 * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
 *
 * The full GNU General Public License is included in this distribution in the
 * file called LICENSE.
 *
 * Contact Information:
22
 *  Intel Linux Wireless <linuxwifi@intel.com>
23 24 25 26 27
 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
 *
 *****************************************************************************/

#include <linux/module.h>
28
#include <linux/stringify.h>
29
#include "iwl-config.h"
30
#include "iwl-agn-hw.h"
31
#include "dvm/commands.h" /* needed for BT for now */
32 33

/* Highest firmware API version supported */
34
#define IWL6000_UCODE_API_MAX 6
35
#define IWL6050_UCODE_API_MAX 5
36
#define IWL6000G2_UCODE_API_MAX 6
37
#define IWL6035_UCODE_API_MAX 6
38

39
/* Lowest firmware API version supported */
40 41
#define IWL6000_UCODE_API_MIN 4
#define IWL6050_UCODE_API_MIN 4
42 43
#define IWL6000G2_UCODE_API_MIN 5
#define IWL6035_UCODE_API_MIN 6
44

45 46 47 48 49 50 51 52 53 54 55 56 57 58
/* EEPROM versions */
#define EEPROM_6000_TX_POWER_VERSION	(4)
#define EEPROM_6000_EEPROM_VERSION	(0x423)
#define EEPROM_6050_TX_POWER_VERSION	(4)
#define EEPROM_6050_EEPROM_VERSION	(0x532)
#define EEPROM_6150_TX_POWER_VERSION	(6)
#define EEPROM_6150_EEPROM_VERSION	(0x553)
#define EEPROM_6005_TX_POWER_VERSION	(6)
#define EEPROM_6005_EEPROM_VERSION	(0x709)
#define EEPROM_6030_TX_POWER_VERSION	(6)
#define EEPROM_6030_EEPROM_VERSION	(0x709)
#define EEPROM_6035_TX_POWER_VERSION	(6)
#define EEPROM_6035_EEPROM_VERSION	(0x753)

59
#define IWL6000_FW_PRE "iwlwifi-6000-"
60
#define IWL6000_MODULE_FIRMWARE(api) IWL6000_FW_PRE __stringify(api) ".ucode"
61 62

#define IWL6050_FW_PRE "iwlwifi-6050-"
63
#define IWL6050_MODULE_FIRMWARE(api) IWL6050_FW_PRE __stringify(api) ".ucode"
64

65
#define IWL6005_FW_PRE "iwlwifi-6000g2a-"
66
#define IWL6005_MODULE_FIRMWARE(api) IWL6005_FW_PRE __stringify(api) ".ucode"
67

68
#define IWL6030_FW_PRE "iwlwifi-6000g2b-"
69
#define IWL6030_MODULE_FIRMWARE(api) IWL6030_FW_PRE __stringify(api) ".ucode"
70

71
static const struct iwl_base_params iwl6000_base_params = {
72 73 74 75 76 77
	.eeprom_size = OTP_LOW_IMAGE_SIZE,
	.num_of_queues = IWLAGN_NUM_QUEUES,
	.pll_cfg_val = 0,
	.max_ll_items = OTP_MAX_LL_ITEMS_6x00,
	.shadow_ram_support = true,
	.led_compensation = 51,
78
	.wd_timeout = IWL_DEF_WD_TIMEOUT,
79
	.max_event_log_size = 512,
80
	.shadow_reg_enable = false, /* TODO: fix bugs using this feature */
81
	.scd_chain_ext_wa = true,
82 83
};

84
static const struct iwl_base_params iwl6050_base_params = {
85 86 87
	.eeprom_size = OTP_LOW_IMAGE_SIZE,
	.num_of_queues = IWLAGN_NUM_QUEUES,
	.pll_cfg_val = 0,
88
	.max_ll_items = OTP_MAX_LL_ITEMS_6x50,
89 90
	.shadow_ram_support = true,
	.led_compensation = 51,
91
	.wd_timeout = IWL_DEF_WD_TIMEOUT,
92
	.max_event_log_size = 1024,
93
	.shadow_reg_enable = false, /* TODO: fix bugs using this feature */
94
	.scd_chain_ext_wa = true,
95
};
96 97

static const struct iwl_base_params iwl6000_g2_base_params = {
98 99 100 101 102
	.eeprom_size = OTP_LOW_IMAGE_SIZE,
	.num_of_queues = IWLAGN_NUM_QUEUES,
	.pll_cfg_val = 0,
	.max_ll_items = OTP_MAX_LL_ITEMS_6x00,
	.shadow_ram_support = true,
103
	.led_compensation = 57,
104
	.wd_timeout = IWL_LONG_WD_TIMEOUT,
105
	.max_event_log_size = 512,
106
	.shadow_reg_enable = false, /* TODO: fix bugs using this feature */
107
	.scd_chain_ext_wa = true,
108
};
109

110
static const struct iwl_ht_params iwl6000_ht_params = {
111 112
	.ht_greenfield_support = true,
	.use_rts_for_aggregation = true, /* use rts/cts protection */
113
	.ht40_bands = BIT(IEEE80211_BAND_2GHZ) | BIT(IEEE80211_BAND_5GHZ),
114 115
};

116 117 118 119 120 121 122 123 124 125 126 127 128
static const struct iwl_eeprom_params iwl6000_eeprom_params = {
	.regulatory_bands = {
		EEPROM_REG_BAND_1_CHANNELS,
		EEPROM_REG_BAND_2_CHANNELS,
		EEPROM_REG_BAND_3_CHANNELS,
		EEPROM_REG_BAND_4_CHANNELS,
		EEPROM_REG_BAND_5_CHANNELS,
		EEPROM_6000_REG_BAND_24_HT40_CHANNELS,
		EEPROM_REG_BAND_52_HT40_CHANNELS
	},
	.enhanced_txpower = true,
};

129
#define IWL_DEVICE_6005						\
130
	.fw_name_pre = IWL6005_FW_PRE,				\
131 132
	.ucode_api_max = IWL6000G2_UCODE_API_MAX,		\
	.ucode_api_min = IWL6000G2_UCODE_API_MIN,		\
133
	.device_family = IWL_DEVICE_FAMILY_6005,		\
134 135
	.max_inst_size = IWL60_RTC_INST_SIZE,			\
	.max_data_size = IWL60_RTC_DATA_SIZE,			\
136 137
	.nvm_ver = EEPROM_6005_EEPROM_VERSION,		\
	.nvm_calib_ver = EEPROM_6005_TX_POWER_VERSION,	\
138
	.base_params = &iwl6000_g2_base_params,			\
139
	.eeprom_params = &iwl6000_eeprom_params,		\
140 141
	.led_mode = IWL_LED_RF_STATE,				\
	.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
142

J
Johannes Berg 已提交
143
const struct iwl_cfg iwl6005_2agn_cfg = {
144
	.name = "Intel(R) Centrino(R) Advanced-N 6205 AGN",
145
	IWL_DEVICE_6005,
146 147 148
	.ht_params = &iwl6000_ht_params,
};

J
Johannes Berg 已提交
149
const struct iwl_cfg iwl6005_2abg_cfg = {
150
	.name = "Intel(R) Centrino(R) Advanced-N 6205 ABG",
151
	IWL_DEVICE_6005,
152 153
};

J
Johannes Berg 已提交
154
const struct iwl_cfg iwl6005_2bg_cfg = {
155
	.name = "Intel(R) Centrino(R) Advanced-N 6205 BG",
156 157 158
	IWL_DEVICE_6005,
};

J
Johannes Berg 已提交
159
const struct iwl_cfg iwl6005_2agn_sff_cfg = {
160 161 162 163 164
	.name = "Intel(R) Centrino(R) Advanced-N 6205S AGN",
	IWL_DEVICE_6005,
	.ht_params = &iwl6000_ht_params,
};

J
Johannes Berg 已提交
165
const struct iwl_cfg iwl6005_2agn_d_cfg = {
166 167 168 169 170
	.name = "Intel(R) Centrino(R) Advanced-N 6205D AGN",
	IWL_DEVICE_6005,
	.ht_params = &iwl6000_ht_params,
};

J
Johannes Berg 已提交
171
const struct iwl_cfg iwl6005_2agn_mow1_cfg = {
W
Wey-Yi Guy 已提交
172 173 174 175
	.name = "Intel(R) Centrino(R) Advanced-N 6206 AGN",
	IWL_DEVICE_6005,
	.ht_params = &iwl6000_ht_params,
};
J
Johannes Berg 已提交
176 177

const struct iwl_cfg iwl6005_2agn_mow2_cfg = {
W
Wey-Yi Guy 已提交
178 179 180 181 182
	.name = "Intel(R) Centrino(R) Advanced-N 6207 AGN",
	IWL_DEVICE_6005,
	.ht_params = &iwl6000_ht_params,
};

183
#define IWL_DEVICE_6030						\
184
	.fw_name_pre = IWL6030_FW_PRE,				\
185 186
	.ucode_api_max = IWL6000G2_UCODE_API_MAX,		\
	.ucode_api_min = IWL6000G2_UCODE_API_MIN,		\
187
	.device_family = IWL_DEVICE_FAMILY_6030,		\
188 189
	.max_inst_size = IWL60_RTC_INST_SIZE,			\
	.max_data_size = IWL60_RTC_DATA_SIZE,			\
190 191
	.nvm_ver = EEPROM_6030_EEPROM_VERSION,		\
	.nvm_calib_ver = EEPROM_6030_TX_POWER_VERSION,	\
192
	.base_params = &iwl6000_g2_base_params,			\
193
	.eeprom_params = &iwl6000_eeprom_params,		\
194 195
	.led_mode = IWL_LED_RF_STATE,				\
	.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
196

J
Johannes Berg 已提交
197
const struct iwl_cfg iwl6030_2agn_cfg = {
198
	.name = "Intel(R) Centrino(R) Advanced-N 6230 AGN",
199
	IWL_DEVICE_6030,
200
	.ht_params = &iwl6000_ht_params,
201 202
};

J
Johannes Berg 已提交
203
const struct iwl_cfg iwl6030_2abg_cfg = {
204
	.name = "Intel(R) Centrino(R) Advanced-N 6230 ABG",
205
	IWL_DEVICE_6030,
206 207
};

J
Johannes Berg 已提交
208
const struct iwl_cfg iwl6030_2bgn_cfg = {
209
	.name = "Intel(R) Centrino(R) Advanced-N 6230 BGN",
210
	IWL_DEVICE_6030,
211
	.ht_params = &iwl6000_ht_params,
212 213
};

J
Johannes Berg 已提交
214
const struct iwl_cfg iwl6030_2bg_cfg = {
215
	.name = "Intel(R) Centrino(R) Advanced-N 6230 BG",
216
	IWL_DEVICE_6030,
217 218
};

219 220 221 222 223 224 225
#define IWL_DEVICE_6035						\
	.fw_name_pre = IWL6030_FW_PRE,				\
	.ucode_api_max = IWL6035_UCODE_API_MAX,			\
	.ucode_api_min = IWL6035_UCODE_API_MIN,			\
	.device_family = IWL_DEVICE_FAMILY_6030,		\
	.max_inst_size = IWL60_RTC_INST_SIZE,			\
	.max_data_size = IWL60_RTC_DATA_SIZE,			\
226 227
	.nvm_ver = EEPROM_6030_EEPROM_VERSION,		\
	.nvm_calib_ver = EEPROM_6030_TX_POWER_VERSION,	\
228
	.base_params = &iwl6000_g2_base_params,			\
229
	.eeprom_params = &iwl6000_eeprom_params,		\
230 231
	.led_mode = IWL_LED_RF_STATE,				\
	.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
232

J
Johannes Berg 已提交
233
const struct iwl_cfg iwl6035_2agn_cfg = {
234
	.name = "Intel(R) Centrino(R) Advanced-N 6235 AGN",
235
	IWL_DEVICE_6035,
236 237 238
	.ht_params = &iwl6000_ht_params,
};

239 240 241 242 243 244
const struct iwl_cfg iwl6035_2agn_sff_cfg = {
	.name = "Intel(R) Centrino(R) Ultimate-N 6235 AGN",
	IWL_DEVICE_6035,
	.ht_params = &iwl6000_ht_params,
};

J
Johannes Berg 已提交
245
const struct iwl_cfg iwl1030_bgn_cfg = {
246
	.name = "Intel(R) Centrino(R) Wireless-N 1030 BGN",
247
	IWL_DEVICE_6030,
248
	.ht_params = &iwl6000_ht_params,
249 250
};

J
Johannes Berg 已提交
251
const struct iwl_cfg iwl1030_bg_cfg = {
252
	.name = "Intel(R) Centrino(R) Wireless-N 1030 BG",
253 254 255
	IWL_DEVICE_6030,
};

J
Johannes Berg 已提交
256
const struct iwl_cfg iwl130_bgn_cfg = {
257 258 259 260 261 262
	.name = "Intel(R) Centrino(R) Wireless-N 130 BGN",
	IWL_DEVICE_6030,
	.ht_params = &iwl6000_ht_params,
	.rx_with_siso_diversity = true,
};

J
Johannes Berg 已提交
263
const struct iwl_cfg iwl130_bg_cfg = {
264 265 266
	.name = "Intel(R) Centrino(R) Wireless-N 130 BG",
	IWL_DEVICE_6030,
	.rx_with_siso_diversity = true,
267 268
};

269 270 271
/*
 * "i": Internal configuration, use internal Power Amplifier
 */
272 273 274 275
#define IWL_DEVICE_6000i					\
	.fw_name_pre = IWL6000_FW_PRE,				\
	.ucode_api_max = IWL6000_UCODE_API_MAX,			\
	.ucode_api_min = IWL6000_UCODE_API_MIN,			\
276
	.device_family = IWL_DEVICE_FAMILY_6000i,		\
277 278
	.max_inst_size = IWL60_RTC_INST_SIZE,			\
	.max_data_size = IWL60_RTC_DATA_SIZE,			\
279 280
	.valid_tx_ant = ANT_BC,		/* .cfg overwrite */	\
	.valid_rx_ant = ANT_BC,		/* .cfg overwrite */	\
281 282
	.nvm_ver = EEPROM_6000_EEPROM_VERSION,		\
	.nvm_calib_ver = EEPROM_6000_TX_POWER_VERSION,	\
283
	.base_params = &iwl6000_base_params,			\
284
	.eeprom_params = &iwl6000_eeprom_params,		\
285 286
	.led_mode = IWL_LED_BLINK,				\
	.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
287

J
Johannes Berg 已提交
288
const struct iwl_cfg iwl6000i_2agn_cfg = {
289
	.name = "Intel(R) Centrino(R) Advanced-N 6200 AGN",
290
	IWL_DEVICE_6000i,
291
	.ht_params = &iwl6000_ht_params,
292 293
};

J
Johannes Berg 已提交
294
const struct iwl_cfg iwl6000i_2abg_cfg = {
295
	.name = "Intel(R) Centrino(R) Advanced-N 6200 ABG",
296
	IWL_DEVICE_6000i,
297 298
};

J
Johannes Berg 已提交
299
const struct iwl_cfg iwl6000i_2bg_cfg = {
300
	.name = "Intel(R) Centrino(R) Advanced-N 6200 BG",
301 302 303 304 305 306 307
	IWL_DEVICE_6000i,
};

#define IWL_DEVICE_6050						\
	.fw_name_pre = IWL6050_FW_PRE,				\
	.ucode_api_max = IWL6050_UCODE_API_MAX,			\
	.ucode_api_min = IWL6050_UCODE_API_MIN,			\
308
	.device_family = IWL_DEVICE_FAMILY_6050,		\
309 310
	.max_inst_size = IWL60_RTC_INST_SIZE,			\
	.max_data_size = IWL60_RTC_DATA_SIZE,			\
311 312
	.valid_tx_ant = ANT_AB,		/* .cfg overwrite */	\
	.valid_rx_ant = ANT_AB,		/* .cfg overwrite */	\
313 314
	.nvm_ver = EEPROM_6050_EEPROM_VERSION,		\
	.nvm_calib_ver = EEPROM_6050_TX_POWER_VERSION,	\
315
	.base_params = &iwl6050_base_params,			\
316
	.eeprom_params = &iwl6000_eeprom_params,		\
317
	.led_mode = IWL_LED_BLINK,				\
318 319
	.internal_wimax_coex = true,				\
	.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
320

J
Johannes Berg 已提交
321
const struct iwl_cfg iwl6050_2agn_cfg = {
322
	.name = "Intel(R) Centrino(R) Advanced-N + WiMAX 6250 AGN",
323
	IWL_DEVICE_6050,
324
	.ht_params = &iwl6000_ht_params,
325 326
};

J
Johannes Berg 已提交
327
const struct iwl_cfg iwl6050_2abg_cfg = {
328 329
	.name = "Intel(R) Centrino(R) Advanced-N + WiMAX 6250 ABG",
	IWL_DEVICE_6050,
330 331
};

332 333 334 335
#define IWL_DEVICE_6150						\
	.fw_name_pre = IWL6050_FW_PRE,				\
	.ucode_api_max = IWL6050_UCODE_API_MAX,			\
	.ucode_api_min = IWL6050_UCODE_API_MIN,			\
336
	.device_family = IWL_DEVICE_FAMILY_6150,		\
337 338
	.max_inst_size = IWL60_RTC_INST_SIZE,			\
	.max_data_size = IWL60_RTC_DATA_SIZE,			\
339 340
	.nvm_ver = EEPROM_6150_EEPROM_VERSION,		\
	.nvm_calib_ver = EEPROM_6150_TX_POWER_VERSION,	\
341
	.base_params = &iwl6050_base_params,			\
342
	.eeprom_params = &iwl6000_eeprom_params,		\
343
	.led_mode = IWL_LED_BLINK,				\
344 345
	.internal_wimax_coex = true,				\
	.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
346

J
Johannes Berg 已提交
347
const struct iwl_cfg iwl6150_bgn_cfg = {
348
	.name = "Intel(R) Centrino(R) Wireless-N + WiMAX 6150 BGN",
349
	IWL_DEVICE_6150,
350
	.ht_params = &iwl6000_ht_params,
351 352
};

J
Johannes Berg 已提交
353
const struct iwl_cfg iwl6150_bg_cfg = {
354 355
	.name = "Intel(R) Centrino(R) Wireless-N + WiMAX 6150 BG",
	IWL_DEVICE_6150,
356 357
};

J
Johannes Berg 已提交
358
const struct iwl_cfg iwl6000_3agn_cfg = {
359
	.name = "Intel(R) Centrino(R) Ultimate-N 6300 AGN",
360 361 362
	.fw_name_pre = IWL6000_FW_PRE,
	.ucode_api_max = IWL6000_UCODE_API_MAX,
	.ucode_api_min = IWL6000_UCODE_API_MIN,
363
	.device_family = IWL_DEVICE_FAMILY_6000,
364 365
	.max_inst_size = IWL60_RTC_INST_SIZE,
	.max_data_size = IWL60_RTC_DATA_SIZE,
366 367
	.nvm_ver = EEPROM_6000_EEPROM_VERSION,
	.nvm_calib_ver = EEPROM_6000_TX_POWER_VERSION,
368
	.base_params = &iwl6000_base_params,
369
	.eeprom_params = &iwl6000_eeprom_params,
370
	.ht_params = &iwl6000_ht_params,
371
	.led_mode = IWL_LED_BLINK,
372 373
};

374 375 376 377
MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX));
MODULE_FIRMWARE(IWL6050_MODULE_FIRMWARE(IWL6050_UCODE_API_MAX));
MODULE_FIRMWARE(IWL6005_MODULE_FIRMWARE(IWL6000G2_UCODE_API_MAX));
MODULE_FIRMWARE(IWL6030_MODULE_FIRMWARE(IWL6000G2B_UCODE_API_MAX));