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