1 /******************************************************************************
3 * This file is provided under a dual BSD/GPLv2 license. When using or
4 * redistributing this file, you may do so under either license.
8 * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of version 2 of the GNU General Public License as
12 * published by the Free Software Foundation.
14 * This program is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
24 * The full GNU General Public License is included in this distribution
25 * in the file called COPYING.
27 * Contact Information:
28 * Intel Linux Wireless <ilw@linux.intel.com>
29 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
33 * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
34 * All rights reserved.
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
40 * * Redistributions of source code must retain the above copyright
41 * notice, this list of conditions and the following disclaimer.
42 * * Redistributions in binary form must reproduce the above copyright
43 * notice, this list of conditions and the following disclaimer in
44 * the documentation and/or other materials provided with the
46 * * Neither the name Intel Corporation nor the names of its
47 * contributors may be used to endorse or promote products derived
48 * from this software without specific prior written permission.
50 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
51 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
52 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
53 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
54 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
55 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
56 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
57 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
58 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
59 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
60 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
61 *****************************************************************************/
62 #include <linux/types.h>
63 #include <linux/slab.h>
64 #include <linux/export.h>
65 #include <linux/etherdevice.h>
66 #include <linux/pci.h>
68 #include "iwl-modparams.h"
69 #include "iwl-nvm-parse.h"
71 /* NVM offsets (in words) definitions */
72 enum wkp_nvm_offsets {
73 /* NVM HW-Section offset (in words) definitions */
76 /* NVM SW-Section offset (in words) definitions */
77 NVM_SW_SECTION = 0x1C0,
82 NVM_CHANNELS = 0x1E0 - NVM_SW_SECTION,
84 /* NVM calibration section offset (in words) definitions */
85 NVM_CALIB_SECTION = 0x2B8,
86 XTAL_CALIB = 0x316 - NVM_CALIB_SECTION
89 enum family_8000_nvm_offsets {
90 /* NVM HW-Section offset (in words) definitions */
91 HW_ADDR0_WFPM_FAMILY_8000 = 0x12,
92 HW_ADDR1_WFPM_FAMILY_8000 = 0x16,
93 HW_ADDR0_PCIE_FAMILY_8000 = 0x8A,
94 HW_ADDR1_PCIE_FAMILY_8000 = 0x8E,
95 MAC_ADDRESS_OVERRIDE_FAMILY_8000 = 1,
97 /* NVM SW-Section offset (in words) definitions */
98 NVM_SW_SECTION_FAMILY_8000 = 0x1C0,
99 NVM_VERSION_FAMILY_8000 = 0,
100 RADIO_CFG_FAMILY_8000 = 2,
102 N_HW_ADDRS_FAMILY_8000 = 5,
104 /* NVM REGULATORY -Section offset (in words) definitions */
105 NVM_CHANNELS_FAMILY_8000 = 0,
107 /* NVM calibration section offset (in words) definitions */
108 NVM_CALIB_SECTION_FAMILY_8000 = 0x2B8,
109 XTAL_CALIB_FAMILY_8000 = 0x316 - NVM_CALIB_SECTION_FAMILY_8000
112 /* SKU Capabilities (actual values from NVM definition) */
114 NVM_SKU_CAP_BAND_24GHZ = BIT(0),
115 NVM_SKU_CAP_BAND_52GHZ = BIT(1),
116 NVM_SKU_CAP_11N_ENABLE = BIT(2),
117 NVM_SKU_CAP_11AC_ENABLE = BIT(3),
121 * These are the channel numbers in the order that they are stored in the NVM
123 static const u8 iwl_nvm_channels[] = {
125 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
127 36, 40, 44 , 48, 52, 56, 60, 64,
128 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144,
129 149, 153, 157, 161, 165
132 static const u8 iwl_nvm_channels_family_8000[] = {
134 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
136 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92,
137 96, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144,
138 149, 153, 157, 161, 165, 169, 173, 177, 181
141 #define IWL_NUM_CHANNELS ARRAY_SIZE(iwl_nvm_channels)
142 #define IWL_NUM_CHANNELS_FAMILY_8000 ARRAY_SIZE(iwl_nvm_channels_family_8000)
143 #define NUM_2GHZ_CHANNELS 14
144 #define NUM_2GHZ_CHANNELS_FAMILY_8000 14
145 #define FIRST_2GHZ_HT_MINUS 5
146 #define LAST_2GHZ_HT_PLUS 9
147 #define LAST_5GHZ_HT 161
149 /* rate data (static) */
150 static struct ieee80211_rate iwl_cfg80211_rates[] = {
151 { .bitrate = 1 * 10, .hw_value = 0, .hw_value_short = 0, },
152 { .bitrate = 2 * 10, .hw_value = 1, .hw_value_short = 1,
153 .flags = IEEE80211_RATE_SHORT_PREAMBLE, },
154 { .bitrate = 5.5 * 10, .hw_value = 2, .hw_value_short = 2,
155 .flags = IEEE80211_RATE_SHORT_PREAMBLE, },
156 { .bitrate = 11 * 10, .hw_value = 3, .hw_value_short = 3,
157 .flags = IEEE80211_RATE_SHORT_PREAMBLE, },
158 { .bitrate = 6 * 10, .hw_value = 4, .hw_value_short = 4, },
159 { .bitrate = 9 * 10, .hw_value = 5, .hw_value_short = 5, },
160 { .bitrate = 12 * 10, .hw_value = 6, .hw_value_short = 6, },
161 { .bitrate = 18 * 10, .hw_value = 7, .hw_value_short = 7, },
162 { .bitrate = 24 * 10, .hw_value = 8, .hw_value_short = 8, },
163 { .bitrate = 36 * 10, .hw_value = 9, .hw_value_short = 9, },
164 { .bitrate = 48 * 10, .hw_value = 10, .hw_value_short = 10, },
165 { .bitrate = 54 * 10, .hw_value = 11, .hw_value_short = 11, },
167 #define RATES_24_OFFS 0
168 #define N_RATES_24 ARRAY_SIZE(iwl_cfg80211_rates)
169 #define RATES_52_OFFS 4
170 #define N_RATES_52 (N_RATES_24 - RATES_52_OFFS)
173 * enum iwl_nvm_channel_flags - channel flags in NVM
174 * @NVM_CHANNEL_VALID: channel is usable for this SKU/geo
175 * @NVM_CHANNEL_IBSS: usable as an IBSS channel
176 * @NVM_CHANNEL_ACTIVE: active scanning allowed
177 * @NVM_CHANNEL_RADAR: radar detection required
178 * @NVM_CHANNEL_INDOOR_ONLY: only indoor use is allowed
179 * @NVM_CHANNEL_GO_CONCURRENT: GO operation is allowed when connected to BSS
180 * on same channel on 2.4 or same UNII band on 5.2
181 * @NVM_CHANNEL_WIDE: 20 MHz channel okay (?)
182 * @NVM_CHANNEL_40MHZ: 40 MHz channel okay (?)
183 * @NVM_CHANNEL_80MHZ: 80 MHz channel okay (?)
184 * @NVM_CHANNEL_160MHZ: 160 MHz channel okay (?)
186 enum iwl_nvm_channel_flags {
187 NVM_CHANNEL_VALID = BIT(0),
188 NVM_CHANNEL_IBSS = BIT(1),
189 NVM_CHANNEL_ACTIVE = BIT(3),
190 NVM_CHANNEL_RADAR = BIT(4),
191 NVM_CHANNEL_INDOOR_ONLY = BIT(5),
192 NVM_CHANNEL_GO_CONCURRENT = BIT(6),
193 NVM_CHANNEL_WIDE = BIT(8),
194 NVM_CHANNEL_40MHZ = BIT(9),
195 NVM_CHANNEL_80MHZ = BIT(10),
196 NVM_CHANNEL_160MHZ = BIT(11),
199 #define CHECK_AND_PRINT_I(x) \
200 ((ch_flags & NVM_CHANNEL_##x) ? # x " " : "")
202 static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
203 struct iwl_nvm_data *data,
204 const __le16 * const nvm_ch_flags)
208 struct ieee80211_channel *channel;
211 int num_of_ch, num_2ghz_channels;
214 if (cfg->device_family != IWL_DEVICE_FAMILY_8000) {
215 num_of_ch = IWL_NUM_CHANNELS;
216 nvm_chan = &iwl_nvm_channels[0];
217 num_2ghz_channels = NUM_2GHZ_CHANNELS;
219 num_of_ch = IWL_NUM_CHANNELS_FAMILY_8000;
220 nvm_chan = &iwl_nvm_channels_family_8000[0];
221 num_2ghz_channels = NUM_2GHZ_CHANNELS_FAMILY_8000;
224 for (ch_idx = 0; ch_idx < num_of_ch; ch_idx++) {
225 ch_flags = __le16_to_cpup(nvm_ch_flags + ch_idx);
227 if (ch_idx >= num_2ghz_channels &&
228 !data->sku_cap_band_52GHz_enable)
229 ch_flags &= ~NVM_CHANNEL_VALID;
231 if (!(ch_flags & NVM_CHANNEL_VALID)) {
232 IWL_DEBUG_EEPROM(dev,
233 "Ch. %d Flags %x [%sGHz] - No traffic\n",
236 (ch_idx >= num_2ghz_channels) ?
241 channel = &data->channels[n_channels];
244 channel->hw_value = nvm_chan[ch_idx];
245 channel->band = (ch_idx < num_2ghz_channels) ?
246 IEEE80211_BAND_2GHZ : IEEE80211_BAND_5GHZ;
247 channel->center_freq =
248 ieee80211_channel_to_frequency(
249 channel->hw_value, channel->band);
251 /* TODO: Need to be dependent to the NVM */
252 channel->flags = IEEE80211_CHAN_NO_HT40;
253 if (ch_idx < num_2ghz_channels &&
254 (ch_flags & NVM_CHANNEL_40MHZ)) {
255 if (nvm_chan[ch_idx] <= LAST_2GHZ_HT_PLUS)
256 channel->flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
257 if (nvm_chan[ch_idx] >= FIRST_2GHZ_HT_MINUS)
258 channel->flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
259 } else if (nvm_chan[ch_idx] <= LAST_5GHZ_HT &&
260 (ch_flags & NVM_CHANNEL_40MHZ)) {
261 if ((ch_idx - num_2ghz_channels) % 2 == 0)
262 channel->flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
264 channel->flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
266 if (!(ch_flags & NVM_CHANNEL_80MHZ))
267 channel->flags |= IEEE80211_CHAN_NO_80MHZ;
268 if (!(ch_flags & NVM_CHANNEL_160MHZ))
269 channel->flags |= IEEE80211_CHAN_NO_160MHZ;
271 if (!(ch_flags & NVM_CHANNEL_IBSS))
272 channel->flags |= IEEE80211_CHAN_NO_IR;
274 if (!(ch_flags & NVM_CHANNEL_ACTIVE))
275 channel->flags |= IEEE80211_CHAN_NO_IR;
277 if (ch_flags & NVM_CHANNEL_RADAR)
278 channel->flags |= IEEE80211_CHAN_RADAR;
280 if (ch_flags & NVM_CHANNEL_INDOOR_ONLY)
281 channel->flags |= IEEE80211_CHAN_INDOOR_ONLY;
283 /* Set the GO concurrent flag only in case that NO_IR is set.
284 * Otherwise it is meaningless
286 if ((ch_flags & NVM_CHANNEL_GO_CONCURRENT) &&
287 (channel->flags & IEEE80211_CHAN_NO_IR))
288 channel->flags |= IEEE80211_CHAN_GO_CONCURRENT;
290 /* Initialize regulatory-based run-time data */
293 * Default value - highest tx power value. max_power
294 * is not used in mvm, and is used for backwards compatibility
296 channel->max_power = IWL_DEFAULT_MAX_TX_POWER;
297 is_5ghz = channel->band == IEEE80211_BAND_5GHZ;
298 IWL_DEBUG_EEPROM(dev,
299 "Ch. %d [%sGHz] %s%s%s%s%s%s%s(0x%02x %ddBm): Ad-Hoc %ssupported\n",
301 is_5ghz ? "5.2" : "2.4",
302 CHECK_AND_PRINT_I(VALID),
303 CHECK_AND_PRINT_I(IBSS),
304 CHECK_AND_PRINT_I(ACTIVE),
305 CHECK_AND_PRINT_I(RADAR),
306 CHECK_AND_PRINT_I(WIDE),
307 CHECK_AND_PRINT_I(INDOOR_ONLY),
308 CHECK_AND_PRINT_I(GO_CONCURRENT),
311 ((ch_flags & NVM_CHANNEL_IBSS) &&
312 !(ch_flags & NVM_CHANNEL_RADAR))
319 static void iwl_init_vht_hw_capab(const struct iwl_cfg *cfg,
320 struct iwl_nvm_data *data,
321 struct ieee80211_sta_vht_cap *vht_cap,
322 u8 tx_chains, u8 rx_chains)
324 int num_rx_ants = num_of_ant(rx_chains);
325 int num_tx_ants = num_of_ant(tx_chains);
327 vht_cap->vht_supported = true;
329 vht_cap->cap = IEEE80211_VHT_CAP_SHORT_GI_80 |
330 IEEE80211_VHT_CAP_RXSTBC_1 |
331 IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
332 3 << IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT |
333 7 << IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
336 vht_cap->cap |= IEEE80211_VHT_CAP_TXSTBC;
338 vht_cap->cap |= IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN;
340 if (iwlwifi_mod_params.amsdu_size_8K)
341 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991;
343 vht_cap->vht_mcs.rx_mcs_map =
344 cpu_to_le16(IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 |
345 IEEE80211_VHT_MCS_SUPPORT_0_9 << 2 |
346 IEEE80211_VHT_MCS_NOT_SUPPORTED << 4 |
347 IEEE80211_VHT_MCS_NOT_SUPPORTED << 6 |
348 IEEE80211_VHT_MCS_NOT_SUPPORTED << 8 |
349 IEEE80211_VHT_MCS_NOT_SUPPORTED << 10 |
350 IEEE80211_VHT_MCS_NOT_SUPPORTED << 12 |
351 IEEE80211_VHT_MCS_NOT_SUPPORTED << 14);
353 if (num_rx_ants == 1 || cfg->rx_with_siso_diversity) {
354 vht_cap->cap |= IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN;
355 /* this works because NOT_SUPPORTED == 3 */
356 vht_cap->vht_mcs.rx_mcs_map |=
357 cpu_to_le16(IEEE80211_VHT_MCS_NOT_SUPPORTED << 2);
360 vht_cap->vht_mcs.tx_mcs_map = vht_cap->vht_mcs.rx_mcs_map;
363 static void iwl_init_sbands(struct device *dev, const struct iwl_cfg *cfg,
364 struct iwl_nvm_data *data,
365 const __le16 *ch_section, bool enable_vht,
366 u8 tx_chains, u8 rx_chains)
370 struct ieee80211_supported_band *sband;
372 if (cfg->device_family != IWL_DEVICE_FAMILY_8000)
373 n_channels = iwl_init_channel_map(
375 &ch_section[NVM_CHANNELS]);
377 n_channels = iwl_init_channel_map(
379 &ch_section[NVM_CHANNELS_FAMILY_8000]);
381 sband = &data->bands[IEEE80211_BAND_2GHZ];
382 sband->band = IEEE80211_BAND_2GHZ;
383 sband->bitrates = &iwl_cfg80211_rates[RATES_24_OFFS];
384 sband->n_bitrates = N_RATES_24;
385 n_used += iwl_init_sband_channels(data, sband, n_channels,
386 IEEE80211_BAND_2GHZ);
387 iwl_init_ht_hw_capab(cfg, data, &sband->ht_cap, IEEE80211_BAND_2GHZ,
388 tx_chains, rx_chains);
390 sband = &data->bands[IEEE80211_BAND_5GHZ];
391 sband->band = IEEE80211_BAND_5GHZ;
392 sband->bitrates = &iwl_cfg80211_rates[RATES_52_OFFS];
393 sband->n_bitrates = N_RATES_52;
394 n_used += iwl_init_sband_channels(data, sband, n_channels,
395 IEEE80211_BAND_5GHZ);
396 iwl_init_ht_hw_capab(cfg, data, &sband->ht_cap, IEEE80211_BAND_5GHZ,
397 tx_chains, rx_chains);
399 iwl_init_vht_hw_capab(cfg, data, &sband->vht_cap,
400 tx_chains, rx_chains);
402 if (n_channels != n_used)
403 IWL_ERR_DEV(dev, "NVM: used only %d of %d channels\n",
407 static int iwl_get_sku(const struct iwl_cfg *cfg,
408 const __le16 *nvm_sw)
410 if (cfg->device_family != IWL_DEVICE_FAMILY_8000)
411 return le16_to_cpup(nvm_sw + SKU);
413 return le32_to_cpup((__le32 *)(nvm_sw + SKU_FAMILY_8000));
416 static int iwl_get_nvm_version(const struct iwl_cfg *cfg,
417 const __le16 *nvm_sw)
419 if (cfg->device_family != IWL_DEVICE_FAMILY_8000)
420 return le16_to_cpup(nvm_sw + NVM_VERSION);
422 return le32_to_cpup((__le32 *)(nvm_sw +
423 NVM_VERSION_FAMILY_8000));
426 static int iwl_get_radio_cfg(const struct iwl_cfg *cfg,
427 const __le16 *nvm_sw)
429 if (cfg->device_family != IWL_DEVICE_FAMILY_8000)
430 return le16_to_cpup(nvm_sw + RADIO_CFG);
432 return le32_to_cpup((__le32 *)(nvm_sw + RADIO_CFG_FAMILY_8000));
435 #define N_HW_ADDRS_MASK_FAMILY_8000 0xF
436 static int iwl_get_n_hw_addrs(const struct iwl_cfg *cfg,
437 const __le16 *nvm_sw)
439 if (cfg->device_family != IWL_DEVICE_FAMILY_8000)
440 return le16_to_cpup(nvm_sw + N_HW_ADDRS);
442 return le32_to_cpup((__le32 *)(nvm_sw + N_HW_ADDRS_FAMILY_8000))
443 & N_HW_ADDRS_MASK_FAMILY_8000;
446 static void iwl_set_radio_cfg(const struct iwl_cfg *cfg,
447 struct iwl_nvm_data *data,
450 if (cfg->device_family != IWL_DEVICE_FAMILY_8000) {
451 data->radio_cfg_type = NVM_RF_CFG_TYPE_MSK(radio_cfg);
452 data->radio_cfg_step = NVM_RF_CFG_STEP_MSK(radio_cfg);
453 data->radio_cfg_dash = NVM_RF_CFG_DASH_MSK(radio_cfg);
454 data->radio_cfg_pnum = NVM_RF_CFG_PNUM_MSK(radio_cfg);
458 /* set the radio configuration for family 8000 */
459 data->radio_cfg_type = NVM_RF_CFG_TYPE_MSK_FAMILY_8000(radio_cfg);
460 data->radio_cfg_step = NVM_RF_CFG_STEP_MSK_FAMILY_8000(radio_cfg);
461 data->radio_cfg_dash = NVM_RF_CFG_DASH_MSK_FAMILY_8000(radio_cfg);
462 data->radio_cfg_pnum = NVM_RF_CFG_FLAVOR_MSK_FAMILY_8000(radio_cfg);
465 static void iwl_set_hw_address(const struct iwl_cfg *cfg,
466 struct iwl_nvm_data *data,
467 const __le16 *nvm_sec)
469 const u8 *hw_addr = (const u8 *)(nvm_sec + HW_ADDR);
471 /* The byte order is little endian 16 bit, meaning 214365 */
472 data->hw_addr[0] = hw_addr[1];
473 data->hw_addr[1] = hw_addr[0];
474 data->hw_addr[2] = hw_addr[3];
475 data->hw_addr[3] = hw_addr[2];
476 data->hw_addr[4] = hw_addr[5];
477 data->hw_addr[5] = hw_addr[4];
480 static void iwl_set_hw_address_family_8000(struct device *dev,
481 const struct iwl_cfg *cfg,
482 struct iwl_nvm_data *data,
483 const __le16 *mac_override,
484 const __le16 *nvm_hw)
489 hw_addr = (const u8 *)(mac_override +
490 MAC_ADDRESS_OVERRIDE_FAMILY_8000);
492 /* The byte order is little endian 16 bit, meaning 214365 */
493 data->hw_addr[0] = hw_addr[1];
494 data->hw_addr[1] = hw_addr[0];
495 data->hw_addr[2] = hw_addr[3];
496 data->hw_addr[3] = hw_addr[2];
497 data->hw_addr[4] = hw_addr[5];
498 data->hw_addr[5] = hw_addr[4];
500 if (is_valid_ether_addr(data->hw_addr))
504 "mac address from nvm override section is not valid\n");
508 /* read the MAC address from OTP */
509 if (!dev_is_pci(dev) || (data->nvm_version < 0xE08)) {
510 /* read the mac address from the WFPM location */
511 hw_addr = (const u8 *)(nvm_hw +
512 HW_ADDR0_WFPM_FAMILY_8000);
513 data->hw_addr[0] = hw_addr[3];
514 data->hw_addr[1] = hw_addr[2];
515 data->hw_addr[2] = hw_addr[1];
516 data->hw_addr[3] = hw_addr[0];
518 hw_addr = (const u8 *)(nvm_hw +
519 HW_ADDR1_WFPM_FAMILY_8000);
520 data->hw_addr[4] = hw_addr[1];
521 data->hw_addr[5] = hw_addr[0];
522 } else if ((data->nvm_version >= 0xE08) &&
523 (data->nvm_version < 0xE0B)) {
524 /* read "reverse order" from the PCIe location */
525 hw_addr = (const u8 *)(nvm_hw +
526 HW_ADDR0_PCIE_FAMILY_8000);
527 data->hw_addr[5] = hw_addr[2];
528 data->hw_addr[4] = hw_addr[1];
529 data->hw_addr[3] = hw_addr[0];
531 hw_addr = (const u8 *)(nvm_hw +
532 HW_ADDR1_PCIE_FAMILY_8000);
533 data->hw_addr[2] = hw_addr[3];
534 data->hw_addr[1] = hw_addr[2];
535 data->hw_addr[0] = hw_addr[1];
537 /* read from the PCIe location */
538 hw_addr = (const u8 *)(nvm_hw +
539 HW_ADDR0_PCIE_FAMILY_8000);
540 data->hw_addr[5] = hw_addr[0];
541 data->hw_addr[4] = hw_addr[1];
542 data->hw_addr[3] = hw_addr[2];
544 hw_addr = (const u8 *)(nvm_hw +
545 HW_ADDR1_PCIE_FAMILY_8000);
546 data->hw_addr[2] = hw_addr[1];
547 data->hw_addr[1] = hw_addr[2];
548 data->hw_addr[0] = hw_addr[3];
550 if (!is_valid_ether_addr(data->hw_addr))
552 "mac address from hw section is not valid\n");
557 IWL_ERR_DEV(dev, "mac address is not found\n");
560 struct iwl_nvm_data *
561 iwl_parse_nvm_data(struct device *dev, const struct iwl_cfg *cfg,
562 const __le16 *nvm_hw, const __le16 *nvm_sw,
563 const __le16 *nvm_calib, const __le16 *regulatory,
564 const __le16 *mac_override, u8 tx_chains, u8 rx_chains)
566 struct iwl_nvm_data *data;
570 if (cfg->device_family != IWL_DEVICE_FAMILY_8000)
571 data = kzalloc(sizeof(*data) +
572 sizeof(struct ieee80211_channel) *
576 data = kzalloc(sizeof(*data) +
577 sizeof(struct ieee80211_channel) *
578 IWL_NUM_CHANNELS_FAMILY_8000,
583 data->nvm_version = iwl_get_nvm_version(cfg, nvm_sw);
585 radio_cfg = iwl_get_radio_cfg(cfg, nvm_sw);
586 iwl_set_radio_cfg(cfg, data, radio_cfg);
588 sku = iwl_get_sku(cfg, nvm_sw);
589 data->sku_cap_band_24GHz_enable = sku & NVM_SKU_CAP_BAND_24GHZ;
590 data->sku_cap_band_52GHz_enable = sku & NVM_SKU_CAP_BAND_52GHZ;
591 data->sku_cap_11n_enable = sku & NVM_SKU_CAP_11N_ENABLE;
592 data->sku_cap_11ac_enable = sku & NVM_SKU_CAP_11AC_ENABLE;
593 if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_ALL)
594 data->sku_cap_11n_enable = false;
596 data->n_hw_addrs = iwl_get_n_hw_addrs(cfg, nvm_sw);
598 if (cfg->device_family != IWL_DEVICE_FAMILY_8000) {
599 /* Checking for required sections */
602 "Can't parse empty Calib NVM sections\n");
606 /* in family 8000 Xtal calibration values moved to OTP */
607 data->xtal_calib[0] = *(nvm_calib + XTAL_CALIB);
608 data->xtal_calib[1] = *(nvm_calib + XTAL_CALIB + 1);
611 if (cfg->device_family != IWL_DEVICE_FAMILY_8000) {
612 iwl_set_hw_address(cfg, data, nvm_hw);
614 iwl_init_sbands(dev, cfg, data, nvm_sw,
615 sku & NVM_SKU_CAP_11AC_ENABLE, tx_chains,
618 /* MAC address in family 8000 */
619 iwl_set_hw_address_family_8000(dev, cfg, data, mac_override,
622 iwl_init_sbands(dev, cfg, data, regulatory,
623 sku & NVM_SKU_CAP_11AC_ENABLE, tx_chains,
627 data->calib_version = 255;
631 IWL_EXPORT_SYMBOL(iwl_parse_nvm_data);