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