1*4882a593Smuzhiyun /** @file mlan_11h.h 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * @brief This header file contains data structures and 4*4882a593Smuzhiyun * function declarations of 802.11h 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Copyright 2008-2021 NXP 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This software file (the File) is distributed by NXP 10*4882a593Smuzhiyun * under the terms of the GNU General Public License Version 2, June 1991 11*4882a593Smuzhiyun * (the License). You may use, redistribute and/or modify the File in 12*4882a593Smuzhiyun * accordance with the terms and conditions of the License, a copy of which 13*4882a593Smuzhiyun * is available by writing to the Free Software Foundation, Inc., 14*4882a593Smuzhiyun * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the 15*4882a593Smuzhiyun * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. 16*4882a593Smuzhiyun * 17*4882a593Smuzhiyun * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE 18*4882a593Smuzhiyun * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE 19*4882a593Smuzhiyun * ARE EXPRESSLY DISCLAIMED. The License provides additional details about 20*4882a593Smuzhiyun * this warranty disclaimer. 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun */ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /************************************************************* 25*4882a593Smuzhiyun Change Log: 26*4882a593Smuzhiyun 03/26/2009: initial creation 27*4882a593Smuzhiyun *************************************************************/ 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun #ifndef _MLAN_11H_ 30*4882a593Smuzhiyun #define _MLAN_11H_ 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun /** 11H OID bitmasks */ 33*4882a593Smuzhiyun #define ENABLE_11H_MASK MBIT(0) 34*4882a593Smuzhiyun #define MASTER_RADAR_DET_MASK MBIT(1) 35*4882a593Smuzhiyun #define SLAVE_RADAR_DET_MASK MBIT(2) 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun /** DFS Master Radar Detect global enable */ 38*4882a593Smuzhiyun #define DFS_MASTER_RADAR_DETECT_EN (MTRUE) 39*4882a593Smuzhiyun /** DFS Slave Radar Detect global enable */ 40*4882a593Smuzhiyun #define DFS_SLAVE_RADAR_DETECT_EN (MFALSE) 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #define CHANNEL_OFFSET_MASK 0x30 43*4882a593Smuzhiyun #define CHANNEL_BANDWIDTH_MASK 0x0C 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun /** 46*4882a593Smuzhiyun * 11H APIs 47*4882a593Smuzhiyun */ 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /* Is master radar detection enabled in firmware? */ 50*4882a593Smuzhiyun extern t_bool wlan_11h_is_master_radar_det_active(mlan_private *priv); 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun /** Configure master radar detection. 53*4882a593Smuzhiyun * Need call wlan_11h_check_update_radar_det_state() after. 54*4882a593Smuzhiyun */ 55*4882a593Smuzhiyun extern mlan_status wlan_11h_config_master_radar_det(mlan_private *priv, 56*4882a593Smuzhiyun t_bool enable); 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /** Configure slave radar detection. 59*4882a593Smuzhiyun * Need call wlan_11h_check_update_radar_det_state() after. 60*4882a593Smuzhiyun */ 61*4882a593Smuzhiyun extern mlan_status wlan_11h_config_slave_radar_det(mlan_private *priv, 62*4882a593Smuzhiyun t_bool enable); 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun /** Checks all interfaces and updates radar detect flags if necessary */ 65*4882a593Smuzhiyun extern mlan_status wlan_11h_check_update_radar_det_state(mlan_private *pmpriv); 66*4882a593Smuzhiyun #ifdef UAP_SUPPORT 67*4882a593Smuzhiyun /** update dfs master state from uap interface */ 68*4882a593Smuzhiyun void wlan_11h_update_dfs_master_state_by_uap(mlan_private *pmpriv); 69*4882a593Smuzhiyun /** update dfs master when station disconnected */ 70*4882a593Smuzhiyun void wlan_11h_update_dfs_master_state_on_disconect(mlan_private *priv); 71*4882a593Smuzhiyun /** update dfs master state from STA interface */ 72*4882a593Smuzhiyun void wlan_11h_update_dfs_master_state_by_sta(mlan_private *pmpriv); 73*4882a593Smuzhiyun #endif 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /** Return 1 if 11h is active in the firmware, 0 if it is inactive */ 76*4882a593Smuzhiyun extern t_bool wlan_11h_is_active(mlan_private *priv); 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun /** Enable the tx interface and record the new transmit state */ 79*4882a593Smuzhiyun extern void wlan_11h_tx_enable(mlan_private *priv); 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun /** Disable the tx interface and record the new transmit state */ 82*4882a593Smuzhiyun extern void wlan_11h_tx_disable(mlan_private *priv); 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun /** Activate 11h extensions in the firmware */ 85*4882a593Smuzhiyun extern mlan_status wlan_11h_activate(mlan_private *priv, t_void *pioctl_buf, 86*4882a593Smuzhiyun t_bool flag); 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /** Initialize the 11h device structure */ 89*4882a593Smuzhiyun extern void wlan_11h_init(mlan_adapter *pmadapter); 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun /** Cleanup for the 11h device structure */ 92*4882a593Smuzhiyun extern void wlan_11h_cleanup(mlan_adapter *pmadapter); 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun /** Initialize the 11h interface structure */ 95*4882a593Smuzhiyun extern void wlan_11h_priv_init(mlan_private *pmpriv); 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /** Get an initial random channel to start an adhoc network on */ 98*4882a593Smuzhiyun extern t_u8 wlan_11h_get_adhoc_start_channel(mlan_private *priv); 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun /** Get channel that has been closed via Channel Switch Announcement */ 101*4882a593Smuzhiyun extern t_u8 wlan_11h_get_csa_closed_channel(mlan_private *priv); 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun /** Check if radar detection is required on the specified channel */ 104*4882a593Smuzhiyun extern t_bool wlan_11h_radar_detect_required(mlan_private *priv, t_u8 channel); 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun /** Perform a standard availibility check on the specified channel */ 107*4882a593Smuzhiyun extern t_s32 wlan_11h_issue_radar_detect(mlan_private *priv, 108*4882a593Smuzhiyun pmlan_ioctl_req pioctl_req, 109*4882a593Smuzhiyun t_u8 channel, Band_Config_t bandcfg); 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun /** Check previously issued radar report for a channel */ 112*4882a593Smuzhiyun extern mlan_status wlan_11h_check_chan_report(mlan_private *priv, t_u8 chan); 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun /** Add any 11h TLVs necessary to complete an adhoc start command */ 115*4882a593Smuzhiyun extern t_s32 wlan_11h_process_start(mlan_private *priv, t_u8 **ppbuffer, 116*4882a593Smuzhiyun IEEEtypes_CapInfo_t *pcap_info, 117*4882a593Smuzhiyun t_u32 channel, 118*4882a593Smuzhiyun wlan_11h_bss_info_t *p11h_bss_info); 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun /** Add any 11h TLVs necessary to complete a join command (adhoc or infra) */ 121*4882a593Smuzhiyun extern t_s32 wlan_11h_process_join(mlan_private *priv, t_u8 **ppbuffer, 122*4882a593Smuzhiyun IEEEtypes_CapInfo_t *pcap_info, t_u16 band, 123*4882a593Smuzhiyun t_u32 channel, 124*4882a593Smuzhiyun wlan_11h_bss_info_t *p11h_bss_info); 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun /** Complete the firmware command preparation for an 11h command function */ 127*4882a593Smuzhiyun extern mlan_status wlan_11h_cmd_process(mlan_private *priv, 128*4882a593Smuzhiyun HostCmd_DS_COMMAND *pcmd_ptr, 129*4882a593Smuzhiyun const t_void *pinfo_buf); 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /** Process the response of an 11h firmware command */ 132*4882a593Smuzhiyun extern mlan_status wlan_11h_cmdresp_process(mlan_private *priv, 133*4882a593Smuzhiyun const HostCmd_DS_COMMAND *resp); 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun /** Receive IEs from scan processing and record any needed info for 11h */ 136*4882a593Smuzhiyun extern mlan_status wlan_11h_process_bss_elem(mlan_adapter *pmadapter, 137*4882a593Smuzhiyun wlan_11h_bss_info_t *p11h_bss_info, 138*4882a593Smuzhiyun const t_u8 *pelement); 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun /** Handler for EVENT_CHANNEL_SWITCH_ANN */ 141*4882a593Smuzhiyun extern mlan_status wlan_11h_handle_event_chanswann(mlan_private *priv); 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun /** Handler for EVENT_CHANNEL_REPORT_RDY */ 144*4882a593Smuzhiyun extern mlan_status wlan_11h_handle_event_chanrpt_ready(mlan_private *priv, 145*4882a593Smuzhiyun mlan_event *pevent, 146*4882a593Smuzhiyun t_u8 *radar_chan, 147*4882a593Smuzhiyun t_u8 *bandwidth); 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun /** Debug output for EVENT_RADAR_DETECTED */ 150*4882a593Smuzhiyun mlan_status wlan_11h_print_event_radar_detected(mlan_private *priv, 151*4882a593Smuzhiyun mlan_event *pevent, 152*4882a593Smuzhiyun t_u8 *radar_chan, 153*4882a593Smuzhiyun t_u8 *bandwidth); 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun t_s32 wlan_11h_cancel_radar_detect(mlan_private *priv); 156*4882a593Smuzhiyun /** Handler for DFS_TESTING IOCTL */ 157*4882a593Smuzhiyun extern mlan_status wlan_11h_ioctl_dfs_testing(pmlan_adapter pmadapter, 158*4882a593Smuzhiyun pmlan_ioctl_req pioctl_req); 159*4882a593Smuzhiyun extern mlan_status wlan_11h_ioctl_channel_nop_info(pmlan_adapter pmadapter, 160*4882a593Smuzhiyun pmlan_ioctl_req pioctl_req); 161*4882a593Smuzhiyun extern mlan_status wlan_11h_ioctl_nop_channel_list(pmlan_adapter pmadapter, 162*4882a593Smuzhiyun pmlan_ioctl_req pioctl_req); 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun extern mlan_status wlan_11h_ioctl_dfs_chan_report(mlan_private *priv, 165*4882a593Smuzhiyun pmlan_ioctl_req pioctl_req); 166*4882a593Smuzhiyun extern mlan_status wlan_11h_ioctl_chan_switch_count(pmlan_adapter pmadapter, 167*4882a593Smuzhiyun pmlan_ioctl_req pioctl_req); 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun /** get/set channel dfs state */ 170*4882a593Smuzhiyun mlan_status wlan_11h_ioctl_chan_dfs_state(pmlan_adapter pmadapter, 171*4882a593Smuzhiyun pmlan_ioctl_req pioctl_req); 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun /** get/set dfs w53 cfg */ 174*4882a593Smuzhiyun mlan_status wlan_11h_ioctl_dfs_w53_cfg(pmlan_adapter pmadapter, 175*4882a593Smuzhiyun pmlan_ioctl_req pioctl_req); 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun /** get/set dfs mode */ 178*4882a593Smuzhiyun mlan_status wlan_11h_ioctl_dfs_mode(pmlan_adapter pmadapter, 179*4882a593Smuzhiyun pmlan_ioctl_req pioctl_req); 180*4882a593Smuzhiyun /** Check if channel is under a NOP duration (should not be used) */ 181*4882a593Smuzhiyun extern t_bool wlan_11h_is_channel_under_nop(mlan_adapter *pmadapter, 182*4882a593Smuzhiyun t_u8 channel); 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun /** Check if RADAR_DETECTED handling is blocking data tx */ 185*4882a593Smuzhiyun extern t_bool wlan_11h_radar_detected_tx_blocked(mlan_adapter *pmadapter); 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun /** Callback for RADAR_DETECTED (for UAP cmdresp) */ 188*4882a593Smuzhiyun extern mlan_status wlan_11h_radar_detected_callback(t_void *priv); 189*4882a593Smuzhiyun /** set dfs check channel */ 190*4882a593Smuzhiyun void wlan_11h_set_dfs_check_chan(mlan_private *priv, t_u8 chan, t_u8 bandwidth); 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun #ifdef UAP_SUPPORT 193*4882a593Smuzhiyun /** BW_change event Handler for dfs_repeater */ 194*4882a593Smuzhiyun void wlan_dfs_rep_bw_change(mlan_adapter *pmadapter); 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun /** disconnect event Handler for dfs_repeater */ 197*4882a593Smuzhiyun void wlan_dfs_rep_disconnect(mlan_adapter *pmadapter); 198*4882a593Smuzhiyun #endif 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun /** Handler for RADAR_DETECTED */ 201*4882a593Smuzhiyun extern mlan_status wlan_11h_radar_detected_handling(mlan_adapter *pmadapter, 202*4882a593Smuzhiyun mlan_private *priv); 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun mlan_status wlan_11h_remove_custom_ie(mlan_adapter *pmadapter, 205*4882a593Smuzhiyun mlan_private *pmpriv); 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun /** DFS Event pre-processing */ 208*4882a593Smuzhiyun extern mlan_status wlan_11h_dfs_event_preprocessing(mlan_adapter *pmadapter); 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun /** DFS switch to non-DFS channel */ 211*4882a593Smuzhiyun extern mlan_status wlan_11h_switch_non_dfs_chan(mlan_private *priv, t_u8 *chan); 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun extern void wlan_11h_update_bandcfg(mlan_private *pmpriv, 214*4882a593Smuzhiyun Band_Config_t *uap_band_cfg, 215*4882a593Smuzhiyun t_u8 new_channel); 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun /** function checks if interface is active. **/ 218*4882a593Smuzhiyun extern t_bool wlan_is_intf_active(mlan_private *pmpriv); 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun #endif /*_MLAN_11H_ */ 221