Browse Source

qcacmn: DFS componentization (DFS Dispatcher)

DFS module provides  these public APIs for other modules to call DFS
functions.

Change-Id: I4f703416d7afe97d2304033b1c3b6c31914a83bb
CRs-Fixed: 2001106
Abhijit Pradhan 8 years ago
parent
commit
38ae892add

+ 66 - 0
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_ */

+ 181 - 0
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 <wlan_objmgr_psoc_obj.h>
+#include <wlan_objmgr_pdev_obj.h>
+
+/**
+ * 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_ */

+ 243 - 0
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_ */

+ 188 - 0
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_ */

+ 249 - 0
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 <wlan_objmgr_psoc_obj.h>
+#include <wlan_objmgr_pdev_obj.h>
+
+/**
+ * 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_ */

+ 287 - 0
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_ */

+ 198 - 0
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;
+}
+

+ 306 - 0
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;
+}

+ 254 - 0
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;
+}

+ 226 - 0
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);

+ 149 - 0
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);

+ 397 - 0
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);
+