xref: /wlan-dirver/qca-wifi-host-cmn/umac/dfs/core/src/filtering/dfs_radar.c (revision 3149adf58a329e17232a4c0e58d460d025edd55a)
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 
29 /**
30  * struct dfs_pulse dfs_fcc_radars - FCC radar table for Offload chipsets.
31  */
32 struct dfs_pulse dfs_fcc_radars[] = {
33 	/* FCC TYPE 1 */
34 	{18,  1,  700, 700, 0,  4,  5,  0,  1, 18,  0, 3,  1, 5, 0, 0},
35 	{18,  1,  350, 350, 0,  4,  5,  0,  1, 18,  0, 3,  0, 5, 0, 0},
36 
37 	/* FCC TYPE 6 */
38 	{9,   1, 3003, 3003, 1,  7,  5,  0,  1, 18,  0, 0,  1, 1000, 0, 1},
39 
40 	/* FCC TYPE 2 */
41 	{23, 5, 4347, 6666, 0,  4, 11,  0,  7, 22,  0, 3,  0, 5, 0, 2},
42 
43 	/* FCC TYPE 3 */
44 	{18, 10, 2000, 5000, 0,  4,  8,  6, 13, 22,  0, 3, 0, 5, 0, 5},
45 
46 	/* FCC TYPE 4 */
47 	{16, 15, 2000, 5000, 0,  4,  7, 11, 23, 22,  0, 3, 0, 5, 0, 11},
48 
49 	/* FCC NEW TYPE 1 */
50 	/* 518us to 938us pulses (min 56 pulses) */
51 	{57, 1, 1066, 1930, 0, 4,  20,  0,  1, 22,  0, 3,  0, 5, 0, 21},
52 
53 	/* 938us to 2000 pulses (min 26 pulses) */
54 	{27, 1,  500, 1066, 0, 4,  13,  0,  1, 22,  0, 3,  0, 5, 0, 22},
55 
56 	/* 2000 to 3067us pulses (min 17 pulses) */
57 	{18, 1,  325,  500, 0, 4,  9,   0,  1, 22,  0, 3,  0, 5, 0, 23},
58 };
59 
60 /**
61  * struct dfs_pulse dfs_mkk4_radars - MKK4 radar table for Offload chipsets.
62  */
63 struct dfs_pulse dfs_mkk4_radars[] = {
64 
65 	/* following two filters are specific to Japan/MKK4 */
66 	/* 1389 +/- 6 us */
67 	{18,  1,  720,  720, 0,  4,  6,  0,  1, 18,  0, 3, 0, 5, 0, 17},
68 
69 	/* 4000 +/- 6 us */
70 	{18,  4,  250,  250, 0,  4,  5,  1,  6, 18,  0, 3, 0, 5, 0, 18},
71 
72 	/* 3846 +/- 7 us */
73 	{18,  5,  260,  260, 0,  4,  6,  1,  6, 18,  0, 3, 1, 5, 0, 19},
74 
75 	/* following filters are common to both FCC and JAPAN */
76 
77 	/* FCC TYPE 1 */
78 	{18,  1,  700, 700, 0,  4,  5,  0,  1, 18,  0, 3,  1, 5, 0, 0},
79 	{18,  1,  350, 350, 0,  4,  5,  0,  1, 18,  0, 3,  0, 5, 0, 0},
80 
81 	/* FCC TYPE 6 */
82 	{9,   1, 3003, 3003, 1,  7,  5,  0,  1, 18,  0, 0, 1,  1000, 0, 1},
83 
84 	/* FCC TYPE 2 */
85 	{23, 5, 4347, 6666, 0,  4, 11,  0,  7, 22,  0, 3,  0, 5, 0, 2},
86 
87 	/* FCC TYPE 3 */
88 	{18, 10, 2000, 5000, 0,  4,  8,  6, 13, 22,  0, 3, 0, 5, 0, 5},
89 
90 	/* FCC TYPE 4 */
91 	{16, 15, 2000, 5000, 0,  4,  7, 11, 23, 22,  0, 3, 0, 5, 0, 11},
92 };
93 
94 /**
95  * struct dfs_bin5pulse dfs_fcc_bin5pulses - FCC BIN5 pulses for Offload
96  *                                           chipsets.
97  */
98 struct dfs_bin5pulse dfs_fcc_bin5pulses[] = {
99 	{6, 28, 105, 12, 18, 5},
100 };
101 
102 /**
103  * struct dfs_bin5pulse dfs_jpn_bin5pulses - JAPAN BIN5 pulses for Offload
104  *                                           chipsets.
105  */
106 struct dfs_bin5pulse dfs_jpn_bin5pulses[] = {
107 	{5, 28, 105, 12, 22, 5},
108 };
109 
110 /**
111  * dfs_bin5pulse dfs_fcc_bin5pulses_ar900b - FCC BIN5 pulses for AR9300
112  *                                           chipsets.
113  *
114  * WAR : IR 42631
115  * Beeliner 2 is tested at -65dbm as opposed to -62 dbm.
116  * For FCC/JPN chirping pulses, HW reports RSSI value that is lower by 2dbm
117  * when we enable noise floor claibration. This is specially true for
118  * frequencies that are greater than center frequency and in VHT80 mode.
119  */
120 
121 struct dfs_bin5pulse dfs_fcc_bin5pulses_ar900b[] = {
122 	{5, 28, 105, 12, 20, 5},
123 };
124 
125 /**
126  * dfs_bin5pulse dfs_jpn_bin5pulses_ar900b - JAPAN BIN5 pulses for AR9300
127  *                                           chipsets.
128  */
129 struct dfs_bin5pulse dfs_jpn_bin5pulses_ar900b[] = {
130 	{5, 28, 105, 12, 20, 5},
131 };
132 
133 /**
134  * dfs_bin5pulse dfs_fcc_bin5pulses_qca9984 - FCC BIN5 pulses for QCA9984
135  *                                            chipsets.
136  * WAR : IR-83400
137  * Cascade is tested at -65dbm as opposed to -62 dbm.
138  * For FCC/JPN chirping pulses, HW reports RSSI value that is significantly
139  * lower at left edge especially in HT80_80 mode. Also, duration may be
140  * significantly low. This can result in false detection and we may have to
141  * raise the threshold.
142  */
143 struct dfs_bin5pulse dfs_fcc_bin5pulses_qca9984[] = {
144 	{5, 20, 105, 12, 20, 0},
145 };
146 
147 /**
148  * dfs_bin5pulse dfs_jpn_bin5pulses_qca9984 - JAPAN BIN5 pulses for QCA9984
149  *                                            chipsets.
150  */
151 struct dfs_bin5pulse dfs_jpn_bin5pulses_qca9984[] = {
152 	{5, 20, 105, 12, 20, 0},
153 };
154 
155 /**
156  * dfs_pulse dfs_etsi_radars - ETSI radar table.
157  */
158 struct dfs_pulse dfs_etsi_radars[] = {
159 
160 	/* EN 302 502 frequency hopping pulse */
161 	/* PRF 3000, 1us duration, 9 pulses per burst */
162 	{9,   1, 3000, 3000, 1,  4,  5,  0,  1, 18,  0, 0, 1,  1000, 0, 40},
163 	/* PRF 4500, 20us duration, 9 pulses per burst */
164 	{9,  20, 4500, 4500, 1,  4,  5, 19, 21, 18,  0, 0, 1,  1000, 0, 41},
165 
166 	/* TYPE staggered pulse */
167 	/* Type 5*/
168 	/* 0.8-2us, 2-3 bursts,300-400 PRF, 10 pulses each */
169 	{30,  2,  300,  400, 2, 30,  3,  0,  5, 15, 0,   0, 1, 5, 0, 31},
170 	/* Type 6 */
171 	/* 0.8-2us, 2-3 bursts, 400-1200 PRF, 15 pulses each */
172 	{30,  2,  400, 1200, 2, 30,  7,  0,  5, 15, 0,   0, 0, 5, 0, 32},
173 
174 	/* constant PRF based */
175 	/* Type 1 */
176 	/* 0.8-5us, 200  300 PRF, 10 pulses */
177 	{10, 5,   200,  400, 0,  4,  5,  0,  8, 15, 0,   0, 2, 5, 0, 33},
178 	{10, 5,   400,  600, 0,  4,  5,  0,  8, 15, 0,   0, 2, 5, 0, 37},
179 	{10, 5,   600,  800, 0,  4,  5,  0,  8, 15, 0,   0, 2, 5, 0, 38},
180 	{10, 5,   800, 1000, 0,  4,  5,  0,  8, 15, 0,   0, 2, 5, 0, 39},
181 	/* {10, 5,   200, 1000, 0,  6,  5,  0,  8, 15, 0,   0, 2, 5, 33}, */
182 
183 	/* Type 2 */
184 	/* 0.8-15us, 200-1600 PRF, 15 pulses */
185 	{15, 15,  200, 1600, 0,  4, 8,  0, 18, 24, 0,   0, 0, 5, 0, 34},
186 
187 	/* Type 3 */
188 	/* 0.8-15us, 2300-4000 PRF, 25 pulses*/
189 	{25, 15, 2300, 4000, 0,  4, 10, 0, 18, 24, 0,   0, 0, 5, 0, 35},
190 
191 	/* Type 4 */
192 	/* 20-30us, 2000-4000 PRF, 20 pulses*/
193 	{20, 30, 2000, 4000, 0,  4, 6, 19, 33, 24, 0,   0, 0, 24,  1, 36},
194 };
195 
196 /**
197  * dfs_pulse dfs_china_radars - CHINA radar table.
198  */
199 struct dfs_pulse dfs_china_radars[] = {
200 
201 	/* TYPE staggered pulse */
202 	/* Type 5*/
203 	/* 0.8-2us, 2-3 bursts,300-400 PRF, 12 pulses each */
204 	{36,  2,  300,  400, 2, 30,  3,  0,  5, 15, 0,   0, 1, 51},
205 	/* Type 6 */
206 	/* 0.8-2us, 2-3 bursts, 400-1200 PRF, 16 pulses each */
207 	{48,  2,  400, 1200, 2, 30,  7,  0,  5, 15, 0,   0, 0, 52},
208 
209 	/* constant PRF based */
210 	/* Type 1 */
211 	/* 0.5-5us, 200  1000 PRF, 12 pulses */
212 	{12, 5,   200,  400, 0, 24,  5,  0,  8, 15, 0,   0, 2, 53},
213 	{12, 5,   400,  600, 0, 24,  5,  0,  8, 15, 0,   0, 2, 57},
214 	{12, 5,   600,  800, 0, 24,  5,  0,  8, 15, 0,   0, 2, 58},
215 	{12, 5,   800, 1000, 0, 24,  5,  0,  8, 15, 0,   0, 2, 59},
216 
217 	/* Type 2 */
218 	/* 0.5-15us, 200-1600 PRF, 16 pulses */
219 	{16, 15,  200, 1600, 0, 24, 8,  0, 18, 24, 0,   0, 0, 54},
220 
221 	/* Type 3 */
222 	/* 0.5-30us, 2300-4000 PRF, 24 pulses*/
223 	{24, 15, 2300, 4000,  0, 24, 10, 0, 33, 24, 0,   0, 0, 55},
224 
225 	/* Type 4 */
226 	/* 20-30us, 2000-4000 PRF, 20 pulses*/
227 	{20, 30, 2000, 4000, 0, 24, 6, 19, 33, 24, 0,   0, 0, 56},
228 
229 	/* 1us, 1000 PRF, 20 pulses */
230 	/* 1000 us PRI */
231 	{20,  1, 1000, 1000, 0,  6,  6,  0,  1, 18,  0, 3, 0, 50},
232 };
233 
234 /**
235  * dfs_pulse dfs_korea_radars - KOREA radar table.
236  */
237 struct dfs_pulse dfs_korea_radars[] = {
238 	/* Korea Type 1 */
239 	{18,  1,  700, 700,  0, 4,  5,  0,  1, 18,  0, 3,  1, 5, 0, 40},
240 
241 	/* Korea Type 2 */
242 	{10,  1, 1800, 1800, 0, 4,  4,  0,  1, 18,  0, 3,  1, 5, 0, 41},
243 
244 	/* Korea Type 3 */
245 	{70,  1,  330, 330,  0, 4, 20,  0,  2, 18,  0, 3,  1, 5, 0, 42},
246 
247 	/* Korea Type 4 */
248 	{3,   1, 3003, 3003, 1, 7,  2,  0,  1, 18,  0, 0, 1,  1000, 0, 43},
249 };
250 
251 #define RSSI_THERSH_AR900B    15
252 
253 /**
254  * dfs_assign_fcc_pulse_table() - Assign FCC pulse table
255  * @rinfo: Pointer to wlan_dfs_radar_tab_info structure.
256  * @target_type: Target type.
257  * @tx_ops: target tx ops.
258  */
259 static inline void dfs_assign_fcc_pulse_table(
260 		struct wlan_dfs_radar_tab_info *rinfo,
261 		uint32_t target_type,
262 		struct wlan_lmac_if_target_tx_ops *tx_ops)
263 {
264 	rinfo->dfs_radars = dfs_fcc_radars;
265 	rinfo->numradars = QDF_ARRAY_SIZE(dfs_fcc_radars);
266 
267 	if (tx_ops->tgt_is_tgt_type_ar900b(target_type) ||
268 			tx_ops->tgt_is_tgt_type_ipq4019(target_type)) {
269 		rinfo->b5pulses = dfs_fcc_bin5pulses_ar900b;
270 		rinfo->numb5radars = QDF_ARRAY_SIZE(dfs_fcc_bin5pulses_ar900b);
271 	} else if (tx_ops->tgt_is_tgt_type_qca9984(target_type) ||
272 			tx_ops->tgt_is_tgt_type_qca9888(target_type)) {
273 		rinfo->b5pulses = dfs_fcc_bin5pulses_qca9984;
274 		rinfo->numb5radars =
275 			QDF_ARRAY_SIZE(dfs_fcc_bin5pulses_qca9984);
276 	} else {
277 		rinfo->b5pulses = dfs_fcc_bin5pulses;
278 		rinfo->numb5radars = QDF_ARRAY_SIZE(dfs_fcc_bin5pulses);
279 	}
280 }
281 void ol_if_dfs_configure(struct wlan_dfs *dfs)
282 {
283 	struct wlan_dfs_radar_tab_info rinfo;
284 	struct wlan_objmgr_psoc *psoc;
285 	struct wlan_lmac_if_target_tx_ops *tx_ops;
286 	int i;
287 	uint32_t target_type;
288 	int dfsdomain = DFS_FCC_DOMAIN;
289 	uint16_t ch_freq;
290 	uint16_t regdmn;
291 
292 	/* Fetch current radar patterns from the lmac */
293 	qdf_mem_zero(&rinfo, sizeof(rinfo));
294 
295 	/*
296 	 * Look up the current DFS regulatory domain and decide
297 	 * which radar pulses to use.
298 	 */
299 	dfsdomain = utils_get_dfsdomain(dfs->dfs_pdev_obj);
300 	target_type = lmac_get_target_type(dfs->dfs_pdev_obj);
301 
302 	psoc = wlan_pdev_get_psoc(dfs->dfs_pdev_obj);
303 	if (!psoc) {
304 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "psoc is NULL");
305 		return;
306 	}
307 
308 	tx_ops = &(psoc->soc_cb.tx_ops.target_tx_ops);
309 	switch (dfsdomain) {
310 	case DFS_FCC_DOMAIN:
311 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "FCC domain");
312 		rinfo.dfsdomain = DFS_FCC_DOMAIN;
313 		dfs_assign_fcc_pulse_table(&rinfo, target_type, tx_ops);
314 		break;
315 	case DFS_CN_DOMAIN:
316 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
317 				"FCC domain -- Country China(156) override FCC radar pattern"
318 				);
319 		rinfo.dfsdomain = DFS_FCC_DOMAIN;
320 		/*
321 		 * China uses a radar pattern that is similar to ETSI but it
322 		 * follows FCC in all other respect like transmit power, CCA
323 		 * threshold etc.
324 		 */
325 		rinfo.dfs_radars = dfs_china_radars;
326 		rinfo.numradars = QDF_ARRAY_SIZE(dfs_china_radars);
327 		rinfo.b5pulses = NULL;
328 		rinfo.numb5radars = 0;
329 		break;
330 	case DFS_ETSI_DOMAIN:
331 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "ETSI domain");
332 		rinfo.dfsdomain = DFS_ETSI_DOMAIN;
333 
334 		ch_freq = dfs->dfs_curchan->dfs_ch_freq;
335 		regdmn = utils_dfs_get_cur_rd(dfs->dfs_pdev_obj);
336 
337 		if ((regdmn == ETSI11_WORLD_REGDMN_PAIR_ID) &&
338 				DFS_CURCHAN_IS_58GHz(ch_freq)) {
339 			rinfo.dfs_radars = dfs_etsi_radars;
340 			rinfo.numradars = QDF_ARRAY_SIZE(dfs_etsi_radars);
341 		} else {
342 			uint8_t offset = ETSI_LEGACY_PULSE_ARR_OFFSET;
343 
344 			rinfo.dfs_radars = &dfs_etsi_radars[offset];
345 			rinfo.numradars =
346 				QDF_ARRAY_SIZE(dfs_etsi_radars) - offset;
347 		}
348 		rinfo.b5pulses = NULL;
349 		rinfo.numb5radars = 0;
350 		break;
351 	case DFS_KR_DOMAIN:
352 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
353 				"ETSI domain -- Korea(412)");
354 		rinfo.dfsdomain = DFS_ETSI_DOMAIN;
355 
356 		/*
357 		 * So far we have treated Korea as part of ETSI and did not
358 		 * support any radar patters specific to Korea other than
359 		 * standard ETSI radar patterns. Ideally we would want to
360 		 * treat Korea as a different domain. This is something that
361 		 * we will address in the future. However, for now override
362 		 * ETSI tables for Korea.
363 		 */
364 		rinfo.dfs_radars = dfs_korea_radars;
365 		rinfo.numradars = QDF_ARRAY_SIZE(dfs_korea_radars);
366 		rinfo.b5pulses = NULL;
367 		rinfo.numb5radars = 0;
368 		break;
369 	case DFS_MKK4_DOMAIN:
370 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "MKK4 domain");
371 		rinfo.dfsdomain = DFS_MKK4_DOMAIN;
372 		rinfo.dfs_radars = dfs_mkk4_radars;
373 		rinfo.numradars = QDF_ARRAY_SIZE(dfs_mkk4_radars);
374 
375 		if (tx_ops->tgt_is_tgt_type_ar900b(target_type) ||
376 				tx_ops->tgt_is_tgt_type_ipq4019(target_type)) {
377 			rinfo.b5pulses = dfs_jpn_bin5pulses_ar900b;
378 			rinfo.numb5radars = QDF_ARRAY_SIZE(
379 					dfs_jpn_bin5pulses_ar900b);
380 		} else if (tx_ops->tgt_is_tgt_type_qca9984(target_type) ||
381 				tx_ops->tgt_is_tgt_type_qca9888(target_type)) {
382 			rinfo.b5pulses = dfs_jpn_bin5pulses_qca9984;
383 			rinfo.numb5radars = QDF_ARRAY_SIZE
384 				(dfs_jpn_bin5pulses_qca9984);
385 		} else {
386 			rinfo.b5pulses = dfs_jpn_bin5pulses;
387 			rinfo.numb5radars = QDF_ARRAY_SIZE(
388 					dfs_jpn_bin5pulses);
389 		}
390 		break;
391 	default:
392 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "UNINIT domain");
393 		rinfo.dfsdomain = DFS_UNINIT_DOMAIN;
394 		rinfo.dfs_radars = NULL;
395 		rinfo.numradars = 0;
396 		rinfo.b5pulses = NULL;
397 		rinfo.numb5radars = 0;
398 		break;
399 	}
400 
401 	if (tx_ops->tgt_is_tgt_type_ar900b(target_type) ||
402 			tx_ops->tgt_is_tgt_type_ipq4019(target_type) ||
403 			tx_ops->tgt_is_tgt_type_qca9984(target_type) ||
404 			tx_ops->tgt_is_tgt_type_qca9888(target_type)) {
405 		/* Beeliner WAR: lower RSSI threshold to improve detection of
406 		 * certian radar types
407 		 */
408 		/* Cascade WAR:
409 		 * Cascade can report lower RSSI near the channel boundary then
410 		 * expected. It can also report significantly low RSSI at center
411 		 * (as low as 16) at center. So we are lowering threshold for
412 		 * all types of radar for * Cascade.
413 		 * This may increase the possibility of false radar detection.
414 		 * IR -- 083703, 083398, 083387
415 		 */
416 
417 		for (i = 0; i < rinfo.numradars; i++)
418 			rinfo.dfs_radars[i].rp_rssithresh = RSSI_THERSH_AR900B;
419 	}
420 
421 	dfs_init_radar_filters(dfs, &rinfo);
422 }
423 
424 void dfs_get_radars(struct wlan_dfs *dfs)
425 {
426 #define AR5212_DEVID_IBM            0x1014 /* IBM minipci ID */
427 #define AR5212_AR2413               0x001a /* AR2413 aka Griffin-lite */
428 #define AR5212_AR2413               0x001a /* AR2413 aka Griffin-lite */
429 #define AR5212_AR5413               0x001b /* Eagle */
430 #define AR5212_AR5424               0x001c /* Condor (PCI express) */
431 #define AR5212_DEVID_FF19           0xff19 /* PCI express */
432 #define AR5212_AR2417               0x001d /* Nala, PCI */
433 #define AR5212_DEVID                0x0013 /* Final ar5212 devid */
434 #define AR5212_FPGA                 0xf013 /* Emulation board */
435 #define AR5212_DEFAULT              0x1113 /* No eeprom HW default */
436 
437 #define AR5416_DEVID_PCI            0x0023 /* AR5416 PCI (CB/MB) (Owl)*/
438 #define AR5416_DEVID_PCIE           0x0024 /* AR5416 PCI-E (XB) (Owl) */
439 #define AR5416_DEVID_AR9160_PCI     0x0027 /* AR9160 PCI (Sowl) */
440 #define AR5416_AR9100_DEVID         0x000b /* AR9100 (Howl)    */
441 #define AR5416_DEVID_AR9280_PCI     0x0029 /* PCI (Merlin) */
442 #define AR5416_DEVID_AR9280_PCIE    0x002a /* PCIE (Merlin) */
443 #define AR5416_DEVID_AR9285_PCIE    0x002b /* PCIE (Kite) */
444 #define AR5416_DEVID_AR9285G_PCIE   0x002c /* PCIE (Kite G only) */
445 #define AR5416_DEVID_AR9287_PCI     0x002d /* PCI (Kiwi) */
446 #define AR5416_DEVID_AR9287_PCIE    0x002e /* PCIE (Kiwi) */
447 
448 #define AR9300_DEVID_AR9380_PCIE    0x0030 /* PCIE (Osprey) */
449 #define AR9300_DEVID_AR9340         0x0031 /* Wasp */
450 #define AR9300_DEVID_AR9485_PCIE    0x0032 /* Poseidon */
451 #define AR9300_DEVID_AR9580_PCIE    0x0033 /* Peacock */
452 #define AR9300_DEVID_AR1111_PCIE    0x0037 /* AR1111 */
453 #define AR9300_DEVID_AR946X_PCIE    0x0034 /* Jupiter: 2x2 DB + BT - AR9462 */
454 #define AR9300_DEVID_AR955X         0x0039 /* Scorpion */
455 #define AR9300_DEVID_AR953X         0x003d /* Honey Bee */
456 #define AR9300_DEVID_AR956X         0x003f /* Dragonfly */
457 #define AR9300_DEVID_AR956X_PCIE    0x0036 /* Aphrodite: 1x1 DB + BT - AR9564 */
458 #define AR9300_DEVID_EMU_PCIE       0xabcd
459 
460 	struct wlan_objmgr_psoc *psoc;
461 
462 	if (!dfs) {
463 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "dfs is NULL");
464 		return;
465 	}
466 
467 	psoc = wlan_pdev_get_psoc(dfs->dfs_pdev_obj);
468 	if (!psoc) {
469 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "psoc is NULL");
470 		return;
471 	}
472 
473 	if (wlan_objmgr_psoc_get_dev_type(psoc) == WLAN_DEV_OL) {
474 		/* For offload chip */
475 		ol_if_dfs_configure(dfs);
476 	} else {
477 		uint16_t devid = lmac_get_ah_devid(dfs->dfs_pdev_obj);
478 		/* For DA chip*/
479 
480 		switch (devid) {
481 		case AR5212_DEVID_IBM:
482 		case AR5212_AR2413:
483 		case AR5212_AR5413:
484 		case AR5212_AR5424:
485 		case AR5212_DEVID_FF19:
486 			devid = AR5212_DEVID;
487 		case AR5212_AR2417:
488 		case AR5212_DEVID:
489 		case AR5212_FPGA:
490 		case AR5212_DEFAULT:
491 			dfs_get_radars_for_ar5212(dfs);
492 			break;
493 		case AR5416_DEVID_PCI:
494 		case AR5416_DEVID_PCIE:
495 		case AR5416_DEVID_AR9160_PCI:
496 		case AR5416_AR9100_DEVID:
497 		case AR5416_DEVID_AR9280_PCI:
498 		case AR5416_DEVID_AR9280_PCIE:
499 		case AR5416_DEVID_AR9285_PCIE:
500 		case AR5416_DEVID_AR9285G_PCIE:
501 		case AR5416_DEVID_AR9287_PCI:
502 		case AR5416_DEVID_AR9287_PCIE:
503 			dfs_get_radars_for_ar5416(dfs);
504 			break;
505 		case AR9300_DEVID_AR9380_PCIE:
506 		case AR9300_DEVID_AR9340:
507 		case AR9300_DEVID_AR9485_PCIE:
508 		case AR9300_DEVID_AR9580_PCIE:
509 		case AR9300_DEVID_AR1111_PCIE:
510 		case AR9300_DEVID_AR946X_PCIE:
511 		case AR9300_DEVID_AR955X:
512 		case AR9300_DEVID_AR953X:
513 		case AR9300_DEVID_AR956X:
514 		case AR9300_DEVID_AR956X_PCIE:
515 		case AR9300_DEVID_EMU_PCIE:
516 			dfs_get_radars_for_ar9300(dfs);
517 			break;
518 		}
519 	}
520 }
521 
522 void dfs_send_csa_to_current_chan(struct wlan_dfs *dfs)
523 {
524 	qdf_timer_stop(&dfs->wlan_dfstesttimer);
525 	dfs->wlan_dfstest = 1;
526 	dfs->wlan_dfstest_ieeechan = dfs->dfs_curchan->dfs_ch_ieee;
527 	dfs->wlan_dfstesttime = 1;   /* 1ms */
528 	qdf_timer_mod(&dfs->wlan_dfstesttimer, dfs->wlan_dfstesttime);
529 }
530