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>
|
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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue