qcacmn: Add support for PMO suspend and resume scan API

Register PMO suspend and resume scan API. In suspend API, abort
all pending scans.

Change-Id: Iec03383a958f1bf93d77a86c351532270c7fdcb8
CRs-Fixed: 2038163
This commit is contained in:
Abhishek Singh
2017-04-25 13:47:31 +05:30
committed by snandini
parent 0243d51fbe
commit 9f6058d24d
3 changed files with 105 additions and 4 deletions

View File

@@ -45,10 +45,6 @@
#define QCOM_VENDOR_IE_AGE_TYPE 0x100
#define QCOM_VENDOR_IE_AGE_LEN (sizeof(qcom_ie_age) - 2)
#define SCAN_DONE_EVENT_BUF_SIZE 4096
#define INVAL_SCAN_ID 0xFFFFFFFF
#define INVAL_VDEV_ID 0xFFFFFFFF
#define INVAL_PDEV_ID 0xFFFFFFFF
/**
* typedef struct qcom_ie_age - age ie

View File

@@ -49,6 +49,10 @@ typedef uint32_t wlan_scan_id;
#define SCM_CANCEL_SCAN_WAIT_TIME 50
#define SCM_CANCEL_SCAN_WAIT_ITERATION 100
#define INVAL_SCAN_ID 0xFFFFFFFF
#define INVAL_VDEV_ID 0xFFFFFFFF
#define INVAL_PDEV_ID 0xFFFFFFFF
#define BURST_SCAN_MAX_NUM_OFFCHANNELS 3
#define P2P_SCAN_MAX_BURST_DURATION 180
/* Increase dwell time for P2P search in ms */

View File

@@ -29,6 +29,9 @@
#include "../../core/src/wlan_scan_main.h"
#include "../../core/src/wlan_scan_manager.h"
#include "../../core/src/wlan_scan_cache_db.h"
#ifdef WLAN_PMO_ENABLE
#include <wlan_pmo_obj_mgmt_api.h>
#endif
QDF_STATUS ucfg_scan_register_bcn_cb(struct wlan_objmgr_psoc *psoc,
update_beacon_cb cb, enum scan_cb_type type)
@@ -1072,6 +1075,102 @@ QDF_STATUS ucfg_scan_update_roam_params(struct wlan_objmgr_psoc *psoc,
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS
ucfg_scan_cancel_pdev_scan(struct wlan_objmgr_pdev *pdev)
{
struct scan_cancel_request *req;
QDF_STATUS status;
struct wlan_objmgr_vdev *vdev;
req = qdf_mem_malloc(sizeof(*req));
if (!req) {
scm_err("Failed to allocate memory");
return QDF_STATUS_E_NOMEM;
}
vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, 0, WLAN_OSIF_ID);
if (!vdev) {
scm_err("Failed to get vdev");
return QDF_STATUS_E_INVAL;
}
req->vdev = vdev;
req->cancel_req.scan_id = INVAL_SCAN_ID;
wlan_pdev_obj_lock(pdev);
req->cancel_req.pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
wlan_pdev_obj_unlock(pdev);
req->cancel_req.vdev_id = INVAL_VDEV_ID;
req->cancel_req.req_type = WLAN_SCAN_CANCEL_PDEV_ALL;
status = ucfg_scan_cancel_sync(req);
if (QDF_IS_STATUS_ERROR(status))
scm_err("Cancel scan request failed");
wlan_objmgr_vdev_release_ref(vdev, WLAN_OSIF_ID);
return status;
}
#ifdef WLAN_PMO_ENABLE
static QDF_STATUS
ucfg_scan_suspend_handler(struct wlan_objmgr_psoc *psoc, void *arg)
{
struct wlan_objmgr_pdev *pdev = NULL;
QDF_STATUS status = QDF_STATUS_SUCCESS;
int i;
/* Check all pdev */
for (i = 0; i < WLAN_UMAC_MAX_PDEVS; i++) {
pdev = wlan_objmgr_get_pdev_by_id(psoc, i, WLAN_SCAN_ID);
if (!pdev)
continue;
if (ucfg_scan_get_pdev_status(pdev) !=
SCAN_NOT_IN_PROGRESS)
status = ucfg_scan_cancel_pdev_scan(pdev);
wlan_objmgr_pdev_release_ref(pdev, WLAN_SCAN_ID);
if (QDF_IS_STATUS_ERROR(status)) {
scm_err("failed to cancel scan for pdev_id %d", i);
return status;
}
}
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS
ucfg_scan_resume_handler(struct wlan_objmgr_psoc *psoc, void *arg)
{
return QDF_STATUS_SUCCESS;
}
static inline void
ucfg_scan_register_pmo_handler(void)
{
pmo_register_suspend_handler(WLAN_UMAC_COMP_SCAN,
ucfg_scan_suspend_handler, NULL);
pmo_register_resume_handler(WLAN_UMAC_COMP_SCAN,
ucfg_scan_resume_handler, NULL);
}
static inline void
ucfg_scan_unregister_pmo_handler(void)
{
pmo_unregister_suspend_handler(WLAN_UMAC_COMP_SCAN,
ucfg_scan_suspend_handler);
pmo_unregister_resume_handler(WLAN_UMAC_COMP_SCAN,
ucfg_scan_resume_handler);
}
#else
static inline void
ucfg_scan_register_pmo_handler(void)
{
}
static inline void
ucfg_scan_unregister_pmo_handler(void)
{
}
#endif
QDF_STATUS
ucfg_scan_psoc_open(struct wlan_objmgr_psoc *psoc)
{
@@ -1090,6 +1189,7 @@ ucfg_scan_psoc_open(struct wlan_objmgr_psoc *psoc)
/* Initialize the scan Globals */
wlan_scan_global_init(scan_obj);
qdf_spinlock_create(&scan_obj->lock);
ucfg_scan_register_pmo_handler();
return QDF_STATUS_SUCCESS;
}
@@ -1109,6 +1209,7 @@ ucfg_scan_psoc_close(struct wlan_objmgr_psoc *psoc)
scm_err("Failed to get scan object");
return QDF_STATUS_E_FAILURE;
}
ucfg_scan_unregister_pmo_handler();
qdf_spinlock_destroy(&scan_obj->lock);
wlan_pno_global_deinit(&scan_obj->pno_cfg);