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_TELEX, USB_PRODUCT_TELEX_MIC1, 0x009, { UQ_AU_NO_FRAC }},
{ USB_VENDOR_SILICONPORTALS, USB_PRODUCT_SILICONPORTALS_YAPPHONE, { USB_VENDOR_SILICONPORTALS, USB_PRODUCT_SILICONPORTALS_YAPPHONE,
0x100, { UQ_AU_INP_ASYNC }}, 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. */ /* 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_895C, ANY, { UQ_BROKEN_BIDIR }},
{ USB_VENDOR_HP, USB_PRODUCT_HP_880C, 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_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_ASSUME_CM_OVER_DATA 0x1000 /* modem device breaks on cm over data */
#define UQ_BROKEN_BIDIR 0x2000 /* printer has broken bidir mode */ #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; 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); free(p, M_USB);
return (err); return (err);
} }
/* Clear any stall and make sure DATA0 toggle will be used next. */
if (UE_GET_ADDR(ep->edesc->bEndpointAddress) != USB_CONTROL_ENDPOINT) { if (!(dev->quirks->uq_flags & UQ_NO_OPEN_CLEARSTALL)) {
err = usbd_clear_endpoint_stall(p); /* Clear any stall and make sure DATA0 toggle will be used next. */
/* if (UE_GET_ADDR(ep->edesc->bEndpointAddress) != USB_CONTROL_ENDPOINT) {
* Some devices reject this command, so ignore a STALL. err = usbd_clear_endpoint_stall(p);
* Some device just time out on this command, so ignore /*
* that too. * Some devices reject this command, so ignore a STALL.
*/ * Some device just time out on this command, so ignore
if (err && err != USBD_STALLED && err != USBD_TIMEOUT) { * that too.
printf("usbd_setup_pipe: failed to start " */
"endpoint, %s\n", usbd_errstr(err)); if (err && err != USBD_STALLED && err != USBD_TIMEOUT) {
return (err); printf("usbd_setup_pipe: failed to start "
"endpoint, %s\n", usbd_errstr(err));
return (err);
}
} }
} }
*pipe = p; *pipe = p;
return (USBD_NORMAL_COMPLETION); return (USBD_NORMAL_COMPLETION);
} }

View File

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