299 lines · c
1// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause2/*3 * Copyright (C) 2012-2014, 2018-2020, 2023 Intel Corporation4 * Copyright (C) 2013-2014 Intel Mobile Communications GmbH5 * Copyright (C) 2015 Intel Deutschland GmbH6 */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 1713#define IWL7265_UCODE_API_MAX 1714#define IWL7265D_UCODE_API_MAX 2915#define IWL3168_UCODE_API_MAX 2916 17/* Lowest firmware API version supported */18#define IWL7260_UCODE_API_MIN 1719#define IWL7265_UCODE_API_MIN 1720#define IWL7265D_UCODE_API_MIN 2221#define IWL3168_UCODE_API_MIN 2222 23/* NVM versions */24#define IWL7260_NVM_VERSION 0x0a1d25#define IWL3160_NVM_VERSION 0x70926#define IWL3165_NVM_VERSION 0x70927#define IWL3168_NVM_VERSION 0xd0128#define IWL7265_NVM_VERSION 0x0a1d29#define IWL7265D_NVM_VERSION 0x0c1130 31/* DCCM offsets and lengths */32#define IWL7000_DCCM_OFFSET 0x80000033#define IWL7260_DCCM_LEN 0x1400034#define IWL3160_DCCM_LEN 0x1000035#define IWL7265_DCCM_LEN 0x17A0036 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_OFFSET99 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_MIN104 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_MIN109 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_MIN114 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_MIN119 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));299