]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Add possibility of bulk reading with short timeout
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 18 Jul 2010 19:35:22 +0000 (21:35 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 18 Jul 2010 19:35:22 +0000 (21:35 +0200)
bus/usb/ohci.c
bus/usb/uhci.c
bus/usb/usbtrans.c
include/grub/usb.h

index 57ca240659aef646d0fa4010f2255931fbc72b22..73e3e01e8fecabb9f92900e54d2f732eaed7382b 100644 (file)
@@ -654,7 +654,7 @@ grub_ohci_transaction (grub_ohci_td_t td,
 
 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;
@@ -832,7 +832,7 @@ grub_ohci_transfer (grub_usb_controller_t dev,
     }
 
   /* 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
index 5b4432018de8e264bbe2ce82304eda94944d10b1..d211de369cbeb6ca6655d6ec1872e532ced60f17 100644 (file)
@@ -436,7 +436,8 @@ grub_uhci_transaction (struct grub_uhci *u, unsigned int endp,
 
 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;
@@ -496,7 +497,7 @@ grub_uhci_transfer (grub_usb_controller_t dev,
 
   /* 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;
index 4a55cab11aa44851baabb0386dafb8cc5b1b5059..9dfef509f771cc300bc1f04eae28fc45042166df 100644 (file)
@@ -145,7 +145,7 @@ grub_usb_control_msg (grub_usb_device_t dev,
 
   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);
@@ -162,7 +162,7 @@ grub_usb_control_msg (grub_usb_device_t dev,
 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;
@@ -243,7 +243,7 @@ grub_usb_bulk_readwrite (grub_usb_device_t dev,
       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). */
@@ -269,7 +269,7 @@ grub_usb_bulk_write (grub_usb_device_t dev,
                     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
@@ -277,5 +277,14 @@ grub_usb_bulk_read (grub_usb_device_t dev,
                    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);
 }
index 595cbd6d31cb9859f5014e140cc72352a7eb5006..aba2fccc7704efc8588e13edb5a9b6bc6ae8ee40 100644 (file)
@@ -50,6 +50,7 @@ typedef enum
 
 enum
   {
+    GRUB_USB_REQTYPE_CLASS_INTERFACE_OUT = 0x21,
     GRUB_USB_REQTYPE_VENDOR_OUT = 0x40
   };
 
@@ -103,7 +104,8 @@ struct grub_usb_controller_dev
   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);
 
@@ -235,5 +237,9 @@ void grub_usb_unregister_attach_hook_class (struct grub_usb_attach_desc *desc);
 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 */