blob: 3593f06d0f0a7620562363225b96ee3100fc1268 [file] [log] [blame]
/*
* 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_ */