sJuergen Keil wrote: > Hmm, does ddi_intr_disable() require a PCI2.3 device - a device that > implements > bit 10 (pci interrupt disable) in the pci device control register? > > I'm affraid the ICH4-M chipset does not implment that bit, for the uhci > controller... (according to Intel's specs...) > > ICH5, ICH6, ... has it. > > > No, its handled by common PCI nexus code. I confess I'm not entirely sure how the nexus code handles this. I would have suspected APIC related code, but I'm not seeing that in the code. It looks like it boils down to a call to rem_avintr(), which I don't see masking off any hardware interrupts, but maybe I'm missing something.
If the hardware interrupts are not masked, then my "suggested workaround" won't work. -- Garrett >> So a possible workaround might be to use the DDI to disable interrupt >> receipt (ddi_intr_disable().) This might require conversion of the uhci >> driver to the new style interrupt APIs. I've not looked at it that closely. >> >> -- Garrett >> >> Juergen Keil wrote: >> >>>> Looking at the code for uhci, its clearly busted. >>>> >>>> The code needs to set a suspended flag (under a lock), and check that it >>>> is not set when servicing interrupts. >>>> >>>> >>> Such a flag already exists: uhcip->uhci_hc_soft_state / >>> > UHCI_CTLR_SUSPEND_STATE, > >>> and it is set and tested protected by the uhci_int_mutex lock. >>> >>> Problem is that uhci_cpr_suspend() temporarily releases the uhci_int_mutex >>> lock while calling delay(), and apparently it releases the lock before >>> the uhci hw is really stopped. And before the uhcip->uhci_hc_soft_state >>> flag is set to UHCI_CTLR_SUSPEND_STATE. That delay() call is exactly where >>> my Toshiba Laptop is hanging, when I try to S3-suspend it. >>> >>> >>> >>> >>> >>>> But, I see another problem, which is that perhaps the code is not >>>> clearing the interrupts when it disables them in uhci_cpr_suspend(). >>>> Still, it seems like the device should not be generating interrupts to >>>> the hardware if the interrupt enable status bit is cleared. *That* >>>> sounds like a potential hardware bug. >>>> >>>> >>> Yes, looks like >>> >>> - either a new new uhci interrupt is generated between lines 831 .. 834 >>> (which seems unlikely, because so far, the S3-suspend hang happens >>> every time) >>> >>> - or the Set_OpReg16(USBINTR, DISABLE_ALL_INTRS); doesn't have an >>> effect immediately - so that we can receive at least one more uhci >>> interrupt while we're inside the delay call at line 839. >>> >>> 816 /* >>> 817 * uhci_cpr_suspend >>> 818 */ >>> 819 static int >>> 820 uhci_cpr_suspend(uhci_state_t *uhcip) >>> 821 { >>> 822 USB_DPRINTF_L4(PRINT_MASK_ATTA, uhcip->uhci_log_hdl, >>> 823 "uhci_cpr_suspend:"); >>> 824 >>> 825 /* Call into the root hub and suspend it */ >>> 826 if (usba_hubdi_detach(uhcip->uhci_dip, DDI_SUSPEND) != >>> > DDI_SUCCESS) { > >>> 827 >>> 828 return (DDI_FAILURE); >>> 829 } >>> 830 >>> 831 mutex_enter(&uhcip->uhci_int_mutex); >>> 832 >>> 833 /* Disable interrupts */ >>> 834 Set_OpReg16(USBINTR, DISABLE_ALL_INTRS); >>> 835 >>> 836 mutex_exit(&uhcip->uhci_int_mutex); >>> 837 >>> 838 /* Wait for SOF time to handle the scheduled interrupt */ >>> 839 delay(drv_usectohz(UHCI_TIMEWAIT)); >>> >>> >>> Btw. the uhci controller im my Toshiba Tecra S1 laptop is part of an >>> Intel ICH4-M chipset. >>> >>> >>> >>> >>> >>>> -- Garrett >>>> >>>> J??rgen Keil wrote: >>>> >>>> >>>>> 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 >>>>> _______________________________________________ >>>>> laptop-discuss mailing list >>>>> laptop-discuss at opensolaris.org >>>>> > > -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.opensolaris.org/pipermail/pm-discuss/attachments/20080625/5fe37f31/attachment.html>