/***************************************************************************** AudioScience HPI driver Copyright (C) 1997-2010 AudioScience 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 the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Debug macros. *****************************************************************************/ #ifndef _HPIDEBUG_H #define _HPIDEBUG_H #include "hpi_internal.h" /* Define debugging levels. */ enum { HPI_DEBUG_LEVEL_ERROR = 0, /* always log errors */ HPI_DEBUG_LEVEL_WARNING = 1, HPI_DEBUG_LEVEL_NOTICE = 2, HPI_DEBUG_LEVEL_INFO = 3, HPI_DEBUG_LEVEL_DEBUG = 4, HPI_DEBUG_LEVEL_VERBOSE = 5 /* same printk level as DEBUG */ }; #define HPI_DEBUG_LEVEL_DEFAULT HPI_DEBUG_LEVEL_NOTICE /* an OS can define an extra flag string that is appended to the start of each message, eg see hpios_linux.h */ #ifdef SOURCEFILE_NAME #define FILE_LINE SOURCEFILE_NAME ":" __stringify(__LINE__) " " #else #define FILE_LINE __FILE__ ":" __stringify(__LINE__) " " #endif #if defined(HPI_DEBUG) && defined(_WINDOWS) #define HPI_DEBUGBREAK() debug_break() #else #define HPI_DEBUGBREAK() #endif #define HPI_DEBUG_ASSERT(expression) \ do { \ if (!(expression)) {\ printk(KERN_ERR FILE_LINE\ "ASSERT " __stringify(expression));\ HPI_DEBUGBREAK();\ } \ } while (0) #define HPI_DEBUG_LOG(level, ...) \ do { \ if (hpi_debug_level >= HPI_DEBUG_LEVEL_##level) { \ printk(HPI_DEBUG_FLAG_##level \ FILE_LINE __VA_ARGS__); \ } \ } while (0) void hpi_debug_init(void); int hpi_debug_level_set(int level); int hpi_debug_level_get(void); /* needed by Linux driver for dynamic debug level changes */ extern int hpi_debug_level; void hpi_debug_message(struct hpi_message *phm, char *sz_fileline); void hpi_debug_data(u16 *pdata, u32 len); #define HPI_DEBUG_DATA(pdata, len) \ do { \ if (hpi_debug_level >= HPI_DEBUG_LEVEL_VERBOSE) \ hpi_debug_data(pdata, len); \ } while (0) #define HPI_DEBUG_MESSAGE(level, phm) \ do { \ if (hpi_debug_level >= HPI_DEBUG_LEVEL_##level) { \ hpi_debug_message(phm,HPI_DEBUG_FLAG_##level \ FILE_LINE __stringify(level));\ } \ } while (0) #define HPI_DEBUG_RESPONSE(phr) \ do { \ if ((hpi_debug_level >= HPI_DEBUG_LEVEL_DEBUG) && (phr->error))\ HPI_DEBUG_LOG(ERROR, \ "HPI response - error# %d\n", \ phr->error); \ else if (hpi_debug_level >= HPI_DEBUG_LEVEL_VERBOSE) \ HPI_DEBUG_LOG(VERBOSE, "HPI response OK\n");\ } while (0) #ifndef compile_time_assert #define compile_time_assert(cond, msg) \ typedef char msg[(cond) ? 1 : -1] #endif /* check that size is exactly some number */ #define function_count_check(sym, size) \ compile_time_assert((sym##_FUNCTION_COUNT) == (size),\ strings_match_defs_##sym) /* These strings should be generated using a macro which defines the corresponding symbol values. */ #define HPI_OBJ_STRINGS \ { \ "HPI_OBJ_SUBSYSTEM", \ "HPI_OBJ_ADAPTER", \ "HPI_OBJ_OSTREAM", \ "HPI_OBJ_ISTREAM", \ "HPI_OBJ_MIXER", \ "HPI_OBJ_NODE", \ "HPI_OBJ_CONTROL", \ "HPI_OBJ_NVMEMORY", \ "HPI_OBJ_DIGITALIO", \ "HPI_OBJ_WATCHDOG", \ "HPI_OBJ_CLOCK", \ "HPI_OBJ_PROFILE", \ "HPI_OBJ_CONTROLEX" \ } #define HPI_SUBSYS_STRINGS \ { \ "HPI_SUBSYS_OPEN", \ "HPI_SUBSYS_GET_VERSION", \ "HPI_SUBSYS_GET_INFO", \ "HPI_SUBSYS_FIND_ADAPTERS", \ "HPI_SUBSYS_CREATE_ADAPTER",\ "HPI_SUBSYS_CLOSE", \ "HPI_SUBSYS_DELETE_ADAPTER", \ "HPI_SUBSYS_DRIVER_LOAD", \ "HPI_SUBSYS_DRIVER_UNLOAD", \ "HPI_SUBSYS_READ_PORT_8", \ "HPI_SUBSYS_WRITE_PORT_8", \ "HPI_SUBSYS_GET_NUM_ADAPTERS",\ "HPI_SUBSYS_GET_ADAPTER", \ "HPI_SUBSYS_SET_NETWORK_INTERFACE"\ } function_count_check(HPI_SUBSYS, 14); #define HPI_ADAPTER_STRINGS \ { \ "HPI_ADAPTER_OPEN", \ "HPI_ADAPTER_CLOSE", \ "HPI_ADAPTER_GET_INFO", \ "HPI_ADAPTER_GET_ASSERT", \ "HPI_ADAPTER_TEST_ASSERT", \ "HPI_ADAPTER_SET_MODE", \ "HPI_ADAPTER_GET_MODE", \ "HPI_ADAPTER_ENABLE_CAPABILITY",\ "HPI_ADAPTER_SELFTEST", \ "HPI_ADAPTER_FIND_OBJECT", \ "HPI_ADAPTER_QUERY_FLASH", \ "HPI_ADAPTER_START_FLASH", \ "HPI_ADAPTER_PROGRAM_FLASH", \ "HPI_ADAPTER_SET_PROPERTY", \ "HPI_ADAPTER_GET_PROPERTY", \ "HPI_ADAPTER_ENUM_PROPERTY", \ "HPI_ADAPTER_MODULE_INFO", \ "HPI_ADAPTER_DEBUG_READ" \ } function_count_check(HPI_ADAPTER, 18); #define HPI_OSTREAM_STRINGS \ { \ "HPI_OSTREAM_OPEN", \ "HPI_OSTREAM_CLOSE", \ "HPI_OSTREAM_WRITE", \ "HPI_OSTREAM_START", \ "HPI_OSTREAM_STOP", \ "HPI_OSTREAM_RESET", \ "HPI_OSTREAM_GET_INFO", \ "HPI_OSTREAM_QUERY_FORMAT", \ "HPI_OSTREAM_DATA", \ "HPI_OSTREAM_SET_VELOCITY", \ "HPI_OSTREAM_SET_PUNCHINOUT", \ "HPI_OSTREAM_SINEGEN", \ "HPI_OSTREAM_ANC_RESET", \ "HPI_OSTREAM_ANC_GET_INFO", \ "HPI_OSTREAM_ANC_READ", \ "HPI_OSTREAM_SET_TIMESCALE",\ "HPI_OSTREAM_SET_FORMAT", \ "HPI_OSTREAM_HOSTBUFFER_ALLOC", \ "HPI_OSTREAM_HOSTBUFFER_FREE", \ "HPI_OSTREAM_GROUP_ADD",\ "HPI_OSTREAM_GROUP_GETMAP", \ "HPI_OSTREAM_GROUP_RESET", \ "HPI_OSTREAM_HOSTBUFFER_GET_INFO", \ "HPI_OSTREAM_WAIT_START", \ } function_count_check(HPI_OSTREAM, 24); #define HPI_ISTREAM_STRINGS \ { \ "HPI_ISTREAM_OPEN", \ "HPI_ISTREAM_CLOSE", \ "HPI_ISTREAM_SET_FORMAT", \ "HPI_ISTREAM_READ", \ "HPI_ISTREAM_START", \ "HPI_ISTREAM_STOP", \ "HPI_ISTREAM_RESET", \ "HPI_ISTREAM_GET_INFO", \ "HPI_ISTREAM_QUERY_FORMAT", \ "HPI_ISTREAM_ANC_RESET", \ "HPI_ISTREAM_ANC_GET_INFO", \ "HPI_ISTREAM_ANC_WRITE", \ "HPI_ISTREAM_HOSTBUFFER_ALLOC",\ "HPI_ISTREAM_HOSTBUFFER_FREE", \ "HPI_ISTREAM_GROUP_ADD", \ "HPI_ISTREAM_GROUP_GETMAP", \ "HPI_ISTREAM_GROUP_RESET", \ "HPI_ISTREAM_HOSTBUFFER_GET_INFO", \ "HPI_ISTREAM_WAIT_START", \ } function_count_check(HPI_ISTREAM, 19); #define HPI_MIXER_STRINGS \ { \ "HPI_MIXER_OPEN", \ "HPI_MIXER_CLOSE", \ "HPI_MIXER_GET_INFO", \ "HPI_MIXER_GET_NODE_INFO", \ "HPI_MIXER_GET_CONTROL", \ "HPI_MIXER_SET_CONNECTION", \ "HPI_MIXER_GET_CONNECTIONS", \ "HPI_MIXER_GET_CONTROL_BY_INDEX", \ "HPI_MIXER_GET_CONTROL_ARRAY_BY_INDEX", \ "HPI_MIXER_GET_CONTROL_MULTIPLE_VALUES", \ "HPI_MIXER_STORE", \ } function_count_check(HPI_MIXER, 11); #define HPI_CONTROL_STRINGS \ { \ "HPI_CONTROL_GET_INFO", \ "HPI_CONTROL_GET_STATE", \ "HPI_CONTROL_SET_STATE" \ } function_count_check(HPI_CONTROL, 3); #define HPI_NVMEMORY_STRINGS \ { \ "HPI_NVMEMORY_OPEN", \ "HPI_NVMEMORY_READ_BYTE", \ "HPI_NVMEMORY_WRITE_BYTE" \ } function_count_check(HPI_NVMEMORY, 3); #define HPI_DIGITALIO_STRINGS \ { \ "HPI_GPIO_OPEN", \ "HPI_GPIO_READ_BIT", \ "HPI_GPIO_WRITE_BIT", \ "HPI_GPIO_READ_ALL", \ "HPI_GPIO_WRITE_STATUS"\ } function_count_check(HPI_GPIO, 5); #define HPI_WATCHDOG_STRINGS \ { \ "HPI_WATCHDOG_OPEN", \ "HPI_WATCHDOG_SET_TIME", \ "HPI_WATCHDOG_PING" \ } #define HPI_CLOCK_STRINGS \ { \ "HPI_CLOCK_OPEN", \ "HPI_CLOCK_SET_TIME", \ "HPI_CLOCK_GET_TIME" \ } #define HPI_PROFILE_STRINGS \ { \ "HPI_PROFILE_OPEN_ALL", \ "HPI_PROFILE_START_ALL", \ "HPI_PROFILE_STOP_ALL", \ "HPI_PROFILE_GET", \ "HPI_PROFILE_GET_IDLECOUNT", \ "HPI_PROFILE_GET_NAME", \ "HPI_PROFILE_GET_UTILIZATION" \ } function_count_check(HPI_PROFILE, 7); #define HPI_ASYNCEVENT_STRINGS \ { \ "HPI_ASYNCEVENT_OPEN",\ "HPI_ASYNCEVENT_CLOSE ",\ "HPI_ASYNCEVENT_WAIT",\ "HPI_ASYNCEVENT_GETCOUNT",\ "HPI_ASYNCEVENT_GET",\ "HPI_ASYNCEVENT_SENDEVENTS"\ } function_count_check(HPI_ASYNCEVENT, 6); #define HPI_CONTROL_TYPE_STRINGS \ { \ "null control", \ "HPI_CONTROL_CONNECTION", \ "HPI_CONTROL_VOLUME", \ "HPI_CONTROL_METER", \ "HPI_CONTROL_MUTE", \ "HPI_CONTROL_MULTIPLEXER", \ "HPI_CONTROL_AESEBU_TRANSMITTER", \ "HPI_CONTROL_AESEBU_RECEIVER", \ "HPI_CONTROL_LEVEL", \ "HPI_CONTROL_TUNER", \ "HPI_CONTROL_ONOFFSWITCH", \ "HPI_CONTROL_VOX", \ "HPI_CONTROL_AES18_TRANSMITTER", \ "HPI_CONTROL_AES18_RECEIVER", \ "HPI_CONTROL_AES18_BLOCKGENERATOR", \ "HPI_CONTROL_CHANNEL_MODE", \ "HPI_CONTROL_BITSTREAM", \ "HPI_CONTROL_SAMPLECLOCK", \ "HPI_CONTROL_MICROPHONE", \ "HPI_CONTROL_PARAMETRIC_EQ", \ "HPI_CONTROL_COMPANDER", \ "HPI_CONTROL_COBRANET", \ "HPI_CONTROL_TONE_DETECT", \ "HPI_CONTROL_SILENCE_DETECT", \ "HPI_CONTROL_PAD", \ "HPI_CONTROL_SRC" ,\ "HPI_CONTROL_UNIVERSAL" \ } compile_time_assert((HPI_CONTROL_LAST_INDEX + 1 == 27), controltype_strings_match_defs); #define HPI_SOURCENODE_STRINGS \ { \ "no source", \ "HPI_SOURCENODE_OSTREAM", \ "HPI_SOURCENODE_LINEIN", \ "HPI_SOURCENODE_AESEBU_IN", \ "HPI_SOURCENODE_TUNER", \ "HPI_SOURCENODE_RF", \ "HPI_SOURCENODE_CLOCK_SOURCE", \ "HPI_SOURCENODE_RAW_BITSTREAM", \ "HPI_SOURCENODE_MICROPHONE", \ "HPI_SOURCENODE_COBRANET", \ "HPI_SOURCENODE_ANALOG", \ "HPI_SOURCENODE_ADAPTER" \ } compile_time_assert((HPI_SOURCENODE_LAST_INDEX - HPI_SOURCENODE_NONE + 1) == (12), sourcenode_strings_match_defs); #define HPI_DESTNODE_STRINGS \ { \ "no destination", \ "HPI_DESTNODE_ISTREAM", \ "HPI_DESTNODE_LINEOUT", \ "HPI_DESTNODE_AESEBU_OUT", \ "HPI_DESTNODE_RF", \ "HPI_DESTNODE_SPEAKER", \ "HPI_DESTNODE_COBRANET", \ "HPI_DESTNODE_ANALOG" \ } compile_time_assert((HPI_DESTNODE_LAST_INDEX - HPI_DESTNODE_NONE + 1) == (8), destnode_strings_match_defs); #define HPI_CONTROL_CHANNEL_MODE_STRINGS \ { \ "XXX HPI_CHANNEL_MODE_ERROR XXX", \ "HPI_CHANNEL_MODE_NORMAL", \ "HPI_CHANNEL_MODE_SWAP", \ "HPI_CHANNEL_MODE_LEFT_ONLY", \ "HPI_CHANNEL_MODE_RIGHT_ONLY" \ } #endif /* _HPIDEBUG_H */