xref: /wlan-dirver/qca-wifi-host-cmn/qdf/inc/qdf_hang_event_notifier.h (revision 97f44cd39e4ff816eaa1710279d28cf6b9e65ad9)
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"
28 /* Max hang event buffer size */
29 #define QDF_HANG_EVENT_DATA_SIZE 390
30 /* Max offset which host can write */
31 #define QDF_WLAN_MAX_HOST_OFFSET 194
32 /* Start of the Firmware Data offset */
33 #define QDF_WLAN_HANG_FW_OFFSET 195
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  * @HANG_EVT_TAG_BUS_INFO: Bus hang event tag
47  */
48 enum hang_event_tag {
49 	HANG_EVT_TAG_CDS,
50 	HANG_EVT_TAG_OS_IF,
51 	HANG_EVT_TAG_OS_IF_SCAN,
52 	HANG_EVT_TAG_LEGACY_MAC,
53 	HANG_EVT_TAG_WMI_EVT_HIST,
54 	HANG_EVT_TAG_WMI_CMD_HIST,
55 	HANG_EVT_TAG_HTC_CREDIT_HIST,
56 	HANG_EVT_TAG_DP_PEER_INFO,
57 	HANG_EVT_TAG_CE_INFO,
58 	HANG_EVT_TAG_BUS_INFO
59 };
60 
61 #define QDF_HANG_EVENT_TLV_HDR_SIZE   (sizeof(uint16_t))
62 
63 #define QDF_HANG_EVT_SET_HDR(tlv_buf, tag, len) \
64 	(((uint16_t *)(tlv_buf))[0]) = (((tag) << 8) | ((len) & 0x000000FF))
65 
66 #define QDF_HANG_GET_STRUCT_TLVLEN(tlv_struct) \
67 	((uint16_t)(sizeof(tlv_struct) - QDF_HANG_EVENT_TLV_HDR_SIZE))
68 
69 /**
70  * qdf_notifier_data - Private data for notifier data
71  * @hang_data: Data filled by notifier
72  * @offset: Current offset of the hang data buffer
73  */
74 struct qdf_notifer_data {
75 	uint8_t *hang_data;
76 	unsigned int offset;
77 };
78 
79 #ifdef WLAN_HANG_EVENT
80 /**
81  * qdf_hang_event_register_notifier() - Hang data notifier register
82  * @nb: Notifier block
83  *
84  * This function registers notifier block for the hang data notifier chain
85  * the registered function will be invoked when the hang data notifier call
86  * is invoked.
87  *
88  * Return: QDF_STATUS
89  */
90 QDF_STATUS qdf_hang_event_register_notifier(qdf_notif_block *nb);
91 
92 /**
93  * qdf_hang_event_unregister_notifier() - Hang data notifier unregister
94  * @nb: Notifier block
95  *
96  * This function unregisters notifier block for the hang data notifier chain.
97  *
98  * Return: QDF_STATUS
99  */
100 QDF_STATUS qdf_hang_event_unregister_notifier(qdf_notif_block *nb);
101 
102 /**
103  * qdf_hang_event_notifier_call() - Hang data notifier register
104  * @v: state
105  * @data: Private data for this notifier chain
106  *
107  * This function when invoked will call the functions registered with this
108  * notifier chain.
109  *
110  * Return: QDF_STATUS
111  */
112 QDF_STATUS qdf_hang_event_notifier_call(unsigned long v, void *data);
113 #else
114 static inline
115 QDF_STATUS qdf_hang_event_register_notifier(qdf_notif_block *nb)
116 {
117 	return QDF_STATUS_SUCCESS;
118 }
119 
120 static inline
121 QDF_STATUS qdf_hang_event_unregister_notifier(qdf_notif_block *nb)
122 {
123 	return QDF_STATUS_SUCCESS;
124 }
125 
126 static inline
127 QDF_STATUS qdf_hang_event_notifier_call(unsigned long v, void *data)
128 {
129 	return QDF_STATUS_SUCCESS;
130 }
131 #endif
132 #endif
133