diff --git a/core/sap/dfs/inc/radar_filters.h b/core/sap/dfs/inc/radar_filters.h index 5837d06a27d4..0d1b6563ea50 100644 --- a/core/sap/dfs/inc/radar_filters.h +++ b/core/sap/dfs/inc/radar_filters.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2015 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -140,3 +140,56 @@ struct dfs_pulse dfs_etsi_radars[] = { /* 20-30us, 2000-4000 PRF, 20 pulses */ {20, 30, 2000, 4000, 0, 24, 6, 19, 33, 24, 0, 0, 0, 36}, /* Type 4 */ }; + +struct dfs_pulse dfs_korea_radars[] = { + /* Korea Type 1 */ + {18, 1, 700, 700, 0, 6, 5, 0, 1, 18, 0, 3, 1, 40}, + + /* Korea Type 2 */ + {10, 1, 1800, 1800, 0, 6, 4, 0, 1, 18, 0, 3, 1, 41}, + + /* Korea Type 3 */ + {70, 1, 330, 330, 0, 6, 20, 0, 2, 18, 0, 3, 1, 42}, + + /* Korea Type 4 */ + {3, 1, 3003, 3003, 1, 7, 2, 0, 1, 18, 0, 0, 1, 43}, +}; + +struct dfs_pulse dfs_china_radars[] = { + /* FCC NEW TYPE 0 */ + {18, 1, 700, 700, 0, 6, 5, 0, 1, 18, 0, 3, 1, 0}, + {18, 1, 350, 350, 0, 6, 5, 0, 1, 18, 0, 3, 0, 0}, + + /* FCC TYPE 6 */ + { 9, 1, 3003, 3003, 1, 7, 5, 0, 1, 18, 0, 0, 1, 1}, + + /* FCC TYPE 2 */ + {23, 5, 4347, 6666, 0, 18, 8, 0, 7, 22, 0, 3, 0, 2}, + + /* FCC TYPE 3 */ + {18, 10, 2000, 5000, 0, 23, 6, 6, 13, 22, 0, 3, 0, 5}, + + /* FCC TYPE 4 */ + {16, 15, 2000, 5000, 0, 25, 5, 11, 23, 22, 0, 3, 0, 11}, + + /* + * FCC NEW TYPE 1 + * 518us to 938us pulses (min 56 pulses) + */ + {57, 1, 1066, 1930, 0, 6, 20, 0, 1, 22, 0, 3, 0, 21}, + + /* + * FCC NEW TYPE 1 + * 938us to 2000 pulses (min 26 pulses) + */ + {27, 1, 500, 1066, 0, 6, 13, 0, 1, 22, 0, 3, 0, 22}, + + /* + * FCC NEW TYPE 1 + * 2000 to 3067us pulses (min 17 pulses) + */ + {18, 1, 325, 500, 0, 6, 9, 0, 1, 22, 0, 3, 0, 23}, + + /* CN TYPE 1 */ + {20, 1, 1000, 1000, 0, 6, 5, 0, 1, 18, 0, 3, 1, 24}, +}; diff --git a/core/sap/dfs/src/dfs_init.c b/core/sap/dfs/src/dfs_init.c index c67f7fcf1b03..512e8ac9cf17 100644 --- a/core/sap/dfs/src/dfs_init.c +++ b/core/sap/dfs/src/dfs_init.c @@ -384,53 +384,67 @@ int dfs_init_radar_filters(struct ieee80211com *ic, dfs_print_filters(ic); #endif dfs->dfs_rinfo.rn_numbin5radars = numb5radars; - if (dfs->dfs_b5radars != NULL) + if (dfs->dfs_b5radars != NULL) { OS_FREE(dfs->dfs_b5radars); - - dfs->dfs_b5radars = (struct dfs_bin5radars *)os_malloc(NULL, - numb5radars * - sizeof(struct - dfs_bin5radars), - GFP_KERNEL); - if (dfs->dfs_b5radars == NULL) { - DFS_DPRINTK(dfs, ATH_DEBUG_DFS, - "%s: cannot allocate memory for bin5 radars", - __func__); - goto bad4; + dfs->dfs_b5radars = NULL; } - if (ic->dfs_hw_bd_id != DFS_HWBD_QCA6174) { - dfs->dfs_b5radars_ext_seg = - (struct dfs_bin5radars *)os_malloc(NULL, numb5radars * - sizeof(struct dfs_bin5radars), - GFP_KERNEL); - if (dfs->dfs_b5radars_ext_seg == NULL) { - QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, - "%s:Fail allocate memory for ext bin5 radars", - __func__); + if (dfs->dfs_b5radars_ext_seg != NULL) { + OS_FREE(dfs->dfs_b5radars_ext_seg); + dfs->dfs_b5radars_ext_seg = NULL; + } + + if (numb5radars) { + dfs->dfs_b5radars = (struct dfs_bin5radars *)os_malloc(NULL, + numb5radars * + sizeof(struct dfs_bin5radars), + GFP_KERNEL); + if (dfs->dfs_b5radars == NULL) { + DFS_DPRINTK(dfs, ATH_DEBUG_DFS, + "%s: cannot allocate memory for bin5 radars", + __func__); goto bad4; } - } - for (n = 0; n < numb5radars; n++) { - dfs->dfs_b5radars[n].br_pulse = b5pulses[n]; - dfs->dfs_b5radars[n].br_pulse.b5_timewindow *= - DFS_BIN5_TIME_WINDOW_UNITS_MULTIPLIER; - if (dfs->dfs_b5radars[n].br_pulse.b5_rssithresh < - min_rssithresh) - min_rssithresh = - dfs->dfs_b5radars[n].br_pulse.b5_rssithresh; - if (dfs->dfs_b5radars[n].br_pulse.b5_maxdur > max_pulsedur) - max_pulsedur = dfs->dfs_b5radars[n].br_pulse.b5_maxdur; - } + if (ic->dfs_hw_bd_id != DFS_HWBD_QCA6174) { + dfs->dfs_b5radars_ext_seg = + (struct dfs_bin5radars *)os_malloc(NULL, + numb5radars * + sizeof(struct dfs_bin5radars), + GFP_KERNEL); + if (dfs->dfs_b5radars_ext_seg == NULL) { + QDF_TRACE(QDF_MODULE_ID_SAP, + QDF_TRACE_LEVEL_ERROR, + "%s:Fail allocate memory for ext bin5 radars", + __func__); + goto bad4; + } + } - if (ic->dfs_hw_bd_id != DFS_HWBD_QCA6174) { for (n = 0; n < numb5radars; n++) { - dfs->dfs_b5radars_ext_seg[n].br_pulse = b5pulses[n]; + dfs->dfs_b5radars[n].br_pulse = b5pulses[n]; + dfs->dfs_b5radars[n].br_pulse.b5_timewindow *= + DFS_BIN5_TIME_WINDOW_UNITS_MULTIPLIER; + if (dfs->dfs_b5radars[n].br_pulse.b5_rssithresh < + min_rssithresh) + min_rssithresh = + dfs->dfs_b5radars[n].br_pulse.b5_rssithresh; + + if (dfs->dfs_b5radars[n].br_pulse.b5_maxdur > + max_pulsedur) + max_pulsedur = + dfs->dfs_b5radars[n].br_pulse.b5_maxdur; + } + + if (ic->dfs_hw_bd_id != DFS_HWBD_QCA6174) { + for (n = 0; n < numb5radars; n++) { + dfs->dfs_b5radars_ext_seg[n].br_pulse = + b5pulses[n]; dfs->dfs_b5radars_ext_seg[n].br_pulse.b5_timewindow *= - DFS_BIN5_TIME_WINDOW_UNITS_MULTIPLIER; + DFS_BIN5_TIME_WINDOW_UNITS_MULTIPLIER; b5_rssithresh = - dfs->dfs_b5radars_ext_seg[n].br_pulse.b5_rssithresh; + dfs->dfs_b5radars_ext_seg[n].br_pulse.b5_rssithresh; + if (b5_rssithresh < min_rssithresh) min_rssithresh = b5_rssithresh; @@ -439,6 +453,7 @@ int dfs_init_radar_filters(struct ieee80211com *ic, if (b5_maxdur > max_pulsedur) max_pulsedur = b5_maxdur; + } } } diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index 5ed1ff95eb8b..316fae5b809e 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -7041,6 +7041,22 @@ void wma_dfs_configure(struct ieee80211com *ic) rinfo.b5pulses = dfs_jpn_bin5pulses; rinfo.numb5radars = QDF_ARRAY_SIZE(dfs_jpn_bin5pulses); break; + case DFS_CN_REGION: + WMA_LOGI("%s: DFS-CN domain", __func__); + rinfo.dfsdomain = DFS_CN_REGION; + rinfo.dfs_radars = dfs_china_radars; + rinfo.numradars = QDF_ARRAY_SIZE(dfs_china_radars); + rinfo.b5pulses = NULL; + rinfo.numb5radars = 0; + break; + case DFS_KR_REGION: + WMA_LOGI("%s: DFS-KR domain", __func__); + rinfo.dfsdomain = DFS_KR_REGION; + rinfo.dfs_radars = dfs_korea_radars; + rinfo.numradars = QDF_ARRAY_SIZE(dfs_korea_radars); + rinfo.b5pulses = NULL; + rinfo.numb5radars = 0; + break; default: WMA_LOGI("%s: DFS-UNINT domain", __func__); rinfo.dfsdomain = DFS_UNINIT_REGION;