1 /*
2  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 /**
18  *  DOC: wlan_mgmt_txrx_rx_reo_utils_api.c
19  *  This file contains mgmt rx re-ordering related public function definitions
20  */
21 
22 #include <wlan_mgmt_txrx_rx_reo_utils_api.h>
23 #include <wlan_mgmt_txrx_rx_reo_tgt_api.h>
24 #include "../../core/src/wlan_mgmt_txrx_rx_reo_i.h"
25 #include "../../core/src/wlan_mgmt_txrx_main_i.h"
26 
27 struct mgmt_rx_reo_pdev_info *
28 wlan_mgmt_rx_reo_get_priv_object(struct wlan_objmgr_pdev *pdev)
29 {
30 	struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx;
31 
32 	if (!pdev) {
33 		mgmt_rx_reo_err("pdev is null");
34 		return NULL;
35 	}
36 
37 	mgmt_txrx_pdev_ctx = (struct mgmt_txrx_priv_pdev_context *)
38 		wlan_objmgr_pdev_get_comp_private_obj(pdev,
39 						      WLAN_UMAC_COMP_MGMT_TXRX);
40 
41 	if (!mgmt_txrx_pdev_ctx) {
42 		mgmt_rx_reo_err("mgmt txrx context is NULL");
43 		return NULL;
44 	}
45 
46 	return mgmt_txrx_pdev_ctx->mgmt_rx_reo_pdev_ctx;
47 }
48 
49 QDF_STATUS
50 wlan_mgmt_rx_reo_set_priv_object(struct wlan_objmgr_pdev *pdev,
51 				 struct mgmt_rx_reo_pdev_info *reo_pdev_context)
52 {
53 	struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx;
54 
55 	if (!pdev) {
56 		mgmt_rx_reo_err("pdev is null");
57 		return QDF_STATUS_E_NULL_VALUE;
58 	}
59 
60 	mgmt_txrx_pdev_ctx = (struct mgmt_txrx_priv_pdev_context *)
61 		wlan_objmgr_pdev_get_comp_private_obj(pdev,
62 						      WLAN_UMAC_COMP_MGMT_TXRX);
63 
64 	if (!mgmt_txrx_pdev_ctx) {
65 		mgmt_rx_reo_err("mgmt txrx context is NULL");
66 		return QDF_STATUS_E_NULL_VALUE;
67 	}
68 
69 	mgmt_txrx_pdev_ctx->mgmt_rx_reo_pdev_ctx = reo_pdev_context;
70 
71 	return QDF_STATUS_SUCCESS;
72 }
73 
74 /**
75  * wlan_mgmt_rx_reo_initialize_snapshot_params() - Initialize a given snapshot
76  * params object
77  * @snapshot_params: Pointer to snapshot params object
78  *
79  * Return: void
80  */
81 static void
82 wlan_mgmt_rx_reo_initialize_snapshot_params(
83 			struct mgmt_rx_reo_snapshot_params *snapshot_params)
84 {
85 	snapshot_params->valid = false;
86 	snapshot_params->mgmt_pkt_ctr = 0;
87 	snapshot_params->global_timestamp = 0;
88 }
89 
90 QDF_STATUS
91 wlan_mgmt_rx_reo_pdev_obj_create_notification(
92 			struct wlan_objmgr_pdev *pdev,
93 			struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx)
94 {
95 	QDF_STATUS status;
96 	QDF_STATUS temp_status;
97 	struct mgmt_rx_reo_pdev_info *mgmt_rx_reo_pdev_ctx = NULL;
98 	enum mgmt_rx_reo_shared_snapshot_id snapshot_id;
99 
100 	if (!pdev) {
101 		mgmt_rx_reo_err("pdev is null");
102 		status = QDF_STATUS_E_NULL_VALUE;
103 		goto failure;
104 	}
105 
106 	mgmt_rx_reo_pdev_ctx = qdf_mem_malloc(sizeof(*mgmt_rx_reo_pdev_ctx));
107 	if (!mgmt_rx_reo_pdev_ctx) {
108 		mgmt_rx_reo_err("Allocation failure for REO pdev context");
109 		status = QDF_STATUS_E_NOMEM;
110 		goto failure;
111 	}
112 
113 	snapshot_id = 0;
114 	while (snapshot_id < MGMT_RX_REO_SHARED_SNAPSHOT_MAX) {
115 		struct mgmt_rx_reo_snapshot **snapshot_address;
116 
117 		snapshot_address = &mgmt_rx_reo_pdev_ctx->
118 				host_target_shared_snapshot[snapshot_id];
119 		temp_status = tgt_mgmt_rx_reo_get_snapshot_address(
120 				pdev, snapshot_id, snapshot_address);
121 		if (QDF_IS_STATUS_ERROR(temp_status)) {
122 			mgmt_rx_reo_err("Get snapshot address failed, id = %u",
123 					snapshot_id);
124 			status = temp_status;
125 			goto failure;
126 		}
127 
128 		wlan_mgmt_rx_reo_initialize_snapshot_params(
129 				&mgmt_rx_reo_pdev_ctx->
130 				last_valid_shared_snapshot[snapshot_id]);
131 		snapshot_id++;
132 	}
133 
134 	/* Initialize Host snapshot params */
135 	wlan_mgmt_rx_reo_initialize_snapshot_params(&mgmt_rx_reo_pdev_ctx->
136 						    host_snapshot);
137 
138 	mgmt_txrx_pdev_ctx->mgmt_rx_reo_pdev_ctx = mgmt_rx_reo_pdev_ctx;
139 
140 	return QDF_STATUS_SUCCESS;
141 
142 failure:
143 	if (mgmt_rx_reo_pdev_ctx)
144 		qdf_mem_free(mgmt_rx_reo_pdev_ctx);
145 
146 	mgmt_txrx_pdev_ctx->mgmt_rx_reo_pdev_ctx = NULL;
147 
148 	return status;
149 }
150 
151 QDF_STATUS
152 wlan_mgmt_rx_reo_pdev_obj_destroy_notification(
153 			struct wlan_objmgr_pdev *pdev,
154 			struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx)
155 {
156 	qdf_mem_free(mgmt_txrx_pdev_ctx->mgmt_rx_reo_pdev_ctx);
157 	mgmt_txrx_pdev_ctx->mgmt_rx_reo_pdev_ctx = NULL;
158 
159 	return QDF_STATUS_SUCCESS;
160 }
161 
162 QDF_STATUS
163 wlan_mgmt_rx_reo_deinit(void)
164 {
165 	return mgmt_rx_reo_deinit_context();
166 }
167 
168 QDF_STATUS
169 wlan_mgmt_rx_reo_init(void)
170 {
171 	return mgmt_rx_reo_init_context();
172 }
173