Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 27 Jun 2011 20:59:44 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r223605 - in stable/8: etc/devd sys/dev/sound/usb sys/dev/usb sys/dev/usb/input sys/dev/usb/misc sys/dev/usb/net sys/dev/usb/serial sys/dev/usb/storage sys/dev/usb/wlan sys/netgraph/blu...
Message-ID:  <201106272059.p5RKxiKI013470@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: hselasky
Date: Mon Jun 27 20:59:43 2011
New Revision: 223605
URL: http://svn.freebsd.org/changeset/base/223605

Log:
  MFC r223486, r223489, r223490, r223511, r223512, r223513,
    r223515, r223518, r223519, r223521, r223534, r223535,
    r223536, r223537, r223538, r223543, r223288, r223604 and r223566:
  
  - Export all USB device ID's in so-called sections.
  - Fix duplicate occurence of a USB ID in if_urtw and if_zyd.
  - Add new tool to autogenerate nomatch entries for devd.
  - Add new usb.conf file to auto-load USB drivers.
  - Fix some issues related to the nomatch notifications.
  
  PR:	misc/157903

Added:
  stable/8/etc/devd/usb.conf
     - copied, changed from r223543, head/etc/devd/usb.conf
  stable/8/tools/tools/bus_autoconf/
     - copied from r223486, head/tools/tools/bus_autoconf/
  stable/8/tools/tools/bus_autoconf/bus_autoconf_format_example.txt
     - copied unchanged from r223534, head/tools/tools/bus_autoconf/bus_autoconf_format_example.txt
  stable/8/tools/tools/bus_autoconf/bus_load_file.c
     - copied, changed from r223534, head/tools/tools/bus_autoconf/bus_load_file.c
  stable/8/tools/tools/bus_autoconf/bus_load_file.h
     - copied unchanged from r223534, head/tools/tools/bus_autoconf/bus_load_file.h
  stable/8/tools/tools/bus_autoconf/bus_sections.c
     - copied unchanged from r223534, head/tools/tools/bus_autoconf/bus_sections.c
  stable/8/tools/tools/bus_autoconf/bus_sections.h
     - copied unchanged from r223534, head/tools/tools/bus_autoconf/bus_sections.h
  stable/8/tools/tools/bus_autoconf/bus_usb.c
     - copied, changed from r223534, head/tools/tools/bus_autoconf/bus_usb.c
  stable/8/tools/tools/bus_autoconf/bus_usb.h
     - copied unchanged from r223534, head/tools/tools/bus_autoconf/bus_usb.h
Modified:
  stable/8/etc/devd/Makefile
  stable/8/sys/dev/sound/usb/uaudio.c
  stable/8/sys/dev/usb/input/atp.c
  stable/8/sys/dev/usb/input/uep.c
  stable/8/sys/dev/usb/input/uhid.c
  stable/8/sys/dev/usb/input/ukbd.c
  stable/8/sys/dev/usb/input/ums.c
  stable/8/sys/dev/usb/misc/udbp.c
  stable/8/sys/dev/usb/misc/ufm.c
  stable/8/sys/dev/usb/net/if_aue.c
  stable/8/sys/dev/usb/net/if_axe.c
  stable/8/sys/dev/usb/net/if_cdce.c
  stable/8/sys/dev/usb/net/if_cue.c
  stable/8/sys/dev/usb/net/if_ipheth.c
  stable/8/sys/dev/usb/net/if_kue.c
  stable/8/sys/dev/usb/net/if_rue.c
  stable/8/sys/dev/usb/net/if_udav.c
  stable/8/sys/dev/usb/net/uhso.c
  stable/8/sys/dev/usb/serial/u3g.c
  stable/8/sys/dev/usb/serial/uark.c
  stable/8/sys/dev/usb/serial/ubsa.c
  stable/8/sys/dev/usb/serial/uchcom.c
  stable/8/sys/dev/usb/serial/ucycom.c
  stable/8/sys/dev/usb/serial/ufoma.c
  stable/8/sys/dev/usb/serial/uftdi.c
  stable/8/sys/dev/usb/serial/ugensa.c
  stable/8/sys/dev/usb/serial/uipaq.c
  stable/8/sys/dev/usb/serial/ulpt.c
  stable/8/sys/dev/usb/serial/umcs.c
  stable/8/sys/dev/usb/serial/umct.c
  stable/8/sys/dev/usb/serial/umodem.c
  stable/8/sys/dev/usb/serial/umoscom.c
  stable/8/sys/dev/usb/serial/uplcom.c
  stable/8/sys/dev/usb/serial/uslcom.c
  stable/8/sys/dev/usb/serial/uvisor.c
  stable/8/sys/dev/usb/serial/uvscom.c
  stable/8/sys/dev/usb/storage/umass.c
  stable/8/sys/dev/usb/storage/urio.c
  stable/8/sys/dev/usb/usb_device.c
  stable/8/sys/dev/usb/usb_hub.c
  stable/8/sys/dev/usb/usb_lookup.c
  stable/8/sys/dev/usb/usb_msctest.c
  stable/8/sys/dev/usb/usbdi.h
  stable/8/sys/dev/usb/wlan/if_rum.c
  stable/8/sys/dev/usb/wlan/if_run.c
  stable/8/sys/dev/usb/wlan/if_uath.c
  stable/8/sys/dev/usb/wlan/if_upgt.c
  stable/8/sys/dev/usb/wlan/if_ural.c
  stable/8/sys/dev/usb/wlan/if_urtw.c
  stable/8/sys/dev/usb/wlan/if_zyd.c
  stable/8/sys/netgraph/bluetooth/drivers/ubt/ng_ubt.c
  stable/8/sys/netgraph/bluetooth/drivers/ubtbcmfw/ubtbcmfw.c
  stable/8/tools/tools/bus_autoconf/Makefile
  stable/8/tools/tools/bus_autoconf/bus_autoconf.c
  stable/8/tools/tools/bus_autoconf/bus_autoconf.h
  stable/8/tools/tools/bus_autoconf/bus_autoconf.sh
Directory Properties:
  stable/8/etc/   (props changed)
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/tools/tools/   (props changed)
  stable/8/tools/tools/aac/   (props changed)
  stable/8/tools/tools/ath/   (props changed)
  stable/8/tools/tools/ath/common/dumpregs.h   (props changed)
  stable/8/tools/tools/ath/common/dumpregs_5210.c   (props changed)
  stable/8/tools/tools/ath/common/dumpregs_5211.c   (props changed)
  stable/8/tools/tools/ath/common/dumpregs_5212.c   (props changed)
  stable/8/tools/tools/ath/common/dumpregs_5416.c   (props changed)
  stable/8/tools/tools/cfi/   (props changed)
  stable/8/tools/tools/ether_reflect/   (props changed)
  stable/8/tools/tools/iwi/   (props changed)
  stable/8/tools/tools/mctest/   (props changed)
  stable/8/tools/tools/nanobsd/   (props changed)
  stable/8/tools/tools/netrate/   (props changed)
  stable/8/tools/tools/netrate/tcpp/   (props changed)
  stable/8/tools/tools/termcap/termcap.pl   (props changed)
  stable/8/tools/tools/umastat/   (props changed)
  stable/8/tools/tools/vimage/   (props changed)

