PERFORCE change 144430 for review

Hans Petter Selasky hselasky at FreeBSD.org
Tue Jul 1 17:02:02 UTC 2008


http://perforce.freebsd.org/chv.cgi?CH=144430

Change 144430 by hselasky at hselasky_laptop001 on 2008/07/01 17:01:14

	
	Finished new USB quirk module. USB quirks are now in a
	separate module and are loaded when needed. The quirks
	can also be updated without having to restart the whole
	USB stack.

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb2/quirk/usb2_quirk.c#2 edit
.. //depot/projects/usb/src/sys/dev/usb2/quirk/usb2_quirk.h#2 edit
.. //depot/projects/usb/src/sys/modules/usb2/quirk/Makefile#2 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/usb2/quirk/usb2_quirk.c#2 (text+ko) ====

@@ -1,13 +1,8 @@
-/*	$NetBSD: usb_quirks.c,v 1.50 2004/06/23 02:30:52 mycroft Exp $	*/
-
 /*-
- * Copyright (c) 1998 The NetBSD Foundation, Inc.
- * All rights reserved.
+ * Copyright (c) 1998 The NetBSD Foundation, Inc. All rights reserved.
+ * Copyright (c) 1998 Lennart Augustsson. All rights reserved.
+ * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
  *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Lennart Augustsson (lennart at augustsson.net) at
- * Carlstedt Research & Technology.
- *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -16,133 +11,151 @@
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *        This product includes software developed by the NetBSD
- *        Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
  *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  */
 
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/usb/usb_quirks.c,v 1.65 2008/03/14 15:59:30 jkim Exp $");
+#include <dev/usb2/include/usb2_mfunc.h>
+#include <dev/usb2/include/usb2_devid.h>
+
+#define	USB_DEBUG_VAR usb2_debug
+
+#include <dev/usb2/core/usb2_core.h>
+#include <dev/usb2/core/usb2_lookup.h>
+#include <dev/usb2/core/usb2_debug.h>
+#include <dev/usb2/core/usb2_dynamic.h>
 
-#include <sys/param.h>
-#include <sys/systm.h>
+#include <dev/usb2/quirk/usb2_quirk.h>
 
-#include <dev/usb/usb_port.h>
-#include <dev/usb/usb.h>
-#include <dev/usb/usb_quirks.h>
+MODULE_DEPEND(usb2_quirk, usb2_core, 1, 1, 1);
+MODULE_VERSION(usb2_quirk, 1);
 
-#include "usbdevs.h"
+/*
+ * The following macro adds a quirk for any revision of a device:
+ */
+#define	USB_VPA(v,p,r,...)					\
+    USB_VPI(v,p,((const uint16_t []){__VA_ARGS__}))
 
-#define	ANY 0xffff
+/*
+ * The following macro adds a quirk for a specific revision of a
+ * device:
+ */
+#define	USB_VPR(v,p,r,...)				\
+    USB_VPI(v,p, ((const uint16_t []){__VA_ARGS__})),	\
+    USB_DEV_BCD_LTEQ(r),				\
+    USB_DEV_BCD_GTEQ(r)
 
-struct usbd_quirk_entry {
-	uint16_t idVendor;
-	uint16_t idProduct;
-	uint16_t bcdDevice;
-	struct usbd_quirks quirks;
-};
+/* try to keep the quirks on one line, hence grepping becomes easier */
 
