Browse Source

qcacmn: DFS code cleanup

* Remove nif and sif keyword.
* Combine nif_dfs_detach and sif_dfs_detach.
* Combine nif_dfs_attach and dfs_attach.

Change-Id: Ibf4638a64fac976846bfcb1eae91f3f3bb3e994e
CRs-Fixed: 2071164
Abhijit Pradhan 7 years ago
parent
commit
c5152c7904

+ 60 - 17
umac/dfs/core/src/dfs.h

@@ -1061,6 +1061,14 @@ void dfs_nol_update(struct wlan_dfs *dfs);
  */
 void dfs_nol_timer_cleanup(struct wlan_dfs *dfs);
 
+/**
+ * dfs_nol_detach() - Free NOL variables.
+ * @dfs: Pointer to wlan_dfs structure.
+ *
+ * Cancels the NOL timer and frees the NOL elements.
+ */
+void dfs_nol_detach(struct wlan_dfs *dfs);
+
 /**
  * dfs_retain_bin5_burst_pattern() - Retain the BIN5 burst pattern.
  * @dfs: Pointer to wlan_dfs structure.
@@ -1406,28 +1414,28 @@ bool dfs_is_precac_timer_running(struct wlan_dfs *dfs);
 void dfs_get_radars(struct wlan_dfs *dfs);
 
 /**
- * dfs_attach() - Allocates memory for wlan_dfs members.
+ * dfs_attach() - Wrapper function to allocate memory for wlan_dfs members.
  * @dfs: Pointer to wlan_dfs structure.
  */
 int dfs_attach(struct wlan_dfs *dfs);
 
 /**
- * dfs_create_object() - Creates DFS object.
+ * dfs_main_attach() - Allocates memory for wlan_dfs members.
  * @dfs: Pointer to wlan_dfs structure.
  */
-int dfs_create_object(struct wlan_dfs **dfs);
+int dfs_main_attach(struct wlan_dfs *dfs);
 
 /**
- * dfs_destroy_object() - Destroys the DFS object.
+ * dfs_create_object() - Creates DFS object.
  * @dfs: Pointer to wlan_dfs structure.
  */
-void dfs_destroy_object(struct wlan_dfs *dfs);
+int dfs_create_object(struct wlan_dfs **dfs);
 
 /**
- * nif_dfs_reset() - DFS reset.
+ * dfs_destroy_object() - Destroys the DFS object.
  * @dfs: Pointer to wlan_dfs structure.
  */
-void nif_dfs_reset(struct wlan_dfs *dfs);
+void dfs_destroy_object(struct wlan_dfs *dfs);
 
 /**
  * dfs_random_channel() - Function to choose the random channel from the current
@@ -1442,22 +1450,16 @@ int dfs_random_channel(struct wlan_dfs *dfs,
 		uint8_t skip_curchan);
 
 /**
- * sif_dfs_detach() - DFS detach.
+ * dfs_detach() - Wrapper function to free dfs variables.
  * @dfs: Pointer to wlan_dfs structure.
  */
-void sif_dfs_detach(struct wlan_dfs *dfs);
+void dfs_detach(struct wlan_dfs *dfs);
 
 /**
- * nif_dfs_detach() - DFS detach
+ * dfs_main_detach() - Free dfs variables.
  * @dfs: Pointer to wlan_dfs structure.
  */
-void nif_dfs_detach(struct wlan_dfs *dfs);
-
-/**
- * nif_dfs_attach() - DFS attach function.
- * @dfs: Pointer to wlan_dfs structure.
- **/
-void nif_dfs_attach(struct wlan_dfs *dfs);
+void dfs_main_detach(struct wlan_dfs *dfs);
 
 /**
  * dfs_cac_valid_reset() - Cancels the dfs_cac_valid_timer timer.
@@ -1646,6 +1648,36 @@ void dfs_mark_precac_dfs(struct wlan_dfs *dfs,
 int dfs_get_debug_info(struct wlan_dfs *dfs,
 		void *data);
 
+/**
+ * dfs_cac_timer_init() - Initialize cac timers.
+ * @dfs: Pointer to wlan_dfs structure.
+ */
+void dfs_cac_timer_init(struct wlan_dfs *dfs);
+
+/**
+ * dfs_cac_attach() - Initialize dfs cac variables.
+ * @dfs: Pointer to wlan_dfs structure.
+ */
+void dfs_cac_attach(struct wlan_dfs *dfs);
+
+/**
+ * dfs_cac_timer_reset() - Cancel dfs cac timers.
+ * @dfs: Pointer to wlan_dfs structure.
+ */
+void dfs_cac_timer_reset(struct wlan_dfs *dfs);
+
+/**
+ * dfs_nol_timer_init() - Initialize NOL timers.
+ * @dfs: Pointer to wlan_dfs structure.
+ */
+void dfs_nol_timer_init(struct wlan_dfs *dfs);
+
+/**
+ * dfs_nol_attach() - Initialize NOL variables.
+ * @dfs: Pointer to wlan_dfs structure.
+ */
+void dfs_nol_attach(struct wlan_dfs *dfs);
+
 /**
  * dfs_print_nolhistory() - Print NOL history.
  * @dfs: Pointer to wlan_dfs structure.
@@ -1881,4 +1913,15 @@ void count_the_other_delay_elements(struct wlan_dfs *dfs,
 		int fundamentalpri
 		);
 
+/**
+ * dfs_main_timer_init() - Initialize dfs timers.
+ * @dfs: Pointer to wlan_dfs structure.
+ */
+void dfs_main_timer_init(struct wlan_dfs *dfs);
+
+/**
+ * dfs_main_timer_reset() - Stop dfs timers.
+ * @dfs: Pointer to wlan_dfs structure.
+ */
+void dfs_main_timer_reset(struct wlan_dfs *dfs);
 #endif  /* _DFS_H_ */

