From b1385bc32d5b482f08e960629194af418b1aa882 Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Fri, 6 Jun 2008 11:45:10 +0000 Subject: [PATCH] * When encountering an unrecoverable error at least turn off interrupts until we properly handle this case (cancel everything and reset the controller) to avoid flooding the system with interrupts. * Also only check for enabled interrupts to not steal potentially shared interrupts. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25823 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/busses/usb/uhci.cpp | 14 ++++++++++---- src/add-ons/kernel/busses/usb/uhci.h | 1 + src/add-ons/kernel/busses/usb/uhci_hardware.h | 1 - 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/add-ons/kernel/busses/usb/uhci.cpp b/src/add-ons/kernel/busses/usb/uhci.cpp index 2100689368..0ea8cd0cb8 100644 --- a/src/add-ons/kernel/busses/usb/uhci.cpp +++ b/src/add-ons/kernel/busses/usb/uhci.cpp @@ -287,6 +287,7 @@ UHCI::UHCI(pci_info *info, Stack *stack) : BusManager(stack), fPCIInfo(info), fStack(stack), + fEnabledInterrupts(0), fFrameArea(-1), fFrameList(NULL), fFrameBandwidth(NULL), @@ -453,8 +454,10 @@ UHCI::UHCI(pci_info *info, Stack *stack) InterruptHandler, (void *)this, 0); // Enable interrupts - WriteReg16(UHCI_USBINTR, UHCI_USBINTR_CRC | UHCI_USBINTR_RESUME - | UHCI_USBINTR_IOC | UHCI_USBINTR_SHORT); + fEnabledInterrupts = UHCI_USBSTS_USBINT | UHCI_USBSTS_ERRINT + | UHCI_USBSTS_HOSTERR | UHCI_USBSTS_HCPRERR | UHCI_USBSTS_HCHALT; + WriteReg16(UHCI_USBINTR, UHCI_USBINTR_CRC | UHCI_USBINTR_IOC + | UHCI_USBINTR_SHORT); TRACE(("usb_uhci: UHCI Host Controller Driver constructed\n")); fInitOK = true; @@ -1536,7 +1539,7 @@ UHCI::Interrupt() // Check if we really had an interrupt uint16 status = ReadReg16(UHCI_USBSTS); - if ((status & UHCI_INTERRUPT_MASK) == 0) { + if ((status & fEnabledInterrupts) == 0) { release_spinlock(&lock); return B_UNHANDLED_INTERRUPT; } @@ -1575,7 +1578,10 @@ UHCI::Interrupt() } if (status & UHCI_USBSTS_HCHALT) { - TRACE(("usb_uhci: host controller halted\n")); + TRACE_ERROR(("usb_uhci: host controller halted\n")); + // at least disable interrupts so we do not flood the system + WriteReg16(UHCI_USBINTR, 0); + fEnabledInterrupts = 0; // ToDo: cancel all transfers and reset the host controller // acknowledge not needed } diff --git a/src/add-ons/kernel/busses/usb/uhci.h b/src/add-ons/kernel/busses/usb/uhci.h index 5b8b5bb96b..5771326f34 100644 --- a/src/add-ons/kernel/busses/usb/uhci.h +++ b/src/add-ons/kernel/busses/usb/uhci.h @@ -194,6 +194,7 @@ static pci_module_info *sPCIModule; uint32 fRegisterBase; pci_info *fPCIInfo; Stack *fStack; + uint32 fEnabledInterrupts; // Frame list memory area_id fFrameArea; diff --git a/src/add-ons/kernel/busses/usb/uhci_hardware.h b/src/add-ons/kernel/busses/usb/uhci_hardware.h index 47e35f1df9..8511690751 100644 --- a/src/add-ons/kernel/busses/usb/uhci_hardware.h +++ b/src/add-ons/kernel/busses/usb/uhci_hardware.h @@ -50,7 +50,6 @@ #define UHCI_USBSTS_HOSTERR 0x08 // Host System Error #define UHCI_USBSTS_HCPRERR 0x10 // Host Controller Process error #define UHCI_USBSTS_HCHALT 0x20 // HCHalted -#define UHCI_INTERRUPT_MASK 0x3f // Mask for all the interrupts //USBINTR #define UHCI_USBINTR_CRC 0x01 // Timeout/ CRC interrupt enable