CVSROOT:        /cvs
Module name:    src
Changes by:     patr...@cvs.openbsd.org 2020/03/19 08:18:38

Modified files:
        sys/dev/usb    : ehci.c ohci.c uhci.c usb_mem.c usb_mem.h 
                         usbdivar.h 
        sys/dev/usb/dwc2: dwc2.c dwc2_hcd.c dwc2_hcdddma.c 

Log message:
Switch USB to use non-coherent buffers for data transfers.  Since
the import in '99 all buffers allocated using usb_allocmem() have
been mapped COHERENT.  On some ARM SoCs, where the USB controller
is not coherent with the caches, this means the buffers were mapped
uncached.  This drastically reduces the performance, especially on
reads.

We already added cache syncs before and after USB transfers, but so
far those have essentially been no-ops.  Since other drivers make
use of the same allocation code, and those haven't been proven to
have correct syncs, we can't just remove the COHERENT flag.

This splits the allocation into coherent and non-coherent blocks.
All drivers who call usb_allocmem() themselves now pass a flag to
show they require coherent blocks.  Onced verified that they also
work fine without coherent, or once they have been refactored, we
can remove this again.

On a ure(4) connected to an i.MX8MQ, the receive performance is
10x as fast as before.  The Raspberry Pi's ethernet receive speed
doubled.

Debugged using dt(4)
Original diff from Marius Strobl
Feedback from kettenis@
Tested on an i.MX8MQ (arm64) by patrick@
Tested on a Raspberry Pi (arm64) by tobhe@
Tested on an ERL (octeon) by Janne Johansson
ok mpi@ gerhard@ tobhe@

Reply via email to