lkml.org 
[lkml]   [2020]   [Feb]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 180/237] xhci: Force Maximum Packet size for Full-speed bulk devices to valid range.
    Date
    From: Mathias Nyman <mathias.nyman@linux.intel.com>

    commit f148b9f402ef002b57bcff3964d45abc8ffb6c3f upstream.

    A Full-speed bulk USB audio device (DJ-Tech CTRL) with a invalid Maximum
    Packet Size of 4 causes a xHC "Parameter Error" at enumeration.

    This is because valid Maximum packet sizes for Full-speed bulk endpoints
    are 8, 16, 32 and 64 bytes. Hosts are not required to support other values
    than these. See usb 2 specs section 5.8.3 for details.

    The device starts working after forcing the maximum packet size to 8.
    This is most likely the case with other devices as well, so force the
    maximum packet size to a valid range.

    Cc: stable@vger.kernel.org
    Reported-by: Rene D Obermueller <cmdrrdo@gmail.com>
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/20200210134553.9144-2-mathias.nyman@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/usb/host/xhci-mem.c | 12 +++++++++---
    1 file changed, 9 insertions(+), 3 deletions(-)

    --- a/drivers/usb/host/xhci-mem.c
    +++ b/drivers/usb/host/xhci-mem.c
    @@ -1479,9 +1479,15 @@ int xhci_endpoint_init(struct xhci_hcd *
    /* Allow 3 retries for everything but isoc, set CErr = 3 */
    if (!usb_endpoint_xfer_isoc(&ep->desc))
    err_count = 3;
    - /* Some devices get this wrong */
    - if (usb_endpoint_xfer_bulk(&ep->desc) && udev->speed == USB_SPEED_HIGH)
    - max_packet = 512;
    + /* HS bulk max packet should be 512, FS bulk supports 8, 16, 32 or 64 */
    + if (usb_endpoint_xfer_bulk(&ep->desc)) {
    + if (udev->speed == USB_SPEED_HIGH)
    + max_packet = 512;
    + if (udev->speed == USB_SPEED_FULL) {
    + max_packet = rounddown_pow_of_two(max_packet);
    + max_packet = clamp_val(max_packet, 8, 64);
    + }
    + }
    /* xHCI 1.0 and 1.1 indicates that ctrl ep avg TRB Length should be 8 */
    if (usb_endpoint_xfer_control(&ep->desc) && xhci->hci_version >= 0x100)
    avg_trb_len = 8;

    \
     
     \ /
      Last update: 2020-02-27 15:34    [W:2.246 / U:0.280 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site