+ 14 - 8
umac/dfs/core/src/dfs_zero_cac.h

@@ -53,6 +53,12 @@ struct dfs_precac_entry {
 	struct wlan_dfs      *dfs;
 };
 
+/**
+ * dfs_zero_cac_timer_init() - Initialize zero-cac timers
+ * @dfs: Pointer to DFS structure.
+ */
+void dfs_zero_cac_timer_init(struct wlan_dfs *dfs);
+
 /**
  * dfs_print_precaclists() - Print precac list.
  * @dfs: Pointer to wlan_dfs structure.
@@ -79,6 +85,12 @@ void dfs_reset_precaclists(struct wlan_dfs *dfs);
  */
 void dfs_deinit_precac_list(struct wlan_dfs *dfs);
 
+/**
+ * dfs_zero_cac_detach() - Free zero_cac memory.
+ * @dfs: Pointer to wlan_dfs dtructure.
+ */
+void dfs_zero_cac_detach(struct wlan_dfs *dfs);
+
 /**
  * dfs_init_precac_list() - Init precac list.
  * @dfs: Pointer to wlan_dfs dtructure.
@@ -100,8 +112,8 @@ void dfs_start_precac_timer(struct wlan_dfs *dfs,
 void dfs_cancel_precac_timer(struct wlan_dfs *dfs);
 
 /**
- * dfs_zero_cac_attach() - Initializes Zero cac DFS variables.
- * @dfs: Pointer to wlan_dfs structure.
+ * dfs_zero_cac_attach() - Initialize dfs zerocac variables.
+ * @dfs: Pointer to DFS structure.
  */
 void dfs_zero_cac_attach(struct wlan_dfs *dfs);
 
@@ -207,12 +219,6 @@ uint32_t dfs_get_precac_enable(struct wlan_dfs *dfs);
  */
 void dfs_zero_cac_reset(struct wlan_dfs *dfs);
 
-/**
- * dfs_zero_cac_attach() - Initializes Zero cac DFS variables.
- * @dfs: Pointer to wlan_dfs structure.
- */
-void dfs_zero_cac_attach(struct wlan_dfs *dfs);
-
 /**
  * dfs_is_ht20_40_80_chan_in_precac_done_list() - Is precac done on a
  *                                                VHT20/40/80 channel.

+ 1 - 1
umac/dfs/core/src/filtering/dfs_process_phyerr.c

@@ -810,7 +810,7 @@ void dfs_process_phyerr(struct wlan_dfs *dfs, void *buf, uint16_t datalen,
 	}
 	if (!STAILQ_EMPTY(&dfs->dfs_radarq) && !dfs->wlan_radar_tasksched) {
 		dfs->wlan_radar_tasksched = 1;
-		OS_SET_TIMER(&dfs->wlan_dfs_task_timer, 0);
+		qdf_timer_mod(&dfs->wlan_dfs_task_timer, 0);
 	}
 #undef EXT_CH_RADAR_FOUND
 #undef PRI_CH_RADAR_FOUND

+ 1 - 1
umac/dfs/core/src/filtering/dfs_radar.c

@@ -563,7 +563,7 @@ void dfs_radar_found_action(struct wlan_dfs *dfs)
 		dfs->wlan_dfstest = 1;
 		dfs->wlan_dfstest_ieeechan = dfs->dfs_curchan->dfs_ch_ieee;
 		dfs->wlan_dfstesttime = 1;   /* 1ms */
-		OS_SET_TIMER(&dfs->wlan_dfstesttimer,
+		qdf_timer_mod(&dfs->wlan_dfstesttimer,
 				dfs->wlan_dfstesttime);
 	}
 

+ 62 - 66
umac/dfs/core/src/misc/dfs.c

@@ -94,6 +94,21 @@ int dfs_get_debug_info(struct wlan_dfs *dfs, void *data)
 	return (int)dfs->dfs_proc_phyerr;
 }
 
+void dfs_main_timer_init(struct wlan_dfs *dfs)
+{
+	qdf_timer_init(NULL,
+			&(dfs->wlan_dfs_task_timer),
+			dfs_task,
+			(void *)(dfs),
+			QDF_TIMER_TYPE_WAKE_APPS);
+
+	qdf_timer_init(NULL,
+			&(dfs->wlan_dfstesttimer),
+			dfs_testtimer_task,
+			(void *)dfs,
+			QDF_TIMER_TYPE_WAKE_APPS);
+}
+
 int dfs_create_object(struct wlan_dfs **dfs)
 {
 	*dfs = (struct wlan_dfs *)qdf_mem_malloc(sizeof(**dfs));
@@ -115,7 +130,7 @@ int dfs_create_object(struct wlan_dfs **dfs)
 	return 0;
 }
 
