1 /*
2  * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /**
21  * DOC: wifi_pos_utils_i.h
22  * This file defines the prototypes for the utility helper functions
23  * for the wifi_pos component.
24  */
25 
26 #ifdef WIFI_POS_CONVERGED
27 #ifndef _WIFI_POS_UTILS_H_
28 #define _WIFI_POS_UTILS_H_
29 /* Include files */
30 #include "qdf_types.h"
31 #include "qdf_status.h"
32 #include "ol_defines.h"
33 #include "qdf_trace.h"
34 #include "qdf_module.h"
35 #include "wifi_pos_utils_pub.h"
36 #include "wlan_objmgr_vdev_obj.h"
37 #include "wlan_cmn.h"
38 
39 struct wlan_objmgr_psoc;
40 struct wifi_pos_req_msg;
41 
42 #define wifi_pos_alert(params...) \
43 	QDF_TRACE_FATAL(QDF_MODULE_ID_WIFIPOS, params)
44 #define wifi_pos_err(params...) \
45 	QDF_TRACE_ERROR(QDF_MODULE_ID_WIFIPOS, params)
46 #define wifi_pos_warn(params...) \
47 	QDF_TRACE_WARN(QDF_MODULE_ID_WIFIPOS, params)
48 #define wifi_pos_notice(params...) \
49 	QDF_TRACE_INFO(QDF_MODULE_ID_WIFIPOS, params)
50 #define wifi_pos_debug(params...) \
51 	QDF_TRACE_DEBUG(QDF_MODULE_ID_WIFIPOS, params)
52 
53 #define wifipos_nofl_alert(params...) \
54 	QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_WIFIPOS, params)
55 #define wifipos_nofl_err(params...) \
56 	QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_WIFIPOS, params)
57 #define wifipos_nofl_warn(params...) \
58 	QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_WIFIPOS, params)
59 #define wifipos_nofl_notice(params...) \
60 	QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_WIFIPOS, params)
61 #define wifipos_nofl_debug(params...) \
62 	QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_WIFIPOS, params)
63 
64 #define OEM_APP_SIGNATURE_STR      "QUALCOMM-OEM-APP"
65 #define OEM_APP_SIGNATURE_LEN      (sizeof(OEM_APP_SIGNATURE_STR) - 1)
66 
67 #ifndef OEM_DATA_RSP_SIZE
68 #define OEM_DATA_RSP_SIZE 1724
69 /* Header + VHT80 CIR * 2 chains */
70 #define OEM_DATA_DMA_BUFF_SIZE (64 + 512 * 4 * 2)
71 #endif
72 
73 /**
74  * struct app_reg_rsp_vdev_info - vdev info struct
75  * @dev_mode: device mode
76  * @vdev_id: vdev id
77  *
78  */
79 struct app_reg_rsp_vdev_info {
80 	uint8_t dev_mode;
81 	uint8_t vdev_id;
82 } qdf_packed;
83 
84 /**
85  * struct wifi_app_reg_rsp - app registration response struct
86  * @num_inf: number of interfaces active
87  * @vdevs: array indicating all active vdev's information
88  *
89  */
90 struct wifi_app_reg_rsp {
91 	uint8_t num_inf;
92 	QDF_FLEX_ARRAY(struct app_reg_rsp_vdev_info, vdevs);
93 } qdf_packed;
94 
95 /**
96  * struct oem_data_req - data request to be sent to firmware
97  * @data_len: len of data
98  * @data: buffer containing data
99  *
100  */
101 struct oem_data_req {
102 	uint32_t data_len;
103 	uint8_t *data;
104 };
105 
106 /**
107  * struct oem_data_rsp - response from firmware to data request sent earlier
108  * @rsp_len_1: len of data_1
109  * @data_1: first part of payload
110  * @rsp_len_2: len of data_2
111  * @data_2: second part of payload
112  * @dma_len: len of DMAed data
113  * @vaddr: virtual address of DMA data start
114  *
115  */
116 struct oem_data_rsp {
117 	uint32_t rsp_len_1;
118 	uint8_t *data_1;
119 	uint32_t rsp_len_2;
120 	uint8_t *data_2;
121 	uint32_t dma_len;
122 	void *vaddr;
123 };
124 
125 /**
126  * struct wifi_pos_err_rpt - Error report response for userspace.
127  * @tag_len: tlv header of the message.
128  * @info: Report info. Reserved for error report.
129  * @dest_mac: Mac address of the sta in the request.
130  * @reserved: Reserved in error report.
131  */
132 struct wifi_pos_err_rpt {
133 	uint32_t tag_len;
134 	uint32_t info;
135 	uint8_t  dest_mac[QDF_MAC_ADDR_SIZE + 2];
136 	uint32_t reserved;
137 } qdf_packed;
138 
139 #define OEM_MSG_RSP_HEAD_TAG_ID 33
140 #define OEM_MEAS_RSP_HEAD_TAG_ID 41
141 /**
142  * struct wifi_pos_err_msg_report - Error report message
143  * @msg_tag_len: Message tlv header
144  * @msg_subtype: Message subtype
145  * @req_id: id corresponding to the request.
146  * @fragment_info: Valid only for fragments.
147  * @pdev_id: pdev_id of radion.
148  * @time_left: time left in the measurement req.
149  * @err_rpt: Error report data.
150  */
151 struct wifi_pos_err_msg_report {
152 	uint32_t msg_tag_len;
153 	uint32_t msg_subtype;
154 	uint32_t req_id;
155 	uint32_t fragment_info;
156 	uint32_t pdev_id;
157 	uint32_t time_left;
158 	struct wifi_pos_err_rpt err_rpt;
159 } qdf_packed;
160 
161 /**
162  * struct wifi_pos_dma_rings_cap - capabilities requested by firmware.
163  * @pdev_id: pdev_id or mac_id of ring
164  * @min_num_ptr: minimum depth of ring required
165  * @min_buf_size: minimum size of each buffer
166  * @min_buf_align: minimum alignment of buffer memory
167  */
168 struct wifi_pos_dma_rings_cap {
169 	uint32_t pdev_id;
170 	uint32_t min_num_ptr;
171 	uint32_t min_buf_size;
172 	uint32_t min_buf_align;
173 };
174 
175 /**
176  * struct wifi_pos_dma_buf_info - buffer info struct containing phy to virtual
177  * mapping.
178  * @cookie: this identifies location of DMA buffer in pool array
179  * @paddr: aligned physical address as exchanged with firmware
180  * @vaddr: virtual address - unaligned. this helps in freeing later
181  * @offset: offset of aligned address from unaligned
182  */
183 struct wifi_pos_dma_buf_info {
184 	uint32_t cookie;
185 	void *paddr;
186 	void *vaddr;
187 	uint8_t offset;
188 };
189 
190 /**
191  * struct wifi_pos_dma_rings_cfg - DMA ring parameters to be programmed to FW.
192  * @pdev_id: pdev_id of ring
193  * @num_ptr: depth of ring
194  * @ring_alloc_size: size of the ring allocation
195  * @base_paddr_unaligned: base physical addr unaligned
196  * @base_vaddr_unaligned: base virtual addr unaligned
197  * @base_paddr_aligned: base physical addr aligned
198  * @base_vaddr_aligned: base virtual addr unaligned
199  * @head_idx_addr: head index addr
200  * @tail_idx_addr: tail index addr
201  * @srng: hal srng
202  */
203 struct wifi_pos_dma_rings_cfg {
204 	uint32_t pdev_id;
205 	uint32_t num_ptr;
206 	uint32_t ring_alloc_size;
207 	void *base_paddr_unaligned;
208 	void *base_vaddr_unaligned;
209 	void *base_paddr_aligned;
210 	void *base_vaddr_aligned;
211 	void *head_idx_addr;
212 	void *tail_idx_addr;
213 	void *srng;
214 };
215 
216 typedef void (*wifi_pos_send_rsp_handler)(struct wlan_objmgr_psoc *, uint32_t,
217 					  enum wifi_pos_cmd_ids,
218 					  uint32_t, uint8_t *);
219 
220 /**
221  * struct wifi_pos_legacy_ops  - wifi pos module legacy callbacks
222  * @pasn_peer_create_cb: PASN peer create callback
223  * @pasn_peer_delete_cb: PASN peer delete callback
224  * @pasn_vdev_delete_resume_cb: PASN resume vdev delete callback
225  */
226 struct wifi_pos_legacy_ops {
227 	QDF_STATUS (*pasn_peer_create_cb)(struct wlan_objmgr_psoc *psoc,
228 					  struct qdf_mac_addr *peer_addr,
229 					  uint8_t vdev_id);
230 	QDF_STATUS (*pasn_peer_delete_cb)(struct wlan_objmgr_psoc *psoc,
231 					  struct qdf_mac_addr *peer_addr,
232 					  uint8_t vdev_id,
233 					  bool no_fw_peer_delete);
234 	QDF_STATUS (*pasn_vdev_delete_resume_cb)(struct wlan_objmgr_vdev *vdev);
235 };
236 
237 /**
238  * struct wifi_pos_psoc_priv_obj - psoc obj data for wifi_pos
239  * @app_pid: pid of app registered to host driver
240  * @is_app_registered: indicates if app is registered
241  * @fine_time_meas_cap: FTM cap for different roles, reflection of ini
242  * @ftm_rr: configured value of FTM Ranging Request capability
243  * @lci_capability: configured value of LCI capability
244  * @rsvd: reserved
245  * @oem_target_type
246  * @oem_target_type: oem target type, populated from HDD
247  * @oem_fw_version: firmware version, populated from HDD
248  * @driver_version: driver version, populated from HDD
249  * @allowed_dwell_time_min: allowed dwell time min, populated from HDD
250  * @allowed_dwell_time_max: allowed dwell time max, populated from HDD
251  * @current_dwell_time_min: current dwell time min, populated from HDD
252  * @current_dwell_time_max: current dwell time max, populated from HDD
253  * @hal_soc: hal_soc
254  * @num_rings: DMA ring cap requested by firmware
255  * @dma_cap: dma cap as read from service ready ext event
256  * @dma_cfg: DMA ring cfg to be programmed to firmware
257  * @dma_buf_pool: DMA buffer pools maintained at host: this will be 2-D array
258  * where with num_rows = number of rings num_elements in each row = ring depth
259  * @osif_cb: Callbacks to OS_IF
260  * @wifi_pos_lock: lock to access wifi pos priv object
261  * @oem_6g_support_disable: oem target 6ghz support is disabled if set
262  * @enable_rsta_secure_ltf_support: Enable RSTA secure LTF support
263  * @enable_rsta_11az_ranging: Enable RSTA 802.11 az secure ranging support
264  * @wifi_pos_req_handler: function pointer to handle TLV or non-TLV
265  * @wifi_pos_send_rsp: function pointer to send msg to userspace APP
266  * @wifi_pos_get_phy_mode: function pointer to get wlan phymode for given
267  *                         channel, channel width
268  * @wifi_pos_get_fw_phy_mode_for_freq: function pointer to get fw phymode
269  *                                     for given freq and channel width
270  * @wifi_pos_send_action: function pointer to send registered action frames
271  *                        to userspace APP
272  * @wifi_pos_get_pdev_id_by_dev_name: get pdev_id from device name
273  * @wifi_pos_measurement_request_notification: Call this API when the driver
274  *                                             receives measurement request
275  *                                             from the LOWI application
276  * @legacy_ops: wifi pos legacy callbacks
277  * @rsp_version: rsp version
278  *
279  * wifi pos request messages
280  * <----- fine_time_meas_cap (in bits) ----->
281  *+----------+-----+-----+------+------+-------+-------+-----+-----+
282  *|   8-31   |  7  |  6  |   5  |   4  |   3   |   2   |  1  |  0  |
283  *+----------+-----+-----+------+------+-------+-------+-----+-----+
284  *| reserved | SAP | SAP |P2P-GO|P2P-GO|P2P-CLI|P2P-CLI| STA | STA |
285  *|          |resp |init |resp  |init  |resp   |init   |resp |init |
286  *+----------+-----+-----+------+------+-------+-------+-----+-----+
287  * resp - responder role; init- initiator role
288  * @wifi_pos_get_max_fw_phymode_for_channels: function pointer to get max
289  *            supported FW phymode for the given channels
290  *
291  */
292 struct wifi_pos_psoc_priv_obj {
293 	uint32_t app_pid;
294 	bool is_app_registered;
295 	uint32_t fine_time_meas_cap;
296 	uint32_t ftm_rr:1;
297 	uint32_t lci_capability:1;
298 	uint32_t rsvd:30;
299 
300 	uint32_t oem_target_type;
301 	uint32_t oem_fw_version;
302 	struct wifi_pos_driver_version driver_version;
303 	uint16_t allowed_dwell_time_min;
304 	uint16_t allowed_dwell_time_max;
305 	uint16_t current_dwell_time_min;
306 	uint16_t current_dwell_time_max;
307 
308 	void *hal_soc;
309 	uint8_t num_rings;
310 	struct wifi_pos_dma_rings_cap *dma_cap;
311 	struct wifi_pos_dma_rings_cfg *dma_cfg;
312 	struct wifi_pos_dma_buf_info **dma_buf_pool;
313 
314 	struct wifi_pos_osif_ops *osif_cb;
315 
316 	qdf_spinlock_t wifi_pos_lock;
317 	bool oem_6g_support_disable;
318 	bool enable_rsta_secure_ltf_support;
319 	uint32_t enable_rsta_11az_ranging;
320 	struct wifi_pos_legacy_ops *legacy_ops;
321 	QDF_STATUS (*wifi_pos_req_handler)(struct wlan_objmgr_psoc *psoc,
322 				    struct wifi_pos_req_msg *req);
323 	wifi_pos_send_rsp_handler wifi_pos_send_rsp;
324 	void (*wifi_pos_get_phy_mode)(qdf_freq_t freq, uint32_t chan_width,
325 				      enum wlan_phymode *phy_mode);
326 	void (*wifi_pos_get_fw_phy_mode_for_freq)(uint32_t, uint32_t,
327 						  uint32_t *);
328 	void (*wifi_pos_send_action)(struct wlan_objmgr_psoc *psoc,
329 				     uint32_t oem_subtype, uint8_t *buf,
330 				     uint32_t len);
331 	QDF_STATUS (*wifi_pos_get_pdev_id_by_dev_name)(
332 			char *dev_name, uint8_t *pdev_id,
333 			struct wlan_objmgr_psoc **psoc);
334 	QDF_STATUS (*wifi_pos_measurement_request_notification)(
335 			struct wlan_objmgr_pdev *pdev,
336 			struct rtt_channel_info *chinfo);
337 	uint32_t rsp_version;
338 	QDF_STATUS (*wifi_pos_get_max_fw_phymode_for_channels)(
339 			struct wlan_objmgr_pdev *pdev,
340 			struct wifi_pos_channel_power *chan_list,
341 			uint16_t wifi_pos_num_chans);
342 };
343 
344 /**
345  * wifi_pos_get_psoc_priv_obj: API to get wifi_psoc private object
346  * @psoc: pointer to psoc object
347  *
348  * Return: psoc private object on success, NULL otherwise
349  */
350 struct wifi_pos_psoc_priv_obj *wifi_pos_get_psoc_priv_obj(
351 		struct wlan_objmgr_psoc *psoc);
352 
353 /**
354  * wifi_pos_lock_init: API to init lock used protect use of psoc global pointer
355  * variable
356  *
357  * Return: none.
358  */
359 void wifi_pos_lock_init(void);
360 
361 /**
362  * wifi_pos_lock_deinit: API to deinit lock used protect use of psoc global
363  * pointer variable
364  *
365  * Return: none.
366  */
367 void wifi_pos_lock_deinit(void);
368 
369 /**
370  * wifi_pos_set_psoc: API to set global PSOC object
371  * @psoc: pointer to psoc object
372  *
373  * Since request from userspace is not associated with any vdev/pdev/psoc, this
374  * API is used to set global psoc object.
375  *
376  * Return: none.
377  */
378 void wifi_pos_set_psoc(struct wlan_objmgr_psoc *psoc);
379 
380 /**
381  * wifi_pos_get_psoc: API to get global PSOC object
382  *
383  * Since request from userspace is not associated with any vdev/pdev/psoc, this
384  * API is used to get global psoc object.
385  * Return: global psoc object.
386  */
387 struct wlan_objmgr_psoc *wifi_pos_get_psoc(void);
388 
389 /**
390  * wifi_pos_clear_psoc: API to clear global PSOC object
391  *
392  * Return: none.
393  */
394 void wifi_pos_clear_psoc(void);
395 
396 /**
397  * wifi_pos_populate_caps: API to get OEM caps
398  * @psoc: psoc object
399  * @caps: capabilities buffer to populate
400  *
401  * Return: status of operation.
402  */
403 QDF_STATUS wifi_pos_populate_caps(struct wlan_objmgr_psoc *psoc,
404 				  struct wifi_pos_driver_caps *caps);
405 
406 /**
407  * wifi_pos_get_app_pid: returns oem app pid.
408  * @psoc: pointer to psoc object
409  *
410  * Return: oem app pid
411  */
412 uint32_t wifi_pos_get_app_pid(struct wlan_objmgr_psoc *psoc);
413 
414 /**
415  * wifi_pos_is_app_registered: indicates if oem app is registered.
416  * @psoc: pointer to psoc object
417  *
418  * Return: true if app is registered, false otherwise
419  */
420 bool wifi_pos_is_app_registered(struct wlan_objmgr_psoc *psoc);
421 
422 /**
423  * wifi_pos_get_vdev_priv_obj() - Get WIfi pos module vdev private
424  * object
425  * @vdev: vdev pointer
426  *
427  * Return: Pointer to vdev private obj
428  */
429 struct wifi_pos_vdev_priv_obj *
430 wifi_pos_get_vdev_priv_obj(struct wlan_objmgr_vdev *vdev);
431 
432 #endif /* _WIFI_POS_UTILS_H_ */
433 #endif /* WIFI_POS_CONVERGED */
434