qcacmn: Add LMAC interface for WIFI POS component

This change adds implementation for interfacing with LMAC for
southbound request to WMI and northbount events from WMI.

Change-Id: Ia027ec704d99ef586b89bfadce4f174c3bcf8c17
CRs-Fixed: 2003488
This commit is contained in:
Naveen Rawat
2017-03-06 16:04:45 -08:00
committed by Sandeep Puligilla
parent 445582f5b0
commit 18ceca16b7
9 changed files with 447 additions and 1 deletions

View File

@@ -33,6 +33,10 @@
#include "target_if_p2p.h" #include "target_if_p2p.h"
#endif #endif
#ifdef WIFI_POS_CONVERGED
#include "target_if_wifi_pos.h"
#endif
static struct target_if_ctx *g_target_if_ctx; static struct target_if_ctx *g_target_if_ctx;
struct target_if_ctx *target_if_get_ctx() struct target_if_ctx *target_if_get_ctx()
@@ -100,6 +104,19 @@ static void target_if_atf_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
} }
#endif /* WLAN_ATF_ENABLE */ #endif /* WLAN_ATF_ENABLE */
#ifdef WIFI_POS_CONVERGED
static void target_if_wifi_pos_tx_ops_register(
struct wlan_lmac_if_tx_ops *tx_ops)
{
target_if_wifi_pos_register_tx_ops(tx_ops);
}
#else
static void target_if_wifi_pos_tx_ops_register(
struct wlan_lmac_if_tx_ops *tx_ops)
{
}
#endif
static static
QDF_STATUS target_if_register_umac_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops) QDF_STATUS target_if_register_umac_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
{ {
@@ -108,6 +125,7 @@ QDF_STATUS target_if_register_umac_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
target_if_atf_tx_ops_register(tx_ops); target_if_atf_tx_ops_register(tx_ops);
target_if_wifi_pos_tx_ops_register(tx_ops);
/* Converged UMAC components to register their TX-ops here */ /* Converged UMAC components to register their TX-ops here */
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
@@ -141,7 +159,6 @@ QDF_STATUS target_if_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
{ {
/* Converged UMAC components to register their TX-ops */ /* Converged UMAC components to register their TX-ops */
target_if_register_umac_tx_ops(tx_ops); target_if_register_umac_tx_ops(tx_ops);
/* Components parallel to UMAC to register their TX-ops here */ /* Components parallel to UMAC to register their TX-ops here */
target_if_pmo_register_tx_ops_req(tx_ops); target_if_pmo_register_tx_ops_req(tx_ops);

View File

@@ -24,4 +24,91 @@
#ifndef _WIFI_POS_TGT_IF_H_ #ifndef _WIFI_POS_TGT_IF_H_
#define _WIFI_POS_TGT_IF_H_ #define _WIFI_POS_TGT_IF_H_
#include "qdf_types.h"
#include "qdf_status.h"
struct oem_data_req;
struct oem_data_rsp;
struct wlan_objmgr_psoc;
struct wlan_soc_southbound_cb;
struct wlan_lmac_if_tx_ops;
struct wlan_lmac_if_rx_ops;
#ifdef WIFI_POS_CONVERGED
/**
* target_if_wifi_pos_get_txops: api to get tx ops
* @psoc: pointer to psoc object
*
* Return: tx ops
*/
struct wlan_lmac_if_wifi_pos_tx_ops *target_if_wifi_pos_get_txops(
struct wlan_objmgr_psoc *psoc);
/**
* target_if_wifi_pos_get_rxops: api to get rx ops
* @psoc: pointer to psoc object
*
* Return: rx ops
*/
struct wlan_lmac_if_wifi_pos_rx_ops *target_if_wifi_pos_get_rxops(
struct wlan_objmgr_psoc *psoc);
/**
* target_if_wifi_pos_register_events: function to register with wmi event
* @psoc: pointer to psoc object
*
* Return: status of operation
*/
QDF_STATUS target_if_wifi_pos_register_events(struct wlan_objmgr_psoc *psoc);
/**
* target_if_wifi_pos_deregister_events: function to deregister wmi event
* @psoc: pointer to psoc object
*
* Return: status of operation
*/
QDF_STATUS target_if_wifi_pos_deregister_events(struct wlan_objmgr_psoc *psoc);
/**
* target_if_wifi_pos_register_tx_ops: function to register with lmac tx ops
* @tx_ops: lmac tx ops struct object
*
* Return: none
*/
void target_if_wifi_pos_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops);
/**
* target_if_wifi_pos_register_rx_ops: function to register with lmac rx ops
* @rx_ops: lmac rx ops struct object
*
* Return: none
*/
void target_if_wifi_pos_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops);
#else
static inline struct wlan_lmac_if_wifi_pos_tx_ops *target_if_wifi_pos_get_txops(
struct wlan_objmgr_psoc *psoc)
{
return NULL;
}
static inline struct wlan_lmac_if_wifi_pos_rx_ops *target_if_wifi_pos_get_rxops(
struct wlan_objmgr_psoc *psoc)
{
return NULL;
}
static inline void target_if_wifi_pos_register_tx_ops(
struct wlan_lmac_if_tx_ops *tx_ops)
{
}
static inline void target_if_wifi_pos_register_rx_ops(
struct wlan_lmac_if_rx_ops *rx_ops)
{
}
#endif
#endif /* _WIFI_POS_TGT_IF_H_ */ #endif /* _WIFI_POS_TGT_IF_H_ */

View File

@@ -30,4 +30,217 @@
* This file defines the functions pertinent to wifi positioning component's * This file defines the functions pertinent to wifi positioning component's
* target if layer. * target if layer.
*/ */
#include "../../../../umac/wifi_pos/src/wifi_pos_utils_i.h"
#include "wmi_unified_api.h"
#include "wlan_lmac_if_def.h"
#include "target_if_wifi_pos.h"
#include "../../../../umac/wifi_pos/src/wifi_pos_main_i.h"
#include "target_if.h"
/**
* wifi_pos_oem_rsp_ev_handler: handler registered with WMI_OEM_RESPONSE_EVENTID
* @scn: scn handle
* @data_buf: event buffer
* @data_len: event buffer length
*
* Return: status of operation
*/
static int wifi_pos_oem_rsp_ev_handler(ol_scn_t scn,
uint8_t *data_buf,
uint32_t data_len)
{
struct oem_data_rsp *oem_rsp = NULL;
struct wlan_objmgr_psoc *psoc = NULL;
struct wlan_lmac_if_wifi_pos_rx_ops *wifi_pos_rx_ops = NULL;
/* this will be implemented later */
if (!wifi_pos_rx_ops || !wifi_pos_rx_ops->oem_rsp_event_rx) {
wifi_pos_err("lmac callbacks not registered");
return QDF_STATUS_NOT_INITIALIZED;
}
return wifi_pos_rx_ops->oem_rsp_event_rx(psoc, oem_rsp);
}
/**
* wifi_pos_oem_cap_ev_handler: handler registered with wmi_oem_cap_event_id
* @scn: scn handle
* @buf: event buffer
* @len: event buffer length
*
* Return: status of operation
*/
static int wifi_pos_oem_cap_ev_handler(ol_scn_t scn, uint8_t *buf, uint32_t len)
{
/* TBD */
return 0;
}
/**
* wifi_pos_oem_meas_rpt_ev_handler: handler registered with
* wmi_oem_meas_report_event_id
* @scn: scn handle
* @buf: event buffer
* @len: event buffer length
*
* Return: status of operation
*/
static int wifi_pos_oem_meas_rpt_ev_handler(ol_scn_t scn, uint8_t *buf,
uint32_t len)
{
/* TBD */
return 0;
}
/**
* wifi_pos_oem_err_rpt_ev_handler: handler registered with
* wmi_oem_err_report_event_id
* @scn: scn handle
* @buf: event buffer
* @len: event buffer length
*
* Return: status of operation
*/
static int wifi_pos_oem_err_rpt_ev_handler(ol_scn_t scn, uint8_t *buf,
uint32_t len)
{
/* TBD */
return 0;
}
/**
* wifi_pos_oem_data_req() - start OEM data request to target
* @wma_handle: wma handle
* @req: start request params
*
* Return: QDF_STATUS
*/
static QDF_STATUS wifi_pos_oem_data_req(struct wlan_objmgr_psoc *psoc,
struct oem_data_req *req)
{
QDF_STATUS status;
void *wmi_hdl = GET_WMI_HDL_FROM_PSOC(psoc);
wifi_pos_debug("Send oem data req to target");
if (!req || !req->data) {
wifi_pos_err("oem_data_req is null");
return QDF_STATUS_E_INVAL;
}
if (!wmi_hdl) {
wifi_pos_err(FL("WMA closed, can't send oem data req cmd"));
return QDF_STATUS_E_INVAL;
}
status = wmi_unified_start_oem_data_cmd(wmi_hdl, req->data_len,
req->data);
if (!QDF_IS_STATUS_SUCCESS(status))
wifi_pos_err("wmi cmd send failed");
return status;
}
void target_if_wifi_pos_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
{
struct wlan_lmac_if_wifi_pos_tx_ops *wifi_pos_tx_ops;
wifi_pos_tx_ops = &tx_ops->wifi_pos_tx_ops;
wifi_pos_tx_ops->data_req_tx = wifi_pos_oem_data_req;
}
void target_if_wifi_pos_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops)
{
struct wlan_lmac_if_wifi_pos_rx_ops *wifi_pos_rx_ops;
wifi_pos_rx_ops = &rx_ops->wifi_pos_rx_ops;
wifi_pos_rx_ops->oem_rsp_event_rx = wifi_pos_oem_rsp_handler;
}
inline struct wlan_lmac_if_wifi_pos_tx_ops *target_if_wifi_pos_get_txops(
struct wlan_objmgr_psoc *psoc)
{
if (!psoc) {
wifi_pos_err("passed psoc is NULL");
return NULL;
}
return &psoc->soc_cb.tx_ops.wifi_pos_tx_ops;
}
inline struct wlan_lmac_if_wifi_pos_rx_ops *target_if_wifi_pos_get_rxops(
struct wlan_objmgr_psoc *psoc)
{
if (!psoc) {
wifi_pos_err("passed psoc is NULL");
return NULL;
}
return &psoc->soc_cb.rx_ops.wifi_pos_rx_ops;
}
QDF_STATUS target_if_wifi_pos_register_events(struct wlan_objmgr_psoc *psoc)
{
int ret;
if (!psoc || !psoc->tgt_if_handle) {
wifi_pos_err("psoc or psoc->tgt_if_handle is null");
return QDF_STATUS_E_INVAL;
}
ret = wmi_unified_register_event_handler(psoc->tgt_if_handle,
WMI_OEM_RESPONSE_EVENTID,
wifi_pos_oem_rsp_ev_handler,
WMI_RX_UMAC_CTX);
if (ret) {
wifi_pos_err("register_event_handler failed: err %d", ret);
return QDF_STATUS_E_INVAL;
}
ret = wmi_unified_register_event_handler(psoc->tgt_if_handle,
wmi_oem_cap_event_id,
wifi_pos_oem_cap_ev_handler,
WMI_RX_UMAC_CTX);
if (ret) {
wifi_pos_err("register_event_handler failed: err %d", ret);
return QDF_STATUS_E_INVAL;
}
ret = wmi_unified_register_event_handler(psoc->tgt_if_handle,
wmi_oem_meas_report_event_id,
wifi_pos_oem_meas_rpt_ev_handler,
WMI_RX_UMAC_CTX);
if (ret) {
wifi_pos_err("register_event_handler failed: err %d", ret);
return QDF_STATUS_E_INVAL;
}
ret = wmi_unified_register_event_handler(psoc->tgt_if_handle,
wmi_oem_report_event_id,
wifi_pos_oem_err_rpt_ev_handler,
WMI_RX_UMAC_CTX);
if (ret) {
wifi_pos_err("register_event_handler failed: err %d", ret);
return QDF_STATUS_E_INVAL;
}
return QDF_STATUS_SUCCESS;
}
QDF_STATUS target_if_wifi_pos_deregister_events(struct wlan_objmgr_psoc *psoc)
{
if (!psoc || !psoc->tgt_if_handle) {
wifi_pos_err("psoc or psoc->tgt_if_handle is null");
return QDF_STATUS_E_INVAL;
}
wmi_unified_unregister_event_handler(psoc->tgt_if_handle,
WMI_OEM_RESPONSE_EVENTID);
wmi_unified_unregister_event_handler(psoc->tgt_if_handle,
wmi_oem_cap_event_id);
wmi_unified_unregister_event_handler(psoc->tgt_if_handle,
wmi_oem_meas_report_event_id);
wmi_unified_unregister_event_handler(psoc->tgt_if_handle,
wmi_oem_report_event_id);
return QDF_STATUS_SUCCESS;
}

View File

@@ -31,6 +31,12 @@
/* Number of dev type: Direct attach and Offload */ /* Number of dev type: Direct attach and Offload */
#define MAX_DEV_TYPE 2 #define MAX_DEV_TYPE 2
#ifdef WIFI_POS_CONVERGED
/* forward declarations */
struct oem_data_req;
struct oem_data_rsp;
#endif /* WIFI_POS_CONVERGED */
/** /**
* struct wlan_lmac_if_mgmt_txrx_tx_ops - structure of tx function * struct wlan_lmac_if_mgmt_txrx_tx_ops - structure of tx function
* pointers for mgmt txrx component * pointers for mgmt txrx component
@@ -312,6 +318,18 @@ struct wlan_lmac_if_atf_tx_ops {
}; };
#endif #endif
#ifdef WIFI_POS_CONVERGED
/*
* struct wlan_lmac_if_wifi_pos_tx_ops - structure of firmware tx function
* pointers for wifi_pos component
* @data_req_tx: function pointer to send wifi_pos req to firmware
*/
struct wlan_lmac_if_wifi_pos_tx_ops {
QDF_STATUS (*data_req_tx)(struct wlan_objmgr_psoc *psoc,
struct oem_data_req *req);
};
#endif
/** /**
* struct wlan_lmac_if_tx_ops - south bound tx function pointers * struct wlan_lmac_if_tx_ops - south bound tx function pointers
* @mgmt_txrx_tx_ops: mgmt txrx tx ops * @mgmt_txrx_tx_ops: mgmt txrx tx ops
@@ -339,6 +357,9 @@ struct wlan_lmac_if_tx_ops {
#ifdef WLAN_ATF_ENABLE #ifdef WLAN_ATF_ENABLE
struct wlan_lmac_if_atf_tx_ops atf_tx_ops; struct wlan_lmac_if_atf_tx_ops atf_tx_ops;
#endif #endif
#ifdef WIFI_POS_CONVERGED
struct wlan_lmac_if_wifi_pos_tx_ops wifi_pos_tx_ops;
#endif
}; };
/** /**
@@ -506,6 +527,18 @@ struct wlan_lmac_if_atf_rx_ops {
}; };
#endif #endif
#ifdef WIFI_POS_CONVERGED
/**
* struct wlan_lmac_if_wifi_pos_rx_ops - structure of rx function
* pointers for wifi_pos component
* @oem_rsp_event_rx: callback for WMI_OEM_RESPONSE_EVENTID
*/
struct wlan_lmac_if_wifi_pos_rx_ops {
int (*oem_rsp_event_rx)(struct wlan_objmgr_psoc *psoc,
struct oem_data_rsp *oem_rsp);
};
#endif
/** /**
* struct wlan_lmac_if_rx_ops - south bound rx function pointers * struct wlan_lmac_if_rx_ops - south bound rx function pointers
* @arg1 * @arg1
@@ -531,6 +564,9 @@ struct wlan_lmac_if_rx_ops {
#ifdef WLAN_ATF_ENABLE #ifdef WLAN_ATF_ENABLE
struct wlan_lmac_if_atf_rx_ops atf_rx_ops; struct wlan_lmac_if_atf_rx_ops atf_rx_ops;
#endif #endif
#ifdef WIFI_POS_CONVERGED
struct wlan_lmac_if_wifi_pos_rx_ops wifi_pos_rx_ops;
#endif
}; };
/* Function pointer to call legacy tx_ops registration in OL/WMA. /* Function pointer to call legacy tx_ops registration in OL/WMA.

View File

@@ -25,6 +25,9 @@
#ifdef WLAN_ATF_ENABLE #ifdef WLAN_ATF_ENABLE
#include "wlan_atf_tgt_api.h" #include "wlan_atf_tgt_api.h"
#endif #endif
#ifdef WIFI_POS_CONVERGED
#include "target_if_wifi_pos.h"
#endif /* WIFI_POS_CONVERGED */
/* Function pointer for OL/WMA specific UMAC tx_ops /* Function pointer for OL/WMA specific UMAC tx_ops
* registration. * registration.
@@ -90,6 +93,19 @@ wlan_lmac_if_atf_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
} }
#endif #endif
#ifdef WIFI_POS_CONVERGED
static void wlan_lmac_if_umac_rx_ops_register_wifi_pos(
struct wlan_lmac_if_rx_ops *rx_ops)
{
target_if_wifi_pos_register_rx_ops(rx_ops);
}
#else
static void wlan_lmac_if_umac_rx_ops_register_wifi_pos(
struct wlan_lmac_if_rx_ops *rx_ops)
{
}
#endif /* WIFI_POS_CONVERGED */
/** /**
* wlan_lmac_if_umac_rx_ops_register() - UMAC rx handler register * wlan_lmac_if_umac_rx_ops_register() - UMAC rx handler register
* @rx_ops: Pointer to rx_ops structure to be populated * @rx_ops: Pointer to rx_ops structure to be populated
@@ -129,6 +145,9 @@ wlan_lmac_if_umac_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
rx_ops->scan.scan_ev_handler = tgt_scan_event_handler; rx_ops->scan.scan_ev_handler = tgt_scan_event_handler;
wlan_lmac_if_atf_rx_ops_register(rx_ops); wlan_lmac_if_atf_rx_ops_register(rx_ops);
/* wifi_pos rx ops */
wlan_lmac_if_umac_rx_ops_register_wifi_pos(rx_ops);
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }

View File

@@ -148,6 +148,22 @@ QDF_STATUS wifi_pos_init(void);
*/ */
QDF_STATUS wifi_pos_deinit(void); QDF_STATUS wifi_pos_deinit(void);
/**
* wifi_pos_psoc_enable: psoc enable API for wifi positioning component
* @psoc: pointer to PSOC
*
* Return: status of operation
*/
QDF_STATUS wifi_pos_psoc_enable(struct wlan_objmgr_psoc *psoc);
/**
* wifi_pos_psoc_disable: psoc disable API for wifi positioning component
* @psoc: pointer to PSOC
*
* Return: status of operation
*/
QDF_STATUS wifi_pos_psoc_disable(struct wlan_objmgr_psoc *psoc);
/** /**
* wifi_pos_set_oem_target_type: public API to set param in wifi_pos private * wifi_pos_set_oem_target_type: public API to set param in wifi_pos private
* object * object
@@ -271,6 +287,15 @@ static inline QDF_STATUS wifi_pos_deinit(void)
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
static inline QDF_STATUS wifi_pos_psoc_enable(struct wlan_objmgr_psoc *psoc)
{
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS wifi_pos_psoc_disable(struct wlan_objmgr_psoc *psoc)
{
return QDF_STATUS_SUCCESS;
}
#endif #endif
#endif #endif

View File

@@ -84,6 +84,26 @@ QDF_STATUS wifi_pos_deinit(void)
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
QDF_STATUS wifi_pos_psoc_enable(struct wlan_objmgr_psoc *psoc)
{
QDF_STATUS status = target_if_wifi_pos_register_events(psoc);
if (QDF_IS_STATUS_ERROR(status))
wifi_pos_err("target_if_wifi_pos_register_events failed");
return status;
}
QDF_STATUS wifi_pos_psoc_disable(struct wlan_objmgr_psoc *psoc)
{
QDF_STATUS status = target_if_wifi_pos_deregister_events(psoc);
if (QDF_IS_STATUS_ERROR(status))
wifi_pos_err("target_if_wifi_pos_deregister_events failed");
return QDF_STATUS_SUCCESS;
}
void wifi_pos_set_oem_target_type(struct wlan_objmgr_psoc *psoc, uint32_t val) void wifi_pos_set_oem_target_type(struct wlan_objmgr_psoc *psoc, uint32_t val)
{ {
struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =

View File

@@ -177,6 +177,24 @@ QDF_STATUS wifi_pos_psoc_obj_destroyed_notification(
return status; return status;
} }
int wifi_pos_oem_rsp_handler(struct wlan_objmgr_psoc *psoc,
struct oem_data_rsp *oem_rsp)
{
struct wifi_pos_psoc_priv_obj *wifi_pos_obj =
wifi_pos_get_psoc_priv_obj(psoc);
/* handle oem event here */
if (oem_rsp->rsp_len > OEM_DATA_RSP_SIZE) {
wifi_pos_err("invalid length of Oem Data response");
return -EINVAL;
}
wifi_pos_debug("sending oem data rsp, len: %d to pid: %d",
oem_rsp->rsp_len, wifi_pos_obj->app_pid);
wifi_pos_obj->wifi_pos_send_rsp(psoc, ANI_MSG_OEM_DATA_RSP,
oem_rsp->rsp_len, oem_rsp->data);
return 0;
}
#ifdef UMAC_REG_COMPONENT #ifdef UMAC_REG_COMPONENT
/* enable this when regulatory component gets merged */ /* enable this when regulatory component gets merged */
static void get_ch_info(struct wlan_objmgr_psoc *psoc, static void get_ch_info(struct wlan_objmgr_psoc *psoc,

View File

@@ -54,4 +54,15 @@ QDF_STATUS wifi_pos_psoc_obj_created_notification(
*/ */
QDF_STATUS wifi_pos_psoc_obj_destroyed_notification( QDF_STATUS wifi_pos_psoc_obj_destroyed_notification(
struct wlan_objmgr_psoc *psoc, void *arg_list); struct wlan_objmgr_psoc *psoc, void *arg_list);
/**
* wifi_pos_oem_rsp_handler: lmac rx ops registered
* @psoc: pointer to psoc object
* @oem_rsp: response from firmware
*
* Return: status of operation
*/
int wifi_pos_oem_rsp_handler(struct wlan_objmgr_psoc *psoc,
struct oem_data_rsp *oem_rsp);
#endif #endif