-int dfs_attach(struct wlan_dfs *dfs)
+int dfs_main_attach(struct wlan_dfs *dfs)
 {
 	int i, n;
 	struct wlan_dfs_radar_tab_info radar_info;
@@ -170,18 +185,11 @@ int dfs_attach(struct wlan_dfs *dfs)
 	dfs->dfs_event_log_on = 1;
 	DFS_PRINTK("%s: event log enabled by default\n", __func__);
 
+	dfs->dfs_enable = 1;
+
 	/*Verify : Passing NULL to qdf_timer_init().*/
-	qdf_timer_init(NULL,
-			&(dfs->wlan_dfs_task_timer),
-			dfs_task,
-			(void *)(dfs),
-			QDF_TIMER_TYPE_WAKE_APPS);
-	qdf_timer_init(NULL,
-			&(dfs->wlan_dfstesttimer),
-			dfs_testtimer_task,
-			(void *)dfs,
-			QDF_TIMER_TYPE_WAKE_APPS);
-	dfs->wlan_dfs_cac_time = WLAN_DFS_WAIT_MS;
+	dfs_main_timer_init(dfs);
+
 	WLAN_DFSQ_LOCK_INIT(dfs);
 	STAILQ_INIT(&dfs->dfs_radarq);
 	WLAN_ARQ_LOCK_INIT(dfs);
@@ -303,14 +311,23 @@ bad1:
 	return 1;
 }
 
-void dfs_reset(struct wlan_dfs *dfs)
+int dfs_attach(struct wlan_dfs *dfs)
 {
-	if (dfs == NULL) {
-		DFS_DPRINTK(dfs, WLAN_DEBUG_DFS_NOL,
-				"%s: sc_dfs is NULL\n", __func__);
-		return;
-	}
+	int ret;
+
+	ret = dfs_main_attach(dfs);
+	if (ret)
+		return ret;
+
+	dfs_cac_attach(dfs);
+	dfs_zero_cac_attach(dfs);
+	dfs_nol_attach(dfs);
+
+	return 0;
+}
 
+void dfs_main_timer_reset(struct wlan_dfs *dfs)
+{
 	if (dfs->wlan_radar_tasksched) {
 		qdf_timer_stop(&dfs->wlan_dfs_task_timer);
 		dfs->wlan_radar_tasksched = 0;
@@ -320,36 +337,38 @@ void dfs_reset(struct wlan_dfs *dfs)
 		qdf_timer_stop(&dfs->wlan_dfstesttimer);
 		dfs->wlan_dfstest = 0;
 	}
+}
+
+void dfs_reset(struct wlan_dfs *dfs)
+{
+	if (dfs == NULL) {
+		DFS_DPRINTK(dfs, WLAN_DEBUG_DFS_NOL,
+				"%s: sc_dfs is NULL\n", __func__);
+		return;
+	}
+
+	dfs_cac_timer_reset(dfs);
+	dfs_zero_cac_reset(dfs);
+	dfs_main_timer_reset(dfs);
 
 	dfs_nol_timer_cleanup(dfs);
 	dfs_clear_nolhistory(dfs);
 }
 
-void sif_dfs_detach(struct wlan_dfs *dfs)
+void dfs_main_detach(struct wlan_dfs *dfs)
 {
 	int n, empty;
 
-	if (dfs == NULL) {
-		DFS_DPRINTK(dfs, WLAN_DEBUG_DFS1,
-				"%s: dfs is NULL\n", __func__);
+	if (!dfs->dfs_enable)
 		return;
-	}
+
+	dfs->dfs_enable = 0;
 
 	if (dfs->dfs_curchan != NULL) {
-		OS_FREE(dfs->dfs_curchan);
+		qdf_mem_free(dfs->dfs_curchan);
 		dfs->dfs_curchan = NULL;
 	}
 
-	if (dfs->wlan_radar_tasksched) {
-		qdf_timer_stop(&dfs->wlan_dfs_task_timer);
-		dfs->wlan_radar_tasksched = 0;
-	}
-
-	if (dfs->wlan_dfstest) {
-		qdf_timer_stop(&dfs->wlan_dfstesttimer);
-		dfs->wlan_dfstest = 0;
-	}
-
 	dfs_reset_radarq(dfs);
 	dfs_reset_alldelaylines(dfs);
 
@@ -394,7 +413,13 @@ void sif_dfs_detach(struct wlan_dfs *dfs)
 		qdf_mem_free(dfs->events);
 		dfs->events = NULL;
 	}
-	dfs_nol_timer_cleanup(dfs);
+}
+
+void dfs_detach(struct wlan_dfs *dfs)
+{
+	dfs_main_detach(dfs);
+	dfs_zero_cac_detach(dfs);
+	dfs_nol_detach(dfs);
 }
 
 void dfs_destroy_object(struct wlan_dfs *dfs)
