Skip to content

Commit

Permalink
[xhci] Forcibly disable SMIs if BIOS fails to release ownership
Browse files Browse the repository at this point in the history
If the BIOS fails to gracefully release ownership of the xHCI
controller, we can forcibly claim it by disabling all SMIs via the
USB legacy support control/status register.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Mar 16, 2015
1 parent 838ab97 commit 3de0ffc
Showing 1 changed file with 10 additions and 10 deletions.
20 changes: 10 additions & 10 deletions src/drivers/usb/xhci.c
Expand Up @@ -556,16 +556,15 @@ static void xhci_legacy_init ( struct xhci_device *xhci ) {
* Claim ownership from BIOS
*
* @v xhci xHCI device
* @ret rc Return status code
*/
static int xhci_legacy_claim ( struct xhci_device *xhci ) {
static void xhci_legacy_claim ( struct xhci_device *xhci ) {
uint32_t ctlsts;
uint8_t bios;
unsigned int i;

/* Do nothing unless legacy support capability is present */
if ( ! xhci->legacy )
return 0;
return;

/* Claim ownership */
writeb ( XHCI_USBLEGSUP_OS_OWNED,
Expand All @@ -585,16 +584,19 @@ static int xhci_legacy_claim ( struct xhci_device *xhci ) {
DBGC ( xhci, "XHCI %p warning: BIOS retained "
"SMIs: %08x\n", xhci, ctlsts );
}
return 0;
return;
}

/* Delay */
mdelay ( 1 );
}

DBGC ( xhci, "XHCI %p timed out waiting for BIOS to release "
"ownership\n", xhci );
return -ETIMEDOUT;
/* BIOS did not release ownership. Claim it forcibly by
* disabling all SMIs.
*/
DBGC ( xhci, "XHCI %p could not claim ownership from BIOS: forcibly "
"disabling SMIs\n", xhci );
writel ( 0, xhci->cap + xhci->legacy + XHCI_USBLEGSUP_CTLSTS );
}

/**
Expand Down Expand Up @@ -3105,8 +3107,7 @@ static int xhci_probe ( struct pci_device *pci ) {

/* Initialise USB legacy support and claim ownership */
xhci_legacy_init ( xhci );
if ( ( rc = xhci_legacy_claim ( xhci ) ) != 0 )
goto err_legacy_claim;
xhci_legacy_claim ( xhci );

/* Fix Intel PCH-specific quirks, if applicable */
if ( pci->id->driver_data & XHCI_PCH )
Expand Down Expand Up @@ -3148,7 +3149,6 @@ static int xhci_probe ( struct pci_device *pci ) {
if ( pci->id->driver_data & XHCI_PCH )
xhci_pch_undo ( xhci, pci );
xhci_legacy_release ( xhci );
err_legacy_claim:
iounmap ( xhci->regs );
err_ioremap:
free ( xhci );
Expand Down

0 comments on commit 3de0ffc

Please sign in to comment.