[BACK]Return to dev_verbose.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / dev

File: [cvs.NetBSD.org] / src / sys / dev / dev_verbose.h (download)

Revision 1.2, Fri Nov 13 01:37:19 2015 UTC (2 years, 10 months ago) by christos
Branch: MAIN
CVS Tags: tls-maxphys-base-20171202, prg-localcount2-base3, prg-localcount2-base2, prg-localcount2-base1, prg-localcount2-base, prg-localcount2, phil-wifi-base, phil-wifi, pgoyette-localcount-base, pgoyette-localcount-20170426, pgoyette-localcount-20170320, pgoyette-localcount-20170107, pgoyette-localcount-20161104, pgoyette-localcount-20160806, pgoyette-localcount-20160726, pgoyette-localcount, pgoyette-compat-base, pgoyette-compat-0906, pgoyette-compat-0728, pgoyette-compat-0625, pgoyette-compat-0521, pgoyette-compat-0502, pgoyette-compat-0422, pgoyette-compat-0415, pgoyette-compat-0407, pgoyette-compat-0330, pgoyette-compat-0322, pgoyette-compat-0315, pgoyette-compat, perseant-stdc-iso10646-base, perseant-stdc-iso10646, nick-nhusb-base-20170825, nick-nhusb-base-20170204, nick-nhusb-base-20161204, nick-nhusb-base-20161004, nick-nhusb-base-20160907, nick-nhusb-base-20160529, nick-nhusb-base-20160422, nick-nhusb-base-20160319, nick-nhusb-base-20151226, netbsd-8-base, netbsd-8-0-RELEASE, netbsd-8-0-RC2, netbsd-8-0-RC1, netbsd-8, matt-nb8-mediatek-base, matt-nb8-mediatek, localcount-20160914, jdolecek-ncqfixes-base, jdolecek-ncqfixes, jdolecek-ncq-base, jdolecek-ncq, bouyer-socketcan-base1, bouyer-socketcan-base, bouyer-socketcan, HEAD
Branch point for: tls-maxphys
Changes since 1.1: +3 -3 lines

remove extra semicolons.

/*	$NetBSD: dev_verbose.h,v 1.2 2015/11/13 01:37:19 christos Exp $ */

/*
 * 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.
 * 2. 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.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
 */

#ifndef _DEV_DEV_VERBOSE_H_
#define	_DEV_DEV_VERBOSE_H_

const char *dev_findvendor(char *, size_t, const char *, size_t, 
	const uint16_t *, size_t, uint16_t);
const char *dev_findproduct(char *, size_t, const char *, size_t, 
	const uint16_t *, size_t, uint16_t, uint16_t);

#define DEV_VERBOSE_COMMON_DEFINE(tag)					\
static const char *							\
tag ## _findvendor_real(char *buf, size_t len, uint16_t vendor)		\
{									\
	return dev_findvendor(buf, len, tag ## _words,			\
	    __arraycount(tag ## _words), tag ## _vendors,		\
	    __arraycount(tag ## _vendors), vendor);			\
}									\
									\
static const char *							\
tag ## _findproduct_real(char *buf, size_t len, uint16_t vendor,	\
    uint16_t product)							\
{									\
	return dev_findproduct(buf, len, tag ## _words,			\
	    __arraycount(tag ## _words), tag ## _products,		\
	    __arraycount(tag ## _products), vendor, product);		\
}									\

#ifdef _KERNEL

#define DEV_VERBOSE_MODULE_DEFINE(tag, deps)				\
DEV_VERBOSE_COMMON_DEFINE(tag)						\
extern int tag ## verbose_loaded;					\
									\
static int								\
tag ## verbose_modcmd(modcmd_t cmd, void *arg)				\
{									\
	static const char *(*saved_findvendor)(char *, size_t,		\
	    uint16_t);							\
	static const char *(*saved_findproduct)(char *, size_t,		\
	    uint16_t, uint16_t);					\
									\
	switch (cmd) {							\
	case MODULE_CMD_INIT:						\
		saved_findvendor = tag ## _findvendor;			\
		saved_findproduct = tag ## _findproduct;		\
		tag ## _findvendor = tag ## _findvendor_real;		\
		tag ## _findproduct = tag ## _findproduct_real;		\
		tag ## verbose_loaded = 1;				\
		return 0;						\
	case MODULE_CMD_FINI:						\
		tag ## _findvendor = saved_findvendor;			\
		tag ## _findproduct = saved_findproduct;		\
		tag ## verbose_loaded = 0;				\
		return 0;						\
	default:							\
		return ENOTTY;						\
	}								\
}									\
MODULE(MODULE_CLASS_MISC, tag ## verbose, deps)

#endif /* KERNEL */

#define DEV_VERBOSE_DECLARE(tag)					\
extern const char * (*tag ## _findvendor)(char *, size_t, uint16_t);	\
extern const char * (*tag ## _findproduct)(char *, size_t, uint16_t, uint16_t)

#if defined(_KERNEL)
#define DEV_VERBOSE_DEFINE(tag)						\
int tag ## verbose_loaded = 0;						\
									\
static void								\
tag ## _load_verbose(void)						\
{									\
									\
	if (tag ## verbose_loaded == 0)					\
		module_autoload(# tag "verbose", MODULE_CLASS_MISC);	\
}									\
									\
static const char *							\
tag ## _findvendor_stub(char *buf, size_t len, uint16_t vendor)		\
{									\
									\
	tag ## _load_verbose();						\
	if (tag ## verbose_loaded)					\
		return tag ## _findvendor(buf, len, vendor);		\
	else {								\
		snprintf(buf, len, "vendor %4.4x", vendor);		\
		return NULL;						\
	}								\
}									\
									\
static const char *							\
tag ## _findproduct_stub(char *buf, size_t len, uint16_t vendor,	\
    uint16_t product)							\
{									\
									\
	tag ## _load_verbose();						\
	if (tag ## verbose_loaded)					\
		return tag ## _findproduct(buf, len, vendor, product);	\
	else {								\
		snprintf(buf, len, "product %4.4x", product);		\
		return NULL;						\
	}								\
}									\
									\
const char *(*tag ## _findvendor)(char *, size_t, uint16_t) = 		\
    tag ## _findvendor_stub;						\
const char *(*tag ## _findproduct)(char *, size_t, uint16_t, uint16_t) =\
    tag ## _findproduct_stub						\

#else

#define DEV_VERBOSE_DEFINE(tag)						\
DEV_VERBOSE_COMMON_DEFINE(tag)						\
const char *(*tag ## _findvendor)(char *, size_t, uint16_t) = 		\
    tag ## _findvendor_real;						\
const char *(*tag ## _findproduct)(char *, size_t, uint16_t, uint16_t) =\
    tag ## _findproduct_real						\

#endif /* _KERNEL */

#endif /* _DEV_DEV_VERBOSE_H_ */