diff options
Diffstat (limited to 'drivers/net/wireless/ath/dfs_pattern_detector.c')
-rw-r--r-- | drivers/net/wireless/ath/dfs_pattern_detector.c | 72 |
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 */ |
60 | static const struct radar_detector_specs etsi_radar_ref_types_v15[] = { | 61 | static 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 | ||
70 | static const struct radar_types etsi_radar_types_v15 = { | 71 | static 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 | */ | ||
84 | static const struct radar_detector_specs fcc_radar_ref_types[] = { | 91 | static 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 | ||
93 | static const struct radar_types fcc_radar_types = { | 103 | static 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 | } | ||
100 | static const struct radar_detector_specs jp_radar_ref_types[] = { | 116 | static 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 | ||
112 | static const struct radar_types jp_radar_types = { | 128 | static const struct radar_types jp_radar_types = { |