Only check the explicitly enabled interrupts in EHCI. Otherwise we might steal
a shared interrupt from someone else. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25822 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -103,6 +103,7 @@ EHCI::EHCI(pci_info *info, Stack *stack)
|
|||||||
fRegisterArea(-1),
|
fRegisterArea(-1),
|
||||||
fPCIInfo(info),
|
fPCIInfo(info),
|
||||||
fStack(stack),
|
fStack(stack),
|
||||||
|
fEnabledInterrupts(0),
|
||||||
fPeriodicFrameListArea(-1),
|
fPeriodicFrameListArea(-1),
|
||||||
fPeriodicFrameList(NULL),
|
fPeriodicFrameList(NULL),
|
||||||
fInterruptEntries(NULL),
|
fInterruptEntries(NULL),
|
||||||
@@ -243,8 +244,9 @@ EHCI::EHCI(pci_info *info, Stack *stack)
|
|||||||
// install the interrupt handler and enable interrupts
|
// install the interrupt handler and enable interrupts
|
||||||
install_io_interrupt_handler(fPCIInfo->u.h0.interrupt_line,
|
install_io_interrupt_handler(fPCIInfo->u.h0.interrupt_line,
|
||||||
InterruptHandler, (void *)this, 0);
|
InterruptHandler, (void *)this, 0);
|
||||||
WriteOpReg(EHCI_USBINTR, EHCI_USBINTR_HOSTSYSERR
|
fEnabledInterrupts = EHCI_USBINTR_HOSTSYSERR | EHCI_USBINTR_USBERRINT
|
||||||
| EHCI_USBINTR_USBERRINT | EHCI_USBINTR_USBINT | EHCI_USBINTR_INTONAA);
|
| EHCI_USBINTR_USBINT | EHCI_USBINTR_INTONAA;
|
||||||
|
WriteOpReg(EHCI_USBINTR, fEnabledInterrupts);
|
||||||
|
|
||||||
// allocate the periodic frame list
|
// allocate the periodic frame list
|
||||||
fPeriodicFrameListArea = fStack->AllocateArea((void **)&fPeriodicFrameList,
|
fPeriodicFrameListArea = fStack->AllocateArea((void **)&fPeriodicFrameList,
|
||||||
@@ -787,7 +789,7 @@ EHCI::Interrupt()
|
|||||||
|
|
||||||
// check if any interrupt was generated
|
// check if any interrupt was generated
|
||||||
uint32 status = ReadOpReg(EHCI_USBSTS);
|
uint32 status = ReadOpReg(EHCI_USBSTS);
|
||||||
if ((status & EHCI_USBSTS_INTMASK) == 0) {
|
if ((status & fEnabledInterrupts) == 0) {
|
||||||
release_spinlock(&lock);
|
release_spinlock(&lock);
|
||||||
return B_UNHANDLED_INTERRUPT;
|
return B_UNHANDLED_INTERRUPT;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -134,6 +134,7 @@ static pci_module_info *sPCIModule;
|
|||||||
area_id fRegisterArea;
|
area_id fRegisterArea;
|
||||||
pci_info *fPCIInfo;
|
pci_info *fPCIInfo;
|
||||||
Stack *fStack;
|
Stack *fStack;
|
||||||
|
uint32 fEnabledInterrupts;
|
||||||
|
|
||||||
// Periodic transfer framelist and interrupt entries
|
// Periodic transfer framelist and interrupt entries
|
||||||
area_id fPeriodicFrameListArea;
|
area_id fPeriodicFrameListArea;
|
||||||
|
|||||||
@@ -56,7 +56,6 @@
|
|||||||
#define EHCI_USBSTS_PORTCHANGE (1 << 2) // Port Change Detected
|
#define EHCI_USBSTS_PORTCHANGE (1 << 2) // Port Change Detected
|
||||||
#define EHCI_USBSTS_USBERRINT (1 << 1) // USB Error Interrupt
|
#define EHCI_USBSTS_USBERRINT (1 << 1) // USB Error Interrupt
|
||||||
#define EHCI_USBSTS_USBINT (1 << 0) // USB Interrupt
|
#define EHCI_USBSTS_USBINT (1 << 0) // USB Interrupt
|
||||||
#define EHCI_USBSTS_INTMASK 0x37 // All except frame list rollover
|
|
||||||
|
|
||||||
|
|
||||||
// USB Interrupt Enable Register (EHCI Spec 2.3.3)
|
// USB Interrupt Enable Register (EHCI Spec 2.3.3)
|
||||||
|
|||||||
Reference in New Issue
Block a user