1 /* 2 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for 5 * any purpose with or without fee is hereby granted, provided that the 6 * above copyright notice and this permission notice appear in all 7 * copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16 * PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #include "qdf_module.h" 20 #include "qdf_trace.h" 21 #include "qdf_platform.h" 22 23 /** 24 * The following callbacks should be defined static to make sure they are 25 * initialized to NULL 26 */ 27 static qdf_self_recovery_callback self_recovery_cb; 28 static qdf_is_fw_down_callback is_fw_down_cb; 29 static qdf_is_recovering_callback is_recovering_cb; 30 static qdf_is_drv_connected_callback is_drv_connected_cb; 31 32 void qdf_register_fw_down_callback(qdf_is_fw_down_callback is_fw_down) 33 { 34 is_fw_down_cb = is_fw_down; 35 } 36 37 qdf_export_symbol(qdf_register_fw_down_callback); 38 39 bool qdf_is_fw_down(void) 40 { 41 if (!is_fw_down_cb) { 42 QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, 43 "fw down callback is not registered"); 44 return false; 45 } 46 47 return is_fw_down_cb(); 48 } 49 50 qdf_export_symbol(qdf_is_fw_down); 51 52 void qdf_register_self_recovery_callback(qdf_self_recovery_callback callback) 53 { 54 self_recovery_cb = callback; 55 } 56 57 qdf_export_symbol(qdf_register_self_recovery_callback); 58 59 void __qdf_trigger_self_recovery(enum qdf_hang_reason reason, 60 const char *func, const uint32_t line) 61 { 62 if (self_recovery_cb) 63 self_recovery_cb(reason, func, line); 64 else 65 QDF_DEBUG_PANIC_FL(func, line, ""); 66 } 67 68 qdf_export_symbol(__qdf_trigger_self_recovery); 69 70 void qdf_register_recovering_state_query_callback( 71 qdf_is_recovering_callback is_recovering) 72 { 73 is_recovering_cb = is_recovering; 74 } 75 76 bool qdf_is_recovering(void) 77 { 78 if (is_recovering_cb) 79 return is_recovering_cb(); 80 return false; 81 } 82 83 qdf_export_symbol(qdf_is_recovering); 84 85 static qdf_op_protect_cb __on_op_protect; 86 static qdf_op_unprotect_cb __on_op_unprotect; 87 88 void qdf_op_callbacks_register(qdf_op_protect_cb on_protect, 89 qdf_op_unprotect_cb on_unprotect) 90 { 91 __on_op_protect = on_protect; 92 __on_op_unprotect = on_unprotect; 93 } 94 qdf_export_symbol(qdf_op_callbacks_register); 95 96 int __qdf_op_protect(struct qdf_op_sync **out_sync, const char *func) 97 { 98 if (!__on_op_protect) 99 return 0; 100 101 return __on_op_protect((void **)out_sync, func); 102 } 103 qdf_export_symbol(__qdf_op_protect); 104 105 void __qdf_op_unprotect(struct qdf_op_sync *sync, const char *func) 106 { 107 if (__on_op_unprotect) 108 __on_op_unprotect(sync, func); 109 } 110 qdf_export_symbol(__qdf_op_unprotect); 111 112 void qdf_register_drv_connected_callback(qdf_is_drv_connected_callback 113 is_drv_connected) 114 { 115 is_drv_connected_cb = is_drv_connected; 116 } 117 qdf_export_symbol(qdf_register_drv_connected_callback); 118 119 bool qdf_is_drv_connected(void) 120 { 121 if (!is_drv_connected_cb) { 122 qdf_err("drv connected callback is not registered"); 123 return false; 124 } 125 126 return is_drv_connected_cb(); 127 } 128 qdf_export_symbol(qdf_is_drv_connected); 129