1 /*
2 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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: os_if_qmi.h
19 *
20 * This file contains declarations for wrapper APIs for QMI HLOS APIs
21 */
22
23 #ifndef _OS_IF_QMI_H_
24 #define _OS_IF_QMI_H_
25
26 #include "wlan_qmi_public_struct.h"
27 #include <qdf_types.h>
28 #include <linux/soc/qcom/qmi.h>
29 #include <linux/net.h>
30 #include <linux/types.h>
31 #include "wlan_cfg80211.h"
32 #include "wlan_objmgr_psoc_obj.h"
33 #include <qdf_time.h>
34
35 #define QMI_WFDS_MAX_RECV_BUF_SIZE 4096
36 #define QMI_WFDS_SERVICE_INS_ID_V01 0x0
37 #define QMI_WFDS_TIMEOUT_MS 10000
38 #define QMI_WFDS_TIMEOUT_JF \
39 qdf_system_msecs_to_ticks(QMI_WFDS_TIMEOUT_MS)
40
41 /**
42 * enum os_if_qmi_wfds_ut_cmd_type - WFDS unit test command type
43 * @WFDS_STOP_TRAFFIC: Stop WFDS traffic
44 * @WFDS_START_TRAFFIC: Start WFDS Traffic
45 * @WFDS_GET_STATS: Get WFDS traffic stats
46 * @WFDS_START_WHC: Start WHC traffic
47 * @WFDS_START_TSF: Start TSF handshake
48 * @WFDS_CMD_MISC: Miscellaneous test
49 * @WFDS_CMD_MAX: Max test commands
50 */
51 enum os_if_qmi_wfds_ut_cmd_type {
52 WFDS_STOP_TRAFFIC,
53 WFDS_START_TRAFFIC,
54 WFDS_GET_STATS,
55 WFDS_START_WHC,
56 WFDS_START_TSF,
57 WFDS_CMD_MISC,
58 WFDS_CMD_MAX,
59 };
60
61 /**
62 * struct os_if_qmi_wfds_ut_cmd_info - WFDS UT cmd info structure
63 * @cmd: Command type
64 * @duration: Traffic duration
65 * @num_pkts: Buffers per flush
66 * @flush_period: Buffer flushing periodicity
67 * @buf_size: Buffer size
68 * @ether_type: ether_type of packet
69 * @dest_mac: Destination MAC address
70 * @src_mac: Source MAC address
71 * @dest_ip: Destination IPv4 address
72 * @src_ip: Source IPv4 address
73 * @dest_port: Destination port
74 */
75 struct os_if_qmi_wfds_ut_cmd_info {
76 enum os_if_qmi_wfds_ut_cmd_type cmd;
77 uint32_t duration;
78 uint32_t flush_period;
79 uint32_t num_pkts;
80 uint32_t buf_size;
81 uint16_t ether_type;
82 struct qdf_mac_addr dest_mac;
83 struct qdf_mac_addr src_mac;
84 struct qdf_ipv4_addr dest_ip;
85 struct qdf_ipv4_addr src_ip;
86 uint16_t dest_port;
87 };
88
89 #ifdef QMI_COMPONENT_ENABLE
90 /**
91 * os_if_qmi_handle_init() - Initialize QMI handle
92 * @qmi_hdl: QMI handle to initialize
93 * @recv_buf_size: maximum size of incoming message
94 * @ops: reference to callbacks for QRTR notifications
95 * @qmi_msg_handlers: NULL-terminated list of QMI message handlers
96 *
97 * Returns: QDF status
98 */
99 QDF_STATUS
100 os_if_qmi_handle_init(struct qmi_handle *qmi_hdl, qdf_size_t recv_buf_size,
101 const struct qmi_ops *ops,
102 const struct qmi_msg_handler *qmi_msg_handlers);
103
104 /**
105 * os_if_qmi_handle_release() - Release QMI handle
106 * @qmi_hdl: QMI handle to release
107 *
108 * Returns: None
109 */
110 void os_if_qmi_handle_release(struct qmi_handle *qmi_hdl);
111
112 /**
113 * os_if_qmi_add_lookup() - Register a new lookup with the name service
114 * @qmi_hdl: QMI handle
115 * @service: service id of the request
116 * @instance: instance id of the request
117 * @version: version number of the request
118 *
119 * Return: QDF status
120 */
121 QDF_STATUS os_if_qmi_add_lookup(struct qmi_handle *qmi_hdl,
122 unsigned int service, unsigned int version,
123 unsigned int instance);
124
125 /**
126 * os_if_qmi_connect_to_svc() - Connect to QMI service
127 * @qmi_hdl: QMI handle
128 * @qmi_svc: QMI service handle
129 *
130 * Return: QDF status
131 */
132 QDF_STATUS os_if_qmi_connect_to_svc(struct qmi_handle *qmi_hdl,
133 struct qmi_service *qmi_svc);
134
135 /**
136 * os_if_qmi_txn_init() - Initialize QMI transaction
137 * @qmi_hdl: QMI handle
138 * @qmi_txn: QMI transaction handle
139 * @qmi_ei: description of how to decode a matching response (optional)
140 * @resp: pointer to the object to decode the response into (optional)
141 *
142 * Return: QDF status
143 */
144 QDF_STATUS os_if_qmi_txn_init(struct qmi_handle *qmi_hdl,
145 struct qmi_txn *qmi_txn,
146 struct qmi_elem_info *qmi_ei, void *resp);
147
148 /**
149 * os_if_qmi_send_request() - Connect to QMI service
150 * @qmi_hdl: QMI handle
151 * @sq: destination sockaddr
152 * @qmi_txn: QMI transaction handle
153 * @msg_id: message id
154 * @len: max length of the QMI message
155 * @ei: QMI message description
156 * @req: message to be encoded
157 *
158 * Return: QDF status
159 */
160 QDF_STATUS os_if_qmi_send_request(struct qmi_handle *qmi_hdl,
161 struct sockaddr_qrtr *sq,
162 struct qmi_txn *qmi_txn, int msg_id,
163 uint32_t len, struct qmi_elem_info *ei,
164 const void *req);
165
166 /**
167 * os_if_qmi_txn_wait() - Wait for transaction response
168 * @qmi_txn: QMI transaction handle
169 * @timeout: Timeout value in jiffies
170 *
171 * Return: QDF status
172 */
173 QDF_STATUS os_if_qmi_txn_wait(struct qmi_txn *qmi_txn, unsigned long timeout);
174
175 /**
176 * os_if_qmi_txn_cancel() - Cancel the QMI transaction
177 * @qmi_txn: QMI transaction handle
178 *
179 * Return: None
180 */
181 void os_if_qmi_txn_cancel(struct qmi_txn *qmi_txn);
182
183 /**
184 * os_if_qmi_register_callbacks() - Register callback handlers
185 * @psoc: Pointer to psoc context
186 * @cb_obj: Callback object pointer
187 *
188 * Return: None
189 */
190 void os_if_qmi_register_callbacks(struct wlan_objmgr_psoc *psoc,
191 struct wlan_qmi_psoc_callbacks *cb_obj);
192
193 #ifdef QMI_WFDS
194 /**
195 * os_if_qmi_wfds_register_callbacks() - Register WFDS callback handlers
196 * @cb_obj: Callback object pointer
197 *
198 * Return: None
199 */
200 void os_if_qmi_wfds_register_callbacks(struct wlan_qmi_psoc_callbacks *cb_obj);
201
202 /**
203 * os_if_qmi_wfds_send_ut_cmd_req_msg() - Send WFDS unit test command
204 * @cmd_info: Unit test command info
205 *
206 * Return: QDF_STATUS
207 */
208 QDF_STATUS
209 os_if_qmi_wfds_send_ut_cmd_req_msg(struct os_if_qmi_wfds_ut_cmd_info *cmd_info);
210
211 #else
212 static inline
os_if_qmi_wfds_register_callbacks(struct wlan_qmi_psoc_callbacks * cb_obj)213 void os_if_qmi_wfds_register_callbacks(struct wlan_qmi_psoc_callbacks *cb_obj)
214 {
215 }
216
217 static inline QDF_STATUS
os_if_qmi_wfds_send_ut_cmd_req_msg(struct os_if_qmi_wfds_ut_cmd_info * cmd_info)218 os_if_qmi_wfds_send_ut_cmd_req_msg(struct os_if_qmi_wfds_ut_cmd_info *cmd_info)
219 {
220 }
221 #endif
222 #else
223 static inline
os_if_qmi_handle_init(struct qmi_handle * qmi_hdl,qdf_size_t recv_buf_size,const struct qmi_ops * ops,const struct qmi_msg_handler * qmi_msg_handlers)224 QDF_STATUS os_if_qmi_handle_init(struct qmi_handle *qmi_hdl,
225 qdf_size_t recv_buf_size,
226 const struct qmi_ops *ops,
227 const struct qmi_msg_handler *qmi_msg_handlers)
228 {
229 return QDF_STATUS_E_NOSUPPORT;
230 }
231
232 static inline
os_if_qmi_handle_release(struct qmi_handle * qmi_hdl)233 void os_if_qmi_handle_release(struct qmi_handle *qmi_hdl)
234 {
235 }
236
237 static inline
os_if_qmi_add_lookup(struct qmi_handle * qmi_hdl,unsigned int service,unsigned int version,unsigned int instance)238 QDF_STATUS os_if_qmi_add_lookup(struct qmi_handle *qmi_hdl,
239 unsigned int service, unsigned int version,
240 unsigned int instance)
241 {
242 return QDF_STATUS_E_NOSUPPORT;
243 }
244
245 static inline
os_if_qmi_connect_to_svc(struct qmi_handle * qmi_hdl,struct qmi_service * qmi_svc)246 QDF_STATUS os_if_qmi_connect_to_svc(struct qmi_handle *qmi_hdl,
247 struct qmi_service *qmi_svc)
248 {
249 return QDF_STATUS_E_NOSUPPORT;
250 }
251
252 static inline
os_if_qmi_txn_init(struct qmi_handle * qmi_hdl,struct qmi_txn * qmi_txn,struct qmi_elem_info * qmi_ei,void * resp)253 QDF_STATUS os_if_qmi_txn_init(struct qmi_handle *qmi_hdl,
254 struct qmi_txn *qmi_txn,
255 struct qmi_elem_info *qmi_ei, void *resp)
256 {
257 return QDF_STATUS_E_NOSUPPORT;
258 }
259
260 static inline
os_if_qmi_send_request(struct qmi_handle * qmi_hdl,struct sockaddr_qrtr * sq,struct qmi_txn * qmi_txn,int msg_id,uint32_t len,struct qmi_elem_info * ei,const void * req)261 QDF_STATUS os_if_qmi_send_request(struct qmi_handle *qmi_hdl,
262 struct sockaddr_qrtr *sq,
263 struct qmi_txn *qmi_txn, int msg_id,
264 uint32_t len, struct qmi_elem_info *ei,
265 const void *req)
266 {
267 return QDF_STATUS_E_NOSUPPORT;
268 }
269
270 static inline
os_if_qmi_txn_wait(struct qmi_txn * qmi_txn,unsigned long timeout)271 QDF_STATUS os_if_qmi_txn_wait(struct qmi_txn *qmi_txn, unsigned long timeout)
272 {
273 return QDF_STATUS_E_NOSUPPORT;
274 }
275
276 static inline
os_if_qmi_txn_cancel(struct qmi_txn * qmi_txn)277 void os_if_qmi_txn_cancel(struct qmi_txn *qmi_txn)
278 {
279 }
280
281 static inline
os_if_qmi_register_callbacks(struct wlan_objmgr_psoc * psoc,struct wlan_qmi_psoc_callbacks * cb_obj)282 void os_if_qmi_register_callbacks(struct wlan_objmgr_psoc *psoc,
283 struct wlan_qmi_psoc_callbacks *cb_obj)
284 {
285 }
286 #endif
287 #endif
288