linux/drivers/usb
William Wu af424a4107 usb: dwc2: alloc dma aligned buffer for isoc split in
The commit 3bc04e28a0 ("usb: dwc2: host: Get aligned DMA in
a more supported way") rips out a lot of code to simply the
allocation of aligned DMA. However, it also introduces a new
issue when use isoc split in transfer.

In my test case, I connect the dwc2 controller with an usb hs
Hub (GL852G-12), and plug an usb fs audio device (Plantronics
headset) into the downstream port of Hub. Then use the usb mic
to record, we can find noise when playback.

It's because that the usb Hub uses an MDATA for the first
transaction and a DATA0 for the second transaction for the isoc
split in transaction. An typical isoc split in transaction sequence
like this:

- SSPLIT IN transaction
- CSPLIT IN transaction
  - MDATA packet
- CSPLIT IN transaction
  - DATA0 packet

The DMA address of MDATA (urb->dma) is always DWORD-aligned, but
the DMA address of DATA0 (urb->dma + qtd->isoc_split_offset) may
not be DWORD-aligned, it depends on the qtd->isoc_split_offset (the
length of MDATA). In my test case, the length of MDATA is usually
unaligned, this cause DATA0 packet transmission error.

This patch use kmem_cache to allocate aligned DMA buf for isoc
split in transaction. Note that according to usb 2.0 spec, the
maximum data payload size is 1023 bytes for each fs isoc ep,
and the maximum allowable interrupt data payload size is 64 bytes
or less for fs interrupt ep. So we set the size of object to be
1024 bytes in the kmem cache.

Tested-by: Gevorg Sahakyan <sahakyan@synopsys.com>
Tested-by: Heiko Stuebner <heiko@sntech.de>
Acked-by: Minas Harutyunyan hminas@synopsys.com>
Signed-off-by: William Wu <william.wu@rock-chips.com>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
2018-06-19 12:48:13 +03:00
..
atm USB: atm: fix up some remaining DEVICE_ATTR() usage 2018-01-24 08:49:52 +01:00
c67x00 USB: add SPDX identifiers to all remaining Makefiles 2017-11-07 15:53:48 +01:00
chipidea USB: chipidea: no need to check return value of debugfs_create functions 2018-05-31 12:54:22 +02:00
class usb: usbtmc: Remove rigol_quirk 2018-05-18 15:56:40 +02:00
common usb: common: Small class for USB role switches 2018-03-22 13:40:10 +01:00
core treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
dwc2 usb: dwc2: alloc dma aligned buffer for isoc split in 2018-06-19 12:48:13 +03:00
dwc3 usb: dwc3: qcom: mark PM functions as __maybe_unused 2018-06-19 12:48:12 +03:00
early usb: early: Correct the endpoint type value for bulk in endpoint 2017-12-07 16:03:15 +01:00
gadget usb: gadget: ffs: Fix BUG when userland exits with submitted AIO transfers 2018-06-18 12:40:59 +03:00
host treewide: kzalloc_node() -> kcalloc_node() 2018-06-12 16:19:22 -07:00
image USB/PHY patches for 4.15-rc1 2017-11-13 21:14:07 -08:00
isp1760 usb: isp1760: Replace mdelay with msleep in isp1760_stop 2018-04-22 15:49:42 +02:00
misc treewide: Use array_size() in vmalloc() 2018-06-12 16:19:22 -07:00
mon treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
mtu3 USB: mtu3: no need to check return value of debugfs_create_dir() 2018-05-31 12:54:21 +02:00
musb USB: musb: clean up debugfs file and directory creation 2018-05-31 12:54:21 +02:00
phy phy: tegra: select USB_COMMON 2018-05-31 12:50:40 +02:00
renesas_usbhs treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
roles usb: roles: intel_xhci: Enable runtime PM 2018-05-24 18:17:00 +02:00
serial treewide: kmalloc() -> kmalloc_array() 2018-06-12 16:19:22 -07:00
storage treewide: kmalloc() -> kmalloc_array() 2018-06-12 16:19:22 -07:00
typec USB: typec: fsusb302: no need to check return value of debugfs_create_dir() 2018-05-31 16:03:59 +02:00
usbip usbip: vhci_sysfs: fix potential Spectre v1 2018-05-24 18:14:28 +02:00
wusbcore treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
Kconfig usb: select USB_COMMON for usb role switch config 2018-04-22 15:23:37 +02:00
Makefile usb: roles: Add Intel xHCI USB role switch driver 2018-03-22 13:49:27 +01:00
README
usb-skeleton.c usb: usb-skeleton: make MODULE_LICENSE and SPDX tag match 2018-03-06 09:42:07 -08:00

To understand all the Linux-USB framework, you'll use these resources:

    * This source code.  This is necessarily an evolving work, and
      includes kerneldoc that should help you get a current overview.
      ("make pdfdocs", and then look at "usb.pdf" for host side and
      "gadget.pdf" for peripheral side.)  Also, Documentation/usb has
      more information.

    * The USB 2.0 specification (from www.usb.org), with supplements
      such as those for USB OTG and the various device classes.
      The USB specification has a good overview chapter, and USB
      peripherals conform to the widely known "Chapter 9".

    * Chip specifications for USB controllers.  Examples include
      host controllers (on PCs, servers, and more); peripheral
      controllers (in devices with Linux firmware, like printers or
      cell phones); and hard-wired peripherals like Ethernet adapters.

    * Specifications for other protocols implemented by USB peripheral
      functions.  Some are vendor-specific; others are vendor-neutral
      but just standardized outside of the www.usb.org team.

Here is a list of what each subdirectory here is, and what is contained in
them.

core/		- This is for the core USB host code, including the
		  usbfs files and the hub class driver ("hub_wq").

host/		- This is for USB host controller drivers.  This
		  includes UHCI, OHCI, EHCI, and others that might
		  be used with more specialized "embedded" systems.

gadget/		- This is for USB peripheral controller drivers and
		  the various gadget drivers which talk to them.


Individual USB driver directories.  A new driver should be added to the
first subdirectory in the list below that it fits into.

image/		- This is for still image drivers, like scanners or
		  digital cameras.
../input/	- This is for any driver that uses the input subsystem,
		  like keyboard, mice, touchscreens, tablets, etc.
../media/	- This is for multimedia drivers, like video cameras,
		  radios, and any other drivers that talk to the v4l
		  subsystem.
../net/		- This is for network drivers.
serial/		- This is for USB to serial drivers.
storage/	- This is for USB mass-storage drivers.
class/		- This is for all USB device drivers that do not fit
		  into any of the above categories, and work for a range
		  of USB Class specified devices. 
misc/		- This is for all USB device drivers that do not fit
		  into any of the above categories.