grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [solved] Re: USB device not seen by grub


From: Vladimir 'φ-coder/phcoder' Serbinenko
Subject: Re: [solved] Re: USB device not seen by grub
Date: Sat, 05 Dec 2009 10:16:45 +0100
User-agent: Mozilla-Thunderbird 2.0.0.22 (X11/20091109)

Chris Jones wrote:
> On Thu, Dec 03, 2009 at 05:52:37PM EST, Vladimir 'φ-coder/phcoder' Serbinenko 
> wrote:
>
> [..]
>
>   
>> This is just module loading. I guess your terminal is slow which causes
>> an enormous slowback when loading module. You can using
>>     
>
>   
>> debug=usb,uhci,ohci
>> instead of
>> debug=all
>>     
>
> I was able to boot the partition I had copied over to the USB stick after
> this:
>
> grub:> debug=uhci,ohci,usbms
> grub:> insmod uhci
> grub:> insmod usbms
> grub:> debug=
>
> Why do I have to enable tracing to make it work?
>
>   
Because a dprintf acted as a forgotten millisleep. This patch should fix
it. On my machine I still have issues because uhci.c has problems with
second port
> Also, is there any way I can run the grub command line on a system
> that's already booted, so I can explore its possibities in a context
> where I have internet access, browse documentation, etc..?
>
>   
I'm working on it but the current problem is that I haven't found a
syscall in linux to get physical address of a page. Does anyone has a
suggestion?
> Thanks,
>
> CJ
>
>
>
>
> _______________________________________________
> Grub-devel mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/grub-devel
>
>   


-- 
Regards
Vladimir 'φ-coder/phcoder' Serbinenko

=== modified file 'bus/usb/uhci.c'
--- bus/usb/uhci.c      2009-10-14 08:11:59 +0000
+++ bus/usb/uhci.c      2009-12-05 09:13:21 +0000
@@ -23,7 +23,6 @@
 #include <grub/usb.h>
 #include <grub/usbtrans.h>
 #include <grub/pci.h>
-#include <grub/cpu/pci.h>
 #include <grub/i386/io.h>
 #include <grub/time.h>
 
@@ -435,6 +434,7 @@
   grub_uhci_td_t td_prev = NULL;
   grub_usb_err_t err = GRUB_USB_ERR_NONE;
   int i;
+  grub_uint64_t endtime;
 
   /* Allocate a queue head for the transfer queue.  */
   qh = grub_alloc_qh (u, GRUB_USB_TRANSACTION_TYPE_CONTROL);
@@ -483,6 +483,7 @@
 
   /* Wait until either the transaction completed or an error
      occurred.  */
+  endtime = grub_get_time_ms () + 1000;
   for (;;)
     {
       grub_uhci_td_t errtd;
@@ -534,6 +535,13 @@
             updated.  */
          grub_dprintf ("uhci", "transaction fallthrough\n");
        }
+      if (grub_get_time_ms () > endtime)
+       {
+         err = GRUB_USB_ERR_STALL;
+         grub_dprintf ("uhci", "transaction timed out\n");
+         goto fail;
+       }
+      grub_cpu_idle ();
     }
 
   grub_dprintf ("uhci", "transaction complete\n");
@@ -573,6 +581,7 @@
   struct grub_uhci *u = (struct grub_uhci *) dev->data;
   int reg;
   unsigned int status;
+  grub_uint64_t endtime;
 
   grub_dprintf ("uhci", "enable=%d port=%d\n", enable, port);
 
@@ -595,6 +604,7 @@
   status = grub_uhci_readreg16 (u, reg);
   grub_uhci_writereg16 (u, reg, status & ~(1 << 9));
   grub_dprintf ("uhci", "reset completed\n");
+  grub_millisleep (10);
 
   /* Enable the port.  */
   grub_uhci_writereg16 (u, reg, enable << 2);
@@ -602,7 +612,10 @@
 
   grub_dprintf ("uhci", "waiting for the port to be enabled\n");
 
-  while (! (grub_uhci_readreg16 (u, reg) & (1 << 2)));
+  endtime = grub_get_time_ms () + 1000;
+  while (! (grub_uhci_readreg16 (u, reg) & (1 << 2)))
+    if (grub_get_time_ms () > endtime)
+      return grub_error (GRUB_ERR_IO, "UHCI Timed out");
 
   status = grub_uhci_readreg16 (u, reg);
   grub_dprintf ("uhci", ">3detect=0x%02x\n", status);

=== modified file 'bus/usb/usbhub.c'
--- bus/usb/usbhub.c    2009-07-16 22:14:09 +0000
+++ bus/usb/usbhub.c    2009-12-04 16:54:09 +0000
@@ -48,7 +48,7 @@
       if (! grub_usb_devs[i])
        break;
     }
-  if (grub_usb_devs[i])
+  if (i == 128)
     {
       grub_error (GRUB_ERR_IO, "Can't assign address to USB device");
       return NULL;
@@ -60,6 +60,7 @@
                         | GRUB_USB_REQTYPE_TARGET_DEV),
                        GRUB_USB_REQ_SET_ADDRESS,
                        i, 0, 0, NULL);
+
   dev->addr = i;
   dev->initialized = 1;
   grub_usb_devs[i] = dev;

=== modified file 'commands/usbtest.c'
--- commands/usbtest.c  2009-11-09 17:43:53 +0000
+++ commands/usbtest.c  2009-12-04 01:33:17 +0000
@@ -146,6 +146,7 @@
       usb_print_str ("Configuration:", dev, config->strconfig);
     }
 
+  if (dev->config[0].descconf)
   for (i = 0; i < dev->config[0].descconf->numif; i++)
     {
       int j;

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]