Date: Tue, 1 Jul 2008 17:02:02 GMT From: Hans Petter Selasky <hselasky@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 144430 for review Message-ID: <200807011702.m61H22mb046535@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=144430 Change 144430 by hselasky@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@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@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>
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200807011702.m61H22mb046535>