* Turns out the 3com driver wasn't picked up after my changes, but the marvell_yukon driver
worked flawlessly this one time... (I got almost 10 MB/s with that one, now 7.5 MB/s with the 3com driver) * We need to acknowledge the interrupt in the handler, because else, the interrupt continues to fire after the PIC interrupt is acknowledged by the kernel. * It also helps a lot to turn off the interrupts on the device while xl_intr() is handling the interrupt. * When the slow handler is running, we now set the new "handling" field in the internal interrupt handler which will not invoke the scheduler then (but only signals a handled interrupt). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23085 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -49,6 +49,7 @@ struct internal_intr {
|
||||
|
||||
thread_id thread;
|
||||
sem_id sem;
|
||||
int32 handling;
|
||||
};
|
||||
|
||||
|
||||
@@ -235,7 +236,7 @@ intr_wrapper(void *data)
|
||||
return B_UNHANDLED_INTERRUPT;
|
||||
|
||||
release_sem_etc(intr->sem, 1, B_DO_NOT_RESCHEDULE);
|
||||
return B_INVOKE_SCHEDULER;
|
||||
return intr->handling ? B_HANDLED_INTERRUPT : B_INVOKE_SCHEDULER;
|
||||
}
|
||||
|
||||
|
||||
@@ -264,7 +265,9 @@ intr_handler(void *data)
|
||||
|
||||
//device_printf(intr->dev, "in soft interrupt handler.\n");
|
||||
|
||||
atomic_or(&intr->handling, 1);
|
||||
intr->handler(intr->arg);
|
||||
atomic_and(&intr->handling, 0);
|
||||
HAIKU_REENABLE_INTERRUPTS(intr->dev);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user