Split long USB transfers into short ones.

This commit is contained in:
Vladimir 'phcoder' Serbinenko 2013-01-20 22:45:53 +01:00
parent 8eb8284d2d
commit b879aa7b47
3 changed files with 22 additions and 4 deletions

View file

@ -1,3 +1,7 @@
2013-01-20 Aleš Nesrsta <starous@volny.cz>
Split long USB transfers into short ones.
2013-01-20 Andrey Borzenkov <arvidjaar@gmail.com> 2013-01-20 Andrey Borzenkov <arvidjaar@gmail.com>
* docs/grub.texi (Simple configuration): Clarify GRUB_HIDDEN_TIMEOUT * docs/grub.texi (Simple configuration): Clarify GRUB_HIDDEN_TIMEOUT

View file

@ -351,11 +351,23 @@ grub_usb_err_t
grub_usb_bulk_read (grub_usb_device_t dev, grub_usb_bulk_read (grub_usb_device_t dev,
int endpoint, grub_size_t size, char *data) int endpoint, grub_size_t size, char *data)
{ {
grub_size_t actual; grub_size_t actual, transferred;
grub_usb_err_t err; grub_usb_err_t err;
err = grub_usb_bulk_readwrite (dev, endpoint, size, data, grub_size_t current_size, position;
GRUB_USB_TRANSFER_TYPE_IN, 1000, &actual);
if (!err && actual != size) for (position = 0, transferred = 0;
position < size; position += MAX_USB_TRANSFER_LEN)
{
current_size = size - position;
if (current_size >= MAX_USB_TRANSFER_LEN)
current_size = MAX_USB_TRANSFER_LEN;
err = grub_usb_bulk_readwrite (dev, endpoint, current_size,
&data[position], GRUB_USB_TRANSFER_TYPE_IN, 1000, &actual);
transferred += actual;
if (err || (current_size != actual) ) break;
}
if (!err && transferred != size)
err = GRUB_USB_ERR_DATA; err = GRUB_USB_ERR_DATA;
return err; return err;
} }

View file

@ -19,6 +19,8 @@
#ifndef GRUB_USBTRANS_H #ifndef GRUB_USBTRANS_H
#define GRUB_USBTRANS_H 1 #define GRUB_USBTRANS_H 1
#define MAX_USB_TRANSFER_LEN 0x0800
typedef enum typedef enum
{ {
GRUB_USB_TRANSFER_TYPE_IN, GRUB_USB_TRANSFER_TYPE_IN,