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