xref: /wlan-dirver/qca-wifi-host-cmn/qdf/inc/qdf_hang_event_notifier.h (revision 6d768494e5ce14eb1603a695c86739d12ecc6ec2)
1 /*
2  * Copyright (c) 2020, The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17  /**
18   * DOC: qdf_hang_event_notifier
19   * This file provides OS dependent QDF notifier call for hang event
20   */
21 
22 #ifndef QDF_HANG_EVENT_NOTIFIER_H
23 #define QDF_HANG_EVENT_NOTIFIER_H
24 
25 #include <qdf_notifier.h>
26 
27 #define QDF_HANG_EVENT_VERSION "1.0"
28 /* Max hang event buffer size */
29 #define QDF_HANG_EVENT_DATA_SIZE 784
30 /* Max offset which host can write */
31 #define QDF_WLAN_MAX_HOST_OFFSET 390
32 /* Start of the Firmware Data offset */
33 #define QDF_WLAN_HANG_FW_OFFSET 392
34 
35 /**
36  * hang_event_tag: Hang event tag for various modules
37  * @HANG_EVT_TAG_CDS: CDS module hang event tag
38  * @HANG_EVT_TAG_OS_IF: OS interface module hang event tag
39  * @HANG_EVT_TAG_OS_IF_SCAN: scan module hang event tag
40  * @HANG_EVT_TAG_LEGACY_MAC: Legacy mac module hang event tag
41  * @HANG_EVT_TAG_WMI_EVT_HIST: WMI event history hang event tag
42  * @HANG_EVT_TAG_WMI_CMD_HIST: WMI command history hang event tag
43  * @HANG_EVT_TAG_WMI_CMD_HIST: HTC event tag wmi command history hang event tag
44  * @HANG_EVT_TAG_DP_PEER_INFO: DP peer info hang event tag
45  * @HANG_EVT_TAG_CE_INFO: Copy Engine hang event tag
46  */
47 enum hang_event_tag {
48 	HANG_EVT_TAG_CDS,
49 	HANG_EVT_TAG_OS_IF,
50 	HANG_EVT_TAG_OS_IF_SCAN,
51 	HANG_EVT_TAG_LEGACY_MAC,
52 	HANG_EVT_TAG_WMI_EVT_HIST,
53 	HANG_EVT_TAG_WMI_CMD_HIST,
54 	HANG_EVT_TAG_HTC_CREDIT_HIST,
55 	HANG_EVT_TAG_DP_PEER_INFO,
56 	HANG_EVT_TAG_CE_INFO
57 };
58 
59 #define QDF_HANG_EVENT_TLV_HDR_SIZE   (sizeof(uint32_t))
60 
61 #define QDF_HANG_EVT_SET_HDR(tlv_buf, tag, len) \
62 	(((uint32_t *)(tlv_buf))[0]) = (((tag) << 16) | ((len) & 0x0000FFFF))
63 
64 #define QDF_HANG_GET_STRUCT_TLVLEN(tlv_struct) \
65 	((uint32_t)(sizeof(tlv_struct) - QDF_HANG_EVENT_TLV_HDR_SIZE))
66 
67 /**
68  * qdf_notifier_data - Private data for notifier data
69  * @hang_data: Data filled by notifier
70  * @offset: Current offset of the hang data buffer
71  */
72 struct qdf_notifer_data {
73 	uint8_t *hang_data;
74 	unsigned int offset;
75 };
76 
77 #ifdef WLAN_HANG_EVENT
78 /**
79  * qdf_hang_event_register_notifier() - Hang data notifier register
80  * @nb: Notifier block
81  *
82  * This function registers notifier block for the hang data notifier chain
83  * the registered function will be invoked when the hang data notifier call
84  * is invoked.
85  *
86  * Return: QDF_STATUS
87  */
88 QDF_STATUS qdf_hang_event_register_notifier(qdf_notif_block *nb);
89 
90 /**
91  * qdf_hang_event_unregister_notifier() - Hang data notifier unregister
92  * @nb: Notifier block
93  *
94  * This function unregisters notifier block for the hang data notifier chain.
95  *
96  * Return: QDF_STATUS
97  */
98 QDF_STATUS qdf_hang_event_unregister_notifier(qdf_notif_block *nb);
99 
100 /**
101  * qdf_hang_event_notifier_call() - Hang data notifier register
102  * @v: state
103  * @data: Private data for this notifier chain
104  *
105  * This function when invoked will call the functions registered with this
106  * notifier chain.
107  *
108  * Return: QDF_STATUS
109  */
110 QDF_STATUS qdf_hang_event_notifier_call(unsigned long v, void *data);
111 #else
112 static inline
113 QDF_STATUS qdf_hang_event_register_notifier(qdf_notif_block *nb)
114 {
115 	return QDF_STATUS_SUCCESS;
116 }
117 
118 static inline
119 QDF_STATUS qdf_hang_event_unregister_notifier(qdf_notif_block *nb)
120 {
121 	return QDF_STATUS_SUCCESS;
122 }
123 
124 static inline
125 QDF_STATUS qdf_hang_event_notifier_call(unsigned long v, void *data)
126 {
127 	return QDF_STATUS_SUCCESS;
128 }
129 #endif
130 #endif
131