qcacmn: Add scan public APIs for non-osif component

Adds wlan_scan_get_scan_id, wlan_scan_init_default_params,
wlan_scan_register_requester and wlan_scan_unregister_requester
APIs to use from non-osif component, as ucfg_* API should only
be used from OSIF.

Change-Id: Ia90313030e853c957ca85e47ff2b67097490ef87
CRs-Fixed: 2791549
Цей коміт міститься в:
Amruta Kulkarni
2020-10-07 16:33:18 -07:00
зафіксовано snandini
джерело 3ffa89227c
коміт 9c66930943
4 змінених файлів з 248 додано та 175 видалено

Переглянути файл

@@ -318,4 +318,64 @@ QDF_STATUS wlan_scan_start(struct scan_start_request *req);
*/
QDF_STATUS wlan_scan_cancel(struct scan_cancel_request *req);
/**
* wlan_scan_get_scan_id() - Public API to allocate scan ID
* @psoc: psoc object
*
* Public API, allocates a new scan id for caller
*
* Return: newly allocated scan ID
*/
wlan_scan_id
wlan_scan_get_scan_id(struct wlan_objmgr_psoc *psoc);
/**
* wlan_scan_init_default_params() - Public API to initialize scan params
* @vdev: vdev object
* @req: scan request object
*
* Public API to initialize scan start request with defaults scan params
*
* Return: QDF_STATUS_SUCCESS or error code
*/
QDF_STATUS
wlan_scan_init_default_params(struct wlan_objmgr_vdev *vdev,
struct scan_start_request *req);
/**
* wlan_scan_register_requester() - Public API, assigns requester ID
* to caller and registers scan event call back handler
* @psoc: psoc object
* @module_name:name of requester module
* @event_cb: event callback function pointer
* @arg: argument to @event_cb
*
* API, allows other components to allocate requester id.
* Normally used by modules at init time to register their callback
* and get one requester id. @event_cb will be invoked for
* all scan events whose requester id matches with @requester.
*
* Return: assigned non zero requester id for success
* zero (0) for failure
*/
wlan_scan_requester
wlan_scan_register_requester(struct wlan_objmgr_psoc *psoc,
uint8_t *module_name,
scan_event_handler event_cb,
void *arg);
/**
* wlan_scan_unregister_requester() -Public API, reclaims previously
* allocated requester ID
* @psoc: psoc object
* @requester: requester ID to reclaim.
*
* API, reclaims previously allocated requester id.
*
* Return: void
*/
void
wlan_scan_unregister_requester(struct wlan_objmgr_psoc *psoc,
wlan_scan_requester requester);
#endif

Переглянути файл

