| /****************************************************************************** |
| * |
| * This file is provided under a dual license. When you use or |
| * distribute this software, you may choose to be licensed under |
| * version 2 of the GNU General Public License ("GPLv2 License") |
| * or BSD License. |
| * |
| * GPLv2 License |
| * |
| * Copyright(C) 2016 MediaTek Inc. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of version 2 of the GNU General Public License as |
| * published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, but |
| * WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| * See http://www.gnu.org/licenses/gpl-2.0.html for more details. |
| * |
| * BSD LICENSE |
| * |
| * Copyright(C) 2016 MediaTek Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in |
| * the documentation and/or other materials provided with the |
| * distribution. |
| * * Neither the name of the copyright holder nor the names of its |
| * contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| * |
| *****************************************************************************/ |
| /* |
| ** Id: include/debug.h |
| */ |
| |
| /*! \file debug.h |
| * \brief Definition of SW debugging level. |
| * |
| * In this file, it describes the definition of various SW debugging levels |
| * and assert functions. |
| */ |
| |
| #ifndef _DEBUG_H |
| #define _DEBUG_H |
| |
| /******************************************************************************* |
| * C O M P I L E R F L A G S |
| ******************************************************************************* |
| */ |
| #ifndef BUILD_QA_DBG |
| #define BUILD_QA_DBG 0 |
| #endif |
| |
| #define DBG_DISABLE_ALL_LOG 0 |
| |
| /******************************************************************************* |
| * E X T E R N A L R E F E R E N C E S |
| ******************************************************************************* |
| */ |
| #include "gl_typedef.h" |
| |
| extern uint8_t aucDebugModule[]; |
| extern uint32_t au4LogLevel[]; |
| |
| extern void set_logtoomuch_enable(int value) __attribute__((weak)); |
| extern int get_logtoomuch_enable(void) __attribute__((weak)); |
| |
| /******************************************************************************* |
| * C O N S T A N T S |
| ******************************************************************************* |
| */ |
| /* Define debug category (class): |
| * (1) ERROR (2) WARN (3) STATE (4) EVENT (5) TRACE (6) INFO (7) LOUD (8) TEMP |
| */ |
| #define DBG_CLASS_ERROR BIT(0) |
| #define DBG_CLASS_WARN BIT(1) |
| #define DBG_CLASS_STATE BIT(2) |
| #define DBG_CLASS_EVENT BIT(3) |
| #define DBG_CLASS_TRACE BIT(4) |
| #define DBG_CLASS_INFO BIT(5) |
| #define DBG_CLASS_LOUD BIT(6) |
| #define DBG_CLASS_TEMP BIT(7) |
| #define DBG_CLASS_MASK BITS(0, 7) |
| |
| #define DBG_LOG_LEVEL_DEFAULT \ |
| (DBG_CLASS_ERROR | \ |
| DBG_CLASS_WARN | \ |
| DBG_CLASS_STATE | \ |
| DBG_CLASS_EVENT | \ |
| DBG_CLASS_INFO) |
| #define DBG_LOG_LEVEL_MORE \ |
| (DBG_LOG_LEVEL_DEFAULT | \ |
| DBG_CLASS_TRACE) |
| #define DBG_LOG_LEVEL_EXTREME \ |
| (DBG_LOG_LEVEL_MORE | \ |
| DBG_CLASS_LOUD) |
| |
| #if defined(LINUX) |
| #define DBG_PRINTF_64BIT_DEC "lld" |
| #else /* Windows */ |
| #define DBG_PRINTF_64BIT_DEC "I64d" |
| #endif |
| #define DBG_ALL_MODULE_IDX 0xFFFFFFFF |
| |
| #define DEG_HIF_ALL BIT(0) |
| #define DEG_HIF_HOST_CSR BIT(1) |
| #define DEG_HIF_PDMA BIT(2) |
| #define DEG_HIF_DMASCH BIT(3) |
| #define DEG_HIF_PSE BIT(4) |
| #define DEG_HIF_PLE BIT(5) |
| #define DEG_HIF_MAC BIT(6) |
| #define DEG_HIF_PHY BIT(7) |
| |
| #define DEG_HIF_DEFAULT_DUMP \ |
| (DEG_HIF_HOST_CSR | DEG_HIF_PDMA | DEG_HIF_DMASCH | \ |
| DEG_HIF_PSE | DEG_HIF_PLE) |
| |
| #define HIF_CHK_TX_HANG BIT(1) |
| #define HIF_DRV_SER BIT(2) |
| |
| /******************************************************************************* |
| * D A T A T Y P E S |
| ******************************************************************************* |
| */ |
| /* Define debug module index */ |
| enum ENUM_DBG_MODULE { |
| DBG_INIT_IDX = 0, /* 0x00 *//* For driver initial */ |
| DBG_HAL_IDX, /* 0x01 *//* For HAL(HW) Layer */ |
| DBG_INTR_IDX, /* 0x02 *//* For Interrupt */ |
| DBG_REQ_IDX, /* 0x03 */ |
| DBG_TX_IDX, /* 0x04 */ |
| DBG_RX_IDX, /* 0x05 */ |
| DBG_RFTEST_IDX, /* 0x06 *//* For RF test mode */ |
| DBG_EMU_IDX, /* 0x07 *//* Developer specific */ |
| DBG_SW1_IDX, /* 0x08 *//* Developer specific */ |
| DBG_SW2_IDX, /* 0x09 *//* Developer specific */ |
| DBG_SW3_IDX, /* 0x0A *//* Developer specific */ |
| DBG_SW4_IDX, /* 0x0B *//* Developer specific */ |
| DBG_HEM_IDX, /* 0x0C *//* HEM */ |
| DBG_AIS_IDX, /* 0x0D *//* AIS */ |
| DBG_RLM_IDX, /* 0x0E *//* RLM */ |
| DBG_MEM_IDX, /* 0x0F *//* RLM */ |
| DBG_CNM_IDX, /* 0x10 *//* CNM */ |
| DBG_RSN_IDX, /* 0x11 *//* RSN */ |
| DBG_BSS_IDX, /* 0x12 *//* BSS */ |
| DBG_SCN_IDX, /* 0x13 *//* SCN */ |
| DBG_SAA_IDX, /* 0x14 *//* SAA */ |
| DBG_AAA_IDX, /* 0x15 *//* AAA */ |
| DBG_P2P_IDX, /* 0x16 *//* P2P */ |
| DBG_QM_IDX, /* 0x17 *//* QUE_MGT */ |
| DBG_SEC_IDX, /* 0x18 *//* SEC */ |
| DBG_BOW_IDX, /* 0x19 *//* BOW */ |
| DBG_WAPI_IDX, /* 0x1A *//* WAPI */ |
| DBG_ROAMING_IDX, /* 0x1B *//* ROAMING */ |
| DBG_TDLS_IDX, /* 0x1C *//* TDLS *//* CFG_SUPPORT_TDLS */ |
| DBG_PF_IDX, /* 0x1D *//* PF */ |
| DBG_OID_IDX, |
| DBG_NIC_IDX, |
| DBG_WNM_IDX, |
| DBG_WMM_IDX, |
| DBG_MODULE_NUM /* Notice the XLOG check */ |
| }; |
| enum ENUM_DBG_ASSERT_CTRL_LEVEL { |
| DBG_ASSERT_CTRL_LEVEL_ERROR, |
| DBG_ASSERT_CTRL_LEVEL_WARN, |
| DBG_ASSERT_CTRL_LEVEL_LITE |
| }; |
| enum ENUM_DBG_ASSERT_PATH { |
| DBG_ASSERT_PATH_WIFI, |
| DBG_ASSERT_PATH_WMT |
| }; |
| |
| struct CHIP_DBG_OPS { |
| void (*showPdmaInfo)(IN struct ADAPTER *prAdapter); |
| void (*showPseInfo)(IN struct ADAPTER *prAdapter); |
| void (*showPleInfo)(IN struct ADAPTER *prAdapter); |
| bool (*showCsrInfo)(IN struct ADAPTER *prAdapter); |
| void (*showDmaschInfo)(IN struct ADAPTER *prAdapter); |
| }; |
| |
| enum PKT_PHASE { |
| PHASE_XMIT_RCV, |
| PHASE_ENQ_QM, |
| PHASE_HIF_TX, |
| }; |
| |
| struct WLAN_DEBUG_INFO { |
| u_int8_t fgVoE5_7Test:1; |
| u_int8_t fgReserved:7; |
| }; |
| |
| #if MTK_WCN_HIF_SDIO |
| #define DBG_ASSERT_PATH_DEFAULT DBG_ASSERT_PATH_WMT |
| #else |
| #define DBG_ASSERT_PATH_DEFAULT DBG_ASSERT_PATH_WIFI |
| #endif |
| #define DBG_ASSERT_CTRL_LEVEL_DEFAULT DBG_ASSERT_CTRL_LEVEL_ERROR |
| /******************************************************************************* |
| * P U B L I C D A T A |
| ******************************************************************************* |
| */ |
| /******************************************************************************* |
| * P R I V A T E D A T A |
| ******************************************************************************* |
| */ |
| /******************************************************************************* |
| * M A C R O S |
| ******************************************************************************* |
| */ |
| /* Debug print format string for the OS system time */ |
| #define OS_SYSTIME_DBG_FORMAT "0x%08x" |
| /* Debug print argument for the OS system time */ |
| #define OS_SYSTIME_DBG_ARGUMENT(systime) (systime) |
| #if CFG_SHOW_FULL_MACADDR |
| /* Debug print format string for the MAC Address */ |
| #define MACSTR "%pM" |
| /* Debug print argument for the MAC Address */ |
| #define MAC2STR(a) a |
| #else |
| #define MACSTR "%02x:%02x:**:**:**:%02x" |
| #define MAC2STR(a) ((uint8_t *)a)[0], ((uint8_t *)a)[1], ((uint8_t *)a)[5] |
| #endif |
| /* Debug print format string for the IPv4 Address */ |
| #define IPV4STR "%pI4" |
| /* Debug print argument for the IPv4 Address */ |
| #define IPV4TOSTR(a) a |
| /* Debug print format string for the IPv6 Address */ |
| #define IPV6STR "%pI6" |
| /* Debug print argument for the IPv6 Address */ |
| #define IPV6TOSTR(a) a |
| /* The pre-defined format to dump the varaible value with its name shown. */ |
| #define DUMPVAR(variable, format) (#variable " = " format "\n", variable) |
| /* The pre-defined format to dump the MAC type value with its name shown. */ |
| #define DUMPMACADDR(addr) (#addr " = " MACSTR "\n", MAC2STR(addr)) |
| /* Debug print format string for the floating point */ |
| #define FPSTR "%u.%u" |
| /* Debug print argument for the floating point */ |
| #define DIV2INT(_dividend, _divisor) \ |
| ((_divisor) ? (_dividend) / (_divisor) : 0) |
| #define DIV2DEC(_dividend, _divisor) \ |
| ((_divisor) ? (((_dividend) * 100) / (_divisor)) % 100 : 0) |
| /* Basiclly, we just do renaming of KAL functions although they should |
| * be defined as "Nothing to do" if DBG=0. But in some compiler, the macro |
| * syntax does not support #define LOG_FUNC(x,...) |
| * |
| * A caller shall not invoke these three macros when DBG=0. |
| */ |
| #define LOG_FUNC kalPrint |
| #define LOG_FUNC_LIMITED kalPrintLimited |
| |
| /* If __FUNCTION__ is already defined by compiler, we just use it. */ |
| #define DEBUGFUNC(_Func) |
| /* Disabled due to AOSP |
| * #if defined(__FUNCTION__) |
| * #define DEBUGFUNC(_Func) |
| * #else |
| * #define DEBUGFUNC(_Func) static const char __FUNCTION__[] = _Func; |
| * #endif |
| */ |
| #if DBG_DISABLE_ALL_LOG |
| #define DBGLOG(_Module, _Class, _Fmt) |
| #define DBGLOG_LIMITED(_Module, _Class, _Fmt) |
| #define DBGLOG_MEM8(_Module, _Class, _StartAddr, _Length) |
| #define DBGLOG_MEM32(_Module, _Class, _StartAddr, _Length) |
| #else |
| #define DBGLOG(_Mod, _Clz, _Fmt, ...) \ |
| do { \ |
| if ((aucDebugModule[DBG_##_Mod##_IDX] & \ |
| DBG_CLASS_##_Clz) == 0) \ |
| break; \ |
| LOG_FUNC("[%u]%s:(" #_Mod " " #_Clz ") " _Fmt, \ |
| KAL_GET_CURRENT_THREAD_ID(), \ |
| __func__, ##__VA_ARGS__); \ |
| } while (0) |
| #define DBGLOG_LIMITED(_Mod, _Clz, _Fmt, ...) \ |
| do { \ |
| if ((aucDebugModule[DBG_##_Mod##_IDX] & \ |
| DBG_CLASS_##_Clz) == 0) \ |
| break; \ |
| LOG_FUNC_LIMITED("[%u]%s:(" #_Mod " " #_Clz ") " _Fmt, \ |
| KAL_GET_CURRENT_THREAD_ID(), \ |
| __func__, ##__VA_ARGS__); \ |
| } while (0) |
| #define DBGFWLOG(_Mod, _Clz, _Fmt, ...) \ |
| do { \ |
| if ((aucDebugModule[DBG_##_Mod##_IDX] & \ |
| DBG_CLASS_##_Clz) == 0) \ |
| break; \ |
| wlanPrintFwLog(NULL, 0, DEBUG_MSG_TYPE_DRIVER, \ |
| "[%u]%s:(" #_Mod " " #_Clz ") " _Fmt, \ |
| KAL_GET_CURRENT_THREAD_ID(), \ |
| __func__, ##__VA_ARGS__); \ |
| } while (0) |
| #define TOOL_PRINTLOG(_Mod, _Clz, _Fmt, ...) \ |
| do { \ |
| if ((aucDebugModule[DBG_##_Mod##_IDX] & \ |
| DBG_CLASS_##_Clz) == 0) \ |
| break; \ |
| LOG_FUNC(_Fmt, ##__VA_ARGS__); \ |
| } while (0) |
| #define DBGLOG_MEM8(_Mod, _Clz, _Adr, _Len) \ |
| { \ |
| if (aucDebugModule[DBG_##_Mod##_IDX] & DBG_CLASS_##_Clz) { \ |
| LOG_FUNC("%s:(" #_Mod " " #_Clz ")\n", __func__); \ |
| dumpMemory8((uint8_t *)(_Adr), (uint32_t)(_Len)); \ |
| } \ |
| } |
| #define DBGLOG_MEM32(_Mod, _Clz, _Adr, _Len) \ |
| { \ |
| if (aucDebugModule[DBG_##_Mod##_IDX] & DBG_CLASS_##_Clz) { \ |
| LOG_FUNC("%s:(" #_Mod " " #_Clz ")\n", __func__); \ |
| dumpMemory32((uint32_t *)(_Adr), (uint32_t)(_Len)); \ |
| } \ |
| } |
| #endif |
| #define DISP_STRING(_str) _str |
| #undef ASSERT |
| #undef ASSERT_REPORT |
| #if (BUILD_QA_DBG || DBG) |
| #define ASSERT_NOMEM() \ |
| { \ |
| LOG_FUNC("alloate memory failed at %s:%d\n", __FILE__, __LINE__); \ |
| kalSendAeeWarning("Wlan_Gen4 No Mem", "Memory Alloate Failed %s:%d",\ |
| __FILE__, __LINE__); \ |
| } |
| #ifdef _lint |
| #define ASSERT(_exp) \ |
| { \ |
| if (!(_exp)) { \ |
| do {} while (1); \ |
| } \ |
| } |
| #define ASSERT_REPORT(_exp, _fmt) \ |
| { \ |
| LOG_FUNC("Assertion failed: %s:%d (%s)\n", \ |
| __FILE__, __LINE__, #_exp); \ |
| LOG_FUNC _fmt; \ |
| if (!(_exp)) { \ |
| do {} while (1); \ |
| } \ |
| } |
| #elif defined(WINDOWS_CE) |
| #define UNICODE_TEXT(_msg) TEXT(_msg) |
| #define ASSERT(_exp) \ |
| { \ |
| if (!(_exp) && !fgIsBusAccessFailed) { \ |
| TCHAR rUbuf[256]; \ |
| kalBreakPoint(); \ |
| _stprintf(rUbuf, TEXT("Assertion failed: %s:%d %s\n"), \ |
| UNICODE_TEXT(__FILE__), __LINE__, \ |
| UNICODE_TEXT(#_exp)); \ |
| MessageBox(NULL, rUbuf, TEXT("ASSERT!"), MB_OK); \ |
| } \ |
| } |
| #define ASSERT_REPORT(_exp, _fmt) \ |
| { \ |
| if (!(_exp) && !fgIsBusAccessFailed) { \ |
| TCHAR rUbuf[256]; \ |
| kalBreakPoint(); \ |
| _stprintf(rUbuf, TEXT("Assertion failed: %s:%d %s\n"), \ |
| UNICODE_TEXT(__FILE__), __LINE__, \ |
| UNICODE_TEXT(#_exp)); \ |
| MessageBox(NULL, rUbuf, TEXT("ASSERT!"), MB_OK); \ |
| } \ |
| } |
| #else |
| #define ASSERT_NOMEM() \ |
| { \ |
| LOG_FUNC("alloate memory failed at %s:%d\n", __FILE__, __LINE__); \ |
| kalSendAeeWarning("Wlan_Gen4 No Mem", "Memory Alloate Failed %s:%d",\ |
| __FILE__, __LINE__); \ |
| } |
| |
| #define ASSERT(_exp) \ |
| { \ |
| if (!(_exp) && !fgIsBusAccessFailed) { \ |
| LOG_FUNC("Assertion failed: %s:%d (%s)\n", \ |
| __FILE__, __LINE__, #_exp); \ |
| kalBreakPoint(); \ |
| } \ |
| } |
| #define ASSERT_REPORT(_exp, _fmt) \ |
| { \ |
| if (!(_exp) && !fgIsBusAccessFailed) { \ |
| LOG_FUNC("Assertion failed: %s:%d (%s)\n", \ |
| __FILE__, __LINE__, #_exp); \ |
| LOG_FUNC _fmt; \ |
| kalBreakPoint(); \ |
| } \ |
| } |
| #endif /* WINDOWS_CE */ |
| #else |
| #define ASSERT_NOMEM() |
| #define ASSERT(_exp) |
| #define ASSERT_REPORT(_exp, _fmt) |
| #endif /* BUILD_QA_DBG */ |
| /* LOG function for print to buffer */ |
| /* If buffer pointer is NULL, redirect to normal DBGLOG */ |
| #define LOGBUF(_pucBuf, _maxLen, _curLen, _Fmt, ...) \ |
| { \ |
| if (_pucBuf) \ |
| (_curLen) += kalSnprintf((_pucBuf) + (_curLen), \ |
| (_maxLen) - (_curLen), _Fmt, ##__VA_ARGS__); \ |
| else \ |
| DBGLOG(SW4, INFO, _Fmt, ##__VA_ARGS__); \ |
| } |
| /* The following macro is used for debugging packed structures. */ |
| #ifndef DATA_STRUCT_INSPECTING_ASSERT |
| #define DATA_STRUCT_INSPECTING_ASSERT(expr) \ |
| { \ |
| switch (0) {case 0: case (expr): default:; } \ |
| } |
| #endif |
| |
| /* Name alias of debug functions to skip check patch*/ |
| #define log_dbg DBGLOG |
| #define log_limited_dbg DBGLOG_LIMITED |
| #define log_fw_dbg DBGFWLOG |
| #define log_mem8_dbg DBGLOG_MEM8 |
| #define log_mem32_dbg DBGLOG_MEM32 |
| #define log_tool_dbg TOOL_PRINTLOG |
| /******************************************************************************* |
| * F U N C T I O N D E C L A R A T I O N S |
| ******************************************************************************* |
| */ |
| void dumpMemory8(IN uint8_t *pucStartAddr, |
| IN uint32_t u4Length); |
| void dumpMemory32(IN uint32_t *pu4StartAddr, |
| IN uint32_t u4Length); |
| void wlanPrintFwLog(uint8_t *pucLogContent, |
| uint16_t u2MsgSize, uint8_t ucMsgType, |
| const uint8_t *pucFmt, ...); |
| |
| void wlanDbgLogLevelInit(void); |
| void wlanDbgLogLevelUninit(void); |
| uint32_t wlanDbgLevelUiSupport(IN struct ADAPTER *prAdapter, |
| uint32_t u4Version, uint32_t ucModule); |
| uint32_t wlanDbgGetLogLevelImpl(IN struct ADAPTER *prAdapter, |
| uint32_t u4Version, uint32_t ucModule); |
| void wlanDbgSetLogLevelImpl(IN struct ADAPTER *prAdapter, |
| uint32_t u4Version, uint32_t u4Module, uint32_t u4level); |
| void wlanDriverDbgLevelSync(void); |
| u_int8_t wlanDbgGetGlobalLogLevel(uint32_t u4Module, uint32_t *pu4Level); |
| u_int8_t wlanDbgSetGlobalLogLevel(uint32_t u4Module, uint32_t u4Level); |
| |
| void wlanFillTimestamp(struct ADAPTER *prAdapter, void *pvPacket, |
| uint8_t ucPhase); |
| /******************************************************************************* |
| * F U N C T I O N S |
| ******************************************************************************* |
| */ |
| #endif /* _DEBUG_H */ |
| |
| |