Can anyone reproduce a hanging system when trying to use S3 suspend-to-ram,
immediately after the first uhci driver instance gets suspended?
Most likely this is an issue only on systems where uhci is sharing
it's interrupt vector with other devices.

My Toshiba Tecra S1 laptop used to be able to enter S3 suspend-to-ram
mode.

Seems that since the putback for 6681221 "Solaris hangs during early boot
when EHCI-2 is enabled from BIOS" S3-suspend is broken.  As soon as the first
uhci controller gets suspended (uhci0), system hangs (with an interrupt storm?).
The laptop doesn't reach S3-STR state any more.

There is an interrupt pending for uhci0 (intr_status == 1), but interrupts
are supposed to be disabled (intr_reg == 0), so the code returns from
uhci_intr without acknowledging the pending interrupt (lines 954 - 952 in 
uhci.c) .
Interrupt handler is immediately re-entered; there's no more progress with
S3-suspend.

usr/src/uts/common/io/usb/hcd/uhci/uhci.c:
   940          /* Get the status of the interrupts */
   941          intr_status = Get_OpReg16(USBSTS);
   942          intr_reg = Get_OpReg16(USBINTR);
   943
   944          USB_DPRINTF_L3(PRINT_MASK_INTR, uhcip->uhci_log_hdl,
   945              "uhci_intr: intr_status = %x, intr_reg = %x",
   946              intr_status, intr_reg);
   947
   948          /*
   949           * If uhci interrupts are all disabled, the driver should return
   950           * unclaimed.
   951           * HC Process Error and Host System Error interrupts cannot be
   952           * disabled by intr register, and need to be judged separately.
   953           */
   954          if (((intr_reg & ENABLE_ALL_INTRS) == 0) &&
   955              ((intr_status & USBSTS_REG_HC_PROCESS_ERR) == 0) &&
   956              ((intr_status & USBSTS_REG_HOST_SYS_ERR) == 0)) {
   957
   958                  USB_DPRINTF_L3(PRINT_MASK_INTR, uhcip->uhci_log_hdl,
   959                      "uhci_intr: interrupts disabled, unclaim");
   960                  mutex_exit(&uhcip->uhci_int_mutex);
   961
   962                  return (DDI_INTR_UNCLAIMED);
   963          }
--
This message posted from opensolaris.org

Reply via email to