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

usb: cdns3: skip set TRB_IOC when usb_request: no_interrupt is true

No completion irq is needed if no_interrupt is true. Needn't set TRB_IOC
at this case.

Check usb_request: no_interrupt and set/skip TRB_IOC in
cdns3_ep_run_transfer().

Signed-off-by: Frank Li <Frank.Li@nxp.com>
Acked-by: Peter Chen <peter.chen@kernel.org>
Link: https://lore.kernel.org/r/20231027183919.664271-1-Frank.Li@nxp.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Frank Li and committed by
Greg Kroah-Hartman
7836be3b a776452d

+4 -3
+4 -3
drivers/usb/cdns3/cdns3-gadget.c
··· 1126 1126 u16 total_tdl = 0; 1127 1127 struct scatterlist *s = NULL; 1128 1128 bool sg_supported = !!(request->num_mapped_sgs); 1129 + u32 ioc = request->no_interrupt ? 0 : TRB_IOC; 1129 1130 1130 1131 if (priv_ep->type == USB_ENDPOINT_XFER_ISOC) 1131 1132 num_trb = priv_ep->interval; ··· 1236 1235 control |= pcs; 1237 1236 1238 1237 if (priv_ep->type == USB_ENDPOINT_XFER_ISOC && !priv_ep->dir) { 1239 - control |= TRB_IOC | TRB_ISP; 1238 + control |= ioc | TRB_ISP; 1240 1239 } else { 1241 1240 /* for last element in TD or in SG list */ 1242 1241 if (sg_iter == (num_trb - 1) && sg_iter != 0) 1243 - control |= pcs | TRB_IOC | TRB_ISP; 1242 + control |= pcs | ioc | TRB_ISP; 1244 1243 } 1245 1244 1246 1245 if (sg_iter) ··· 1271 1270 priv_req->num_of_trb = num_trb; 1272 1271 1273 1272 if (sg_iter == 1) 1274 - trb->control |= cpu_to_le32(TRB_IOC | TRB_ISP); 1273 + trb->control |= cpu_to_le32(ioc | TRB_ISP); 1275 1274 1276 1275 if (priv_dev->dev_ver < DEV_VER_V2 && 1277 1276 (priv_ep->flags & EP_TDLCHK_EN)) {