Update of /cvsroot/com0com/com0com/sys
In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv30702
Modified Files:
adddev.c bufutils.c com0com.h delay.c delay.h fileinfo.c
handflow.c handflow.h io.c ioctl.c openclos.c read.c
startirp.c timeout.c timeout.h write.c
Log Message:
Fixed possible BSOD after one port of pair removal
Index: fileinfo.c
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/fileinfo.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** fileinfo.c 28 Sep 2005 10:06:42 -0000 1.1
--- fileinfo.c 21 Jun 2006 16:23:57 -0000 1.2
***************
*** 2,6 ****
* $Id$
*
! * Copyright (c) 2005 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
--- 2,6 ----
* $Id$
*
! * Copyright (c) 2005-2006 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
***************
*** 20,23 ****
--- 20,26 ----
*
* $Log$
+ * Revision 1.2 2006/06/21 16:23:57 vfrolov
+ * Fixed possible BSOD after one port of pair removal
+ *
* Revision 1.1 2005/09/28 10:06:42 vfrolov
* Implemented IRP_MJ_QUERY_INFORMATION and IRP_MJ_SET_INFORMATION
***************
*** 33,41 ****
#define FILE_ID 0xA
! NTSTATUS FdoPortQueryInformation(PC0C_FDOPORT_EXTENSION pDevExt, IN PIRP pIrp)
{
NTSTATUS status;
! if ((pDevExt->handFlow.ControlHandShake & SERIAL_ERROR_ABORT) && pDevExt->pIoPortLocal->errors) {
pIrp->IoStatus.Information = 0;
status = STATUS_CANCELLED;
--- 36,44 ----
#define FILE_ID 0xA
! NTSTATUS FdoPortQueryInformation(PC0C_IO_PORT pIoPortLocal, IN PIRP pIrp)
{
NTSTATUS status;
! if ((pIoPortLocal->handFlow.ControlHandShake & SERIAL_ERROR_ABORT) && pIoPortLocal->errors) {
pIrp->IoStatus.Information = 0;
status = STATUS_CANCELLED;
***************
*** 70,78 ****
}
! NTSTATUS FdoPortSetInformation(PC0C_FDOPORT_EXTENSION pDevExt, IN PIRP pIrp)
{
NTSTATUS status;
! if ((pDevExt->handFlow.ControlHandShake & SERIAL_ERROR_ABORT) && pDevExt->pIoPortLocal->errors) {
status = STATUS_CANCELLED;
} else {
--- 73,81 ----
}
! NTSTATUS FdoPortSetInformation(PC0C_IO_PORT pIoPortLocal, IN PIRP pIrp)
{
NTSTATUS status;
! if ((pIoPortLocal->handFlow.ControlHandShake & SERIAL_ERROR_ABORT) && pIoPortLocal->errors) {
status = STATUS_CANCELLED;
} else {
***************
*** 109,115 ****
case C0C_DOTYPE_FP:
if (code == IRP_MJ_QUERY_INFORMATION)
! status = FdoPortQueryInformation((PC0C_FDOPORT_EXTENSION)pDevExt, pIrp);
else
! status = FdoPortSetInformation((PC0C_FDOPORT_EXTENSION)pDevExt, pIrp);
break;
default:
--- 112,118 ----
case C0C_DOTYPE_FP:
if (code == IRP_MJ_QUERY_INFORMATION)
! status = FdoPortQueryInformation(((PC0C_FDOPORT_EXTENSION)pDevExt)->pIoPortLocal, pIrp);
else
! status = FdoPortSetInformation(((PC0C_FDOPORT_EXTENSION)pDevExt)->pIoPortLocal, pIrp);
break;
default:
Index: openclos.c
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/openclos.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -C2 -d -r1.13 -r1.14
*** openclos.c 8 Jun 2006 11:33:35 -0000 1.13
--- openclos.c 21 Jun 2006 16:23:57 -0000 1.14
***************
*** 20,23 ****
--- 20,26 ----
*
* $Log$
+ * Revision 1.14 2006/06/21 16:23:57 vfrolov
+ * Fixed possible BSOD after one port of pair removal
+ *
* Revision 1.13 2006/06/08 11:33:35 vfrolov
* Fixed bugs with amountInWriteQueue
***************
*** 81,89 ****
}
- if (!pDevExt->pIoPortRemote->pDevExt) {
- InterlockedDecrement(&pDevExt->openCount);
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
switch (MmQuerySystemSize()) {
case MmLargeSystem:
--- 84,87 ----
***************
*** 136,143 ****
pDevExt->pIoPortLocal->escapeChar = 0;
RtlZeroMemory(&pDevExt->pIoPortLocal->perfStats, sizeof(pDevExt->pIoPortLocal->perfStats));
! pDevExt->handFlow.XoffLimit = size >> 3;
! pDevExt->handFlow.XonLimit = size >> 1;
! SetHandFlow(pDevExt, NULL, &queueToComplete);
KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
--- 134,141 ----
pDevExt->pIoPortLocal->escapeChar = 0;
RtlZeroMemory(&pDevExt->pIoPortLocal->perfStats, sizeof(pDevExt->pIoPortLocal->perfStats));
! pDevExt->pIoPortLocal->handFlow.XoffLimit = size >> 3;
! pDevExt->pIoPortLocal->handFlow.XonLimit = size >> 1;
! SetHandFlow(pDevExt->pIoPortLocal, NULL, &queueToComplete);
KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
***************
*** 159,163 ****
pDevExt->pIoPortLocal->writeHoldingRemote = 0;
pDevExt->pIoPortLocal->sendXonXoff = 0;
! SetModemStatus(pDevExt->pIoPortRemote, 0, C0C_MSB_CTS | C0C_MSB_DSR, &queueToComplete);
FreeBuffer(&pDevExt->pIoPortLocal->readBuf);
SetBreakHolding(pDevExt->pIoPortLocal, FALSE);
--- 157,161 ----
pDevExt->pIoPortLocal->writeHoldingRemote = 0;
pDevExt->pIoPortLocal->sendXonXoff = 0;
! SetModemStatus(pDevExt->pIoPortLocal->pIoPortRemote, 0, C0C_MSB_CTS | C0C_MSB_DSR, &queueToComplete);
FreeBuffer(&pDevExt->pIoPortLocal->readBuf);
SetBreakHolding(pDevExt->pIoPortLocal, FALSE);
Index: ioctl.c
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/ioctl.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -C2 -d -r1.22 -r1.23
*** ioctl.c 19 May 2006 15:02:03 -0000 1.22
--- ioctl.c 21 Jun 2006 16:23:57 -0000 1.23
***************
*** 20,23 ****
--- 20,26 ----
*
* $Log$
+ * Revision 1.23 2006/06/21 16:23:57 vfrolov
+ * Fixed possible BSOD after one port of pair removal
+ *
* Revision 1.22 2006/05/19 15:02:03 vfrolov
* Implemented IOCTL_SERIAL_GET_MODEM_CONTROL
***************
*** 106,114 ****
ULONG code = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
KIRQL oldIrql;
pIrp->IoStatus.Information = 0;
! if ((pDevExt->handFlow.ControlHandShake & SERIAL_ERROR_ABORT) &&
! pDevExt->pIoPortLocal->errors && code != IOCTL_SERIAL_GET_COMMSTATUS)
{
status = STATUS_CANCELLED;
--- 109,119 ----
ULONG code = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
KIRQL oldIrql;
+ PC0C_IO_PORT pIoPortLocal;
pIrp->IoStatus.Information = 0;
+ pIoPortLocal = pDevExt->pIoPortLocal;
! if ((pIoPortLocal->handFlow.ControlHandShake & SERIAL_ERROR_ABORT) &&
! pIoPortLocal->errors && code != IOCTL_SERIAL_GET_COMMSTATUS)
{
status = STATUS_CANCELLED;
***************
*** 120,124 ****
case IOCTL_SERIAL_CLR_RTS:
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! switch (pDevExt->handFlow.FlowReplace & SERIAL_RTS_MASK) {
case SERIAL_RTS_HANDSHAKE:
case SERIAL_TRANSMIT_TOGGLE:
--- 125,129 ----
case IOCTL_SERIAL_CLR_RTS:
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! switch (pIoPortLocal->handFlow.FlowReplace & SERIAL_RTS_MASK) {
case SERIAL_RTS_HANDSHAKE:
case SERIAL_TRANSMIT_TOGGLE:
***************
*** 132,144 ****
SetModemStatus(
! pDevExt->pIoPortRemote,
code == IOCTL_SERIAL_SET_RTS ? C0C_MSB_CTS : 0,
C0C_MSB_CTS,
&queueToComplete);
! if (pDevExt->pIoPortRemote->tryWrite) {
ReadWrite(
! pDevExt->pIoPortLocal, FALSE,
! pDevExt->pIoPortRemote, FALSE,
&queueToComplete);
}
--- 137,149 ----
SetModemStatus(
! pIoPortLocal->pIoPortRemote,
code == IOCTL_SERIAL_SET_RTS ? C0C_MSB_CTS : 0,
C0C_MSB_CTS,
&queueToComplete);
! if (pIoPortLocal->pIoPortRemote->tryWrite) {
ReadWrite(
! pIoPortLocal, FALSE,
! pIoPortLocal->pIoPortRemote, FALSE,
&queueToComplete);
}
***************
*** 152,156 ****
case IOCTL_SERIAL_CLR_DTR:
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! switch (pDevExt->handFlow.ControlHandShake & SERIAL_DTR_MASK) {
case SERIAL_DTR_HANDSHAKE:
KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
--- 157,161 ----
case IOCTL_SERIAL_CLR_DTR:
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! switch (pIoPortLocal->handFlow.ControlHandShake & SERIAL_DTR_MASK) {
case SERIAL_DTR_HANDSHAKE:
KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
***************
*** 163,175 ****
SetModemStatus(
! pDevExt->pIoPortRemote,
code == IOCTL_SERIAL_SET_DTR ? C0C_MSB_DSR : 0,
C0C_MSB_DSR,
&queueToComplete);
! if (pDevExt->pIoPortRemote->tryWrite) {
ReadWrite(
! pDevExt->pIoPortLocal, FALSE,
! pDevExt->pIoPortRemote, FALSE,
&queueToComplete);
}
--- 168,180 ----
SetModemStatus(
! pIoPortLocal->pIoPortRemote,
code == IOCTL_SERIAL_SET_DTR ? C0C_MSB_DSR : 0,
C0C_MSB_DSR,
&queueToComplete);
! if (pIoPortLocal->pIoPortRemote->tryWrite) {
ReadWrite(
! pIoPortLocal, FALSE,
! pIoPortLocal->pIoPortRemote, FALSE,
&queueToComplete);
}
***************
*** 190,194 ****
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! modemStatusRemote = pDevExt->pIoPortRemote->modemStatus;
KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
--- 195,199 ----
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! modemStatusRemote = pIoPortLocal->pIoPortRemote->modemStatus;
KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
***************
*** 211,220 ****
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! SetXonXoffHolding(pDevExt->pIoPortLocal, C0C_XCHAR_ON);
! if (pDevExt->pIoPortLocal->tryWrite) {
ReadWrite(
! pDevExt->pIoPortLocal, FALSE,
! pDevExt->pIoPortRemote, FALSE,
&queueToComplete);
}
--- 216,225 ----
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! SetXonXoffHolding(pIoPortLocal, C0C_XCHAR_ON);
! if (pIoPortLocal->tryWrite) {
ReadWrite(
! pIoPortLocal, FALSE,
! pIoPortLocal->pIoPortRemote, FALSE,
&queueToComplete);
}
***************
*** 225,229 ****
case IOCTL_SERIAL_SET_XOFF:
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! SetXonXoffHolding(pDevExt->pIoPortLocal, C0C_XCHAR_OFF);
KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
break;
--- 230,234 ----
case IOCTL_SERIAL_SET_XOFF:
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! SetXonXoffHolding(pIoPortLocal, C0C_XCHAR_OFF);
KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
break;
***************
*** 235,244 ****
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! SetBreakHolding(pDevExt->pIoPortLocal, TRUE);
! UpdateTransmitToggle(pDevExt, &queueToComplete);
ReadWrite(
! pDevExt->pIoPortLocal, FALSE,
! pDevExt->pIoPortRemote, FALSE,
&queueToComplete);
--- 240,249 ----
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! SetBreakHolding(pIoPortLocal, TRUE);
! UpdateTransmitToggle(pIoPortLocal, &queueToComplete);
ReadWrite(
! pIoPortLocal, FALSE,
! pIoPortLocal->pIoPortRemote, FALSE,
&queueToComplete);
***************
*** 254,264 ****
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! SetBreakHolding(pDevExt->pIoPortLocal, FALSE);
! UpdateTransmitToggle(pDevExt, &queueToComplete);
! if (pDevExt->pIoPortLocal->tryWrite || pDevExt->pIoPortRemote->tryWrite) {
ReadWrite(
! pDevExt->pIoPortLocal, FALSE,
! pDevExt->pIoPortRemote, FALSE,
&queueToComplete);
}
--- 259,269 ----
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! SetBreakHolding(pIoPortLocal, FALSE);
! UpdateTransmitToggle(pIoPortLocal, &queueToComplete);
! if (pIoPortLocal->tryWrite || pIoPortLocal->pIoPortRemote->tryWrite) {
ReadWrite(
! pIoPortLocal, FALSE,
! pIoPortLocal->pIoPortRemote, FALSE,
&queueToComplete);
}
***************
*** 274,278 ****
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! *(PULONG)pIrp->AssociatedIrp.SystemBuffer = pDevExt->pIoPortLocal->modemStatus;
KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
pIrp->IoStatus.Information = sizeof(ULONG);
--- 279,283 ----
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! *(PULONG)pIrp->AssociatedIrp.SystemBuffer = pIoPortLocal->modemStatus;
KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
pIrp->IoStatus.Information = sizeof(ULONG);
***************
*** 317,332 ****
if (*pSysBuf & SERIAL_PURGE_RXABORT)
! CancelQueue(&pDevExt->pIoPortLocal->irpQueues[C0C_QUEUE_READ], &queueToComplete);
if (*pSysBuf & SERIAL_PURGE_TXABORT)
! CancelQueue(&pDevExt->pIoPortLocal->irpQueues[C0C_QUEUE_WRITE], &queueToComplete);
if (*pSysBuf & SERIAL_PURGE_RXCLEAR) {
! PurgeBuffer(&pDevExt->pIoPortLocal->readBuf);
! UpdateHandFlow(pDevExt, TRUE, &queueToComplete);
! if (pDevExt->pIoPortLocal->tryWrite || pDevExt->pIoPortRemote->tryWrite) {
ReadWrite(
! pDevExt->pIoPortLocal, FALSE,
! pDevExt->pIoPortRemote, FALSE,
&queueToComplete);
}
--- 322,337 ----
if (*pSysBuf & SERIAL_PURGE_RXABORT)
! CancelQueue(&pIoPortLocal->irpQueues[C0C_QUEUE_READ], &queueToComplete);
if (*pSysBuf & SERIAL_PURGE_TXABORT)
! CancelQueue(&pIoPortLocal->irpQueues[C0C_QUEUE_WRITE], &queueToComplete);
if (*pSysBuf & SERIAL_PURGE_RXCLEAR) {
! PurgeBuffer(&pIoPortLocal->readBuf);
! UpdateHandFlow(pIoPortLocal, TRUE, &queueToComplete);
! if (pIoPortLocal->tryWrite || pIoPortLocal->pIoPortRemote->tryWrite) {
ReadWrite(
! pIoPortLocal, FALSE,
! pIoPortLocal->pIoPortRemote, FALSE,
&queueToComplete);
}
***************
*** 341,345 ****
case IOCTL_SERIAL_GET_COMMSTATUS: {
PSERIAL_STATUS pSysBuf;
- PC0C_IO_PORT pIoPort;
PIRP pIrpWrite;
--- 346,349 ----
***************
*** 351,361 ****
pSysBuf = (PSERIAL_STATUS)pIrp->AssociatedIrp.SystemBuffer;
RtlZeroMemory(pSysBuf, sizeof(*pSysBuf));
- pIoPort = pDevExt->pIoPortLocal;
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! pSysBuf->AmountInInQueue = (ULONG)C0C_BUFFER_BUSY(&pIoPort->readBuf);
! pIrpWrite = pIoPort->irpQueues[C0C_QUEUE_WRITE].pCurrent;
if (pIrpWrite) {
--- 355,364 ----
pSysBuf = (PSERIAL_STATUS)pIrp->AssociatedIrp.SystemBuffer;
RtlZeroMemory(pSysBuf, sizeof(*pSysBuf));
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! pSysBuf->AmountInInQueue = (ULONG)C0C_BUFFER_BUSY(&pIoPortLocal->readBuf);
! pIrpWrite = pIoPortLocal->irpQueues[C0C_QUEUE_WRITE].pCurrent;
if (pIrpWrite) {
***************
*** 369,386 ****
}
! pSysBuf->AmountInOutQueue = pIoPort->amountInWriteQueue;
! pSysBuf->HoldReasons = pIoPort->writeHolding;
! if ((pIoPort->pDevExt->handFlow.ControlHandShake & SERIAL_DSR_SENSITIVITY) &&
! (pIoPort->modemStatus & C0C_MSB_DSR) == 0)
{
pSysBuf->HoldReasons |= SERIAL_RX_WAITING_FOR_DSR;
}
! if (pIoPort->writeHoldingRemote & SERIAL_TX_WAITING_FOR_XON)
pSysBuf->HoldReasons |= SERIAL_TX_WAITING_XOFF_SENT;
! pSysBuf->Errors = pIoPort->errors;
! pIoPort->errors = 0;
KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
--- 372,389 ----
}
! pSysBuf->AmountInOutQueue = pIoPortLocal->amountInWriteQueue;
! pSysBuf->HoldReasons = pIoPortLocal->writeHolding;
! if ((pIoPortLocal->handFlow.ControlHandShake & SERIAL_DSR_SENSITIVITY) &&
! (pIoPortLocal->modemStatus & C0C_MSB_DSR) == 0)
{
pSysBuf->HoldReasons |= SERIAL_RX_WAITING_FOR_DSR;
}
! if (pIoPortLocal->writeHoldingRemote & SERIAL_TX_WAITING_FOR_XON)
pSysBuf->HoldReasons |= SERIAL_TX_WAITING_XOFF_SENT;
! pSysBuf->Errors = pIoPortLocal->errors;
! pIoPortLocal->errors = 0;
KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
***************
*** 416,420 ****
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! status = SetHandFlow(pDevExt, pSysBuf, &queueToComplete);
KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
--- 419,423 ----
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! status = SetHandFlow(pIoPortLocal, pSysBuf, &queueToComplete);
KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
***************
*** 429,433 ****
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! *(PSERIAL_HANDFLOW)pIrp->AssociatedIrp.SystemBuffer = pDevExt->handFlow;
KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
pIrp->IoStatus.Information = sizeof(SERIAL_HANDFLOW);
--- 432,436 ----
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! *(PSERIAL_HANDFLOW)pIrp->AssociatedIrp.SystemBuffer = pIoPortLocal->handFlow;
KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
pIrp->IoStatus.Information = sizeof(SERIAL_HANDFLOW);
***************
*** 454,460 ****
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! if (pDevExt->pIoPortLocal->escapeChar &&
! ((pDevExt->pIoPortLocal->escapeChar == pSysBuf->XoffChar) ||
! (pDevExt->pIoPortLocal->escapeChar == pSysBuf->XonChar)))
{
status = STATUS_INVALID_PARAMETER;
--- 457,463 ----
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! if (pIoPortLocal->escapeChar &&
! ((pIoPortLocal->escapeChar == pSysBuf->XoffChar) ||
! (pIoPortLocal->escapeChar == pSysBuf->XonChar)))
{
status = STATUS_INVALID_PARAMETER;
***************
*** 462,466 ****
if (status == STATUS_SUCCESS)
! pDevExt->specialChars = *pSysBuf;
KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
--- 465,469 ----
if (status == STATUS_SUCCESS)
! pIoPortLocal->specialChars = *pSysBuf;
KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
***************
*** 474,478 ****
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! *(PSERIAL_CHARS)pIrp->AssociatedIrp.SystemBuffer = pDevExt->specialChars;
KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
--- 477,481 ----
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! *(PSERIAL_CHARS)pIrp->AssociatedIrp.SystemBuffer = pIoPortLocal->specialChars;
KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
***************
*** 493,499 ****
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! if (escapeChar && ((escapeChar == pDevExt->specialChars.XoffChar) ||
! (escapeChar == pDevExt->specialChars.XonChar) ||
! (pDevExt->handFlow.FlowReplace & SERIAL_ERROR_CHAR)))
{
status = STATUS_INVALID_PARAMETER;
--- 496,502 ----
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
! if (escapeChar && ((escapeChar == pIoPortLocal->specialChars.XoffChar) ||
! (escapeChar == pIoPortLocal->specialChars.XonChar) ||
! (pIoPortLocal->handFlow.FlowReplace & SERIAL_ERROR_CHAR)))
{
status = STATUS_INVALID_PARAMETER;
***************
*** 501,505 ****
if (status == STATUS_SUCCESS) {
! pDevExt->pIoPortLocal->escapeChar = escapeChar;
pIrp->IoStatus.Information = sizeof(UCHAR);
}
--- 504,508 ----
if (status == STATUS_SUCCESS) {
! pIoPortLocal->escapeChar = escapeChar;
pIrp->IoStatus.Information = sizeof(UCHAR);
}
***************
*** 637,641 ****
pSysBuf->CurrentTxQueue = 0;
! pSysBuf->CurrentRxQueue = (ULONG)C0C_BUFFER_SIZE(&pDevExt->pIoPortLocal->readBuf);
pIrp->IoStatus.Information = sizeof(SERIAL_COMMPROP);
--- 640,644 ----
pSysBuf->CurrentTxQueue = 0;
! pSysBuf->CurrentRxQueue = (ULONG)C0C_BUFFER_SIZE(&pIoPortLocal->readBuf);
pIrp->IoStatus.Information = sizeof(SERIAL_COMMPROP);
***************
*** 661,665 ****
}
! pReadBuf = &pDevExt->pIoPortLocal->readBuf;
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
--- 664,668 ----
}
! pReadBuf = &pIoPortLocal->readBuf;
KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
***************
*** 684,695 ****
if (SetNewBufferBase(pReadBuf, pBase, pSysBuf->InSize)) {
! pDevExt->handFlow.XoffLimit = pSysBuf->InSize >> 3;
! pDevExt->handFlow.XonLimit = pSysBuf->InSize >> 1;
! SetLimit(pDevExt);
! UpdateHandFlow(pDevExt, TRUE, &queueToComplete);
! if (pDevExt->pIoPortLocal->tryWrite || pDevExt->pIoPortRemote->tryWrite) {
ReadWrite(
! pDevExt->pIoPortLocal, FALSE,
! pDevExt->pIoPortRemote, FALSE,
&queueToComplete);
}
--- 687,698 ----
if (SetNewBufferBase(pReadBuf, pBase, pSysBuf->InSize)) {
! pIoPortLocal->handFlow.XoffLimit = pSysBuf->InSize >> 3;
! pIoPortLocal->handFlow.XonLimit = pSysBuf->InSize >> 1;
! SetLimit(pIoPortLocal);
! UpdateHandFlow(pIoPortLocal, TRUE, &queueToComplete);
! if (pIoPortLocal->tryWrite || pIoPortLocal->pIoPortRemote->tryWrite) {
ReadWrite(
! pIoPortLocal, FALSE,
! pIoPortLocal->pIoPortRemote, FALSE,
&queueToComplete);
}
***************
*** 707,711 ****
KeAcquireSpinLock(&pDevExt->controlLock, &oldIrql);
! *(PSERIALPERF_STATS)pIrp->AssociatedIrp.SystemBuffer = pDevExt->pIoPortLocal->perfStats;
KeReleaseSpinLock(&pDevExt->controlLock, oldIrql);
pIrp->IoStatus.Information = sizeof(SERIALPERF_STATS);
--- 710,714 ----
KeAcquireSpinLock(&pDevExt->controlLock, &oldIrql);
! *(PSERIALPERF_STATS)pIrp->AssociatedIrp.SystemBuffer = pIoPortLocal->perfStats;
KeReleaseSpinLock(&pDevExt->controlLock, oldIrql);
pIrp->IoStatus.Information = sizeof(SERIALPERF_STATS);
***************
*** 715,719 ****
case IOCTL_SERIAL_CLEAR_STATS:
KeAcquireSpinLock(&pDevExt->controlLock, &oldIrql);
! RtlZeroMemory(&pDevExt->pIoPortLocal->perfStats, sizeof(pDevExt->pIoPortLocal->perfStats));
KeReleaseSpinLock(&pDevExt->controlLock, oldIrql);
break;
--- 718,722 ----
case IOCTL_SERIAL_CLEAR_STATS:
KeAcquireSpinLock(&pDevExt->controlLock, &oldIrql);
! RtlZeroMemory(&pIoPortLocal->perfStats, sizeof(pIoPortLocal->perfStats));
KeReleaseSpinLock(&pDevExt->controlLock, oldIrql);
break;
Index: com0com.h
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/com0com.h,v
retrieving revision 1.25
retrieving revision 1.26
diff -C2 -d -r1.25 -r1.26
*** com0com.h 5 Apr 2006 07:22:15 -0000 1.25
--- com0com.h 21 Jun 2006 16:23:57 -0000 1.26
***************
*** 20,23 ****
--- 20,26 ----
*
* $Log$
+ * Revision 1.26 2006/06/21 16:23:57 vfrolov
+ * Fixed possible BSOD after one port of pair removal
+ *
* Revision 1.25 2006/04/05 07:22:15 vfrolov
* Replaced flipXoffLimit flag by writeHoldingRemote to correct handFlow changing
***************
*** 180,183 ****
--- 183,189 ----
struct _C0C_FDOPORT_EXTENSION *pDevExt;
+ struct _C0C_IO_PORT *pIoPortRemote;
+ PKSPIN_LOCK pIoLock;
+
#define C0C_QUEUE_READ 0
#define C0C_QUEUE_WRITE 1
***************
*** 200,203 ****
--- 206,212 ----
struct _C0C_ADAPTIVE_DELAY *pWriteDelay;
+ SERIAL_HANDFLOW handFlow;
+ SERIAL_CHARS specialChars;
+
ULONG errors;
ULONG amountInWriteQueue;
***************
*** 230,236 ****
struct _C0C_FDOBUS_EXTENSION *pBusExt;
- PKSPIN_LOCK pIoLock;
PC0C_IO_PORT pIoPortLocal;
- PC0C_IO_PORT pIoPortRemote;
} C0C_PDOPORT_EXTENSION, *PC0C_PDOPORT_EXTENSION;
--- 239,243 ----
***************
*** 240,244 ****
PKSPIN_LOCK pIoLock;
PC0C_IO_PORT pIoPortLocal;
- PC0C_IO_PORT pIoPortRemote;
UNICODE_STRING ntDeviceName;
--- 247,250 ----
***************
*** 253,259 ****
SERIAL_BAUD_RATE baudRate;
SERIAL_LINE_CONTROL lineControl;
- SERIAL_CHARS specialChars;
SERIAL_TIMEOUTS timeouts;
- SERIAL_HANDFLOW handFlow;
} C0C_FDOPORT_EXTENSION, *PC0C_FDOPORT_EXTENSION;
--- 259,263 ----
Index: startirp.c
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/startirp.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -C2 -d -r1.10 -r1.11
*** startirp.c 8 Jun 2006 11:33:35 -0000 1.10
--- startirp.c 21 Jun 2006 16:23:57 -0000 1.11
***************
*** 20,23 ****
--- 20,26 ----
*
* $Log$
+ * Revision 1.11 2006/06/21 16:23:57 vfrolov
+ * Fixed possible BSOD after one port of pair removal
+ *
* Revision 1.10 2006/06/08 11:33:35 vfrolov
* Fixed bugs with amountInWriteQueue
***************
*** 262,266 ****
if (length) {
pDevExt->pIoPortLocal->amountInWriteQueue += length;
! UpdateTransmitToggle(pDevExt, &queueToComplete);
}
}
--- 265,269 ----
if (length) {
pDevExt->pIoPortLocal->amountInWriteQueue += length;
! UpdateTransmitToggle(pDevExt->pIoPortLocal, &queueToComplete);
}
}
Index: delay.c
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/delay.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** delay.c 10 Jan 2006 10:17:23 -0000 1.2
--- delay.c 21 Jun 2006 16:23:57 -0000 1.3
***************
*** 20,23 ****
--- 20,26 ----
*
* $Log$
+ * Revision 1.3 2006/06/21 16:23:57 vfrolov
+ * Fixed possible BSOD after one port of pair removal
+ *
* Revision 1.2 2006/01/10 10:17:23 vfrolov
* Implemented flow control and handshaking
***************
*** 46,50 ****
IN PVOID systemArgument2)
{
! PC0C_FDOPORT_EXTENSION pDevExt;
PC0C_ADAPTIVE_DELAY pWriteDelay;
--- 49,53 ----
IN PVOID systemArgument2)
{
! PC0C_IO_PORT pIoPort;
PC0C_ADAPTIVE_DELAY pWriteDelay;
***************
*** 53,58 ****
UNREFERENCED_PARAMETER(systemArgument2);
! pDevExt = (PC0C_FDOPORT_EXTENSION)deferredContext;
! pWriteDelay = pDevExt->pIoPortLocal->pWriteDelay;
if (pWriteDelay) {
--- 56,61 ----
UNREFERENCED_PARAMETER(systemArgument2);
! pIoPort = (PC0C_IO_PORT)deferredContext;
! pWriteDelay = pIoPort->pWriteDelay;
if (pWriteDelay) {
***************
*** 62,66 ****
InitializeListHead(&queueToComplete);
! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql);
if (pWriteDelay->started) {
--- 65,69 ----
InitializeListHead(&queueToComplete);
! KeAcquireSpinLock(pIoPort->pIoLock, &oldIrql);
if (pWriteDelay->started) {
***************
*** 68,73 ****
status = ReadWrite(
! pDevExt->pIoPortRemote, FALSE,
! pDevExt->pIoPortLocal, FALSE,
&queueToComplete);
--- 71,76 ----
status = ReadWrite(
! pIoPort->pIoPortRemote, FALSE,
! pIoPort, FALSE,
&queueToComplete);
***************
*** 76,80 ****
}
! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql);
FdoPortCompleteQueue(&queueToComplete);
--- 79,83 ----
}
! KeReleaseSpinLock(pIoPort->pIoLock, oldIrql);
FdoPortCompleteQueue(&queueToComplete);
***************
*** 102,106 ****
}
! NTSTATUS AllocWriteDelay(IN PC0C_FDOPORT_EXTENSION pDevExt)
{
PC0C_ADAPTIVE_DELAY pWriteDelay;
--- 105,109 ----
}
! NTSTATUS AllocWriteDelay(PC0C_IO_PORT pIoPort)
{
PC0C_ADAPTIVE_DELAY pWriteDelay;
***************
*** 114,132 ****
KeInitializeTimer(&pWriteDelay->timer);
! KeInitializeDpc(&pWriteDelay->timerDpc, WriteDelayRoutine, pDevExt);
! pDevExt->pIoPortLocal->pWriteDelay = pWriteDelay;
return STATUS_SUCCESS;
}
! VOID FreeWriteDelay(IN PC0C_FDOPORT_EXTENSION pDevExt)
{
PC0C_ADAPTIVE_DELAY pWriteDelay;
! pWriteDelay = pDevExt->pIoPortLocal->pWriteDelay;
if (pWriteDelay) {
! pDevExt->pIoPortLocal->pWriteDelay = NULL;
StopWriteDelayTimer(pWriteDelay);
ExFreePool(pWriteDelay);
--- 117,135 ----
KeInitializeTimer(&pWriteDelay->timer);
! KeInitializeDpc(&pWriteDelay->timerDpc, WriteDelayRoutine, pIoPort);
! pIoPort->pWriteDelay = pWriteDelay;
return STATUS_SUCCESS;
}
! VOID FreeWriteDelay(PC0C_IO_PORT pIoPort)
{
PC0C_ADAPTIVE_DELAY pWriteDelay;
! pWriteDelay = pIoPort->pWriteDelay;
if (pWriteDelay) {
! pIoPort->pWriteDelay = NULL;
StopWriteDelayTimer(pWriteDelay);
ExFreePool(pWriteDelay);
Index: bufutils.c
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/bufutils.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** bufutils.c 17 May 2006 15:28:03 -0000 1.6
--- bufutils.c 21 Jun 2006 16:23:57 -0000 1.7
***************
*** 20,23 ****
--- 20,26 ----
*
* $Log$
+ * Revision 1.7 2006/06/21 16:23:57 vfrolov
+ * Fixed possible BSOD after one port of pair removal
+ *
* Revision 1.6 2006/05/17 15:28:03 vfrolov
* Implemented SERIAL_DSR_SENSITIVITY
***************
*** 103,107 ****
RtlZeroMemory(pFlowFilter, sizeof(*pFlowFilter));
! pHandFlow = &pIoPort->pDevExt->handFlow;
if ((pHandFlow->ControlHandShake & SERIAL_DSR_SENSITIVITY) &&
--- 106,110 ----
RtlZeroMemory(pFlowFilter, sizeof(*pFlowFilter));
! pHandFlow = &pIoPort->handFlow;
if ((pHandFlow->ControlHandShake & SERIAL_DSR_SENSITIVITY) &&
***************
*** 114,119 ****
if (pHandFlow->FlowReplace & SERIAL_AUTO_TRANSMIT) {
pFlowFilter->flags |= C0C_FLOW_FILTER_AUTO_TRANSMIT;
! pFlowFilter->xonChar = pIoPort->pDevExt->specialChars.XonChar;
! pFlowFilter->xoffChar = pIoPort->pDevExt->specialChars.XoffChar;
}
--- 117,122 ----
if (pHandFlow->FlowReplace & SERIAL_AUTO_TRANSMIT) {
pFlowFilter->flags |= C0C_FLOW_FILTER_AUTO_TRANSMIT;
! pFlowFilter->xonChar = pIoPort->specialChars.XonChar;
! pFlowFilter->xoffChar = pIoPort->specialChars.XoffChar;
}
***************
*** 126,130 ****
if (pIoPort->waitMask & SERIAL_EV_RXFLAG) {
pFlowFilter->flags |= C0C_FLOW_FILTER_EV_RXFLAG;
! pFlowFilter->eventChar = pIoPort->pDevExt->specialChars.EventChar;
}
--- 129,133 ----
if (pIoPort->waitMask & SERIAL_EV_RXFLAG) {
pFlowFilter->flags |= C0C_FLOW_FILTER_EV_RXFLAG;
! pFlowFilter->eventChar = pIoPort->specialChars.EventChar;
}
Index: adddev.c
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/adddev.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -C2 -d -r1.14 -r1.15
*** adddev.c 29 Mar 2006 09:39:28 -0000 1.14
--- adddev.c 21 Jun 2006 16:23:57 -0000 1.15
***************
*** 20,23 ****
--- 20,26 ----
*
* $Log$
+ * Revision 1.15 2006/06/21 16:23:57 vfrolov
+ * Fixed possible BSOD after one port of pair removal
+ *
* Revision 1.14 2006/03/29 09:39:28 vfrolov
* Fixed possible usage uninitialized portName
***************
*** 90,100 ****
VOID RemoveFdoPort(IN PC0C_FDOPORT_EXTENSION pDevExt)
{
! if (pDevExt->pIoPortLocal && pDevExt->pIoPortLocal->pDevExt) {
pDevExt->pIoPortLocal->pDevExt = NULL;
- FreeTimeouts(pDevExt);
}
- FreeWriteDelay(pDevExt);
-
if (pDevExt->mappedSerialDevice)
RtlDeleteRegistryValue(RTL_REGISTRY_DEVICEMAP, C0C_SERIAL_DEVICEMAP,
--- 93,102 ----
VOID RemoveFdoPort(IN PC0C_FDOPORT_EXTENSION pDevExt)
{
! if (pDevExt->pIoPortLocal) {
! FreeTimeouts(pDevExt->pIoPortLocal);
! FreeWriteDelay(pDevExt->pIoPortLocal);
pDevExt->pIoPortLocal->pDevExt = NULL;
}
if (pDevExt->mappedSerialDevice)
RtlDeleteRegistryValue(RTL_REGISTRY_DEVICEMAP, C0C_SERIAL_DEVICEMAP,
***************
*** 256,265 ****
}
- pDevExt->pIoLock = ((PC0C_PDOPORT_EXTENSION)pPhDevObj->DeviceExtension)->pIoLock;
pDevExt->pIoPortLocal = ((PC0C_PDOPORT_EXTENSION)pPhDevObj->DeviceExtension)->pIoPortLocal;
! pDevExt->pIoPortRemote = ((PC0C_PDOPORT_EXTENSION)pPhDevObj->DeviceExtension)->pIoPortRemote;
if (emuBR) {
! if (NT_SUCCESS(AllocWriteDelay(pDevExt)))
Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Enabled baudrate emulation");
else
--- 258,266 ----
}
pDevExt->pIoPortLocal = ((PC0C_PDOPORT_EXTENSION)pPhDevObj->DeviceExtension)->pIoPortLocal;
! pDevExt->pIoLock = pDevExt->pIoPortLocal->pIoLock;
if (emuBR) {
! if (NT_SUCCESS(AllocWriteDelay(pDevExt->pIoPortLocal)))
Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Enabled baudrate emulation");
else
***************
*** 277,287 ****
}
! AllocTimeouts(pDevExt);
KeInitializeSpinLock(&pDevExt->controlLock);
! pDevExt->specialChars.XonChar = 0x11;
! pDevExt->specialChars.XoffChar = 0x13;
! pDevExt->handFlow.ControlHandShake = SERIAL_DTR_CONTROL;
! pDevExt->handFlow.FlowReplace = SERIAL_RTS_CONTROL;
pDevExt->lineControl.WordLength = 7;
pDevExt->lineControl.Parity = EVEN_PARITY;
--- 278,293 ----
}
! AllocTimeouts(pDevExt->pIoPortLocal);
KeInitializeSpinLock(&pDevExt->controlLock);
!
! RtlZeroMemory(&pDevExt->pIoPortLocal->specialChars, sizeof(pDevExt->pIoPortLocal->specialChars));
! pDevExt->pIoPortLocal->specialChars.XonChar = 0x11;
! pDevExt->pIoPortLocal->specialChars.XoffChar = 0x13;
!
! RtlZeroMemory(&pDevExt->pIoPortLocal->handFlow, sizeof(pDevExt->pIoPortLocal->handFlow));
! pDevExt->pIoPortLocal->handFlow.ControlHandShake = SERIAL_DTR_CONTROL;
! pDevExt->pIoPortLocal->handFlow.FlowReplace = SERIAL_RTS_CONTROL;
!
pDevExt->lineControl.WordLength = 7;
pDevExt->lineControl.Parity = EVEN_PARITY;
***************
*** 351,355 ****
IN PC0C_FDOBUS_EXTENSION pBusExt,
IN PC0C_IO_PORT pIoPortLocal,
- IN PC0C_IO_PORT pIoPortRemote,
OUT PC0C_PDOPORT_EXTENSION *ppDevExt)
{
--- 357,360 ----
***************
*** 359,363 ****
UNICODE_STRING ntDeviceName;
PC0C_PDOPORT_EXTENSION pDevExt = NULL;
- int i;
status = STATUS_SUCCESS;
--- 364,367 ----
***************
*** 400,414 ****
pDevExt->pBusExt = pBusExt;
- pDevExt->pIoLock = &pBusExt->ioLock;
pDevExt->pIoPortLocal = pIoPortLocal;
- pDevExt->pIoPortRemote = pIoPortRemote;
-
- for (i = 0 ; i < C0C_QUEUE_SIZE ; i++) {
- InitializeListHead(&pIoPortLocal->irpQueues[i].queue);
- pIoPortLocal->irpQueues[i].pCurrent = NULL;
- #if DBG
- pIoPortLocal->irpQueues[i].started = FALSE;
- #endif /* DBG */
- }
Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"AddPdoPort OK");
--- 404,408 ----
***************
*** 549,560 ****
for (i = 0 ; i < 2 ; i++) {
! BOOLEAN isA = (BOOLEAN)(i ? FALSE : TRUE);
status = AddPdoPort(pDrvObj,
num,
! isA,
pDevExt,
! &pDevExt->childs[i].ioPort,
! &pDevExt->childs[(i + 1) % 2].ioPort,
&pDevExt->childs[i].pDevExt);
--- 543,568 ----
for (i = 0 ; i < 2 ; i++) {
! PC0C_IO_PORT pIoPort;
! int j;
!
! pIoPort = &pDevExt->childs[i].ioPort;
!
! pIoPort->pIoLock = &pDevExt->ioLock;
!
! for (j = 0 ; j < C0C_QUEUE_SIZE ; j++) {
! InitializeListHead(&pIoPort->irpQueues[j].queue);
! pIoPort->irpQueues[j].pCurrent = NULL;
! #if DBG
! pIoPort->irpQueues[j].started = FALSE;
! #endif /* DBG */
! }
!
! pIoPort->pIoPortRemote = &pDevExt->childs[(i + 1) % 2].ioPort;
status = AddPdoPort(pDrvObj,
num,
! (BOOLEAN)(i ? FALSE : TRUE),
pDevExt,
! pIoPort,
&pDevExt->childs[i].pDevExt);
Index: io.c
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/io.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -C2 -d -r1.27 -r1.28
*** io.c 17 May 2006 15:31:14 -0000 1.27
--- io.c 21 Jun 2006 16:23:57 -0000 1.28
***************
*** 20,23 ****
--- 20,26 ----
*
* $Log$
+ * Revision 1.28 2006/06/21 16:23:57 vfrolov
+ * Fixed possible BSOD after one port of pair removal
+ *
* Revision 1.27 2006/05/17 15:31:14 vfrolov
* Implemented SERIAL_TRANSMIT_TOGGLE
***************
*** 277,281 ****
if (pDataWrite->type == RW_DATA_TYPE_IRP) {
pDataWrite->data.irp.pIrp->IoStatus.Information = information;
! pReadIoPort->pDevExt->pIoPortRemote->amountInWriteQueue -= (ULONG)writeDone;
}
--- 280,284 ----
if (pDataWrite->type == RW_DATA_TYPE_IRP) {
pDataWrite->data.irp.pIrp->IoStatus.Information = information;
! pReadIoPort->pIoPortRemote->amountInWriteQueue -= (ULONG)writeDone;
}
***************
*** 287,291 ****
OnRxBreak(pReadIoPort, pQueueToComplete);
else
! pReadIoPort->pDevExt->pIoPortRemote->perfStats.TransmittedCount += (ULONG)writeDone;
}
--- 290,294 ----
OnRxBreak(pReadIoPort, pQueueToComplete);
else
! pReadIoPort->pIoPortRemote->perfStats.TransmittedCount += (ULONG)writeDone;
}
***************
*** 305,312 ****
pReadIoPort->errors |= SERIAL_ERROR_QUEUEOVERRUN;
! if (pReadIoPort->pDevExt->handFlow.FlowReplace & SERIAL_ERROR_CHAR)
! WriteMandatoryToBuffer(&pReadIoPort->readBuf, pReadIoPort->pDevExt->specialChars.ErrorChar);
! if (pReadIoPort->pDevExt->handFlow.ControlHandShake & SERIAL_ERROR_ABORT) {
CancelQueue(&pReadIoPort->irpQueues[C0C_QUEUE_READ], pQueueToComplete);
CancelQueue(&pReadIoPort->irpQueues[C0C_QUEUE_WRITE], pQueueToComplete);
--- 308,315 ----
pReadIoPort->errors |= SERIAL_ERROR_QUEUEOVERRUN;
! if (pReadIoPort->handFlow.FlowReplace & SERIAL_ERROR_CHAR)
! WriteMandatoryToBuffer(&pReadIoPort->readBuf, pReadIoPort->specialChars.ErrorChar);
! if (pReadIoPort->handFlow.ControlHandShake & SERIAL_ERROR_ABORT) {
CancelQueue(&pReadIoPort->irpQueues[C0C_QUEUE_READ], pQueueToComplete);
CancelQueue(&pReadIoPort->irpQueues[C0C_QUEUE_WRITE], pQueueToComplete);
***************
*** 365,369 ****
if (pDataWrite->type == RW_DATA_TYPE_IRP) {
pDataWrite->data.irp.pIrp->IoStatus.Information = information;
! pReadIoPort->pDevExt->pIoPortRemote->amountInWriteQueue -= (ULONG)writeDone;
}
--- 368,372 ----
if (pDataWrite->type == RW_DATA_TYPE_IRP) {
pDataWrite->data.irp.pIrp->IoStatus.Information = information;
! pReadIoPort->pIoPortRemote->amountInWriteQueue -= (ULONG)writeDone;
}
***************
*** 380,384 ****
OnRxBreak(pReadIoPort, pQueueToComplete);
else
! pReadIoPort->pDevExt->pIoPortRemote->perfStats.TransmittedCount += (ULONG)writeDone;
}
--- 383,387 ----
OnRxBreak(pReadIoPort, pQueueToComplete);
else
! pReadIoPort->pIoPortRemote->perfStats.TransmittedCount += (ULONG)writeDone;
}
***************
*** 445,449 ****
if (pDataWrite->type == RW_DATA_TYPE_IRP) {
pDataWrite->data.irp.pIrp->IoStatus.Information += writeDone;
! pReadIoPort->pDevExt->pIoPortRemote->amountInWriteQueue -= (ULONG)writeDone;
}
--- 448,452 ----
if (pDataWrite->type == RW_DATA_TYPE_IRP) {
pDataWrite->data.irp.pIrp->IoStatus.Information += writeDone;
! pReadIoPort->pIoPortRemote->amountInWriteQueue -= (ULONG)writeDone;
}
***************
*** 466,470 ****
OnRxBreak(pReadIoPort, pQueueToComplete);
else
! pReadIoPort->pDevExt->pIoPortRemote->perfStats.TransmittedCount += (ULONG)writeDone;
}
--- 469,473 ----
OnRxBreak(pReadIoPort, pQueueToComplete);
else
! pReadIoPort->pIoPortRemote->perfStats.TransmittedCount += (ULONG)writeDone;
}
***************
*** 557,561 ****
if (!first && status == STATUS_PENDING)
! status = FdoPortSetIrpTimeout(pIoPort->pDevExt, pIrp);
HALT_UNLESS(pCancelRoutine);
--- 560,564 ----
if (!first && status == STATUS_PENDING)
! status = SetIrpTimeout(pIoPort, pIrp);
HALT_UNLESS(pCancelRoutine);
***************
*** 645,649 ****
if (status == STATUS_PENDING && !pIoPort->emuOverrun)
status = MoveRawData(&pIoPort->readBuf.insertData, (PC0C_RAW_DATA)pParam);
! UpdateHandFlow(pIoPort->pDevExt, FALSE, pQueueToComplete);
break;
}
--- 648,652 ----
if (status == STATUS_PENDING && !pIoPort->emuOverrun)
status = MoveRawData(&pIoPort->readBuf.insertData, (PC0C_RAW_DATA)pParam);
! UpdateHandFlow(pIoPort, FALSE, pQueueToComplete);
break;
}
***************
*** 796,800 ****
if (readBufBusyBeg > readBufBusyEnd) {
! UpdateHandFlow(pIoPortRead->pDevExt, TRUE, pQueueToComplete);
readBufBusyBeg = readBufBusyEnd;
}
--- 799,803 ----
if (readBufBusyBeg > readBufBusyEnd) {
! UpdateHandFlow(pIoPortRead, TRUE, pQueueToComplete);
readBufBusyBeg = readBufBusyEnd;
}
***************
*** 814,823 ****
case C0C_XCHAR_ON:
dataChar.data.chr.type = RW_DATA_TYPE_CHR_XCHR;
! dataChar.data.chr.chr = pIoPortWrite->pDevExt->specialChars.XonChar;
dataChar.data.chr.isChr = TRUE;
break;
case C0C_XCHAR_OFF:
dataChar.data.chr.type = RW_DATA_TYPE_CHR_XCHR;
! dataChar.data.chr.chr = pIoPortWrite->pDevExt->specialChars.XoffChar;
dataChar.data.chr.isChr = TRUE;
break;
--- 817,826 ----
case C0C_XCHAR_ON:
dataChar.data.chr.type = RW_DATA_TYPE_CHR_XCHR;
! dataChar.data.chr.chr = pIoPortWrite->specialChars.XonChar;
dataChar.data.chr.isChr = TRUE;
break;
case C0C_XCHAR_OFF:
dataChar.data.chr.type = RW_DATA_TYPE_CHR_XCHR;
! dataChar.data.chr.chr = pIoPortWrite->specialChars.XoffChar;
dataChar.data.chr.isChr = TRUE;
break;
***************
*** 934,938 ****
if (dataIrpRead.data.irp.status == STATUS_PENDING)
dataIrpRead.data.irp.status =
! FdoPortSetIrpTimeout(pIoPortRead->pDevExt, dataIrpRead.data.irp.pIrp);
status = dataIrpRead.data.irp.status;
--- 937,941 ----
if (dataIrpRead.data.irp.status == STATUS_PENDING)
dataIrpRead.data.irp.status =
! SetIrpTimeout(pIoPortRead, dataIrpRead.data.irp.pIrp);
status = dataIrpRead.data.irp.status;
***************
*** 979,983 ****
}
! UpdateHandFlow(pIoPortRead->pDevExt, FALSE, pQueueToComplete);
readBufBusyBeg = readBufBusyEnd;
}
--- 982,986 ----
}
! UpdateHandFlow(pIoPortRead, FALSE, pQueueToComplete);
readBufBusyBeg = readBufBusyEnd;
}
***************
*** 1021,1026 ****
InsertLsrMst(pIoPortRead, FALSE, lsr, pQueueToComplete);
}
! if (pIoPortRead->pDevExt->handFlow.FlowReplace & SERIAL_BREAK_CHAR)
! InsertChar(pIoPortRead, pIoPortRead->pDevExt->specialChars.BreakChar, pQueueToComplete);
}
break;
--- 1024,1029 ----
InsertLsrMst(pIoPortRead, FALSE, lsr, pQueueToComplete);
}
! if (pIoPortRead->handFlow.FlowReplace & SERIAL_BREAK_CHAR)
! InsertChar(pIoPortRead, pIoPortRead->specialChars.BreakChar, pQueueToComplete);
}
break;
***************
*** 1054,1058 ****
}
! UpdateHandFlow(pIoPortRead->pDevExt, FALSE, pQueueToComplete);
readBufBusyBeg = readBufBusyEnd;
}
--- 1057,1061 ----
}
! UpdateHandFlow(pIoPortRead, FALSE, pQueueToComplete);
readBufBusyBeg = readBufBusyEnd;
}
***************
*** 1086,1090 ****
if (dataIrpWrite.data.irp.status == STATUS_PENDING)
dataIrpWrite.data.irp.status =
! FdoPortSetIrpTimeout(pIoPortWrite->pDevExt, dataIrpWrite.data.irp.pIrp);
status = dataIrpWrite.data.irp.status;
--- 1089,1093 ----
if (dataIrpWrite.data.irp.status == STATUS_PENDING)
dataIrpWrite.data.irp.status =
! SetIrpTimeout(pIoPortWrite, dataIrpWrite.data.irp.pIrp);
status = dataIrpWrite.data.irp.status;
***************
*** 1116,1120 ****
}
! UpdateTransmitToggle(pIoPortWrite->pDevExt, pQueueToComplete);
return status;
--- 1119,1123 ----
}
! UpdateTransmitToggle(pIoPortWrite, pQueueToComplete);
return status;
Index: handflow.c
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/handflow.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** handflow.c 19 May 2006 12:16:19 -0000 1.6
--- handflow.c 21 Jun 2006 16:23:57 -0000 1.7
***************
*** 20,23 ****
--- 20,26 ----
*
* $Log$
+ * Revision 1.7 2006/06/21 16:23:57 vfrolov
+ * Fixed possible BSOD after one port of pair removal
+ *
* Revision 1.6 2006/05/19 12:16:19 vfrolov
* Implemented SERIAL_XOFF_CONTINUE
***************
*** 52,60 ****
NTSTATUS SetHandFlow(
! PC0C_FDOPORT_EXTENSION pDevExt,
PSERIAL_HANDFLOW pHandFlow,
PLIST_ENTRY pQueueToComplete)
{
- PC0C_IO_PORT pIoPortLocal;
ULONG bits, mask;
PC0C_BUFFER pReadBuf;
--- 55,62 ----
NTSTATUS SetHandFlow(
! PC0C_IO_PORT pIoPort,
PSERIAL_HANDFLOW pHandFlow,
PLIST_ENTRY pQueueToComplete)
{
ULONG bits, mask;
PC0C_BUFFER pReadBuf;
***************
*** 62,70 ****
BOOLEAN setModemStatusHolding;
! pIoPortLocal = pDevExt->pIoPortLocal;
! pReadBuf = &pIoPortLocal->readBuf;
if (pHandFlow) {
! if ((pIoPortLocal->escapeChar && (pHandFlow->FlowReplace & SERIAL_ERROR_CHAR)) ||
((SIZE_T)pHandFlow->XonLimit > C0C_BUFFER_SIZE(pReadBuf)) ||
((SIZE_T)pHandFlow->XoffLimit > C0C_BUFFER_SIZE(pReadBuf)))
--- 64,71 ----
BOOLEAN setModemStatusHolding;
! pReadBuf = &pIoPort->readBuf;
if (pHandFlow) {
! if ((pIoPort->escapeChar && (pHandFlow->FlowReplace & SERIAL_ERROR_CHAR)) ||
((SIZE_T)pHandFlow->XonLimit > C0C_BUFFER_SIZE(pReadBuf)) ||
((SIZE_T)pHandFlow->XoffLimit > C0C_BUFFER_SIZE(pReadBuf)))
***************
*** 75,91 ****
pNewHandFlow = pHandFlow;
} else {
! pNewHandFlow = &pDevExt->handFlow;
}
// Set local side
if (pHandFlow &&
! ((pDevExt->handFlow.FlowReplace & SERIAL_AUTO_TRANSMIT) != 0) &&
((pHandFlow->FlowReplace & SERIAL_AUTO_TRANSMIT) == 0))
{
! SetXonXoffHolding(pIoPortLocal, C0C_XCHAR_ON);
}
if (!pHandFlow ||
! (pDevExt->handFlow.ControlHandShake & SERIAL_OUT_HANDSHAKEMASK) !=
(pHandFlow->ControlHandShake & SERIAL_OUT_HANDSHAKEMASK))
{
--- 76,92 ----
pNewHandFlow = pHandFlow;
} else {
! pNewHandFlow = &pIoPort->handFlow;
}
// Set local side
if (pHandFlow &&
! ((pIoPort->handFlow.FlowReplace & SERIAL_AUTO_TRANSMIT) != 0) &&
((pHandFlow->FlowReplace & SERIAL_AUTO_TRANSMIT) == 0))
{
! SetXonXoffHolding(pIoPort, C0C_XCHAR_ON);
}
if (!pHandFlow ||
! (pIoPort->handFlow.ControlHandShake & SERIAL_OUT_HANDSHAKEMASK) !=
(pHandFlow->ControlHandShake & SERIAL_OUT_HANDSHAKEMASK))
{
***************
*** 99,112 ****
if (!pHandFlow ||
! (pDevExt->handFlow.FlowReplace & SERIAL_RTS_MASK) !=
(pHandFlow->FlowReplace & SERIAL_RTS_MASK))
{
switch (pNewHandFlow->FlowReplace & SERIAL_RTS_MASK) {
case 0:
! pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_CTS;
mask |= C0C_MSB_CTS; // Turn off CTS on remote side if RTS is disabled
break;
case SERIAL_RTS_CONTROL:
! pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_CTS;
bits |= C0C_MSB_CTS;
mask |= C0C_MSB_CTS;
--- 100,113 ----
if (!pHandFlow ||
! (pIoPort->handFlow.FlowReplace & SERIAL_RTS_MASK) !=
(pHandFlow->FlowReplace & SERIAL_RTS_MASK))
{
switch (pNewHandFlow->FlowReplace & SERIAL_RTS_MASK) {
case 0:
! pIoPort->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_CTS;
mask |= C0C_MSB_CTS; // Turn off CTS on remote side if RTS is disabled
break;
case SERIAL_RTS_CONTROL:
! pIoPort->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_CTS;
bits |= C0C_MSB_CTS;
mask |= C0C_MSB_CTS;
***************
*** 114,124 ****
case SERIAL_RTS_HANDSHAKE:
if (C0C_BUFFER_BUSY(pReadBuf) > (C0C_BUFFER_SIZE(pReadBuf) - pNewHandFlow->XoffLimit)) {
! pIoPortLocal->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_CTS;
mask |= C0C_MSB_CTS;
}
else
! if (pIoPortLocal->writeHoldingRemote & SERIAL_TX_WAITING_FOR_CTS) {
if (C0C_BUFFER_BUSY(pReadBuf) <= (SIZE_T)pNewHandFlow->XonLimit) {
! pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_CTS;
bits |= C0C_MSB_CTS;
mask |= C0C_MSB_CTS;
--- 115,125 ----
case SERIAL_RTS_HANDSHAKE:
if (C0C_BUFFER_BUSY(pReadBuf) > (C0C_BUFFER_SIZE(pReadBuf) - pNewHandFlow->XoffLimit)) {
! pIoPort->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_CTS;
mask |= C0C_MSB_CTS;
}
else
! if (pIoPort->writeHoldingRemote & SERIAL_TX_WAITING_FOR_CTS) {
if (C0C_BUFFER_BUSY(pReadBuf) <= (SIZE_T)pNewHandFlow->XonLimit) {
! pIoPort->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_CTS;
bits |= C0C_MSB_CTS;
mask |= C0C_MSB_CTS;
***************
*** 133,146 ****
if (!pHandFlow ||
! (pDevExt->handFlow.ControlHandShake & SERIAL_DTR_MASK) !=
(pHandFlow->ControlHandShake & SERIAL_DTR_MASK))
{
switch (pNewHandFlow->ControlHandShake & SERIAL_DTR_MASK) {
case 0:
! pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_DSR;
mask |= C0C_MSB_DSR; // Turn off DSR on remote side if DTR is disabled
break;
case SERIAL_DTR_CONTROL:
! pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_DSR;
bits |= C0C_MSB_DSR;
mask |= C0C_MSB_DSR;
--- 134,147 ----
if (!pHandFlow ||
! (pIoPort->handFlow.ControlHandShake & SERIAL_DTR_MASK) !=
(pHandFlow->ControlHandShake & SERIAL_DTR_MASK))
{
switch (pNewHandFlow->ControlHandShake & SERIAL_DTR_MASK) {
case 0:
! pIoPort->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_DSR;
mask |= C0C_MSB_DSR; // Turn off DSR on remote side if DTR is disabled
break;
case SERIAL_DTR_CONTROL:
! pIoPort->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_DSR;
bits |= C0C_MSB_DSR;
mask |= C0C_MSB_DSR;
***************
*** 148,158 ****
case SERIAL_DTR_HANDSHAKE:
if (C0C_BUFFER_BUSY(pReadBuf) > (C0C_BUFFER_SIZE(pReadBuf) - pNewHandFlow->XoffLimit)) {
! pIoPortLocal->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_DSR;
mask |= C0C_MSB_DSR;
}
else
! if (pIoPortLocal->writeHoldingRemote & SERIAL_TX_WAITING_FOR_DSR) {
if (C0C_BUFFER_BUSY(pReadBuf) <= (SIZE_T)pNewHandFlow->XonLimit) {
! pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_DSR;
bits |= C0C_MSB_DSR;
mask |= C0C_MSB_DSR;
--- 149,159 ----
case SERIAL_DTR_HANDSHAKE:
if (C0C_BUFFER_BUSY(pReadBuf) > (C0C_BUFFER_SIZE(pReadBuf) - pNewHandFlow->XoffLimit)) {
! pIoPort->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_DSR;
mask |= C0C_MSB_DSR;
}
else
! if (pIoPort->writeHoldingRemote & SERIAL_TX_WAITING_FOR_DSR) {
if (C0C_BUFFER_BUSY(pReadBuf) <= (SIZE_T)pNewHandFlow->XonLimit) {
! pIoPort->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_DSR;
bits |= C0C_MSB_DSR;
mask |= C0C_MSB_DSR;
***************
*** 167,193 ****
if (!pHandFlow ||
! (pDevExt->handFlow.FlowReplace & SERIAL_AUTO_RECEIVE) !=
(pHandFlow->FlowReplace & SERIAL_AUTO_RECEIVE))
{
if (pNewHandFlow->FlowReplace & SERIAL_AUTO_RECEIVE) {
if (C0C_BUFFER_BUSY(pReadBuf) > (C0C_BUFFER_SIZE(pReadBuf) - pNewHandFlow->XoffLimit)) {
! pIoPortLocal->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_XON;
if ((pNewHandFlow->FlowReplace & SERIAL_XOFF_CONTINUE) == 0)
! pIoPortLocal->writeHolding |= SERIAL_TX_WAITING_FOR_XON;
! pIoPortLocal->sendXonXoff = C0C_XCHAR_OFF;
! pIoPortLocal->tryWrite = TRUE;
}
}
else
! if (pIoPortLocal->writeHoldingRemote & SERIAL_TX_WAITING_FOR_XON) {
! pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_XON;
! pIoPortLocal->writeHolding &= ~SERIAL_TX_WAITING_FOR_XON;
! if (pIoPortLocal->sendXonXoff != C0C_XCHAR_OFF) {
// XOFF was sent so send XON
! pIoPortLocal->sendXonXoff = C0C_XCHAR_ON;
! pIoPortLocal->tryWrite = TRUE;
} else {
// XOFF still was not sent so cancel it
! pIoPortLocal->sendXonXoff = 0;
}
}
--- 168,194 ----
if (!pHandFlow ||
! (pIoPort->handFlow.FlowReplace & SERIAL_AUTO_RECEIVE) !=
(pHandFlow->FlowReplace & SERIAL_AUTO_RECEIVE))
{
if (pNewHandFlow->FlowReplace & SERIAL_AUTO_RECEIVE) {
if (C0C_BUFFER_BUSY(pReadBuf) > (C0C_BUFFER_SIZE(pReadBuf) - pNewHandFlow->XoffLimit)) {
! pIoPort->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_XON;
if ((pNewHandFlow->FlowReplace & SERIAL_XOFF_CONTINUE) == 0)
! pIoPort->writeHolding |= SERIAL_TX_WAITING_FOR_XON;
! pIoPort->sendXonXoff = C0C_XCHAR_OFF;
! pIoPort->tryWrite = TRUE;
}
}
else
! if (pIoPort->writeHoldingRemote & SERIAL_TX_WAITING_FOR_XON) {
! pIoPort->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_XON;
! pIoPort->writeHolding &= ~SERIAL_TX_WAITING_FOR_XON;
! if (pIoPort->sendXonXoff != C0C_XCHAR_OFF) {
// XOFF was sent so send XON
! pIoPort->sendXonXoff = C0C_XCHAR_ON;
! pIoPort->tryWrite = TRUE;
} else {
// XOFF still was not sent so cancel it
! pIoPort->sendXonXoff = 0;
}
}
***************
*** 195,222 ****
if (pHandFlow)
! pDevExt->handFlow = *pHandFlow;
if (setModemStatusHolding)
! SetModemStatusHolding(pIoPortLocal);
if (mask)
! SetModemStatus(pDevExt->pIoPortRemote, bits, mask, pQueueToComplete);
! UpdateTransmitToggle(pDevExt, pQueueToComplete);
! SetLimit(pDevExt->pIoPortRemote->pDevExt);
! SetLimit(pDevExt);
! if (pDevExt->pIoPortRemote->tryWrite) {
ReadWrite(
! pIoPortLocal, FALSE,
! pDevExt->pIoPortRemote, FALSE,
pQueueToComplete);
}
! if (pIoPortLocal->tryWrite) {
ReadWrite(
! pDevExt->pIoPortRemote, FALSE,
! pIoPortLocal, FALSE,
pQueueToComplete);
}
--- 196,223 ----
if (pHandFlow)
! pIoPort->handFlow = *pHandFlow;
if (setModemStatusHolding)
! SetModemStatusHolding(pIoPort);
if (mask)
! SetModemStatus(pIoPort->pIoPortRemote, bits, mask, pQueueToComplete);
! UpdateTransmitToggle(pIoPort, pQueueToComplete);
! SetLimit(pIoPort->pIoPortRemote);
! SetLimit(pIoPort);
! if (pIoPort->pIoPortRemote->tryWrite) {
ReadWrite(
! pIoPort, FALSE,
! pIoPort->pIoPortRemote, FALSE,
pQueueToComplete);
}
! if (pIoPort->tryWrite) {
ReadWrite(
! pIoPort->pIoPortRemote, FALSE,
! pIoPort, FALSE,
pQueueToComplete);
}
***************
*** 226,230 ****
VOID UpdateHandFlow(
! PC0C_FDOPORT_EXTENSION pDevExt,
BOOLEAN freed,
PLIST_ENTRY pQueueToComplete)
--- 227,231 ----
VOID UpdateHandFlow(
! PC0C_IO_PORT pIoPort,
BOOLEAN freed,
PLIST_ENTRY pQueueToComplete)
***************
*** 233,263 ****
PC0C_BUFFER pReadBuf;
PSERIAL_HANDFLOW pHandFlowLocal, pHandFlowRemote;
- PC0C_IO_PORT pIoPortLocal;
! pIoPortLocal = pDevExt->pIoPortLocal;
! pHandFlowLocal = &pDevExt->handFlow;
! pHandFlowRemote = &pDevExt->pIoPortRemote->pDevExt->handFlow;
! pReadBuf = &pIoPortLocal->readBuf;
bits = mask = 0;
! if (!pIoPortLocal->writeHoldingRemote) {
if (!freed && C0C_BUFFER_BUSY(pReadBuf) > (C0C_BUFFER_SIZE(pReadBuf) - pHandFlowLocal->XoffLimit)) {
if ((pHandFlowLocal->FlowReplace & SERIAL_RTS_MASK) == SERIAL_RTS_HANDSHAKE) {
! pIoPortLocal->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_CTS;
mask |= C0C_MSB_CTS;
}
if ((pHandFlowLocal->ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_HANDSHAKE) {
! pIoPortLocal->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_DSR;
mask |= C0C_MSB_DSR;
}
if (pHandFlowLocal->FlowReplace & SERIAL_AUTO_RECEIVE) {
! pIoPortLocal->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_XON;
if ((pHandFlowLocal->FlowReplace & SERIAL_XOFF_CONTINUE) == 0)
! pIoPortLocal->writeHolding |= SERIAL_TX_WAITING_FOR_XON;
! pIoPortLocal->sendXonXoff = C0C_XCHAR_OFF;
! pIoPortLocal->tryWrite = TRUE;
}
}
--- 234,262 ----
PC0C_BUFFER pReadBuf;
PSERIAL_HANDFLOW pHandFlowLocal, pHandFlowRemote;
! pHandFlowLocal = &pIoPort->handFlow;
! pHandFlowRemote = &pIoPort->pIoPortRemote->handFlow;
! pReadBuf = &pIoPort->readBuf;
bits = mask = 0;
! if (!pIoPort->writeHoldingRemote) {
if (!freed && C0C_BUFFER_BUSY(pReadBuf) > (C0C_BUFFER_SIZE(pReadBuf) - pHandFlowLocal->XoffLimit)) {
if ((pHandFlowLocal->FlowReplace & SERIAL_RTS_MASK) == SERIAL_RTS_HANDSHAKE) {
! pIoPort->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_CTS;
mask |= C0C_MSB_CTS;
}
if ((pHandFlowLocal->ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_HANDSHAKE) {
! pIoPort->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_DSR;
mask |= C0C_MSB_DSR;
}
if (pHandFlowLocal->FlowReplace & SERIAL_AUTO_RECEIVE) {
! pIoPort->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_XON;
if ((pHandFlowLocal->FlowReplace & SERIAL_XOFF_CONTINUE) == 0)
! pIoPort->writeHolding |= SERIAL_TX_WAITING_FOR_XON;
! pIoPort->sendXonXoff = C0C_XCHAR_OFF;
! pIoPort->tryWrite = TRUE;
}
}
***************
*** 265,269 ****
if (freed && C0C_BUFFER_BUSY(pReadBuf) <= (SIZE_T)pHandFlowLocal->XonLimit) {
if ((pHandFlowLocal->FlowReplace & SERIAL_RTS_MASK) == SERIAL_RTS_HANDSHAKE) {
! pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_CTS;
bits |= C0C_MSB_CTS;
mask |= C0C_MSB_CTS;
--- 264,268 ----
if (freed && C0C_BUFFER_BUSY(pReadBuf) <= (SIZE_T)pHandFlowLocal->XonLimit) {
if ((pHandFlowLocal->FlowReplace & SERIAL_RTS_MASK) == SERIAL_RTS_HANDSHAKE) {
! pIoPort->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_CTS;
bits |= C0C_MSB_CTS;
mask |= C0C_MSB_CTS;
***************
*** 271,275 ****
if ((pHandFlowLocal->ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_HANDSHAKE) {
! pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_DSR;
bits |= C0C_MSB_DSR;
mask |= C0C_MSB_DSR;
--- 270,274 ----
if ((pHandFlowLocal->ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_HANDSHAKE) {
! pIoPort->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_DSR;
bits |= C0C_MSB_DSR;
mask |= C0C_MSB_DSR;
**************...
[truncated message content] |