• Sarah Sharp's avatar
    xhci 1.0: Limit arbitrarily-aligned scatter gather. · 247bf557
    Sarah Sharp authored
    xHCI 1.0 hosts have a set of requirements on how to align transfer
    buffers on the endpoint rings called "TD fragment" rules.  When the
    ax88179_178a driver added support for scatter gather in 3.12, with
    commit 804fad45411b48233b48003e33a78f290d227c8 "USBNET: ax88179_178a:
    enable tso if usb host supports sg dma", it broke the device under xHCI
    1.0 hosts.  Under certain network loads, the device would see an
    unexpected short packet from the host, which would cause the device to
    stop sending ethernet packets, even through USB packets would still be
    sent.
    
    Commit 35773dac "usb: xhci: Link TRB must not occur within a USB
    payload burst" attempted to fix this.  It was a quick hack to partially
    implement the TD fragment rules.  However, it caused regressions in the
    usb-storage layer and userspace USB drivers using libusb.  The patches
    to attempt to fix this are too far reaching into the USB core, and we
    really need to implement the TD fragment rules correctly in the xHCI
    driver, instead of continuing to wallpaper over the issues.
    
    Disable arbitrarily-aligned scatter-gather in the xHCI driver for 1.0
    hosts.  Only the ax88179_178a driver checks the no_sg_constraint flag,
    so don't set it for 1.0 hosts.  This should not impact usb-storage or
    usbfs behavior, since they pass down max packet sized aligned sg-list
    entries (512 for USB 2.0 and 1024 for USB 3.0).
    Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
    Tested-by: default avatarMark Lord <mlord@pobox.com>
    Cc: David Laight <David.Laight@ACULAB.COM>
    Cc: Bjørn Mork <bjorn@mork.no>
    Cc: Freddy Xin <freddy@asix.com.tw>
    Cc: Ming Lei <ming.lei@canonical.com>
    Cc: stable@vger.kernel.org # 3.12
    247bf557
xhci.c 145 KB