+bool
+IODMAEventSource::checkForWork(void)
+{
+ IODMACommand *dmaCommand = NULL;
+ bool work, again;
+
+ IOSimpleLockLock(dmaCommandsCompletedLock);
+ work = !queue_empty(&dmaCommandsCompleted);
+ if (work) {
+ queue_remove_first(&dmaCommandsCompleted, dmaCommand, IODMACommand *, fCommandChain);
+ again = !queue_empty(&dmaCommandsCompleted);
+ } else {
+ again = false;
+ }
+ IOSimpleLockUnlock(dmaCommandsCompletedLock);
+
+ if (work) {
+ (*dmaCompletionAction)(owner, this, dmaCommand, dmaCommand->reserved->fStatus, dmaCommand->reserved->fActualByteCount, dmaCommand->reserved->fTimeStamp);
+ }
+
+ return again;
+}
+
+void
+IODMAEventSource::completeDMACommand(IODMACommand *dmaCommand)
+{
+ if (dmaCompletionAction != NULL) {
+ IOSimpleLockLock(dmaCommandsCompletedLock);
+ queue_enter(&dmaCommandsCompleted, dmaCommand, IODMACommand *, fCommandChain);
+ IOSimpleLockUnlock(dmaCommandsCompletedLock);
+
+ signalWorkAvailable();
+ } else {
+ dmaSynchBusy = false;
+ wakeupGate(&dmaSynchBusy, true);
+ }
+}
+
+void
+IODMAEventSource::notifyDMACommand(IODMACommand *dmaCommand, IOReturn status, IOByteCount actualByteCount, AbsoluteTime timeStamp)