-static const struct usbd_quirk_entry usb_quirks[] = {
-	{USB_VENDOR_ASUS, USB_PRODUCT_ASUS_LCM, ANY, {UQ_HID_IGNORE}},
-	{USB_VENDOR_INSIDEOUT, USB_PRODUCT_INSIDEOUT_EDGEPORT4,
-	0x094, {UQ_SWAP_UNICODE}},
-	{USB_VENDOR_DALLAS, USB_PRODUCT_DALLAS_J6502, 0x0a2, {UQ_BAD_ADC}},
-	{USB_VENDOR_DALLAS, USB_PRODUCT_DALLAS_J6502, 0x0a2, {UQ_AU_NO_XU}},
-	{USB_VENDOR_ALTEC, USB_PRODUCT_ALTEC_ADA70, 0x103, {UQ_BAD_ADC}},
-	{USB_VENDOR_ALTEC, USB_PRODUCT_ALTEC_ASC495, 0x000, {UQ_BAD_AUDIO}},
-	{USB_VENDOR_QTRONIX, USB_PRODUCT_QTRONIX_980N, 0x110, {UQ_SPUR_BUT_UP}},
-	{USB_VENDOR_ALCOR2, USB_PRODUCT_ALCOR2_KBD_HUB, 0x001, {UQ_SPUR_BUT_UP}},
-	{USB_VENDOR_MCT, USB_PRODUCT_MCT_HUB0100, 0x102, {UQ_BUS_POWERED}},
-	{USB_VENDOR_MCT, USB_PRODUCT_MCT_USB232, 0x102, {UQ_BUS_POWERED}},
-	{USB_VENDOR_TI, USB_PRODUCT_TI_UTUSB41, 0x110, {UQ_POWER_CLAIM}},
-	{USB_VENDOR_TELEX, USB_PRODUCT_TELEX_MIC1, 0x009, {UQ_AU_NO_FRAC}},
-	{USB_VENDOR_SILICONPORTALS, USB_PRODUCT_SILICONPORTALS_YAPPHONE,
-	0x100, {UQ_AU_INP_ASYNC}},
-	{USB_VENDOR_LOGITECH, USB_PRODUCT_LOGITECH_UN53B, ANY, {UQ_NO_STRINGS}},
+static const struct usb2_device_id usb2_quirks[] = {
+	{USB_VPA(USB_VENDOR_ASUS, USB_PRODUCT_ASUS_LCM, 0x000, UQ_HID_IGNORE, UQ_NONE)},
+	{USB_VPR(USB_VENDOR_INSIDEOUT, USB_PRODUCT_INSIDEOUT_EDGEPORT4, 0x094, UQ_SWAP_UNICODE, UQ_NONE)},
+	{USB_VPR(USB_VENDOR_DALLAS, USB_PRODUCT_DALLAS_J6502, 0x0a2, UQ_BAD_ADC, UQ_NONE)},
+	{USB_VPR(USB_VENDOR_DALLAS, USB_PRODUCT_DALLAS_J6502, 0x0a2, UQ_AU_NO_XU, UQ_NONE)},
+	{USB_VPR(USB_VENDOR_ALTEC, USB_PRODUCT_ALTEC_ADA70, 0x103, UQ_BAD_ADC, UQ_NONE)},
+	{USB_VPR(USB_VENDOR_ALTEC, USB_PRODUCT_ALTEC_ASC495, 0x000, UQ_BAD_AUDIO, UQ_NONE)},
+	{USB_VPR(USB_VENDOR_QTRONIX, USB_PRODUCT_QTRONIX_980N, 0x110, UQ_SPUR_BUT_UP, UQ_NONE)},
+	{USB_VPR(USB_VENDOR_ALCOR2, USB_PRODUCT_ALCOR2_KBD_HUB, 0x001, UQ_SPUR_BUT_UP, UQ_NONE)},
+	{USB_VPR(USB_VENDOR_MCT, USB_PRODUCT_MCT_HUB0100, 0x102, UQ_BUS_POWERED, UQ_NONE)},
+	{USB_VPR(USB_VENDOR_MCT, USB_PRODUCT_MCT_USB232, 0x102, UQ_BUS_POWERED, UQ_NONE)},
+	{USB_VPR(USB_VENDOR_TI, USB_PRODUCT_TI_UTUSB41, 0x110, UQ_POWER_CLAIM, UQ_NONE)},
+	{USB_VPR(USB_VENDOR_TELEX, USB_PRODUCT_TELEX_MIC1, 0x009, UQ_AU_NO_FRAC, UQ_NONE)},
+	{USB_VPR(USB_VENDOR_SILICONPORTALS, USB_PRODUCT_SILICONPORTALS_YAPPHONE, 0x100, UQ_AU_INP_ASYNC, UQ_NONE)},
+	{USB_VPA(USB_VENDOR_LOGITECH, USB_PRODUCT_LOGITECH_UN53B, 0x000, UQ_NO_STRINGS, UQ_NONE)},
 	/*
 	 * XXX These should have a revision number, but I don't know what
 	 * they are.
 	 */
-	{USB_VENDOR_HP, USB_PRODUCT_HP_895C, ANY, {UQ_BROKEN_BIDIR}},
-	{USB_VENDOR_HP, USB_PRODUCT_HP_880C, ANY, {UQ_BROKEN_BIDIR}},
-	{USB_VENDOR_HP, USB_PRODUCT_HP_815C, ANY, {UQ_BROKEN_BIDIR}},
-	{USB_VENDOR_HP, USB_PRODUCT_HP_810C, ANY, {UQ_BROKEN_BIDIR}},
-	{USB_VENDOR_HP, USB_PRODUCT_HP_830C, ANY, {UQ_BROKEN_BIDIR}},
-	{USB_VENDOR_HP, USB_PRODUCT_HP_1220C, ANY, {UQ_BROKEN_BIDIR}},
-	{USB_VENDOR_XEROX, USB_PRODUCT_XEROX_WCM15, ANY, {UQ_BROKEN_BIDIR}},
+	{USB_VPA(USB_VENDOR_HP, USB_PRODUCT_HP_895C, 0x000, UQ_BROKEN_BIDIR, UQ_NONE)},
+	{USB_VPA(USB_VENDOR_HP, USB_PRODUCT_HP_880C, 0x000, UQ_BROKEN_BIDIR, UQ_NONE)},
+	{USB_VPA(USB_VENDOR_HP, USB_PRODUCT_HP_815C, 0x000, UQ_BROKEN_BIDIR, UQ_NONE)},
+	{USB_VPA(USB_VENDOR_HP, USB_PRODUCT_HP_810C, 0x000, UQ_BROKEN_BIDIR, UQ_NONE)},
+	{USB_VPA(USB_VENDOR_HP, USB_PRODUCT_HP_830C, 0x000, UQ_BROKEN_BIDIR, UQ_NONE)},
+	{USB_VPA(USB_VENDOR_HP, USB_PRODUCT_HP_1220C, 0x000, UQ_BROKEN_BIDIR, UQ_NONE)},
+	{USB_VPA(USB_VENDOR_XEROX, USB_PRODUCT_XEROX_WCM15, 0x000, UQ_BROKEN_BIDIR, UQ_NONE)},
 	/* Devices which should be ignored by uhid */
-	{USB_VENDOR_APC, USB_PRODUCT_APC_UPS,
-	ANY, {UQ_HID_IGNORE}},
-	{USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F6C550AVR,
-	ANY, {UQ_HID_IGNORE}},
-	{USB_VENDOR_DELORME, USB_PRODUCT_DELORME_EARTHMATE,
-	ANY, {UQ_HID_IGNORE}},
-	{USB_VENDOR_ITUNERNET, USB_PRODUCT_ITUNERNET_USBLCD2X20,
-	ANY, {UQ_HID_IGNORE}},
-	{USB_VENDOR_MGE, USB_PRODUCT_MGE_UPS1,
-	ANY, {UQ_HID_IGNORE}},
-	{USB_VENDOR_MGE, USB_PRODUCT_MGE_UPS2,
-	ANY, {UQ_HID_IGNORE}},
+	{USB_VPA(USB_VENDOR_APC, USB_PRODUCT_APC_UPS, 0x000, UQ_HID_IGNORE, UQ_NONE)},
+	{USB_VPA(USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F6C550AVR, 0x000, UQ_HID_IGNORE, UQ_NONE)},
+	{USB_VPA(USB_VENDOR_DELORME, USB_PRODUCT_DELORME_EARTHMATE, 0x000, UQ_HID_IGNORE, UQ_NONE)},
+	{USB_VPA(USB_VENDOR_ITUNERNET, USB_PRODUCT_ITUNERNET_USBLCD2X20, 0x000, UQ_HID_IGNORE, UQ_NONE)},
+	{USB_VPA(USB_VENDOR_MGE, USB_PRODUCT_MGE_UPS1, 0x000, UQ_HID_IGNORE, UQ_NONE)},
+	{USB_VPA(USB_VENDOR_MGE, USB_PRODUCT_MGE_UPS2, 0x000, UQ_HID_IGNORE, UQ_NONE)},
 	/* Devices which should be ignored by both ukbd and uhid */
-	{USB_VENDOR_CYPRESS, USB_PRODUCT_CYPRESS_WISPY1A,
-	ANY, {UQ_KBD_IGNORE}},
-	{USB_VENDOR_METAGEEK, USB_PRODUCT_METAGEEK_WISPY1B,
-	ANY, {UQ_KBD_IGNORE}},
-	{USB_VENDOR_TENX, USB_PRODUCT_TENX_UAUDIO0,
-	0x0101, {UQ_AUDIO_SWAP_LR}},
+	{USB_VPA(USB_VENDOR_CYPRESS, USB_PRODUCT_CYPRESS_WISPY1A, 0x000, UQ_KBD_IGNORE, UQ_HID_IGNORE, UQ_NONE)},
+	{USB_VPA(USB_VENDOR_METAGEEK, USB_PRODUCT_METAGEEK_WISPY1B, 0x000, UQ_KBD_IGNORE, UQ_HID_IGNORE, UQ_NONE)},
+	{USB_VPR(USB_VENDOR_TENX, USB_PRODUCT_TENX_UAUDIO0, 0x0101, UQ_AUDIO_SWAP_LR, UQ_NONE)},
 
 	/* MS keyboards do weird things */
-	{USB_VENDOR_MICROSOFT, USB_PRODUCT_MICROSOFT_WLNOTEBOOK,
-	ANY, {UQ_MS_BAD_CLASS | UQ_MS_LEADING_BYTE}},
-	{USB_VENDOR_MICROSOFT, USB_PRODUCT_MICROSOFT_WLNOTEBOOK2,
-	ANY, {UQ_MS_BAD_CLASS | UQ_MS_LEADING_BYTE}},
-	{USB_VENDOR_MICROSOFT, USB_PRODUCT_MICROSOFT_WLINTELLIMOUSE,
-	ANY, {UQ_MS_LEADING_BYTE}},
+	{USB_VPA(USB_VENDOR_MICROSOFT, USB_PRODUCT_MICROSOFT_WLNOTEBOOK, 0x000, UQ_MS_BAD_CLASS, UQ_MS_LEADING_BYTE, UQ_NONE)},
+	{USB_VPA(USB_VENDOR_MICROSOFT, USB_PRODUCT_MICROSOFT_WLNOTEBOOK2, 0x000, UQ_MS_BAD_CLASS, UQ_MS_LEADING_BYTE, UQ_NONE)},
+	{USB_VPA(USB_VENDOR_MICROSOFT, USB_PRODUCT_MICROSOFT_WLINTELLIMOUSE, 0x000, UQ_MS_LEADING_BYTE, UQ_NONE)},
+	{USB_VPA(USB_VENDOR_METAGEEK, USB_PRODUCT_METAGEEK_WISPY24X, 0x000, UQ_KBD_IGNORE, UQ_HID_IGNORE, UQ_NONE)},
+};
 
-	{USB_VENDOR_METAGEEK, USB_PRODUCT_METAGEEK_WISPY24X,
-	ANY, {UQ_KBD_IGNORE}},
+USB_MAKE_DEBUG_TABLE(USB_QUIRK);
 
-	{0, 0, 0, {0}}
-};
+/*------------------------------------------------------------------------*
+ *	usb2_quirkstr
+ *
+ * This function converts an USB quirk code into a string.
+ *------------------------------------------------------------------------*/
+static const char *
+usb2_quirkstr(uint16_t quirk)
+{
+	return ((quirk < USB_QUIRK_MAX) ?
+	    USB_QUIRK[quirk] : "USB_QUIRK_UNKNOWN");
+}
 
