1 /****************************************************************************** 2 * 3 * This file is provided under a dual BSD/GPLv2 license. When using or 4 * redistributing this file, you may do so under either license. 5 * 6 * GPL LICENSE SUMMARY 7 * 8 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. 9 * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH 10 * 11 * This program is free software; you can redistribute it and/or modify 12 * it under the terms of version 2 of the GNU General Public License as 13 * published by the Free Software Foundation. 14 * 15 * This program is distributed in the hope that it will be useful, but 16 * WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 * General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, 23 * USA 24 * 25 * The full GNU General Public License is included in this distribution 26 * in the file called COPYING. 27 * 28 * Contact Information: 29 * Intel Linux Wireless <ilw@linux.intel.com> 30 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 31 * 32 * BSD LICENSE 33 * 34 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. 35 * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH 36 * All rights reserved. 37 * 38 * Redistribution and use in source and binary forms, with or without 39 * modification, are permitted provided that the following conditions 40 * are met: 41 * 42 * * Redistributions of source code must retain the above copyright 43 * notice, this list of conditions and the following disclaimer. 44 * * Redistributions in binary form must reproduce the above copyright 45 * notice, this list of conditions and the following disclaimer in 46 * the documentation and/or other materials provided with the 47 * distribution. 48 * * Neither the name Intel Corporation nor the names of its 49 * contributors may be used to endorse or promote products derived 50 * from this software without specific prior written permission. 51 * 52 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 53 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 54 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 55 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 56 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 57 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 58 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 59 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 60 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 61 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 62 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 63 * 64 *****************************************************************************/ 65 66 #include <linux/module.h> 67 #include <linux/stringify.h> 68 #include "iwl-config.h" 69 #include "iwl-agn-hw.h" 70 71 /* Highest firmware API version supported */ 72 #define IWL7260_UCODE_API_MAX 17 73 #define IWL7265_UCODE_API_MAX 17 74 #define IWL7265D_UCODE_API_MAX 19 75 76 /* Oldest version we won't warn about */ 77 #define IWL7260_UCODE_API_OK 13 78 #define IWL7265_UCODE_API_OK 13 79 #define IWL7265D_UCODE_API_OK 13 80 81 /* Lowest firmware API version supported */ 82 #define IWL7260_UCODE_API_MIN 13 83 #define IWL7265_UCODE_API_MIN 13 84 #define IWL7265D_UCODE_API_MIN 13 85 86 /* NVM versions */ 87 #define IWL7260_NVM_VERSION 0x0a1d 88 #define IWL7260_TX_POWER_VERSION 0xffff /* meaningless */ 89 #define IWL3160_NVM_VERSION 0x709 90 #define IWL3160_TX_POWER_VERSION 0xffff /* meaningless */ 91 #define IWL3165_NVM_VERSION 0x709 92 #define IWL3165_TX_POWER_VERSION 0xffff /* meaningless */ 93 #define IWL7265_NVM_VERSION 0x0a1d 94 #define IWL7265_TX_POWER_VERSION 0xffff /* meaningless */ 95 #define IWL7265D_NVM_VERSION 0x0c11 96 #define IWL7265_TX_POWER_VERSION 0xffff /* meaningless */ 97 98 /* DCCM offsets and lengths */ 99 #define IWL7000_DCCM_OFFSET 0x800000 100 #define IWL7260_DCCM_LEN 0x14000 101 #define IWL3160_DCCM_LEN 0x10000 102 #define IWL7265_DCCM_LEN 0x17A00 103 104 #define IWL7260_FW_PRE "iwlwifi-7260-" 105 #define IWL7260_MODULE_FIRMWARE(api) IWL7260_FW_PRE __stringify(api) ".ucode" 106 107 #define IWL3160_FW_PRE "iwlwifi-3160-" 108 #define IWL3160_MODULE_FIRMWARE(api) IWL3160_FW_PRE __stringify(api) ".ucode" 109 110 #define IWL7265_FW_PRE "iwlwifi-7265-" 111 #define IWL7265_MODULE_FIRMWARE(api) IWL7265_FW_PRE __stringify(api) ".ucode" 112 113 #define IWL7265D_FW_PRE "iwlwifi-7265D-" 114 #define IWL7265D_MODULE_FIRMWARE(api) IWL7265D_FW_PRE __stringify(api) ".ucode" 115 116 #define NVM_HW_SECTION_NUM_FAMILY_7000 0 117 118 static const struct iwl_base_params iwl7000_base_params = { 119 .eeprom_size = OTP_LOW_IMAGE_SIZE_FAMILY_7000, 120 .num_of_queues = 31, 121 .pll_cfg_val = 0, 122 .shadow_ram_support = true, 123 .led_compensation = 57, 124 .wd_timeout = IWL_LONG_WD_TIMEOUT, 125 .max_event_log_size = 512, 126 .shadow_reg_enable = true, 127 .pcie_l1_allowed = true, 128 .apmg_wake_up_wa = true, 129 }; 130 131 static const struct iwl_tt_params iwl7000_high_temp_tt_params = { 132 .ct_kill_entry = 118, 133 .ct_kill_exit = 96, 134 .ct_kill_duration = 5, 135 .dynamic_smps_entry = 114, 136 .dynamic_smps_exit = 110, 137 .tx_protection_entry = 114, 138 .tx_protection_exit = 108, 139 .tx_backoff = { 140 {.temperature = 112, .backoff = 300}, 141 {.temperature = 113, .backoff = 800}, 142 {.temperature = 114, .backoff = 1500}, 143 {.temperature = 115, .backoff = 3000}, 144 {.temperature = 116, .backoff = 5000}, 145 {.temperature = 117, .backoff = 10000}, 146 }, 147 .support_ct_kill = true, 148 .support_dynamic_smps = true, 149 .support_tx_protection = true, 150 .support_tx_backoff = true, 151 }; 152 153 static const struct iwl_ht_params iwl7000_ht_params = { 154 .stbc = true, 155 .ht40_bands = BIT(IEEE80211_BAND_2GHZ) | BIT(IEEE80211_BAND_5GHZ), 156 }; 157 158 #define IWL_DEVICE_7000_COMMON \ 159 .device_family = IWL_DEVICE_FAMILY_7000, \ 160 .max_inst_size = IWL60_RTC_INST_SIZE, \ 161 .max_data_size = IWL60_RTC_DATA_SIZE, \ 162 .base_params = &iwl7000_base_params, \ 163 .led_mode = IWL_LED_RF_STATE, \ 164 .nvm_hw_section_num = NVM_HW_SECTION_NUM_FAMILY_7000, \ 165 .non_shared_ant = ANT_A, \ 166 .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, \ 167 .dccm_offset = IWL7000_DCCM_OFFSET 168 169 #define IWL_DEVICE_7000 \ 170 IWL_DEVICE_7000_COMMON, \ 171 .ucode_api_max = IWL7260_UCODE_API_MAX, \ 172 .ucode_api_ok = IWL7260_UCODE_API_OK, \ 173 .ucode_api_min = IWL7260_UCODE_API_MIN 174 175 #define IWL_DEVICE_7005 \ 176 IWL_DEVICE_7000_COMMON, \ 177 .ucode_api_max = IWL7265_UCODE_API_MAX, \ 178 .ucode_api_ok = IWL7265_UCODE_API_OK, \ 179 .ucode_api_min = IWL7265_UCODE_API_MIN 180 181 #define IWL_DEVICE_7005D \ 182 IWL_DEVICE_7000_COMMON, \ 183 .ucode_api_max = IWL7265D_UCODE_API_MAX, \ 184 .ucode_api_ok = IWL7265D_UCODE_API_OK, \ 185 .ucode_api_min = IWL7265D_UCODE_API_MIN 186 187 const struct iwl_cfg iwl7260_2ac_cfg = { 188 .name = "Intel(R) Dual Band Wireless AC 7260", 189 .fw_name_pre = IWL7260_FW_PRE, 190 IWL_DEVICE_7000, 191 .ht_params = &iwl7000_ht_params, 192 .nvm_ver = IWL7260_NVM_VERSION, 193 .nvm_calib_ver = IWL7260_TX_POWER_VERSION, 194 .host_interrupt_operation_mode = true, 195 .lp_xtal_workaround = true, 196 .dccm_len = IWL7260_DCCM_LEN, 197 }; 198 199 const struct iwl_cfg iwl7260_2ac_cfg_high_temp = { 200 .name = "Intel(R) Dual Band Wireless AC 7260", 201 .fw_name_pre = IWL7260_FW_PRE, 202 IWL_DEVICE_7000, 203 .ht_params = &iwl7000_ht_params, 204 .nvm_ver = IWL7260_NVM_VERSION, 205 .nvm_calib_ver = IWL7260_TX_POWER_VERSION, 206 .high_temp = true, 207 .host_interrupt_operation_mode = true, 208 .lp_xtal_workaround = true, 209 .dccm_len = IWL7260_DCCM_LEN, 210 .thermal_params = &iwl7000_high_temp_tt_params, 211 }; 212 213 const struct iwl_cfg iwl7260_2n_cfg = { 214 .name = "Intel(R) Dual Band Wireless N 7260", 215 .fw_name_pre = IWL7260_FW_PRE, 216 IWL_DEVICE_7000, 217 .ht_params = &iwl7000_ht_params, 218 .nvm_ver = IWL7260_NVM_VERSION, 219 .nvm_calib_ver = IWL7260_TX_POWER_VERSION, 220 .host_interrupt_operation_mode = true, 221 .lp_xtal_workaround = true, 222 .dccm_len = IWL7260_DCCM_LEN, 223 }; 224 225 const struct iwl_cfg iwl7260_n_cfg = { 226 .name = "Intel(R) Wireless N 7260", 227 .fw_name_pre = IWL7260_FW_PRE, 228 IWL_DEVICE_7000, 229 .ht_params = &iwl7000_ht_params, 230 .nvm_ver = IWL7260_NVM_VERSION, 231 .nvm_calib_ver = IWL7260_TX_POWER_VERSION, 232 .host_interrupt_operation_mode = true, 233 .lp_xtal_workaround = true, 234 .dccm_len = IWL7260_DCCM_LEN, 235 }; 236 237 const struct iwl_cfg iwl3160_2ac_cfg = { 238 .name = "Intel(R) Dual Band Wireless AC 3160", 239 .fw_name_pre = IWL3160_FW_PRE, 240 IWL_DEVICE_7000, 241 .ht_params = &iwl7000_ht_params, 242 .nvm_ver = IWL3160_NVM_VERSION, 243 .nvm_calib_ver = IWL3160_TX_POWER_VERSION, 244 .host_interrupt_operation_mode = true, 245 .dccm_len = IWL3160_DCCM_LEN, 246 }; 247 248 const struct iwl_cfg iwl3160_2n_cfg = { 249 .name = "Intel(R) Dual Band Wireless N 3160", 250 .fw_name_pre = IWL3160_FW_PRE, 251 IWL_DEVICE_7000, 252 .ht_params = &iwl7000_ht_params, 253 .nvm_ver = IWL3160_NVM_VERSION, 254 .nvm_calib_ver = IWL3160_TX_POWER_VERSION, 255 .host_interrupt_operation_mode = true, 256 .dccm_len = IWL3160_DCCM_LEN, 257 }; 258 259 const struct iwl_cfg iwl3160_n_cfg = { 260 .name = "Intel(R) Wireless N 3160", 261 .fw_name_pre = IWL3160_FW_PRE, 262 IWL_DEVICE_7000, 263 .ht_params = &iwl7000_ht_params, 264 .nvm_ver = IWL3160_NVM_VERSION, 265 .nvm_calib_ver = IWL3160_TX_POWER_VERSION, 266 .host_interrupt_operation_mode = true, 267 .dccm_len = IWL3160_DCCM_LEN, 268 }; 269 270 static const struct iwl_pwr_tx_backoff iwl7265_pwr_tx_backoffs[] = { 271 {.pwr = 1600, .backoff = 0}, 272 {.pwr = 1300, .backoff = 467}, 273 {.pwr = 900, .backoff = 1900}, 274 {.pwr = 800, .backoff = 2630}, 275 {.pwr = 700, .backoff = 3720}, 276 {.pwr = 600, .backoff = 5550}, 277 {.pwr = 500, .backoff = 9350}, 278 {0}, 279 }; 280 281 static const struct iwl_ht_params iwl7265_ht_params = { 282 .stbc = true, 283 .ldpc = true, 284 .ht40_bands = BIT(IEEE80211_BAND_2GHZ) | BIT(IEEE80211_BAND_5GHZ), 285 }; 286 287 const struct iwl_cfg iwl3165_2ac_cfg = { 288 .name = "Intel(R) Dual Band Wireless AC 3165", 289 .fw_name_pre = IWL7265D_FW_PRE, 290 IWL_DEVICE_7005D, 291 .ht_params = &iwl7000_ht_params, 292 .nvm_ver = IWL3165_NVM_VERSION, 293 .nvm_calib_ver = IWL3165_TX_POWER_VERSION, 294 .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 295 .dccm_len = IWL7265_DCCM_LEN, 296 }; 297 298 const struct iwl_cfg iwl7265_2ac_cfg = { 299 .name = "Intel(R) Dual Band Wireless AC 7265", 300 .fw_name_pre = IWL7265_FW_PRE, 301 IWL_DEVICE_7005, 302 .ht_params = &iwl7265_ht_params, 303 .nvm_ver = IWL7265_NVM_VERSION, 304 .nvm_calib_ver = IWL7265_TX_POWER_VERSION, 305 .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 306 .dccm_len = IWL7265_DCCM_LEN, 307 }; 308 309 const struct iwl_cfg iwl7265_2n_cfg = { 310 .name = "Intel(R) Dual Band Wireless N 7265", 311 .fw_name_pre = IWL7265_FW_PRE, 312 IWL_DEVICE_7005, 313 .ht_params = &iwl7265_ht_params, 314 .nvm_ver = IWL7265_NVM_VERSION, 315 .nvm_calib_ver = IWL7265_TX_POWER_VERSION, 316 .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 317 .dccm_len = IWL7265_DCCM_LEN, 318 }; 319 320 const struct iwl_cfg iwl7265_n_cfg = { 321 .name = "Intel(R) Wireless N 7265", 322 .fw_name_pre = IWL7265_FW_PRE, 323 IWL_DEVICE_7005, 324 .ht_params = &iwl7265_ht_params, 325 .nvm_ver = IWL7265_NVM_VERSION, 326 .nvm_calib_ver = IWL7265_TX_POWER_VERSION, 327 .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 328 .dccm_len = IWL7265_DCCM_LEN, 329 }; 330 331 const struct iwl_cfg iwl7265d_2ac_cfg = { 332 .name = "Intel(R) Dual Band Wireless AC 7265", 333 .fw_name_pre = IWL7265D_FW_PRE, 334 IWL_DEVICE_7005D, 335 .ht_params = &iwl7265_ht_params, 336 .nvm_ver = IWL7265D_NVM_VERSION, 337 .nvm_calib_ver = IWL7265_TX_POWER_VERSION, 338 .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 339 .dccm_len = IWL7265_DCCM_LEN, 340 }; 341 342 const struct iwl_cfg iwl7265d_2n_cfg = { 343 .name = "Intel(R) Dual Band Wireless N 7265", 344 .fw_name_pre = IWL7265D_FW_PRE, 345 IWL_DEVICE_7005D, 346 .ht_params = &iwl7265_ht_params, 347 .nvm_ver = IWL7265D_NVM_VERSION, 348 .nvm_calib_ver = IWL7265_TX_POWER_VERSION, 349 .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 350 .dccm_len = IWL7265_DCCM_LEN, 351 }; 352 353 const struct iwl_cfg iwl7265d_n_cfg = { 354 .name = "Intel(R) Wireless N 7265", 355 .fw_name_pre = IWL7265D_FW_PRE, 356 IWL_DEVICE_7005D, 357 .ht_params = &iwl7265_ht_params, 358 .nvm_ver = IWL7265D_NVM_VERSION, 359 .nvm_calib_ver = IWL7265_TX_POWER_VERSION, 360 .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 361 .dccm_len = IWL7265_DCCM_LEN, 362 }; 363 364 MODULE_FIRMWARE(IWL7260_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); 365 MODULE_FIRMWARE(IWL3160_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); 366 MODULE_FIRMWARE(IWL7265_MODULE_FIRMWARE(IWL7265_UCODE_API_OK)); 367 MODULE_FIRMWARE(IWL7265D_MODULE_FIRMWARE(IWL7265D_UCODE_API_OK)); 368