1  /*
2   * Copyright (c) 2011-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  #if !defined(__SMEINTERNAL_H)
21  #define __SMEINTERNAL_H
22  
23  /**
24   * \file  sme_internal.h
25   *
26   * \brief prototype for SME internal structures and APIs used for SME and MAC
27   */
28  
29  /*--------------------------------------------------------------------------
30    Include Files
31    ------------------------------------------------------------------------*/
32  #include "qdf_status.h"
33  #include "qdf_lock.h"
34  #include "qdf_trace.h"
35  #include "qdf_mem.h"
36  #include "qdf_types.h"
37  #include "host_diag_core_event.h"
38  #include "csr_link_list.h"
39  #include "sme_power_save.h"
40  #include "wmi_unified.h"
41  #include "wmi_unified_param.h"
42  
43  struct wma_twt_add_dialog_complete_event;
44  struct wmi_twt_add_dialog_complete_event_param;
45  struct wmi_twt_enable_complete_event_param;
46  /*--------------------------------------------------------------------------
47    Type declarations
48    ------------------------------------------------------------------------*/
49  
50  /* Mask can be only have one bit set */
51  typedef enum eSmeCommandType {
52  	eSmeNoCommand = 0,
53  	/* this is not a command, it is to identify this is a CSR command */
54  	eSmeCsrCommandMask = 0x10000,
55  	eSmeCommandRoam,
56  	eSmeCommandWmStatusChange,
57  	/* QOS */
58  	eSmeQosCommandMask = 0x40000,   /* To identify Qos commands */
59  	eSmeCommandAddTs,
60  	eSmeCommandDelTs,
61  	e_sme_command_set_hw_mode,
62  	e_sme_command_nss_update,
63  	e_sme_command_set_dual_mac_config,
64  	e_sme_command_set_antenna_mode,
65  	e_sme_command_sap_ch_width_update,
66  } eSmeCommandType;
67  
68  typedef enum eSmeState {
69  	SME_STATE_STOP,
70  	SME_STATE_START,
71  	SME_STATE_READY,
72  } eSmeState;
73  
74  #define SME_IS_START(mac)  (SME_STATE_STOP != (mac)->sme.state)
75  #define SME_IS_READY(mac)  (SME_STATE_READY == (mac)->sme.state)
76  
77  /**
78   * struct stats_ext_event - stats_ext_event payload
79   * @vdev_id: ID of the vdev for the stats
80   * @event_data_len: length of the @event_data
81   * @event_data: actual ext stats
82   */
83  struct stats_ext_event {
84  	uint32_t vdev_id;
85  	uint32_t event_data_len;
86  	uint8_t event_data[];
87  };
88  
89  /**
90   * typedef stats_ext_cb - stats ext callback
91   * @hdd_handle: Opaque handle to the HDD context
92   * @data: stats ext payload from firmware
93   */
94  typedef void (*stats_ext_cb)(hdd_handle_t hdd_handle,
95  			     struct stats_ext_event *data);
96  
97  /**
98   * typedef stats_ext2_cb - stats ext2 callback
99   * @hdd_handle: Opaque handle to the HDD context
100   * @data: stats ext2 payload from firmware
101   */
102  typedef void (*stats_ext2_cb)(hdd_handle_t hdd_handle,
103  			      struct sir_sme_rx_aggr_hole_ind *data);
104  
105  #define MAX_ACTIVE_CMD_STATS    16
106  
107  typedef struct sActiveCmdStats {
108  	eSmeCommandType command;
109  	uint32_t reason;
110  	uint32_t sessionId;
111  	uint64_t timestamp;
112  } tActiveCmdStats;
113  
114  typedef struct sSelfRecoveryStats {
115  	tActiveCmdStats activeCmdStats[MAX_ACTIVE_CMD_STATS];
116  	uint8_t cmdStatsIndx;
117  } tSelfRecoveryStats;
118  
119  typedef void (*link_layer_stats_cb)(hdd_handle_t hdd_handle,
120  				    int indication_type,
121  				    tSirLLStatsResults *results,
122  				    void *cookie);
123  
124  typedef void (*ext_scan_ind_cb)(hdd_handle_t hdd_handle,
125  				const uint16_t, void *);
126  
127  /**
128   * typedef sme_link_speed_cb - sme_get_link_speed() callback function
129   * @info: link speed information
130   * @context: user context supplied to sme_get_link_speed()
131   *
132   * This is the signature of a callback function whose addresses is
133   * passed as the asynchronous callback function to sme_get_link_speed().
134   */
135  
136  typedef void (*sme_link_speed_cb)(struct link_speed_info *info,
137  				  void *context);
138  
139  typedef void (*ocb_callback)(void *context, void *response);
140  typedef void (*sme_set_thermal_level_callback)(hdd_handle_t hdd_handle,
141  					       u_int8_t level);
142  typedef void (*p2p_lo_callback)(void *context,
143  				struct sir_p2p_lo_event *event);
144  #ifdef FEATURE_OEM_DATA_SUPPORT
145  typedef void (*sme_send_oem_data_rsp_msg)(struct oem_data_rsp *);
146  #endif
147  
148  #ifdef WLAN_SUPPORT_TWT
149  /**
150   * typedef twt_enable_cb - TWT enable callback signature.
151   * @hdd_handle: Opaque HDD handle
152   * @params: TWT enable complete event parameters.
153   */
154  typedef
155  void (*twt_enable_cb)(hdd_handle_t hdd_handle,
156  		      struct wmi_twt_enable_complete_event_param *params);
157  
158  /**
159   * typedef twt_disable_cb - TWT enable callback signature.
160   * @hdd_handle: Opaque HDD handle
161   */
162  typedef void (*twt_disable_cb)(hdd_handle_t hdd_handle);
163  
164  /**
165   * typedef twt_add_dialog_cb - TWT add dialog callback signature.
166   * @psoc: Pointer to global psoc
167   * @add_dialog_evt: pointer to event buf containing twt response parameters
168   * @renego_fail: Flag to indicate if its re-negotiation failure case
169   */
170  typedef
171  void (*twt_add_dialog_cb)(struct wlan_objmgr_psoc *psoc,
172  			  struct wma_twt_add_dialog_complete_event *add_dialog_evt,
173  			  bool renego_fail);
174  
175  /**
176   * typedef twt_del_dialog_cb - TWT delete dialog callback signature.
177   * @psoc: Pointer to global psoc
178   * @params: TWT delete dialog complete event parameters.
179   */
180  typedef void (*twt_del_dialog_cb)(
181  	struct wlan_objmgr_psoc *psoc,
182  	struct wmi_twt_del_dialog_complete_event_param *params);
183  
184  /**
185   * typedef twt_pause_dialog_cb - TWT pause dialog callback signature.
186   * @psoc: Pointer to global psoc
187   * @params: TWT pause dialog complete event parameters.
188   */
189  typedef
190  void (*twt_pause_dialog_cb)(struct wlan_objmgr_psoc *psoc,
191  			    struct wmi_twt_pause_dialog_complete_event_param *params);
192  
193  /**
194   * typedef twt_nudge_dialog_cb - TWT nudge dialog callback signature.
195   * @psoc: Pointer to global psoc
196   * @params: TWT nudge dialog complete event parameters.
197   */
198  typedef
199  void (*twt_nudge_dialog_cb)(struct wlan_objmgr_psoc *psoc,
200  		      struct wmi_twt_nudge_dialog_complete_event_param *params);
201  
202  /**
203   * typedef twt_resume_dialog_cb - TWT resume dialog callback signature.
204   * @psoc: Pointer to global psoc
205   * @params: TWT resume dialog complete event parameters.
206   */
207  typedef
208  void (*twt_resume_dialog_cb)(struct wlan_objmgr_psoc *psoc,
209  			     struct wmi_twt_resume_dialog_complete_event_param *params);
210  
211  /**
212   * typedef twt_notify_cb - TWT notify callback signature.
213   * @psoc: Pointer to global psoc
214   * @params: TWT twt notify event parameters.
215   */
216  typedef
217  void (*twt_notify_cb)(struct wlan_objmgr_psoc *psoc,
218  		      struct wmi_twt_notify_event_param *params);
219  
220  /**
221   * typedef twt_ack_comp_cb - TWT ack callback signature.
222   * @params: TWT ack complete event parameters.
223   * @context: TWT context
224   */
225  typedef
226  void (*twt_ack_comp_cb)(struct wmi_twt_ack_complete_event_param *params,
227  			void *context);
228  
229  /**
230   * struct twt_callbacks - TWT response callback pointers
231   * @twt_enable_cb: TWT enable completion callback
232   * @twt_disable_cb: TWT disable completion callback
233   * @twt_add_dialog_cb: TWT add dialog completion callback
234   * @twt_del_dialog_cb: TWT delete dialog completion callback
235   * @twt_pause_dialog_cb: TWT pause dialog completion callback
236   * @twt_resume_dialog_cb: TWT resume dialog completion callback
237   * @twt_notify_cb: TWT notify event callback
238   * @twt_nudge_dialog_cb: TWT nudge dialog completion callback
239   * @twt_ack_comp_cb: TWT ack completion callback
240   */
241  struct twt_callbacks {
242  	void (*twt_enable_cb)(hdd_handle_t hdd_handle,
243  			      struct wmi_twt_enable_complete_event_param *params);
244  	void (*twt_disable_cb)(hdd_handle_t hdd_handle);
245  	void (*twt_add_dialog_cb)(struct wlan_objmgr_psoc *psoc,
246  				  struct wma_twt_add_dialog_complete_event *add_dialog_event,
247  				  bool renego);
248  	void (*twt_del_dialog_cb)(struct wlan_objmgr_psoc *psoc,
249  				  struct wmi_twt_del_dialog_complete_event_param *params);
250  	void (*twt_pause_dialog_cb)(struct wlan_objmgr_psoc *psoc,
251  				    struct wmi_twt_pause_dialog_complete_event_param *params);
252  	void (*twt_resume_dialog_cb)(struct wlan_objmgr_psoc *psoc,
253  				     struct wmi_twt_resume_dialog_complete_event_param *params);
254  	void (*twt_notify_cb)(struct wlan_objmgr_psoc *psoc,
255  			      struct wmi_twt_notify_event_param *params);
256  	void (*twt_nudge_dialog_cb)(struct wlan_objmgr_psoc *psoc,
257  		    struct wmi_twt_nudge_dialog_complete_event_param *params);
258  	void (*twt_ack_comp_cb)(struct wmi_twt_ack_complete_event_param *params,
259  				void *context);
260  };
261  #endif
262  
263  #ifdef FEATURE_WLAN_APF
264  /**
265   * typedef apf_get_offload_cb - APF offload callback signature
266   * @context: Opaque context that the client can use to associate the
267   *    callback with the request
268   * @caps: APF offload capabilities as reported by firmware
269   */
270  struct sir_apf_get_offload;
271  typedef void (*apf_get_offload_cb)(void *context,
272  				   struct sir_apf_get_offload *caps);
273  
274  /**
275   * typedef apf_read_mem_cb - APF read memory response callback
276   * @context: Opaque context that the client can use to associate the
277   *    callback with the request
278   * @evt: APF read memory response event parameters
279   */
280  typedef void (*apf_read_mem_cb)(void *context,
281  				struct wmi_apf_read_memory_resp_event_params
282  									  *evt);
283  #endif /* FEATURE_WLAN_APF */
284  
285  /**
286   * typedef rssi_threshold_breached_cb - RSSI threshold breach callback
287   * @hdd_handle: Opaque handle to the HDD context
288   * @event: The RSSI breach event
289   */
290  typedef void (*rssi_threshold_breached_cb)(hdd_handle_t hdd_handle,
291  					   struct rssi_breach_event *event);
292  
293  /**
294   * typedef get_chain_rssi_callback - get chain rssi callback
295   * @context: Opaque context that the client can use to associate the
296   *    callback with the request
297   * @data: chain rssi result reported by firmware
298   */
299  struct chain_rssi_result;
300  typedef void (*get_chain_rssi_callback)(void *context,
301  					struct chain_rssi_result *data);
302  
303  #ifdef FEATURE_FW_STATE
304  /**
305   * typedef fw_state_callback - get firmware state callback
306   * @context: Opaque context that the client can use to associate the
307   *    callback with the request
308   */
309  typedef void (*fw_state_callback)(void *context);
310  #endif /* FEATURE_FW_STATE */
311  
312  typedef void (*tx_queue_cb)(hdd_handle_t hdd_handle, uint32_t vdev_id,
313  			    enum netif_action_type action,
314  			    enum netif_reason_type reason);
315  
316  /**
317   * typedef pwr_save_fail_cb - power save fail callback function
318   * @hdd_handle: HDD handle registered with SME
319   * @params: failure parameters
320   */
321  struct chip_pwr_save_fail_detected_params;
322  typedef void (*pwr_save_fail_cb)(hdd_handle_t hdd_handle,
323  			struct chip_pwr_save_fail_detected_params *params);
324  
325  /**
326   * typedef bt_activity_info_cb - bluetooth activity callback function
327   * @hdd_handle: HDD handle registered with SME
328   * @bt_activity: bluetooth activity information
329   */
330  typedef void (*bt_activity_info_cb)(hdd_handle_t hdd_handle,
331  				    uint32_t bt_activity);
332  
333  /**
334   * typedef rso_cmd_status_cb - RSO command status  callback function
335   * @hdd_handle: HDD handle registered with SME
336   * @rso_status: Status of the operation
337   */
338  typedef void (*rso_cmd_status_cb)(hdd_handle_t hdd_handle,
339  				  struct rso_cmd_status *rso_status);
340  
341  /**
342   * typedef lost_link_info_cb - lost link indication callback function
343   * @hdd_handle: HDD handle registered with SME
344   * @lost_link_info: Information about the lost link
345   */
346  typedef void (*lost_link_info_cb)(hdd_handle_t hdd_handle,
347  				  struct sir_lost_link_info *lost_link_info);
348  /**
349   * typedef hidden_ssid_cb - hidden ssid rsp callback fun
350   * @hdd_handle: HDD handle registered with SME
351   * @vdev_id: Vdev Id
352   */
353  typedef void (*hidden_ssid_cb)(hdd_handle_t hdd_handle,
354  				uint8_t vdev_id);
355  
356  /**
357   * typedef bcn_report_cb - recv bcn callback fun
358   * @hdd_handle: HDD handle registered with SME
359   * @beacon_report: Beacon report structure
360   */
361  typedef QDF_STATUS (*beacon_report_cb)
362  	(hdd_handle_t hdd_handle, struct wlan_beacon_report *beacon_report);
363  
364  /**
365   * beacon_pause_cb : scan start callback fun
366   * @hdd_handler: HDD handler
367   * @vdev_id: vdev id
368   * @type: scan event type
369   * @is_disconnected: Driver is in dis connected state or not
370   */
371  typedef void (*beacon_pause_cb)(hdd_handle_t hdd_handle,
372  				uint8_t vdev_id,
373  				enum scan_event_type type,
374  				bool is_disconnected);
375  
376  /**
377   * typedef sme_get_isolation_cb - get isolation callback fun
378   * @param: isolation result reported by firmware
379   * @pcontext: Opaque context that the client can use to associate the
380   *    callback with the request
381   */
382  typedef void (*sme_get_isolation_cb)(struct sir_isolation_resp *param,
383  				     void *pcontext);
384  
385  #ifdef WLAN_FEATURE_MOTION_DETECTION
386  typedef QDF_STATUS (*md_host_evt_cb)(void *hdd_ctx, struct sir_md_evt *event);
387  typedef QDF_STATUS (*md_bl_evt_cb)(void *hdd_ctx, struct sir_md_bl_evt *event);
388  #endif /* WLAN_FEATURE_MOTION_DETECTION */
389  
390  struct sme_context {
391  	eSmeState state;
392  	qdf_mutex_t sme_global_lock;
393  	uint32_t sme_cmd_count;
394  	/* following pointer contains array of pointers for tSmeCmd* */
395  	void **sme_cmd_buf_addr;
396  	tDblLinkList sme_cmd_freelist;    /* preallocated roam cmd list */
397  	void *ll_stats_context;
398  	link_layer_stats_cb link_layer_stats_cb;
399  	void (*link_layer_stats_ext_cb)(hdd_handle_t callback_ctx,
400  					tSirLLStatsResults *rsp);
401  #ifdef WLAN_POWER_DEBUG
402  	void *power_debug_stats_context;
403  	void (*power_stats_resp_callback)(struct power_stats_response *rsp,
404  						void *callback_context);
405  	void (*sme_power_debug_stats_callback)(
406  					struct mac_context *mac,
407  					struct power_stats_response *response);
408  #endif
409  #ifdef WLAN_FEATURE_BEACON_RECEPTION_STATS
410  	void *beacon_stats_context;
411  	void (*beacon_stats_resp_callback)(struct bcn_reception_stats_rsp *rsp,
412  					   void *callback_context);
413  #endif
414  #ifdef FEATURE_WLAN_AUTO_SHUTDOWN
415  	void (*auto_shutdown_cb)(void);
416  #endif
417  	/* Maximum interfaces allowed by the host */
418  	uint8_t max_intf_count;
419  	stats_ext_cb stats_ext_cb;
420  	stats_ext2_cb stats_ext2_cb;
421  	/* linkspeed callback */
422  	sme_link_speed_cb link_speed_cb;
423  	void *link_speed_context;
424  
425  	sme_get_isolation_cb get_isolation_cb;
426  	void *get_isolation_cb_context;
427  #ifdef FEATURE_WLAN_EXTSCAN
428  	ext_scan_ind_cb ext_scan_ind_cb;
429  #endif /* FEATURE_WLAN_EXTSCAN */
430  	csr_link_status_callback link_status_callback;
431  	void *link_status_context;
432  	int (*get_tsf_cb)(void *pcb_cxt, struct stsf *ptsf);
433  	void *get_tsf_cxt;
434  	/* get temperature event context and callback */
435  	void *temperature_cb_context;
436  	void (*temperature_cb)(int temperature, void *context);
437  	uint8_t miracast_value;
438  	struct ps_global_info  ps_global_info;
439  	rssi_threshold_breached_cb rssi_threshold_breached_cb;
440  	sme_set_thermal_level_callback set_thermal_level_cb;
441  	void *apf_get_offload_context;
442  #ifdef FEATURE_P2P_LISTEN_OFFLOAD
443  	p2p_lo_callback p2p_lo_event_callback;
444  	void *p2p_lo_event_context;
445  #endif
446  #ifdef FEATURE_OEM_DATA_SUPPORT
447  	sme_send_oem_data_rsp_msg oem_data_rsp_callback;
448  #endif
449  	lost_link_info_cb lost_link_info_cb;
450  
451  	bool (*set_connection_info_cb)(bool);
452  	bool (*get_connection_info_cb)(uint8_t *session_id,
453  			enum scan_reject_states *reason);
454  	rso_cmd_status_cb rso_cmd_status_cb;
455  	pwr_save_fail_cb chip_power_save_fail_cb;
456  	bt_activity_info_cb bt_activity_info_cb;
457  	void *get_arp_stats_context;
458  	void (*get_arp_stats_cb)(void *, struct rsp_stats *, void *);
459  	get_chain_rssi_callback get_chain_rssi_cb;
460  	void *get_chain_rssi_context;
461  #ifdef FEATURE_FW_STATE
462  	fw_state_callback fw_state_cb;
463  	void *fw_state_context;
464  #endif /* FEATURE_FW_STATE */
465  	tx_queue_cb tx_queue_cb;
466  #ifdef WLAN_SUPPORT_TWT
467  	twt_enable_cb twt_enable_cb;
468  	twt_disable_cb twt_disable_cb;
469  	twt_add_dialog_cb twt_add_dialog_cb;
470  	twt_del_dialog_cb twt_del_dialog_cb;
471  	twt_pause_dialog_cb twt_pause_dialog_cb;
472  	twt_nudge_dialog_cb twt_nudge_dialog_cb;
473  	twt_resume_dialog_cb twt_resume_dialog_cb;
474  	twt_notify_cb twt_notify_cb;
475  	twt_ack_comp_cb twt_ack_comp_cb;
476  	void *twt_ack_context_cb;
477  #endif
478  #ifdef FEATURE_WLAN_APF
479  	apf_get_offload_cb apf_get_offload_cb;
480  	apf_read_mem_cb apf_read_mem_cb;
481  #endif
482  #ifdef WLAN_FEATURE_MOTION_DETECTION
483  	md_host_evt_cb md_host_evt_cb;
484  	md_bl_evt_cb md_bl_evt_cb;
485  	void *md_ctx;
486  #endif /* WLAN_FEATURE_MOTION_DETECTION */
487  	/* hidden ssid rsp callback */
488  	hidden_ssid_cb hidden_ssid_cb;
489  #ifdef WLAN_MWS_INFO_DEBUGFS
490  	void *mws_coex_info_ctx;
491  	void (*mws_coex_info_state_resp_callback)(void *coex_info_data,
492  						  void *context,
493  						  wmi_mws_coex_cmd_id cmd_id);
494  #endif /* WLAN_MWS_INFO_DEBUGFS */
495  
496  #ifdef WLAN_BCN_RECV_FEATURE
497  	beacon_report_cb beacon_report_cb;
498  	beacon_pause_cb beacon_pause_cb;
499  #endif
500  #ifdef FEATURE_OEM_DATA
501  	void (*oem_data_event_handler_cb)
502  			(const struct oem_data *oem_event_data,
503  			 uint8_t vdev_id);
504  	uint8_t oem_data_vdev_id;
505  	/* async oem event callback */
506  	void (*oem_data_async_event_handler_cb)
507  			(const struct oem_data *oem_event_data);
508  #endif
509  
510  	QDF_STATUS (*pagefault_action_cb)(void *buf, uint32_t data);
511  
512  #ifdef MULTI_CLIENT_LL_SUPPORT
513  	void (*latency_level_event_handler_cb)
514  			(const struct latency_level_data *event_data,
515  			 uint8_t vdev_id);
516  #endif
517  
518  	sme_get_raom_scan_ch_callback roam_scan_ch_callback;
519  	void *roam_scan_ch_get_context;
520  #ifdef FEATURE_MONITOR_MODE_SUPPORT
521  	void (*monitor_mode_cb)(uint8_t vdev_id);
522  #endif
523  #if defined(CLD_PM_QOS) && defined(WLAN_FEATURE_LL_MODE)
524  	void (*beacon_latency_event_cb)(uint32_t latency_level);
525  #endif
526  	QDF_STATUS (*sme_vdev_del_cb)(mac_handle_t mac_handle,
527  				      struct wlan_objmgr_vdev *vdev);
528  };
529  
530  #endif /* #if !defined( __SMEINTERNAL_H ) */
531