@@ -31,14 +31,14 @@
#include "wlan_scan_api.h"
/**
* ucfg_scan_register_requester() - assigns requester ID to caller and
* registers scan event call back handler
* ucfg_scan_register_requester() - Public ucfg API, assigns requester ID
* to caller and registers scan event call back handler
* @psoc: psoc object
* @module_name:name of requester module
* @event_cb: event callback function pointer
* @arg: argument to @event_cb
*
* API, allows other components to allocate requester id
* API, allows other components to allocate requester id.
* Normally used by modules at init time to register their callback
* and get one requester id. @event_cb will be invoked for
* all scan events whose requester id matches with @requester.
@@ -46,23 +46,29 @@
* Return: assigned non zero requester id for success
* zero (0) for failure
*/
wlan_scan_requester
static inline wlan_scan_requester
ucfg_scan_register_requester(struct wlan_objmgr_psoc *psoc,
uint8_t *module_name, scan_event_handler event_cb, void *arg);
uint8_t *module_name, scan_event_handler event_cb, void *arg)
{
return wlan_scan_register_requester(psoc, module_name, event_cb, arg);
}
/**
* ucfg_scan_unregister_requester() -reclaims previously allocated requester ID
* ucfg_scan_unregister_requester() -Public ucfg API, reclaims previously
* allocated requester ID
* @psoc: psoc object
* @requester: requester ID to reclaim.
*
* API, reclaims previously allocated requester id by
* ucfg_scan_get_req_id_reg_cb()
* API, reclaims previously allocated requester id.
*
* Return: void
*/
static inline
void ucfg_scan_unregister_requester(struct wlan_objmgr_psoc *psoc,
wlan_scan_requester requester);
wlan_scan_requester requester)
{
return wlan_scan_unregister_requester(psoc, requester);
}
/**
* ucfg_get_scan_requester_name()- returns module name of requester ID owner
@@ -76,18 +82,19 @@ void ucfg_scan_unregister_requester(struct wlan_objmgr_psoc *psoc,
uint8_t *ucfg_get_scan_requester_name(struct wlan_objmgr_psoc *psoc,
wlan_scan_requester requester);
/**
* ucfg_scan_get_scan_id() - allocates scan ID
* ucfg_scan_get_scan_id() - Public ucfg API to allocate scan ID
* @psoc: psoc object
*
* API, allocates a new scan id for caller
* Public ucfg API, allocates a new scan id for caller
*
* Return: newly allocated scan ID
*/
wlan_scan_id
ucfg_scan_get_scan_id(struct wlan_objmgr_psoc *psoc);
static inline
wlan_scan_id ucfg_scan_get_scan_id(struct wlan_objmgr_psoc *psoc)
{
return wlan_scan_get_scan_id(psoc);
}
#ifdef FEATURE_WLAN_SCAN_PNO
/**
@@ -454,17 +461,20 @@ ucfg_scan_unregister_event_handler(struct wlan_objmgr_pdev *pdev,
scan_event_handler event_cb, void *arg);
/**
* ucfg_scan_init_default_params() - get the defaults scan params
* ucfg_scan_init_default_params() - Public ucfg API to initialize scan params
* @vdev: vdev object
* @req: scan request object
*
* get the defaults scan params
* Public ucfg API to initialize scan start request with defaults scan params
*
* Return: QDF_STATUS_SUCCESS or error code
*/
QDF_STATUS
static inline QDF_STATUS
ucfg_scan_init_default_params(struct wlan_objmgr_vdev *vdev,
struct scan_start_request *req);
struct scan_start_request *req)
{
return wlan_scan_init_default_params(vdev, req);
}
/**
* ucfg_scan_init_ssid_params() - initialize scan request ssid list

Переглянути файл

@@ -418,3 +418,161 @@ req_free:
return status;
}
wlan_scan_id
wlan_scan_get_scan_id(struct wlan_objmgr_psoc *psoc)
{
wlan_scan_id id;
struct wlan_scan_obj *scan;
if (!psoc) {
QDF_ASSERT(0);
scm_err("null psoc");
return 0;
}
scan = wlan_psoc_get_scan_obj(psoc);
if (!scan) {
scm_err("scan object null");
return 0;
}
id = qdf_atomic_inc_return(&scan->scan_ids);
id = id & WLAN_SCAN_ID_MASK;
/* Mark this scan request as triggered by host
* by setting WLAN_HOST_SCAN_REQ_ID_PREFIX flag.
*/
id = id | WLAN_HOST_SCAN_REQ_ID_PREFIX;
scm_debug("scan_id: 0x%x", id);
return id;
}
QDF_STATUS
wlan_scan_init_default_params(struct wlan_objmgr_vdev *vdev,
struct scan_start_request *req)
{
struct scan_default_params *def;
if (!vdev | !req) {
scm_err("vdev: 0x%pK, req: 0x%pK", vdev, req);
return QDF_STATUS_E_INVAL;
}
def = wlan_vdev_get_def_scan_params(vdev);
if (!def) {
scm_err("wlan_vdev_get_def_scan_params returned NULL");
return QDF_STATUS_E_NULL_VALUE;
}
/* Zero out everything and explicitly set fields as required */
qdf_mem_zero(req, sizeof(*req));
req->vdev = vdev;
req->scan_req.vdev_id = wlan_vdev_get_id(vdev);
req->scan_req.scan_type = SCAN_TYPE_DEFAULT;
req->scan_req.scan_priority = def->scan_priority;
req->scan_req.dwell_time_active = def->active_dwell;
req->scan_req.dwell_time_active_2g = def->active_dwell_2g;
req->scan_req.dwell_time_active_6g = def->active_dwell_6g;
req->scan_req.dwell_time_passive_6g = def->passive_dwell_6g;
req->scan_req.dwell_time_passive = def->passive_dwell;
req->scan_req.min_rest_time = def->min_rest_time;
req->scan_req.max_rest_time = def->max_rest_time;
req->scan_req.repeat_probe_time = def->repeat_probe_time;
req->scan_req.probe_spacing_time = def->probe_spacing_time;
req->scan_req.idle_time = def->idle_time;
req->scan_req.max_scan_time = def->max_scan_time;
req->scan_req.probe_delay = def->probe_delay;
req->scan_req.burst_duration = def->burst_duration;
req->scan_req.n_probes = def->num_probes;
req->scan_req.adaptive_dwell_time_mode =
def->adaptive_dwell_time_mode;
req->scan_req.scan_flags = def->scan_flags;
req->scan_req.scan_events = def->scan_events;
req->scan_req.scan_random.randomize = def->enable_mac_spoofing;
return QDF_STATUS_SUCCESS;
}
wlan_scan_requester
wlan_scan_register_requester(struct wlan_objmgr_psoc *psoc,
uint8_t *name,
scan_event_handler event_cb,
void *arg)
{
int i, j;
struct wlan_scan_obj *scan;
struct scan_requester_info *requesters;
wlan_scan_requester requester = {0};
if (!psoc) {
scm_err("null psoc");
return 0;
}
scan = wlan_psoc_get_scan_obj(psoc);
if (!scan)
return 0;
requesters = scan->requesters;
qdf_spin_lock_bh(&scan->lock);
for (i = 0; i < WLAN_MAX_REQUESTORS; ++i) {
if (requesters[i].requester == 0) {
requesters[i].requester =
WLAN_SCAN_REQUESTER_ID_PREFIX | i;
j = 0;
while (name[j] && (j < (WLAN_MAX_MODULE_NAME - 1))) {
requesters[i].module[j] = name[j];
++j;
}
requesters[i].module[j] = 0;
requesters[i].ev_handler.func = event_cb;
requesters[i].ev_handler.arg = arg;
requester = requesters[i].requester;
break;
}
}
qdf_spin_unlock_bh(&scan->lock);
scm_debug("module: %s, event_cb: 0x%pK, arg: 0x%pK, reqid: %d",
name, event_cb, arg, requester);
return requester;
}
void
wlan_scan_unregister_requester(struct wlan_objmgr_psoc *psoc,
wlan_scan_requester requester)
{
int idx;
struct wlan_scan_obj *scan;
struct scan_requester_info *requesters;
idx = requester & WLAN_SCAN_REQUESTER_ID_PREFIX;
if (idx != WLAN_SCAN_REQUESTER_ID_PREFIX) {
scm_err("prefix didn't match for requester id %d", requester);
return;
}
idx = requester & WLAN_SCAN_REQUESTER_ID_MASK;
if (idx >= WLAN_MAX_REQUESTORS) {
scm_err("requester id %d greater than max value", requester);
return;
}
if (!psoc) {
scm_err("null psoc");
return;
}
scan = wlan_psoc_get_scan_obj(psoc);
if (!scan)
return;
requesters = scan->requesters;
scm_debug("reqid: %d", requester);
qdf_spin_lock_bh(&scan->lock);
requesters[idx].requester = 0;
requesters[idx].module[0] = 0;
requesters[idx].ev_handler.func = NULL;
requesters[idx].ev_handler.arg = NULL;
qdf_spin_unlock_bh(&scan->lock);
}

