Lines Matching +full:in +full:- +full:band

8  * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
10 * Copyright(c) 2018 - 2019 Intel Corporation
16 * This program is distributed in the hope that it will be useful, but
21 * The full GNU General Public License is included in this distribution
22 * in the file called COPYING.
26 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
30 * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
32 * Copyright(c) 2018 - 2019 Intel Corporation
35 * Redistribution and use in source and binary forms, with or without
41 * * Redistributions in binary form must reproduce the above copyright
42 * notice, this list of conditions and the following disclaimer in
52 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
57 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
58 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
64 #include "iwl-drv.h"
65 #include "iwl-modparams.h"
66 #include "iwl-eeprom-parse.h"
83 /* corresponding link offsets in EEPROM */
129 #define EEPROM_RF_CFG_TYPE_MSK(x) (x & 0x3) /* bits 0-1 */
130 #define EEPROM_RF_CFG_STEP_MSK(x) ((x >> 2) & 0x3) /* bits 2-3 */
131 #define EEPROM_RF_CFG_DASH_MSK(x) ((x >> 4) & 0x3) /* bits 4-5 */
132 #define EEPROM_RF_CFG_PNUM_MSK(x) ((x >> 6) & 0x3) /* bits 6-7 */
133 #define EEPROM_RF_CFG_TX_ANT_MSK(x) ((x >> 8) & 0xF) /* bits 8-11 */
134 #define EEPROM_RF_CFG_RX_ANT_MSK(x) ((x >> 12) & 0xF) /* bits 12-15 */
139 * These are the channel numbers from each band in the order
140 * that they are stored in the EEPROM band information. Note
142 * there are even special "ht40 bands" in the EEPROM.
148 static const u8 iwl_eeprom_band_2[] = { /* 4915-5080MHz */
152 static const u8 iwl_eeprom_band_3[] = { /* 5170-5320MHz */
156 static const u8 iwl_eeprom_band_4[] = { /* 5500-5700MHz */
160 static const u8 iwl_eeprom_band_5[] = { /* 5725-5825MHz */
199 #define N_RATES_52 (N_RATES_24 - RATES_52_OFFS)
279 return -ENODATA; in iwl_eeprom_read_calib()
280 data->calib_version = hdr->version; in iwl_eeprom_read_calib()
281 data->calib_voltage = hdr->voltage; in iwl_eeprom_read_calib()
287 * enum iwl_eeprom_channel_flags - channel flags in EEPROM
305 * struct iwl_eeprom_channel - EEPROM channel data
307 * @max_power_avg: max power (in dBm) on this channel, at most 31 dBm
330 * @chain_a_max_pwr: chain a max power in 1/2 dBm
331 * @chain_b_max_pwr: chain b max power in 1/2 dBm
332 * @chain_c_max_pwr: chain c max power in 1/2 dBm
333 * @delta_20_in_40: 20-in-40 deltas (hi/lo)
334 * @mimo2_max_pwr: mimo2 max power in 1/2 dBm
335 * @mimo3_max_pwr: mimo3 max power in 1/2 dBm
338 * in an EEPROM image.
357 if (data->valid_tx_ant & ANT_A && txp->chain_a_max > result) in iwl_get_max_txpwr_half_dbm()
358 result = txp->chain_a_max; in iwl_get_max_txpwr_half_dbm()
360 if (data->valid_tx_ant & ANT_B && txp->chain_b_max > result) in iwl_get_max_txpwr_half_dbm()
361 result = txp->chain_b_max; in iwl_get_max_txpwr_half_dbm()
363 if (data->valid_tx_ant & ANT_C && txp->chain_c_max > result) in iwl_get_max_txpwr_half_dbm()
364 result = txp->chain_c_max; in iwl_get_max_txpwr_half_dbm()
366 if ((data->valid_tx_ant == ANT_AB || in iwl_get_max_txpwr_half_dbm()
367 data->valid_tx_ant == ANT_BC || in iwl_get_max_txpwr_half_dbm()
368 data->valid_tx_ant == ANT_AC) && txp->mimo2_max > result) in iwl_get_max_txpwr_half_dbm()
369 result = txp->mimo2_max; in iwl_get_max_txpwr_half_dbm()
371 if (data->valid_tx_ant == ANT_ABC && txp->mimo3_max > result) in iwl_get_max_txpwr_half_dbm()
372 result = txp->mimo3_max; in iwl_get_max_txpwr_half_dbm()
382 ((txp->flags & IWL_EEPROM_ENH_TXP_FL_##x) ? # x " " : "")
390 enum nl80211_band band; in iwl_eeprom_enh_txp_read_element() local
392 band = txp->flags & IWL_EEPROM_ENH_TXP_FL_BAND_52G ? in iwl_eeprom_enh_txp_read_element()
396 struct ieee80211_channel *chan = &data->channels[ch_idx]; in iwl_eeprom_enh_txp_read_element()
399 if (txp->channel != 0 && chan->hw_value != txp->channel) in iwl_eeprom_enh_txp_read_element()
402 /* update matching band only */ in iwl_eeprom_enh_txp_read_element()
403 if (band != chan->band) in iwl_eeprom_enh_txp_read_element()
406 if (chan->max_power < max_txpower_avg && in iwl_eeprom_enh_txp_read_element()
407 !(txp->flags & IWL_EEPROM_ENH_TXP_FL_40MHZ)) in iwl_eeprom_enh_txp_read_element()
408 chan->max_power = max_txpower_avg; in iwl_eeprom_enh_txp_read_element()
424 /* the length is in 16-bit words, but we want entries */ in iwl_eeprom_enhanced_txpower()
435 if (!(txp->flags & IWL_EEPROM_ENH_TXP_FL_VALID)) in iwl_eeprom_enhanced_txpower()
439 (txp->channel && (txp->flags & in iwl_eeprom_enhanced_txpower()
441 "Common " : (txp->channel) ? in iwl_eeprom_enhanced_txpower()
443 (txp->channel), in iwl_eeprom_enhanced_txpower()
452 txp->flags); in iwl_eeprom_enhanced_txpower()
455 txp->chain_a_max, txp->chain_b_max, in iwl_eeprom_enhanced_txpower()
456 txp->chain_c_max); in iwl_eeprom_enhanced_txpower()
459 txp->mimo2_max, txp->mimo3_max, in iwl_eeprom_enhanced_txpower()
460 ((txp->delta_20_in_40 & 0xf0) >> 4), in iwl_eeprom_enhanced_txpower()
461 (txp->delta_20_in_40 & 0x0f)); in iwl_eeprom_enhanced_txpower()
468 if (max_txp_avg_halfdbm > data->max_tx_pwr_half_dbm) in iwl_eeprom_enhanced_txpower()
469 data->max_tx_pwr_half_dbm = max_txp_avg_halfdbm; in iwl_eeprom_enhanced_txpower()
479 u32 offset = cfg->eeprom_params->regulatory_bands[eeprom_band - 1]; in iwl_init_band_reference()
486 case 1: /* 2.4GHz band */ in iwl_init_band_reference()
490 case 2: /* 4.9GHz band */ in iwl_init_band_reference()
494 case 3: /* 5.2GHz band */ in iwl_init_band_reference()
498 case 4: /* 5.5GHz band */ in iwl_init_band_reference()
502 case 5: /* 5.7GHz band */ in iwl_init_band_reference()
522 ((eeprom_ch->flags & EEPROM_CHANNEL_##x) ? # x " " : "")
526 enum nl80211_band band, u16 channel, in iwl_mod_ht40_chan_info() argument
534 if (data->channels[i].band != band) in iwl_mod_ht40_chan_info()
536 if (data->channels[i].hw_value != channel) in iwl_mod_ht40_chan_info()
538 chan = &data->channels[i]; in iwl_mod_ht40_chan_info()
546 "HT40 Ch. %d [%sGHz] %s%s%s%s%s(0x%02x %ddBm): Ad-Hoc %ssupported\n", in iwl_mod_ht40_chan_info()
548 band == NL80211_BAND_5GHZ ? "5.2" : "2.4", in iwl_mod_ht40_chan_info()
554 eeprom_ch->flags, in iwl_mod_ht40_chan_info()
555 eeprom_ch->max_power_avg, in iwl_mod_ht40_chan_info()
556 ((eeprom_ch->flags & EEPROM_CHANNEL_IBSS) && in iwl_mod_ht40_chan_info()
557 !(eeprom_ch->flags & EEPROM_CHANNEL_RADAR)) ? "" in iwl_mod_ht40_chan_info()
560 if (eeprom_ch->flags & EEPROM_CHANNEL_VALID) in iwl_mod_ht40_chan_info()
561 chan->flags &= ~clear_ht40_extension_channel; in iwl_mod_ht40_chan_info()
571 int band, ch_idx; in iwl_init_channel_map() local
580 for (band = 1; band <= 5; band++) { in iwl_init_channel_map()
583 iwl_init_band_reference(cfg, eeprom, eeprom_size, band, in iwl_init_channel_map()
587 /* Loop through each band adding each of the channels */ in iwl_init_channel_map()
593 if (!(eeprom_ch->flags & EEPROM_CHANNEL_VALID)) { in iwl_init_channel_map()
595 "Ch. %d Flags %x [%sGHz] - No traffic\n", in iwl_init_channel_map()
598 (band != 1) ? "5.2" : "2.4"); in iwl_init_channel_map()
602 channel = &data->channels[n_channels]; in iwl_init_channel_map()
605 channel->hw_value = eeprom_ch_array[ch_idx]; in iwl_init_channel_map()
606 channel->band = (band == 1) ? NL80211_BAND_2GHZ in iwl_init_channel_map()
608 channel->center_freq = in iwl_init_channel_map()
610 channel->hw_value, channel->band); in iwl_init_channel_map()
612 /* set no-HT40, will enable as appropriate later */ in iwl_init_channel_map()
613 channel->flags = IEEE80211_CHAN_NO_HT40; in iwl_init_channel_map()
615 if (!(eeprom_ch->flags & EEPROM_CHANNEL_IBSS)) in iwl_init_channel_map()
616 channel->flags |= IEEE80211_CHAN_NO_IR; in iwl_init_channel_map()
618 if (!(eeprom_ch->flags & EEPROM_CHANNEL_ACTIVE)) in iwl_init_channel_map()
619 channel->flags |= IEEE80211_CHAN_NO_IR; in iwl_init_channel_map()
621 if (eeprom_ch->flags & EEPROM_CHANNEL_RADAR) in iwl_init_channel_map()
622 channel->flags |= IEEE80211_CHAN_RADAR; in iwl_init_channel_map()
624 /* Initialize regulatory-based run-time data */ in iwl_init_channel_map()
625 channel->max_power = in iwl_init_channel_map()
628 "Ch. %d [%sGHz] %s%s%s%s%s%s(0x%02x %ddBm): Ad-Hoc %ssupported\n", in iwl_init_channel_map()
629 channel->hw_value, in iwl_init_channel_map()
630 (band != 1) ? "5.2" : "2.4", in iwl_init_channel_map()
647 if (cfg->eeprom_params->enhanced_txpower) { in iwl_init_channel_map()
660 data->max_tx_pwr_half_dbm = -128; in iwl_init_channel_map()
663 data->max_tx_pwr_half_dbm = in iwl_init_channel_map()
664 max_t(s8, data->max_tx_pwr_half_dbm, in iwl_init_channel_map()
665 data->channels[i].max_power * 2); in iwl_init_channel_map()
669 if (cfg->eeprom_params->regulatory_bands[5] == in iwl_init_channel_map()
671 cfg->eeprom_params->regulatory_bands[6] == in iwl_init_channel_map()
676 for (band = 6; band <= 7; band++) { in iwl_init_channel_map()
679 iwl_init_band_reference(cfg, eeprom, eeprom_size, band, in iwl_init_channel_map()
683 /* EEPROM band 6 is 2.4, band 7 is 5 GHz */ in iwl_init_channel_map()
684 ieeeband = (band == 6) ? NL80211_BAND_2GHZ in iwl_init_channel_map()
687 /* Loop through each band adding each of the channels */ in iwl_init_channel_map()
708 int n_channels, enum nl80211_band band) in iwl_init_sband_channels() argument
710 struct ieee80211_channel *chan = &data->channels[0]; in iwl_init_sband_channels()
713 while (idx < n_channels && chan->band != band) in iwl_init_sband_channels()
714 chan = &data->channels[++idx]; in iwl_init_sband_channels()
716 sband->channels = &data->channels[idx]; in iwl_init_sband_channels()
718 while (idx < n_channels && chan->band == band) { in iwl_init_sband_channels()
719 chan = &data->channels[++idx]; in iwl_init_sband_channels()
723 sband->n_channels = n; in iwl_init_sband_channels()
734 enum nl80211_band band, in iwl_init_ht_hw_capab() argument
737 const struct iwl_cfg *cfg = trans->cfg; in iwl_init_ht_hw_capab()
741 if (cfg->rx_with_siso_diversity) in iwl_init_ht_hw_capab()
746 if (!(data->sku_cap_11n_enable) || in iwl_init_ht_hw_capab()
748 !cfg->ht_params) { in iwl_init_ht_hw_capab()
749 ht_info->ht_supported = false; in iwl_init_ht_hw_capab()
753 if (data->sku_cap_mimo_disabled) in iwl_init_ht_hw_capab()
756 ht_info->ht_supported = true; in iwl_init_ht_hw_capab()
757 ht_info->cap = IEEE80211_HT_CAP_DSSSCCK40; in iwl_init_ht_hw_capab()
759 if (cfg->ht_params->stbc) { in iwl_init_ht_hw_capab()
760 ht_info->cap |= (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT); in iwl_init_ht_hw_capab()
763 ht_info->cap |= IEEE80211_HT_CAP_TX_STBC; in iwl_init_ht_hw_capab()
766 if (cfg->ht_params->ldpc) in iwl_init_ht_hw_capab()
767 ht_info->cap |= IEEE80211_HT_CAP_LDPC_CODING; in iwl_init_ht_hw_capab()
769 if ((trans->trans_cfg->mq_rx_supported && in iwl_init_ht_hw_capab()
772 ht_info->cap |= IEEE80211_HT_CAP_MAX_AMSDU; in iwl_init_ht_hw_capab()
774 ht_info->ampdu_factor = cfg->max_ht_ampdu_exponent; in iwl_init_ht_hw_capab()
775 ht_info->ampdu_density = IEEE80211_HT_MPDU_DENSITY_4; in iwl_init_ht_hw_capab()
777 ht_info->mcs.rx_mask[0] = 0xFF; in iwl_init_ht_hw_capab()
779 ht_info->mcs.rx_mask[1] = 0xFF; in iwl_init_ht_hw_capab()
781 ht_info->mcs.rx_mask[2] = 0xFF; in iwl_init_ht_hw_capab()
783 if (cfg->ht_params->ht_greenfield_support) in iwl_init_ht_hw_capab()
784 ht_info->cap |= IEEE80211_HT_CAP_GRN_FLD; in iwl_init_ht_hw_capab()
785 ht_info->cap |= IEEE80211_HT_CAP_SGI_20; in iwl_init_ht_hw_capab()
789 if (cfg->ht_params->ht40_bands & BIT(band)) { in iwl_init_ht_hw_capab()
790 ht_info->cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40; in iwl_init_ht_hw_capab()
791 ht_info->cap |= IEEE80211_HT_CAP_SGI_40; in iwl_init_ht_hw_capab()
798 ht_info->mcs.rx_highest = cpu_to_le16(max_bit_rate); in iwl_init_ht_hw_capab()
801 ht_info->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; in iwl_init_ht_hw_capab()
803 ht_info->mcs.tx_params |= IEEE80211_HT_MCS_TX_RX_DIFF; in iwl_init_ht_hw_capab()
804 ht_info->mcs.tx_params |= ((tx_chains - 1) << in iwl_init_ht_hw_capab()
813 struct device *dev = trans->dev; in iwl_init_sbands()
819 sband = &data->bands[NL80211_BAND_2GHZ]; in iwl_init_sbands()
820 sband->band = NL80211_BAND_2GHZ; in iwl_init_sbands()
821 sband->bitrates = &iwl_cfg80211_rates[RATES_24_OFFS]; in iwl_init_sbands()
822 sband->n_bitrates = N_RATES_24; in iwl_init_sbands()
825 iwl_init_ht_hw_capab(trans, data, &sband->ht_cap, NL80211_BAND_2GHZ, in iwl_init_sbands()
826 data->valid_tx_ant, data->valid_rx_ant); in iwl_init_sbands()
828 sband = &data->bands[NL80211_BAND_5GHZ]; in iwl_init_sbands()
829 sband->band = NL80211_BAND_5GHZ; in iwl_init_sbands()
830 sband->bitrates = &iwl_cfg80211_rates[RATES_52_OFFS]; in iwl_init_sbands()
831 sband->n_bitrates = N_RATES_52; in iwl_init_sbands()
834 iwl_init_ht_hw_capab(trans, data, &sband->ht_cap, NL80211_BAND_5GHZ, in iwl_init_sbands()
835 data->valid_tx_ant, data->valid_rx_ant); in iwl_init_sbands()
849 struct device *dev = trans->dev; in iwl_parse_eeprom_data()
853 if (WARN_ON(!cfg || !cfg->eeprom_params)) in iwl_parse_eeprom_data()
865 memcpy(data->hw_addr, tmp, ETH_ALEN); in iwl_parse_eeprom_data()
866 data->n_hw_addrs = iwl_eeprom_query16(eeprom, eeprom_size, in iwl_parse_eeprom_data()
875 memcpy(data->xtal_calib, tmp, sizeof(data->xtal_calib)); in iwl_parse_eeprom_data()
881 data->raw_temperature = *(__le16 *)tmp; in iwl_parse_eeprom_data()
887 data->kelvin_temperature = *(__le16 *)tmp; in iwl_parse_eeprom_data()
888 data->kelvin_voltage = *((__le16 *)tmp + 1); in iwl_parse_eeprom_data()
892 data->radio_cfg_dash = EEPROM_RF_CFG_DASH_MSK(radio_cfg); in iwl_parse_eeprom_data()
893 data->radio_cfg_pnum = EEPROM_RF_CFG_PNUM_MSK(radio_cfg); in iwl_parse_eeprom_data()
894 data->radio_cfg_step = EEPROM_RF_CFG_STEP_MSK(radio_cfg); in iwl_parse_eeprom_data()
895 data->radio_cfg_type = EEPROM_RF_CFG_TYPE_MSK(radio_cfg); in iwl_parse_eeprom_data()
896 data->valid_rx_ant = EEPROM_RF_CFG_RX_ANT_MSK(radio_cfg); in iwl_parse_eeprom_data()
897 data->valid_tx_ant = EEPROM_RF_CFG_TX_ANT_MSK(radio_cfg); in iwl_parse_eeprom_data()
901 data->sku_cap_11n_enable = sku & EEPROM_SKU_CAP_11N_ENABLE; in iwl_parse_eeprom_data()
902 data->sku_cap_amt_enable = sku & EEPROM_SKU_CAP_AMT_ENABLE; in iwl_parse_eeprom_data()
903 data->sku_cap_band_24ghz_enable = sku & EEPROM_SKU_CAP_BAND_24GHZ; in iwl_parse_eeprom_data()
904 data->sku_cap_band_52ghz_enable = sku & EEPROM_SKU_CAP_BAND_52GHZ; in iwl_parse_eeprom_data()
905 data->sku_cap_ipan_enable = sku & EEPROM_SKU_CAP_IPAN_ENABLE; in iwl_parse_eeprom_data()
907 data->sku_cap_11n_enable = false; in iwl_parse_eeprom_data()
909 data->nvm_version = iwl_eeprom_query16(eeprom, eeprom_size, in iwl_parse_eeprom_data()
913 if (cfg->valid_tx_ant) in iwl_parse_eeprom_data()
914 data->valid_tx_ant = cfg->valid_tx_ant; in iwl_parse_eeprom_data()
915 if (cfg->valid_rx_ant) in iwl_parse_eeprom_data()
916 data->valid_rx_ant = cfg->valid_rx_ant; in iwl_parse_eeprom_data()
918 if (!data->valid_tx_ant || !data->valid_rx_ant) { in iwl_parse_eeprom_data()
920 data->valid_tx_ant, data->valid_rx_ant); in iwl_parse_eeprom_data()