Lines Matching +full:channel +full:- +full:11
1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
3 * Copyright (C) 2005-2014, 2018-2023 Intel Corporation
4 * Copyright (C) 2013-2015 Intel Mobile Communications GmbH
5 * Copyright (C) 2016-2017 Intel Deutschland GmbH
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"
21 #include "fw/api/nvm-reg.h"
25 #include "mei/iwl-mei.h"
29 /* NVM HW-Section offset (in words) definitions */
33 /* NVM SW-Section offset (in words) definitions */
39 NVM_CHANNELS = 0x1E0 - NVM_SW_SECTION,
41 /* NVM REGULATORY -Section offset (in words) definitions */
46 /* NVM HW-Section offset (in words) definitions */
50 /* NVM SW-Section offset (in words) definitions */
54 /* NVM PHY_SKU-Section offset (in words) definitions */
58 /* NVM REGULATORY -Section offset (in words) definitions */
75 * These are the channel numbers in the order that they are stored in the NVM
79 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
88 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
97 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
102 /* 6-7 GHz */
125 { .bitrate = 11 * 10, .hw_value = 3, .hw_value_short = 3,
134 { .bitrate = 54 * 10, .hw_value = 11, .hw_value_short = 11, },
139 #define N_RATES_52 (N_RATES_24 - RATES_52_OFFS)
142 * enum iwl_nvm_channel_flags - channel flags in NVM
143 * @NVM_CHANNEL_VALID: channel is usable for this SKU/geo
144 * @NVM_CHANNEL_IBSS: usable as an IBSS channel
149 * on same channel on 2.4 or same UNII band on 5.2
151 * @NVM_CHANNEL_20MHZ: 20 MHz channel okay
152 * @NVM_CHANNEL_40MHZ: 40 MHz channel okay
153 * @NVM_CHANNEL_80MHZ: 80 MHz channel okay
154 * @NVM_CHANNEL_160MHZ: 160 MHz channel okay
170 NVM_CHANNEL_160MHZ = BIT(11),
177 * enum iwl_reg_capa_flags_v1 - global flags applied for the whole regulatory
179 * @REG_CAPA_V1_BF_CCD_LOW_BAND: Beam-forming or Cyclic Delay Diversity in the
181 * @REG_CAPA_V1_BF_CCD_HIGH_BAND: Beam-forming or Cyclic Delay Diversity in the
183 * @REG_CAPA_V1_160MHZ_ALLOWED: 11ac channel with a width of 160Mhz is allowed
185 * @REG_CAPA_V1_80MHZ_ALLOWED: 11ac channel with a width of 80Mhz is allowed
187 * @REG_CAPA_V1_MCS_8_ALLOWED: 11ac with MCS 8 is allowed.
188 * @REG_CAPA_V1_MCS_9_ALLOWED: 11ac with MCS 9 is allowed.
189 * @REG_CAPA_V1_40MHZ_FORBIDDEN: 11n channel with a width of 40Mhz is forbidden
192 * @REG_CAPA_V1_11AX_DISABLED: 11ax is forbidden for this regulatory domain.
207 * enum iwl_reg_capa_flags_v2 - global flags applied for the whole regulatory
211 * @REG_CAPA_V2_BF_CCD_LOW_BAND: Beam-forming or Cyclic Delay Diversity in the
213 * @REG_CAPA_V2_BF_CCD_HIGH_BAND: Beam-forming or Cyclic Delay Diversity in the
215 * @REG_CAPA_V2_160MHZ_ALLOWED: 11ac channel with a width of 160Mhz is allowed
217 * @REG_CAPA_V2_80MHZ_ALLOWED: 11ac channel with a width of 80Mhz is allowed
219 * @REG_CAPA_V2_MCS_8_ALLOWED: 11ac with MCS 8 is allowed.
220 * @REG_CAPA_V2_MCS_9_ALLOWED: 11ac with MCS 9 is allowed.
223 * @REG_CAPA_V2_40MHZ_ALLOWED: 11n channel with a width of 40Mhz is allowed
225 * @REG_CAPA_V2_11AX_DISABLED: 11ax is forbidden for this regulatory domain.
241 * enum iwl_reg_capa_flags_v4 - global flags applied for the whole regulatory
243 * @REG_CAPA_V4_160MHZ_ALLOWED: 11ac channel with a width of 160Mhz is allowed
245 * @REG_CAPA_V4_80MHZ_ALLOWED: 11ac channel with a width of 80Mhz is allowed
247 * @REG_CAPA_V4_MCS_12_ALLOWED: 11ac with MCS 12 is allowed.
248 * @REG_CAPA_V4_MCS_13_ALLOWED: 11ac with MCS 13 is allowed.
249 * @REG_CAPA_V4_11BE_DISABLED: 11be is forbidden for this regulatory domain.
250 * @REG_CAPA_V4_11AX_DISABLED: 11ax is forbidden for this regulatory domain.
251 * @REG_CAPA_V4_320MHZ_ALLOWED: 11be channel with a width of 320Mhz is allowed
276 * struct iwl_reg_capa - struct for global regulatory capabilities, Used for
279 * @allow_40mhz: 11n channel with a width of 40Mhz is allowed
281 * @allow_80mhz: 11ac channel with a width of 80Mhz is allowed
283 * @allow_160mhz: 11ac channel with a width of 160Mhz is allowed
285 * @allow_320mhz: 11be channel with a width of 320Mhz is allowed
287 * @disable_11ax: 11ax is forbidden for this regulatory domain.
288 * @disable_11be: 11be is forbidden for this regulatory domain.
343 if ((ch_idx - NUM_2GHZ_CHANNELS) % 2 == 0)
400 const struct iwl_cfg *cfg = trans->cfg;
401 struct device *dev = trans->dev;
404 struct ieee80211_channel *channel;
409 if (cfg->uhb_supported) {
412 } else if (cfg->nvm_type == IWL_NVM_EXT) {
432 !data->sku_cap_band_52ghz_enable)
444 data->vht160_supported = true;
458 channel = &data->channels[n_channels];
461 channel->hw_value = nvm_chan[ch_idx];
462 channel->band = band;
463 channel->center_freq =
465 channel->hw_value, channel->band);
467 /* Initialize regulatory-based run-time data */
470 * Default value - highest tx power value. max_power
473 channel->max_power = IWL_DEFAULT_MAX_TX_POWER;
477 channel->flags = iwl_get_channel_flags(nvm_chan[ch_idx],
481 channel->flags = 0;
483 if (fw_has_capa(&fw->ucode_capa,
485 channel->flags |= IEEE80211_CHAN_CAN_MONITOR;
488 channel->hw_value, ch_flags);
490 channel->hw_value, channel->max_power);
501 const struct iwl_cfg *cfg = trans->cfg;
505 vht_cap->vht_supported = true;
507 vht_cap->cap = IEEE80211_VHT_CAP_SHORT_GI_80 |
514 if (!trans->cfg->ht_params->stbc)
515 vht_cap->cap &= ~IEEE80211_VHT_CAP_RXSTBC_MASK;
517 if (data->vht160_supported)
518 vht_cap->cap |= IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
521 if (cfg->vht_mu_mimo_supported)
522 vht_cap->cap |= IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
524 if (cfg->ht_params->ldpc)
525 vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC;
527 if (data->sku_cap_mimo_disabled) {
532 if (trans->cfg->ht_params->stbc && num_tx_ants > 1)
533 vht_cap->cap |= IEEE80211_VHT_CAP_TXSTBC;
535 vht_cap->cap |= IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN;
539 if (trans->trans_cfg->mq_rx_supported)
540 vht_cap->cap |=
543 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895;
546 if (trans->trans_cfg->mq_rx_supported)
547 vht_cap->cap |=
553 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895;
556 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991;
559 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454;
565 vht_cap->vht_mcs.rx_mcs_map =
575 if (num_rx_ants == 1 || cfg->rx_with_siso_diversity) {
576 vht_cap->cap |= IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN;
578 vht_cap->vht_mcs.rx_mcs_map |=
582 vht_cap->vht_mcs.tx_mcs_map = vht_cap->vht_mcs.rx_mcs_map;
584 vht_cap->vht_mcs.tx_highest |=
726 * Rx - note we don't set the only_20mhz, but due to this
825 * Rx - note we don't set the only_20mhz, but due to this
870 if (sband->band != NL80211_BAND_6GHZ)
896 IWL_DEBUG_EEPROM(trans->dev, "he_6ghz_capa=0x%x\n", he_6ghz_capa);
898 /* we know it's writable - we set it before ourselves */
899 iftype_data = (void *)(uintptr_t)sband->iftype_data;
900 for (i = 0; i < sband->n_iftype_data; i++)
912 bool is_ap = iftype_data->types_mask & (BIT(NL80211_IFTYPE_AP) |
916 no_320 = (!trans->trans_cfg->integrated &&
917 trans->pcie_link_speed < PCI_EXP_LNKSTA_CLS_8_0GB) ||
918 trans->reduced_cap_sku;
920 if (!data->sku_cap_11be_enable || iwlwifi_mod_params.disable_11be)
921 iftype_data->eht_cap.has_eht = false;
923 /* Advertise an A-MPDU exponent extension based on
926 if (sband->band == NL80211_BAND_6GHZ && iftype_data->eht_cap.has_eht)
927 iftype_data->he_cap.he_cap_elem.mac_cap_info[3] |=
929 else if (sband->band != NL80211_BAND_2GHZ)
930 iftype_data->he_cap.he_cap_elem.mac_cap_info[3] |=
933 iftype_data->he_cap.he_cap_elem.mac_cap_info[3] |=
936 switch (sband->band) {
938 iftype_data->he_cap.he_cap_elem.phy_cap_info[0] |=
940 iftype_data->eht_cap.eht_cap_elem.mac_cap_info[0] |=
946 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[0] |=
948 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[1] |=
953 iftype_data->he_cap.he_cap_elem.phy_cap_info[0] |=
963 iftype_data->he_cap.he_cap_elem.phy_cap_info[2] |=
965 iftype_data->he_cap.he_cap_elem.phy_cap_info[5] |=
969 iftype_data->he_cap.he_cap_elem.phy_cap_info[7] |=
972 if (iftype_data->eht_cap.has_eht) {
978 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[2] |= 0x49;
984 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[4] |= 0x10;
989 &iftype_data->he_cap.he_mcs_nss_supp;
991 if (iftype_data->eht_cap.has_eht) {
993 &iftype_data->eht_cap.eht_mcs_nss_supp;
1000 * Midamble RX Max NSTS - but not for AP mode
1002 iftype_data->he_cap.he_cap_elem.phy_cap_info[1] &=
1004 iftype_data->he_cap.he_cap_elem.phy_cap_info[2] &=
1006 iftype_data->he_cap.he_cap_elem.phy_cap_info[7] |=
1010 he_mcs_nss_supp->rx_mcs_80 |=
1012 he_mcs_nss_supp->tx_mcs_80 |=
1014 he_mcs_nss_supp->rx_mcs_160 |=
1016 he_mcs_nss_supp->tx_mcs_160 |=
1018 he_mcs_nss_supp->rx_mcs_80p80 |=
1020 he_mcs_nss_supp->tx_mcs_80p80 |=
1024 if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210 && !is_ap)
1025 iftype_data->he_cap.he_cap_elem.phy_cap_info[2] |=
1028 switch (CSR_HW_RFID_TYPE(trans->hw_rf_id)) {
1032 iftype_data->he_cap.he_cap_elem.phy_cap_info[9] |=
1035 iftype_data->he_cap.he_cap_elem.phy_cap_info[9] |=
1040 if (CSR_HW_REV_TYPE(trans->hw_rev) == IWL_CFG_MAC_TYPE_GL &&
1041 iftype_data->eht_cap.has_eht) {
1042 iftype_data->eht_cap.eht_cap_elem.mac_cap_info[0] &=
1045 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[3] &=
1053 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[4] &=
1056 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[5] &=
1058 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[6] &=
1061 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[5] |=
1065 if (fw_has_capa(&fw->ucode_capa, IWL_UCODE_TLV_CAPA_BROADCAST_TWT))
1066 iftype_data->he_cap.he_cap_elem.mac_cap_info[2] |=
1069 if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_22000 &&
1071 iftype_data->vendor_elems.data = iwl_vendor_caps;
1072 iftype_data->vendor_elems.len = ARRAY_SIZE(iwl_vendor_caps);
1075 if (!trans->cfg->ht_params->stbc) {
1076 iftype_data->he_cap.he_cap_elem.phy_cap_info[2] &=
1078 iftype_data->he_cap.he_cap_elem.phy_cap_info[7] &=
1082 if (trans->step_urm) {
1083 iftype_data->eht_cap.eht_mcs_nss_supp.bw._320.rx_tx_mcs11_max_nss = 0;
1084 iftype_data->eht_cap.eht_mcs_nss_supp.bw._320.rx_tx_mcs13_max_nss = 0;
1087 if (trans->no_160)
1088 iftype_data->he_cap.he_cap_elem.phy_cap_info[0] &=
1091 if (trans->reduced_cap_sku) {
1092 memset(&iftype_data->eht_cap.eht_mcs_nss_supp.bw._320, 0,
1093 sizeof(iftype_data->eht_cap.eht_mcs_nss_supp.bw._320));
1094 iftype_data->eht_cap.eht_mcs_nss_supp.bw._80.rx_tx_mcs13_max_nss = 0;
1095 iftype_data->eht_cap.eht_mcs_nss_supp.bw._160.rx_tx_mcs13_max_nss = 0;
1096 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[8] &=
1098 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[2] &=
1112 BUILD_BUG_ON(sizeof(data->iftd.low) != sizeof(iwl_he_eht_capa));
1113 BUILD_BUG_ON(sizeof(data->iftd.high) != sizeof(iwl_he_eht_capa));
1114 BUILD_BUG_ON(sizeof(data->iftd.uhb) != sizeof(iwl_he_eht_capa));
1116 switch (sband->band) {
1118 iftype_data = data->iftd.low;
1121 iftype_data = data->iftd.high;
1124 iftype_data = data->iftd.uhb;
1136 for (i = 0; i < sband->n_iftype_data; i++)
1148 sband = &data->bands[NL80211_BAND_2GHZ];
1149 iwl_init_ht_hw_capab(trans, data, &sband->ht_cap, NL80211_BAND_2GHZ,
1152 if (data->sku_cap_11ax_enable && !iwlwifi_mod_params.disable_11ax)
1156 sband = &data->bands[NL80211_BAND_5GHZ];
1157 iwl_init_ht_hw_capab(trans, data, &sband->ht_cap, NL80211_BAND_5GHZ,
1159 if (data->sku_cap_11ac_enable && !iwlwifi_mod_params.disable_11ac)
1160 iwl_init_vht_hw_capab(trans, data, &sband->vht_cap,
1163 if (data->sku_cap_11ax_enable && !iwlwifi_mod_params.disable_11ax)
1167 sband = &data->bands[NL80211_BAND_6GHZ];
1168 if (data->sku_cap_11ax_enable && !iwlwifi_mod_params.disable_11ax)
1180 struct device *dev = trans->dev;
1187 sband = &data->bands[NL80211_BAND_2GHZ];
1188 sband->band = NL80211_BAND_2GHZ;
1189 sband->bitrates = &iwl_cfg80211_rates[RATES_24_OFFS];
1190 sband->n_bitrates = N_RATES_24;
1193 iwl_init_ht_hw_capab(trans, data, &sband->ht_cap, NL80211_BAND_2GHZ,
1196 if (data->sku_cap_11ax_enable && !iwlwifi_mod_params.disable_11ax)
1200 sband = &data->bands[NL80211_BAND_5GHZ];
1201 sband->band = NL80211_BAND_5GHZ;
1202 sband->bitrates = &iwl_cfg80211_rates[RATES_52_OFFS];
1203 sband->n_bitrates = N_RATES_52;
1206 iwl_init_ht_hw_capab(trans, data, &sband->ht_cap, NL80211_BAND_5GHZ,
1208 if (data->sku_cap_11ac_enable && !iwlwifi_mod_params.disable_11ac)
1209 iwl_init_vht_hw_capab(trans, data, &sband->vht_cap,
1212 if (data->sku_cap_11ax_enable && !iwlwifi_mod_params.disable_11ax)
1217 sband = &data->bands[NL80211_BAND_6GHZ];
1218 sband->band = NL80211_BAND_6GHZ;
1220 sband->bitrates = &iwl_cfg80211_rates[RATES_52_OFFS];
1221 sband->n_bitrates = N_RATES_52;
1225 if (data->sku_cap_11ax_enable && !iwlwifi_mod_params.disable_11ax)
1229 sband->n_channels = 0;
1238 if (cfg->nvm_type != IWL_NVM_EXT)
1246 if (cfg->nvm_type != IWL_NVM_EXT)
1256 if (cfg->nvm_type != IWL_NVM_EXT)
1267 if (cfg->nvm_type != IWL_NVM_EXT)
1279 if (cfg->nvm_type != IWL_NVM_EXT) {
1280 data->radio_cfg_type = NVM_RF_CFG_TYPE_MSK(radio_cfg);
1281 data->radio_cfg_step = NVM_RF_CFG_STEP_MSK(radio_cfg);
1282 data->radio_cfg_dash = NVM_RF_CFG_DASH_MSK(radio_cfg);
1283 data->radio_cfg_pnum = NVM_RF_CFG_PNUM_MSK(radio_cfg);
1288 data->radio_cfg_type = EXT_NVM_RF_CFG_TYPE_MSK(radio_cfg);
1289 data->radio_cfg_step = EXT_NVM_RF_CFG_STEP_MSK(radio_cfg);
1290 data->radio_cfg_dash = EXT_NVM_RF_CFG_DASH_MSK(radio_cfg);
1291 data->radio_cfg_pnum = EXT_NVM_RF_CFG_FLAVOR_MSK(radio_cfg);
1292 data->valid_tx_ant = EXT_NVM_RF_CFG_TX_ANT_MSK(radio_cfg);
1293 data->valid_rx_ant = EXT_NVM_RF_CFG_RX_ANT_MSK(radio_cfg);
1319 iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr);
1324 if (is_valid_ether_addr(data->hw_addr))
1330 iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr);
1353 memcpy(data->hw_addr, hw_addr, ETH_ALEN);
1359 if (is_valid_ether_addr(data->hw_addr) &&
1374 iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr);
1387 if (cfg->mac_addr_from_csr) {
1389 } else if (cfg->nvm_type != IWL_NVM_EXT) {
1393 data->hw_addr[0] = hw_addr[1];
1394 data->hw_addr[1] = hw_addr[0];
1395 data->hw_addr[2] = hw_addr[3];
1396 data->hw_addr[3] = hw_addr[2];
1397 data->hw_addr[4] = hw_addr[5];
1398 data->hw_addr[5] = hw_addr[4];
1404 if (!is_valid_ether_addr(data->hw_addr)) {
1406 return -EINVAL;
1409 if (!trans->csme_own)
1412 data->hw_addr, iwl_read_prph(trans, REG_OTP_MINOR));
1415 data->hw_addr, ":", iwl_read_prph(trans, REG_OTP_MINOR));
1427 * some 7000-family OTPs erroneously allow wide channels in
1429 * bits 1-4 in the subsystem ID and check if it is either 5 or
1430 * 9. In those cases, we need to force-disable wide channels
1434 if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_7000) {
1437 * section uses big-endian.
1443 IWL_DEBUG_EEPROM(trans->dev,
1460 u8 rx_chains = fw->valid_rx_ant;
1461 u8 tx_chains = fw->valid_rx_ant;
1463 if (cfg->uhb_supported)
1474 BUILD_BUG_ON(ARRAY_SIZE(mei_nvm->channels) !=
1476 data->nvm_version = mei_nvm->nvm_version;
1478 iwl_set_radio_cfg(cfg, data, mei_nvm->radio_cfg);
1479 if (data->valid_tx_ant)
1480 tx_chains &= data->valid_tx_ant;
1481 if (data->valid_rx_ant)
1482 rx_chains &= data->valid_rx_ant;
1488 data->sku_cap_mimo_disabled = false;
1489 data->sku_cap_band_24ghz_enable = true;
1490 data->sku_cap_band_52ghz_enable = true;
1491 data->sku_cap_11n_enable =
1493 data->sku_cap_11ac_enable = true;
1494 data->sku_cap_11ax_enable =
1495 mei_nvm->caps & MEI_NVM_CAPS_11AX_SUPPORT;
1497 data->lar_enabled = mei_nvm->caps & MEI_NVM_CAPS_LARI_SUPPORT;
1499 data->n_hw_addrs = mei_nvm->n_hw_addrs;
1500 /* If no valid mac address was found - bail out */
1506 if (data->lar_enabled &&
1507 fw_has_capa(&fw->ucode_capa, IWL_UCODE_TLV_CAPA_LAR_SUPPORT))
1510 iwl_init_sbands(trans, data, mei_nvm->channels, tx_chains, rx_chains,
1532 if (cfg->uhb_supported)
1536 else if (cfg->nvm_type != IWL_NVM_EXT)
1547 data->nvm_version = iwl_get_nvm_version(cfg, nvm_sw);
1551 if (data->valid_tx_ant)
1552 tx_chains &= data->valid_tx_ant;
1553 if (data->valid_rx_ant)
1554 rx_chains &= data->valid_rx_ant;
1557 data->sku_cap_band_24ghz_enable = sku & NVM_SKU_CAP_BAND_24GHZ;
1558 data->sku_cap_band_52ghz_enable = sku & NVM_SKU_CAP_BAND_52GHZ;
1559 data->sku_cap_11n_enable = sku & NVM_SKU_CAP_11N_ENABLE;
1561 data->sku_cap_11n_enable = false;
1562 data->sku_cap_11ac_enable = data->sku_cap_11n_enable &&
1564 data->sku_cap_mimo_disabled = sku & NVM_SKU_CAP_MIMO_DISABLE;
1566 data->n_hw_addrs = iwl_get_n_hw_addrs(cfg, nvm_sw);
1568 if (cfg->nvm_type != IWL_NVM_EXT) {
1577 ch_section = cfg->nvm_type == IWL_NVM_SDP ?
1583 u16 lar_offset = data->nvm_version < 0xE39 ?
1588 data->lar_enabled = !!(lar_config &
1590 lar_enabled = data->lar_enabled;
1594 /* If no valid mac address was found - bail out */
1601 fw_has_capa(&fw->ucode_capa, IWL_UCODE_TLV_CAPA_LAR_SUPPORT))
1609 data->calib_version = 255;
1630 if ((ch_idx - NUM_2GHZ_CHANNELS) % 2 == 0)
1662 * however, once marked as DFS no-ir is not needed.
1678 * reg_capa is per regulatory domain so apply it for every channel
1745 if (cfg->uhb_supported) {
1748 } else if (cfg->nvm_type == IWL_NVM_EXT) {
1764 return ERR_PTR(-EINVAL);
1769 /* build a regdomain rule for every valid channel */
1772 return ERR_PTR(-ENOMEM);
1775 regd->alpha2[0] = fw_mcc >> 8;
1776 regd->alpha2[1] = fw_mcc & 0xff;
1802 center_freq - prev_center_freq > 20) {
1807 rule = ®d->reg_rules[valid_rules - 1];
1810 rule->freq_range.start_freq_khz =
1811 MHZ_TO_KHZ(center_freq - 10);
1813 rule->freq_range.end_freq_khz = MHZ_TO_KHZ(center_freq + 10);
1815 /* this doesn't matter - not used by FW */
1816 rule->power_rule.max_antenna_gain = DBI_TO_MBI(6);
1817 rule->power_rule.max_eirp =
1820 rule->flags = reg_rule_flags;
1822 /* rely on auto-calculation to merge BW of contiguous chans */
1823 rule->flags |= NL80211_RRF_AUTO_BW;
1824 rule->freq_range.max_bandwidth_khz = 0;
1836 reg_query_regdb_wmm(regd->alpha2, center_freq, rule);
1841 * if booted in RF-kill, i.e. not all calibrations etc. are
1849 rule = ®d->reg_rules[valid_rules - 1];
1850 rule->freq_range.start_freq_khz = MHZ_TO_KHZ(2412);
1851 rule->freq_range.end_freq_khz = MHZ_TO_KHZ(2413);
1852 rule->freq_range.max_bandwidth_khz = MHZ_TO_KHZ(1);
1853 rule->power_rule.max_antenna_gain = DBI_TO_MBI(6);
1854 rule->power_rule.max_eirp =
1858 regd->n_reg_rules = valid_rules;
1867 copy_rd = ERR_PTR(-ENOMEM);
1893 * Reads external NVM from a file into mvm->nvm_sections
1896 * ------------------------------
1898 * 3800 -> header
1899 * 0000 -> header
1900 * 5a40 -> data
1902 * rev - 6 bit (word1)
1903 * len - 10 bit (word1)
1904 * id - 4 bit (word2)
1905 * rsv - 12 bit (word2)
1938 IWL_DEBUG_EEPROM(trans->dev, "Read from external NVM\n");
1941 if (trans->cfg->nvm_type != IWL_NVM_EXT)
1952 ret = request_firmware(&fw_entry, nvm_file_name, trans->dev);
1960 nvm_file_name, fw_entry->size);
1962 if (fw_entry->size > MAX_NVM_FILE_LEN) {
1964 ret = -EINVAL;
1968 eof = fw_entry->data + fw_entry->size;
1969 dword_buff = (const __le32 *)fw_entry->data;
1978 if (fw_entry->size > NVM_HEADER_SIZE &&
1981 file_sec = (const void *)(fw_entry->data + NVM_HEADER_SIZE);
1987 if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_8000 &&
1988 trans->hw_rev_step == SILICON_C_STEP &&
1990 ret = -EFAULT;
1994 file_sec = (const void *)fw_entry->data;
1998 if (file_sec->data > eof) {
2000 "ERROR - NVM file too short for section header\n");
2001 ret = -EINVAL;
2006 if (!file_sec->word1 && !file_sec->word2) {
2011 if (trans->cfg->nvm_type != IWL_NVM_EXT) {
2013 2 * NVM_WORD1_LEN(le16_to_cpu(file_sec->word1));
2014 section_id = NVM_WORD2_ID(le16_to_cpu(file_sec->word2));
2017 le16_to_cpu(file_sec->word2));
2019 le16_to_cpu(file_sec->word1));
2023 IWL_ERR(trans, "ERROR - section too large (%d)\n",
2025 ret = -EINVAL;
2030 IWL_ERR(trans, "ERROR - section empty\n");
2031 ret = -EINVAL;
2035 if (file_sec->data + section_size > eof) {
2037 "ERROR - NVM file too short for section (%d bytes)\n",
2039 ret = -EINVAL;
2045 ret = -EINVAL;
2049 temp = kmemdup(file_sec->data, section_size, GFP_KERNEL);
2051 ret = -ENOMEM;
2055 iwl_nvm_fixups(trans->hw_id, section_id, temp, section_size);
2062 file_sec = (const void *)(file_sec->data + section_size);
2091 * in v3, except for the channel profile part of the
2097 bool v4 = fw_has_api(&fw->ucode_capa,
2109 ret = -EINVAL;
2113 rsp = (void *)hcmd.resp_pkt->data;
2114 empty_otp = !!(le32_to_cpu(rsp->general.flags) &
2121 ret = -ENOMEM;
2126 /* TODO: if platform NVM has MAC address - override it here */
2128 if (!is_valid_ether_addr(nvm->hw_addr)) {
2130 ret = -EINVAL;
2135 IWL_INFO(trans, "base HW address: %pM\n", nvm->hw_addr);
2137 IWL_INFO(trans, "base HW address: %6D\n", nvm->hw_addr, ":");
2141 nvm->nvm_version = le16_to_cpu(rsp->general.nvm_version);
2142 nvm->n_hw_addrs = rsp->general.n_hw_addrs;
2143 if (nvm->n_hw_addrs == 0)
2149 mac_flags = le32_to_cpu(rsp->mac_sku.mac_sku_flags);
2150 nvm->sku_cap_11ac_enable =
2152 nvm->sku_cap_11n_enable =
2154 nvm->sku_cap_11ax_enable =
2156 nvm->sku_cap_band_24ghz_enable =
2158 nvm->sku_cap_band_52ghz_enable =
2160 nvm->sku_cap_mimo_disabled =
2162 if (CSR_HW_RFID_TYPE(trans->hw_rf_id) >= IWL_CFG_RF_TYPE_FM)
2163 nvm->sku_cap_11be_enable = true;
2166 nvm->valid_tx_ant = (u8)le32_to_cpu(rsp->phy_sku.tx_chains);
2167 nvm->valid_rx_ant = (u8)le32_to_cpu(rsp->phy_sku.rx_chains);
2169 if (le32_to_cpu(rsp->regulatory.lar_enabled) &&
2170 fw_has_capa(&fw->ucode_capa,
2172 nvm->lar_enabled = true;
2177 channel_profile = v4 ? (void *)rsp->regulatory.channel_profile :
2178 (void *)rsp_v3->regulatory.channel_profile;
2180 tx_ant = nvm->valid_tx_ant & fw->valid_tx_ant;
2181 rx_ant = nvm->valid_rx_ant & fw->valid_rx_ant;