-const struct usbd_quirks usbd_no_quirk = {0};
-
-const struct usbd_quirks *
-usbd_find_quirk(usb_device_descriptor_t *d)
+/*------------------------------------------------------------------------*
+ *	usb2_test_quirk_by_info
+ *
+ * Returns:
+ * 0: Quirk not found
+ * Else: Quirk found
+ *------------------------------------------------------------------------*/
+static uint8_t
+usb2_test_quirk_by_info(const struct usb2_lookup_info *info, uint16_t quirk)
 {
-	const struct usbd_quirk_entry *t;
-	uint16_t vendor = UGETW(d->idVendor);
-	uint16_t product = UGETW(d->idProduct);
-	uint16_t revision = UGETW(d->bcdDevice);
+	const struct usb2_device_id *pe;
+	const uint16_t *px;
 
-	for (t = usb_quirks; t->idVendor != 0; t++) {
-		if (t->idVendor == vendor &&
-		    t->idProduct == product &&
-		    (t->bcdDevice == ANY || t->bcdDevice == revision))
-			break;
+	if (quirk == UQ_NONE) {
+		return (0);
 	}
-#ifdef USB_DEBUG
-	if (usbdebug && t->quirks.uq_flags) {
-		printf("usbd_find_quirk 0x%04x/0x%04x/%x: %d\n",
-		    UGETW(d->idVendor), UGETW(d->idProduct),
-		    UGETW(d->bcdDevice), t->quirks.uq_flags);
+	pe = usb2_lookup_id_by_info(usb2_quirks, sizeof(usb2_quirks), info);
+	if (pe && pe->driver_info) {
+		px = pe->driver_info;
+		while (1) {
+			if (*px == quirk) {
+				DPRINTF(0, "Found quirk '%s'.\n", usb2_quirkstr(quirk));
+				return (1);
+			}
+			if (*px == UQ_NONE) {
+				return (0);
+			}
+			px++;
+		}
 	}
-#endif
-	return (&t->quirks);
+	return (0);
+}
+
+static void
+usb2_quirk_init(void *arg)
+{
+	/* register our function */
+	usb2_test_quirk_p = &usb2_test_quirk_by_info;
+	return;
 }
+
+SYSINIT(usb2_quirk_init, SI_SUB_LOCK, SI_ORDER_FIRST, usb2_quirk_init, NULL);
+SYSUNINIT(usb2_quirk_unload, SI_SUB_LOCK, SI_ORDER_ANY, usb2_quirk_unload, NULL);

==== //depot/projects/usb/src/sys/dev/usb2/quirk/usb2_quirk.h#2 (text+ko) ====

@@ -1,13 +1,5 @@
-/*	$NetBSD: usb_quirks.h,v 1.20 2001/04/15 09:38:01 augustss Exp $	*/
-/*	$FreeBSD: src/sys/dev/usb/usb_quirks.h,v 1.25 2007/06/29 21:07:41 imp Exp $ */
-
 /*-
- * Copyright (c) 1998 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Lennart Augustsson (lennart at augustsson.net) at
- * Carlstedt Research & Technology.
+ * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -17,57 +9,72 @@
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *        This product includes software developed by the NetBSD
- *        Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
  *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  */
 
-struct usbd_quirks {
-	uint32_t uq_flags;		/* Device problems: */
-#define	UQ_AUDIO_SWAP_LR (1 <<  0)	/* left and right sound channels are
-					 * swapped */
-#define	UQ_AU_INP_ASYNC  (1 <<  1)	/* input is async despite claim of
-					 * adaptive */
-#define	UQ_AU_NO_FRAC    (1 <<  2)	/* don't adjust for fractional samples */
-#define	UQ_AU_NO_XU      (1 <<  3)	/* audio device has broken extension
-					 * unit */
-#define	UQ_BAD_ADC       (1 <<  4)	/* bad audio spec version number */
-#define	UQ_BAD_AUDIO     (1 <<  5)	/* device claims audio class, but
-					 * isn't */
-#define	UQ_BROKEN_BIDIR  (1 <<  6)	/* printer has broken bidir mode */
-#define	UQ_BUS_POWERED   (1 <<  7)	/* device is bus powered, despite
-					 * claim */
-#define	UQ_HID_IGNORE    (1 <<  8)	/* device should be ignored by hid
-					 * class */
-#define	UQ_KBD_IGNORE   ((1 <<  9)|UQ_HID_IGNORE)	/* device should be
-							 * ignored by both kbd
-							 * and hid class */
-#define	UQ_MS_BAD_CLASS  (1 << 10)	/* doesn't identify properly */
-#define	UQ_MS_LEADING_BYTE (1 << 11)	/* mouse sends an unknown leading byte */
-#define	UQ_MS_REVZ       (1 << 12)	/* mouse has Z-axis reversed */
-#define	UQ_NO_STRINGS    (1 << 13)	/* string descriptors are broken */
-#define	UQ_OPEN_CLEARSTALL (1 << 14)	/* device needs clear endpoint stall */
-#define	UQ_POWER_CLAIM   (1 << 15)	/* hub lies about power status */
-#define	UQ_SPUR_BUT_UP   (1 << 16)	/* spurious mouse button up events */
-#define	UQ_SWAP_UNICODE  (1 << 17)	/* has some Unicode strings swapped */
-};
+#ifndef _USB2_QUIRK_H_
+#define	_USB2_QUIRK_H_
+
+/* NOTE: UQ_NONE is not a valid quirk */
+
+#define	USB_QUIRK(m,n)					\
+  m(n, UQ_NONE)						\
+  /* left and right sound channels are swapped */	\
+  m(n, UQ_AUDIO_SWAP_LR)				\
+  /* input is async despite claim of adaptive */	\
+  m(n, UQ_AU_INP_ASYNC)					\
+  /* don't adjust for fractional samples */		\
+  m(n, UQ_AU_NO_FRAC)					\
+  /* audio device has broken extension unit */		\
+  m(n, UQ_AU_NO_XU)					\
+  /* bad audio spec version number */			\
+  m(n, UQ_BAD_ADC)					\
+  /* device claims audio class, but isn't */		\
+  m(n, UQ_BAD_AUDIO)					\
+  /* printer has broken bidir mode */			\
+  m(n, UQ_BROKEN_BIDIR)					\
+  /* device is bus powered, despite claim */		\
+  m(n, UQ_BUS_POWERED)					\
+  /* device should be ignored by hid class */		\
+  m(n, UQ_HID_IGNORE)					\
+  /* device should be ignored by kbd class */		\
+  m(n, UQ_KBD_IGNORE)					\
+  /* doesn't identify properly */			\
+  m(n, UQ_MS_BAD_CLASS)					\
+  /* mouse sends an unknown leading byte */		\
+  m(n, UQ_MS_LEADING_BYTE)				\
+  /* mouse has Z-axis reversed */			\
+  m(n, UQ_MS_REVZ)					\
+  /* string descriptors are broken */			\
+  m(n, UQ_NO_STRINGS)					\
+  /* device needs clear endpoint stall */		\
+  m(n, UQ_OPEN_CLEARSTALL)				\
+  /* hub lies about power status */			\
+  m(n, UQ_POWER_CLAIM)					\
+  /* spurious mouse button up events */			\
+  m(n, UQ_SPUR_BUT_UP)					\
+  /* has some Unicode strings swapped */		\
+  m(n, UQ_SWAP_UNICODE)					\
+  /* select configuration index 1 by default */		\
+  m(n, UQ_CFG_INDEX_1)					\
+  /* select configuration index 2 by default */		\
+  m(n, UQ_CFG_INDEX_2)					\
+  /* select configuration index 3 by default */		\
+  m(n, UQ_CFG_INDEX_3)					\
+  /* select configuration index 4 by default */		\
+  m(n, UQ_CFG_INDEX_4)
 
-extern const struct usbd_quirks usbd_no_quirk;
+USB_MAKE_ENUM(USB_QUIRK);
 
-const struct usbd_quirks *usbd_find_quirk(usb_device_descriptor_t *);
+#endif					/* _USB2_QUIRK_H_ */

==== //depot/projects/usb/src/sys/modules/usb2/quirk/Makefile#2 (text+ko) ====

@@ -1,0 +1,10 @@
+S=     ${.CURDIR}/../../..
+
+.PATH: $S/dev/usb2/quirk
+
+KMOD=  usb2_quirk
+SRCS= 
+SRCS+= bus_if.h usb2_if.h device_if.h vnode_if.h opt_usb.h opt_bus.h
+SRCS+= usb2_quirk.c
+
+.include <bsd.kmod.mk>


More information about the p4-projects mailing list