1  /*
2   * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3   * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4   *
5   * Permission to use, copy, modify, and/or distribute this software for any
6   * purpose with or without fee is hereby granted, provided that the above
7   * copyright notice and this permission notice appear in all copies.
8  
9   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10   * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11   * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12   * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13   * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16   */
17  
18  /**
19   * DOC: contains interface prototypes for son api
20   */
21  #ifndef _SON_API_H_
22  #define _SON_API_H_
23  
24  #include <qdf_types.h>
25  #include <wlan_objmgr_peer_obj.h>
26  #include <wlan_objmgr_pdev_obj.h>
27  #include <reg_services_public_struct.h>
28  #include <qdf_trace.h>
29  
30  #define son_alert(format, args...) \
31  		QDF_TRACE_FATAL(QDF_MODULE_ID_SON, format, ## args)
32  
33  #define son_err(format, args...) \
34  		QDF_TRACE_ERROR(QDF_MODULE_ID_SON, format, ## args)
35  
36  #define son_warn(format, args...) \
37  		QDF_TRACE_WARN(QDF_MODULE_ID_SON, format, ## args)
38  
39  #define son_info(format, args...) \
40  		QDF_TRACE_INFO(QDF_MODULE_ID_SON, format, ## args)
41  
42  #define son_debug(format, args...) \
43  		QDF_TRACE_DEBUG(QDF_MODULE_ID_SON, format, ## args)
44  
45  #define son_nofl_alert(format, args...) \
46  		QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_SON, format, ## args)
47  
48  #define son_nofl_err(format, args...) \
49  		QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_SON, format, ## args)
50  
51  #define son_nofl_warn(format, args...) \
52  		QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_SON, format, ## args)
53  
54  #define son_nofl_info(format, args...) \
55  		QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_SON, format, ## args)
56  
57  #define son_nofl_debug(format, args...) \
58  		QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_SON, format, ## args)
59  
60  #define son_alert_rl(format, args...) \
61  		QDF_TRACE_FATAL_RL(QDF_MODULE_ID_SON, format, ## args)
62  
63  #define son_err_rl(format, args...) \
64  		QDF_TRACE_ERROR_RL(QDF_MODULE_ID_SON, format, ## args)
65  
66  #define son_warn_rl(format, args...) \
67  		QDF_TRACE_WARN_RL(QDF_MODULE_ID_SON, format, ## args)
68  
69  #define son_info_rl(format, args...) \
70  		QDF_TRACE_INFO_RL(QDF_MODULE_ID_SON, format, ## args)
71  
72  #define son_debug_rl(format, args...) \
73  		QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_SON, format, ## args)
74  
75  #define son_nofl_alert_rl(format, args...) \
76  		QDF_TRACE_FATAL_RL_NO_FL(QDF_MODULE_ID_SON, format, ## args)
77  
78  #define son_nofl_err_rl(format, args...) \
79  		QDF_TRACE_ERROR_RL_NO_FL(QDF_MODULE_ID_SON, format, ## args)
80  
81  #define son_nofl_warn_rl(format, args...) \
82  		QDF_TRACE_WARN_RL_NO_FL(QDF_MODULE_ID_SON, format, ## args)
83  
84  #define son_nofl_info_rl(format, args...) \
85  		QDF_TRACE_INFO_RL_NO_FL(QDF_MODULE_ID_SON, format, ## args)
86  
87  #define son_nofl_debug_rl(format, args...) \
88  		QDF_TRACE_DEBUG_RL_NO_FL(QDF_MODULE_ID_SON, format, ## args)
89  
90  #define TOTAL_DWELL_TIME 200
91  
92  #define CBS_DEFAULT_RESTTIME 500 /* msec */
93  #define CBS_DEFAULT_DWELL_TIME 50 /* msec */
94  #define CBS_DEFAULT_WAIT_TIME 1000 /* 1 sec */
95  #define CBS_DEFAULT_DWELL_SPLIT_TIME 50 /* msec */
96  #define CBS_DEFAULT_DWELL_REST_TIME 500 /* msec */
97  #define CBS_DEFAULT_MIN_REST_TIME 50 /* msec */
98  
99  #define DEFAULT_BEACON_INTERVAL 100
100  
101  #define CBS_DWELL_TIME_10MS 10
102  #define CBS_DWELL_TIME_25MS 25
103  #define CBS_DWELL_TIME_50MS 50
104  #define CBS_DWELL_TIME_75MS 75
105  #define MIN_SCAN_OFFSET_ARRAY_SIZE 0
106  #define MAX_SCAN_OFFSET_ARRAY_SIZE 9
107  #define SCAN_START_OFFSET_MIN 26
108  
109  #define DEFAULT_SCAN_MAX_REST_TIME 500
110  
111  /**
112   * enum son_cbs_state - son cbs state enumeration
113   * @CBS_INIT: init state
114   * @CBS_SCAN: scanning state
115   * @CBS_REST: rest state
116   * @CBS_RANK: rank state
117   * @CBS_WAIT: wait state
118   */
119  enum son_cbs_state {
120  	CBS_INIT,
121  	CBS_SCAN,
122  	CBS_REST,
123  	CBS_RANK,
124  	CBS_WAIT,
125  };
126  
127  /**
128   * struct son_cbs - son cbs struction
129   * @vdev: vdev
130   * @cbs_lock: cbs spin lock
131   * @cbs_timer: cbs timer
132   * @cbs_state: cbs state
133   * @cbs_scan_requestor: scan requestor
134   * @cbs_scan_id: scan id
135   * @dwell_time: dwell time configuration
136   * @rest_time: rest time configuration
137   * @wait_time: wait time configuration
138   * @scan_intvl_time: interval time configuration
139   * @scan_params: scan params
140   * @max_dwell_split_cnt: max dwell split counter
141   * @dwell_split_cnt: dwell split counter
142   * @scan_offset: scan offset array
143   * @scan_dwell_rest: scan dwell rest array
144   * @min_dwell_rest_time: nub dwell rest time
145   * @dwell_split_time: dwell split time
146   * @max_arr_size_used: max array size used
147   */
148  struct son_cbs {
149  	struct wlan_objmgr_vdev *vdev;
150  
151  	spinlock_t cbs_lock;
152  	qdf_timer_t cbs_timer;
153  
154  	enum son_cbs_state cbs_state;
155  
156  	wlan_scan_requester cbs_scan_requestor;
157  	wlan_scan_id cbs_scan_id;
158  
159  	uint32_t dwell_time;
160  	uint32_t rest_time;
161  	uint32_t wait_time;
162  	int32_t  scan_intvl_time;
163  
164  	struct scan_start_request scan_params;
165  
166  	uint8_t max_dwell_split_cnt;
167  	int8_t dwell_split_cnt;
168  	uint32_t scan_offset[10];
169  	uint32_t scan_dwell_rest[10];
170  	uint32_t min_dwell_rest_time;
171  	uint32_t dwell_split_time;
172  	uint8_t max_arr_size_used;
173  };
174  
175  /**
176   * typedef mlme_deliver_cb() - cb to deliver mlme event
177   * @vdev: pointer to vdev
178   * @event_len: event length
179   * @event_buf: event buffer
180   *
181   * Return: 0 if event is sent successfully
182   */
183  typedef int (*mlme_deliver_cb)(struct wlan_objmgr_vdev *vdev,
184  			       uint32_t event_len,
185  			       const uint8_t *event_buf);
186  
187  /**
188   * enum SON_MLME_DELIVER_CB_TYPE - mlme deliver cb type
189   * @SON_MLME_DELIVER_CB_TYPE_OPMODE: cb to deliver opmode
190   * @SON_MLME_DELIVER_CB_TYPE_SMPS: cb to deliver smps
191   */
192  enum SON_MLME_DELIVER_CB_TYPE {
193  	SON_MLME_DELIVER_CB_TYPE_OPMODE,
194  	SON_MLME_DELIVER_CB_TYPE_SMPS,
195  };
196  
197  /**
198   * wlan_son_register_mlme_deliver_cb - register mlme deliver cb
199   * @psoc: pointer to psoc
200   * @cb: mlme deliver cb
201   * @type: mlme deliver cb type
202   *
203   * Return: QDF_STATUS
204   */
205  QDF_STATUS
206  wlan_son_register_mlme_deliver_cb(struct wlan_objmgr_psoc *psoc,
207  				  mlme_deliver_cb cb,
208  				  enum SON_MLME_DELIVER_CB_TYPE type);
209  /**
210   * wlan_son_peer_ext_stat_enable() - sends EXT stats command to FW
211   * @pdev: pointer to pdev
212   * @mac_addr: MAC address of the target peer
213   * @vdev: Pointer to vdev
214   * @stats_count: Stats count
215   * @enable: Enable / disable ext stats
216   *
217   * Return: QDF_STATUS_SUCCESS on success else failure
218   */
219  QDF_STATUS wlan_son_peer_ext_stat_enable(struct wlan_objmgr_pdev *pdev,
220  					 uint8_t *mac_addr,
221  					 struct wlan_objmgr_vdev *vdev,
222  					 uint32_t stats_count,
223  					 uint32_t enable);
224  
225  /**
226   * wlan_son_peer_req_inst_stats() - Requests for instantaneous stats for
227   *				    the target mac_addr from FW via
228   *				    WMI_REQUEST_STATS_CMDID.
229   * @pdev: pointer to pdev
230   * @mac_addr: MAC address of the target peer
231   * @vdev: Pointer to vdev
232   *
233   * Return: QDF_STATUS_SUCCESS on success else failure
234   */
235  QDF_STATUS wlan_son_peer_req_inst_stats(struct wlan_objmgr_pdev *pdev,
236  					uint8_t *mac_addr,
237  					struct wlan_objmgr_vdev *vdev);
238  
239  /**
240   * wlan_son_get_chan_flag() - get chan flag
241   * @pdev: pointer to pdev
242   * @freq: qdf_freq_t
243   * @flag_160: If true, 160 channel info will be obtained;
244   *            otherwise 80+80, 80 channel info will be obtained
245   * @chan_params: chan parameters
246   *
247   * Return: combination of enum qca_wlan_vendor_channel_prop_flags and
248   *         enum qca_wlan_vendor_channel_prop_flags_2
249   */
250  uint32_t wlan_son_get_chan_flag(struct wlan_objmgr_pdev *pdev,
251  				qdf_freq_t freq, bool flag_160,
252  				struct ch_params *chan_params);
253  
254  /**
255   * wlan_son_peer_set_kickout_allow() - set the peer is allowed to kickout
256   * @vdev: pointer to vdev
257   * @peer: pointer to peer
258   * @kickout_allow: kickout_allow to set
259   *
260   * Return: QDF_STATUS_SUCCESS on Success else failure.
261   */
262  QDF_STATUS wlan_son_peer_set_kickout_allow(struct wlan_objmgr_vdev *vdev,
263  					   struct wlan_objmgr_peer *peer,
264  					   bool kickout_allow);
265  
266  /**
267   * wlan_son_cbs_init() - son cbs init
268   *
269   * Return: 0 if succeed
270   */
271  int wlan_son_cbs_init(void);
272  
273  /* wlan_son_cbs_deinit - son cbs deinit
274   *
275   * Return: 0 if succeed
276   */
277  int wlan_son_cbs_deinit(void);
278  
279  /* wlan_son_cbs_enable() - son cbs enable
280   * @vdev: pointer to vdev
281   *
282   * Return: 0 if succeed
283   */
284  int wlan_son_cbs_enable(struct wlan_objmgr_vdev *vdev);
285  
286  /* wlan_son_cbs_disable() - son cbs disable
287   * @vdev: pointer to vdev
288   *
289   * Return: 0 if succeed
290   */
291  int wlan_son_cbs_disable(struct wlan_objmgr_vdev *vdev);
292  
293  /* wlan_son_set_cbs() - son cbs set
294   * @vdev: pointer to vdev
295   * @enable: enable or disable son cbs
296   *
297   * Return: 0 if succeed
298   */
299  int wlan_son_set_cbs(struct wlan_objmgr_vdev *vdev,
300  		     bool enable);
301  
302  /* wlan_son_set_cbs_wait_time() - cbs wait time configure
303   * @vdev: pointer to vdev
304   * @val: wait time value
305   *
306   * Return: 0 if succeed
307   */
308  int wlan_son_set_cbs_wait_time(struct wlan_objmgr_vdev *vdev,
309  			       uint32_t val);
310  
311  /* wlan_son_set_cbs_dwell_split_time() - cbs dwell spilt time configure
312   * @vdev: pointer to vdev
313   * @val: dwell spilt time value
314   *
315   * Return: 0 if succeed
316   */
317  int wlan_son_set_cbs_dwell_split_time(struct wlan_objmgr_vdev *vdev,
318  				      uint32_t val);
319  
320  /**
321   * wlan_son_vdev_get_supported_txrx_streams() - get supported spatial streams
322   * @vdev: pointer to vdev
323   * @num_tx_streams: pointer to number of tx streams
324   * @num_rx_streams: pointer to number of rx streams
325   *
326   * Return: QDF_STATUS_SUCCESS on Success else failure.
327   */
328  QDF_STATUS
329  wlan_son_vdev_get_supported_txrx_streams(struct wlan_objmgr_vdev *vdev,
330  					 uint32_t *num_tx_streams,
331  					 uint32_t *num_rx_streams);
332  
333  #ifdef WLAN_FEATURE_SON
334  /**
335   * wlan_son_peer_is_kickout_allow() - Is peer is allowed to kickout
336   * @vdev: pointer to vdev
337   * @macaddr: mac addr of the peer
338   *
339   * Return: True if it is allowed to kickout.
340   */
341  bool wlan_son_peer_is_kickout_allow(struct wlan_objmgr_vdev *vdev,
342  				    uint8_t *macaddr);
343  
344  /**
345   * wlan_son_ind_assoc_req_frm() - indicate assoc req frame to son
346   * @vdev: pointer to vdev
347   * @macaddr: MAC address
348   * @is_reassoc: true if it is reassoc req
349   * @frame: frame body
350   * @frame_len: frame body length
351   * @status: assoc req frame is handled successfully
352   *
353   * Return: Void
354   */
355  void wlan_son_ind_assoc_req_frm(struct wlan_objmgr_vdev *vdev,
356  				uint8_t *macaddr, bool is_reassoc,
357  				uint8_t *frame, uint16_t frame_len,
358  				QDF_STATUS status);
359  
360  /**
361   * wlan_son_deliver_tx_power() - notify son module of tx power
362   * @vdev: vdev
363   * @max_pwr: max power in dBm unit
364   *
365   * Return: 0 if event is sent successfully
366   */
367  int wlan_son_deliver_tx_power(struct wlan_objmgr_vdev *vdev,
368  			      int32_t max_pwr);
369  
370  /**
371   * wlan_son_deliver_vdev_stop() - notify son module of vdev stop
372   * @vdev: vdev
373   *
374   * Return: 0 if event is sent successfully
375   */
376  int wlan_son_deliver_vdev_stop(struct wlan_objmgr_vdev *vdev);
377  
378  /**
379   * wlan_son_deliver_inst_rssi() - notify son module of inst rssi
380   * @vdev: vdev
381   * @peer: peer device
382   * @irssi: inst rssi above the noise floor in dB unit
383   *
384   * Return: 0 if event is sent successfully
385   */
386  int wlan_son_deliver_inst_rssi(struct wlan_objmgr_vdev *vdev,
387  			       struct wlan_objmgr_peer *peer,
388  			       uint32_t irssi);
389  
390  /**
391   * wlan_son_deliver_opmode() - notify user app of opmode
392   * @vdev: vdev objmgr
393   * @bw: channel width defined in enum eSirMacHTChannelWidth
394   * @nss: supported rx nss
395   * @addr: source addr
396   *
397   * Return: 0 if event is sent successfully
398   */
399  int wlan_son_deliver_opmode(struct wlan_objmgr_vdev *vdev,
400  			    uint8_t bw,
401  			    uint8_t nss,
402  			    uint8_t *addr);
403  
404  /**
405   * wlan_son_deliver_smps() - notify user app of smps
406   * @vdev: vdev objmgr
407   * @is_static: is_static
408   * @addr: source addr
409   *
410   * Return: 0 if event is sent successfully
411   */
412  int wlan_son_deliver_smps(struct wlan_objmgr_vdev *vdev,
413  			  uint8_t is_static,
414  			  uint8_t *addr);
415  
416  /**
417   * wlan_son_deliver_rrm_rpt() - notify son module of rrm rpt
418   * @vdev: vdev objmgr
419   * @addr: sender addr
420   * @frm: points to measurement report
421   * @flen: frame length
422   *
423   * Return: 0 if event is sent successfully
424   */
425  int wlan_son_deliver_rrm_rpt(struct wlan_objmgr_vdev *vdev,
426  			     uint8_t *addr,
427  			     uint8_t *frm,
428  			     uint32_t flen);
429  /**
430   * wlan_son_anqp_frame() - notify son module of mgmt frames
431   * @vdev: vdev
432   * @subtype: frame subtype
433   * @frame: the 802.11 frame
434   * @frame_len: frame length
435   * @action_hdr: Action header of the frame
436   * @macaddr: source mac address
437   *
438   * Return: 0 if event is sent successfully
439   */
440  int wlan_son_anqp_frame(struct wlan_objmgr_vdev *vdev, int subtype,
441  			uint8_t *frame, uint16_t frame_len, void *action_hdr,
442  			uint8_t *macaddr);
443  
444  /**
445   * wlan_son_get_node_tx_power() - Gets the max transmit power for peer
446   * @assoc_req_ies: assoc req ies
447   *
448   * Return: Returns the max tx power
449   */
450  uint8_t wlan_son_get_node_tx_power(struct element_info assoc_req_ies);
451  
452  /**
453   * wlan_son_get_peer_rrm_info() - Get RRM info for peer
454   * @assoc_req_ies: assoc req ies
455   * @rrmcaps: rrm capabilities
456   * @is_beacon_meas_supported: if beacon meas is supported
457   *
458   * Return: Returns QDF_STATUS_SUCCESS if succeed
459   */
460  QDF_STATUS wlan_son_get_peer_rrm_info(struct element_info assoc_req_ies,
461  				      uint8_t *rrmcaps,
462  				      bool *is_beacon_meas_supported);
463  #else
464  
wlan_son_peer_is_kickout_allow(struct wlan_objmgr_vdev * vdev,uint8_t * macaddr)465  static inline bool wlan_son_peer_is_kickout_allow(struct wlan_objmgr_vdev *vdev,
466  						  uint8_t *macaddr)
467  {
468  	return true;
469  }
470  
471  static inline
wlan_son_ind_assoc_req_frm(struct wlan_objmgr_vdev * vdev,uint8_t * macaddr,bool is_reassoc,uint8_t * frame,uint16_t frame_len,QDF_STATUS status)472  void wlan_son_ind_assoc_req_frm(struct wlan_objmgr_vdev *vdev,
473  				uint8_t *macaddr, bool is_reassoc,
474  				uint8_t *frame, uint16_t frame_len,
475  				QDF_STATUS status)
476  {
477  }
478  
479  static inline
wlan_son_deliver_tx_power(struct wlan_objmgr_vdev * vdev,int32_t max_pwr)480  int wlan_son_deliver_tx_power(struct wlan_objmgr_vdev *vdev,
481  			      int32_t max_pwr)
482  {
483  	return -EINVAL;
484  }
485  
486  static inline
wlan_son_deliver_vdev_stop(struct wlan_objmgr_vdev * vdev)487  int wlan_son_deliver_vdev_stop(struct wlan_objmgr_vdev *vdev)
488  {
489  	return -EINVAL;
490  }
491  
492  static inline
wlan_son_deliver_inst_rssi(struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_peer * peer,uint32_t irssi)493  int wlan_son_deliver_inst_rssi(struct wlan_objmgr_vdev *vdev,
494  			       struct wlan_objmgr_peer *peer,
495  			       uint32_t irssi)
496  {
497  	return -EINVAL;
498  }
499  
500  static inline
wlan_son_deliver_opmode(struct wlan_objmgr_vdev * vdev,uint8_t bw,uint8_t nss,uint8_t * addr)501  int wlan_son_deliver_opmode(struct wlan_objmgr_vdev *vdev,
502  			    uint8_t bw,
503  			    uint8_t nss,
504  			    uint8_t *addr)
505  {
506  	return -EINVAL;
507  }
508  
509  static inline
wlan_son_deliver_smps(struct wlan_objmgr_vdev * vdev,uint8_t is_static,uint8_t * addr)510  int wlan_son_deliver_smps(struct wlan_objmgr_vdev *vdev,
511  			  uint8_t is_static,
512  			  uint8_t *addr)
513  {
514  	return -EINVAL;
515  }
516  
517  static inline
wlan_son_deliver_rrm_rpt(struct wlan_objmgr_vdev * vdev,uint8_t * mac_addr,uint8_t * frm,uint32_t flen)518  int wlan_son_deliver_rrm_rpt(struct wlan_objmgr_vdev *vdev,
519  			     uint8_t *mac_addr,
520  			     uint8_t *frm,
521  			     uint32_t flen)
522  {
523  	return -EINVAL;
524  }
525  
526  static inline
wlan_son_anqp_frame(struct wlan_objmgr_vdev * vdev,int subtype,uint8_t * frame,uint16_t frame_len,void * action_hdr,uint8_t * macaddr)527  int wlan_son_anqp_frame(struct wlan_objmgr_vdev *vdev, int subtype,
528  			uint8_t *frame, uint16_t frame_len, void *action_hdr,
529  			uint8_t *macaddr)
530  {
531  	return -EINVAL;
532  }
533  
534  static inline
wlan_son_get_node_tx_power(struct element_info assoc_req_ies)535  uint8_t wlan_son_get_node_tx_power(struct element_info assoc_req_ies)
536  {
537  	return 0;
538  }
539  
540  static inline
wlan_son_get_peer_rrm_info(struct element_info assoc_req_ies,uint8_t * rrmcaps,bool * is_beacon_meas_supported)541  QDF_STATUS wlan_son_get_peer_rrm_info(struct element_info assoc_req_ies,
542  				      uint8_t *rrmcaps,
543  				      bool *is_beacon_meas_supported)
544  {
545  	return QDF_STATUS_E_INVAL;
546  }
547  #endif /*WLAN_FEATURE_SON*/
548  #endif
549