rem: "ehci_intr: Interrupt occurred");
add: "ehci_intr: Interrupt occurred, arg1 0x%p arg2 0x%p", arg1, arg2);
context: ehci_intr(caddr_t arg){	uint_t			intr;	ehci_state_t		*ehcip = (ehci_state_t *)arg;	USB_DPRINTF_L3(PRINT_MASK_INTR, ehcip->ehci_log_hdl,	    "ehci_intr: Interrupt occurred");	/* Get the ehci global mutex */	mutex_enter(&ehcip->ehci_int_mutex);	/*	 * Now process the actual ehci interrupt events  that caused	 * invocation of this ehci interrupt handler.	 */	intr = (Get_OpReg(ehci_status) & Get_OpReg(ehci_interrupt));	/* Update kstat values */	ehci_do_intrs_stats(ehcip, intr);	/*	 * We could have gotten a spurious interrupts. If so, do not	 * claim it.  This is quite  possible on some  architectures	 * where more than one PCI slots share the IRQs.  If so, the	 * associated driver's interrupt routine may get called even	 * if the interrupt is not meant for them.	 *	 * By unclaiming the interrupt, the other driver gets chance	 * to service its interrupt.	 */	if (!intr) {		mutex_exit(&ehcip->ehci_int_mutex);		return (DDI_INTR_UNCLAIMED);	}	/* Acknowledge the interrupt */	Set_OpReg(ehci_status, intr);	if (ehcip->ehci_hc_soft_state == EHCI_CTLR_ERROR_STATE) {		mutex_exit(&ehcip->ehci_int_mutex);		return (DDI_INTR_CLAIMED);	}	USB_DPRINTF_L3(PRINT_MASK_INTR, ehcip->ehci_log_hdl,	    "Interrupt status 0x%x", intr);	/*	 * If necessary broadcast that an interrupt has occured.  This	 * is only necessary during controller init.	 */	if (ehcip->ehci_flags & EHCI_CV_INTR) {		ehcip->ehci_flags &= ~EHCI_CV_INTR;		cv_broadcast(&ehcip->ehci_async_schedule_advance_cv);	}	/* Check for Frame List Rollover */	if (intr & EHCI_INTR_FRAME_LIST_ROLLOVER) {		USB_DPRINTF_L4(PRINT_MASK_INTR, ehcip->ehci_log_hdl,		    "ehci_intr: Frame List Rollover");		ehci_handle_frame_list_rollover(ehcip);		/* VIA VT6202 looses EHCI_INTR_USB interrupts, workaround. */		if ((ehcip->ehci_vendor_id == PCI_VENDOR_VIA) &&		    (ehci_vt62x2_workaround & EHCI_VIA_LOST_INTERRUPTS)) {			ehcip->ehci_missed_intr_sts |= EHCI_INTR_USB;		}	}	/* Check for Advance on Asynchronous Schedule */	if (intr & EHCI_INTR_ASYNC_ADVANCE) {		USB_DPRINTF_L3(PRINT_MASK_INTR, ehcip->ehci_log_hdl,		    "ehci_intr: Asynchronous Schedule Advance Notification");		/* Disable async list advance interrupt */		Set_OpReg(ehci_interrupt,		    (Get_OpReg(ehci_interrupt) & ~EHCI_INTR_ASYNC_ADVANCE));		/*		 * Call cv_broadcast on every this interrupt to wakeup		 * all the threads that are waiting the async list advance		 * event.		 */		cv_broadcast(&ehcip->ehci_async_schedule_advance_cv);	}	/* Always process completed itds */	ehci_traverse_active_isoc_list(ehcip);	/*	 * Check for any USB transaction completion notification. Also	 * process any missed USB transaction completion interrupts.	 */	if ((intr & EHCI_INTR_USB) || (intr & EHCI_INTR_USB_ERROR) ||	    (ehcip->ehci_missed_intr_sts & EHCI_INTR_USB) ||	    (ehcip->ehci_missed_intr_sts & EHCI_INTR_USB_ERROR)) {		USB_DPRINTF_L3(PRINT_MASK_INTR, ehcip->ehci_log_hdl,		    "ehci_intr: USB Transaction Completion Notification");		/* Clear missed interrupts */		if (ehcip->ehci_missed_intr_sts) {			ehcip->ehci_missed_intr_sts = 0;		}		/* Process completed qtds */		ehci_traverse_active_qtd_list(ehcip);	}	/* Process endpoint reclamation list */	if (ehcip->ehci_reclaim_list) {		ehci_handle_endpoint_reclaimation(ehcip);	}	/* Check for Host System Error */	if (intr & EHCI_INTR_HOST_SYSTEM_ERROR) {		USB_DPRINTF_L2(PRINT_MASK_INTR, ehcip->ehci_log_hdl,		    "ehci_intr: Unrecoverable error");		ehci_handle_ue(ehcip);	}	/*	 * Read interrupt status register to make sure that any PIO	 * store to clear the ISR has made it on the PCI bus before	 * returning from its interrupt handler.	 */	(void) Get_OpReg(ehci_status);	/* Release the ehci global mutex */	mutex_exit(&ehcip->ehci_int_mutex);	USB_DPRINTF_L3(PRINT_MASK_INTR,  ehcip->ehci_log_hdl,	    "Interrupt handling completed");	return (DDI_INTR_CLAIMED);}