Browse Source

qcacmn: Maintain FW ADFS support flags in dfs

Agile DFS support depends on the Firmware's aDFS support. This
information is propagated to the HOST in the WMI ready event as a flag.
This flag was not used by HOST before enabling agile DFS which resulted
in preCAC being enabled for the FW that does not support them.

Also, for certain chainmask configurations, aDFS should be enabled
only if the current pdev is operating in non 160 BW.
Introduce two new flags in the DFS object:
1. dfs_fw_adfs_support_160
2. dfs_fw_adfs_support_non_160

which specify FW support for ADFS for pdevs in 160 BW and non 160 BW
respectively. Make appropriate changes in is_agile_precac_enabled
check that includes fw support for the current operating bandwidth.

Also rename "dfs_agile_precac_enable" to "dfs_agile_precac_ucfg" and
"dfs_precac_enable" to dfs_legacy_precac_ucfg" in the dfs structure
to properly indicate what those booleans represent.

Change-Id: I202ead8ef109c707bfbda488064ecaa72a3f737f
CRs-Fixed: 2521654
Vignesh Mohan 5 years ago
parent
commit
fe0b8b48db

+ 9 - 5
umac/dfs/core/src/dfs.h

@@ -932,9 +932,6 @@ struct dfs_event_log {
  *                                   received.
  * @is_radar_during_precac:          Radar found during precac.
  * @dfs_precac_lock:                 Lock to protect precac lists.
- * @dfs_precac_enable:               Enable the precac for legacy chips.
- * @dfs_agile_precac_enable:         Enable preCAC for chips that supports agile
- *                                   detector engine.
  * @dfs_precac_secondary_freq:       Second segment freq for precac.
  *                                   Applicable to only legacy chips.
  * @dfs_precac_primary_freq:         PreCAC Primary freq applicable only to
@@ -1037,6 +1034,11 @@ struct dfs_event_log {
  *                                   to be sent in NOL IE with RCSA.
  * @dfs_is_rcsa_ie_sent:             To send or to not send RCSA IE.
  * @dfs_is_nol_ie_sent:              To send or to not send NOL IE.
+ * @dfs_legacy_precac_ucfg:          User configuration for legacy preCAC in
+ *                                   partial offload chipsets.
+ * @dfs_agile_precac_ucfg:           User configuration for agile preCAC.
+ * @dfs_fw_adfs_support_non_160:     Target Agile DFS support for non-160 BWs.
+ * @dfs_fw_adfs_support_160:         Target Agile DFS support for 160 BW.
  * @dfs_allow_hw_pulses:             Allow/Block HW pulses. When synthetic
  *                                   pulses are injected, the HW pulses should
  *                                   be blocked and this variable should be
@@ -1087,7 +1089,6 @@ struct wlan_dfs {
 	bool           dfs_radar_found_for_fo;
 	bool           is_radar_during_precac;
 	qdf_spinlock_t dfs_precac_lock;
-	bool           dfs_precac_enable;
 	uint8_t        dfs_precac_secondary_freq;
 	uint8_t        dfs_precac_primary_freq;
 	uint8_t        dfs_defer_precac_channel_change;
@@ -1182,7 +1183,10 @@ struct wlan_dfs {
 	uint8_t        dfs_nol_ie_bitmap;
 	bool           dfs_is_rcsa_ie_sent;
 	bool           dfs_is_nol_ie_sent;
-	bool           dfs_agile_precac_enable;
+	uint8_t        dfs_legacy_precac_ucfg:1,
+		       dfs_agile_precac_ucfg:1,
+		       dfs_fw_adfs_support_non_160:1,
+		       dfs_fw_adfs_support_160:1;
 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(WLAN_DFS_SYNTHETIC_RADAR)
 	bool           dfs_allow_hw_pulses;
 #endif

+ 37 - 11
umac/dfs/core/src/dfs_zero_cac.h

@@ -460,6 +460,18 @@ void dfs_agile_precac_start(struct wlan_dfs *dfs);
 void dfs_start_agile_precac_timer(struct wlan_dfs *dfs,
 				  uint8_t ocac_status,
 				  struct dfs_agile_cac_params *adfs_param);
+
+/**
+ * dfs_set_fw_adfs_support() - Set FW aDFS support in dfs object.
+ * @dfs: Pointer to wlan_dfs structure.
+ * @fw_adfs_support_160: aDFS enabled when pdev is on 160/80P80MHz.
+ * @fw_adfs_support_non_160: aDFS enabled when pdev is on 20/40/80MHz.
+ *
+ * Return: void.
+ */
+void dfs_set_fw_adfs_support(struct wlan_dfs *dfs,
+			     bool fw_adfs_support_160,
+			     bool fw_adfs_support_non_160);
 #else
 static inline void dfs_find_pdev_for_agile_precac(struct wlan_objmgr_pdev *pdev,
 						  uint8_t *cur_precac_dfs_index)
@@ -494,6 +506,13 @@ dfs_start_agile_precac_timer(struct wlan_dfs *dfs,
 			     struct dfs_agile_cac_params *adfs_param)
 {
 }
+
+static inline void
+dfs_set_fw_adfs_support(struct wlan_dfs *dfs,
+			bool fw_adfs_support_160,
+			bool fw_adfs_support_non_160)
+{
+}
 #endif
 
 #if defined(QCA_SUPPORT_AGILE_DFS) || defined(ATH_SUPPORT_ZERO_CAC_DFS)
@@ -515,7 +534,7 @@ static inline void dfs_agile_soc_obj_init(struct wlan_dfs *dfs,
 /**
  * dfs_set_precac_enable() - Set precac enable flag.
  * @dfs: Pointer to wlan_dfs structure.
- * @value: input value for dfs_precac_enable flag.
+ * @value: input value for dfs_legacy_precac_ucfg flag.
  */
 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && !defined(QCA_MCL_DFS_SUPPORT)
 void dfs_set_precac_enable(struct wlan_dfs *dfs,
@@ -528,28 +547,35 @@ static inline void dfs_set_precac_enable(struct wlan_dfs *dfs,
 #endif
 
 /**
- * dfs_get_precac_enable() - Get precac enable flag.
- * @dfs: Pointer to wlan_dfs structure.
+ * dfs_is_legacy_precac_enabled() - Check if legacy preCAC is enabled for the
+ * DFS onject.
+ * @dfs: Pointer to the wlan_dfs object.
+ *
+ * Return: True if legacy preCAC is enabled, else false.
  */
 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && !defined(QCA_MCL_DFS_SUPPORT)
-uint32_t dfs_get_precac_enable(struct wlan_dfs *dfs);
+bool dfs_is_legacy_precac_enabled(struct wlan_dfs *dfs);
 #else
-static inline uint32_t dfs_get_precac_enable(struct wlan_dfs *dfs)
+static inline bool dfs_is_legacy_precac_enabled(struct wlan_dfs *dfs)
 {
 	return 0;
 }
 #endif
 
 /**
- * dfs_get_agile_precac_enable() - Get agile precac enable flag.
- * @dfs: Pointer to wlan_dfs structure.
+ * dfs_is_agile_precac_enabled() - Check if agile preCAC is enabled for the DFS.
+ * @dfs: Pointer to the wlan_dfs object.
+ *
+ * Return: True if agile DFS is enabled, else false.
  *
- * Return: Value of flag dfs_agile_precac_enable
+ * For agile preCAC to be enabled,
+ * 1. User configuration should be set.
+ * 2. Target should support aDFS.
  */
 #ifdef QCA_SUPPORT_AGILE_DFS
-bool dfs_get_agile_precac_enable(struct wlan_dfs *dfs);
+bool dfs_is_agile_precac_enabled(struct wlan_dfs *dfs);
 #else
-static inline bool dfs_get_agile_precac_enable(struct wlan_dfs *dfs)
+static inline bool dfs_is_agile_precac_enabled(struct wlan_dfs *dfs)
 {
 	return false;
 }
@@ -560,7 +586,7 @@ static inline bool dfs_get_agile_precac_enable(struct wlan_dfs *dfs)
  * dfs_set_precac_intermediate_chan() - Set intermediate chan to be used while
  *                                      doing precac.
  * @dfs: Pointer to wlan_dfs structure.
- * @value: input value for dfs_precac_enable flag.
+ * @value: input value for dfs_legacy_precac_ucfg flag.
  *
  * Return:
  * * 0       - Successfully set intermediate channel.

+ 5 - 3
umac/dfs/core/src/misc/dfs_process_radar_found_ind.c

@@ -348,7 +348,7 @@ dfs_compute_radar_found_cfreq(struct wlan_dfs *dfs,
 	     * legacy chips.
 	     */
 		if (dfs_is_precac_timer_running(dfs) &&
-		    (dfs->dfs_precac_enable)) {
+		    dfs_is_legacy_precac_enabled(dfs)) {
 			*freq_center = utils_dfs_chan_to_freq(
 					dfs->dfs_precac_secondary_freq);
 		} else {
@@ -542,7 +542,8 @@ uint8_t dfs_get_bonding_channels(struct wlan_dfs *dfs,
 		 * agile engines.
 		 * 2. preCAC timer is not running.
 		 */
-		if (dfs_is_precac_timer_running(dfs) && dfs->dfs_precac_enable)
+		if (dfs_is_precac_timer_running(dfs) &&
+		    dfs_is_legacy_precac_enabled(dfs))
 			center_chan = dfs->dfs_precac_secondary_freq;
 		else
 			center_chan = curchan->dfs_ch_vhtop_ch_freq_seg2;
@@ -785,7 +786,8 @@ QDF_STATUS dfs_process_radar_ind(struct wlan_dfs *dfs,
 
 	/* Sanity checks for radar on Agile detector */
 	if (radar_found->detector_id == AGILE_DETECTOR_ID &&
-	    (!dfs->dfs_agile_precac_enable || !dfs->dfs_agile_precac_freq)) {
+	    (!dfs_is_agile_precac_enabled(dfs) ||
+	     !dfs->dfs_agile_precac_freq)) {
 		dfs_err(dfs, WLAN_DEBUG_DFS,
 			"radar on Agile detector when ADFS is not running");
 		return QDF_STATUS_E_FAILURE;

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

@@ -525,4 +525,24 @@ tgt_dfs_send_subchan_marking(struct wlan_objmgr_pdev *pdev, bool subchanmark)
 	return QDF_STATUS_SUCCESS;
 }
 #endif
+#ifdef QCA_SUPPORT_AGILE_DFS
+/**
+ * tgt_dfs_set_fw_adfs_support() - Set FW aDFS support in dfs object.
+ * @pdev: Pointer to pdev object.
+ * @fw_adfs_support_160: aDFS enabled when pdev is on 160/80P80MHz.
+ * @fw_adfs_support_non_160: aDFS enabled when pdev is on 20/40/80MHz.
+ *
+ * Return: void.
+ */
+void tgt_dfs_set_fw_adfs_support(struct wlan_objmgr_pdev *pdev,
+				 bool fw_adfs_support_160,
+				 bool fw_adfs_support_non_160);
+#else
+static inline
+void tgt_dfs_set_fw_adfs_support(struct wlan_objmgr_pdev *pdev,
+				 bool fw_adfs_support_160,
+				 bool fw_adfs_support_non_160)
+{
+}
+#endif
 #endif /* _WLAN_DFS_TGT_API_H_ */

+ 8 - 6
umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h

@@ -240,7 +240,7 @@ QDF_STATUS ucfg_dfs_override_precac_timeout(struct wlan_objmgr_pdev *pdev,
 /**
  * ucfg_dfs_set_precac_enable() - Set precac enable flag.
  * @pdev: Pointer to DFS pdev object.
- * @value: input value for dfs_precac_enable flag.
+ * @value: input value for dfs_legacy_precac_ucfg flag.
  *
  * Wrapper function for dfs_set_precac_enable().
  * This function called from outside of dfs component.
@@ -249,21 +249,23 @@ QDF_STATUS ucfg_dfs_set_precac_enable(struct wlan_objmgr_pdev *pdev,
 				      uint32_t value);
 
 /**
- * ucfg_dfs_get_precac_enable() - Get precac enable flag.
+ * ucfg_dfs_get_legacy_precac_enable() - Get the legacy precac enable flag.
  * @pdev: Pointer to DFS pdev object.
  * @buff: Pointer to save precac_enable value.
  *
- * Wrapper function for dfs_get_precac_enable().
+ * Wrapper function for dfs_is_legacy_precac_enabled() and returns the
+ * legacy precac enable flag for partial offload chipsets.
  * This function called from outside of dfs component.
  */
-QDF_STATUS ucfg_dfs_get_precac_enable(struct wlan_objmgr_pdev *pdev, int *buff);
+QDF_STATUS ucfg_dfs_get_legacy_precac_enable(struct wlan_objmgr_pdev *pdev,
+					     bool *buff);
 
 /**
  * ucfg_dfs_get_agile_precac_enable() - Get agile precac enable flag.
  * @pdev: Pointer to DFS pdev object.
- * @buff: Pointer to save dfs_agile_precac_enable value.
+ * @buff: Pointer to save dfs_agile_precac_ucfg value.
  *
- * Wrapper function for dfs_get_agile_precac_enable().
+ * Wrapper function for dfs_is_legacy_precac_enabled().
  * This function called from outside of dfs component.
  *
  * Return:

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

@@ -772,3 +772,24 @@ bool tgt_dfs_is_stadfs_enabled(struct wlan_objmgr_pdev *pdev)
 
 	return dfs->dfs_is_stadfs_enabled;
 }
+
+#ifdef QCA_SUPPORT_AGILE_DFS
+void tgt_dfs_set_fw_adfs_support(struct wlan_objmgr_pdev *pdev,
+				 bool fw_adfs_support_160,
+				 bool fw_adfs_support_non_160)
+{
+	struct wlan_dfs *dfs;
+
+	dfs = wlan_pdev_get_dfs_obj(pdev);
+	if (!dfs) {
+		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
+		return;
+	}
+
+	dfs_set_fw_adfs_support(dfs,
+				fw_adfs_support_160,
+				fw_adfs_support_non_160);
+}
+
+qdf_export_symbol(tgt_dfs_set_fw_adfs_support);
+#endif

+ 6 - 5
umac/dfs/dispatcher/src/wlan_dfs_ucfg_api.c

@@ -139,8 +139,8 @@ QDF_STATUS ucfg_dfs_set_precac_enable(struct wlan_objmgr_pdev *pdev,
 }
 qdf_export_symbol(ucfg_dfs_set_precac_enable);
 
-QDF_STATUS ucfg_dfs_get_precac_enable(struct wlan_objmgr_pdev *pdev,
-		int *buff)
+QDF_STATUS ucfg_dfs_get_legacy_precac_enable(struct wlan_objmgr_pdev *pdev,
+					     bool *buff)
 {
 	struct wlan_dfs *dfs;
 
@@ -153,11 +153,12 @@ QDF_STATUS ucfg_dfs_get_precac_enable(struct wlan_objmgr_pdev *pdev,
 		return  QDF_STATUS_E_FAILURE;
 	}
 
-	*buff = dfs_get_precac_enable(dfs);
+	*buff = dfs_is_legacy_precac_enabled(dfs);
 
 	return QDF_STATUS_SUCCESS;
 }
-qdf_export_symbol(ucfg_dfs_get_precac_enable);
+
+qdf_export_symbol(ucfg_dfs_get_legacy_precac_enable);
 
 QDF_STATUS ucfg_dfs_get_agile_precac_enable(struct wlan_objmgr_pdev *pdev,
 					    bool *buff)
@@ -178,7 +179,7 @@ QDF_STATUS ucfg_dfs_get_agile_precac_enable(struct wlan_objmgr_pdev *pdev,
 		return QDF_STATUS_E_FAILURE;
 	}
 
-	*buff = dfs_get_agile_precac_enable(dfs);
+	*buff = dfs_is_agile_precac_enabled(dfs);
 
 	return QDF_STATUS_SUCCESS;
 }

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

@@ -1243,7 +1243,8 @@ struct wlan_lmac_if_wifi_pos_rx_ops {
  * @dfs_cancel_precac_timer:          Cancel the precac timer.
  * @dfs_override_precac_timeout:      Override the default precac timeout.
  * @dfs_set_precac_enable:            Set precac enable flag.
- * @dfs_get_precac_enable:            Get precac enable flag.
+ * @dfs_get_legacy_precac_enable:     Get the precac enable flag for
+ *                                    partial offload (legacy) chipsets.
  * @dfs_set_precac_intermediate_chan: Set intermediate channel for precac.
  * @dfs_get_precac_intermediate_chan: Get intermediate channel for precac.
  * @dfs_precac_preferred_chan:        Configure preferred channel during
@@ -1324,8 +1325,9 @@ struct wlan_lmac_if_dfs_rx_ops {
 			int precac_timeout);
 	QDF_STATUS (*dfs_set_precac_enable)(struct wlan_objmgr_pdev *pdev,
 			uint32_t value);
-	QDF_STATUS (*dfs_get_precac_enable)(struct wlan_objmgr_pdev *pdev,
-			int *buff);
+	QDF_STATUS
+	(*dfs_get_legacy_precac_enable)(struct wlan_objmgr_pdev *pdev,
+					bool *buff);
 	QDF_STATUS (*dfs_get_agile_precac_enable)(struct wlan_objmgr_pdev *pdev,
 						  bool *buff);
 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
@@ -1390,6 +1392,9 @@ struct wlan_lmac_if_dfs_rx_ops {
 	void (*dfs_allow_hw_pulses)(struct wlan_objmgr_pdev *pdev,
 				    bool allow_hw_pulses);
 	bool (*dfs_is_hw_pulses_allowed)(struct wlan_objmgr_pdev *pdev);
+	void (*dfs_set_fw_adfs_support)(struct wlan_objmgr_pdev *pdev,
+					bool fw_adfs_support_160,
+					bool fw_adfs_support_non_160);
 };
 
 /**

+ 6 - 2
umac/global_umac_dispatcher/lmac_if/src/wlan_lmac_if.c

@@ -391,8 +391,10 @@ wlan_lmac_if_umac_dfs_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
 	dfs_rx_ops->dfs_override_precac_timeout =
 		ucfg_dfs_override_precac_timeout;
 	dfs_rx_ops->dfs_set_precac_enable = ucfg_dfs_set_precac_enable;
-	dfs_rx_ops->dfs_get_precac_enable = ucfg_dfs_get_precac_enable;
-	dfs_rx_ops->dfs_get_agile_precac_enable = ucfg_dfs_get_agile_precac_enable;
+	dfs_rx_ops->dfs_get_legacy_precac_enable =
+		ucfg_dfs_get_legacy_precac_enable;
+	dfs_rx_ops->dfs_get_agile_precac_enable =
+		ucfg_dfs_get_agile_precac_enable;
 	dfs_rx_ops->dfs_get_override_precac_timeout =
 		ucfg_dfs_get_override_precac_timeout;
 	dfs_rx_ops->dfs_set_current_channel = tgt_dfs_set_current_channel;
@@ -428,6 +430,8 @@ wlan_lmac_if_umac_dfs_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
 		ucfg_dfs_allow_hw_pulses;
 	dfs_rx_ops->dfs_is_hw_pulses_allowed =
 		ucfg_dfs_is_hw_pulses_allowed;
+	dfs_rx_ops->dfs_set_fw_adfs_support =
+		tgt_dfs_set_fw_adfs_support;
 
 	register_precac_auto_chan_rx_ops(dfs_rx_ops);