FAILED: patch "[PATCH] usb: cdns3: Fix uvc fail when DMA cross 4k boundery since sg" failed to apply to 5.10-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.10.y
git checkout FETCH_HEAD
git cherry-pick -x 40c304109e866a7dc123661a5c8ca72f6b5e14e0
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2024012238-borough-parameter-5f3f@gregkh' --subject-prefix 'PATCH 5.10.y' HEAD^..
Possible dependencies:
40c304109e86 ("usb: cdns3: Fix uvc fail when DMA cross 4k boundery since sg enabled") 1b8be5ecff26 ("usb: cdns3: fix uvc failure work since sg support enabled") 387c2b6ba197 ("usb: cdns3: gadget: fix new urb never complete if ep cancel previous requests") fba8701baed7 ("usb: cdns3: Fixes for sparse warnings")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 40c304109e866a7dc123661a5c8ca72f6b5e14e0 Mon Sep 17 00:00:00 2001
From: Frank Li <[email protected]>
Date: Sun, 24 Dec 2023 10:38:15 -0500
Subject: [PATCH] usb: cdns3: Fix uvc fail when DMA cross 4k boundery since sg
enabled
Supposed DMA cross 4k bounder problem should be fixed at DEV_VER_V2, but still met problem when do ISO transfer if sg enabled.
Data pattern likes below when sg enabled, package size is 1k and mult is 2
[UVC Header(8B) ] [data(3k - 8)] ...
The received data at offset 0xd000 will get 0xc000 data, len 0x70. Error happen position as below pattern:
0xd000: wrong 0xe000: wrong 0xf000: correct 0x10000: wrong 0x11000: wrong 0x12000: correct ...
To avoid DMA cross 4k bounder at ISO transfer, reduce burst len according to start DMA address's alignment.
drivers/usb/cdns3/cdns3-gadget.c +31 -1
@@ -1120,6 +1120,7 @@ static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep,u32 togle_pcs =1 ;int sg_iter =0 ;int num_trb_req; +int trb_burst;int num_trb;int address;u32 control;
@@ -1243,7 +1244,36 @@ static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep, total_tdl +=DIV_ROUND_UP (length, priv_ep->endpoint.maxpacket); - trb->length |=cpu_to_le32 (TRB_BURST_LEN (priv_ep->trb_burst_size) | + trb_burst = priv_ep->trb_burst_size; + +/* +* Supposed DMA cross 4k bounder problem should be fixed at DEV_VER_V2, but still +* met problem when do ISO transfer if sg enabled. +* +* Data pattern likes below when sg enabled, package size is 1k and mult is 2 +* [UVC Header(8B) ] [data(3k - 8)] ... +* +* The received data at offset 0xd000 will get 0xc000 data, len 0x70. Error happen +* as below pattern: +* 0xd000: wrong +* 0xe000: wrong +* 0xf000: correct +* 0x10000: wrong +* 0x11000: wrong +* 0x12000: correct +* ... +* +* But it is still unclear about why error have not happen below 0xd000, it should +* cross 4k bounder. But anyway, the below code can fix this problem. +* +* To avoid DMA cross 4k bounder at ISO transfer, reduce burst len according to 16. +*/ +if (priv_ep->type ==USB_ENDPOINT_XFER_ISOC && priv_dev->dev_ver <=DEV_VER_V2 ) +if (ALIGN_DOWN (trb->buffer,SZ_4K ) != +ALIGN_DOWN (trb->buffer + length,SZ_4K )) + trb_burst =16 ; + + trb->length |=cpu_to_le32 (TRB_BURST_LEN (trb_burst) |TRB_LEN (length)); pcs = priv_ep->pcs ?TRB_CYCLE :0 ;