Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

xhci: support setting interrupt moderation IMOD for secondary interrupters

Allow creators of seconday interrupters to specify the interrupt
moderation interval value in nanoseconds when creating the interrupter.

If not sure what value to use then use the xhci driver default
xhci->imod_interval

Suggested-by: Wesley Cheng <quic_wcheng@quicinc.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20240905143300.1959279-13-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Mathias Nyman and committed by
Greg Kroah-Hartman
9c0c11bb f81dfa3b

+13 -4
+7 -1
drivers/usb/host/xhci-mem.c
··· 2332 2332 } 2333 2333 2334 2334 struct xhci_interrupter * 2335 - xhci_create_secondary_interrupter(struct usb_hcd *hcd, unsigned int segs) 2335 + xhci_create_secondary_interrupter(struct usb_hcd *hcd, unsigned int segs, 2336 + u32 imod_interval) 2336 2337 { 2337 2338 struct xhci_hcd *xhci = hcd_to_xhci(hcd); 2338 2339 struct xhci_interrupter *ir; ··· 2365 2364 xhci_free_interrupter(xhci, ir); 2366 2365 return NULL; 2367 2366 } 2367 + 2368 + err = xhci_set_interrupter_moderation(ir, imod_interval); 2369 + if (err) 2370 + xhci_warn(xhci, "Failed to set interrupter %d moderation to %uns\n", 2371 + i, imod_interval); 2368 2372 2369 2373 xhci_dbg(xhci, "Add secondary interrupter %d, max interrupters %d\n", 2370 2374 i, xhci->max_interrupters);
+2 -2
drivers/usb/host/xhci.c
··· 347 347 } 348 348 349 349 /* interrupt moderation interval imod_interval in nanoseconds */ 350 - static int xhci_set_interrupter_moderation(struct xhci_interrupter *ir, 351 - u32 imod_interval) 350 + int xhci_set_interrupter_moderation(struct xhci_interrupter *ir, 351 + u32 imod_interval) 352 352 { 353 353 u32 imod; 354 354
+4 -1
drivers/usb/host/xhci.h
··· 1826 1826 void xhci_free_container_ctx(struct xhci_hcd *xhci, 1827 1827 struct xhci_container_ctx *ctx); 1828 1828 struct xhci_interrupter * 1829 - xhci_create_secondary_interrupter(struct usb_hcd *hcd, unsigned int segs); 1829 + xhci_create_secondary_interrupter(struct usb_hcd *hcd, unsigned int segs, 1830 + u32 imod_interval); 1830 1831 void xhci_remove_secondary_interrupter(struct usb_hcd 1831 1832 *hcd, struct xhci_interrupter *ir); 1832 1833 ··· 1867 1866 struct xhci_virt_device *virt_dev, 1868 1867 struct usb_device *hdev, 1869 1868 struct usb_tt *tt, gfp_t mem_flags); 1869 + int xhci_set_interrupter_moderation(struct xhci_interrupter *ir, 1870 + u32 imod_interval); 1870 1871 1871 1872 /* xHCI ring, segment, TRB, and TD functions */ 1872 1873 dma_addr_t xhci_trb_virt_to_dma(struct xhci_segment *seg, union xhci_trb *trb);