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) 2014 Intel Corporation. All rights reserved. 9 * Copyright(c) 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) 2014 Intel Corporation. All rights reserved. 35 * Copyright(c) 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 IWL8000_UCODE_API_MAX 13 73 74/* Oldest version we won't warn about */ 75#define IWL8000_UCODE_API_OK 12 76 77/* Lowest firmware API version supported */ 78#define IWL8000_UCODE_API_MIN 10 79 80/* NVM versions */ 81#define IWL8000_NVM_VERSION 0x0a1d 82#define IWL8000_TX_POWER_VERSION 0xffff /* meaningless */ 83 84/* Memory offsets and lengths */ 85#define IWL8260_DCCM_OFFSET 0x800000 86#define IWL8260_DCCM_LEN 0x18000 87#define IWL8260_DCCM2_OFFSET 0x880000 88#define IWL8260_DCCM2_LEN 0x8000 89#define IWL8260_SMEM_OFFSET 0x400000 90#define IWL8260_SMEM_LEN 0x68000 91 92#define IWL8000_FW_PRE "iwlwifi-8000" 93#define IWL8000_MODULE_FIRMWARE(api) \ 94 IWL8000_FW_PRE "-" __stringify(api) ".ucode" 95 96#define NVM_HW_SECTION_NUM_FAMILY_8000 10 97#define DEFAULT_NVM_FILE_FAMILY_8000B "nvmData-8000B" 98#define DEFAULT_NVM_FILE_FAMILY_8000C "nvmData-8000C" 99 100/* Max SDIO RX aggregation size of the ADDBA request/response */ 101#define MAX_RX_AGG_SIZE_8260_SDIO 28 102 103/* Max A-MPDU exponent for HT and VHT */ 104#define MAX_HT_AMPDU_EXPONENT_8260_SDIO IEEE80211_HT_MAX_AMPDU_32K 105#define MAX_VHT_AMPDU_EXPONENT_8260_SDIO IEEE80211_VHT_MAX_AMPDU_32K 106 107static const struct iwl_base_params iwl8000_base_params = { 108 .eeprom_size = OTP_LOW_IMAGE_SIZE_FAMILY_8000, 109 .num_of_queues = IWLAGN_NUM_QUEUES, 110 .pll_cfg_val = 0, 111 .shadow_ram_support = true, 112 .led_compensation = 57, 113 .wd_timeout = IWL_LONG_WD_TIMEOUT, 114 .max_event_log_size = 512, 115 .shadow_reg_enable = true, 116 .pcie_l1_allowed = true, 117}; 118 119static const struct iwl_ht_params iwl8000_ht_params = { 120 .stbc = true, 121 .ldpc = true, 122 .ht40_bands = BIT(IEEE80211_BAND_2GHZ) | BIT(IEEE80211_BAND_5GHZ), 123}; 124 125#define IWL_DEVICE_8000 \ 126 .ucode_api_max = IWL8000_UCODE_API_MAX, \ 127 .ucode_api_ok = IWL8000_UCODE_API_OK, \ 128 .ucode_api_min = IWL8000_UCODE_API_MIN, \ 129 .device_family = IWL_DEVICE_FAMILY_8000, \ 130 .max_inst_size = IWL60_RTC_INST_SIZE, \ 131 .max_data_size = IWL60_RTC_DATA_SIZE, \ 132 .base_params = &iwl8000_base_params, \ 133 .led_mode = IWL_LED_RF_STATE, \ 134 .nvm_hw_section_num = NVM_HW_SECTION_NUM_FAMILY_8000, \ 135 .d0i3 = true, \ 136 .non_shared_ant = ANT_A, \ 137 .dccm_offset = IWL8260_DCCM_OFFSET, \ 138 .dccm_len = IWL8260_DCCM_LEN, \ 139 .dccm2_offset = IWL8260_DCCM2_OFFSET, \ 140 .dccm2_len = IWL8260_DCCM2_LEN, \ 141 .smem_offset = IWL8260_SMEM_OFFSET, \ 142 .smem_len = IWL8260_SMEM_LEN 143 144const struct iwl_cfg iwl8260_2n_cfg = { 145 .name = "Intel(R) Dual Band Wireless N 8260", 146 .fw_name_pre = IWL8000_FW_PRE, 147 IWL_DEVICE_8000, 148 .ht_params = &iwl8000_ht_params, 149 .nvm_ver = IWL8000_NVM_VERSION, 150 .nvm_calib_ver = IWL8000_TX_POWER_VERSION, 151}; 152 153const struct iwl_cfg iwl8260_2ac_cfg = { 154 .name = "Intel(R) Dual Band Wireless AC 8260", 155 .fw_name_pre = IWL8000_FW_PRE, 156 IWL_DEVICE_8000, 157 .ht_params = &iwl8000_ht_params, 158 .nvm_ver = IWL8000_NVM_VERSION, 159 .nvm_calib_ver = IWL8000_TX_POWER_VERSION, 160 .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, 161}; 162 163const struct iwl_cfg iwl4165_2ac_cfg = { 164 .name = "Intel(R) Dual Band Wireless AC 4165", 165 .fw_name_pre = IWL8000_FW_PRE, 166 IWL_DEVICE_8000, 167 .ht_params = &iwl8000_ht_params, 168 .nvm_ver = IWL8000_NVM_VERSION, 169 .nvm_calib_ver = IWL8000_TX_POWER_VERSION, 170 .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, 171}; 172 173const struct iwl_cfg iwl8260_2ac_sdio_cfg = { 174 .name = "Intel(R) Dual Band Wireless-AC 8260", 175 .fw_name_pre = IWL8000_FW_PRE, 176 IWL_DEVICE_8000, 177 .ht_params = &iwl8000_ht_params, 178 .nvm_ver = IWL8000_NVM_VERSION, 179 .nvm_calib_ver = IWL8000_TX_POWER_VERSION, 180 .default_nvm_file_B_step = DEFAULT_NVM_FILE_FAMILY_8000B, 181 .default_nvm_file_C_step = DEFAULT_NVM_FILE_FAMILY_8000C, 182 .max_rx_agg_size = MAX_RX_AGG_SIZE_8260_SDIO, 183 .disable_dummy_notification = true, 184 .max_ht_ampdu_exponent = MAX_HT_AMPDU_EXPONENT_8260_SDIO, 185 .max_vht_ampdu_exponent = MAX_VHT_AMPDU_EXPONENT_8260_SDIO, 186}; 187 188const struct iwl_cfg iwl4165_2ac_sdio_cfg = { 189 .name = "Intel(R) Dual Band Wireless-AC 4165", 190 .fw_name_pre = IWL8000_FW_PRE, 191 IWL_DEVICE_8000, 192 .ht_params = &iwl8000_ht_params, 193 .nvm_ver = IWL8000_NVM_VERSION, 194 .nvm_calib_ver = IWL8000_TX_POWER_VERSION, 195 .default_nvm_file_B_step = DEFAULT_NVM_FILE_FAMILY_8000B, 196 .default_nvm_file_C_step = DEFAULT_NVM_FILE_FAMILY_8000C, 197 .max_rx_agg_size = MAX_RX_AGG_SIZE_8260_SDIO, 198 .bt_shared_single_ant = true, 199 .disable_dummy_notification = true, 200 .max_ht_ampdu_exponent = MAX_HT_AMPDU_EXPONENT_8260_SDIO, 201 .max_vht_ampdu_exponent = MAX_VHT_AMPDU_EXPONENT_8260_SDIO, 202}; 203 204MODULE_FIRMWARE(IWL8000_MODULE_FIRMWARE(IWL8000_UCODE_API_OK)); 205