Print this page
Add xhci_quiesce to support fast reboot.
*** 9,18 ****
--- 9,19 ----
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright (c) 2017, Joyent, Inc.
+ * Copyright (c) 2018, Western Digital Corporation.
*/
/*
* Extensible Host Controller Interface (xHCI) USB Driver
*
*** 1011,1024 ****
xhci_check_regs_acc(xhci_t *xhcip)
{
ddi_fm_error_t de;
/*
! * Treat the case where we can't check as fine so we can treat the code
* more simply.
*/
! if (!DDI_FM_ACC_ERR_CAP(xhcip->xhci_fm_caps))
return (DDI_FM_OK);
ddi_fm_acc_err_get(xhcip->xhci_regs_handle, &de, DDI_FME_VERSION);
ddi_fm_acc_err_clear(xhcip->xhci_regs_handle, DDI_FME_VERSION);
return (de.fme_status);
--- 1012,1025 ----
xhci_check_regs_acc(xhci_t *xhcip)
{
ddi_fm_error_t de;
/*
! * Treat cases where we can't check as fine so we can treat the code
* more simply.
*/
! if (quiesce_active || !DDI_FM_ACC_ERR_CAP(xhcip->xhci_fm_caps))
return (DDI_FM_OK);
ddi_fm_acc_err_get(xhcip->xhci_regs_handle, &de, DDI_FME_VERSION);
ddi_fm_acc_err_clear(xhcip->xhci_regs_handle, DDI_FME_VERSION);
return (de.fme_status);
*** 1969,1978 ****
--- 1970,1991 ----
ddi_soft_state_free(xhci_soft_state, inst);
return (DDI_SUCCESS);
}
+ /* QUIESCE(9E) to support fast reboot */
+ int
+ xhci_quiesce(dev_info_t *dip)
+ {
+ xhci_t *xhcip;
+
+ xhcip = ddi_get_soft_state(xhci_soft_state, ddi_get_instance(dip));
+
+ return (xhci_controller_stop(xhcip) == 0 &&
+ xhci_controller_reset(xhcip) == 0 ? DDI_SUCCESS : DDI_FAILURE);
+ }
+
static int
xhci_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
{
int ret, inst, route;
xhci_t *xhcip;
*** 2181,2191 ****
xhci_detach, /* devo_detach */
nodev, /* devo_reset */
&xhci_cb_ops, /* devo_cb_ops */
&usba_hubdi_busops, /* devo_bus_ops */
usba_hubdi_root_hub_power, /* devo_power */
! ddi_quiesce_not_supported /* devo_quiesce */
};
static struct modldrv xhci_modldrv = {
&mod_driverops,
"USB xHCI Driver",
--- 2194,2204 ----
xhci_detach, /* devo_detach */
nodev, /* devo_reset */
&xhci_cb_ops, /* devo_cb_ops */
&usba_hubdi_busops, /* devo_bus_ops */
usba_hubdi_root_hub_power, /* devo_power */
! xhci_quiesce /* devo_quiesce */
};
static struct modldrv xhci_modldrv = {
&mod_driverops,
"USB xHCI Driver",