Modified: stable/8/etc/devd/Makefile
==============================================================================
--- stable/8/etc/devd/Makefile	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/etc/devd/Makefile	Mon Jun 27 20:59:43 2011	(r223605)
@@ -1,6 +1,6 @@
 # $FreeBSD$
 
-FILES=	asus.conf uath.conf
+FILES=	asus.conf uath.conf usb.conf
 
 NO_OBJ=
 FILESDIR=	/etc/devd

Copied and modified: stable/8/etc/devd/usb.conf (from r223543, head/etc/devd/usb.conf)
==============================================================================
--- head/etc/devd/usb.conf	Sat Jun 25 17:01:46 2011	(r223543, copy source)
+++ stable/8/etc/devd/usb.conf	Mon Jun 27 20:59:43 2011	(r223605)
@@ -1533,15 +1533,7 @@ nomatch 32 {
 	match "bus" "uhub[0-9]+";
 	match "mode" "host";
 	match "vendor" "0x083a";
-	match "product" "0x4506";
-	action "kldload if_uath";
-};
-
-nomatch 32 {
-	match "bus" "uhub[0-9]+";
-	match "mode" "host";
-	match "vendor" "0x083a";
-	match "product" "0x4506";
+	match "product" "(0x4505|0x4506)";
 	action "kldload if_zyd";
 };
 

Modified: stable/8/sys/dev/sound/usb/uaudio.c
==============================================================================
--- stable/8/sys/dev/sound/usb/uaudio.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/sound/usb/uaudio.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -531,6 +531,15 @@ static driver_t uaudio_driver = {
 	.size = sizeof(struct uaudio_softc),
 };
 
+static const STRUCT_USB_HOST_ID __used uaudio_devs[] = {
+	/* Generic USB audio class match */
+	{USB_IFACE_CLASS(UICLASS_AUDIO),
+	 USB_IFACE_SUBCLASS(UISUBCLASS_AUDIOCONTROL),},
+	/* Generic USB MIDI class match */
+	{USB_IFACE_CLASS(UICLASS_AUDIO),
+	 USB_IFACE_SUBCLASS(UISUBCLASS_MIDISTREAM),},
+};
+
 static int
 uaudio_probe(device_t dev)
 {

Modified: stable/8/sys/dev/usb/input/atp.c
==============================================================================
--- stable/8/sys/dev/usb/input/atp.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/input/atp.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -240,7 +240,7 @@ struct atp_dev_params {
 	},
 };
 
-static const struct usb_device_id atp_devs[] = {
+static const STRUCT_USB_HOST_ID atp_devs[] = {
 	/* Core Duo MacBook & MacBook Pro */
 	{ USB_VPI(USB_VENDOR_APPLE, 0x0217, ATP_DEV_PARAMS_0) },
 	{ USB_VPI(USB_VENDOR_APPLE, 0x0218, ATP_DEV_PARAMS_0) },

Modified: stable/8/sys/dev/usb/input/uep.c
==============================================================================
--- stable/8/sys/dev/usb/input/uep.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/input/uep.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -288,6 +288,12 @@ static const struct usb_config uep_confi
 	},
 };
 
+static const STRUCT_USB_HOST_ID uep_devs[] = {
+	{USB_VPI(USB_VENDOR_EGALAX, USB_PRODUCT_EGALAX_TPANEL, 0)},
+	{USB_VPI(USB_VENDOR_EGALAX, USB_PRODUCT_EGALAX_TPANEL2, 0)},
+	{USB_VPI(USB_VENDOR_EGALAX2, USB_PRODUCT_EGALAX2_TPANEL, 0)},
+};
+
 static int
 uep_probe(device_t dev)
 {
@@ -295,17 +301,12 @@ uep_probe(device_t dev)
 
 	if (uaa->usb_mode != USB_MODE_HOST)
 		return (ENXIO);
+	if (uaa->info.bConfigIndex != 0)
+		return (ENXIO);
+	if (uaa->info.bIfaceIndex != 0)
+		return (ENXIO);
 
-	if ((uaa->info.idVendor == USB_VENDOR_EGALAX) &&
-	    ((uaa->info.idProduct == USB_PRODUCT_EGALAX_TPANEL) ||
-	    (uaa->info.idProduct == USB_PRODUCT_EGALAX_TPANEL2)))
-		return (BUS_PROBE_SPECIFIC);
-
-	if ((uaa->info.idVendor == USB_VENDOR_EGALAX2) &&
-	    (uaa->info.idProduct == USB_PRODUCT_EGALAX2_TPANEL))
-		return (BUS_PROBE_SPECIFIC);
-
-	return (ENXIO);
+	return (usbd_lookup_id_by_uaa(uep_devs, sizeof(uep_devs), uaa));
 }
 
 static int

Modified: stable/8/sys/dev/usb/input/uhid.c
==============================================================================
--- stable/8/sys/dev/usb/input/uhid.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/input/uhid.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -607,29 +607,33 @@ uhid_ioctl(struct usb_fifo *fifo, u_long
 	return (error);
 }
 
+static const STRUCT_USB_HOST_ID uhid_devs[] = {
+	/* generic HID class */
+	{USB_IFACE_CLASS(UICLASS_HID),},
+	/* the Xbox 360 gamepad doesn't use the HID class */
+	{USB_IFACE_CLASS(UICLASS_VENDOR),
+	 USB_IFACE_SUBCLASS(UISUBCLASS_XBOX360_CONTROLLER),
+	 USB_IFACE_PROTOCOL(UIPROTO_XBOX360_GAMEPAD),},
+};
+
 static int
 uhid_probe(device_t dev)
 {
 	struct usb_attach_arg *uaa = device_get_ivars(dev);
+	int error;
 
 	DPRINTFN(11, "\n");
 
-	if (uaa->usb_mode != USB_MODE_HOST) {
+	if (uaa->usb_mode != USB_MODE_HOST)
 		return (ENXIO);
-	}
-	if (uaa->info.bInterfaceClass != UICLASS_HID) {
 
-		/* the Xbox 360 gamepad doesn't use the HID class */
+	error = usbd_lookup_id_by_uaa(uhid_devs, sizeof(uhid_devs), uaa);
+	if (error)
+		return (error);
 
-		if ((uaa->info.bInterfaceClass != UICLASS_VENDOR) ||
-		    (uaa->info.bInterfaceSubClass != UISUBCLASS_XBOX360_CONTROLLER) ||
-		    (uaa->info.bInterfaceProtocol != UIPROTO_XBOX360_GAMEPAD)) {
-			return (ENXIO);
-		}
-	}
-	if (usb_test_quirk(uaa, UQ_HID_IGNORE)) {
+	if (usb_test_quirk(uaa, UQ_HID_IGNORE))
 		return (ENXIO);
-	}
+
 	return (BUS_PROBE_GENERIC);
 }
 

Modified: stable/8/sys/dev/usb/input/ukbd.c
==============================================================================
--- stable/8/sys/dev/usb/input/ukbd.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/input/ukbd.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -745,6 +745,13 @@ static const struct usb_config ukbd_conf
 	},
 };
 
