diff options
Diffstat (limited to 'drivers/usb/host')
-rw-r--r-- | drivers/usb/host/ehci-q.c | 16 |
1 files changed, 15 insertions, 1 deletions
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; |