7000.c (8858B)
1// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 2/* 3 * Copyright (C) 2012-2014, 2018-2020 Intel Corporation 4 * Copyright (C) 2013-2014 Intel Mobile Communications GmbH 5 * Copyright (C) 2015 Intel Deutschland GmbH 6 */ 7#include <linux/module.h> 8#include <linux/stringify.h> 9#include "iwl-config.h" 10 11/* Highest firmware API version supported */ 12#define IWL7260_UCODE_API_MAX 17 13#define IWL7265_UCODE_API_MAX 17 14#define IWL7265D_UCODE_API_MAX 29 15#define IWL3168_UCODE_API_MAX 29 16 17/* Lowest firmware API version supported */ 18#define IWL7260_UCODE_API_MIN 17 19#define IWL7265_UCODE_API_MIN 17 20#define IWL7265D_UCODE_API_MIN 22 21#define IWL3168_UCODE_API_MIN 22 22 23/* NVM versions */ 24#define IWL7260_NVM_VERSION 0x0a1d 25#define IWL3160_NVM_VERSION 0x709 26#define IWL3165_NVM_VERSION 0x709 27#define IWL3168_NVM_VERSION 0xd01 28#define IWL7265_NVM_VERSION 0x0a1d 29#define IWL7265D_NVM_VERSION 0x0c11 30 31/* DCCM offsets and lengths */ 32#define IWL7000_DCCM_OFFSET 0x800000 33#define IWL7260_DCCM_LEN 0x14000 34#define IWL3160_DCCM_LEN 0x10000 35#define IWL7265_DCCM_LEN 0x17A00 36 37#define IWL7260_FW_PRE "iwlwifi-7260-" 38#define IWL7260_MODULE_FIRMWARE(api) IWL7260_FW_PRE __stringify(api) ".ucode" 39 40#define IWL3160_FW_PRE "iwlwifi-3160-" 41#define IWL3160_MODULE_FIRMWARE(api) IWL3160_FW_PRE __stringify(api) ".ucode" 42 43#define IWL3168_FW_PRE "iwlwifi-3168-" 44#define IWL3168_MODULE_FIRMWARE(api) IWL3168_FW_PRE __stringify(api) ".ucode" 45 46#define IWL7265_FW_PRE "iwlwifi-7265-" 47#define IWL7265_MODULE_FIRMWARE(api) IWL7265_FW_PRE __stringify(api) ".ucode" 48 49#define IWL7265D_FW_PRE "iwlwifi-7265D-" 50#define IWL7265D_MODULE_FIRMWARE(api) IWL7265D_FW_PRE __stringify(api) ".ucode" 51 52static const struct iwl_base_params iwl7000_base_params = { 53 .eeprom_size = OTP_LOW_IMAGE_SIZE_16K, 54 .num_of_queues = 31, 55 .max_tfd_queue_size = 256, 56 .shadow_ram_support = true, 57 .led_compensation = 57, 58 .wd_timeout = IWL_LONG_WD_TIMEOUT, 59 .max_event_log_size = 512, 60 .shadow_reg_enable = true, 61 .pcie_l1_allowed = true, 62 .apmg_wake_up_wa = true, 63}; 64 65static const struct iwl_tt_params iwl7000_high_temp_tt_params = { 66 .ct_kill_entry = 118, 67 .ct_kill_exit = 96, 68 .ct_kill_duration = 5, 69 .dynamic_smps_entry = 114, 70 .dynamic_smps_exit = 110, 71 .tx_protection_entry = 114, 72 .tx_protection_exit = 108, 73 .tx_backoff = { 74 {.temperature = 112, .backoff = 300}, 75 {.temperature = 113, .backoff = 800}, 76 {.temperature = 114, .backoff = 1500}, 77 {.temperature = 115, .backoff = 3000}, 78 {.temperature = 116, .backoff = 5000}, 79 {.temperature = 117, .backoff = 10000}, 80 }, 81 .support_ct_kill = true, 82 .support_dynamic_smps = true, 83 .support_tx_protection = true, 84 .support_tx_backoff = true, 85}; 86 87static const struct iwl_ht_params iwl7000_ht_params = { 88 .stbc = true, 89 .ht40_bands = BIT(NL80211_BAND_2GHZ) | BIT(NL80211_BAND_5GHZ), 90}; 91 92#define IWL_DEVICE_7000_COMMON \ 93 .trans.device_family = IWL_DEVICE_FAMILY_7000, \ 94 .trans.base_params = &iwl7000_base_params, \ 95 .led_mode = IWL_LED_RF_STATE, \ 96 .nvm_hw_section_num = 0, \ 97 .non_shared_ant = ANT_A, \ 98 .dccm_offset = IWL7000_DCCM_OFFSET 99 100#define IWL_DEVICE_7000 \ 101 IWL_DEVICE_7000_COMMON, \ 102 .ucode_api_max = IWL7260_UCODE_API_MAX, \ 103 .ucode_api_min = IWL7260_UCODE_API_MIN 104 105#define IWL_DEVICE_7005 \ 106 IWL_DEVICE_7000_COMMON, \ 107 .ucode_api_max = IWL7265_UCODE_API_MAX, \ 108 .ucode_api_min = IWL7265_UCODE_API_MIN 109 110#define IWL_DEVICE_3008 \ 111 IWL_DEVICE_7000_COMMON, \ 112 .ucode_api_max = IWL3168_UCODE_API_MAX, \ 113 .ucode_api_min = IWL3168_UCODE_API_MIN 114 115#define IWL_DEVICE_7005D \ 116 IWL_DEVICE_7000_COMMON, \ 117 .ucode_api_max = IWL7265D_UCODE_API_MAX, \ 118 .ucode_api_min = IWL7265D_UCODE_API_MIN 119 120const struct iwl_cfg iwl7260_2ac_cfg = { 121 .name = "Intel(R) Dual Band Wireless AC 7260", 122 .fw_name_pre = IWL7260_FW_PRE, 123 IWL_DEVICE_7000, 124 .ht_params = &iwl7000_ht_params, 125 .nvm_ver = IWL7260_NVM_VERSION, 126 .host_interrupt_operation_mode = true, 127 .lp_xtal_workaround = true, 128 .dccm_len = IWL7260_DCCM_LEN, 129}; 130 131const struct iwl_cfg iwl7260_2ac_cfg_high_temp = { 132 .name = "Intel(R) Dual Band Wireless AC 7260", 133 .fw_name_pre = IWL7260_FW_PRE, 134 IWL_DEVICE_7000, 135 .ht_params = &iwl7000_ht_params, 136 .nvm_ver = IWL7260_NVM_VERSION, 137 .high_temp = true, 138 .host_interrupt_operation_mode = true, 139 .lp_xtal_workaround = true, 140 .dccm_len = IWL7260_DCCM_LEN, 141 .thermal_params = &iwl7000_high_temp_tt_params, 142}; 143 144const struct iwl_cfg iwl7260_2n_cfg = { 145 .name = "Intel(R) Dual Band Wireless N 7260", 146 .fw_name_pre = IWL7260_FW_PRE, 147 IWL_DEVICE_7000, 148 .ht_params = &iwl7000_ht_params, 149 .nvm_ver = IWL7260_NVM_VERSION, 150 .host_interrupt_operation_mode = true, 151 .lp_xtal_workaround = true, 152 .dccm_len = IWL7260_DCCM_LEN, 153}; 154 155const struct iwl_cfg iwl7260_n_cfg = { 156 .name = "Intel(R) Wireless N 7260", 157 .fw_name_pre = IWL7260_FW_PRE, 158 IWL_DEVICE_7000, 159 .ht_params = &iwl7000_ht_params, 160 .nvm_ver = IWL7260_NVM_VERSION, 161 .host_interrupt_operation_mode = true, 162 .lp_xtal_workaround = true, 163 .dccm_len = IWL7260_DCCM_LEN, 164}; 165 166const struct iwl_cfg iwl3160_2ac_cfg = { 167 .name = "Intel(R) Dual Band Wireless AC 3160", 168 .fw_name_pre = IWL3160_FW_PRE, 169 IWL_DEVICE_7000, 170 .ht_params = &iwl7000_ht_params, 171 .nvm_ver = IWL3160_NVM_VERSION, 172 .host_interrupt_operation_mode = true, 173 .dccm_len = IWL3160_DCCM_LEN, 174}; 175 176const struct iwl_cfg iwl3160_2n_cfg = { 177 .name = "Intel(R) Dual Band Wireless N 3160", 178 .fw_name_pre = IWL3160_FW_PRE, 179 IWL_DEVICE_7000, 180 .ht_params = &iwl7000_ht_params, 181 .nvm_ver = IWL3160_NVM_VERSION, 182 .host_interrupt_operation_mode = true, 183 .dccm_len = IWL3160_DCCM_LEN, 184}; 185 186const struct iwl_cfg iwl3160_n_cfg = { 187 .name = "Intel(R) Wireless N 3160", 188 .fw_name_pre = IWL3160_FW_PRE, 189 IWL_DEVICE_7000, 190 .ht_params = &iwl7000_ht_params, 191 .nvm_ver = IWL3160_NVM_VERSION, 192 .host_interrupt_operation_mode = true, 193 .dccm_len = IWL3160_DCCM_LEN, 194}; 195 196static const struct iwl_pwr_tx_backoff iwl7265_pwr_tx_backoffs[] = { 197 {.pwr = 1600, .backoff = 0}, 198 {.pwr = 1300, .backoff = 467}, 199 {.pwr = 900, .backoff = 1900}, 200 {.pwr = 800, .backoff = 2630}, 201 {.pwr = 700, .backoff = 3720}, 202 {.pwr = 600, .backoff = 5550}, 203 {.pwr = 500, .backoff = 9350}, 204 {0}, 205}; 206 207static const struct iwl_ht_params iwl7265_ht_params = { 208 .stbc = true, 209 .ldpc = true, 210 .ht40_bands = BIT(NL80211_BAND_2GHZ) | BIT(NL80211_BAND_5GHZ), 211}; 212 213const struct iwl_cfg iwl3165_2ac_cfg = { 214 .name = "Intel(R) Dual Band Wireless AC 3165", 215 .fw_name_pre = IWL7265D_FW_PRE, 216 IWL_DEVICE_7005D, 217 .ht_params = &iwl7000_ht_params, 218 .nvm_ver = IWL3165_NVM_VERSION, 219 .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 220 .dccm_len = IWL7265_DCCM_LEN, 221}; 222 223const struct iwl_cfg iwl3168_2ac_cfg = { 224 .name = "Intel(R) Dual Band Wireless AC 3168", 225 .fw_name_pre = IWL3168_FW_PRE, 226 IWL_DEVICE_3008, 227 .ht_params = &iwl7000_ht_params, 228 .nvm_ver = IWL3168_NVM_VERSION, 229 .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 230 .dccm_len = IWL7265_DCCM_LEN, 231 .nvm_type = IWL_NVM_SDP, 232}; 233 234const struct iwl_cfg iwl7265_2ac_cfg = { 235 .name = "Intel(R) Dual Band Wireless AC 7265", 236 .fw_name_pre = IWL7265_FW_PRE, 237 IWL_DEVICE_7005, 238 .ht_params = &iwl7265_ht_params, 239 .nvm_ver = IWL7265_NVM_VERSION, 240 .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 241 .dccm_len = IWL7265_DCCM_LEN, 242}; 243 244const struct iwl_cfg iwl7265_2n_cfg = { 245 .name = "Intel(R) Dual Band Wireless N 7265", 246 .fw_name_pre = IWL7265_FW_PRE, 247 IWL_DEVICE_7005, 248 .ht_params = &iwl7265_ht_params, 249 .nvm_ver = IWL7265_NVM_VERSION, 250 .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 251 .dccm_len = IWL7265_DCCM_LEN, 252}; 253 254const struct iwl_cfg iwl7265_n_cfg = { 255 .name = "Intel(R) Wireless N 7265", 256 .fw_name_pre = IWL7265_FW_PRE, 257 IWL_DEVICE_7005, 258 .ht_params = &iwl7265_ht_params, 259 .nvm_ver = IWL7265_NVM_VERSION, 260 .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 261 .dccm_len = IWL7265_DCCM_LEN, 262}; 263 264const struct iwl_cfg iwl7265d_2ac_cfg = { 265 .name = "Intel(R) Dual Band Wireless AC 7265", 266 .fw_name_pre = IWL7265D_FW_PRE, 267 IWL_DEVICE_7005D, 268 .ht_params = &iwl7265_ht_params, 269 .nvm_ver = IWL7265D_NVM_VERSION, 270 .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 271 .dccm_len = IWL7265_DCCM_LEN, 272}; 273 274const struct iwl_cfg iwl7265d_2n_cfg = { 275 .name = "Intel(R) Dual Band Wireless N 7265", 276 .fw_name_pre = IWL7265D_FW_PRE, 277 IWL_DEVICE_7005D, 278 .ht_params = &iwl7265_ht_params, 279 .nvm_ver = IWL7265D_NVM_VERSION, 280 .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 281 .dccm_len = IWL7265_DCCM_LEN, 282}; 283 284const struct iwl_cfg iwl7265d_n_cfg = { 285 .name = "Intel(R) Wireless N 7265", 286 .fw_name_pre = IWL7265D_FW_PRE, 287 IWL_DEVICE_7005D, 288 .ht_params = &iwl7265_ht_params, 289 .nvm_ver = IWL7265D_NVM_VERSION, 290 .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 291 .dccm_len = IWL7265_DCCM_LEN, 292}; 293 294MODULE_FIRMWARE(IWL7260_MODULE_FIRMWARE(IWL7260_UCODE_API_MAX)); 295MODULE_FIRMWARE(IWL3160_MODULE_FIRMWARE(IWL7260_UCODE_API_MAX)); 296MODULE_FIRMWARE(IWL3168_MODULE_FIRMWARE(IWL3168_UCODE_API_MAX)); 297MODULE_FIRMWARE(IWL7265_MODULE_FIRMWARE(IWL7265_UCODE_API_MAX)); 298MODULE_FIRMWARE(IWL7265D_MODULE_FIRMWARE(IWL7265D_UCODE_API_MAX));