| /* |
| * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. |
| * |
| * |
| * Permission to use, copy, modify, and/or distribute this software for |
| * any purpose with or without fee is hereby granted, provided that the |
| * above copyright notice and this permission notice appear in all |
| * copies. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL |
| * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED |
| * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE |
| * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL |
| * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR |
| * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER |
| * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR |
| * PERFORMANCE OF THIS SOFTWARE. |
| */ |
| |
| /** |
| * DOC: These APIs are used by DFS core functions to call mlme functions. |
| */ |
| |
| #ifndef _WLAN_DFS_MLME_API_H_ |
| #define _WLAN_DFS_MLME_API_H_ |
| |
| #include "wlan_dfs_ucfg_api.h" |
| |
| extern struct dfs_to_mlme global_dfs_to_mlme; |
| |
| /** |
| * dfs_mlme_start_rcsa() - Send RCSA to RootAP. |
| * @pdev: Pointer to DFS pdev object. |
| * @wait_for_csa: Wait for CSA from RootAP. |
| */ |
| void dfs_mlme_start_rcsa(struct wlan_objmgr_pdev *pdev, |
| bool *wait_for_csa); |
| |
| /** |
| * dfs_mlme_mark_dfs() - Mark the channel in the channel list. |
| * @pdev: Pointer to DFS pdev object. |
| * @ieee: Channel number. |
| * @freq: Channel frequency. |
| * @vhtop_ch_freq_seg2: VHT80 Cfreq2. |
| * @flags: channel flags. |
| */ |
| #ifdef CONFIG_CHAN_NUM_API |
| void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev, |
| uint8_t ieee, |
| uint16_t freq, |
| uint8_t vhtop_ch_freq_seg2, |
| uint64_t flags); |
| #endif |
| |
| /** |
| * dfs_mlme_mark_dfs_for_freq() - Mark the channel in the channel list. |
| * @pdev: Pointer to DFS pdev object. |
| * @ieee: Channel number. |
| * @freq: Channel frequency. |
| * @vhtop_ch_freq_seg2_mhz: VHT80 Cfreq2 in Mhz. |
| * @flags: channel flags. |
| */ |
| #ifdef CONFIG_CHAN_FREQ_API |
| void dfs_mlme_mark_dfs_for_freq(struct wlan_objmgr_pdev *pdev, |
| uint8_t ieee, |
| uint16_t freq, |
| uint16_t vhtop_ch_freq_mhz_seg2, |
| uint64_t flags); |
| #endif |
| /** |
| * dfs_mlme_start_csa() - Sends CSA in ieeeChan |
| * @pdev: Pointer to DFS pdev object. |
| * @ieee_chan: Channel number. |
| * @freq: Channel frequency. |
| * @cfreq2: HT80 cfreq2. |
| * @flags: channel flags. |
| */ |
| #ifdef CONFIG_CHAN_NUM_API |
| void dfs_mlme_start_csa(struct wlan_objmgr_pdev *pdev, |
| uint8_t ieee_chan, |
| uint16_t freq, |
| uint8_t cfreq2, |
| uint64_t flags); |
| #endif |
| |
| /** |
| * dfs_mlme_start_csa_for_freq() - Sends CSA in ieeeChan |
| * @pdev: Pointer to DFS pdev object. |
| * @ieee_chan: Channel number. |
| * @freq: Channel frequency. |
| * @cfreq2: HT80 cfreq2 in Mhz. |
| * @flags: channel flags. |
| */ |
| #ifdef CONFIG_CHAN_FREQ_API |
| void dfs_mlme_start_csa_for_freq(struct wlan_objmgr_pdev *pdev, |
| uint8_t ieee_chan, |
| uint16_t freq, |
| uint16_t cfreq2_mhz, |
| uint64_t flags); |
| #endif |
| /** |
| * dfs_mlme_proc_cac() - Process the CAC completion event. |
| * @pdev: Pointer to DFS pdev object. |
| * @vdev_id: vdev id. |
| */ |
| void dfs_mlme_proc_cac(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id); |
| |
| /** |
| * dfs_mlme_deliver_event_up_after_cac() - Send a CAC timeout, VAP up event to |
| * userspace. |
| * @pdev: Pointer to DFS pdev object. |
| */ |
| void dfs_mlme_deliver_event_up_after_cac(struct wlan_objmgr_pdev *pdev); |
| |
| /** |
| * dfs_mlme_get_dfs_ch_nchans() - Get number of channels in the channel list |
| * @pdev: Pointer to DFS pdev object. |
| * @nchans: Pointer to save the channel number. |
| */ |
| void dfs_mlme_get_dfs_ch_nchans(struct wlan_objmgr_pdev *pdev, int *nchans); |
| |
| /** |
| * dfs_mlme_get_extchan() - Get extension channel. |
| * @pdev: Pointer to DFS pdev object. |
| * @dfs_ch_freq: Frequency in Mhz. |
| * @dfs_ch_flags: Channel flags. |
| * @dfs_ch_flagext: Extended channel flags. |
| * @dfs_ch_ieee: IEEE channel number. |
| * @dfs_ch_vhtop_ch_freq_seg1: Channel Center frequency. |
| * @dfs_ch_vhtop_ch_freq_seg2: Channel Center frequency applicable for 80+80MHz |
| * mode of operation. |
| */ |
| #ifdef CONFIG_CHAN_NUM_API |
| QDF_STATUS dfs_mlme_get_extchan(struct wlan_objmgr_pdev *pdev, |
| uint16_t *dfs_ch_freq, |
| uint64_t *dfs_ch_flags, |
| uint16_t *dfs_ch_flagext, |
| uint8_t *dfs_ch_ieee, |
| uint8_t *dfs_ch_vhtop_ch_freq_seg1, |
| uint8_t *dfs_ch_vhtop_ch_freq_seg2); |
| #endif |
| |
| /** |
| * dfs_mlme_get_extchan() - Get extension channel. |
| * @pdev: Pointer to DFS pdev object. |
| * @dfs_chan_freq: Frequency in Mhz. |
| * @dfs_chan_flags: Channel flags. |
| * @dfs_chan_flagext: Extended channel flags. |
| * @dfs_chan_ieee: IEEE channel number. |
| * @dfs_chan_vhtop_ch_freq_seg1: Channel Center IEEE. |
| * @dfs_chan_vhtop_ch_freq_seg2: Channel Center IEEE applicable for 80+80MHz |
| * mode of operation. |
| * @dfs_chan_mhz_freq_seg1: Primary channel center freq. |
| * @dfs_chan_mhz_freq_seg2: Secondary channel center freq applicable for |
| * 80+80 MHZ. |
| */ |
| |
| #ifdef CONFIG_CHAN_FREQ_API |
| QDF_STATUS dfs_mlme_get_extchan_for_freq(struct wlan_objmgr_pdev *pdev, |
| uint16_t *dfs_chan_freq, |
| uint64_t *dfs_chan_flags, |
| uint16_t *dfs_chan_flagext, |
| uint8_t *dfs_chan_ieee, |
| uint8_t *dfs_chan_vhtop_ch_freq_seg1, |
| uint8_t *dfs_chan_vhtop_ch_freq_seg2, |
| uint16_t *dfs_chan_mhz_freq_seg1, |
| uint16_t *dfs_chan_mhz_freq_seg2); |
| #endif |
| |
| /** |
| * dfs_mlme_set_no_chans_available() - Set no_chans_available flag. |
| * @pdev: Pointer to DFS pdev object. |
| * @val: Set this value to no_chans_available flag. |
| */ |
| void dfs_mlme_set_no_chans_available(struct wlan_objmgr_pdev *pdev, |
| int val); |
| |
| /** |
| * dfs_mlme_ieee2mhz() - Get the frequency from channel number. |
| * @pdev: Pointer to DFS pdev object. |
| * @ieee: Channel number. |
| * @flag: Channel flag. |
| */ |
| int dfs_mlme_ieee2mhz(struct wlan_objmgr_pdev *pdev, |
| int ieee, |
| uint64_t flag); |
| |
| /** |
| * dfs_mlme_find_dot11_channel() - Get dot11 channel from ieee, cfreq2 and mode. |
| * @pdev: Pointer to DFS pdev object. |
| * @ieee: Channel number. |
| * @des_cfreq2: cfreq2 |
| * @mode: Phymode |
| * @dfs_ch_freq: Frequency in Mhz. |
| * @dfs_ch_flags: Channel flags. |
| * @dfs_ch_flagext: Extended channel flags. |
| * @dfs_ch_ieee: IEEE channel number. |
| * @dfs_ch_vhtop_ch_freq_seg1: Channel Center frequency. |
| * @dfs_ch_vhtop_ch_freq_seg2: Channel Center frequency applicable for 80+80MHz |
| * mode of operation. |
| * |
| * Return: |
| * * QDF_STATUS_SUCCESS : Channel found. |
| * * QDF_STATUS_E_FAILURE: Channel not found. |
| */ |
| #ifdef CONFIG_CHAN_NUM_API |
| QDF_STATUS |
| dfs_mlme_find_dot11_channel(struct wlan_objmgr_pdev *pdev, |
| uint8_t ieee, |
| uint8_t des_cfreq2, |
| int mode, |
| uint16_t *dfs_ch_freq, |
| uint64_t *dfs_ch_flags, |
| uint16_t *dfs_ch_flagext, |
| uint8_t *dfs_ch_ieee, |
| uint8_t *dfs_ch_vhtop_ch_freq_seg1, |
| uint8_t *dfs_ch_vhtop_ch_freq_seg2); |
| #endif |
| |
| /** |
| * dfs_mlme_find_dot11_chan_for_freq() - Find a channel pointer given the mode, |
| * frequency and channel flags. |
| * @pdev: Pointer to DFS pdev object. |
| * @ch_freq: Channel frequency. |
| * @des_cfreq2_mhz: cfreq2 in MHZ. |
| * @mode: Phymode |
| * @dfs_chan_freq: Frequency in Mhz. |
| * @dfs_chan_flags: Channel flags. |
| * @dfs_chan_flagext: Extended channel flags. |
| * @dfs_chan_ieee: IEEE channel number. |
| * @dfs_chan_vhtop_ch_freq_seg1: Channel Center IEEE for primary 80 segment. |
| * @dfs_chan_vhtop_ch_freq_seg2: Channel Center frequency applicable for |
| * 80+80MHz mode of operation. |
| * @dfs_chan_mhz_freq_seg1: Channel center frequency of primary 80 segment. |
| * @dfs_chan_mhz_freq_seg2: Channel center frequency for secondary 80 |
| * segment applicable only for 80+80MHZ mode of |
| * operation. |
| * |
| * Return: |
| * * QDF_STATUS_SUCCESS : Channel found. |
| * * QDF_STATUS_E_FAILURE: Channel not found. |
| */ |
| #ifdef CONFIG_CHAN_FREQ_API |
| QDF_STATUS |
| dfs_mlme_find_dot11_chan_for_freq(struct wlan_objmgr_pdev *pdev, |
| uint16_t chan_freq, |
| uint16_t des_cfreq2_mhz, |
| int mode, |
| uint16_t *dfs_chan_freq, |
| uint64_t *dfs_chan_flags, |
| uint16_t *dfs_chan_flagext, |
| uint8_t *dfs_chan_ieee, |
| uint8_t *dfs_chan_vhtop_ch_freq_seg1, |
| uint8_t *dfs_chan_vhtop_ch_freq_seg2, |
| uint16_t *dfs_chan_mhz_freq_seg1, |
| uint16_t *dfs_chan_mhz_freq_seg2); |
| #endif |
| |
| /** |
| * dfs_mlme_get_dfs_ch_channels() - Get channel from channel list. |
| * @pdev: Pointer to DFS pdev object. |
| * @dfs_ch_freq: Frequency in Mhz. |
| * @dfs_ch_flags: Channel flags. |
| * @dfs_ch_flagext: Extended channel flags. |
| * @dfs_ch_ieee: IEEE channel number. |
| * @dfs_ch_vhtop_ch_freq_seg1: Channel Center frequency. |
| * @dfs_ch_vhtop_ch_freq_seg2: Channel Center frequency applicable for 80+80MHz |
| * mode of operation. |
| * @index: Index into channel list. |
| */ |
| #ifdef CONFIG_CHAN_NUM_API |
| void dfs_mlme_get_dfs_ch_channels(struct wlan_objmgr_pdev *pdev, |
| uint16_t *dfs_ch_freq, |
| uint64_t *dfs_ch_flags, |
| uint16_t *dfs_ch_flagext, |
| uint8_t *dfs_ch_ieee, |
| uint8_t *dfs_ch_vhtop_ch_freq_seg1, |
| uint8_t *dfs_ch_vhtop_ch_freq_seg2, |
| int index); |
| #endif |
| |
| /** |
| * dfs_mlme_get_dfs_channels_for_freq() - Get DFS channel from channel list. |
| * @pdev: Pointer to DFS pdev object. |
| * @dfs_chan_freq: Frequency in Mhz. |
| * @dfs_chan_flags: Channel flags. |
| * @dfs_chan_flagext: Extended channel flags. |
| * @dfs_chan_ieee: IEEE channel number. |
| * @dfs_chan_vhtop_ch_freq_seg1: Channel Center IEEE number. |
| * @dfs_chan_vhtop_ch_freq_seg2: Channel Center IEEE applicable for 80+80MHz |
| * mode of operation. |
| * @dfs_chan_mhz_freq_seg1 : Primary 80 Channel Center frequency. |
| * @dfs_chan_mhz_freq_seg2 : Channel center frequency applicable only for |
| * 80+80 mode of operation. |
| * @index: Index into channel list. |
| */ |
| #ifdef CONFIG_CHAN_FREQ_API |
| void |
| dfs_mlme_get_dfs_channels_for_freq(struct wlan_objmgr_pdev *pdev, |
| uint16_t *dfs_chan_freq, |
| uint64_t *dfs_chan_flags, |
| uint16_t *dfs_chan_flagext, |
| uint8_t *dfs_chan_ieee, |
| uint8_t *dfs_chan_vhtop_ch_freq_seg1, |
| uint8_t *dfs_chan_vhtop_ch_freq_seg2, |
| uint16_t *dfs_chan_mhz_freq_seg1, |
| uint16_t *dfs_chan_mhz_freq_seg2, |
| int index); |
| #endif |
| |
| /** |
| * dfs_mlme_dfs_ch_flags_ext() - Get extension channel flags. |
| * @pdev: Pointer to DFS pdev object. |
| */ |
| uint32_t dfs_mlme_dfs_ch_flags_ext(struct wlan_objmgr_pdev *pdev); |
| |
| /** |
| * dfs_mlme_channel_change_by_precac() - Channel change by PreCAC. |
| * @pdev: Pointer to DFS pdev object. |
| */ |
| void dfs_mlme_channel_change_by_precac(struct wlan_objmgr_pdev *pdev); |
| |
| /** |
| * dfs_mlme_nol_timeout_notification() - NOL timeout notification to userspace. |
| * @pdev: Pointer to DFS pdev object. |
| */ |
| void dfs_mlme_nol_timeout_notification(struct wlan_objmgr_pdev *pdev); |
| |
| /** |
| * dfs_mlme_clist_update() - Mark the channel as RADAR. |
| * @pdev: Pointer to DFS pdev object. |
| * @nollist: Pointer to NOL list. |
| * @nentries: Number of channels in the NOL list. |
| */ |
| void dfs_mlme_clist_update(struct wlan_objmgr_pdev *pdev, |
| void *nollist, |
| int nentries); |
| |
| /** |
| * dfs_mlme_get_cac_timeout() - Get cac_timeout. |
| * @pdev: Pointer to DFS pdev object. |
| * @dfs_ch_freq: Frequency in Mhz. |
| * @dfs_ch_vhtop_ch_freq_seg2: Channel Center frequency applicable for 80+80MHz |
| * mode of operation. |
| * @dfs_ch_flags: Channel flags. |
| */ |
| #ifdef CONFIG_CHAN_NUM_API |
| int dfs_mlme_get_cac_timeout(struct wlan_objmgr_pdev *pdev, |
| uint16_t dfs_ch_freq, |
| uint8_t dfs_ch_vhtop_ch_freq_seg2, |
| uint64_t dfs_ch_flags); |
| #endif |
| |
| /** |
| * dfs_mlme_get_cac_timeout_for_freq() - Get cac_timeout. |
| * @pdev: Pointer to DFS pdev object. |
| * @dfs_chan_freq: Frequency in Mhz. |
| * @dfs_chan_vhtop_freq_seg2: Channel Center frequency applicable for 80+80MHz |
| * mode of operation. |
| * @dfs_chan_flags: Channel flags. |
| */ |
| #ifdef CONFIG_CHAN_FREQ_API |
| int dfs_mlme_get_cac_timeout_for_freq(struct wlan_objmgr_pdev *pdev, |
| uint16_t dfs_chan_freq, |
| uint16_t dfs_chan_vhtop_freq_seg2_mhz, |
| uint64_t dfs_chan_flags); |
| #endif |
| /** |
| * dfs_mlme_rebuild_chan_list_with_non_dfs_channels() - Rebuild the channel list |
| * with only non DFS channels. |
| * @pdev: Pointer to DFS pdev object. |
| * |
| * return: On success return 1 or 0, else failure. |
| */ |
| #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) |
| int dfs_mlme_rebuild_chan_list_with_non_dfs_channels( |
| struct wlan_objmgr_pdev *pdev); |
| #else |
| static inline int dfs_mlme_rebuild_chan_list_with_non_dfs_channels( |
| struct wlan_objmgr_pdev *pdev) |
| { |
| return 0; |
| } |
| #endif |
| |
| /** |
| * dfs_mlme_restart_vaps_with_non_dfs_chan() - Restart vaps with non DFS |
| * channels |
| * @pdev: Pointer to DFS pdev object. |
| * @no_chans_avail: Indicates if no channel is available. |
| */ |
| #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) |
| void dfs_mlme_restart_vaps_with_non_dfs_chan(struct wlan_objmgr_pdev *pdev, |
| int no_chans_avail); |
| #else |
| static inline |
| void dfs_mlme_restart_vaps_with_non_dfs_chan(struct wlan_objmgr_pdev *pdev, |
| int no_chans_avail) |
| { |
| } |
| #endif |
| |
| /** |
| * dfs_mlme_check_allowed_prim_chanlist() - Check whether the given channel is |
| * present in the primary allowed channel list or not |
| * @pdev: Pointer to DFS pdev object. |
| * @chan_num: Channel number |
| */ |
| #if defined(WLAN_SUPPORT_PRIMARY_ALLOWED_CHAN) |
| bool dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev *pdev, |
| uint32_t chan_freq); |
| |
| #else |
| static inline |
| bool dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev *pdev, |
| uint32_t chan_freq) |
| { |
| return true; |
| } |
| #endif |
| |
| /** |
| * dfs_mlme_handle_dfs_scan_violation() - Handle scan start failure |
| * due to DFS violation (presence of NOL channel in scan channel list). |
| * @pdev: Pointer to pdev object. |
| */ |
| #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD) |
| void dfs_mlme_handle_dfs_scan_violation(struct wlan_objmgr_pdev *pdev); |
| #else |
| static inline |
| void dfs_mlme_handle_dfs_scan_violation(struct wlan_objmgr_pdev *pdev) |
| { |
| } |
| #endif |
| |
| /** |
| * dfs_mlme_is_opmode_sta() - Check if pdev opmode is STA. |
| * @pdev: Pointer to DFS pdev object. |
| * |
| * Return: true if pdev opmode is STA, else false. |
| */ |
| bool dfs_mlme_is_opmode_sta(struct wlan_objmgr_pdev *pdev); |
| |
| /** |
| * dfs_mlme_acquire_radar_mode_switch_lock() - Acquire lock for radar processing |
| * over mode switch handling. |
| * @pdev: Pointer to DFS pdev object. |
| * |
| * Return: void. |
| */ |
| void dfs_mlme_acquire_radar_mode_switch_lock(struct wlan_objmgr_pdev *pdev); |
| |
| /** |
| * dfs_mlme_release_radar_mode_switch_lock() - Release lock taken for radar |
| * processing over mode switch handling. |
| * @pdev: Pointer to DFS pdev object. |
| * |
| * Return: void. |
| */ |
| void dfs_mlme_release_radar_mode_switch_lock(struct wlan_objmgr_pdev *pdev); |
| #endif /* _WLAN_DFS_MLME_API_H_ */ |