1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63#include <linux/types.h>
64#include <linux/slab.h>
65#include <linux/export.h>
66#include <linux/etherdevice.h>
67#include <linux/pci.h>
68#include <linux/firmware.h>
69
70#include "iwl-drv.h"
71#include "iwl-modparams.h"
72#include "iwl-nvm-parse.h"
73#include "iwl-prph.h"
74#include "iwl-io.h"
75#include "iwl-csr.h"
76#include "fw/acpi.h"
77#include "fw/api/nvm-reg.h"
78#include "fw/api/commands.h"
79#include "fw/api/cmdhdr.h"
80#include "fw/img.h"
81
82
83enum nvm_offsets {
84
85 SUBSYSTEM_ID = 0x0A,
86 HW_ADDR = 0x15,
87
88
89 NVM_SW_SECTION = 0x1C0,
90 NVM_VERSION = 0,
91 RADIO_CFG = 1,
92 SKU = 2,
93 N_HW_ADDRS = 3,
94 NVM_CHANNELS = 0x1E0 - NVM_SW_SECTION,
95
96
97 NVM_CALIB_SECTION = 0x2B8,
98 XTAL_CALIB = 0x316 - NVM_CALIB_SECTION,
99
100
101 NVM_CHANNELS_SDP = 0,
102};
103
104enum ext_nvm_offsets {
105
106 MAC_ADDRESS_OVERRIDE_EXT_NVM = 1,
107
108
109 NVM_VERSION_EXT_NVM = 0,
110 RADIO_CFG_FAMILY_EXT_NVM = 0,
111 SKU_FAMILY_8000 = 2,
112 N_HW_ADDRS_FAMILY_8000 = 3,
113
114
115 NVM_CHANNELS_EXTENDED = 0,
116 NVM_LAR_OFFSET_OLD = 0x4C7,
117 NVM_LAR_OFFSET = 0x507,
118 NVM_LAR_ENABLED = 0x7,
119};
120
121
122enum nvm_sku_bits {
123 NVM_SKU_CAP_BAND_24GHZ = BIT(0),
124 NVM_SKU_CAP_BAND_52GHZ = BIT(1),
125 NVM_SKU_CAP_11N_ENABLE = BIT(2),
126 NVM_SKU_CAP_11AC_ENABLE = BIT(3),
127 NVM_SKU_CAP_MIMO_DISABLE = BIT(5),
128};
129
130
131
132
133static const u16 iwl_nvm_channels[] = {
134
135 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
136
137 36, 40, 44 , 48, 52, 56, 60, 64,
138 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144,
139 149, 153, 157, 161, 165
140};
141
142static const u16 iwl_ext_nvm_channels[] = {
143
144 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
145
146 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92,
147 96, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144,
148 149, 153, 157, 161, 165, 169, 173, 177, 181
149};
150
151static const u16 iwl_uhb_nvm_channels[] = {
152
153 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
154
155 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92,
156 96, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144,
157 149, 153, 157, 161, 165, 169, 173, 177, 181,
158
159 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 233, 237, 241,
160 245, 249, 253, 257, 261, 265, 269, 273, 277, 281, 285, 289, 293, 297,
161 301, 305, 309, 313, 317, 321, 325, 329, 333, 337, 341, 345, 349, 353,
162 357, 361, 365, 369, 373, 377, 381, 385, 389, 393, 397, 401, 405, 409,
163 413, 417, 421
164};
165
166#define IWL_NVM_NUM_CHANNELS ARRAY_SIZE(iwl_nvm_channels)
167#define IWL_NVM_NUM_CHANNELS_EXT ARRAY_SIZE(iwl_ext_nvm_channels)
168#define IWL_NVM_NUM_CHANNELS_UHB ARRAY_SIZE(iwl_uhb_nvm_channels)
169#define NUM_2GHZ_CHANNELS 14
170#define FIRST_2GHZ_HT_MINUS 5
171#define LAST_2GHZ_HT_PLUS 9
172#define N_HW_ADDR_MASK 0xF
173
174
175static struct ieee80211_rate iwl_cfg80211_rates[] = {
176 { .bitrate = 1 * 10, .hw_value = 0, .hw_value_short = 0, },
177 { .bitrate = 2 * 10, .hw_value = 1, .hw_value_short = 1,
178 .flags = IEEE80211_RATE_SHORT_PREAMBLE, },
179 { .bitrate = 5.5 * 10, .hw_value = 2, .hw_value_short = 2,
180 .flags = IEEE80211_RATE_SHORT_PREAMBLE, },
181 { .bitrate = 11 * 10, .hw_value = 3, .hw_value_short = 3,
182 .flags = IEEE80211_RATE_SHORT_PREAMBLE, },
183 { .bitrate = 6 * 10, .hw_value = 4, .hw_value_short = 4, },
184 { .bitrate = 9 * 10, .hw_value = 5, .hw_value_short = 5, },
185 { .bitrate = 12 * 10, .hw_value = 6, .hw_value_short = 6, },
186 { .bitrate = 18 * 10, .hw_value = 7, .hw_value_short = 7, },
187 { .bitrate = 24 * 10, .hw_value = 8, .hw_value_short = 8, },
188 { .bitrate = 36 * 10, .hw_value = 9, .hw_value_short = 9, },
189 { .bitrate = 48 * 10, .hw_value = 10, .hw_value_short = 10, },
190 { .bitrate = 54 * 10, .hw_value = 11, .hw_value_short = 11, },
191};
192#define RATES_24_OFFS 0
193#define N_RATES_24 ARRAY_SIZE(iwl_cfg80211_rates)
194#define RATES_52_OFFS 4
195#define N_RATES_52 (N_RATES_24 - RATES_52_OFFS)
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213enum iwl_nvm_channel_flags {
214 NVM_CHANNEL_VALID = BIT(0),
215 NVM_CHANNEL_IBSS = BIT(1),
216 NVM_CHANNEL_ACTIVE = BIT(3),
217 NVM_CHANNEL_RADAR = BIT(4),
218 NVM_CHANNEL_INDOOR_ONLY = BIT(5),
219 NVM_CHANNEL_GO_CONCURRENT = BIT(6),
220 NVM_CHANNEL_UNIFORM = BIT(7),
221 NVM_CHANNEL_20MHZ = BIT(8),
222 NVM_CHANNEL_40MHZ = BIT(9),
223 NVM_CHANNEL_80MHZ = BIT(10),
224 NVM_CHANNEL_160MHZ = BIT(11),
225 NVM_CHANNEL_DC_HIGH = BIT(12),
226};
227
228static inline void iwl_nvm_print_channel_flags(struct device *dev, u32 level,
229 int chan, u32 flags)
230{
231#define CHECK_AND_PRINT_I(x) \
232 ((flags & NVM_CHANNEL_##x) ? " " #x : "")
233
234 if (!(flags & NVM_CHANNEL_VALID)) {
235 IWL_DEBUG_DEV(dev, level, "Ch. %d: 0x%x: No traffic\n",
236 chan, flags);
237 return;
238 }
239
240
241 IWL_DEBUG_DEV(dev, level,
242 "Ch. %d: 0x%x:%s%s%s%s%s%s%s%s%s%s%s%s\n",
243 chan, flags,
244 CHECK_AND_PRINT_I(VALID),
245 CHECK_AND_PRINT_I(IBSS),
246 CHECK_AND_PRINT_I(ACTIVE),
247 CHECK_AND_PRINT_I(RADAR),
248 CHECK_AND_PRINT_I(INDOOR_ONLY),
249 CHECK_AND_PRINT_I(GO_CONCURRENT),
250 CHECK_AND_PRINT_I(UNIFORM),
251 CHECK_AND_PRINT_I(20MHZ),
252 CHECK_AND_PRINT_I(40MHZ),
253 CHECK_AND_PRINT_I(80MHZ),
254 CHECK_AND_PRINT_I(160MHZ),
255 CHECK_AND_PRINT_I(DC_HIGH));
256#undef CHECK_AND_PRINT_I
257}
258
259static u32 iwl_get_channel_flags(u8 ch_num, int ch_idx, bool is_5ghz,
260 u32 nvm_flags, const struct iwl_cfg *cfg)
261{
262 u32 flags = IEEE80211_CHAN_NO_HT40;
263
264 if (!is_5ghz && (nvm_flags & NVM_CHANNEL_40MHZ)) {
265 if (ch_num <= LAST_2GHZ_HT_PLUS)
266 flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
267 if (ch_num >= FIRST_2GHZ_HT_MINUS)
268 flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
269 } else if (nvm_flags & NVM_CHANNEL_40MHZ) {
270 if ((ch_idx - NUM_2GHZ_CHANNELS) % 2 == 0)
271 flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
272 else
273 flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
274 }
275 if (!(nvm_flags & NVM_CHANNEL_80MHZ))
276 flags |= IEEE80211_CHAN_NO_80MHZ;
277 if (!(nvm_flags & NVM_CHANNEL_160MHZ))
278 flags |= IEEE80211_CHAN_NO_160MHZ;
279
280 if (!(nvm_flags & NVM_CHANNEL_IBSS))
281 flags |= IEEE80211_CHAN_NO_IR;
282
283 if (!(nvm_flags & NVM_CHANNEL_ACTIVE))
284 flags |= IEEE80211_CHAN_NO_IR;
285
286 if (nvm_flags & NVM_CHANNEL_RADAR)
287 flags |= IEEE80211_CHAN_RADAR;
288
289 if (nvm_flags & NVM_CHANNEL_INDOOR_ONLY)
290 flags |= IEEE80211_CHAN_INDOOR_ONLY;
291
292
293
294
295 if ((nvm_flags & NVM_CHANNEL_GO_CONCURRENT) &&
296 (flags & IEEE80211_CHAN_NO_IR))
297 flags |= IEEE80211_CHAN_IR_CONCURRENT;
298
299 return flags;
300}
301
302static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
303 struct iwl_nvm_data *data,
304 const void * const nvm_ch_flags,
305 u32 sbands_flags, bool v4)
306{
307 int ch_idx;
308 int n_channels = 0;
309 struct ieee80211_channel *channel;
310 u32 ch_flags;
311 int num_of_ch, num_2ghz_channels = NUM_2GHZ_CHANNELS;
312 const u16 *nvm_chan;
313
314 if (cfg->uhb_supported) {
315 num_of_ch = IWL_NVM_NUM_CHANNELS_UHB;
316 nvm_chan = iwl_uhb_nvm_channels;
317 } else if (cfg->nvm_type == IWL_NVM_EXT) {
318 num_of_ch = IWL_NVM_NUM_CHANNELS_EXT;
319 nvm_chan = iwl_ext_nvm_channels;
320 } else {
321 num_of_ch = IWL_NVM_NUM_CHANNELS;
322 nvm_chan = iwl_nvm_channels;
323 }
324
325 for (ch_idx = 0; ch_idx < num_of_ch; ch_idx++) {
326 bool is_5ghz = (ch_idx >= num_2ghz_channels);
327
328 if (v4)
329 ch_flags =
330 __le32_to_cpup((__le32 *)nvm_ch_flags + ch_idx);
331 else
332 ch_flags =
333 __le16_to_cpup((__le16 *)nvm_ch_flags + ch_idx);
334
335 if (is_5ghz && !data->sku_cap_band_52ghz_enable)
336 continue;
337
338
339 if ((sbands_flags & IWL_NVM_SBANDS_FLAGS_NO_WIDE_IN_5GHZ) &&
340 is_5ghz) {
341 ch_flags &= ~(NVM_CHANNEL_40MHZ |
342 NVM_CHANNEL_80MHZ |
343 NVM_CHANNEL_160MHZ);
344 }
345
346 if (ch_flags & NVM_CHANNEL_160MHZ)
347 data->vht160_supported = true;
348
349 if (!(sbands_flags & IWL_NVM_SBANDS_FLAGS_LAR) &&
350 !(ch_flags & NVM_CHANNEL_VALID)) {
351
352
353
354
355
356 iwl_nvm_print_channel_flags(dev, IWL_DL_EEPROM,
357 nvm_chan[ch_idx], ch_flags);
358 continue;
359 }
360
361 channel = &data->channels[n_channels];
362 n_channels++;
363
364 channel->hw_value = nvm_chan[ch_idx];
365 channel->band = is_5ghz ?
366 NL80211_BAND_5GHZ : NL80211_BAND_2GHZ;
367 channel->center_freq =
368 ieee80211_channel_to_frequency(
369 channel->hw_value, channel->band);
370
371
372
373
374
375
376
377 channel->max_power = IWL_DEFAULT_MAX_TX_POWER;
378
379
380 if (!(sbands_flags & IWL_NVM_SBANDS_FLAGS_LAR))
381 channel->flags = iwl_get_channel_flags(nvm_chan[ch_idx],
382 ch_idx, is_5ghz,
383 ch_flags, cfg);
384 else
385 channel->flags = 0;
386
387 iwl_nvm_print_channel_flags(dev, IWL_DL_EEPROM,
388 channel->hw_value, ch_flags);
389 IWL_DEBUG_EEPROM(dev, "Ch. %d: %ddBm\n",
390 channel->hw_value, channel->max_power);
391 }
392
393 return n_channels;
394}
395
396static void iwl_init_vht_hw_capab(const struct iwl_cfg *cfg,
397 struct iwl_nvm_data *data,
398 struct ieee80211_sta_vht_cap *vht_cap,
399 u8 tx_chains, u8 rx_chains)
400{
401 int num_rx_ants = num_of_ant(rx_chains);
402 int num_tx_ants = num_of_ant(tx_chains);
403 unsigned int max_ampdu_exponent = (cfg->max_vht_ampdu_exponent ?:
404 IEEE80211_VHT_MAX_AMPDU_1024K);
405
406 vht_cap->vht_supported = true;
407
408 vht_cap->cap = IEEE80211_VHT_CAP_SHORT_GI_80 |
409 IEEE80211_VHT_CAP_RXSTBC_1 |
410 IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
411 3 << IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT |
412 max_ampdu_exponent <<
413 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
414
415 if (data->vht160_supported)
416 vht_cap->cap |= IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
417 IEEE80211_VHT_CAP_SHORT_GI_160;
418
419 if (cfg->vht_mu_mimo_supported)
420 vht_cap->cap |= IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
421
422 if (cfg->ht_params->ldpc)
423 vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC;
424
425 if (data->sku_cap_mimo_disabled) {
426 num_rx_ants = 1;
427 num_tx_ants = 1;
428 }
429
430 if (num_tx_ants > 1)
431 vht_cap->cap |= IEEE80211_VHT_CAP_TXSTBC;
432 else
433 vht_cap->cap |= IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN;
434
435 switch (iwlwifi_mod_params.amsdu_size) {
436 case IWL_AMSDU_DEF:
437 if (cfg->mq_rx_supported)
438 vht_cap->cap |=
439 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454;
440 else
441 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895;
442 break;
443 case IWL_AMSDU_2K:
444 if (cfg->mq_rx_supported)
445 vht_cap->cap |=
446 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454;
447 else
448 WARN(1, "RB size of 2K is not supported by this device\n");
449 break;
450 case IWL_AMSDU_4K:
451 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895;
452 break;
453 case IWL_AMSDU_8K:
454 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991;
455 break;
456 case IWL_AMSDU_12K:
457 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454;
458 break;
459 default:
460 break;
461 }
462
463 vht_cap->vht_mcs.rx_mcs_map =
464 cpu_to_le16(IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 |
465 IEEE80211_VHT_MCS_SUPPORT_0_9 << 2 |
466 IEEE80211_VHT_MCS_NOT_SUPPORTED << 4 |
467 IEEE80211_VHT_MCS_NOT_SUPPORTED << 6 |
468 IEEE80211_VHT_MCS_NOT_SUPPORTED << 8 |
469 IEEE80211_VHT_MCS_NOT_SUPPORTED << 10 |
470 IEEE80211_VHT_MCS_NOT_SUPPORTED << 12 |
471 IEEE80211_VHT_MCS_NOT_SUPPORTED << 14);
472
473 if (num_rx_ants == 1 || cfg->rx_with_siso_diversity) {
474 vht_cap->cap |= IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN;
475
476 vht_cap->vht_mcs.rx_mcs_map |=
477 cpu_to_le16(IEEE80211_VHT_MCS_NOT_SUPPORTED << 2);
478 }
479
480 vht_cap->vht_mcs.tx_mcs_map = vht_cap->vht_mcs.rx_mcs_map;
481
482 vht_cap->vht_mcs.tx_highest |=
483 cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE);
484}
485
486static struct ieee80211_sband_iftype_data iwl_he_capa[] = {
487 {
488 .types_mask = BIT(NL80211_IFTYPE_STATION),
489 .he_cap = {
490 .has_he = true,
491 .he_cap_elem = {
492 .mac_cap_info[0] =
493 IEEE80211_HE_MAC_CAP0_HTC_HE |
494 IEEE80211_HE_MAC_CAP0_TWT_REQ,
495 .mac_cap_info[1] =
496 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US |
497 IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
498 .mac_cap_info[2] =
499 IEEE80211_HE_MAC_CAP2_32BIT_BA_BITMAP |
500 IEEE80211_HE_MAC_CAP2_ACK_EN,
501 .mac_cap_info[3] =
502 IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
503 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
504 .mac_cap_info[4] =
505 IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU |
506 IEEE80211_HE_MAC_CAP4_MULTI_TID_AGG_TX_QOS_B39,
507 .mac_cap_info[5] =
508 IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B40 |
509 IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B41 |
510 IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
511 IEEE80211_HE_MAC_CAP5_HE_DYNAMIC_SM_PS |
512 IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX,
513 .phy_cap_info[0] =
514 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
515 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
516 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G,
517 .phy_cap_info[1] =
518 IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
519 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
520 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD,
521 .phy_cap_info[2] =
522 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US,
523 .phy_cap_info[3] =
524 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_NO_DCM |
525 IEEE80211_HE_PHY_CAP3_DCM_MAX_TX_NSS_1 |
526 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_NO_DCM |
527 IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_1,
528 .phy_cap_info[4] =
529 IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE |
530 IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_8 |
531 IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_8,
532 .phy_cap_info[5] =
533 IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_2 |
534 IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_2,
535 .phy_cap_info[6] =
536 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT,
537 .phy_cap_info[7] =
538 IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_AR |
539 IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI |
540 IEEE80211_HE_PHY_CAP7_MAX_NC_1,
541 .phy_cap_info[8] =
542 IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
543 IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
544 IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
545 IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU |
546 IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_2x996,
547 .phy_cap_info[9] =
548 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
549 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
550 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB |
551 IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_RESERVED,
552 },
553
554
555
556
557
558 .he_mcs_nss_supp = {
559 .rx_mcs_80 = cpu_to_le16(0xfffa),
560 .tx_mcs_80 = cpu_to_le16(0xfffa),
561 .rx_mcs_160 = cpu_to_le16(0xfffa),
562 .tx_mcs_160 = cpu_to_le16(0xfffa),
563 .rx_mcs_80p80 = cpu_to_le16(0xffff),
564 .tx_mcs_80p80 = cpu_to_le16(0xffff),
565 },
566
567
568
569
570 .ppe_thres = {0x61, 0x1c, 0xc7, 0x71},
571 },
572 },
573 {
574 .types_mask = BIT(NL80211_IFTYPE_AP),
575 .he_cap = {
576 .has_he = true,
577 .he_cap_elem = {
578 .mac_cap_info[0] =
579 IEEE80211_HE_MAC_CAP0_HTC_HE,
580 .mac_cap_info[1] =
581 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US |
582 IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
583 .mac_cap_info[2] =
584 IEEE80211_HE_MAC_CAP2_BSR |
585 IEEE80211_HE_MAC_CAP2_ACK_EN,
586 .mac_cap_info[3] =
587 IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
588 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
589 .mac_cap_info[4] =
590 IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU,
591 .mac_cap_info[5] =
592 IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU,
593 .phy_cap_info[0] =
594 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
595 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
596 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G,
597 .phy_cap_info[1] =
598 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD,
599 .phy_cap_info[2] =
600 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US,
601 .phy_cap_info[3] =
602 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_NO_DCM |
603 IEEE80211_HE_PHY_CAP3_DCM_MAX_TX_NSS_1 |
604 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_NO_DCM |
605 IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_1,
606 .phy_cap_info[4] =
607 IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE |
608 IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_8 |
609 IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_8,
610 .phy_cap_info[5] =
611 IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_2 |
612 IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_2,
613 .phy_cap_info[6] =
614 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT,
615 .phy_cap_info[7] =
616 IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI |
617 IEEE80211_HE_PHY_CAP7_MAX_NC_1,
618 .phy_cap_info[8] =
619 IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
620 IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
621 IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
622 IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU |
623 IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_2x996,
624 .phy_cap_info[9] =
625 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
626 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB |
627 IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_RESERVED,
628 },
629
630
631
632
633
634 .he_mcs_nss_supp = {
635 .rx_mcs_80 = cpu_to_le16(0xfffa),
636 .tx_mcs_80 = cpu_to_le16(0xfffa),
637 .rx_mcs_160 = cpu_to_le16(0xfffa),
638 .tx_mcs_160 = cpu_to_le16(0xfffa),
639 .rx_mcs_80p80 = cpu_to_le16(0xffff),
640 .tx_mcs_80p80 = cpu_to_le16(0xffff),
641 },
642
643
644
645
646 .ppe_thres = {0x61, 0x1c, 0xc7, 0x71},
647 },
648 },
649};
650
651static void iwl_init_he_hw_capab(struct ieee80211_supported_band *sband,
652 u8 tx_chains, u8 rx_chains)
653{
654 sband->iftype_data = iwl_he_capa;
655 sband->n_iftype_data = ARRAY_SIZE(iwl_he_capa);
656
657
658 if ((tx_chains & rx_chains) != ANT_AB) {
659 int i;
660
661 for (i = 0; i < sband->n_iftype_data; i++) {
662 iwl_he_capa[i].he_cap.he_cap_elem.phy_cap_info[1] &=
663 ~IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS;
664 iwl_he_capa[i].he_cap.he_cap_elem.phy_cap_info[2] &=
665 ~IEEE80211_HE_PHY_CAP2_MIDAMBLE_RX_TX_MAX_NSTS;
666 iwl_he_capa[i].he_cap.he_cap_elem.phy_cap_info[7] &=
667 ~IEEE80211_HE_PHY_CAP7_MAX_NC_MASK;
668 }
669 }
670}
671
672static void iwl_init_sbands(struct device *dev, const struct iwl_cfg *cfg,
673 struct iwl_nvm_data *data,
674 const void *nvm_ch_flags, u8 tx_chains,
675 u8 rx_chains, u32 sbands_flags, bool v4)
676{
677 int n_channels;
678 int n_used = 0;
679 struct ieee80211_supported_band *sband;
680
681 n_channels = iwl_init_channel_map(dev, cfg, data, nvm_ch_flags,
682 sbands_flags, v4);
683 sband = &data->bands[NL80211_BAND_2GHZ];
684 sband->band = NL80211_BAND_2GHZ;
685 sband->bitrates = &iwl_cfg80211_rates[RATES_24_OFFS];
686 sband->n_bitrates = N_RATES_24;
687 n_used += iwl_init_sband_channels(data, sband, n_channels,
688 NL80211_BAND_2GHZ);
689 iwl_init_ht_hw_capab(cfg, data, &sband->ht_cap, NL80211_BAND_2GHZ,
690 tx_chains, rx_chains);
691
692 if (data->sku_cap_11ax_enable && !iwlwifi_mod_params.disable_11ax)
693 iwl_init_he_hw_capab(sband, tx_chains, rx_chains);
694
695 sband = &data->bands[NL80211_BAND_5GHZ];
696 sband->band = NL80211_BAND_5GHZ;
697 sband->bitrates = &iwl_cfg80211_rates[RATES_52_OFFS];
698 sband->n_bitrates = N_RATES_52;
699 n_used += iwl_init_sband_channels(data, sband, n_channels,
700 NL80211_BAND_5GHZ);
701 iwl_init_ht_hw_capab(cfg, data, &sband->ht_cap, NL80211_BAND_5GHZ,
702 tx_chains, rx_chains);
703 if (data->sku_cap_11ac_enable && !iwlwifi_mod_params.disable_11ac)
704 iwl_init_vht_hw_capab(cfg, data, &sband->vht_cap,
705 tx_chains, rx_chains);
706
707 if (data->sku_cap_11ax_enable && !iwlwifi_mod_params.disable_11ax)
708 iwl_init_he_hw_capab(sband, tx_chains, rx_chains);
709
710 if (n_channels != n_used)
711 IWL_ERR_DEV(dev, "NVM: used only %d of %d channels\n",
712 n_used, n_channels);
713}
714
715static int iwl_get_sku(const struct iwl_cfg *cfg, const __le16 *nvm_sw,
716 const __le16 *phy_sku)
717{
718 if (cfg->nvm_type != IWL_NVM_EXT)
719 return le16_to_cpup(nvm_sw + SKU);
720
721 return le32_to_cpup((__le32 *)(phy_sku + SKU_FAMILY_8000));
722}
723
724static int iwl_get_nvm_version(const struct iwl_cfg *cfg, const __le16 *nvm_sw)
725{
726 if (cfg->nvm_type != IWL_NVM_EXT)
727 return le16_to_cpup(nvm_sw + NVM_VERSION);
728 else
729 return le32_to_cpup((__le32 *)(nvm_sw +
730 NVM_VERSION_EXT_NVM));
731}
732
733static int iwl_get_radio_cfg(const struct iwl_cfg *cfg, const __le16 *nvm_sw,
734 const __le16 *phy_sku)
735{
736 if (cfg->nvm_type != IWL_NVM_EXT)
737 return le16_to_cpup(nvm_sw + RADIO_CFG);
738
739 return le32_to_cpup((__le32 *)(phy_sku + RADIO_CFG_FAMILY_EXT_NVM));
740
741}
742
743static int iwl_get_n_hw_addrs(const struct iwl_cfg *cfg, const __le16 *nvm_sw)
744{
745 int n_hw_addr;
746
747 if (cfg->nvm_type != IWL_NVM_EXT)
748 return le16_to_cpup(nvm_sw + N_HW_ADDRS);
749
750 n_hw_addr = le32_to_cpup((__le32 *)(nvm_sw + N_HW_ADDRS_FAMILY_8000));
751
752 return n_hw_addr & N_HW_ADDR_MASK;
753}
754
755static void iwl_set_radio_cfg(const struct iwl_cfg *cfg,
756 struct iwl_nvm_data *data,
757 u32 radio_cfg)
758{
759 if (cfg->nvm_type != IWL_NVM_EXT) {
760 data->radio_cfg_type = NVM_RF_CFG_TYPE_MSK(radio_cfg);
761 data->radio_cfg_step = NVM_RF_CFG_STEP_MSK(radio_cfg);
762 data->radio_cfg_dash = NVM_RF_CFG_DASH_MSK(radio_cfg);
763 data->radio_cfg_pnum = NVM_RF_CFG_PNUM_MSK(radio_cfg);
764 return;
765 }
766
767
768 data->radio_cfg_type = EXT_NVM_RF_CFG_TYPE_MSK(radio_cfg);
769 data->radio_cfg_step = EXT_NVM_RF_CFG_STEP_MSK(radio_cfg);
770 data->radio_cfg_dash = EXT_NVM_RF_CFG_DASH_MSK(radio_cfg);
771 data->radio_cfg_pnum = EXT_NVM_RF_CFG_FLAVOR_MSK(radio_cfg);
772 data->valid_tx_ant = EXT_NVM_RF_CFG_TX_ANT_MSK(radio_cfg);
773 data->valid_rx_ant = EXT_NVM_RF_CFG_RX_ANT_MSK(radio_cfg);
774}
775
776static void iwl_flip_hw_address(__le32 mac_addr0, __le32 mac_addr1, u8 *dest)
777{
778 const u8 *hw_addr;
779
780 hw_addr = (const u8 *)&mac_addr0;
781 dest[0] = hw_addr[3];
782 dest[1] = hw_addr[2];
783 dest[2] = hw_addr[1];
784 dest[3] = hw_addr[0];
785
786 hw_addr = (const u8 *)&mac_addr1;
787 dest[4] = hw_addr[1];
788 dest[5] = hw_addr[0];
789}
790
791static void iwl_set_hw_address_from_csr(struct iwl_trans *trans,
792 struct iwl_nvm_data *data)
793{
794 __le32 mac_addr0 =
795 cpu_to_le32(iwl_read32(trans,
796 trans->cfg->csr->mac_addr0_strap));
797 __le32 mac_addr1 =
798 cpu_to_le32(iwl_read32(trans,
799 trans->cfg->csr->mac_addr1_strap));
800
801 iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr);
802
803
804
805
806 if (is_valid_ether_addr(data->hw_addr))
807 return;
808
809 mac_addr0 = cpu_to_le32(iwl_read32(trans,
810 trans->cfg->csr->mac_addr0_otp));
811 mac_addr1 = cpu_to_le32(iwl_read32(trans,
812 trans->cfg->csr->mac_addr1_otp));
813
814 iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr);
815}
816
817static void iwl_set_hw_address_family_8000(struct iwl_trans *trans,
818 const struct iwl_cfg *cfg,
819 struct iwl_nvm_data *data,
820 const __le16 *mac_override,
821 const __be16 *nvm_hw)
822{
823 const u8 *hw_addr;
824
825 if (mac_override) {
826 static const u8 reserved_mac[] = {
827 0x02, 0xcc, 0xaa, 0xff, 0xee, 0x00
828 };
829
830 hw_addr = (const u8 *)(mac_override +
831 MAC_ADDRESS_OVERRIDE_EXT_NVM);
832
833
834
835
836
837 memcpy(data->hw_addr, hw_addr, ETH_ALEN);
838
839
840
841
842
843 if (is_valid_ether_addr(data->hw_addr) &&
844 memcmp(reserved_mac, hw_addr, ETH_ALEN) != 0)
845 return;
846
847 IWL_ERR(trans,
848 "mac address from nvm override section is not valid\n");
849 }
850
851 if (nvm_hw) {
852
853 __le32 mac_addr0 = cpu_to_le32(iwl_trans_read_prph(trans,
854 WFMP_MAC_ADDR_0));
855 __le32 mac_addr1 = cpu_to_le32(iwl_trans_read_prph(trans,
856 WFMP_MAC_ADDR_1));
857
858 iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr);
859
860 return;
861 }
862
863 IWL_ERR(trans, "mac address is not found\n");
864}
865
866static int iwl_set_hw_address(struct iwl_trans *trans,
867 const struct iwl_cfg *cfg,
868 struct iwl_nvm_data *data, const __be16 *nvm_hw,
869 const __le16 *mac_override)
870{
871 if (cfg->mac_addr_from_csr) {
872 iwl_set_hw_address_from_csr(trans, data);
873 } else if (cfg->nvm_type != IWL_NVM_EXT) {
874 const u8 *hw_addr = (const u8 *)(nvm_hw + HW_ADDR);
875
876
877 data->hw_addr[0] = hw_addr[1];
878 data->hw_addr[1] = hw_addr[0];
879 data->hw_addr[2] = hw_addr[3];
880 data->hw_addr[3] = hw_addr[2];
881 data->hw_addr[4] = hw_addr[5];
882 data->hw_addr[5] = hw_addr[4];
883 } else {
884 iwl_set_hw_address_family_8000(trans, cfg, data,
885 mac_override, nvm_hw);
886 }
887
888 if (!is_valid_ether_addr(data->hw_addr)) {
889 IWL_ERR(trans, "no valid mac address was found\n");
890 return -EINVAL;
891 }
892
893 IWL_INFO(trans, "base HW address: %pM\n", data->hw_addr);
894
895 return 0;
896}
897
898static bool
899iwl_nvm_no_wide_in_5ghz(struct device *dev, const struct iwl_cfg *cfg,
900 const __be16 *nvm_hw)
901{
902
903
904
905
906
907
908
909
910
911 if (cfg->device_family == IWL_DEVICE_FAMILY_7000) {
912
913
914
915
916 u16 subsystem_id = be16_to_cpup(nvm_hw + SUBSYSTEM_ID);
917 u8 sku = (subsystem_id & 0x1e) >> 1;
918
919 if (sku == 5 || sku == 9) {
920 IWL_DEBUG_EEPROM(dev,
921 "disabling wide channels in 5GHz (0x%0x %d)\n",
922 subsystem_id, sku);
923 return true;
924 }
925 }
926
927 return false;
928}
929
930struct iwl_nvm_data *
931iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg,
932 const __be16 *nvm_hw, const __le16 *nvm_sw,
933 const __le16 *nvm_calib, const __le16 *regulatory,
934 const __le16 *mac_override, const __le16 *phy_sku,
935 u8 tx_chains, u8 rx_chains, bool lar_fw_supported)
936{
937 struct device *dev = trans->dev;
938 struct iwl_nvm_data *data;
939 bool lar_enabled;
940 u32 sku, radio_cfg;
941 u32 sbands_flags = 0;
942 u16 lar_config;
943 const __le16 *ch_section;
944
945 if (cfg->nvm_type != IWL_NVM_EXT)
946 data = kzalloc(struct_size(data, channels,
947 IWL_NVM_NUM_CHANNELS),
948 GFP_KERNEL);
949 else
950 data = kzalloc(struct_size(data, channels,
951 IWL_NVM_NUM_CHANNELS_EXT),
952 GFP_KERNEL);
953 if (!data)
954 return NULL;
955
956 data->nvm_version = iwl_get_nvm_version(cfg, nvm_sw);
957
958 radio_cfg = iwl_get_radio_cfg(cfg, nvm_sw, phy_sku);
959 iwl_set_radio_cfg(cfg, data, radio_cfg);
960 if (data->valid_tx_ant)
961 tx_chains &= data->valid_tx_ant;
962 if (data->valid_rx_ant)
963 rx_chains &= data->valid_rx_ant;
964
965 sku = iwl_get_sku(cfg, nvm_sw, phy_sku);
966 data->sku_cap_band_24ghz_enable = sku & NVM_SKU_CAP_BAND_24GHZ;
967 data->sku_cap_band_52ghz_enable = sku & NVM_SKU_CAP_BAND_52GHZ;
968 data->sku_cap_11n_enable = sku & NVM_SKU_CAP_11N_ENABLE;
969 if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_ALL)
970 data->sku_cap_11n_enable = false;
971 data->sku_cap_11ac_enable = data->sku_cap_11n_enable &&
972 (sku & NVM_SKU_CAP_11AC_ENABLE);
973 data->sku_cap_mimo_disabled = sku & NVM_SKU_CAP_MIMO_DISABLE;
974
975 data->n_hw_addrs = iwl_get_n_hw_addrs(cfg, nvm_sw);
976
977 if (cfg->nvm_type != IWL_NVM_EXT) {
978
979 if (!nvm_calib) {
980 IWL_ERR(trans,
981 "Can't parse empty Calib NVM sections\n");
982 kfree(data);
983 return NULL;
984 }
985
986 ch_section = cfg->nvm_type == IWL_NVM_SDP ?
987 ®ulatory[NVM_CHANNELS_SDP] :
988 &nvm_sw[NVM_CHANNELS];
989
990
991 data->xtal_calib[0] = *(nvm_calib + XTAL_CALIB);
992 data->xtal_calib[1] = *(nvm_calib + XTAL_CALIB + 1);
993 lar_enabled = true;
994 } else {
995 u16 lar_offset = data->nvm_version < 0xE39 ?
996 NVM_LAR_OFFSET_OLD :
997 NVM_LAR_OFFSET;
998
999 lar_config = le16_to_cpup(regulatory + lar_offset);
1000 data->lar_enabled = !!(lar_config &
1001 NVM_LAR_ENABLED);
1002 lar_enabled = data->lar_enabled;
1003 ch_section = ®ulatory[NVM_CHANNELS_EXTENDED];
1004 }
1005
1006
1007 if (iwl_set_hw_address(trans, cfg, data, nvm_hw, mac_override)) {
1008 kfree(data);
1009 return NULL;
1010 }
1011
1012 if (lar_fw_supported && lar_enabled)
1013 sbands_flags |= IWL_NVM_SBANDS_FLAGS_LAR;
1014
1015 if (iwl_nvm_no_wide_in_5ghz(dev, cfg, nvm_hw))
1016 sbands_flags |= IWL_NVM_SBANDS_FLAGS_NO_WIDE_IN_5GHZ;
1017
1018 iwl_init_sbands(dev, cfg, data, ch_section, tx_chains, rx_chains,
1019 sbands_flags, false);
1020 data->calib_version = 255;
1021
1022 return data;
1023}
1024IWL_EXPORT_SYMBOL(iwl_parse_nvm_data);
1025
1026static u32 iwl_nvm_get_regdom_bw_flags(const u16 *nvm_chan,
1027 int ch_idx, u16 nvm_flags,
1028 const struct iwl_cfg *cfg)
1029{
1030 u32 flags = NL80211_RRF_NO_HT40;
1031
1032 if (ch_idx < NUM_2GHZ_CHANNELS &&
1033 (nvm_flags & NVM_CHANNEL_40MHZ)) {
1034 if (nvm_chan[ch_idx] <= LAST_2GHZ_HT_PLUS)
1035 flags &= ~NL80211_RRF_NO_HT40PLUS;
1036 if (nvm_chan[ch_idx] >= FIRST_2GHZ_HT_MINUS)
1037 flags &= ~NL80211_RRF_NO_HT40MINUS;
1038 } else if (nvm_flags & NVM_CHANNEL_40MHZ) {
1039 if ((ch_idx - NUM_2GHZ_CHANNELS) % 2 == 0)
1040 flags &= ~NL80211_RRF_NO_HT40PLUS;
1041 else
1042 flags &= ~NL80211_RRF_NO_HT40MINUS;
1043 }
1044
1045 if (!(nvm_flags & NVM_CHANNEL_80MHZ))
1046 flags |= NL80211_RRF_NO_80MHZ;
1047 if (!(nvm_flags & NVM_CHANNEL_160MHZ))
1048 flags |= NL80211_RRF_NO_160MHZ;
1049
1050 if (!(nvm_flags & NVM_CHANNEL_ACTIVE))
1051 flags |= NL80211_RRF_NO_IR;
1052
1053 if (nvm_flags & NVM_CHANNEL_RADAR)
1054 flags |= NL80211_RRF_DFS;
1055
1056 if (nvm_flags & NVM_CHANNEL_INDOOR_ONLY)
1057 flags |= NL80211_RRF_NO_OUTDOOR;
1058
1059
1060
1061
1062 if ((nvm_flags & NVM_CHANNEL_GO_CONCURRENT) &&
1063 (flags & NL80211_RRF_NO_IR))
1064 flags |= NL80211_RRF_GO_CONCURRENT;
1065
1066 return flags;
1067}
1068
1069struct regdb_ptrs {
1070 struct ieee80211_wmm_rule *rule;
1071 u32 token;
1072};
1073
1074struct ieee80211_regdomain *
1075iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg,
1076 int num_of_ch, __le32 *channels, u16 fw_mcc,
1077 u16 geo_info)
1078{
1079 int ch_idx;
1080 u16 ch_flags;
1081 u32 reg_rule_flags, prev_reg_rule_flags = 0;
1082 const u16 *nvm_chan;
1083 struct ieee80211_regdomain *regd, *copy_rd;
1084 struct ieee80211_reg_rule *rule;
1085 struct regdb_ptrs *regdb_ptrs;
1086 enum nl80211_band band;
1087 int center_freq, prev_center_freq = 0;
1088 int valid_rules = 0;
1089 bool new_rule;
1090 int max_num_ch;
1091
1092 if (cfg->uhb_supported) {
1093 max_num_ch = IWL_NVM_NUM_CHANNELS_UHB;
1094 nvm_chan = iwl_uhb_nvm_channels;
1095 } else if (cfg->nvm_type == IWL_NVM_EXT) {
1096 max_num_ch = IWL_NVM_NUM_CHANNELS_EXT;
1097 nvm_chan = iwl_ext_nvm_channels;
1098 } else {
1099 max_num_ch = IWL_NVM_NUM_CHANNELS;
1100 nvm_chan = iwl_nvm_channels;
1101 }
1102
1103 if (WARN_ON(num_of_ch > max_num_ch))
1104 num_of_ch = max_num_ch;
1105
1106 if (WARN_ON_ONCE(num_of_ch > NL80211_MAX_SUPP_REG_RULES))
1107 return ERR_PTR(-EINVAL);
1108
1109 IWL_DEBUG_DEV(dev, IWL_DL_LAR, "building regdom for %d channels\n",
1110 num_of_ch);
1111
1112
1113 regd = kzalloc(struct_size(regd, reg_rules, num_of_ch), GFP_KERNEL);
1114 if (!regd)
1115 return ERR_PTR(-ENOMEM);
1116
1117 regdb_ptrs = kcalloc(num_of_ch, sizeof(*regdb_ptrs), GFP_KERNEL);
1118 if (!regdb_ptrs) {
1119 copy_rd = ERR_PTR(-ENOMEM);
1120 goto out;
1121 }
1122
1123
1124 regd->alpha2[0] = fw_mcc >> 8;
1125 regd->alpha2[1] = fw_mcc & 0xff;
1126
1127 for (ch_idx = 0; ch_idx < num_of_ch; ch_idx++) {
1128 ch_flags = (u16)__le32_to_cpup(channels + ch_idx);
1129 band = (ch_idx < NUM_2GHZ_CHANNELS) ?
1130 NL80211_BAND_2GHZ : NL80211_BAND_5GHZ;
1131 center_freq = ieee80211_channel_to_frequency(nvm_chan[ch_idx],
1132 band);
1133 new_rule = false;
1134
1135 if (!(ch_flags & NVM_CHANNEL_VALID)) {
1136 iwl_nvm_print_channel_flags(dev, IWL_DL_LAR,
1137 nvm_chan[ch_idx], ch_flags);
1138 continue;
1139 }
1140
1141 reg_rule_flags = iwl_nvm_get_regdom_bw_flags(nvm_chan, ch_idx,
1142 ch_flags, cfg);
1143
1144
1145 if (ch_idx == 0 || prev_reg_rule_flags != reg_rule_flags ||
1146 center_freq - prev_center_freq > 20) {
1147 valid_rules++;
1148 new_rule = true;
1149 }
1150
1151 rule = ®d->reg_rules[valid_rules - 1];
1152
1153 if (new_rule)
1154 rule->freq_range.start_freq_khz =
1155 MHZ_TO_KHZ(center_freq - 10);
1156
1157 rule->freq_range.end_freq_khz = MHZ_TO_KHZ(center_freq + 10);
1158
1159
1160 rule->power_rule.max_antenna_gain = DBI_TO_MBI(6);
1161 rule->power_rule.max_eirp =
1162 DBM_TO_MBM(IWL_DEFAULT_MAX_TX_POWER);
1163
1164 rule->flags = reg_rule_flags;
1165
1166
1167 rule->flags |= NL80211_RRF_AUTO_BW;
1168 rule->freq_range.max_bandwidth_khz = 0;
1169
1170 prev_center_freq = center_freq;
1171 prev_reg_rule_flags = reg_rule_flags;
1172
1173 iwl_nvm_print_channel_flags(dev, IWL_DL_LAR,
1174 nvm_chan[ch_idx], ch_flags);
1175
1176 if (!(geo_info & GEO_WMM_ETSI_5GHZ_INFO) ||
1177 band == NL80211_BAND_2GHZ)
1178 continue;
1179
1180 reg_query_regdb_wmm(regd->alpha2, center_freq, rule);
1181 }
1182
1183 regd->n_reg_rules = valid_rules;
1184
1185
1186
1187
1188
1189 copy_rd = kmemdup(regd, struct_size(regd, reg_rules, valid_rules),
1190 GFP_KERNEL);
1191 if (!copy_rd)
1192 copy_rd = ERR_PTR(-ENOMEM);
1193
1194out:
1195 kfree(regdb_ptrs);
1196 kfree(regd);
1197 return copy_rd;
1198}
1199IWL_EXPORT_SYMBOL(iwl_parse_nvm_mcc_info);
1200
1201#define IWL_MAX_NVM_SECTION_SIZE 0x1b58
1202#define IWL_MAX_EXT_NVM_SECTION_SIZE 0x1ffc
1203#define MAX_NVM_FILE_LEN 16384
1204
1205void iwl_nvm_fixups(u32 hw_id, unsigned int section, u8 *data,
1206 unsigned int len)
1207{
1208#define IWL_4165_DEVICE_ID 0x5501
1209#define NVM_SKU_CAP_MIMO_DISABLE BIT(5)
1210
1211 if (section == NVM_SECTION_TYPE_PHY_SKU &&
1212 hw_id == IWL_4165_DEVICE_ID && data && len >= 5 &&
1213 (data[4] & NVM_SKU_CAP_MIMO_DISABLE))
1214
1215 data[3] = ANT_B | (ANT_B << 4);
1216}
1217IWL_EXPORT_SYMBOL(iwl_nvm_fixups);
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240int iwl_read_external_nvm(struct iwl_trans *trans,
1241 const char *nvm_file_name,
1242 struct iwl_nvm_section *nvm_sections)
1243{
1244 int ret, section_size;
1245 u16 section_id;
1246 const struct firmware *fw_entry;
1247 const struct {
1248 __le16 word1;
1249 __le16 word2;
1250 u8 data[];
1251 } *file_sec;
1252 const u8 *eof;
1253 u8 *temp;
1254 int max_section_size;
1255 const __le32 *dword_buff;
1256
1257#define NVM_WORD1_LEN(x) (8 * (x & 0x03FF))
1258#define NVM_WORD2_ID(x) (x >> 12)
1259#define EXT_NVM_WORD2_LEN(x) (2 * (((x) & 0xFF) << 8 | (x) >> 8))
1260#define EXT_NVM_WORD1_ID(x) ((x) >> 4)
1261#define NVM_HEADER_0 (0x2A504C54)
1262#define NVM_HEADER_1 (0x4E564D2A)
1263#define NVM_HEADER_SIZE (4 * sizeof(u32))
1264
1265 IWL_DEBUG_EEPROM(trans->dev, "Read from external NVM\n");
1266
1267
1268 if (trans->cfg->nvm_type != IWL_NVM_EXT)
1269 max_section_size = IWL_MAX_NVM_SECTION_SIZE;
1270 else
1271 max_section_size = IWL_MAX_EXT_NVM_SECTION_SIZE;
1272
1273
1274
1275
1276
1277
1278
1279 ret = request_firmware(&fw_entry, nvm_file_name, trans->dev);
1280 if (ret) {
1281 IWL_ERR(trans, "ERROR: %s isn't available %d\n",
1282 nvm_file_name, ret);
1283 return ret;
1284 }
1285
1286 IWL_INFO(trans, "Loaded NVM file %s (%zu bytes)\n",
1287 nvm_file_name, fw_entry->size);
1288
1289 if (fw_entry->size > MAX_NVM_FILE_LEN) {
1290 IWL_ERR(trans, "NVM file too large\n");
1291 ret = -EINVAL;
1292 goto out;
1293 }
1294
1295 eof = fw_entry->data + fw_entry->size;
1296 dword_buff = (__le32 *)fw_entry->data;
1297
1298
1299
1300
1301
1302
1303
1304
1305 if (fw_entry->size > NVM_HEADER_SIZE &&
1306 dword_buff[0] == cpu_to_le32(NVM_HEADER_0) &&
1307 dword_buff[1] == cpu_to_le32(NVM_HEADER_1)) {
1308 file_sec = (void *)(fw_entry->data + NVM_HEADER_SIZE);
1309 IWL_INFO(trans, "NVM Version %08X\n", le32_to_cpu(dword_buff[2]));
1310 IWL_INFO(trans, "NVM Manufacturing date %08X\n",
1311 le32_to_cpu(dword_buff[3]));
1312
1313
1314 if (trans->cfg->device_family == IWL_DEVICE_FAMILY_8000 &&
1315 CSR_HW_REV_STEP(trans->hw_rev) == SILICON_C_STEP &&
1316 le32_to_cpu(dword_buff[2]) < 0xE4A) {
1317 ret = -EFAULT;
1318 goto out;
1319 }
1320 } else {
1321 file_sec = (void *)fw_entry->data;
1322 }
1323
1324 while (true) {
1325 if (file_sec->data > eof) {
1326 IWL_ERR(trans,
1327 "ERROR - NVM file too short for section header\n");
1328 ret = -EINVAL;
1329 break;
1330 }
1331
1332
1333 if (!file_sec->word1 && !file_sec->word2) {
1334 ret = 0;
1335 break;
1336 }
1337
1338 if (trans->cfg->nvm_type != IWL_NVM_EXT) {
1339 section_size =
1340 2 * NVM_WORD1_LEN(le16_to_cpu(file_sec->word1));
1341 section_id = NVM_WORD2_ID(le16_to_cpu(file_sec->word2));
1342 } else {
1343 section_size = 2 * EXT_NVM_WORD2_LEN(
1344 le16_to_cpu(file_sec->word2));
1345 section_id = EXT_NVM_WORD1_ID(
1346 le16_to_cpu(file_sec->word1));
1347 }
1348
1349 if (section_size > max_section_size) {
1350 IWL_ERR(trans, "ERROR - section too large (%d)\n",
1351 section_size);
1352 ret = -EINVAL;
1353 break;
1354 }
1355
1356 if (!section_size) {
1357 IWL_ERR(trans, "ERROR - section empty\n");
1358 ret = -EINVAL;
1359 break;
1360 }
1361
1362 if (file_sec->data + section_size > eof) {
1363 IWL_ERR(trans,
1364 "ERROR - NVM file too short for section (%d bytes)\n",
1365 section_size);
1366 ret = -EINVAL;
1367 break;
1368 }
1369
1370 if (WARN(section_id >= NVM_MAX_NUM_SECTIONS,
1371 "Invalid NVM section ID %d\n", section_id)) {
1372 ret = -EINVAL;
1373 break;
1374 }
1375
1376 temp = kmemdup(file_sec->data, section_size, GFP_KERNEL);
1377 if (!temp) {
1378 ret = -ENOMEM;
1379 break;
1380 }
1381
1382 iwl_nvm_fixups(trans->hw_id, section_id, temp, section_size);
1383
1384 kfree(nvm_sections[section_id].data);
1385 nvm_sections[section_id].data = temp;
1386 nvm_sections[section_id].length = section_size;
1387
1388
1389 file_sec = (void *)(file_sec->data + section_size);
1390 }
1391out:
1392 release_firmware(fw_entry);
1393 return ret;
1394}
1395IWL_EXPORT_SYMBOL(iwl_read_external_nvm);
1396
1397struct iwl_nvm_data *iwl_get_nvm(struct iwl_trans *trans,
1398 const struct iwl_fw *fw)
1399{
1400 struct iwl_nvm_get_info cmd = {};
1401 struct iwl_nvm_data *nvm;
1402 struct iwl_host_cmd hcmd = {
1403 .flags = CMD_WANT_SKB | CMD_SEND_IN_RFKILL,
1404 .data = { &cmd, },
1405 .len = { sizeof(cmd) },
1406 .id = WIDE_ID(REGULATORY_AND_NVM_GROUP, NVM_GET_INFO)
1407 };
1408 int ret;
1409 bool lar_fw_supported = !iwlwifi_mod_params.lar_disable &&
1410 fw_has_capa(&fw->ucode_capa,
1411 IWL_UCODE_TLV_CAPA_LAR_SUPPORT);
1412 bool empty_otp;
1413 u32 mac_flags;
1414 u32 sbands_flags = 0;
1415
1416
1417
1418
1419
1420
1421 struct iwl_nvm_get_info_rsp *rsp;
1422 struct iwl_nvm_get_info_rsp_v3 *rsp_v3;
1423 bool v4 = fw_has_api(&fw->ucode_capa,
1424 IWL_UCODE_TLV_API_REGULATORY_NVM_INFO);
1425 size_t rsp_size = v4 ? sizeof(*rsp) : sizeof(*rsp_v3);
1426 void *channel_profile;
1427
1428 ret = iwl_trans_send_cmd(trans, &hcmd);
1429 if (ret)
1430 return ERR_PTR(ret);
1431
1432 if (WARN(iwl_rx_packet_payload_len(hcmd.resp_pkt) != rsp_size,
1433 "Invalid payload len in NVM response from FW %d",
1434 iwl_rx_packet_payload_len(hcmd.resp_pkt))) {
1435 ret = -EINVAL;
1436 goto out;
1437 }
1438
1439 rsp = (void *)hcmd.resp_pkt->data;
1440 empty_otp = !!(le32_to_cpu(rsp->general.flags) &
1441 NVM_GENERAL_FLAGS_EMPTY_OTP);
1442 if (empty_otp)
1443 IWL_INFO(trans, "OTP is empty\n");
1444
1445 nvm = kzalloc(struct_size(nvm, channels, IWL_NUM_CHANNELS), GFP_KERNEL);
1446 if (!nvm) {
1447 ret = -ENOMEM;
1448 goto out;
1449 }
1450
1451 iwl_set_hw_address_from_csr(trans, nvm);
1452
1453
1454 if (!is_valid_ether_addr(nvm->hw_addr)) {
1455 IWL_ERR(trans, "no valid mac address was found\n");
1456 ret = -EINVAL;
1457 goto err_free;
1458 }
1459
1460 IWL_INFO(trans, "base HW address: %pM\n", nvm->hw_addr);
1461
1462
1463 nvm->nvm_version = le16_to_cpu(rsp->general.nvm_version);
1464 nvm->n_hw_addrs = rsp->general.n_hw_addrs;
1465 if (nvm->n_hw_addrs == 0)
1466 IWL_WARN(trans,
1467 "Firmware declares no reserved mac addresses. OTP is empty: %d\n",
1468 empty_otp);
1469
1470
1471 mac_flags = le32_to_cpu(rsp->mac_sku.mac_sku_flags);
1472 nvm->sku_cap_11ac_enable =
1473 !!(mac_flags & NVM_MAC_SKU_FLAGS_802_11AC_ENABLED);
1474 nvm->sku_cap_11n_enable =
1475 !!(mac_flags & NVM_MAC_SKU_FLAGS_802_11N_ENABLED);
1476 nvm->sku_cap_11ax_enable =
1477 !!(mac_flags & NVM_MAC_SKU_FLAGS_802_11AX_ENABLED);
1478 nvm->sku_cap_band_24ghz_enable =
1479 !!(mac_flags & NVM_MAC_SKU_FLAGS_BAND_2_4_ENABLED);
1480 nvm->sku_cap_band_52ghz_enable =
1481 !!(mac_flags & NVM_MAC_SKU_FLAGS_BAND_5_2_ENABLED);
1482 nvm->sku_cap_mimo_disabled =
1483 !!(mac_flags & NVM_MAC_SKU_FLAGS_MIMO_DISABLED);
1484
1485
1486 nvm->valid_tx_ant = (u8)le32_to_cpu(rsp->phy_sku.tx_chains);
1487 nvm->valid_rx_ant = (u8)le32_to_cpu(rsp->phy_sku.rx_chains);
1488
1489 if (le32_to_cpu(rsp->regulatory.lar_enabled) && lar_fw_supported) {
1490 nvm->lar_enabled = true;
1491 sbands_flags |= IWL_NVM_SBANDS_FLAGS_LAR;
1492 }
1493
1494 rsp_v3 = (void *)rsp;
1495 channel_profile = v4 ? (void *)rsp->regulatory.channel_profile :
1496 (void *)rsp_v3->regulatory.channel_profile;
1497
1498 iwl_init_sbands(trans->dev, trans->cfg, nvm,
1499 channel_profile,
1500 nvm->valid_tx_ant & fw->valid_tx_ant,
1501 nvm->valid_rx_ant & fw->valid_rx_ant,
1502 sbands_flags, v4);
1503
1504 iwl_free_resp(&hcmd);
1505 return nvm;
1506
1507err_free:
1508 kfree(nvm);
1509out:
1510 iwl_free_resp(&hcmd);
1511 return ERR_PTR(ret);
1512}
1513IWL_EXPORT_SYMBOL(iwl_get_nvm);
1514