Date: Sun, 19 Feb 2006 14:23:33 +0100 From: Fredrik Lindberg <fli+freebsd-current@shapeshifter.se> To: freebsd-current@freebsd.org Subject: USB and clear endpoint stall Message-ID: <43F87155.3050103@shapeshifter.se>
next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------040001020400000200060600
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
After a quite recent -current update, UPEKs touchchip driver began
to run dead slow and by turning on debugging for libusb (which the
driver utilize) I noticed several 5 seconds long read timeouts.
These timeouts were not present with the same driver on an earlier
current and I think I've tracked it down to the commits on Jan 8
which dropped usbd_clear_endpoint_stall() from usbd_setup_pipe().
Apparently this device needs this, because after re-adding this
functionallity the timeout disappears.
I've attached a patch that works for me, it's basicly the same
as before Jan 8, but with the quirk reversed.
My USB-foo isn't that good so people with better understanding
of the USB stack might have a better fix for this.
Fredrik Lindberg
--------------040001020400000200060600
Content-Type: text/plain;
name="usb-open-clearstall-20060219.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="usb-open-clearstall-20060219.patch"
Index: sys/dev/usb/usb_quirks.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/usb/usb_quirks.c,v
retrieving revision 1.47
diff -u -r1.47 usb_quirks.c
--- sys/dev/usb/usb_quirks.c 8 Jan 2006 03:34:29 -0000 1.47
+++ sys/dev/usb/usb_quirks.c 19 Feb 2006 09:59:34 -0000
@@ -79,6 +79,8 @@
{ 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_STMICRO, USB_PRODUCT_STMICRO_BIOCPU,
+ ANY, { UQ_OPEN_CLEARSTALL }},
/* 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 }},
Index: sys/dev/usb/usb_quirks.h
===================================================================
RCS file: /home/ncvs/src/sys/dev/usb/usb_quirks.h,v
retrieving revision 1.21
diff -u -r1.21 usb_quirks.h
--- sys/dev/usb/usb_quirks.h 8 Jan 2006 03:34:29 -0000 1.21
+++ sys/dev/usb/usb_quirks.h 19 Feb 2006 09:59:34 -0000
@@ -54,6 +54,7 @@
#define UQ_AU_INP_ASYNC 0x0800 /* input is async despite claim of adaptive */
#define UQ_ASSUME_CM_OVER_DATA 0x1000 /* modem device breaks on cm over data */
#define UQ_BROKEN_BIDIR 0x2000 /* printer has broken bidir mode */
+#define UQ_OPEN_CLEARSTALL 0x4000 /* device needs clear endpoint stall */
#define UQ_HID_IGNORE 0x8000 /* device should be ignored by hid class */
};
Index: sys/dev/usb/usb_subr.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/usb/usb_subr.c,v
retrieving revision 1.80
diff -u -r1.80 usb_subr.c
--- sys/dev/usb/usb_subr.c 11 Feb 2006 03:41:20 -0000 1.80
+++ sys/dev/usb/usb_subr.c 19 Feb 2006 09:59:34 -0000
@@ -780,6 +780,18 @@
return (err);
}
+ if (dev->quirks->uq_flags & UQ_OPEN_CLEARSTALL) {
+ /* Clear any stall and make sure DATA0 toggle will be used next. */
+ if (UE_GET_ADDR(ep->edesc->bEndpointAddress) != USB_CONTROL_ENDPOINT) {
+ err = usbd_clear_endpoint_stall(p);
+ if (err && err != USBD_STALLED && err != USBD_TIMEOUT) {
+ printf("usbd_setup_pipe: failed to start "
+ "endpoint, %s\n", usbd_errstr(err));
+ return (err);
+ }
+ }
+ }
+
*pipe = p;
return (USBD_NORMAL_COMPLETION);
}
Index: sys/dev/usb/usbdevs
===================================================================
RCS file: /home/ncvs/src/sys/dev/usb/usbdevs,v
retrieving revision 1.253
diff -u -r1.253 usbdevs
--- sys/dev/usb/usbdevs 11 Feb 2006 03:27:57 -0000 1.253
+++ sys/dev/usb/usbdevs 19 Feb 2006 09:59:34 -0000
@@ -1529,6 +1529,7 @@
product SOURCENEXT KEIKAI8_CHG 0x012e KeikaiDenwa 8 with charger
/* STMicroelectronics products */
+product STMICRO BIOCPU 0x2016 Biometric Coprocessor
product STMICRO COMMUNICATOR 0x7554 USB Communicator
/* STSN products */
--------------040001020400000200060600--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?43F87155.3050103>
