xhci: Add adaptive interrupt rate for isoch TRBs with XHCI_AVOID_BEI quirk
authorMathias Nyman <mathias.nyman@linux.intel.com>
Thu, 17 Jun 2021 15:03:52 +0000 (18:03 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 17 Jun 2021 15:34:29 +0000 (17:34 +0200)
commit90d551a5bc73d34c600507a1ef61f3a7c0840783
treeb96536551e298ebd0d6f7fed5a5249908cce137a
parentebd88cf50729e1891dbd307dec311b8f05ba2462
xhci: Add adaptive interrupt rate for isoch TRBs with XHCI_AVOID_BEI quirk

Save a bit of power by not interrupting so often by default if
XHCI_AVOID_BEI quirk is set.

In normal cases the xhci driver will only generate an interrupt on the last
isochronous TRB of an URB. In a common UVC webcam usecase there are 32 TRBs
per URB.

if AVOID_BEI flag is set then xhci driver will force an interrupt every 8th
isoc TRB to make sure the event ring doesn't get too full.

This is however way too frequent in common single webcam use cases, causing
1000 interrupts/sec and thus poor powermanagement performance.

Instead start with interrupting every 32 isoc TRB, and halve it in case
event ring becomes half-full. Stop halving when reaching a rate of every
8th trb.

This is a one way solution. If interrupt rate is increased it will stay
high until driver is reloaded. The highest rate is the same as the old
default rate.

Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20210617150354.1512157-3-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci-mem.c
drivers/usb/host/xhci-ring.c
drivers/usb/host/xhci.h