xref: /wlan-dirver/qca-wifi-host-cmn/umac/cmn_services/serialization/src/wlan_serialization_queue.c (revision 302a1d9701784af5f4797b1a9fe07ae820b51907)
1 /*
2  * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 /**
19  * DOC: wlan_serialization_queue.c
20  * This file defines the functions which deals with the
21  * serialization queue objects.
22  */
23 #include <wlan_objmgr_vdev_obj.h>
24 #include <wlan_objmgr_pdev_obj.h>
25 #include <wlan_objmgr_psoc_obj.h>
26 #include <qdf_list.h>
27 #include <qdf_status.h>
28 #include "wlan_serialization_api.h"
29 #include "wlan_serialization_main_i.h"
30 #include "wlan_serialization_utils_i.h"
31 #include "wlan_serialization_queue_i.h"
32 
33 struct wlan_serialization_pdev_queue *wlan_serialization_get_pdev_queue_obj(
34 		struct wlan_ser_pdev_obj *pdev_obj,
35 		enum wlan_serialization_cmd_type cmd_type)
36 {
37 	struct wlan_serialization_pdev_queue *pdev_queue = NULL;
38 
39 	if (cmd_type < WLAN_SER_CMD_NONSCAN)
40 		pdev_queue = &pdev_obj->pdev_q[SER_PDEV_QUEUE_COMP_SCAN];
41 	else
42 		pdev_queue = &pdev_obj->pdev_q[SER_PDEV_QUEUE_COMP_NON_SCAN];
43 
44 	return pdev_queue;
45 }
46 
47 struct wlan_serialization_vdev_queue *wlan_serialization_get_vdev_queue_obj(
48 		struct wlan_ser_vdev_obj *vdev_obj,
49 		enum wlan_serialization_cmd_type cmd_type)
50 {
51 	struct wlan_serialization_vdev_queue *vdev_queue = NULL;
52 
53 	vdev_queue = &vdev_obj->vdev_q[SER_VDEV_QUEUE_COMP_NON_SCAN];
54 
55 	return vdev_queue;
56 }
57 
58 qdf_list_t *wlan_serialization_get_list_from_pdev_queue(
59 		struct wlan_ser_pdev_obj *pdev_obj,
60 		enum wlan_serialization_cmd_type cmd_type,
61 		uint8_t is_active_cmd)
62 {
63 	struct wlan_serialization_pdev_queue *pdev_queue;
64 	qdf_list_t *queue = NULL;
65 
66 	pdev_queue = wlan_serialization_get_pdev_queue_obj(pdev_obj, cmd_type);
67 	if (is_active_cmd)
68 		queue = &pdev_queue->active_list;
69 	else
70 		queue = &pdev_queue->pending_list;
71 
72 	return queue;
73 }
74 
75 qdf_list_t *wlan_serialization_get_list_from_vdev_queue(
76 		struct wlan_ser_vdev_obj *vdev_obj,
77 		enum wlan_serialization_cmd_type cmd_type,
78 		uint8_t is_active_cmd)
79 {
80 	struct wlan_serialization_vdev_queue *vdev_queue;
81 	qdf_list_t *queue = NULL;
82 
83 	vdev_queue = wlan_serialization_get_vdev_queue_obj(vdev_obj, cmd_type);
84 	if (is_active_cmd)
85 		queue = &vdev_queue->active_list;
86 	else
87 		queue = &vdev_queue->pending_list;
88 
89 	return queue;
90 }
91 
92 enum wlan_serialization_status
93 wlan_serialization_add_cmd_to_pdev_queue(
94 		struct wlan_ser_pdev_obj *pdev_obj,
95 		struct wlan_serialization_command_list *cmd_list,
96 		uint8_t for_active_queue)
97 {
98 	qdf_list_t *queue;
99 	enum wlan_serialization_status status = WLAN_SER_CMD_DENIED_UNSPECIFIED;
100 
101 	if (!pdev_obj) {
102 		ser_err("invalid serialization pdev");
103 		status = WLAN_SER_CMD_DENIED_UNSPECIFIED;
104 		goto error;
105 	}
106 
107 	queue = wlan_serialization_get_list_from_pdev_queue(
108 			pdev_obj, cmd_list->cmd.cmd_type, for_active_queue);
109 
110 	status = wlan_serialization_add_cmd_to_queue(queue, cmd_list,
111 						     pdev_obj,
112 						     for_active_queue,
113 						     WLAN_SER_PDEV_NODE);
114 
115 error:
116 	return status;
117 }
118 
119 enum wlan_serialization_status
120 wlan_serialization_add_cmd_to_vdev_queue(
121 		struct wlan_ser_pdev_obj *pdev_obj,
122 		struct wlan_serialization_command_list *cmd_list,
123 		uint8_t for_active_queue)
124 {
125 	qdf_list_t *queue;
126 	enum wlan_serialization_status status;
127 	struct wlan_serialization_command *cmd;
128 	struct wlan_ser_vdev_obj *vdev_obj;
129 
130 	cmd = &cmd_list->cmd;
131 
132 	vdev_obj = wlan_serialization_get_vdev_obj(
133 			wlan_serialization_get_vdev_from_cmd(cmd));
134 
135 	queue = wlan_serialization_get_list_from_vdev_queue(vdev_obj,
136 							    cmd->cmd_type,
137 							    for_active_queue);
138 
139 	status = wlan_serialization_add_cmd_to_queue(queue, cmd_list,
140 						     pdev_obj,
141 						     for_active_queue,
142 						     WLAN_SER_VDEV_NODE);
143 
144 	return status;
145 }
146 
147 QDF_STATUS
148 wlan_serialization_remove_cmd_from_pdev_queue(
149 		struct wlan_ser_pdev_obj *pdev_obj,
150 		struct wlan_serialization_command_list **pcmd_list,
151 		struct wlan_serialization_command *cmd,
152 		uint8_t is_active_queue)
153 {
154 	qdf_list_t *queue;
155 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
156 
157 	if (!pdev_obj) {
158 		ser_err("Invalid pdev");
159 		return status;
160 	}
161 
162 	queue = wlan_serialization_get_list_from_pdev_queue(
163 			pdev_obj, cmd->cmd_type, is_active_queue);
164 
165 	status = wlan_serialization_remove_cmd_from_queue(queue, cmd,
166 							  pcmd_list,
167 							  pdev_obj,
168 							  WLAN_SER_PDEV_NODE);
169 
170 	return status;
171 }
172 
173 QDF_STATUS
174 wlan_serialization_remove_cmd_from_vdev_queue(
175 		struct wlan_ser_pdev_obj *pdev_obj,
176 		struct wlan_serialization_command_list **pcmd_list,
177 		struct wlan_serialization_command *cmd,
178 		uint8_t is_active_queue)
179 {
180 	qdf_list_t *queue;
181 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
182 	struct wlan_ser_vdev_obj *vdev_obj;
183 
184 	vdev_obj = wlan_serialization_get_vdev_obj(
185 			wlan_serialization_get_vdev_from_cmd(cmd));
186 
187 	queue = wlan_serialization_get_list_from_vdev_queue(vdev_obj,
188 							    cmd->cmd_type,
189 							    is_active_queue);
190 
191 	status = wlan_serialization_remove_cmd_from_queue(queue, cmd,
192 							  pcmd_list,
193 							  pdev_obj,
194 							  WLAN_SER_VDEV_NODE);
195 
196 	return status;
197 }
198 
199