You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
3.2 KiB
150 lines
3.2 KiB
/*++
|
|
|
|
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;
|
|
|
|
}
|
|
|