@@ -894,7 +919,7 @@ int dfs_control(struct wlan_dfs *dfs,
 	case DFS_BANGRADAR:
 		dfs->dfs_bangradar = 1;
 		dfs->wlan_radar_tasksched = 1;
-		OS_SET_TIMER(&dfs->wlan_dfs_task_timer, 0);
+		qdf_timer_mod(&dfs->wlan_dfs_task_timer, 0);
 		error = 0;
 		break;
 	case DFS_SHOW_PRECAC_LISTS:
@@ -906,7 +931,7 @@ int dfs_control(struct wlan_dfs *dfs,
 	case DFS_SECOND_SEGMENT_BANGRADAR:
 		dfs->dfs_second_segment_bangradar = 1;
 		dfs->wlan_radar_tasksched = 1;
-		OS_SET_TIMER(&dfs->wlan_dfs_task_timer, 0);
+		qdf_timer_mod(&dfs->wlan_dfs_task_timer, 0);
 		error = 0;
 		break;
 	default:
@@ -1024,35 +1049,6 @@ int dfs_get_thresholds(struct wlan_dfs *dfs,
 	return 1;
 }
 
-void dfs_getnol(struct wlan_dfs *dfs, void *dfs_nolinfo)
-{
-	struct dfsreq_nolinfo *nolinfo = (struct dfsreq_nolinfo *)dfs_nolinfo;
-
-	dfs_get_nol(dfs, nolinfo->dfs_nol, &(nolinfo->dfs_ch_nchans));
-}
-
-void dfs_clear_nolhistory(struct wlan_dfs *dfs)
-{
-	/* We should have a dfs_clear_nolhistory API from Regdomain. */
-	struct dfs_ieee80211_channel *c, lc;
-	int i;
-	int nchans = 0;
-
-	c = &lc;
-	dfs_mlme_get_dfs_ch_nchans(dfs->dfs_pdev_obj, &nchans);
-	for (i = 0; i < nchans; i++) {
-		dfs_mlme_get_dfs_ch_channels(dfs->dfs_pdev_obj,
-				&(c->dfs_ch_freq),
-				&(c->dfs_ch_flags),
-				&(c->dfs_ch_flagext),
-				&(c->dfs_ch_ieee),
-				&(c->dfs_ch_vhtop_ch_freq_seg1),
-				&(c->dfs_ch_vhtop_ch_freq_seg2),
-				i);
-		IEEE80211_CHAN_CLR_HISTORY_RADAR(c);
-	}
-}
-
 void dfs_set_current_channel(struct wlan_dfs *dfs,
 		uint16_t dfs_ch_freq,
 		uint32_t dfs_ch_flags,

+ 32 - 102
umac/dfs/core/src/misc/dfs_cac.c

@@ -34,8 +34,6 @@
 #include "wlan_dfs_mlme_api.h"
 #include "../dfs_internal.h"
 
-static int ieee80211_nol_timeout = 30*60; /* 30 minutes */
-#define NOL_TIMEOUT (ieee80211_nol_timeout*1000)
 #define IS_CHANNEL_WEATHER_RADAR(freq) ((freq >= 5600) && (freq <= 5650))
 #define ADJACENT_WEATHER_RADAR_CHANNEL   5580
 #define CH100_START_FREQ                 5490
@@ -64,23 +62,6 @@ int dfs_get_override_cac_timeout(struct wlan_dfs *dfs, int *cac_timeout)
 	return 0;
 }
 
-void nif_dfs_detach(struct wlan_dfs *dfs)
-{
-	if (!dfs->dfs_enable)
-		return;
-
-	dfs->dfs_enable = 0;
-	nif_dfs_reset(dfs);
-	dfs_deinit_precac_list(dfs);
-}
-
-void nif_dfs_reset(struct wlan_dfs *dfs)
-{
-	qdf_timer_stop(&dfs->dfs_cac_timer);
-	dfs->dfs_cac_timeout_override = -1;
-	dfs_zero_cac_reset(dfs);
-}
-
 void dfs_cac_valid_reset(struct wlan_dfs *dfs,
 		uint8_t prevchan_ieee,
 		uint32_t prevchan_flags)
@@ -167,7 +148,7 @@ static os_timer_func(dfs_cac_timeout)
 		 */
 		if (dfs->dfs_cac_valid_time) {
 			dfs->dfs_cac_valid = 1;
-			OS_SET_TIMER(&dfs->dfs_cac_valid_timer,
+			qdf_timer_mod(&dfs->dfs_cac_valid_timer,
 					dfs->dfs_cac_valid_time * 1000);
 		}
 	}
@@ -184,6 +165,36 @@ static os_timer_func(dfs_cac_timeout)
 	}
 }
 
