1 /* 2 * Copyright (c) 2016-2017 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_lmac_api.h" 26 #include "wlan_dfs_mlme_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, 6, 5, 0, 1, 18, 0, 3, 1, 0}, 35 {18, 1, 350, 350, 0, 6, 5, 0, 1, 18, 0, 3, 0, 0}, 36 37 /* FCC TYPE 6 */ 38 {9, 1, 3003, 3003, 1, 7, 5, 0, 1, 18, 0, 0, 1, 1}, 39 40 /* FCC TYPE 2 */ 41 {23, 5, 4347, 6666, 0, 18, 11, 0, 7, 22, 0, 3, 0, 2}, 42 43 /* FCC TYPE 3 */ 44 {18, 10, 2000, 5000, 0, 23, 8, 6, 13, 22, 0, 3, 0, 5}, 45 46 /* FCC TYPE 4 */ 47 {16, 15, 2000, 5000, 0, 25, 7, 11, 23, 22, 0, 3, 0, 11}, 48 49 /* FCC NEW TYPE 1 */ 50 /* 518us to 938us pulses (min 56 pulses) */ 51 {57, 1, 1066, 1930, 0, 6, 20, 0, 1, 22, 0, 3, 0, 21}, 52 53 /* 938us to 2000 pulses (min 26 pulses) */ 54 {27, 1, 500, 1066, 0, 6, 13, 0, 1, 22, 0, 3, 0, 22}, 55 56 /* 2000 to 3067us pulses (min 17 pulses) */ 57 {18, 1, 325, 500, 0, 6, 9, 0, 1, 22, 0, 3, 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, 6, 6, 0, 1, 18, 0, 3, 0, 17}, 68 69 /* 4000 +/- 6 us */ 70 {18, 4, 250, 250, 0, 10, 5, 1, 6, 18, 0, 3, 0, 18}, 71 72 /* 3846 +/- 7 us */ 73 {18, 5, 260, 260, 0, 10, 6, 1, 6, 18, 0, 3, 1, 19}, 74 75 /* following filters are common to both FCC and JAPAN */ 76 77 /* FCC TYPE 1 */ 78 {18, 1, 700, 700, 0, 6, 5, 0, 1, 18, 0, 3, 1, 0}, 79 {18, 1, 350, 350, 0, 6, 5, 0, 1, 18, 0, 3, 0, 0}, 80 81 /* FCC TYPE 6 */ 82 {9, 1, 3003, 3003, 1, 7, 5, 0, 1, 18, 0, 0, 1, 1}, 83 84 /* FCC TYPE 2 */ 85 {23, 5, 4347, 6666, 0, 18, 11, 0, 7, 22, 0, 3, 0, 2}, 86 87 /* FCC TYPE 3 */ 88 {18, 10, 2000, 5000, 0, 23, 8, 6, 13, 22, 0, 3, 0, 5}, 89 90 /* FCC TYPE 4 */ 91 {16, 15, 2000, 5000, 0, 25, 7, 11, 23, 22, 0, 3, 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 {4, 28, 105, 12, 22, 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 {4, 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 {4, 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 /* TYPE staggered pulse */ 161 /* Type 5*/ 162 /* 0.8-2us, 2-3 bursts,300-400 PRF, 10 pulses each */ 163 {30, 2, 300, 400, 2, 30, 3, 0, 5, 15, 0, 0, 1, 31}, 164 /* Type 6 */ 165 /* 0.8-2us, 2-3 bursts, 400-1200 PRF, 15 pulses each */ 166 {30, 2, 400, 1200, 2, 30, 7, 0, 5, 15, 0, 0, 0, 32}, 167 168 /* constant PRF based */ 169 /* Type 1 */ 170 /* 0.8-5us, 200 300 PRF, 10 pulses */ 171 {10, 5, 200, 400, 0, 24, 5, 0, 8, 15, 0, 0, 2, 33}, 172 {10, 5, 400, 600, 0, 24, 5, 0, 8, 15, 0, 0, 2, 37}, 173 {10, 5, 600, 800, 0, 24, 5, 0, 8, 15, 0, 0, 2, 38}, 174 {10, 5, 800, 1000, 0, 24, 5, 0, 8, 15, 0, 0, 2, 39}, 175 176 /* Type 2 */ 177 /* 0.8-15us, 200-1600 PRF, 15 pulses */ 178 {15, 15, 200, 1600, 0, 24, 8, 0, 18, 24, 0, 0, 0, 34}, 179 180 /* Type 3 */ 181 /* 0.8-15us, 2300-4000 PRF, 25 pulses*/ 182 {25, 15, 2300, 4000, 0, 24, 10, 0, 18, 24, 0, 0, 0, 35}, 183 184 /* Type 4 */ 185 /* 20-30us, 2000-4000 PRF, 20 pulses*/ 186 {20, 30, 2000, 4000, 0, 24, 6, 19, 33, 24, 0, 0, 0, 36}, 187 }; 188 189 /** 190 * dfs_pulse dfs_china_radars - CHINA radar table. 191 */ 192 struct dfs_pulse dfs_china_radars[] = { 193 194 /* TYPE staggered pulse */ 195 /* Type 5*/ 196 /* 0.8-2us, 2-3 bursts,300-400 PRF, 12 pulses each */ 197 {36, 2, 300, 400, 2, 30, 3, 0, 5, 15, 0, 0, 1, 51}, 198 /* Type 6 */ 199 /* 0.8-2us, 2-3 bursts, 400-1200 PRF, 16 pulses each */ 200 {48, 2, 400, 1200, 2, 30, 7, 0, 5, 15, 0, 0, 0, 52}, 201 202 /* constant PRF based */ 203 /* Type 1 */ 204 /* 0.5-5us, 200 1000 PRF, 12 pulses */ 205 {12, 5, 200, 400, 0, 24, 5, 0, 8, 15, 0, 0, 2, 53}, 206 {12, 5, 400, 600, 0, 24, 5, 0, 8, 15, 0, 0, 2, 57}, 207 {12, 5, 600, 800, 0, 24, 5, 0, 8, 15, 0, 0, 2, 58}, 208 {12, 5, 800, 1000, 0, 24, 5, 0, 8, 15, 0, 0, 2, 59}, 209 210 /* Type 2 */ 211 /* 0.5-15us, 200-1600 PRF, 16 pulses */ 212 {16, 15, 200, 1600, 0, 24, 8, 0, 18, 24, 0, 0, 0, 54}, 213 214 /* Type 3 */ 215 /* 0.5-30us, 2300-4000 PRF, 24 pulses*/ 216 {24, 15, 2300, 4000, 0, 24, 10, 0, 33, 24, 0, 0, 0, 55}, 217 218 /* Type 4 */ 219 /* 20-30us, 2000-4000 PRF, 20 pulses*/ 220 {20, 30, 2000, 4000, 0, 24, 6, 19, 33, 24, 0, 0, 0, 56}, 221 222 /* 1us, 1000 PRF, 20 pulses */ 223 /* 1000 us PRI */ 224 {20, 1, 1000, 1000, 0, 6, 6, 0, 1, 18, 0, 3, 0, 50}, 225 }; 226 227 /** 228 * dfs_pulse dfs_korea_radars - KOREA radar table. 229 */ 230 struct dfs_pulse dfs_korea_radars[] = { 231 /* Korea Type 1 */ 232 {18, 1, 700, 700, 0, 6, 5, 0, 1, 18, 0, 3, 1, 40}, 233 234 /* Korea Type 2 */ 235 {10, 1, 1800, 1800, 0, 6, 4, 0, 1, 18, 0, 3, 1, 41}, 236 237 /* Korea Type 3 */ 238 {70, 1, 330, 330, 0, 6, 20, 0, 2, 18, 0, 3, 1, 42}, 239 240 /* Korea Type 4 */ 241 {3, 1, 3003, 3003, 1, 7, 2, 0, 1, 18, 0, 0, 1, 43}, 242 }; 243 244 #define TARGET_TYPE_AR900B 9 245 #define TARGET_TYPE_QCA9984 10 246 #define TARGET_TYPE_IPQ4019 11 247 #define TARGET_TYPE_QCA9888 12 248 #define RSSI_THERSH_AR900B 15 249 250 /** 251 * dfs_assign_fcc_pulse_table() - Assign FCC pulse table 252 * @rinfo: Pointer to wlan_dfs_radar_tab_info structure. 253 * @target_type: Target type. 254 */ 255 static inline void dfs_assign_fcc_pulse_table( 256 struct wlan_dfs_radar_tab_info *rinfo, 257 uint32_t target_type) 258 { 259 rinfo->dfs_radars = dfs_fcc_radars; 260 rinfo->numradars = QDF_ARRAY_SIZE(dfs_fcc_radars); 261 262 if (target_type == TARGET_TYPE_AR900B || 263 target_type == TARGET_TYPE_IPQ4019) { 264 rinfo->b5pulses = dfs_fcc_bin5pulses_ar900b; 265 rinfo->numb5radars = QDF_ARRAY_SIZE(dfs_fcc_bin5pulses_ar900b); 266 } else if (target_type == TARGET_TYPE_QCA9984 || 267 target_type == TARGET_TYPE_QCA9888) { 268 rinfo->b5pulses = dfs_fcc_bin5pulses_qca9984; 269 rinfo->numb5radars = 270 QDF_ARRAY_SIZE(dfs_fcc_bin5pulses_qca9984); 271 } else { 272 rinfo->b5pulses = dfs_fcc_bin5pulses; 273 rinfo->numb5radars = QDF_ARRAY_SIZE(dfs_fcc_bin5pulses); 274 } 275 } 276 void ol_if_dfs_configure(struct wlan_dfs *dfs) 277 { 278 struct wlan_dfs_radar_tab_info rinfo; 279 int i; 280 uint32_t target_type; 281 int dfsdomain = DFS_FCC_DOMAIN; 282 283 DFS_PRINTK(KERN_DEBUG"%s: called\n", __func__); 284 285 /* Fetch current radar patterns from the lmac */ 286 qdf_mem_zero(&rinfo, sizeof(rinfo)); 287 288 /* 289 * Look up the current DFS regulatory domain and decide 290 * which radar pulses to use. 291 */ 292 dfsdomain = lmac_get_dfsdomain(dfs->dfs_pdev_obj); 293 target_type = lmac_get_target_type(dfs->dfs_pdev_obj); 294 295 switch (dfsdomain) { 296 case DFS_FCC_DOMAIN: 297 DFS_PRINTK("%s: FCC domain\n", __func__); 298 rinfo.dfsdomain = DFS_FCC_DOMAIN; 299 /* 300 * China uses a radar pattern that is similar to ETSI but it 301 * follows FCC in all other respect like transmit power, CCA 302 * threshold etc. 303 */ 304 if (lmac_is_countryCode_CHINA(dfs->dfs_pdev_obj)) { 305 DFS_PRINTK( 306 "%s: FCC domain -- Country China(156) override FCC radar pattern\n", 307 __func__); 308 rinfo.dfs_radars = dfs_china_radars; 309 rinfo.numradars = QDF_ARRAY_SIZE(dfs_china_radars); 310 rinfo.b5pulses = NULL; 311 rinfo.numb5radars = 0; 312 } else { 313 dfs_assign_fcc_pulse_table(&rinfo, target_type); 314 } 315 316 break; 317 case DFS_ETSI_DOMAIN: 318 DFS_PRINTK("%s: ETSI domain\n", __func__); 319 rinfo.dfsdomain = DFS_ETSI_DOMAIN; 320 rinfo.dfs_radars = dfs_etsi_radars; 321 rinfo.numradars = QDF_ARRAY_SIZE(dfs_etsi_radars); 322 323 /* 324 * So far we have treated Korea as part of ETSI and did not 325 * support any radar patters specific to Korea other than 326 * standard ETSI radar patterns. Ideally we would want to 327 * treat Korea as a different domain. This is something that 328 * we will address in the future. However, for now override 329 * ETSI tables for Korea. 330 */ 331 332 if (lmac_is_countryCode_KOREA_ROC3(dfs->dfs_pdev_obj)) { 333 DFS_PRINTK( 334 "%s: ETSI domain -- Korea(412)\n", 335 __func__); 336 rinfo.dfs_radars = dfs_korea_radars; 337 rinfo.numradars = QDF_ARRAY_SIZE(dfs_korea_radars); 338 } 339 340 rinfo.b5pulses = NULL; 341 rinfo.numb5radars = 0; 342 break; 343 case DFS_MKK4_DOMAIN: 344 DFS_PRINTK("%s: MKK4 domain\n", __func__); 345 rinfo.dfsdomain = DFS_MKK4_DOMAIN; 346 rinfo.dfs_radars = dfs_mkk4_radars; 347 rinfo.numradars = QDF_ARRAY_SIZE(dfs_mkk4_radars); 348 349 if (target_type == TARGET_TYPE_AR900B || 350 target_type == TARGET_TYPE_IPQ4019) { 351 rinfo.b5pulses = dfs_jpn_bin5pulses_ar900b; 352 rinfo.numb5radars = QDF_ARRAY_SIZE( 353 dfs_jpn_bin5pulses_ar900b); 354 } else if (target_type == TARGET_TYPE_QCA9984 || 355 target_type == TARGET_TYPE_QCA9888) { 356 rinfo.b5pulses = dfs_jpn_bin5pulses_qca9984; 357 rinfo.numb5radars = QDF_ARRAY_SIZE 358 (dfs_jpn_bin5pulses_qca9984); 359 } else { 360 rinfo.b5pulses = dfs_jpn_bin5pulses; 361 rinfo.numb5radars = QDF_ARRAY_SIZE( 362 dfs_jpn_bin5pulses); 363 } 364 break; 365 default: 366 DFS_PRINTK("%s: UNINIT domain\n", __func__); 367 rinfo.dfsdomain = DFS_UNINIT_DOMAIN; 368 rinfo.dfs_radars = NULL; 369 rinfo.numradars = 0; 370 rinfo.b5pulses = NULL; 371 rinfo.numb5radars = 0; 372 break; 373 } 374 375 if (target_type == TARGET_TYPE_AR900B || 376 target_type == TARGET_TYPE_IPQ4019 || 377 target_type == TARGET_TYPE_QCA9984 || 378 target_type == TARGET_TYPE_QCA9888) { 379 /* Beeliner WAR: lower RSSI threshold to improve detection of 380 * certian radar types 381 */ 382 /* Cascade WAR: 383 * Cascade can report lower RSSI near the channel boundary then 384 * expected. It can also report significantly low RSSI at center 385 * (as low as 16) at center. So we are lowering threshold for 386 * all types of radar for * Cascade. 387 * This may increase the possibility of false radar detection. 388 * IR -- 083703, 083398, 083387 389 */ 390 391 for (i = 0; i < rinfo.numradars; i++) 392 rinfo.dfs_radars[i].rp_rssithresh = RSSI_THERSH_AR900B; 393 } 394 395 dfs_init_radar_filters(dfs, &rinfo); 396 } 397 398 void dfs_get_radars(struct wlan_dfs *dfs) 399 { 400 #define AR5212_DEVID_IBM 0x1014 /* IBM minipci ID */ 401 #define AR5212_AR2413 0x001a /* AR2413 aka Griffin-lite */ 402 #define AR5212_AR2413 0x001a /* AR2413 aka Griffin-lite */ 403 #define AR5212_AR5413 0x001b /* Eagle */ 404 #define AR5212_AR5424 0x001c /* Condor (PCI express) */ 405 #define AR5212_DEVID_FF19 0xff19 /* PCI express */ 406 #define AR5212_AR2417 0x001d /* Nala, PCI */ 407 #define AR5212_DEVID 0x0013 /* Final ar5212 devid */ 408 #define AR5212_FPGA 0xf013 /* Emulation board */ 409 #define AR5212_DEFAULT 0x1113 /* No eeprom HW default */ 410 411 #define AR5416_DEVID_PCI 0x0023 /* AR5416 PCI (CB/MB) (Owl)*/ 412 #define AR5416_DEVID_PCIE 0x0024 /* AR5416 PCI-E (XB) (Owl) */ 413 #define AR5416_DEVID_AR9160_PCI 0x0027 /* AR9160 PCI (Sowl) */ 414 #define AR5416_AR9100_DEVID 0x000b /* AR9100 (Howl) */ 415 #define AR5416_DEVID_AR9280_PCI 0x0029 /* PCI (Merlin) */ 416 #define AR5416_DEVID_AR9280_PCIE 0x002a /* PCIE (Merlin) */ 417 #define AR5416_DEVID_AR9285_PCIE 0x002b /* PCIE (Kite) */ 418 #define AR5416_DEVID_AR9285G_PCIE 0x002c /* PCIE (Kite G only) */ 419 #define AR5416_DEVID_AR9287_PCI 0x002d /* PCI (Kiwi) */ 420 #define AR5416_DEVID_AR9287_PCIE 0x002e /* PCIE (Kiwi) */ 421 422 #define AR9300_DEVID_AR9380_PCIE 0x0030 /* PCIE (Osprey) */ 423 #define AR9300_DEVID_AR9340 0x0031 /* Wasp */ 424 #define AR9300_DEVID_AR9485_PCIE 0x0032 /* Poseidon */ 425 #define AR9300_DEVID_AR9580_PCIE 0x0033 /* Peacock */ 426 #define AR9300_DEVID_AR1111_PCIE 0x0037 /* AR1111 */ 427 #define AR9300_DEVID_AR946X_PCIE 0x0034 /* Jupiter: 2x2 DB + BT - AR9462 */ 428 #define AR9300_DEVID_AR955X 0x0039 /* Scorpion */ 429 #define AR9300_DEVID_AR953X 0x003d /* Honey Bee */ 430 #define AR9300_DEVID_AR956X 0x003f /* Dragonfly */ 431 #define AR9300_DEVID_AR956X_PCIE 0x0036 /* Aphrodite: 1x1 DB + BT - AR9564 */ 432 #define AR9300_DEVID_EMU_PCIE 0xabcd 433 434 if (dfs == NULL) { 435 DFS_PRINTK("%s: dfs is NULL\n", __func__); 436 return; 437 } 438 439 if (lmac_is_mode_offload(dfs->dfs_pdev_obj)) { 440 /* For offload */ 441 ol_if_dfs_configure(dfs); 442 } else { 443 uint16_t devid = lmac_get_ah_devid(dfs->dfs_pdev_obj); 444 /* For DA */ 445 446 switch (devid) { 447 case AR5212_DEVID_IBM: 448 case AR5212_AR2413: 449 case AR5212_AR5413: 450 case AR5212_AR5424: 451 case AR5212_DEVID_FF19: 452 devid = AR5212_DEVID; 453 case AR5212_AR2417: 454 case AR5212_DEVID: 455 case AR5212_FPGA: 456 case AR5212_DEFAULT: 457 dfs_get_radars_for_ar5212(dfs); 458 break; 459 case AR5416_DEVID_PCI: 460 case AR5416_DEVID_PCIE: 461 case AR5416_DEVID_AR9160_PCI: 462 case AR5416_AR9100_DEVID: 463 case AR5416_DEVID_AR9280_PCI: 464 case AR5416_DEVID_AR9280_PCIE: 465 case AR5416_DEVID_AR9285_PCIE: 466 case AR5416_DEVID_AR9285G_PCIE: 467 case AR5416_DEVID_AR9287_PCI: 468 case AR5416_DEVID_AR9287_PCIE: 469 dfs_get_radars_for_ar5416(dfs); 470 break; 471 case AR9300_DEVID_AR9380_PCIE: 472 case AR9300_DEVID_AR9340: 473 case AR9300_DEVID_AR9485_PCIE: 474 case AR9300_DEVID_AR9580_PCIE: 475 case AR9300_DEVID_AR1111_PCIE: 476 case AR9300_DEVID_AR946X_PCIE: 477 case AR9300_DEVID_AR955X: 478 case AR9300_DEVID_AR953X: 479 case AR9300_DEVID_AR956X: 480 case AR9300_DEVID_AR956X_PCIE: 481 case AR9300_DEVID_EMU_PCIE: 482 dfs_get_radars_for_ar9300(dfs); 483 break; 484 } 485 } 486 } 487 488 void dfs_radar_found_action(struct wlan_dfs *dfs) 489 { 490 if (dfs->dfs_rinfo.rn_use_nol == 1) { 491 /* 492 * If precac is running and the radar found in secondary 493 * VHT80 mark the channel as radar and add to NOL list. 494 * Otherwise random channel selection can choose this 495 * channel. 496 */ 497 DFS_DPRINTK(dfs, WLAN_DEBUG_DFS, 498 "%s : found_on_second = %d is_pre = %d\n", 499 __func__, 500 dfs->is_radar_found_on_secondary_seg, 501 dfs_is_precac_timer_running(dfs)); 502 503 if (dfs->is_radar_found_on_secondary_seg && 504 dfs_is_precac_timer_running(dfs)) { 505 /* Get a VHT80 channel and mark it */ 506 struct dfs_ieee80211_channel *ichan; 507 508 dfs_find_precac_secondary_vht80_chan(dfs, &ichan); 509 dfs_mlme_channel_mark_radar(dfs->dfs_pdev_obj, 510 ichan->dfs_ch_freq, 511 ichan->dfs_ch_vhtop_ch_freq_seg2, 512 ichan->dfs_ch_flags); 513 } else { 514 dfs_mlme_channel_mark_radar(dfs->dfs_pdev_obj, 515 dfs->dfs_curchan->dfs_ch_freq, 516 dfs->dfs_curchan-> 517 dfs_ch_vhtop_ch_freq_seg2, 518 dfs->dfs_curchan->dfs_ch_flags); 519 } 520 } 521 522 /* 523 * Even if radar found on primary, we need to move the channel 524 * from precac-required-list and precac-done-list to 525 * precac-nol-list. 526 */ 527 if (dfs->dfs_rinfo.rn_use_nol == 1) { 528 dfs_mark_precac_dfs(dfs, 529 dfs->is_radar_found_on_secondary_seg); 530 } 531 532 if (dfs->is_radar_found_on_secondary_seg) { 533 dfs_second_segment_radar_disable(dfs); 534 dfs->is_radar_found_on_secondary_seg = 0; 535 if (dfs->is_radar_during_precac) { 536 dfs->is_radar_during_precac = 0; 537 goto radar_process_end; 538 } 539 } 540 541 /* 542 * This calls into the umac DFS code, which sets the umac 543 * related radar flags and begins the channel change 544 * machinery. 545 * XXX TODO: the umac NOL code isn't used, but 546 * IEEE80211_CHAN_DFS_RADAR still gets set. Since the umac 547 * NOL code isn't used, that flag is never cleared. This 548 * needs to be fixed. See EV 105776. 549 */ 550 if (dfs->dfs_rinfo.rn_use_nol == 1) { 551 dfs_mlme_start_rcsa(dfs->dfs_pdev_obj); 552 dfs_mlme_mark_dfs(dfs->dfs_pdev_obj, 553 dfs->dfs_curchan->dfs_ch_ieee, 554 dfs->dfs_curchan->dfs_ch_freq, 555 dfs->dfs_curchan->dfs_ch_vhtop_ch_freq_seg2, 556 dfs->dfs_curchan->dfs_ch_flags); 557 /* 558 * EV 129487 : We have detected radar in the channel, 559 * stop processing PHY error data as this can cause 560 * false detect in the new channel while channel 561 * change is in progress. 562 */ 563 dfs_radar_disable(dfs); 564 dfs_second_segment_radar_disable(dfs); 565 } else if (dfs->dfs_rinfo.rn_use_nol == 0) { 566 /* 567 * For the test mode, don't do a CSA here; but setup 568 * the test timer so we get a CSA _back_ to the 569 * original channel. 570 */ 571 qdf_timer_stop(&dfs->wlan_dfstesttimer); 572 dfs->wlan_dfstest = 1; 573 dfs->wlan_dfstest_ieeechan = dfs->dfs_curchan->dfs_ch_ieee; 574 dfs->wlan_dfstesttime = 1; /* 1ms */ 575 qdf_timer_mod(&dfs->wlan_dfstesttimer, 576 dfs->wlan_dfstesttime); 577 } 578 579 radar_process_end: 580 return; 581 } 582