summaryrefslogtreecommitdiff
path: root/target_if
diff options
context:
space:
mode:
authorSathish Kumar <ksathis@codeaurora.org>2018-01-05 15:33:25 +0530
committersnandini <snandini@codeaurora.org>2018-01-11 04:43:42 -0800
commit7607184303da6060043223a642058e06f0c34b45 (patch)
tree98a0b7bf289180946012c756cdd1648047bb64d4 /target_if
parent1d3e9309b3d721fa7ecf4a6f6f3cf2e4dce9a718 (diff)
downloadqca-wfi-host-cmn-7607184303da6060043223a642058e06f0c34b45.tar.gz
qcacmn: Clean up direct buf rx framework
Direct buffer rx framework is cleaned up to have the following changes - 1. Init and deinit during target interface open and close to avoid multiple inits and deinits in case of multi-SOC chipsets 2. Register WMI events required for the framework through PSOC enable and disable 3. Rename API that attaches hal soc and osdev objects to psoc object 4. Module ID numbering starts from 0. Modify usage to adhere to it 5. Add API to get LMAC IF tx ops from psoc Change-Id: Ieceeb6c0e1a89c32f23b9c252e74671cd5c4a69b CRs-Fixed: 2167614
Diffstat (limited to 'target_if')
-rw-r--r--target_if/core/src/target_if_main.c26
-rw-r--r--target_if/direct_buf_rx/inc/target_if_direct_buf_rx_api.h20
-rw-r--r--target_if/direct_buf_rx/src/target_if_direct_buf_rx_api.c81
-rw-r--r--target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.c34
-rw-r--r--target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.h50
5 files changed, 135 insertions, 76 deletions
diff --git a/target_if/core/src/target_if_main.c b/target_if/core/src/target_if_main.c
index bdcec2a80..86e103446 100644
--- a/target_if/core/src/target_if_main.c
+++ b/target_if/core/src/target_if_main.c
@@ -84,6 +84,28 @@ struct wlan_objmgr_psoc *target_if_get_psoc_from_scn_hdl(void *scn_handle)
return psoc;
}
+#ifdef DIRECT_BUF_RX_ENABLE
+static QDF_STATUS target_if_direct_buf_rx_init(void)
+{
+ return direct_buf_rx_init();
+}
+
+static QDF_STATUS target_if_direct_buf_rx_deinit(void)
+{
+ return direct_buf_rx_deinit();
+}
+#else
+static QDF_STATUS target_if_direct_buf_rx_init(void)
+{
+ return QDF_STATUS_SUCCESS;
+}
+
+static QDF_STATUS target_if_direct_buf_rx_deinit(void)
+{
+ return QDF_STATUS_SUCCESS;
+}
+#endif /* DIRECT_BUF_RX_ENABLE */
+
QDF_STATUS target_if_open(get_psoc_handle_callback psoc_hdl_cb)
{
g_target_if_ctx = qdf_mem_malloc(sizeof(*g_target_if_ctx));
@@ -100,6 +122,8 @@ QDF_STATUS target_if_open(get_psoc_handle_callback psoc_hdl_cb)
g_target_if_ctx->get_psoc_hdl_cb = psoc_hdl_cb;
qdf_spin_unlock_bh(&g_target_if_ctx->lock);
+ target_if_direct_buf_rx_init();
+
return QDF_STATUS_SUCCESS;
}
@@ -121,6 +145,8 @@ QDF_STATUS target_if_close(void)
qdf_mem_free(g_target_if_ctx);
g_target_if_ctx = NULL;
+ target_if_direct_buf_rx_deinit();
+
return QDF_STATUS_SUCCESS;
}
diff --git a/target_if/direct_buf_rx/inc/target_if_direct_buf_rx_api.h b/target_if/direct_buf_rx/inc/target_if_direct_buf_rx_api.h
index 412a98d6b..897766e1e 100644
--- a/target_if/direct_buf_rx/inc/target_if_direct_buf_rx_api.h
+++ b/target_if/direct_buf_rx/inc/target_if_direct_buf_rx_api.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -57,35 +57,33 @@ struct direct_buf_rx_data {
};
/**
- * direct_buf_rx_attach: Function to initialize direct buf rx module
- * @psoc: pointer to psoc object
+ * direct_buf_rx_init() - Function to initialize direct buf rx module
*
* Return: QDF status of operation
*/
-QDF_STATUS direct_buf_rx_attach(struct wlan_objmgr_psoc *psoc);
+QDF_STATUS direct_buf_rx_init(void);
/**
- * direct_buf_rx_detach: Function to deinitialize direct buf rx module
- * @psoc: pointer to psoc object
+ * direct_buf_rx_deinit() - Function to deinitialize direct buf rx module
*
* Return: QDF status of operation
*/
-QDF_STATUS direct_buf_rx_detach(struct wlan_objmgr_psoc *psoc);
+QDF_STATUS direct_buf_rx_deinit(void);
/**
- * direct_buf_rx_psoc_obj_fill: Fill hal_soc,osdev in direct buf rx psoc obj
+ * direct_buf_rx_target_attach() - Attach hal_soc,osdev in direct buf rx psoc obj
* @psoc: pointer to psoc object
* @hal_soc: Opaque HAL SOC handle
* @osdev: QDF os device handle
*
* Return: QDF status of operation
*/
-QDF_STATUS direct_buf_rx_psoc_obj_fill(struct wlan_objmgr_psoc *psoc,
+QDF_STATUS direct_buf_rx_target_attach(struct wlan_objmgr_psoc *psoc,
void *hal_soc, qdf_device_t osdev);
/**
- * target_if_direct_buf_rx_register_tx_ops: Register tx ops for direct buffer
- * rx module
+ * target_if_direct_buf_rx_register_tx_ops() - Register tx ops for direct buffer
+ * rx module
* @tx_ops: pointer to lmac interface tx ops
*
* Return: None
diff --git a/target_if/direct_buf_rx/src/target_if_direct_buf_rx_api.c b/target_if/direct_buf_rx/src/target_if_direct_buf_rx_api.c
index 13aee3c24..a966081ee 100644
--- a/target_if/direct_buf_rx/src/target_if_direct_buf_rx_api.c
+++ b/target_if/direct_buf_rx/src/target_if_direct_buf_rx_api.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -24,17 +24,30 @@
#include <wlan_objmgr_cmn.h>
#include "target_if_direct_buf_rx_main.h"
-QDF_STATUS direct_buf_rx_attach(struct wlan_objmgr_psoc *psoc)
+QDF_STATUS direct_buf_rx_init(void)
{
QDF_STATUS status;
- status = target_if_direct_buf_rx_psoc_obj_create(psoc);
+ status = wlan_objmgr_register_psoc_create_handler(
+ WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
+ target_if_direct_buf_rx_psoc_create_handler,
+ NULL);
if (QDF_IS_STATUS_ERROR(status)) {
- direct_buf_rx_err("Failed to create psoc priv obj");
+ direct_buf_rx_err("Failed to register psoc create handler");
return status;
}
+ status = wlan_objmgr_register_psoc_destroy_handler(
+ WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
+ target_if_direct_buf_rx_psoc_destroy_handler,
+ NULL);
+
+ if (QDF_IS_STATUS_ERROR(status)) {
+ direct_buf_rx_err("Failed to register psoc destroy handler");
+ goto dbr_unreg_psoc_create;
+ }
+
status = wlan_objmgr_register_pdev_create_handler(
WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
target_if_direct_buf_rx_pdev_create_handler,
@@ -42,7 +55,7 @@ QDF_STATUS direct_buf_rx_attach(struct wlan_objmgr_psoc *psoc)
if (QDF_IS_STATUS_ERROR(status)) {
direct_buf_rx_err("Failed to register pdev create handler");
- goto dbr_destroy_psoc_handler;
+ goto dbr_unreg_psoc_destroy;
}
status = wlan_objmgr_register_pdev_destroy_handler(
@@ -55,45 +68,36 @@ QDF_STATUS direct_buf_rx_attach(struct wlan_objmgr_psoc *psoc)
goto dbr_unreg_pdev_create;
}
- status = target_if_direct_buf_rx_register_events(psoc);
-
- if (QDF_IS_STATUS_ERROR(status)) {
- direct_buf_rx_err("Direct Buffer RX register events failed");
- goto dbr_unreg_pdev_destroy;
- }
-
direct_buf_rx_info("Direct Buffer RX pdev,psoc create and destroy handlers registered");
return QDF_STATUS_SUCCESS;
-dbr_unreg_pdev_destroy:
- status = wlan_objmgr_unregister_pdev_destroy_handler(
- WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
- target_if_direct_buf_rx_pdev_destroy_handler,
- NULL);
-
dbr_unreg_pdev_create:
status = wlan_objmgr_unregister_pdev_create_handler(
WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
target_if_direct_buf_rx_pdev_create_handler,
NULL);
-dbr_destroy_psoc_handler:
- status = target_if_direct_buf_rx_psoc_obj_destroy(psoc);
+dbr_unreg_psoc_destroy:
+ status = wlan_objmgr_unregister_psoc_destroy_handler(
+ WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
+ target_if_direct_buf_rx_psoc_destroy_handler,
+ NULL);
+
+dbr_unreg_psoc_create:
+ status = wlan_objmgr_unregister_psoc_create_handler(
+ WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
+ target_if_direct_buf_rx_psoc_create_handler,
+ NULL);
return QDF_STATUS_E_FAILURE;
}
-qdf_export_symbol(direct_buf_rx_attach);
+qdf_export_symbol(direct_buf_rx_init);
-QDF_STATUS direct_buf_rx_detach(struct wlan_objmgr_psoc *psoc)
+QDF_STATUS direct_buf_rx_deinit(void)
{
QDF_STATUS status;
- status = target_if_direct_buf_rx_unregister_events(psoc);
-
- if (QDF_IS_STATUS_ERROR(status))
- direct_buf_rx_err("Direct Buffer RX unregister events failed");
-
status = wlan_objmgr_unregister_pdev_destroy_handler(
WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
target_if_direct_buf_rx_pdev_destroy_handler,
@@ -110,18 +114,29 @@ QDF_STATUS direct_buf_rx_detach(struct wlan_objmgr_psoc *psoc)
if (QDF_IS_STATUS_ERROR(status))
direct_buf_rx_err("Failed to unregister pdev create handler");
- status = target_if_direct_buf_rx_psoc_obj_destroy(psoc);
+ status = wlan_objmgr_unregister_psoc_destroy_handler(
+ WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
+ target_if_direct_buf_rx_psoc_destroy_handler,
+ NULL);
+
+ if (QDF_IS_STATUS_ERROR(status))
+ direct_buf_rx_err("Failed to unregister psoc destroy handler");
+
+ status = wlan_objmgr_unregister_psoc_create_handler(
+ WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
+ target_if_direct_buf_rx_psoc_create_handler,
+ NULL);
if (QDF_IS_STATUS_ERROR(status))
- direct_buf_rx_err("Failed to destroy psoc priv obj");
+ direct_buf_rx_err("Failed to unregister psoc create handler");
direct_buf_rx_info("Direct Buffer RX pdev,psoc create and destroy handlers unregistered");
return status;
}
-qdf_export_symbol(direct_buf_rx_detach);
+qdf_export_symbol(direct_buf_rx_deinit);
-QDF_STATUS direct_buf_rx_psoc_obj_fill(struct wlan_objmgr_psoc *psoc,
+QDF_STATUS direct_buf_rx_target_attach(struct wlan_objmgr_psoc *psoc,
void *hal_soc, qdf_device_t osdev)
{
struct direct_buf_rx_psoc_obj *dbr_psoc_obj;
@@ -151,5 +166,9 @@ void target_if_direct_buf_rx_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
{
tx_ops->dbr_tx_ops.direct_buf_rx_module_register =
target_if_direct_buf_rx_module_register;
+ tx_ops->dbr_tx_ops.direct_buf_rx_register_events =
+ target_if_direct_buf_rx_register_events;
+ tx_ops->dbr_tx_ops.direct_buf_rx_unregister_events =
+ target_if_direct_buf_rx_unregister_events;
}
qdf_export_symbol(target_if_direct_buf_rx_register_tx_ops);
diff --git a/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.c b/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.c
index 3b1f90f77..083d61aa4 100644
--- a/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.c
+++ b/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -199,8 +199,8 @@ QDF_STATUS target_if_direct_buf_rx_pdev_destroy_handler(
return status;
}
-QDF_STATUS target_if_direct_buf_rx_psoc_obj_create(
- struct wlan_objmgr_psoc *psoc)
+QDF_STATUS target_if_direct_buf_rx_psoc_create_handler(
+ struct wlan_objmgr_psoc *psoc, void *data)
{
struct direct_buf_rx_psoc_obj *dbr_psoc_obj;
QDF_STATUS status;
@@ -239,8 +239,8 @@ attach_error:
return status;
}
-QDF_STATUS target_if_direct_buf_rx_psoc_obj_destroy(
- struct wlan_objmgr_psoc *psoc)
+QDF_STATUS target_if_direct_buf_rx_psoc_destroy_handler(
+ struct wlan_objmgr_psoc *psoc, void *data)
{
QDF_STATUS status;
struct direct_buf_rx_psoc_obj *dbr_psoc_obj;
@@ -411,6 +411,12 @@ static QDF_STATUS target_if_dbr_init_ring(struct wlan_objmgr_pdev *pdev,
return QDF_STATUS_E_FAILURE;
}
+ if (dbr_psoc_obj->hal_soc == NULL ||
+ dbr_psoc_obj->osdev == NULL) {
+ direct_buf_rx_err("dir buf rx target attach failed");
+ return QDF_STATUS_E_FAILURE;
+ }
+
max_entries = hal_srng_max_entries(dbr_psoc_obj->hal_soc,
DIR_BUF_RX_DMA_SRC);
entry_size = hal_srng_get_entrysize(dbr_psoc_obj->hal_soc,
@@ -615,7 +621,7 @@ static QDF_STATUS target_if_init_dbr_ring(struct wlan_objmgr_pdev *pdev,
direct_buf_rx_info("mod_param %pK", mod_param);
- mod_param->mod_id = mod_id+1;
+ mod_param->mod_id = mod_id;
/* Initialize DMA ring now */
status = target_if_dbr_init_srng(pdev, mod_param);
@@ -777,6 +783,7 @@ static int target_if_direct_buf_rx_rsp_event_handler(ol_scn_t scn,
WLAN_DIRECT_BUF_RX_ID);
if (!pdev) {
direct_buf_rx_err("pdev is null");
+ wlan_objmgr_pdev_release_ref(pdev, WLAN_DIRECT_BUF_RX_ID);
return QDF_STATUS_E_INVAL;
}
@@ -785,13 +792,15 @@ static int target_if_direct_buf_rx_rsp_event_handler(ol_scn_t scn,
if (dbr_pdev_obj == NULL) {
direct_buf_rx_err("dir buf rx object is null");
+ wlan_objmgr_pdev_release_ref(pdev, WLAN_DIRECT_BUF_RX_ID);
return QDF_STATUS_E_FAILURE;
}
- mod_param = &(dbr_pdev_obj->dbr_mod_param[dbr_rsp.mod_id-1]);
+ mod_param = &(dbr_pdev_obj->dbr_mod_param[dbr_rsp.mod_id]);
if (!mod_param) {
direct_buf_rx_err("dir buf rx module param is null");
+ wlan_objmgr_pdev_release_ref(pdev, WLAN_DIRECT_BUF_RX_ID);
return QDF_STATUS_E_FAILURE;
}
@@ -805,6 +814,8 @@ static int target_if_direct_buf_rx_rsp_event_handler(ol_scn_t scn,
&dbr_rsp.dbr_entries[i]) != QDF_STATUS_SUCCESS) {
direct_buf_rx_err("Unable to extract DBR buf entry %d",
i+1);
+ wlan_objmgr_pdev_release_ref(pdev,
+ WLAN_DIRECT_BUF_RX_ID);
return QDF_STATUS_E_FAILURE;
}
status = target_if_get_dbr_data(pdev, mod_param, &dbr_rsp,
@@ -812,6 +823,8 @@ static int target_if_direct_buf_rx_rsp_event_handler(ol_scn_t scn,
if (QDF_IS_STATUS_ERROR(status)) {
direct_buf_rx_err("DBR data get failed");
+ wlan_objmgr_pdev_release_ref(pdev,
+ WLAN_DIRECT_BUF_RX_ID);
return QDF_STATUS_E_FAILURE;
}
ret = mod_param->dbr_rsp_handler(pdev, &dbr_data);
@@ -819,10 +832,14 @@ static int target_if_direct_buf_rx_rsp_event_handler(ol_scn_t scn,
dbr_data.vaddr, cookie);
if (QDF_IS_STATUS_ERROR(status)) {
direct_buf_rx_err("dir buf rx ring replenish failed");
+ wlan_objmgr_pdev_release_ref(pdev,
+ WLAN_DIRECT_BUF_RX_ID);
return QDF_STATUS_E_FAILURE;
}
}
+ wlan_objmgr_pdev_release_ref(pdev, WLAN_DIRECT_BUF_RX_ID);
+
return ret;
}
@@ -950,8 +967,7 @@ QDF_STATUS target_if_direct_buf_rx_register_events(
WMI_RX_UMAC_CTX);
if (ret) {
- direct_buf_rx_err("register event handler failed: err %d", ret);
- return QDF_STATUS_E_INVAL;
+ direct_buf_rx_info("event handler not supported", ret);
}
return QDF_STATUS_SUCCESS;
diff --git a/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.h b/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.h
index 385f2b760..73e875d3b 100644
--- a/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.h
+++ b/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -129,8 +129,8 @@ struct direct_buf_rx_psoc_obj {
};
/**
- * target_if_direct_buf_rx_register_events: Register WMI events to direct
- * buffer rx module
+ * target_if_direct_buf_rx_register_events() - Register WMI events to direct
+ * buffer rx module
* @psoc: pointer to psoc object
*
* Return : QDF status of operation
@@ -139,8 +139,8 @@ QDF_STATUS target_if_direct_buf_rx_register_events(
struct wlan_objmgr_psoc *psoc);
/**
- * target_if_direct_buf_rx_unregister_events: Unregister WMI events to direct
- * buffer rx module
+ * target_if_direct_buf_rx_unregister_events() - Unregister WMI events to direct
+ * buffer rx module
* @psoc: pointer to psoc object
*
* Return : QDF status of operation
@@ -149,9 +149,9 @@ QDF_STATUS target_if_direct_buf_rx_unregister_events(
struct wlan_objmgr_psoc *psoc);
/**
- * target_if_direct_buf_rx_pdev_create_handler: Handler to be invoked for
- * direct buffer rx module during
- * pdev object create
+ * target_if_direct_buf_rx_pdev_create_handler() - Handler to be invoked for
+ * direct buffer rx module
+ * during pdev object create
* @pdev: pointer to pdev object
* @data: pointer to data
*
@@ -161,9 +161,9 @@ QDF_STATUS target_if_direct_buf_rx_pdev_create_handler(
struct wlan_objmgr_pdev *pdev, void *data);
/**
- * target_if_direct_buf_rx_pdev_destroy_handler: Handler to be invoked for
- * direct buffer rx module during
- * pdev object destroy
+ * target_if_direct_buf_rx_pdev_destroy_handler() - Handler to be invoked for
+ * direct buffer rx module
+ * during pdev object destroy
* @pdev: pointer to pdev object
* @data: pointer to data
*
@@ -173,30 +173,30 @@ QDF_STATUS target_if_direct_buf_rx_pdev_destroy_handler(
struct wlan_objmgr_pdev *pdev, void *data);
/**
- * target_if_direct_buf_rx_psoc_obj_create: Handler invoked for
- * direct buffer rx module during
- * attach
+ * target_if_direct_buf_rx_psoc_create_handler() - Handler invoked for
+ * direct buffer rx module
+ * during attach
* @pdev: pointer to psoc object
*
* Return : QDF status of operation
*/
-QDF_STATUS target_if_direct_buf_rx_psoc_obj_create(
- struct wlan_objmgr_psoc *psoc);
+QDF_STATUS target_if_direct_buf_rx_psoc_create_handler(
+ struct wlan_objmgr_psoc *psoc, void *data);
/**
- * target_if_direct_buf_rx_psoc_obj_destroy: Handler invoked for
- * direct buffer rx module during
- * detach
+ * target_if_direct_buf_rx_psoc_destroy_handler() - Handler invoked for
+ * direct buffer rx module
+ * during detach
* @pdev: pointer to psoc object
*
* Return : QDF status of operation
*/
-QDF_STATUS target_if_direct_buf_rx_psoc_obj_destroy(
- struct wlan_objmgr_psoc *psoc);
+QDF_STATUS target_if_direct_buf_rx_psoc_destroy_handler(
+ struct wlan_objmgr_psoc *psoc, void *data);
/**
- * target_if_deinit_dbr_ring: Function to deinitialize buffers and ring
- * allocated for direct buffer rx module
+ * target_if_deinit_dbr_ring() - Function to deinitialize buffers and ring
+ * allocated for direct buffer rx module
* @pdev: pointer to pdev object
* @dbr_pdev_obj: pointer to direct buffer rx module pdev obj
* @mod_id: module id indicating the module using direct buffer rx framework
@@ -207,8 +207,8 @@ QDF_STATUS target_if_deinit_dbr_ring(struct wlan_objmgr_pdev *pdev,
struct direct_buf_rx_pdev_obj *dbr_pdev_obj,
enum DBR_MODULE mod_id);
/**
- * target_if_direct_buf_rx_module_register: Function to register to direct
- * buffer rx module
+ * target_if_direct_buf_rx_module_register() - Function to register to direct
+ * buffer rx module
* @pdev: pointer to pdev object
* @mod_id: module id indicating the module using direct buffer rx framework
* @dbr_rsp_handler: function pointer pointing to the response handler to be