aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/dfs_pattern_detector.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/ath/dfs_pattern_detector.c')
-rw-r--r--drivers/net/wireless/ath/dfs_pattern_detector.c72
1 files changed, 44 insertions, 28 deletions
diff --git a/drivers/net/wireless/ath/dfs_pattern_detector.c b/drivers/net/wireless/ath/dfs_pattern_detector.c
index c657ca26a71a..656ce42b339a 100644
--- a/drivers/net/wireless/ath/dfs_pattern_detector.c
+++ b/drivers/net/wireless/ath/dfs_pattern_detector.c
@@ -41,30 +41,31 @@ struct radar_types {
41 41
42/* percentage on ppb threshold to trigger detection */ 42/* percentage on ppb threshold to trigger detection */
43#define MIN_PPB_THRESH 50 43#define MIN_PPB_THRESH 50
44#define PPB_THRESH(PPB) ((PPB * MIN_PPB_THRESH + 50) / 100) 44#define PPB_THRESH_RATE(PPB, RATE) ((PPB * RATE + 100 - RATE) / 100)
45#define PPB_THRESH(PPB) PPB_THRESH_RATE(PPB, MIN_PPB_THRESH)
45#define PRF2PRI(PRF) ((1000000 + PRF / 2) / PRF) 46#define PRF2PRI(PRF) ((1000000 + PRF / 2) / PRF)
46/* percentage of pulse width tolerance */ 47/* percentage of pulse width tolerance */
47#define WIDTH_TOLERANCE 5 48#define WIDTH_TOLERANCE 5
48#define WIDTH_LOWER(X) ((X*(100-WIDTH_TOLERANCE)+50)/100) 49#define WIDTH_LOWER(X) ((X*(100-WIDTH_TOLERANCE)+50)/100)
49#define WIDTH_UPPER(X) ((X*(100+WIDTH_TOLERANCE)+50)/100) 50#define WIDTH_UPPER(X) ((X*(100+WIDTH_TOLERANCE)+50)/100)
50 51
51#define ETSI_PATTERN(ID, WMIN, WMAX, PMIN, PMAX, PRF, PPB) \ 52#define ETSI_PATTERN(ID, WMIN, WMAX, PMIN, PMAX, PRF, PPB, CHIRP) \
52{ \ 53{ \
53 ID, WIDTH_LOWER(WMIN), WIDTH_UPPER(WMAX), \ 54 ID, WIDTH_LOWER(WMIN), WIDTH_UPPER(WMAX), \
54 (PRF2PRI(PMAX) - PRI_TOLERANCE), \ 55 (PRF2PRI(PMAX) - PRI_TOLERANCE), \
55 (PRF2PRI(PMIN) * PRF + PRI_TOLERANCE), PRF, PPB * PRF, \ 56 (PRF2PRI(PMIN) * PRF + PRI_TOLERANCE), PRF, PPB * PRF, \
56 PPB_THRESH(PPB), PRI_TOLERANCE, \ 57 PPB_THRESH(PPB), PRI_TOLERANCE, CHIRP \
57} 58}
58 59
59/* radar types as defined by ETSI EN-301-893 v1.5.1 */ 60/* radar types as defined by ETSI EN-301-893 v1.5.1 */
60static const struct radar_detector_specs etsi_radar_ref_types_v15[] = { 61static const struct radar_detector_specs etsi_radar_ref_types_v15[] = {
61 ETSI_PATTERN(0, 0, 1, 700, 700, 1, 18), 62 ETSI_PATTERN(0, 0, 1, 700, 700, 1, 18, false),
62 ETSI_PATTERN(1, 0, 5, 200, 1000, 1, 10), 63 ETSI_PATTERN(1, 0, 5, 200, 1000, 1, 10, false),
63 ETSI_PATTERN(2, 0, 15, 200, 1600, 1, 15), 64 ETSI_PATTERN(2, 0, 15, 200, 1600, 1, 15, false),
64 ETSI_PATTERN(3, 0, 15, 2300, 4000, 1, 25), 65 ETSI_PATTERN(3, 0, 15, 2300, 4000, 1, 25, false),
65 ETSI_PATTERN(4, 20, 30, 2000, 4000, 1, 20), 66 ETSI_PATTERN(4, 20, 30, 2000, 4000, 1, 20, false),
66 ETSI_PATTERN(5, 0, 2, 300, 400, 3, 10), 67 ETSI_PATTERN(5, 0, 2, 300, 400, 3, 10, false),
67 ETSI_PATTERN(6, 0, 2, 400, 1200, 3, 15), 68 ETSI_PATTERN(6, 0, 2, 400, 1200, 3, 15, false),
68}; 69};
69 70
70static const struct radar_types etsi_radar_types_v15 = { 71static const struct radar_types etsi_radar_types_v15 = {
@@ -73,21 +74,30 @@ static const struct radar_types etsi_radar_types_v15 = {
73 .radar_types = etsi_radar_ref_types_v15, 74 .radar_types = etsi_radar_ref_types_v15,
74}; 75};
75 76
76#define FCC_PATTERN(ID, WMIN, WMAX, PMIN, PMAX, PRF, PPB) \ 77#define FCC_PATTERN(ID, WMIN, WMAX, PMIN, PMAX, PRF, PPB, CHIRP) \
77{ \ 78{ \
78 ID, WIDTH_LOWER(WMIN), WIDTH_UPPER(WMAX), \ 79 ID, WIDTH_LOWER(WMIN), WIDTH_UPPER(WMAX), \
79 PMIN - PRI_TOLERANCE, \ 80 PMIN - PRI_TOLERANCE, \
80 PMAX * PRF + PRI_TOLERANCE, PRF, PPB * PRF, \ 81 PMAX * PRF + PRI_TOLERANCE, PRF, PPB * PRF, \
81 PPB_THRESH(PPB), PRI_TOLERANCE, \ 82 PPB_THRESH(PPB), PRI_TOLERANCE, CHIRP \
82} 83}
83 84
85/* radar types released on August 14, 2014
86 * type 1 PRI values randomly selected within the range of 518 and 3066.
87 * divide it to 3 groups is good enough for both of radar detection and
88 * avoiding false detection based on practical test results
89 * collected for more than a year.
90 */
84static const struct radar_detector_specs fcc_radar_ref_types[] = { 91static const struct radar_detector_specs fcc_radar_ref_types[] = {
85 FCC_PATTERN(0, 0, 1, 1428, 1428, 1, 18), 92 FCC_PATTERN(0, 0, 1, 1428, 1428, 1, 18, false),
86 FCC_PATTERN(1, 0, 5, 150, 230, 1, 23), 93 FCC_PATTERN(101, 0, 1, 518, 938, 1, 57, false),
87 FCC_PATTERN(2, 6, 10, 200, 500, 1, 16), 94 FCC_PATTERN(102, 0, 1, 938, 2000, 1, 27, false),
88 FCC_PATTERN(3, 11, 20, 200, 500, 1, 12), 95 FCC_PATTERN(103, 0, 1, 2000, 3066, 1, 18, false),
89 FCC_PATTERN(4, 50, 100, 1000, 2000, 1, 1), 96 FCC_PATTERN(2, 0, 5, 150, 230, 1, 23, false),
90 FCC_PATTERN(5, 0, 1, 333, 333, 1, 9), 97 FCC_PATTERN(3, 6, 10, 200, 500, 1, 16, false),
98 FCC_PATTERN(4, 11, 20, 200, 500, 1, 12, false),
99 FCC_PATTERN(5, 50, 100, 1000, 2000, 1, 1, true),
100 FCC_PATTERN(6, 0, 1, 333, 333, 1, 9, false),
91}; 101};
92 102
93static const struct radar_types fcc_radar_types = { 103static const struct radar_types fcc_radar_types = {
@@ -96,17 +106,23 @@ static const struct radar_types fcc_radar_types = {
96 .radar_types = fcc_radar_ref_types, 106 .radar_types = fcc_radar_ref_types,
97}; 107};
98 108
99#define JP_PATTERN FCC_PATTERN 109#define JP_PATTERN(ID, WMIN, WMAX, PMIN, PMAX, PRF, PPB, RATE, CHIRP) \
110{ \
111 ID, WIDTH_LOWER(WMIN), WIDTH_UPPER(WMAX), \
112 PMIN - PRI_TOLERANCE, \
113 PMAX * PRF + PRI_TOLERANCE, PRF, PPB * PRF, \
114 PPB_THRESH_RATE(PPB, RATE), PRI_TOLERANCE, CHIRP \
115}
100static const struct radar_detector_specs jp_radar_ref_types[] = { 116static const struct radar_detector_specs jp_radar_ref_types[] = {
101 JP_PATTERN(0, 0, 1, 1428, 1428, 1, 18), 117 JP_PATTERN(0, 0, 1, 1428, 1428, 1, 18, 29, false),
102 JP_PATTERN(1, 2, 3, 3846, 3846, 1, 18), 118 JP_PATTERN(1, 2, 3, 3846, 3846, 1, 18, 29, false),
103 JP_PATTERN(2, 0, 1, 1388, 1388, 1, 18), 119 JP_PATTERN(2, 0, 1, 1388, 1388, 1, 18, 50, false),
104 JP_PATTERN(3, 1, 2, 4000, 4000, 1, 18), 120 JP_PATTERN(3, 1, 2, 4000, 4000, 1, 18, 50, false),
105 JP_PATTERN(4, 0, 5, 150, 230, 1, 23), 121 JP_PATTERN(4, 0, 5, 150, 230, 1, 23, 50, false),
106 JP_PATTERN(5, 6, 10, 200, 500, 1, 16), 122 JP_PATTERN(5, 6, 10, 200, 500, 1, 16, 50, false),
107 JP_PATTERN(6, 11, 20, 200, 500, 1, 12), 123 JP_PATTERN(6, 11, 20, 200, 500, 1, 12, 50, false),
108 JP_PATTERN(7, 50, 100, 1000, 2000, 1, 20), 124 JP_PATTERN(7, 50, 100, 1000, 2000, 1, 20, 50, false),
109 JP_PATTERN(5, 0, 1, 333, 333, 1, 9), 125 JP_PATTERN(5, 0, 1, 333, 333, 1, 9, 50, false),
110}; 126};
111 127
112static const struct radar_types jp_radar_types = { 128static const struct radar_types jp_radar_types = {