Commit 8a344220 authored by Kishon Vijay Abraham I's avatar Kishon Vijay Abraham I Committed by Felipe Balbi

usb: dwc3: ep0: preparation for handling non maxpacket aligned transfers > 512

No functional change. This is in preparation for handling non maxpacket
aligned transfers greater than bounce buffer size. This is basically to
avoid code duplication when using chained TRB transfers to handle
non maxpacket aligned transfers greater than bounce buffer size.
Signed-off-by: default avatarKishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 2e5464da
...@@ -783,7 +783,11 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc, ...@@ -783,7 +783,11 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc,
struct usb_request *ur; struct usb_request *ur;
struct dwc3_trb *trb; struct dwc3_trb *trb;
struct dwc3_ep *ep0; struct dwc3_ep *ep0;
u32 transferred; unsigned transfer_size = 0;
unsigned maxp;
unsigned remaining_ur_length;
void *buf;
u32 transferred = 0;
u32 status; u32 status;
u32 length; u32 length;
u8 epnum; u8 epnum;
...@@ -812,20 +816,24 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc, ...@@ -812,20 +816,24 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc,
} }
ur = &r->request; ur = &r->request;
buf = ur->buf;
remaining_ur_length = ur->length;
length = trb->size & DWC3_TRB_SIZE_MASK; length = trb->size & DWC3_TRB_SIZE_MASK;
maxp = ep0->endpoint.maxpacket;
if (dwc->ep0_bounced) { if (dwc->ep0_bounced) {
unsigned maxp = ep0->endpoint.maxpacket; transfer_size = roundup((ur->length - transfer_size),
unsigned transfer_size = roundup(ur->length, maxp); maxp);
/* Maximum of DWC3_EP0_BOUNCE_SIZE can only be received */ /* Maximum of DWC3_EP0_BOUNCE_SIZE can only be received */
if (transfer_size > DWC3_EP0_BOUNCE_SIZE) if (transfer_size > DWC3_EP0_BOUNCE_SIZE)
transfer_size = DWC3_EP0_BOUNCE_SIZE; transfer_size = DWC3_EP0_BOUNCE_SIZE;
transferred = min_t(u32, ur->length, transferred = min_t(u32, remaining_ur_length,
transfer_size - length); transfer_size - length);
memcpy(ur->buf, dwc->ep0_bounce, transferred); memcpy(buf, dwc->ep0_bounce, transferred);
} else { } else {
transferred = ur->length - length; transferred = ur->length - length;
} }
...@@ -934,7 +942,7 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc, ...@@ -934,7 +942,7 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
DWC3_TRBCTL_CONTROL_DATA); DWC3_TRBCTL_CONTROL_DATA);
} else if (!IS_ALIGNED(req->request.length, dep->endpoint.maxpacket) } else if (!IS_ALIGNED(req->request.length, dep->endpoint.maxpacket)
&& (dep->number == 0)) { && (dep->number == 0)) {
u32 transfer_size; u32 transfer_size = 0;
u32 maxpacket; u32 maxpacket;
ret = usb_gadget_map_request(&dwc->gadget, &req->request, ret = usb_gadget_map_request(&dwc->gadget, &req->request,
...@@ -945,7 +953,8 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc, ...@@ -945,7 +953,8 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
} }
maxpacket = dep->endpoint.maxpacket; maxpacket = dep->endpoint.maxpacket;
transfer_size = roundup(req->request.length, maxpacket); transfer_size = roundup((req->request.length - transfer_size),
maxpacket);
if (transfer_size > DWC3_EP0_BOUNCE_SIZE) { if (transfer_size > DWC3_EP0_BOUNCE_SIZE) {
dev_WARN(dwc->dev, "bounce buf can't handle req len\n"); dev_WARN(dwc->dev, "bounce buf can't handle req len\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment