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