Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 065e2d2e authored by Sriharsha Allenki's avatar Sriharsha Allenki
Browse files

usb: gadget: Fix incorrect ISOC data transfer PIDs



The PIDs for Iscohronous data transfers are incorrect
for high bandwidth endpoints when the request length is
less than the wMaxPacketSize.
The correct PIDs for ISOC data transfers is
For request length < maxPayloadSize
	- DATA0,
For maxPayloadSize < length < 2*maxPayloadSize
	- DATA0,DATA1
For 2*maxPayloadSize <  length < 3*maxPayloadSize
	- DATA2, DATA1, DATA0.
Fix this by setting the value of trb->size depending
on request length rather than fixing it to the value
depending on wMaxPacketSize.

Change-Id: I9ae88ed3abc566e02daa727e84a2938582931436
Signed-off-by: default avatarSriharsha Allenki <sallenki@codeaurora.org>
parent 3eeaf80c
Loading
Loading
Loading
Loading
+5 −2
Original line number Original line Diff line number Diff line
@@ -846,7 +846,7 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep,
	struct dwc3_trb		*trb;
	struct dwc3_trb		*trb;
	bool			zlp_appended = false;
	bool			zlp_appended = false;
	unsigned		rlen;
	unsigned		rlen;
	int			isoc_maxp;
	int			isoc_maxp, max_payload, mult;


	dev_vdbg(dwc->dev, "%s: req %pK dma %08llx length %d%s%s\n",
	dev_vdbg(dwc->dev, "%s: req %pK dma %08llx length %d%s%s\n",
			dep->name, req, (unsigned long long) dma,
			dep->name, req, (unsigned long long) dma,
@@ -881,7 +881,10 @@ update_trb:


	case USB_ENDPOINT_XFER_ISOC:
	case USB_ENDPOINT_XFER_ISOC:
		isoc_maxp = usb_endpoint_maxp(dep->endpoint.desc);
		isoc_maxp = usb_endpoint_maxp(dep->endpoint.desc);
		trb->size |= DWC3_TRB_SIZE_PCM1(isoc_maxp >> 11);
		max_payload = isoc_maxp & 0x7FF;
		mult = (req->request.length/max_payload) & 0x3;
		trb->size |= DWC3_TRB_SIZE_PCM1(
			(req->request.length%max_payload) ? mult : mult-1);
		if (!node)
		if (!node)
			trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS_FIRST;
			trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS_FIRST;
		else
		else