diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_init_deinit_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_init_deinit_api.h new file mode 100644 index 000000000000..24bfe089bff8 --- /dev/null +++ b/umac/dfs/dispatcher/inc/wlan_dfs_init_deinit_api.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2016-2017 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: This file init/deint functions for DFS module. + */ + +#ifndef _WLAN_DFS_INIT_DEINIT_API_H_ +#define _WLAN_DFS_INIT_DEINIT_API_H_ + +#include "wlan_dfs_ucfg_api.h" + +/** + * wlan_pdev_get_dfs_obj() - Get DFS object from PDEV. + * @pdev: Pointer to PDEV structure. + * @id: DFS component ID. + * @obj: Pointer to DFS object. + */ +struct wlan_dfs *wlan_pdev_get_dfs_obj(struct wlan_objmgr_pdev *pdev); + +/** + * register_dfs_callbacks() - Fill mlme pointers. + */ +void register_dfs_callbacks(void); + +/** + * dfs_init() - Init DFS module + */ +QDF_STATUS dfs_init(void); + +/** + * dfs_deinit() - Deinit DFS module. + */ +QDF_STATUS dfs_deinit(void); + +/** + * wlan_dfs_pdev_obj_create_notification() - DFS pdev object create handler. + * @pdev: Pointer to DFS pdev object. + */ +QDF_STATUS wlan_dfs_pdev_obj_create_notification(struct wlan_objmgr_pdev *pdev, + void *arg); + +/** + * wlan_dfs_pdev_obj_destroy_notification() - DFS pdev object delete handler. + * @pdev: Pointer to DFS pdev object. + */ +QDF_STATUS wlan_dfs_pdev_obj_destroy_notification(struct wlan_objmgr_pdev *pdev, + void *arg); + +#endif /* _WLAN_DFS_INIT_DEINIT_API_H_ */ diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_lmac_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_lmac_api.h new file mode 100644 index 000000000000..2a9c031cc5cc --- /dev/null +++ b/umac/dfs/dispatcher/inc/wlan_dfs_lmac_api.h @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2016-2017 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 lmac/offload + * functions. + */ + +#ifndef _WLAN_DFS_LMAC_API_H_ +#define _WLAN_DFS_LMAC_API_H_ + +#include +#include + +/** + * lmac_get_caps() - Get DFS capabilities. + * @pdev: Pointer to PDEV structure. + * @ext_chan: Can radar be detected on the extension chan? + * @combined_rssi: Can use combined radar RSSI? + * @use_enhancement: This flag is used to indicate if radar + * detection scheme should use enhanced chirping + * detection algorithm. This flag also determines + * if certain radar data should be discarded to + * minimize false detection of radar. + * @strong_signal_diversiry: Strong Signal fast diversity count. + * @chip_is_bb_tlv: Chip is BB TLV? + * @chip_is_over_sampled: Is Over sampled. + * @chip_is_ht160: IS VHT160? + * @chip_is_false_detect: Is False detected? + * @fastdiv_val: Goes with wlan_strong_signal_diversiry: If we + * have fast diversity capability, read off + * Strong Signal fast diversity count set in the + * ini file, and store so we can restore the + * value when radar is disabled. + */ +void lmac_get_caps(struct wlan_objmgr_pdev *pdev, + bool *ext_chan, + bool *combined_rssi, + bool *use_enhancement, + bool *strong_signal_diversiry, + bool *chip_is_bb_tlv, + bool *chip_is_over_sampled, + bool *chip_is_ht160, + bool *chip_is_false_detect, + uint32_t *fastdiv_val); + +/** + * lmac_get_tsf64() - Get tsf64 value. + * @pdev: Pointer to PDEV structure. + * + * Return: tsf64 timer value. + */ +uint64_t lmac_get_tsf64(struct wlan_objmgr_pdev *pdev); + +/** + * lmac_dfs_disable() - Disable DFS. + * @pdev: Pointer to PDEV structure. + * @no_cac: no_cac flag. + */ +void lmac_dfs_disable(struct wlan_objmgr_pdev *pdev, int no_cac); + +/** + * lmac_get_dfsdomain() - Get DFS domain. + * @pdev: Pointer to PDEV structure. + */ +int lmac_get_dfsdomain(struct wlan_objmgr_pdev *pdev); + +/** + * lmac_dfs_enable() - Enable DFS. + * @pdev: Pointer to PDEV structure. + * @is_fastclk: fastclk value. + * @pe_firpwr: FIR pwr out threshold. + * @pe_rrssi: Radar rssi thresh. + * @pe_height: Pulse height thresh. + * @pe_prssi: Pulse rssi thresh. + * @pe_inband: Inband thresh. + * @pe_relpwr: Relative power threshold in 0.5dB steps. + * @pe_relstep: Pulse Relative step threshold in 0.5dB steps. + * @pe_maxlen: Max length of radar sign in 0.8us units. + * @dfsdomain: DFS domain. + */ +void lmac_dfs_enable(struct wlan_objmgr_pdev *pdev, + int *is_fastclk, + int32_t pe_firpwr, + int32_t pe_rrssi, + int32_t pe_height, + int32_t pe_prssi, + int32_t pe_inband, + uint32_t pe_relpwr, + uint32_t pe_relstep, + uint32_t pe_maxlen, + int dfsdomain); + +/** + * lmac_dfs_get_thresholds() - Get thresholds. + * @pdev: Pointer to PDEV structure. + * @pe_firpwr: FIR pwr out threshold. + * @pe_rrssi: Radar rssi thresh. + * @pe_height: Pulse height thresh. + * @pe_prssi: Pulse rssi thresh. + * @pe_inband: Inband thresh. + * @pe_relpwr: Relative power threshold in 0.5dB steps. + * @pe_relstep: Pulse Relative step threshold in 0.5dB steps. + * @pe_maxlen: Max length of radar sign in 0.8us units. + */ +void lmac_dfs_get_thresholds(struct wlan_objmgr_pdev *pdev, + int32_t *pe_firpwr, + int32_t *pe_rrssi, + int32_t *pe_height, + int32_t *pe_prssi, + int32_t *pe_inband, + uint32_t *pe_relpwr, + uint32_t *pe_relstep, + uint32_t *pe_maxlen); + +/** + * lmac_is_mode_offload() - Check the radio for offload. + * @pdev: Pointer to PDEV structure. + */ +bool lmac_is_mode_offload(struct wlan_objmgr_pdev *pdev); + +/** + * lmac_get_ah_devid() - Get ah devid. + * @pdev: Pointer to PDEV structure. + */ +uint16_t lmac_get_ah_devid(struct wlan_objmgr_pdev *pdev); + +/** + * lmac_get_ext_busy() - Get ext_busy. + * @pdev: Pointer to PDEV structure. + */ +uint32_t lmac_get_ext_busy(struct wlan_objmgr_pdev *pdev); + +/** + * lmac_is_countryCode_KOREA_ROC3() - Check is county code Korea. + * @pdev: Pointer to PDEV structure. + */ +bool lmac_is_countryCode_KOREA_ROC3(struct wlan_objmgr_pdev *pdev); + +/** + * lmac_set_use_cac_prssi() - Set use_cac_prssi value. + * @pdev: Pointer to PDEV structure. + */ +void lmac_set_use_cac_prssi(struct wlan_objmgr_pdev *pdev); + +/** + * lmac_get_target_type() - Get target type. + * @pdev: Pointer to PDEV structure. + */ +uint32_t lmac_get_target_type(struct wlan_objmgr_pdev *pdev); + +/** + * lmac_is_countryCode_CHINA() - Check is country code CHINA. + * @pdev: Pointer to PDEV structure. + */ +bool lmac_is_countryCode_CHINA(struct wlan_objmgr_pdev *pdev); + +/** + * lmac_get_phymode_info() - Get phymode info. + * @pdev: Pointer to PDEV structure. + */ +uint32_t lmac_get_phymode_info(struct wlan_objmgr_pdev *pdev, + uint32_t chan_mode); + +#endif /* _WLAN_DFS_LMAC_API_H_ */ diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_mlme_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_mlme_api.h new file mode 100644 index 000000000000..e3e0de7a4d7b --- /dev/null +++ b/umac/dfs/dispatcher/inc/wlan_dfs_mlme_api.h @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2016-2017 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_channel_mark_radar() - mark the channel as radar. + * @pdev: Pointer to DFS pdev object. + * @freq: Channel frequency + * @vhtop_ch_freq_seg2: VHT80 Cfreq2 + * @flags: channel flags. + */ +void dfs_mlme_channel_mark_radar(struct wlan_objmgr_pdev *pdev, + uint16_t freq, + uint8_t vhtop_ch_freq_seg2, + uint32_t flags); + +/** + * dfs_mlme_start_rcsa() - Send RCSA to RootAP. + * @pdev: Pointer to DFS pdev object. + */ +void dfs_mlme_start_rcsa(struct wlan_objmgr_pdev *pdev); + +/** + * 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. + */ +void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev, + uint8_t ieee, + uint16_t freq, + uint8_t vhtop_ch_freq_seg2, + uint32_t flags); + +/** + * dfs_mlme_start_csa() - Sends CSA in ieeeChan + * @pdev: Pointer to DFS pdev object. + * @ieeeChan: Channel number. + */ +void dfs_mlme_start_csa(struct wlan_objmgr_pdev *pdev, uint8_t ieeeChan); + +/** + * dfs_mlme_proc_cac() - Process the CAC completion event. + * @pdev: Pointer to DFS pdev object. + */ +void dfs_mlme_proc_cac(struct wlan_objmgr_pdev *pdev); + +/** + * dfs_mlme_deliver_event_up_afrer_cac() - Send a CAC timeout, VAP up event to + * userspace. + * @pdev: Pointer to DFS pdev object. + */ +void dfs_mlme_deliver_event_up_afrer_cac(struct wlan_objmgr_pdev *pdev); + +/** + * dfs_mlme_get_ic_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_ic_nchans(struct wlan_objmgr_pdev *pdev, int *nchans); + +/** + * dfs_mlme_get_ic_no_weather_radar_chan() - Checks is the channel is weather + * radar channel. + * @pdev: Pointer to DFS pdev object. + * @no_wradar: Pointer to save weather radar filter value. + */ +void dfs_mlme_get_ic_no_weather_radar_chan(struct wlan_objmgr_pdev *pdev, + uint8_t *no_wradar); + +/** + * dfs_mlme_find_alternate_mode_channel() - Finds the channel. + * @pdev: Pointer to DFS pdev object. + * @alt_chan_mode: Input mode. + * @chan_count: channel count. + */ +int dfs_mlme_find_alternate_mode_channel(struct wlan_objmgr_pdev *pdev, + uint32_t alt_chan_mode, + int chan_count); + +/** + * dfs_mlme_find_any_valid_channel() - Finds the channel with the given mode. + * @pdev: Pointer to DFS pdev object. + * @chan_mode: Channel mode. + * @ret_val: Pointer to save the channel index. + */ +void dfs_mlme_find_any_valid_channel(struct wlan_objmgr_pdev *pdev, + uint32_t chan_mode, + int *ret_val); + +/** + * dfs_mlme_get_extchan() - Get extension channel. + * @pdev: Pointer to DFS pdev object. + * @ic_freq: Frequency in Mhz. + * @ic_flags: Channel flags. + * @ic_flagext: Extended channel flags. + * @ic_ieee: IEEE channel number. + * @ic_vhtop_ch_freq_seg1: Channel Center frequency. + * @ic_vhtop_ch_freq_seg2: Channel Center frequency applicable for 80+80MHz + * mode of operation. + */ +void dfs_mlme_get_extchan(struct wlan_objmgr_pdev *pdev, + uint16_t *ic_freq, + uint32_t *ic_flags, + uint16_t *ic_flagext, + uint8_t *ic_ieee, + uint8_t *ic_vhtop_ch_freq_seg1, + uint8_t *ic_vhtop_ch_freq_seg2); + +/** + * 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, + int 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 + * @ic_freq: Frequency in Mhz. + * @ic_flags: Channel flags. + * @ic_flagext: Extended channel flags. + * @ic_ieee: IEEE channel number. + * @ic_vhtop_ch_freq_seg1: Channel Center frequency. + * @ic_vhtop_ch_freq_seg2: Channel Center frequency applicable for 80+80MHz + * mode of operation. + */ +void dfs_mlme_find_dot11_channel(struct wlan_objmgr_pdev *pdev, + uint8_t ieee, + uint8_t des_cfreq2, + int mode, + uint16_t *ic_freq, + uint32_t *ic_flags, + uint16_t *ic_flagext, + uint8_t *ic_ieee, + uint8_t *ic_vhtop_ch_freq_seg1, + uint8_t *ic_vhtop_ch_freq_seg2); + +/** + * dfs_mlme_get_ic_channels() - Get channel from channel list. + * @pdev: Pointer to DFS pdev object. + * @ic_freq: Frequency in Mhz. + * @ic_flags: Channel flags. + * @ic_flagext: Extended channel flags. + * @ic_ieee: IEEE channel number. + * @ic_vhtop_ch_freq_seg1: Channel Center frequency. + * @ic_vhtop_ch_freq_seg2: Channel Center frequency applicable for 80+80MHz + * mode of operation. + * @index: Index into channel list. + */ +void dfs_mlme_get_ic_channels(struct wlan_objmgr_pdev *pdev, + uint16_t *ic_freq, + uint32_t *ic_flags, + uint16_t *ic_flagext, + uint8_t *ic_ieee, + uint8_t *ic_vhtop_ch_freq_seg1, + uint8_t *ic_vhtop_ch_freq_seg2, + int index); + +/** + * dfs_mlme_ic_flags_ext() - Get extension channel flags. + * @pdev: Pointer to DFS pdev object. + */ +uint32_t dfs_mlme_ic_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. + * @ic_freq: Frequency in Mhz. + * @ic_vhtop_ch_freq_seg2: Channel Center frequency applicable for 80+80MHz + * mode of operation. + * @ic_flags: Channel flags. + */ +int dfs_mlme_get_cac_timeout(struct wlan_objmgr_pdev *pdev, + uint16_t ic_freq, + uint8_t ic_vhtop_ch_freq_seg2, + uint32_t ic_flags); + +#endif /* _WLAN_DFS_MLME_API_H_ */ diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h new file mode 100644 index 000000000000..09f89af02535 --- /dev/null +++ b/umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2016-2017 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: This file has the DFS dispatcher API which is exposed to outside of DFS + * component. + */ + +#ifndef _WLAN_DFS_TGT_API_H_ +#define _WLAN_DFS_TGT_API_H_ + +#include "wlan_dfs_ucfg_api.h" + +extern struct dfs_to_mlme global_dfs_to_mlme; + +/** + * tgt_dfs_set_current_channel() - Fill dfs channel structure from + * dfs_ieee80211_channel structure. + * @pdev: Pointer to DFS pdev object. + * @ic_freq: Frequency in Mhz. + * @ic_flags: Channel flags. + * @ic_flagext: Extended channel flags. + * @ic_ieee: IEEE channel number. + * @ic_vhtop_ch_freq_seg1: Channel Center frequency1. + * @ic_vhtop_ch_freq_seg2: Channel Center frequency2. + */ +QDF_STATUS tgt_dfs_set_current_channel(struct wlan_objmgr_pdev *pdev, + uint16_t ic_freq, + uint32_t ic_flags, + uint16_t ic_flagext, + uint8_t ic_ieee, + uint8_t ic_vhtop_ch_freq_seg1, + uint8_t ic_vhtop_ch_freq_seg2); + +/** + * tgt_dfs_reset() - DFS reset + * @pdev: Pointer to DFS pdev object. + * + * Wrapper function for dfs_reset(). This function called from outside of DFS + * component. + */ +QDF_STATUS tgt_dfs_reset(struct wlan_objmgr_pdev *pdev); + +/** + * tgt_dfs_get_radars() - Based on the chipset, calls init radar table functions + * @pdev: Pointer to DFS pdev object. + * + * Wrapper function for dfs_get_radars(). This function called from + * outside of DFS component. + */ +QDF_STATUS tgt_dfs_get_radars(struct wlan_objmgr_pdev *pdev); + +/** + * tgt_dfs_process_phyerr() - Process phyerr. + * @pdev: Pointer to DFS pdev object. + * @buf: Phyerr buffer. + * @datalen: phyerr buffer length. + * @r_rssi: RSSI. + * @r_ext_rssi: Extension channel RSSI. + * @r_rs_tstamp: Timestamp. + * @r_fulltsf: TSF64. + * + * Wrapper function for dfs_process_phyerr(). This function called from + * outside of DFS component. + */ +QDF_STATUS tgt_dfs_process_phyerr(struct wlan_objmgr_pdev *pdev, + void *buf, + uint16_t datalen, + uint8_t r_rssi, + uint8_t r_ext_rssi, + uint32_t r_rs_tstamp, + uint64_t r_fulltsf); + +/** + * tgt_dfs_destroy_object() - Destroys the DFS object. + * @pdev: Pointer to DFS pdev object. + * + * Wrapper function for dfs_destroy_object(). This function called from + * outside of DFS component. + */ +QDF_STATUS tgt_dfs_destroy_object(struct wlan_objmgr_pdev *pdev); + +/** + * tgt_dfs_radar_enable() - Enables the radar. + * @pdev: Pointer to DFS pdev object. + * @no_cac: If no_cac is 0, it cancels the CAC. + * + * This is called each time a channel change occurs, to (potentially) enable + * the radar code. + */ +QDF_STATUS tgt_dfs_radar_enable(struct wlan_objmgr_pdev *pdev, + int no_cac, uint32_t opmode); + +/** + * tgt_dfs_attach() - Allocates memory for wlan_dfs members. + * @pdev: Pointer to DFS pdev object. + * + * Wrapper function for dfs_attach(). This function called from + * outside of DFS component. + */ +QDF_STATUS tgt_dfs_attach(struct wlan_objmgr_pdev *pdev); + +/** + * tgt_sif_dfs_detach() - DFS detach. + * @pdev: Pointer to DFS pdev object. + * + * Wrapper function for sif_dfs_attach(). This function called from + * outside of DFS component. + */ +QDF_STATUS tgt_sif_dfs_detach(struct wlan_objmgr_pdev *pdev); + +/** + * tgt_dfs_control()- Used to process ioctls related to DFS. + * @pdev: Pointer to DFS pdev object. + * @id: Command type. + * @indata: Input buffer. + * @insize: size of the input buffer. + * @outdata: A buffer for the results. + * @outsize: Size of the output buffer. + */ +QDF_STATUS tgt_dfs_control(struct wlan_objmgr_pdev *pdev, + u_int id, + void *indata, + uint32_t insize, + void *outdata, + uint32_t *outsize, + int *error); + +/** + * tgt_nif_dfs_reset() - DFS reset. + * @pdev: Pointer to DFS pdev object. + * + * Wrapper function for nif_dfs_reset(). This function called from + * outside of DFS component. + */ +QDF_STATUS tgt_nif_dfs_reset(struct wlan_objmgr_pdev *pdev); + +/** + * tgt_dfs_is_precac_timer_running() - Check whether precac timer is running. + * @pdev: Pointer to DFS pdev object. + * @is_precac_timer_running: Pointer to save precac timer value. + * + * Wrapper function for dfs_is_precac_timer_running(). This function called from + * outside of DFS component. + */ +QDF_STATUS tgt_dfs_is_precac_timer_running(struct wlan_objmgr_pdev *pdev, + bool *is_precac_timer_running); + +/** + * utils_dfs_find_vht80_chan_for_precac() - Find VHT80 channel for precac. + * @pdev: Pointer to DFS pdev object. + * @chan_mode: Channel mode. + * @ch_freq_seg1: Segment1 channel freq. + * @cfreq1: cfreq1. + * @cfreq2: cfreq2. + * @phy_mode: Precac phymode. + * @dfs_set_cfreq2: Precac cfreq2 + * @set_agile: Agile mode flag. + * + * wrapper function for dfs_find_vht80_chan_for_precacdfs_cancel_cac_timer(). + * This function called from outside of dfs component. + */ +QDF_STATUS tgt_dfs_find_vht80_chan_for_precac(struct wlan_objmgr_pdev *pdev, + uint32_t chan_mode, + uint8_t ch_freq_seg1, + uint32_t *cfreq1, + uint32_t *cfreq2, + uint32_t *phy_mode, + bool *dfs_set_cfreq2, + bool *set_agile); + +#endif /* _WLAN_DFS_TGT_API_H_ */ diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h new file mode 100644 index 000000000000..e91d79a754c5 --- /dev/null +++ b/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h @@ -0,0 +1,249 @@ +/* + * Copyright (c) 2016-2017 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: This file has the DFS dispatcher API which is exposed to outside of DFS + * component. + */ + +#ifndef _WLAN_DFS_UCFG_API_H_ +#define _WLAN_DFS_UCFG_API_H_ + +#include +#include + +/** + * struct dfs_to_mlme - These are MLME function pointer used by DFS component. + * @pdev_component_obj_attach: Attach DFS object to PDEV. + * @pdev_component_obj_detach: Detach DFS object from PDEV. + * @pdev_get_comp_private_obj: Get DFS object from PDEV. + * @dfs_channel_mark_radar: Mark the channel as RADAR. + * @dfs_start_rcsa: Send RCSA to RootAP. + * @mlme_mark_dfs: Calls dfs_action function. + * @mlme_start_csa: Sends CSA. + * @mlme_proc_cac: Process the CAC completion event. + * @mlme_deliver_event_up_afrer_cac: Send a CAC timeout, VAP up event to user + * space + * @mlme_get_ic_nchans: Get number of channels in the channel + * list. + * @mlme_get_ic_no_weather_radar_chan: Checks is the channel is weather radar + * channel. + * @mlme_find_alternate_mode_channel: Finds the channel. + * @mlme_find_any_valid_channel: Find the valid channeil. + * @mlme_get_extchan: Gets the extension channel. + * @mlme_set_no_chans_available: Sets no_chans_available flag. + * @mlme_ieee2mhz: Gets Channel freq from ieee number. + * @mlme_find_dot11_channel: Find dot11 channel. + * @mlme_get_ic_channels: Get the channel list. + * @mlme_ic_flags_ext: Gets channel extension flag. + * @mlme_channel_change_by_precac: Channel change triggered by PreCAC. + * @mlme_nol_timeout_notification: NOL timeout notification. + * @mlme_clist_update: Updates the channel list. + * @mlme_get_cac_timeout: Gets the CAC timeout. + */ +struct dfs_to_mlme { + QDF_STATUS (*pdev_component_obj_attach)(struct wlan_objmgr_pdev *pdev, + enum wlan_umac_comp_id id, + void *comp_priv_obj, + QDF_STATUS status); + QDF_STATUS (*pdev_component_obj_detach)(struct wlan_objmgr_pdev *pdev, + enum wlan_umac_comp_id id, + void *comp_priv_obj); + struct wlan_dfs *(*pdev_get_comp_private_obj)( + struct wlan_objmgr_pdev *pdev); + QDF_STATUS (*dfs_channel_mark_radar)(struct wlan_objmgr_pdev *pdev, + uint16_t freq, + uint8_t vhtop_ch_freq_seg2, + uint32_t flags); + QDF_STATUS (*dfs_start_rcsa)(struct wlan_objmgr_pdev *pdev); + QDF_STATUS (*mlme_mark_dfs)(struct wlan_objmgr_pdev *pdev, + uint8_t ieee, + uint16_t freq, + uint8_t vhtop_ch_freq_seg2, + uint32_t flags); + QDF_STATUS (*mlme_start_csa)(struct wlan_objmgr_pdev *pdev, + uint8_t ieeeChan); + QDF_STATUS (*mlme_proc_cac)(struct wlan_objmgr_pdev *pdev); + QDF_STATUS (*mlme_deliver_event_up_afrer_cac)( + struct wlan_objmgr_pdev *pdev); + QDF_STATUS (*mlme_get_ic_nchans)(struct wlan_objmgr_pdev *pdev, + int *nchans); + QDF_STATUS (*mlme_get_ic_no_weather_radar_chan)( + struct wlan_objmgr_pdev *pdev, + uint8_t *no_wradar); + QDF_STATUS (*mlme_find_alternate_mode_channel)( + struct wlan_objmgr_pdev *pdev, + uint32_t alt_chan_mode, + int chan_count, + int *ret_val); + QDF_STATUS (*mlme_find_any_valid_channel)( + struct wlan_objmgr_pdev *pdev, + uint32_t chan_mode, + int *ret_val); + QDF_STATUS (*mlme_get_extchan)(struct wlan_objmgr_pdev *pdev, + uint16_t *ic_freq, + uint32_t *ic_flags, + uint16_t *ic_flagext, + uint8_t *ic_ieee, + uint8_t *ic_vhtop_ch_freq_seg1, + uint8_t *ic_vhtop_ch_freq_seg2); + QDF_STATUS (*mlme_set_no_chans_available)(struct wlan_objmgr_pdev *pdev, + int val); + QDF_STATUS (*mlme_ieee2mhz)(struct wlan_objmgr_pdev *pdev, + int ieee, + int flag, + int *freq); + QDF_STATUS (*mlme_find_dot11_channel)(struct wlan_objmgr_pdev *pdev, + uint8_t ieee, + uint8_t des_cfreq2, + int mode, + uint16_t *ic_freq, + uint32_t *ic_flags, + uint16_t *ic_flagext, + uint8_t *ic_ieee, + uint8_t *ic_vhtop_ch_freq_seg1, + uint8_t *ic_vhtop_ch_freq_seg2); + + QDF_STATUS (*mlme_get_ic_channels)(struct wlan_objmgr_pdev *pdev, + uint16_t *ic_freq, + uint32_t *ic_flags, + uint16_t *ic_flagext, + uint8_t *ic_ieee, + uint8_t *ic_vhtop_ch_freq_seg1, + uint8_t *ic_vhtop_ch_freq_seg2, + int index); + QDF_STATUS (*mlme_ic_flags_ext)(struct wlan_objmgr_pdev *pdev, + uint32_t *flag_ext); + QDF_STATUS (*mlme_channel_change_by_precac)( + struct wlan_objmgr_pdev *pdev); + QDF_STATUS (*mlme_nol_timeout_notification)( + struct wlan_objmgr_pdev *pdev); + QDF_STATUS (*mlme_clist_update)(struct wlan_objmgr_pdev *pdev, + void *nollist, + int nentries); + QDF_STATUS (*mlme_get_cac_timeout)(struct wlan_objmgr_pdev *pdev, + uint16_t ic_freq, + uint8_t c_vhtop_ch_freq_seg2, + uint32_t ic_flags, + int *cac_timeout); +}; + +extern struct dfs_to_mlme global_dfs_to_mlme; + +/** + * wlan_dfs_pdev_obj_create_notification() - DFS pdev object create handler. + * @pdev: Pointer to DFS pdev object. + */ +QDF_STATUS wlan_dfs_pdev_obj_create_notification(struct wlan_objmgr_pdev *pdev, + void *arg); + +/** + * wlan_dfs_pdev_obj_destroy_notification() - DFS pdev object delete handler. + * @pdev: Pointer to DFS pdev object. + */ +QDF_STATUS wlan_dfs_pdev_obj_destroy_notification(struct wlan_objmgr_pdev *pdev, + void *arg); + +/** + * ucfg_dfs_is_ap_cac_timer_running() - Returns the dfs cac timer. + * @pdev: Pointer to DFS pdev object. + * @is_ap_cac_timer_running: Pointer to save dfs_cac_timer_running value. + * + * Wrapper function for dfs_is_ap_cac_timer_running(). + * This function called from outside of dfs component. + */ +QDF_STATUS ucfg_dfs_is_ap_cac_timer_running(struct wlan_objmgr_pdev *pdev, + int *is_ap_cac_timer_running); + +/** + * ucfg_dfs_getnol() - Wrapper function for dfs_get_nol() + * @pdev: Pointer to DFS pdev object. + * @dfs_nolinfo: Pointer to dfsreq_nolinfo structure. + * + * Wrapper function for dfs_getnol(). + * This function called from outside of dfs component. + */ +QDF_STATUS ucfg_dfs_getnol(struct wlan_objmgr_pdev *pdev, void *dfs_nolinfo); + +/** + * ucfg_dfs_override_cac_timeout() - Override the default CAC timeout. + * @pdev: Pointer to DFS pdev object. + * @cac_timeout: CAC timeout value. + * + * Wrapper function for dfs_override_cac_timeout(). + * This function called from outside of dfs component. + */ +QDF_STATUS ucfg_dfs_override_cac_timeout(struct wlan_objmgr_pdev *pdev, + int cac_timeout, int *status); + +/** + * ucfg_dfs_get_override_cac_timeout() - Get override CAC timeout value. + * @pdev: Pointer to DFS pdev object. + * @cac_timeout: Pointer to save the CAC timeout value. + * + * Wrapper function for dfs_get_override_cac_timeout(). + * This function called from outside of dfs component. + */ +QDF_STATUS ucfg_dfs_get_override_cac_timeout(struct wlan_objmgr_pdev *pdev, + int *cac_timeout, int *status); + +/** + * ucfg_dfs_get_override_precac_timeout() - Get precac timeout. + * @pdev: Pointer to DFS pdev object. + * @precac_timeout: Get precac timeout value in this variable. + * + * Wrapper function for dfs_get_override_precac_timeout(). + * This function called from outside of dfs component. + */ +QDF_STATUS ucfg_dfs_get_override_precac_timeout(struct wlan_objmgr_pdev *pdev, + int *precac_timeout); + +/** + * ucfg_dfs_override_precac_timeout() - Override the default precac timeout. + * @pdev: Pointer to DFS pdev object. + * @precac_timeout: Precac timeout value. + * + * Wrapper function for dfs_override_precac_timeout(). + * This function called from outside of dfs component. + */ +QDF_STATUS ucfg_dfs_override_precac_timeout(struct wlan_objmgr_pdev *pdev, + int precac_timeout); + +/** + * ucfg_dfs_set_precac_enable() - Set precac enable flag. + * @pdev: Pointer to DFS pdev object. + * @value: input value for dfs_precac_enable flag. + * + * Wrapper function for dfs_set_precac_enable(). + * This function called from outside of dfs component. + */ +QDF_STATUS ucfg_dfs_set_precac_enable(struct wlan_objmgr_pdev *pdev, + uint32_t value); + +/** + * ucfg_dfs_get_precac_enable() - Get precac enable flag. + * @pdev: Pointer to DFS pdev object. + * @buff: Pointer to save precac_enable value. + * + * Wrapper function for dfs_get_precac_enable(). + * This function called from outside of dfs component. + */ +QDF_STATUS ucfg_dfs_get_precac_enable(struct wlan_objmgr_pdev *pdev, int *buff); + +#endif /* _WLAN_DFS_UCFG_API_H_ */ diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h new file mode 100644 index 000000000000..c1805469c6af --- /dev/null +++ b/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h @@ -0,0 +1,287 @@ +/* + * Copyright (c) 2016-2017 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: This file has the DFS dispatcher API which is exposed to outside of DFS + * component. + */ + +#ifndef _WLAN_DFS_UTILS_API_H_ +#define _WLAN_DFS_UTILS_API_H_ + +#include "wlan_dfs_ucfg_api.h" + +extern struct dfs_to_mlme global_dfs_to_mlme; + +/** + * utils_nif_dfs_attach() - DFS attach function. + * @pdev: Pointer to DFS pdev object. + * + * Wrapper function for nif_dfs_attach(). This function called from outside of + * DFS component. + */ +QDF_STATUS utils_nif_dfs_attach(struct wlan_objmgr_pdev *pdev); + +/** + * utils_nif_dfs_detach() - DFS detach + * @pdev: Pointer to DFS pdev object. + * + * Wrapper function for nif_dfs_detach(). This function called from outside of + * DFS component. + */ +QDF_STATUS utils_nif_dfs_detach(struct wlan_objmgr_pdev *pdev); + +/** + * utils_dfs_cac_valid_reset() - Cancels the dfs_cac_valid_timer timer. + * @pdev: Pointer to DFS pdev object. + * @prevchan_ieee: Prevchan number. + * @prevchan_flags: Prevchan flags. + * + * Wrapper function for dfs_cac_valid_reset(). This function called from + * outside of DFS component. + */ + +QDF_STATUS utils_dfs_cac_valid_reset(struct wlan_objmgr_pdev *pdev, + uint8_t prevchan_ieee, + uint32_t prevchan_flags); + +/** + * utils_dfs_reset_precaclists() - Clears and initiakizes precac_required_list, + * precac_done_list and precac_nol_list. + * @pdev: Pointer to DFS pdev object. + * + * Wrapper function for dfs_reset_precaclists(). This function called from + * outside of DFS component. + */ +QDF_STATUS utils_dfs_reset_precaclists(struct wlan_objmgr_pdev *pdev); + +/** + * utils_dfs_cancel_precac_timer() - Cancel the precac timer. + * @pdev: Pointer to DFS pdev object. + * + * wrapper function for dfs_cancel_precac_timer(). this function called from + * outside of dfs component. + */ +QDF_STATUS utils_dfs_cancel_precac_timer(struct wlan_objmgr_pdev *pdev); + +/** + * utils_dfs_is_precac_done() - Is precac done. + * @pdev: Pointer to DFS pdev object. + * + * wrapper function for dfs_is_precac_done(). this + * function called from outside of dfs component. + */ +QDF_STATUS utils_dfs_is_precac_done(struct wlan_objmgr_pdev *pdev, + bool *is_precac_done); + +/** + * utils_dfs_cancel_cac_timer() - Cancels the CAC timer. + * @pdev: Pointer to DFS pdev object. + * + * wrapper function for dfs_cancel_cac_timer(). this + * function called from outside of dfs component. + */ +QDF_STATUS utils_dfs_cancel_cac_timer(struct wlan_objmgr_pdev *pdev); + +/** + * utils_dfs_start_cac_timer() - Starts the CAC timer. + * @pdev: Pointer to DFS pdev object. + * + * wrapper function for dfs_start_cac_timer(). this + * function called from outside of dfs component. + */ +QDF_STATUS utils_dfs_start_cac_timer(struct wlan_objmgr_pdev *pdev); + +/** + * utils_dfs_cac_stop() - Clear the AP CAC timer. + * @pdev: Pointer to DFS pdev object. + * + * wrapper function for dfs_cac_stop(). this + * function called from outside of dfs component. + */ +QDF_STATUS utils_dfs_cac_stop(struct wlan_objmgr_pdev *pdev); + +/** + * utils_dfs_stacac_stop() - Clear the STA CAC timer. + * @pdev: Pointer to DFS pdev object. + * + * wrapper function for dfs_stacac_stop(). this + * function called from outside of dfs component. + */ +QDF_STATUS utils_dfs_stacac_stop(struct wlan_objmgr_pdev *pdev); + +/** + * utils_dfs_random_channel() - Function to choose the random channel from the + * current channel list. + * @pdev: Pointer to DFS pdev object. + * @is_select_nondfs: Select NON-DFS chan or both NON-DFS and DFS. + * @skip_curchan: Select the next channel post radar detecr and skip the + * curchan. + * @target_channel: Pointer to target_channel. + * + * wrapper function for dfs_random_channel(). this + * function called from outside of dfs component. + */ +QDF_STATUS utils_dfs_random_channel(struct wlan_objmgr_pdev *pdev, + uint8_t is_select_nondfs, + uint8_t skip_curchan, + int *target_channel); + +/** + * utils_dfs_get_usenol() - Returns use_nol flag. + * @pdev: Pointer to DFS pdev object. + * @usenol: Pointer to usenol value. + * + * wrapper function for dfs_get_usenol(). this + * function called from outside of dfs component. + */ +QDF_STATUS utils_dfs_get_usenol(struct wlan_objmgr_pdev *pdev, + uint16_t *usenol); + +/** + * utils_dfs_radar_disable() - Disables the radar. + * @pdev: Pointer to DFS pdev object. + * + * wrapper function for dfs_radar_disable(). this + * function called from outside of dfs component. + */ +QDF_STATUS utils_dfs_radar_disable(struct wlan_objmgr_pdev *pdev); + +/** + * utils_dfs_set_update_nol_flag() - Sets update_nol flag. + * @pdev: Pointer to DFS pdev object. + * @val: update_nol flag. + * + * wrapper function for dfs_set_update_nol_flag(). this + * function called from outside of dfs component. + */ +QDF_STATUS utils_dfs_set_update_nol_flag(struct wlan_objmgr_pdev *pdev, + bool val); + +/** + * utils_dfs_get_update_nol_flag() - Returns update_nol flag. + * @pdev: Pointer to DFS pdev object. + * @nol_flag: Fill nol_flag in this variable. + * + * wrapper function for dfs_get_update_nol_flag(). this + * function called from outside of dfs component. + */ +QDF_STATUS utils_dfs_get_update_nol_flag(struct wlan_objmgr_pdev *pdev, + bool *nol_flag); + +/** + * utils_dfs_get_rn_use_nol() - Get usenol. + * @pdev: Pointer to DFS pdev object. + * @rn_use_nol: Pointer to rn_use_nol. + * + * wrapper function for dfs_get_rn_use_nol(). this + * function called from outside of dfs component. + */ +QDF_STATUS utils_dfs_get_rn_use_nol(struct wlan_objmgr_pdev *pdev, + int *rn_use_nol); + +/** + * utils_dfs_get_nol_timeout() - Get NOL timeout. + * @pdev: Pointer to DFS pdev object. + * @dfs_nol_timeout: Pointer to dfs_nol_timeout. + * + * wrapper function for dfs_get_nol_timeout(). this + * function called from outside of dfs component. + */ +QDF_STATUS utils_dfs_get_nol_timeout(struct wlan_objmgr_pdev *pdev, + int *dfs_nol_timeout); + +/** + * utils_dfs_nol_addchan() - Add channel to NOL. + * @pdev: Pointer to DFS pdev object. + * @chan: channel t o add NOL. + * @dfs_nol_timeout: NOL timeout. + * + * wrapper function for dfs_nol_addchan(). this + * function called from outside of dfs component. + */ +QDF_STATUS utils_dfs_nol_addchan(struct wlan_objmgr_pdev *pdev, + uint16_t freq, + uint32_t dfs_nol_timeout); + +/** + * utils_dfs_nol_update() - NOL update + * @pdev: Pointer to DFS pdev object. + * + * wrapper function for dfs_nol_update(). this + * function called from outside of dfs component. + */ +QDF_STATUS utils_dfs_nol_update(struct wlan_objmgr_pdev *pdev); + +/** + * utils_dfs_second_segment_radar_disable() - Disables the second segment radar. + * @pdev: Pointer to DFS pdev object. + * + * This is called when AP detects the radar, to (potentially) disable + * the radar code. + */ +QDF_STATUS utils_dfs_second_segment_radar_disable( + struct wlan_objmgr_pdev *pdev); + +/** + * utils_dfs_is_ignore_dfs() - Get Ignore DFS value. + * @pdev: Pointer to DFS pdev object. + * @ignore_dfs: Fill ignore_dfs value in this variable. + */ +QDF_STATUS utils_dfs_is_ignore_dfs(struct wlan_objmgr_pdev *pdev, + bool *ignore_dfs); + +/** + * utils_dfs_is_cac_valid() - Gets the value of is_cac_valid. + * @pdev: Pointer to DFS pdev object. + * @is_cac_valid: Fill is_cac_valid in this variable. + */ +QDF_STATUS utils_dfs_is_cac_valid(struct wlan_objmgr_pdev *pdev, + bool *is_cac_valid); + +/** + * utils_dfs_is_ignore_cac() - Gets the value of is_ignore_cac. + * @pdev: Pointer to DFS pdev object. + * @ignore_cac: Fill ignore_cac value in this variable. + */ +QDF_STATUS utils_dfs_is_ignore_cac(struct wlan_objmgr_pdev *pdev, + bool *ignore_cac); + +/** + * utils_dfs_set_cac_timer_running() - Sets the cac timer running. + * @pdev: Pointer to DFS pdev object. + * @val: Set this value to dfs_cac_timer_running variable. + */ +QDF_STATUS utils_dfs_set_cac_timer_running(struct wlan_objmgr_pdev *pdev, + int val); + +/** + * utils_dfs_get_nol_chfreq_and_chwidth() - Sets the cac timer running. + * @pdev: Pointer to DFS pdev object. + * @nollist: Pointer to NOL channel entry. + * @nol_chfreq: Pointer to save channel frequency. + * @nol_chwidth: Pointer to save channel width. + * @index: Index into nol list. + */ +QDF_STATUS utils_dfs_get_nol_chfreq_and_chwidth(struct wlan_objmgr_pdev *pdev, + void *nollist, + uint32_t *nol_chfreq, + uint32_t *nol_chwidth, + int index); +#endif /* _WLAN_DFS_UTILS_API_H_ */ diff --git a/umac/dfs/dispatcher/src/wlan_dfs_init_deinit_api.c b/umac/dfs/dispatcher/src/wlan_dfs_init_deinit_api.c new file mode 100644 index 000000000000..4a6d5e3c95f4 --- /dev/null +++ b/umac/dfs/dispatcher/src/wlan_dfs_init_deinit_api.c @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2016-2017 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: This file init/deint functions for DFS module. + */ + +#include "wlan_dfs_ucfg_api.h" +#ifndef QCA_MCL_DFS_SUPPORT +#include "ieee80211_mlme_dfs_interface.h" +#endif +#include "wlan_objmgr_global_obj.h" +#include "wlan_dfs_init_deinit_api.h" +#include "../../core/src/dfs.h" + +struct dfs_to_mlme global_dfs_to_mlme; + +struct wlan_dfs *wlan_pdev_get_dfs_obj(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_dfs *dfs; + wlan_pdev_obj_lock(pdev); + dfs = wlan_objmgr_pdev_get_comp_private_obj(pdev, + WLAN_UMAC_COMP_DFS); + wlan_pdev_obj_unlock(pdev); + + return dfs; +} + +#ifndef QCA_MCL_DFS_SUPPORT +void register_dfs_callbacks(void) +{ + struct dfs_to_mlme *tmp_dfs_to_mlme = &global_dfs_to_mlme; + + tmp_dfs_to_mlme->pdev_component_obj_attach = + wlan_objmgr_pdev_component_obj_attach; + tmp_dfs_to_mlme->pdev_component_obj_detach = + wlan_objmgr_pdev_component_obj_detach; + tmp_dfs_to_mlme->pdev_get_comp_private_obj = + wlan_pdev_get_dfs_obj; + + tmp_dfs_to_mlme->dfs_channel_mark_radar = mlme_dfs_channel_mark_radar; + tmp_dfs_to_mlme->dfs_start_rcsa = mlme_dfs_start_rcsa; + tmp_dfs_to_mlme->mlme_mark_dfs = mlme_dfs_mark_dfs; + tmp_dfs_to_mlme->mlme_start_csa = mlme_dfs_start_csa; + tmp_dfs_to_mlme->mlme_proc_cac = mlme_dfs_proc_cac; + tmp_dfs_to_mlme->mlme_deliver_event_up_afrer_cac = + mlme_dfs_deliver_event_up_afrer_cac; + tmp_dfs_to_mlme->mlme_get_ic_nchans = mlme_dfs_get_ic_nchans; + tmp_dfs_to_mlme->mlme_get_ic_no_weather_radar_chan = + mlme_dfs_get_ic_no_weather_radar_chan; + tmp_dfs_to_mlme->mlme_find_alternate_mode_channel = + mlme_dfs_find_alternate_mode_channel; + tmp_dfs_to_mlme->mlme_find_any_valid_channel = + mlme_dfs_find_any_valid_channel; + tmp_dfs_to_mlme->mlme_get_extchan = mlme_dfs_get_extchan; + tmp_dfs_to_mlme->mlme_set_no_chans_available = + mlme_dfs_set_no_chans_available; + tmp_dfs_to_mlme->mlme_ieee2mhz = mlme_dfs_ieee2mhz; + tmp_dfs_to_mlme->mlme_find_dot11_channel = mlme_dfs_find_dot11_channel; + tmp_dfs_to_mlme->mlme_get_ic_channels = mlme_dfs_get_ic_channels; + tmp_dfs_to_mlme->mlme_ic_flags_ext = mlme_dfs_ic_flags_ext; + tmp_dfs_to_mlme->mlme_channel_change_by_precac = + mlme_dfs_channel_change_by_precac; + tmp_dfs_to_mlme->mlme_nol_timeout_notification = + mlme_dfs_nol_timeout_notification; + tmp_dfs_to_mlme->mlme_clist_update = mlme_dfs_clist_update; + tmp_dfs_to_mlme->mlme_get_cac_timeout = mlme_dfs_get_cac_timeout; +} +#else +void register_dfs_callbacks(void) +{ + struct dfs_to_mlme *tmp_dfs_to_mlme = &global_dfs_to_mlme; + + tmp_dfs_to_mlme->pdev_component_obj_attach = + wlan_objmgr_pdev_component_obj_attach; + tmp_dfs_to_mlme->pdev_component_obj_detach = + wlan_objmgr_pdev_component_obj_detach; + tmp_dfs_to_mlme->pdev_get_comp_private_obj = + wlan_pdev_get_dfs_obj; +} +#endif + +QDF_STATUS dfs_init(void) +{ + register_dfs_callbacks(); + + if (wlan_objmgr_register_pdev_create_handler(WLAN_UMAC_COMP_DFS, + wlan_dfs_pdev_obj_create_notification, + NULL) + != QDF_STATUS_SUCCESS) { + return QDF_STATUS_E_FAILURE; + } + if (wlan_objmgr_register_pdev_destroy_handler(WLAN_UMAC_COMP_DFS, + wlan_dfs_pdev_obj_destroy_notification, + NULL) + != QDF_STATUS_SUCCESS) { + return QDF_STATUS_E_FAILURE; + } + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS dfs_deinit(void) +{ + if (wlan_objmgr_unregister_pdev_create_handler(WLAN_UMAC_COMP_DFS, + wlan_dfs_pdev_obj_create_notification, + NULL) + != QDF_STATUS_SUCCESS) { + return QDF_STATUS_E_FAILURE; + } + if (wlan_objmgr_unregister_pdev_destroy_handler(WLAN_UMAC_COMP_DFS, + wlan_dfs_pdev_obj_destroy_notification, + NULL) + != QDF_STATUS_SUCCESS) { + return QDF_STATUS_E_FAILURE; + } + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS wlan_dfs_pdev_obj_create_notification(struct wlan_objmgr_pdev *pdev, + void *arg) +{ + struct wlan_dfs *dfs = NULL; + + if (pdev == NULL) { + DFS_PRINTK("%s:PDEV is NULL\n", __func__); + return QDF_STATUS_E_FAILURE; + } + + if (dfs_create_object(&dfs) == 1) { + DFS_PRINTK("%s : Failed to create DFS object\n", __func__); + return QDF_STATUS_E_FAILURE; + } + + global_dfs_to_mlme.pdev_component_obj_attach(pdev, + WLAN_UMAC_COMP_DFS, + (void *)dfs, + QDF_STATUS_SUCCESS); + dfs->dfs_pdev_obj = pdev; + + /* wlan_ar_ops are assigned to sc_wlan_ops in wlan_dev_attach. + * This function is called during module init. + * and wlan_dev_attach is called during wlan_attach. + * If we call dfs_attach here, seen crash in wlan_net80211_attach_dfs. + */ + if (dfs_attach(dfs) == 1) { + DFS_PRINTK("%s : dfs_attch failed\n", __func__); + dfs_destroy_object(dfs); + return QDF_STATUS_E_FAILURE; + } + + dfs_get_radars(dfs); + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS wlan_dfs_pdev_obj_destroy_notification(struct wlan_objmgr_pdev *pdev, + void *arg) +{ + struct wlan_dfs *dfs; + + if (pdev == NULL) { + DFS_PRINTK("%s:PDEV is NULL\n", __func__); + return QDF_STATUS_E_FAILURE; + } + + dfs = wlan_pdev_get_dfs_obj(pdev); + + /* DFS is NULL during unload. should we call this function before */ + if (dfs != NULL) { + global_dfs_to_mlme.pdev_component_obj_detach(pdev, + WLAN_UMAC_COMP_DFS, + (void *)dfs); + + dfs->dfs_pdev_obj = NULL; + dfs_destroy_object(dfs); + } + + return QDF_STATUS_SUCCESS; +} + diff --git a/umac/dfs/dispatcher/src/wlan_dfs_lmac_api.c b/umac/dfs/dispatcher/src/wlan_dfs_lmac_api.c new file mode 100644 index 000000000000..2899f2f3606e --- /dev/null +++ b/umac/dfs/dispatcher/src/wlan_dfs_lmac_api.c @@ -0,0 +1,306 @@ +/* + * Copyright (c) 2016-2017 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: Functions to call lmac/offload functions from DFS component. + */ + +#include "wlan_dfs_lmac_api.h" +#include "../../core/src/dfs_internal.h" + +void lmac_get_caps(struct wlan_objmgr_pdev *pdev, + bool *ext_chan, + bool *combined_rssi, + bool *use_enhancement, + bool *strong_signal_diversiry, + bool *chip_is_bb_tlv, + bool *chip_is_over_sampled, + bool *chip_is_ht160, + bool *chip_is_false_detect, + uint32_t *fastdiv_val) +{ + struct wlan_objmgr_psoc *psoc; + struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; + + wlan_pdev_obj_lock(pdev); + psoc = wlan_pdev_get_psoc(pdev); + wlan_pdev_obj_unlock(pdev); + + dfs_tx_ops = &psoc->soc_cb.tx_ops.dfs_tx_ops; + + dfs_tx_ops->dfs_get_caps(pdev, + ext_chan, + combined_rssi, + use_enhancement, + strong_signal_diversiry, + chip_is_bb_tlv, + chip_is_over_sampled, + chip_is_ht160, + chip_is_false_detect, + fastdiv_val); +} + +uint64_t lmac_get_tsf64(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_objmgr_psoc *psoc; + struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; + uint64_t tsf64 = 0; + + wlan_pdev_obj_lock(pdev); + psoc = wlan_pdev_get_psoc(pdev); + wlan_pdev_obj_unlock(pdev); + + dfs_tx_ops = &psoc->soc_cb.tx_ops.dfs_tx_ops; + + dfs_tx_ops->dfs_gettsf64(pdev, &tsf64); + + return tsf64; +} + +void lmac_dfs_disable(struct wlan_objmgr_pdev *pdev, int no_cac) +{ + struct wlan_objmgr_psoc *psoc; + struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; + + wlan_pdev_obj_lock(pdev); + psoc = wlan_pdev_get_psoc(pdev); + wlan_pdev_obj_unlock(pdev); + + dfs_tx_ops = &psoc->soc_cb.tx_ops.dfs_tx_ops; + + if (dfs_tx_ops->dfs_disable) + dfs_tx_ops->dfs_disable(pdev, no_cac); +} + +int lmac_get_dfsdomain(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_objmgr_psoc *psoc; + struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; + int dfsdomain = DFS_FCC_DOMAIN; + + wlan_pdev_obj_lock(pdev); + psoc = wlan_pdev_get_psoc(pdev); + wlan_pdev_obj_unlock(pdev); + + dfs_tx_ops = &psoc->soc_cb.tx_ops.dfs_tx_ops; + + dfs_tx_ops->dfs_get_dfsdomain(pdev, &dfsdomain); + + return dfsdomain; +} + +void lmac_dfs_enable(struct wlan_objmgr_pdev *pdev, + int *is_fastclk, + int32_t pe_firpwr, + int32_t pe_rrssi, + int32_t pe_height, + int32_t pe_prssi, + int32_t pe_inband, + uint32_t pe_relpwr, + uint32_t pe_relstep, + uint32_t pe_maxlen, + int dfsdomain) +{ + struct wlan_objmgr_psoc *psoc; + struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; + + wlan_pdev_obj_lock(pdev); + psoc = wlan_pdev_get_psoc(pdev); + wlan_pdev_obj_unlock(pdev); + + dfs_tx_ops = &psoc->soc_cb.tx_ops.dfs_tx_ops; + + dfs_tx_ops->dfs_enable(pdev, + is_fastclk, + pe_firpwr, + pe_rrssi, + pe_height, + pe_prssi, + pe_inband, + pe_relpwr, + pe_relstep, + pe_maxlen, + dfsdomain); +} + +void lmac_dfs_get_thresholds(struct wlan_objmgr_pdev *pdev, + int32_t *pe_firpwr, + int32_t *pe_rrssi, + int32_t *pe_height, + int32_t *pe_prssi, + int32_t *pe_inband, + uint32_t *pe_relpwr, + uint32_t *pe_relstep, + uint32_t *pe_maxlen) +{ + struct wlan_objmgr_psoc *psoc; + struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; + + wlan_pdev_obj_lock(pdev); + psoc = wlan_pdev_get_psoc(pdev); + wlan_pdev_obj_unlock(pdev); + + dfs_tx_ops = &psoc->soc_cb.tx_ops.dfs_tx_ops; + + dfs_tx_ops->dfs_get_thresholds(pdev, + pe_firpwr, + pe_rrssi, + pe_height, + pe_prssi, + pe_inband, + pe_relpwr, + pe_relstep, + pe_maxlen); +} + +bool lmac_is_mode_offload(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_objmgr_psoc *psoc; + struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; + bool is_offload = false; + + wlan_pdev_obj_lock(pdev); + psoc = wlan_pdev_get_psoc(pdev); + wlan_pdev_obj_unlock(pdev); + + dfs_tx_ops = &psoc->soc_cb.tx_ops.dfs_tx_ops; + + dfs_tx_ops->dfs_is_mode_offload(pdev, &is_offload); + + return is_offload; +} + +uint16_t lmac_get_ah_devid(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_objmgr_psoc *psoc; + struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; + uint16_t devid = 0; + + wlan_pdev_obj_lock(pdev); + psoc = wlan_pdev_get_psoc(pdev); + wlan_pdev_obj_unlock(pdev); + + dfs_tx_ops = &psoc->soc_cb.tx_ops.dfs_tx_ops; + + dfs_tx_ops->dfs_get_ah_devid(pdev, &devid); + + return devid; +} + +uint32_t lmac_get_ext_busy(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_objmgr_psoc *psoc; + struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; + uint32_t ext_chan_busy = 0; + + wlan_pdev_obj_lock(pdev); + psoc = wlan_pdev_get_psoc(pdev); + wlan_pdev_obj_unlock(pdev); + + dfs_tx_ops = &psoc->soc_cb.tx_ops.dfs_tx_ops; + + dfs_tx_ops->dfs_get_ext_busy(pdev, &ext_chan_busy); + + return ext_chan_busy; +} + +bool lmac_is_countryCode_KOREA_ROC3(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_objmgr_psoc *psoc; + struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; + bool ctry_korea = false; + + wlan_pdev_obj_lock(pdev); + psoc = wlan_pdev_get_psoc(pdev); + wlan_pdev_obj_unlock(pdev); + + dfs_tx_ops = &psoc->soc_cb.tx_ops.dfs_tx_ops; + + dfs_tx_ops->dfs_is_countryCode_KOREA_ROC3(pdev, + &ctry_korea); + + return ctry_korea; + +} + +void lmac_set_use_cac_prssi(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_objmgr_psoc *psoc; + struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; + + wlan_pdev_obj_lock(pdev); + psoc = wlan_pdev_get_psoc(pdev); + wlan_pdev_obj_unlock(pdev); + + dfs_tx_ops = &psoc->soc_cb.tx_ops.dfs_tx_ops; + + dfs_tx_ops->dfs_set_use_cac_prssi(pdev); +} + +uint32_t lmac_get_target_type(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_objmgr_psoc *psoc; + struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; + uint32_t target_type = 0; + + wlan_pdev_obj_lock(pdev); + psoc = wlan_pdev_get_psoc(pdev); + wlan_pdev_obj_unlock(pdev); + + dfs_tx_ops = &psoc->soc_cb.tx_ops.dfs_tx_ops; + + dfs_tx_ops->dfs_get_target_type(pdev, &target_type); + + return target_type; +} + +bool lmac_is_countryCode_CHINA(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_objmgr_psoc *psoc; + struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; + bool country_china = false; + + wlan_pdev_obj_lock(pdev); + psoc = wlan_pdev_get_psoc(pdev); + wlan_pdev_obj_unlock(pdev); + + dfs_tx_ops = &psoc->soc_cb.tx_ops.dfs_tx_ops; + + dfs_tx_ops->dfs_is_countryCode_CHINA(pdev, &country_china); + + return country_china; +} + +uint32_t lmac_get_phymode_info(struct wlan_objmgr_pdev *pdev, + uint32_t chan_mode) +{ + struct wlan_objmgr_psoc *psoc; + struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; + uint32_t mode_info = 0; + + wlan_pdev_obj_lock(pdev); + psoc = wlan_pdev_get_psoc(pdev); + wlan_pdev_obj_unlock(pdev); + + dfs_tx_ops = &psoc->soc_cb.tx_ops.dfs_tx_ops; + + dfs_tx_ops->dfs_get_phymode_info(pdev, chan_mode, &mode_info); + + return mode_info; +} diff --git a/umac/dfs/dispatcher/src/wlan_dfs_mlme_api.c b/umac/dfs/dispatcher/src/wlan_dfs_mlme_api.c new file mode 100644 index 000000000000..0457f7d49487 --- /dev/null +++ b/umac/dfs/dispatcher/src/wlan_dfs_mlme_api.c @@ -0,0 +1,254 @@ +/* + * Copyright (c) 2016-2017 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: Functions to call mlme functions from DFS component. + */ + +#include "wlan_dfs_mlme_api.h" + +void dfs_mlme_channel_mark_radar(struct wlan_objmgr_pdev *pdev, + uint16_t freq, + uint8_t vhtop_ch_freq_seg2, + uint32_t flags) +{ + if (global_dfs_to_mlme.dfs_channel_mark_radar != NULL) + global_dfs_to_mlme.dfs_channel_mark_radar(pdev, + freq, + vhtop_ch_freq_seg2, + flags); +} + +void dfs_mlme_start_rcsa(struct wlan_objmgr_pdev *pdev) +{ + if (global_dfs_to_mlme.dfs_start_rcsa != NULL) + global_dfs_to_mlme.dfs_start_rcsa(pdev); +} + +void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev, + uint8_t ieee, + uint16_t freq, + uint8_t vhtop_ch_freq_seg2, + uint32_t flags) +{ + if (global_dfs_to_mlme.mlme_mark_dfs != NULL) + global_dfs_to_mlme.mlme_mark_dfs(pdev, + ieee, + freq, + vhtop_ch_freq_seg2, + flags); +} + +void dfs_mlme_start_csa(struct wlan_objmgr_pdev *pdev, + uint8_t ieeeChan) +{ + if (global_dfs_to_mlme.mlme_start_csa != NULL) + global_dfs_to_mlme.mlme_start_csa(pdev, ieeeChan); +} + +void dfs_mlme_proc_cac(struct wlan_objmgr_pdev *pdev) +{ + if (global_dfs_to_mlme.mlme_proc_cac != NULL) + global_dfs_to_mlme.mlme_proc_cac(pdev); +} + +void dfs_mlme_deliver_event_up_afrer_cac(struct wlan_objmgr_pdev *pdev) +{ + if (global_dfs_to_mlme.mlme_deliver_event_up_afrer_cac != NULL) + global_dfs_to_mlme.mlme_deliver_event_up_afrer_cac( + pdev); +} + +void dfs_mlme_get_ic_nchans(struct wlan_objmgr_pdev *pdev, + int *nchans) +{ + if (global_dfs_to_mlme.mlme_get_ic_nchans != NULL) + global_dfs_to_mlme.mlme_get_ic_nchans(pdev, + nchans); +} + +void dfs_mlme_get_ic_no_weather_radar_chan(struct wlan_objmgr_pdev *pdev, + uint8_t *no_wradar) +{ + if (global_dfs_to_mlme.mlme_get_ic_no_weather_radar_chan != NULL) + global_dfs_to_mlme.mlme_get_ic_no_weather_radar_chan( + pdev, + no_wradar); +} + +int dfs_mlme_find_alternate_mode_channel(struct wlan_objmgr_pdev *pdev, + uint32_t alt_chan_mode, + int chan_count) +{ + int ret_val = 0; + + if (global_dfs_to_mlme.mlme_find_alternate_mode_channel != NULL) + global_dfs_to_mlme.mlme_find_alternate_mode_channel( + pdev, + alt_chan_mode, chan_count, &ret_val); + + return ret_val; +} + +void dfs_mlme_find_any_valid_channel(struct wlan_objmgr_pdev *pdev, + uint32_t chan_mode, + int *ret_val) +{ + if (global_dfs_to_mlme.mlme_find_any_valid_channel != NULL) + global_dfs_to_mlme.mlme_find_any_valid_channel( + pdev, + chan_mode, + ret_val); +} + +void dfs_mlme_get_extchan(struct wlan_objmgr_pdev *pdev, + uint16_t *ic_freq, + uint32_t *ic_flags, + uint16_t *ic_flagext, + uint8_t *ic_ieee, + uint8_t *ic_vhtop_ch_freq_seg1, + uint8_t *ic_vhtop_ch_freq_seg2) +{ + if (global_dfs_to_mlme.mlme_get_extchan != NULL) + global_dfs_to_mlme.mlme_get_extchan(pdev, + ic_freq, + ic_flags, + ic_flagext, + ic_ieee, + ic_vhtop_ch_freq_seg1, + ic_vhtop_ch_freq_seg2); +} + +void dfs_mlme_set_no_chans_available(struct wlan_objmgr_pdev *pdev, + int val) +{ + if (global_dfs_to_mlme.mlme_set_no_chans_available != NULL) + global_dfs_to_mlme.mlme_set_no_chans_available( + pdev, + val); +} + +int dfs_mlme_ieee2mhz(struct wlan_objmgr_pdev *pdev, int ieee, int flag) +{ + int freq = 0; + + if (global_dfs_to_mlme.mlme_ieee2mhz != NULL) + global_dfs_to_mlme.mlme_ieee2mhz(pdev, + ieee, + flag, + &freq); + + return freq; +} + +void dfs_mlme_find_dot11_channel(struct wlan_objmgr_pdev *pdev, + uint8_t ieee, + uint8_t des_cfreq2, + int mode, + uint16_t *ic_freq, + uint32_t *ic_flags, + uint16_t *ic_flagext, + uint8_t *ic_ieee, + uint8_t *ic_vhtop_ch_freq_seg1, + uint8_t *ic_vhtop_ch_freq_seg2) +{ + if (global_dfs_to_mlme.mlme_find_dot11_channel != NULL) + global_dfs_to_mlme.mlme_find_dot11_channel(pdev, + ieee, + des_cfreq2, + mode, + ic_freq, + ic_flags, + ic_flagext, + ic_ieee, + ic_vhtop_ch_freq_seg1, + ic_vhtop_ch_freq_seg2); +} + +void dfs_mlme_get_ic_channels(struct wlan_objmgr_pdev *pdev, + uint16_t *ic_freq, + uint32_t *ic_flags, + uint16_t *ic_flagext, + uint8_t *ic_ieee, + uint8_t *ic_vhtop_ch_freq_seg1, + uint8_t *ic_vhtop_ch_freq_seg2, + int index) +{ + if (global_dfs_to_mlme.mlme_get_ic_channels != NULL) + global_dfs_to_mlme.mlme_get_ic_channels(pdev, + ic_freq, + ic_flags, + ic_flagext, + ic_ieee, + ic_vhtop_ch_freq_seg1, + ic_vhtop_ch_freq_seg2, + index); +} + +uint32_t dfs_mlme_ic_flags_ext(struct wlan_objmgr_pdev *pdev) +{ + uint32_t flag_ext = 0; + + if (global_dfs_to_mlme.mlme_ic_flags_ext != NULL) + global_dfs_to_mlme.mlme_ic_flags_ext(pdev, + &flag_ext); + + return flag_ext; +} + +void dfs_mlme_channel_change_by_precac(struct wlan_objmgr_pdev *pdev) +{ + if (global_dfs_to_mlme.mlme_channel_change_by_precac != NULL) + global_dfs_to_mlme.mlme_channel_change_by_precac( + pdev); +} + +void dfs_mlme_nol_timeout_notification(struct wlan_objmgr_pdev *pdev) +{ + if (global_dfs_to_mlme.mlme_nol_timeout_notification != NULL) + global_dfs_to_mlme.mlme_nol_timeout_notification( + pdev); +} + +void dfs_mlme_clist_update(struct wlan_objmgr_pdev *pdev, + void *nollist, + int nentries) +{ + if (global_dfs_to_mlme.mlme_clist_update != NULL) + global_dfs_to_mlme.mlme_clist_update(pdev, + nollist, + nentries); +} + +int dfs_mlme_get_cac_timeout(struct wlan_objmgr_pdev *pdev, + uint16_t ic_freq, + uint8_t ic_vhtop_ch_freq_seg2, + uint32_t ic_flags) +{ + int cac_timeout = 0; + + if (global_dfs_to_mlme.mlme_get_cac_timeout != NULL) + global_dfs_to_mlme.mlme_get_cac_timeout(pdev, + ic_freq, + ic_vhtop_ch_freq_seg2, + ic_flags, + &cac_timeout); + + return cac_timeout; +} diff --git a/umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c b/umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c new file mode 100644 index 000000000000..a63be5338587 --- /dev/null +++ b/umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c @@ -0,0 +1,226 @@ +/* + * Copyright (c) 2016-2017 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: This file has the DFS dispatcher API implementation which is exposed + * to outside of DFS component. + */ +#include "wlan_dfs_tgt_api.h" +#include "../../core/src/dfs.h" +#include "../../core/src/dfs_zero_cac.h" + +QDF_STATUS tgt_dfs_set_current_channel(struct wlan_objmgr_pdev *pdev, + uint16_t ic_freq, + uint32_t ic_flags, + uint16_t ic_flagext, + uint8_t ic_ieee, + uint8_t ic_vhtop_ch_freq_seg1, + uint8_t ic_vhtop_ch_freq_seg2) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_set_current_channel(dfs, ic_freq, ic_flags, ic_flagext, ic_ieee, + ic_vhtop_ch_freq_seg1, ic_vhtop_ch_freq_seg2); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(tgt_dfs_set_current_channel); + +QDF_STATUS tgt_dfs_reset(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_reset(dfs); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(tgt_dfs_reset); + +QDF_STATUS tgt_dfs_radar_enable(struct wlan_objmgr_pdev *pdev, + int no_cac, uint32_t opmode) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_radar_enable(dfs, no_cac, opmode); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(tgt_dfs_radar_enable); + +QDF_STATUS tgt_dfs_process_phyerr(struct wlan_objmgr_pdev *pdev, + void *buf, + uint16_t datalen, + uint8_t r_rssi, + uint8_t r_ext_rssi, + uint32_t r_rs_tstamp, + uint64_t r_fulltsf) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_process_phyerr(dfs, buf, datalen, r_rssi, r_ext_rssi, r_rs_tstamp, + r_fulltsf); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(tgt_dfs_process_phyerr); + +QDF_STATUS tgt_dfs_is_precac_timer_running(struct wlan_objmgr_pdev *pdev, + bool *is_precac_timer_running) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + *is_precac_timer_running = dfs_is_precac_timer_running(dfs); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(tgt_dfs_is_precac_timer_running); + +QDF_STATUS tgt_dfs_get_radars(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_get_radars(dfs); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(tgt_dfs_get_radars); + +QDF_STATUS tgt_dfs_attach(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + return dfs_attach(dfs); +} +EXPORT_SYMBOL(tgt_dfs_attach); + +QDF_STATUS tgt_dfs_destroy_object(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_destroy_object(dfs); + dfs = NULL; + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(tgt_dfs_destroy_object); + +QDF_STATUS tgt_nif_dfs_reset(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + nif_dfs_reset(dfs); + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(tgt_nif_dfs_reset); + +QDF_STATUS tgt_sif_dfs_detach(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + sif_dfs_detach(dfs); + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS tgt_dfs_control(struct wlan_objmgr_pdev *pdev, + u_int id, + void *indata, + uint32_t insize, + void *outdata, + uint32_t *outsize, + int *error) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + *error = dfs_control(dfs, id, indata, insize, outdata, outsize); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(tgt_dfs_control); + +QDF_STATUS tgt_dfs_find_vht80_chan_for_precac(struct wlan_objmgr_pdev *pdev, + uint32_t chan_mode, + uint8_t ch_freq_seg1, + uint32_t *cfreq1, + uint32_t *cfreq2, + uint32_t *phy_mode, + bool *dfs_set_cfreq2, + bool *set_agile) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_find_vht80_chan_for_precac(dfs, + chan_mode, + ch_freq_seg1, + cfreq1, + cfreq2, + phy_mode, + dfs_set_cfreq2, + set_agile); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(tgt_dfs_find_vht80_chan_for_precac); diff --git a/umac/dfs/dispatcher/src/wlan_dfs_ucfg_api.c b/umac/dfs/dispatcher/src/wlan_dfs_ucfg_api.c new file mode 100644 index 000000000000..75ff5cd7ac29 --- /dev/null +++ b/umac/dfs/dispatcher/src/wlan_dfs_ucfg_api.c @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2016-2017 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: This file has the DFS dispatcher API implementation which is exposed + * to outside of DFS component. + */ + +#include "wlan_dfs_ucfg_api.h" +#include "../../core/src/dfs.h" +#include "../../core/src/dfs_zero_cac.h" + +QDF_STATUS ucfg_dfs_is_ap_cac_timer_running(struct wlan_objmgr_pdev *pdev, + int *is_ap_cac_timer_running) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + *is_ap_cac_timer_running = dfs_is_ap_cac_timer_running(dfs); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(ucfg_dfs_is_ap_cac_timer_running); + +QDF_STATUS ucfg_dfs_getnol(struct wlan_objmgr_pdev *pdev, + void *dfs_nolinfo) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_getnol(dfs, dfs_nolinfo); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(ucfg_dfs_getnol); + +QDF_STATUS ucfg_dfs_override_cac_timeout(struct wlan_objmgr_pdev *pdev, + int cac_timeout, + int *status) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + *status = dfs_override_cac_timeout(dfs, cac_timeout); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(ucfg_dfs_override_cac_timeout); + +QDF_STATUS ucfg_dfs_get_override_cac_timeout(struct wlan_objmgr_pdev *pdev, + int *cac_timeout, + int *status) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + *status = dfs_get_override_cac_timeout(dfs, cac_timeout); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(ucfg_dfs_get_override_cac_timeout); + +QDF_STATUS ucfg_dfs_get_override_precac_timeout(struct wlan_objmgr_pdev *pdev, + int *precac_timeout) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_get_override_precac_timeout(dfs, precac_timeout); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(ucfg_dfs_get_override_precac_timeout); + +QDF_STATUS ucfg_dfs_override_precac_timeout(struct wlan_objmgr_pdev *pdev, + int precac_timeout) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_override_precac_timeout(dfs, precac_timeout); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(ucfg_dfs_override_precac_timeout); + +QDF_STATUS ucfg_dfs_set_precac_enable(struct wlan_objmgr_pdev *pdev, + uint32_t value) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_set_precac_enable(dfs, value); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(ucfg_dfs_set_precac_enable); + +QDF_STATUS ucfg_dfs_get_precac_enable(struct wlan_objmgr_pdev *pdev, + int *buff) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + *buff = dfs_get_precac_enable(dfs); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(ucfg_dfs_get_precac_enable); diff --git a/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c b/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c new file mode 100644 index 000000000000..c144637dad24 --- /dev/null +++ b/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c @@ -0,0 +1,397 @@ +/* + * Copyright (c) 2016-2017 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: This file has the DFS dispatcher API implementation which is exposed + * to outside of DFS component. + */ +#include "wlan_dfs_utils_api.h" +#include "../../core/src/dfs.h" +#include "../../core/src/dfs_zero_cac.h" + +QDF_STATUS utils_nif_dfs_attach(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + nif_dfs_attach(dfs); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_nif_dfs_attach); + +QDF_STATUS utils_nif_dfs_detach(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + nif_dfs_detach(dfs); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_nif_dfs_detach); + +QDF_STATUS utils_dfs_cac_valid_reset(struct wlan_objmgr_pdev *pdev, + uint8_t prevchan_ieee, + uint32_t prevchan_flags) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_cac_valid_reset(dfs, prevchan_ieee, prevchan_flags); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_cac_valid_reset); + +QDF_STATUS utils_dfs_reset_precaclists(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_reset_precaclists(dfs); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_reset_precaclists); + +QDF_STATUS utils_dfs_cancel_precac_timer(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_cancel_precac_timer(dfs); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_cancel_precac_timer); + +QDF_STATUS utils_dfs_is_precac_done(struct wlan_objmgr_pdev *pdev, + bool *is_precac_done) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + *is_precac_done = dfs_is_precac_done(dfs); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_is_precac_done); + +QDF_STATUS utils_dfs_cancel_cac_timer(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_cancel_cac_timer(dfs); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_cancel_cac_timer); + +QDF_STATUS utils_dfs_start_cac_timer(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_start_cac_timer(dfs); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_start_cac_timer); + +QDF_STATUS utils_dfs_cac_stop(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_cac_stop(dfs); + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_cac_stop); + +QDF_STATUS utils_dfs_stacac_stop(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_stacac_stop(dfs); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_stacac_stop); + +QDF_STATUS utils_dfs_random_channel(struct wlan_objmgr_pdev *pdev, + uint8_t is_select_nondfs, + uint8_t skip_curchan, + int *target_channel) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + *target_channel = dfs_random_channel(dfs, + is_select_nondfs, + skip_curchan); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_random_channel); + +QDF_STATUS utils_dfs_get_usenol(struct wlan_objmgr_pdev *pdev, uint16_t *usenol) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + *usenol = dfs_get_usenol(dfs); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_get_usenol); + +QDF_STATUS utils_dfs_radar_disable(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_radar_disable(dfs); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_radar_disable); + +QDF_STATUS utils_dfs_set_update_nol_flag(struct wlan_objmgr_pdev *pdev, + bool val) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_set_update_nol_flag(dfs, val); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_set_update_nol_flag); + +QDF_STATUS utils_dfs_get_update_nol_flag(struct wlan_objmgr_pdev *pdev, + bool *nol_flag) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + *nol_flag = dfs_get_update_nol_flag(dfs); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_get_update_nol_flag); + +QDF_STATUS utils_dfs_get_rn_use_nol(struct wlan_objmgr_pdev *pdev, + int *rn_use_nol) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + *rn_use_nol = dfs_get_rn_use_nol(dfs); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_get_rn_use_nol); + +QDF_STATUS utils_dfs_get_nol_timeout(struct wlan_objmgr_pdev *pdev, + int *dfs_nol_timeout) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + *dfs_nol_timeout = dfs_get_nol_timeout(dfs); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_get_nol_timeout); + +QDF_STATUS utils_dfs_nol_addchan(struct wlan_objmgr_pdev *pdev, + uint16_t freq, + uint32_t dfs_nol_timeout) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_nol_addchan(dfs, freq, dfs_nol_timeout); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_nol_addchan); + +QDF_STATUS utils_dfs_nol_update(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_nol_update(dfs); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_nol_update); + +QDF_STATUS utils_dfs_second_segment_radar_disable(struct wlan_objmgr_pdev *pdev) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_second_segment_radar_disable(dfs); + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS utils_dfs_is_ignore_dfs(struct wlan_objmgr_pdev *pdev, + bool *ignore_dfs) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + *ignore_dfs = dfs->dfs_ignore_dfs; + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_is_ignore_dfs); + +QDF_STATUS utils_dfs_is_cac_valid(struct wlan_objmgr_pdev *pdev, + bool *is_cac_valid) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + *is_cac_valid = dfs->dfs_cac_valid; + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_is_cac_valid); + +QDF_STATUS utils_dfs_is_ignore_cac(struct wlan_objmgr_pdev *pdev, + bool *ignore_cac) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + *ignore_cac = dfs->dfs_ignore_cac; + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_is_ignore_cac); + +QDF_STATUS utils_dfs_set_cac_timer_running(struct wlan_objmgr_pdev *pdev, + int val) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs->dfs_cac_timer_running = val; + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_set_cac_timer_running); + +QDF_STATUS utils_dfs_get_nol_chfreq_and_chwidth(struct wlan_objmgr_pdev *pdev, + void *nollist, + uint32_t *nol_chfreq, + uint32_t *nol_chwidth, + int index) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_get_nol_chfreq_and_chwidth(nollist, nol_chfreq, nol_chwidth, index); + + return QDF_STATUS_SUCCESS; +} +EXPORT_SYMBOL(utils_dfs_get_nol_chfreq_and_chwidth); +