Module Name:    src
Committed By:   christos
Date:           Sun Sep 21 14:30:22 UTC 2014

Modified Files:
        src/sys/dev/pci: Makefile.pcidevs azalia.c cs4280.c ehci_pci.c
            ohci_pci.c pci_subr.c pci_verbose.c pci_verbose.h uhci_pci.c
            xhci_pci.c
        src/sys/dev/pci/hdaudio: Makefile.hdaudiodevs hdafg.c hdaudio.c
            hdaudio_verbose.c hdaudio_verbose.h
        src/sys/dev/usb: Makefile.usbdevs usb_subr.c usb_verbose.c
            usb_verbose.h
Added Files:
        src/sys/dev: dev_verbose.c dev_verbose.h devlist2h.awk
Removed Files:
        src/sys/dev/pci: devlist2h.awk
        src/sys/dev/pci/hdaudio: devlist2h.awk
        src/sys/dev/usb: devlist2h.awk

Log Message:
Merge the 3 copies of devlist2h.awk that deal with 16 bit key and value
pairs to the compressed one that matt wrote.


To generate a diff of this commit:
cvs rdiff -u -r0 -r1.1 src/sys/dev/dev_verbose.c src/sys/dev/dev_verbose.h \
    src/sys/dev/devlist2h.awk
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/pci/Makefile.pcidevs
cvs rdiff -u -r1.81 -r1.82 src/sys/dev/pci/azalia.c
cvs rdiff -u -r1.66 -r1.67 src/sys/dev/pci/cs4280.c
cvs rdiff -u -r1.13 -r0 src/sys/dev/pci/devlist2h.awk
cvs rdiff -u -r1.58 -r1.59 src/sys/dev/pci/ehci_pci.c
cvs rdiff -u -r1.52 -r1.53 src/sys/dev/pci/ohci_pci.c
cvs rdiff -u -r1.125 -r1.126 src/sys/dev/pci/pci_subr.c
cvs rdiff -u -r1.8 -r1.9 src/sys/dev/pci/pci_verbose.c
cvs rdiff -u -r1.3 -r1.4 src/sys/dev/pci/pci_verbose.h \
    src/sys/dev/pci/xhci_pci.c
cvs rdiff -u -r1.57 -r1.58 src/sys/dev/pci/uhci_pci.c
cvs rdiff -u -r1.1 -r1.2 src/sys/dev/pci/hdaudio/Makefile.hdaudiodevs \
    src/sys/dev/pci/hdaudio/hdaudio_verbose.c \
    src/sys/dev/pci/hdaudio/hdaudio_verbose.h
cvs rdiff -u -r1.1 -r0 src/sys/dev/pci/hdaudio/devlist2h.awk
cvs rdiff -u -r1.23 -r1.24 src/sys/dev/pci/hdaudio/hdafg.c \
    src/sys/dev/pci/hdaudio/hdaudio.c
cvs rdiff -u -r1.6 -r1.7 src/sys/dev/usb/Makefile.usbdevs \
    src/sys/dev/usb/usb_verbose.c
cvs rdiff -u -r1.14 -r0 src/sys/dev/usb/devlist2h.awk
cvs rdiff -u -r1.197 -r1.198 src/sys/dev/usb/usb_subr.c
cvs rdiff -u -r1.3 -r1.4 src/sys/dev/usb/usb_verbose.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/pci/Makefile.pcidevs
diff -u src/sys/dev/pci/Makefile.pcidevs:1.5 src/sys/dev/pci/Makefile.pcidevs:1.6
--- src/sys/dev/pci/Makefile.pcidevs:1.5	Sun Oct 19 18:05:23 2008
+++ src/sys/dev/pci/Makefile.pcidevs	Sun Sep 21 10:30:22 2014
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.pcidevs,v 1.5 2008/10/19 22:05:23 apb Exp $
+#	$NetBSD: Makefile.pcidevs,v 1.6 2014/09/21 14:30:22 christos Exp $
 #
 # As per t...@netbsd.org, the proper procedure is
 #
@@ -9,6 +9,6 @@
 
 .include <bsd.own.mk>
 
-pcidevs.h pcidevs_data.h: pcidevs devlist2h.awk
+pcidevs.h pcidevs_data.h: ${.CURDIR}/../devlist2h.awk pcidevs
 	/bin/rm -f pcidevs.h pcidevs_data.h
-	${TOOL_AWK} -f devlist2h.awk pcidevs
+	${TOOL_AWK} -f ${.ALLSRC}

Index: src/sys/dev/pci/azalia.c
diff -u src/sys/dev/pci/azalia.c:1.81 src/sys/dev/pci/azalia.c:1.82
--- src/sys/dev/pci/azalia.c:1.81	Sat Mar 29 15:28:24 2014
+++ src/sys/dev/pci/azalia.c	Sun Sep 21 10:30:22 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: azalia.c,v 1.81 2014/03/29 19:28:24 christos Exp $	*/
+/*	$NetBSD: azalia.c,v 1.82 2014/09/21 14:30:22 christos Exp $	*/
 
 /*-
  * Copyright (c) 2005, 2008 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: azalia.c,v 1.81 2014/03/29 19:28:24 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: azalia.c,v 1.82 2014/09/21 14:30:22 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -303,8 +303,8 @@ azalia_pci_attach(device_t parent, devic
 	pcireg_t v;
 	pci_intr_handle_t ih;
 	const char *intrrupt_str;
-	const char *name;
-	const char *vendor;
+	char vendor[PCI_VENDORSTR_LEN];
+	char product[PCI_PRODUCTSTR_LEN];
 	char intrbuf[PCI_INTRSTR_LEN];
 
 	sc->dev = self;
@@ -353,16 +353,11 @@ azalia_pci_attach(device_t parent, devic
 		aprint_error_dev(self, "couldn't establish power handler\n");
 
 	sc->pciid = pa->pa_id;
-	vendor = pci_findvendor(pa->pa_id);
-	name = pci_findproduct(pa->pa_id);
-	if (vendor != NULL && name != NULL) {
-		aprint_normal_dev(self, "host: %s %s (rev. %d)",
-		    vendor, name, PCI_REVISION(pa->pa_class));
-	} else {
-		aprint_normal_dev(self, "host: 0x%4.4x/0x%4.4x (rev. %d)",
-		    PCI_VENDOR(pa->pa_id), PCI_PRODUCT(pa->pa_id),
-		    PCI_REVISION(pa->pa_class));
-	}
+	pci_findvendor(vendor, sizeof(vendor), PCI_VENDOR(pa->pa_id));
+	pci_findproduct(product, sizeof(product), PCI_VENDOR(pa->pa_id),
+	    PCI_PRODUCT(pa->pa_id));
+	aprint_normal_dev(self, "host: %s %s (rev. %d)",
+	    vendor, product, PCI_REVISION(pa->pa_class));
 
 	if (azalia_attach(sc)) {
 		aprint_error_dev(self, "initialization failure\n");

Index: src/sys/dev/pci/cs4280.c
diff -u src/sys/dev/pci/cs4280.c:1.66 src/sys/dev/pci/cs4280.c:1.67
--- src/sys/dev/pci/cs4280.c:1.66	Sat Mar 29 15:28:24 2014
+++ src/sys/dev/pci/cs4280.c	Sun Sep 21 10:30:22 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: cs4280.c,v 1.66 2014/03/29 19:28:24 christos Exp $	*/
+/*	$NetBSD: cs4280.c,v 1.67 2014/09/21 14:30:22 christos Exp $	*/
 
 /*
  * Copyright (c) 1999, 2000 Tatoku Ogaito.  All rights reserved.
@@ -52,7 +52,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cs4280.c,v 1.66 2014/03/29 19:28:24 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cs4280.c,v 1.67 2014/09/21 14:30:22 christos Exp $");
 
 #include "midi.h"
 
@@ -245,6 +245,8 @@ cs4280_attach(device_t parent, device_t 
 	pcireg_t reg;
 	uint32_t mem;
 	int error;
+	chae vendor[PCI_VENDORSTR_LEN];
+	chae product[PCI_PRODUCTSTR_LEN];
 	char intrbuf[PCI_INTRSTR_LEN];
 
 	sc = device_private(self);
@@ -256,19 +258,10 @@ cs4280_attach(device_t parent, device_t 
 
 	cs_card = cs4280_identify_card(pa);
 	if (cs_card != NULL) {
-		vendor = pci_findvendor(cs_card->id);
-		product = pci_findproduct(cs_card->id); 
-		if (vendor == NULL)
-			aprint_normal_dev(sc->sc_dev,
-					  "vendor 0x%04x product 0x%04x\n",
-					  PCI_VENDOR(cs_card->id),
-					  PCI_PRODUCT(cs_card->id));
-		else if (product == NULL)
-			aprint_normal_dev(sc->sc_dev, "%s product 0x%04x\n",
-					  vendor, PCI_PRODUCT(cs_card->id));
-		else
-			aprint_normal_dev(sc->sc_dev, "%s %s\n",
-					  vendor, product);
+		pci_findvendor(vendor, sizeof(vendor), PCI_VENDOR(cs_card->id));
+		pci_findproduct(product, sizeof(product),
+		    PCI_VENDOR(cs_card->id), PCI_PRODUCT(cs_card->id)); 
+		aprint_normal_dev(sc->sc_dev, "%s %s\n", vendor, product);
 		sc->sc_flags = cs_card->flags;
 	} else {
 		sc->sc_flags = CS428X_FLAG_NONE;

Index: src/sys/dev/pci/ehci_pci.c
diff -u src/sys/dev/pci/ehci_pci.c:1.58 src/sys/dev/pci/ehci_pci.c:1.59
--- src/sys/dev/pci/ehci_pci.c:1.58	Sat Mar 29 15:28:24 2014
+++ src/sys/dev/pci/ehci_pci.c	Sun Sep 21 10:30:22 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ehci_pci.c,v 1.58 2014/03/29 19:28:24 christos Exp $	*/
+/*	$NetBSD: ehci_pci.c,v 1.59 2014/09/21 14:30:22 christos Exp $	*/
 
 /*
  * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ehci_pci.c,v 1.58 2014/03/29 19:28:24 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ehci_pci.c,v 1.59 2014/09/21 14:30:22 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -119,7 +119,6 @@ ehci_pci_attach(device_t parent, device_
 	char const *intrstr;
 	pci_intr_handle_t ih;
 	pcireg_t csr;
-	const char *vendor;
 	usbd_status r;
 	int ncomp;
 	struct usb_pci *up;
@@ -204,14 +203,9 @@ ehci_pci_attach(device_t parent, device_
 	}
 
 	/* Figure out vendor for root hub descriptor. */
