1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
3 * Copyright (C) 2005-2014, 2018-2023 Intel Corporation
4 * Copyright (C) 2013-2015 Intel Mobile Communications GmbH
5 * Copyright (C) 2016-2017 Intel Deutschland GmbH
7 #include <linux/types.h>
8 #include <linux/slab.h>
9 #include <linux/export.h>
10 #include <linux/etherdevice.h>
11 #include <linux/pci.h>
12 #include <linux/firmware.h>
15 #include "iwl-modparams.h"
16 #include "iwl-nvm-parse.h"
21 #include "fw/api/nvm-reg.h"
22 #include "fw/api/commands.h"
23 #include "fw/api/cmdhdr.h"
25 #include "mei/iwl-mei.h"
27 /* NVM offsets (in words) definitions */
29 /* NVM HW-Section offset (in words) definitions */
33 /* NVM SW-Section offset (in words) definitions */
34 NVM_SW_SECTION = 0x1C0,
39 NVM_CHANNELS = 0x1E0 - NVM_SW_SECTION,
41 /* NVM calibration section offset (in words) definitions */
42 NVM_CALIB_SECTION = 0x2B8,
43 XTAL_CALIB = 0x316 - NVM_CALIB_SECTION,
45 /* NVM REGULATORY -Section offset (in words) definitions */
49 enum ext_nvm_offsets {
50 /* NVM HW-Section offset (in words) definitions */
51 MAC_ADDRESS_OVERRIDE_EXT_NVM = 1,
53 /* NVM SW-Section offset (in words) definitions */
54 NVM_VERSION_EXT_NVM = 0,
55 N_HW_ADDRS_FAMILY_8000 = 3,
57 /* NVM PHY_SKU-Section offset (in words) definitions */
58 RADIO_CFG_FAMILY_EXT_NVM = 0,
61 /* NVM REGULATORY -Section offset (in words) definitions */
62 NVM_CHANNELS_EXTENDED = 0,
63 NVM_LAR_OFFSET_OLD = 0x4C7,
64 NVM_LAR_OFFSET = 0x507,
65 NVM_LAR_ENABLED = 0x7,
68 /* SKU Capabilities (actual values from NVM definition) */
70 NVM_SKU_CAP_BAND_24GHZ = BIT(0),
71 NVM_SKU_CAP_BAND_52GHZ = BIT(1),
72 NVM_SKU_CAP_11N_ENABLE = BIT(2),
73 NVM_SKU_CAP_11AC_ENABLE = BIT(3),
74 NVM_SKU_CAP_MIMO_DISABLE = BIT(5),
78 * These are the channel numbers in the order that they are stored in the NVM
80 static const u16 iwl_nvm_channels[] = {
82 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
84 36, 40, 44, 48, 52, 56, 60, 64,
85 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144,
86 149, 153, 157, 161, 165
89 static const u16 iwl_ext_nvm_channels[] = {
91 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
93 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92,
94 96, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144,
95 149, 153, 157, 161, 165, 169, 173, 177, 181
98 static const u16 iwl_uhb_nvm_channels[] = {
100 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
102 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92,
103 96, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144,
104 149, 153, 157, 161, 165, 169, 173, 177, 181,
106 1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61, 65, 69,
107 73, 77, 81, 85, 89, 93, 97, 101, 105, 109, 113, 117, 121, 125, 129,
108 133, 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, 177, 181, 185,
109 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 233
112 #define IWL_NVM_NUM_CHANNELS ARRAY_SIZE(iwl_nvm_channels)
113 #define IWL_NVM_NUM_CHANNELS_EXT ARRAY_SIZE(iwl_ext_nvm_channels)
114 #define IWL_NVM_NUM_CHANNELS_UHB ARRAY_SIZE(iwl_uhb_nvm_channels)
115 #define NUM_2GHZ_CHANNELS 14
116 #define NUM_5GHZ_CHANNELS 37
117 #define FIRST_2GHZ_HT_MINUS 5
118 #define LAST_2GHZ_HT_PLUS 9
119 #define N_HW_ADDR_MASK 0xF
121 /* rate data (static) */
122 static struct ieee80211_rate iwl_cfg80211_rates[] = {
123 { .bitrate = 1 * 10, .hw_value = 0, .hw_value_short = 0, },
124 { .bitrate = 2 * 10, .hw_value = 1, .hw_value_short = 1,
125 .flags = IEEE80211_RATE_SHORT_PREAMBLE, },
126 { .bitrate = 5.5 * 10, .hw_value = 2, .hw_value_short = 2,
127 .flags = IEEE80211_RATE_SHORT_PREAMBLE, },
128 { .bitrate = 11 * 10, .hw_value = 3, .hw_value_short = 3,
129 .flags = IEEE80211_RATE_SHORT_PREAMBLE, },
130 { .bitrate = 6 * 10, .hw_value = 4, .hw_value_short = 4, },
131 { .bitrate = 9 * 10, .hw_value = 5, .hw_value_short = 5, },
132 { .bitrate = 12 * 10, .hw_value = 6, .hw_value_short = 6, },
133 { .bitrate = 18 * 10, .hw_value = 7, .hw_value_short = 7, },
134 { .bitrate = 24 * 10, .hw_value = 8, .hw_value_short = 8, },
135 { .bitrate = 36 * 10, .hw_value = 9, .hw_value_short = 9, },
136 { .bitrate = 48 * 10, .hw_value = 10, .hw_value_short = 10, },
137 { .bitrate = 54 * 10, .hw_value = 11, .hw_value_short = 11, },
139 #define RATES_24_OFFS 0
140 #define N_RATES_24 ARRAY_SIZE(iwl_cfg80211_rates)
141 #define RATES_52_OFFS 4
142 #define N_RATES_52 (N_RATES_24 - RATES_52_OFFS)
145 * enum iwl_nvm_channel_flags - channel flags in NVM
146 * @NVM_CHANNEL_VALID: channel is usable for this SKU/geo
147 * @NVM_CHANNEL_IBSS: usable as an IBSS channel
148 * @NVM_CHANNEL_ACTIVE: active scanning allowed
149 * @NVM_CHANNEL_RADAR: radar detection required
150 * @NVM_CHANNEL_INDOOR_ONLY: only indoor use is allowed
151 * @NVM_CHANNEL_GO_CONCURRENT: GO operation is allowed when connected to BSS
152 * on same channel on 2.4 or same UNII band on 5.2
153 * @NVM_CHANNEL_UNIFORM: uniform spreading required
154 * @NVM_CHANNEL_20MHZ: 20 MHz channel okay
155 * @NVM_CHANNEL_40MHZ: 40 MHz channel okay
156 * @NVM_CHANNEL_80MHZ: 80 MHz channel okay
157 * @NVM_CHANNEL_160MHZ: 160 MHz channel okay
158 * @NVM_CHANNEL_DC_HIGH: DC HIGH required/allowed (?)
159 * @NVM_CHANNEL_VLP: client support connection to UHB VLP AP
160 * @NVM_CHANNEL_AFC: client support connection to UHB AFC AP
162 enum iwl_nvm_channel_flags {
163 NVM_CHANNEL_VALID = BIT(0),
164 NVM_CHANNEL_IBSS = BIT(1),
165 NVM_CHANNEL_ACTIVE = BIT(3),
166 NVM_CHANNEL_RADAR = BIT(4),
167 NVM_CHANNEL_INDOOR_ONLY = BIT(5),
168 NVM_CHANNEL_GO_CONCURRENT = BIT(6),
169 NVM_CHANNEL_UNIFORM = BIT(7),
170 NVM_CHANNEL_20MHZ = BIT(8),
171 NVM_CHANNEL_40MHZ = BIT(9),
172 NVM_CHANNEL_80MHZ = BIT(10),
173 NVM_CHANNEL_160MHZ = BIT(11),
174 NVM_CHANNEL_DC_HIGH = BIT(12),
175 NVM_CHANNEL_VLP = BIT(13),
176 NVM_CHANNEL_AFC = BIT(14),
180 * enum iwl_reg_capa_flags_v1 - global flags applied for the whole regulatory
182 * @REG_CAPA_V1_BF_CCD_LOW_BAND: Beam-forming or Cyclic Delay Diversity in the
183 * 2.4Ghz band is allowed.
184 * @REG_CAPA_V1_BF_CCD_HIGH_BAND: Beam-forming or Cyclic Delay Diversity in the
185 * 5Ghz band is allowed.
186 * @REG_CAPA_V1_160MHZ_ALLOWED: 11ac channel with a width of 160Mhz is allowed
187 * for this regulatory domain (valid only in 5Ghz).
188 * @REG_CAPA_V1_80MHZ_ALLOWED: 11ac channel with a width of 80Mhz is allowed
189 * for this regulatory domain (valid only in 5Ghz).
190 * @REG_CAPA_V1_MCS_8_ALLOWED: 11ac with MCS 8 is allowed.
191 * @REG_CAPA_V1_MCS_9_ALLOWED: 11ac with MCS 9 is allowed.
192 * @REG_CAPA_V1_40MHZ_FORBIDDEN: 11n channel with a width of 40Mhz is forbidden
193 * for this regulatory domain (valid only in 5Ghz).
194 * @REG_CAPA_V1_DC_HIGH_ENABLED: DC HIGH allowed.
195 * @REG_CAPA_V1_11AX_DISABLED: 11ax is forbidden for this regulatory domain.
197 enum iwl_reg_capa_flags_v1 {
198 REG_CAPA_V1_BF_CCD_LOW_BAND = BIT(0),
199 REG_CAPA_V1_BF_CCD_HIGH_BAND = BIT(1),
200 REG_CAPA_V1_160MHZ_ALLOWED = BIT(2),
201 REG_CAPA_V1_80MHZ_ALLOWED = BIT(3),
202 REG_CAPA_V1_MCS_8_ALLOWED = BIT(4),
203 REG_CAPA_V1_MCS_9_ALLOWED = BIT(5),
204 REG_CAPA_V1_40MHZ_FORBIDDEN = BIT(7),
205 REG_CAPA_V1_DC_HIGH_ENABLED = BIT(9),
206 REG_CAPA_V1_11AX_DISABLED = BIT(10),
207 }; /* GEO_CHANNEL_CAPABILITIES_API_S_VER_1 */
210 * enum iwl_reg_capa_flags_v2 - global flags applied for the whole regulatory
211 * domain (version 2).
212 * @REG_CAPA_V2_STRADDLE_DISABLED: Straddle channels (144, 142, 138) are
214 * @REG_CAPA_V2_BF_CCD_LOW_BAND: Beam-forming or Cyclic Delay Diversity in the
215 * 2.4Ghz band is allowed.
216 * @REG_CAPA_V2_BF_CCD_HIGH_BAND: Beam-forming or Cyclic Delay Diversity in the
217 * 5Ghz band is allowed.
218 * @REG_CAPA_V2_160MHZ_ALLOWED: 11ac channel with a width of 160Mhz is allowed
219 * for this regulatory domain (valid only in 5Ghz).
220 * @REG_CAPA_V2_80MHZ_ALLOWED: 11ac channel with a width of 80Mhz is allowed
221 * for this regulatory domain (valid only in 5Ghz).
222 * @REG_CAPA_V2_MCS_8_ALLOWED: 11ac with MCS 8 is allowed.
223 * @REG_CAPA_V2_MCS_9_ALLOWED: 11ac with MCS 9 is allowed.
224 * @REG_CAPA_V2_WEATHER_DISABLED: Weather radar channels (120, 124, 128, 118,
225 * 126, 122) are disabled.
226 * @REG_CAPA_V2_40MHZ_ALLOWED: 11n channel with a width of 40Mhz is allowed
227 * for this regulatory domain (uvalid only in 5Ghz).
228 * @REG_CAPA_V2_11AX_DISABLED: 11ax is forbidden for this regulatory domain.
230 enum iwl_reg_capa_flags_v2 {
231 REG_CAPA_V2_STRADDLE_DISABLED = BIT(0),
232 REG_CAPA_V2_BF_CCD_LOW_BAND = BIT(1),
233 REG_CAPA_V2_BF_CCD_HIGH_BAND = BIT(2),
234 REG_CAPA_V2_160MHZ_ALLOWED = BIT(3),
235 REG_CAPA_V2_80MHZ_ALLOWED = BIT(4),
236 REG_CAPA_V2_MCS_8_ALLOWED = BIT(5),
237 REG_CAPA_V2_MCS_9_ALLOWED = BIT(6),
238 REG_CAPA_V2_WEATHER_DISABLED = BIT(7),
239 REG_CAPA_V2_40MHZ_ALLOWED = BIT(8),
240 REG_CAPA_V2_11AX_DISABLED = BIT(10),
241 }; /* GEO_CHANNEL_CAPABILITIES_API_S_VER_2 */
244 * enum iwl_reg_capa_flags_v4 - global flags applied for the whole regulatory
246 * @REG_CAPA_V4_160MHZ_ALLOWED: 11ac channel with a width of 160Mhz is allowed
247 * for this regulatory domain (valid only in 5Ghz).
248 * @REG_CAPA_V4_80MHZ_ALLOWED: 11ac channel with a width of 80Mhz is allowed
249 * for this regulatory domain (valid only in 5Ghz).
250 * @REG_CAPA_V4_MCS_12_ALLOWED: 11ac with MCS 12 is allowed.
251 * @REG_CAPA_V4_MCS_13_ALLOWED: 11ac with MCS 13 is allowed.
252 * @REG_CAPA_V4_11BE_DISABLED: 11be is forbidden for this regulatory domain.
253 * @REG_CAPA_V4_11AX_DISABLED: 11ax is forbidden for this regulatory domain.
254 * @REG_CAPA_V4_320MHZ_ALLOWED: 11be channel with a width of 320Mhz is allowed
255 * for this regulatory domain (valid only in 5GHz).
257 enum iwl_reg_capa_flags_v4 {
258 REG_CAPA_V4_160MHZ_ALLOWED = BIT(3),
259 REG_CAPA_V4_80MHZ_ALLOWED = BIT(4),
260 REG_CAPA_V4_MCS_12_ALLOWED = BIT(5),
261 REG_CAPA_V4_MCS_13_ALLOWED = BIT(6),
262 REG_CAPA_V4_11BE_DISABLED = BIT(8),
263 REG_CAPA_V4_11AX_DISABLED = BIT(13),
264 REG_CAPA_V4_320MHZ_ALLOWED = BIT(16),
265 }; /* GEO_CHANNEL_CAPABILITIES_API_S_VER_4 */
268 * API v2 for reg_capa_flags is relevant from version 6 and onwards of the
269 * MCC update command response.
271 #define REG_CAPA_V2_RESP_VER 6
273 /* API v4 for reg_capa_flags is relevant from version 8 and onwards of the
274 * MCC update command response.
276 #define REG_CAPA_V4_RESP_VER 8
279 * struct iwl_reg_capa - struct for global regulatory capabilities, Used for
280 * handling the different APIs of reg_capa_flags.
282 * @allow_40mhz: 11n channel with a width of 40Mhz is allowed
283 * for this regulatory domain.
284 * @allow_80mhz: 11ac channel with a width of 80Mhz is allowed
285 * for this regulatory domain (valid only in 5 and 6 Ghz).
286 * @allow_160mhz: 11ac channel with a width of 160Mhz is allowed
287 * for this regulatory domain (valid only in 5 and 6 Ghz).
288 * @allow_320mhz: 11be channel with a width of 320Mhz is allowed
289 * for this regulatory domain (valid only in 6 Ghz).
290 * @disable_11ax: 11ax is forbidden for this regulatory domain.
291 * @disable_11be: 11be is forbidden for this regulatory domain.
293 struct iwl_reg_capa {
302 static inline void iwl_nvm_print_channel_flags(struct device *dev, u32 level,
305 #define CHECK_AND_PRINT_I(x) \
306 ((flags & NVM_CHANNEL_##x) ? " " #x : "")
308 if (!(flags & NVM_CHANNEL_VALID)) {
309 IWL_DEBUG_DEV(dev, level, "Ch. %d: 0x%x: No traffic\n",
314 /* Note: already can print up to 101 characters, 110 is the limit! */
315 IWL_DEBUG_DEV(dev, level,
316 "Ch. %d: 0x%x:%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
318 CHECK_AND_PRINT_I(VALID),
319 CHECK_AND_PRINT_I(IBSS),
320 CHECK_AND_PRINT_I(ACTIVE),
321 CHECK_AND_PRINT_I(RADAR),
322 CHECK_AND_PRINT_I(INDOOR_ONLY),
323 CHECK_AND_PRINT_I(GO_CONCURRENT),
324 CHECK_AND_PRINT_I(UNIFORM),
325 CHECK_AND_PRINT_I(20MHZ),
326 CHECK_AND_PRINT_I(40MHZ),
327 CHECK_AND_PRINT_I(80MHZ),
328 CHECK_AND_PRINT_I(160MHZ),
329 CHECK_AND_PRINT_I(DC_HIGH),
330 CHECK_AND_PRINT_I(VLP),
331 CHECK_AND_PRINT_I(AFC));
332 #undef CHECK_AND_PRINT_I
335 static u32 iwl_get_channel_flags(u8 ch_num, int ch_idx, enum nl80211_band band,
336 u32 nvm_flags, const struct iwl_cfg *cfg)
338 u32 flags = IEEE80211_CHAN_NO_HT40;
340 if (band == NL80211_BAND_2GHZ && (nvm_flags & NVM_CHANNEL_40MHZ)) {
341 if (ch_num <= LAST_2GHZ_HT_PLUS)
342 flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
343 if (ch_num >= FIRST_2GHZ_HT_MINUS)
344 flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
345 } else if (nvm_flags & NVM_CHANNEL_40MHZ) {
346 if ((ch_idx - NUM_2GHZ_CHANNELS) % 2 == 0)
347 flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
349 flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
351 if (!(nvm_flags & NVM_CHANNEL_80MHZ))
352 flags |= IEEE80211_CHAN_NO_80MHZ;
353 if (!(nvm_flags & NVM_CHANNEL_160MHZ))
354 flags |= IEEE80211_CHAN_NO_160MHZ;
356 if (!(nvm_flags & NVM_CHANNEL_IBSS))
357 flags |= IEEE80211_CHAN_NO_IR;
359 if (!(nvm_flags & NVM_CHANNEL_ACTIVE))
360 flags |= IEEE80211_CHAN_NO_IR;
362 if (nvm_flags & NVM_CHANNEL_RADAR)
363 flags |= IEEE80211_CHAN_RADAR;
365 if (nvm_flags & NVM_CHANNEL_INDOOR_ONLY)
366 flags |= IEEE80211_CHAN_INDOOR_ONLY;
368 /* Set the GO concurrent flag only in case that NO_IR is set.
369 * Otherwise it is meaningless
371 if ((nvm_flags & NVM_CHANNEL_GO_CONCURRENT) &&
372 (flags & IEEE80211_CHAN_NO_IR))
373 flags |= IEEE80211_CHAN_IR_CONCURRENT;
375 /* Set the AP type for the UHB case. */
376 if (!(nvm_flags & NVM_CHANNEL_VLP))
377 flags |= IEEE80211_CHAN_NO_6GHZ_VLP_CLIENT;
378 if (!(nvm_flags & NVM_CHANNEL_AFC))
379 flags |= IEEE80211_CHAN_NO_6GHZ_AFC_CLIENT;
384 static enum nl80211_band iwl_nl80211_band_from_channel_idx(int ch_idx)
386 if (ch_idx >= NUM_2GHZ_CHANNELS + NUM_5GHZ_CHANNELS) {
387 return NL80211_BAND_6GHZ;
390 if (ch_idx >= NUM_2GHZ_CHANNELS)
391 return NL80211_BAND_5GHZ;
392 return NL80211_BAND_2GHZ;
395 static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
396 struct iwl_nvm_data *data,
397 const void * const nvm_ch_flags,
398 u32 sbands_flags, bool v4)
402 struct ieee80211_channel *channel;
407 if (cfg->uhb_supported) {
408 num_of_ch = IWL_NVM_NUM_CHANNELS_UHB;
409 nvm_chan = iwl_uhb_nvm_channels;
410 } else if (cfg->nvm_type == IWL_NVM_EXT) {
411 num_of_ch = IWL_NVM_NUM_CHANNELS_EXT;
412 nvm_chan = iwl_ext_nvm_channels;
414 num_of_ch = IWL_NVM_NUM_CHANNELS;
415 nvm_chan = iwl_nvm_channels;
418 for (ch_idx = 0; ch_idx < num_of_ch; ch_idx++) {
419 enum nl80211_band band =
420 iwl_nl80211_band_from_channel_idx(ch_idx);
424 __le32_to_cpup((const __le32 *)nvm_ch_flags + ch_idx);
427 __le16_to_cpup((const __le16 *)nvm_ch_flags + ch_idx);
429 if (band == NL80211_BAND_5GHZ &&
430 !data->sku_cap_band_52ghz_enable)
433 /* workaround to disable wide channels in 5GHz */
434 if ((sbands_flags & IWL_NVM_SBANDS_FLAGS_NO_WIDE_IN_5GHZ) &&
435 band == NL80211_BAND_5GHZ) {
436 ch_flags &= ~(NVM_CHANNEL_40MHZ |
441 if (ch_flags & NVM_CHANNEL_160MHZ)
442 data->vht160_supported = true;
444 if (!(sbands_flags & IWL_NVM_SBANDS_FLAGS_LAR) &&
445 !(ch_flags & NVM_CHANNEL_VALID)) {
447 * Channels might become valid later if lar is
448 * supported, hence we still want to add them to
449 * the list of supported channels to cfg80211.
451 iwl_nvm_print_channel_flags(dev, IWL_DL_EEPROM,
452 nvm_chan[ch_idx], ch_flags);
456 channel = &data->channels[n_channels];
459 channel->hw_value = nvm_chan[ch_idx];
460 channel->band = band;
461 channel->center_freq =
462 ieee80211_channel_to_frequency(
463 channel->hw_value, channel->band);
465 /* Initialize regulatory-based run-time data */
468 * Default value - highest tx power value. max_power
469 * is not used in mvm, and is used for backwards compatibility
471 channel->max_power = IWL_DEFAULT_MAX_TX_POWER;
473 /* don't put limitations in case we're using LAR */
474 if (!(sbands_flags & IWL_NVM_SBANDS_FLAGS_LAR))
475 channel->flags = iwl_get_channel_flags(nvm_chan[ch_idx],
481 /* TODO: Don't put limitations on UHB devices as we still don't
484 if (cfg->uhb_supported)
486 iwl_nvm_print_channel_flags(dev, IWL_DL_EEPROM,
487 channel->hw_value, ch_flags);
488 IWL_DEBUG_EEPROM(dev, "Ch. %d: %ddBm\n",
489 channel->hw_value, channel->max_power);
495 static void iwl_init_vht_hw_capab(struct iwl_trans *trans,
496 struct iwl_nvm_data *data,
497 struct ieee80211_sta_vht_cap *vht_cap,
498 u8 tx_chains, u8 rx_chains)
500 const struct iwl_cfg *cfg = trans->cfg;
501 int num_rx_ants = num_of_ant(rx_chains);
502 int num_tx_ants = num_of_ant(tx_chains);
504 vht_cap->vht_supported = true;
506 vht_cap->cap = IEEE80211_VHT_CAP_SHORT_GI_80 |
507 IEEE80211_VHT_CAP_RXSTBC_1 |
508 IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
509 3 << IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT |
510 IEEE80211_VHT_MAX_AMPDU_1024K <<
511 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
513 if (!trans->cfg->ht_params->stbc)
514 vht_cap->cap &= ~IEEE80211_VHT_CAP_RXSTBC_MASK;
516 if (data->vht160_supported)
517 vht_cap->cap |= IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
518 IEEE80211_VHT_CAP_SHORT_GI_160;
520 if (cfg->vht_mu_mimo_supported)
521 vht_cap->cap |= IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
523 if (cfg->ht_params->ldpc)
524 vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC;
526 if (data->sku_cap_mimo_disabled) {
531 if (trans->cfg->ht_params->stbc && num_tx_ants > 1)
532 vht_cap->cap |= IEEE80211_VHT_CAP_TXSTBC;
534 vht_cap->cap |= IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN;
536 switch (iwlwifi_mod_params.amsdu_size) {
538 if (trans->trans_cfg->mq_rx_supported)
540 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454;
542 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895;
545 if (trans->trans_cfg->mq_rx_supported)
547 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454;
549 WARN(1, "RB size of 2K is not supported by this device\n");
552 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895;
555 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991;
558 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454;
564 vht_cap->vht_mcs.rx_mcs_map =
565 cpu_to_le16(IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 |
566 IEEE80211_VHT_MCS_SUPPORT_0_9 << 2 |
567 IEEE80211_VHT_MCS_NOT_SUPPORTED << 4 |
568 IEEE80211_VHT_MCS_NOT_SUPPORTED << 6 |
569 IEEE80211_VHT_MCS_NOT_SUPPORTED << 8 |
570 IEEE80211_VHT_MCS_NOT_SUPPORTED << 10 |
571 IEEE80211_VHT_MCS_NOT_SUPPORTED << 12 |
572 IEEE80211_VHT_MCS_NOT_SUPPORTED << 14);
574 if (num_rx_ants == 1 || cfg->rx_with_siso_diversity) {
575 vht_cap->cap |= IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN;
576 /* this works because NOT_SUPPORTED == 3 */
577 vht_cap->vht_mcs.rx_mcs_map |=
578 cpu_to_le16(IEEE80211_VHT_MCS_NOT_SUPPORTED << 2);
581 vht_cap->vht_mcs.tx_mcs_map = vht_cap->vht_mcs.rx_mcs_map;
583 vht_cap->vht_mcs.tx_highest |=
584 cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE);
587 static const u8 iwl_vendor_caps[] = {
588 0xdd, /* vendor element */
590 0x00, 0x17, 0x35, /* Intel OUI */
591 0x08, /* type (Intel Capabilities) */
592 /* followed by 16 bits of capabilities */
593 #define IWL_VENDOR_CAP_IMPROVED_BF_FDBK_HE BIT(0)
594 IWL_VENDOR_CAP_IMPROVED_BF_FDBK_HE,
598 static const struct ieee80211_sband_iftype_data iwl_he_eht_capa[] = {
600 .types_mask = BIT(NL80211_IFTYPE_STATION),
605 IEEE80211_HE_MAC_CAP0_HTC_HE,
607 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US |
608 IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
610 IEEE80211_HE_MAC_CAP2_32BIT_BA_BITMAP,
612 IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
613 IEEE80211_HE_MAC_CAP3_RX_CTRL_FRAME_TO_MULTIBSS,
615 IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU |
616 IEEE80211_HE_MAC_CAP4_MULTI_TID_AGG_TX_QOS_B39,
618 IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B40 |
619 IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B41 |
620 IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
621 IEEE80211_HE_MAC_CAP5_HE_DYNAMIC_SM_PS |
622 IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX,
624 IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
625 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
626 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD,
628 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US |
629 IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ,
631 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_BPSK |
632 IEEE80211_HE_PHY_CAP3_DCM_MAX_TX_NSS_1 |
633 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_BPSK |
634 IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_1,
636 IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE |
637 IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_8 |
638 IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_8,
640 IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB |
641 IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
642 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT,
644 IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
645 IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI,
647 IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
648 IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
649 IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
650 IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU |
651 IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_242,
653 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
654 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB |
655 (IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_RESERVED <<
656 IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_POS),
658 IEEE80211_HE_PHY_CAP10_HE_MU_M1RU_MAX_LTF,
661 * Set default Tx/Rx HE MCS NSS Support field.
662 * Indicate support for up to 2 spatial streams and all
663 * MCS, without any special cases
666 .rx_mcs_80 = cpu_to_le16(0xfffa),
667 .tx_mcs_80 = cpu_to_le16(0xfffa),
668 .rx_mcs_160 = cpu_to_le16(0xfffa),
669 .tx_mcs_160 = cpu_to_le16(0xfffa),
670 .rx_mcs_80p80 = cpu_to_le16(0xffff),
671 .tx_mcs_80p80 = cpu_to_le16(0xffff),
674 * Set default PPE thresholds, with PPET16 set to 0,
677 .ppe_thres = {0x61, 0x1c, 0xc7, 0x71},
683 IEEE80211_EHT_MAC_CAP0_OM_CONTROL |
684 IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1 |
685 IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE2 |
686 IEEE80211_EHT_MAC_CAP0_SCS_TRAFFIC_DESC,
688 IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ |
689 IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI |
690 IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO |
691 IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE |
692 IEEE80211_EHT_PHY_CAP0_BEAMFORMEE_SS_80MHZ_MASK,
694 IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_80MHZ_MASK |
695 IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK,
697 IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK |
698 IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |
699 IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK |
700 IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK |
701 IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK |
702 IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK |
703 IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK,
706 IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO |
707 IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP |
708 IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI,
710 FIELD_PREP_CONST(IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK,
711 IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_16US) |
712 IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK |
713 IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP |
714 IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP,
716 IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK |
717 IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP,
719 IEEE80211_EHT_PHY_CAP8_RX_1024QAM_WIDER_BW_DL_OFDMA |
720 IEEE80211_EHT_PHY_CAP8_RX_4096QAM_WIDER_BW_DL_OFDMA,
723 /* For all MCS and bandwidth, set 2 NSS for both Tx and
724 * Rx - note we don't set the only_20mhz, but due to this
725 * being a union, it gets set correctly anyway.
727 .eht_mcs_nss_supp = {
729 .rx_tx_mcs9_max_nss = 0x22,
730 .rx_tx_mcs11_max_nss = 0x22,
731 .rx_tx_mcs13_max_nss = 0x22,
734 .rx_tx_mcs9_max_nss = 0x22,
735 .rx_tx_mcs11_max_nss = 0x22,
736 .rx_tx_mcs13_max_nss = 0x22,
739 .rx_tx_mcs9_max_nss = 0x22,
740 .rx_tx_mcs11_max_nss = 0x22,
741 .rx_tx_mcs13_max_nss = 0x22,
746 * PPE thresholds for NSS = 2, and RU index bitmap set
748 * Note: just for stating what we want, not present in
749 * the transmitted data due to not including
750 * IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT.
752 .eht_ppe_thres = {0xc1, 0x0e, 0xe0 }
756 .types_mask = BIT(NL80211_IFTYPE_AP),
761 IEEE80211_HE_MAC_CAP0_HTC_HE,
763 IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
765 IEEE80211_HE_MAC_CAP3_OMI_CONTROL,
767 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD,
769 IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ |
770 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US,
772 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_BPSK |
773 IEEE80211_HE_PHY_CAP3_DCM_MAX_TX_NSS_1 |
774 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_BPSK |
775 IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_1,
777 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT,
779 IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI,
781 IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
782 IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_242,
784 IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_RESERVED
785 << IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_POS,
788 * Set default Tx/Rx HE MCS NSS Support field.
789 * Indicate support for up to 2 spatial streams and all
790 * MCS, without any special cases
793 .rx_mcs_80 = cpu_to_le16(0xfffa),
794 .tx_mcs_80 = cpu_to_le16(0xfffa),
795 .rx_mcs_160 = cpu_to_le16(0xfffa),
796 .tx_mcs_160 = cpu_to_le16(0xfffa),
797 .rx_mcs_80p80 = cpu_to_le16(0xffff),
798 .tx_mcs_80p80 = cpu_to_le16(0xffff),
801 * Set default PPE thresholds, with PPET16 set to 0,
804 .ppe_thres = {0x61, 0x1c, 0xc7, 0x71},
810 IEEE80211_EHT_MAC_CAP0_OM_CONTROL |
811 IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1 |
812 IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE2,
814 IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ |
815 IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI,
817 FIELD_PREP_CONST(IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK,
818 IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_16US),
821 /* For all MCS and bandwidth, set 2 NSS for both Tx and
822 * Rx - note we don't set the only_20mhz, but due to this
823 * being a union, it gets set correctly anyway.
825 .eht_mcs_nss_supp = {
827 .rx_tx_mcs9_max_nss = 0x22,
828 .rx_tx_mcs11_max_nss = 0x22,
829 .rx_tx_mcs13_max_nss = 0x22,
832 .rx_tx_mcs9_max_nss = 0x22,
833 .rx_tx_mcs11_max_nss = 0x22,
834 .rx_tx_mcs13_max_nss = 0x22,
837 .rx_tx_mcs9_max_nss = 0x22,
838 .rx_tx_mcs11_max_nss = 0x22,
839 .rx_tx_mcs13_max_nss = 0x22,
844 * PPE thresholds for NSS = 2, and RU index bitmap set
846 * Note: just for stating what we want, not present in
847 * the transmitted data due to not including
848 * IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT.
850 .eht_ppe_thres = {0xc1, 0x0e, 0xe0 }
855 static void iwl_init_he_6ghz_capa(struct iwl_trans *trans,
856 struct iwl_nvm_data *data,
857 struct ieee80211_supported_band *sband,
858 u8 tx_chains, u8 rx_chains)
860 struct ieee80211_sta_ht_cap ht_cap;
861 struct ieee80211_sta_vht_cap vht_cap = {};
862 struct ieee80211_sband_iftype_data *iftype_data;
863 u16 he_6ghz_capa = 0;
867 if (sband->band != NL80211_BAND_6GHZ)
870 /* grab HT/VHT capabilities and calculate HE 6 GHz capabilities */
871 iwl_init_ht_hw_capab(trans, data, &ht_cap, NL80211_BAND_5GHZ,
872 tx_chains, rx_chains);
873 WARN_ON(!ht_cap.ht_supported);
874 iwl_init_vht_hw_capab(trans, data, &vht_cap, tx_chains, rx_chains);
875 WARN_ON(!vht_cap.vht_supported);
878 u16_encode_bits(ht_cap.ampdu_density,
879 IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START);
880 exp = u32_get_bits(vht_cap.cap,
881 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK);
883 u16_encode_bits(exp, IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
884 exp = u32_get_bits(vht_cap.cap, IEEE80211_VHT_CAP_MAX_MPDU_MASK);
886 u16_encode_bits(exp, IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN);
887 /* we don't support extended_ht_cap_info anywhere, so no RD_RESPONDER */
888 if (vht_cap.cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
889 he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
890 if (vht_cap.cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
891 he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
893 IWL_DEBUG_EEPROM(trans->dev, "he_6ghz_capa=0x%x\n", he_6ghz_capa);
895 /* we know it's writable - we set it before ourselves */
896 iftype_data = (void *)(uintptr_t)sband->iftype_data;
897 for (i = 0; i < sband->n_iftype_data; i++)
898 iftype_data[i].he_6ghz_capa.capa = cpu_to_le16(he_6ghz_capa);
902 iwl_nvm_fixup_sband_iftd(struct iwl_trans *trans,
903 struct iwl_nvm_data *data,
904 struct ieee80211_supported_band *sband,
905 struct ieee80211_sband_iftype_data *iftype_data,
906 u8 tx_chains, u8 rx_chains,
907 const struct iwl_fw *fw)
909 bool is_ap = iftype_data->types_mask & BIT(NL80211_IFTYPE_AP);
912 no_320 = (!trans->trans_cfg->integrated &&
913 trans->pcie_link_speed < PCI_EXP_LNKSTA_CLS_8_0GB) ||
914 trans->reduced_cap_sku;
916 if (!data->sku_cap_11be_enable || iwlwifi_mod_params.disable_11be)
917 iftype_data->eht_cap.has_eht = false;
919 /* Advertise an A-MPDU exponent extension based on
922 if (sband->band == NL80211_BAND_6GHZ && iftype_data->eht_cap.has_eht)
923 iftype_data->he_cap.he_cap_elem.mac_cap_info[3] |=
924 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_2;
925 else if (sband->band != NL80211_BAND_2GHZ)
926 iftype_data->he_cap.he_cap_elem.mac_cap_info[3] |=
927 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_1;
929 iftype_data->he_cap.he_cap_elem.mac_cap_info[3] |=
930 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3;
932 switch (sband->band) {
933 case NL80211_BAND_2GHZ:
934 iftype_data->he_cap.he_cap_elem.phy_cap_info[0] |=
935 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G;
936 iftype_data->eht_cap.eht_cap_elem.mac_cap_info[0] |=
937 u8_encode_bits(IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_11454,
938 IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_MASK);
940 case NL80211_BAND_6GHZ:
942 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[0] |=
943 IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ;
944 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[1] |=
945 IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_320MHZ_MASK;
948 case NL80211_BAND_5GHZ:
949 iftype_data->he_cap.he_cap_elem.phy_cap_info[0] |=
950 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
951 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
958 if ((tx_chains & rx_chains) == ANT_AB) {
959 iftype_data->he_cap.he_cap_elem.phy_cap_info[2] |=
960 IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ;
961 iftype_data->he_cap.he_cap_elem.phy_cap_info[5] |=
962 IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_2 |
963 IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_2;
965 iftype_data->he_cap.he_cap_elem.phy_cap_info[7] |=
966 IEEE80211_HE_PHY_CAP7_MAX_NC_2;
968 if (iftype_data->eht_cap.has_eht) {
970 * Set the number of sounding dimensions for each
971 * bandwidth to 1 to indicate the maximal supported
972 * value of TXVECTOR parameter NUM_STS of 2
974 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[2] |= 0x49;
977 * Set the MAX NC to 1 to indicate sounding feedback of
978 * 2 supported by the beamfomee.
980 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[4] |= 0x10;
984 struct ieee80211_he_mcs_nss_supp *he_mcs_nss_supp =
985 &iftype_data->he_cap.he_mcs_nss_supp;
987 if (iftype_data->eht_cap.has_eht) {
988 struct ieee80211_eht_mcs_nss_supp *mcs_nss =
989 &iftype_data->eht_cap.eht_mcs_nss_supp;
991 memset(mcs_nss, 0x11, sizeof(*mcs_nss));
995 /* If not 2x2, we need to indicate 1x1 in the
996 * Midamble RX Max NSTS - but not for AP mode
998 iftype_data->he_cap.he_cap_elem.phy_cap_info[1] &=
999 ~IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS;
1000 iftype_data->he_cap.he_cap_elem.phy_cap_info[2] &=
1001 ~IEEE80211_HE_PHY_CAP2_MIDAMBLE_RX_TX_MAX_NSTS;
1002 iftype_data->he_cap.he_cap_elem.phy_cap_info[7] |=
1003 IEEE80211_HE_PHY_CAP7_MAX_NC_1;
1006 he_mcs_nss_supp->rx_mcs_80 |=
1007 cpu_to_le16(IEEE80211_HE_MCS_NOT_SUPPORTED << 2);
1008 he_mcs_nss_supp->tx_mcs_80 |=
1009 cpu_to_le16(IEEE80211_HE_MCS_NOT_SUPPORTED << 2);
1010 he_mcs_nss_supp->rx_mcs_160 |=
1011 cpu_to_le16(IEEE80211_HE_MCS_NOT_SUPPORTED << 2);
1012 he_mcs_nss_supp->tx_mcs_160 |=
1013 cpu_to_le16(IEEE80211_HE_MCS_NOT_SUPPORTED << 2);
1014 he_mcs_nss_supp->rx_mcs_80p80 |=
1015 cpu_to_le16(IEEE80211_HE_MCS_NOT_SUPPORTED << 2);
1016 he_mcs_nss_supp->tx_mcs_80p80 |=
1017 cpu_to_le16(IEEE80211_HE_MCS_NOT_SUPPORTED << 2);
1020 if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210 && !is_ap)
1021 iftype_data->he_cap.he_cap_elem.phy_cap_info[2] |=
1022 IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO;
1024 switch (CSR_HW_RFID_TYPE(trans->hw_rf_id)) {
1025 case IWL_CFG_RF_TYPE_GF:
1026 case IWL_CFG_RF_TYPE_MR:
1027 case IWL_CFG_RF_TYPE_MS:
1028 case IWL_CFG_RF_TYPE_FM:
1029 case IWL_CFG_RF_TYPE_WH:
1030 iftype_data->he_cap.he_cap_elem.phy_cap_info[9] |=
1031 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
1033 iftype_data->he_cap.he_cap_elem.phy_cap_info[9] |=
1034 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
1038 if (CSR_HW_REV_TYPE(trans->hw_rev) == IWL_CFG_MAC_TYPE_GL &&
1039 iftype_data->eht_cap.has_eht) {
1040 iftype_data->eht_cap.eht_cap_elem.mac_cap_info[0] &=
1041 ~(IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1 |
1042 IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE2);
1043 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[3] &=
1044 ~(IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO |
1045 IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK |
1046 IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |
1047 IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK |
1048 IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK |
1049 IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK |
1050 IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK);
1051 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[4] &=
1052 ~(IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO |
1053 IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP);
1054 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[5] &=
1055 ~IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK;
1056 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[6] &=
1057 ~(IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK |
1058 IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP);
1059 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[5] |=
1060 IEEE80211_EHT_PHY_CAP5_SUPP_EXTRA_EHT_LTF;
1063 if (fw_has_capa(&fw->ucode_capa, IWL_UCODE_TLV_CAPA_BROADCAST_TWT))
1064 iftype_data->he_cap.he_cap_elem.mac_cap_info[2] |=
1065 IEEE80211_HE_MAC_CAP2_BCAST_TWT;
1067 if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_22000 &&
1069 iftype_data->vendor_elems.data = iwl_vendor_caps;
1070 iftype_data->vendor_elems.len = ARRAY_SIZE(iwl_vendor_caps);
1073 if (!trans->cfg->ht_params->stbc) {
1074 iftype_data->he_cap.he_cap_elem.phy_cap_info[2] &=
1075 ~IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ;
1076 iftype_data->he_cap.he_cap_elem.phy_cap_info[7] &=
1077 ~IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
1080 if (trans->step_urm) {
1081 iftype_data->eht_cap.eht_mcs_nss_supp.bw._320.rx_tx_mcs11_max_nss = 0;
1082 iftype_data->eht_cap.eht_mcs_nss_supp.bw._320.rx_tx_mcs13_max_nss = 0;
1086 iftype_data->he_cap.he_cap_elem.phy_cap_info[0] &=
1087 ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
1089 if (trans->reduced_cap_sku) {
1090 memset(&iftype_data->eht_cap.eht_mcs_nss_supp.bw._320, 0,
1091 sizeof(iftype_data->eht_cap.eht_mcs_nss_supp.bw._320));
1092 iftype_data->eht_cap.eht_mcs_nss_supp.bw._80.rx_tx_mcs13_max_nss = 0;
1093 iftype_data->eht_cap.eht_mcs_nss_supp.bw._160.rx_tx_mcs13_max_nss = 0;
1094 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[8] &=
1095 ~IEEE80211_EHT_PHY_CAP8_RX_4096QAM_WIDER_BW_DL_OFDMA;
1096 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[2] &=
1097 ~IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_320MHZ_MASK;
1101 static void iwl_init_he_hw_capab(struct iwl_trans *trans,
1102 struct iwl_nvm_data *data,
1103 struct ieee80211_supported_band *sband,
1104 u8 tx_chains, u8 rx_chains,
1105 const struct iwl_fw *fw)
1107 struct ieee80211_sband_iftype_data *iftype_data;
1110 BUILD_BUG_ON(sizeof(data->iftd.low) != sizeof(iwl_he_eht_capa));
1111 BUILD_BUG_ON(sizeof(data->iftd.high) != sizeof(iwl_he_eht_capa));
1112 BUILD_BUG_ON(sizeof(data->iftd.uhb) != sizeof(iwl_he_eht_capa));
1114 switch (sband->band) {
1115 case NL80211_BAND_2GHZ:
1116 iftype_data = data->iftd.low;
1118 case NL80211_BAND_5GHZ:
1119 iftype_data = data->iftd.high;
1121 case NL80211_BAND_6GHZ:
1122 iftype_data = data->iftd.uhb;
1129 memcpy(iftype_data, iwl_he_eht_capa, sizeof(iwl_he_eht_capa));
1131 _ieee80211_set_sband_iftype_data(sband, iftype_data,
1132 ARRAY_SIZE(iwl_he_eht_capa));
1134 for (i = 0; i < sband->n_iftype_data; i++)
1135 iwl_nvm_fixup_sband_iftd(trans, data, sband, &iftype_data[i],
1136 tx_chains, rx_chains, fw);
1138 iwl_init_he_6ghz_capa(trans, data, sband, tx_chains, rx_chains);
1141 void iwl_reinit_cab(struct iwl_trans *trans, struct iwl_nvm_data *data,
1142 u8 tx_chains, u8 rx_chains, const struct iwl_fw *fw)
1144 struct ieee80211_supported_band *sband;
1146 sband = &data->bands[NL80211_BAND_2GHZ];
1147 iwl_init_ht_hw_capab(trans, data, &sband->ht_cap, NL80211_BAND_2GHZ,
1148 tx_chains, rx_chains);
1150 if (data->sku_cap_11ax_enable && !iwlwifi_mod_params.disable_11ax)
1151 iwl_init_he_hw_capab(trans, data, sband, tx_chains, rx_chains,
1154 sband = &data->bands[NL80211_BAND_5GHZ];
1155 iwl_init_ht_hw_capab(trans, data, &sband->ht_cap, NL80211_BAND_5GHZ,
1156 tx_chains, rx_chains);
1157 if (data->sku_cap_11ac_enable && !iwlwifi_mod_params.disable_11ac)
1158 iwl_init_vht_hw_capab(trans, data, &sband->vht_cap,
1159 tx_chains, rx_chains);
1161 if (data->sku_cap_11ax_enable && !iwlwifi_mod_params.disable_11ax)
1162 iwl_init_he_hw_capab(trans, data, sband, tx_chains, rx_chains,
1165 sband = &data->bands[NL80211_BAND_6GHZ];
1166 if (data->sku_cap_11ax_enable && !iwlwifi_mod_params.disable_11ax)
1167 iwl_init_he_hw_capab(trans, data, sband, tx_chains, rx_chains,
1170 IWL_EXPORT_SYMBOL(iwl_reinit_cab);
1172 static void iwl_init_sbands(struct iwl_trans *trans,
1173 struct iwl_nvm_data *data,
1174 const void *nvm_ch_flags, u8 tx_chains,
1175 u8 rx_chains, u32 sbands_flags, bool v4,
1176 const struct iwl_fw *fw)
1178 struct device *dev = trans->dev;
1179 const struct iwl_cfg *cfg = trans->cfg;
1182 struct ieee80211_supported_band *sband;
1184 n_channels = iwl_init_channel_map(dev, cfg, data, nvm_ch_flags,
1186 sband = &data->bands[NL80211_BAND_2GHZ];
1187 sband->band = NL80211_BAND_2GHZ;
1188 sband->bitrates = &iwl_cfg80211_rates[RATES_24_OFFS];
1189 sband->n_bitrates = N_RATES_24;
1190 n_used += iwl_init_sband_channels(data, sband, n_channels,
1192 iwl_init_ht_hw_capab(trans, data, &sband->ht_cap, NL80211_BAND_2GHZ,
1193 tx_chains, rx_chains);
1195 if (data->sku_cap_11ax_enable && !iwlwifi_mod_params.disable_11ax)
1196 iwl_init_he_hw_capab(trans, data, sband, tx_chains, rx_chains,
1199 sband = &data->bands[NL80211_BAND_5GHZ];
1200 sband->band = NL80211_BAND_5GHZ;
1201 sband->bitrates = &iwl_cfg80211_rates[RATES_52_OFFS];
1202 sband->n_bitrates = N_RATES_52;
1203 n_used += iwl_init_sband_channels(data, sband, n_channels,
1205 iwl_init_ht_hw_capab(trans, data, &sband->ht_cap, NL80211_BAND_5GHZ,
1206 tx_chains, rx_chains);
1207 if (data->sku_cap_11ac_enable && !iwlwifi_mod_params.disable_11ac)
1208 iwl_init_vht_hw_capab(trans, data, &sband->vht_cap,
1209 tx_chains, rx_chains);
1211 if (data->sku_cap_11ax_enable && !iwlwifi_mod_params.disable_11ax)
1212 iwl_init_he_hw_capab(trans, data, sband, tx_chains, rx_chains,
1216 sband = &data->bands[NL80211_BAND_6GHZ];
1217 sband->band = NL80211_BAND_6GHZ;
1218 /* use the same rates as 5GHz band */
1219 sband->bitrates = &iwl_cfg80211_rates[RATES_52_OFFS];
1220 sband->n_bitrates = N_RATES_52;
1221 n_used += iwl_init_sband_channels(data, sband, n_channels,
1224 if (data->sku_cap_11ax_enable && !iwlwifi_mod_params.disable_11ax)
1225 iwl_init_he_hw_capab(trans, data, sband, tx_chains, rx_chains,
1228 sband->n_channels = 0;
1229 if (n_channels != n_used)
1230 IWL_ERR_DEV(dev, "NVM: used only %d of %d channels\n",
1231 n_used, n_channels);
1234 static int iwl_get_sku(const struct iwl_cfg *cfg, const __le16 *nvm_sw,
1235 const __le16 *phy_sku)
1237 if (cfg->nvm_type != IWL_NVM_EXT)
1238 return le16_to_cpup(nvm_sw + SKU);
1240 return le32_to_cpup((const __le32 *)(phy_sku + SKU_FAMILY_8000));
1243 static int iwl_get_nvm_version(const struct iwl_cfg *cfg, const __le16 *nvm_sw)
1245 if (cfg->nvm_type != IWL_NVM_EXT)
1246 return le16_to_cpup(nvm_sw + NVM_VERSION);
1248 return le32_to_cpup((const __le32 *)(nvm_sw +
1249 NVM_VERSION_EXT_NVM));
1252 static int iwl_get_radio_cfg(const struct iwl_cfg *cfg, const __le16 *nvm_sw,
1253 const __le16 *phy_sku)
1255 if (cfg->nvm_type != IWL_NVM_EXT)
1256 return le16_to_cpup(nvm_sw + RADIO_CFG);
1258 return le32_to_cpup((const __le32 *)(phy_sku + RADIO_CFG_FAMILY_EXT_NVM));
1262 static int iwl_get_n_hw_addrs(const struct iwl_cfg *cfg, const __le16 *nvm_sw)
1266 if (cfg->nvm_type != IWL_NVM_EXT)
1267 return le16_to_cpup(nvm_sw + N_HW_ADDRS);
1269 n_hw_addr = le32_to_cpup((const __le32 *)(nvm_sw + N_HW_ADDRS_FAMILY_8000));
1271 return n_hw_addr & N_HW_ADDR_MASK;
1274 static void iwl_set_radio_cfg(const struct iwl_cfg *cfg,
1275 struct iwl_nvm_data *data,
1278 if (cfg->nvm_type != IWL_NVM_EXT) {
1279 data->radio_cfg_type = NVM_RF_CFG_TYPE_MSK(radio_cfg);
1280 data->radio_cfg_step = NVM_RF_CFG_STEP_MSK(radio_cfg);
1281 data->radio_cfg_dash = NVM_RF_CFG_DASH_MSK(radio_cfg);
1282 data->radio_cfg_pnum = NVM_RF_CFG_PNUM_MSK(radio_cfg);
1286 /* set the radio configuration for family 8000 */
1287 data->radio_cfg_type = EXT_NVM_RF_CFG_TYPE_MSK(radio_cfg);
1288 data->radio_cfg_step = EXT_NVM_RF_CFG_STEP_MSK(radio_cfg);
1289 data->radio_cfg_dash = EXT_NVM_RF_CFG_DASH_MSK(radio_cfg);
1290 data->radio_cfg_pnum = EXT_NVM_RF_CFG_FLAVOR_MSK(radio_cfg);
1291 data->valid_tx_ant = EXT_NVM_RF_CFG_TX_ANT_MSK(radio_cfg);
1292 data->valid_rx_ant = EXT_NVM_RF_CFG_RX_ANT_MSK(radio_cfg);
1295 static void iwl_flip_hw_address(__le32 mac_addr0, __le32 mac_addr1, u8 *dest)
1299 hw_addr = (const u8 *)&mac_addr0;
1300 dest[0] = hw_addr[3];
1301 dest[1] = hw_addr[2];
1302 dest[2] = hw_addr[1];
1303 dest[3] = hw_addr[0];
1305 hw_addr = (const u8 *)&mac_addr1;
1306 dest[4] = hw_addr[1];
1307 dest[5] = hw_addr[0];
1310 static void iwl_set_hw_address_from_csr(struct iwl_trans *trans,
1311 struct iwl_nvm_data *data)
1313 __le32 mac_addr0 = cpu_to_le32(iwl_read32(trans,
1314 CSR_MAC_ADDR0_STRAP(trans)));
1315 __le32 mac_addr1 = cpu_to_le32(iwl_read32(trans,
1316 CSR_MAC_ADDR1_STRAP(trans)));
1318 iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr);
1320 * If the OEM fused a valid address, use it instead of the one in the
1323 if (is_valid_ether_addr(data->hw_addr))
1326 mac_addr0 = cpu_to_le32(iwl_read32(trans, CSR_MAC_ADDR0_OTP(trans)));
1327 mac_addr1 = cpu_to_le32(iwl_read32(trans, CSR_MAC_ADDR1_OTP(trans)));
1329 iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr);
1332 static void iwl_set_hw_address_family_8000(struct iwl_trans *trans,
1333 const struct iwl_cfg *cfg,
1334 struct iwl_nvm_data *data,
1335 const __le16 *mac_override,
1336 const __be16 *nvm_hw)
1341 static const u8 reserved_mac[] = {
1342 0x02, 0xcc, 0xaa, 0xff, 0xee, 0x00
1345 hw_addr = (const u8 *)(mac_override +
1346 MAC_ADDRESS_OVERRIDE_EXT_NVM);
1349 * Store the MAC address from MAO section.
1350 * No byte swapping is required in MAO section
1352 memcpy(data->hw_addr, hw_addr, ETH_ALEN);
1355 * Force the use of the OTP MAC address in case of reserved MAC
1356 * address in the NVM, or if address is given but invalid.
1358 if (is_valid_ether_addr(data->hw_addr) &&
1359 memcmp(reserved_mac, hw_addr, ETH_ALEN) != 0)
1363 "mac address from nvm override section is not valid\n");
1367 /* read the mac address from WFMP registers */
1368 __le32 mac_addr0 = cpu_to_le32(iwl_trans_read_prph(trans,
1370 __le32 mac_addr1 = cpu_to_le32(iwl_trans_read_prph(trans,
1373 iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr);
1378 IWL_ERR(trans, "mac address is not found\n");
1381 static int iwl_set_hw_address(struct iwl_trans *trans,
1382 const struct iwl_cfg *cfg,
1383 struct iwl_nvm_data *data, const __be16 *nvm_hw,
1384 const __le16 *mac_override)
1386 if (cfg->mac_addr_from_csr) {
1387 iwl_set_hw_address_from_csr(trans, data);
1388 } else if (cfg->nvm_type != IWL_NVM_EXT) {
1389 const u8 *hw_addr = (const u8 *)(nvm_hw + HW_ADDR);
1391 /* The byte order is little endian 16 bit, meaning 214365 */
1392 data->hw_addr[0] = hw_addr[1];
1393 data->hw_addr[1] = hw_addr[0];
1394 data->hw_addr[2] = hw_addr[3];
1395 data->hw_addr[3] = hw_addr[2];
1396 data->hw_addr[4] = hw_addr[5];
1397 data->hw_addr[5] = hw_addr[4];
1399 iwl_set_hw_address_family_8000(trans, cfg, data,
1400 mac_override, nvm_hw);
1403 if (!is_valid_ether_addr(data->hw_addr)) {
1404 IWL_ERR(trans, "no valid mac address was found\n");
1408 if (!trans->csme_own)
1409 IWL_INFO(trans, "base HW address: %pM, OTP minor version: 0x%x\n",
1410 data->hw_addr, iwl_read_prph(trans, REG_OTP_MINOR));
1416 iwl_nvm_no_wide_in_5ghz(struct iwl_trans *trans, const struct iwl_cfg *cfg,
1417 const __be16 *nvm_hw)
1420 * Workaround a bug in Indonesia SKUs where the regulatory in
1421 * some 7000-family OTPs erroneously allow wide channels in
1422 * 5GHz. To check for Indonesia, we take the SKU value from
1423 * bits 1-4 in the subsystem ID and check if it is either 5 or
1424 * 9. In those cases, we need to force-disable wide channels
1425 * in 5GHz otherwise the FW will throw a sysassert when we try
1428 if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_7000) {
1430 * Unlike the other sections in the NVM, the hw
1431 * section uses big-endian.
1433 u16 subsystem_id = be16_to_cpup(nvm_hw + SUBSYSTEM_ID);
1434 u8 sku = (subsystem_id & 0x1e) >> 1;
1436 if (sku == 5 || sku == 9) {
1437 IWL_DEBUG_EEPROM(trans->dev,
1438 "disabling wide channels in 5GHz (0x%0x %d)\n",
1447 struct iwl_nvm_data *
1448 iwl_parse_mei_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg,
1449 const struct iwl_mei_nvm *mei_nvm,
1450 const struct iwl_fw *fw, u8 tx_ant, u8 rx_ant)
1452 struct iwl_nvm_data *data;
1453 u32 sbands_flags = 0;
1454 u8 rx_chains = fw->valid_rx_ant;
1455 u8 tx_chains = fw->valid_rx_ant;
1457 if (cfg->uhb_supported)
1458 data = kzalloc(struct_size(data, channels,
1459 IWL_NVM_NUM_CHANNELS_UHB),
1462 data = kzalloc(struct_size(data, channels,
1463 IWL_NVM_NUM_CHANNELS_EXT),
1468 BUILD_BUG_ON(ARRAY_SIZE(mei_nvm->channels) !=
1469 IWL_NVM_NUM_CHANNELS_UHB);
1470 data->nvm_version = mei_nvm->nvm_version;
1472 iwl_set_radio_cfg(cfg, data, mei_nvm->radio_cfg);
1473 if (data->valid_tx_ant)
1474 tx_chains &= data->valid_tx_ant;
1475 if (data->valid_rx_ant)
1476 rx_chains &= data->valid_rx_ant;
1478 tx_chains &= tx_ant;
1480 rx_chains &= rx_ant;
1482 data->sku_cap_mimo_disabled = false;
1483 data->sku_cap_band_24ghz_enable = true;
1484 data->sku_cap_band_52ghz_enable = true;
1485 data->sku_cap_11n_enable =
1486 !(iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_ALL);
1487 data->sku_cap_11ac_enable = true;
1488 data->sku_cap_11ax_enable =
1489 mei_nvm->caps & MEI_NVM_CAPS_11AX_SUPPORT;
1491 data->lar_enabled = mei_nvm->caps & MEI_NVM_CAPS_LARI_SUPPORT;
1493 data->n_hw_addrs = mei_nvm->n_hw_addrs;
1494 /* If no valid mac address was found - bail out */
1495 if (iwl_set_hw_address(trans, cfg, data, NULL, NULL)) {
1500 if (data->lar_enabled &&
1501 fw_has_capa(&fw->ucode_capa, IWL_UCODE_TLV_CAPA_LAR_SUPPORT))
1502 sbands_flags |= IWL_NVM_SBANDS_FLAGS_LAR;
1504 iwl_init_sbands(trans, data, mei_nvm->channels, tx_chains, rx_chains,
1505 sbands_flags, true, fw);
1509 IWL_EXPORT_SYMBOL(iwl_parse_mei_nvm_data);
1511 struct iwl_nvm_data *
1512 iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg,
1513 const struct iwl_fw *fw,
1514 const __be16 *nvm_hw, const __le16 *nvm_sw,
1515 const __le16 *nvm_calib, const __le16 *regulatory,
1516 const __le16 *mac_override, const __le16 *phy_sku,
1517 u8 tx_chains, u8 rx_chains)
1519 struct iwl_nvm_data *data;
1522 u32 sbands_flags = 0;
1524 const __le16 *ch_section;
1526 if (cfg->uhb_supported)
1527 data = kzalloc(struct_size(data, channels,
1528 IWL_NVM_NUM_CHANNELS_UHB),
1530 else if (cfg->nvm_type != IWL_NVM_EXT)
1531 data = kzalloc(struct_size(data, channels,
1532 IWL_NVM_NUM_CHANNELS),
1535 data = kzalloc(struct_size(data, channels,
1536 IWL_NVM_NUM_CHANNELS_EXT),
1541 data->nvm_version = iwl_get_nvm_version(cfg, nvm_sw);
1543 radio_cfg = iwl_get_radio_cfg(cfg, nvm_sw, phy_sku);
1544 iwl_set_radio_cfg(cfg, data, radio_cfg);
1545 if (data->valid_tx_ant)
1546 tx_chains &= data->valid_tx_ant;
1547 if (data->valid_rx_ant)
1548 rx_chains &= data->valid_rx_ant;
1550 sku = iwl_get_sku(cfg, nvm_sw, phy_sku);
1551 data->sku_cap_band_24ghz_enable = sku & NVM_SKU_CAP_BAND_24GHZ;
1552 data->sku_cap_band_52ghz_enable = sku & NVM_SKU_CAP_BAND_52GHZ;
1553 data->sku_cap_11n_enable = sku & NVM_SKU_CAP_11N_ENABLE;
1554 if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_ALL)
1555 data->sku_cap_11n_enable = false;
1556 data->sku_cap_11ac_enable = data->sku_cap_11n_enable &&
1557 (sku & NVM_SKU_CAP_11AC_ENABLE);
1558 data->sku_cap_mimo_disabled = sku & NVM_SKU_CAP_MIMO_DISABLE;
1560 data->n_hw_addrs = iwl_get_n_hw_addrs(cfg, nvm_sw);
1562 if (cfg->nvm_type != IWL_NVM_EXT) {
1563 /* Checking for required sections */
1566 "Can't parse empty Calib NVM sections\n");
1571 ch_section = cfg->nvm_type == IWL_NVM_SDP ?
1572 ®ulatory[NVM_CHANNELS_SDP] :
1573 &nvm_sw[NVM_CHANNELS];
1575 /* in family 8000 Xtal calibration values moved to OTP */
1576 data->xtal_calib[0] = *(nvm_calib + XTAL_CALIB);
1577 data->xtal_calib[1] = *(nvm_calib + XTAL_CALIB + 1);
1580 u16 lar_offset = data->nvm_version < 0xE39 ?
1581 NVM_LAR_OFFSET_OLD :
1584 lar_config = le16_to_cpup(regulatory + lar_offset);
1585 data->lar_enabled = !!(lar_config &
1587 lar_enabled = data->lar_enabled;
1588 ch_section = ®ulatory[NVM_CHANNELS_EXTENDED];
1591 /* If no valid mac address was found - bail out */
1592 if (iwl_set_hw_address(trans, cfg, data, nvm_hw, mac_override)) {
1598 fw_has_capa(&fw->ucode_capa, IWL_UCODE_TLV_CAPA_LAR_SUPPORT))
1599 sbands_flags |= IWL_NVM_SBANDS_FLAGS_LAR;
1601 if (iwl_nvm_no_wide_in_5ghz(trans, cfg, nvm_hw))
1602 sbands_flags |= IWL_NVM_SBANDS_FLAGS_NO_WIDE_IN_5GHZ;
1604 iwl_init_sbands(trans, data, ch_section, tx_chains, rx_chains,
1605 sbands_flags, false, fw);
1606 data->calib_version = 255;
1610 IWL_EXPORT_SYMBOL(iwl_parse_nvm_data);
1612 static u32 iwl_nvm_get_regdom_bw_flags(const u16 *nvm_chan,
1613 int ch_idx, u16 nvm_flags,
1614 struct iwl_reg_capa reg_capa,
1615 const struct iwl_cfg *cfg,
1618 u32 flags = NL80211_RRF_NO_HT40;
1620 if (ch_idx < NUM_2GHZ_CHANNELS &&
1621 (nvm_flags & NVM_CHANNEL_40MHZ)) {
1622 if (nvm_chan[ch_idx] <= LAST_2GHZ_HT_PLUS)
1623 flags &= ~NL80211_RRF_NO_HT40PLUS;
1624 if (nvm_chan[ch_idx] >= FIRST_2GHZ_HT_MINUS)
1625 flags &= ~NL80211_RRF_NO_HT40MINUS;
1626 } else if (nvm_flags & NVM_CHANNEL_40MHZ) {
1627 if ((ch_idx - NUM_2GHZ_CHANNELS) % 2 == 0)
1628 flags &= ~NL80211_RRF_NO_HT40PLUS;
1630 flags &= ~NL80211_RRF_NO_HT40MINUS;
1633 if (!(nvm_flags & NVM_CHANNEL_80MHZ))
1634 flags |= NL80211_RRF_NO_80MHZ;
1635 if (!(nvm_flags & NVM_CHANNEL_160MHZ))
1636 flags |= NL80211_RRF_NO_160MHZ;
1638 if (!(nvm_flags & NVM_CHANNEL_ACTIVE))
1639 flags |= NL80211_RRF_NO_IR;
1641 if (nvm_flags & NVM_CHANNEL_RADAR)
1642 flags |= NL80211_RRF_DFS;
1644 if (nvm_flags & NVM_CHANNEL_INDOOR_ONLY)
1645 flags |= NL80211_RRF_NO_OUTDOOR;
1647 /* Set the GO concurrent flag only in case that NO_IR is set.
1648 * Otherwise it is meaningless
1650 if ((nvm_flags & NVM_CHANNEL_GO_CONCURRENT)) {
1651 if (flags & NL80211_RRF_NO_IR)
1652 flags |= NL80211_RRF_GO_CONCURRENT;
1653 if (flags & NL80211_RRF_DFS) {
1654 flags |= NL80211_RRF_DFS_CONCURRENT;
1655 /* Our device doesn't set active bit for DFS channels
1656 * however, once marked as DFS no-ir is not needed.
1658 flags &= ~NL80211_RRF_NO_IR;
1662 /* Set the AP type for the UHB case. */
1664 if (!(nvm_flags & NVM_CHANNEL_VLP))
1665 flags |= NL80211_RRF_NO_6GHZ_VLP_CLIENT;
1667 if (!(nvm_flags & NVM_CHANNEL_AFC))
1668 flags |= NL80211_RRF_NO_6GHZ_AFC_CLIENT;
1672 * reg_capa is per regulatory domain so apply it for every channel
1674 if (ch_idx >= NUM_2GHZ_CHANNELS) {
1675 if (!reg_capa.allow_40mhz)
1676 flags |= NL80211_RRF_NO_HT40;
1678 if (!reg_capa.allow_80mhz)
1679 flags |= NL80211_RRF_NO_80MHZ;
1681 if (!reg_capa.allow_160mhz)
1682 flags |= NL80211_RRF_NO_160MHZ;
1684 if (!reg_capa.allow_320mhz)
1685 flags |= NL80211_RRF_NO_320MHZ;
1688 if (reg_capa.disable_11ax)
1689 flags |= NL80211_RRF_NO_HE;
1691 if (reg_capa.disable_11be)
1692 flags |= NL80211_RRF_NO_EHT;
1697 static struct iwl_reg_capa iwl_get_reg_capa(u32 flags, u8 resp_ver)
1699 struct iwl_reg_capa reg_capa = {};
1701 if (resp_ver >= REG_CAPA_V4_RESP_VER) {
1702 reg_capa.allow_40mhz = true;
1703 reg_capa.allow_80mhz = flags & REG_CAPA_V4_80MHZ_ALLOWED;
1704 reg_capa.allow_160mhz = flags & REG_CAPA_V4_160MHZ_ALLOWED;
1705 reg_capa.allow_320mhz = flags & REG_CAPA_V4_320MHZ_ALLOWED;
1706 reg_capa.disable_11ax = flags & REG_CAPA_V4_11AX_DISABLED;
1707 reg_capa.disable_11be = flags & REG_CAPA_V4_11BE_DISABLED;
1708 } else if (resp_ver >= REG_CAPA_V2_RESP_VER) {
1709 reg_capa.allow_40mhz = flags & REG_CAPA_V2_40MHZ_ALLOWED;
1710 reg_capa.allow_80mhz = flags & REG_CAPA_V2_80MHZ_ALLOWED;
1711 reg_capa.allow_160mhz = flags & REG_CAPA_V2_160MHZ_ALLOWED;
1712 reg_capa.disable_11ax = flags & REG_CAPA_V2_11AX_DISABLED;
1714 reg_capa.allow_40mhz = !(flags & REG_CAPA_V1_40MHZ_FORBIDDEN);
1715 reg_capa.allow_80mhz = flags & REG_CAPA_V1_80MHZ_ALLOWED;
1716 reg_capa.allow_160mhz = flags & REG_CAPA_V1_160MHZ_ALLOWED;
1717 reg_capa.disable_11ax = flags & REG_CAPA_V1_11AX_DISABLED;
1722 struct ieee80211_regdomain *
1723 iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg,
1724 int num_of_ch, __le32 *channels, u16 fw_mcc,
1725 u16 geo_info, u32 cap, u8 resp_ver, bool uats_enabled)
1729 u32 reg_rule_flags, prev_reg_rule_flags = 0;
1730 const u16 *nvm_chan;
1731 struct ieee80211_regdomain *regd, *copy_rd;
1732 struct ieee80211_reg_rule *rule;
1733 enum nl80211_band band;
1734 int center_freq, prev_center_freq = 0;
1735 int valid_rules = 0;
1738 struct iwl_reg_capa reg_capa;
1740 if (cfg->uhb_supported) {
1741 max_num_ch = IWL_NVM_NUM_CHANNELS_UHB;
1742 nvm_chan = iwl_uhb_nvm_channels;
1743 } else if (cfg->nvm_type == IWL_NVM_EXT) {
1744 max_num_ch = IWL_NVM_NUM_CHANNELS_EXT;
1745 nvm_chan = iwl_ext_nvm_channels;
1747 max_num_ch = IWL_NVM_NUM_CHANNELS;
1748 nvm_chan = iwl_nvm_channels;
1751 if (num_of_ch > max_num_ch) {
1752 IWL_DEBUG_DEV(dev, IWL_DL_LAR,
1753 "Num of channels (%d) is greater than expected. Truncating to %d\n",
1754 num_of_ch, max_num_ch);
1755 num_of_ch = max_num_ch;
1758 if (WARN_ON_ONCE(num_of_ch > NL80211_MAX_SUPP_REG_RULES))
1759 return ERR_PTR(-EINVAL);
1761 IWL_DEBUG_DEV(dev, IWL_DL_LAR, "building regdom for %d channels\n",
1764 /* build a regdomain rule for every valid channel */
1765 regd = kzalloc(struct_size(regd, reg_rules, num_of_ch), GFP_KERNEL);
1767 return ERR_PTR(-ENOMEM);
1769 /* set alpha2 from FW. */
1770 regd->alpha2[0] = fw_mcc >> 8;
1771 regd->alpha2[1] = fw_mcc & 0xff;
1773 /* parse regulatory capability flags */
1774 reg_capa = iwl_get_reg_capa(cap, resp_ver);
1776 for (ch_idx = 0; ch_idx < num_of_ch; ch_idx++) {
1777 ch_flags = (u16)__le32_to_cpup(channels + ch_idx);
1778 band = iwl_nl80211_band_from_channel_idx(ch_idx);
1779 center_freq = ieee80211_channel_to_frequency(nvm_chan[ch_idx],
1783 if (!(ch_flags & NVM_CHANNEL_VALID)) {
1784 iwl_nvm_print_channel_flags(dev, IWL_DL_LAR,
1785 nvm_chan[ch_idx], ch_flags);
1789 reg_rule_flags = iwl_nvm_get_regdom_bw_flags(nvm_chan, ch_idx,
1793 /* we can't continue the same rule */
1794 if (ch_idx == 0 || prev_reg_rule_flags != reg_rule_flags ||
1795 center_freq - prev_center_freq > 20) {
1800 rule = ®d->reg_rules[valid_rules - 1];
1803 rule->freq_range.start_freq_khz =
1804 MHZ_TO_KHZ(center_freq - 10);
1806 rule->freq_range.end_freq_khz = MHZ_TO_KHZ(center_freq + 10);
1808 /* this doesn't matter - not used by FW */
1809 rule->power_rule.max_antenna_gain = DBI_TO_MBI(6);
1810 rule->power_rule.max_eirp =
1811 DBM_TO_MBM(IWL_DEFAULT_MAX_TX_POWER);
1813 rule->flags = reg_rule_flags;
1815 /* rely on auto-calculation to merge BW of contiguous chans */
1816 rule->flags |= NL80211_RRF_AUTO_BW;
1817 rule->freq_range.max_bandwidth_khz = 0;
1819 prev_center_freq = center_freq;
1820 prev_reg_rule_flags = reg_rule_flags;
1822 iwl_nvm_print_channel_flags(dev, IWL_DL_LAR,
1823 nvm_chan[ch_idx], ch_flags);
1825 if (!(geo_info & GEO_WMM_ETSI_5GHZ_INFO) ||
1826 band == NL80211_BAND_2GHZ)
1829 reg_query_regdb_wmm(regd->alpha2, center_freq, rule);
1833 * Certain firmware versions might report no valid channels
1834 * if booted in RF-kill, i.e. not all calibrations etc. are
1835 * running. We'll get out of this situation later when the
1836 * rfkill is removed and we update the regdomain again, but
1837 * since cfg80211 doesn't accept an empty regdomain, add a
1838 * dummy (unusable) rule here in this case so we can init.
1842 rule = ®d->reg_rules[valid_rules - 1];
1843 rule->freq_range.start_freq_khz = MHZ_TO_KHZ(2412);
1844 rule->freq_range.end_freq_khz = MHZ_TO_KHZ(2413);
1845 rule->freq_range.max_bandwidth_khz = MHZ_TO_KHZ(1);
1846 rule->power_rule.max_antenna_gain = DBI_TO_MBI(6);
1847 rule->power_rule.max_eirp =
1848 DBM_TO_MBM(IWL_DEFAULT_MAX_TX_POWER);
1851 regd->n_reg_rules = valid_rules;
1854 * Narrow down regdom for unused regulatory rules to prevent hole
1855 * between reg rules to wmm rules.
1857 copy_rd = kmemdup(regd, struct_size(regd, reg_rules, valid_rules),
1860 copy_rd = ERR_PTR(-ENOMEM);
1865 IWL_EXPORT_SYMBOL(iwl_parse_nvm_mcc_info);
1867 #define IWL_MAX_NVM_SECTION_SIZE 0x1b58
1868 #define IWL_MAX_EXT_NVM_SECTION_SIZE 0x1ffc
1869 #define MAX_NVM_FILE_LEN 16384
1871 void iwl_nvm_fixups(u32 hw_id, unsigned int section, u8 *data,
1874 #define IWL_4165_DEVICE_ID 0x5501
1875 #define NVM_SKU_CAP_MIMO_DISABLE BIT(5)
1877 if (section == NVM_SECTION_TYPE_PHY_SKU &&
1878 hw_id == IWL_4165_DEVICE_ID && data && len >= 5 &&
1879 (data[4] & NVM_SKU_CAP_MIMO_DISABLE))
1880 /* OTP 0x52 bug work around: it's a 1x1 device */
1881 data[3] = ANT_B | (ANT_B << 4);
1883 IWL_EXPORT_SYMBOL(iwl_nvm_fixups);
1886 * Reads external NVM from a file into mvm->nvm_sections
1888 * HOW TO CREATE THE NVM FILE FORMAT:
1889 * ------------------------------
1890 * 1. create hex file, format:
1895 * rev - 6 bit (word1)
1896 * len - 10 bit (word1)
1897 * id - 4 bit (word2)
1898 * rsv - 12 bit (word2)
1900 * 2. flip 8bits with 8 bits per line to get the right NVM file format
1902 * 3. create binary file from the hex file
1904 * 4. save as "iNVM_xxx.bin" under /lib/firmware
1906 int iwl_read_external_nvm(struct iwl_trans *trans,
1907 const char *nvm_file_name,
1908 struct iwl_nvm_section *nvm_sections)
1910 int ret, section_size;
1912 const struct firmware *fw_entry;
1920 int max_section_size;
1921 const __le32 *dword_buff;
1923 #define NVM_WORD1_LEN(x) (8 * (x & 0x03FF))
1924 #define NVM_WORD2_ID(x) (x >> 12)
1925 #define EXT_NVM_WORD2_LEN(x) (2 * (((x) & 0xFF) << 8 | (x) >> 8))
1926 #define EXT_NVM_WORD1_ID(x) ((x) >> 4)
1927 #define NVM_HEADER_0 (0x2A504C54)
1928 #define NVM_HEADER_1 (0x4E564D2A)
1929 #define NVM_HEADER_SIZE (4 * sizeof(u32))
1931 IWL_DEBUG_EEPROM(trans->dev, "Read from external NVM\n");
1933 /* Maximal size depends on NVM version */
1934 if (trans->cfg->nvm_type != IWL_NVM_EXT)
1935 max_section_size = IWL_MAX_NVM_SECTION_SIZE;
1937 max_section_size = IWL_MAX_EXT_NVM_SECTION_SIZE;
1940 * Obtain NVM image via request_firmware. Since we already used
1941 * request_firmware_nowait() for the firmware binary load and only
1942 * get here after that we assume the NVM request can be satisfied
1945 ret = request_firmware(&fw_entry, nvm_file_name, trans->dev);
1947 IWL_ERR(trans, "ERROR: %s isn't available %d\n",
1948 nvm_file_name, ret);
1952 IWL_INFO(trans, "Loaded NVM file %s (%zu bytes)\n",
1953 nvm_file_name, fw_entry->size);
1955 if (fw_entry->size > MAX_NVM_FILE_LEN) {
1956 IWL_ERR(trans, "NVM file too large\n");
1961 eof = fw_entry->data + fw_entry->size;
1962 dword_buff = (const __le32 *)fw_entry->data;
1964 /* some NVM file will contain a header.
1965 * The header is identified by 2 dwords header as follow:
1966 * dword[0] = 0x2A504C54
1967 * dword[1] = 0x4E564D2A
1969 * This header must be skipped when providing the NVM data to the FW.
1971 if (fw_entry->size > NVM_HEADER_SIZE &&
1972 dword_buff[0] == cpu_to_le32(NVM_HEADER_0) &&
1973 dword_buff[1] == cpu_to_le32(NVM_HEADER_1)) {
1974 file_sec = (const void *)(fw_entry->data + NVM_HEADER_SIZE);
1975 IWL_INFO(trans, "NVM Version %08X\n", le32_to_cpu(dword_buff[2]));
1976 IWL_INFO(trans, "NVM Manufacturing date %08X\n",
1977 le32_to_cpu(dword_buff[3]));
1979 /* nvm file validation, dword_buff[2] holds the file version */
1980 if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_8000 &&
1981 trans->hw_rev_step == SILICON_C_STEP &&
1982 le32_to_cpu(dword_buff[2]) < 0xE4A) {
1987 file_sec = (const void *)fw_entry->data;
1991 if (file_sec->data > eof) {
1993 "ERROR - NVM file too short for section header\n");
1998 /* check for EOF marker */
1999 if (!file_sec->word1 && !file_sec->word2) {
2004 if (trans->cfg->nvm_type != IWL_NVM_EXT) {
2006 2 * NVM_WORD1_LEN(le16_to_cpu(file_sec->word1));
2007 section_id = NVM_WORD2_ID(le16_to_cpu(file_sec->word2));
2009 section_size = 2 * EXT_NVM_WORD2_LEN(
2010 le16_to_cpu(file_sec->word2));
2011 section_id = EXT_NVM_WORD1_ID(
2012 le16_to_cpu(file_sec->word1));
2015 if (section_size > max_section_size) {
2016 IWL_ERR(trans, "ERROR - section too large (%d)\n",
2022 if (!section_size) {
2023 IWL_ERR(trans, "ERROR - section empty\n");
2028 if (file_sec->data + section_size > eof) {
2030 "ERROR - NVM file too short for section (%d bytes)\n",
2036 if (WARN(section_id >= NVM_MAX_NUM_SECTIONS,
2037 "Invalid NVM section ID %d\n", section_id)) {
2042 temp = kmemdup(file_sec->data, section_size, GFP_KERNEL);
2048 iwl_nvm_fixups(trans->hw_id, section_id, temp, section_size);
2050 kfree(nvm_sections[section_id].data);
2051 nvm_sections[section_id].data = temp;
2052 nvm_sections[section_id].length = section_size;
2054 /* advance to the next section */
2055 file_sec = (const void *)(file_sec->data + section_size);
2058 release_firmware(fw_entry);
2061 IWL_EXPORT_SYMBOL(iwl_read_external_nvm);
2063 struct iwl_nvm_data *iwl_get_nvm(struct iwl_trans *trans,
2064 const struct iwl_fw *fw,
2065 u8 set_tx_ant, u8 set_rx_ant)
2067 struct iwl_nvm_get_info cmd = {};
2068 struct iwl_nvm_data *nvm;
2069 struct iwl_host_cmd hcmd = {
2070 .flags = CMD_WANT_SKB | CMD_SEND_IN_RFKILL,
2072 .len = { sizeof(cmd) },
2073 .id = WIDE_ID(REGULATORY_AND_NVM_GROUP, NVM_GET_INFO)
2078 u32 sbands_flags = 0;
2083 * All the values in iwl_nvm_get_info_rsp v4 are the same as
2084 * in v3, except for the channel profile part of the
2085 * regulatory. So we can just access the new struct, with the
2086 * exception of the latter.
2088 struct iwl_nvm_get_info_rsp *rsp;
2089 struct iwl_nvm_get_info_rsp_v3 *rsp_v3;
2090 bool v4 = fw_has_api(&fw->ucode_capa,
2091 IWL_UCODE_TLV_API_REGULATORY_NVM_INFO);
2092 size_t rsp_size = v4 ? sizeof(*rsp) : sizeof(*rsp_v3);
2093 void *channel_profile;
2095 ret = iwl_trans_send_cmd(trans, &hcmd);
2097 return ERR_PTR(ret);
2099 if (WARN(iwl_rx_packet_payload_len(hcmd.resp_pkt) != rsp_size,
2100 "Invalid payload len in NVM response from FW %d",
2101 iwl_rx_packet_payload_len(hcmd.resp_pkt))) {
2106 rsp = (void *)hcmd.resp_pkt->data;
2107 empty_otp = !!(le32_to_cpu(rsp->general.flags) &
2108 NVM_GENERAL_FLAGS_EMPTY_OTP);
2110 IWL_INFO(trans, "OTP is empty\n");
2112 nvm = kzalloc(struct_size(nvm, channels, IWL_NUM_CHANNELS), GFP_KERNEL);
2118 iwl_set_hw_address_from_csr(trans, nvm);
2119 /* TODO: if platform NVM has MAC address - override it here */
2121 if (!is_valid_ether_addr(nvm->hw_addr)) {
2122 IWL_ERR(trans, "no valid mac address was found\n");
2127 IWL_INFO(trans, "base HW address: %pM\n", nvm->hw_addr);
2129 /* Initialize general data */
2130 nvm->nvm_version = le16_to_cpu(rsp->general.nvm_version);
2131 nvm->n_hw_addrs = rsp->general.n_hw_addrs;
2132 if (nvm->n_hw_addrs == 0)
2134 "Firmware declares no reserved mac addresses. OTP is empty: %d\n",
2137 /* Initialize MAC sku data */
2138 mac_flags = le32_to_cpu(rsp->mac_sku.mac_sku_flags);
2139 nvm->sku_cap_11ac_enable =
2140 !!(mac_flags & NVM_MAC_SKU_FLAGS_802_11AC_ENABLED);
2141 nvm->sku_cap_11n_enable =
2142 !!(mac_flags & NVM_MAC_SKU_FLAGS_802_11N_ENABLED);
2143 nvm->sku_cap_11ax_enable =
2144 !!(mac_flags & NVM_MAC_SKU_FLAGS_802_11AX_ENABLED);
2145 nvm->sku_cap_band_24ghz_enable =
2146 !!(mac_flags & NVM_MAC_SKU_FLAGS_BAND_2_4_ENABLED);
2147 nvm->sku_cap_band_52ghz_enable =
2148 !!(mac_flags & NVM_MAC_SKU_FLAGS_BAND_5_2_ENABLED);
2149 nvm->sku_cap_mimo_disabled =
2150 !!(mac_flags & NVM_MAC_SKU_FLAGS_MIMO_DISABLED);
2151 if (CSR_HW_RFID_TYPE(trans->hw_rf_id) >= IWL_CFG_RF_TYPE_FM)
2152 nvm->sku_cap_11be_enable = true;
2154 /* Initialize PHY sku data */
2155 nvm->valid_tx_ant = (u8)le32_to_cpu(rsp->phy_sku.tx_chains);
2156 nvm->valid_rx_ant = (u8)le32_to_cpu(rsp->phy_sku.rx_chains);
2158 if (le32_to_cpu(rsp->regulatory.lar_enabled) &&
2159 fw_has_capa(&fw->ucode_capa,
2160 IWL_UCODE_TLV_CAPA_LAR_SUPPORT)) {
2161 nvm->lar_enabled = true;
2162 sbands_flags |= IWL_NVM_SBANDS_FLAGS_LAR;
2165 rsp_v3 = (void *)rsp;
2166 channel_profile = v4 ? (void *)rsp->regulatory.channel_profile :
2167 (void *)rsp_v3->regulatory.channel_profile;
2169 tx_ant = nvm->valid_tx_ant & fw->valid_tx_ant;
2170 rx_ant = nvm->valid_rx_ant & fw->valid_rx_ant;
2173 tx_ant &= set_tx_ant;
2175 rx_ant &= set_rx_ant;
2177 iwl_init_sbands(trans, nvm, channel_profile, tx_ant, rx_ant,
2178 sbands_flags, v4, fw);
2180 iwl_free_resp(&hcmd);
2186 iwl_free_resp(&hcmd);
2187 return ERR_PTR(ret);
2189 IWL_EXPORT_SYMBOL(iwl_get_nvm);