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 DFS_CURCHAN_IS_58GHz(ch_freq)) { 343 rinfo.dfs_radars = dfs_etsi_radars; 344 rinfo.numradars = QDF_ARRAY_SIZE(dfs_etsi_radars); 345 } else { 346 uint8_t offset = ETSI_LEGACY_PULSE_ARR_OFFSET; 347 348 rinfo.dfs_radars = &dfs_etsi_radars[offset]; 349 rinfo.numradars = 350 QDF_ARRAY_SIZE(dfs_etsi_radars) - offset; 351 } 352 rinfo.b5pulses = NULL; 353 rinfo.numb5radars = 0; 354 break; 355 case DFS_KR_DOMAIN: 356 dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, 357 "ETSI domain -- Korea(412)"); 358 rinfo.dfsdomain = DFS_ETSI_DOMAIN; 359 360 /* 361 * So far we have treated Korea as part of ETSI and did not 362 * support any radar patters specific to Korea other than 363 * standard ETSI radar patterns. Ideally we would want to 364 * treat Korea as a different domain. This is something that 365 * we will address in the future. However, for now override 366 * ETSI tables for Korea. 367 */ 368 rinfo.dfs_radars = dfs_korea_radars; 369 rinfo.numradars = QDF_ARRAY_SIZE(dfs_korea_radars); 370 rinfo.b5pulses = NULL; 371 rinfo.numb5radars = 0; 372 break; 373 case DFS_MKK4_DOMAIN: 374 dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "MKK4 domain"); 375 rinfo.dfsdomain = DFS_MKK4_DOMAIN; 376 rinfo.dfs_radars = dfs_mkk4_radars; 377 rinfo.numradars = QDF_ARRAY_SIZE(dfs_mkk4_radars); 378 379 if (tx_ops->tgt_is_tgt_type_ar900b(target_type) || 380 tx_ops->tgt_is_tgt_type_ipq4019(target_type)) { 381 rinfo.b5pulses = dfs_jpn_bin5pulses_ar900b; 382 rinfo.numb5radars = QDF_ARRAY_SIZE( 383 dfs_jpn_bin5pulses_ar900b); 384 } else if (tx_ops->tgt_is_tgt_type_qca9984(target_type) || 385 tx_ops->tgt_is_tgt_type_qca9888(target_type)) { 386 rinfo.b5pulses = dfs_jpn_bin5pulses_qca9984; 387 rinfo.numb5radars = QDF_ARRAY_SIZE 388 (dfs_jpn_bin5pulses_qca9984); 389 } else { 390 rinfo.b5pulses = dfs_jpn_bin5pulses; 391 rinfo.numb5radars = QDF_ARRAY_SIZE( 392 dfs_jpn_bin5pulses); 393 } 394 break; 395 default: 396 dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "UNINIT domain"); 397 rinfo.dfsdomain = DFS_UNINIT_DOMAIN; 398 rinfo.dfs_radars = NULL; 399 rinfo.numradars = 0; 400 rinfo.b5pulses = NULL; 401 rinfo.numb5radars = 0; 402 break; 403 } 404 405 if (tx_ops->tgt_is_tgt_type_ar900b(target_type) || 406 tx_ops->tgt_is_tgt_type_ipq4019(target_type) || 407 tx_ops->tgt_is_tgt_type_qca9984(target_type) || 408 tx_ops->tgt_is_tgt_type_qca9888(target_type)) { 409 /* Beeliner WAR: lower RSSI threshold to improve detection of 410 * certian radar types 411 */ 412 /* Cascade WAR: 413 * Cascade can report lower RSSI near the channel boundary then 414 * expected. It can also report significantly low RSSI at center 415 * (as low as 16) at center. So we are lowering threshold for 416 * all types of radar for * Cascade. 417 * This may increase the possibility of false radar detection. 418 * IR -- 083703, 083398, 083387 419 */ 420 421 for (i = 0; i < rinfo.numradars; i++) 422 rinfo.dfs_radars[i].rp_rssithresh = RSSI_THERSH_AR900B; 423 } 424 425 dfs_init_radar_filters(dfs, &rinfo); 426 } 427