+/* A match on these entries will load ukbd */
+static const STRUCT_USB_HOST_ID __used ukbd_devs[] = {
+	{USB_IFACE_CLASS(UICLASS_HID),
+	 USB_IFACE_SUBCLASS(UISUBCLASS_BOOT),
+	 USB_IFACE_PROTOCOL(UIPROTO_BOOT_KEYBOARD),},
+};
+
 static int
 ukbd_probe(device_t dev)
 {

Modified: stable/8/sys/dev/usb/input/ums.c
==============================================================================
--- stable/8/sys/dev/usb/input/ums.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/input/ums.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -355,6 +355,13 @@ static const struct usb_config ums_confi
 	},
 };
 
+/* A match on these entries will load ums */
+static const STRUCT_USB_HOST_ID __used ums_devs[] = {
+	{USB_IFACE_CLASS(UICLASS_HID),
+	 USB_IFACE_SUBCLASS(UISUBCLASS_BOOT),
+	 USB_IFACE_PROTOCOL(UIPROTO_MOUSE),},
+};
+
 static int
 ums_probe(device_t dev)
 {

Modified: stable/8/sys/dev/usb/misc/udbp.c
==============================================================================
--- stable/8/sys/dev/usb/misc/udbp.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/misc/udbp.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -288,40 +288,27 @@ udbp_modload(module_t mod, int event, vo
 	return (error);
 }
 
+static const STRUCT_USB_HOST_ID udbp_devs[] = {
+	{USB_VPI(USB_VENDOR_NETCHIP, USB_PRODUCT_NETCHIP_TURBOCONNECT, 0)},
+	{USB_VPI(USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PL2301, 0)},
+	{USB_VPI(USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PL2302, 0)},
+	{USB_VPI(USB_VENDOR_ANCHOR, USB_PRODUCT_ANCHOR_EZLINK, 0)},
+	{USB_VPI(USB_VENDOR_GENESYS, USB_PRODUCT_GENESYS_GL620USB, 0)},
+};
+
 static int
 udbp_probe(device_t dev)
 {
 	struct usb_attach_arg *uaa = device_get_ivars(dev);
 
-	if (uaa->usb_mode != USB_MODE_HOST) {
+	if (uaa->usb_mode != USB_MODE_HOST)
+		return (ENXIO);
+	if (uaa->info.bConfigIndex != 0)
+		return (ENXIO);
+	if (uaa->info.bIfaceIndex != 0)
 		return (ENXIO);
-	}
-	/*
-	 * XXX Julian, add the id of the device if you have one to test
-	 * things with. run 'usbdevs -v' and note the 3 ID's that appear.
-	 * The Vendor Id and Product Id are in hex and the Revision Id is in
-	 * bcd. But as usual if the revision is 0x101 then you should
-	 * compare the revision id in the device descriptor with 0x101 Or go
-	 * search the file usbdevs.h. Maybe the device is already in there.
-	 */
-	if (((uaa->info.idVendor == USB_VENDOR_NETCHIP) &&
-	    (uaa->info.idProduct == USB_PRODUCT_NETCHIP_TURBOCONNECT)))
-		return (0);
-
-	if (((uaa->info.idVendor == USB_VENDOR_PROLIFIC) &&
-	    ((uaa->info.idProduct == USB_PRODUCT_PROLIFIC_PL2301) ||
-	    (uaa->info.idProduct == USB_PRODUCT_PROLIFIC_PL2302))))
-		return (0);
-
-	if ((uaa->info.idVendor == USB_VENDOR_ANCHOR) &&
-	    (uaa->info.idProduct == USB_PRODUCT_ANCHOR_EZLINK))
-		return (0);
-
-	if ((uaa->info.idVendor == USB_VENDOR_GENESYS) &&
-	    (uaa->info.idProduct == USB_PRODUCT_GENESYS_GL620USB))
-		return (0);
 
-	return (ENXIO);
+	return (usbd_lookup_id_by_uaa(udbp_devs, sizeof(udbp_devs), uaa));
 }
 
 static int

Modified: stable/8/sys/dev/usb/misc/ufm.c
==============================================================================
--- stable/8/sys/dev/usb/misc/ufm.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/misc/ufm.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -118,19 +118,23 @@ DRIVER_MODULE(ufm, uhub, ufm_driver, ufm
 MODULE_DEPEND(ufm, usb, 1, 1, 1);
 MODULE_VERSION(ufm, 1);
 
+static const STRUCT_USB_HOST_ID ufm_devs[] = {
+	{USB_VPI(USB_VENDOR_CYPRESS, USB_PRODUCT_CYPRESS_FMRADIO, 0)},
+};
+
 static int
 ufm_probe(device_t dev)
 {
 	struct usb_attach_arg *uaa = device_get_ivars(dev);
 
-	if (uaa->usb_mode != USB_MODE_HOST) {
+	if (uaa->usb_mode != USB_MODE_HOST)
 		return (ENXIO);
-	}
-	if ((uaa->info.idVendor == USB_VENDOR_CYPRESS) &&
-	    (uaa->info.idProduct == USB_PRODUCT_CYPRESS_FMRADIO)) {
-		return (0);
-	}
-	return (ENXIO);
+	if (uaa->info.bConfigIndex != 0)
+		return (ENXIO);
+	if (uaa->info.bIfaceIndex != 0)
+		return (ENXIO);
+
+	return (usbd_lookup_id_by_uaa(ufm_devs, sizeof(ufm_devs), uaa));
 }
 
 static int

Modified: stable/8/sys/dev/usb/net/if_aue.c
==============================================================================
--- stable/8/sys/dev/usb/net/if_aue.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/net/if_aue.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -110,7 +110,7 @@ SYSCTL_INT(_hw_usb_aue, OID_AUTO, debug,
 /*
  * Various supported device vendors/products.
  */
-static const struct usb_device_id aue_devs[] = {
+static const STRUCT_USB_HOST_ID aue_devs[] = {
 #define	AUE_DEV(v,p,i) { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) }
     AUE_DEV(3COM, 3C460B, AUE_FLAG_PII),
     AUE_DEV(ABOCOM, DSB650TX_PNA, 0),

Modified: stable/8/sys/dev/usb/net/if_axe.c
==============================================================================
--- stable/8/sys/dev/usb/net/if_axe.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/net/if_axe.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -133,7 +133,7 @@ SYSCTL_INT(_hw_usb_axe, OID_AUTO, debug,
 /*
  * Various supported device vendors/products.
  */
-static const struct usb_device_id axe_devs[] = {
+static const STRUCT_USB_HOST_ID axe_devs[] = {
 #define	AXE_DEV(v,p,i) { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) }
 	AXE_DEV(ABOCOM, UF200, 0),
 	AXE_DEV(ACERCM, EP1427X2, 0),

Modified: stable/8/sys/dev/usb/net/if_cdce.c
==============================================================================
--- stable/8/sys/dev/usb/net/if_cdce.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/net/if_cdce.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -263,7 +263,7 @@ static const struct usb_ether_methods cd
 	.ue_setpromisc = cdce_setpromisc,
 };
 
-static const struct usb_device_id cdce_devs[] = {
+static const STRUCT_USB_HOST_ID cdce_host_devs[] = {
 	{USB_VPI(USB_VENDOR_ACERLABS, USB_PRODUCT_ACERLABS_M5632, CDCE_FLAG_NO_UNION)},
 	{USB_VPI(USB_VENDOR_AMBIT, USB_PRODUCT_AMBIT_NTL_250, CDCE_FLAG_NO_UNION)},
 	{USB_VPI(USB_VENDOR_COMPAQ, USB_PRODUCT_COMPAQ_IPAQLINUX, CDCE_FLAG_NO_UNION)},
@@ -277,7 +277,9 @@ static const struct usb_device_id cdce_d
 	{USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_SLA300, CDCE_FLAG_ZAURUS | CDCE_FLAG_NO_UNION)},
 	{USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_SLC700, CDCE_FLAG_ZAURUS | CDCE_FLAG_NO_UNION)},
 	{USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_SLC750, CDCE_FLAG_ZAURUS | CDCE_FLAG_NO_UNION)},
+};
 
+static const STRUCT_USB_DUAL_ID cdce_dual_devs[] = {
 	{USB_IF_CSI(UICLASS_CDC, UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL, 0)},
 	{USB_IF_CSI(UICLASS_CDC, UISUBCLASS_MOBILE_DIRECT_LINE_MODEL, 0)},
 	{USB_IF_CSI(UICLASS_CDC, UISUBCLASS_NETWORK_CONTROL_MODEL, 0)},
@@ -472,8 +474,12 @@ static int
 cdce_probe(device_t dev)
 {
 	struct usb_attach_arg *uaa = device_get_ivars(dev);
+	int error;
 
-	return (usbd_lookup_id_by_uaa(cdce_devs, sizeof(cdce_devs), uaa));
+	error = usbd_lookup_id_by_uaa(cdce_host_devs, sizeof(cdce_host_devs), uaa);
+	if (error)
+		error = usbd_lookup_id_by_uaa(cdce_dual_devs, sizeof(cdce_dual_devs), uaa);
+	return (error);
 }
 
 static void

Modified: stable/8/sys/dev/usb/net/if_cue.c
==============================================================================
--- stable/8/sys/dev/usb/net/if_cue.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/net/if_cue.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -88,7 +88,7 @@ __FBSDID("$FreeBSD$");
 
 /* Belkin F5U111 adapter covered by NETMATE entry */
 
-static const struct usb_device_id cue_devs[] = {
+static const STRUCT_USB_HOST_ID cue_devs[] = {
 #define	CUE_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) }
 	CUE_DEV(CATC, NETMATE),
 	CUE_DEV(CATC, NETMATE2),

Modified: stable/8/sys/dev/usb/net/if_ipheth.c
==============================================================================
--- stable/8/sys/dev/usb/net/if_ipheth.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/net/if_ipheth.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -148,7 +148,7 @@ static const struct usb_ether_methods ip
     USB_IFACE_CLASS(c), USB_IFACE_SUBCLASS(sc), \
     USB_IFACE_PROTOCOL(pt)
 
-static const struct usb_device_id ipheth_devs[] = {
+static const STRUCT_USB_HOST_ID ipheth_devs[] = {
 	{IPHETH_ID(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_IPHONE,
 	    IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS,
 	    IPHETH_USBINTF_PROTO)},

Modified: stable/8/sys/dev/usb/net/if_kue.c
==============================================================================
--- stable/8/sys/dev/usb/net/if_kue.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/net/if_kue.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -100,7 +100,7 @@ __FBSDID("$FreeBSD$");
 /*
  * Various supported device vendors/products.
  */
-static const struct usb_device_id kue_devs[] = {
+static const STRUCT_USB_HOST_ID kue_devs[] = {
 #define	KUE_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) }
 	KUE_DEV(3COM, 3C19250),
 	KUE_DEV(3COM, 3C460),

Modified: stable/8/sys/dev/usb/net/if_rue.c
==============================================================================
--- stable/8/sys/dev/usb/net/if_rue.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/net/if_rue.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -108,7 +108,7 @@ SYSCTL_INT(_hw_usb_rue, OID_AUTO, debug,
  * Various supported device vendors/products.
  */
 
-static const struct usb_device_id rue_devs[] = {
+static const STRUCT_USB_HOST_ID rue_devs[] = {
 	{USB_VPI(USB_VENDOR_MELCO, USB_PRODUCT_MELCO_LUAKTX, 0)},
 	{USB_VPI(USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_USBKR100, 0)},
 	{USB_VPI(USB_VENDOR_OQO, USB_PRODUCT_OQO_ETHER01, 0)},

Modified: stable/8/sys/dev/usb/net/if_udav.c
==============================================================================
--- stable/8/sys/dev/usb/net/if_udav.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/net/if_udav.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -199,7 +199,7 @@ SYSCTL_INT(_hw_usb_udav, OID_AUTO, debug
 #define	UDAV_CLRBIT(sc, reg, x)	\
 	udav_csr_write1(sc, reg, udav_csr_read1(sc, reg) & ~(x))
 
-static const struct usb_device_id udav_devs[] = {
+static const STRUCT_USB_HOST_ID udav_devs[] = {
 	/* ShanTou DM9601 USB NIC */
 	{USB_VPI(USB_VENDOR_SHANTOU, USB_PRODUCT_SHANTOU_DM9601, 0)},
 	/* ShanTou ST268 USB NIC */

Modified: stable/8/sys/dev/usb/net/uhso.c
==============================================================================
--- stable/8/sys/dev/usb/net/uhso.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/net/uhso.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -247,7 +247,7 @@ static char *uhso_port_type_sysctl[] = {
 /* ifnet device unit allocations */
 static struct unrhdr *uhso_ifnet_unit = NULL;
 
-static const struct usb_device_id uhso_devs[] = {
+static const STRUCT_USB_HOST_ID uhso_devs[] = {
 #define	UHSO_DEV(v,p,i) { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) }
 	/* Option GlobeSurfer iCON 7.2 */
 	UHSO_DEV(OPTION, GSICON72, UHSO_STATIC_IFACE),

Modified: stable/8/sys/dev/usb/serial/u3g.c
==============================================================================
--- stable/8/sys/dev/usb/serial/u3g.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/serial/u3g.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -182,7 +182,7 @@ MODULE_DEPEND(u3g, ucom, 1, 1, 1);
 MODULE_DEPEND(u3g, usb, 1, 1, 1);
 MODULE_VERSION(u3g, 1);
 
-static const struct usb_device_id u3g_devs[] = {
+static const STRUCT_USB_HOST_ID u3g_devs[] = {
 #define	U3G_DEV(v,p,i) { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) }
 	U3G_DEV(ACERP, H10, 0),
 	U3G_DEV(AIRPLUS, MCD650, 0),

Modified: stable/8/sys/dev/usb/serial/uark.c
==============================================================================
--- stable/8/sys/dev/usb/serial/uark.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/serial/uark.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -170,7 +170,7 @@ MODULE_DEPEND(uark, ucom, 1, 1, 1);
 MODULE_DEPEND(uark, usb, 1, 1, 1);
 MODULE_VERSION(uark, 1);
 
-static const struct usb_device_id uark_devs[] = {
+static const STRUCT_USB_HOST_ID uark_devs[] = {
 	{USB_VPI(USB_VENDOR_ARKMICRO, USB_PRODUCT_ARKMICRO_ARK3116, 0)},
 };
 

Modified: stable/8/sys/dev/usb/serial/ubsa.c
==============================================================================
--- stable/8/sys/dev/usb/serial/ubsa.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/serial/ubsa.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -239,7 +239,7 @@ static const struct ucom_callback ubsa_c
 	.ucom_poll = &ubsa_poll,
 };
 
-static const struct usb_device_id ubsa_devs[] = {
+static const STRUCT_USB_HOST_ID ubsa_devs[] = {
 	/* AnyData ADU-500A */
 	{USB_VPI(USB_VENDOR_ANYDATA, USB_PRODUCT_ANYDATA_ADU_500A, 0)},
 	/* AnyData ADU-E100A/H */

Modified: stable/8/sys/dev/usb/serial/uchcom.c
==============================================================================
--- stable/8/sys/dev/usb/serial/uchcom.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/serial/uchcom.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -204,7 +204,7 @@ static const struct uchcom_divider_recor
 
 #define	NUM_DIVIDERS	(sizeof (dividers) / sizeof (dividers[0]))
 
-static const struct usb_device_id uchcom_devs[] = {
+static const STRUCT_USB_HOST_ID uchcom_devs[] = {
 	{USB_VPI(USB_VENDOR_WCH, USB_PRODUCT_WCH_CH341SER, 0)},
 	{USB_VPI(USB_VENDOR_WCH2, USB_PRODUCT_WCH2_CH341SER, 0)},
 };

Modified: stable/8/sys/dev/usb/serial/ucycom.c
==============================================================================
--- stable/8/sys/dev/usb/serial/ucycom.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/serial/ucycom.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -180,7 +180,7 @@ MODULE_VERSION(ucycom, 1);
 /*
  * Supported devices
  */
-static const struct usb_device_id ucycom_devs[] = {
+static const STRUCT_USB_HOST_ID ucycom_devs[] = {
 	{USB_VPI(USB_VENDOR_DELORME, USB_PRODUCT_DELORME_EARTHMATE, MODEL_CY7C64013)},
 };
 

Modified: stable/8/sys/dev/usb/serial/ufoma.c
==============================================================================
--- stable/8/sys/dev/usb/serial/ufoma.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/serial/ufoma.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -327,6 +327,11 @@ MODULE_DEPEND(ufoma, ucom, 1, 1, 1);
 MODULE_DEPEND(ufoma, usb, 1, 1, 1);
 MODULE_VERSION(ufoma, 1);
 
+static const STRUCT_USB_HOST_ID ufoma_devs[] = {
+	{USB_IFACE_CLASS(UICLASS_CDC),
+	 USB_IFACE_SUBCLASS(UISUBCLASS_MCPC),},
+};
+
 static int
 ufoma_probe(device_t dev)
 {
@@ -334,30 +339,31 @@ ufoma_probe(device_t dev)
 	struct usb_interface_descriptor *id;
 	struct usb_config_descriptor *cd;
 	usb_mcpc_acm_descriptor *mad;
+	int error;
 
-	if (uaa->usb_mode != USB_MODE_HOST) {
+	if (uaa->usb_mode != USB_MODE_HOST)
 		return (ENXIO);
-	}
+
+	error = usbd_lookup_id_by_uaa(ufoma_devs, sizeof(ufoma_devs), uaa);
+	if (error)
+		return (error);
+
 	id = usbd_get_interface_descriptor(uaa->iface);
 	cd = usbd_get_config_descriptor(uaa->device);
 
-	if ((id == NULL) ||
-	    (cd == NULL) ||
-	    (id->bInterfaceClass != UICLASS_CDC) ||
-	    (id->bInterfaceSubClass != UISUBCLASS_MCPC)) {
+	if (id == NULL || cd == NULL)
 		return (ENXIO);
-	}
+
 	mad = ufoma_get_intconf(cd, id, UDESC_VS_INTERFACE, UDESCSUB_MCPC_ACM);
-	if (mad == NULL) {
+	if (mad == NULL)
 		return (ENXIO);
-	}
+
 #ifndef UFOMA_HANDSFREE
 	if ((mad->bType == UMCPC_ACM_TYPE_AB5) ||
-	    (mad->bType == UMCPC_ACM_TYPE_AB6)) {
+	    (mad->bType == UMCPC_ACM_TYPE_AB6))
 		return (ENXIO);
-	}
 #endif
-	return (0);
+	return (BUS_PROBE_GENERIC);
 }
 
 static int

Modified: stable/8/sys/dev/usb/serial/uftdi.c
==============================================================================
--- stable/8/sys/dev/usb/serial/uftdi.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/serial/uftdi.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -206,7 +206,7 @@ MODULE_DEPEND(uftdi, ucom, 1, 1, 1);
 MODULE_DEPEND(uftdi, usb, 1, 1, 1);
 MODULE_VERSION(uftdi, 1);
 
-static struct usb_device_id uftdi_devs[] = {
+static STRUCT_USB_HOST_ID uftdi_devs[] = {
 #define	UFTDI_DEV(v,p,t) \
   { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, UFTDI_TYPE_##t) }
 	UFTDI_DEV(ATMEL, STK541, 8U232AM),

Modified: stable/8/sys/dev/usb/serial/ugensa.c
==============================================================================
--- stable/8/sys/dev/usb/serial/ugensa.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/serial/ugensa.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -154,7 +154,7 @@ MODULE_DEPEND(ugensa, ucom, 1, 1, 1);
 MODULE_DEPEND(ugensa, usb, 1, 1, 1);
 MODULE_VERSION(ugensa, 1);
 
-static const struct usb_device_id ugensa_devs[] = {
+static const STRUCT_USB_HOST_ID ugensa_devs[] = {
 	{USB_VPI(USB_VENDOR_AIRPRIME, USB_PRODUCT_AIRPRIME_PC5220, 0)},
 	{USB_VPI(USB_VENDOR_CMOTECH, USB_PRODUCT_CMOTECH_CDMA_MODEM1, 0)},
 	{USB_VPI(USB_VENDOR_KYOCERA2, USB_PRODUCT_KYOCERA2_CDMA_MSM_K, 0)},

Modified: stable/8/sys/dev/usb/serial/uipaq.c
==============================================================================
--- stable/8/sys/dev/usb/serial/uipaq.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/serial/uipaq.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -153,7 +153,7 @@ static const struct ucom_callback uipaq_
  * support the same hardware. Numeric values are used where no usbdevs
  * entries exist.
  */
-static const struct usb_device_id uipaq_devs[] = {
+static const STRUCT_USB_HOST_ID uipaq_devs[] = {
 	/* Socket USB Sync */
 	{USB_VPI(0x0104, 0x00be, 0)},
 	/* USB Sync 0301 */

Modified: stable/8/sys/dev/usb/serial/ulpt.c
==============================================================================
--- stable/8/sys/dev/usb/serial/ulpt.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/serial/ulpt.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -483,24 +483,39 @@ ulpt_ioctl(struct usb_fifo *fifo, u_long
 	return (ENODEV);
 }
 
+static const STRUCT_USB_HOST_ID ulpt_devs[] = {
+	/* Uni-directional USB printer */
+	{USB_IFACE_CLASS(UICLASS_PRINTER),
+	 USB_IFACE_SUBCLASS(UISUBCLASS_PRINTER),
+	 USB_IFACE_PROTOCOL(UIPROTO_PRINTER_UNI)},
+
+	/* Bi-directional USB printer */
+	{USB_IFACE_CLASS(UICLASS_PRINTER),
+	 USB_IFACE_SUBCLASS(UISUBCLASS_PRINTER),
+	 USB_IFACE_PROTOCOL(UIPROTO_PRINTER_BI)},
+
+	/* 1284 USB printer */
+	{USB_IFACE_CLASS(UICLASS_PRINTER),
+	 USB_IFACE_SUBCLASS(UISUBCLASS_PRINTER),
+	 USB_IFACE_PROTOCOL(UIPROTO_PRINTER_1284)},
+};
+
 static int
 ulpt_probe(device_t dev)
 {
 	struct usb_attach_arg *uaa = device_get_ivars(dev);
+	int error;
 
 	DPRINTFN(11, "\n");
 
-	if (uaa->usb_mode != USB_MODE_HOST) {
+	if (uaa->usb_mode != USB_MODE_HOST)
 		return (ENXIO);
-	}
-	if ((uaa->info.bInterfaceClass == UICLASS_PRINTER) &&
-	    (uaa->info.bInterfaceSubClass == UISUBCLASS_PRINTER) &&
-	    ((uaa->info.bInterfaceProtocol == UIPROTO_PRINTER_UNI) ||
-	    (uaa->info.bInterfaceProtocol == UIPROTO_PRINTER_BI) ||
-	    (uaa->info.bInterfaceProtocol == UIPROTO_PRINTER_1284))) {
-		return (0);
-	}
-	return (ENXIO);
+
+	error = usbd_lookup_id_by_uaa(ulpt_devs, sizeof(ulpt_devs), uaa);
+	if (error)
+		return (error);
+
+	return (BUS_PROBE_GENERIC);
 }
 
 static int

Modified: stable/8/sys/dev/usb/serial/umcs.c
==============================================================================
--- stable/8/sys/dev/usb/serial/umcs.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/serial/umcs.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -253,7 +253,7 @@ static struct ucom_callback umcs7840_cal
 	.ucom_poll = &umcs7840_poll,
 };
 
-static const struct usb_device_id umcs7840_devs[] = {
+static const STRUCT_USB_HOST_ID umcs7840_devs[] = {
 	{USB_VPI(USB_VENDOR_MOSCHIP, USB_PRODUCT_MOSCHIP_MCS7820, 0)},
 	{USB_VPI(USB_VENDOR_MOSCHIP, USB_PRODUCT_MOSCHIP_MCS7840, 0)},
 };

Modified: stable/8/sys/dev/usb/serial/umct.c
==============================================================================
--- stable/8/sys/dev/usb/serial/umct.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/serial/umct.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -192,7 +192,7 @@ static const struct ucom_callback umct_c
 	.ucom_poll = &umct_poll,
 };
 
-static const struct usb_device_id umct_devs[] = {
+static const STRUCT_USB_HOST_ID umct_devs[] = {
 	{USB_VPI(USB_VENDOR_MCT, USB_PRODUCT_MCT_USB232, 0)},
 	{USB_VPI(USB_VENDOR_MCT, USB_PRODUCT_MCT_SITECOM_USB232, 0)},
 	{USB_VPI(USB_VENDOR_MCT, USB_PRODUCT_MCT_DU_H3SP_USB232, 0)},

Modified: stable/8/sys/dev/usb/serial/umodem.c
==============================================================================
--- stable/8/sys/dev/usb/serial/umodem.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/serial/umodem.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -123,7 +123,7 @@ SYSCTL_INT(_hw_usb_umodem, OID_AUTO, deb
     &umodem_debug, 0, "Debug level");
 #endif
 
-static const struct usb_device_id umodem_devs[] = {
+static const STRUCT_USB_HOST_ID umodem_devs[] = {
 	/* Generic Modem class match */
 	{USB_IFACE_CLASS(UICLASS_CDC),
 		USB_IFACE_SUBCLASS(UISUBCLASS_ABSTRACT_CONTROL_MODEL),
@@ -276,11 +276,14 @@ umodem_probe(device_t dev)
 
 	DPRINTFN(11, "\n");
 
-	if (uaa->usb_mode != USB_MODE_HOST) {
+	if (uaa->usb_mode != USB_MODE_HOST)
 		return (ENXIO);
-	}
+
 	error = usbd_lookup_id_by_uaa(umodem_devs, sizeof(umodem_devs), uaa);
-	return (error);
+	if (error)
+		return (error);
+
+	return (BUS_PROBE_GENERIC);
 }
 
 static int

Modified: stable/8/sys/dev/usb/serial/umoscom.c
==============================================================================
--- stable/8/sys/dev/usb/serial/umoscom.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/serial/umoscom.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -280,7 +280,7 @@ MODULE_DEPEND(umoscom, ucom, 1, 1, 1);
 MODULE_DEPEND(umoscom, usb, 1, 1, 1);
 MODULE_VERSION(umoscom, 1);
 
-static const struct usb_device_id umoscom_devs[] = {
+static const STRUCT_USB_HOST_ID umoscom_devs[] = {
 	{USB_VPI(USB_VENDOR_MOSCHIP, USB_PRODUCT_MOSCHIP_MCS7703, 0)}
 };
 

Modified: stable/8/sys/dev/usb/serial/uplcom.c
==============================================================================
--- stable/8/sys/dev/usb/serial/uplcom.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/serial/uplcom.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -247,7 +247,7 @@ static struct ucom_callback uplcom_callb
 #define	UPLCOM_DEV(v,p)				\
   { USB_VENDOR(USB_VENDOR_##v), USB_PRODUCT(USB_PRODUCT_##v##_##p) }
 
-static const struct usb_device_id uplcom_devs[] = {
+static const STRUCT_USB_HOST_ID uplcom_devs[] = {
 	UPLCOM_DEV(ACERP, S81),			/* BenQ S81 phone */
 	UPLCOM_DEV(ADLINK, ND6530),		/* ADLINK ND-6530 USB-Serial */
 	UPLCOM_DEV(ALCATEL, OT535),		/* Alcatel One Touch 535/735 */

Modified: stable/8/sys/dev/usb/serial/uslcom.c
==============================================================================
--- stable/8/sys/dev/usb/serial/uslcom.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/serial/uslcom.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -173,7 +173,7 @@ static struct ucom_callback uslcom_callb
 	.ucom_poll = &uslcom_poll,
 };
 
-static const struct usb_device_id uslcom_devs[] = {
+static const STRUCT_USB_HOST_ID uslcom_devs[] = {
 #define	USLCOM_DEV(v,p)  { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) }
     USLCOM_DEV(BALTECH, CARDREADER),
     USLCOM_DEV(CLIPSAL, 5500PCU),

Modified: stable/8/sys/dev/usb/serial/uvisor.c
==============================================================================
--- stable/8/sys/dev/usb/serial/uvisor.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/serial/uvisor.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -253,7 +253,7 @@ MODULE_DEPEND(uvisor, ucom, 1, 1, 1);
 MODULE_DEPEND(uvisor, usb, 1, 1, 1);
 MODULE_VERSION(uvisor, 1);
 
-static const struct usb_device_id uvisor_devs[] = {
+static const STRUCT_USB_HOST_ID uvisor_devs[] = {
 #define	UVISOR_DEV(v,p,i) { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) }
 	UVISOR_DEV(ACEECA, MEZ1000, UVISOR_FLAG_PALM4),
 	UVISOR_DEV(ALPHASMART, DANA_SYNC, UVISOR_FLAG_PALM4),

Modified: stable/8/sys/dev/usb/serial/uvscom.c
==============================================================================
--- stable/8/sys/dev/usb/serial/uvscom.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/serial/uvscom.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -233,7 +233,7 @@ static const struct ucom_callback uvscom
 	.ucom_poll = &uvscom_poll,
 };
 
-static const struct usb_device_id uvscom_devs[] = {
+static const STRUCT_USB_HOST_ID uvscom_devs[] = {
 	/* SUNTAC U-Cable type A4 */
 	{USB_VPI(USB_VENDOR_SUNTAC, USB_PRODUCT_SUNTAC_AS144L4, 0)},
 	/* SUNTAC U-Cable type D2 */

Modified: stable/8/sys/dev/usb/storage/umass.c
==============================================================================
--- stable/8/sys/dev/usb/storage/umass.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/storage/umass.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -721,6 +721,11 @@ MODULE_VERSION(umass, 1);
  * USB device probe/attach/detach
  */
 
+static const STRUCT_USB_HOST_ID __used umass_devs[] = {
+	/* generic mass storage class */
+	{USB_IFACE_CLASS(UICLASS_MASS),},
+};
+
 static uint16_t
 umass_get_proto(struct usb_interface *iface)
 {

Modified: stable/8/sys/dev/usb/storage/urio.c
==============================================================================
--- stable/8/sys/dev/usb/storage/urio.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/storage/urio.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -198,22 +198,25 @@ DRIVER_MODULE(urio, uhub, urio_driver, u
 MODULE_DEPEND(urio, usb, 1, 1, 1);
 MODULE_VERSION(urio, 1);
 
+static const STRUCT_USB_HOST_ID urio_devs[] = {
+	{USB_VPI(USB_VENDOR_DIAMOND, USB_PRODUCT_DIAMOND_RIO500USB, 0)},
+	{USB_VPI(USB_VENDOR_DIAMOND2, USB_PRODUCT_DIAMOND2_RIO600USB, 0)},
+	{USB_VPI(USB_VENDOR_DIAMOND2, USB_PRODUCT_DIAMOND2_RIO800USB, 0)},
+};
+
 static int
 urio_probe(device_t dev)
 {
 	struct usb_attach_arg *uaa = device_get_ivars(dev);
 
-	if (uaa->usb_mode != USB_MODE_HOST) {
+	if (uaa->usb_mode != USB_MODE_HOST)
 		return (ENXIO);
-	}
-	if ((((uaa->info.idVendor == USB_VENDOR_DIAMOND) &&
-	    (uaa->info.idProduct == USB_PRODUCT_DIAMOND_RIO500USB)) ||
-	    ((uaa->info.idVendor == USB_VENDOR_DIAMOND2) &&
-	    ((uaa->info.idProduct == USB_PRODUCT_DIAMOND2_RIO600USB) ||
-	    (uaa->info.idProduct == USB_PRODUCT_DIAMOND2_RIO800USB)))))
-		return (0);
-	else
+	if (uaa->info.bConfigIndex != 0)
 		return (ENXIO);
+	if (uaa->info.bIfaceIndex != 0)
+		return (ENXIO);
+
+	return (usbd_lookup_id_by_uaa(urio_devs, sizeof(urio_devs), uaa));
 }
 
 static int

Modified: stable/8/sys/dev/usb/usb_device.c
==============================================================================
--- stable/8/sys/dev/usb/usb_device.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/usb_device.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -1297,6 +1297,21 @@ usb_probe_and_attach(struct usb_device *
 
 	usb_init_attach_arg(udev, &uaa);
 
+	/*
+	 * If the whole USB device is targeted, invoke the USB event
+	 * handler(s):
+	 */
+	if (iface_index == USB_IFACE_INDEX_ANY) {
+
+		EVENTHANDLER_INVOKE(usb_dev_configured, udev, &uaa);
+
+		if (uaa.dev_state != UAA_DEV_READY) {
+			/* leave device unconfigured */
+			usb_unconfigure(udev, 0);
+			goto done;
+		}
+	}
+
 	/* Check if only one interface should be probed: */
 	if (iface_index != USB_IFACE_INDEX_ANY) {
 		i = iface_index;
@@ -1343,17 +1358,18 @@ usb_probe_and_attach(struct usb_device *
 		    uaa.info.bIfaceIndex,
 		    uaa.info.bIfaceNum);
 
-		if (usb_probe_and_attach_sub(udev, &uaa)) {
-			/* ignore */
-		}
-	}
+		usb_probe_and_attach_sub(udev, &uaa);
 
-	if (uaa.temp_dev) {
-		/* remove the last created child; it is unused */
-
-		if (device_delete_child(udev->parent_dev, uaa.temp_dev)) {
+		/*
+		 * Remove the leftover child, if any, to enforce that
+		 * a new nomatch devd event is generated for the next
+		 * interface if no driver is found:
+		 */
+		if (uaa.temp_dev == NULL)
+			continue;
+		if (device_delete_child(udev->parent_dev, uaa.temp_dev))
 			DPRINTFN(0, "device delete child failed\n");
-		}
+		uaa.temp_dev = NULL;
 	}
 done:
 	if (do_unlock)
@@ -1526,7 +1542,7 @@ usb_alloc_device(device_t parent_dev, st
 
 	/* initialise our SX-lock */
 	sx_init_flags(&udev->enum_sx, "USB config SX lock", SX_DUPOK);
-	sx_init_flags(&udev->sr_sx, "USB suspend and resume SX lock", SX_DUPOK);
+	sx_init_flags(&udev->sr_sx, "USB suspend and resume SX lock", SX_NOWITNESS);
 
 	cv_init(&udev->ctrlreq_cv, "WCTRL");
 	cv_init(&udev->ref_cv, "UGONE");
@@ -1834,11 +1850,6 @@ repeat_set_config:
 			}
 		}
 	}
-	EVENTHANDLER_INVOKE(usb_dev_configured, udev, &uaa);
-	if (uaa.dev_state != UAA_DEV_READY) {
-		/* leave device unconfigured */
-		usb_unconfigure(udev, 0);
-	}
 
 config_done:
 	DPRINTF("new dev (addr %d), udev=%p, parent_hub=%p\n",

Modified: stable/8/sys/dev/usb/usb_hub.c
==============================================================================
--- stable/8/sys/dev/usb/usb_hub.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/usb_hub.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -1334,15 +1334,19 @@ uhub_child_pnpinfo_string(device_t paren
 		    "devclass=0x%02x devsubclass=0x%02x "
 		    "sernum=\"%s\" "
 		    "release=0x%04x "
-		    "intclass=0x%02x intsubclass=0x%02x" "%s%s",
+		    "mode=%s "
+		    "intclass=0x%02x intsubclass=0x%02x "
+		    "intprotocol=0x%02x " "%s%s",
 		    UGETW(res.udev->ddesc.idVendor),
 		    UGETW(res.udev->ddesc.idProduct),
 		    res.udev->ddesc.bDeviceClass,
 		    res.udev->ddesc.bDeviceSubClass,
 		    usb_get_serial(res.udev),
 		    UGETW(res.udev->ddesc.bcdDevice),
+		    (res.udev->flags.usb_mode == USB_MODE_HOST) ? "host" : "device",
 		    iface->idesc->bInterfaceClass,
 		    iface->idesc->bInterfaceSubClass,
+		    iface->idesc->bInterfaceProtocol,
 		    iface->pnpinfo ? " " : "",
 		    iface->pnpinfo ? iface->pnpinfo : "");
 	} else {

Modified: stable/8/sys/dev/usb/usb_lookup.c
==============================================================================
--- stable/8/sys/dev/usb/usb_lookup.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/usb_lookup.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -42,6 +42,8 @@
 #include <sys/callout.h>
 #include <sys/malloc.h>
 #include <sys/priv.h>
+#include <sys/limits.h>
+#include <sys/endian.h>
 
 #include <dev/usb/usb.h>
 #include <dev/usb/usbdi.h>
@@ -105,13 +107,6 @@ usbd_lookup_id_by_info(const struct usb_
 		    (id->bDeviceProtocol != info->bDeviceProtocol)) {
 			continue;
 		}
-		if ((info->bDeviceClass == 0xFF) &&
-		    (!(id->match_flag_vendor)) &&
-		    ((id->match_flag_int_class) ||
-		    (id->match_flag_int_subclass) ||
-		    (id->match_flag_int_protocol))) {
-			continue;
-		}
 		if ((id->match_flag_int_class) &&
 		    (id->bInterfaceClass != info->bInterfaceClass)) {
 			continue;
@@ -151,3 +146,108 @@ usbd_lookup_id_by_uaa(const struct usb_d
 	}
 	return (ENXIO);
 }
+
+/*------------------------------------------------------------------------*
+ *	Export the USB device ID format we use to userspace tools.
+ *------------------------------------------------------------------------*/
+#if BYTE_ORDER == BIG_ENDIAN
+#define	U16_XOR "8"
+#define	U32_XOR "12"
+#define	U64_XOR "56"
+#define	U8_BITFIELD_XOR "7"
+#define	U16_BITFIELD_XOR "15"
+#define	U32_BITFIELD_XOR "31"
+#define	U64_BITFIELD_XOR "63"
+#else
+#define	U16_XOR "0"
+#define	U32_XOR "0"
+#define	U64_XOR "0"
+#define	U8_BITFIELD_XOR "0"
+#define	U16_BITFIELD_XOR "0"
+#define	U32_BITFIELD_XOR "0"
+#define	U64_BITFIELD_XOR "0"
+#endif
+
+#if USB_HAVE_COMPAT_LINUX
+#define	MFL_SIZE "1"
+#else
+#define	MFL_SIZE "0"
+#endif
+
+#ifdef KLD_MODULE
+static const char __section("bus_autoconf_format") __used usb_id_format[] = {
+
+	/* Declare that three different sections use the same format */
+
+	"usb_host_id{256,:}"
+	"usb_device_id{256,:}"
+	"usb_dual_id{256,:}"
+
+	/* List size of fields in the usb_device_id structure */
+
+#if ULONG_MAX >= 0xFFFFFFFFUL
+	"unused{0,8}"
+	"unused{0,8}"
+	"unused{0,8}"
+	"unused{0,8}"
+#if ULONG_MAX >= 0xFFFFFFFFFFFFFFFFULL
+	"unused{0,8}"
+	"unused{0,8}"
+	"unused{0,8}"
+	"unused{0,8}"
+#endif
+#else
+#error "Please update code."
+#endif
+
+	"idVendor[0]{" U16_XOR ",8}"
+	"idVendor[1]{" U16_XOR ",8}"
+	"idProduct[0]{" U16_XOR ",8}"
+	"idProduct[1]{" U16_XOR ",8}"
+	"bcdDevice_lo[0]{" U16_XOR ",8}"
+	"bcdDevice_lo[1]{" U16_XOR ",8}"
+	"bcdDevice_hi[0]{" U16_XOR ",8}"
+	"bcdDevice_hi[1]{" U16_XOR ",8}"
+
+	"bDeviceClass{0,8}"
+	"bDeviceSubClass{0,8}"
+	"bDeviceProtocol{0,8}"
+	"bInterfaceClass{0,8}"
+	"bInterfaceSubClass{0,8}"
+	"bInterfaceProtocol{0,8}"
+
+	"mf_vendor{" U8_BITFIELD_XOR ",1}"
+	"mf_product{" U8_BITFIELD_XOR ",1}"
+	"mf_dev_lo{" U8_BITFIELD_XOR ",1}"
+	"mf_dev_hi{" U8_BITFIELD_XOR ",1}"
+
+	"mf_dev_class{" U8_BITFIELD_XOR ",1}"
+	"mf_dev_subclass{" U8_BITFIELD_XOR ",1}"
+	"mf_dev_protocol{" U8_BITFIELD_XOR ",1}"
+	"mf_int_class{" U8_BITFIELD_XOR ",1}"
+
+	"mf_int_subclass{" U8_BITFIELD_XOR ",1}"
+	"mf_int_protocol{" U8_BITFIELD_XOR ",1}"
+	"unused{" U8_BITFIELD_XOR ",6}"
+
+	"mfl_vendor{" U16_XOR "," MFL_SIZE "}"
+	"mfl_product{" U16_XOR "," MFL_SIZE "}"
+	"mfl_dev_lo{" U16_XOR "," MFL_SIZE "}"
+	"mfl_dev_hi{" U16_XOR "," MFL_SIZE "}"
+
+	"mfl_dev_class{" U16_XOR "," MFL_SIZE "}"
+	"mfl_dev_subclass{" U16_XOR "," MFL_SIZE "}"
+	"mfl_dev_protocol{" U16_XOR "," MFL_SIZE "}"
+	"mfl_int_class{" U16_XOR "," MFL_SIZE "}"
+
+	"mfl_int_subclass{" U16_XOR "," MFL_SIZE "}"
+	"mfl_int_protocol{" U16_XOR "," MFL_SIZE "}"
+	"unused{" U16_XOR "," MFL_SIZE "}"
+	"unused{" U16_XOR "," MFL_SIZE "}"
+
+	"unused{" U16_XOR "," MFL_SIZE "}"
+	"unused{" U16_XOR "," MFL_SIZE "}"
+	"unused{" U16_XOR "," MFL_SIZE "}"
+	"unused{" U16_XOR "," MFL_SIZE "}"
+};
+#endif

Modified: stable/8/sys/dev/usb/usb_msctest.c
==============================================================================
--- stable/8/sys/dev/usb/usb_msctest.c	Mon Jun 27 20:32:19 2011	(r223604)
+++ stable/8/sys/dev/usb/usb_msctest.c	Mon Jun 27 20:59:43 2011	(r223605)
@@ -489,6 +489,24 @@ bbb_attach(struct usb_device *udev, uint
 	struct usb_interface_descriptor *id;
 	struct bbb_transfer *sc;
 	usb_error_t err;
+	uint8_t do_unlock;
+
+	/* automatic locking */
+	if (usbd_enum_is_locked(udev)) {
+		do_unlock = 0;
+	} else {
+		do_unlock = 1;
+		usbd_enum_lock(udev);
+	}
+
+	/*
+	 * Make sure any driver which is hooked up to this interface,
+	 * like umass is gone:
+	 */
+	usb_detach_device(udev, iface_index, 0);
+
+	if (do_unlock)
+		usbd_enum_unlock(udev);
 
 	iface = usbd_get_iface(udev, iface_index);

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201106272059.p5RKxiKI013470>