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