1*4882a593Smuzhiyun /****************************************************************************** 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * This file is provided under a dual BSD/GPLv2 license. When using or 4*4882a593Smuzhiyun * redistributing this file, you may do so under either license. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * GPL LICENSE SUMMARY 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Copyright(c) 2014 Intel Corporation. All rights reserved. 9*4882a593Smuzhiyun * Copyright(c) 2014 - 2015 Intel Mobile Communications GmbH 10*4882a593Smuzhiyun * Copyright(c) 2016 Intel Deutschland GmbH 11*4882a593Smuzhiyun * Copyright(c) 2018 - 2019 Intel Corporation 12*4882a593Smuzhiyun * 13*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify 14*4882a593Smuzhiyun * it under the terms of version 2 of the GNU General Public License as 15*4882a593Smuzhiyun * published by the Free Software Foundation. 16*4882a593Smuzhiyun * 17*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, but 18*4882a593Smuzhiyun * WITHOUT ANY WARRANTY; without even the implied warranty of 19*4882a593Smuzhiyun * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20*4882a593Smuzhiyun * General Public License for more details. 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun * The full GNU General Public License is included in this distribution 23*4882a593Smuzhiyun * in the file called COPYING. 24*4882a593Smuzhiyun * 25*4882a593Smuzhiyun * Contact Information: 26*4882a593Smuzhiyun * Intel Linux Wireless <linuxwifi@intel.com> 27*4882a593Smuzhiyun * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 28*4882a593Smuzhiyun * 29*4882a593Smuzhiyun * BSD LICENSE 30*4882a593Smuzhiyun * 31*4882a593Smuzhiyun * Copyright(c) 2014 Intel Corporation. All rights reserved. 32*4882a593Smuzhiyun * Copyright(c) 2014 - 2015 Intel Mobile Communications GmbH 33*4882a593Smuzhiyun * Copyright(c) 2018 - 2019 Intel Corporation 34*4882a593Smuzhiyun * All rights reserved. 35*4882a593Smuzhiyun * 36*4882a593Smuzhiyun * Redistribution and use in source and binary forms, with or without 37*4882a593Smuzhiyun * modification, are permitted provided that the following conditions 38*4882a593Smuzhiyun * are met: 39*4882a593Smuzhiyun * 40*4882a593Smuzhiyun * * Redistributions of source code must retain the above copyright 41*4882a593Smuzhiyun * notice, this list of conditions and the following disclaimer. 42*4882a593Smuzhiyun * * Redistributions in binary form must reproduce the above copyright 43*4882a593Smuzhiyun * notice, this list of conditions and the following disclaimer in 44*4882a593Smuzhiyun * the documentation and/or other materials provided with the 45*4882a593Smuzhiyun * distribution. 46*4882a593Smuzhiyun * * Neither the name Intel Corporation nor the names of its 47*4882a593Smuzhiyun * contributors may be used to endorse or promote products derived 48*4882a593Smuzhiyun * from this software without specific prior written permission. 49*4882a593Smuzhiyun * 50*4882a593Smuzhiyun * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 51*4882a593Smuzhiyun * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 52*4882a593Smuzhiyun * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 53*4882a593Smuzhiyun * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 54*4882a593Smuzhiyun * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 55*4882a593Smuzhiyun * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 56*4882a593Smuzhiyun * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 57*4882a593Smuzhiyun * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 58*4882a593Smuzhiyun * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 59*4882a593Smuzhiyun * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 60*4882a593Smuzhiyun * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 61*4882a593Smuzhiyun * 62*4882a593Smuzhiyun *****************************************************************************/ 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun #include <linux/module.h> 65*4882a593Smuzhiyun #include <linux/stringify.h> 66*4882a593Smuzhiyun #include "iwl-config.h" 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun /* Highest firmware API version supported */ 69*4882a593Smuzhiyun #define IWL8000_UCODE_API_MAX 36 70*4882a593Smuzhiyun #define IWL8265_UCODE_API_MAX 36 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun /* Lowest firmware API version supported */ 73*4882a593Smuzhiyun #define IWL8000_UCODE_API_MIN 22 74*4882a593Smuzhiyun #define IWL8265_UCODE_API_MIN 22 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* NVM versions */ 77*4882a593Smuzhiyun #define IWL8000_NVM_VERSION 0x0a1d 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun /* Memory offsets and lengths */ 80*4882a593Smuzhiyun #define IWL8260_DCCM_OFFSET 0x800000 81*4882a593Smuzhiyun #define IWL8260_DCCM_LEN 0x18000 82*4882a593Smuzhiyun #define IWL8260_DCCM2_OFFSET 0x880000 83*4882a593Smuzhiyun #define IWL8260_DCCM2_LEN 0x8000 84*4882a593Smuzhiyun #define IWL8260_SMEM_OFFSET 0x400000 85*4882a593Smuzhiyun #define IWL8260_SMEM_LEN 0x68000 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun #define IWL8000_FW_PRE "iwlwifi-8000C-" 88*4882a593Smuzhiyun #define IWL8000_MODULE_FIRMWARE(api) \ 89*4882a593Smuzhiyun IWL8000_FW_PRE __stringify(api) ".ucode" 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun #define IWL8265_FW_PRE "iwlwifi-8265-" 92*4882a593Smuzhiyun #define IWL8265_MODULE_FIRMWARE(api) \ 93*4882a593Smuzhiyun IWL8265_FW_PRE __stringify(api) ".ucode" 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun #define DEFAULT_NVM_FILE_FAMILY_8000C "nvmData-8000C" 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun static const struct iwl_base_params iwl8000_base_params = { 98*4882a593Smuzhiyun .eeprom_size = OTP_LOW_IMAGE_SIZE_32K, 99*4882a593Smuzhiyun .num_of_queues = 31, 100*4882a593Smuzhiyun .max_tfd_queue_size = 256, 101*4882a593Smuzhiyun .shadow_ram_support = true, 102*4882a593Smuzhiyun .led_compensation = 57, 103*4882a593Smuzhiyun .wd_timeout = IWL_LONG_WD_TIMEOUT, 104*4882a593Smuzhiyun .max_event_log_size = 512, 105*4882a593Smuzhiyun .shadow_reg_enable = true, 106*4882a593Smuzhiyun .pcie_l1_allowed = true, 107*4882a593Smuzhiyun }; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun static const struct iwl_ht_params iwl8000_ht_params = { 110*4882a593Smuzhiyun .stbc = true, 111*4882a593Smuzhiyun .ldpc = true, 112*4882a593Smuzhiyun .ht40_bands = BIT(NL80211_BAND_2GHZ) | BIT(NL80211_BAND_5GHZ), 113*4882a593Smuzhiyun }; 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun static const struct iwl_tt_params iwl8000_tt_params = { 116*4882a593Smuzhiyun .ct_kill_entry = 115, 117*4882a593Smuzhiyun .ct_kill_exit = 93, 118*4882a593Smuzhiyun .ct_kill_duration = 5, 119*4882a593Smuzhiyun .dynamic_smps_entry = 111, 120*4882a593Smuzhiyun .dynamic_smps_exit = 107, 121*4882a593Smuzhiyun .tx_protection_entry = 112, 122*4882a593Smuzhiyun .tx_protection_exit = 105, 123*4882a593Smuzhiyun .tx_backoff = { 124*4882a593Smuzhiyun {.temperature = 110, .backoff = 200}, 125*4882a593Smuzhiyun {.temperature = 111, .backoff = 600}, 126*4882a593Smuzhiyun {.temperature = 112, .backoff = 1200}, 127*4882a593Smuzhiyun {.temperature = 113, .backoff = 2000}, 128*4882a593Smuzhiyun {.temperature = 114, .backoff = 4000}, 129*4882a593Smuzhiyun }, 130*4882a593Smuzhiyun .support_ct_kill = true, 131*4882a593Smuzhiyun .support_dynamic_smps = true, 132*4882a593Smuzhiyun .support_tx_protection = true, 133*4882a593Smuzhiyun .support_tx_backoff = true, 134*4882a593Smuzhiyun }; 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun #define IWL_DEVICE_8000_COMMON \ 137*4882a593Smuzhiyun .trans.device_family = IWL_DEVICE_FAMILY_8000, \ 138*4882a593Smuzhiyun .trans.base_params = &iwl8000_base_params, \ 139*4882a593Smuzhiyun .led_mode = IWL_LED_RF_STATE, \ 140*4882a593Smuzhiyun .nvm_hw_section_num = 10, \ 141*4882a593Smuzhiyun .features = NETIF_F_RXCSUM, \ 142*4882a593Smuzhiyun .non_shared_ant = ANT_A, \ 143*4882a593Smuzhiyun .dccm_offset = IWL8260_DCCM_OFFSET, \ 144*4882a593Smuzhiyun .dccm_len = IWL8260_DCCM_LEN, \ 145*4882a593Smuzhiyun .dccm2_offset = IWL8260_DCCM2_OFFSET, \ 146*4882a593Smuzhiyun .dccm2_len = IWL8260_DCCM2_LEN, \ 147*4882a593Smuzhiyun .smem_offset = IWL8260_SMEM_OFFSET, \ 148*4882a593Smuzhiyun .smem_len = IWL8260_SMEM_LEN, \ 149*4882a593Smuzhiyun .default_nvm_file_C_step = DEFAULT_NVM_FILE_FAMILY_8000C, \ 150*4882a593Smuzhiyun .thermal_params = &iwl8000_tt_params, \ 151*4882a593Smuzhiyun .apmg_not_supported = true, \ 152*4882a593Smuzhiyun .nvm_type = IWL_NVM_EXT, \ 153*4882a593Smuzhiyun .dbgc_supported = true, \ 154*4882a593Smuzhiyun .min_umac_error_event_table = 0x800000 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun #define IWL_DEVICE_8000 \ 157*4882a593Smuzhiyun IWL_DEVICE_8000_COMMON, \ 158*4882a593Smuzhiyun .ucode_api_max = IWL8000_UCODE_API_MAX, \ 159*4882a593Smuzhiyun .ucode_api_min = IWL8000_UCODE_API_MIN \ 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun #define IWL_DEVICE_8260 \ 162*4882a593Smuzhiyun IWL_DEVICE_8000_COMMON, \ 163*4882a593Smuzhiyun .ucode_api_max = IWL8000_UCODE_API_MAX, \ 164*4882a593Smuzhiyun .ucode_api_min = IWL8000_UCODE_API_MIN \ 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun #define IWL_DEVICE_8265 \ 167*4882a593Smuzhiyun IWL_DEVICE_8000_COMMON, \ 168*4882a593Smuzhiyun .ucode_api_max = IWL8265_UCODE_API_MAX, \ 169*4882a593Smuzhiyun .ucode_api_min = IWL8265_UCODE_API_MIN \ 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun const struct iwl_cfg iwl8260_2n_cfg = { 172*4882a593Smuzhiyun .name = "Intel(R) Dual Band Wireless N 8260", 173*4882a593Smuzhiyun .fw_name_pre = IWL8000_FW_PRE, 174*4882a593Smuzhiyun IWL_DEVICE_8260, 175*4882a593Smuzhiyun .ht_params = &iwl8000_ht_params, 176*4882a593Smuzhiyun .nvm_ver = IWL8000_NVM_VERSION, 177*4882a593Smuzhiyun }; 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun const struct iwl_cfg iwl8260_2ac_cfg = { 180*4882a593Smuzhiyun .name = "Intel(R) Dual Band Wireless AC 8260", 181*4882a593Smuzhiyun .fw_name_pre = IWL8000_FW_PRE, 182*4882a593Smuzhiyun IWL_DEVICE_8260, 183*4882a593Smuzhiyun .ht_params = &iwl8000_ht_params, 184*4882a593Smuzhiyun .nvm_ver = IWL8000_NVM_VERSION, 185*4882a593Smuzhiyun .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, 186*4882a593Smuzhiyun }; 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun const struct iwl_cfg iwl8265_2ac_cfg = { 189*4882a593Smuzhiyun .name = "Intel(R) Dual Band Wireless AC 8265", 190*4882a593Smuzhiyun .fw_name_pre = IWL8265_FW_PRE, 191*4882a593Smuzhiyun IWL_DEVICE_8265, 192*4882a593Smuzhiyun .ht_params = &iwl8000_ht_params, 193*4882a593Smuzhiyun .nvm_ver = IWL8000_NVM_VERSION, 194*4882a593Smuzhiyun .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, 195*4882a593Smuzhiyun .vht_mu_mimo_supported = true, 196*4882a593Smuzhiyun }; 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun const struct iwl_cfg iwl8275_2ac_cfg = { 199*4882a593Smuzhiyun .name = "Intel(R) Dual Band Wireless AC 8275", 200*4882a593Smuzhiyun .fw_name_pre = IWL8265_FW_PRE, 201*4882a593Smuzhiyun IWL_DEVICE_8265, 202*4882a593Smuzhiyun .ht_params = &iwl8000_ht_params, 203*4882a593Smuzhiyun .nvm_ver = IWL8000_NVM_VERSION, 204*4882a593Smuzhiyun .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, 205*4882a593Smuzhiyun .vht_mu_mimo_supported = true, 206*4882a593Smuzhiyun }; 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun const struct iwl_cfg iwl4165_2ac_cfg = { 209*4882a593Smuzhiyun .name = "Intel(R) Dual Band Wireless AC 4165", 210*4882a593Smuzhiyun .fw_name_pre = IWL8000_FW_PRE, 211*4882a593Smuzhiyun IWL_DEVICE_8000, 212*4882a593Smuzhiyun .ht_params = &iwl8000_ht_params, 213*4882a593Smuzhiyun .nvm_ver = IWL8000_NVM_VERSION, 214*4882a593Smuzhiyun .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, 215*4882a593Smuzhiyun }; 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun MODULE_FIRMWARE(IWL8000_MODULE_FIRMWARE(IWL8000_UCODE_API_MAX)); 218*4882a593Smuzhiyun MODULE_FIRMWARE(IWL8265_MODULE_FIRMWARE(IWL8265_UCODE_API_MAX)); 219