blob: 02a6965c5c4c95de24ad60a165a439ecf0cd668d [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
2 * Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
3 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
28#if !defined __CDS_REG_SERVICE_H
29#define __CDS_REG_SERVICE_H
30
31/**=========================================================================
32
33 \file cds_reg_service.h
34
35 \brief Connectivity driver services (CDS): Non-Volatile storage API
36
37 ========================================================================*/
38
39#include "cdf_status.h"
40
41#define CDS_COUNTRY_CODE_LEN 2
42#define CDS_MAC_ADDRESS_LEN 6
43
44typedef enum {
45 REGDOMAIN_FCC,
46 REGDOMAIN_ETSI,
47 REGDOMAIN_JAPAN,
48 REGDOMAIN_WORLD,
49 REGDOMAIN_COUNT
50} v_REGDOMAIN_t;
51
52typedef enum {
53 /* 2.4GHz Band */
54 RF_CHAN_1 = 0,
55 RF_CHAN_2,
56 RF_CHAN_3,
57 RF_CHAN_4,
58 RF_CHAN_5,
59 RF_CHAN_6,
60 RF_CHAN_7,
61 RF_CHAN_8,
62 RF_CHAN_9,
63 RF_CHAN_10,
64 RF_CHAN_11,
65 RF_CHAN_12,
66 RF_CHAN_13,
67 RF_CHAN_14,
68
69 /* 4.9GHz Band */
70 RF_CHAN_240,
71 RF_CHAN_244,
72 RF_CHAN_248,
73 RF_CHAN_252,
74 RF_CHAN_208,
75 RF_CHAN_212,
76 RF_CHAN_216,
77
78 /* 5GHz Low & Mid U-NII Band */
79 RF_CHAN_36,
80 RF_CHAN_40,
81 RF_CHAN_44,
82 RF_CHAN_48,
83 RF_CHAN_52,
84 RF_CHAN_56,
85 RF_CHAN_60,
86 RF_CHAN_64,
87
88 /* 5GHz Mid Band - ETSI & FCC */
89 RF_CHAN_100,
90 RF_CHAN_104,
91 RF_CHAN_108,
92 RF_CHAN_112,
93 RF_CHAN_116,
94 RF_CHAN_120,
95 RF_CHAN_124,
96 RF_CHAN_128,
97 RF_CHAN_132,
98 RF_CHAN_136,
99 RF_CHAN_140,
100
101 RF_CHAN_144,
102
103 /* 5GHz High U-NII Band */
104 RF_CHAN_149,
105 RF_CHAN_153,
106 RF_CHAN_157,
107 RF_CHAN_161,
108 RF_CHAN_165,
109
110 /* 802.11p */
111 RF_CHAN_170,
112 RF_CHAN_171,
113 RF_CHAN_172,
114 RF_CHAN_173,
115 RF_CHAN_174,
116 RF_CHAN_175,
117 RF_CHAN_176,
118 RF_CHAN_177,
119 RF_CHAN_178,
120 RF_CHAN_179,
121 RF_CHAN_180,
122 RF_CHAN_181,
123 RF_CHAN_182,
124 RF_CHAN_183,
125 RF_CHAN_184,
126
127 /* CHANNEL BONDED CHANNELS */
128 RF_CHAN_BOND_3,
129 RF_CHAN_BOND_4,
130 RF_CHAN_BOND_5,
131 RF_CHAN_BOND_6,
132 RF_CHAN_BOND_7,
133 RF_CHAN_BOND_8,
134 RF_CHAN_BOND_9,
135 RF_CHAN_BOND_10,
136 RF_CHAN_BOND_11,
137 RF_CHAN_BOND_242, /* 4.9GHz Band */
138 RF_CHAN_BOND_246,
139 RF_CHAN_BOND_250,
140 RF_CHAN_BOND_210,
141 RF_CHAN_BOND_214,
142 RF_CHAN_BOND_38, /* 5GHz Low & Mid U-NII Band */
143 RF_CHAN_BOND_42,
144 RF_CHAN_BOND_46,
145 RF_CHAN_BOND_50,
146 RF_CHAN_BOND_54,
147 RF_CHAN_BOND_58,
148 RF_CHAN_BOND_62,
149 RF_CHAN_BOND_102, /* 5GHz Mid Band - ETSI & FCC */
150 RF_CHAN_BOND_106,
151 RF_CHAN_BOND_110,
152 RF_CHAN_BOND_114,
153 RF_CHAN_BOND_118,
154 RF_CHAN_BOND_122,
155 RF_CHAN_BOND_126,
156 RF_CHAN_BOND_130,
157 RF_CHAN_BOND_134,
158 RF_CHAN_BOND_138,
159
160 RF_CHAN_BOND_142,
161
162 RF_CHAN_BOND_151, /* 5GHz High U-NII Band */
163 RF_CHAN_BOND_155,
164 RF_CHAN_BOND_159,
165 RF_CHAN_BOND_163,
166
167 NUM_RF_CHANNELS,
168
169 MIN_2_4GHZ_CHANNEL = RF_CHAN_1,
170 MAX_2_4GHZ_CHANNEL = RF_CHAN_14,
171 NUM_24GHZ_CHANNELS = (MAX_2_4GHZ_CHANNEL - MIN_2_4GHZ_CHANNEL + 1),
172
173 MIN_5GHZ_CHANNEL = RF_CHAN_240,
174 MAX_5GHZ_CHANNEL = RF_CHAN_184,
175 NUM_5GHZ_CHANNELS = (MAX_5GHZ_CHANNEL - MIN_5GHZ_CHANNEL + 1),
176
177 MIN_20MHZ_RF_CHANNEL = RF_CHAN_1,
178 MAX_20MHZ_RF_CHANNEL = RF_CHAN_184,
179 NUM_20MHZ_RF_CHANNELS =
180 (MAX_20MHZ_RF_CHANNEL - MIN_20MHZ_RF_CHANNEL + 1),
181
182 MIN_40MHZ_RF_CHANNEL = RF_CHAN_BOND_3,
183 MAX_40MHZ_RF_CHANNEL = RF_CHAN_BOND_163,
184 NUM_40MHZ_RF_CHANNELS =
185 (MAX_40MHZ_RF_CHANNEL - MIN_40MHZ_RF_CHANNEL + 1),
186
187 MIN_5_9GHZ_CHANNEL = RF_CHAN_170,
188 MAX_5_9GHZ_CHANNEL = RF_CHAN_184,
189
190 INVALID_RF_CHANNEL = 0xBAD,
191 RF_CHANNEL_INVALID_MAX_FIELD = 0x7FFFFFFF
192} eRfChannels;
193
194typedef enum {
195 CHANNEL_STATE_DISABLE,
196 CHANNEL_STATE_ENABLE,
197 CHANNEL_STATE_DFS,
198 CHANNEL_STATE_INVALID
199} CHANNEL_STATE;
200
201typedef int8_t tPowerdBm;
202
203typedef struct {
204 uint32_t enabled:4;
205 uint32_t flags:28;
206 tPowerdBm pwrLimit;
207} sRegulatoryChannel;
208
209typedef struct {
210 sRegulatoryChannel channels[NUM_RF_CHANNELS];
211} sRegulatoryDomain;
212
213typedef struct {
214 uint16_t targetFreq;
215 uint16_t channelNum;
216} tRfChannelProps;
217
218typedef struct {
219 uint8_t chanId;
220 tPowerdBm pwr;
221} tChannelListWithPower;
222
223typedef enum {
224 COUNTRY_INIT,
225 COUNTRY_IE,
226 COUNTRY_USER,
227 COUNTRY_QUERY,
228 COUNTRY_MAX = COUNTRY_QUERY
229} v_CountryInfoSource_t;
230
231/**
232 * enum chan_width: channel width
233 *
234 * @CHAN_WIDTH_0MHZ: channel disabled or invalid
235 * @CHAN_WIDTH_5MHZ: channel width 5 MHZ
236 * @CHAN_WIDTH_10MHZ: channel width 10 MHZ
237 * @CHAN_WIDTH_20MHZ: channel width 20 MHZ
238 * @CHAN_WIDTH_40MHZ: channel width 40 MHZ
239 * @CHAN_WIDTH_80MHZ: channel width 80MHZ
240 * @CHAN_WIDTH_160MHZ: channel width 160 MHZ
241 */
242enum channel_width {
243 CHAN_WIDTH_0MHZ,
244 CHAN_WIDTH_5MHZ,
245 CHAN_WIDTH_10MHZ,
246 CHAN_WIDTH_20MHZ,
247 CHAN_WIDTH_40MHZ,
248 CHAN_WIDTH_80MHZ,
249 CHAN_WIDTH_160MHZ
250};
251
252/**
253 * @country_code_t : typedef for country code. One extra
254 * char for holding null character
255 */
256typedef uint8_t country_code_t[CDS_COUNTRY_CODE_LEN + 1];
257
258typedef struct {
259 sRegulatoryDomain regDomains[REGDOMAIN_COUNT];
260 country_code_t default_country;
261} t_reg_table;
262
263
264CDF_STATUS cds_get_reg_domain_from_country_code(v_REGDOMAIN_t *pRegDomain,
265 const country_code_t countryCode,
266 v_CountryInfoSource_t source);
267
268CDF_STATUS cds_read_default_country(country_code_t default_country);
269
270CDF_STATUS cds_get_channel_list_with_power(tChannelListWithPower
271 *pChannels20MHz,
272 uint8_t *pNum20MHzChannelsFound,
273 tChannelListWithPower
274 *pChannels40MHz,
275 uint8_t *pNum40MHzChannelsFound);
276
277CDF_STATUS cds_set_reg_domain(void *clientCtxt, v_REGDOMAIN_t regId);
278
279CHANNEL_STATE cds_get_channel_state(uint32_t rfChannel);
280
281#define CDS_IS_DFS_CH(channel) (cds_get_channel_state((channel)) == \
282 CHANNEL_STATE_DFS)
283
284#define CDS_IS_PASSIVE_OR_DISABLE_CH(channel) \
285 (cds_get_channel_state((channel)) != CHANNEL_STATE_ENABLE)
286
287#define CDS_MAX_24GHz_CHANNEL_NUMBER \
288 (rf_channels[MAX_2_4GHZ_CHANNEL].channelNum)
289#define CDS_MIN_5GHz_CHANNEL_NUMBER (rf_channels[RF_CHAN_36].channelNum)
290#define CDS_MAX_5GHz_CHANNEL_NUMBER (rf_channels[MAX_5GHZ_CHANNEL].channelNum)
291
292#define CDS_IS_CHANNEL_5GHZ(chnNum) \
293 (((chnNum) >= CDS_MIN_5GHz_CHANNEL_NUMBER) && ((chnNum) <= CDS_MAX_5GHz_CHANNEL_NUMBER))
294
295#define CDS_IS_CHANNEL_24GHZ(chnNum) \
296 (((chnNum) > 0) && ((chnNum) <= CDS_MAX_24GHz_CHANNEL_NUMBER))
297
298#define CDS_IS_SAME_BAND_CHANNELS(ch1, ch2) \
299 (ch1 && ch2 && \
300 (CDS_IS_CHANNEL_5GHZ(ch1) == CDS_IS_CHANNEL_5GHZ(ch2)))
301
302CDF_STATUS cds_regulatory_init(void);
303CDF_STATUS cds_get_dfs_region(uint8_t *dfs_region);
304CDF_STATUS cds_set_dfs_region(uint8_t dfs_region);
305bool cds_is_dsrc_channel(uint16_t);
306CHANNEL_STATE cds_get_bonded_channel_state(uint32_t chan_num,
307 enum channel_width ch_width);
308enum channel_width cds_get_max_channel_bw(uint32_t chan_num);
309
310#endif /* __CDS_REG_SERVICE_H */