Files
rockchip-kernel/drivers/usb
William Wu d37572ddf9 usb: dwc2: hcd: do not disable non-split periodic channels
The dwc2 programming guide section 3.5 'Halting a Channel'
says that the application can disable any channel by
programming the HCCHARn register with the HCCHARn.ChDis
and HCCHARn.ChEna bits set to 1'b1. This enables the
dwc_otg host to flush the posted requests (if any) and
generates a Channel Halted interrupt.

But it also requires that channel disable must not be
programmed for non-split periodic channels. At the end
of the next uframe/frame (in the worst case), the core
generates a channel halted and disables the channel
automatically.

If we disable non-spilt periodic channels to halt the
channels, it will easily to cause data transfer fail.
A typical case is take photo with usb camera or close
usb camera, Specifically, the observed order is:

1. uvc driver calls usb_kill_urb
2. usb_kill_urb calls urb_dequeue to cancel urb
3. urb_dequeue call dwc_otg_hc_halt to disable
   non-spilt periodic channels
4. usb core doesn't halt the non-spilt periodic
   channels immediately, and the application
   reallocates the channels for other transactions
   without waiting for the HCINTn.ChHltd interrupt.
5. uvc driver calls usb_set_interface to start
   control transfer, and gets a channel which used
   for non-spilt periodic transfer before. The core
   generates a channel halted and disables the channel
   automatically. This cause control transfer fail.

Change-Id: I95424a99b77b552396a9fb95a5058258270ed4c2
Signed-off-by: William Wu <william.wu@rock-chips.com>
Signed-off-by: Frank Wang <frank.wang@rock-chips.com>
2021-06-03 16:25:46 +08:00
..
2021-03-17 18:05:39 +08:00
2021-03-17 18:05:39 +08:00
2021-03-17 18:05:39 +08:00
2021-03-17 18:05:39 +08:00
2021-03-17 18:05:39 +08:00
2021-03-17 18:05:39 +08:00
2021-03-17 18:05:39 +08:00
2021-03-17 18:05:39 +08:00
2021-03-17 18:05:39 +08:00
2021-03-17 18:05:39 +08:00
2021-03-17 18:05:39 +08:00
2021-03-17 18:05:39 +08:00
2021-03-17 18:05:39 +08:00
2021-03-17 18:05:39 +08:00