usb: dwc3: gadget: Update chain bit correctly when using sg list

If scatter-gather operation is allowed, a large USB request is split
into multiple TRBs. For preparing TRBs for sg list, driver iterates
over the list and creates TRB for each sg and mark the chain bit to
false for the last sg. The current IOMMU driver is clubbing the list
of sgs which shares a page boundary into one and giving it to USB driver.
With this the number of sgs mapped it not equal to the the number of sgs
passed. Because of this USB driver is not marking the chain bit to false
since it couldn't iterate to the last sg. This patch addresses this issue
by marking the chain bit to false if it is the last mapped sg.

Change-Id: Ie496234ebae6e04a3b4ea68a682cc32109663e44
Signed-off-by: Pratham Pratap <prathampratap@codeaurora.org>
This commit is contained in:
Pratham Pratap 2019-08-12 12:20:20 +05:30 • committed by Gerrit - the friendly Code Review server
commit 55dd719983

View file

@ -1062,7 +1062,14 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep,
unsigned int rem = length % maxp;
unsigned chain = true;
if (sg_is_last(s))
/*
* IOMMU driver is clubbing the list of sgs which shares a page
* boundary into one and giving it to USB driver. With this the
* number of sgs mapped it not equal to the the number of sgs
* passed. Mark the chain bit to false if it is the last mapped
* sg.
*/
if (sg_is_last(s) || (i == remaining - 1))
chain = false;
if (rem && usb_endpoint_dir_out(dep->endpoint.desc) && !chain) {