MFC: USB Quirk for iPods (should work with some other devices).

usb_quirks.c:	1.43
	usb_quirks.h:	1.19
	usb_subr.c:	1.78
	usbdevs:	1.236

While this might not be the best solution, this has been considered good enough
to be MFC'ed.

Approved by:	ssouhlal
Discussed on:	src-committers@
This commit is contained in:
flz 2005-12-14 01:27:45 +00:00
parent 63922011a7
commit a3ad80954c
4 changed files with 23 additions and 12 deletions

View File

@ -79,6 +79,8 @@ Static const struct usbd_quirk_entry {
{ 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_APPLE, USB_PRODUCT_APPLE_IPOD3G, ANY, { UQ_NO_OPEN_CLEARSTALL }},
{ USB_VENDOR_APPLE, USB_PRODUCT_APPLE_IPODVIDEO, ANY, { UQ_NO_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 }},

View File

@ -54,6 +54,9 @@ struct usbd_quirks {
#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_NO_OPEN_CLEARSTALL 0x4000 /* don't usbd_clear_endpoint_stall() */
/* in usbd_setup_pipe() */
};
extern const struct usbd_quirks usbd_no_quirk;

View File

@ -778,20 +778,24 @@ usbd_setup_pipe(usbd_device_handle dev, usbd_interface_handle iface,
free(p, M_USB);
return (err);
}
/* 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);
/*
* Some devices reject this command, so ignore a STALL.
* Some device just time out on this command, so ignore
* that too.
*/
if (err && err != USBD_STALLED && err != USBD_TIMEOUT) {
printf("usbd_setup_pipe: failed to start "
"endpoint, %s\n", usbd_errstr(err));
return (err);
if (!(dev->quirks->uq_flags & UQ_NO_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);
/*
* Some devices reject this command, so ignore a STALL.
* Some device just time out on this command, so ignore
* that too.
*/
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);
}

View File

@ -642,6 +642,8 @@ product AOX USB101 0x0008 Ethernet
/* Apple Computer products */
product APPLE OPTMOUSE 0x0302 Optical mouse
product APPLE SPEAKERS 0x1101 Speakers
product APPLE IPOD3G 0x1203 iPod 3G
product APPLE IPODVIDEO 0x1209 iPod Video
/* Asahi Optical products */
product ASAHIOPTICAL OPTIO230 0x0004 Digital camera