150 lines
3.2 KiB
C
150 lines
3.2 KiB
C
/*++
|
||
|
||
Module Name:
|
||
|
||
purge.c
|
||
|
||
Environment:
|
||
|
||
Kernel mode
|
||
|
||
Revision History :
|
||
|
||
--*/
|
||
|
||
#include "precomp.h"
|
||
|
||
NTSTATUS
|
||
MoxaStartPurge(
|
||
IN PMOXA_DEVICE_EXTENSION Extension
|
||
)
|
||
{
|
||
|
||
PIRP newIrp;
|
||
|
||
|
||
|
||
do {
|
||
|
||
ULONG mask;
|
||
|
||
mask = *((ULONG *)
|
||
(Extension->CurrentPurgeIrp->AssociatedIrp.SystemBuffer));
|
||
|
||
if (mask & SERIAL_PURGE_TXABORT) {
|
||
|
||
KIRQL oldIrql;
|
||
|
||
MoxaKillAllReadsOrWrites(
|
||
Extension->DeviceObject,
|
||
&Extension->WriteQueue,
|
||
&Extension->CurrentWriteIrp
|
||
);
|
||
|
||
//
|
||
// Clean out the Tx queue
|
||
//
|
||
KeAcquireSpinLock(
|
||
&Extension->ControlLock,
|
||
&oldIrql
|
||
);
|
||
|
||
Extension->TotalCharsQueued = 0;
|
||
|
||
MoxaFunc( // flush output queue
|
||
Extension->PortOfs,
|
||
FC_FlushQueue,
|
||
1
|
||
);
|
||
|
||
KeReleaseSpinLock(
|
||
&Extension->ControlLock,
|
||
oldIrql
|
||
);
|
||
}
|
||
|
||
if (mask & SERIAL_PURGE_RXABORT) {
|
||
|
||
MoxaKillAllReadsOrWrites(
|
||
Extension->DeviceObject,
|
||
&Extension->ReadQueue,
|
||
&Extension->CurrentReadIrp
|
||
);
|
||
}
|
||
|
||
if (mask & SERIAL_PURGE_TXCLEAR) {
|
||
|
||
KIRQL oldIrql;
|
||
|
||
//
|
||
// Clean out the Tx queue
|
||
//
|
||
|
||
KeAcquireSpinLock(
|
||
&Extension->ControlLock,
|
||
&oldIrql
|
||
);
|
||
|
||
|
||
MoxaFunc( // flush output queue
|
||
Extension->PortOfs,
|
||
FC_FlushQueue,
|
||
1
|
||
);
|
||
|
||
KeReleaseSpinLock(
|
||
&Extension->ControlLock,
|
||
oldIrql
|
||
);
|
||
|
||
}
|
||
|
||
if (mask & SERIAL_PURGE_RXCLEAR) {
|
||
|
||
KIRQL oldIrql;
|
||
|
||
//
|
||
// Clean out the Rx queue
|
||
//
|
||
// Note that we do this under protection of the
|
||
// the drivers control lock so that we don't hose
|
||
// the pointers if there is currently a read that
|
||
// is reading out of the buffer.
|
||
//
|
||
|
||
KeAcquireSpinLock(
|
||
&Extension->ControlLock,
|
||
&oldIrql
|
||
);
|
||
|
||
|
||
MoxaFunc( // flush input queue
|
||
Extension->PortOfs,
|
||
FC_FlushQueue,
|
||
0
|
||
);
|
||
|
||
KeReleaseSpinLock(
|
||
&Extension->ControlLock,
|
||
oldIrql
|
||
);
|
||
|
||
}
|
||
|
||
Extension->CurrentPurgeIrp->IoStatus.Status = STATUS_SUCCESS;
|
||
Extension->CurrentPurgeIrp->IoStatus.Information = 0;
|
||
|
||
MoxaGetNextIrp(
|
||
&Extension->CurrentPurgeIrp,
|
||
&Extension->PurgeQueue,
|
||
&newIrp,
|
||
TRUE,
|
||
Extension
|
||
);
|
||
|
||
} while (newIrp);
|
||
|
||
return STATUS_SUCCESS;
|
||
|
||
}
|
||
|