xref: /wlan-dirver/qca-wifi-host-cmn/umac/dfs/core/src/filtering/dfs_partial_offload_radar.c (revision 4865edfd190c086bbe2c69aae12a8226f877b91e)
1 /*
2  * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2011, Atheros Communications Inc.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 /**
19  * DOC: This file has radar table and initialization function for Beeliner
20  * family of chipsets.
21  */
22 
23 #include "../dfs.h"
24 #include "wlan_dfs_mlme_api.h"
25 #include "wlan_dfs_utils_api.h"
26 #include "wlan_dfs_lmac_api.h"
27 #include "../dfs_internal.h"
28 #include "../dfs_partial_offload_radar.h"
29 
30 /**
31  * struct dfs_pulse dfs_fcc_radars - FCC radar table for Offload chipsets.
32  */
33 static struct dfs_pulse dfs_fcc_radars[] = {
34 	/* FCC TYPE 1 */
35 	{18,  1,  700, 700, 0,  4,  5,  0,  1, 18,  0, 3,  1, 5, 0, 0},
36 	{18,  1,  350, 350, 0,  4,  5,  0,  1, 18,  0, 3,  0, 5, 0, 0},
37 
38 	/* FCC TYPE 6 */
39 	{9,   1, 3003, 3003, 1,  7,  5,  0,  1, 18,  0, 0,  1, 1000, 0, 1},
40 
41 	/* FCC TYPE 2 */
42 	{23, 5, 4347, 6666, 0,  4, 11,  0,  7, 22,  0, 3,  0, 5, 0, 2},
43 
44 	/* FCC TYPE 3 */
45 	{18, 10, 2000, 5000, 0,  4,  8,  6, 13, 22,  0, 3, 0, 5, 0, 5},
46 
47 	/* FCC TYPE 4 */
48 	{16, 15, 2000, 5000, 0,  4,  7, 11, 23, 22,  0, 3, 0, 5, 0, 11},
49 
50 	/* FCC NEW TYPE 1 */
51 	/* 518us to 938us pulses (min 56 pulses) */
52 	{57, 1, 1066, 1930, 0, 4,  20,  0,  1, 22,  0, 3,  0, 5, 0, 21},
53 
54 	/* 938us to 2000 pulses (min 26 pulses) */
55 	{27, 1,  500, 1066, 0, 4,  13,  0,  1, 22,  0, 3,  0, 5, 0, 22},
56 
57 	/* 2000 to 3067us pulses (min 17 pulses) */
58 	{18, 1,  325,  500, 0, 4,  9,   0,  1, 22,  0, 3,  0, 5, 0, 23},
59 };
60 
61 /**
62  * struct dfs_pulse dfs_mkk4_radars - MKK4 radar table for Offload chipsets.
63  */
64 static struct dfs_pulse dfs_mkk4_radars[] = {
65 
66 	/* following two filters are specific to Japan/MKK4 */
67 	/* 1389 +/- 6 us */
68 	{18,  1,  720,  720, 0,  4,  6,  0,  1, 18,  0, 3, 0, 5, 0, 17},
69 
70 	/* 4000 +/- 6 us */
71 	{18,  4,  250,  250, 0,  4,  5,  1,  6, 18,  0, 3, 0, 5, 0, 18},
72 
73 	/* 3846 +/- 7 us */
74 	{18,  5,  260,  260, 0,  4,  6,  1,  6, 18,  0, 3, 1, 5, 0, 19},
75 
76 	/* following filters are common to both FCC and JAPAN */
77 
78 	/* FCC TYPE 1 */
79 	{18,  1,  700, 700, 0,  4,  5,  0,  1, 18,  0, 3,  1, 5, 0, 0},
80 	{18,  1,  350, 350, 0,  4,  5,  0,  1, 18,  0, 3,  0, 5, 0, 0},
81 
82 	/* FCC TYPE 6 */
83 	{9,   1, 3003, 3003, 1,  7,  5,  0,  1, 18,  0, 0, 1,  1000, 0, 1},
84 
85 	/* FCC TYPE 2 */
86 	{23, 5, 4347, 6666, 0,  4, 11,  0,  7, 22,  0, 3,  0, 5, 0, 2},
87 
88 	/* FCC TYPE 3 */
89 	{18, 10, 2000, 5000, 0,  4,  8,  6, 13, 22,  0, 3, 0, 5, 0, 5},
90 
91 	/* FCC TYPE 4 */
92 	{16, 15, 2000, 5000, 0,  4,  7, 11, 23, 22,  0, 3, 0, 5, 0, 11},
93 };
94 
95 /**
96  * struct dfs_bin5pulse dfs_fcc_bin5pulses - FCC BIN5 pulses for Offload
97  *                                           chipsets.
98  */
99 static struct dfs_bin5pulse dfs_fcc_bin5pulses[] = {
100 	{6, 28, 105, 12, 18, 5},
101 };
102 
103 /**
104  * struct dfs_bin5pulse dfs_jpn_bin5pulses - JAPAN BIN5 pulses for Offload
105  *                                           chipsets.
106  */
107 static struct dfs_bin5pulse dfs_jpn_bin5pulses[] = {
108 	{5, 28, 105, 12, 22, 5},
109 };
110 
111 /**
112  * dfs_bin5pulse dfs_fcc_bin5pulses_ar900b - FCC BIN5 pulses for AR9300
113  *                                           chipsets.
114  *
115  * WAR : IR 42631
116  * Beeliner 2 is tested at -65dbm as opposed to -62 dbm.
117  * For FCC/JPN chirping pulses, HW reports RSSI value that is lower by 2dbm
118  * when we enable noise floor claibration. This is specially true for
119  * frequencies that are greater than center frequency and in VHT80 mode.
120  */
121 
122 static struct dfs_bin5pulse dfs_fcc_bin5pulses_ar900b[] = {
123 	{5, 28, 105, 12, 20, 5},
124 };
125 
126 /**
127  * dfs_bin5pulse dfs_jpn_bin5pulses_ar900b - JAPAN BIN5 pulses for AR9300
128  *                                           chipsets.
129  */
130 static struct dfs_bin5pulse dfs_jpn_bin5pulses_ar900b[] = {
131 	{5, 28, 105, 12, 20, 5},
132 };
133 
134 /**
135  * dfs_bin5pulse dfs_fcc_bin5pulses_qca9984 - FCC BIN5 pulses for QCA9984
136  *                                            chipsets.
137  * WAR : IR-83400
138  * Cascade is tested at -65dbm as opposed to -62 dbm.
139  * For FCC/JPN chirping pulses, HW reports RSSI value that is significantly
140  * lower at left edge especially in HT80_80 mode. Also, duration may be
141  * significantly low. This can result in false detection and we may have to
142  * raise the threshold.
143  */
144 static struct dfs_bin5pulse dfs_fcc_bin5pulses_qca9984[] = {
145 	{5, 20, 105, 12, 20, 0},
146 };
147 
148 /**
149  * dfs_bin5pulse dfs_jpn_bin5pulses_qca9984 - JAPAN BIN5 pulses for QCA9984
150  *                                            chipsets.
151  */
152 static struct dfs_bin5pulse dfs_jpn_bin5pulses_qca9984[] = {
153 	{5, 20, 105, 12, 20, 0},
154 };
155 
156 /**
157  * dfs_pulse dfs_etsi_radars - ETSI radar table.
158  */
159 static struct dfs_pulse dfs_etsi_radars[] = {
160 
161 	/* EN 302 502 frequency hopping pulse */
162 	/* PRF 3000, 1us duration, 9 pulses per burst */
163 	{9,   1, 3000, 3000, 1,  4,  5,  0,  1, 18,  0, 0, 1,  1000, 0, 40},
164 	/* PRF 4500, 20us duration, 9 pulses per burst */
165 	{9,  20, 4500, 4500, 1,  4,  5, 19, 21, 18,  0, 0, 1,  1000, 0, 41},
166 
167 	/* TYPE staggered pulse */
168 	/* Type 5*/
169 	/* 0.8-2us, 2-3 bursts,300-400 PRF, 10 pulses each */
170 	{30,  2,  300,  400, 2, 30,  3,  0,  5, 15, 0,   0, 1, 5, 0, 31},
171 	/* Type 6 */
172 	/* 0.8-2us, 2-3 bursts, 400-1200 PRF, 15 pulses each */
173 	{30,  2,  400, 1200, 2, 30,  7,  0,  5, 15, 0,   0, 0, 5, 0, 32},
174 
175 	/* constant PRF based */
176 	/* Type 1 */
177 	/* 0.8-5us, 200  300 PRF, 10 pulses */
178 	{10, 5,   200,  400, 0,  4,  5,  0,  8, 15, 0,   0, 2, 5, 0, 33},
179 	{10, 5,   400,  600, 0,  4,  5,  0,  8, 15, 0,   0, 2, 5, 0, 37},
180 	{10, 5,   600,  800, 0,  4,  5,  0,  8, 15, 0,   0, 2, 5, 0, 38},
181 	{10, 5,   800, 1000, 0,  4,  5,  0,  8, 15, 0,   0, 2, 5, 0, 39},
182 	/* {10, 5,   200, 1000, 0,  6,  5,  0,  8, 15, 0,   0, 2, 5, 33}, */
183 
184 	/* Type 2 */
185 	/* 0.8-15us, 200-1600 PRF, 15 pulses */
186 	{15, 15,  200, 1600, 0,  4, 8,  0, 18, 24, 0,   0, 0, 5, 0, 34},
187 
188 	/* Type 3 */
189 	/* 0.8-15us, 2300-4000 PRF, 25 pulses*/
190 	{25, 15, 2300, 4000, 0,  4, 10, 0, 18, 24, 0,   0, 0, 5, 0, 35},
191 
192 	/* Type 4 */
193 	/* 20-30us, 2000-4000 PRF, 20 pulses*/
194 	{20, 30, 2000, 4000, 0,  4, 6, 19, 33, 24, 0,   0, 0, 24,  1, 36},
195 };
196 
197 /**
198  * dfs_pulse dfs_china_radars - CHINA radar table.
199  */
200 static struct dfs_pulse dfs_china_radars[] = {
201 
202 	/* TYPE staggered pulse */
203 	/* Type 5*/
204 	/* 0.8-2us, 2-3 bursts,300-400 PRF, 12 pulses each */
205 	{36,  2,  300,  400, 2, 30,  3,  0,  5, 15, 0,   0, 1, 51},
206 	/* Type 6 */
207 	/* 0.8-2us, 2-3 bursts, 400-1200 PRF, 16 pulses each */
208 	{48,  2,  400, 1200, 2, 30,  7,  0,  5, 15, 0,   0, 0, 52},
209 
210 	/* constant PRF based */
211 	/* Type 1 */
212 	/* 0.5-5us, 200  1000 PRF, 12 pulses */
213 	{12, 5,   200,  400, 0, 24,  5,  0,  8, 15, 0,   0, 2, 53},
214 	{12, 5,   400,  600, 0, 24,  5,  0,  8, 15, 0,   0, 2, 57},
215 	{12, 5,   600,  800, 0, 24,  5,  0,  8, 15, 0,   0, 2, 58},
216 	{12, 5,   800, 1000, 0, 24,  5,  0,  8, 15, 0,   0, 2, 59},
217 
218 	/* Type 2 */
219 	/* 0.5-15us, 200-1600 PRF, 16 pulses */
220 	{16, 15,  200, 1600, 0, 24, 8,  0, 18, 24, 0,   0, 0, 54},
221 
222 	/* Type 3 */
223 	/* 0.5-30us, 2300-4000 PRF, 24 pulses*/
224 	{24, 15, 2300, 4000,  0, 24, 10, 0, 33, 24, 0,   0, 0, 55},
225 
226 	/* Type 4 */
227 	/* 20-30us, 2000-4000 PRF, 20 pulses*/
228 	{20, 30, 2000, 4000, 0, 24, 6, 19, 33, 24, 0,   0, 0, 56},
229 
230 	/* 1us, 1000 PRF, 20 pulses */
231 	/* 1000 us PRI */
232 	{20,  1, 1000, 1000, 0,  6,  6,  0,  1, 18,  0, 3, 0, 50},
233 };
234 
235 /**
236  * dfs_pulse dfs_korea_radars - KOREA radar table.
237  */
238 static struct dfs_pulse dfs_korea_radars[] = {
239 	/* Korea Type 1 */
240 	{18,  1,  700, 700,  0, 4,  5,  0,  1, 18,  0, 3,  1, 5, 0, 40},
241 
242 	/* Korea Type 2 */
243 	{10,  1, 1800, 1800, 0, 4,  4,  0,  1, 18,  0, 3,  1, 5, 0, 41},
244 
245 	/* Korea Type 3 */
246 	{70,  1,  330, 330,  0, 4, 20,  0,  2, 18,  0, 3,  1, 5, 0, 42},
247 
248 	/* Korea Type 4 */
249 	{3,   1, 3003, 3003, 1, 7,  2,  0,  1, 18,  0, 0, 1,  1000, 0, 43},
250 };
251 
252 #define RSSI_THERSH_AR900B    15
253 
254 /**
255  * dfs_assign_fcc_pulse_table() - Assign FCC pulse table
256  * @rinfo: Pointer to wlan_dfs_radar_tab_info structure.
257  * @target_type: Target type.
258  * @tx_ops: target tx ops.
259  */
260 static inline void dfs_assign_fcc_pulse_table(
261 		struct wlan_dfs_radar_tab_info *rinfo,
262 		uint32_t target_type,
263 		struct wlan_lmac_if_target_tx_ops *tx_ops)
264 {
265 	rinfo->dfs_radars = dfs_fcc_radars;
266 	rinfo->numradars = QDF_ARRAY_SIZE(dfs_fcc_radars);
267 
268 	if (tx_ops->tgt_is_tgt_type_ar900b(target_type) ||
269 			tx_ops->tgt_is_tgt_type_ipq4019(target_type)) {
270 		rinfo->b5pulses = dfs_fcc_bin5pulses_ar900b;
271 		rinfo->numb5radars = QDF_ARRAY_SIZE(dfs_fcc_bin5pulses_ar900b);
272 	} else if (tx_ops->tgt_is_tgt_type_qca9984(target_type) ||
273 			tx_ops->tgt_is_tgt_type_qca9888(target_type)) {
274 		rinfo->b5pulses = dfs_fcc_bin5pulses_qca9984;
275 		rinfo->numb5radars =
276 			QDF_ARRAY_SIZE(dfs_fcc_bin5pulses_qca9984);
277 	} else {
278 		rinfo->b5pulses = dfs_fcc_bin5pulses;
279 		rinfo->numb5radars = QDF_ARRAY_SIZE(dfs_fcc_bin5pulses);
280 	}
281 }
282 
283 void dfs_get_po_radars(struct wlan_dfs *dfs)
284 {
285 	struct wlan_dfs_radar_tab_info rinfo;
286 	struct wlan_objmgr_psoc *psoc;
287 	struct wlan_lmac_if_target_tx_ops *tx_ops;
288 	int i;
289 	uint32_t target_type;
290 	int dfsdomain = DFS_FCC_DOMAIN;
291 	uint16_t ch_freq;
292 	uint16_t regdmn;
293 
294 	/* Fetch current radar patterns from the lmac */
295 	qdf_mem_zero(&rinfo, sizeof(rinfo));
296 
297 	/*
298 	 * Look up the current DFS regulatory domain and decide
299 	 * which radar pulses to use.
300 	 */
301 	dfsdomain = utils_get_dfsdomain(dfs->dfs_pdev_obj);
302 	target_type = lmac_get_target_type(dfs->dfs_pdev_obj);
303 
304 	psoc = wlan_pdev_get_psoc(dfs->dfs_pdev_obj);
305 	if (!psoc) {
306 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "psoc is NULL");
307 		return;
308 	}
309 
310 	tx_ops = &(psoc->soc_cb.tx_ops.target_tx_ops);
311 	switch (dfsdomain) {
312 	case DFS_FCC_DOMAIN:
313 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "FCC domain");
314 		rinfo.dfsdomain = DFS_FCC_DOMAIN;
315 		dfs_assign_fcc_pulse_table(&rinfo, target_type, tx_ops);
316 		break;
317 	case DFS_CN_DOMAIN:
318 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
319 				"FCC domain -- Country China(156) override FCC radar pattern"
320 				);
321 		rinfo.dfsdomain = DFS_FCC_DOMAIN;
322 		/*
323 		 * China uses a radar pattern that is similar to ETSI but it
324 		 * follows FCC in all other respect like transmit power, CCA
325 		 * threshold etc.
326 		 */
327 		rinfo.dfs_radars = dfs_china_radars;
328 		rinfo.numradars = QDF_ARRAY_SIZE(dfs_china_radars);
329 		rinfo.b5pulses = NULL;
330 		rinfo.numb5radars = 0;
331 		break;
332 	case DFS_ETSI_DOMAIN:
333 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "ETSI domain");
334 		rinfo.dfsdomain = DFS_ETSI_DOMAIN;
335 
336 		ch_freq = dfs->dfs_curchan->dfs_ch_freq;
337 		regdmn = utils_dfs_get_cur_rd(dfs->dfs_pdev_obj);
338 
339 		if (((regdmn == ETSI11_WORLD_REGDMN_PAIR_ID) ||
340 		    (regdmn == ETSI12_WORLD_REGDMN_PAIR_ID) ||
341 		    (regdmn == ETSI13_WORLD_REGDMN_PAIR_ID) ||
342 		    (regdmn == ETSI14_WORLD_REGDMN_PAIR_ID)) &&
343 		    DFS_CURCHAN_IS_58GHz(ch_freq)) {
344 			rinfo.dfs_radars = dfs_etsi_radars;
345 			rinfo.numradars = QDF_ARRAY_SIZE(dfs_etsi_radars);
346 		} else {
347 			uint8_t offset = ETSI_LEGACY_PULSE_ARR_OFFSET;
348 
349 			rinfo.dfs_radars = &dfs_etsi_radars[offset];
350 			rinfo.numradars =
351 				QDF_ARRAY_SIZE(dfs_etsi_radars) - offset;
352 		}
353 		rinfo.b5pulses = NULL;
354 		rinfo.numb5radars = 0;
355 		break;
356 	case DFS_KR_DOMAIN:
357 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
358 				"ETSI domain -- Korea(412)");
359 		rinfo.dfsdomain = DFS_ETSI_DOMAIN;
360 
361 		/*
362 		 * So far we have treated Korea as part of ETSI and did not
363 		 * support any radar patters specific to Korea other than
364 		 * standard ETSI radar patterns. Ideally we would want to
365 		 * treat Korea as a different domain. This is something that
366 		 * we will address in the future. However, for now override
367 		 * ETSI tables for Korea.
368 		 */
369 		rinfo.dfs_radars = dfs_korea_radars;
370 		rinfo.numradars = QDF_ARRAY_SIZE(dfs_korea_radars);
371 		rinfo.b5pulses = NULL;
372 		rinfo.numb5radars = 0;
373 		break;
374 	case DFS_MKK4_DOMAIN:
375 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "MKK4 domain");
376 		rinfo.dfsdomain = DFS_MKK4_DOMAIN;
377 		rinfo.dfs_radars = dfs_mkk4_radars;
378 		rinfo.numradars = QDF_ARRAY_SIZE(dfs_mkk4_radars);
379 
380 		if (tx_ops->tgt_is_tgt_type_ar900b(target_type) ||
381 				tx_ops->tgt_is_tgt_type_ipq4019(target_type)) {
382 			rinfo.b5pulses = dfs_jpn_bin5pulses_ar900b;
383 			rinfo.numb5radars = QDF_ARRAY_SIZE(
384 					dfs_jpn_bin5pulses_ar900b);
385 		} else if (tx_ops->tgt_is_tgt_type_qca9984(target_type) ||
386 				tx_ops->tgt_is_tgt_type_qca9888(target_type)) {
387 			rinfo.b5pulses = dfs_jpn_bin5pulses_qca9984;
388 			rinfo.numb5radars = QDF_ARRAY_SIZE
389 				(dfs_jpn_bin5pulses_qca9984);
390 		} else {
391 			rinfo.b5pulses = dfs_jpn_bin5pulses;
392 			rinfo.numb5radars = QDF_ARRAY_SIZE(
393 					dfs_jpn_bin5pulses);
394 		}
395 		break;
396 	default:
397 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "UNINIT domain");
398 		rinfo.dfsdomain = DFS_UNINIT_DOMAIN;
399 		rinfo.dfs_radars = NULL;
400 		rinfo.numradars = 0;
401 		rinfo.b5pulses = NULL;
402 		rinfo.numb5radars = 0;
403 		break;
404 	}
405 
406 	if (tx_ops->tgt_is_tgt_type_ar900b(target_type) ||
407 			tx_ops->tgt_is_tgt_type_ipq4019(target_type) ||
408 			tx_ops->tgt_is_tgt_type_qca9984(target_type) ||
409 			tx_ops->tgt_is_tgt_type_qca9888(target_type)) {
410 		/* Beeliner WAR: lower RSSI threshold to improve detection of
411 		 * certian radar types
412 		 */
413 		/* Cascade WAR:
414 		 * Cascade can report lower RSSI near the channel boundary then
415 		 * expected. It can also report significantly low RSSI at center
416 		 * (as low as 16) at center. So we are lowering threshold for
417 		 * all types of radar for * Cascade.
418 		 * This may increase the possibility of false radar detection.
419 		 * IR -- 083703, 083398, 083387
420 		 */
421 
422 		for (i = 0; i < rinfo.numradars; i++)
423 			rinfo.dfs_radars[i].rp_rssithresh = RSSI_THERSH_AR900B;
424 	}
425 
426 	dfs_init_radar_filters(dfs, &rinfo);
427 }
428