static grub_usb_err_t
grub_ohci_transfer (grub_usb_controller_t dev,
- grub_usb_transfer_t transfer)
+ grub_usb_transfer_t transfer, int timeout)
{
struct grub_ohci *o = (struct grub_ohci *) dev->data;
grub_ohci_ed_t ed_virt;
}
/* Safety measure to avoid a hang. */
- maxtime = grub_get_time_ms () + 1000;
+ maxtime = grub_get_time_ms () + timeout;
/* Wait until the transfer is completed or STALLs. */
do
static grub_usb_err_t
grub_uhci_transfer (grub_usb_controller_t dev,
- grub_usb_transfer_t transfer)
+ grub_usb_transfer_t transfer,
+ int timeout)
{
struct grub_uhci *u = (struct grub_uhci *) dev->data;
grub_uhci_qh_t qh;
/* Wait until either the transaction completed or an error
occurred. */
- endtime = grub_get_time_ms () + 1000;
+ endtime = grub_get_time_ms () + timeout;
for (;;)
{
grub_uhci_td_t errtd;
transfer->transactions[datablocks + 1].toggle = 1;
- err = dev->controller.dev->transfer (&dev->controller, transfer);
+ err = dev->controller.dev->transfer (&dev->controller, transfer, 1000);
grub_dprintf ("usb", "control: err=%d\n", err);
grub_free (transfer->transactions);
static grub_usb_err_t
grub_usb_bulk_readwrite (grub_usb_device_t dev,
int endpoint, grub_size_t size0, char *data_in,
- grub_transfer_type_t type)
+ grub_transfer_type_t type, int timeout)
{
int i;
grub_usb_transfer_t transfer;
size -= tr->size;
}
- err = dev->controller.dev->transfer (&dev->controller, transfer);
+ err = dev->controller.dev->transfer (&dev->controller, transfer, timeout);
/* We must remember proper toggle value even if some transactions
* were not processed - correct value should be inversion of last
* processed transaction (TD). */
int endpoint, grub_size_t size, char *data)
{
return grub_usb_bulk_readwrite (dev, endpoint, size, data,
- GRUB_USB_TRANSFER_TYPE_OUT);
+ GRUB_USB_TRANSFER_TYPE_OUT, 1000);
}
grub_usb_err_t
int endpoint, grub_size_t size, char *data)
{
return grub_usb_bulk_readwrite (dev, endpoint, size, data,
- GRUB_USB_TRANSFER_TYPE_IN);
+ GRUB_USB_TRANSFER_TYPE_IN, 1000);
+}
+
+grub_usb_err_t
+grub_usb_bulk_read_timeout (grub_usb_device_t dev,
+ int endpoint, grub_size_t size, char *data,
+ int timeout)
+{
+ return grub_usb_bulk_readwrite (dev, endpoint, size, data,
+ GRUB_USB_TRANSFER_TYPE_IN, timeout);
}
enum
{
+ GRUB_USB_REQTYPE_CLASS_INTERFACE_OUT = 0x21,
GRUB_USB_REQTYPE_VENDOR_OUT = 0x40
};
int (*iterate) (int (*hook) (grub_usb_controller_t dev));
grub_usb_err_t (*transfer) (grub_usb_controller_t dev,
- grub_usb_transfer_t transfer);
+ grub_usb_transfer_t transfer,
+ int timeout);
int (*hubports) (grub_usb_controller_t dev);
void grub_usb_poll_devices (void);
void grub_usb_device_attach (grub_usb_device_t dev);
+grub_usb_err_t
+grub_usb_bulk_read_timeout (grub_usb_device_t dev,
+ int endpoint, grub_size_t size, char *data,
+ int timeout);
#endif /* GRUB_USB_H */