wlcore: reconfigure sta rates on authorization
[cascardo/linux.git] / drivers / net / wireless / intel / iwlwifi / iwl-nvm-parse.c
1 /******************************************************************************
2  *
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.
5  *
6  * GPL LICENSE SUMMARY
7  *
8  * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
9  * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
10  * Copyright(c) 2016 Intel Deutschland GmbH
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of version 2 of the GNU General Public License as
14  * published by the Free Software Foundation.
15  *
16  * This program is distributed in the hope that it will be useful, but
17  * WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
24  * USA
25  *
26  * The full GNU General Public License is included in this distribution
27  * in the file called COPYING.
28  *
29  * Contact Information:
30  *  Intel Linux Wireless <linuxwifi@intel.com>
31  * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
32  *
33  * BSD LICENSE
34  *
35  * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
36  * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
37  * All rights reserved.
38  *
39  * Redistribution and use in source and binary forms, with or without
40  * modification, are permitted provided that the following conditions
41  * are met:
42  *
43  *  * Redistributions of source code must retain the above copyright
44  *    notice, this list of conditions and the following disclaimer.
45  *  * Redistributions in binary form must reproduce the above copyright
46  *    notice, this list of conditions and the following disclaimer in
47  *    the documentation and/or other materials provided with the
48  *    distribution.
49  *  * Neither the name Intel Corporation nor the names of its
50  *    contributors may be used to endorse or promote products derived
51  *    from this software without specific prior written permission.
52  *
53  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
54  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
55  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
56  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
57  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
58  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
59  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
60  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
61  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
62  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
63  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
64  *****************************************************************************/
65 #include <linux/types.h>
66 #include <linux/slab.h>
67 #include <linux/export.h>
68 #include <linux/etherdevice.h>
69 #include <linux/pci.h>
70 #include "iwl-drv.h"
71 #include "iwl-modparams.h"
72 #include "iwl-nvm-parse.h"
73 #include "iwl-prph.h"
74 #include "iwl-io.h"
75 #include "iwl-csr.h"
76
77 /* NVM offsets (in words) definitions */
78 enum wkp_nvm_offsets {
79         /* NVM HW-Section offset (in words) definitions */
80         HW_ADDR = 0x15,
81
82         /* NVM SW-Section offset (in words) definitions */
83         NVM_SW_SECTION = 0x1C0,
84         NVM_VERSION = 0,
85         RADIO_CFG = 1,
86         SKU = 2,
87         N_HW_ADDRS = 3,
88         NVM_CHANNELS = 0x1E0 - NVM_SW_SECTION,
89
90         /* NVM calibration section offset (in words) definitions */
91         NVM_CALIB_SECTION = 0x2B8,
92         XTAL_CALIB = 0x316 - NVM_CALIB_SECTION
93 };
94
95 enum family_8000_nvm_offsets {
96         /* NVM HW-Section offset (in words) definitions */
97         HW_ADDR0_WFPM_FAMILY_8000 = 0x12,
98         HW_ADDR1_WFPM_FAMILY_8000 = 0x16,
99         HW_ADDR0_PCIE_FAMILY_8000 = 0x8A,
100         HW_ADDR1_PCIE_FAMILY_8000 = 0x8E,
101         MAC_ADDRESS_OVERRIDE_FAMILY_8000 = 1,
102
103         /* NVM SW-Section offset (in words) definitions */
104         NVM_SW_SECTION_FAMILY_8000 = 0x1C0,
105         NVM_VERSION_FAMILY_8000 = 0,
106         RADIO_CFG_FAMILY_8000 = 0,
107         SKU_FAMILY_8000 = 2,
108         N_HW_ADDRS_FAMILY_8000 = 3,
109
110         /* NVM REGULATORY -Section offset (in words) definitions */
111         NVM_CHANNELS_FAMILY_8000 = 0,
112         NVM_LAR_OFFSET_FAMILY_8000_OLD = 0x4C7,
113         NVM_LAR_OFFSET_FAMILY_8000 = 0x507,
114         NVM_LAR_ENABLED_FAMILY_8000 = 0x7,
115
116         /* NVM calibration section offset (in words) definitions */
117         NVM_CALIB_SECTION_FAMILY_8000 = 0x2B8,
118         XTAL_CALIB_FAMILY_8000 = 0x316 - NVM_CALIB_SECTION_FAMILY_8000
119 };
120
121 /* SKU Capabilities (actual values from NVM definition) */
122 enum nvm_sku_bits {
123         NVM_SKU_CAP_BAND_24GHZ          = BIT(0),
124         NVM_SKU_CAP_BAND_52GHZ          = BIT(1),
125         NVM_SKU_CAP_11N_ENABLE          = BIT(2),
126         NVM_SKU_CAP_11AC_ENABLE         = BIT(3),
127         NVM_SKU_CAP_MIMO_DISABLE        = BIT(5),
128 };
129
130 /*
131  * These are the channel numbers in the order that they are stored in the NVM
132  */
133 static const u8 iwl_nvm_channels[] = {
134         /* 2.4 GHz */
135         1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
136         /* 5 GHz */
137         36, 40, 44 , 48, 52, 56, 60, 64,
138         100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144,
139         149, 153, 157, 161, 165
140 };
141
142 static const u8 iwl_nvm_channels_family_8000[] = {
143         /* 2.4 GHz */
144         1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
145         /* 5 GHz */
146         36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92,
147         96, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144,
148         149, 153, 157, 161, 165, 169, 173, 177, 181
149 };
150
151 #define IWL_NUM_CHANNELS                ARRAY_SIZE(iwl_nvm_channels)
152 #define IWL_NUM_CHANNELS_FAMILY_8000    ARRAY_SIZE(iwl_nvm_channels_family_8000)
153 #define NUM_2GHZ_CHANNELS               14
154 #define NUM_2GHZ_CHANNELS_FAMILY_8000   14
155 #define FIRST_2GHZ_HT_MINUS             5
156 #define LAST_2GHZ_HT_PLUS               9
157 #define LAST_5GHZ_HT                    165
158 #define LAST_5GHZ_HT_FAMILY_8000        181
159 #define N_HW_ADDR_MASK                  0xF
160
161 /* rate data (static) */
162 static struct ieee80211_rate iwl_cfg80211_rates[] = {
163         { .bitrate = 1 * 10, .hw_value = 0, .hw_value_short = 0, },
164         { .bitrate = 2 * 10, .hw_value = 1, .hw_value_short = 1,
165           .flags = IEEE80211_RATE_SHORT_PREAMBLE, },
166         { .bitrate = 5.5 * 10, .hw_value = 2, .hw_value_short = 2,
167           .flags = IEEE80211_RATE_SHORT_PREAMBLE, },
168         { .bitrate = 11 * 10, .hw_value = 3, .hw_value_short = 3,
169           .flags = IEEE80211_RATE_SHORT_PREAMBLE, },
170         { .bitrate = 6 * 10, .hw_value = 4, .hw_value_short = 4, },
171         { .bitrate = 9 * 10, .hw_value = 5, .hw_value_short = 5, },
172         { .bitrate = 12 * 10, .hw_value = 6, .hw_value_short = 6, },
173         { .bitrate = 18 * 10, .hw_value = 7, .hw_value_short = 7, },
174         { .bitrate = 24 * 10, .hw_value = 8, .hw_value_short = 8, },
175         { .bitrate = 36 * 10, .hw_value = 9, .hw_value_short = 9, },
176         { .bitrate = 48 * 10, .hw_value = 10, .hw_value_short = 10, },
177         { .bitrate = 54 * 10, .hw_value = 11, .hw_value_short = 11, },
178 };
179 #define RATES_24_OFFS   0
180 #define N_RATES_24      ARRAY_SIZE(iwl_cfg80211_rates)
181 #define RATES_52_OFFS   4
182 #define N_RATES_52      (N_RATES_24 - RATES_52_OFFS)
183
184 /**
185  * enum iwl_nvm_channel_flags - channel flags in NVM
186  * @NVM_CHANNEL_VALID: channel is usable for this SKU/geo
187  * @NVM_CHANNEL_IBSS: usable as an IBSS channel
188  * @NVM_CHANNEL_ACTIVE: active scanning allowed
189  * @NVM_CHANNEL_RADAR: radar detection required
190  * @NVM_CHANNEL_INDOOR_ONLY: only indoor use is allowed
191  * @NVM_CHANNEL_GO_CONCURRENT: GO operation is allowed when connected to BSS
192  *      on same channel on 2.4 or same UNII band on 5.2
193  * @NVM_CHANNEL_WIDE: 20 MHz channel okay (?)
194  * @NVM_CHANNEL_40MHZ: 40 MHz channel okay (?)
195  * @NVM_CHANNEL_80MHZ: 80 MHz channel okay (?)
196  * @NVM_CHANNEL_160MHZ: 160 MHz channel okay (?)
197  */
198 enum iwl_nvm_channel_flags {
199         NVM_CHANNEL_VALID = BIT(0),
200         NVM_CHANNEL_IBSS = BIT(1),
201         NVM_CHANNEL_ACTIVE = BIT(3),
202         NVM_CHANNEL_RADAR = BIT(4),
203         NVM_CHANNEL_INDOOR_ONLY = BIT(5),
204         NVM_CHANNEL_GO_CONCURRENT = BIT(6),
205         NVM_CHANNEL_WIDE = BIT(8),
206         NVM_CHANNEL_40MHZ = BIT(9),
207         NVM_CHANNEL_80MHZ = BIT(10),
208         NVM_CHANNEL_160MHZ = BIT(11),
209 };
210
211 #define CHECK_AND_PRINT_I(x)    \
212         ((ch_flags & NVM_CHANNEL_##x) ? # x " " : "")
213
214 static u32 iwl_get_channel_flags(u8 ch_num, int ch_idx, bool is_5ghz,
215                                  u16 nvm_flags, const struct iwl_cfg *cfg)
216 {
217         u32 flags = IEEE80211_CHAN_NO_HT40;
218         u32 last_5ghz_ht = LAST_5GHZ_HT;
219
220         if (cfg->device_family == IWL_DEVICE_FAMILY_8000)
221                 last_5ghz_ht = LAST_5GHZ_HT_FAMILY_8000;
222
223         if (!is_5ghz && (nvm_flags & NVM_CHANNEL_40MHZ)) {
224                 if (ch_num <= LAST_2GHZ_HT_PLUS)
225                         flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
226                 if (ch_num >= FIRST_2GHZ_HT_MINUS)
227                         flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
228         } else if (ch_num <= last_5ghz_ht && (nvm_flags & NVM_CHANNEL_40MHZ)) {
229                 if ((ch_idx - NUM_2GHZ_CHANNELS) % 2 == 0)
230                         flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
231                 else
232                         flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
233         }
234         if (!(nvm_flags & NVM_CHANNEL_80MHZ))
235                 flags |= IEEE80211_CHAN_NO_80MHZ;
236         if (!(nvm_flags & NVM_CHANNEL_160MHZ))
237                 flags |= IEEE80211_CHAN_NO_160MHZ;
238
239         if (!(nvm_flags & NVM_CHANNEL_IBSS))
240                 flags |= IEEE80211_CHAN_NO_IR;
241
242         if (!(nvm_flags & NVM_CHANNEL_ACTIVE))
243                 flags |= IEEE80211_CHAN_NO_IR;
244
245         if (nvm_flags & NVM_CHANNEL_RADAR)
246                 flags |= IEEE80211_CHAN_RADAR;
247
248         if (nvm_flags & NVM_CHANNEL_INDOOR_ONLY)
249                 flags |= IEEE80211_CHAN_INDOOR_ONLY;
250
251         /* Set the GO concurrent flag only in case that NO_IR is set.
252          * Otherwise it is meaningless
253          */
254         if ((nvm_flags & NVM_CHANNEL_GO_CONCURRENT) &&
255             (flags & IEEE80211_CHAN_NO_IR))
256                 flags |= IEEE80211_CHAN_IR_CONCURRENT;
257
258         return flags;
259 }
260
261 static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
262                                 struct iwl_nvm_data *data,
263                                 const __le16 * const nvm_ch_flags,
264                                 bool lar_supported)
265 {
266         int ch_idx;
267         int n_channels = 0;
268         struct ieee80211_channel *channel;
269         u16 ch_flags;
270         bool is_5ghz;
271         int num_of_ch, num_2ghz_channels;
272         const u8 *nvm_chan;
273
274         if (cfg->device_family != IWL_DEVICE_FAMILY_8000) {
275                 num_of_ch = IWL_NUM_CHANNELS;
276                 nvm_chan = &iwl_nvm_channels[0];
277                 num_2ghz_channels = NUM_2GHZ_CHANNELS;
278         } else {
279                 num_of_ch = IWL_NUM_CHANNELS_FAMILY_8000;
280                 nvm_chan = &iwl_nvm_channels_family_8000[0];
281                 num_2ghz_channels = NUM_2GHZ_CHANNELS_FAMILY_8000;
282         }
283
284         for (ch_idx = 0; ch_idx < num_of_ch; ch_idx++) {
285                 ch_flags = __le16_to_cpup(nvm_ch_flags + ch_idx);
286
287                 if (ch_idx >= num_2ghz_channels &&
288                     !data->sku_cap_band_52GHz_enable)
289                         continue;
290
291                 if (ch_flags & NVM_CHANNEL_160MHZ)
292                         data->vht160_supported = true;
293
294                 if (!lar_supported && !(ch_flags & NVM_CHANNEL_VALID)) {
295                         /*
296                          * Channels might become valid later if lar is
297                          * supported, hence we still want to add them to
298                          * the list of supported channels to cfg80211.
299                          */
300                         IWL_DEBUG_EEPROM(dev,
301                                          "Ch. %d Flags %x [%sGHz] - No traffic\n",
302                                          nvm_chan[ch_idx],
303                                          ch_flags,
304                                          (ch_idx >= num_2ghz_channels) ?
305                                          "5.2" : "2.4");
306                         continue;
307                 }
308
309                 channel = &data->channels[n_channels];
310                 n_channels++;
311
312                 channel->hw_value = nvm_chan[ch_idx];
313                 channel->band = (ch_idx < num_2ghz_channels) ?
314                                 NL80211_BAND_2GHZ : NL80211_BAND_5GHZ;
315                 channel->center_freq =
316                         ieee80211_channel_to_frequency(
317                                 channel->hw_value, channel->band);
318
319                 /* Initialize regulatory-based run-time data */
320
321                 /*
322                  * Default value - highest tx power value.  max_power
323                  * is not used in mvm, and is used for backwards compatibility
324                  */
325                 channel->max_power = IWL_DEFAULT_MAX_TX_POWER;
326                 is_5ghz = channel->band == NL80211_BAND_5GHZ;
327
328                 /* don't put limitations in case we're using LAR */
329                 if (!lar_supported)
330                         channel->flags = iwl_get_channel_flags(nvm_chan[ch_idx],
331                                                                ch_idx, is_5ghz,
332                                                                ch_flags, cfg);
333                 else
334                         channel->flags = 0;
335
336                 IWL_DEBUG_EEPROM(dev,
337                                  "Ch. %d [%sGHz] flags 0x%x %s%s%s%s%s%s%s%s%s%s(%ddBm): Ad-Hoc %ssupported\n",
338                                  channel->hw_value,
339                                  is_5ghz ? "5.2" : "2.4",
340                                  ch_flags,
341                                  CHECK_AND_PRINT_I(VALID),
342                                  CHECK_AND_PRINT_I(IBSS),
343                                  CHECK_AND_PRINT_I(ACTIVE),
344                                  CHECK_AND_PRINT_I(RADAR),
345                                  CHECK_AND_PRINT_I(INDOOR_ONLY),
346                                  CHECK_AND_PRINT_I(GO_CONCURRENT),
347                                  CHECK_AND_PRINT_I(WIDE),
348                                  CHECK_AND_PRINT_I(40MHZ),
349                                  CHECK_AND_PRINT_I(80MHZ),
350                                  CHECK_AND_PRINT_I(160MHZ),
351                                  channel->max_power,
352                                  ((ch_flags & NVM_CHANNEL_IBSS) &&
353                                   !(ch_flags & NVM_CHANNEL_RADAR))
354                                         ? "" : "not ");
355         }
356
357         return n_channels;
358 }
359
360 static void iwl_init_vht_hw_capab(const struct iwl_cfg *cfg,
361                                   struct iwl_nvm_data *data,
362                                   struct ieee80211_sta_vht_cap *vht_cap,
363                                   u8 tx_chains, u8 rx_chains)
364 {
365         int num_rx_ants = num_of_ant(rx_chains);
366         int num_tx_ants = num_of_ant(tx_chains);
367         unsigned int max_ampdu_exponent = (cfg->max_vht_ampdu_exponent ?:
368                                            IEEE80211_VHT_MAX_AMPDU_1024K);
369
370         vht_cap->vht_supported = true;
371
372         vht_cap->cap = IEEE80211_VHT_CAP_SHORT_GI_80 |
373                        IEEE80211_VHT_CAP_RXSTBC_1 |
374                        IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
375                        3 << IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT |
376                        max_ampdu_exponent <<
377                        IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
378
379         if (data->vht160_supported)
380                 vht_cap->cap |= IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
381                                 IEEE80211_VHT_CAP_SHORT_GI_160;
382
383         if (cfg->vht_mu_mimo_supported)
384                 vht_cap->cap |= IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
385
386         if (cfg->ht_params->ldpc)
387                 vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC;
388
389         if (data->sku_cap_mimo_disabled) {
390                 num_rx_ants = 1;
391                 num_tx_ants = 1;
392         }
393
394         if (num_tx_ants > 1)
395                 vht_cap->cap |= IEEE80211_VHT_CAP_TXSTBC;
396         else
397                 vht_cap->cap |= IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN;
398
399         switch (iwlwifi_mod_params.amsdu_size) {
400         case IWL_AMSDU_4K:
401                 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895;
402                 break;
403         case IWL_AMSDU_8K:
404                 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991;
405                 break;
406         case IWL_AMSDU_12K:
407                 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454;
408                 break;
409         default:
410                 break;
411         }
412
413         vht_cap->vht_mcs.rx_mcs_map =
414                 cpu_to_le16(IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 |
415                             IEEE80211_VHT_MCS_SUPPORT_0_9 << 2 |
416                             IEEE80211_VHT_MCS_NOT_SUPPORTED << 4 |
417                             IEEE80211_VHT_MCS_NOT_SUPPORTED << 6 |
418                             IEEE80211_VHT_MCS_NOT_SUPPORTED << 8 |
419                             IEEE80211_VHT_MCS_NOT_SUPPORTED << 10 |
420                             IEEE80211_VHT_MCS_NOT_SUPPORTED << 12 |
421                             IEEE80211_VHT_MCS_NOT_SUPPORTED << 14);
422
423         if (num_rx_ants == 1 || cfg->rx_with_siso_diversity) {
424                 vht_cap->cap |= IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN;
425                 /* this works because NOT_SUPPORTED == 3 */
426                 vht_cap->vht_mcs.rx_mcs_map |=
427                         cpu_to_le16(IEEE80211_VHT_MCS_NOT_SUPPORTED << 2);
428         }
429
430         vht_cap->vht_mcs.tx_mcs_map = vht_cap->vht_mcs.rx_mcs_map;
431 }
432
433 static void iwl_init_sbands(struct device *dev, const struct iwl_cfg *cfg,
434                             struct iwl_nvm_data *data,
435                             const __le16 *ch_section,
436                             u8 tx_chains, u8 rx_chains, bool lar_supported)
437 {
438         int n_channels;
439         int n_used = 0;
440         struct ieee80211_supported_band *sband;
441
442         if (cfg->device_family != IWL_DEVICE_FAMILY_8000)
443                 n_channels = iwl_init_channel_map(
444                                 dev, cfg, data,
445                                 &ch_section[NVM_CHANNELS], lar_supported);
446         else
447                 n_channels = iwl_init_channel_map(
448                                 dev, cfg, data,
449                                 &ch_section[NVM_CHANNELS_FAMILY_8000],
450                                 lar_supported);
451
452         sband = &data->bands[NL80211_BAND_2GHZ];
453         sband->band = NL80211_BAND_2GHZ;
454         sband->bitrates = &iwl_cfg80211_rates[RATES_24_OFFS];
455         sband->n_bitrates = N_RATES_24;
456         n_used += iwl_init_sband_channels(data, sband, n_channels,
457                                           NL80211_BAND_2GHZ);
458         iwl_init_ht_hw_capab(cfg, data, &sband->ht_cap, NL80211_BAND_2GHZ,
459                              tx_chains, rx_chains);
460
461         sband = &data->bands[NL80211_BAND_5GHZ];
462         sband->band = NL80211_BAND_5GHZ;
463         sband->bitrates = &iwl_cfg80211_rates[RATES_52_OFFS];
464         sband->n_bitrates = N_RATES_52;
465         n_used += iwl_init_sband_channels(data, sband, n_channels,
466                                           NL80211_BAND_5GHZ);
467         iwl_init_ht_hw_capab(cfg, data, &sband->ht_cap, NL80211_BAND_5GHZ,
468                              tx_chains, rx_chains);
469         if (data->sku_cap_11ac_enable && !iwlwifi_mod_params.disable_11ac)
470                 iwl_init_vht_hw_capab(cfg, data, &sband->vht_cap,
471                                       tx_chains, rx_chains);
472
473         if (n_channels != n_used)
474                 IWL_ERR_DEV(dev, "NVM: used only %d of %d channels\n",
475                             n_used, n_channels);
476 }
477
478 static int iwl_get_sku(const struct iwl_cfg *cfg, const __le16 *nvm_sw,
479                        const __le16 *phy_sku)
480 {
481         if (cfg->device_family != IWL_DEVICE_FAMILY_8000)
482                 return le16_to_cpup(nvm_sw + SKU);
483
484         return le32_to_cpup((__le32 *)(phy_sku + SKU_FAMILY_8000));
485 }
486
487 static int iwl_get_nvm_version(const struct iwl_cfg *cfg, const __le16 *nvm_sw)
488 {
489         if (cfg->device_family != IWL_DEVICE_FAMILY_8000)
490                 return le16_to_cpup(nvm_sw + NVM_VERSION);
491         else
492                 return le32_to_cpup((__le32 *)(nvm_sw +
493                                                NVM_VERSION_FAMILY_8000));
494 }
495
496 static int iwl_get_radio_cfg(const struct iwl_cfg *cfg, const __le16 *nvm_sw,
497                              const __le16 *phy_sku)
498 {
499         if (cfg->device_family != IWL_DEVICE_FAMILY_8000)
500                 return le16_to_cpup(nvm_sw + RADIO_CFG);
501
502         return le32_to_cpup((__le32 *)(phy_sku + RADIO_CFG_FAMILY_8000));
503
504 }
505
506 static int iwl_get_n_hw_addrs(const struct iwl_cfg *cfg, const __le16 *nvm_sw)
507 {
508         int n_hw_addr;
509
510         if (cfg->device_family != IWL_DEVICE_FAMILY_8000)
511                 return le16_to_cpup(nvm_sw + N_HW_ADDRS);
512
513         n_hw_addr = le32_to_cpup((__le32 *)(nvm_sw + N_HW_ADDRS_FAMILY_8000));
514
515         return n_hw_addr & N_HW_ADDR_MASK;
516 }
517
518 static void iwl_set_radio_cfg(const struct iwl_cfg *cfg,
519                               struct iwl_nvm_data *data,
520                               u32 radio_cfg)
521 {
522         if (cfg->device_family != IWL_DEVICE_FAMILY_8000) {
523                 data->radio_cfg_type = NVM_RF_CFG_TYPE_MSK(radio_cfg);
524                 data->radio_cfg_step = NVM_RF_CFG_STEP_MSK(radio_cfg);
525                 data->radio_cfg_dash = NVM_RF_CFG_DASH_MSK(radio_cfg);
526                 data->radio_cfg_pnum = NVM_RF_CFG_PNUM_MSK(radio_cfg);
527                 return;
528         }
529
530         /* set the radio configuration for family 8000 */
531         data->radio_cfg_type = NVM_RF_CFG_TYPE_MSK_FAMILY_8000(radio_cfg);
532         data->radio_cfg_step = NVM_RF_CFG_STEP_MSK_FAMILY_8000(radio_cfg);
533         data->radio_cfg_dash = NVM_RF_CFG_DASH_MSK_FAMILY_8000(radio_cfg);
534         data->radio_cfg_pnum = NVM_RF_CFG_FLAVOR_MSK_FAMILY_8000(radio_cfg);
535         data->valid_tx_ant = NVM_RF_CFG_TX_ANT_MSK_FAMILY_8000(radio_cfg);
536         data->valid_rx_ant = NVM_RF_CFG_RX_ANT_MSK_FAMILY_8000(radio_cfg);
537 }
538
539 static void iwl_flip_hw_address(__le32 mac_addr0, __le32 mac_addr1, u8 *dest)
540 {
541         const u8 *hw_addr;
542
543         hw_addr = (const u8 *)&mac_addr0;
544         dest[0] = hw_addr[3];
545         dest[1] = hw_addr[2];
546         dest[2] = hw_addr[1];
547         dest[3] = hw_addr[0];
548
549         hw_addr = (const u8 *)&mac_addr1;
550         dest[4] = hw_addr[1];
551         dest[5] = hw_addr[0];
552 }
553
554 static void iwl_set_hw_address_from_csr(struct iwl_trans *trans,
555                                         struct iwl_nvm_data *data)
556 {
557         __le32 mac_addr0 = cpu_to_le32(iwl_read32(trans, CSR_MAC_ADDR0_STRAP));
558         __le32 mac_addr1 = cpu_to_le32(iwl_read32(trans, CSR_MAC_ADDR1_STRAP));
559
560         /* If OEM did not fuse address - get it from OTP */
561         if (!mac_addr0 && !mac_addr1) {
562                 mac_addr0 = cpu_to_le32(iwl_read32(trans, CSR_MAC_ADDR0_OTP));
563                 mac_addr1 = cpu_to_le32(iwl_read32(trans, CSR_MAC_ADDR1_OTP));
564         }
565
566         iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr);
567 }
568
569 static void iwl_set_hw_address_family_8000(struct iwl_trans *trans,
570                                            const struct iwl_cfg *cfg,
571                                            struct iwl_nvm_data *data,
572                                            const __le16 *mac_override,
573                                            const __le16 *nvm_hw)
574 {
575         const u8 *hw_addr;
576
577         if (mac_override) {
578                 static const u8 reserved_mac[] = {
579                         0x02, 0xcc, 0xaa, 0xff, 0xee, 0x00
580                 };
581
582                 hw_addr = (const u8 *)(mac_override +
583                                  MAC_ADDRESS_OVERRIDE_FAMILY_8000);
584
585                 /*
586                  * Store the MAC address from MAO section.
587                  * No byte swapping is required in MAO section
588                  */
589                 memcpy(data->hw_addr, hw_addr, ETH_ALEN);
590
591                 /*
592                  * Force the use of the OTP MAC address in case of reserved MAC
593                  * address in the NVM, or if address is given but invalid.
594                  */
595                 if (is_valid_ether_addr(data->hw_addr) &&
596                     memcmp(reserved_mac, hw_addr, ETH_ALEN) != 0)
597                         return;
598
599                 IWL_ERR(trans,
600                         "mac address from nvm override section is not valid\n");
601         }
602
603         if (nvm_hw) {
604                 /* read the mac address from WFMP registers */
605                 __le32 mac_addr0 = cpu_to_le32(iwl_trans_read_prph(trans,
606                                                 WFMP_MAC_ADDR_0));
607                 __le32 mac_addr1 = cpu_to_le32(iwl_trans_read_prph(trans,
608                                                 WFMP_MAC_ADDR_1));
609
610                 iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr);
611
612                 return;
613         }
614
615         IWL_ERR(trans, "mac address is not found\n");
616 }
617
618 static int iwl_set_hw_address(struct iwl_trans *trans,
619                               const struct iwl_cfg *cfg,
620                               struct iwl_nvm_data *data, const __le16 *nvm_hw,
621                               const __le16 *mac_override)
622 {
623         if (cfg->mac_addr_from_csr) {
624                 iwl_set_hw_address_from_csr(trans, data);
625         } else if (cfg->device_family != IWL_DEVICE_FAMILY_8000) {
626                 const u8 *hw_addr = (const u8 *)(nvm_hw + HW_ADDR);
627
628                 /* The byte order is little endian 16 bit, meaning 214365 */
629                 data->hw_addr[0] = hw_addr[1];
630                 data->hw_addr[1] = hw_addr[0];
631                 data->hw_addr[2] = hw_addr[3];
632                 data->hw_addr[3] = hw_addr[2];
633                 data->hw_addr[4] = hw_addr[5];
634                 data->hw_addr[5] = hw_addr[4];
635         } else {
636                 iwl_set_hw_address_family_8000(trans, cfg, data,
637                                                mac_override, nvm_hw);
638         }
639
640         if (!is_valid_ether_addr(data->hw_addr)) {
641                 IWL_ERR(trans, "no valid mac address was found\n");
642                 return -EINVAL;
643         }
644
645         return 0;
646 }
647
648 struct iwl_nvm_data *
649 iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg,
650                    const __le16 *nvm_hw, const __le16 *nvm_sw,
651                    const __le16 *nvm_calib, const __le16 *regulatory,
652                    const __le16 *mac_override, const __le16 *phy_sku,
653                    u8 tx_chains, u8 rx_chains, bool lar_fw_supported)
654 {
655         struct device *dev = trans->dev;
656         struct iwl_nvm_data *data;
657         bool lar_enabled;
658         u32 sku, radio_cfg;
659         u16 lar_config;
660         const __le16 *ch_section;
661
662         if (cfg->device_family != IWL_DEVICE_FAMILY_8000)
663                 data = kzalloc(sizeof(*data) +
664                                sizeof(struct ieee80211_channel) *
665                                IWL_NUM_CHANNELS,
666                                GFP_KERNEL);
667         else
668                 data = kzalloc(sizeof(*data) +
669                                sizeof(struct ieee80211_channel) *
670                                IWL_NUM_CHANNELS_FAMILY_8000,
671                                GFP_KERNEL);
672         if (!data)
673                 return NULL;
674
675         data->nvm_version = iwl_get_nvm_version(cfg, nvm_sw);
676
677         radio_cfg = iwl_get_radio_cfg(cfg, nvm_sw, phy_sku);
678         iwl_set_radio_cfg(cfg, data, radio_cfg);
679         if (data->valid_tx_ant)
680                 tx_chains &= data->valid_tx_ant;
681         if (data->valid_rx_ant)
682                 rx_chains &= data->valid_rx_ant;
683
684         sku = iwl_get_sku(cfg, nvm_sw, phy_sku);
685         data->sku_cap_band_24GHz_enable = sku & NVM_SKU_CAP_BAND_24GHZ;
686         data->sku_cap_band_52GHz_enable = sku & NVM_SKU_CAP_BAND_52GHZ;
687         data->sku_cap_11n_enable = sku & NVM_SKU_CAP_11N_ENABLE;
688         if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_ALL)
689                 data->sku_cap_11n_enable = false;
690         data->sku_cap_11ac_enable = data->sku_cap_11n_enable &&
691                                     (sku & NVM_SKU_CAP_11AC_ENABLE);
692         data->sku_cap_mimo_disabled = sku & NVM_SKU_CAP_MIMO_DISABLE;
693
694         data->n_hw_addrs = iwl_get_n_hw_addrs(cfg, nvm_sw);
695
696         if (cfg->device_family != IWL_DEVICE_FAMILY_8000) {
697                 /* Checking for required sections */
698                 if (!nvm_calib) {
699                         IWL_ERR(trans,
700                                 "Can't parse empty Calib NVM sections\n");
701                         kfree(data);
702                         return NULL;
703                 }
704                 /* in family 8000 Xtal calibration values moved to OTP */
705                 data->xtal_calib[0] = *(nvm_calib + XTAL_CALIB);
706                 data->xtal_calib[1] = *(nvm_calib + XTAL_CALIB + 1);
707                 lar_enabled = true;
708                 ch_section = nvm_sw;
709         } else {
710                 u16 lar_offset = data->nvm_version < 0xE39 ?
711                                  NVM_LAR_OFFSET_FAMILY_8000_OLD :
712                                  NVM_LAR_OFFSET_FAMILY_8000;
713
714                 lar_config = le16_to_cpup(regulatory + lar_offset);
715                 data->lar_enabled = !!(lar_config &
716                                        NVM_LAR_ENABLED_FAMILY_8000);
717                 lar_enabled = data->lar_enabled;
718                 ch_section = regulatory;
719         }
720
721         /* If no valid mac address was found - bail out */
722         if (iwl_set_hw_address(trans, cfg, data, nvm_hw, mac_override)) {
723                 kfree(data);
724                 return NULL;
725         }
726
727         iwl_init_sbands(dev, cfg, data, ch_section, tx_chains, rx_chains,
728                         lar_fw_supported && lar_enabled);
729         data->calib_version = 255;
730
731         return data;
732 }
733 IWL_EXPORT_SYMBOL(iwl_parse_nvm_data);
734
735 static u32 iwl_nvm_get_regdom_bw_flags(const u8 *nvm_chan,
736                                        int ch_idx, u16 nvm_flags,
737                                        const struct iwl_cfg *cfg)
738 {
739         u32 flags = NL80211_RRF_NO_HT40;
740         u32 last_5ghz_ht = LAST_5GHZ_HT;
741
742         if (cfg->device_family == IWL_DEVICE_FAMILY_8000)
743                 last_5ghz_ht = LAST_5GHZ_HT_FAMILY_8000;
744
745         if (ch_idx < NUM_2GHZ_CHANNELS &&
746             (nvm_flags & NVM_CHANNEL_40MHZ)) {
747                 if (nvm_chan[ch_idx] <= LAST_2GHZ_HT_PLUS)
748                         flags &= ~NL80211_RRF_NO_HT40PLUS;
749                 if (nvm_chan[ch_idx] >= FIRST_2GHZ_HT_MINUS)
750                         flags &= ~NL80211_RRF_NO_HT40MINUS;
751         } else if (nvm_chan[ch_idx] <= last_5ghz_ht &&
752                    (nvm_flags & NVM_CHANNEL_40MHZ)) {
753                 if ((ch_idx - NUM_2GHZ_CHANNELS) % 2 == 0)
754                         flags &= ~NL80211_RRF_NO_HT40PLUS;
755                 else
756                         flags &= ~NL80211_RRF_NO_HT40MINUS;
757         }
758
759         if (!(nvm_flags & NVM_CHANNEL_80MHZ))
760                 flags |= NL80211_RRF_NO_80MHZ;
761         if (!(nvm_flags & NVM_CHANNEL_160MHZ))
762                 flags |= NL80211_RRF_NO_160MHZ;
763
764         if (!(nvm_flags & NVM_CHANNEL_ACTIVE))
765                 flags |= NL80211_RRF_NO_IR;
766
767         if (nvm_flags & NVM_CHANNEL_RADAR)
768                 flags |= NL80211_RRF_DFS;
769
770         if (nvm_flags & NVM_CHANNEL_INDOOR_ONLY)
771                 flags |= NL80211_RRF_NO_OUTDOOR;
772
773         /* Set the GO concurrent flag only in case that NO_IR is set.
774          * Otherwise it is meaningless
775          */
776         if ((nvm_flags & NVM_CHANNEL_GO_CONCURRENT) &&
777             (flags & NL80211_RRF_NO_IR))
778                 flags |= NL80211_RRF_GO_CONCURRENT;
779
780         return flags;
781 }
782
783 struct ieee80211_regdomain *
784 iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg,
785                        int num_of_ch, __le32 *channels, u16 fw_mcc)
786 {
787         int ch_idx;
788         u16 ch_flags, prev_ch_flags = 0;
789         const u8 *nvm_chan = cfg->device_family == IWL_DEVICE_FAMILY_8000 ?
790                              iwl_nvm_channels_family_8000 : iwl_nvm_channels;
791         struct ieee80211_regdomain *regd;
792         int size_of_regd;
793         struct ieee80211_reg_rule *rule;
794         enum nl80211_band band;
795         int center_freq, prev_center_freq = 0;
796         int valid_rules = 0;
797         bool new_rule;
798         int max_num_ch = cfg->device_family == IWL_DEVICE_FAMILY_8000 ?
799                          IWL_NUM_CHANNELS_FAMILY_8000 : IWL_NUM_CHANNELS;
800
801         if (WARN_ON_ONCE(num_of_ch > NL80211_MAX_SUPP_REG_RULES))
802                 return ERR_PTR(-EINVAL);
803
804         if (WARN_ON(num_of_ch > max_num_ch))
805                 num_of_ch = max_num_ch;
806
807         IWL_DEBUG_DEV(dev, IWL_DL_LAR, "building regdom for %d channels\n",
808                       num_of_ch);
809
810         /* build a regdomain rule for every valid channel */
811         size_of_regd =
812                 sizeof(struct ieee80211_regdomain) +
813                 num_of_ch * sizeof(struct ieee80211_reg_rule);
814
815         regd = kzalloc(size_of_regd, GFP_KERNEL);
816         if (!regd)
817                 return ERR_PTR(-ENOMEM);
818
819         for (ch_idx = 0; ch_idx < num_of_ch; ch_idx++) {
820                 ch_flags = (u16)__le32_to_cpup(channels + ch_idx);
821                 band = (ch_idx < NUM_2GHZ_CHANNELS) ?
822                        NL80211_BAND_2GHZ : NL80211_BAND_5GHZ;
823                 center_freq = ieee80211_channel_to_frequency(nvm_chan[ch_idx],
824                                                              band);
825                 new_rule = false;
826
827                 if (!(ch_flags & NVM_CHANNEL_VALID)) {
828                         IWL_DEBUG_DEV(dev, IWL_DL_LAR,
829                                       "Ch. %d Flags %x [%sGHz] - No traffic\n",
830                                       nvm_chan[ch_idx],
831                                       ch_flags,
832                                       (ch_idx >= NUM_2GHZ_CHANNELS) ?
833                                       "5.2" : "2.4");
834                         continue;
835                 }
836
837                 /* we can't continue the same rule */
838                 if (ch_idx == 0 || prev_ch_flags != ch_flags ||
839                     center_freq - prev_center_freq > 20) {
840                         valid_rules++;
841                         new_rule = true;
842                 }
843
844                 rule = &regd->reg_rules[valid_rules - 1];
845
846                 if (new_rule)
847                         rule->freq_range.start_freq_khz =
848                                                 MHZ_TO_KHZ(center_freq - 10);
849
850                 rule->freq_range.end_freq_khz = MHZ_TO_KHZ(center_freq + 10);
851
852                 /* this doesn't matter - not used by FW */
853                 rule->power_rule.max_antenna_gain = DBI_TO_MBI(6);
854                 rule->power_rule.max_eirp =
855                         DBM_TO_MBM(IWL_DEFAULT_MAX_TX_POWER);
856
857                 rule->flags = iwl_nvm_get_regdom_bw_flags(nvm_chan, ch_idx,
858                                                           ch_flags, cfg);
859
860                 /* rely on auto-calculation to merge BW of contiguous chans */
861                 rule->flags |= NL80211_RRF_AUTO_BW;
862                 rule->freq_range.max_bandwidth_khz = 0;
863
864                 prev_ch_flags = ch_flags;
865                 prev_center_freq = center_freq;
866
867                 IWL_DEBUG_DEV(dev, IWL_DL_LAR,
868                               "Ch. %d [%sGHz] %s%s%s%s%s%s%s%s%s(0x%02x): Ad-Hoc %ssupported\n",
869                               center_freq,
870                               band == NL80211_BAND_5GHZ ? "5.2" : "2.4",
871                               CHECK_AND_PRINT_I(VALID),
872                               CHECK_AND_PRINT_I(ACTIVE),
873                               CHECK_AND_PRINT_I(RADAR),
874                               CHECK_AND_PRINT_I(WIDE),
875                               CHECK_AND_PRINT_I(40MHZ),
876                               CHECK_AND_PRINT_I(80MHZ),
877                               CHECK_AND_PRINT_I(160MHZ),
878                               CHECK_AND_PRINT_I(INDOOR_ONLY),
879                               CHECK_AND_PRINT_I(GO_CONCURRENT),
880                               ch_flags,
881                               ((ch_flags & NVM_CHANNEL_ACTIVE) &&
882                                !(ch_flags & NVM_CHANNEL_RADAR))
883                                          ? "" : "not ");
884         }
885
886         regd->n_reg_rules = valid_rules;
887
888         /* set alpha2 from FW. */
889         regd->alpha2[0] = fw_mcc >> 8;
890         regd->alpha2[1] = fw_mcc & 0xff;
891
892         return regd;
893 }
894 IWL_EXPORT_SYMBOL(iwl_parse_nvm_mcc_info);