For context, I am trying to reduce latency of UAC2 gadget and one way to achieve it is to reduce the number of USB requests. The SoC on the board I use (vim3l) use a DWC2 IP. If I enable the UAC2 gadget with 3 requests, every ms I get data from isocronous in endpoint and everything works fine (I can listen what come from the interface) But if use only two requests, then, what I listen is hugly! What I noticed is that after two sucessful USB transfer, I get a ZLP. I suspect that happens because in dwc2_gadget_fill_isoc_desc, we may update the DMA descriptor whereas it is already owned by the DMA. On completion of a request, the gadget queue the request that has been completed. The DWC2 driver clear DEV_DMA_L bit of last descriptor and add a new descriptor to DMA. In that way, we never stop DMA and keep the endpoint enabled while we are feeding it with data. If we use three or more request when we start the gadget, the DMA has three descriptors and when queue a new one, DMA is processing descriptor L-1, the driver update descriptor L and the descriptor L+1. But when we only have two requests, the DMA has only two requests and when we queue the request on completion, DMA is processing descriptor L, the driver update it and add the descriptor L+1. Instead of using the new descriptor, the DMA raise a BNA interrupt, the controller send a ZLP to host and the driver re-initialize the endpoint to prepare the next transfers. The patch try to fix it. I am not conviced so far this is the best fix so I am open to any suggestion. Alexandre Bailon (1): usb: dwc2: Don't set DEV_DMA_L by default for isoc transfer drivers/usb/dwc2/gadget.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) -- 2.41.0