Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 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 | * |
Emmanuel Grumbach | 51368bf | 2013-12-30 13:15:54 +0200 | [diff] [blame] | 8 | * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved. |
Johannes Berg | 8b4139d | 2014-07-24 14:05:26 +0200 | [diff] [blame] | 9 | * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 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 |
Emmanuel Grumbach | 410dc5a | 2013-02-18 09:22:28 +0200 | [diff] [blame] | 26 | * in the file called COPYING. |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 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 | * |
Emmanuel Grumbach | 51368bf | 2013-12-30 13:15:54 +0200 | [diff] [blame] | 34 | * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved. |
Johannes Berg | 8b4139d | 2014-07-24 14:05:26 +0200 | [diff] [blame] | 35 | * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 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 | #ifndef __iwl_fw_h__ |
| 66 | #define __iwl_fw_h__ |
| 67 | #include <linux/types.h> |
Wey-Yi Guy | bb982e3 | 2012-04-03 16:23:37 -0700 | [diff] [blame] | 68 | #include <net/mac80211.h> |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 69 | |
Emmanuel Grumbach | 06ddbf5 | 2014-06-02 08:34:53 +0300 | [diff] [blame] | 70 | #include "iwl-fw-file.h" |
| 71 | |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 72 | /** |
| 73 | * enum iwl_ucode_tlv_flag - ucode API flags |
| 74 | * @IWL_UCODE_TLV_FLAGS_PAN: This is PAN capable microcode; this previously |
| 75 | * was a separate TLV but moved here to save space. |
| 76 | * @IWL_UCODE_TLV_FLAGS_NEWSCAN: new uCode scan behaviour on hidden SSID, |
| 77 | * treats good CRC threshold as a boolean |
| 78 | * @IWL_UCODE_TLV_FLAGS_MFP: This uCode image supports MFP (802.11w). |
| 79 | * @IWL_UCODE_TLV_FLAGS_P2P: This uCode image supports P2P. |
Emmanuel Grumbach | 25b9ea5 | 2013-03-06 11:53:38 +0200 | [diff] [blame] | 80 | * @IWL_UCODE_TLV_FLAGS_DW_BC_TABLE: The SCD byte count table is in DWORDS |
Matt Chen | 1504f48 | 2014-04-24 18:43:18 +0800 | [diff] [blame] | 81 | * @IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT: This uCode image supports uAPSD |
David Spinadel | 35a000b | 2013-08-28 09:29:43 +0300 | [diff] [blame] | 82 | * @IWL_UCODE_TLV_FLAGS_SHORT_BL: 16 entries of black list instead of 64 in scan |
| 83 | * offload profile config command. |
Johannes Berg | 5369d6c | 2013-07-08 11:17:06 +0200 | [diff] [blame] | 84 | * @IWL_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS: D3 image supports up to six |
| 85 | * (rather than two) IPv6 addresses |
David Spinadel | 20f1a5d | 2013-08-21 09:14:27 +0300 | [diff] [blame] | 86 | * @IWL_UCODE_TLV_FLAGS_NO_BASIC_SSID: not sending a probe with the SSID element |
| 87 | * from the probe request template. |
Johannes Berg | f7fc598 | 2013-08-20 13:04:10 +0200 | [diff] [blame] | 88 | * @IWL_UCODE_TLV_FLAGS_NEW_NSOFFL_SMALL: new NS offload (small version) |
| 89 | * @IWL_UCODE_TLV_FLAGS_NEW_NSOFFL_LARGE: new NS offload (large version) |
Avri Altman | 1988902 | 2014-03-19 07:25:06 +0200 | [diff] [blame] | 90 | * @IWL_UCODE_TLV_FLAGS_P2P_PM: P2P client supports PM as a stand alone MAC |
Alexander Bondar | 7303dd7f | 2014-02-03 21:57:28 +0200 | [diff] [blame] | 91 | * @IWL_UCODE_TLV_FLAGS_P2P_BSS_PS_DCM: support power save on BSS station and |
| 92 | * P2P client interfaces simultaneously if they are in different bindings. |
Avri Altman | 1988902 | 2014-03-19 07:25:06 +0200 | [diff] [blame] | 93 | * @IWL_UCODE_TLV_FLAGS_P2P_BSS_PS_SCM: support power save on BSS station and |
| 94 | * P2P client interfaces simultaneously if they are in same bindings. |
Arik Nemtsov | a42c9fc | 2014-05-08 16:17:31 +0300 | [diff] [blame] | 95 | * @IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT: General support for uAPSD |
Alexander Bondar | 7520967 | 2013-11-12 14:47:59 +0200 | [diff] [blame] | 96 | * @IWL_UCODE_TLV_FLAGS_P2P_PS_UAPSD: P2P client supports uAPSD power save |
Eliad Peller | c87163b | 2014-01-08 10:11:11 +0200 | [diff] [blame] | 97 | * @IWL_UCODE_TLV_FLAGS_BCAST_FILTERING: uCode supports broadcast filtering. |
Johannes Berg | 3e56ead | 2013-02-15 22:23:18 +0100 | [diff] [blame] | 98 | * @IWL_UCODE_TLV_FLAGS_GO_UAPSD: AP/GO interfaces support uAPSD clients |
Haim Dreyfuss | e820c2d | 2014-04-06 11:19:09 +0300 | [diff] [blame] | 99 | * @IWL_UCODE_TLV_FLAGS_EBS_SUPPORT: this uCode image supports EBS. |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 100 | */ |
| 101 | enum iwl_ucode_tlv_flag { |
Avri Altman | a2d7b87 | 2013-07-09 01:42:17 +0300 | [diff] [blame] | 102 | IWL_UCODE_TLV_FLAGS_PAN = BIT(0), |
| 103 | IWL_UCODE_TLV_FLAGS_NEWSCAN = BIT(1), |
| 104 | IWL_UCODE_TLV_FLAGS_MFP = BIT(2), |
| 105 | IWL_UCODE_TLV_FLAGS_P2P = BIT(3), |
| 106 | IWL_UCODE_TLV_FLAGS_DW_BC_TABLE = BIT(4), |
David Spinadel | 35a000b | 2013-08-28 09:29:43 +0300 | [diff] [blame] | 107 | IWL_UCODE_TLV_FLAGS_SHORT_BL = BIT(7), |
Johannes Berg | 5369d6c | 2013-07-08 11:17:06 +0200 | [diff] [blame] | 108 | IWL_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS = BIT(10), |
David Spinadel | 20f1a5d | 2013-08-21 09:14:27 +0300 | [diff] [blame] | 109 | IWL_UCODE_TLV_FLAGS_NO_BASIC_SSID = BIT(12), |
Johannes Berg | f7fc598 | 2013-08-20 13:04:10 +0200 | [diff] [blame] | 110 | IWL_UCODE_TLV_FLAGS_NEW_NSOFFL_SMALL = BIT(15), |
| 111 | IWL_UCODE_TLV_FLAGS_NEW_NSOFFL_LARGE = BIT(16), |
Avri Altman | 1988902 | 2014-03-19 07:25:06 +0200 | [diff] [blame] | 112 | IWL_UCODE_TLV_FLAGS_P2P_PM = BIT(21), |
Alexander Bondar | 7303dd7f | 2014-02-03 21:57:28 +0200 | [diff] [blame] | 113 | IWL_UCODE_TLV_FLAGS_BSS_P2P_PS_DCM = BIT(22), |
Avri Altman | 1988902 | 2014-03-19 07:25:06 +0200 | [diff] [blame] | 114 | IWL_UCODE_TLV_FLAGS_BSS_P2P_PS_SCM = BIT(23), |
Matt Chen | 1504f48 | 2014-04-24 18:43:18 +0800 | [diff] [blame] | 115 | IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT = BIT(24), |
Haim Dreyfuss | e820c2d | 2014-04-06 11:19:09 +0300 | [diff] [blame] | 116 | IWL_UCODE_TLV_FLAGS_EBS_SUPPORT = BIT(25), |
Alexander Bondar | 7520967 | 2013-11-12 14:47:59 +0200 | [diff] [blame] | 117 | IWL_UCODE_TLV_FLAGS_P2P_PS_UAPSD = BIT(26), |
Eliad Peller | c87163b | 2014-01-08 10:11:11 +0200 | [diff] [blame] | 118 | IWL_UCODE_TLV_FLAGS_BCAST_FILTERING = BIT(29), |
Johannes Berg | 3e56ead | 2013-02-15 22:23:18 +0100 | [diff] [blame] | 119 | IWL_UCODE_TLV_FLAGS_GO_UAPSD = BIT(30), |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 120 | }; |
| 121 | |
Eliad Peller | 7bb426e | 2014-02-24 12:54:37 +0200 | [diff] [blame] | 122 | /** |
Eliad Peller | 1a95c8d | 2013-11-21 19:19:52 +0200 | [diff] [blame] | 123 | * enum iwl_ucode_tlv_api - ucode api |
| 124 | * @IWL_UCODE_TLV_API_WOWLAN_CONFIG_TID: wowlan config includes tid field. |
David Spinadel | 1c87bba | 2014-02-27 16:41:52 +0200 | [diff] [blame] | 125 | * @IWL_UCODE_TLV_CAPA_EXTENDED_BEACON: Support Extended beacon notification |
Emmanuel Grumbach | 0ea8d04 | 2014-04-02 09:31:36 +0300 | [diff] [blame] | 126 | * @IWL_UCODE_TLV_API_BT_COEX_SPLIT: new API for BT Coex |
Andrei Otcheretianski | bd3398e | 2013-10-22 05:01:12 +0200 | [diff] [blame] | 127 | * @IWL_UCODE_TLV_API_CSA_FLOW: ucode can do unbind-bind flow for CSA. |
Andrei Otcheretianski | 09b0ce1 | 2014-05-25 17:07:38 +0300 | [diff] [blame] | 128 | * @IWL_UCODE_TLV_API_DISABLE_STA_TX: ucode supports tx_disable bit. |
David Spinadel | fb98be5 | 2014-05-04 12:51:10 +0300 | [diff] [blame] | 129 | * @IWL_UCODE_TLV_API_LMAC_SCAN: This ucode uses LMAC unified scan API. |
Eran Harary | 161bdb7 | 2014-07-27 08:03:06 +0300 | [diff] [blame] | 130 | * @IWL_UCODE_TLV_API_SF_NO_DUMMY_NOTIF: ucode supports disabling dummy notif. |
David Spinadel | 2ce89cd | 2014-07-22 13:11:18 +0300 | [diff] [blame] | 131 | * @IWL_UCODE_TLV_API_FRAGMENTED_SCAN: This ucode supports active dwell time |
| 132 | * longer than the passive one, which is essential for fragmented scan. |
Eliad Peller | 1a95c8d | 2013-11-21 19:19:52 +0200 | [diff] [blame] | 133 | */ |
| 134 | enum iwl_ucode_tlv_api { |
| 135 | IWL_UCODE_TLV_API_WOWLAN_CONFIG_TID = BIT(0), |
David Spinadel | 1c87bba | 2014-02-27 16:41:52 +0200 | [diff] [blame] | 136 | IWL_UCODE_TLV_CAPA_EXTENDED_BEACON = BIT(1), |
Emmanuel Grumbach | 0ea8d04 | 2014-04-02 09:31:36 +0300 | [diff] [blame] | 137 | IWL_UCODE_TLV_API_BT_COEX_SPLIT = BIT(3), |
Andrei Otcheretianski | bd3398e | 2013-10-22 05:01:12 +0200 | [diff] [blame] | 138 | IWL_UCODE_TLV_API_CSA_FLOW = BIT(4), |
Andrei Otcheretianski | 09b0ce1 | 2014-05-25 17:07:38 +0300 | [diff] [blame] | 139 | IWL_UCODE_TLV_API_DISABLE_STA_TX = BIT(5), |
David Spinadel | fb98be5 | 2014-05-04 12:51:10 +0300 | [diff] [blame] | 140 | IWL_UCODE_TLV_API_LMAC_SCAN = BIT(6), |
Eran Harary | 161bdb7 | 2014-07-27 08:03:06 +0300 | [diff] [blame] | 141 | IWL_UCODE_TLV_API_SF_NO_DUMMY_NOTIF = BIT(7), |
David Spinadel | 2ce89cd | 2014-07-22 13:11:18 +0300 | [diff] [blame] | 142 | IWL_UCODE_TLV_API_FRAGMENTED_SCAN = BIT(8), |
Eliad Peller | 1a95c8d | 2013-11-21 19:19:52 +0200 | [diff] [blame] | 143 | }; |
| 144 | |
| 145 | /** |
Eliad Peller | 7bb426e | 2014-02-24 12:54:37 +0200 | [diff] [blame] | 146 | * enum iwl_ucode_tlv_capa - ucode capabilities |
| 147 | * @IWL_UCODE_TLV_CAPA_D0I3_SUPPORT: supports D0i3 |
Andrei Otcheretianski | f1daa00 | 2014-07-01 12:54:25 +0300 | [diff] [blame] | 148 | * @IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT: supports insertion of current |
| 149 | * tx power value into TPC Report action frame and Link Measurement Report |
| 150 | * action frame |
Andrei Otcheretianski | 73897bd | 2014-07-09 18:59:14 +0300 | [diff] [blame^] | 151 | * @IWL_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT: supports adding DS params |
| 152 | * element in probe requests. |
| 153 | * @IWL_UCODE_TLV_CAPA_WFA_TPC_REP_IE_SUPPORT: supports adding TPC Report IE in |
| 154 | * probe requests. |
Assaf Krauss | 226bcd4 | 2014-03-13 08:12:15 +0200 | [diff] [blame] | 155 | * @IWL_UCODE_TLV_CAPA_QUIET_PERIOD_SUPPORT: supports Quiet Period requests |
Eliad Peller | 7bb426e | 2014-02-24 12:54:37 +0200 | [diff] [blame] | 156 | */ |
| 157 | enum iwl_ucode_tlv_capa { |
Assaf Krauss | 226bcd4 | 2014-03-13 08:12:15 +0200 | [diff] [blame] | 158 | IWL_UCODE_TLV_CAPA_D0I3_SUPPORT = BIT(0), |
| 159 | IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT = BIT(8), |
Andrei Otcheretianski | 73897bd | 2014-07-09 18:59:14 +0300 | [diff] [blame^] | 160 | IWL_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT = BIT(9), |
| 161 | IWL_UCODE_TLV_CAPA_WFA_TPC_REP_IE_SUPPORT = BIT(10), |
Assaf Krauss | 226bcd4 | 2014-03-13 08:12:15 +0200 | [diff] [blame] | 162 | IWL_UCODE_TLV_CAPA_QUIET_PERIOD_SUPPORT = BIT(11), |
Eliad Peller | 7bb426e | 2014-02-24 12:54:37 +0200 | [diff] [blame] | 163 | }; |
| 164 | |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 165 | /* The default calibrate table size if not specified by firmware file */ |
| 166 | #define IWL_DEFAULT_STANDARD_PHY_CALIBRATE_TBL_SIZE 18 |
| 167 | #define IWL_MAX_STANDARD_PHY_CALIBRATE_TBL_SIZE 19 |
| 168 | #define IWL_MAX_PHY_CALIBRATE_TBL_SIZE 253 |
| 169 | |
Luciano Coelho | 66140ad | 2013-08-12 19:30:21 +0300 | [diff] [blame] | 170 | /* The default max probe length if not specified by the firmware file */ |
| 171 | #define IWL_DEFAULT_MAX_PROBE_LENGTH 200 |
| 172 | |
David Spinadel | ed8c836 | 2012-03-10 13:00:13 -0800 | [diff] [blame] | 173 | /** |
| 174 | * enum iwl_ucode_type |
| 175 | * |
| 176 | * The type of ucode. |
| 177 | * |
| 178 | * @IWL_UCODE_REGULAR: Normal runtime ucode |
| 179 | * @IWL_UCODE_INIT: Initial ucode |
| 180 | * @IWL_UCODE_WOWLAN: Wake on Wireless enabled ucode |
| 181 | */ |
| 182 | enum iwl_ucode_type { |
| 183 | IWL_UCODE_REGULAR, |
| 184 | IWL_UCODE_INIT, |
| 185 | IWL_UCODE_WOWLAN, |
| 186 | IWL_UCODE_TYPE_MAX, |
| 187 | }; |
| 188 | |
David Spinadel | 6dfa8d0 | 2012-03-10 13:00:14 -0800 | [diff] [blame] | 189 | /* |
| 190 | * enumeration of ucode section. |
Johannes Berg | 0db53d0 | 2013-05-15 13:05:25 +0200 | [diff] [blame] | 191 | * This enumeration is used directly for older firmware (before 16.0). |
| 192 | * For new firmware, there can be up to 4 sections (see below) but the |
| 193 | * first one packaged into the firmware file is the DATA section and |
| 194 | * some debugging code accesses that. |
David Spinadel | 6dfa8d0 | 2012-03-10 13:00:14 -0800 | [diff] [blame] | 195 | */ |
| 196 | enum iwl_ucode_sec { |
David Spinadel | 6dfa8d0 | 2012-03-10 13:00:14 -0800 | [diff] [blame] | 197 | IWL_UCODE_SECTION_DATA, |
Johannes Berg | 0db53d0 | 2013-05-15 13:05:25 +0200 | [diff] [blame] | 198 | IWL_UCODE_SECTION_INST, |
David Spinadel | 6dfa8d0 | 2012-03-10 13:00:14 -0800 | [diff] [blame] | 199 | }; |
| 200 | /* |
| 201 | * For 16.0 uCode and above, there is no differentiation between sections, |
| 202 | * just an offset to the HW address. |
| 203 | */ |
Eran Harary | 034846c | 2014-01-29 08:10:17 +0200 | [diff] [blame] | 204 | #define IWL_UCODE_SECTION_MAX 12 |
Eran Harary | a2978b1 | 2014-02-20 11:00:01 +0200 | [diff] [blame] | 205 | #define IWL_API_ARRAY_SIZE 1 |
| 206 | #define IWL_CAPABILITIES_ARRAY_SIZE 1 |
Eran Harary | 69e9213 | 2014-03-25 08:45:24 +0200 | [diff] [blame] | 207 | #define CPU1_CPU2_SEPARATOR_SECTION 0xFFFFCCCC |
David Spinadel | 6dfa8d0 | 2012-03-10 13:00:14 -0800 | [diff] [blame] | 208 | |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 209 | struct iwl_ucode_capabilities { |
| 210 | u32 max_probe_length; |
David Spinadel | 762533b | 2014-06-05 11:20:43 +0300 | [diff] [blame] | 211 | u32 n_scan_channels; |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 212 | u32 standard_phy_calibration_size; |
| 213 | u32 flags; |
Eran Harary | a2978b1 | 2014-02-20 11:00:01 +0200 | [diff] [blame] | 214 | u32 api[IWL_API_ARRAY_SIZE]; |
| 215 | u32 capa[IWL_CAPABILITIES_ARRAY_SIZE]; |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 216 | }; |
| 217 | |
David Spinadel | 0cedacc | 2012-03-10 13:00:12 -0800 | [diff] [blame] | 218 | /* one for each uCode image (inst/data, init/runtime/wowlan) */ |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 219 | struct fw_desc { |
Johannes Berg | 83f84d7 | 2012-09-10 11:50:18 +0200 | [diff] [blame] | 220 | const void *data; /* vmalloc'ed data */ |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 221 | u32 len; /* size in bytes */ |
David Spinadel | 0cedacc | 2012-03-10 13:00:12 -0800 | [diff] [blame] | 222 | u32 offset; /* offset in the device */ |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 223 | }; |
| 224 | |
| 225 | struct fw_img { |
David Spinadel | 6dfa8d0 | 2012-03-10 13:00:14 -0800 | [diff] [blame] | 226 | struct fw_desc sec[IWL_UCODE_SECTION_MAX]; |
Eran Harary | e2d6f4e | 2013-10-02 13:53:40 +0300 | [diff] [blame] | 227 | bool is_secure; |
| 228 | bool is_dual_cpus; |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 229 | }; |
| 230 | |
Eran Harary | 91479b6 | 2014-05-11 08:11:34 +0300 | [diff] [blame] | 231 | struct iwl_sf_region { |
| 232 | u32 addr; |
| 233 | u32 size; |
| 234 | }; |
| 235 | |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 236 | /* uCode version contains 4 values: Major/Minor/API/Serial */ |
| 237 | #define IWL_UCODE_MAJOR(ver) (((ver) & 0xFF000000) >> 24) |
| 238 | #define IWL_UCODE_MINOR(ver) (((ver) & 0x00FF0000) >> 16) |
| 239 | #define IWL_UCODE_API(ver) (((ver) & 0x0000FF00) >> 8) |
| 240 | #define IWL_UCODE_SERIAL(ver) ((ver) & 0x000000FF) |
| 241 | |
Johannes Berg | aa2b177 | 2013-01-24 14:12:07 +0100 | [diff] [blame] | 242 | /* |
| 243 | * Calibration control struct. |
| 244 | * Sent as part of the phy configuration command. |
| 245 | * @flow_trigger: bitmap for which calibrations to perform according to |
| 246 | * flow triggers. |
| 247 | * @event_trigger: bitmap for which calibrations to perform according to |
| 248 | * event triggers. |
| 249 | */ |
| 250 | struct iwl_tlv_calib_ctrl { |
| 251 | __le32 flow_trigger; |
| 252 | __le32 event_trigger; |
| 253 | } __packed; |
| 254 | |
Emmanuel Grumbach | d110cb5 | 2013-03-07 17:27:40 +0200 | [diff] [blame] | 255 | enum iwl_fw_phy_cfg { |
| 256 | FW_PHY_CFG_RADIO_TYPE_POS = 0, |
| 257 | FW_PHY_CFG_RADIO_TYPE = 0x3 << FW_PHY_CFG_RADIO_TYPE_POS, |
| 258 | FW_PHY_CFG_RADIO_STEP_POS = 2, |
| 259 | FW_PHY_CFG_RADIO_STEP = 0x3 << FW_PHY_CFG_RADIO_STEP_POS, |
| 260 | FW_PHY_CFG_RADIO_DASH_POS = 4, |
| 261 | FW_PHY_CFG_RADIO_DASH = 0x3 << FW_PHY_CFG_RADIO_DASH_POS, |
| 262 | FW_PHY_CFG_TX_CHAIN_POS = 16, |
| 263 | FW_PHY_CFG_TX_CHAIN = 0xf << FW_PHY_CFG_TX_CHAIN_POS, |
| 264 | FW_PHY_CFG_RX_CHAIN_POS = 20, |
| 265 | FW_PHY_CFG_RX_CHAIN = 0xf << FW_PHY_CFG_RX_CHAIN_POS, |
| 266 | }; |
| 267 | |
Max Stepanov | e36e543 | 2013-08-27 19:56:13 +0300 | [diff] [blame] | 268 | #define IWL_UCODE_MAX_CS 1 |
| 269 | |
| 270 | /** |
| 271 | * struct iwl_fw_cipher_scheme - a cipher scheme supported by FW. |
| 272 | * @cipher: a cipher suite selector |
| 273 | * @flags: cipher scheme flags (currently reserved for a future use) |
| 274 | * @hdr_len: a size of MPDU security header |
| 275 | * @pn_len: a size of PN |
| 276 | * @pn_off: an offset of pn from the beginning of the security header |
| 277 | * @key_idx_off: an offset of key index byte in the security header |
| 278 | * @key_idx_mask: a bit mask of key_idx bits |
| 279 | * @key_idx_shift: bit shift needed to get key_idx |
| 280 | * @mic_len: mic length in bytes |
| 281 | * @hw_cipher: a HW cipher index used in host commands |
| 282 | */ |
| 283 | struct iwl_fw_cipher_scheme { |
| 284 | __le32 cipher; |
| 285 | u8 flags; |
| 286 | u8 hdr_len; |
| 287 | u8 pn_len; |
| 288 | u8 pn_off; |
| 289 | u8 key_idx_off; |
| 290 | u8 key_idx_mask; |
| 291 | u8 key_idx_shift; |
| 292 | u8 mic_len; |
| 293 | u8 hw_cipher; |
| 294 | } __packed; |
| 295 | |
| 296 | /** |
| 297 | * struct iwl_fw_cscheme_list - a cipher scheme list |
| 298 | * @size: a number of entries |
| 299 | * @cs: cipher scheme entries |
| 300 | */ |
| 301 | struct iwl_fw_cscheme_list { |
| 302 | u8 size; |
| 303 | struct iwl_fw_cipher_scheme cs[]; |
| 304 | } __packed; |
| 305 | |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 306 | /** |
| 307 | * struct iwl_fw - variables associated with the firmware |
| 308 | * |
| 309 | * @ucode_ver: ucode version from the ucode file |
| 310 | * @fw_version: firmware version string |
David Spinadel | 6dfa8d0 | 2012-03-10 13:00:14 -0800 | [diff] [blame] | 311 | * @img: ucode image like ucode_rt, ucode_init, ucode_wowlan. |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 312 | * @ucode_capa: capabilities parsed from the ucode file. |
| 313 | * @enhance_sensitivity_table: device can do enhanced sensitivity. |
| 314 | * @init_evtlog_ptr: event log offset for init ucode. |
| 315 | * @init_evtlog_size: event log size for init ucode. |
| 316 | * @init_errlog_ptr: error log offfset for init ucode. |
| 317 | * @inst_evtlog_ptr: event log offset for runtime ucode. |
| 318 | * @inst_evtlog_size: event log size for runtime ucode. |
| 319 | * @inst_errlog_ptr: error log offfset for runtime ucode. |
Johannes Berg | 8ca151b | 2013-01-24 14:25:36 +0100 | [diff] [blame] | 320 | * @mvm_fw: indicates this is MVM firmware |
Max Stepanov | e36e543 | 2013-08-27 19:56:13 +0300 | [diff] [blame] | 321 | * @cipher_scheme: optional external cipher scheme. |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 322 | */ |
| 323 | struct iwl_fw { |
| 324 | u32 ucode_ver; |
| 325 | |
Jiri Pirko | 8113554 | 2013-01-06 02:12:51 +0000 | [diff] [blame] | 326 | char fw_version[ETHTOOL_FWVERS_LEN]; |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 327 | |
| 328 | /* ucode images */ |
David Spinadel | 6dfa8d0 | 2012-03-10 13:00:14 -0800 | [diff] [blame] | 329 | struct fw_img img[IWL_UCODE_TYPE_MAX]; |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 330 | |
| 331 | struct iwl_ucode_capabilities ucode_capa; |
| 332 | bool enhance_sensitivity_table; |
| 333 | |
| 334 | u32 init_evtlog_ptr, init_evtlog_size, init_errlog_ptr; |
| 335 | u32 inst_evtlog_ptr, inst_evtlog_size, inst_errlog_ptr; |
David Spinadel | ed8c836 | 2012-03-10 13:00:13 -0800 | [diff] [blame] | 336 | |
Johannes Berg | aa2b177 | 2013-01-24 14:12:07 +0100 | [diff] [blame] | 337 | struct iwl_tlv_calib_ctrl default_calib[IWL_UCODE_TYPE_MAX]; |
David Spinadel | ed8c836 | 2012-03-10 13:00:13 -0800 | [diff] [blame] | 338 | u32 phy_config; |
Eran Harary | 77db0a3 | 2014-02-04 14:21:38 +0200 | [diff] [blame] | 339 | u8 valid_tx_ant; |
| 340 | u8 valid_rx_ant; |
David Spinadel | 4db2c9a | 2012-03-10 13:00:15 -0800 | [diff] [blame] | 341 | |
| 342 | bool mvm_fw; |
Max Stepanov | e36e543 | 2013-08-27 19:56:13 +0300 | [diff] [blame] | 343 | |
| 344 | struct ieee80211_cipher_scheme cs[IWL_UCODE_MAX_CS]; |
Emmanuel Grumbach | 06ddbf5 | 2014-06-02 08:34:53 +0300 | [diff] [blame] | 345 | u8 human_readable[FW_VER_HUMAN_READABLE_SZ]; |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 346 | }; |
| 347 | |
Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 348 | #endif /* __iwl_fw_h__ */ |