* 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
This commit is contained in:
@@ -287,6 +287,7 @@ UHCI::UHCI(pci_info *info, Stack *stack)
|
|||||||
: BusManager(stack),
|
: BusManager(stack),
|
||||||
fPCIInfo(info),
|
fPCIInfo(info),
|
||||||
fStack(stack),
|
fStack(stack),
|
||||||
|
fEnabledInterrupts(0),
|
||||||
fFrameArea(-1),
|
fFrameArea(-1),
|
||||||
fFrameList(NULL),
|
fFrameList(NULL),
|
||||||
fFrameBandwidth(NULL),
|
fFrameBandwidth(NULL),
|
||||||
@@ -453,8 +454,10 @@ UHCI::UHCI(pci_info *info, Stack *stack)
|
|||||||
InterruptHandler, (void *)this, 0);
|
InterruptHandler, (void *)this, 0);
|
||||||
|
|
||||||
// Enable interrupts
|
// Enable interrupts
|
||||||
WriteReg16(UHCI_USBINTR, UHCI_USBINTR_CRC | UHCI_USBINTR_RESUME
|
fEnabledInterrupts = UHCI_USBSTS_USBINT | UHCI_USBSTS_ERRINT
|
||||||
| UHCI_USBINTR_IOC | UHCI_USBINTR_SHORT);
|
| 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"));
|
TRACE(("usb_uhci: UHCI Host Controller Driver constructed\n"));
|
||||||
fInitOK = true;
|
fInitOK = true;
|
||||||
@@ -1536,7 +1539,7 @@ UHCI::Interrupt()
|
|||||||
|
|
||||||
// Check if we really had an interrupt
|
// Check if we really had an interrupt
|
||||||
uint16 status = ReadReg16(UHCI_USBSTS);
|
uint16 status = ReadReg16(UHCI_USBSTS);
|
||||||
if ((status & UHCI_INTERRUPT_MASK) == 0) {
|
if ((status & fEnabledInterrupts) == 0) {
|
||||||
release_spinlock(&lock);
|
release_spinlock(&lock);
|
||||||
return B_UNHANDLED_INTERRUPT;
|
return B_UNHANDLED_INTERRUPT;
|
||||||
}
|
}
|
||||||
@@ -1575,7 +1578,10 @@ UHCI::Interrupt()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (status & UHCI_USBSTS_HCHALT) {
|
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
|
// ToDo: cancel all transfers and reset the host controller
|
||||||
// acknowledge not needed
|
// acknowledge not needed
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -194,6 +194,7 @@ static pci_module_info *sPCIModule;
|
|||||||
uint32 fRegisterBase;
|
uint32 fRegisterBase;
|
||||||
pci_info *fPCIInfo;
|
pci_info *fPCIInfo;
|
||||||
Stack *fStack;
|
Stack *fStack;
|
||||||
|
uint32 fEnabledInterrupts;
|
||||||
|
|
||||||
// Frame list memory
|
// Frame list memory
|
||||||
area_id fFrameArea;
|
area_id fFrameArea;
|
||||||
|
|||||||
@@ -50,7 +50,6 @@
|
|||||||
#define UHCI_USBSTS_HOSTERR 0x08 // Host System Error
|
#define UHCI_USBSTS_HOSTERR 0x08 // Host System Error
|
||||||
#define UHCI_USBSTS_HCPRERR 0x10 // Host Controller Process error
|
#define UHCI_USBSTS_HCPRERR 0x10 // Host Controller Process error
|
||||||
#define UHCI_USBSTS_HCHALT 0x20 // HCHalted
|
#define UHCI_USBSTS_HCHALT 0x20 // HCHalted
|
||||||
#define UHCI_INTERRUPT_MASK 0x3f // Mask for all the interrupts
|
|
||||||
|
|
||||||
//USBINTR
|
//USBINTR
|
||||||
#define UHCI_USBINTR_CRC 0x01 // Timeout/ CRC interrupt enable
|
#define UHCI_USBINTR_CRC 0x01 // Timeout/ CRC interrupt enable
|
||||||
|
|||||||
Reference in New Issue
Block a user