Explorar o código

qcacmn: Register a DFS callback function to get AP CAC status

In Repeater AP scenario, when STA vap starts scan, it calls this
registered DFS callback function to get the AP CAC status. If the
AP vap is performing CAC, STA vap does not start SCAN.

Change-Id: Ifa3ad0298f1b04f3fffc915f20ff81ec0cc731bf
CRs-Fixed: 2096259
Shashikala Prabhu %!s(int64=7) %!d(string=hai) anos
pai
achega
76192e12a9

+ 1 - 1
init_deinit/dispatcher/src/dispatcher_init_deinit.c

@@ -563,7 +563,7 @@ static QDF_STATUS dispatcher_dfs_psoc_enable(struct wlan_objmgr_psoc *psoc)
 
 static QDF_STATUS dispatcher_dfs_psoc_disable(struct wlan_objmgr_psoc *psoc)
 {
-	return QDF_STATUS_SUCCESS;
+	return wifi_dfs_psoc_disable(psoc);
 }
 #else
 static QDF_STATUS dispatcher_init_dfs(void)

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

@@ -803,11 +803,11 @@ struct wlan_dfs {
 	os_timer_t dfs_cac_timer;
 	os_timer_t dfs_cac_valid_timer;
 	int dfs_cac_timeout_override;
-	int8_t dfs_enable:1,
-		   dfs_cac_timer_running:1,
-		   dfs_ignore_dfs:1,
-		   dfs_ignore_cac:1,
-		   dfs_cac_valid:1;
+	uint8_t dfs_enable:1,
+		dfs_cac_timer_running:1,
+		dfs_ignore_dfs:1,
+		dfs_ignore_cac:1,
+		dfs_cac_valid:1;
 	uint32_t dfs_cac_valid_time;
 	os_timer_t dfs_precac_timer;
 	int dfs_precac_timeout_override;

+ 6 - 0
umac/dfs/dispatcher/inc/wlan_dfs_init_deinit_api.h

@@ -69,4 +69,10 @@ QDF_STATUS wlan_dfs_pdev_obj_destroy_notification(struct wlan_objmgr_pdev *pdev,
  */
 QDF_STATUS wifi_dfs_psoc_enable(struct wlan_objmgr_psoc *psoc);
 
+/**
+ * wifi_dfs_psoc_disable() - handles deregistering dfs event handlers.
+ * @psoc: psoc object.
+ */
+QDF_STATUS wifi_dfs_psoc_disable(struct wlan_objmgr_psoc *psoc);
+
 #endif /* _WLAN_DFS_INIT_DEINIT_API_H_ */

+ 67 - 1
umac/dfs/dispatcher/src/wlan_dfs_init_deinit_api.c

@@ -31,6 +31,7 @@
 #include "wlan_dfs_init_deinit_api.h"
 #include "../../core/src/dfs.h"
 #include "a_types.h"
+#include "wlan_serialization_api.h"
 
 struct dfs_to_mlme global_dfs_to_mlme;
 
@@ -203,17 +204,82 @@ QDF_STATUS wlan_dfs_pdev_obj_destroy_notification(struct wlan_objmgr_pdev *pdev,
 	return QDF_STATUS_SUCCESS;
 }
 
+static void dfs_scan_serialization_comp_info_cb(
+		struct wlan_objmgr_vdev *vdev,
+		union wlan_serialization_rules_info *comp_info)
+{
+	struct wlan_dfs *dfs;
+	struct wlan_objmgr_pdev *pdev;
+
+	if (!comp_info) {
+		DFS_PRINTK("%s: comp_info is NULL\n", __func__);
+		return;
+	}
+
+	if (!vdev) {
+		DFS_PRINTK("%s: vdev is NULL\n", __func__);
+		return;
+	}
+
+	pdev = wlan_vdev_get_pdev(vdev);
+	if (!pdev) {
+		DFS_PRINTK("%s: pdev is NULL\n", __func__);
+		return;
+	}
+
+	dfs = wlan_pdev_get_dfs_obj(pdev);
+	if (dfs == NULL) {
+		DFS_PRINTK("%s: dfs is NULL\n", __func__);
+		return;
+	}
+
+	if (dfs_is_ap_cac_timer_running(dfs))
+		comp_info->scan_info.is_cac_in_progress = true;
+	else
+		comp_info->scan_info.is_cac_in_progress = false;
+}
+
 QDF_STATUS wifi_dfs_psoc_enable(struct wlan_objmgr_psoc *psoc)
 {
+	QDF_STATUS status;
 	bool dfs_offload =
 		DFS_OFFLOAD_IS_ENABLED(psoc->service_param.service_bitmap);
 
 	DFS_PRINTK("%s: dfs_offload %d\n", __func__, dfs_offload);
 
-	if (QDF_STATUS_SUCCESS != tgt_dfs_reg_ev_handler(psoc, dfs_offload)) {
+	status = tgt_dfs_reg_ev_handler(psoc, dfs_offload);
+	if (status != QDF_STATUS_SUCCESS) {
 		DFS_PRINTK("%s: tgt_dfs_reg_ev_handler failed\n", __func__);
 		return QDF_STATUS_E_FAILURE;
 	}
 
+	status = wlan_serialization_register_comp_info_cb(psoc,
+			WLAN_UMAC_COMP_DFS,
+			WLAN_SER_CMD_SCAN,
+			dfs_scan_serialization_comp_info_cb);
+	if (status != QDF_STATUS_SUCCESS) {
+		DFS_PRINTK(
+				"%s :Serialize scan cmd register failed\n",
+				__func__);
+		return status;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS wifi_dfs_psoc_disable(struct wlan_objmgr_psoc *psoc)
+{
+	QDF_STATUS status;
+
+	status = wlan_serialization_deregister_comp_info_cb(psoc,
+			WLAN_UMAC_COMP_DFS,
+			WLAN_SER_CMD_SCAN);
+	if (status != QDF_STATUS_SUCCESS) {
+		DFS_PRINTK(
+				"%s :Serialize scan cmd deregister failed\n",
+				__func__);
+		return status;
+	}
+
 	return QDF_STATUS_SUCCESS;
 }

+ 2 - 2
umac/scan/dispatcher/src/wlan_scan_ucfg_api.c

@@ -1334,13 +1334,13 @@ static bool scm_serialization_scan_rules_cb(
 		uint8_t comp_id)
 {
 	switch (comp_id) {
-	case QDF_MODULE_ID_TDLS:
+	case WLAN_UMAC_COMP_TDLS:
 		if (comp_info->scan_info.is_tdls_in_progress) {
 			scm_info("Cancel scan. Tdls in progress");
 			return false;
 		}
 		break;
-	case QDF_MODULE_ID_DFS:
+	case WLAN_UMAC_COMP_DFS:
 		if (comp_info->scan_info.is_cac_in_progress) {
 			scm_info("Cancel scan. CAC in progress");
 			return false;