• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 - 2015 Intel Corporation. All rights reserved.
9   * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
10   * Copyright(c) 2018 - 2019 Intel Corporation
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) 2016 - 2017 Intel Deutschland GmbH
37   * Copyright(c) 2018 - 2019 Intel Corporation
38   * All rights reserved.
39   *
40   * Redistribution and use in source and binary forms, with or without
41   * modification, are permitted provided that the following conditions
42   * are met:
43   *
44   *  * Redistributions of source code must retain the above copyright
45   *    notice, this list of conditions and the following disclaimer.
46   *  * Redistributions in binary form must reproduce the above copyright
47   *    notice, this list of conditions and the following disclaimer in
48   *    the documentation and/or other materials provided with the
49   *    distribution.
50   *  * Neither the name Intel Corporation nor the names of its
51   *    contributors may be used to endorse or promote products derived
52   *    from this software without specific prior written permission.
53   *
54   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
55   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
56   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
57   * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
58   * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
59   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
60   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
61   * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
62   * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
63   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
64   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
65   *****************************************************************************/
66  #ifndef __iwl_nvm_parse_h__
67  #define __iwl_nvm_parse_h__
68  
69  #include <net/cfg80211.h>
70  #include "iwl-eeprom-parse.h"
71  
72  /**
73   * enum iwl_nvm_sbands_flags - modification flags for the channel profiles
74   *
75   * @IWL_NVM_SBANDS_FLAGS_LAR: LAR is enabled
76   * @IWL_NVM_SBANDS_FLAGS_NO_WIDE_IN_5GHZ: disallow 40, 80 and 160MHz on 5GHz
77   */
78  enum iwl_nvm_sbands_flags {
79  	IWL_NVM_SBANDS_FLAGS_LAR		= BIT(0),
80  	IWL_NVM_SBANDS_FLAGS_NO_WIDE_IN_5GHZ	= BIT(1),
81  };
82  
83  /**
84   * iwl_parse_nvm_data - parse NVM data and return values
85   *
86   * This function parses all NVM values we need and then
87   * returns a (newly allocated) struct containing all the
88   * relevant values for driver use. The struct must be freed
89   * later with iwl_free_nvm_data().
90   */
91  struct iwl_nvm_data *
92  iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg,
93  		   const __be16 *nvm_hw, const __le16 *nvm_sw,
94  		   const __le16 *nvm_calib, const __le16 *regulatory,
95  		   const __le16 *mac_override, const __le16 *phy_sku,
96  		   u8 tx_chains, u8 rx_chains, bool lar_fw_supported);
97  
98  /**
99   * iwl_parse_mcc_info - parse MCC (mobile country code) info coming from FW
100   *
101   * This function parses the regulatory channel data received as a
102   * MCC_UPDATE_CMD command. It returns a newly allocation regulatory domain,
103   * to be fed into the regulatory core. In case the geo_info is set handle
104   * accordingly. An ERR_PTR is returned on error.
105   * If not given to the regulatory core, the user is responsible for freeing
106   * the regdomain returned here with kfree.
107   */
108  struct ieee80211_regdomain *
109  iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg,
110  		       int num_of_ch, __le32 *channels, u16 fw_mcc,
111  		       u16 geo_info, u16 cap);
112  
113  /**
114   * struct iwl_nvm_section - describes an NVM section in memory.
115   *
116   * This struct holds an NVM section read from the NIC using NVM_ACCESS_CMD,
117   * and saved for later use by the driver. Not all NVM sections are saved
118   * this way, only the needed ones.
119   */
120  struct iwl_nvm_section {
121  	u16 length;
122  	const u8 *data;
123  };
124  
125  /**
126   * iwl_read_external_nvm - Reads external NVM from a file into nvm_sections
127   */
128  int iwl_read_external_nvm(struct iwl_trans *trans,
129  			  const char *nvm_file_name,
130  			  struct iwl_nvm_section *nvm_sections);
131  void iwl_nvm_fixups(u32 hw_id, unsigned int section, u8 *data,
132  		    unsigned int len);
133  
134  /**
135   * iwl_get_nvm - retrieve NVM data from firmware
136   *
137   * Allocates a new iwl_nvm_data structure, fills it with
138   * NVM data, and returns it to caller.
139   */
140  struct iwl_nvm_data *iwl_get_nvm(struct iwl_trans *trans,
141  				 const struct iwl_fw *fw);
142  #endif /* __iwl_nvm_parse_h__ */
143