1  /*
2   * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
3   * Copyright (c) 2022-2023 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: wlan_tdls_main.h
22   *
23   * TDLS core function declaration
24   */
25  
26  #if !defined(_WLAN_TDLS_MAIN_H_)
27  #define _WLAN_TDLS_MAIN_H_
28  
29  #include <qdf_trace.h>
30  #include <qdf_list.h>
31  #include <wlan_objmgr_psoc_obj.h>
32  #include <wlan_objmgr_pdev_obj.h>
33  #include <wlan_objmgr_vdev_obj.h>
34  #include <wlan_objmgr_peer_obj.h>
35  #include <wlan_tdls_public_structs.h>
36  #include <scheduler_api.h>
37  #include "wlan_serialization_api.h"
38  #include <wlan_utility.h>
39  
40  
41  /* Bit mask flag for tdls_option to FW */
42  #define ENA_TDLS_OFFCHAN      (1 << 0)  /* TDLS Off Channel support */
43  #define ENA_TDLS_BUFFER_STA   (1 << 1)  /* TDLS Buffer STA support */
44  #define ENA_TDLS_SLEEP_STA    (1 << 2)  /* TDLS Sleep STA support */
45  
46  #define BW_20_OFFSET_BIT   0
47  #define BW_40_OFFSET_BIT   1
48  #define BW_80_OFFSET_BIT   2
49  #define BW_160_OFFSET_BIT  3
50  
51  #define TDLS_SEC_OFFCHAN_OFFSET_0        0
52  #define TDLS_SEC_OFFCHAN_OFFSET_40PLUS   40
53  #define TDLS_SEC_OFFCHAN_OFFSET_40MINUS  (-40)
54  #define TDLS_SEC_OFFCHAN_OFFSET_80       80
55  #define TDLS_SEC_OFFCHAN_OFFSET_160      160
56  /*
57   * Before UpdateTimer expires, we want to timeout discovery response
58   * should not be more than 2000.
59   */
60  #define TDLS_DISCOVERY_TIMEOUT_BEFORE_UPDATE     1000
61  #define TDLS_SCAN_REJECT_MAX            5
62  #define TDLS_MAX_CONNECTED_PEERS_TO_ALLOW_SCAN   1
63  
64  #define tdls_debug(params...) \
65  	QDF_TRACE_DEBUG(QDF_MODULE_ID_TDLS, params)
66  #define tdls_debug_rl(params...) \
67  	QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_TDLS, params)
68  
69  #define tdls_notice(params...) \
70  	QDF_TRACE_INFO(QDF_MODULE_ID_TDLS, params)
71  #define tdls_warn(params...) \
72  	QDF_TRACE_WARN(QDF_MODULE_ID_TDLS, params)
73  #define tdls_err(params...) \
74  	QDF_TRACE_ERROR(QDF_MODULE_ID_TDLS, params)
75  #define tdls_alert(params...) \
76  	QDF_TRACE_FATAL(QDF_MODULE_ID_TDLS, params)
77  
78  #define tdls_nofl_debug(params...) \
79  	QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_TDLS, params)
80  #define tdls_nofl_notice(params...) \
81  	QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_TDLS, params)
82  #define tdls_nofl_warn(params...) \
83  	QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_TDLS, params)
84  #define tdls_nofl_err(params...) \
85  	QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_TDLS, params)
86  #define tdls_nofl_alert(params...) \
87  	QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_TDLS, params)
88  
89  #define TDLS_IS_LINK_CONNECTED(peer)  \
90  	((TDLS_LINK_CONNECTED == (peer)->link_status) || \
91  	 (TDLS_LINK_TEARING == (peer)->link_status))
92  
93  #define SET_BIT(value, mask) ((value) |= (1 << (mask)))
94  #define CLEAR_BIT(value, mask) ((value) &= ~(1 << (mask)))
95  #define CHECK_BIT(value, mask) ((value) & (1 << (mask)))
96  /**
97   * struct tdls_conn_info - TDLS connection record
98   * @session_id: session id
99   * @valid_entry: valid entry(set to true upon peer create resp from firmware)
100   * @peer_mac: peer address
101   * @index: index to store array offset.
102   */
103  struct tdls_conn_info {
104  	uint8_t session_id;
105  	bool valid_entry;
106  	uint8_t index;
107  	struct qdf_mac_addr peer_mac;
108  };
109  
110  /**
111   * enum tdls_nss_transition_state - TDLS NSS transition states
112   * @TDLS_NSS_TRANSITION_S_UNKNOWN: default state
113   * @TDLS_NSS_TRANSITION_S_2x2_to_1x1: transition from 2x2 to 1x1 stream
114   * @TDLS_NSS_TRANSITION_S_1x1_to_2x2: transition from 1x1 to 2x2 stream
115   */
116  enum tdls_nss_transition_state {
117  	TDLS_NSS_TRANSITION_S_UNKNOWN = 0,
118  	TDLS_NSS_TRANSITION_S_2x2_to_1x1,
119  	TDLS_NSS_TRANSITION_S_1x1_to_2x2,
120  };
121  
122  /**
123   * struct tdls_conn_tracker_mac_table - connection tracker peer table
124   * @mac_address: peer mac address
125   * @tx_packet_cnt: number of tx pkts
126   * @rx_packet_cnt: number of rx pkts
127   * @peer_timestamp_ms: time stamp of latest peer traffic
128   */
129  struct tdls_conn_tracker_mac_table {
130  	struct qdf_mac_addr mac_address;
131  	uint32_t tx_packet_cnt;
132  	uint32_t rx_packet_cnt;
133  	uint32_t peer_timestamp_ms;
134  };
135  
136  /**
137   * struct tdls_set_state_info - vdev id state info
138   * @vdev_id: vdev id of last set state command
139   */
140  struct tdls_set_state_info {
141  	uint8_t vdev_id;
142  };
143  
144  /**
145   * struct tdls_soc_priv_obj - tdls soc private context
146   * @soc: objmgr psoc
147   * @tdls_current_mode: current tdls mode
148   * @tdls_last_mode: last tdls mode
149   * @scan_reject_count: number of times scan rejected due to TDLS
150   * @tdls_source_bitmap: bit map to set/reset TDLS by different sources
151   * @tdls_conn_info: this tdls_conn_info can be removed and we can use peer type
152   *                of peer object to get the active tdls peers
153   * @tdls_configs: tdls user configure
154   * @max_num_tdls_sta: maximum TDLS station number allowed upon runtime condition
155   * @connected_peer_count: tdls peer connected count
156   * @tdls_off_channel: tdls off channel number
157   * @tdls_channel_offset: tdls channel offset
158   * @tdls_fw_off_chan_mode: tdls fw off channel mode
159   * @enable_tdls_connection_tracker: enable tdls connection tracker
160   * @tdls_external_peer_count: external tdls peer count
161   * @tdls_nss_switch_in_progress: tdls antenna switch in progress
162   * @tdls_nss_teardown_complete: tdls tear down complete
163   * @tdls_nss_transition_mode: tdls nss transition mode
164   * @tdls_teardown_peers_cnt: tdls tear down peer count
165   * @set_state_info: set tdls state info
166   * @tdls_rx_cb: TDLS RX callback
167   * @tdls_rx_cb_data: TDLS RX callback context
168   * @tdls_wmm_cb: TDLS WMM check callback
169   * @tdls_wmm_cb_data: TDLS WMM check callback context
170   * @tdls_event_cb: tdls event callback
171   * @tdls_evt_cb_data: tdls event user data
172   * @tdls_peer_context: userdata for register/deregister TDLS peer
173   * @tdls_reg_peer: register tdls peer with datapath
174   * @tdls_dp_vdev_update: notify datapath of vdev updates
175   * @tx_q_ack: queue for tx frames waiting for ack
176   * @tdls_con_cap: tdls concurrency support
177   * @tdls_send_mgmt_req: store eWNI_SME_TDLS_SEND_MGMT_REQ value
178   * @tdls_add_sta_req: store eWNI_SME_TDLS_ADD_STA_REQ value
179   * @tdls_del_sta_req: store eWNI_SME_TDLS_DEL_STA_REQ value
180   * @tdls_update_peer_state: store WMA_UPDATE_TDLS_PEER_STATE value
181   * @tdls_del_all_peers:store eWNI_SME_DEL_ALL_TDLS_PEERS
182   * @tdls_update_dp_vdev_flags: store CDP_UPDATE_TDLS_FLAGS
183   * @tdls_idle_peer_data: provide information about idle peer
184   * @tdls_ct_spinlock: connection tracker spin lock
185   * @is_prevent_suspend: prevent suspend or not
186   * @is_drv_supported: platform supports drv or not, enable/disable tdls wow
187   * based on this flag.
188   * @wake_lock: wake lock
189   * @runtime_lock: runtime lock
190   * @fw_tdls_mlo_capable: is fw tdls mlo capable
191   * @tdls_osif_init_cb: Callback to initialize the tdls private
192   * @tdls_osif_deinit_cb: Callback to deinitialize the tdls private
193   * @tdls_osif_update_cb: Callback for updating osif params
194   * @fw_tdls_11ax_capability: bool for tdls 11ax fw capability
195   * @fw_tdls_6g_capability: bool for tdls 6g fw capability
196   * @bss_sta_power: bss sta power
197   * @bss_sta_power_type: bss sta power type
198   * @timer_cnt: used for mlo tdls to monitor discovery response
199   * @fw_tdls_wideband_capability: bool for tdls wideband fw capability
200   * @is_user_tdls_enable: bool to check whether TDLS enable through userspace
201   */
202  struct tdls_soc_priv_obj {
203  	struct wlan_objmgr_psoc *soc;
204  	enum tdls_feature_mode tdls_current_mode;
205  	enum tdls_feature_mode tdls_last_mode;
206  	int scan_reject_count;
207  	unsigned long tdls_source_bitmap;
208  	struct tdls_conn_info tdls_conn_info[WLAN_TDLS_STA_MAX_NUM];
209  	struct tdls_user_config tdls_configs;
210  	uint16_t max_num_tdls_sta;
211  	uint16_t connected_peer_count;
212  	uint8_t tdls_off_channel;
213  	uint16_t tdls_channel_offset;
214  	int32_t tdls_fw_off_chan_mode;
215  	bool enable_tdls_connection_tracker;
216  	uint8_t tdls_external_peer_count;
217  	bool tdls_nss_switch_in_progress;
218  	bool tdls_nss_teardown_complete;
219  	enum tdls_nss_transition_state tdls_nss_transition_mode;
220  	int32_t tdls_teardown_peers_cnt;
221  	struct tdls_set_state_info set_state_info;
222  	tdls_rx_callback tdls_rx_cb;
223  	void *tdls_rx_cb_data;
224  	tdls_wmm_check tdls_wmm_cb;
225  	void *tdls_wmm_cb_data;
226  	tdls_evt_callback tdls_event_cb;
227  	void *tdls_evt_cb_data;
228  	void *tdls_peer_context;
229  	tdls_register_peer_callback tdls_reg_peer;
230  	tdls_dp_vdev_update_flags_callback tdls_dp_vdev_update;
231  	qdf_list_t tx_q_ack;
232  	enum tdls_conc_cap tdls_con_cap;
233  	uint16_t tdls_send_mgmt_req;
234  	uint16_t tdls_add_sta_req;
235  	uint16_t tdls_del_sta_req;
236  	uint16_t tdls_update_peer_state;
237  	uint16_t tdls_del_all_peers;
238  	uint32_t tdls_update_dp_vdev_flags;
239  	qdf_spinlock_t tdls_ct_spinlock;
240  #ifdef TDLS_WOW_ENABLED
241  	bool is_prevent_suspend;
242  	bool is_drv_supported;
243  	qdf_wake_lock_t wake_lock;
244  	qdf_runtime_lock_t runtime_lock;
245  #endif
246  #ifdef WLAN_FEATURE_11BE_MLO
247  	bool fw_tdls_mlo_capable;
248  #endif
249  	tdls_vdev_init_cb tdls_osif_init_cb;
250  	tdls_vdev_deinit_cb tdls_osif_deinit_cb;
251  	struct tdls_osif_cb tdls_osif_update_cb;
252  #ifdef WLAN_FEATURE_11AX
253  	bool fw_tdls_11ax_capability;
254  	bool fw_tdls_6g_capability;
255  	uint8_t bss_sta_power;
256  	uint8_t bss_sta_power_type;
257  #endif
258  	qdf_atomic_t timer_cnt;
259  	bool fw_tdls_wideband_capability;
260  	bool is_user_tdls_enable;
261  };
262  
263  /**
264   * struct tdls_vdev_priv_obj - tdls private vdev object
265   * @vdev: vdev objmgr object
266   * @peer_list: tdls peer list on this vdev
267   * @peer_update_timer: connection tracker timer
268   * @peer_discovery_timer: peer discovery timer
269   * @threshold_config: threshold config
270   * @discovery_peer_cnt: discovery peer count
271   * @discovery_sent_cnt: discovery sent count
272   * @curr_candidate: current candidate
273   * @ct_peer_table: linear mac address table for counting the packets
274   * @valid_mac_entries: number of valid mac entry in @ct_peer_mac_table
275   * @rx_mgmt: the pointer of rx mgmt info
276   * @link_score: select tdls vdev per the score
277   * @magic: magic
278   * @session_id: vdev ID
279   * @tx_queue: tx frame queue
280   * @tdls_teardown_comp: tdls teardown completion
281   */
282  struct tdls_vdev_priv_obj {
283  	struct wlan_objmgr_vdev *vdev;
284  	qdf_list_t peer_list[WLAN_TDLS_PEER_LIST_SIZE];
285  	qdf_mc_timer_t peer_update_timer;
286  	qdf_mc_timer_t peer_discovery_timer;
287  	struct tdls_config_params threshold_config;
288  	int32_t discovery_peer_cnt;
289  	uint32_t discovery_sent_cnt;
290  	struct tdls_peer *curr_candidate;
291  	struct tdls_conn_tracker_mac_table
292  			ct_peer_table[WLAN_TDLS_CT_TABLE_SIZE];
293  	uint8_t valid_mac_entries;
294  	struct tdls_rx_mgmt_frame *rx_mgmt;
295  	uint32_t link_score;
296  	uint32_t magic;
297  	uint8_t session_id;
298  	qdf_list_t tx_queue;
299  	qdf_event_t tdls_teardown_comp;
300  };
301  
302  /**
303   * struct tdls_peer_mlme_info - tdls peer mlme info
304   **/
305  struct tdls_peer_mlme_info {
306  };
307  
308  /**
309   * struct tdls_peer - tdls peer data
310   * @node: node
311   * @vdev_priv: tdls vdev priv obj
312   * @peer_mac: peer mac address
313   * @valid_entry: entry valid or not (set to true when peer create resp is
314   *               received from FW)
315   * @rssi: rssi
316   * @tdls_support: tdls support
317   * @link_status: tdls link status
318   * @is_responder: is responder
319   * @discovery_processed: discovery processed
320   * @discovery_attempt: discovery attempt
321   * @tx_pkt: tx packet
322   * @rx_pkt: rx packet
323   * @uapsd_queues: uapsd queues
324   * @max_sp: max sp
325   * @buf_sta_capable: is buffer sta
326   * @off_channel_capable: is offchannel supported flag
327   * @supported_channels_len: supported channels length
328   * @supported_chan_freq: supported channel frequency
329   * @supported_oper_classes_len: supported operation classes length
330   * @supported_oper_classes: supported operation classes
331   * @is_forced_peer: is forced peer
332   * @op_class_for_pref_off_chan: op class for preferred off channel
333   * @pref_off_chan_freq: preferred off channel frequency
334   * @pref_off_chan_width: preferred off channel width
335   * @peer_idle_timer: time to check idle traffic in tdls peers
336   * @is_peer_idle_timer_initialised: Flag to check idle timer init
337   * @spatial_streams: Number of TX/RX spatial streams for TDLS
338   * @reason: reason
339   * @state_change_notification: state change notification
340   * @qos: QOS capability of TDLS link
341   * @tdls_info: MLME info
342   */
343  struct tdls_peer {
344  	qdf_list_node_t node;
345  	struct tdls_vdev_priv_obj *vdev_priv;
346  	struct qdf_mac_addr peer_mac;
347  	bool valid_entry;
348  	int8_t rssi;
349  	enum tdls_peer_capab tdls_support;
350  	enum tdls_link_state link_status;
351  	uint8_t is_responder;
352  	uint8_t discovery_processed;
353  	uint16_t discovery_attempt;
354  	uint16_t tx_pkt;
355  	uint16_t rx_pkt;
356  	uint8_t uapsd_queues;
357  	uint8_t max_sp;
358  	uint8_t buf_sta_capable;
359  	uint8_t off_channel_capable;
360  	uint8_t supported_channels_len;
361  	qdf_freq_t supported_chan_freq[WLAN_MAC_MAX_SUPP_CHANNELS];
362  	uint8_t supported_oper_classes_len;
363  	uint8_t supported_oper_classes[WLAN_MAX_SUPP_OPER_CLASSES];
364  	bool is_forced_peer;
365  	uint8_t op_class_for_pref_off_chan;
366  	qdf_freq_t pref_off_chan_freq;
367  	uint8_t pref_off_chan_width;
368  	qdf_mc_timer_t peer_idle_timer;
369  	bool is_peer_idle_timer_initialised;
370  	uint8_t spatial_streams;
371  	enum tdls_link_state_reason reason;
372  	tdls_state_change_callback state_change_notification;
373  	uint8_t qos;
374  	struct tdls_peer_mlme_info *tdls_info;
375  };
376  
377  /**
378   * struct tdls_os_if_event - TDLS os event info
379   * @type: type of event
380   * @info: pointer to event information
381   */
382  struct tdls_os_if_event {
383  	uint32_t type;
384  	void *info;
385  };
386  
387  /**
388   * enum tdls_os_if_notification - TDLS notification from OS IF
389   * @TDLS_NOTIFY_STA_SESSION_INCREMENT: sta session count incremented
390   * @TDLS_NOTIFY_STA_SESSION_DECREMENT: sta session count decremented
391   */
392  enum tdls_os_if_notification {
393  	TDLS_NOTIFY_STA_SESSION_INCREMENT,
394  	TDLS_NOTIFY_STA_SESSION_DECREMENT
395  };
396  /**
397   * wlan_vdev_get_tdls_soc_obj - private API to get tdls soc object from vdev
398   * @vdev: vdev object
399   *
400   * Return: tdls soc object
401   */
402  static inline struct tdls_soc_priv_obj *
wlan_vdev_get_tdls_soc_obj(struct wlan_objmgr_vdev * vdev)403  wlan_vdev_get_tdls_soc_obj(struct wlan_objmgr_vdev *vdev)
404  {
405  	struct wlan_objmgr_psoc *psoc;
406  	struct tdls_soc_priv_obj *soc_obj;
407  
408  	if (!vdev) {
409  		tdls_err("NULL vdev");
410  		return NULL;
411  	}
412  
413  	psoc = wlan_vdev_get_psoc(vdev);
414  	if (!psoc) {
415  		tdls_err("can't get psoc");
416  		return NULL;
417  	}
418  
419  	soc_obj = (struct tdls_soc_priv_obj *)
420  		wlan_objmgr_psoc_get_comp_private_obj(psoc,
421  						      WLAN_UMAC_COMP_TDLS);
422  
423  	return soc_obj;
424  }
425  
426  /**
427   * wlan_psoc_get_tdls_soc_obj - private API to get tdls soc object from psoc
428   * @psoc: psoc object
429   *
430   * Return: tdls soc object
431   */
432  static inline struct tdls_soc_priv_obj *
wlan_psoc_get_tdls_soc_obj(struct wlan_objmgr_psoc * psoc)433  wlan_psoc_get_tdls_soc_obj(struct wlan_objmgr_psoc *psoc)
434  {
435  	struct tdls_soc_priv_obj *soc_obj;
436  	if (!psoc) {
437  		tdls_err("NULL psoc");
438  		return NULL;
439  	}
440  	soc_obj = (struct tdls_soc_priv_obj *)
441  		wlan_objmgr_psoc_get_comp_private_obj(psoc,
442  						      WLAN_UMAC_COMP_TDLS);
443  
444  	return soc_obj;
445  }
446  
447  /**
448   * wlan_vdev_get_tdls_vdev_obj - private API to get tdls vdev object from vdev
449   * @vdev: vdev object
450   *
451   * Return: tdls vdev object
452   */
453  static inline struct tdls_vdev_priv_obj *
wlan_vdev_get_tdls_vdev_obj(struct wlan_objmgr_vdev * vdev)454  wlan_vdev_get_tdls_vdev_obj(struct wlan_objmgr_vdev *vdev)
455  {
456  	struct tdls_vdev_priv_obj *vdev_obj;
457  
458  	if (!vdev) {
459  		tdls_err("NULL vdev");
460  		return NULL;
461  	}
462  
463  	vdev_obj = (struct tdls_vdev_priv_obj *)
464  		wlan_objmgr_vdev_get_comp_private_obj(vdev,
465  						      WLAN_UMAC_COMP_TDLS);
466  
467  	return vdev_obj;
468  }
469  
470  /**
471   * tdls_set_link_status - tdls set link status
472   * @vdev: vdev object
473   * @mac: mac address of tdls peer
474   * @link_state: tdls link state
475   * @link_reason: reason
476   *
477   * Return: None
478   */
479  void tdls_set_link_status(struct tdls_vdev_priv_obj *vdev,
480  			  const uint8_t *mac,
481  			  enum tdls_link_state link_state,
482  			  enum tdls_link_state_reason link_reason);
483  /**
484   * tdls_psoc_obj_create_notification() - tdls psoc create notification handler
485   * @psoc: psoc object
486   * @arg_list: Argument list
487   *
488   * Return: QDF_STATUS
489   */
490  QDF_STATUS tdls_psoc_obj_create_notification(struct wlan_objmgr_psoc *psoc,
491  					     void *arg_list);
492  
493  /**
494   * tdls_psoc_obj_destroy_notification() - tdls psoc destroy notification handler
495   * @psoc: psoc object
496   * @arg_list: Argument list
497   *
498   * Return: QDF_STATUS
499   */
500  QDF_STATUS tdls_psoc_obj_destroy_notification(struct wlan_objmgr_psoc *psoc,
501  					      void *arg_list);
502  
503  /**
504   * tdls_vdev_obj_create_notification() - tdls vdev create notification handler
505   * @vdev: vdev object
506   * @arg_list: Argument list
507   *
508   * Return: QDF_STATUS
509   */
510  QDF_STATUS tdls_vdev_obj_create_notification(struct wlan_objmgr_vdev *vdev,
511  					     void *arg_list);
512  
513  /**
514   * tdls_vdev_obj_destroy_notification() - tdls vdev destroy notification handler
515   * @vdev: vdev object
516   * @arg_list: Argument list
517   *
518   * Return: QDF_STATUS
519   */
520  QDF_STATUS tdls_vdev_obj_destroy_notification(struct wlan_objmgr_vdev *vdev,
521  					      void *arg_list);
522  
523  /**
524   * tdls_process_cmd() - tdls main command process function
525   * @msg: scheduler msg
526   *
527   * Return: QDF_STATUS
528   */
529  QDF_STATUS tdls_process_cmd(struct scheduler_msg *msg);
530  
531  /**
532   * tdls_process_evt() - tdls main event process function
533   * @msg: scheduler msg
534   *
535   * Return: QDF_STATUS
536   */
537  QDF_STATUS tdls_process_evt(struct scheduler_msg *msg);
538  
539  /**
540   * tdls_timer_restart() - restart TDLS timer
541   * @vdev: VDEV object manager
542   * @timer: timer to restart
543   * @expiration_time: new expiration time to set for the timer
544   *
545   * Return: Void
546   */
547  void tdls_timer_restart(struct wlan_objmgr_vdev *vdev,
548  				 qdf_mc_timer_t *timer,
549  				 uint32_t expiration_time);
550  
551  /**
552   * tdls_timers_stop() - stop all the tdls timers running
553   * @tdls_vdev: TDLS vdev
554   *
555   * Return: none
556   */
557  void tdls_timers_stop(struct tdls_vdev_priv_obj *tdls_vdev);
558  
559  /**
560   * tdls_get_vdev_objects() - Get TDLS private objects
561   * @vdev: VDEV object manager
562   * @tdls_vdev_obj: tdls vdev object
563   * @tdls_soc_obj: tdls soc object
564   *
565   * Return: QDF_STATUS
566   */
567  QDF_STATUS tdls_get_vdev_objects(struct wlan_objmgr_vdev *vdev,
568  				   struct tdls_vdev_priv_obj **tdls_vdev_obj,
569  				   struct tdls_soc_priv_obj **tdls_soc_obj);
570  
571  /**
572   * tdls_set_ct_mode() - Set the tdls connection tracker mode
573   * @psoc: objmgr psoc object
574   * @vdev: Pointer to vdev object
575   *
576   * This routine is called to set the tdls connection tracker operation status
577   *
578   * Return: NONE
579   */
580  void tdls_set_ct_mode(struct wlan_objmgr_psoc *psoc,
581  		      struct wlan_objmgr_vdev *vdev);
582  
583  /**
584   * tdls_set_user_tdls_enable()- Set the tdls enable from userspace
585   * @vdev: Pointer to vdev object
586   * @is_user_tdls_enable: true if tdls is enable from userspace
587   *
588   * return: NONE
589   */
590  void tdls_set_user_tdls_enable(struct wlan_objmgr_vdev *vdev,
591  			       bool is_user_tdls_enable);
592  /**
593   * tdls_set_operation_mode() - set tdls operating mode
594   * @tdls_set_mode: tdls mode set params
595   *
596   * Return: QDF_STATUS
597   */
598  QDF_STATUS tdls_set_operation_mode(struct tdls_set_mode_params *tdls_set_mode);
599  
600  /**
601   * tdls_notify_sta_connect() - Update tdls state for every
602   * connect event.
603   * @notify: sta connect params
604   *
605   * After every connect event in the system, check whether TDLS
606   * can be enabled in the system. If TDLS can be enabled, update the
607   * TDLS state as needed.
608   *
609   * Return: QDF_STATUS
610   */
611  QDF_STATUS tdls_notify_sta_connect(struct tdls_sta_notify_params *notify);
612  
613  /**
614   * tdls_process_enable_for_vdev() - Enable TDLS in firmware and activate the
615   * connection tracker
616   * @vdev: Pointer to vdev object
617   *
618   * Return: void
619   */
620  void tdls_process_enable_for_vdev(struct wlan_objmgr_vdev *vdev);
621  
622  #ifdef WLAN_FEATURE_11BE_MLO
623  /**
624   * tdls_process_enable_disable_for_ml_vdev() - Enable TDLS in firmware & active
625   * connection tracker for all the ML vdevs belonging to same MLD as the
626   * given vdev
627   * @vdev: Pointer to vdev object
628   * @is_enable: Flag to indicate if operation is enable TDLS or disable TDLS
629   *
630   * Return: None
631   */
632  void tdls_process_enable_disable_for_ml_vdev(struct wlan_objmgr_vdev *vdev,
633  					     bool is_enable);
634  #else
635  static inline
tdls_process_enable_disable_for_ml_vdev(struct wlan_objmgr_vdev * vdev,bool is_enable)636  void tdls_process_enable_disable_for_ml_vdev(struct wlan_objmgr_vdev *vdev,
637  					     bool is_enable)
638  {}
639  #endif
640  
641  /**
642   * tdls_notify_sta_disconnect() - Update tdls state for every
643   * disconnect event.
644   * @notify: sta disconnect params
645   *
646   * After every disconnect event in the system, check whether TDLS
647   * can be disabled/enabled in the system and update the
648   * TDLS state as needed.
649   *
650   * Return: QDF_STATUS
651   */
652  QDF_STATUS tdls_notify_sta_disconnect(struct tdls_sta_notify_params *notify);
653  
654  /**
655   * tdls_notify_reset_adapter() - notify reset adapter
656   * @vdev: vdev object
657   *
658   * Notify TDLS about the adapter reset
659   *
660   * Return: None
661   */
662  void tdls_notify_reset_adapter(struct wlan_objmgr_vdev *vdev);
663  
664  /**
665   * tdls_peers_deleted_notification() - peer delete notification
666   * @psoc: soc object
667   * @vdev_id: vdev id
668   *
669   * Legacy lim layer will delete tdls peers for roaming and heart beat failures
670   * and notify the component about the delete event to update the tdls.
671   * state.
672   *
673   * Return: QDF_STATUS
674   */
675  QDF_STATUS tdls_peers_deleted_notification(struct wlan_objmgr_psoc *psoc,
676  					   uint8_t vdev_id);
677  
678  /**
679   * tdls_notify_decrement_session() - Notify the session decrement
680   * @psoc: psoc  object manager
681   *
682   * Policy manager notify TDLS about session decrement
683   *
684   * Return: None
685   */
686  void tdls_notify_decrement_session(struct wlan_objmgr_psoc *psoc);
687  
688  /**
689   * tdls_send_update_to_fw - update tdls status info
690   * @tdls_vdev_obj: tdls vdev private object.
691   * @tdls_soc_obj: TDLS soc private object
692   * @tdls_prohibited: indicates whether tdls is prohibited.
693   * @tdls_chan_swit_prohibited: indicates whether tdls channel switch
694   *                             is prohibited.
695   * @sta_connect_event: indicate sta connect or disconnect event
696   * @session_id: session id
697   *
698   * Normally an AP does not influence TDLS connection between STAs
699   * associated to it. But AP may set bits for TDLS Prohibited or
700   * TDLS Channel Switch Prohibited in Extended Capability IE in
701   * Assoc/Re-assoc response to STA. So after STA is connected to
702   * an AP, call this function to update TDLS status as per those
703   * bits set in Ext Cap IE in received Assoc/Re-assoc response
704   * from AP.
705   *
706   * Return: void
707   */
708  void tdls_send_update_to_fw(struct tdls_vdev_priv_obj *tdls_vdev_obj,
709  			    struct tdls_soc_priv_obj *tdls_soc_obj,
710  			    bool tdls_prohibited,
711  			    bool tdls_chan_swit_prohibited,
712  			    bool sta_connect_event,
713  			    uint8_t session_id);
714  
715  /**
716   * tdls_notify_increment_session() - Notify the session increment
717   * @psoc: psoc  object manager
718   *
719   * Policy manager notify TDLS about session increment
720   *
721   * Return: None
722   */
723  void tdls_notify_increment_session(struct wlan_objmgr_psoc *psoc);
724  
725  /**
726   * tdls_get_6g_pwr_for_power_type() - get power for a 6g freq for particular
727   *                                    power type
728   * @vdev: vdev object
729   * @freq: 6g freq
730   * @pwr_typ: power type
731   *
732   * Function that gets power for a 6g freq for particular power type
733   *
734   * Return: true or false
735   */
736  uint32_t tdls_get_6g_pwr_for_power_type(struct wlan_objmgr_vdev *vdev,
737  					qdf_freq_t freq,
738  					enum supported_6g_pwr_types pwr_typ);
739  
740  /**
741   * tdls_is_6g_freq_allowed() - check is tdls 6ghz allowed or not
742   * @vdev: vdev object
743   * @freq: 6g freq
744   *
745   * Function determines the whether TDLS on 6ghz is allowed in the system
746   *
747   * Return: true or false
748   */
749  bool tdls_is_6g_freq_allowed(struct wlan_objmgr_vdev *vdev, qdf_freq_t freq);
750  
751  /**
752   * tdls_check_is_user_tdls_enable() - Check is tdls enabled or not
753   * @tdls_soc_obj: TDLS soc object
754   *
755   * Return: true or false
756   */
757  bool tdls_check_is_user_tdls_enable(struct tdls_soc_priv_obj *tdls_soc_obj);
758  
759  /**
760   * tdls_check_is_tdls_allowed() - check is tdls allowed or not
761   * @vdev: vdev object
762   *
763   * Function determines the whether TDLS allowed in the system
764   *
765   * Return: true or false
766   */
767  bool tdls_check_is_tdls_allowed(struct wlan_objmgr_vdev *vdev);
768  
769  /**
770   * tdls_get_vdev() - Get tdls specific vdev object manager
771   * @psoc: wlan psoc object manager
772   * @dbg_id: debug id
773   *
774   * If TDLS possible, return the corresponding vdev
775   * to enable TDLS in the system.
776   *
777   * Return: vdev manager pointer or NULL.
778   */
779  struct wlan_objmgr_vdev *tdls_get_vdev(struct wlan_objmgr_psoc *psoc,
780  					  wlan_objmgr_ref_dbgid dbg_id);
781  
782  /**
783   * tdls_process_policy_mgr_notification() - process policy manager notification
784   * @psoc: soc object manager
785   *
786   * Return: QDF_STATUS
787   */
788  QDF_STATUS
789  tdls_process_policy_mgr_notification(struct wlan_objmgr_psoc *psoc);
790  
791  /**
792   * tdls_process_decrement_active_session() - process policy manager decrement
793   * sessions.
794   * @psoc: soc object manager
795   *
796   * Return: QDF_STATUS
797   */
798  QDF_STATUS
799  tdls_process_decrement_active_session(struct wlan_objmgr_psoc *psoc);
800  
801  /**
802   * wlan_tdls_get_mlo_vdev() - get mlo vdev for tdls
803   * @vdev: vdev object
804   * @index: index of vdev in mlo list
805   * @dbg_id: debug id
806   *
807   * Return: vdev pointer
808   */
809  struct wlan_objmgr_vdev *wlan_tdls_get_mlo_vdev(struct wlan_objmgr_vdev *vdev,
810  						uint8_t index,
811  						wlan_objmgr_ref_dbgid dbg_id);
812  
813  /**
814   * wlan_tdls_release_mlo_vdev() - release mlo vdev for tdls
815   * @vdev: vdev object
816   * @dbg_id: debug id
817   *
818   * Return: void
819   */
820  void wlan_tdls_release_mlo_vdev(struct wlan_objmgr_vdev *vdev,
821  				wlan_objmgr_ref_dbgid dbg_id);
822  
823  /**
824   * tdls_scan_complete_event_handler() - scan complete event handler for tdls
825   * @vdev: vdev object
826   * @event: scan event
827   * @arg: tdls soc object
828   *
829   * Return: None
830   */
831  void tdls_scan_complete_event_handler(struct wlan_objmgr_vdev *vdev,
832  			struct scan_event *event,
833  			void *arg);
834  
835  /**
836   * tdls_set_link_unforce() - set link unforce
837   * @vdev: vdev object
838   *
839   * Return: void
840   */
841  void tdls_set_link_unforce(struct wlan_objmgr_vdev *vdev);
842  
843  /**
844   * tdls_scan_callback() - callback for TDLS scan operation
845   * @tdls_soc: tdls soc pvt object
846   *
847   * Return: QDF_STATUS
848   */
849  QDF_STATUS tdls_scan_callback(struct tdls_soc_priv_obj *tdls_soc);
850  
851  /**
852   * tdls_scan_done_callback() - callback for tdls scan done event
853   * @tdls_soc: tdls soc object
854   *
855   * Return: Void
856   */
857  void tdls_scan_done_callback(struct tdls_soc_priv_obj *tdls_soc);
858  
859  /**
860   * tdls_scan_serialization_comp_info_cb() - callback for scan start
861   * @vdev: VDEV on which the scan command is being processed
862   * @comp_info: serialize rules info
863   * @cmd: the serialization command
864   *
865   * Return: Void
866   */
867  void tdls_scan_serialization_comp_info_cb(struct wlan_objmgr_vdev *vdev,
868  		union wlan_serialization_rules_info *comp_info,
869  		struct wlan_serialization_command *cmd);
870  /**
871   * tdls_check_and_indicate_delete_all_peers() - Check if delete all peers is
872   * allowed for the vdev based on current concurrency.
873   * @psoc: soc object
874   * @vdev_id: vdev id
875   *
876   * Notify tdls component to cleanup all peers based on current concurrency
877   * combination.
878   *
879   * Return: QDF_STATUS
880   */
881  QDF_STATUS
882  tdls_check_and_indicate_delete_all_peers(struct wlan_objmgr_psoc *psoc,
883  					 uint8_t vdev_id);
884  
885  /**
886   * tdls_get_opclass_from_bandwidth() - Return opclass for corresponding BW and
887   * channel.
888   * @vdev: Pointer to vdev
889   * @freq: Channel frequency.
890   * @bw_offset: Bandwidth offset.
891   * @reg_bw_offset: enum offset_t type bandwidth
892   *
893   * To return the opclas.
894   *
895   * Return: opclass
896   */
897  uint8_t tdls_get_opclass_from_bandwidth(struct wlan_objmgr_vdev *vdev,
898  					qdf_freq_t freq, uint8_t bw_offset,
899  					uint8_t *reg_bw_offset);
900  
901  #ifdef WLAN_FEATURE_TDLS_CONCURRENCIES
902  /**
903   * tdls_handle_start_bss() - Handle start BSS event to act on concurrent
904   * session offchannel mode
905   * @psoc: Pointer to PSOC object
906   *
907   * Return: None
908   */
909  QDF_STATUS tdls_handle_start_bss(struct wlan_objmgr_psoc *psoc);
910  
911  /**
912   * tdls_is_concurrency_allowed() - Is TDLS allowed with the current concurrency
913   * @psoc: Pointer to PSOC
914   *
915   * Return: True or False
916   */
917  bool tdls_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc);
918  #else
919  static inline
tdls_handle_start_bss(struct wlan_objmgr_psoc * psoc)920  QDF_STATUS tdls_handle_start_bss(struct wlan_objmgr_psoc *psoc)
921  {
922  	return QDF_STATUS_SUCCESS;
923  }
924  
925  static inline bool
tdls_is_concurrency_allowed(struct wlan_objmgr_psoc * psoc)926  tdls_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc)
927  {
928  	return false;
929  }
930  
931  #endif /* WLAN_FEATURE_TDLS_CONCURRENCIES */
932  #endif
933