]> Git Repo - J-linux.git/blob - drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
Merge tag 'kbuild-v6.9' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy...
[J-linux.git] / drivers / net / wireless / intel / iwlwifi / iwl-nvm-parse.c
1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /*
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
6  */
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>
13
14 #include "iwl-drv.h"
15 #include "iwl-modparams.h"
16 #include "iwl-nvm-parse.h"
17 #include "iwl-prph.h"
18 #include "iwl-io.h"
19 #include "iwl-csr.h"
20 #include "fw/acpi.h"
21 #include "fw/api/nvm-reg.h"
22 #include "fw/api/commands.h"
23 #include "fw/api/cmdhdr.h"
24 #include "fw/img.h"
25 #include "mei/iwl-mei.h"
26
27 /* NVM offsets (in words) definitions */
28 enum nvm_offsets {
29         /* NVM HW-Section offset (in words) definitions */
30         SUBSYSTEM_ID = 0x0A,
31         HW_ADDR = 0x15,
32
33         /* NVM SW-Section offset (in words) definitions */
34         NVM_SW_SECTION = 0x1C0,
35         NVM_VERSION = 0,
36         RADIO_CFG = 1,
37         SKU = 2,
38         N_HW_ADDRS = 3,
39         NVM_CHANNELS = 0x1E0 - NVM_SW_SECTION,
40
41         /* NVM calibration section offset (in words) definitions */
42         NVM_CALIB_SECTION = 0x2B8,
43         XTAL_CALIB = 0x316 - NVM_CALIB_SECTION,
44
45         /* NVM REGULATORY -Section offset (in words) definitions */
46         NVM_CHANNELS_SDP = 0,
47 };
48
49 enum ext_nvm_offsets {
50         /* NVM HW-Section offset (in words) definitions */
51         MAC_ADDRESS_OVERRIDE_EXT_NVM = 1,
52
53         /* NVM SW-Section offset (in words) definitions */
54         NVM_VERSION_EXT_NVM = 0,
55         N_HW_ADDRS_FAMILY_8000 = 3,
56
57         /* NVM PHY_SKU-Section offset (in words) definitions */
58         RADIO_CFG_FAMILY_EXT_NVM = 0,
59         SKU_FAMILY_8000 = 2,
60
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,
66 };
67
68 /* SKU Capabilities (actual values from NVM definition) */
69 enum nvm_sku_bits {
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),
75 };
76
77 /*
78  * These are the channel numbers in the order that they are stored in the NVM
79  */
80 static const u16 iwl_nvm_channels[] = {
81         /* 2.4 GHz */
82         1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
83         /* 5 GHz */
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
87 };
88
89 static const u16 iwl_ext_nvm_channels[] = {
90         /* 2.4 GHz */
91         1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
92         /* 5 GHz */
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
96 };
97
98 static const u16 iwl_uhb_nvm_channels[] = {
99         /* 2.4 GHz */
100         1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
101         /* 5 GHz */
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,
105         /* 6-7 GHz */
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
110 };
111
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
120
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, },
138 };
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)
143
144 /**
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
161  */
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),
177 };
178
179 /**
180  * enum iwl_reg_capa_flags_v1 - global flags applied for the whole regulatory
181  * domain.
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.
196  */
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 */
208
209 /**
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
213  *      disabled.
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.
229  */
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 */
242
243 /**
244  * enum iwl_reg_capa_flags_v4 - global flags applied for the whole regulatory
245  * domain.
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).
256  */
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 */
266
267 /*
268 * API v2 for reg_capa_flags is relevant from version 6 and onwards of the
269 * MCC update command response.
270 */
271 #define REG_CAPA_V2_RESP_VER    6
272
273 /* API v4 for reg_capa_flags is relevant from version 8 and onwards of the
274  * MCC update command response.
275  */
276 #define REG_CAPA_V4_RESP_VER    8
277
278 /**
279  * struct iwl_reg_capa - struct for global regulatory capabilities, Used for
280  * handling the different APIs of reg_capa_flags.
281  *
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.
292  */
293 struct iwl_reg_capa {
294         bool allow_40mhz;
295         bool allow_80mhz;
296         bool allow_160mhz;
297         bool allow_320mhz;
298         bool disable_11ax;
299         bool disable_11be;
300 };
301
302 static inline void iwl_nvm_print_channel_flags(struct device *dev, u32 level,
303                                                int chan, u32 flags)
304 {
305 #define CHECK_AND_PRINT_I(x)    \
306         ((flags & NVM_CHANNEL_##x) ? " " #x : "")
307
308         if (!(flags & NVM_CHANNEL_VALID)) {
309                 IWL_DEBUG_DEV(dev, level, "Ch. %d: 0x%x: No traffic\n",
310                               chan, flags);
311                 return;
312         }
313
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",
317                       chan, flags,
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
333 }
334
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)
337 {
338         u32 flags = IEEE80211_CHAN_NO_HT40;
339
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;
348                 else
349                         flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
350         }
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;
355
356         if (!(nvm_flags & NVM_CHANNEL_IBSS))
357                 flags |= IEEE80211_CHAN_NO_IR;
358
359         if (!(nvm_flags & NVM_CHANNEL_ACTIVE))
360                 flags |= IEEE80211_CHAN_NO_IR;
361
362         if (nvm_flags & NVM_CHANNEL_RADAR)
363                 flags |= IEEE80211_CHAN_RADAR;
364
365         if (nvm_flags & NVM_CHANNEL_INDOOR_ONLY)
366                 flags |= IEEE80211_CHAN_INDOOR_ONLY;
367
368         /* Set the GO concurrent flag only in case that NO_IR is set.
369          * Otherwise it is meaningless
370          */
371         if ((nvm_flags & NVM_CHANNEL_GO_CONCURRENT) &&
372             (flags & IEEE80211_CHAN_NO_IR))
373                 flags |= IEEE80211_CHAN_IR_CONCURRENT;
374
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;
380
381         return flags;
382 }
383
384 static enum nl80211_band iwl_nl80211_band_from_channel_idx(int ch_idx)
385 {
386         if (ch_idx >= NUM_2GHZ_CHANNELS + NUM_5GHZ_CHANNELS) {
387                 return NL80211_BAND_6GHZ;
388         }
389
390         if (ch_idx >= NUM_2GHZ_CHANNELS)
391                 return NL80211_BAND_5GHZ;
392         return NL80211_BAND_2GHZ;
393 }
394
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)
399 {
400         int ch_idx;
401         int n_channels = 0;
402         struct ieee80211_channel *channel;
403         u32 ch_flags;
404         int num_of_ch;
405         const u16 *nvm_chan;
406
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;
413         } else {
414                 num_of_ch = IWL_NVM_NUM_CHANNELS;
415                 nvm_chan = iwl_nvm_channels;
416         }
417
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);
421
422                 if (v4)
423                         ch_flags =
424                                 __le32_to_cpup((const __le32 *)nvm_ch_flags + ch_idx);
425                 else
426                         ch_flags =
427                                 __le16_to_cpup((const __le16 *)nvm_ch_flags + ch_idx);
428
429                 if (band == NL80211_BAND_5GHZ &&
430                     !data->sku_cap_band_52ghz_enable)
431                         continue;
432
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 |
437                                      NVM_CHANNEL_80MHZ |
438                                      NVM_CHANNEL_160MHZ);
439                 }
440
441                 if (ch_flags & NVM_CHANNEL_160MHZ)
442                         data->vht160_supported = true;
443
444                 if (!(sbands_flags & IWL_NVM_SBANDS_FLAGS_LAR) &&
445                     !(ch_flags & NVM_CHANNEL_VALID)) {
446                         /*
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.
450                          */
451                         iwl_nvm_print_channel_flags(dev, IWL_DL_EEPROM,
452                                                     nvm_chan[ch_idx], ch_flags);
453                         continue;
454                 }
455
456                 channel = &data->channels[n_channels];
457                 n_channels++;
458
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);
464
465                 /* Initialize regulatory-based run-time data */
466
467                 /*
468                  * Default value - highest tx power value.  max_power
469                  * is not used in mvm, and is used for backwards compatibility
470                  */
471                 channel->max_power = IWL_DEFAULT_MAX_TX_POWER;
472
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],
476                                                                ch_idx, band,
477                                                                ch_flags, cfg);
478                 else
479                         channel->flags = 0;
480
481                 /* TODO: Don't put limitations on UHB devices as we still don't
482                  * have NVM for them
483                  */
484                 if (cfg->uhb_supported)
485                         channel->flags = 0;
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);
490         }
491
492         return n_channels;
493 }
494
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)
499 {
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);
503
504         vht_cap->vht_supported = true;
505
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;
512
513         if (!trans->cfg->ht_params->stbc)
514                 vht_cap->cap &= ~IEEE80211_VHT_CAP_RXSTBC_MASK;
515
516         if (data->vht160_supported)
517                 vht_cap->cap |= IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
518                                 IEEE80211_VHT_CAP_SHORT_GI_160;
519
520         if (cfg->vht_mu_mimo_supported)
521                 vht_cap->cap |= IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
522
523         if (cfg->ht_params->ldpc)
524                 vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC;
525
526         if (data->sku_cap_mimo_disabled) {
527                 num_rx_ants = 1;
528                 num_tx_ants = 1;
529         }
530
531         if (trans->cfg->ht_params->stbc && num_tx_ants > 1)
532                 vht_cap->cap |= IEEE80211_VHT_CAP_TXSTBC;
533         else
534                 vht_cap->cap |= IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN;
535
536         switch (iwlwifi_mod_params.amsdu_size) {
537         case IWL_AMSDU_DEF:
538                 if (trans->trans_cfg->mq_rx_supported)
539                         vht_cap->cap |=
540                                 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454;
541                 else
542                         vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895;
543                 break;
544         case IWL_AMSDU_2K:
545                 if (trans->trans_cfg->mq_rx_supported)
546                         vht_cap->cap |=
547                                 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454;
548                 else
549                         WARN(1, "RB size of 2K is not supported by this device\n");
550                 break;
551         case IWL_AMSDU_4K:
552                 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895;
553                 break;
554         case IWL_AMSDU_8K:
555                 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991;
556                 break;
557         case IWL_AMSDU_12K:
558                 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454;
559                 break;
560         default:
561                 break;
562         }
563
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);
573
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);
579         }
580
581         vht_cap->vht_mcs.tx_mcs_map = vht_cap->vht_mcs.rx_mcs_map;
582
583         vht_cap->vht_mcs.tx_highest |=
584                 cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE);
585 }
586
587 static const u8 iwl_vendor_caps[] = {
588         0xdd,                   /* vendor element */
589         0x06,                   /* length */
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,
595         0x00
596 };
597
598 static const struct ieee80211_sband_iftype_data iwl_he_eht_capa[] = {
599         {
600                 .types_mask = BIT(NL80211_IFTYPE_STATION),
601                 .he_cap = {
602                         .has_he = true,
603                         .he_cap_elem = {
604                                 .mac_cap_info[0] =
605                                         IEEE80211_HE_MAC_CAP0_HTC_HE,
606                                 .mac_cap_info[1] =
607                                         IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US |
608                                         IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
609                                 .mac_cap_info[2] =
610                                         IEEE80211_HE_MAC_CAP2_32BIT_BA_BITMAP,
611                                 .mac_cap_info[3] =
612                                         IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
613                                         IEEE80211_HE_MAC_CAP3_RX_CTRL_FRAME_TO_MULTIBSS,
614                                 .mac_cap_info[4] =
615                                         IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU |
616                                         IEEE80211_HE_MAC_CAP4_MULTI_TID_AGG_TX_QOS_B39,
617                                 .mac_cap_info[5] =
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,
623                                 .phy_cap_info[1] =
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,
627                                 .phy_cap_info[2] =
628                                         IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US |
629                                         IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ,
630                                 .phy_cap_info[3] =
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,
635                                 .phy_cap_info[4] =
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,
639                                 .phy_cap_info[6] =
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,
643                                 .phy_cap_info[7] =
644                                         IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
645                                         IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI,
646                                 .phy_cap_info[8] =
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,
652                                 .phy_cap_info[9] =
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),
657                                 .phy_cap_info[10] =
658                                         IEEE80211_HE_PHY_CAP10_HE_MU_M1RU_MAX_LTF,
659                         },
660                         /*
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
664                          */
665                         .he_mcs_nss_supp = {
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),
672                         },
673                         /*
674                          * Set default PPE thresholds, with PPET16 set to 0,
675                          * PPET8 set to 7
676                          */
677                         .ppe_thres = {0x61, 0x1c, 0xc7, 0x71},
678                 },
679                 .eht_cap = {
680                         .has_eht = true,
681                         .eht_cap_elem = {
682                                 .mac_cap_info[0] =
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,
687                                 .phy_cap_info[0] =
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,
693                                 .phy_cap_info[1] =
694                                         IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_80MHZ_MASK  |
695                                         IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK,
696                                 .phy_cap_info[3] =
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,
704
705                                 .phy_cap_info[4] =
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,
709                                 .phy_cap_info[5] =
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,
715                                 .phy_cap_info[6] =
716                                         IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK |
717                                         IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP,
718                                 .phy_cap_info[8] =
719                                         IEEE80211_EHT_PHY_CAP8_RX_1024QAM_WIDER_BW_DL_OFDMA |
720                                         IEEE80211_EHT_PHY_CAP8_RX_4096QAM_WIDER_BW_DL_OFDMA,
721                         },
722
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.
726                          */
727                         .eht_mcs_nss_supp = {
728                                 .bw._80 = {
729                                         .rx_tx_mcs9_max_nss = 0x22,
730                                         .rx_tx_mcs11_max_nss = 0x22,
731                                         .rx_tx_mcs13_max_nss = 0x22,
732                                 },
733                                 .bw._160 = {
734                                         .rx_tx_mcs9_max_nss = 0x22,
735                                         .rx_tx_mcs11_max_nss = 0x22,
736                                         .rx_tx_mcs13_max_nss = 0x22,
737                                 },
738                                 .bw._320 = {
739                                         .rx_tx_mcs9_max_nss = 0x22,
740                                         .rx_tx_mcs11_max_nss = 0x22,
741                                         .rx_tx_mcs13_max_nss = 0x22,
742                                 },
743                         },
744
745                         /*
746                          * PPE thresholds for NSS = 2, and RU index bitmap set
747                          * to 0xc.
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.
751                          */
752                         .eht_ppe_thres = {0xc1, 0x0e, 0xe0 }
753                 },
754         },
755         {
756                 .types_mask = BIT(NL80211_IFTYPE_AP),
757                 .he_cap = {
758                         .has_he = true,
759                         .he_cap_elem = {
760                                 .mac_cap_info[0] =
761                                         IEEE80211_HE_MAC_CAP0_HTC_HE,
762                                 .mac_cap_info[1] =
763                                         IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
764                                 .mac_cap_info[3] =
765                                         IEEE80211_HE_MAC_CAP3_OMI_CONTROL,
766                                 .phy_cap_info[1] =
767                                         IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD,
768                                 .phy_cap_info[2] =
769                                         IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ |
770                                         IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US,
771                                 .phy_cap_info[3] =
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,
776                                 .phy_cap_info[6] =
777                                         IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT,
778                                 .phy_cap_info[7] =
779                                         IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI,
780                                 .phy_cap_info[8] =
781                                         IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
782                                         IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_242,
783                                 .phy_cap_info[9] =
784                                         IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_RESERVED
785                                         << IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_POS,
786                         },
787                         /*
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
791                          */
792                         .he_mcs_nss_supp = {
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),
799                         },
800                         /*
801                          * Set default PPE thresholds, with PPET16 set to 0,
802                          * PPET8 set to 7
803                          */
804                         .ppe_thres = {0x61, 0x1c, 0xc7, 0x71},
805                 },
806                 .eht_cap = {
807                         .has_eht = true,
808                         .eht_cap_elem = {
809                                 .mac_cap_info[0] =
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,
813                                 .phy_cap_info[0] =
814                                         IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ |
815                                         IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI,
816                                 .phy_cap_info[5] =
817                                         FIELD_PREP_CONST(IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK,
818                                                          IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_16US),
819                         },
820
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.
824                          */
825                         .eht_mcs_nss_supp = {
826                                 .bw._80 = {
827                                         .rx_tx_mcs9_max_nss = 0x22,
828                                         .rx_tx_mcs11_max_nss = 0x22,
829                                         .rx_tx_mcs13_max_nss = 0x22,
830                                 },
831                                 .bw._160 = {
832                                         .rx_tx_mcs9_max_nss = 0x22,
833                                         .rx_tx_mcs11_max_nss = 0x22,
834                                         .rx_tx_mcs13_max_nss = 0x22,
835                                 },
836                                 .bw._320 = {
837                                         .rx_tx_mcs9_max_nss = 0x22,
838                                         .rx_tx_mcs11_max_nss = 0x22,
839                                         .rx_tx_mcs13_max_nss = 0x22,
840                                 },
841                         },
842
843                         /*
844                          * PPE thresholds for NSS = 2, and RU index bitmap set
845                          * to 0xc.
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.
849                          */
850                         .eht_ppe_thres = {0xc1, 0x0e, 0xe0 }
851                 },
852         },
853 };
854
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)
859 {
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;
864         u32 exp;
865         int i;
866
867         if (sband->band != NL80211_BAND_6GHZ)
868                 return;
869
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);
876
877         he_6ghz_capa |=
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);
882         he_6ghz_capa |=
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);
885         he_6ghz_capa |=
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;
892
893         IWL_DEBUG_EEPROM(trans->dev, "he_6ghz_capa=0x%x\n", he_6ghz_capa);
894
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);
899 }
900
901 static void
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)
908 {
909         bool is_ap = iftype_data->types_mask & BIT(NL80211_IFTYPE_AP);
910         bool no_320;
911
912         no_320 = (!trans->trans_cfg->integrated &&
913                  trans->pcie_link_speed < PCI_EXP_LNKSTA_CLS_8_0GB) ||
914                  trans->reduced_cap_sku;
915
916         if (!data->sku_cap_11be_enable || iwlwifi_mod_params.disable_11be)
917                 iftype_data->eht_cap.has_eht = false;
918
919         /* Advertise an A-MPDU exponent extension based on
920          * operating band
921          */
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;
928         else
929                 iftype_data->he_cap.he_cap_elem.mac_cap_info[3] |=
930                         IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3;
931
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);
939                 break;
940         case NL80211_BAND_6GHZ:
941                 if (!no_320) {
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;
946                 }
947                 fallthrough;
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;
952                 break;
953         default:
954                 WARN_ON(1);
955                 break;
956         }
957
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;
964                 if (!is_ap) {
965                         iftype_data->he_cap.he_cap_elem.phy_cap_info[7] |=
966                                 IEEE80211_HE_PHY_CAP7_MAX_NC_2;
967
968                         if (iftype_data->eht_cap.has_eht) {
969                                 /*
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
973                                  */
974                                 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[2] |= 0x49;
975
976                                 /*
977                                  * Set the MAX NC to 1 to indicate sounding feedback of
978                                  * 2 supported by the beamfomee.
979                                  */
980                                 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[4] |= 0x10;
981                         }
982                 }
983         } else {
984                 struct ieee80211_he_mcs_nss_supp *he_mcs_nss_supp =
985                         &iftype_data->he_cap.he_mcs_nss_supp;
986
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;
990
991                         memset(mcs_nss, 0x11, sizeof(*mcs_nss));
992                 }
993
994                 if (!is_ap) {
995                         /* If not 2x2, we need to indicate 1x1 in the
996                          * Midamble RX Max NSTS - but not for AP mode
997                          */
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;
1004                 }
1005
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);
1018         }
1019
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;
1023
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;
1032                 if (!is_ap)
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;
1035                 break;
1036         }
1037
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;
1061         }
1062
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;
1066
1067         if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_22000 &&
1068             !is_ap) {
1069                 iftype_data->vendor_elems.data = iwl_vendor_caps;
1070                 iftype_data->vendor_elems.len = ARRAY_SIZE(iwl_vendor_caps);
1071         }
1072
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;
1078         }
1079
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;
1083         }
1084
1085         if (trans->no_160)
1086                 iftype_data->he_cap.he_cap_elem.phy_cap_info[0] &=
1087                         ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
1088
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;
1098         }
1099 }
1100
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)
1106 {
1107         struct ieee80211_sband_iftype_data *iftype_data;
1108         int i;
1109
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));
1113
1114         switch (sband->band) {
1115         case NL80211_BAND_2GHZ:
1116                 iftype_data = data->iftd.low;
1117                 break;
1118         case NL80211_BAND_5GHZ:
1119                 iftype_data = data->iftd.high;
1120                 break;
1121         case NL80211_BAND_6GHZ:
1122                 iftype_data = data->iftd.uhb;
1123                 break;
1124         default:
1125                 WARN_ON(1);
1126                 return;
1127         }
1128
1129         memcpy(iftype_data, iwl_he_eht_capa, sizeof(iwl_he_eht_capa));
1130
1131         _ieee80211_set_sband_iftype_data(sband, iftype_data,
1132                                          ARRAY_SIZE(iwl_he_eht_capa));
1133
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);
1137
1138         iwl_init_he_6ghz_capa(trans, data, sband, tx_chains, rx_chains);
1139 }
1140
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)
1143 {
1144         struct ieee80211_supported_band *sband;
1145
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);
1149
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,
1152                                      fw);
1153
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);
1160
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,
1163                                      fw);
1164
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,
1168                                      fw);
1169 }
1170 IWL_EXPORT_SYMBOL(iwl_reinit_cab);
1171
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)
1177 {
1178         struct device *dev = trans->dev;
1179         const struct iwl_cfg *cfg = trans->cfg;
1180         int n_channels;
1181         int n_used = 0;
1182         struct ieee80211_supported_band *sband;
1183
1184         n_channels = iwl_init_channel_map(dev, cfg, data, nvm_ch_flags,
1185                                           sbands_flags, v4);
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,
1191                                           NL80211_BAND_2GHZ);
1192         iwl_init_ht_hw_capab(trans, data, &sband->ht_cap, NL80211_BAND_2GHZ,
1193                              tx_chains, rx_chains);
1194
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,
1197                                      fw);
1198
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,
1204                                           NL80211_BAND_5GHZ);
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);
1210
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,
1213                                      fw);
1214
1215         /* 6GHz band. */
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,
1222                                           NL80211_BAND_6GHZ);
1223
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,
1226                                      fw);
1227         else
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);
1232 }
1233
1234 static int iwl_get_sku(const struct iwl_cfg *cfg, const __le16 *nvm_sw,
1235                        const __le16 *phy_sku)
1236 {
1237         if (cfg->nvm_type != IWL_NVM_EXT)
1238                 return le16_to_cpup(nvm_sw + SKU);
1239
1240         return le32_to_cpup((const __le32 *)(phy_sku + SKU_FAMILY_8000));
1241 }
1242
1243 static int iwl_get_nvm_version(const struct iwl_cfg *cfg, const __le16 *nvm_sw)
1244 {
1245         if (cfg->nvm_type != IWL_NVM_EXT)
1246                 return le16_to_cpup(nvm_sw + NVM_VERSION);
1247         else
1248                 return le32_to_cpup((const __le32 *)(nvm_sw +
1249                                                      NVM_VERSION_EXT_NVM));
1250 }
1251
1252 static int iwl_get_radio_cfg(const struct iwl_cfg *cfg, const __le16 *nvm_sw,
1253                              const __le16 *phy_sku)
1254 {
1255         if (cfg->nvm_type != IWL_NVM_EXT)
1256                 return le16_to_cpup(nvm_sw + RADIO_CFG);
1257
1258         return le32_to_cpup((const __le32 *)(phy_sku + RADIO_CFG_FAMILY_EXT_NVM));
1259
1260 }
1261
1262 static int iwl_get_n_hw_addrs(const struct iwl_cfg *cfg, const __le16 *nvm_sw)
1263 {
1264         int n_hw_addr;
1265
1266         if (cfg->nvm_type != IWL_NVM_EXT)
1267                 return le16_to_cpup(nvm_sw + N_HW_ADDRS);
1268
1269         n_hw_addr = le32_to_cpup((const __le32 *)(nvm_sw + N_HW_ADDRS_FAMILY_8000));
1270
1271         return n_hw_addr & N_HW_ADDR_MASK;
1272 }
1273
1274 static void iwl_set_radio_cfg(const struct iwl_cfg *cfg,
1275                               struct iwl_nvm_data *data,
1276                               u32 radio_cfg)
1277 {
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);
1283                 return;
1284         }
1285
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);
1293 }
1294
1295 static void iwl_flip_hw_address(__le32 mac_addr0, __le32 mac_addr1, u8 *dest)
1296 {
1297         const u8 *hw_addr;
1298
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];
1304
1305         hw_addr = (const u8 *)&mac_addr1;
1306         dest[4] = hw_addr[1];
1307         dest[5] = hw_addr[0];
1308 }
1309
1310 static void iwl_set_hw_address_from_csr(struct iwl_trans *trans,
1311                                         struct iwl_nvm_data *data)
1312 {
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)));
1317
1318         iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr);
1319         /*
1320          * If the OEM fused a valid address, use it instead of the one in the
1321          * OTP
1322          */
1323         if (is_valid_ether_addr(data->hw_addr))
1324                 return;
1325
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)));
1328
1329         iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr);
1330 }
1331
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)
1337 {
1338         const u8 *hw_addr;
1339
1340         if (mac_override) {
1341                 static const u8 reserved_mac[] = {
1342                         0x02, 0xcc, 0xaa, 0xff, 0xee, 0x00
1343                 };
1344
1345                 hw_addr = (const u8 *)(mac_override +
1346                                  MAC_ADDRESS_OVERRIDE_EXT_NVM);
1347
1348                 /*
1349                  * Store the MAC address from MAO section.
1350                  * No byte swapping is required in MAO section
1351                  */
1352                 memcpy(data->hw_addr, hw_addr, ETH_ALEN);
1353
1354                 /*
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.
1357                  */
1358                 if (is_valid_ether_addr(data->hw_addr) &&
1359                     memcmp(reserved_mac, hw_addr, ETH_ALEN) != 0)
1360                         return;
1361
1362                 IWL_ERR(trans,
1363                         "mac address from nvm override section is not valid\n");
1364         }
1365
1366         if (nvm_hw) {
1367                 /* read the mac address from WFMP registers */
1368                 __le32 mac_addr0 = cpu_to_le32(iwl_trans_read_prph(trans,
1369                                                 WFMP_MAC_ADDR_0));
1370                 __le32 mac_addr1 = cpu_to_le32(iwl_trans_read_prph(trans,
1371                                                 WFMP_MAC_ADDR_1));
1372
1373                 iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr);
1374
1375                 return;
1376         }
1377
1378         IWL_ERR(trans, "mac address is not found\n");
1379 }
1380
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)
1385 {
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);
1390
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];
1398         } else {
1399                 iwl_set_hw_address_family_8000(trans, cfg, data,
1400                                                mac_override, nvm_hw);
1401         }
1402
1403         if (!is_valid_ether_addr(data->hw_addr)) {
1404                 IWL_ERR(trans, "no valid mac address was found\n");
1405                 return -EINVAL;
1406         }
1407
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));
1411
1412         return 0;
1413 }
1414
1415 static bool
1416 iwl_nvm_no_wide_in_5ghz(struct iwl_trans *trans, const struct iwl_cfg *cfg,
1417                         const __be16 *nvm_hw)
1418 {
1419         /*
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
1426          * to use them.
1427          */
1428         if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_7000) {
1429                 /*
1430                  * Unlike the other sections in the NVM, the hw
1431                  * section uses big-endian.
1432                  */
1433                 u16 subsystem_id = be16_to_cpup(nvm_hw + SUBSYSTEM_ID);
1434                 u8 sku = (subsystem_id & 0x1e) >> 1;
1435
1436                 if (sku == 5 || sku == 9) {
1437                         IWL_DEBUG_EEPROM(trans->dev,
1438                                          "disabling wide channels in 5GHz (0x%0x %d)\n",
1439                                          subsystem_id, sku);
1440                         return true;
1441                 }
1442         }
1443
1444         return false;
1445 }
1446
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)
1451 {
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;
1456
1457         if (cfg->uhb_supported)
1458                 data = kzalloc(struct_size(data, channels,
1459                                            IWL_NVM_NUM_CHANNELS_UHB),
1460                                            GFP_KERNEL);
1461         else
1462                 data = kzalloc(struct_size(data, channels,
1463                                            IWL_NVM_NUM_CHANNELS_EXT),
1464                                            GFP_KERNEL);
1465         if (!data)
1466                 return NULL;
1467
1468         BUILD_BUG_ON(ARRAY_SIZE(mei_nvm->channels) !=
1469                      IWL_NVM_NUM_CHANNELS_UHB);
1470         data->nvm_version = mei_nvm->nvm_version;
1471
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;
1477         if (tx_ant)
1478                 tx_chains &= tx_ant;
1479         if (rx_ant)
1480                 rx_chains &= rx_ant;
1481
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;
1490
1491         data->lar_enabled = mei_nvm->caps & MEI_NVM_CAPS_LARI_SUPPORT;
1492
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)) {
1496                 kfree(data);
1497                 return NULL;
1498         }
1499
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;
1503
1504         iwl_init_sbands(trans, data, mei_nvm->channels, tx_chains, rx_chains,
1505                         sbands_flags, true, fw);
1506
1507         return data;
1508 }
1509 IWL_EXPORT_SYMBOL(iwl_parse_mei_nvm_data);
1510
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)
1518 {
1519         struct iwl_nvm_data *data;
1520         bool lar_enabled;
1521         u32 sku, radio_cfg;
1522         u32 sbands_flags = 0;
1523         u16 lar_config;
1524         const __le16 *ch_section;
1525
1526         if (cfg->uhb_supported)
1527                 data = kzalloc(struct_size(data, channels,
1528                                            IWL_NVM_NUM_CHANNELS_UHB),
1529                                            GFP_KERNEL);
1530         else if (cfg->nvm_type != IWL_NVM_EXT)
1531                 data = kzalloc(struct_size(data, channels,
1532                                            IWL_NVM_NUM_CHANNELS),
1533                                            GFP_KERNEL);
1534         else
1535                 data = kzalloc(struct_size(data, channels,
1536                                            IWL_NVM_NUM_CHANNELS_EXT),
1537                                            GFP_KERNEL);
1538         if (!data)
1539                 return NULL;
1540
1541         data->nvm_version = iwl_get_nvm_version(cfg, nvm_sw);
1542
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;
1549
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;
1559
1560         data->n_hw_addrs = iwl_get_n_hw_addrs(cfg, nvm_sw);
1561
1562         if (cfg->nvm_type != IWL_NVM_EXT) {
1563                 /* Checking for required sections */
1564                 if (!nvm_calib) {
1565                         IWL_ERR(trans,
1566                                 "Can't parse empty Calib NVM sections\n");
1567                         kfree(data);
1568                         return NULL;
1569                 }
1570
1571                 ch_section = cfg->nvm_type == IWL_NVM_SDP ?
1572                              &regulatory[NVM_CHANNELS_SDP] :
1573                              &nvm_sw[NVM_CHANNELS];
1574
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);
1578                 lar_enabled = true;
1579         } else {
1580                 u16 lar_offset = data->nvm_version < 0xE39 ?
1581                                  NVM_LAR_OFFSET_OLD :
1582                                  NVM_LAR_OFFSET;
1583
1584                 lar_config = le16_to_cpup(regulatory + lar_offset);
1585                 data->lar_enabled = !!(lar_config &
1586                                        NVM_LAR_ENABLED);
1587                 lar_enabled = data->lar_enabled;
1588                 ch_section = &regulatory[NVM_CHANNELS_EXTENDED];
1589         }
1590
1591         /* If no valid mac address was found - bail out */
1592         if (iwl_set_hw_address(trans, cfg, data, nvm_hw, mac_override)) {
1593                 kfree(data);
1594                 return NULL;
1595         }
1596
1597         if (lar_enabled &&
1598             fw_has_capa(&fw->ucode_capa, IWL_UCODE_TLV_CAPA_LAR_SUPPORT))
1599                 sbands_flags |= IWL_NVM_SBANDS_FLAGS_LAR;
1600
1601         if (iwl_nvm_no_wide_in_5ghz(trans, cfg, nvm_hw))
1602                 sbands_flags |= IWL_NVM_SBANDS_FLAGS_NO_WIDE_IN_5GHZ;
1603
1604         iwl_init_sbands(trans, data, ch_section, tx_chains, rx_chains,
1605                         sbands_flags, false, fw);
1606         data->calib_version = 255;
1607
1608         return data;
1609 }
1610 IWL_EXPORT_SYMBOL(iwl_parse_nvm_data);
1611
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,
1616                                        bool uats_enabled)
1617 {
1618         u32 flags = NL80211_RRF_NO_HT40;
1619
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;
1629                 else
1630                         flags &= ~NL80211_RRF_NO_HT40MINUS;
1631         }
1632
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;
1637
1638         if (!(nvm_flags & NVM_CHANNEL_ACTIVE))
1639                 flags |= NL80211_RRF_NO_IR;
1640
1641         if (nvm_flags & NVM_CHANNEL_RADAR)
1642                 flags |= NL80211_RRF_DFS;
1643
1644         if (nvm_flags & NVM_CHANNEL_INDOOR_ONLY)
1645                 flags |= NL80211_RRF_NO_OUTDOOR;
1646
1647         /* Set the GO concurrent flag only in case that NO_IR is set.
1648          * Otherwise it is meaningless
1649          */
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.
1657                          */
1658                         flags &= ~NL80211_RRF_NO_IR;
1659                 }
1660         }
1661
1662         /* Set the AP type for the UHB case. */
1663         if (uats_enabled) {
1664                 if (!(nvm_flags & NVM_CHANNEL_VLP))
1665                         flags |= NL80211_RRF_NO_6GHZ_VLP_CLIENT;
1666
1667                 if (!(nvm_flags & NVM_CHANNEL_AFC))
1668                         flags |= NL80211_RRF_NO_6GHZ_AFC_CLIENT;
1669         }
1670
1671         /*
1672          * reg_capa is per regulatory domain so apply it for every channel
1673          */
1674         if (ch_idx >= NUM_2GHZ_CHANNELS) {
1675                 if (!reg_capa.allow_40mhz)
1676                         flags |= NL80211_RRF_NO_HT40;
1677
1678                 if (!reg_capa.allow_80mhz)
1679                         flags |= NL80211_RRF_NO_80MHZ;
1680
1681                 if (!reg_capa.allow_160mhz)
1682                         flags |= NL80211_RRF_NO_160MHZ;
1683
1684                 if (!reg_capa.allow_320mhz)
1685                         flags |= NL80211_RRF_NO_320MHZ;
1686         }
1687
1688         if (reg_capa.disable_11ax)
1689                 flags |= NL80211_RRF_NO_HE;
1690
1691         if (reg_capa.disable_11be)
1692                 flags |= NL80211_RRF_NO_EHT;
1693
1694         return flags;
1695 }
1696
1697 static struct iwl_reg_capa iwl_get_reg_capa(u32 flags, u8 resp_ver)
1698 {
1699         struct iwl_reg_capa reg_capa = {};
1700
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;
1713         } else {
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;
1718         }
1719         return reg_capa;
1720 }
1721
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)
1726 {
1727         int ch_idx;
1728         u16 ch_flags;
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;
1736         bool new_rule;
1737         int max_num_ch;
1738         struct iwl_reg_capa reg_capa;
1739
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;
1746         } else {
1747                 max_num_ch = IWL_NVM_NUM_CHANNELS;
1748                 nvm_chan = iwl_nvm_channels;
1749         }
1750
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;
1756         }
1757
1758         if (WARN_ON_ONCE(num_of_ch > NL80211_MAX_SUPP_REG_RULES))
1759                 return ERR_PTR(-EINVAL);
1760
1761         IWL_DEBUG_DEV(dev, IWL_DL_LAR, "building regdom for %d channels\n",
1762                       num_of_ch);
1763
1764         /* build a regdomain rule for every valid channel */
1765         regd = kzalloc(struct_size(regd, reg_rules, num_of_ch), GFP_KERNEL);
1766         if (!regd)
1767                 return ERR_PTR(-ENOMEM);
1768
1769         /* set alpha2 from FW. */
1770         regd->alpha2[0] = fw_mcc >> 8;
1771         regd->alpha2[1] = fw_mcc & 0xff;
1772
1773         /* parse regulatory capability flags */
1774         reg_capa = iwl_get_reg_capa(cap, resp_ver);
1775
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],
1780                                                              band);
1781                 new_rule = false;
1782
1783                 if (!(ch_flags & NVM_CHANNEL_VALID)) {
1784                         iwl_nvm_print_channel_flags(dev, IWL_DL_LAR,
1785                                                     nvm_chan[ch_idx], ch_flags);
1786                         continue;
1787                 }
1788
1789                 reg_rule_flags = iwl_nvm_get_regdom_bw_flags(nvm_chan, ch_idx,
1790                                                              ch_flags, reg_capa,
1791                                                              cfg, uats_enabled);
1792
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) {
1796                         valid_rules++;
1797                         new_rule = true;
1798                 }
1799
1800                 rule = &regd->reg_rules[valid_rules - 1];
1801
1802                 if (new_rule)
1803                         rule->freq_range.start_freq_khz =
1804                                                 MHZ_TO_KHZ(center_freq - 10);
1805
1806                 rule->freq_range.end_freq_khz = MHZ_TO_KHZ(center_freq + 10);
1807
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);
1812
1813                 rule->flags = reg_rule_flags;
1814
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;
1818
1819                 prev_center_freq = center_freq;
1820                 prev_reg_rule_flags = reg_rule_flags;
1821
1822                 iwl_nvm_print_channel_flags(dev, IWL_DL_LAR,
1823                                             nvm_chan[ch_idx], ch_flags);
1824
1825                 if (!(geo_info & GEO_WMM_ETSI_5GHZ_INFO) ||
1826                     band == NL80211_BAND_2GHZ)
1827                         continue;
1828
1829                 reg_query_regdb_wmm(regd->alpha2, center_freq, rule);
1830         }
1831
1832         /*
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.
1839          */
1840         if (!valid_rules) {
1841                 valid_rules = 1;
1842                 rule = &regd->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);
1849         }
1850
1851         regd->n_reg_rules = valid_rules;
1852
1853         /*
1854          * Narrow down regdom for unused regulatory rules to prevent hole
1855          * between reg rules to wmm rules.
1856          */
1857         copy_rd = kmemdup(regd, struct_size(regd, reg_rules, valid_rules),
1858                           GFP_KERNEL);
1859         if (!copy_rd)
1860                 copy_rd = ERR_PTR(-ENOMEM);
1861
1862         kfree(regd);
1863         return copy_rd;
1864 }
1865 IWL_EXPORT_SYMBOL(iwl_parse_nvm_mcc_info);
1866
1867 #define IWL_MAX_NVM_SECTION_SIZE        0x1b58
1868 #define IWL_MAX_EXT_NVM_SECTION_SIZE    0x1ffc
1869 #define MAX_NVM_FILE_LEN        16384
1870
1871 void iwl_nvm_fixups(u32 hw_id, unsigned int section, u8 *data,
1872                     unsigned int len)
1873 {
1874 #define IWL_4165_DEVICE_ID      0x5501
1875 #define NVM_SKU_CAP_MIMO_DISABLE BIT(5)
1876
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);
1882 }
1883 IWL_EXPORT_SYMBOL(iwl_nvm_fixups);
1884
1885 /*
1886  * Reads external NVM from a file into mvm->nvm_sections
1887  *
1888  * HOW TO CREATE THE NVM FILE FORMAT:
1889  * ------------------------------
1890  * 1. create hex file, format:
1891  *      3800 -> header
1892  *      0000 -> header
1893  *      5a40 -> data
1894  *
1895  *   rev - 6 bit (word1)
1896  *   len - 10 bit (word1)
1897  *   id - 4 bit (word2)
1898  *   rsv - 12 bit (word2)
1899  *
1900  * 2. flip 8bits with 8 bits per line to get the right NVM file format
1901  *
1902  * 3. create binary file from the hex file
1903  *
1904  * 4. save as "iNVM_xxx.bin" under /lib/firmware
1905  */
1906 int iwl_read_external_nvm(struct iwl_trans *trans,
1907                           const char *nvm_file_name,
1908                           struct iwl_nvm_section *nvm_sections)
1909 {
1910         int ret, section_size;
1911         u16 section_id;
1912         const struct firmware *fw_entry;
1913         const struct {
1914                 __le16 word1;
1915                 __le16 word2;
1916                 u8 data[];
1917         } *file_sec;
1918         const u8 *eof;
1919         u8 *temp;
1920         int max_section_size;
1921         const __le32 *dword_buff;
1922
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))
1930
1931         IWL_DEBUG_EEPROM(trans->dev, "Read from external NVM\n");
1932
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;
1936         else
1937                 max_section_size = IWL_MAX_EXT_NVM_SECTION_SIZE;
1938
1939         /*
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
1943          * synchronously.
1944          */
1945         ret = request_firmware(&fw_entry, nvm_file_name, trans->dev);
1946         if (ret) {
1947                 IWL_ERR(trans, "ERROR: %s isn't available %d\n",
1948                         nvm_file_name, ret);
1949                 return ret;
1950         }
1951
1952         IWL_INFO(trans, "Loaded NVM file %s (%zu bytes)\n",
1953                  nvm_file_name, fw_entry->size);
1954
1955         if (fw_entry->size > MAX_NVM_FILE_LEN) {
1956                 IWL_ERR(trans, "NVM file too large\n");
1957                 ret = -EINVAL;
1958                 goto out;
1959         }
1960
1961         eof = fw_entry->data + fw_entry->size;
1962         dword_buff = (const __le32 *)fw_entry->data;
1963
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
1968          *
1969          * This header must be skipped when providing the NVM data to the FW.
1970          */
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]));
1978
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) {
1983                         ret = -EFAULT;
1984                         goto out;
1985                 }
1986         } else {
1987                 file_sec = (const void *)fw_entry->data;
1988         }
1989
1990         while (true) {
1991                 if (file_sec->data > eof) {
1992                         IWL_ERR(trans,
1993                                 "ERROR - NVM file too short for section header\n");
1994                         ret = -EINVAL;
1995                         break;
1996                 }
1997
1998                 /* check for EOF marker */
1999                 if (!file_sec->word1 && !file_sec->word2) {
2000                         ret = 0;
2001                         break;
2002                 }
2003
2004                 if (trans->cfg->nvm_type != IWL_NVM_EXT) {
2005                         section_size =
2006                                 2 * NVM_WORD1_LEN(le16_to_cpu(file_sec->word1));
2007                         section_id = NVM_WORD2_ID(le16_to_cpu(file_sec->word2));
2008                 } else {
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));
2013                 }
2014
2015                 if (section_size > max_section_size) {
2016                         IWL_ERR(trans, "ERROR - section too large (%d)\n",
2017                                 section_size);
2018                         ret = -EINVAL;
2019                         break;
2020                 }
2021
2022                 if (!section_size) {
2023                         IWL_ERR(trans, "ERROR - section empty\n");
2024                         ret = -EINVAL;
2025                         break;
2026                 }
2027
2028                 if (file_sec->data + section_size > eof) {
2029                         IWL_ERR(trans,
2030                                 "ERROR - NVM file too short for section (%d bytes)\n",
2031                                 section_size);
2032                         ret = -EINVAL;
2033                         break;
2034                 }
2035
2036                 if (WARN(section_id >= NVM_MAX_NUM_SECTIONS,
2037                          "Invalid NVM section ID %d\n", section_id)) {
2038                         ret = -EINVAL;
2039                         break;
2040                 }
2041
2042                 temp = kmemdup(file_sec->data, section_size, GFP_KERNEL);
2043                 if (!temp) {
2044                         ret = -ENOMEM;
2045                         break;
2046                 }
2047
2048                 iwl_nvm_fixups(trans->hw_id, section_id, temp, section_size);
2049
2050                 kfree(nvm_sections[section_id].data);
2051                 nvm_sections[section_id].data = temp;
2052                 nvm_sections[section_id].length = section_size;
2053
2054                 /* advance to the next section */
2055                 file_sec = (const void *)(file_sec->data + section_size);
2056         }
2057 out:
2058         release_firmware(fw_entry);
2059         return ret;
2060 }
2061 IWL_EXPORT_SYMBOL(iwl_read_external_nvm);
2062
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)
2066 {
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,
2071                 .data = { &cmd, },
2072                 .len = { sizeof(cmd) },
2073                 .id = WIDE_ID(REGULATORY_AND_NVM_GROUP, NVM_GET_INFO)
2074         };
2075         int  ret;
2076         bool empty_otp;
2077         u32 mac_flags;
2078         u32 sbands_flags = 0;
2079         u8 tx_ant;
2080         u8 rx_ant;
2081
2082         /*
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.
2087          */
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;
2094
2095         ret = iwl_trans_send_cmd(trans, &hcmd);
2096         if (ret)
2097                 return ERR_PTR(ret);
2098
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))) {
2102                 ret = -EINVAL;
2103                 goto out;
2104         }
2105
2106         rsp = (void *)hcmd.resp_pkt->data;
2107         empty_otp = !!(le32_to_cpu(rsp->general.flags) &
2108                        NVM_GENERAL_FLAGS_EMPTY_OTP);
2109         if (empty_otp)
2110                 IWL_INFO(trans, "OTP is empty\n");
2111
2112         nvm = kzalloc(struct_size(nvm, channels, IWL_NUM_CHANNELS), GFP_KERNEL);
2113         if (!nvm) {
2114                 ret = -ENOMEM;
2115                 goto out;
2116         }
2117
2118         iwl_set_hw_address_from_csr(trans, nvm);
2119         /* TODO: if platform NVM has MAC address - override it here */
2120
2121         if (!is_valid_ether_addr(nvm->hw_addr)) {
2122                 IWL_ERR(trans, "no valid mac address was found\n");
2123                 ret = -EINVAL;
2124                 goto err_free;
2125         }
2126
2127         IWL_INFO(trans, "base HW address: %pM\n", nvm->hw_addr);
2128
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)
2133                 IWL_WARN(trans,
2134                          "Firmware declares no reserved mac addresses. OTP is empty: %d\n",
2135                          empty_otp);
2136
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;
2153
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);
2157
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;
2163         }
2164
2165         rsp_v3 = (void *)rsp;
2166         channel_profile = v4 ? (void *)rsp->regulatory.channel_profile :
2167                           (void *)rsp_v3->regulatory.channel_profile;
2168
2169         tx_ant = nvm->valid_tx_ant & fw->valid_tx_ant;
2170         rx_ant = nvm->valid_rx_ant & fw->valid_rx_ant;
2171
2172         if (set_tx_ant)
2173                 tx_ant &= set_tx_ant;
2174         if (set_rx_ant)
2175                 rx_ant &= set_rx_ant;
2176
2177         iwl_init_sbands(trans, nvm, channel_profile, tx_ant, rx_ant,
2178                         sbands_flags, v4, fw);
2179
2180         iwl_free_resp(&hcmd);
2181         return nvm;
2182
2183 err_free:
2184         kfree(nvm);
2185 out:
2186         iwl_free_resp(&hcmd);
2187         return ERR_PTR(ret);
2188 }
2189 IWL_EXPORT_SYMBOL(iwl_get_nvm);
This page took 0.169034 seconds and 4 git commands to generate.