-	vendor = pci_findvendor(pa->pa_id);
 	sc->sc.sc_id_vendor = PCI_VENDOR(pa->pa_id);
-	if (vendor)
-		strlcpy(sc->sc.sc_vendor, vendor, sizeof(sc->sc.sc_vendor));
-	else
-		snprintf(sc->sc.sc_vendor, sizeof(sc->sc.sc_vendor),
-		    "vendor 0x%04x", PCI_VENDOR(pa->pa_id));
-
+	pci_findvendor(sc->sc.sc_vendor,
+	    sizeof(sc->sc.sc_vendor), sc->sc.sc_id_vendor);
 	/* Enable workaround for dropped interrupts as required */
 	switch (sc->sc.sc_id_vendor) {
 	case PCI_VENDOR_ATI:

Index: src/sys/dev/pci/ohci_pci.c
diff -u src/sys/dev/pci/ohci_pci.c:1.52 src/sys/dev/pci/ohci_pci.c:1.53
--- src/sys/dev/pci/ohci_pci.c:1.52	Sat Mar 29 15:28:25 2014
+++ src/sys/dev/pci/ohci_pci.c	Sun Sep 21 10:30:22 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ohci_pci.c,v 1.52 2014/03/29 19:28:25 christos Exp $	*/
+/*	$NetBSD: ohci_pci.c,v 1.53 2014/09/21 14:30:22 christos Exp $	*/
 
 /*
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ohci_pci.c,v 1.52 2014/03/29 19:28:25 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ohci_pci.c,v 1.53 2014/09/21 14:30:22 christos Exp $");
 
 #include "ehci.h"
 
@@ -90,7 +90,6 @@ ohci_pci_attach(device_t parent, device_
 	pci_intr_handle_t ih;
 	pcireg_t csr;
 	usbd_status r;
-	const char *vendor;
 	char intrbuf[PCI_INTRSTR_LEN];
 
 	sc->sc.sc_dev = self;
@@ -154,14 +153,9 @@ ohci_pci_attach(device_t parent, device_
 	aprint_normal_dev(self, "interrupting at %s\n", intrstr);
 
 	/* Figure out vendor for root hub descriptor. */
-	vendor = pci_findvendor(pa->pa_id);
 	sc->sc.sc_id_vendor = PCI_VENDOR(pa->pa_id);
-	if (vendor)
-		strlcpy(sc->sc.sc_vendor, vendor, sizeof(sc->sc.sc_vendor));
-	else
-		snprintf(sc->sc.sc_vendor, sizeof(sc->sc.sc_vendor),
-		    "vendor 0x%04x", PCI_VENDOR(pa->pa_id));
-
+	pci_findvendor(sc->sc.sc_vendor, sizeof(sc->sc.sc_vendor),
+	    sc->sc.sc_id_vendor);
 	r = ohci_init(&sc->sc);
 	if (r != USBD_NORMAL_COMPLETION) {
 		aprint_error_dev(self, "init failed, error=%d\n", r);

Index: src/sys/dev/pci/pci_subr.c
diff -u src/sys/dev/pci/pci_subr.c:1.125 src/sys/dev/pci/pci_subr.c:1.126
--- src/sys/dev/pci/pci_subr.c:1.125	Fri Sep  5 01:29:16 2014
+++ src/sys/dev/pci/pci_subr.c	Sun Sep 21 10:30:22 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: pci_subr.c,v 1.125 2014/09/05 05:29:16 matt Exp $	*/
+/*	$NetBSD: pci_subr.c,v 1.126 2014/09/21 14:30:22 christos Exp $	*/
 
 /*
  * Copyright (c) 1997 Zubin D. Dittia.  All rights reserved.
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pci_subr.c,v 1.125 2014/09/05 05:29:16 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci_subr.c,v 1.126 2014/09/21 14:30:22 christos Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_pci.h"
@@ -62,6 +62,10 @@ __KERNEL_RCSID(0, "$NetBSD: pci_subr.c,v
 #include <dev/pci/pcireg.h>
 #ifdef _KERNEL
 #include <dev/pci/pcivar.h>
+#else
+#include <dev/pci/pci_verbose.h>
+#include <dev/pci/pcidevs.h>
+#include <dev/pci/pcidevs_data.h>
 #endif
 
 /*
@@ -538,92 +542,30 @@ static const struct pci_class pci_class[
 	    NULL,						},
 };
 
-void pci_load_verbose(void);
-
-#if defined(_KERNEL)
-/*
- * In kernel, these routines are provided and linked via the
- * pciverbose module.
- */
-const char *pci_findvendor_stub(pcireg_t);
-const char *pci_findproduct_stub(pcireg_t);
-
-const char *(*pci_findvendor)(pcireg_t) = pci_findvendor_stub;
-const char *(*pci_findproduct)(pcireg_t) = pci_findproduct_stub;
-const char *pci_unmatched = "";
-#else
-/*
- * For userland we just set the vectors here.
- */
-const char *(*pci_findvendor)(pcireg_t id_reg) = pci_findvendor_real;
-const char *(*pci_findproduct)(pcireg_t id_reg) = pci_findproduct_real;
-const char *pci_unmatched = "unmatched ";
-#endif
-
-int pciverbose_loaded = 0;
-
-#if defined(_KERNEL)
-/*
- * Routine to load the pciverbose kernel module as needed
- */
-void
-pci_load_verbose(void)
-{
-
-	if (pciverbose_loaded == 0)
-		module_autoload("pciverbose", MODULE_CLASS_MISC);
-}
-
-const char *
-pci_findvendor_stub(pcireg_t id_reg)
-{
-
-	pci_load_verbose();
-	if (pciverbose_loaded)
-		return pci_findvendor(id_reg);
-	else
-		return NULL;
-}
-
-const char *
-pci_findproduct_stub(pcireg_t id_reg)
-{
-
-	pci_load_verbose();
-	if (pciverbose_loaded)
-		return pci_findproduct(id_reg);
-	else
-		return NULL;
-}
-#endif
+DEV_VERBOSE_DEFINE(pci);
 
 void
 pci_devinfo(pcireg_t id_reg, pcireg_t class_reg, int showclass, char *cp,
     size_t l)
 {
-	pci_vendor_id_t vendor;
-	pci_product_id_t product;
 	pci_class_t pciclass;
 	pci_subclass_t subclass;
 	pci_interface_t interface;
 	pci_revision_t revision;
-	const char *unmatched = pci_unmatched;
-	const char *vendor_namep, *product_namep;
+	char vendor[PCI_VENDORSTR_LEN], product[PCI_PRODUCTSTR_LEN];
 	const struct pci_class *classp, *subclassp, *interfacep;
 	char *ep;
 
 	ep = cp + l;
 
-	vendor = PCI_VENDOR(id_reg);
-	product = PCI_PRODUCT(id_reg);
-
 	pciclass = PCI_CLASS(class_reg);
 	subclass = PCI_SUBCLASS(class_reg);
 	interface = PCI_INTERFACE(class_reg);
 	revision = PCI_REVISION(class_reg);
 
-	vendor_namep = pci_findvendor(id_reg);
-	product_namep = pci_findproduct(id_reg);
+	pci_findvendor(vendor, sizeof(vendor), PCI_VENDOR(id_reg));
+	pci_findproduct(product, sizeof(product), PCI_VENDOR(id_reg),
+	    PCI_PRODUCT(id_reg));
 
 	classp = pci_class;
 	while (classp->name != NULL) {
@@ -647,15 +589,7 @@ pci_devinfo(pcireg_t id_reg, pcireg_t cl
 		interfacep++;
 	}
 
-	if (vendor_namep == NULL)
-		cp += snprintf(cp, ep - cp, "%svendor 0x%04x product 0x%04x",
-		    unmatched, vendor, product);
-	else if (product_namep != NULL)
-		cp += snprintf(cp, ep - cp, "%s %s", vendor_namep,
-		    product_namep);
-	else
-		cp += snprintf(cp, ep - cp, "%s product 0x%04x",
-		    vendor_namep, product);
+	cp += snprintf(cp, ep - cp, "%s %s", vendor, product);
 	if (showclass) {
 		cp += snprintf(cp, ep - cp, " (");
 		if (classp->name == NULL)
@@ -735,17 +669,20 @@ pci_conf_print_common(
 {
 	const char *name;
 	const struct pci_class *classp, *subclassp;
+	char vendor[PCI_VENDORSTR_LEN];
+	char product[PCI_PRODUCTSTR_LEN];
 	pcireg_t rval;
 	unsigned int num;
 
 	rval = regs[o2i(PCI_ID_REG)];
-	name = pci_findvendor(rval);
+	name = pci_findvendor(vendor, sizeof(vendor), PCI_VENDOR(rval));
 	if (name)
 		printf("    Vendor Name: %s (0x%04x)\n", name,
 		    PCI_VENDOR(rval));
 	else
 		printf("    Vendor ID: 0x%04x\n", PCI_VENDOR(rval));
-	name = pci_findproduct(rval);
+	name = pci_findproduct(product, sizeof(product), PCI_VENDOR(rval),
+	    PCI_PRODUCT(rval));
 	if (name)
 		printf("    Device Name: %s (0x%04x)\n", name,
 		    PCI_PRODUCT(rval));

Index: src/sys/dev/pci/pci_verbose.c
diff -u src/sys/dev/pci/pci_verbose.c:1.8 src/sys/dev/pci/pci_verbose.c:1.9
--- src/sys/dev/pci/pci_verbose.c:1.8	Mon Aug 29 10:47:08 2011
+++ src/sys/dev/pci/pci_verbose.c	Sun Sep 21 10:30:22 2014
@@ -1,10 +1,8 @@
-/*	$NetBSD: pci_verbose.c,v 1.8 2011/08/29 14:47:08 jmcneill Exp $	*/
+/*	$NetBSD: pci_verbose.c,v 1.9 2014/09/21 14:30:22 christos Exp $	*/
 
 /*
- * Copyright (c) 1997 Zubin D. Dittia.  All rights reserved.
- * Copyright (c) 1995, 1996, 1998, 2000
- *	Christopher G. Demetriou.  All rights reserved.
- * Copyright (c) 1994 Charles M. Hannum.  All rights reserved.
+ * Copyright (c) 2014 The NetBSD Foundation, Inc.
+ * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -14,22 +12,18 @@
  * 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.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by Charles M. Hannum.
- * 4. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
  *
- * 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.
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
  */
 
 /*
@@ -40,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pci_verbose.c,v 1.8 2011/08/29 14:47:08 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci_verbose.c,v 1.9 2014/09/21 14:30:22 christos Exp $");
 
 #include <sys/param.h>
 
@@ -48,111 +42,12 @@ __KERNEL_RCSID(0, "$NetBSD: pci_verbose.
 #include <sys/module.h>
 #else
 #include <pci.h>
+#include <string.h>
 #endif
 
 #include <dev/pci/pcireg.h>
 #include <dev/pci/pcidevs.h>
-#ifdef _KERNEL
 #include <dev/pci/pci_verbose.h>
-#endif
-
-/*
- * Descriptions of of known vendors and devices ("products").
- */
-
 #include <dev/pci/pcidevs_data.h>
 
-#ifndef _KERNEL
-#include <string.h>
-#endif
-
-#ifdef _KERNEL
-static int pciverbose_modcmd(modcmd_t, void *);
-
-MODULE(MODULE_CLASS_MISC, pciverbose, "pci");
-
-static int
-pciverbose_modcmd(modcmd_t cmd, void *arg)
-{
-	static const char *(*saved_findvendor)(pcireg_t);
-	static const char *(*saved_findproduct)(pcireg_t);
-	static const char *saved_unmatched;
-
-	switch (cmd) {
-	case MODULE_CMD_INIT:
-		saved_findvendor = pci_findvendor;
-		saved_findproduct = pci_findproduct;
-		saved_unmatched = pci_unmatched;
-		pci_findvendor = pci_findvendor_real;
-		pci_findproduct = pci_findproduct_real;
-		pci_unmatched = "unmatched ";
-		pciverbose_loaded = 1;
-		return 0;
-	case MODULE_CMD_FINI:
-		pci_findvendor = saved_findvendor;
-		pci_findproduct = saved_findproduct;
-		pci_unmatched = saved_unmatched;
-		pciverbose_loaded = 0;
-		return 0;
-	default:
-		return ENOTTY;
-	}
-}
-#endif /* KERNEL */
-
-static const char *
-pci_untokenstring(const uint16_t *token, char *buf, size_t len)
-{
-	char *cp = buf;
-
-	buf[0] = '\0';
-	for (; *token != 0; token++) {
-		cp = buf + strlcat(buf, pci_words + *token, len - 2);
-		cp[0] = ' ';
-		cp[1] = '\0';
-	}
-	*cp = '\0';
-	return cp != buf ? buf : NULL;
-}
-
-const char *
-pci_findvendor_real(pcireg_t id_reg)
-{
-	static char buf[256];
-	pci_vendor_id_t vendor = PCI_VENDOR(id_reg);
-	size_t n;
-
-	for (n = 0; n < __arraycount(pci_vendors); n++) {
-		if (pci_vendors[n] == vendor)
-			return pci_untokenstring(&pci_vendors[n+1], buf,
-			    sizeof(buf));
-
-		/* Skip Tokens */
-		n++;
-		while (pci_vendors[n] != 0 && n < __arraycount(pci_vendors))
-			n++;
-	}
-	return (NULL);
-}
-
-const char *
-pci_findproduct_real(pcireg_t id_reg)
-{
-	static char buf[256];
-	pci_vendor_id_t vendor = PCI_VENDOR(id_reg);
-	pci_product_id_t product = PCI_PRODUCT(id_reg);
-	size_t n;
-
-	for (n = 0; n < __arraycount(pci_products); n++) {
-		if (pci_products[n] == vendor && pci_products[n+1] == product)
-			return pci_untokenstring(&pci_products[n+2], buf,
-			    sizeof(buf));
-
-		/* Skip Tokens */
-		n += 2;
-		while (pci_products[n] != 0 && n < __arraycount(pci_products))
-			n++;
-	}
-	return (NULL);
-}
-
+DEV_VERBOSE_MODULE_DEFINE(pci, "pci")

Index: src/sys/dev/pci/pci_verbose.h
diff -u src/sys/dev/pci/pci_verbose.h:1.3 src/sys/dev/pci/pci_verbose.h:1.4
--- src/sys/dev/pci/pci_verbose.h:1.3	Sun Jun  6 14:58:24 2010
+++ src/sys/dev/pci/pci_verbose.h	Sun Sep 21 10:30:22 2014
@@ -1,8 +1,8 @@
-/*	$NetBSD: pci_verbose.h,v 1.3 2010/06/06 18:58:24 pgoyette Exp $ */
+/*	$NetBSD: pci_verbose.h,v 1.4 2014/09/21 14:30:22 christos Exp $ */
 
 /*
- * Copyright (c) 1996, 1997 Christopher G. Demetriou.  All rights reserved.
- * Copyright (c) 1994 Charles M. Hannum.  All rights reserved.
+ * Copyright (c) 2014 The NetBSD Foundation, Inc.
+ * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -12,39 +12,32 @@
  * 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.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by Charles M. Hannum.
- * 4. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
  *
- * 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.
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
  */
 
 #ifndef _DEV_PCI_PCIVERBOSE_H_
 #define	_DEV_PCI_PCIVERBOSE_H_
 
-/*
- * Misc.
- */
-typedef u_int32_t pcireg_t;		/* configuration space register XXX */
+#include <dev/dev_verbose.h>
 
-const char *pci_findvendor_real(pcireg_t);
-const char *pci_findproduct_real(pcireg_t);
+#ifdef _KERNEL
+typedef uint32_t pcireg_t;		/* configuration space register XXX */
+#endif
 
-extern int pciverbose_loaded;
+#define	PCI_VENDORSTR_LEN	64
+#define	PCI_PRODUCTSTR_LEN	64
 
-extern const char *(*pci_findvendor)(pcireg_t);
-extern const char *(*pci_findproduct)(pcireg_t);
-extern const char *pci_unmatched;
+DEV_VERBOSE_DECLARE(pci);
 
 #endif /* _DEV_PCI_PCIVERBOSE_H_ */
Index: src/sys/dev/pci/xhci_pci.c
diff -u src/sys/dev/pci/xhci_pci.c:1.3 src/sys/dev/pci/xhci_pci.c:1.4
--- src/sys/dev/pci/xhci_pci.c:1.3	Sat Mar 29 15:28:25 2014
+++ src/sys/dev/pci/xhci_pci.c	Sun Sep 21 10:30:22 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: xhci_pci.c,v 1.3 2014/03/29 19:28:25 christos Exp $	*/
+/*	$NetBSD: xhci_pci.c,v 1.4 2014/09/21 14:30:22 christos Exp $	*/
 
 /*
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xhci_pci.c,v 1.3 2014/03/29 19:28:25 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xhci_pci.c,v 1.4 2014/09/21 14:30:22 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -156,13 +156,9 @@ xhci_pci_attach(device_t parent, device_
 
 #if 0
 	/* Figure out vendor for root hub descriptor. */
-	vendor = pci_findvendor(pa->pa_id);
 	sc->sc_id_vendor = PCI_VENDOR(pa->pa_id);
-	if (vendor)
-		strlcpy(sc->sc_vendor, vendor, sizeof(sc->sc_vendor));
-	else
-		snprintf(sc->sc_vendor, sizeof(sc->sc_vendor),
-		    "vendor 0x%04x", PCI_VENDOR(pa->pa_id));
+	pci_findvendor(sc->sc_vendor, sizeof(sc->sc_vendor),
+	    sc->sc_id_vendor);
 #endif
 
 	err = xhci_init(sc);

Index: src/sys/dev/pci/uhci_pci.c
diff -u src/sys/dev/pci/uhci_pci.c:1.57 src/sys/dev/pci/uhci_pci.c:1.58
--- src/sys/dev/pci/uhci_pci.c:1.57	Sat Mar 29 15:28:25 2014
+++ src/sys/dev/pci/uhci_pci.c	Sun Sep 21 10:30:22 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: uhci_pci.c,v 1.57 2014/03/29 19:28:25 christos Exp $	*/
+/*	$NetBSD: uhci_pci.c,v 1.58 2014/09/21 14:30:22 christos Exp $	*/
 
 /*
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uhci_pci.c,v 1.57 2014/03/29 19:28:25 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uhci_pci.c,v 1.58 2014/09/21 14:30:22 christos Exp $");
 
 #include "ehci.h"
 
@@ -93,7 +93,6 @@ uhci_pci_attach(device_t parent, device_
 	char const *intrstr;
 	pci_intr_handle_t ih;
 	pcireg_t csr;
-	const char *vendor;
 	usbd_status r;
 	int s;
 	char intrbuf[PCI_INTRSTR_LEN];
@@ -171,14 +170,9 @@ uhci_pci_attach(device_t parent, device_
 	}
 
 	/* Figure out vendor for root hub descriptor. */
-	vendor = pci_findvendor(pa->pa_id);
 	sc->sc.sc_id_vendor = PCI_VENDOR(pa->pa_id);
-	if (vendor)
-		strlcpy(sc->sc.sc_vendor, vendor, sizeof(sc->sc.sc_vendor));
-	else
-		snprintf(sc->sc.sc_vendor, sizeof(sc->sc.sc_vendor),
-		    "vendor 0x%04x", PCI_VENDOR(pa->pa_id));
-
+	pci_findvendor(sc->sc.sc_vendor, sizeof(sc->sc.sc_vendor),
+	    sc->sc.sc_id_vendor);
 	r = uhci_init(&sc->sc);
 	if (r != USBD_NORMAL_COMPLETION) {
 		aprint_error_dev(self, "init failed, error=%d\n", r);

Index: src/sys/dev/pci/hdaudio/Makefile.hdaudiodevs
diff -u src/sys/dev/pci/hdaudio/Makefile.hdaudiodevs:1.1 src/sys/dev/pci/hdaudio/Makefile.hdaudiodevs:1.2
--- src/sys/dev/pci/hdaudio/Makefile.hdaudiodevs:1.1	Fri Sep 19 13:23:35 2014
+++ src/sys/dev/pci/hdaudio/Makefile.hdaudiodevs	Sun Sep 21 10:30:22 2014
@@ -1,18 +1,14 @@
-#	$NetBSD: Makefile.hdaudiodevs,v 1.1 2014/09/19 17:23:35 christos Exp $
-
-#	The header files depend on the correct version of hdaudiodevs.
+#	$NetBSD: Makefile.hdaudiodevs,v 1.2 2014/09/21 14:30:22 christos Exp $
+#
+# As per t...@netbsd.org, the proper procedure is
 #
-#	Thus, the procedure is:
-#	  1) change hdaudiodevs
-#	  2) commit hdaudiodevs
-#	  3) _then_ generate header files
-#	  4) commit them
+# 1.) Change "src/sys/dev/hdaudio/hdaudiodevs".
+# 2.) Commit "src/sys/dev/hdaudio/hdaudiodevs".
+# 3.) Execute "make -f Makefile.hdaudiodevs" in "src/sys/dev/pci/hdaudio".
+# 4.) Commit "src/sys/dev/hdaudio/hdaudiodevs.h" and "src/sys/dev/pci/hdaudio/hdaudiodevs_data.h".
 
 .include <bsd.own.mk>
 
-UNAME=	uname
-RM=	rm
-
-hdaudiodevs.h hdaudiodevs_data.h: hdaudiodevs devlist2h.awk
-	${RM} -f hdaudiodevs.h hdaudiodevs_data.h
-	${TOOL_AWK} -v os=`${UNAME} -s` -f devlist2h.awk hdaudiodevs
+hdaudiodevs.h hdaudiodevs_data.h: ${.CURDIR}/../../devlist2h.awk hdaudiodevs
+	/bin/rm -f hdaudiodevs.h hdaudiodevs_data.h
+	${TOOL_AWK} -f ${.ALLSRC}
Index: src/sys/dev/pci/hdaudio/hdaudio_verbose.c
diff -u src/sys/dev/pci/hdaudio/hdaudio_verbose.c:1.1 src/sys/dev/pci/hdaudio/hdaudio_verbose.c:1.2
--- src/sys/dev/pci/hdaudio/hdaudio_verbose.c:1.1	Fri Sep 19 13:23:35 2014
+++ src/sys/dev/pci/hdaudio/hdaudio_verbose.c	Sun Sep 21 10:30:22 2014
@@ -1,13 +1,9 @@
-/*	$NetBSD: hdaudio_verbose.c,v 1.1 2014/09/19 17:23:35 christos Exp $ */
+/*	$NetBSD: hdaudio_verbose.c,v 1.2 2014/09/21 14:30:22 christos Exp $ */
 
 /*
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Lennart Augustsson (lenn...@augustsson.net) at
- * Carlstedt Research & Technology.
- *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -31,83 +27,13 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hdaudio_verbose.c,v 1.1 2014/09/19 17:23:35 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hdaudio_verbose.c,v 1.2 2014/09/21 14:30:22 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/module.h>
 
 #include <dev/pci/hdaudio/hdaudio_verbose.h>
-
-/*
- * Descriptions of known vendors and devices ("products").
- */
-struct hdaudio_vendor {
-	hdaudio_vendor_id_t		vendor;
-	const char		*vendorname;
-};
-struct hdaudio_product {
-	hdaudio_vendor_id_t		vendor;
-	hdaudio_product_id_t	product;
-	const char		*productname;
-};
-
 #include <dev/pci/hdaudio/hdaudiodevs.h>
 #include <dev/pci/hdaudio/hdaudiodevs_data.h>
 
-void get_hdaudio_vendor_real(char *, size_t, hdaudio_vendor_id_t);
-void get_hdaudio_product_real(char *, size_t, hdaudio_vendor_id_t, hdaudio_product_id_t);
-
-MODULE(MODULE_CLASS_MISC, hdaudioverbose, NULL);
-  
-static int
-hdaudioverbose_modcmd(modcmd_t cmd, void *arg)
-{
-	static void (*saved_hdaudio_vendor)(char *, size_t, hdaudio_vendor_id_t);
-	static void (*saved_hdaudio_product)(char *, size_t, hdaudio_vendor_id_t,
-		hdaudio_product_id_t);
-
-	switch (cmd) {
-	case MODULE_CMD_INIT:
-		saved_hdaudio_vendor = get_hdaudio_vendor;
-		saved_hdaudio_product = get_hdaudio_product;
-		get_hdaudio_vendor = get_hdaudio_vendor_real;
-		get_hdaudio_product = get_hdaudio_product_real;
-		hdaudio_verbose_loaded = 1;
-		return 0;
-	case MODULE_CMD_FINI:
-		get_hdaudio_vendor = saved_hdaudio_vendor;
-		get_hdaudio_product = saved_hdaudio_product;
-		hdaudio_verbose_loaded = 0;
-		return 0;
-	default:
-		return ENOTTY;  
-	}
-}
-
-void get_hdaudio_vendor_real(char *v, size_t vl, hdaudio_vendor_id_t v_id)
-{
-	int n;
-
-	/* There is no need for strlcpy below. */
-	for (n = 0; n < hdaudio_nvendors; n++)
-		if (hdaudio_vendors[n].vendor == v_id) {
-			strlcpy(v, hdaudio_vendors[n].vendorname, vl);
-			return;
-		}
-	snprintf(v, vl, "vendor 0x%.x", v_id);
-}
-
-void get_hdaudio_product_real(char *p, size_t pl, hdaudio_vendor_id_t v_id,
-    hdaudio_product_id_t p_id)
-{
-	int n;
-
-	/* There is no need for strlcpy below. */
-	for (n = 0; n < hdaudio_nproducts; n++)
-		if (hdaudio_products[n].vendor == v_id &&
-		    hdaudio_products[n].product == p_id) {
-			strlcpy(p, hdaudio_products[n].productname, pl);
-			return;
-		}
-	snprintf(p, pl, "product 0x%.x", v_id);
-}
+DEV_VERBOSE_MODULE_DEFINE(hdaudio, NULL)
Index: src/sys/dev/pci/hdaudio/hdaudio_verbose.h
diff -u src/sys/dev/pci/hdaudio/hdaudio_verbose.h:1.1 src/sys/dev/pci/hdaudio/hdaudio_verbose.h:1.2
--- src/sys/dev/pci/hdaudio/hdaudio_verbose.h:1.1	Fri Sep 19 13:23:35 2014
+++ src/sys/dev/pci/hdaudio/hdaudio_verbose.h	Sun Sep 21 10:30:22 2014
@@ -1,13 +1,9 @@
-/*      $NetBSD: hdaudio_verbose.h,v 1.1 2014/09/19 17:23:35 christos Exp $ */
+/*      $NetBSD: hdaudio_verbose.h,v 1.2 2014/09/21 14:30:22 christos Exp $ */
 
 /*
- * Copyright (c) 1998, 2004 The NetBSD Foundation, Inc.
+ * Copyright (c) 2014 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Lennart Augustsson (lenn...@augustsson.net) at
- * Carlstedt Research & Technology.
- *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -33,13 +29,8 @@
 #ifndef _DEV_PCI_HDAUDIO_HDAUDIO_VERBOSE_H_
 #define _DEV_PCI_HDAUDIO_HDAUDIO_VERBOSE_H_
 
-typedef u_int16_t hdaudio_vendor_id_t;
-typedef u_int16_t hdaudio_product_id_t;
-
-extern void (*get_hdaudio_vendor)(char *, size_t, hdaudio_vendor_id_t);
-extern void (*get_hdaudio_product)(char *, size_t, hdaudio_vendor_id_t,
-    hdaudio_product_id_t);
+#include <dev/dev_verbose.h>
 
-extern int hdaudio_verbose_loaded;
+DEV_VERBOSE_DECLARE(hdaudio);
 
 #endif /* _DEV_PCI_HDAUDIO_HDAUDIO_VERBOSE_H_ */

Index: src/sys/dev/pci/hdaudio/hdafg.c
diff -u src/sys/dev/pci/hdaudio/hdafg.c:1.23 src/sys/dev/pci/hdaudio/hdafg.c:1.24
--- src/sys/dev/pci/hdaudio/hdafg.c:1.23	Sun Sep 21 06:41:22 2014
+++ src/sys/dev/pci/hdaudio/hdafg.c	Sun Sep 21 10:30:22 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: hdafg.c,v 1.23 2014/09/21 10:41:22 nat Exp $ */
+/* $NetBSD: hdafg.c,v 1.24 2014/09/21 14:30:22 christos Exp $ */
 
 /*
  * Copyright (c) 2009 Precedence Technologies Ltd <supp...@precedence.co.uk>
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hdafg.c,v 1.23 2014/09/21 10:41:22 nat Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hdafg.c,v 1.24 2014/09/21 14:30:22 christos Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -3614,8 +3614,8 @@ hdafg_attach(device_t parent, device_t s
 
 	prop_dictionary_get_uint16(args, "vendor-id", &sc->sc_vendor);
 	prop_dictionary_get_uint16(args, "product-id", &sc->sc_product);
-	get_hdaudio_vendor(vendor, sizeof(vendor), sc->sc_vendor);
-	get_hdaudio_product(product, sizeof(product), sc->sc_vendor,
+	hdaudio_findvendor(vendor, sizeof(vendor), sc->sc_vendor);
+	hdaudio_findproduct(product, sizeof(product), sc->sc_vendor,
 	    sc->sc_product);
 	hda_print1(sc, ": %s %s%s\n", vendor, product,
 	    sc->sc_config ? " (custom configuration)" : "");
@@ -3969,9 +3969,9 @@ hdafg_getdev(void *opaque, struct audio_
 	struct hdaudio_audiodev *ad = opaque;
 	struct hdafg_softc *sc = ad->ad_sc;
 
-	get_hdaudio_vendor(audiodev->name, sizeof(audiodev->name),
+	hdaudio_findvendor(audiodev->name, sizeof(audiodev->name),
 	    sc->sc_vendor);
-	get_hdaudio_product(audiodev->version, sizeof(audiodev->version),
+	hdaudio_findproduct(audiodev->version, sizeof(audiodev->version),
 	    sc->sc_vendor, sc->sc_product);
 	snprintf(audiodev->config, sizeof(audiodev->config) - 1,
 	    "%02Xh", sc->sc_nid);
Index: src/sys/dev/pci/hdaudio/hdaudio.c
diff -u src/sys/dev/pci/hdaudio/hdaudio.c:1.23 src/sys/dev/pci/hdaudio/hdaudio.c:1.24
--- src/sys/dev/pci/hdaudio/hdaudio.c:1.23	Fri Sep 19 13:23:35 2014
+++ src/sys/dev/pci/hdaudio/hdaudio.c	Sun Sep 21 10:30:22 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: hdaudio.c,v 1.23 2014/09/19 17:23:35 christos Exp $ */
+/* $NetBSD: hdaudio.c,v 1.24 2014/09/21 14:30:22 christos Exp $ */
 
 /*
  * Copyright (c) 2009 Precedence Technologies Ltd <supp...@precedence.co.uk>
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hdaudio.c,v 1.23 2014/09/19 17:23:35 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hdaudio.c,v 1.24 2014/09/21 14:30:22 christos Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -1631,43 +1631,4 @@ hdaudio_modcmd(modcmd_t cmd, void *opaqu
 	}
 }
 
-void hdaudio_load_verbose(void);
-
-void get_hdaudio_vendor_stub(char *, size_t, hdaudio_vendor_id_t);
-void get_hdaudio_product_stub(char *, size_t, hdaudio_vendor_id_t,
-    hdaudio_product_id_t);
-
-void (*get_hdaudio_vendor)(char *, size_t, hdaudio_vendor_id_t) =
-    get_hdaudio_vendor_stub;
-void (*get_hdaudio_product)(char *, size_t, hdaudio_vendor_id_t,
-    hdaudio_product_id_t) = get_hdaudio_product_stub;
-
-int hdaudio_verbose_loaded = 0;
-
-/*
- * Load the hdaudioverbose module
- */
-void hdaudio_load_verbose(void)
-{
-	if (hdaudio_verbose_loaded == 0)
-		module_autoload("hdaudioverbose", MODULE_CLASS_MISC);
-}
-
-void get_hdaudio_vendor_stub(char *v, size_t l, hdaudio_vendor_id_t v_id)
-{
-	hdaudio_load_verbose();
-	if (hdaudio_verbose_loaded)
-		get_hdaudio_vendor(v, l, v_id);
-	else
-		snprintf(v, l, "vendor 0x%.4x", v_id);
-}
-
-void get_hdaudio_product_stub(char *p, size_t l, hdaudio_vendor_id_t v_id,
-    hdaudio_product_id_t p_id)
-{
-	hdaudio_load_verbose();
-	if (hdaudio_verbose_loaded)
-		get_hdaudio_product(p, l, v_id, p_id);
-	else
-		snprintf(p, l, "product 0x%.4x", p_id);
-}
+DEV_VERBOSE_DEFINE(hdaudio);

Index: src/sys/dev/usb/Makefile.usbdevs
diff -u src/sys/dev/usb/Makefile.usbdevs:1.6 src/sys/dev/usb/Makefile.usbdevs:1.7
--- src/sys/dev/usb/Makefile.usbdevs:1.6	Mon Oct 12 18:28:47 2009
+++ src/sys/dev/usb/Makefile.usbdevs	Sun Sep 21 10:30:22 2014
@@ -1,18 +1,14 @@
-#	$NetBSD: Makefile.usbdevs,v 1.6 2009/10/12 22:28:47 wiz Exp $
-
-#	The header files depend on the correct version of usbdevs.
+#	$NetBSD: Makefile.usbdevs,v 1.7 2014/09/21 14:30:22 christos Exp $
+#
+# As per t...@netbsd.org, the proper procedure is
 #
-#	Thus, the procedure is:
-#	  1) change usbdevs
-#	  2) commit usbdevs
-#	  3) _then_ generate header files
-#	  4) commit them
+# 1.) Change "src/sys/dev/usb/usbdevs".
+# 2.) Commit "src/sys/dev/usb/usbdevs".
+# 3.) Execute "make -f Makefile.usbdevs" in "src/sys/dev/usb".
+# 4.) Commit "src/sys/dev/usb/usbdevs.h" and "src/sys/dev/usb/usbdevs_data.h".
 
 .include <bsd.own.mk>
 
-UNAME=	uname
-RM=	rm
-
-usbdevs.h usbdevs_data.h: usbdevs devlist2h.awk
-	${RM} -f usbdevs.h usbdevs_data.h
-	${TOOL_AWK} -v os=`${UNAME} -s` -f devlist2h.awk usbdevs
+usbdevs.h usbdevs_data.h: ${.CURDIR}/../devlist2h.awk usbdevs
+	/bin/rm -f usbdevs.h usbdevs_data.h
+	${TOOL_AWK} -f ${.ALLSRC}
Index: src/sys/dev/usb/usb_verbose.c
diff -u src/sys/dev/usb/usb_verbose.c:1.6 src/sys/dev/usb/usb_verbose.c:1.7
--- src/sys/dev/usb/usb_verbose.c:1.6	Thu Dec 22 19:51:48 2011
+++ src/sys/dev/usb/usb_verbose.c	Sun Sep 21 10:30:22 2014
@@ -1,14 +1,9 @@
-/*	$NetBSD: usb_verbose.c,v 1.6 2011/12/23 00:51:48 jakllsch Exp $ */
-/*	$FreeBSD: src/sys/dev/usb/usb_subr.c,v 1.18 1999/11/17 22:33:47 n_hibma Exp $	*/
+/*	$NetBSD: usb_verbose.c,v 1.7 2014/09/21 14:30:22 christos Exp $ */
 
 /*
- * Copyright (c) 1998, 2004 The NetBSD Foundation, Inc.
+ * Copyright (c) 2014 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Lennart Augustsson (lenn...@augustsson.net) at
- * Carlstedt Research & Technology.
- *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -32,82 +27,14 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usb_verbose.c,v 1.6 2011/12/23 00:51:48 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usb_verbose.c,v 1.7 2014/09/21 14:30:22 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/module.h>
 
 #include <dev/usb/usb.h>
 #include <dev/usb/usbdevs.h>
-#include <dev/usb/usb_verbose.h>
-
-/*
- * Descriptions of known vendors and devices ("products").
- */
-struct usb_vendor {
-	usb_vendor_id_t		vendor;
-	const char		*vendorname;
-};
-struct usb_product {
-	usb_vendor_id_t		vendor;
-	usb_product_id_t	product;
-	const char		*productname;
-};
-
 #include <dev/usb/usbdevs_data.h>
+#include <dev/usb/usb_verbose.h>
 
-void get_usb_vendor_real(char *, size_t, usb_vendor_id_t);
-void get_usb_product_real(char *, size_t, usb_vendor_id_t, usb_product_id_t);
-
-MODULE(MODULE_CLASS_MISC, usbverbose, NULL);
-  
-static int
-usbverbose_modcmd(modcmd_t cmd, void *arg)
-{
-	static void (*saved_usb_vendor)(char *, size_t, usb_vendor_id_t);
-	static void (*saved_usb_product)(char *, size_t, usb_vendor_id_t,
-		usb_product_id_t);
-
-	switch (cmd) {
-	case MODULE_CMD_INIT:
-		saved_usb_vendor = get_usb_vendor;
-		saved_usb_product = get_usb_product;
-		get_usb_vendor = get_usb_vendor_real;
-		get_usb_product = get_usb_product_real;
-		usb_verbose_loaded = 1;
-		return 0;
-	case MODULE_CMD_FINI:
-		get_usb_vendor = saved_usb_vendor;
-		get_usb_product = saved_usb_product;
-		usb_verbose_loaded = 0;
-		return 0;
-	default:
-		return ENOTTY;  
-	}
-}
-
-void get_usb_vendor_real(char *v, size_t vl, usb_vendor_id_t v_id)
-{
-	int n;
-
-	/* There is no need for strlcpy below. */
-	for (n = 0; n < usb_nvendors; n++)
-		if (usb_vendors[n].vendor == v_id) {
-			strlcpy(v, usb_vendors[n].vendorname, vl);
-			break;
-		}
-}
-
-void get_usb_product_real(char *p, size_t pl, usb_vendor_id_t v_id,
-    usb_product_id_t p_id)
-{
-	int n;
-
-	/* There is no need for strlcpy below. */
-	for (n = 0; n < usb_nproducts; n++)
-		if (usb_products[n].vendor == v_id &&
-		    usb_products[n].product == p_id) {
-			strlcpy(p, usb_products[n].productname, pl);
-			break;
-		}
-}
+DEV_VERBOSE_MODULE_DEFINE(usb, NULL)

Index: src/sys/dev/usb/usb_subr.c
diff -u src/sys/dev/usb/usb_subr.c:1.197 src/sys/dev/usb/usb_subr.c:1.198
--- src/sys/dev/usb/usb_subr.c:1.197	Fri Sep 12 12:40:38 2014
+++ src/sys/dev/usb/usb_subr.c	Sun Sep 21 10:30:22 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: usb_subr.c,v 1.197 2014/09/12 16:40:38 skrll Exp $	*/
+/*	$NetBSD: usb_subr.c,v 1.198 2014/09/21 14:30:22 christos Exp $	*/
 /*	$FreeBSD: src/sys/dev/usb/usb_subr.c,v 1.18 1999/11/17 22:33:47 n_hibma Exp $	*/
 
 /*
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usb_subr.c,v 1.197 2014/09/12 16:40:38 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usb_subr.c,v 1.198 2014/09/21 14:30:22 christos Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -109,40 +109,7 @@ Static const char * const usbd_error_str
 	"XXX",
 };
 
-void usb_load_verbose(void);
-
-void get_usb_vendor_stub(char *, size_t, usb_vendor_id_t);
-void get_usb_product_stub(char *, size_t, usb_vendor_id_t, usb_product_id_t);
-
-void (*get_usb_vendor)(char *, size_t, usb_vendor_id_t) = get_usb_vendor_stub;
-void (*get_usb_product)(char *, size_t, usb_vendor_id_t, usb_product_id_t) =
-	get_usb_product_stub;
-
-int usb_verbose_loaded = 0;
-
-/*
- * Load the usbverbose module
- */
-void usb_load_verbose(void)
-{
-	if (usb_verbose_loaded == 0)
-		module_autoload("usbverbose", MODULE_CLASS_MISC);
-}
-
-void get_usb_vendor_stub(char *v, size_t l, usb_vendor_id_t v_id)
-{
-	usb_load_verbose();
-	if (usb_verbose_loaded)
-		get_usb_vendor(v, l, v_id);
-}
-
-void get_usb_product_stub(char *p, size_t l, usb_vendor_id_t v_id,
-    usb_product_id_t p_id)
-{
-	usb_load_verbose();
-	if (usb_verbose_loaded)
-		get_usb_product(p, l, v_id, p_id);
-}
+DEV_VERBOSE_DEFINE(usb);
 
 const char *
 usbd_errstr(usbd_status err)
@@ -226,15 +193,10 @@ usbd_devinfo_vp(usbd_device_handle dev, 
 			usbd_trim_spaces(p);
 	}
 	if (v[0] == '\0')
-		get_usb_vendor(v, vl, UGETW(udd->idVendor));
+		usb_findvendor(v, vl, UGETW(udd->idVendor));
 	if (p[0] == '\0')
-		get_usb_product(p, pl, UGETW(udd->idVendor),
+		usb_findproduct(p, pl, UGETW(udd->idVendor),
 		    UGETW(udd->idProduct));
-
-	if (v[0] == '\0')
-		snprintf(v, vl, "vendor 0x%04x", UGETW(udd->idVendor));
-	if (p[0] == '\0')
-		snprintf(p, pl, "product 0x%04x", UGETW(udd->idProduct));
 }
 
 int

Index: src/sys/dev/usb/usb_verbose.h
diff -u src/sys/dev/usb/usb_verbose.h:1.3 src/sys/dev/usb/usb_verbose.h:1.4
--- src/sys/dev/usb/usb_verbose.h:1.3	Sat Aug  7 17:09:48 2010
+++ src/sys/dev/usb/usb_verbose.h	Sun Sep 21 10:30:22 2014
@@ -1,13 +1,9 @@
-/*      $NetBSD: usb_verbose.h,v 1.3 2010/08/07 21:09:48 christos Exp $ */
+/*      $NetBSD: usb_verbose.h,v 1.4 2014/09/21 14:30:22 christos Exp $ */
 
 /*
- * Copyright (c) 1998, 2004 The NetBSD Foundation, Inc.
+ * Copyright (c) 2014 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Lennart Augustsson (lenn...@augustsson.net) at
- * Carlstedt Research & Technology.
- *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -33,13 +29,8 @@
 #ifndef _DEV_USB_USBVERBOSE_H_
 #define _DEV_USB_USBVERBOSE_H_
 
-typedef u_int16_t usb_vendor_id_t;
-typedef u_int16_t usb_product_id_t;
-
-extern void (*get_usb_vendor)(char *, size_t, usb_vendor_id_t);
-extern void (*get_usb_product)(char *, size_t, usb_vendor_id_t,
-    usb_product_id_t);
+#include <dev/dev_verbose.h>
 
-extern int usb_verbose_loaded;
+DEV_VERBOSE_DECLARE(usb);
 
 #endif /* _DEV_USB_USBVERBOSE_H_ */

Added files:

Index: src/sys/dev/dev_verbose.c
diff -u /dev/null src/sys/dev/dev_verbose.c:1.1
--- /dev/null	Sun Sep 21 10:30:22 2014
+++ src/sys/dev/dev_verbose.c	Sun Sep 21 10:30:22 2014
@@ -0,0 +1,94 @@
+/*	$NetBSD: dev_verbose.c,v 1.1 2014/09/21 14:30:22 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.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: dev_verbose.c,v 1.1 2014/09/21 14:30:22 christos Exp $");
+
+#include <sys/param.h>
+
+#ifdef _KERNEL
+#include <sys/systm.h>
+#else
+#include <stdio.h>
+#include <string.h>
+#endif
+
+#include <dev/dev_verbose.h>
+
+static const char *
+dev_untokenstring(const char *words, const uint16_t *token, char *buf,
+    size_t len)
+{
+	char *cp = buf;
+
+	buf[0] = '\0';
+	for (; *token != 0; token++) {
+		cp = buf + strlcat(buf, words + *token, len - 2);
+		cp[0] = ' ';
+		cp[1] = '\0';
+	}
+	*cp = '\0';
+	return cp != buf ? buf : NULL;
+}
+
+const char *
+dev_findvendor(char *buf, size_t len, const char *words, size_t nwords,
+    const uint16_t *vendors, size_t nvendors, uint16_t vendor)
+{
+	size_t n;
+
+	for (n = 0; n < nvendors; n++) {
+		if (vendors[n] == vendor)
+			return dev_untokenstring(words, &vendors[n + 1],
+			    buf, len);
+
+		/* Skip Tokens */
+		n++;
+		while (vendors[n] != 0 && n < nvendors)
+			n++;
+	}
+	snprintf(buf, len, "vendor %4.4x", vendor);
+	return NULL;
+}
+
+const char *
+dev_findproduct(char *buf, size_t len, const char *words, size_t nwords,
+    const uint16_t *products, size_t nproducts, uint16_t vendor,
+    uint16_t product)
+{
+	size_t n;
+
+	for (n = 0; n < nproducts; n++) {
+		if (products[n] == vendor && products[n + 1] == product)
+			return dev_untokenstring(words, &products[n + 2],
+			    buf, len);
+
+		/* Skip Tokens */
+		n += 2;
+		while (products[n] != 0 && n < nproducts)
+			n++;
+	}
+	snprintf(buf, len, "product %4.4x", product);
+	return NULL;
+}
Index: src/sys/dev/dev_verbose.h
diff -u /dev/null src/sys/dev/dev_verbose.h:1.1
--- /dev/null	Sun Sep 21 10:30:22 2014
+++ src/sys/dev/dev_verbose.h	Sun Sep 21 10:30:22 2014
@@ -0,0 +1,145 @@
+/*	$NetBSD: dev_verbose.h,v 1.1 2014/09/21 14:30:22 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_ */
Index: src/sys/dev/devlist2h.awk
diff -u /dev/null src/sys/dev/devlist2h.awk:1.1
--- /dev/null	Sun Sep 21 10:30:22 2014
+++ src/sys/dev/devlist2h.awk	Sun Sep 21 10:30:22 2014
@@ -0,0 +1,245 @@
+#! /usr/bin/awk -f
+#	$NetBSD: devlist2h.awk,v 1.1 2014/09/21 14:30:22 christos Exp $
+#
+# Copyright (c) 1995, 1996 Christopher G. Demetriou
+# 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.
+# 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.
+# 3. All advertising materials mentioning features or use of this software
+#    must display the following acknowledgement:
+#      This product includes software developed by Christopher G. Demetriou.
+# 4. The name of the author may not be used to endorse or promote products
+#    derived from this software without specific prior written permission
+#
+# 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.
+#
+NR == 1 {
+	nproducts = nvendors = blanklines = 0
+	nchars = 1
+	dfile= FILENAME "_data.h"
+	hfile= FILENAME ".h"
+	prefix = FILENAME
+	gsub("devs", "", prefix)
+	PREFIX = toupper(prefix)
+	VERSION = $0
+	gsub("\\$", "", VERSION)
+	gsub(/ $/, "", VERSION)
+
+	printf("/*\t$NetBSD" "$\t*/\n\n") > dfile
+	printf("/*\n") > dfile
+	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
+	    > dfile
+	printf(" *\n") > dfile
+	printf(" * generated from:\n") > dfile
+	printf(" *\t%s\n", VERSION) > dfile
+	printf(" */\n") > dfile
+
+	printf("/*\t$NetBSD" "$\t*/\n\n") > hfile
+	printf("/*\n") > hfile
+	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
+	    > hfile
+	printf(" *\n") > hfile
+	printf(" * generated from:\n") > hfile
+	printf(" *\t%s\n", VERSION) > hfile
+	printf(" */\n") > hfile
+
+	next
+}
+NF > 0 && $1 == "vendor" {
+	nvendors++
+
+	vendorindex[$2] = nvendors;		# record index for this name, for later.
+	vendors[nvendors, 1] = $2;		# name
+	vendors[nvendors, 2] = $3;		# id
+	printf("#define\t%s_VENDOR_%s\t%s", PREFIX, vendors[nvendors, 1],
+	    vendors[nvendors, 2]) > hfile
+
+	i = 3; f = 4;
+
+	# comments
+	ocomment = oparen = 0
+	if (f <= NF) {
+		printf("\t\t/* ") > hfile
+		ocomment = 1;
+	}
+	while (f <= NF) {
+		if ($f == "#") {
+			printf("(") > hfile
+			oparen = 1
+			f++
+			continue
+		}
+		if (oparen) {
+			printf("%s", $f) > hfile
+			if (f < NF)
+				printf(" ") > hfile
+			f++
+			continue
+		}
+		vendors[nvendors, i] = $f
+		if (words[$f, 1] == 0) {
+			l = length($f);
+			parts = split($f, junk, "\\");
+			l = l - (parts - 1);
+			nwords++;
+			words[$f, 1] = nwords;
+			words[$f, 2] = l;
+			wordlist[nwords, 1] = $f;
+			wordlist[nwords, 3] = nchars;
+			nchars = nchars + l + 1;
+		}
+		wordlist[words[$f, 1], 2]++;
+		vendors[nvendors, i] = words[$f, 1];
+		printf("%s", $f) > hfile
+		if (f < NF)
+			printf(" ") > hfile
+		i++; f++;
+	}
+	if (oparen)
+		printf(")") > hfile
+	if (ocomment)
+		printf(" */") > hfile
+	printf("\n") > hfile
+
+	next
+}
+NF > 0 && $1 == "product" {
+	nproducts++
+
+	products[nproducts, 1] = $2;		# vendor name
+	products[nproducts, 2] = $3;		# product id
+	products[nproducts, 3] = $4;		# id
+	printf("#define\t%s_PRODUCT_%s_%s\t%s", PREFIX, products[nproducts, 1],
+	    products[nproducts, 2], products[nproducts, 3]) > hfile
+
+	i=4; f = 5;
+
+	# comments
+	ocomment = oparen = 0
+	if (f <= NF) {
+		printf("\t\t/* ") > hfile
+		ocomment = 1;
+	}
+	while (f <= NF) {
+		if ($f == "#") {
+			printf("(") > hfile
+			oparen = 1
+			f++
+			continue
+		}
+		if (oparen) {
+			printf("%s", $f) > hfile
+			if (f < NF)
+				printf(" ") > hfile
+			f++
+			continue
+		}
+		if (words[$f, 1] == 0) {
+			l = length($f);
+			parts = split($f, junk, "\\");
+			l = l - (parts - 1);
+			nwords++;
+			words[$f, 2] = l;
+			words[$f, 1] = nwords;
+			wordlist[nwords, 1] = $f;
+			wordlist[nwords, 3] = nchars;
+			nchars = nchars + l + 1;
+		}
+		wordlist[words[$f, 1], 2]++;
+		products[nproducts, i] = words[$f, 1];
+		printf("%s", $f) > hfile
+		if (f < NF)
+			printf(" ") > hfile
+		i++; f++;
+	}
+	if (oparen)
+		printf(")") > hfile
+	if (ocomment)
+		printf(" */") > hfile
+	printf("\n") > hfile
+
+	next
+}
+{
+	if ($0 == "")
+		blanklines++
+	print $0 > hfile
+	if (blanklines < 2)
+		print $0 > dfile
+}
+END {
+	# print out the match tables
+
+	printf("\n") > dfile
+
+	printf("static const uint16_t %s_vendors[] = {\n", prefix) > dfile
+	for (i = 1; i <= nvendors; i++) {
+		printf("\t    %s_VENDOR_%s", PREFIX, vendors[i, 1]) \
+		    > dfile
+
+		j = 3;
+		while ((i, j) in vendors) {
+			printf(", %d",
+			    wordlist[vendors[i, j], 3]) > dfile
+#			printf(", %d /* %s */",
+#			    wordlist[vendors[i, j], 3],
+#			    wordlist[vendors[i, j], 1]) > dfile
+			j++
+		}
+		printf(", 0,\n", sep) > dfile
+	}
+	printf("};\n") > dfile
+
+	printf("\n") > dfile
+
+	printf("static const uint16_t %s_products[] = {\n", prefix) > dfile
+	for (i = 1; i <= nproducts; i++) {
+		printf("\t    %s_VENDOR_%s, %s_PRODUCT_%s_%s, \n",
+		    PREFIX, products[i, 1], PREFIX, products[i, 1],
+		    products[i, 2]) > dfile
+
+		printf("\t    ") > dfile
+		j = 4
+		sep = ""
+		while ((i, j) in products) {
+			printf("%s%d", sep,
+			    wordlist[products[i, j], 3]) > dfile
+#			printf("%s%d /* %s */", sep,
+#			    wordlist[products[i, j], 3],
+#			    wordlist[products[i, j], 1]) > dfile
+			sep = ", "
+			j++
+		}
+		printf("%s0,\n", sep) > dfile
+	}
+	printf("};\n") > dfile
+
+	printf("static const char %s_words[] = { \".\" \n", prefix) > dfile
+	for (i = 1; i <= nwords; i++) {
+		printf("\t    \"%s\\0\" /* %d refs @ %d */\n",
+		    wordlist[i, 1], wordlist[i, 2], wordlist[i, 3]) > dfile
+	}
+	printf("};\n") > dfile
+	printf("const int %s_nwords = %d;\n", prefix, nwords) > dfile
+
+	printf("\n") > dfile
+
+	close(dfile)
+	close(hfile)
+}

Reply via email to