1 // SPDX-License-Identifier: GPL-2.0-only 2 /****************************************************************************** 3 * 4 * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved. 5 * Copyright(c) 2018 - 2020 Intel Corporation 6 * 7 * Contact Information: 8 * Intel Linux Wireless <linuxwifi@intel.com> 9 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 10 * 11 *****************************************************************************/ 12 13 #include <linux/module.h> 14 #include <linux/stringify.h> 15 #include "iwl-config.h" 16 #include "iwl-agn-hw.h" 17 #include "dvm/commands.h" /* needed for BT for now */ 18 19 /* Highest firmware API version supported */ 20 #define IWL6000_UCODE_API_MAX 6 21 #define IWL6050_UCODE_API_MAX 5 22 #define IWL6000G2_UCODE_API_MAX 6 23 #define IWL6035_UCODE_API_MAX 6 24 25 /* Lowest firmware API version supported */ 26 #define IWL6000_UCODE_API_MIN 4 27 #define IWL6050_UCODE_API_MIN 4 28 #define IWL6000G2_UCODE_API_MIN 5 29 #define IWL6035_UCODE_API_MIN 6 30 31 /* EEPROM versions */ 32 #define EEPROM_6000_TX_POWER_VERSION (4) 33 #define EEPROM_6000_EEPROM_VERSION (0x423) 34 #define EEPROM_6050_TX_POWER_VERSION (4) 35 #define EEPROM_6050_EEPROM_VERSION (0x532) 36 #define EEPROM_6150_TX_POWER_VERSION (6) 37 #define EEPROM_6150_EEPROM_VERSION (0x553) 38 #define EEPROM_6005_TX_POWER_VERSION (6) 39 #define EEPROM_6005_EEPROM_VERSION (0x709) 40 #define EEPROM_6030_TX_POWER_VERSION (6) 41 #define EEPROM_6030_EEPROM_VERSION (0x709) 42 #define EEPROM_6035_TX_POWER_VERSION (6) 43 #define EEPROM_6035_EEPROM_VERSION (0x753) 44 45 #define IWL6000_FW_PRE "iwlwifi-6000-" 46 #define IWL6000_MODULE_FIRMWARE(api) IWL6000_FW_PRE __stringify(api) ".ucode" 47 48 #define IWL6050_FW_PRE "iwlwifi-6050-" 49 #define IWL6050_MODULE_FIRMWARE(api) IWL6050_FW_PRE __stringify(api) ".ucode" 50 51 #define IWL6005_FW_PRE "iwlwifi-6000g2a-" 52 #define IWL6005_MODULE_FIRMWARE(api) IWL6005_FW_PRE __stringify(api) ".ucode" 53 54 #define IWL6030_FW_PRE "iwlwifi-6000g2b-" 55 #define IWL6030_MODULE_FIRMWARE(api) IWL6030_FW_PRE __stringify(api) ".ucode" 56 57 static const struct iwl_base_params iwl6000_base_params = { 58 .eeprom_size = OTP_LOW_IMAGE_SIZE_2K, 59 .num_of_queues = IWLAGN_NUM_QUEUES, 60 .max_tfd_queue_size = 256, 61 .max_ll_items = OTP_MAX_LL_ITEMS_6x00, 62 .shadow_ram_support = true, 63 .led_compensation = 51, 64 .wd_timeout = IWL_DEF_WD_TIMEOUT, 65 .max_event_log_size = 512, 66 .shadow_reg_enable = false, /* TODO: fix bugs using this feature */ 67 .scd_chain_ext_wa = true, 68 }; 69 70 static const struct iwl_base_params iwl6050_base_params = { 71 .eeprom_size = OTP_LOW_IMAGE_SIZE_2K, 72 .num_of_queues = IWLAGN_NUM_QUEUES, 73 .max_tfd_queue_size = 256, 74 .max_ll_items = OTP_MAX_LL_ITEMS_6x50, 75 .shadow_ram_support = true, 76 .led_compensation = 51, 77 .wd_timeout = IWL_DEF_WD_TIMEOUT, 78 .max_event_log_size = 1024, 79 .shadow_reg_enable = false, /* TODO: fix bugs using this feature */ 80 .scd_chain_ext_wa = true, 81 }; 82 83 static const struct iwl_base_params iwl6000_g2_base_params = { 84 .eeprom_size = OTP_LOW_IMAGE_SIZE_2K, 85 .num_of_queues = IWLAGN_NUM_QUEUES, 86 .max_tfd_queue_size = 256, 87 .max_ll_items = OTP_MAX_LL_ITEMS_6x00, 88 .shadow_ram_support = true, 89 .led_compensation = 57, 90 .wd_timeout = IWL_LONG_WD_TIMEOUT, 91 .max_event_log_size = 512, 92 .shadow_reg_enable = false, /* TODO: fix bugs using this feature */ 93 .scd_chain_ext_wa = true, 94 }; 95 96 static const struct iwl_ht_params iwl6000_ht_params = { 97 .ht_greenfield_support = true, 98 .use_rts_for_aggregation = true, /* use rts/cts protection */ 99 .ht40_bands = BIT(NL80211_BAND_2GHZ) | BIT(NL80211_BAND_5GHZ), 100 }; 101 102 static const struct iwl_eeprom_params iwl6000_eeprom_params = { 103 .regulatory_bands = { 104 EEPROM_REG_BAND_1_CHANNELS, 105 EEPROM_REG_BAND_2_CHANNELS, 106 EEPROM_REG_BAND_3_CHANNELS, 107 EEPROM_REG_BAND_4_CHANNELS, 108 EEPROM_REG_BAND_5_CHANNELS, 109 EEPROM_6000_REG_BAND_24_HT40_CHANNELS, 110 EEPROM_REG_BAND_52_HT40_CHANNELS 111 }, 112 .enhanced_txpower = true, 113 }; 114 115 #define IWL_DEVICE_6005 \ 116 .fw_name_pre = IWL6005_FW_PRE, \ 117 .ucode_api_max = IWL6000G2_UCODE_API_MAX, \ 118 .ucode_api_min = IWL6000G2_UCODE_API_MIN, \ 119 .trans.device_family = IWL_DEVICE_FAMILY_6005, \ 120 .max_inst_size = IWL60_RTC_INST_SIZE, \ 121 .max_data_size = IWL60_RTC_DATA_SIZE, \ 122 .nvm_ver = EEPROM_6005_EEPROM_VERSION, \ 123 .nvm_calib_ver = EEPROM_6005_TX_POWER_VERSION, \ 124 .trans.base_params = &iwl6000_g2_base_params, \ 125 .eeprom_params = &iwl6000_eeprom_params, \ 126 .led_mode = IWL_LED_RF_STATE 127 128 const struct iwl_cfg iwl6005_2agn_cfg = { 129 .name = "Intel(R) Centrino(R) Advanced-N 6205 AGN", 130 IWL_DEVICE_6005, 131 .ht_params = &iwl6000_ht_params, 132 }; 133 134 const struct iwl_cfg iwl6005_2abg_cfg = { 135 .name = "Intel(R) Centrino(R) Advanced-N 6205 ABG", 136 IWL_DEVICE_6005, 137 }; 138 139 const struct iwl_cfg iwl6005_2bg_cfg = { 140 .name = "Intel(R) Centrino(R) Advanced-N 6205 BG", 141 IWL_DEVICE_6005, 142 }; 143 144 const struct iwl_cfg iwl6005_2agn_sff_cfg = { 145 .name = "Intel(R) Centrino(R) Advanced-N 6205S AGN", 146 IWL_DEVICE_6005, 147 .ht_params = &iwl6000_ht_params, 148 }; 149 150 const struct iwl_cfg iwl6005_2agn_d_cfg = { 151 .name = "Intel(R) Centrino(R) Advanced-N 6205D AGN", 152 IWL_DEVICE_6005, 153 .ht_params = &iwl6000_ht_params, 154 }; 155 156 const struct iwl_cfg iwl6005_2agn_mow1_cfg = { 157 .name = "Intel(R) Centrino(R) Advanced-N 6206 AGN", 158 IWL_DEVICE_6005, 159 .ht_params = &iwl6000_ht_params, 160 }; 161 162 const struct iwl_cfg iwl6005_2agn_mow2_cfg = { 163 .name = "Intel(R) Centrino(R) Advanced-N 6207 AGN", 164 IWL_DEVICE_6005, 165 .ht_params = &iwl6000_ht_params, 166 }; 167 168 #define IWL_DEVICE_6030 \ 169 .fw_name_pre = IWL6030_FW_PRE, \ 170 .ucode_api_max = IWL6000G2_UCODE_API_MAX, \ 171 .ucode_api_min = IWL6000G2_UCODE_API_MIN, \ 172 .trans.device_family = IWL_DEVICE_FAMILY_6030, \ 173 .max_inst_size = IWL60_RTC_INST_SIZE, \ 174 .max_data_size = IWL60_RTC_DATA_SIZE, \ 175 .nvm_ver = EEPROM_6030_EEPROM_VERSION, \ 176 .nvm_calib_ver = EEPROM_6030_TX_POWER_VERSION, \ 177 .trans.base_params = &iwl6000_g2_base_params, \ 178 .eeprom_params = &iwl6000_eeprom_params, \ 179 .led_mode = IWL_LED_RF_STATE 180 181 const struct iwl_cfg iwl6030_2agn_cfg = { 182 .name = "Intel(R) Centrino(R) Advanced-N 6230 AGN", 183 IWL_DEVICE_6030, 184 .ht_params = &iwl6000_ht_params, 185 }; 186 187 const struct iwl_cfg iwl6030_2abg_cfg = { 188 .name = "Intel(R) Centrino(R) Advanced-N 6230 ABG", 189 IWL_DEVICE_6030, 190 }; 191 192 const struct iwl_cfg iwl6030_2bgn_cfg = { 193 .name = "Intel(R) Centrino(R) Advanced-N 6230 BGN", 194 IWL_DEVICE_6030, 195 .ht_params = &iwl6000_ht_params, 196 }; 197 198 const struct iwl_cfg iwl6030_2bg_cfg = { 199 .name = "Intel(R) Centrino(R) Advanced-N 6230 BG", 200 IWL_DEVICE_6030, 201 }; 202 203 #define IWL_DEVICE_6035 \ 204 .fw_name_pre = IWL6030_FW_PRE, \ 205 .ucode_api_max = IWL6035_UCODE_API_MAX, \ 206 .ucode_api_min = IWL6035_UCODE_API_MIN, \ 207 .trans.device_family = IWL_DEVICE_FAMILY_6030, \ 208 .max_inst_size = IWL60_RTC_INST_SIZE, \ 209 .max_data_size = IWL60_RTC_DATA_SIZE, \ 210 .nvm_ver = EEPROM_6030_EEPROM_VERSION, \ 211 .nvm_calib_ver = EEPROM_6030_TX_POWER_VERSION, \ 212 .trans.base_params = &iwl6000_g2_base_params, \ 213 .eeprom_params = &iwl6000_eeprom_params, \ 214 .led_mode = IWL_LED_RF_STATE 215 216 const struct iwl_cfg iwl6035_2agn_cfg = { 217 .name = "Intel(R) Centrino(R) Advanced-N 6235 AGN", 218 IWL_DEVICE_6035, 219 .ht_params = &iwl6000_ht_params, 220 }; 221 222 const struct iwl_cfg iwl6035_2agn_sff_cfg = { 223 .name = "Intel(R) Centrino(R) Ultimate-N 6235 AGN", 224 IWL_DEVICE_6035, 225 .ht_params = &iwl6000_ht_params, 226 }; 227 228 const struct iwl_cfg iwl1030_bgn_cfg = { 229 .name = "Intel(R) Centrino(R) Wireless-N 1030 BGN", 230 IWL_DEVICE_6030, 231 .ht_params = &iwl6000_ht_params, 232 }; 233 234 const struct iwl_cfg iwl1030_bg_cfg = { 235 .name = "Intel(R) Centrino(R) Wireless-N 1030 BG", 236 IWL_DEVICE_6030, 237 }; 238 239 const struct iwl_cfg iwl130_bgn_cfg = { 240 .name = "Intel(R) Centrino(R) Wireless-N 130 BGN", 241 IWL_DEVICE_6030, 242 .ht_params = &iwl6000_ht_params, 243 .rx_with_siso_diversity = true, 244 }; 245 246 const struct iwl_cfg iwl130_bg_cfg = { 247 .name = "Intel(R) Centrino(R) Wireless-N 130 BG", 248 IWL_DEVICE_6030, 249 .rx_with_siso_diversity = true, 250 }; 251 252 /* 253 * "i": Internal configuration, use internal Power Amplifier 254 */ 255 #define IWL_DEVICE_6000i \ 256 .fw_name_pre = IWL6000_FW_PRE, \ 257 .ucode_api_max = IWL6000_UCODE_API_MAX, \ 258 .ucode_api_min = IWL6000_UCODE_API_MIN, \ 259 .trans.device_family = IWL_DEVICE_FAMILY_6000i, \ 260 .max_inst_size = IWL60_RTC_INST_SIZE, \ 261 .max_data_size = IWL60_RTC_DATA_SIZE, \ 262 .valid_tx_ant = ANT_BC, /* .cfg overwrite */ \ 263 .valid_rx_ant = ANT_BC, /* .cfg overwrite */ \ 264 .nvm_ver = EEPROM_6000_EEPROM_VERSION, \ 265 .nvm_calib_ver = EEPROM_6000_TX_POWER_VERSION, \ 266 .trans.base_params = &iwl6000_base_params, \ 267 .eeprom_params = &iwl6000_eeprom_params, \ 268 .led_mode = IWL_LED_BLINK 269 270 const struct iwl_cfg iwl6000i_2agn_cfg = { 271 .name = "Intel(R) Centrino(R) Advanced-N 6200 AGN", 272 IWL_DEVICE_6000i, 273 .ht_params = &iwl6000_ht_params, 274 }; 275 276 const struct iwl_cfg iwl6000i_2abg_cfg = { 277 .name = "Intel(R) Centrino(R) Advanced-N 6200 ABG", 278 IWL_DEVICE_6000i, 279 }; 280 281 const struct iwl_cfg iwl6000i_2bg_cfg = { 282 .name = "Intel(R) Centrino(R) Advanced-N 6200 BG", 283 IWL_DEVICE_6000i, 284 }; 285 286 #define IWL_DEVICE_6050 \ 287 .fw_name_pre = IWL6050_FW_PRE, \ 288 .ucode_api_max = IWL6050_UCODE_API_MAX, \ 289 .ucode_api_min = IWL6050_UCODE_API_MIN, \ 290 .trans.device_family = IWL_DEVICE_FAMILY_6050, \ 291 .max_inst_size = IWL60_RTC_INST_SIZE, \ 292 .max_data_size = IWL60_RTC_DATA_SIZE, \ 293 .valid_tx_ant = ANT_AB, /* .cfg overwrite */ \ 294 .valid_rx_ant = ANT_AB, /* .cfg overwrite */ \ 295 .nvm_ver = EEPROM_6050_EEPROM_VERSION, \ 296 .nvm_calib_ver = EEPROM_6050_TX_POWER_VERSION, \ 297 .trans.base_params = &iwl6050_base_params, \ 298 .eeprom_params = &iwl6000_eeprom_params, \ 299 .led_mode = IWL_LED_BLINK, \ 300 .internal_wimax_coex = true 301 302 const struct iwl_cfg iwl6050_2agn_cfg = { 303 .name = "Intel(R) Centrino(R) Advanced-N + WiMAX 6250 AGN", 304 IWL_DEVICE_6050, 305 .ht_params = &iwl6000_ht_params, 306 }; 307 308 const struct iwl_cfg iwl6050_2abg_cfg = { 309 .name = "Intel(R) Centrino(R) Advanced-N + WiMAX 6250 ABG", 310 IWL_DEVICE_6050, 311 }; 312 313 #define IWL_DEVICE_6150 \ 314 .fw_name_pre = IWL6050_FW_PRE, \ 315 .ucode_api_max = IWL6050_UCODE_API_MAX, \ 316 .ucode_api_min = IWL6050_UCODE_API_MIN, \ 317 .trans.device_family = IWL_DEVICE_FAMILY_6150, \ 318 .max_inst_size = IWL60_RTC_INST_SIZE, \ 319 .max_data_size = IWL60_RTC_DATA_SIZE, \ 320 .nvm_ver = EEPROM_6150_EEPROM_VERSION, \ 321 .nvm_calib_ver = EEPROM_6150_TX_POWER_VERSION, \ 322 .trans.base_params = &iwl6050_base_params, \ 323 .eeprom_params = &iwl6000_eeprom_params, \ 324 .led_mode = IWL_LED_BLINK, \ 325 .internal_wimax_coex = true 326 327 const struct iwl_cfg iwl6150_bgn_cfg = { 328 .name = "Intel(R) Centrino(R) Wireless-N + WiMAX 6150 BGN", 329 IWL_DEVICE_6150, 330 .ht_params = &iwl6000_ht_params, 331 }; 332 333 const struct iwl_cfg iwl6150_bg_cfg = { 334 .name = "Intel(R) Centrino(R) Wireless-N + WiMAX 6150 BG", 335 IWL_DEVICE_6150, 336 }; 337 338 const struct iwl_cfg iwl6000_3agn_cfg = { 339 .name = "Intel(R) Centrino(R) Ultimate-N 6300 AGN", 340 .fw_name_pre = IWL6000_FW_PRE, 341 .ucode_api_max = IWL6000_UCODE_API_MAX, 342 .ucode_api_min = IWL6000_UCODE_API_MIN, 343 .trans.device_family = IWL_DEVICE_FAMILY_6000, 344 .max_inst_size = IWL60_RTC_INST_SIZE, 345 .max_data_size = IWL60_RTC_DATA_SIZE, 346 .nvm_ver = EEPROM_6000_EEPROM_VERSION, 347 .nvm_calib_ver = EEPROM_6000_TX_POWER_VERSION, 348 .trans.base_params = &iwl6000_base_params, 349 .eeprom_params = &iwl6000_eeprom_params, 350 .ht_params = &iwl6000_ht_params, 351 .led_mode = IWL_LED_BLINK, 352 }; 353 354 MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX)); 355 MODULE_FIRMWARE(IWL6050_MODULE_FIRMWARE(IWL6050_UCODE_API_MAX)); 356 MODULE_FIRMWARE(IWL6005_MODULE_FIRMWARE(IWL6000G2_UCODE_API_MAX)); 357 MODULE_FIRMWARE(IWL6030_MODULE_FIRMWARE(IWL6000G2_UCODE_API_MAX)); 358