linux/drivers/usb/dwc2
Douglas Anderson 9cf1a601d2 usb: dwc2: host: Properly set even/odd frame
When setting up ISO and INT transfers dwc2 needs to specify whether the
transfer is for an even or an odd frame (or microframe if the controller
is running in high speed mode).

The controller appears to use this as a simple way to figure out if a
transfer should happen right away (in the current microframe) or should
happen at the start of the next microframe.  Said another way:

- If you set "odd" and the current frame number is odd it appears that
  the controller will try to transfer right away.  Same thing if you set
  "even" and the current frame number is even.
- If the oddness you set and the oddness of the frame number are
  _different_, the transfer will be delayed until the frame number
  changes.

As I understand it, the above technique allows you to plan ahead of time
where possible by always working on the next frame.  ...but it still
allows you to properly respond immediately to things that happened in
the previous frame.

The old dwc2_hc_set_even_odd_frame() didn't really handle this concept.
It always looked at the frame number and setup the transfer to happen in
the next frame.  In some cases that meant that certain transactions
would be transferred in the wrong frame.

We'll try our best to set the even / odd to do the transfer in the
scheduled frame.  If that fails then we'll do an ugly "schedule ASAP".
We'll also modify the scheduler code to handle this and not try to
schedule a second transfer for the same frame.

Note that this change relies on the work to redo the microframe
scheduler.  It can work atop ("usb: dwc2: host: Manage frame nums better
in scheduler") but it works even better after ("usb: dwc2: host: Totally
redo the microframe scheduler").

With this change my stressful USB test (USB webcam + USB audio +
keyboards) has less audio crackling than before.

Acked-by: John Youn <johnyoun@synopsys.com>
Signed-off-by: Douglas Anderson <dianders@chromium.org>
Tested-by: Heiko Stuebner <heiko@sntech.de>
Tested-by: Stefan Wahren <stefan.wahren@i2se.com>
Signed-off-by: Felipe Balbi <balbi@kernel.org>
2016-03-04 15:14:44 +02:00
..
core_intr.c usb: dwc2: host: Clear interrupts before handling them 2015-12-15 09:12:41 -06:00
core.c usb: dwc2: host: Properly set even/odd frame 2016-03-04 15:14:44 +02:00
core.h usb: dwc2: host: Add dwc2_hcd_get_future_frame_number() call 2016-03-04 15:14:44 +02:00
debug.h usb: dwc2: move debugfs code to a separate file 2015-04-29 15:18:25 -05:00
debugfs.c usb: dwc2: Use platform endianness when accessing registers 2015-09-27 10:54:31 -05:00
gadget.c usb: dwc2: gadget: Repair DSTS register decoding 2015-12-22 12:03:05 -06:00
hcd_ddma.c usb: dwc2: host: Rename some fields in struct dwc2_qh 2016-03-04 15:14:43 +02:00
hcd_intr.c usb: dwc2: host: Add scheduler logging for missed SOFs 2016-03-04 15:14:44 +02:00
hcd_queue.c usb: dwc2: host: Properly set even/odd frame 2016-03-04 15:14:44 +02:00
hcd.c usb: dwc2: host: Add dwc2_hcd_get_future_frame_number() call 2016-03-04 15:14:44 +02:00
hcd.h usb: dwc2: host: Manage frame nums better in scheduler 2016-03-04 15:14:44 +02:00
hw.h usb: dwc2: host: fix descriptor list address masking 2015-12-15 09:12:41 -06:00
Kconfig usb: dwc2: USB_DWC2 should depend on HAS_DMA 2016-02-20 20:23:02 -08:00
Makefile usb: dwc2: remove dwc2_platform.ko 2015-04-29 15:20:11 -05:00
pci.c usb: dwc2: pci: Add device mode to the dwc2-pci driver 2015-03-11 15:08:17 -05:00
platform.c usb: dwc2: host: Set host_rx_fifo_size to 525 for rk3066 2016-03-04 15:14:39 +02:00