From 76192e12a9b5c8ce6f4981fcfd1cdcb01cc979c1 Mon Sep 17 00:00:00 2001 From: Shashikala Prabhu Date: Fri, 18 Aug 2017 18:25:28 +0530 Subject: [PATCH] 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 --- .../dispatcher/src/dispatcher_init_deinit.c | 2 +- umac/dfs/core/src/dfs.h | 10 +-- .../dispatcher/inc/wlan_dfs_init_deinit_api.h | 6 ++ .../dispatcher/src/wlan_dfs_init_deinit_api.c | 68 ++++++++++++++++++- umac/scan/dispatcher/src/wlan_scan_ucfg_api.c | 4 +- 5 files changed, 81 insertions(+), 9 deletions(-) diff --git a/init_deinit/dispatcher/src/dispatcher_init_deinit.c b/init_deinit/dispatcher/src/dispatcher_init_deinit.c index 505f9012e7f6..c7fb503c4912 100644 --- a/init_deinit/dispatcher/src/dispatcher_init_deinit.c +++ b/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) diff --git a/umac/dfs/core/src/dfs.h b/umac/dfs/core/src/dfs.h index 85831b320244..77edfe494991 100644 --- a/umac/dfs/core/src/dfs.h +++ b/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; diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_init_deinit_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_init_deinit_api.h index a35214ddd18e..4da0c94b85c7 100644 --- a/umac/dfs/dispatcher/inc/wlan_dfs_init_deinit_api.h +++ b/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_ */ diff --git a/umac/dfs/dispatcher/src/wlan_dfs_init_deinit_api.c b/umac/dfs/dispatcher/src/wlan_dfs_init_deinit_api.c index 190fe641be95..66de12dcefbf 100644 --- a/umac/dfs/dispatcher/src/wlan_dfs_init_deinit_api.c +++ b/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; } diff --git a/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c b/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c index da27314aeba4..34901cbaf15a 100644 --- a/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c +++ b/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;