linux/drivers/usb/dwc2
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
..
core_intr.c usb: dwc2: Change reading of current frame number flow. 2018-05-15 10:17:09 +03:00
core.c usb: dwc2: Fix kernel doc's warnings. 2018-05-21 10:02:13 +03:00
core.h usb: dwc2: alloc dma aligned buffer for isoc split in 2018-06-19 12:48:13 +03:00
debug.h usb: dwc2: Fix kernel doc's warnings. 2018-05-21 10:02:13 +03:00
debugfs.c USB: dwc2: no need to check return value of debugfs_create functions 2018-05-31 12:54:22 +02:00
gadget.c usb: dwc2: gadget: fix packet drop issue for ISOC OUT transfers 2018-06-18 12:41:01 +03:00
hcd_ddma.c usb: dwc2: Fix kernel doc's warnings. 2018-05-21 10:02:13 +03:00
hcd_intr.c usb: dwc2: alloc dma aligned buffer for isoc split in 2018-06-19 12:48:13 +03:00
hcd_queue.c usb: dwc2: alloc dma aligned buffer for isoc split in 2018-06-19 12:48:13 +03:00
hcd.c usb: dwc2: alloc dma aligned buffer for isoc split in 2018-06-19 12:48:13 +03:00
hcd.h usb: dwc2: alloc dma aligned buffer for isoc split in 2018-06-19 12:48:13 +03:00
hw.h usb: dwc2: Add Interpacket Gap(IPG) feature support 2018-05-15 10:16:47 +03:00
Kconfig usb: add CONFIG_USB_PCI for system have both PCI HW and non-PCI based USB HW 2017-03-17 13:16:56 +09:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
params.c usb: dwc2: gadget: Fix coverity issue 2018-05-21 10:40:16 +03:00
pci.c usb: dwc2: pci: Fix error return code in dwc2_pci_probe() 2018-05-21 10:36:14 +03:00
platform.c usb: dwc2: Force mode optimizations 2018-03-13 10:47:58 +02:00