conf/157903: commit references a PR

dfilter service dfilter at FreeBSD.ORG
Mon Jun 27 21:10:11 UTC 2011


The following reply was made to PR conf/157903; it has been noted by GNATS.

From: dfilter at FreeBSD.ORG (dfilter service)
To: bug-followup at FreeBSD.org
Cc:  
Subject: Re: conf/157903: commit references a PR
Date: Mon, 27 Jun 2011 21:00:28 +0000 (UTC)

 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 ***
 _______________________________________________
 svn-src-all at freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe at freebsd.org"
 


More information about the freebsd-bugs mailing list