Print this page
Customize reset for HPE iLO
*** 985,995 ****
--- 985,1014 ----
}
return (DDI_SUCCESS);
}
+ /*
+ * ehci_wait_reset
+ *
+ * wait specified time for chip to reset
+ * with workaround of 250us for HPE iLO chip
+ */
+ static void
+ ehci_wait_reset(ehci_state_t *ehcip, clock_t microsecs)
+ {
+ /* Wait specified times for reset to complete */
+ drv_usecwait(microsecs);
+ if (ehcip->ehci_vendor_id == PCI_VENDOR_HP) {
+ for (int i = 10; i < 250; i += 10) {
+ /* Wait 10ms for reset to complete */
+ drv_usecwait(EHCI_RESET_TIMEWAIT);
+ }
+ }
+ }
+
/*
* ehci_init_hardware
*
* take control from BIOS, reset EHCI host controller, and check version, etc.
*/
*** 1029,1039 ****
/* Reset the EHCI host controller */
Set_OpReg(ehci_command,
Get_OpReg(ehci_command) | EHCI_CMD_HOST_CTRL_RESET);
/* Wait 10ms for reset to complete */
! drv_usecwait(EHCI_RESET_TIMEWAIT);
ASSERT(Get_OpReg(ehci_status) & EHCI_STS_HOST_CTRL_HALTED);
/* Verify the version number */
revision = Get_16Cap(ehci_version);
--- 1048,1058 ----
/* Reset the EHCI host controller */
Set_OpReg(ehci_command,
Get_OpReg(ehci_command) | EHCI_CMD_HOST_CTRL_RESET);
/* Wait 10ms for reset to complete */
! ehci_wait_reset(ehcip, EHCI_RESET_TIMEWAIT);
ASSERT(Get_OpReg(ehci_status) & EHCI_STS_HOST_CTRL_HALTED);
/* Verify the version number */
revision = Get_16Cap(ehci_version);
*** 3814,3824 ****
Set_OpReg(ehci_command, ((Get_OpReg(ehci_command) &
~EHCI_CMD_INTR_THRESHOLD) |
(EHCI_CMD_01_INTR | EHCI_CMD_HOST_CTRL_RUN)));
/* Wait 10ms for EHCI to start sending SOF */
! drv_usecwait(EHCI_RESET_TIMEWAIT);
/*
* Get the current usb frame number before waiting for
* few milliseconds.
*/
--- 3833,3843 ----
Set_OpReg(ehci_command, ((Get_OpReg(ehci_command) &
~EHCI_CMD_INTR_THRESHOLD) |
(EHCI_CMD_01_INTR | EHCI_CMD_HOST_CTRL_RUN)));
/* Wait 10ms for EHCI to start sending SOF */
! ehci_wait_reset(ehcip, EHCI_RESET_TIMEWAIT);
/*
* Get the current usb frame number before waiting for
* few milliseconds.
*/