Lines Matching +full:fw +full:- +full:cfg
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"
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"
29 /* NVM HW-Section offset (in words) definitions */
33 /* NVM SW-Section offset (in words) definitions */
39 NVM_CHANNELS = 0x1E0 - NVM_SW_SECTION,
43 XTAL_CALIB = 0x316 - NVM_CALIB_SECTION,
45 /* NVM REGULATORY -Section offset (in words) definitions */
50 /* NVM HW-Section offset (in words) definitions */
53 /* NVM SW-Section offset (in words) definitions */
57 /* NVM PHY_SKU-Section offset (in words) definitions */
61 /* NVM REGULATORY -Section offset (in words) definitions */
105 /* 6-7 GHz */
142 #define N_RATES_52 (N_RATES_24 - RATES_52_OFFS)
145 * enum iwl_nvm_channel_flags - channel flags in NVM
176 * enum iwl_reg_capa_flags_v1 - global flags applied for the whole regulatory
178 * @REG_CAPA_V1_BF_CCD_LOW_BAND: Beam-forming or Cyclic Delay Diversity in the
180 * @REG_CAPA_V1_BF_CCD_HIGH_BAND: Beam-forming or Cyclic Delay Diversity in the
206 * enum iwl_reg_capa_flags_v2 - global flags applied for the whole regulatory
210 * @REG_CAPA_V2_BF_CCD_LOW_BAND: Beam-forming or Cyclic Delay Diversity in the
212 * @REG_CAPA_V2_BF_CCD_HIGH_BAND: Beam-forming or Cyclic Delay Diversity in the
240 * enum iwl_reg_capa_flags_v4 - global flags applied for the whole regulatory
275 * struct iwl_reg_capa - struct for global regulatory capabilities, Used for
330 u32 nvm_flags, const struct iwl_cfg *cfg) in iwl_get_channel_flags() argument
340 if ((ch_idx - NUM_2GHZ_CHANNELS) % 2 == 0) in iwl_get_channel_flags()
383 static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg, in iwl_init_channel_map() argument
395 if (cfg->uhb_supported) { in iwl_init_channel_map()
398 } else if (cfg->nvm_type == IWL_NVM_EXT) { in iwl_init_channel_map()
418 !data->sku_cap_band_52ghz_enable) in iwl_init_channel_map()
430 data->vht160_supported = true; in iwl_init_channel_map()
444 channel = &data->channels[n_channels]; in iwl_init_channel_map()
447 channel->hw_value = nvm_chan[ch_idx]; in iwl_init_channel_map()
448 channel->band = band; in iwl_init_channel_map()
449 channel->center_freq = in iwl_init_channel_map()
451 channel->hw_value, channel->band); in iwl_init_channel_map()
453 /* Initialize regulatory-based run-time data */ in iwl_init_channel_map()
456 * Default value - highest tx power value. max_power in iwl_init_channel_map()
459 channel->max_power = IWL_DEFAULT_MAX_TX_POWER; in iwl_init_channel_map()
463 channel->flags = iwl_get_channel_flags(nvm_chan[ch_idx], in iwl_init_channel_map()
465 ch_flags, cfg); in iwl_init_channel_map()
467 channel->flags = 0; in iwl_init_channel_map()
472 if (cfg->uhb_supported) in iwl_init_channel_map()
473 channel->flags = 0; in iwl_init_channel_map()
475 channel->hw_value, ch_flags); in iwl_init_channel_map()
477 channel->hw_value, channel->max_power); in iwl_init_channel_map()
488 const struct iwl_cfg *cfg = trans->cfg; in iwl_init_vht_hw_capab() local
492 vht_cap->vht_supported = true; in iwl_init_vht_hw_capab()
494 vht_cap->cap = IEEE80211_VHT_CAP_SHORT_GI_80 | in iwl_init_vht_hw_capab()
501 if (!trans->cfg->ht_params->stbc) in iwl_init_vht_hw_capab()
502 vht_cap->cap &= ~IEEE80211_VHT_CAP_RXSTBC_MASK; in iwl_init_vht_hw_capab()
504 if (data->vht160_supported) in iwl_init_vht_hw_capab()
505 vht_cap->cap |= IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ | in iwl_init_vht_hw_capab()
508 if (cfg->vht_mu_mimo_supported) in iwl_init_vht_hw_capab()
509 vht_cap->cap |= IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE; in iwl_init_vht_hw_capab()
511 if (cfg->ht_params->ldpc) in iwl_init_vht_hw_capab()
512 vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC; in iwl_init_vht_hw_capab()
514 if (data->sku_cap_mimo_disabled) { in iwl_init_vht_hw_capab()
519 if (trans->cfg->ht_params->stbc && num_tx_ants > 1) in iwl_init_vht_hw_capab()
520 vht_cap->cap |= IEEE80211_VHT_CAP_TXSTBC; in iwl_init_vht_hw_capab()
522 vht_cap->cap |= IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN; in iwl_init_vht_hw_capab()
526 if (trans->trans_cfg->mq_rx_supported) in iwl_init_vht_hw_capab()
527 vht_cap->cap |= in iwl_init_vht_hw_capab()
530 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895; in iwl_init_vht_hw_capab()
533 if (trans->trans_cfg->mq_rx_supported) in iwl_init_vht_hw_capab()
534 vht_cap->cap |= in iwl_init_vht_hw_capab()
540 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895; in iwl_init_vht_hw_capab()
543 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991; in iwl_init_vht_hw_capab()
546 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454; in iwl_init_vht_hw_capab()
552 vht_cap->vht_mcs.rx_mcs_map = in iwl_init_vht_hw_capab()
562 if (num_rx_ants == 1 || cfg->rx_with_siso_diversity) { in iwl_init_vht_hw_capab()
563 vht_cap->cap |= IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN; in iwl_init_vht_hw_capab()
565 vht_cap->vht_mcs.rx_mcs_map |= in iwl_init_vht_hw_capab()
569 vht_cap->vht_mcs.tx_mcs_map = vht_cap->vht_mcs.rx_mcs_map; in iwl_init_vht_hw_capab()
571 vht_cap->vht_mcs.tx_highest |= in iwl_init_vht_hw_capab()
710 * Rx - note we don't set the only_20mhz, but due to this
805 * Rx - note we don't set the only_20mhz, but due to this
847 if (sband->band != NL80211_BAND_6GHZ) in iwl_init_he_6ghz_capa()
873 IWL_DEBUG_EEPROM(trans->dev, "he_6ghz_capa=0x%x\n", he_6ghz_capa); in iwl_init_he_6ghz_capa()
875 /* we know it's writable - we set it before ourselves */ in iwl_init_he_6ghz_capa()
876 iftype_data = (void *)(uintptr_t)sband->iftype_data; in iwl_init_he_6ghz_capa()
877 for (i = 0; i < sband->n_iftype_data; i++) in iwl_init_he_6ghz_capa()
887 const struct iwl_fw *fw) in iwl_nvm_fixup_sband_iftd() argument
889 bool is_ap = iftype_data->types_mask & BIT(NL80211_IFTYPE_AP); in iwl_nvm_fixup_sband_iftd()
892 no_320 = !trans->trans_cfg->integrated && in iwl_nvm_fixup_sband_iftd()
893 trans->pcie_link_speed < PCI_EXP_LNKSTA_CLS_8_0GB; in iwl_nvm_fixup_sband_iftd()
895 if (!data->sku_cap_11be_enable || iwlwifi_mod_params.disable_11be) in iwl_nvm_fixup_sband_iftd()
896 iftype_data->eht_cap.has_eht = false; in iwl_nvm_fixup_sband_iftd()
898 /* Advertise an A-MPDU exponent extension based on in iwl_nvm_fixup_sband_iftd()
901 if (sband->band == NL80211_BAND_6GHZ && iftype_data->eht_cap.has_eht) in iwl_nvm_fixup_sband_iftd()
902 iftype_data->he_cap.he_cap_elem.mac_cap_info[3] |= in iwl_nvm_fixup_sband_iftd()
904 else if (sband->band != NL80211_BAND_2GHZ) in iwl_nvm_fixup_sband_iftd()
905 iftype_data->he_cap.he_cap_elem.mac_cap_info[3] |= in iwl_nvm_fixup_sband_iftd()
908 iftype_data->he_cap.he_cap_elem.mac_cap_info[3] |= in iwl_nvm_fixup_sband_iftd()
911 switch (sband->band) { in iwl_nvm_fixup_sband_iftd()
913 iftype_data->he_cap.he_cap_elem.phy_cap_info[0] |= in iwl_nvm_fixup_sband_iftd()
915 iftype_data->eht_cap.eht_cap_elem.mac_cap_info[0] |= in iwl_nvm_fixup_sband_iftd()
921 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[0] |= in iwl_nvm_fixup_sband_iftd()
923 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[1] |= in iwl_nvm_fixup_sband_iftd()
928 iftype_data->he_cap.he_cap_elem.phy_cap_info[0] |= in iwl_nvm_fixup_sband_iftd()
938 iftype_data->he_cap.he_cap_elem.phy_cap_info[2] |= in iwl_nvm_fixup_sband_iftd()
940 iftype_data->he_cap.he_cap_elem.phy_cap_info[5] |= in iwl_nvm_fixup_sband_iftd()
944 iftype_data->he_cap.he_cap_elem.phy_cap_info[7] |= in iwl_nvm_fixup_sband_iftd()
947 if (iftype_data->eht_cap.has_eht) { in iwl_nvm_fixup_sband_iftd()
953 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[2] |= 0x49; in iwl_nvm_fixup_sband_iftd()
959 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[4] |= 0x10; in iwl_nvm_fixup_sband_iftd()
963 if (iftype_data->eht_cap.has_eht) { in iwl_nvm_fixup_sband_iftd()
965 &iftype_data->eht_cap.eht_mcs_nss_supp; in iwl_nvm_fixup_sband_iftd()
972 * Midamble RX Max NSTS - but not for AP mode in iwl_nvm_fixup_sband_iftd()
974 iftype_data->he_cap.he_cap_elem.phy_cap_info[1] &= in iwl_nvm_fixup_sband_iftd()
976 iftype_data->he_cap.he_cap_elem.phy_cap_info[2] &= in iwl_nvm_fixup_sband_iftd()
978 iftype_data->he_cap.he_cap_elem.phy_cap_info[7] |= in iwl_nvm_fixup_sband_iftd()
983 if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210 && !is_ap) in iwl_nvm_fixup_sband_iftd()
984 iftype_data->he_cap.he_cap_elem.phy_cap_info[2] |= in iwl_nvm_fixup_sband_iftd()
987 switch (CSR_HW_RFID_TYPE(trans->hw_rf_id)) { in iwl_nvm_fixup_sband_iftd()
993 iftype_data->he_cap.he_cap_elem.phy_cap_info[9] |= in iwl_nvm_fixup_sband_iftd()
996 iftype_data->he_cap.he_cap_elem.phy_cap_info[9] |= in iwl_nvm_fixup_sband_iftd()
1001 if (CSR_HW_REV_TYPE(trans->hw_rev) == IWL_CFG_MAC_TYPE_GL && in iwl_nvm_fixup_sband_iftd()
1002 iftype_data->eht_cap.has_eht) { in iwl_nvm_fixup_sband_iftd()
1003 iftype_data->eht_cap.eht_cap_elem.mac_cap_info[0] &= in iwl_nvm_fixup_sband_iftd()
1006 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[3] &= in iwl_nvm_fixup_sband_iftd()
1014 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[4] &= in iwl_nvm_fixup_sband_iftd()
1017 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[5] &= in iwl_nvm_fixup_sband_iftd()
1019 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[6] &= in iwl_nvm_fixup_sband_iftd()
1022 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[5] |= in iwl_nvm_fixup_sband_iftd()
1026 if (fw_has_capa(&fw->ucode_capa, IWL_UCODE_TLV_CAPA_BROADCAST_TWT)) in iwl_nvm_fixup_sband_iftd()
1027 iftype_data->he_cap.he_cap_elem.mac_cap_info[2] |= in iwl_nvm_fixup_sband_iftd()
1030 if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_22000 && in iwl_nvm_fixup_sband_iftd()
1032 iftype_data->vendor_elems.data = iwl_vendor_caps; in iwl_nvm_fixup_sband_iftd()
1033 iftype_data->vendor_elems.len = ARRAY_SIZE(iwl_vendor_caps); in iwl_nvm_fixup_sband_iftd()
1036 if (!trans->cfg->ht_params->stbc) { in iwl_nvm_fixup_sband_iftd()
1037 iftype_data->he_cap.he_cap_elem.phy_cap_info[2] &= in iwl_nvm_fixup_sband_iftd()
1039 iftype_data->he_cap.he_cap_elem.phy_cap_info[7] &= in iwl_nvm_fixup_sband_iftd()
1048 const struct iwl_fw *fw) in iwl_init_he_hw_capab() argument
1054 if (WARN_ON(sband->iftype_data)) in iwl_init_he_hw_capab()
1057 BUILD_BUG_ON(sizeof(data->iftd.low) != sizeof(iwl_he_eht_capa)); in iwl_init_he_hw_capab()
1058 BUILD_BUG_ON(sizeof(data->iftd.high) != sizeof(iwl_he_eht_capa)); in iwl_init_he_hw_capab()
1059 BUILD_BUG_ON(sizeof(data->iftd.uhb) != sizeof(iwl_he_eht_capa)); in iwl_init_he_hw_capab()
1061 switch (sband->band) { in iwl_init_he_hw_capab()
1063 iftype_data = data->iftd.low; in iwl_init_he_hw_capab()
1066 iftype_data = data->iftd.high; in iwl_init_he_hw_capab()
1069 iftype_data = data->iftd.uhb; in iwl_init_he_hw_capab()
1078 sband->iftype_data = iftype_data; in iwl_init_he_hw_capab()
1079 sband->n_iftype_data = ARRAY_SIZE(iwl_he_eht_capa); in iwl_init_he_hw_capab()
1081 for (i = 0; i < sband->n_iftype_data; i++) in iwl_init_he_hw_capab()
1083 tx_chains, rx_chains, fw); in iwl_init_he_hw_capab()
1092 const struct iwl_fw *fw) in iwl_init_sbands() argument
1094 struct device *dev = trans->dev; in iwl_init_sbands()
1095 const struct iwl_cfg *cfg = trans->cfg; in iwl_init_sbands() local
1100 n_channels = iwl_init_channel_map(dev, cfg, data, nvm_ch_flags, in iwl_init_sbands()
1102 sband = &data->bands[NL80211_BAND_2GHZ]; in iwl_init_sbands()
1103 sband->band = NL80211_BAND_2GHZ; in iwl_init_sbands()
1104 sband->bitrates = &iwl_cfg80211_rates[RATES_24_OFFS]; in iwl_init_sbands()
1105 sband->n_bitrates = N_RATES_24; in iwl_init_sbands()
1108 iwl_init_ht_hw_capab(trans, data, &sband->ht_cap, NL80211_BAND_2GHZ, in iwl_init_sbands()
1111 if (data->sku_cap_11ax_enable && !iwlwifi_mod_params.disable_11ax) in iwl_init_sbands()
1113 fw); in iwl_init_sbands()
1115 sband = &data->bands[NL80211_BAND_5GHZ]; in iwl_init_sbands()
1116 sband->band = NL80211_BAND_5GHZ; in iwl_init_sbands()
1117 sband->bitrates = &iwl_cfg80211_rates[RATES_52_OFFS]; in iwl_init_sbands()
1118 sband->n_bitrates = N_RATES_52; in iwl_init_sbands()
1121 iwl_init_ht_hw_capab(trans, data, &sband->ht_cap, NL80211_BAND_5GHZ, in iwl_init_sbands()
1123 if (data->sku_cap_11ac_enable && !iwlwifi_mod_params.disable_11ac) in iwl_init_sbands()
1124 iwl_init_vht_hw_capab(trans, data, &sband->vht_cap, in iwl_init_sbands()
1127 if (data->sku_cap_11ax_enable && !iwlwifi_mod_params.disable_11ax) in iwl_init_sbands()
1129 fw); in iwl_init_sbands()
1132 sband = &data->bands[NL80211_BAND_6GHZ]; in iwl_init_sbands()
1133 sband->band = NL80211_BAND_6GHZ; in iwl_init_sbands()
1135 sband->bitrates = &iwl_cfg80211_rates[RATES_52_OFFS]; in iwl_init_sbands()
1136 sband->n_bitrates = N_RATES_52; in iwl_init_sbands()
1140 if (data->sku_cap_11ax_enable && !iwlwifi_mod_params.disable_11ax) in iwl_init_sbands()
1142 fw); in iwl_init_sbands()
1144 sband->n_channels = 0; in iwl_init_sbands()
1150 static int iwl_get_sku(const struct iwl_cfg *cfg, const __le16 *nvm_sw, in iwl_get_sku() argument
1153 if (cfg->nvm_type != IWL_NVM_EXT) in iwl_get_sku()
1159 static int iwl_get_nvm_version(const struct iwl_cfg *cfg, const __le16 *nvm_sw) in iwl_get_nvm_version() argument
1161 if (cfg->nvm_type != IWL_NVM_EXT) in iwl_get_nvm_version()
1168 static int iwl_get_radio_cfg(const struct iwl_cfg *cfg, const __le16 *nvm_sw, in iwl_get_radio_cfg() argument
1171 if (cfg->nvm_type != IWL_NVM_EXT) in iwl_get_radio_cfg()
1178 static int iwl_get_n_hw_addrs(const struct iwl_cfg *cfg, const __le16 *nvm_sw) in iwl_get_n_hw_addrs() argument
1182 if (cfg->nvm_type != IWL_NVM_EXT) in iwl_get_n_hw_addrs()
1190 static void iwl_set_radio_cfg(const struct iwl_cfg *cfg, in iwl_set_radio_cfg() argument
1194 if (cfg->nvm_type != IWL_NVM_EXT) { in iwl_set_radio_cfg()
1195 data->radio_cfg_type = NVM_RF_CFG_TYPE_MSK(radio_cfg); in iwl_set_radio_cfg()
1196 data->radio_cfg_step = NVM_RF_CFG_STEP_MSK(radio_cfg); in iwl_set_radio_cfg()
1197 data->radio_cfg_dash = NVM_RF_CFG_DASH_MSK(radio_cfg); in iwl_set_radio_cfg()
1198 data->radio_cfg_pnum = NVM_RF_CFG_PNUM_MSK(radio_cfg); in iwl_set_radio_cfg()
1203 data->radio_cfg_type = EXT_NVM_RF_CFG_TYPE_MSK(radio_cfg); in iwl_set_radio_cfg()
1204 data->radio_cfg_step = EXT_NVM_RF_CFG_STEP_MSK(radio_cfg); in iwl_set_radio_cfg()
1205 data->radio_cfg_dash = EXT_NVM_RF_CFG_DASH_MSK(radio_cfg); in iwl_set_radio_cfg()
1206 data->radio_cfg_pnum = EXT_NVM_RF_CFG_FLAVOR_MSK(radio_cfg); in iwl_set_radio_cfg()
1207 data->valid_tx_ant = EXT_NVM_RF_CFG_TX_ANT_MSK(radio_cfg); in iwl_set_radio_cfg()
1208 data->valid_rx_ant = EXT_NVM_RF_CFG_RX_ANT_MSK(radio_cfg); in iwl_set_radio_cfg()
1234 iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr); in iwl_set_hw_address_from_csr()
1239 if (is_valid_ether_addr(data->hw_addr)) in iwl_set_hw_address_from_csr()
1245 iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr); in iwl_set_hw_address_from_csr()
1249 const struct iwl_cfg *cfg, in iwl_set_hw_address_family_8000() argument
1268 memcpy(data->hw_addr, hw_addr, ETH_ALEN); in iwl_set_hw_address_family_8000()
1274 if (is_valid_ether_addr(data->hw_addr) && in iwl_set_hw_address_family_8000()
1289 iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr); in iwl_set_hw_address_family_8000()
1298 const struct iwl_cfg *cfg, in iwl_set_hw_address() argument
1302 if (cfg->mac_addr_from_csr) { in iwl_set_hw_address()
1304 } else if (cfg->nvm_type != IWL_NVM_EXT) { in iwl_set_hw_address()
1308 data->hw_addr[0] = hw_addr[1]; in iwl_set_hw_address()
1309 data->hw_addr[1] = hw_addr[0]; in iwl_set_hw_address()
1310 data->hw_addr[2] = hw_addr[3]; in iwl_set_hw_address()
1311 data->hw_addr[3] = hw_addr[2]; in iwl_set_hw_address()
1312 data->hw_addr[4] = hw_addr[5]; in iwl_set_hw_address()
1313 data->hw_addr[5] = hw_addr[4]; in iwl_set_hw_address()
1315 iwl_set_hw_address_family_8000(trans, cfg, data, in iwl_set_hw_address()
1319 if (!is_valid_ether_addr(data->hw_addr)) { in iwl_set_hw_address()
1321 return -EINVAL; in iwl_set_hw_address()
1324 if (!trans->csme_own) in iwl_set_hw_address()
1326 data->hw_addr, iwl_read_prph(trans, REG_OTP_MINOR)); in iwl_set_hw_address()
1332 iwl_nvm_no_wide_in_5ghz(struct iwl_trans *trans, const struct iwl_cfg *cfg, in iwl_nvm_no_wide_in_5ghz() argument
1337 * some 7000-family OTPs erroneously allow wide channels in in iwl_nvm_no_wide_in_5ghz()
1339 * bits 1-4 in the subsystem ID and check if it is either 5 or in iwl_nvm_no_wide_in_5ghz()
1340 * 9. In those cases, we need to force-disable wide channels in iwl_nvm_no_wide_in_5ghz()
1341 * in 5GHz otherwise the FW will throw a sysassert when we try in iwl_nvm_no_wide_in_5ghz()
1344 if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_7000) { in iwl_nvm_no_wide_in_5ghz()
1347 * section uses big-endian. in iwl_nvm_no_wide_in_5ghz()
1353 IWL_DEBUG_EEPROM(trans->dev, in iwl_nvm_no_wide_in_5ghz()
1364 iwl_parse_mei_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg, in iwl_parse_mei_nvm_data() argument
1366 const struct iwl_fw *fw) in iwl_parse_mei_nvm_data() argument
1370 u8 rx_chains = fw->valid_rx_ant; in iwl_parse_mei_nvm_data()
1371 u8 tx_chains = fw->valid_rx_ant; in iwl_parse_mei_nvm_data()
1373 if (cfg->uhb_supported) in iwl_parse_mei_nvm_data()
1384 BUILD_BUG_ON(ARRAY_SIZE(mei_nvm->channels) != in iwl_parse_mei_nvm_data()
1386 data->nvm_version = mei_nvm->nvm_version; in iwl_parse_mei_nvm_data()
1388 iwl_set_radio_cfg(cfg, data, mei_nvm->radio_cfg); in iwl_parse_mei_nvm_data()
1389 if (data->valid_tx_ant) in iwl_parse_mei_nvm_data()
1390 tx_chains &= data->valid_tx_ant; in iwl_parse_mei_nvm_data()
1391 if (data->valid_rx_ant) in iwl_parse_mei_nvm_data()
1392 rx_chains &= data->valid_rx_ant; in iwl_parse_mei_nvm_data()
1394 data->sku_cap_mimo_disabled = false; in iwl_parse_mei_nvm_data()
1395 data->sku_cap_band_24ghz_enable = true; in iwl_parse_mei_nvm_data()
1396 data->sku_cap_band_52ghz_enable = true; in iwl_parse_mei_nvm_data()
1397 data->sku_cap_11n_enable = in iwl_parse_mei_nvm_data()
1399 data->sku_cap_11ac_enable = true; in iwl_parse_mei_nvm_data()
1400 data->sku_cap_11ax_enable = in iwl_parse_mei_nvm_data()
1401 mei_nvm->caps & MEI_NVM_CAPS_11AX_SUPPORT; in iwl_parse_mei_nvm_data()
1403 data->lar_enabled = mei_nvm->caps & MEI_NVM_CAPS_LARI_SUPPORT; in iwl_parse_mei_nvm_data()
1405 data->n_hw_addrs = mei_nvm->n_hw_addrs; in iwl_parse_mei_nvm_data()
1406 /* If no valid mac address was found - bail out */ in iwl_parse_mei_nvm_data()
1407 if (iwl_set_hw_address(trans, cfg, data, NULL, NULL)) { in iwl_parse_mei_nvm_data()
1412 if (data->lar_enabled && in iwl_parse_mei_nvm_data()
1413 fw_has_capa(&fw->ucode_capa, IWL_UCODE_TLV_CAPA_LAR_SUPPORT)) in iwl_parse_mei_nvm_data()
1416 iwl_init_sbands(trans, data, mei_nvm->channels, tx_chains, rx_chains, in iwl_parse_mei_nvm_data()
1417 sbands_flags, true, fw); in iwl_parse_mei_nvm_data()
1424 iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg, in iwl_parse_nvm_data() argument
1425 const struct iwl_fw *fw, in iwl_parse_nvm_data() argument
1438 if (cfg->uhb_supported) in iwl_parse_nvm_data()
1442 else if (cfg->nvm_type != IWL_NVM_EXT) in iwl_parse_nvm_data()
1453 data->nvm_version = iwl_get_nvm_version(cfg, nvm_sw); in iwl_parse_nvm_data()
1455 radio_cfg = iwl_get_radio_cfg(cfg, nvm_sw, phy_sku); in iwl_parse_nvm_data()
1456 iwl_set_radio_cfg(cfg, data, radio_cfg); in iwl_parse_nvm_data()
1457 if (data->valid_tx_ant) in iwl_parse_nvm_data()
1458 tx_chains &= data->valid_tx_ant; in iwl_parse_nvm_data()
1459 if (data->valid_rx_ant) in iwl_parse_nvm_data()
1460 rx_chains &= data->valid_rx_ant; in iwl_parse_nvm_data()
1462 sku = iwl_get_sku(cfg, nvm_sw, phy_sku); in iwl_parse_nvm_data()
1463 data->sku_cap_band_24ghz_enable = sku & NVM_SKU_CAP_BAND_24GHZ; in iwl_parse_nvm_data()
1464 data->sku_cap_band_52ghz_enable = sku & NVM_SKU_CAP_BAND_52GHZ; in iwl_parse_nvm_data()
1465 data->sku_cap_11n_enable = sku & NVM_SKU_CAP_11N_ENABLE; in iwl_parse_nvm_data()
1467 data->sku_cap_11n_enable = false; in iwl_parse_nvm_data()
1468 data->sku_cap_11ac_enable = data->sku_cap_11n_enable && in iwl_parse_nvm_data()
1470 data->sku_cap_mimo_disabled = sku & NVM_SKU_CAP_MIMO_DISABLE; in iwl_parse_nvm_data()
1472 data->n_hw_addrs = iwl_get_n_hw_addrs(cfg, nvm_sw); in iwl_parse_nvm_data()
1474 if (cfg->nvm_type != IWL_NVM_EXT) { in iwl_parse_nvm_data()
1483 ch_section = cfg->nvm_type == IWL_NVM_SDP ? in iwl_parse_nvm_data()
1488 data->xtal_calib[0] = *(nvm_calib + XTAL_CALIB); in iwl_parse_nvm_data()
1489 data->xtal_calib[1] = *(nvm_calib + XTAL_CALIB + 1); in iwl_parse_nvm_data()
1492 u16 lar_offset = data->nvm_version < 0xE39 ? in iwl_parse_nvm_data()
1497 data->lar_enabled = !!(lar_config & in iwl_parse_nvm_data()
1499 lar_enabled = data->lar_enabled; in iwl_parse_nvm_data()
1503 /* If no valid mac address was found - bail out */ in iwl_parse_nvm_data()
1504 if (iwl_set_hw_address(trans, cfg, data, nvm_hw, mac_override)) { in iwl_parse_nvm_data()
1510 fw_has_capa(&fw->ucode_capa, IWL_UCODE_TLV_CAPA_LAR_SUPPORT)) in iwl_parse_nvm_data()
1513 if (iwl_nvm_no_wide_in_5ghz(trans, cfg, nvm_hw)) in iwl_parse_nvm_data()
1517 sbands_flags, false, fw); in iwl_parse_nvm_data()
1518 data->calib_version = 255; in iwl_parse_nvm_data()
1527 const struct iwl_cfg *cfg) in iwl_nvm_get_regdom_bw_flags() argument
1538 if ((ch_idx - NUM_2GHZ_CHANNELS) % 2 == 0) in iwl_nvm_get_regdom_bw_flags()
1617 iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, in iwl_parse_nvm_mcc_info() argument
1634 if (cfg->uhb_supported) { in iwl_parse_nvm_mcc_info()
1637 } else if (cfg->nvm_type == IWL_NVM_EXT) { in iwl_parse_nvm_mcc_info()
1653 return ERR_PTR(-EINVAL); in iwl_parse_nvm_mcc_info()
1661 return ERR_PTR(-ENOMEM); in iwl_parse_nvm_mcc_info()
1663 /* set alpha2 from FW. */ in iwl_parse_nvm_mcc_info()
1664 regd->alpha2[0] = fw_mcc >> 8; in iwl_parse_nvm_mcc_info()
1665 regd->alpha2[1] = fw_mcc & 0xff; in iwl_parse_nvm_mcc_info()
1685 cfg); in iwl_parse_nvm_mcc_info()
1689 center_freq - prev_center_freq > 20) { in iwl_parse_nvm_mcc_info()
1694 rule = ®d->reg_rules[valid_rules - 1]; in iwl_parse_nvm_mcc_info()
1697 rule->freq_range.start_freq_khz = in iwl_parse_nvm_mcc_info()
1698 MHZ_TO_KHZ(center_freq - 10); in iwl_parse_nvm_mcc_info()
1700 rule->freq_range.end_freq_khz = MHZ_TO_KHZ(center_freq + 10); in iwl_parse_nvm_mcc_info()
1702 /* this doesn't matter - not used by FW */ in iwl_parse_nvm_mcc_info()
1703 rule->power_rule.max_antenna_gain = DBI_TO_MBI(6); in iwl_parse_nvm_mcc_info()
1704 rule->power_rule.max_eirp = in iwl_parse_nvm_mcc_info()
1707 rule->flags = reg_rule_flags; in iwl_parse_nvm_mcc_info()
1709 /* rely on auto-calculation to merge BW of contiguous chans */ in iwl_parse_nvm_mcc_info()
1710 rule->flags |= NL80211_RRF_AUTO_BW; in iwl_parse_nvm_mcc_info()
1711 rule->freq_range.max_bandwidth_khz = 0; in iwl_parse_nvm_mcc_info()
1723 reg_query_regdb_wmm(regd->alpha2, center_freq, rule); in iwl_parse_nvm_mcc_info()
1728 * if booted in RF-kill, i.e. not all calibrations etc. are in iwl_parse_nvm_mcc_info()
1736 rule = ®d->reg_rules[valid_rules - 1]; in iwl_parse_nvm_mcc_info()
1737 rule->freq_range.start_freq_khz = MHZ_TO_KHZ(2412); in iwl_parse_nvm_mcc_info()
1738 rule->freq_range.end_freq_khz = MHZ_TO_KHZ(2413); in iwl_parse_nvm_mcc_info()
1739 rule->freq_range.max_bandwidth_khz = MHZ_TO_KHZ(1); in iwl_parse_nvm_mcc_info()
1740 rule->power_rule.max_antenna_gain = DBI_TO_MBI(6); in iwl_parse_nvm_mcc_info()
1741 rule->power_rule.max_eirp = in iwl_parse_nvm_mcc_info()
1745 regd->n_reg_rules = valid_rules; in iwl_parse_nvm_mcc_info()
1754 copy_rd = ERR_PTR(-ENOMEM); in iwl_parse_nvm_mcc_info()
1780 * Reads external NVM from a file into mvm->nvm_sections
1783 * ------------------------------
1785 * 3800 -> header
1786 * 0000 -> header
1787 * 5a40 -> data
1789 * rev - 6 bit (word1)
1790 * len - 10 bit (word1)
1791 * id - 4 bit (word2)
1792 * rsv - 12 bit (word2)
1825 IWL_DEBUG_EEPROM(trans->dev, "Read from external NVM\n"); in iwl_read_external_nvm()
1828 if (trans->cfg->nvm_type != IWL_NVM_EXT) in iwl_read_external_nvm()
1839 ret = request_firmware(&fw_entry, nvm_file_name, trans->dev); in iwl_read_external_nvm()
1847 nvm_file_name, fw_entry->size); in iwl_read_external_nvm()
1849 if (fw_entry->size > MAX_NVM_FILE_LEN) { in iwl_read_external_nvm()
1851 ret = -EINVAL; in iwl_read_external_nvm()
1855 eof = fw_entry->data + fw_entry->size; in iwl_read_external_nvm()
1856 dword_buff = (const __le32 *)fw_entry->data; in iwl_read_external_nvm()
1863 * This header must be skipped when providing the NVM data to the FW. in iwl_read_external_nvm()
1865 if (fw_entry->size > NVM_HEADER_SIZE && in iwl_read_external_nvm()
1868 file_sec = (const void *)(fw_entry->data + NVM_HEADER_SIZE); in iwl_read_external_nvm()
1874 if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_8000 && in iwl_read_external_nvm()
1875 trans->hw_rev_step == SILICON_C_STEP && in iwl_read_external_nvm()
1877 ret = -EFAULT; in iwl_read_external_nvm()
1881 file_sec = (const void *)fw_entry->data; in iwl_read_external_nvm()
1885 if (file_sec->data > eof) { in iwl_read_external_nvm()
1887 "ERROR - NVM file too short for section header\n"); in iwl_read_external_nvm()
1888 ret = -EINVAL; in iwl_read_external_nvm()
1893 if (!file_sec->word1 && !file_sec->word2) { in iwl_read_external_nvm()
1898 if (trans->cfg->nvm_type != IWL_NVM_EXT) { in iwl_read_external_nvm()
1900 2 * NVM_WORD1_LEN(le16_to_cpu(file_sec->word1)); in iwl_read_external_nvm()
1901 section_id = NVM_WORD2_ID(le16_to_cpu(file_sec->word2)); in iwl_read_external_nvm()
1904 le16_to_cpu(file_sec->word2)); in iwl_read_external_nvm()
1906 le16_to_cpu(file_sec->word1)); in iwl_read_external_nvm()
1910 IWL_ERR(trans, "ERROR - section too large (%d)\n", in iwl_read_external_nvm()
1912 ret = -EINVAL; in iwl_read_external_nvm()
1917 IWL_ERR(trans, "ERROR - section empty\n"); in iwl_read_external_nvm()
1918 ret = -EINVAL; in iwl_read_external_nvm()
1922 if (file_sec->data + section_size > eof) { in iwl_read_external_nvm()
1924 "ERROR - NVM file too short for section (%d bytes)\n", in iwl_read_external_nvm()
1926 ret = -EINVAL; in iwl_read_external_nvm()
1932 ret = -EINVAL; in iwl_read_external_nvm()
1936 temp = kmemdup(file_sec->data, section_size, GFP_KERNEL); in iwl_read_external_nvm()
1938 ret = -ENOMEM; in iwl_read_external_nvm()
1942 iwl_nvm_fixups(trans->hw_id, section_id, temp, section_size); in iwl_read_external_nvm()
1949 file_sec = (const void *)(file_sec->data + section_size); in iwl_read_external_nvm()
1958 const struct iwl_fw *fw) in iwl_get_nvm() argument
1980 bool v4 = fw_has_api(&fw->ucode_capa, in iwl_get_nvm()
1990 "Invalid payload len in NVM response from FW %d", in iwl_get_nvm()
1992 ret = -EINVAL; in iwl_get_nvm()
1996 rsp = (void *)hcmd.resp_pkt->data; in iwl_get_nvm()
1997 empty_otp = !!(le32_to_cpu(rsp->general.flags) & in iwl_get_nvm()
2004 ret = -ENOMEM; in iwl_get_nvm()
2009 /* TODO: if platform NVM has MAC address - override it here */ in iwl_get_nvm()
2011 if (!is_valid_ether_addr(nvm->hw_addr)) { in iwl_get_nvm()
2013 ret = -EINVAL; in iwl_get_nvm()
2017 IWL_INFO(trans, "base HW address: %pM\n", nvm->hw_addr); in iwl_get_nvm()
2020 nvm->nvm_version = le16_to_cpu(rsp->general.nvm_version); in iwl_get_nvm()
2021 nvm->n_hw_addrs = rsp->general.n_hw_addrs; in iwl_get_nvm()
2022 if (nvm->n_hw_addrs == 0) in iwl_get_nvm()
2028 mac_flags = le32_to_cpu(rsp->mac_sku.mac_sku_flags); in iwl_get_nvm()
2029 nvm->sku_cap_11ac_enable = in iwl_get_nvm()
2031 nvm->sku_cap_11n_enable = in iwl_get_nvm()
2033 nvm->sku_cap_11ax_enable = in iwl_get_nvm()
2035 nvm->sku_cap_band_24ghz_enable = in iwl_get_nvm()
2037 nvm->sku_cap_band_52ghz_enable = in iwl_get_nvm()
2039 nvm->sku_cap_mimo_disabled = in iwl_get_nvm()
2041 if (CSR_HW_RFID_TYPE(trans->hw_rf_id) >= IWL_CFG_RF_TYPE_FM) in iwl_get_nvm()
2042 nvm->sku_cap_11be_enable = true; in iwl_get_nvm()
2045 nvm->valid_tx_ant = (u8)le32_to_cpu(rsp->phy_sku.tx_chains); in iwl_get_nvm()
2046 nvm->valid_rx_ant = (u8)le32_to_cpu(rsp->phy_sku.rx_chains); in iwl_get_nvm()
2048 if (le32_to_cpu(rsp->regulatory.lar_enabled) && in iwl_get_nvm()
2049 fw_has_capa(&fw->ucode_capa, in iwl_get_nvm()
2051 nvm->lar_enabled = true; in iwl_get_nvm()
2056 channel_profile = v4 ? (void *)rsp->regulatory.channel_profile : in iwl_get_nvm()
2057 (void *)rsp_v3->regulatory.channel_profile; in iwl_get_nvm()
2061 nvm->valid_tx_ant & fw->valid_tx_ant, in iwl_get_nvm()
2062 nvm->valid_rx_ant & fw->valid_rx_ant, in iwl_get_nvm()
2063 sbands_flags, v4, fw); in iwl_get_nvm()