Переглянути файл

@@ -644,86 +644,6 @@ ucfg_scan_cancel_sync(struct scan_cancel_request *req)
return status;
}
wlan_scan_requester
ucfg_scan_register_requester(struct wlan_objmgr_psoc *psoc,
uint8_t *name, scan_event_handler event_cb, void *arg)
{
int i, j;
struct wlan_scan_obj *scan;
struct scan_requester_info *requesters;
wlan_scan_requester requester = {0};
if (!psoc) {
scm_err("null psoc");
return 0;
}
scan = wlan_psoc_get_scan_obj(psoc);
if (!scan)
return 0;
requesters = scan->requesters;
qdf_spin_lock_bh(&scan->lock);
for (i = 0; i < WLAN_MAX_REQUESTORS; ++i) {
if (requesters[i].requester == 0) {
requesters[i].requester =
WLAN_SCAN_REQUESTER_ID_PREFIX | i;
j = 0;
while (name[j] && (j < (WLAN_MAX_MODULE_NAME - 1))) {
requesters[i].module[j] = name[j];
++j;
}
requesters[i].module[j] = 0;
requesters[i].ev_handler.func = event_cb;
requesters[i].ev_handler.arg = arg;
requester = requesters[i].requester;
break;
}
}
qdf_spin_unlock_bh(&scan->lock);
scm_debug("module: %s, event_cb: 0x%pK, arg: 0x%pK, reqid: %d",
name, event_cb, arg, requester);
return requester;
}
void
ucfg_scan_unregister_requester(struct wlan_objmgr_psoc *psoc,
wlan_scan_requester requester)
{
int idx;
struct wlan_scan_obj *scan;
struct scan_requester_info *requesters;
idx = requester & WLAN_SCAN_REQUESTER_ID_PREFIX;
if (idx != WLAN_SCAN_REQUESTER_ID_PREFIX) {
scm_err("prefix didn't match for requester id %d", requester);
return;
}
idx = requester & WLAN_SCAN_REQUESTER_ID_MASK;
if (idx >= WLAN_MAX_REQUESTORS) {
scm_err("requester id %d greater than max value", requester);
return;
}
if (!psoc) {
scm_err("null psoc");
return;
}
scan = wlan_psoc_get_scan_obj(psoc);
if (!scan)
return;
requesters = scan->requesters;
scm_debug("reqid: %d", requester);
qdf_spin_lock_bh(&scan->lock);
requesters[idx].requester = 0;
requesters[idx].module[0] = 0;
requesters[idx].ev_handler.func = NULL;
requesters[idx].ev_handler.arg = NULL;
qdf_spin_unlock_bh(&scan->lock);
}
uint8_t*
ucfg_get_scan_requester_name(struct wlan_objmgr_psoc *psoc,
wlan_scan_requester requester)
@@ -750,35 +670,6 @@ ucfg_get_scan_requester_name(struct wlan_objmgr_psoc *psoc,
return (uint8_t *)"unknown";
}
wlan_scan_id
ucfg_scan_get_scan_id(struct wlan_objmgr_psoc *psoc)
{
wlan_scan_id id;
struct wlan_scan_obj *scan;
if (!psoc) {
QDF_ASSERT(0);
scm_err("null psoc");
return 0;
}
scan = wlan_psoc_get_scan_obj(psoc);
if (!scan) {
scm_err("scan object null");
return 0;
}
id = qdf_atomic_inc_return(&scan->scan_ids);
id = id & WLAN_SCAN_ID_MASK;
/* Mark this scan request as triggered by host
* by setting WLAN_HOST_SCAN_REQ_ID_PREFIX flag.
*/
id = id | WLAN_HOST_SCAN_REQ_ID_PREFIX;
scm_debug("scan_id: 0x%x", id);
return id;
}
static QDF_STATUS
scm_add_scan_event_handler(struct pdev_scan_ev_handler *pdev_ev_handler,
scan_event_handler event_cb, void *arg)
@@ -1041,52 +932,6 @@ ucfg_scan_unregister_event_handler(struct wlan_objmgr_pdev *pdev,
(found ? "removed" : "not found"), handler_cnt);
}
QDF_STATUS
ucfg_scan_init_default_params(struct wlan_objmgr_vdev *vdev,
struct scan_start_request *req)
{
struct scan_default_params *def;
if (!vdev | !req) {
scm_err("vdev: 0x%pK, req: 0x%pK", vdev, req);
return QDF_STATUS_E_INVAL;
}
def = wlan_vdev_get_def_scan_params(vdev);
if (!def) {
scm_err("wlan_vdev_get_def_scan_params returned NULL");
return QDF_STATUS_E_NULL_VALUE;
}
/* Zero out everything and explicitly set fields as required */
qdf_mem_zero(req, sizeof(*req));
req->vdev = vdev;
req->scan_req.vdev_id = wlan_vdev_get_id(vdev);
req->scan_req.scan_type = SCAN_TYPE_DEFAULT;
req->scan_req.scan_priority = def->scan_priority;
req->scan_req.dwell_time_active = def->active_dwell;
req->scan_req.dwell_time_active_2g = def->active_dwell_2g;
req->scan_req.dwell_time_active_6g = def->active_dwell_6g;
req->scan_req.dwell_time_passive_6g = def->passive_dwell_6g;
req->scan_req.dwell_time_passive = def->passive_dwell;
req->scan_req.min_rest_time = def->min_rest_time;
req->scan_req.max_rest_time = def->max_rest_time;
req->scan_req.repeat_probe_time = def->repeat_probe_time;
req->scan_req.probe_spacing_time = def->probe_spacing_time;
req->scan_req.idle_time = def->idle_time;
req->scan_req.max_scan_time = def->max_scan_time;
req->scan_req.probe_delay = def->probe_delay;
req->scan_req.burst_duration = def->burst_duration;
req->scan_req.n_probes = def->num_probes;
req->scan_req.adaptive_dwell_time_mode =
def->adaptive_dwell_time_mode;
req->scan_req.scan_flags = def->scan_flags;
req->scan_req.scan_events = def->scan_events;
req->scan_req.scan_random.randomize = def->enable_mac_spoofing;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_scan_init_ssid_params(struct scan_start_request *req,
uint32_t num_ssid, struct wlan_ssid *ssid_list)