aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorFlorent Thoumie <flz@FreeBSD.org>2005-12-05 01:51:28 +0000
committerFlorent Thoumie <flz@FreeBSD.org>2005-12-05 01:51:28 +0000
commit645cf3805a4f0407f512d93442d6f71d217f2789 (patch)
tree78c381b9c7df6f57e3327c64e60af16ecb6a1d9d /sys/dev
parent717f7d59624998ce1fe96536b9570b8171b63e0d (diff)
downloadsrc-645cf3805a4f0407f512d93442d6f71d217f2789.tar.gz
src-645cf3805a4f0407f512d93442d6f71d217f2789.zip
- Add Product IDs for iPod 3G and iPod Video.
- Add an USB quirk for iPods, da(4) devices are now successfully created. Approved by: ssouhlal MFC after: 1 week
Notes
Notes: svn path=/head/; revision=153098
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/usb/usb_quirks.c2
-rw-r--r--sys/dev/usb/usb_quirks.h1
-rw-r--r--sys/dev/usb/usb_subr.c28
-rw-r--r--sys/dev/usb/usbdevs2
4 files changed, 21 insertions, 12 deletions
diff --git a/sys/dev/usb/usb_quirks.c b/sys/dev/usb/usb_quirks.c
index 01c155f753cb..fd05cfffa0e2 100644
--- a/sys/dev/usb/usb_quirks.c
+++ b/sys/dev/usb/usb_quirks.c
@@ -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_BROKEN_IPOD }},
+ { USB_VENDOR_APPLE, USB_PRODUCT_APPLE_IPODVIDEO, ANY, { UQ_BROKEN_IPOD }},
/* 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 }},
diff --git a/sys/dev/usb/usb_quirks.h b/sys/dev/usb/usb_quirks.h
index 4977bf605b40..6588ec0155ba 100644
--- a/sys/dev/usb/usb_quirks.h
+++ b/sys/dev/usb/usb_quirks.h
@@ -54,6 +54,7 @@ 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_BROKEN_IPOD 0x4000 /* iPod has something broken */
};
extern const struct usbd_quirks usbd_no_quirk;
diff --git a/sys/dev/usb/usb_subr.c b/sys/dev/usb/usb_subr.c
index 6b11b448a34c..d77ebc0c1ce3 100644
--- a/sys/dev/usb/usb_subr.c
+++ b/sys/dev/usb/usb_subr.c
@@ -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_BROKEN_IPOD)) {
+ /* 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);
}
diff --git a/sys/dev/usb/usbdevs b/sys/dev/usb/usbdevs
index 8e44b8f11edf..76a26e6256bf 100644
--- a/sys/dev/usb/usbdevs
+++ b/sys/dev/usb/usbdevs
@@ -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