Skip to content

Commit bc9a2e2

Browse files
Thinh Nguyenfelipebalbi
authored andcommitted
usb: dwc3: gadget: Handle ZLP for sg requests
Currently dwc3 doesn't handle usb_request->zero for SG requests. This change checks and prepares extra TRBs for the ZLP for SG requests. Cc: <[email protected]> # v4.5+ Fixes: 04c03d1 ("usb: dwc3: gadget: handle request->zero") Signed-off-by: Thinh Nguyen <[email protected]> Signed-off-by: Felipe Balbi <[email protected]>
1 parent d2ee3ff commit bc9a2e2

File tree

1 file changed

+31
-0
lines changed

1 file changed

+31
-0
lines changed

drivers/usb/dwc3/gadget.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,6 +1143,37 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep,
11431143
req->request.short_not_ok,
11441144
req->request.no_interrupt,
11451145
req->request.is_last);
1146+
} else if (req->request.zero && req->request.length &&
1147+
!usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
1148+
!rem && !chain) {
1149+
struct dwc3 *dwc = dep->dwc;
1150+
struct dwc3_trb *trb;
1151+
1152+
req->needs_extra_trb = true;
1153+
1154+
/* Prepare normal TRB */
1155+
dwc3_prepare_one_trb(dep, req, trb_length, true, i);
1156+
1157+
/* Prepare one extra TRB to handle ZLP */
1158+
trb = &dep->trb_pool[dep->trb_enqueue];
1159+
req->num_trbs++;
1160+
__dwc3_prepare_one_trb(dep, trb, dwc->bounce_addr, 0,
1161+
!req->direction, 1,
1162+
req->request.stream_id,
1163+
req->request.short_not_ok,
1164+
req->request.no_interrupt,
1165+
req->request.is_last);
1166+
1167+
/* Prepare one more TRB to handle MPS alignment */
1168+
if (!req->direction) {
1169+
trb = &dep->trb_pool[dep->trb_enqueue];
1170+
req->num_trbs++;
1171+
__dwc3_prepare_one_trb(dep, trb, dwc->bounce_addr, maxp,
1172+
false, 1, req->request.stream_id,
1173+
req->request.short_not_ok,
1174+
req->request.no_interrupt,
1175+
req->request.is_last);
1176+
}
11461177
} else {
11471178
dwc3_prepare_one_trb(dep, req, trb_length, chain, i);
11481179
}

0 commit comments

Comments
 (0)