summaryrefslogtreecommitdiffstats
path: root/drivers/usb/gadget/f_fastboot.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/gadget/f_fastboot.c')
-rw-r--r--drivers/usb/gadget/f_fastboot.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c
index 74fb524c1c..2170dd45fb 100644
--- a/drivers/usb/gadget/f_fastboot.c
+++ b/drivers/usb/gadget/f_fastboot.c
@@ -614,6 +614,16 @@ static void cb_getvar(struct f_fastboot *f_fb, const char *cmd)
fastboot_tx_print(f_fb, "OKAY");
}
+static int rx_bytes_expected(struct f_fastboot *f_fb)
+{
+ int remaining = f_fb->download_size - f_fb->download_bytes;
+
+ if (remaining >= EP_BUFFER_SIZE)
+ return EP_BUFFER_SIZE;
+
+ return ALIGN(remaining, f_fb->out_ep->maxpacket);
+}
+
static void rx_handler_dl_image(struct usb_ep *ep, struct usb_request *req)
{
struct f_fastboot *f_fb = req->context;
@@ -637,9 +647,7 @@ static void rx_handler_dl_image(struct usb_ep *ep, struct usb_request *req)
f_fb->download_bytes += req->actual;
- req->length = f_fb->download_size - f_fb->download_bytes;
- if (req->length > EP_BUFFER_SIZE)
- req->length = EP_BUFFER_SIZE;
+ req->length = rx_bytes_expected(f_fb);
show_progress(f_fb->download_bytes);
@@ -692,9 +700,7 @@ static void cb_download(struct f_fastboot *f_fb, const char *cmd)
struct usb_ep *ep = f_fb->out_ep;
fastboot_tx_print(f_fb, "DATA%08x", f_fb->download_size);
req->complete = rx_handler_dl_image;
- req->length = EP_BUFFER_SIZE;
- if (req->length < ep->maxpacket)
- req->length = ep->maxpacket;
+ req->length = rx_bytes_expected(f_fb);
}
}