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