aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Brownell <david-b@pacbell.net>2008-02-08 18:08:44 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2008-04-25 00:16:35 -0400
commitcaa9ef672a045ba0b19184cd3f872b583f066771 (patch)
treef55bc5f1e2597c947b00d813d9c7568a2d0af02b
parente01e7fe3886715f083313da409c5850472455d06 (diff)
USB: ehci tolerates some buggy devices
This teaches EHCI how to to work around bugs in certain high speed devices, by accomodating "bulk" packets that exceed the 512 byte constant value required by the USB 2.0 specification. (Have a look at section 5.8.3, paragraphs 1 and 3.) It also makes the descriptor parsing code warn when it encounters such bugs. (We've had reports of maybe two or three such devices, all pretty recent.) Such devices are nonconformant. The proper fix is have the vendors of those devices do the simple, obvious, and correct thing ... which will let them be used with USB hosts that don't have workarounds for this particular vendor bug. But unless/until they do, we can at least have one of the high speed HCDs work with such buggy devices. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/usb/core/config.c17
-rw-r--r--drivers/usb/host/ehci-q.c16
2 files changed, 32 insertions, 1 deletions
diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c
index a92122a216bc..568244c99bdc 100644
--- a/drivers/usb/core/config.c
+++ b/drivers/usb/core/config.c
@@ -145,6 +145,23 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, int inum,
145 endpoint->desc.wMaxPacketSize = cpu_to_le16(8); 145 endpoint->desc.wMaxPacketSize = cpu_to_le16(8);
146 } 146 }
147 147
148 /*
149 * Some buggy high speed devices have bulk endpoints using
150 * maxpacket sizes other than 512. High speed HCDs may not
151 * be able to handle that particular bug, so let's warn...
152 */
153 if (to_usb_device(ddev)->speed == USB_SPEED_HIGH
154 && usb_endpoint_xfer_bulk(d)) {
155 unsigned maxp;
156
157 maxp = le16_to_cpu(endpoint->desc.wMaxPacketSize) & 0x07ff;
158 if (maxp != 512)
159 dev_warn(ddev, "config %d interface %d altsetting %d "
160 "bulk endpoint 0x%X has invalid maxpacket %d\n",
161 cfgno, inum, asnum, d->bEndpointAddress,
162 maxp);
163 }
164
148 /* Skip over any Class Specific or Vendor Specific descriptors; 165 /* Skip over any Class Specific or Vendor Specific descriptors;
149 * find the next endpoint or interface descriptor */ 166 * find the next endpoint or interface descriptor */
150 endpoint->extra = buffer; 167 endpoint->extra = buffer;
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c
index 2e49de820b14..c0e752cffc68 100644
--- a/drivers/usb/host/ehci-q.c
+++ b/drivers/usb/host/ehci-q.c
@@ -657,6 +657,14 @@ qh_make (
657 type = usb_pipetype (urb->pipe); 657 type = usb_pipetype (urb->pipe);
658 maxp = usb_maxpacket (urb->dev, urb->pipe, !is_input); 658 maxp = usb_maxpacket (urb->dev, urb->pipe, !is_input);
659 659
660 /* 1024 byte maxpacket is a hardware ceiling. High bandwidth
661 * acts like up to 3KB, but is built from smaller packets.
662 */
663 if (max_packet(maxp) > 1024) {
664 ehci_dbg(ehci, "bogus qh maxpacket %d\n", max_packet(maxp));
665 goto done;
666 }
667
660 /* Compute interrupt scheduling parameters just once, and save. 668 /* Compute interrupt scheduling parameters just once, and save.
661 * - allowing for high bandwidth, how many nsec/uframe are used? 669 * - allowing for high bandwidth, how many nsec/uframe are used?
662 * - split transactions need a second CSPLIT uframe; same question 670 * - split transactions need a second CSPLIT uframe; same question
@@ -757,7 +765,13 @@ qh_make (
757 info2 |= (EHCI_TUNE_MULT_HS << 30); 765 info2 |= (EHCI_TUNE_MULT_HS << 30);
758 } else if (type == PIPE_BULK) { 766 } else if (type == PIPE_BULK) {
759 info1 |= (EHCI_TUNE_RL_HS << 28); 767 info1 |= (EHCI_TUNE_RL_HS << 28);
760 info1 |= 512 << 16; /* usb2 fixed maxpacket */ 768 /* The USB spec says that high speed bulk endpoints
769 * always use 512 byte maxpacket. But some device
770 * vendors decided to ignore that, and MSFT is happy
771 * to help them do so. So now people expect to use
772 * such nonconformant devices with Linux too; sigh.
773 */
774 info1 |= max_packet(maxp) << 16;
761 info2 |= (EHCI_TUNE_MULT_HS << 30); 775 info2 |= (EHCI_TUNE_MULT_HS << 30);
762 } else { /* PIPE_INTERRUPT */ 776 } else { /* PIPE_INTERRUPT */
763 info1 |= max_packet (maxp) << 16; 777 info1 |= max_packet (maxp) << 16;