2009-12-22 Vladimir Serbinenko <phcoder@gmail.com>
* bus/usb/uhci.c (grub_uhci_transfer): Set a limit transaction time. (grub_uhci_portstatus): Likewise. (grub_uhci_portstatus): Add necessary delay.
This commit is contained in:
parent
d4e580ed07
commit
b5d5993b6d
2 changed files with 22 additions and 3 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2009-12-22 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* bus/usb/uhci.c (grub_uhci_transfer): Set a limit transaction time.
|
||||||
|
(grub_uhci_portstatus): Likewise.
|
||||||
|
(grub_uhci_portstatus): Add necessary delay.
|
||||||
|
|
||||||
2009-12-21 Carles Pina i Estany <carles@pina.cat>
|
2009-12-21 Carles Pina i Estany <carles@pina.cat>
|
||||||
|
|
||||||
* commands/acpi.c (options): Fix capitalizations and/or full stops.
|
* commands/acpi.c (options): Fix capitalizations and/or full stops.
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
#include <grub/usb.h>
|
#include <grub/usb.h>
|
||||||
#include <grub/usbtrans.h>
|
#include <grub/usbtrans.h>
|
||||||
#include <grub/pci.h>
|
#include <grub/pci.h>
|
||||||
#include <grub/cpu/pci.h>
|
|
||||||
#include <grub/i386/io.h>
|
#include <grub/i386/io.h>
|
||||||
#include <grub/time.h>
|
#include <grub/time.h>
|
||||||
|
|
||||||
|
@ -435,6 +434,7 @@ grub_uhci_transfer (grub_usb_controller_t dev,
|
||||||
grub_uhci_td_t td_prev = NULL;
|
grub_uhci_td_t td_prev = NULL;
|
||||||
grub_usb_err_t err = GRUB_USB_ERR_NONE;
|
grub_usb_err_t err = GRUB_USB_ERR_NONE;
|
||||||
int i;
|
int i;
|
||||||
|
grub_uint64_t endtime;
|
||||||
|
|
||||||
/* Allocate a queue head for the transfer queue. */
|
/* Allocate a queue head for the transfer queue. */
|
||||||
qh = grub_alloc_qh (u, GRUB_USB_TRANSACTION_TYPE_CONTROL);
|
qh = grub_alloc_qh (u, GRUB_USB_TRANSACTION_TYPE_CONTROL);
|
||||||
|
@ -483,6 +483,7 @@ grub_uhci_transfer (grub_usb_controller_t dev,
|
||||||
|
|
||||||
/* Wait until either the transaction completed or an error
|
/* Wait until either the transaction completed or an error
|
||||||
occurred. */
|
occurred. */
|
||||||
|
endtime = grub_get_time_ms () + 1000;
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
grub_uhci_td_t errtd;
|
grub_uhci_td_t errtd;
|
||||||
|
@ -534,6 +535,13 @@ grub_uhci_transfer (grub_usb_controller_t dev,
|
||||||
updated. */
|
updated. */
|
||||||
grub_dprintf ("uhci", "transaction fallthrough\n");
|
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");
|
grub_dprintf ("uhci", "transaction complete\n");
|
||||||
|
@ -573,6 +581,7 @@ grub_uhci_portstatus (grub_usb_controller_t dev,
|
||||||
struct grub_uhci *u = (struct grub_uhci *) dev->data;
|
struct grub_uhci *u = (struct grub_uhci *) dev->data;
|
||||||
int reg;
|
int reg;
|
||||||
unsigned int status;
|
unsigned int status;
|
||||||
|
grub_uint64_t endtime;
|
||||||
|
|
||||||
grub_dprintf ("uhci", "enable=%d port=%d\n", enable, port);
|
grub_dprintf ("uhci", "enable=%d port=%d\n", enable, port);
|
||||||
|
|
||||||
|
@ -595,6 +604,7 @@ grub_uhci_portstatus (grub_usb_controller_t dev,
|
||||||
status = grub_uhci_readreg16 (u, reg);
|
status = grub_uhci_readreg16 (u, reg);
|
||||||
grub_uhci_writereg16 (u, reg, status & ~(1 << 9));
|
grub_uhci_writereg16 (u, reg, status & ~(1 << 9));
|
||||||
grub_dprintf ("uhci", "reset completed\n");
|
grub_dprintf ("uhci", "reset completed\n");
|
||||||
|
grub_millisleep (10);
|
||||||
|
|
||||||
/* Enable the port. */
|
/* Enable the port. */
|
||||||
grub_uhci_writereg16 (u, reg, enable << 2);
|
grub_uhci_writereg16 (u, reg, enable << 2);
|
||||||
|
@ -602,7 +612,10 @@ grub_uhci_portstatus (grub_usb_controller_t dev,
|
||||||
|
|
||||||
grub_dprintf ("uhci", "waiting for the port to be enabled\n");
|
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);
|
status = grub_uhci_readreg16 (u, reg);
|
||||||
grub_dprintf ("uhci", ">3detect=0x%02x\n", status);
|
grub_dprintf ("uhci", ">3detect=0x%02x\n", status);
|
||||||
|
|
Loading…
Add table
Reference in a new issue