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
This commit is contained in:
Shashikala Prabhu 2017-08-18 18:25:28 +05:30 • committed by snandini
commit 76192e12a9
5 changed files with 81 additions and 9 deletions

View file

@ -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)

View file

@ -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;

View file

@ -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_ */

View file

@ -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;
}

View file

@ -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;