|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
- * Copyright (c) 2016-2017 The Linux Foundation. All rights reserved.
|
|
|
+ * Copyright (c) 2016-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
|
|
@@ -46,46 +46,29 @@ static QDF_STATUS wlan_mgmt_txrx_psoc_obj_create_notification(
|
|
|
struct wlan_objmgr_psoc *psoc,
|
|
|
void *arg)
|
|
|
{
|
|
|
- struct mgmt_txrx_priv_context *mgmt_txrx_ctx;
|
|
|
- struct mgmt_txrx_stats_t *mgmt_txrx_stats;
|
|
|
+ struct mgmt_txrx_priv_psoc_context *mgmt_txrx_psoc_ctx;
|
|
|
QDF_STATUS status;
|
|
|
|
|
|
if (!psoc) {
|
|
|
mgmt_txrx_err("psoc context passed is NULL");
|
|
|
- return QDF_STATUS_E_INVAL;
|
|
|
+ status = QDF_STATUS_E_INVAL;
|
|
|
+ goto err_return;
|
|
|
}
|
|
|
|
|
|
- mgmt_txrx_ctx = qdf_mem_malloc(sizeof(*mgmt_txrx_ctx));
|
|
|
- if (!mgmt_txrx_ctx) {
|
|
|
+ mgmt_txrx_psoc_ctx = qdf_mem_malloc(sizeof(*mgmt_txrx_psoc_ctx));
|
|
|
+ if (!mgmt_txrx_psoc_ctx) {
|
|
|
mgmt_txrx_err("Failed to allocate mgmt txrx context");
|
|
|
- return QDF_STATUS_E_NOMEM;
|
|
|
- }
|
|
|
-
|
|
|
- mgmt_txrx_ctx->psoc = psoc;
|
|
|
-
|
|
|
- status = wlan_mgmt_txrx_desc_pool_init(mgmt_txrx_ctx,
|
|
|
- MGMT_DESC_POOL_MAX);
|
|
|
- if (status != QDF_STATUS_SUCCESS) {
|
|
|
- mgmt_txrx_err("Failed to initialize mgmt desc. pool with status: %u",
|
|
|
- status);
|
|
|
- goto err_desc_pool_init;
|
|
|
- }
|
|
|
-
|
|
|
- mgmt_txrx_stats = qdf_mem_malloc(sizeof(*mgmt_txrx_stats));
|
|
|
- if (!mgmt_txrx_stats) {
|
|
|
- mgmt_txrx_err("Failed to allocate memory for mgmt txrx stats structure");
|
|
|
status = QDF_STATUS_E_NOMEM;
|
|
|
- goto err_mgmt_txrx_stats;
|
|
|
+ goto err_return;
|
|
|
}
|
|
|
- mgmt_txrx_ctx->mgmt_txrx_stats = mgmt_txrx_stats;
|
|
|
|
|
|
- qdf_spinlock_create(&mgmt_txrx_ctx->mgmt_txrx_ctx_lock);
|
|
|
- qdf_wake_lock_create(&mgmt_txrx_ctx->wakelock_tx_cmp,
|
|
|
- "mgmt_txrx tx_cmp");
|
|
|
+ mgmt_txrx_psoc_ctx->psoc = psoc;
|
|
|
+
|
|
|
+ qdf_spinlock_create(&mgmt_txrx_psoc_ctx->mgmt_txrx_psoc_ctx_lock);
|
|
|
|
|
|
if (wlan_objmgr_psoc_component_obj_attach(psoc,
|
|
|
WLAN_UMAC_COMP_MGMT_TXRX,
|
|
|
- mgmt_txrx_ctx, QDF_STATUS_SUCCESS)
|
|
|
+ mgmt_txrx_psoc_ctx, QDF_STATUS_SUCCESS)
|
|
|
!= QDF_STATUS_SUCCESS) {
|
|
|
mgmt_txrx_err("Failed to attach mgmt txrx ctx in psoc ctx");
|
|
|
status = QDF_STATUS_E_FAILURE;
|
|
@@ -93,18 +76,14 @@ static QDF_STATUS wlan_mgmt_txrx_psoc_obj_create_notification(
|
|
|
}
|
|
|
|
|
|
mgmt_txrx_info("Mgmt txrx creation successful, mgmt txrx ctx: %pK, psoc: %pK",
|
|
|
- mgmt_txrx_ctx, psoc);
|
|
|
+ mgmt_txrx_psoc_ctx, psoc);
|
|
|
|
|
|
return QDF_STATUS_SUCCESS;
|
|
|
|
|
|
err_psoc_attach:
|
|
|
- qdf_spinlock_destroy(&mgmt_txrx_ctx->mgmt_txrx_ctx_lock);
|
|
|
- qdf_wake_lock_destroy(&mgmt_txrx_ctx->wakelock_tx_cmp);
|
|
|
- qdf_mem_free(mgmt_txrx_stats);
|
|
|
-err_mgmt_txrx_stats:
|
|
|
- wlan_mgmt_txrx_desc_pool_deinit(mgmt_txrx_ctx);
|
|
|
-err_desc_pool_init:
|
|
|
- qdf_mem_free(mgmt_txrx_ctx);
|
|
|
+ qdf_spinlock_destroy(&mgmt_txrx_psoc_ctx->mgmt_txrx_psoc_ctx_lock);
|
|
|
+ qdf_mem_free(mgmt_txrx_psoc_ctx);
|
|
|
+err_return:
|
|
|
return status;
|
|
|
}
|
|
|
|
|
@@ -123,40 +102,168 @@ static QDF_STATUS wlan_mgmt_txrx_psoc_obj_destroy_notification(
|
|
|
struct wlan_objmgr_psoc *psoc,
|
|
|
void *arg)
|
|
|
{
|
|
|
- struct mgmt_txrx_priv_context *mgmt_txrx_ctx;
|
|
|
+ struct mgmt_txrx_priv_psoc_context *mgmt_txrx_psoc_ctx;
|
|
|
|
|
|
if (!psoc) {
|
|
|
mgmt_txrx_err("psoc context passed is NULL");
|
|
|
return QDF_STATUS_E_INVAL;
|
|
|
}
|
|
|
|
|
|
- mgmt_txrx_ctx = wlan_objmgr_psoc_get_comp_private_obj(
|
|
|
+ mgmt_txrx_psoc_ctx = wlan_objmgr_psoc_get_comp_private_obj(
|
|
|
psoc, WLAN_UMAC_COMP_MGMT_TXRX);
|
|
|
- if (!mgmt_txrx_ctx) {
|
|
|
+ if (!mgmt_txrx_psoc_ctx) {
|
|
|
mgmt_txrx_err("mgmt txrx context is already NULL");
|
|
|
return QDF_STATUS_E_FAILURE;
|
|
|
}
|
|
|
|
|
|
mgmt_txrx_info("deleting mgmt txrx psoc obj, mgmt txrx ctx: %pK, psoc: %pK",
|
|
|
- mgmt_txrx_ctx, psoc);
|
|
|
+ mgmt_txrx_psoc_ctx, psoc);
|
|
|
if (wlan_objmgr_psoc_component_obj_detach(psoc,
|
|
|
- WLAN_UMAC_COMP_MGMT_TXRX, mgmt_txrx_ctx)
|
|
|
+ WLAN_UMAC_COMP_MGMT_TXRX, mgmt_txrx_psoc_ctx)
|
|
|
!= QDF_STATUS_SUCCESS) {
|
|
|
mgmt_txrx_err("Failed to detach mgmt txrx ctx in psoc ctx");
|
|
|
return QDF_STATUS_E_FAILURE;
|
|
|
}
|
|
|
|
|
|
- wlan_mgmt_txrx_desc_pool_deinit(mgmt_txrx_ctx);
|
|
|
- qdf_mem_free(mgmt_txrx_ctx->mgmt_txrx_stats);
|
|
|
- qdf_spinlock_destroy(&mgmt_txrx_ctx->mgmt_txrx_ctx_lock);
|
|
|
- qdf_wake_lock_destroy(&mgmt_txrx_ctx->wakelock_tx_cmp);
|
|
|
- qdf_mem_free(mgmt_txrx_ctx);
|
|
|
+ qdf_spinlock_destroy(&mgmt_txrx_psoc_ctx->mgmt_txrx_psoc_ctx_lock);
|
|
|
+ qdf_mem_free(mgmt_txrx_psoc_ctx);
|
|
|
|
|
|
mgmt_txrx_info("mgmt txrx deletion successful, psoc: %pK", psoc);
|
|
|
|
|
|
return QDF_STATUS_SUCCESS;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * wlan_mgmt_txrx_pdev_obj_create_notification() - called from objmgr when pdev
|
|
|
+ * is created
|
|
|
+ * @pdev: pdev context
|
|
|
+ * @arg: argument
|
|
|
+ *
|
|
|
+ * This function gets called from object manager when pdev is being created and
|
|
|
+ * creates mgmt_txrx context, mgmt desc pool.
|
|
|
+ *
|
|
|
+ * Return: QDF_STATUS_SUCCESS - in case of success
|
|
|
+ */
|
|
|
+static QDF_STATUS wlan_mgmt_txrx_pdev_obj_create_notification(
|
|
|
+ struct wlan_objmgr_pdev *pdev,
|
|
|
+ void *arg)
|
|
|
+{
|
|
|
+ struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx;
|
|
|
+ struct mgmt_txrx_stats_t *mgmt_txrx_stats;
|
|
|
+ QDF_STATUS status;
|
|
|
+
|
|
|
+ if (!pdev) {
|
|
|
+ mgmt_txrx_err("pdev context passed is NULL");
|
|
|
+ status = QDF_STATUS_E_INVAL;
|
|
|
+ goto err_return;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ mgmt_txrx_pdev_ctx = qdf_mem_malloc(sizeof(*mgmt_txrx_pdev_ctx));
|
|
|
+ if (!mgmt_txrx_pdev_ctx) {
|
|
|
+ mgmt_txrx_err("Failed to allocate mgmt txrx context");
|
|
|
+ status = QDF_STATUS_E_NOMEM;
|
|
|
+ goto err_return;
|
|
|
+ }
|
|
|
+
|
|
|
+ mgmt_txrx_pdev_ctx->pdev = pdev;
|
|
|
+
|
|
|
+ status = wlan_mgmt_txrx_desc_pool_init(mgmt_txrx_pdev_ctx,
|
|
|
+ MGMT_DESC_POOL_MAX);
|
|
|
+ if (status != QDF_STATUS_SUCCESS) {
|
|
|
+ mgmt_txrx_err(
|
|
|
+ "Failed to initialize mgmt desc. pool with status: %u",
|
|
|
+ status);
|
|
|
+ goto err_desc_pool_init;
|
|
|
+ }
|
|
|
+
|
|
|
+ mgmt_txrx_stats = qdf_mem_malloc(sizeof(*mgmt_txrx_stats));
|
|
|
+ if (!mgmt_txrx_stats) {
|
|
|
+ mgmt_txrx_err(
|
|
|
+ "Failed to allocate memory for mgmt txrx stats structure");
|
|
|
+ status = QDF_STATUS_E_NOMEM;
|
|
|
+ goto err_mgmt_txrx_stats;
|
|
|
+ }
|
|
|
+ mgmt_txrx_pdev_ctx->mgmt_txrx_stats = mgmt_txrx_stats;
|
|
|
+
|
|
|
+ qdf_wake_lock_create(&mgmt_txrx_pdev_ctx->wakelock_tx_cmp,
|
|
|
+ "mgmt_txrx tx_cmp");
|
|
|
+
|
|
|
+ if (wlan_objmgr_pdev_component_obj_attach(pdev,
|
|
|
+ WLAN_UMAC_COMP_MGMT_TXRX,
|
|
|
+ mgmt_txrx_pdev_ctx, QDF_STATUS_SUCCESS)
|
|
|
+ != QDF_STATUS_SUCCESS) {
|
|
|
+ mgmt_txrx_err("Failed to attach mgmt txrx ctx in pdev ctx");
|
|
|
+ status = QDF_STATUS_E_FAILURE;
|
|
|
+ goto err_pdev_attach;
|
|
|
+ }
|
|
|
+
|
|
|
+ mgmt_txrx_info(
|
|
|
+ "Mgmt txrx creation successful, mgmt txrx ctx: %pK, pdev: %pK",
|
|
|
+ mgmt_txrx_pdev_ctx, pdev);
|
|
|
+
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+
|
|
|
+err_pdev_attach:
|
|
|
+ qdf_wake_lock_destroy(&mgmt_txrx_pdev_ctx->wakelock_tx_cmp);
|
|
|
+ qdf_mem_free(mgmt_txrx_stats);
|
|
|
+err_mgmt_txrx_stats:
|
|
|
+ wlan_mgmt_txrx_desc_pool_deinit(mgmt_txrx_pdev_ctx);
|
|
|
+err_desc_pool_init:
|
|
|
+ qdf_mem_free(mgmt_txrx_pdev_ctx);
|
|
|
+err_return:
|
|
|
+ return status;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * wlan_mgmt_txrx_pdev_obj_destroy_notification() - called from objmgr when
|
|
|
+ * pdev is destroyed
|
|
|
+ * @pdev: pdev context
|
|
|
+ * @arg: argument
|
|
|
+ *
|
|
|
+ * This function gets called from object manager when pdev is being destroyed
|
|
|
+ * pdev deletes mgmt_txrx context, mgmt desc pool.
|
|
|
+ *
|
|
|
+ * Return: QDF_STATUS_SUCCESS - in case of success
|
|
|
+ */
|
|
|
+static QDF_STATUS wlan_mgmt_txrx_pdev_obj_destroy_notification(
|
|
|
+ struct wlan_objmgr_pdev *pdev,
|
|
|
+ void *arg)
|
|
|
+{
|
|
|
+ struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx;
|
|
|
+
|
|
|
+ if (!pdev) {
|
|
|
+ mgmt_txrx_err("pdev context passed is NULL");
|
|
|
+ return QDF_STATUS_E_INVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ mgmt_txrx_pdev_ctx = wlan_objmgr_pdev_get_comp_private_obj(
|
|
|
+ pdev, WLAN_UMAC_COMP_MGMT_TXRX);
|
|
|
+ if (!mgmt_txrx_pdev_ctx) {
|
|
|
+ mgmt_txrx_err("mgmt txrx context is already NULL");
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ mgmt_txrx_info("deleting mgmt txrx pdev obj, mgmt txrx ctx: %pK, pdev: %pK",
|
|
|
+ mgmt_txrx_pdev_ctx, pdev);
|
|
|
+ if (wlan_objmgr_pdev_component_obj_detach(pdev,
|
|
|
+ WLAN_UMAC_COMP_MGMT_TXRX, mgmt_txrx_pdev_ctx)
|
|
|
+ != QDF_STATUS_SUCCESS) {
|
|
|
+ mgmt_txrx_err("Failed to detach mgmt txrx ctx in pdev ctx");
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ wlan_mgmt_txrx_desc_pool_deinit(mgmt_txrx_pdev_ctx);
|
|
|
+ qdf_mem_free(mgmt_txrx_pdev_ctx->mgmt_txrx_stats);
|
|
|
+ qdf_wake_lock_destroy(&mgmt_txrx_pdev_ctx->wakelock_tx_cmp);
|
|
|
+ qdf_mem_free(mgmt_txrx_pdev_ctx);
|
|
|
+
|
|
|
+ mgmt_txrx_info("mgmt txrx deletion successful, pdev: %pK", pdev);
|
|
|
+
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
QDF_STATUS wlan_mgmt_txrx_init(void)
|
|
|
{
|
|
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
@@ -166,7 +273,7 @@ QDF_STATUS wlan_mgmt_txrx_init(void)
|
|
|
wlan_mgmt_txrx_psoc_obj_create_notification,
|
|
|
NULL);
|
|
|
if (status != QDF_STATUS_SUCCESS) {
|
|
|
- mgmt_txrx_err("Failed to register mgmt txrx obj create handler");
|
|
|
+ mgmt_txrx_err("Failed to register mgmt txrx psoc create handler");
|
|
|
goto err_psoc_create;
|
|
|
}
|
|
|
|
|
@@ -175,13 +282,37 @@ QDF_STATUS wlan_mgmt_txrx_init(void)
|
|
|
wlan_mgmt_txrx_psoc_obj_destroy_notification,
|
|
|
NULL);
|
|
|
if (status != QDF_STATUS_SUCCESS) {
|
|
|
- mgmt_txrx_err("Failed to register mgmt txrx obj destroy handler");
|
|
|
+ mgmt_txrx_err("Failed to register mgmt txrx psoc destroy handler");
|
|
|
goto err_psoc_delete;
|
|
|
}
|
|
|
|
|
|
+ status = wlan_objmgr_register_pdev_create_handler(
|
|
|
+ WLAN_UMAC_COMP_MGMT_TXRX,
|
|
|
+ wlan_mgmt_txrx_pdev_obj_create_notification,
|
|
|
+ NULL);
|
|
|
+ if (status != QDF_STATUS_SUCCESS) {
|
|
|
+ mgmt_txrx_err("Failed to register mgmt txrx pdev obj create handler");
|
|
|
+ goto err_pdev_create;
|
|
|
+ }
|
|
|
+
|
|
|
+ status = wlan_objmgr_register_pdev_destroy_handler(
|
|
|
+ WLAN_UMAC_COMP_MGMT_TXRX,
|
|
|
+ wlan_mgmt_txrx_pdev_obj_destroy_notification,
|
|
|
+ NULL);
|
|
|
+ if (status != QDF_STATUS_SUCCESS) {
|
|
|
+ mgmt_txrx_err("Failed to register mgmt txrx obj destroy handler");
|
|
|
+ goto err_pdev_delete;
|
|
|
+ }
|
|
|
+
|
|
|
mgmt_txrx_info("Successfully registered create and destroy handlers with objmgr");
|
|
|
return QDF_STATUS_SUCCESS;
|
|
|
|
|
|
+err_pdev_delete:
|
|
|
+ wlan_objmgr_unregister_pdev_create_handler(WLAN_UMAC_COMP_MGMT_TXRX,
|
|
|
+ wlan_mgmt_txrx_pdev_obj_create_notification, NULL);
|
|
|
+err_pdev_create:
|
|
|
+ wlan_objmgr_unregister_psoc_destroy_handler(WLAN_UMAC_COMP_MGMT_TXRX,
|
|
|
+ wlan_mgmt_txrx_psoc_obj_destroy_notification, NULL);
|
|
|
err_psoc_delete:
|
|
|
wlan_objmgr_unregister_psoc_create_handler(WLAN_UMAC_COMP_MGMT_TXRX,
|
|
|
wlan_mgmt_txrx_psoc_obj_create_notification, NULL);
|
|
@@ -206,6 +337,22 @@ QDF_STATUS wlan_mgmt_txrx_deinit(void)
|
|
|
return QDF_STATUS_E_FAILURE;
|
|
|
}
|
|
|
|
|
|
+ if (wlan_objmgr_unregister_pdev_create_handler(WLAN_UMAC_COMP_MGMT_TXRX,
|
|
|
+ wlan_mgmt_txrx_pdev_obj_create_notification,
|
|
|
+ NULL)
|
|
|
+ != QDF_STATUS_SUCCESS) {
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (wlan_objmgr_unregister_pdev_destroy_handler(
|
|
|
+ WLAN_UMAC_COMP_MGMT_TXRX,
|
|
|
+ wlan_mgmt_txrx_pdev_obj_destroy_notification,
|
|
|
+ NULL)
|
|
|
+ != QDF_STATUS_SUCCESS) {
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
mgmt_txrx_info("Successfully unregistered create and destroy handlers with objmgr");
|
|
|
return QDF_STATUS_SUCCESS;
|
|
|
}
|
|
@@ -220,7 +367,8 @@ QDF_STATUS wlan_mgmt_txrx_mgmt_frame_tx(struct wlan_objmgr_peer *peer,
|
|
|
{
|
|
|
struct mgmt_txrx_desc_elem_t *desc;
|
|
|
struct wlan_objmgr_psoc *psoc;
|
|
|
- struct mgmt_txrx_priv_context *txrx_ctx;
|
|
|
+ struct wlan_objmgr_pdev *pdev;
|
|
|
+ struct mgmt_txrx_priv_pdev_context *txrx_ctx;
|
|
|
struct wlan_objmgr_vdev *vdev;
|
|
|
|
|
|
if (!peer) {
|
|
@@ -245,12 +393,20 @@ QDF_STATUS wlan_mgmt_txrx_mgmt_frame_tx(struct wlan_objmgr_peer *peer,
|
|
|
return QDF_STATUS_E_NULL_VALUE;
|
|
|
}
|
|
|
|
|
|
- txrx_ctx = (struct mgmt_txrx_priv_context *)
|
|
|
- wlan_objmgr_psoc_get_comp_private_obj(psoc,
|
|
|
+ pdev = wlan_vdev_get_pdev(vdev);
|
|
|
+ if (!pdev) {
|
|
|
+ mgmt_txrx_err("pdev unavailable for peer %pK vdev %pK",
|
|
|
+ peer, vdev);
|
|
|
+ wlan_objmgr_peer_release_ref(peer, WLAN_MGMT_SB_ID);
|
|
|
+ return QDF_STATUS_E_NULL_VALUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ txrx_ctx = (struct mgmt_txrx_priv_pdev_context *)
|
|
|
+ wlan_objmgr_pdev_get_comp_private_obj(pdev,
|
|
|
WLAN_UMAC_COMP_MGMT_TXRX);
|
|
|
if (!txrx_ctx) {
|
|
|
- mgmt_txrx_err("No txrx context for peer %pK psoc %pK",
|
|
|
- peer, psoc);
|
|
|
+ mgmt_txrx_err("No txrx context for peer %pK pdev %pK",
|
|
|
+ peer, pdev);
|
|
|
wlan_objmgr_peer_release_ref(peer, WLAN_MGMT_SB_ID);
|
|
|
return QDF_STATUS_E_NULL_VALUE;
|
|
|
}
|
|
@@ -269,7 +425,8 @@ QDF_STATUS wlan_mgmt_txrx_mgmt_frame_tx(struct wlan_objmgr_peer *peer,
|
|
|
desc->context = context;
|
|
|
|
|
|
if (!psoc->soc_cb.tx_ops.mgmt_txrx_tx_ops.mgmt_tx_send) {
|
|
|
- mgmt_txrx_err("mgmt txrx tx op to send mgmt frame is NULL for psoc: %pK",
|
|
|
+ mgmt_txrx_err(
|
|
|
+ "mgmt txrx txop to send mgmt frame is NULL for psoc: %pK",
|
|
|
psoc);
|
|
|
wlan_objmgr_peer_release_ref(peer, WLAN_MGMT_SB_ID);
|
|
|
desc->nbuf = NULL;
|
|
@@ -279,8 +436,8 @@ QDF_STATUS wlan_mgmt_txrx_mgmt_frame_tx(struct wlan_objmgr_peer *peer,
|
|
|
|
|
|
if (psoc->soc_cb.tx_ops.mgmt_txrx_tx_ops.mgmt_tx_send(
|
|
|
vdev, buf, desc->desc_id, mgmt_tx_params)) {
|
|
|
- mgmt_txrx_err("Mgmt send fail for peer %pK psoc %pK",
|
|
|
- peer, psoc);
|
|
|
+ mgmt_txrx_err("Mgmt send fail for peer %pK psoc %pK pdev: %pK",
|
|
|
+ peer, psoc, pdev);
|
|
|
wlan_objmgr_peer_release_ref(peer, WLAN_MGMT_SB_ID);
|
|
|
desc->nbuf = NULL;
|
|
|
wlan_mgmt_txrx_desc_put(txrx_ctx, desc->desc_id);
|
|
@@ -324,7 +481,7 @@ QDF_STATUS wlan_mgmt_txrx_beacon_frame_tx(struct wlan_objmgr_peer *peer,
|
|
|
|
|
|
/**
|
|
|
* wlan_mgmt_txrx_create_rx_handler() - creates rx handler node for umac comp.
|
|
|
- * @mgmt_txrx_ctx: mgmt txrx context
|
|
|
+ * @mgmt_txrx_psoc_ctx: mgmt txrx context
|
|
|
* @mgmt_rx_cb: mgmt rx callback to be registered
|
|
|
* @comp_id: umac component id
|
|
|
* @frm_type: mgmt. frame for which cb to be registered.
|
|
@@ -335,7 +492,7 @@ QDF_STATUS wlan_mgmt_txrx_beacon_frame_tx(struct wlan_objmgr_peer *peer,
|
|
|
* Return: QDF_STATUS_SUCCESS - in case of success
|
|
|
*/
|
|
|
static QDF_STATUS wlan_mgmt_txrx_create_rx_handler(
|
|
|
- struct mgmt_txrx_priv_context *mgmt_txrx_ctx,
|
|
|
+ struct mgmt_txrx_priv_psoc_context *mgmt_txrx_psoc_ctx,
|
|
|
mgmt_frame_rx_callback mgmt_rx_cb,
|
|
|
enum wlan_umac_comp_id comp_id,
|
|
|
enum mgmt_frame_type frm_type)
|
|
@@ -351,10 +508,10 @@ static QDF_STATUS wlan_mgmt_txrx_create_rx_handler(
|
|
|
rx_handler->comp_id = comp_id;
|
|
|
rx_handler->rx_cb = mgmt_rx_cb;
|
|
|
|
|
|
- qdf_spin_lock_bh(&mgmt_txrx_ctx->mgmt_txrx_ctx_lock);
|
|
|
- rx_handler->next = mgmt_txrx_ctx->mgmt_rx_comp_cb[frm_type];
|
|
|
- mgmt_txrx_ctx->mgmt_rx_comp_cb[frm_type] = rx_handler;
|
|
|
- qdf_spin_unlock_bh(&mgmt_txrx_ctx->mgmt_txrx_ctx_lock);
|
|
|
+ qdf_spin_lock_bh(&mgmt_txrx_psoc_ctx->mgmt_txrx_psoc_ctx_lock);
|
|
|
+ rx_handler->next = mgmt_txrx_psoc_ctx->mgmt_rx_comp_cb[frm_type];
|
|
|
+ mgmt_txrx_psoc_ctx->mgmt_rx_comp_cb[frm_type] = rx_handler;
|
|
|
+ qdf_spin_unlock_bh(&mgmt_txrx_psoc_ctx->mgmt_txrx_psoc_ctx_lock);
|
|
|
|
|
|
mgmt_txrx_info("Callback registered for comp_id: %d, frm_type: %d",
|
|
|
comp_id, frm_type);
|
|
@@ -363,7 +520,7 @@ static QDF_STATUS wlan_mgmt_txrx_create_rx_handler(
|
|
|
|
|
|
/**
|
|
|
* wlan_mgmt_txrx_delete_rx_handler() - deletes rx handler node for umac comp.
|
|
|
- * @mgmt_txrx_ctx: mgmt txrx context
|
|
|
+ * @mgmt_txrx_psoc_ctx: mgmt txrx context
|
|
|
* @mgmt_rx_cb: mgmt rx callback to be deregistered
|
|
|
* @comp_id: umac component id
|
|
|
* @frm_type: mgmt. frame for which cb to be registered.
|
|
@@ -374,16 +531,16 @@ static QDF_STATUS wlan_mgmt_txrx_create_rx_handler(
|
|
|
* Return: QDF_STATUS_SUCCESS - in case of success
|
|
|
*/
|
|
|
static QDF_STATUS wlan_mgmt_txrx_delete_rx_handler(
|
|
|
- struct mgmt_txrx_priv_context *mgmt_txrx_ctx,
|
|
|
- mgmt_frame_rx_callback mgmt_rx_cb,
|
|
|
- enum wlan_umac_comp_id comp_id,
|
|
|
- enum mgmt_frame_type frm_type)
|
|
|
+ struct mgmt_txrx_priv_psoc_context *mgmt_txrx_psoc_ctx,
|
|
|
+ mgmt_frame_rx_callback mgmt_rx_cb,
|
|
|
+ enum wlan_umac_comp_id comp_id,
|
|
|
+ enum mgmt_frame_type frm_type)
|
|
|
{
|
|
|
- struct mgmt_rx_handler *rx_handler, *rx_handler_prev = NULL;
|
|
|
+ struct mgmt_rx_handler *rx_handler = NULL, *rx_handler_prev = NULL;
|
|
|
bool delete = false;
|
|
|
|
|
|
- qdf_spin_lock_bh(&mgmt_txrx_ctx->mgmt_txrx_ctx_lock);
|
|
|
- rx_handler = mgmt_txrx_ctx->mgmt_rx_comp_cb[frm_type];
|
|
|
+ qdf_spin_lock_bh(&mgmt_txrx_psoc_ctx->mgmt_txrx_psoc_ctx_lock);
|
|
|
+ rx_handler = mgmt_txrx_psoc_ctx->mgmt_rx_comp_cb[frm_type];
|
|
|
while (rx_handler) {
|
|
|
if (rx_handler->comp_id == comp_id &&
|
|
|
rx_handler->rx_cb == mgmt_rx_cb) {
|
|
@@ -391,7 +548,7 @@ static QDF_STATUS wlan_mgmt_txrx_delete_rx_handler(
|
|
|
rx_handler_prev->next =
|
|
|
rx_handler->next;
|
|
|
else
|
|
|
- mgmt_txrx_ctx->mgmt_rx_comp_cb[frm_type] =
|
|
|
+ mgmt_txrx_psoc_ctx->mgmt_rx_comp_cb[frm_type] =
|
|
|
rx_handler->next;
|
|
|
|
|
|
qdf_mem_free(rx_handler);
|
|
@@ -402,7 +559,7 @@ static QDF_STATUS wlan_mgmt_txrx_delete_rx_handler(
|
|
|
rx_handler_prev = rx_handler;
|
|
|
rx_handler = rx_handler->next;
|
|
|
}
|
|
|
- qdf_spin_unlock_bh(&mgmt_txrx_ctx->mgmt_txrx_ctx_lock);
|
|
|
+ qdf_spin_unlock_bh(&mgmt_txrx_psoc_ctx->mgmt_txrx_psoc_ctx_lock);
|
|
|
|
|
|
if (!delete) {
|
|
|
mgmt_txrx_err("No callback registered for comp_id: %d, frm_type: %d",
|
|
@@ -421,7 +578,7 @@ QDF_STATUS wlan_mgmt_txrx_register_rx_cb(
|
|
|
struct mgmt_txrx_mgmt_frame_cb_info *frm_cb_info,
|
|
|
uint8_t num_entries)
|
|
|
{
|
|
|
- struct mgmt_txrx_priv_context *mgmt_txrx_ctx;
|
|
|
+ struct mgmt_txrx_priv_psoc_context *mgmt_txrx_psoc_ctx;
|
|
|
QDF_STATUS status;
|
|
|
uint8_t i, j;
|
|
|
|
|
@@ -446,22 +603,22 @@ QDF_STATUS wlan_mgmt_txrx_register_rx_cb(
|
|
|
return QDF_STATUS_E_INVAL;
|
|
|
}
|
|
|
|
|
|
- mgmt_txrx_ctx = (struct mgmt_txrx_priv_context *)
|
|
|
+ mgmt_txrx_psoc_ctx = (struct mgmt_txrx_priv_psoc_context *)
|
|
|
wlan_objmgr_psoc_get_comp_private_obj(psoc,
|
|
|
WLAN_UMAC_COMP_MGMT_TXRX);
|
|
|
- if (!mgmt_txrx_ctx) {
|
|
|
+ if (!mgmt_txrx_psoc_ctx) {
|
|
|
mgmt_txrx_err("mgmt txrx context is NULL");
|
|
|
return QDF_STATUS_E_FAILURE;
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < num_entries; i++) {
|
|
|
- status = wlan_mgmt_txrx_create_rx_handler(mgmt_txrx_ctx,
|
|
|
+ status = wlan_mgmt_txrx_create_rx_handler(mgmt_txrx_psoc_ctx,
|
|
|
frm_cb_info[i].mgmt_rx_cb, comp_id,
|
|
|
frm_cb_info[i].frm_type);
|
|
|
if (status != QDF_STATUS_SUCCESS) {
|
|
|
for (j = 0; j < i; j++) {
|
|
|
wlan_mgmt_txrx_delete_rx_handler(
|
|
|
- mgmt_txrx_ctx,
|
|
|
+ mgmt_txrx_psoc_ctx,
|
|
|
frm_cb_info[j].mgmt_rx_cb,
|
|
|
comp_id, frm_cb_info[j].frm_type);
|
|
|
}
|
|
@@ -478,7 +635,7 @@ QDF_STATUS wlan_mgmt_txrx_deregister_rx_cb(
|
|
|
struct mgmt_txrx_mgmt_frame_cb_info *frm_cb_info,
|
|
|
uint8_t num_entries)
|
|
|
{
|
|
|
- struct mgmt_txrx_priv_context *mgmt_txrx_ctx;
|
|
|
+ struct mgmt_txrx_priv_psoc_context *mgmt_txrx_psoc_ctx;
|
|
|
uint8_t i;
|
|
|
|
|
|
if (!psoc) {
|
|
@@ -502,16 +659,16 @@ QDF_STATUS wlan_mgmt_txrx_deregister_rx_cb(
|
|
|
return QDF_STATUS_E_INVAL;
|
|
|
}
|
|
|
|
|
|
- mgmt_txrx_ctx = (struct mgmt_txrx_priv_context *)
|
|
|
+ mgmt_txrx_psoc_ctx = (struct mgmt_txrx_priv_psoc_context *)
|
|
|
wlan_objmgr_psoc_get_comp_private_obj(psoc,
|
|
|
WLAN_UMAC_COMP_MGMT_TXRX);
|
|
|
- if (!mgmt_txrx_ctx) {
|
|
|
+ if (!mgmt_txrx_psoc_ctx) {
|
|
|
mgmt_txrx_err("mgmt txrx context is NULL");
|
|
|
return QDF_STATUS_E_FAILURE;
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < num_entries; i++) {
|
|
|
- wlan_mgmt_txrx_delete_rx_handler(mgmt_txrx_ctx,
|
|
|
+ wlan_mgmt_txrx_delete_rx_handler(mgmt_txrx_psoc_ctx,
|
|
|
frm_cb_info[i].mgmt_rx_cb, comp_id,
|
|
|
frm_cb_info[i].frm_type);
|
|
|
}
|
|
@@ -526,41 +683,53 @@ QDF_STATUS wlan_mgmt_txrx_psoc_open(struct wlan_objmgr_psoc *psoc)
|
|
|
|
|
|
QDF_STATUS wlan_mgmt_txrx_psoc_close(struct wlan_objmgr_psoc *psoc)
|
|
|
{
|
|
|
- struct mgmt_txrx_priv_context *mgmt_txrx_ctx;
|
|
|
+ struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx;
|
|
|
struct mgmt_txrx_desc_elem_t *mgmt_desc;
|
|
|
- uint8_t i;
|
|
|
+ uint16_t i;
|
|
|
uint32_t pool_size;
|
|
|
+ uint8_t pdev_count, index;
|
|
|
+ struct wlan_objmgr_pdev *pdev;
|
|
|
|
|
|
if (!psoc) {
|
|
|
mgmt_txrx_err("psoc context is NULL");
|
|
|
return QDF_STATUS_E_INVAL;
|
|
|
}
|
|
|
|
|
|
- mgmt_txrx_ctx = (struct mgmt_txrx_priv_context *)
|
|
|
- wlan_objmgr_psoc_get_comp_private_obj(psoc,
|
|
|
+ pdev_count = wlan_psoc_get_pdev_count(psoc);
|
|
|
+
|
|
|
+ for (index = 0; index < pdev_count; index++) {
|
|
|
+ pdev = psoc->soc_objmgr.wlan_pdev_list[index];
|
|
|
+
|
|
|
+ if (!pdev) {
|
|
|
+ mgmt_txrx_err("pdev context is NULL");
|
|
|
+ return QDF_STATUS_E_INVAL;
|
|
|
+ }
|
|
|
+ mgmt_txrx_pdev_ctx = (struct mgmt_txrx_priv_pdev_context *)
|
|
|
+ wlan_objmgr_pdev_get_comp_private_obj(pdev,
|
|
|
WLAN_UMAC_COMP_MGMT_TXRX);
|
|
|
- if (!mgmt_txrx_ctx) {
|
|
|
- mgmt_txrx_err("mgmt txrx context is NULL");
|
|
|
+ if (!mgmt_txrx_pdev_ctx) {
|
|
|
+ mgmt_txrx_err("mgmt txrx context is NULL");
|
|
|
return QDF_STATUS_E_FAILURE;
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- pool_size = mgmt_txrx_ctx->mgmt_desc_pool.free_list.max_size;
|
|
|
- if (!pool_size) {
|
|
|
- mgmt_txrx_err("pool size is 0");
|
|
|
- return QDF_STATUS_E_FAILURE;
|
|
|
- }
|
|
|
+ pool_size = mgmt_txrx_pdev_ctx->mgmt_desc_pool.free_list.max_size;
|
|
|
+ if (!pool_size) {
|
|
|
+ mgmt_txrx_err("pool size is 0");
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
|
|
|
- for (i = 0; i < pool_size; i++) {
|
|
|
- if (mgmt_txrx_ctx->mgmt_desc_pool.pool[i].in_use) {
|
|
|
- mgmt_txrx_info("mgmt descriptor with desc id: %d not in freelist",
|
|
|
- i);
|
|
|
- mgmt_desc = &mgmt_txrx_ctx->mgmt_desc_pool.pool[i];
|
|
|
- qdf_nbuf_free(mgmt_desc->nbuf);
|
|
|
- wlan_objmgr_peer_release_ref(mgmt_desc->peer,
|
|
|
+ for (i = 0; i < pool_size; i++) {
|
|
|
+ if (mgmt_txrx_pdev_ctx->mgmt_desc_pool.pool[i].in_use) {
|
|
|
+ mgmt_txrx_info(
|
|
|
+ "mgmt descriptor with desc id: %d not in freelist",
|
|
|
+ i);
|
|
|
+ mgmt_desc = &mgmt_txrx_pdev_ctx->mgmt_desc_pool.pool[i];
|
|
|
+ qdf_nbuf_free(mgmt_desc->nbuf);
|
|
|
+ wlan_objmgr_peer_release_ref(mgmt_desc->peer,
|
|
|
WLAN_MGMT_SB_ID);
|
|
|
- wlan_mgmt_txrx_desc_put(mgmt_txrx_ctx, i);
|
|
|
+ wlan_mgmt_txrx_desc_put(mgmt_txrx_pdev_ctx, i);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
return QDF_STATUS_SUCCESS;
|
|
|
}
|