Split long USB transfers into short ones.
This commit is contained in:
parent
8eb8284d2d
commit
b879aa7b47
3 changed files with 22 additions and 4 deletions
|
@ -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>
|
||||
|
||||
* docs/grub.texi (Simple configuration): Clarify GRUB_HIDDEN_TIMEOUT
|
||||
|
|
|
@ -351,11 +351,23 @@ grub_usb_err_t
|
|||
grub_usb_bulk_read (grub_usb_device_t dev,
|
||||
int endpoint, grub_size_t size, char *data)
|
||||
{
|
||||
grub_size_t actual;
|
||||
grub_size_t actual, transferred;
|
||||
grub_usb_err_t err;
|
||||
err = grub_usb_bulk_readwrite (dev, endpoint, size, data,
|
||||
GRUB_USB_TRANSFER_TYPE_IN, 1000, &actual);
|
||||
if (!err && actual != size)
|
||||
grub_size_t current_size, position;
|
||||
|
||||
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;
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -19,6 +19,8 @@
|
|||
#ifndef GRUB_USBTRANS_H
|
||||
#define GRUB_USBTRANS_H 1
|
||||
|
||||
#define MAX_USB_TRANSFER_LEN 0x0800
|
||||
|
||||
typedef enum
|
||||
{
|
||||
GRUB_USB_TRANSFER_TYPE_IN,
|
||||
|
|
Loading…
Reference in a new issue