Index: head/sys/conf/NOTES =================================================================== --- head/sys/conf/NOTES +++ head/sys/conf/NOTES @@ -3061,3 +3061,6 @@ # zlib I/O stream support # This enables support for compressed core dumps. options GZIO + +# BHND(4) drivers +options BHND_LOGLEVEL # Logging threshold level \ No newline at end of file Index: head/sys/conf/options =================================================================== --- head/sys/conf/options +++ head/sys/conf/options @@ -979,3 +979,6 @@ # Intel em(4) driver EM_MULTIQUEUE opt_em.h + +# BHND(4) driver +BHND_LOGLEVEL opt_global.h Index: head/sys/dev/bhnd/bhnd.h =================================================================== --- head/sys/dev/bhnd/bhnd.h +++ head/sys/dev/bhnd/bhnd.h @@ -39,6 +39,7 @@ #include "bhnd_ids.h" #include "bhnd_types.h" +#include "bhnd_debug.h" #include "bhnd_bus_if.h" extern devclass_t bhnd_devclass; Index: head/sys/dev/bhnd/bhnd_debug.h =================================================================== --- head/sys/dev/bhnd/bhnd_debug.h +++ head/sys/dev/bhnd/bhnd_debug.h @@ -0,0 +1,192 @@ +/*- + * Copyright (c) 2016 Michael Zhilin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * 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 NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 DAMAGES. + */ + +/* $FreeBSD$ */ + +/* + * This file provides set of macros for logging: + * - BHND_ and + * - BHND__DEV + * where LEVEL = {ERROR,WARN,INFO,DEBUG} + * + * BHND_ macros is proxies to printf call and accept same parameters, + * for instance: + * BHND_INFO("register %d has value %d", reg, val); + * + * BHND__DEV macros is proxies to device_printf call and accept + * same parameters, for instance: + * BHND_INFO_DEV(dev, "register %d has value %d", reg, val); + * + * All macros contains newline char at the end of each call + * + * ERROR, WARN, INFO messages are printed only if: + * - log message level is lower than BHND_LOGGING (logging threshold) + * + * DEBUG, TRACE messages are printed only if: + * - bootverbose and + * - log message level is lower than BHND_LOGGING (logging threshold) + * + * In addition, for debugging purpose log message contains information about + * file name and line number if BHND_LOGGING is more than BHND_INFO_LEVEL + * + * NOTE: macros starting with underscore (_) are private and should be not used + * + * To override logging (for instance, force tracing), you can use: + * - "options BHND_LOGLEVEL=BHND_TRACE_LEVEL" in kernel configuration + * - "#define BHND_LOGGING BHND_TRACE_LEVEL" in source code file + * + * NOTE: kernel config option doesn't override log level defined on file level, + * so try to avoid "#define BHND_LOGGING" + */ + +#ifndef _BHND_BHND_DEBUG_H_ +#define _BHND_BHND_DEBUG_H_ + +#include + +#include "opt_global.h" + +#define BHND_ERROR_LEVEL 0x00 +#define BHND_ERROR_MSG "ERROR" +#define BHND_WARN_LEVEL 0x10 +#define BHND_WARN_MSG "!WARN" +#define BHND_INFO_LEVEL 0x20 +#define BHND_INFO_MSG " info" +#define BHND_DEBUG_LEVEL 0x30 +#define BHND_DEBUG_MSG "debug" +#define BHND_TRACE_LEVEL 0x40 +#define BHND_TRACE_MSG "trace" + +#if !(defined(BHND_LOGGING)) +#if !(defined(BHND_LOGLEVEL)) +/* By default logging will print only INFO+ message*/ +#define BHND_LOGGING BHND_INFO_LEVEL +#else /* defined(BHND_LOGLEVEL) */ +/* Kernel configuration specifies logging level */ +#define BHND_LOGGING BHND_LOGLEVEL +#endif /* !(defined(BHND_LOGLEVEL)) */ +#endif /* !(defined(BHND_LOGGING)) */ + +#if BHND_LOGGING > BHND_INFO_LEVEL +#define _BHND_PRINT(fn, level, fmt, ...) \ + do { \ + if (level##LEVEL < BHND_DEBUG_LEVEL || bootverbose) \ + fn "[BHND " level##MSG "] %s:%d => " fmt "\n", \ + __func__, __LINE__, ## __VA_ARGS__); \ + } while(0); +#else /* BHND_LOGGING <= BHND_INFO_LEVEL */ +#define _BHND_PRINT(fn, level, fmt, ...) \ + do { \ + if (level##LEVEL < BHND_DEBUG_LEVEL || bootverbose) \ + fn "bhnd: " fmt "\n", ## __VA_ARGS__); \ + } while(0); +#endif /* BHND_LOGGING > BHND_INFO_LEVEL */ + + +#define _BHND_RAWPRINTFN printf( +#define _BHND_DEVPRINTFN(dev) device_printf(dev, + +#define _BHND_LOGPRINT(level, fmt, ...) \ + _BHND_PRINT(_BHND_RAWPRINTFN, level, fmt, ## __VA_ARGS__) +#define _BHND_DEVPRINT(dev, level, fmt, ...) \ + _BHND_PRINT(_BHND_DEVPRINTFN(dev), level, fmt, ## __VA_ARGS__) + +#define BHND_ERROR(fmt, ...) \ + _BHND_LOGPRINT(BHND_ERROR_, fmt, ## __VA_ARGS__); +#define BHND_ERROR_DEV(dev, fmt, ...) \ + _BHND_DEVPRINT(dev, BHND_ERROR_, fmt, ## __VA_ARGS__) + +#if BHND_LOGGING >= BHND_WARN_LEVEL +#define BHND_WARN(fmt, ...) \ + _BHND_LOGPRINT(BHND_WARN_, fmt, ## __VA_ARGS__) +#define BHND_WARN_DEV(dev, fmt, ...) \ + _BHND_DEVPRINT(dev, BHND_WARN_, fmt, ## __VA_ARGS__) + +#if BHND_LOGGING >= BHND_INFO_LEVEL +#define BHND_INFO(fmt, ...) \ + _BHND_LOGPRINT(BHND_INFO_, fmt, ## __VA_ARGS__) +#define BHND_INFO_DEV(dev, fmt, ...) \ + _BHND_DEVPRINT(dev, BHND_INFO_, fmt, ## __VA_ARGS__) + +#if BHND_LOGGING >= BHND_DEBUG_LEVEL +#define BHND_DEBUG(fmt, ...) \ + _BHND_LOGPRINT(BHND_DEBUG_, fmt, ## __VA_ARGS__) +#define BHND_DEBUG_DEV(dev, fmt, ...) \ + _BHND_DEVPRINT(dev, BHND_DEBUG_, fmt, ## __VA_ARGS__) + +#if BHND_LOGGING >= BHND_TRACE_LEVEL +#define BHND_TRACE(fmt, ...) \ + _BHND_LOGPRINT(BHND_TRACE_, fmt, ## __VA_ARGS__) +#define BHND_TRACE_DEV(dev, fmt, ...) \ + _BHND_DEVPRINT(dev, BHND_TRACE_, fmt, ## __VA_ARGS__) + +#endif /* BHND_LOGGING >= BHND_TRACE_LEVEL */ +#endif /* BHND_LOGGING >= BHND_DEBUG_LEVEL */ +#endif /* BHND_LOGGING >= BHND_INFO_LEVEL */ +#endif /* BHND_LOGGING >= BHND_WARN_LEVEL */ + +/* + * Empty defines without device context + */ +#if !(defined(BHND_WARN)) +#define BHND_WARN(fmt, ...); +#endif + +#if !(defined(BHND_INFO)) +#define BHND_INFO(fmt, ...); +#endif + +#if !(defined(BHND_DEBUG)) +#define BHND_DEBUG(fmt, ...); +#endif + +#if !(defined(BHND_TRACE)) +#define BHND_TRACE(fmt, ...); +#endif + +/* + * Empty defines with device context + */ +#if !(defined(BHND_WARN_DEV)) +#define BHND_WARN_DEV(dev, fmt, ...); +#endif + +#if !(defined(BHND_INFO_DEV)) +#define BHND_INFO_DEV(dev, fmt, ...); +#endif + +#if !(defined(BHND_DEBUG_DEV)) +#define BHND_DEBUG_DEV(dev, fmt, ...); +#endif + +#if !(defined(BHND_TRACE_DEV)) +#define BHND_TRACE_DEV(dev, fmt, ...); +#endif + +#endif /* _BHND_BHND_DEBUG_H_ */