+void dfs_cac_timer_init(struct wlan_dfs *dfs)
+{
+	qdf_timer_init(NULL,
+			&(dfs->dfs_cac_timer),
+			dfs_cac_timeout,
+			(void *)(dfs),
+			QDF_TIMER_TYPE_WAKE_APPS);
+
+	qdf_timer_init(NULL,
+			&(dfs->dfs_cac_valid_timer),
+			dfs_cac_valid_timeout,
+			(void *)(dfs),
+			QDF_TIMER_TYPE_WAKE_APPS);
+}
+
+void dfs_cac_attach(struct wlan_dfs *dfs)
+{
+	dfs->dfs_cac_timeout_override = -1;
+	dfs->wlan_dfs_cac_time = WLAN_DFS_WAIT_MS;
+	dfs_cac_timer_init(dfs);
+}
+
+void dfs_cac_timer_reset(struct wlan_dfs *dfs)
+{
+	qdf_timer_stop(&dfs->dfs_cac_timer);
+	dfs_get_override_cac_timeout(dfs,
+			&(dfs->dfs_cac_timeout_override));
+
+}
+
 int dfs_is_ap_cac_timer_running(struct wlan_dfs *dfs)
 {
 	return dfs->dfs_cac_timer_running;
@@ -191,7 +202,7 @@ int dfs_is_ap_cac_timer_running(struct wlan_dfs *dfs)
 
 void dfs_start_cac_timer(struct wlan_dfs *dfs)
 {
-	OS_SET_TIMER(&dfs->dfs_cac_timer,
+	qdf_timer_mod(&dfs->dfs_cac_timer,
 			dfs_mlme_get_cac_timeout(dfs->dfs_pdev_obj,
 				dfs->dfs_curchan->dfs_ch_freq,
 				dfs->dfs_curchan->dfs_ch_vhtop_ch_freq_seg2,
@@ -225,87 +236,6 @@ void dfs_stacac_stop(struct wlan_dfs *dfs)
 		__func__, dfs->dfs_curchan->dfs_ch_freq, phyerr);
 }
 
-/**
- * dfs_nol_timeout() - NOL timeout function.
- *
- * Clears the IEEE80211_CHAN_DFS_RADAR_FOUND flag for the NOL timeout channel.
- */
-static os_timer_func(dfs_nol_timeout)
-{
-	struct dfs_ieee80211_channel *c = NULL, lc;
-	unsigned long oldest, now;
-	struct wlan_dfs *dfs = NULL;
-	int i;
-	int nchans = 0;
-
-	c = &lc;
-
-	OS_GET_TIMER_ARG(dfs, struct wlan_dfs *);
-	dfs_mlme_get_dfs_ch_nchans(dfs->dfs_pdev_obj, &nchans);
-
-	now = oldest = qdf_system_ticks();
-	for (i = 0; i < nchans; i++) {
-		dfs_mlme_get_dfs_ch_channels(dfs->dfs_pdev_obj,
-				&(c->dfs_ch_freq),
-				&(c->dfs_ch_flags),
-				&(c->dfs_ch_flagext),
-				&(c->dfs_ch_ieee),
-				&(c->dfs_ch_vhtop_ch_freq_seg1),
-				&(c->dfs_ch_vhtop_ch_freq_seg2),
-				i);
-		if (IEEE80211_IS_CHAN_RADAR(c)) {
-			if (qdf_system_time_after_eq(now,
-				dfs->dfs_nol_event[i] + NOL_TIMEOUT)) {
-				c->dfs_ch_flagext &=
-					~IEEE80211_CHAN_DFS_RADAR_FOUND;
-				if (c->dfs_ch_flags &
-						IEEE80211_CHAN_DFS_RADAR) {
-					/*
-					 * NB: do this here so we get only one
-					 * msg instead of one for every channel
-					 * table entry.
-					 */
-					DFS_DPRINTK(dfs, WLAN_DEBUG_DFS,
-						"%s : radar on channel %u (%u MHz) cleared after timeout\n",
-						__func__,
-						c->dfs_ch_ieee,
-						c->dfs_ch_freq);
-				}
-			} else if (dfs->dfs_nol_event[i] < oldest)
-				oldest = dfs->dfs_nol_event[i];
-		}
-	}
-	if (oldest != now) {
-		/* Arrange to process next channel up for a status change. */
-		OS_SET_TIMER(&dfs->dfs_nol_timer, NOL_TIMEOUT -
-				qdf_system_ticks_to_msecs(qdf_system_ticks()));
-	}
-}
-
-void nif_dfs_attach(struct wlan_dfs *dfs)
-{
-	dfs->dfs_enable = 1;
-	dfs->dfs_cac_timeout_override = -1;
-	dfs_zero_cac_attach(dfs);
-	qdf_timer_init(NULL,
-			&(dfs->dfs_cac_timer),
-			dfs_cac_timeout,
-			(void *)(dfs),
-			QDF_TIMER_TYPE_WAKE_APPS);
-
-	qdf_timer_init(NULL,
-			&(dfs->dfs_nol_timer),
-			dfs_nol_timeout,
-			(void *)(dfs),
-			QDF_TIMER_TYPE_WAKE_APPS);
-
-	qdf_timer_init(NULL,
-			&(dfs->dfs_cac_valid_timer),
-			dfs_cac_valid_timeout,
-			(void *)(dfs),
-			QDF_TIMER_TYPE_WAKE_APPS);
-}
-
 int dfs_random_channel(struct wlan_dfs *dfs,
 		uint8_t is_select_nondfs,
 		uint8_t skip_curchan)

+ 108 - 3
umac/dfs/core/src/misc/dfs_nol.c

@@ -36,7 +36,78 @@
 #include <wlan_reg_services_api.h>
 #include <dfs_ioctl.h>
 
-/* for loop to traverse the channel list. */
+/**
+ * dfs_nol_timeout() - NOL timeout function.
+ *
+ * Clears the IEEE80211_CHAN_DFS_RADAR_FOUND flag for the NOL timeout channel.
+ */
+static os_timer_func(dfs_nol_timeout)
+{
+	struct dfs_ieee80211_channel *c = NULL, lc;
+	unsigned long oldest, now;
+	struct wlan_dfs *dfs = NULL;
+	int i;
+	int nchans = 0;
+
+	c = &lc;
+
+	OS_GET_TIMER_ARG(dfs, struct wlan_dfs *);
+	dfs_mlme_get_dfs_ch_nchans(dfs->dfs_pdev_obj, &nchans);
+
+	now = oldest = qdf_system_ticks();
+	for (i = 0; i < nchans; i++) {
+		dfs_mlme_get_dfs_ch_channels(dfs->dfs_pdev_obj,
+				&(c->dfs_ch_freq),
+				&(c->dfs_ch_flags),
+				&(c->dfs_ch_flagext),
+				&(c->dfs_ch_ieee),
+				&(c->dfs_ch_vhtop_ch_freq_seg1),
+				&(c->dfs_ch_vhtop_ch_freq_seg2),
+				i);
+		if (IEEE80211_IS_CHAN_RADAR(c)) {
+			if (qdf_system_time_after_eq(now,
+						dfs->dfs_nol_event[i] +
+						dfs_get_nol_timeout(dfs))) {
+				c->dfs_ch_flagext &=
+					~IEEE80211_CHAN_DFS_RADAR_FOUND;
+				if (c->dfs_ch_flags &
+						IEEE80211_CHAN_DFS_RADAR) {
+					/*
+					 * NB: do this here so we get only one
+					 * msg instead of one for every channel
+					 * table entry.
+					 */
+					DFS_DPRINTK(dfs, WLAN_DEBUG_DFS,
+						"%s : radar on channel %u (%u MHz) cleared after timeout\n",
+						__func__,
+						c->dfs_ch_ieee,
+						c->dfs_ch_freq);
+				}
+			} else if (dfs->dfs_nol_event[i] < oldest)
+				oldest = dfs->dfs_nol_event[i];
+		}
+	}
+	if (oldest != now) {
+		/* Arrange to process next channel up for a status change. */
+		qdf_timer_mod(&dfs->dfs_nol_timer,
+				dfs_get_nol_timeout(dfs) -
+				qdf_system_ticks_to_msecs(qdf_system_ticks()));
+	}
+}
+
+void dfs_nol_timer_init(struct wlan_dfs *dfs)
+{
+	qdf_timer_init(NULL,
+			&(dfs->dfs_nol_timer),
+			dfs_nol_timeout,
+			(void *)(dfs),
+			QDF_TIMER_TYPE_WAKE_APPS);
+}
+
+void dfs_nol_attach(struct wlan_dfs *dfs)
+{
+	dfs_nol_timer_init(dfs);
+}
 
 /**
  * dfs_nol_delete() - Delete the given frequency/chwidth from the NOL.
@@ -277,7 +348,7 @@ void dfs_nol_addchan(struct wlan_dfs *dfs,
 				__func__, nol->nol_freq, nol->nol_chwidth);
 
 			qdf_timer_stop(&nol->nol_timer);
-			OS_SET_TIMER(&nol->nol_timer,
+			qdf_timer_mod(&nol->nol_timer,
 					dfs_nol_timeout * TIME_IN_MS);
 			return;
 		}
@@ -306,7 +377,7 @@ void dfs_nol_addchan(struct wlan_dfs *dfs,
 	qdf_timer_init(NULL,
 			&elem->nol_timer, dfs_remove_from_nol,
 			elem, QDF_TIMER_TYPE_WAKE_APPS);
-	OS_SET_TIMER(&elem->nol_timer, dfs_nol_timeout * TIME_IN_MS);
+	qdf_timer_mod(&elem->nol_timer, dfs_nol_timeout * TIME_IN_MS);
 
 	/* Update the NOL counter. */
 	dfs->dfs_nol_count++;
@@ -426,6 +497,11 @@ void dfs_nol_timer_cleanup(struct wlan_dfs *dfs)
 	dfs_nol_update(dfs);
 }
 
+void dfs_nol_detach(struct wlan_dfs *dfs)
+{
+	dfs_nol_timer_cleanup(dfs);
+}
+
 int dfs_get_rn_use_nol(struct wlan_dfs *dfs)
 {
 	return dfs->dfs_rinfo.rn_use_nol;
@@ -435,3 +511,32 @@ int dfs_get_nol_timeout(struct wlan_dfs *dfs)
 {
 	return dfs->wlan_dfs_nol_timeout;
 }
+
+void dfs_getnol(struct wlan_dfs *dfs, void *dfs_nolinfo)
+{
+	struct dfsreq_nolinfo *nolinfo = (struct dfsreq_nolinfo *)dfs_nolinfo;
+
+	dfs_get_nol(dfs, nolinfo->dfs_nol, &(nolinfo->dfs_ch_nchans));
+}
+
+void dfs_clear_nolhistory(struct wlan_dfs *dfs)
+{
+	/* We should have a dfs_clear_nolhistory API from Regdomain. */
+	struct dfs_ieee80211_channel *c, lc;
+	int i;
+	int nchans = 0;
+
+	c = &lc;
+	dfs_mlme_get_dfs_ch_nchans(dfs->dfs_pdev_obj, &nchans);
+	for (i = 0; i < nchans; i++) {
+		dfs_mlme_get_dfs_ch_channels(dfs->dfs_pdev_obj,
+				&(c->dfs_ch_freq),
+				&(c->dfs_ch_flags),
+				&(c->dfs_ch_flagext),
+				&(c->dfs_ch_ieee),
+				&(c->dfs_ch_vhtop_ch_freq_seg1),
+				&(c->dfs_ch_vhtop_ch_freq_seg2),
+				i);
+		IEEE80211_CHAN_CLR_HISTORY_RADAR(c);
+	}
+}

+ 27 - 18
umac/dfs/core/src/misc/dfs_zero_cac.c

@@ -94,25 +94,14 @@
 #include "wlan_dfs_mlme_api.h"
 #include "../dfs_internal.h"
 
-static os_timer_func(dfs_precac_timeout);
-
-void dfs_zero_cac_attach(struct wlan_dfs *dfs)
-{
-	dfs->dfs_precac_timeout_override = -1;
-	dfs_init_precac_list(dfs);
-	qdf_timer_init(NULL,
-			&(dfs->dfs_precac_timer),
-			dfs_precac_timeout,
-			(void *) dfs,
-			QDF_TIMER_TYPE_WAKE_APPS);
-}
-
 void dfs_zero_cac_reset(struct wlan_dfs *dfs)
 {
-	dfs->dfs_precac_timeout_override = -1;
+	dfs_get_override_precac_timeout(dfs,
+			&(dfs->dfs_precac_timeout_override));
 	qdf_timer_stop(&dfs->dfs_precac_timer);
 	dfs->dfs_precac_primary_freq = 0;
 	dfs->dfs_precac_secondary_freq = 0;
+	dfs_init_precac_list(dfs);
 }
 
 int dfs_override_precac_timeout(struct wlan_dfs *dfs, int precac_timeout)
@@ -289,7 +278,7 @@ void dfs_mark_precac_dfs(struct wlan_dfs *dfs,
 					precac_entry->vht80_freq);
 				TAILQ_INSERT_TAIL(&dfs->dfs_precac_nol_list,
 						precac_entry, pe_list);
-				OS_SET_TIMER(&precac_entry->precac_nol_timer,
+				qdf_timer_mod(&precac_entry->precac_nol_timer,
 						dfs_get_nol_timeout(dfs)*1000);
 				found = 1;
 				break;
@@ -322,7 +311,7 @@ void dfs_mark_precac_dfs(struct wlan_dfs *dfs,
 					precac_entry->vht80_freq);
 				TAILQ_INSERT_TAIL(&dfs->dfs_precac_nol_list,
 						precac_entry, pe_list);
-				OS_SET_TIMER(&precac_entry->precac_nol_timer,
+				qdf_timer_mod(&precac_entry->precac_nol_timer,
 						dfs_get_nol_timeout(dfs)*1000);
 				break;
 			}
@@ -438,6 +427,21 @@ static os_timer_func(dfs_precac_timeout)
 	dfs_mlme_channel_change_by_precac(dfs->dfs_pdev_obj);
 }
 
+void dfs_zero_cac_timer_init(struct wlan_dfs *dfs)
+{
+	qdf_timer_init(NULL,
+			&(dfs->dfs_precac_timer),
+			dfs_precac_timeout,
+			(void *) dfs,
+			QDF_TIMER_TYPE_WAKE_APPS);
+}
+
+void dfs_zero_cac_attach(struct wlan_dfs *dfs)
+{
+	dfs->dfs_precac_timeout_override = -1;
+	dfs_zero_cac_timer_init(dfs);
+}
+
 /**
  * dfs_precac_nol_timeout() - NOL timeout for precac channel.
  *
@@ -481,7 +485,7 @@ void dfs_init_precac_list(struct wlan_dfs *dfs)
 	 * beginning we do not know how many uniq frequencies are present.
 	 * Therefore, we calculate the MAX size and allocate a temporary
 	 * list/array. However we fill the temporary array with uniq frequencies
-	 * and copy the uniq list of frequencies to* the final list with exact
+	 * and copy the uniq list of frequencies to the final list with exact
 	 * size.
 	 */
 	TAILQ_INIT(&dfs->dfs_precac_required_list);
@@ -598,6 +602,11 @@ void dfs_deinit_precac_list(struct wlan_dfs *dfs)
 
 }
 
+void dfs_zero_cac_detach(struct wlan_dfs *dfs)
+{
+	dfs_deinit_precac_list(dfs);
+}
+
 uint8_t dfs_get_freq_from_precac_required_list(struct wlan_dfs *dfs,
 		uint8_t exclude_ieee_freq)
 {
@@ -684,7 +693,7 @@ void dfs_start_precac_timer(struct wlan_dfs *dfs, uint8_t precac_chan)
 	DFS_DPRINTK(dfs, WLAN_DEBUG_DFS,
 		"%s : precactimeout = %d\n",
 		__func__, (precac_timeout)*1000);
-	OS_SET_TIMER(&dfs->dfs_precac_timer, (precac_timeout) * 1000);
+	qdf_timer_mod(&dfs->dfs_precac_timer, (precac_timeout) * 1000);
 }
 
 void dfs_print_precaclists(struct wlan_dfs *dfs)

+ 0 - 36
umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h

@@ -49,15 +49,6 @@ QDF_STATUS tgt_dfs_set_current_channel(struct wlan_objmgr_pdev *pdev,
 		uint8_t dfs_ch_vhtop_ch_freq_seg1,
 		uint8_t dfs_ch_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.
@@ -108,24 +99,6 @@ QDF_STATUS tgt_dfs_destroy_object(struct wlan_objmgr_pdev *pdev);
 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.
@@ -143,15 +116,6 @@ QDF_STATUS tgt_dfs_control(struct wlan_objmgr_pdev *pdev,
 	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.

+ 7 - 19
umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h

@@ -83,24 +83,6 @@
 
 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.
@@ -115,6 +97,12 @@ QDF_STATUS utils_dfs_cac_valid_reset(struct wlan_objmgr_pdev *pdev,
 		uint8_t prevchan_ieee,
 		uint32_t prevchan_flags);
 
+/**
+ * utils_dfs_reset() - Reset DFS members.
+ * @pdev: Pointer to DFS pdev object.
+ */
+QDF_STATUS utils_dfs_reset(struct wlan_objmgr_pdev *pdev);
+
 /**
  * utils_dfs_reset_precaclists() - Clears and initiakizes precac_required_list,
  *                                 precac_done_list and precac_nol_list.
@@ -432,7 +420,7 @@ void utils_dfs_reg_update_nol_ch(struct wlan_objmgr_pdev *pdev,
 uint8_t utils_dfs_freq_to_chan(uint32_t freq);
 
 /**
- * utils_dfs__chan_to_freq () - convert channel number to frequency
+ * utils_dfs_chan_to_freq () - convert channel number to frequency
  * @chan: channel number
  *
  * Return: frequency

+ 2 - 2
umac/dfs/dispatcher/src/wlan_dfs_init_deinit_api.c

@@ -197,8 +197,8 @@ QDF_STATUS wlan_dfs_pdev_obj_destroy_notification(struct wlan_objmgr_pdev *pdev,
 				WLAN_UMAC_COMP_DFS,
 				(void *)dfs);
 
-		nif_dfs_detach(dfs);
-		sif_dfs_detach(dfs);
+		dfs_reset(dfs);
+		dfs_detach(dfs);
 		dfs->dfs_pdev_obj = NULL;
 		dfs_destroy_object(dfs);
 	}

+ 0 - 51
umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c

@@ -61,20 +61,6 @@ QDF_STATUS tgt_dfs_set_current_channel(struct wlan_objmgr_pdev *pdev,
 }
 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)
 {
@@ -140,18 +126,6 @@ QDF_STATUS tgt_dfs_get_radars(struct wlan_objmgr_pdev *pdev)
 }
 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;
@@ -167,31 +141,6 @@ QDF_STATUS tgt_dfs_destroy_object(struct wlan_objmgr_pdev *pdev)
 }
 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,

+ 2 - 17
umac/dfs/dispatcher/src/wlan_dfs_utils_api.c

@@ -37,7 +37,7 @@ struct dfs_nol_info {
 	struct dfsreq_nolelem dfs_nol[DFS_MAX_NOL_CHANNEL];
 };
 
-QDF_STATUS utils_nif_dfs_attach(struct wlan_objmgr_pdev *pdev)
+QDF_STATUS utils_dfs_reset(struct wlan_objmgr_pdev *pdev)
 {
 	struct wlan_dfs *dfs;
 
@@ -45,25 +45,10 @@ QDF_STATUS utils_nif_dfs_attach(struct wlan_objmgr_pdev *pdev)
 	if (dfs == NULL)
 		return  QDF_STATUS_E_FAILURE;
 
-	nif_dfs_attach(dfs);
+	dfs_reset(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,

+ 0 - 8
umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h

@@ -786,15 +786,11 @@ struct wlan_lmac_if_nan_rx_ops {
 /**
  * struct wlan_lmac_if_dfs_rx_ops - Function pointers to call dfs functions
  *                                  from lmac/offload.
- * @dfs_reset:                        Reset dfs.
  * @dfs_get_radars:                   Calls init radar table functions.
  * @dfs_process_phyerr:               Process phyerr.
  * @dfs_destroy_object:               Destroys the DFS object.
  * @dfs_radar_enable:                 Enables the radar.
- * @dfs_attach:                       Allocates memory for wlan_dfs members.
- * @dfs_sif_dfs_detach:               DFS detach.
  * @dfs_control:                      Used to process ioctls related to DFS.
- * @dfs_nif_dfs_reset:                DFS reset.
  * @dfs_is_precac_timer_running:      Check whether precac timer is running.
  * @dfs_find_vht80_chan_for_precac:   Find VHT80 channel for precac.
  * @dfs_cancel_precac_timer:          Cancel the precac timer.
@@ -807,7 +803,6 @@ struct wlan_lmac_if_nan_rx_ops {
  * @dfs_dfs_cac_complete_ind:         Process cac complete indication.
  */
 struct wlan_lmac_if_dfs_rx_ops {
-	QDF_STATUS (*dfs_reset)(struct wlan_objmgr_pdev *pdev);
 	QDF_STATUS (*dfs_get_radars)(struct wlan_objmgr_pdev *pdev);
 	QDF_STATUS (*dfs_process_phyerr)(struct wlan_objmgr_pdev *pdev,
 			void *buf,
@@ -820,8 +815,6 @@ struct wlan_lmac_if_dfs_rx_ops {
 	QDF_STATUS (*dfs_radar_enable)(struct wlan_objmgr_pdev *pdev,
 			int no_cac,
 			uint32_t opmode);
-	QDF_STATUS (*dfs_attach)(struct wlan_objmgr_pdev *pdev);
-	QDF_STATUS (*dfs_sif_dfs_detach)(struct wlan_objmgr_pdev *pdev);
 	QDF_STATUS (*dfs_control)(struct wlan_objmgr_pdev *pdev,
 			u_int id,
 			void *indata,
@@ -829,7 +822,6 @@ struct wlan_lmac_if_dfs_rx_ops {
 			void *outdata,
 			uint32_t *outsize,
 			int *error);
-	QDF_STATUS (*dfs_nif_dfs_reset)(struct wlan_objmgr_pdev *pdev);
 	QDF_STATUS (*dfs_is_precac_timer_running)(struct wlan_objmgr_pdev *pdev,
 			bool *is_precac_timer_running);
 	QDF_STATUS (*dfs_find_vht80_chan_for_precac)(struct wlan_objmgr_pdev *pdev,

+ 0 - 4
umac/global_umac_dispatcher/lmac_if/src/wlan_lmac_if.c

@@ -229,15 +229,11 @@ wlan_lmac_if_umac_dfs_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
 
 	dfs_rx_ops = &rx_ops->dfs_rx_ops;
 
-	dfs_rx_ops->dfs_reset = tgt_dfs_reset;
 	dfs_rx_ops->dfs_get_radars = tgt_dfs_get_radars;
 	dfs_rx_ops->dfs_process_phyerr = tgt_dfs_process_phyerr;
 	dfs_rx_ops->dfs_destroy_object = tgt_dfs_destroy_object;
 	dfs_rx_ops->dfs_radar_enable = tgt_dfs_radar_enable;
-	dfs_rx_ops->dfs_attach = tgt_dfs_attach;
-	dfs_rx_ops->dfs_sif_dfs_detach = tgt_sif_dfs_detach;
 	dfs_rx_ops->dfs_control = tgt_dfs_control;
-	dfs_rx_ops->dfs_nif_dfs_reset = tgt_nif_dfs_reset;
 	dfs_rx_ops->dfs_is_precac_timer_running =
 		tgt_dfs_is_precac_timer_running;
 	dfs_rx_ops->dfs_find_vht80_chan_for_precac =