Lines Matching +full:eeprom +full:- +full:data
1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
3 * Copyright (C) 2005-2014, 2018-2019, 2021, 2024 Intel Corporation
9 #include "iwl-drv.h"
10 #include "iwl-debug.h"
11 #include "iwl-io.h"
12 #include "iwl-prph.h"
13 #include "iwl-csr.h"
16 /* EEPROM offset definitions */
31 /* corresponding link offsets in EEPROM */
67 /* SKU Capabilities (actual values from EEPROM definition) */
76 /* radio config bits (actual values from EEPROM definition) */
77 #define EEPROM_RF_CFG_TYPE_MSK(x) (x & 0x3) /* bits 0-1 */
78 #define EEPROM_RF_CFG_STEP_MSK(x) ((x >> 2) & 0x3) /* bits 2-3 */
79 #define EEPROM_RF_CFG_DASH_MSK(x) ((x >> 4) & 0x3) /* bits 4-5 */
80 #define EEPROM_RF_CFG_PNUM_MSK(x) ((x >> 6) & 0x3) /* bits 6-7 */
81 #define EEPROM_RF_CFG_TX_ANT_MSK(x) ((x >> 8) & 0xF) /* bits 8-11 */
82 #define EEPROM_RF_CFG_RX_ANT_MSK(x) ((x >> 12) & 0xF) /* bits 12-15 */
85 * EEPROM bands
87 * that they are stored in the EEPROM band information. Note
88 * that EEPROM bands aren't the same as mac80211 bands, and
89 * there are even special "ht40 bands" in the EEPROM.
95 static const u8 iwl_eeprom_band_2[] = { /* 4915-5080MHz */
99 static const u8 iwl_eeprom_band_3[] = { /* 5170-5320MHz */
103 static const u8 iwl_eeprom_band_4[] = { /* 5500-5700MHz */
107 static const u8 iwl_eeprom_band_5[] = { /* 5725-5825MHz */
125 /* rate data (static) */
146 #define N_RATES_52 (N_RATES_24 - RATES_52_OFFS)
148 /* EEPROM reading functions */
150 static u16 iwl_eeprom_query16(const u8 *eeprom, size_t eeprom_size, int offset) in iwl_eeprom_query16() argument
154 return le16_to_cpup((__le16 *)(eeprom + offset)); in iwl_eeprom_query16()
157 static u32 eeprom_indirect_address(const u8 *eeprom, size_t eeprom_size, in eeprom_indirect_address() argument
167 offset = iwl_eeprom_query16(eeprom, eeprom_size, in eeprom_indirect_address()
171 offset = iwl_eeprom_query16(eeprom, eeprom_size, in eeprom_indirect_address()
175 offset = iwl_eeprom_query16(eeprom, eeprom_size, in eeprom_indirect_address()
179 offset = iwl_eeprom_query16(eeprom, eeprom_size, in eeprom_indirect_address()
183 offset = iwl_eeprom_query16(eeprom, eeprom_size, in eeprom_indirect_address()
187 offset = iwl_eeprom_query16(eeprom, eeprom_size, in eeprom_indirect_address()
191 offset = iwl_eeprom_query16(eeprom, eeprom_size, in eeprom_indirect_address()
195 offset = iwl_eeprom_query16(eeprom, eeprom_size, in eeprom_indirect_address()
207 static const u8 *iwl_eeprom_query_addr(const u8 *eeprom, size_t eeprom_size, in iwl_eeprom_query_addr() argument
210 u32 address = eeprom_indirect_address(eeprom, eeprom_size, offset); in iwl_eeprom_query_addr()
215 return &eeprom[address]; in iwl_eeprom_query_addr()
218 static int iwl_eeprom_read_calib(const u8 *eeprom, size_t eeprom_size, in iwl_eeprom_read_calib() argument
219 struct iwl_nvm_data *data) in iwl_eeprom_read_calib() argument
223 hdr = (void *)iwl_eeprom_query_addr(eeprom, eeprom_size, in iwl_eeprom_read_calib()
226 return -ENODATA; in iwl_eeprom_read_calib()
227 data->calib_version = hdr->version; in iwl_eeprom_read_calib()
228 data->calib_voltage = hdr->voltage; in iwl_eeprom_read_calib()
234 * enum iwl_eeprom_channel_flags - channel flags in EEPROM
252 * struct iwl_eeprom_channel - EEPROM channel data
273 * struct iwl_eeprom_enhanced_txpwr - enhanced regulatory TX power limits
279 * @delta_20_in_40: 20-in-40 deltas (hi/lo)
284 * in an EEPROM image.
297 static s8 iwl_get_max_txpwr_half_dbm(const struct iwl_nvm_data *data, in iwl_get_max_txpwr_half_dbm() argument
303 if (data->valid_tx_ant & ANT_A && txp->chain_a_max > result) in iwl_get_max_txpwr_half_dbm()
304 result = txp->chain_a_max; in iwl_get_max_txpwr_half_dbm()
306 if (data->valid_tx_ant & ANT_B && txp->chain_b_max > result) in iwl_get_max_txpwr_half_dbm()
307 result = txp->chain_b_max; in iwl_get_max_txpwr_half_dbm()
309 if (data->valid_tx_ant & ANT_C && txp->chain_c_max > result) in iwl_get_max_txpwr_half_dbm()
310 result = txp->chain_c_max; in iwl_get_max_txpwr_half_dbm()
312 if ((data->valid_tx_ant == ANT_AB || in iwl_get_max_txpwr_half_dbm()
313 data->valid_tx_ant == ANT_BC || in iwl_get_max_txpwr_half_dbm()
314 data->valid_tx_ant == ANT_AC) && txp->mimo2_max > result) in iwl_get_max_txpwr_half_dbm()
315 result = txp->mimo2_max; in iwl_get_max_txpwr_half_dbm()
317 if (data->valid_tx_ant == ANT_ABC && txp->mimo3_max > result) in iwl_get_max_txpwr_half_dbm()
318 result = txp->mimo3_max; in iwl_get_max_txpwr_half_dbm()
328 ((txp->flags & IWL_EEPROM_ENH_TXP_FL_##x) ? # x " " : "")
331 iwl_eeprom_enh_txp_read_element(struct iwl_nvm_data *data, in iwl_eeprom_enh_txp_read_element() argument
338 band = txp->flags & IWL_EEPROM_ENH_TXP_FL_BAND_52G ? in iwl_eeprom_enh_txp_read_element()
342 struct ieee80211_channel *chan = &data->channels[ch_idx]; in iwl_eeprom_enh_txp_read_element()
344 /* update matching channel or from common data only */ in iwl_eeprom_enh_txp_read_element()
345 if (txp->channel != 0 && chan->hw_value != txp->channel) in iwl_eeprom_enh_txp_read_element()
349 if (band != chan->band) in iwl_eeprom_enh_txp_read_element()
352 if (chan->max_power < max_txpower_avg && in iwl_eeprom_enh_txp_read_element()
353 !(txp->flags & IWL_EEPROM_ENH_TXP_FL_40MHZ)) in iwl_eeprom_enh_txp_read_element()
354 chan->max_power = max_txpower_avg; in iwl_eeprom_enh_txp_read_element()
359 struct iwl_nvm_data *data, in iwl_eeprom_enhanced_txpower() argument
360 const u8 *eeprom, size_t eeprom_size, in iwl_eeprom_enhanced_txpower() argument
370 /* the length is in 16-bit words, but we want entries */ in iwl_eeprom_enhanced_txpower()
371 txp_len = (__le16 *)iwl_eeprom_query_addr(eeprom, eeprom_size, in iwl_eeprom_enhanced_txpower()
375 txp_array = (void *)iwl_eeprom_query_addr(eeprom, eeprom_size, in iwl_eeprom_enhanced_txpower()
381 if (!(txp->flags & IWL_EEPROM_ENH_TXP_FL_VALID)) in iwl_eeprom_enhanced_txpower()
385 (txp->channel && (txp->flags & in iwl_eeprom_enhanced_txpower()
387 "Common " : (txp->channel) ? in iwl_eeprom_enhanced_txpower()
389 (txp->channel), in iwl_eeprom_enhanced_txpower()
398 txp->flags); in iwl_eeprom_enhanced_txpower()
401 txp->chain_a_max, txp->chain_b_max, in iwl_eeprom_enhanced_txpower()
402 txp->chain_c_max); in iwl_eeprom_enhanced_txpower()
405 txp->mimo2_max, txp->mimo3_max, in iwl_eeprom_enhanced_txpower()
406 ((txp->delta_20_in_40 & 0xf0) >> 4), in iwl_eeprom_enhanced_txpower()
407 (txp->delta_20_in_40 & 0x0f)); in iwl_eeprom_enhanced_txpower()
409 max_txp_avg_halfdbm = iwl_get_max_txpwr_half_dbm(data, txp); in iwl_eeprom_enhanced_txpower()
411 iwl_eeprom_enh_txp_read_element(data, txp, n_channels, in iwl_eeprom_enhanced_txpower()
414 if (max_txp_avg_halfdbm > data->max_tx_pwr_half_dbm) in iwl_eeprom_enhanced_txpower()
415 data->max_tx_pwr_half_dbm = max_txp_avg_halfdbm; in iwl_eeprom_enhanced_txpower()
420 const u8 *eeprom, size_t eeprom_size, in iwl_init_band_reference() argument
425 u32 offset = cfg->eeprom_params->regulatory_bands[eeprom_band - 1]; in iwl_init_band_reference()
429 *ch_info = (void *)iwl_eeprom_query_addr(eeprom, eeprom_size, offset); in iwl_init_band_reference()
468 ((eeprom_ch->flags & EEPROM_CHANNEL_##x) ? # x " " : "")
471 struct iwl_nvm_data *data, int n_channels, in iwl_mod_ht40_chan_info() argument
480 if (data->channels[i].band != band) in iwl_mod_ht40_chan_info()
482 if (data->channels[i].hw_value != channel) in iwl_mod_ht40_chan_info()
484 chan = &data->channels[i]; in iwl_mod_ht40_chan_info()
492 "HT40 Ch. %d [%sGHz] %s%s%s%s%s(0x%02x %ddBm): Ad-Hoc %ssupported\n", in iwl_mod_ht40_chan_info()
500 eeprom_ch->flags, in iwl_mod_ht40_chan_info()
501 eeprom_ch->max_power_avg, in iwl_mod_ht40_chan_info()
502 ((eeprom_ch->flags & EEPROM_CHANNEL_IBSS) && in iwl_mod_ht40_chan_info()
503 !(eeprom_ch->flags & EEPROM_CHANNEL_RADAR)) ? "" in iwl_mod_ht40_chan_info()
506 if (eeprom_ch->flags & EEPROM_CHANNEL_VALID) in iwl_mod_ht40_chan_info()
507 chan->flags &= ~clear_ht40_extension_channel; in iwl_mod_ht40_chan_info()
514 struct iwl_nvm_data *data, in iwl_init_channel_map() argument
515 const u8 *eeprom, size_t eeprom_size) in iwl_init_channel_map() argument
524 * Loop through the 5 EEPROM bands and add them to the parse list in iwl_init_channel_map()
529 iwl_init_band_reference(cfg, eeprom, eeprom_size, band, in iwl_init_channel_map()
539 if (!(eeprom_ch->flags & EEPROM_CHANNEL_VALID)) { in iwl_init_channel_map()
541 "Ch. %d Flags %x [%sGHz] - No traffic\n", in iwl_init_channel_map()
548 channel = &data->channels[n_channels]; in iwl_init_channel_map()
551 channel->hw_value = eeprom_ch_array[ch_idx]; in iwl_init_channel_map()
552 channel->band = (band == 1) ? NL80211_BAND_2GHZ in iwl_init_channel_map()
554 channel->center_freq = in iwl_init_channel_map()
556 channel->hw_value, channel->band); in iwl_init_channel_map()
558 /* set no-HT40, will enable as appropriate later */ in iwl_init_channel_map()
559 channel->flags = IEEE80211_CHAN_NO_HT40; in iwl_init_channel_map()
561 if (!(eeprom_ch->flags & EEPROM_CHANNEL_IBSS)) in iwl_init_channel_map()
562 channel->flags |= IEEE80211_CHAN_NO_IR; in iwl_init_channel_map()
564 if (!(eeprom_ch->flags & EEPROM_CHANNEL_ACTIVE)) in iwl_init_channel_map()
565 channel->flags |= IEEE80211_CHAN_NO_IR; in iwl_init_channel_map()
567 if (eeprom_ch->flags & EEPROM_CHANNEL_RADAR) in iwl_init_channel_map()
568 channel->flags |= IEEE80211_CHAN_RADAR; in iwl_init_channel_map()
570 /* Initialize regulatory-based run-time data */ in iwl_init_channel_map()
571 channel->max_power = in iwl_init_channel_map()
574 "Ch. %d [%sGHz] %s%s%s%s%s%s(0x%02x %ddBm): Ad-Hoc %ssupported\n", in iwl_init_channel_map()
575 channel->hw_value, in iwl_init_channel_map()
593 if (cfg->eeprom_params->enhanced_txpower) { in iwl_init_channel_map()
596 * EEPROM contain enhanced tx power information in iwl_init_channel_map()
600 iwl_eeprom_enhanced_txpower(dev, data, eeprom, eeprom_size, in iwl_init_channel_map()
603 /* All others use data from channel map */ in iwl_init_channel_map()
606 data->max_tx_pwr_half_dbm = -128; in iwl_init_channel_map()
609 data->max_tx_pwr_half_dbm = in iwl_init_channel_map()
610 max_t(s8, data->max_tx_pwr_half_dbm, in iwl_init_channel_map()
611 data->channels[i].max_power * 2); in iwl_init_channel_map()
615 if (cfg->eeprom_params->regulatory_bands[5] == in iwl_init_channel_map()
617 cfg->eeprom_params->regulatory_bands[6] == in iwl_init_channel_map()
621 /* Two additional EEPROM bands for 2.4 and 5 GHz HT40 channels */ in iwl_init_channel_map()
625 iwl_init_band_reference(cfg, eeprom, eeprom_size, band, in iwl_init_channel_map()
629 /* EEPROM band 6 is 2.4, band 7 is 5 GHz */ in iwl_init_channel_map()
636 iwl_mod_ht40_chan_info(dev, data, n_channels, ieeeband, in iwl_init_channel_map()
642 iwl_mod_ht40_chan_info(dev, data, n_channels, ieeeband, in iwl_init_channel_map()
652 * EEPROM access time values:
654 * Driver initiates EEPROM read by writing byte address << 1 to CSR_EEPROM_REG.
657 * Driver reads 16-bit value from bits 31-16 of CSR_EEPROM_REG.
662 * The device's EEPROM semaphore prevents conflicts between driver and uCode
663 * when accessing the EEPROM; each access is a series of pulses to/from the
664 * EEPROM chip, not a single event, so even reads could conflict if they
687 IWL_DEBUG_EEPROM(trans->dev, in iwl_eeprom_acquire_semaphore()
707 IWL_DEBUG_EEPROM(trans->dev, "EEPROM signature=0x%08x\n", gp); in iwl_eeprom_verify_signature()
712 IWL_ERR(trans, "EEPROM with bad signature: 0x%08x\n", in iwl_eeprom_verify_signature()
714 return -ENOENT; in iwl_eeprom_verify_signature()
721 return -ENOENT; in iwl_eeprom_verify_signature()
727 "bad EEPROM/OTP signature, type=%s, EEPROM_GP=0x%08x\n", in iwl_eeprom_verify_signature()
728 nvm_is_otp ? "OTP" : "EEPROM", gp); in iwl_eeprom_verify_signature()
729 return -ENOENT; in iwl_eeprom_verify_signature()
752 switch (trans->hw_rev & CSR_HW_REV_TYPE_MSK) { in iwl_nvm_is_otp()
755 return -EIO; in iwl_nvm_is_otp()
784 * CSR auto clock gate disable bit - in iwl_init_otp_access()
787 if (trans->trans_cfg->base_params->shadow_ram_support) in iwl_init_otp_access()
820 return -EINVAL; in iwl_read_otp_word()
858 * iwl_find_otp_image: find EEPROM image in OTP
859 * finding the OTP block that contains the EEPROM image.
878 return -EINVAL; in iwl_find_otp_image()
891 IWL_DEBUG_EEPROM(trans->dev, "OTP blocks %d addr 0x%x\n", in iwl_find_otp_image()
894 return -EINVAL; in iwl_find_otp_image()
908 } while (usedblocks <= trans->trans_cfg->base_params->max_ll_items); in iwl_find_otp_image()
911 IWL_DEBUG_EEPROM(trans->dev, "OTP has no valid blocks\n"); in iwl_find_otp_image()
912 return -EINVAL; in iwl_find_otp_image()
916 * iwl_read_eeprom - read EEPROM contents
918 * Load the EEPROM contents from adapter and return it
921 * NOTE: This routine uses the non-debug IO access functions.
923 int iwl_read_eeprom(struct iwl_trans *trans, u8 **eeprom, size_t *eeprom_size) in iwl_read_eeprom() argument
934 if (!eeprom || !eeprom_size) in iwl_read_eeprom()
935 return -EINVAL; in iwl_read_eeprom()
941 sz = trans->trans_cfg->base_params->eeprom_size; in iwl_read_eeprom()
942 IWL_DEBUG_EEPROM(trans->dev, "NVM size = %d\n", sz); in iwl_read_eeprom()
946 return -ENOMEM; in iwl_read_eeprom()
950 IWL_ERR(trans, "EEPROM not found, EEPROM_GP=0x%08x\n", gp); in iwl_read_eeprom()
954 /* Make sure driver (instead of uCode) is allowed to read EEPROM */ in iwl_read_eeprom()
957 IWL_ERR(trans, "Failed to acquire EEPROM semaphore.\n"); in iwl_read_eeprom()
976 if (!trans->trans_cfg->base_params->shadow_ram_support) { in iwl_read_eeprom()
992 /* eeprom is an array of 16bit values */ in iwl_read_eeprom()
1005 "Time out reading EEPROM[%d]\n", addr); in iwl_read_eeprom()
1013 IWL_DEBUG_EEPROM(trans->dev, "NVM Type: %s\n", in iwl_read_eeprom()
1014 nvm_is_otp ? "OTP" : "EEPROM"); in iwl_read_eeprom()
1019 *eeprom = (u8 *)e; in iwl_read_eeprom()
1031 struct iwl_nvm_data *data, in iwl_init_sbands() argument
1032 const u8 *eeprom, size_t eeprom_size) in iwl_init_sbands() argument
1034 struct device *dev = trans->dev; in iwl_init_sbands()
1035 int n_channels = iwl_init_channel_map(dev, cfg, data, in iwl_init_sbands()
1036 eeprom, eeprom_size); in iwl_init_sbands()
1040 sband = &data->bands[NL80211_BAND_2GHZ]; in iwl_init_sbands()
1041 sband->band = NL80211_BAND_2GHZ; in iwl_init_sbands()
1042 sband->bitrates = &iwl_cfg80211_rates[RATES_24_OFFS]; in iwl_init_sbands()
1043 sband->n_bitrates = N_RATES_24; in iwl_init_sbands()
1044 n_used += iwl_init_sband_channels(data, sband, n_channels, in iwl_init_sbands()
1046 iwl_init_ht_hw_capab(trans, data, &sband->ht_cap, NL80211_BAND_2GHZ, in iwl_init_sbands()
1047 data->valid_tx_ant, data->valid_rx_ant); in iwl_init_sbands()
1049 sband = &data->bands[NL80211_BAND_5GHZ]; in iwl_init_sbands()
1050 sband->band = NL80211_BAND_5GHZ; in iwl_init_sbands()
1051 sband->bitrates = &iwl_cfg80211_rates[RATES_52_OFFS]; in iwl_init_sbands()
1052 sband->n_bitrates = N_RATES_52; in iwl_init_sbands()
1053 n_used += iwl_init_sband_channels(data, sband, n_channels, in iwl_init_sbands()
1055 iwl_init_ht_hw_capab(trans, data, &sband->ht_cap, NL80211_BAND_5GHZ, in iwl_init_sbands()
1056 data->valid_tx_ant, data->valid_rx_ant); in iwl_init_sbands()
1059 IWL_ERR_DEV(dev, "EEPROM: used only %d of %d channels\n", in iwl_init_sbands()
1063 /* EEPROM data functions */
1066 const u8 *eeprom, size_t eeprom_size) in iwl_parse_eeprom_data() argument
1068 struct iwl_nvm_data *data; in iwl_parse_eeprom_data() local
1069 struct device *dev = trans->dev; in iwl_parse_eeprom_data()
1073 if (WARN_ON(!cfg || !cfg->eeprom_params)) in iwl_parse_eeprom_data()
1076 data = kzalloc(struct_size(data, channels, IWL_NUM_CHANNELS), in iwl_parse_eeprom_data()
1078 if (!data) in iwl_parse_eeprom_data()
1082 tmp = iwl_eeprom_query_addr(eeprom, eeprom_size, EEPROM_MAC_ADDRESS); in iwl_parse_eeprom_data()
1085 memcpy(data->hw_addr, tmp, ETH_ALEN); in iwl_parse_eeprom_data()
1086 data->n_hw_addrs = iwl_eeprom_query16(eeprom, eeprom_size, in iwl_parse_eeprom_data()
1089 if (iwl_eeprom_read_calib(eeprom, eeprom_size, data)) in iwl_parse_eeprom_data()
1092 tmp = iwl_eeprom_query_addr(eeprom, eeprom_size, EEPROM_XTAL); in iwl_parse_eeprom_data()
1095 memcpy(data->xtal_calib, tmp, sizeof(data->xtal_calib)); in iwl_parse_eeprom_data()
1097 tmp = iwl_eeprom_query_addr(eeprom, eeprom_size, in iwl_parse_eeprom_data()
1101 data->raw_temperature = *(__le16 *)tmp; in iwl_parse_eeprom_data()
1103 tmp = iwl_eeprom_query_addr(eeprom, eeprom_size, in iwl_parse_eeprom_data()
1107 data->kelvin_temperature = *(__le16 *)tmp; in iwl_parse_eeprom_data()
1108 data->kelvin_voltage = *((__le16 *)tmp + 1); in iwl_parse_eeprom_data()
1111 iwl_eeprom_query16(eeprom, eeprom_size, EEPROM_RADIO_CONFIG); in iwl_parse_eeprom_data()
1112 data->radio_cfg_dash = EEPROM_RF_CFG_DASH_MSK(radio_cfg); in iwl_parse_eeprom_data()
1113 data->radio_cfg_pnum = EEPROM_RF_CFG_PNUM_MSK(radio_cfg); in iwl_parse_eeprom_data()
1114 data->radio_cfg_step = EEPROM_RF_CFG_STEP_MSK(radio_cfg); in iwl_parse_eeprom_data()
1115 data->radio_cfg_type = EEPROM_RF_CFG_TYPE_MSK(radio_cfg); in iwl_parse_eeprom_data()
1116 data->valid_rx_ant = EEPROM_RF_CFG_RX_ANT_MSK(radio_cfg); in iwl_parse_eeprom_data()
1117 data->valid_tx_ant = EEPROM_RF_CFG_TX_ANT_MSK(radio_cfg); in iwl_parse_eeprom_data()
1119 sku = iwl_eeprom_query16(eeprom, eeprom_size, in iwl_parse_eeprom_data()
1121 data->sku_cap_11n_enable = sku & EEPROM_SKU_CAP_11N_ENABLE; in iwl_parse_eeprom_data()
1122 data->sku_cap_amt_enable = sku & EEPROM_SKU_CAP_AMT_ENABLE; in iwl_parse_eeprom_data()
1123 data->sku_cap_band_24ghz_enable = sku & EEPROM_SKU_CAP_BAND_24GHZ; in iwl_parse_eeprom_data()
1124 data->sku_cap_band_52ghz_enable = sku & EEPROM_SKU_CAP_BAND_52GHZ; in iwl_parse_eeprom_data()
1125 data->sku_cap_ipan_enable = sku & EEPROM_SKU_CAP_IPAN_ENABLE; in iwl_parse_eeprom_data()
1127 data->sku_cap_11n_enable = false; in iwl_parse_eeprom_data()
1129 data->nvm_version = iwl_eeprom_query16(eeprom, eeprom_size, in iwl_parse_eeprom_data()
1132 /* check overrides (some devices have wrong EEPROM) */ in iwl_parse_eeprom_data()
1133 if (cfg->valid_tx_ant) in iwl_parse_eeprom_data()
1134 data->valid_tx_ant = cfg->valid_tx_ant; in iwl_parse_eeprom_data()
1135 if (cfg->valid_rx_ant) in iwl_parse_eeprom_data()
1136 data->valid_rx_ant = cfg->valid_rx_ant; in iwl_parse_eeprom_data()
1138 if (!data->valid_tx_ant || !data->valid_rx_ant) { in iwl_parse_eeprom_data()
1140 data->valid_tx_ant, data->valid_rx_ant); in iwl_parse_eeprom_data()
1144 iwl_init_sbands(trans, cfg, data, eeprom, eeprom_size); in iwl_parse_eeprom_data()
1146 return data; in iwl_parse_eeprom_data()
1148 kfree(data); in iwl_parse_eeprom_data()