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) 2015-2017 Intel Deutschland GmbH 9*4882a593Smuzhiyun * Copyright(c) 2018 - 2020 Intel Corporation 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify 12*4882a593Smuzhiyun * it under the terms of version 2 of the GNU General Public License as 13*4882a593Smuzhiyun * published by the Free Software Foundation. 14*4882a593Smuzhiyun * 15*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, but 16*4882a593Smuzhiyun * WITHOUT ANY WARRANTY; without even the implied warranty of 17*4882a593Smuzhiyun * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18*4882a593Smuzhiyun * General Public License for more details. 19*4882a593Smuzhiyun * 20*4882a593Smuzhiyun * BSD LICENSE 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun * Copyright(c) 2015-2017 Intel Deutschland GmbH 23*4882a593Smuzhiyun * Copyright(c) 2018 - 2020 Intel Corporation 24*4882a593Smuzhiyun * All rights reserved. 25*4882a593Smuzhiyun * 26*4882a593Smuzhiyun * Redistribution and use in source and binary forms, with or without 27*4882a593Smuzhiyun * modification, are permitted provided that the following conditions 28*4882a593Smuzhiyun * are met: 29*4882a593Smuzhiyun * 30*4882a593Smuzhiyun * * Redistributions of source code must retain the above copyright 31*4882a593Smuzhiyun * notice, this list of conditions and the following disclaimer. 32*4882a593Smuzhiyun * * Redistributions in binary form must reproduce the above copyright 33*4882a593Smuzhiyun * notice, this list of conditions and the following disclaimer in 34*4882a593Smuzhiyun * the documentation and/or other materials provided with the 35*4882a593Smuzhiyun * distribution. 36*4882a593Smuzhiyun * * Neither the name Intel Corporation nor the names of its 37*4882a593Smuzhiyun * contributors may be used to endorse or promote products derived 38*4882a593Smuzhiyun * from this software without specific prior written permission. 39*4882a593Smuzhiyun * 40*4882a593Smuzhiyun * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 41*4882a593Smuzhiyun * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 42*4882a593Smuzhiyun * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 43*4882a593Smuzhiyun * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 44*4882a593Smuzhiyun * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45*4882a593Smuzhiyun * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 46*4882a593Smuzhiyun * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 47*4882a593Smuzhiyun * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 48*4882a593Smuzhiyun * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 49*4882a593Smuzhiyun * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 50*4882a593Smuzhiyun * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 51*4882a593Smuzhiyun * 52*4882a593Smuzhiyun *****************************************************************************/ 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun #include <linux/module.h> 55*4882a593Smuzhiyun #include <linux/stringify.h> 56*4882a593Smuzhiyun #include "iwl-config.h" 57*4882a593Smuzhiyun #include "fw/file.h" 58*4882a593Smuzhiyun #include "iwl-prph.h" 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun /* Highest firmware API version supported */ 61*4882a593Smuzhiyun #define IWL9000_UCODE_API_MAX 46 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* Lowest firmware API version supported */ 64*4882a593Smuzhiyun #define IWL9000_UCODE_API_MIN 30 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* NVM versions */ 67*4882a593Smuzhiyun #define IWL9000_NVM_VERSION 0x0a1d 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun /* Memory offsets and lengths */ 70*4882a593Smuzhiyun #define IWL9000_DCCM_OFFSET 0x800000 71*4882a593Smuzhiyun #define IWL9000_DCCM_LEN 0x18000 72*4882a593Smuzhiyun #define IWL9000_DCCM2_OFFSET 0x880000 73*4882a593Smuzhiyun #define IWL9000_DCCM2_LEN 0x8000 74*4882a593Smuzhiyun #define IWL9000_SMEM_OFFSET 0x400000 75*4882a593Smuzhiyun #define IWL9000_SMEM_LEN 0x68000 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun #define IWL9000_FW_PRE "iwlwifi-9000-pu-b0-jf-b0-" 78*4882a593Smuzhiyun #define IWL9260_FW_PRE "iwlwifi-9260-th-b0-jf-b0-" 79*4882a593Smuzhiyun #define IWL9000_MODULE_FIRMWARE(api) \ 80*4882a593Smuzhiyun IWL9000_FW_PRE __stringify(api) ".ucode" 81*4882a593Smuzhiyun #define IWL9260_MODULE_FIRMWARE(api) \ 82*4882a593Smuzhiyun IWL9260_FW_PRE __stringify(api) ".ucode" 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun static const struct iwl_base_params iwl9000_base_params = { 85*4882a593Smuzhiyun .eeprom_size = OTP_LOW_IMAGE_SIZE_32K, 86*4882a593Smuzhiyun .num_of_queues = 31, 87*4882a593Smuzhiyun .max_tfd_queue_size = 256, 88*4882a593Smuzhiyun .shadow_ram_support = true, 89*4882a593Smuzhiyun .led_compensation = 57, 90*4882a593Smuzhiyun .wd_timeout = IWL_LONG_WD_TIMEOUT, 91*4882a593Smuzhiyun .max_event_log_size = 512, 92*4882a593Smuzhiyun .shadow_reg_enable = true, 93*4882a593Smuzhiyun .pcie_l1_allowed = true, 94*4882a593Smuzhiyun }; 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun static const struct iwl_ht_params iwl9000_ht_params = { 97*4882a593Smuzhiyun .stbc = true, 98*4882a593Smuzhiyun .ldpc = true, 99*4882a593Smuzhiyun .ht40_bands = BIT(NL80211_BAND_2GHZ) | BIT(NL80211_BAND_5GHZ), 100*4882a593Smuzhiyun }; 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun static const struct iwl_tt_params iwl9000_tt_params = { 103*4882a593Smuzhiyun .ct_kill_entry = 115, 104*4882a593Smuzhiyun .ct_kill_exit = 93, 105*4882a593Smuzhiyun .ct_kill_duration = 5, 106*4882a593Smuzhiyun .dynamic_smps_entry = 111, 107*4882a593Smuzhiyun .dynamic_smps_exit = 107, 108*4882a593Smuzhiyun .tx_protection_entry = 112, 109*4882a593Smuzhiyun .tx_protection_exit = 105, 110*4882a593Smuzhiyun .tx_backoff = { 111*4882a593Smuzhiyun {.temperature = 110, .backoff = 200}, 112*4882a593Smuzhiyun {.temperature = 111, .backoff = 600}, 113*4882a593Smuzhiyun {.temperature = 112, .backoff = 1200}, 114*4882a593Smuzhiyun {.temperature = 113, .backoff = 2000}, 115*4882a593Smuzhiyun {.temperature = 114, .backoff = 4000}, 116*4882a593Smuzhiyun }, 117*4882a593Smuzhiyun .support_ct_kill = true, 118*4882a593Smuzhiyun .support_dynamic_smps = true, 119*4882a593Smuzhiyun .support_tx_protection = true, 120*4882a593Smuzhiyun .support_tx_backoff = true, 121*4882a593Smuzhiyun }; 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun #define IWL_DEVICE_9000 \ 124*4882a593Smuzhiyun .ucode_api_max = IWL9000_UCODE_API_MAX, \ 125*4882a593Smuzhiyun .ucode_api_min = IWL9000_UCODE_API_MIN, \ 126*4882a593Smuzhiyun .led_mode = IWL_LED_RF_STATE, \ 127*4882a593Smuzhiyun .nvm_hw_section_num = 10, \ 128*4882a593Smuzhiyun .non_shared_ant = ANT_B, \ 129*4882a593Smuzhiyun .dccm_offset = IWL9000_DCCM_OFFSET, \ 130*4882a593Smuzhiyun .dccm_len = IWL9000_DCCM_LEN, \ 131*4882a593Smuzhiyun .dccm2_offset = IWL9000_DCCM2_OFFSET, \ 132*4882a593Smuzhiyun .dccm2_len = IWL9000_DCCM2_LEN, \ 133*4882a593Smuzhiyun .smem_offset = IWL9000_SMEM_OFFSET, \ 134*4882a593Smuzhiyun .smem_len = IWL9000_SMEM_LEN, \ 135*4882a593Smuzhiyun .features = IWL_TX_CSUM_NETIF_FLAGS | NETIF_F_RXCSUM, \ 136*4882a593Smuzhiyun .thermal_params = &iwl9000_tt_params, \ 137*4882a593Smuzhiyun .apmg_not_supported = true, \ 138*4882a593Smuzhiyun .num_rbds = 512, \ 139*4882a593Smuzhiyun .vht_mu_mimo_supported = true, \ 140*4882a593Smuzhiyun .mac_addr_from_csr = true, \ 141*4882a593Smuzhiyun .nvm_type = IWL_NVM_EXT, \ 142*4882a593Smuzhiyun .dbgc_supported = true, \ 143*4882a593Smuzhiyun .min_umac_error_event_table = 0x800000, \ 144*4882a593Smuzhiyun .d3_debug_data_base_addr = 0x401000, \ 145*4882a593Smuzhiyun .d3_debug_data_length = 92 * 1024, \ 146*4882a593Smuzhiyun .ht_params = &iwl9000_ht_params, \ 147*4882a593Smuzhiyun .nvm_ver = IWL9000_NVM_VERSION, \ 148*4882a593Smuzhiyun .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, \ 149*4882a593Smuzhiyun .mon_smem_regs = { \ 150*4882a593Smuzhiyun .write_ptr = { \ 151*4882a593Smuzhiyun .addr = LDBG_M2S_BUF_WPTR, \ 152*4882a593Smuzhiyun .mask = LDBG_M2S_BUF_WPTR_VAL_MSK, \ 153*4882a593Smuzhiyun }, \ 154*4882a593Smuzhiyun .cycle_cnt = { \ 155*4882a593Smuzhiyun .addr = LDBG_M2S_BUF_WRAP_CNT, \ 156*4882a593Smuzhiyun .mask = LDBG_M2S_BUF_WRAP_CNT_VAL_MSK, \ 157*4882a593Smuzhiyun }, \ 158*4882a593Smuzhiyun }, \ 159*4882a593Smuzhiyun .mon_dram_regs = { \ 160*4882a593Smuzhiyun .write_ptr = { \ 161*4882a593Smuzhiyun .addr = MON_BUFF_WRPTR_VER2, \ 162*4882a593Smuzhiyun .mask = 0xffffffff, \ 163*4882a593Smuzhiyun }, \ 164*4882a593Smuzhiyun .cycle_cnt = { \ 165*4882a593Smuzhiyun .addr = MON_BUFF_CYCLE_CNT_VER2, \ 166*4882a593Smuzhiyun .mask = 0xffffffff, \ 167*4882a593Smuzhiyun }, \ 168*4882a593Smuzhiyun } 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun const struct iwl_cfg_trans_params iwl9000_trans_cfg = { 171*4882a593Smuzhiyun .device_family = IWL_DEVICE_FAMILY_9000, 172*4882a593Smuzhiyun .base_params = &iwl9000_base_params, 173*4882a593Smuzhiyun .mq_rx_supported = true, 174*4882a593Smuzhiyun .rf_id = true, 175*4882a593Smuzhiyun }; 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun const struct iwl_cfg_trans_params iwl9560_trans_cfg = { 178*4882a593Smuzhiyun .device_family = IWL_DEVICE_FAMILY_9000, 179*4882a593Smuzhiyun .base_params = &iwl9000_base_params, 180*4882a593Smuzhiyun .mq_rx_supported = true, 181*4882a593Smuzhiyun .rf_id = true, 182*4882a593Smuzhiyun .integrated = true, 183*4882a593Smuzhiyun .xtal_latency = 650, 184*4882a593Smuzhiyun }; 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun const struct iwl_cfg_trans_params iwl9560_long_latency_trans_cfg = { 187*4882a593Smuzhiyun .device_family = IWL_DEVICE_FAMILY_9000, 188*4882a593Smuzhiyun .base_params = &iwl9000_base_params, 189*4882a593Smuzhiyun .mq_rx_supported = true, 190*4882a593Smuzhiyun .rf_id = true, 191*4882a593Smuzhiyun .integrated = true, 192*4882a593Smuzhiyun .xtal_latency = 2820, 193*4882a593Smuzhiyun }; 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun const struct iwl_cfg_trans_params iwl9560_shared_clk_trans_cfg = { 196*4882a593Smuzhiyun .device_family = IWL_DEVICE_FAMILY_9000, 197*4882a593Smuzhiyun .base_params = &iwl9000_base_params, 198*4882a593Smuzhiyun .mq_rx_supported = true, 199*4882a593Smuzhiyun .rf_id = true, 200*4882a593Smuzhiyun .integrated = true, 201*4882a593Smuzhiyun .xtal_latency = 670, 202*4882a593Smuzhiyun .extra_phy_cfg_flags = FW_PHY_CFG_SHARED_CLK 203*4882a593Smuzhiyun }; 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun const char iwl9162_name[] = "Intel(R) Wireless-AC 9162"; 206*4882a593Smuzhiyun const char iwl9260_name[] = "Intel(R) Wireless-AC 9260"; 207*4882a593Smuzhiyun const char iwl9260_1_name[] = "Intel(R) Wireless-AC 9260-1"; 208*4882a593Smuzhiyun const char iwl9270_name[] = "Intel(R) Wireless-AC 9270"; 209*4882a593Smuzhiyun const char iwl9461_name[] = "Intel(R) Wireless-AC 9461"; 210*4882a593Smuzhiyun const char iwl9462_name[] = "Intel(R) Wireless-AC 9462"; 211*4882a593Smuzhiyun const char iwl9560_name[] = "Intel(R) Wireless-AC 9560"; 212*4882a593Smuzhiyun const char iwl9162_160_name[] = "Intel(R) Wireless-AC 9162 160MHz"; 213*4882a593Smuzhiyun const char iwl9260_160_name[] = "Intel(R) Wireless-AC 9260 160MHz"; 214*4882a593Smuzhiyun const char iwl9270_160_name[] = "Intel(R) Wireless-AC 9270 160MHz"; 215*4882a593Smuzhiyun const char iwl9461_160_name[] = "Intel(R) Wireless-AC 9461 160MHz"; 216*4882a593Smuzhiyun const char iwl9462_160_name[] = "Intel(R) Wireless-AC 9462 160MHz"; 217*4882a593Smuzhiyun const char iwl9560_160_name[] = "Intel(R) Wireless-AC 9560 160MHz"; 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun const char iwl9260_killer_1550_name[] = 220*4882a593Smuzhiyun "Killer (R) Wireless-AC 1550 Wireless Network Adapter (9260NGW)"; 221*4882a593Smuzhiyun const char iwl9560_killer_1550i_name[] = 222*4882a593Smuzhiyun "Killer (R) Wireless-AC 1550i Wireless Network Adapter (9560NGW)"; 223*4882a593Smuzhiyun const char iwl9560_killer_1550s_name[] = 224*4882a593Smuzhiyun "Killer (R) Wireless-AC 1550s Wireless Network Adapter (9560NGW)"; 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun const struct iwl_cfg iwl9260_2ac_cfg = { 227*4882a593Smuzhiyun .fw_name_pre = IWL9260_FW_PRE, 228*4882a593Smuzhiyun IWL_DEVICE_9000, 229*4882a593Smuzhiyun }; 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun const struct iwl_cfg iwl9560_2ac_cfg_soc = { 232*4882a593Smuzhiyun .fw_name_pre = IWL9000_FW_PRE, 233*4882a593Smuzhiyun IWL_DEVICE_9000, 234*4882a593Smuzhiyun }; 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun MODULE_FIRMWARE(IWL9000_MODULE_FIRMWARE(IWL9000_UCODE_API_MAX)); 237*4882a593Smuzhiyun MODULE_FIRMWARE(IWL9260_MODULE_FIRMWARE(IWL9000_UCODE_API_MAX)); 238