Parcourir la source

qcacmn: Add usenol support for full offload

In fulloffload mode, based on the value of the usenol variable decide
whether to add the channel to NOL or not. In future, we need to merge
this code with non-full offload. That will remove redundant code.

Change-Id: I2bb403c3983a4a1eac906e6c13a3ec6a13fdc436
CRs-fixed: 2102829
Shaakir Mohamed il y a 7 ans
Parent
commit
6f35bb0636

+ 12 - 12
umac/dfs/core/src/dfs.h

@@ -548,7 +548,6 @@ struct dfs_nolelem {
 
 /**
  * struct dfs_info - DFS Info.
- * @rn_use_nol:            Use the NOL when radar found (default: TRUE).
  * @rn_ftindex:            Number of different types of radars.
  * @rn_lastfull_ts:        Last 64 bit timstamp from recv interrupt.
  * @rn_last_ts:            last 15 bit ts from recv descriptor.
@@ -564,7 +563,6 @@ struct dfs_nolelem {
  * @dfs_last_bin5_dur:     Last bin5 during.
  */
 struct dfs_info {
-	int       rn_use_nol;
 	uint32_t  rn_ftindex;
 	uint64_t  rn_lastfull_ts;
 	uint16_t  rn_last_ts;
@@ -782,6 +780,7 @@ struct dfs_event_log {
  * @dfs_precac_done_list:  PreCAC done list.
  * @dfs_precac_nol_list:   PreCAC NOL List.
  * @dfs_is_offload_enabled: Set if DFS offload enabled.
+ * @dfs_use_nol: Use the NOL when radar found (default: TRUE).
  */
 struct wlan_dfs {
 	uint32_t  dfs_debug_mask;
@@ -871,6 +870,7 @@ struct wlan_dfs {
 	struct dfs_ieee80211_channel *dfs_curchan;
 	struct wlan_objmgr_pdev *dfs_pdev_obj;
 	bool dfs_is_offload_enabled;
+	int dfs_use_nol;
 };
 
 /**
@@ -1527,12 +1527,6 @@ void dfs_cancel_cac_timer(struct wlan_dfs *dfs);
  */
 void dfs_start_cac_timer(struct wlan_dfs *dfs);
 
-/**
- * dfs_get_usenol() - Returns use_nol flag.
- * @dfs: Pointer to wlan_dfs structure.
- */
-uint16_t dfs_get_usenol(struct wlan_dfs *dfs);
-
 /**
  * dfs_set_update_nol_flag() - Sets update_nol flag.
  * @dfs: Pointer to wlan_dfs structure.
@@ -1548,10 +1542,10 @@ void dfs_set_update_nol_flag(struct wlan_dfs *dfs,
 bool dfs_get_update_nol_flag(struct wlan_dfs *dfs);
 
 /**
- * dfs_get_rn_use_nol() - Get usenol.
+ * dfs_get_use_nol() - Get usenol.
  * @dfs: Pointer to wlan_dfs structure.
  */
-int dfs_get_rn_use_nol(struct wlan_dfs *dfs);
+int dfs_get_use_nol(struct wlan_dfs *dfs);
 
 /**
  * dfs_get_nol_timeout() - Get NOL timeout.
@@ -1924,10 +1918,16 @@ void bin5_rules_check_internal(struct wlan_dfs *dfs,
 		int *index);
 
 /**
- * dfs_main_timer_init() - Initialize dfs timers.
+ * dfs_main_task_timer_init() - Initialize dfs task timer.
+ * @dfs: Pointer to wlan_dfs structure.
+ */
+void dfs_main_task_timer_init(struct wlan_dfs *dfs);
+
+/**
+ * dfs_main_task_testtimer_init() - Initialize dfs task testtimer.
  * @dfs: Pointer to wlan_dfs structure.
  */
-void dfs_main_timer_init(struct wlan_dfs *dfs);
+void dfs_main_task_testtimer_init(struct wlan_dfs *dfs);
 
 /**
  * dfs_main_timer_reset() - Stop dfs timers.

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

@@ -493,7 +493,7 @@ void dfs_radar_found_action(struct wlan_dfs *dfs)
 {
 	bool wait_for_csa = false;
 
-	if (dfs->dfs_rinfo.rn_use_nol == 1) {
+	if (dfs->dfs_use_nol == 1) {
 		/*
 		 * If precac is running and the radar found in secondary
 		 * VHT80 mark the channel as radar and add to NOL list.
@@ -530,7 +530,7 @@ void dfs_radar_found_action(struct wlan_dfs *dfs)
 	 * from precac-required-list and precac-done-list to
 	 * precac-nol-list.
 	 */
-	if (dfs->dfs_rinfo.rn_use_nol == 1) {
+	if (dfs->dfs_use_nol == 1) {
 		dfs_mark_precac_dfs(dfs,
 				dfs->is_radar_found_on_secondary_seg);
 	}
@@ -553,7 +553,7 @@ void dfs_radar_found_action(struct wlan_dfs *dfs)
 	 * NOL code isn't used, that flag is never cleared. This
 	 * needs to be fixed. See EV 105776.
 	 */
-	if (dfs->dfs_rinfo.rn_use_nol == 1)  {
+	if (dfs->dfs_use_nol == 1)  {
 		dfs_mlme_start_rcsa(dfs->dfs_pdev_obj,
 				&wait_for_csa);
 		if (wait_for_csa)
@@ -572,7 +572,7 @@ void dfs_radar_found_action(struct wlan_dfs *dfs)
 		 */
 		dfs_radar_disable(dfs);
 		dfs_second_segment_radar_disable(dfs);
-	} else if (dfs->dfs_rinfo.rn_use_nol == 0) {
+	} else if (dfs->dfs_use_nol == 0) {
 		/*
 		 * For the test mode, don't do a CSA here; but setup
 		 * the test timer so we get a CSA _back_ to the

+ 24 - 9
umac/dfs/core/src/misc/dfs.c

@@ -95,19 +95,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)
+void dfs_main_task_timer_init(struct wlan_dfs *dfs)
 {
 	qdf_timer_init(NULL,
 			&(dfs->wlan_dfs_task_timer),
 			dfs_task,
 			(void *)(dfs),
 			QDF_TIMER_TYPE_WAKE_APPS);
+}
 
+void dfs_main_task_testtimer_init(struct wlan_dfs *dfs)
+{
 	qdf_timer_init(NULL,
-			&(dfs->wlan_dfstesttimer),
-			dfs_testtimer_task,
-			(void *)dfs,
-			QDF_TIMER_TYPE_WAKE_APPS);
+		&(dfs->wlan_dfstesttimer),
+		dfs_testtimer_task, (void *)dfs,
+		QDF_TIMER_TYPE_WAKE_APPS);
 }
 
 int dfs_create_object(struct wlan_dfs **dfs)
@@ -187,7 +189,7 @@ int dfs_main_attach(struct wlan_dfs *dfs)
 	dfs->dfs_enable = 1;
 
 	/*Verify : Passing NULL to qdf_timer_init().*/
-	dfs_main_timer_init(dfs);
+	dfs_main_task_timer_init(dfs);
 
 	WLAN_DFSQ_LOCK_INIT(dfs);
 	STAILQ_INIT(&dfs->dfs_radarq);
@@ -250,7 +252,7 @@ int dfs_main_attach(struct wlan_dfs *dfs)
 	else if (usenol == 2)
 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "NOL disabled; no CSA");
 
-	dfs->dfs_rinfo.rn_use_nol = usenol;
+	dfs->dfs_use_nol = usenol;
 
 	/* Init the cached extension channel busy for false alarm reduction */
 	dfs->dfs_rinfo.ext_chan_busy_ts = lmac_get_tsf64(dfs->dfs_pdev_obj);
@@ -309,6 +311,14 @@ int dfs_attach(struct wlan_dfs *dfs)
 
 	if (!dfs->dfs_is_offload_enabled) {
 		ret = dfs_main_attach(dfs);
+
+	/*
+	 * For full offload we have a wmi handler registered to process a radar
+	 * event from firmware in the event of a radar detect.So ,init of timer,
+	 * dfs_task is not required for full offload. dfs_task timer is called
+	 * in dfs_main_timer_init within dfs_main_attach for partial offload
+	 * in the event of radar detect.
+	 */
 		if (ret) {
 			dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "dfs_main_attach failed");
 			return ret;
@@ -318,6 +328,11 @@ int dfs_attach(struct wlan_dfs *dfs)
 	dfs_zero_cac_attach(dfs);
 	dfs_nol_attach(dfs);
 
+	/*
+	 * Init of timer ,dfs_testtimer_task is required by both partial
+	 * and full offload, indicating test mode timer initilization for both.
+	 */
+	dfs_main_task_testtimer_init(dfs);
 	return 0;
 }
 
@@ -844,7 +859,7 @@ int dfs_control(struct wlan_dfs *dfs,
 			break;
 		}
 		*outsize = sizeof(uint32_t);
-		*((uint32_t *)outdata) = dfs->dfs_rinfo.rn_use_nol;
+		*((uint32_t *)outdata) = dfs->dfs_use_nol;
 
 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
 				"#Phyerr=%d, #false detect=%d, #queued=%d",
@@ -892,7 +907,7 @@ int dfs_control(struct wlan_dfs *dfs,
 			error = -EINVAL;
 			break;
 		}
-		dfs->dfs_rinfo.rn_use_nol = *(uint32_t *)indata;
+		dfs->dfs_use_nol = *(uint32_t *)indata;
 		break;
 	case DFS_GET_NOL:
 		if (!outdata || !outsize ||

+ 0 - 5
umac/dfs/core/src/misc/dfs_cac.c

@@ -78,11 +78,6 @@ void dfs_cac_valid_reset(struct wlan_dfs *dfs,
 	}
 }
 
-uint16_t dfs_get_usenol(struct wlan_dfs *dfs)
-{
-	return dfs ? (uint16_t)dfs->dfs_rinfo.rn_use_nol : 0;
-}
-
 void dfs_set_update_nol_flag(struct wlan_dfs *dfs, bool val)
 {
 	dfs->update_nol = val;

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

@@ -108,6 +108,7 @@ void dfs_nol_attach(struct wlan_dfs *dfs)
 {
 	dfs->wlan_dfs_nol_timeout = DFS_NOL_TIMEOUT_S;
 	dfs_nol_timer_init(dfs);
+	dfs->dfs_use_nol = 1;
 }
 
 /**
@@ -486,9 +487,9 @@ void dfs_nol_timer_cleanup(struct wlan_dfs *dfs)
 	dfs->dfs_nol = NULL;
 }
 
-int dfs_get_rn_use_nol(struct wlan_dfs *dfs)
+int dfs_get_use_nol(struct wlan_dfs *dfs)
 {
-	return dfs->dfs_rinfo.rn_use_nol;
+	return dfs->dfs_use_nol;
 }
 
 int dfs_get_nol_timeout(struct wlan_dfs *dfs)

+ 5 - 5
umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h

@@ -228,15 +228,15 @@ QDF_STATUS utils_dfs_get_update_nol_flag(struct wlan_objmgr_pdev *pdev,
 		bool *nol_flag);
 
 /**
- * utils_dfs_get_rn_use_nol() - Get usenol.
+ * utils_dfs_get_dfs_use_nol() - Get usenol.
  * @pdev: Pointer to DFS pdev object.
- * @rn_use_nol: Pointer to rn_use_nol.
+ * @dfs_use_nol: Pointer to dfs_use_nol.
  *
- * wrapper function for dfs_get_rn_use_nol(). this
+ * wrapper function for dfs_get_dfs_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);
+QDF_STATUS utils_dfs_get_dfs_use_nol(struct wlan_objmgr_pdev *pdev,
+		int *dfs_use_nol);
 
 /**
  * utils_dfs_get_nol_timeout() - Get NOL timeout.

+ 27 - 5
umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c

@@ -233,12 +233,34 @@ QDF_STATUS tgt_dfs_process_radar_ind(struct wlan_objmgr_pdev *pdev,
 		return QDF_STATUS_E_FAILURE;
 	}
 
-	dfs_process_radar_found_indication(dfs, radar_found);
-	dfs_mlme_mark_dfs(pdev, dfs->dfs_curchan->dfs_ch_ieee,
-		dfs->dfs_curchan->dfs_ch_freq,
-		dfs->dfs_curchan->dfs_ch_vhtop_ch_freq_seg2,
-		dfs->dfs_curchan->dfs_ch_flags);
+	/*
+	 * Check if the current channel is a non DFS channel
+	 */
+	if (!(IEEE80211_IS_CHAN_DFS(dfs->dfs_curchan) ||
+		((IEEE80211_IS_CHAN_11AC_VHT160(dfs->dfs_curchan) ||
+		IEEE80211_IS_CHAN_11AC_VHT80_80(dfs->dfs_curchan)) &&
+		IEEE80211_IS_CHAN_DFS_CFREQ2(dfs->dfs_curchan)))) {
+		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "radar event on a non-DFS channel");
+		return QDF_STATUS_E_FAILURE;
+	}
 
+	if (dfs->dfs_use_nol) {
+		dfs_process_radar_found_indication(dfs, radar_found);
+		dfs_mlme_mark_dfs(pdev, dfs->dfs_curchan->dfs_ch_ieee,
+				dfs->dfs_curchan->dfs_ch_freq,
+				dfs->dfs_curchan->dfs_ch_vhtop_ch_freq_seg2,
+				dfs->dfs_curchan->dfs_ch_flags);
+	} else{
+
+		/* We are in test mode and should send a CSA back
+		 * to same channel.
+		 */
+		qdf_timer_stop(&dfs->wlan_dfstesttimer);
+		dfs->wlan_dfstest = 1;
+		dfs->wlan_dfstest_ieeechan = dfs->dfs_curchan->dfs_ch_ieee;
+		dfs->wlan_dfstesttime = 1;   /* 1ms */
+		qdf_timer_mod(&dfs->wlan_dfstesttimer, dfs->wlan_dfstesttime);
+	}
 	return QDF_STATUS_SUCCESS;
 }
 EXPORT_SYMBOL(tgt_dfs_process_radar_ind);

+ 5 - 5
umac/dfs/dispatcher/src/wlan_dfs_utils_api.c

@@ -193,7 +193,7 @@ QDF_STATUS utils_dfs_get_usenol(struct wlan_objmgr_pdev *pdev, uint16_t *usenol)
 	if (!dfs)
 		return  QDF_STATUS_E_FAILURE;
 
-	*usenol = dfs_get_usenol(dfs);
+	*usenol = dfs_get_use_nol(dfs);
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -243,8 +243,8 @@ QDF_STATUS utils_dfs_get_update_nol_flag(struct wlan_objmgr_pdev *pdev,
 }
 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)
+QDF_STATUS utils_dfs_get_dfs_use_nol(struct wlan_objmgr_pdev *pdev,
+		int *dfs_use_nol)
 {
 	struct wlan_dfs *dfs;
 
@@ -252,11 +252,11 @@ QDF_STATUS utils_dfs_get_rn_use_nol(struct wlan_objmgr_pdev *pdev,
 	if (!dfs)
 		return  QDF_STATUS_E_FAILURE;
 
-	*rn_use_nol = dfs_get_rn_use_nol(dfs);
+	*dfs_use_nol = dfs_get_use_nol(dfs);
 
 	return QDF_STATUS_SUCCESS;
 }
-EXPORT_SYMBOL(utils_dfs_get_rn_use_nol);
+EXPORT_SYMBOL(utils_dfs_get_dfs_use_nol);
 
 QDF_STATUS utils_dfs_get_nol_timeout(struct wlan_objmgr_pdev *pdev,
 		int *dfs_nol_timeout)