• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2017 Realtek Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of version 2 of the GNU General Public License as
8  * published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13  * more details.
14  *
15  *****************************************************************************/
16 
17 #ifndef __RTW_RM_FSM_H_
18 #define __RTW_RM_FSM_H_
19 
20 #ifdef CONFIG_RTW_80211K
21 
22 #define RM_SUPPORT_IWPRIV_DBG	1
23 #define RM_MORE_DBG_MSG		0
24 
25 #define DBG_BCN_REQ_DETAIL	0
26 #define DBG_BCN_REQ_WILDCARD	0
27 #define DBG_BCN_REQ_SSID	0
28 #define DBG_BCN_REQ_SSID_NAME	"RealKungFu"
29 
30 #define RM_REQ_TIMEOUT		10000	/* 10 seconds */
31 #define RM_MEAS_TIMEOUT		10000	/* 10 seconds */
32 #define RM_REPT_SCAN_INTVL	5000	/*  5 seconds */
33 #define RM_REPT_POLL_INTVL	2000	/*  2 seconds */
34 #define RM_COND_INTVL		2000	/*  2 seconds */
35 #define RM_SCAN_DENY_TIMES	10
36 #define RM_BUSY_TRAFFIC_TIMES	10
37 #define RM_WAIT_BUSY_TIMEOUT	1000	/*  1 seconds */
38 
39 #define MEAS_REQ_MOD_PARALLEL	BIT(0)
40 #define MEAS_REQ_MOD_ENABLE	BIT(1)
41 #define MEAS_REQ_MOD_REQUEST	BIT(2)
42 #define MEAS_REQ_MOD_REPORT	BIT(3)
43 #define MEAS_REQ_MOD_DUR_MAND	BIT(4)
44 
45 #define MEAS_REP_MOD_LATE	BIT(0)
46 #define MEAS_REP_MOD_INCAP	BIT(1)
47 #define MEAS_REP_MOD_REFUSE	BIT(2)
48 
49 #define RM_MASTER		BIT(0)	/* STA who issue meas_req */
50 #define RM_SLAVE		0	/* STA who do measurement */
51 
52 #define CLOCK_UNIT		10	/* ms */
53 #define RTW_MAX_NB_RPT_IE_NUM	16
54 
55 #define RM_GET_AID(rmid)	((rmid&0xffff0000)>>16)
56 #define RM_IS_ID_FOR_ALL(rmid)	(rmid&RM_ALL_MEAS)
57 
58 /* IEEE 802.11-2012 Table 8-59 Measurement Type definitions
59 *  for measurement request
60 *  modify rm_meas_type_req_name() when adding new type
61 */
62 enum meas_type_of_req {
63 	basic_req,	/* spectrum measurement */
64 	cca_req,
65 	rpi_histo_req,
66 	ch_load_req,
67 	noise_histo_req,
68 	bcn_req,
69 	frame_req,
70 	sta_statis_req,
71 	lci_req,
72 	meas_type_req_max,
73 };
74 
75 /* IEEE 802.11-2012 Table 8-81 Measurement Type definitions
76 *  for measurement report
77 *  modify rm_type_rep_name() when adding new type
78 */
79 enum meas_type_of_rep {
80 	basic_rep,	/* spectrum measurement */
81 	cca_rep,
82 	rpi_histo_rep,
83 	ch_load_rep,	/* radio measurement */
84 	noise_histo_rep,
85 	bcn_rep,
86 	frame_rep,
87 	sta_statis_rep,	/* Radio measurement and WNM */
88 	lci_rep,
89 	meas_type_rep_max
90 };
91 
92 /*
93 * Beacon request
94 */
95 /* IEEE 802.11-2012 Table 8-64 Measurement mode for Beacon Request element */
96 enum bcn_req_meas_mode {
97 	bcn_req_passive,
98 	bcn_req_active,
99 	bcn_req_bcn_table
100 };
101 
102 /* IEEE 802.11-2012 Table 8-65 optional subelement IDs for Beacon Request */
103 enum bcn_req_opt_sub_id{
104 	bcn_req_ssid = 0,		/* len 0-32 */
105 	bcn_req_rep_info = 1,		/* len 2 */
106 	bcn_req_rep_detail = 2,		/* len 1 */
107 	bcn_req_req = 10,		/* len 0-237 */
108 	bcn_req_ap_ch_rep = 51		/* len 1-237 */
109 };
110 
111 /* IEEE 802.11-2012 Table 8-66 Reporting condition of Beacon Report */
112 enum bcn_rep_cound_id{
113 	bcn_rep_cond_immediately,	/* default */
114 	bcn_req_cond_rcpi_greater,
115 	bcn_req_cond_rcpi_less,
116 	bcn_req_cond_rsni_greater,
117 	bcn_req_cond_rsni_less,
118 	bcn_req_cond_max
119 };
120 
121 struct opt_rep_info {
122 	u8 cond;
123 	u8 threshold;
124 };
125 
126 #define BCN_REQ_OPT_MAX_NUM		16
127 #define BCN_REQ_REQ_OPT_MAX_NUM		16
128 #define BCN_REQ_OPT_AP_CH_RPT_MAX_NUM	12
129 struct bcn_req_opt {
130 	/* all req cmd id */
131 	u8 opt_id[BCN_REQ_OPT_MAX_NUM];
132 	u8 opt_id_num;
133 	u8 req_id_num;
134 	u8 req_id[BCN_REQ_REQ_OPT_MAX_NUM];
135 	u8 rep_detail;
136 	NDIS_802_11_SSID ssid;
137 
138 	/* bcn report condition */
139 	struct opt_rep_info rep_cond;
140 
141 	u8 ap_ch_rpt_num;
142 	struct _RT_OPERATING_CLASS *ap_ch_rpt[BCN_REQ_OPT_AP_CH_RPT_MAX_NUM];
143 
144 	/* 0:default(Report to be issued after each measurement) */
145 	u8 *req_start;	/*id : 10 request;start  */
146 	u8 req_len;	/*id : 10 request;length */
147 };
148 
149 /*
150 * channel load
151 */
152 /* IEEE 802.11-2012 Table 8-60 optional subelement IDs for channel load request */
153 enum ch_load_opt_sub_id{
154 	ch_load_rsvd,
155 	ch_load_rep_info
156 };
157 
158 /* IEEE 802.11-2012 Table 8-61 Reporting condition for channel load Report */
159 enum ch_load_cound_id{
160 	ch_load_cond_immediately,	/* default */
161 	ch_load_cond_anpi_equal_greater,
162 	ch_load_cond_anpi_equal_less,
163 	ch_load_cond_max
164 };
165 
166 /*
167 * Noise histogram
168 */
169 /* IEEE 802.11-2012 Table 8-62 optional subelement IDs for noise histogram */
170 enum noise_histo_opt_sub_id{
171 	noise_histo_rsvd,
172 	noise_histo_rep_info
173 };
174 
175 /* IEEE 802.11-2012 Table 8-63 Reporting condition for noise historgarm Report */
176 enum noise_histo_cound_id{
177 	noise_histo_cond_immediately,	/* default */
178 	noise_histo_cond_anpi_equal_greater,
179 	noise_histo_cond_anpi_equal_less,
180 	noise_histo_cond_max
181 };
182 
183 struct meas_req_opt {
184 	/* report condition */
185 	struct opt_rep_info rep_cond;
186 };
187 
188 /*
189 * State machine
190 */
191 
192 enum RM_STATE {
193 	RM_ST_IDLE,
194 	RM_ST_DO_MEAS,
195 	RM_ST_WAIT_MEAS,
196 	RM_ST_SEND_REPORT,
197 	RM_ST_RECV_REPORT,
198 	RM_ST_END,
199 	RM_ST_MAX
200 };
201 
202 struct rm_meas_req {
203 	u8 category;
204 	u8 action_code;		/* T8-206  */
205 	u8 diag_token;
206 	u16 rpt;
207 
208 	u8 e_id;
209 	u8 len;
210 	u8 m_token;
211 	u8 m_mode;		/* req:F8-105, rep:F8-141 */
212 	u8 m_type;		/* T8-59 */
213 	u8 op_class;
214 	u8 ch_num;
215 	u16 rand_intvl;		/* units of TU */
216 	u16 meas_dur;		/* units of TU */
217 
218 	u8 bssid[6];		/* for bcn_req */
219 
220 	u8 *pssid;
221 	u8 *opt_s_elem_start;
222 	int opt_s_elem_len;
223 
224 	s8 tx_pwr_used;		/* for link measurement */
225 	s8 tx_pwr_max;		/* for link measurement */
226 
227 	union {
228 		struct bcn_req_opt bcn;
229 		struct meas_req_opt clm;
230 		struct meas_req_opt nhm;
231 	}opt;
232 
233 	struct rtw_ieee80211_channel ch_set[RTW_CHANNEL_SCAN_AMOUNT];
234 	u8 ch_set_ch_amount;
235 	s8 rx_pwr;		/* in dBm */
236 	u8 rx_bw;
237 	u8 rx_rate;
238 	u8 rx_rsni;
239 };
240 
241 struct rm_meas_rep {
242 	u8 category;
243 	u8 action_code;		/* T8-206  */
244 	u8 diag_token;
245 
246 	u8 e_id;		/* T8-54, 38 request; 39 report */
247 	u8 len;
248 	u8 m_token;
249 	u8 m_mode;		/* req:F8-105, rep:F8-141 */
250 	u8 m_type;		/* T8-59 */
251 	u8 op_class;
252 	u8 ch_num;
253 
254 	u8 ch_load;
255 	u8 anpi;
256 	u8 ipi[11];
257 
258 	u16 rpt;
259 	u8 bssid[6];		/* for bcn_req */
260 };
261 
262 #define MAX_BUF_NUM	128
263 struct data_buf {
264 	u8 *pbuf;
265 	u16 len;
266 };
267 
268 struct rm_obj {
269 
270 	/* aid << 16
271 		|diag_token << 8
272 		|B(1) 1/0:All_AID/UNIC
273 		|B(0) 1/0:RM_MASTER/RM_SLAVE */
274 	u32 rmid;
275 
276 	enum RM_STATE state;
277 	struct rm_meas_req q;
278 	struct rm_meas_rep p;
279 	struct sta_info *psta;
280 	struct rm_clock *pclock;
281 
282 	/* meas report */
283 	u64 meas_start_time;
284 	u64 meas_end_time;
285 	int wait_busy;
286 	u8 poll_mode;
287 	u8 free_run_counter_valid; /* valid:_SUCCESS/invalid:_FAIL */
288 
289 	struct data_buf buf[MAX_BUF_NUM];
290 	bool from_ioctl;
291 
292 	_list list;
293 };
294 
295 /*
296 * Measurement
297 */
298 struct opt_subelement {
299 	u8 id;
300 	u8 length;
301 	u8 *data;
302 };
303 
304 /* 802.11-2012 Table 8-206 Radio Measurment Action field */
305 enum rm_action_code {
306 	RM_ACT_RADIO_MEAS_REQ,
307 	RM_ACT_RADIO_MEAS_REP,
308 	RM_ACT_LINK_MEAS_REQ,
309 	RM_ACT_LINK_MEAS_REP,
310 	RM_ACT_NB_REP_REQ,	/* 4 */
311 	RM_ACT_NB_REP_RESP,
312 	RM_ACT_RESV,
313 	RM_ACT_MAX
314 };
315 
316 /* 802.11-2012 Table 8-119 RM Enabled Capabilities definition */
317 enum rm_cap_en {
318 	RM_LINK_MEAS_CAP_EN,
319 	RM_NB_REP_CAP_EN,		/* neighbor report */
320 	RM_PARAL_MEAS_CAP_EN,		/* parallel report */
321 	RM_REPEAT_MEAS_CAP_EN,
322 	RM_BCN_PASSIVE_MEAS_CAP_EN,
323 	RM_BCN_ACTIVE_MEAS_CAP_EN,
324 	RM_BCN_TABLE_MEAS_CAP_EN,
325 	RM_BCN_MEAS_REP_COND_CAP_EN,	/* conditions */
326 
327 	RM_FRAME_MEAS_CAP_EN,
328 	RM_CH_LOAD_CAP_EN,
329 	RM_NOISE_HISTO_CAP_EN,		/* noise historgram */
330 	RM_STATIS_MEAS_CAP_EN,		/* statistics */
331 	RM_LCI_MEAS_CAP_EN,		/* 12 */
332 	RM_LCI_AMIMUTH_CAP_EN,
333 	RM_TRANS_STREAM_CAT_MEAS_CAP_EN,
334 	RM_TRIG_TRANS_STREAM_CAT_MEAS_CAP_EN,
335 
336 	RM_AP_CH_REP_CAP_EN,
337 	RM_RM_MIB_CAP_EN,
338 	RM_OP_CH_MAX_MEAS_DUR0,		/* 18-20 */
339 	RM_OP_CH_MAX_MEAS_DUR1,
340 	RM_OP_CH_MAX_MEAS_DUR2,
341 	RM_NONOP_CH_MAX_MEAS_DUR0,	/* 21-23 */
342 	RM_NONOP_CH_MAX_MEAS_DUR1,
343 	RM_NONOP_CH_MAX_MEAS_DUR2,
344 
345 	RM_MEAS_PILOT_CAP0,		/* 24-26 */
346 	RM_MEAS_PILOT_CAP1,
347 	RM_MEAS_PILOT_CAP2,
348 	RM_MEAS_PILOT_TRANS_INFO_CAP_EN,
349 	RM_NB_REP_TSF_OFFSET_CAP_EN,
350 	RM_RCPI_MEAS_CAP_EN,		/* 29 */
351 	RM_RSNI_MEAS_CAP_EN,
352 	RM_BSS_AVG_ACCESS_DELAY_CAP_EN,
353 
354 	RM_AVALB_ADMIS_CAPACITY_CAP_EN,
355 	RM_ANT_CAP_EN,
356 	RM_RSVD,			/* 34-39 */
357 	RM_MAX
358 };
359 
360 char *rm_state_name(enum RM_STATE state);
361 char *rm_event_name(enum RM_EV_ID evid);
362 char *rm_type_req_name(u8 meas_type);
363 int _rm_post_event(_adapter *padapter, u32 rmid, enum RM_EV_ID evid);
364 int rm_enqueue_rmobj(_adapter *padapter, struct rm_obj *obj, bool to_head);
365 
366 void rm_free_rmobj(struct rm_obj *prm);
367 struct rm_obj *rm_alloc_rmobj(_adapter *padapter);
368 struct rm_obj *rm_get_rmobj(_adapter *padapter, u32 rmid);
369 struct sta_info *rm_get_psta(_adapter *padapter, u32 rmid);
370 
371 int retrieve_radio_meas_result(struct rm_obj *prm);
372 int rm_radio_meas_report_cond(struct rm_obj *prm);
373 int rm_recv_radio_mens_req(_adapter *padapter,
374 	union recv_frame *precv_frame,struct sta_info *psta);
375 int rm_recv_radio_mens_rep(_adapter *padapter,
376 	union recv_frame *precv_frame, struct sta_info *psta);
377 int rm_recv_link_mens_req(_adapter *padapter,
378 	union recv_frame *precv_frame,struct sta_info *psta);
379 int rm_recv_link_mens_rep(_adapter *padapter,
380 	union recv_frame *precv_frame, struct sta_info *psta);
381 int rm_radio_mens_nb_rep(_adapter *padapter,
382 	union recv_frame *precv_frame, struct sta_info *psta);
383 int issue_null_reply(struct rm_obj *prm);
384 int issue_beacon_rep(struct rm_obj *prm);
385 int issue_nb_req(struct rm_obj *prm);
386 int issue_radio_meas_req(struct rm_obj *prm);
387 int issue_radio_meas_rep(struct rm_obj *prm);
388 int issue_link_meas_req(struct rm_obj *prm);
389 int issue_link_meas_rep(struct rm_obj *prm);
390 
391 void rm_set_rep_mode(struct rm_obj *prm, u8 mode);
392 
393 int ready_for_scan(struct rm_obj *prm);
394 int rm_sitesurvey(struct rm_obj *prm);
395 
396 #endif /*CONFIG_RTW_80211K*/
397 #endif /*__RTW_RM_FSM_H_*/
398