- 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);
- }
-
- return again;
+ 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)
+{
+ dmaCommand->reserved->fStatus = status;
+ dmaCommand->reserved->fActualByteCount = actualByteCount;
+ dmaCommand->reserved->fTimeStamp = timeStamp;
+
+ if (dmaNotificationAction != NULL) {
+ (*dmaNotificationAction)(owner, this, dmaCommand, status, actualByteCount, timeStamp);
+ }