>From 6ae78d9f9c49fc22120d1a96f9012f2aa69ed485 Mon Sep 17 00:00:00 2001
From: Vadim Rozenfeld <[email protected]>
Date: Mon, 16 May 2011 14:32:37 +0300
Subject: [COMMIT] [vioserial] use buffered mode for data transfer
---
vioserial/sys/Control.c | 1 +
vioserial/sys/Device.c | 19 ---
vioserial/sys/IsrDpc.c | 54 +++-----
vioserial/sys/Port.c | 328
+++++++++++++++++++----------------------------
vioserial/sys/vioser.h | 20 +---
5 files changed, 160 insertions(+), 262 deletions(-)
diff --git a/vioserial/sys/Control.c b/vioserial/sys/Control.c
index 1d0a849..329feb4 100644
--- a/vioserial/sys/Control.c
+++ b/vioserial/sys/Control.c
@@ -1,5 +1,6 @@
#include "precomp.h"
#include "vioser.h"
+#include "public.h"
#if defined(EVENT_TRACING)
#include "Control.tmh"
diff --git a/vioserial/sys/Device.c b/vioserial/sys/Device.c
index cd262fd..27769b6 100644
--- a/vioserial/sys/Device.c
+++ b/vioserial/sys/Device.c
@@ -176,7 +176,6 @@ VIOSerialEvtDevicePrepareHardware(
PPORTS_DEVICE pContext = GetPortsDevice(Device);
bool bPortFound = FALSE;
NTSTATUS status = STATUS_SUCCESS;
- WDF_DMA_ENABLER_CONFIG dmaConfig;
UINT nr_ports;
PAGED_CODE();
@@ -249,24 +248,6 @@ VIOSerialEvtDevicePrepareHardware(
"VirtIOConsoleConfig->max_nr_ports %d
\n", pContext->consoleConfig.max_nr_ports);
}
- pContext->MaximumTransferLength = PORT_MAXIMUM_TRANSFER_LENGTH;
- WDF_DMA_ENABLER_CONFIG_INIT( &dmaConfig,
- WdfDmaProfileScatterGather64Duplex,
- pContext->MaximumTransferLength );
-
- status = WdfDmaEnablerCreate(Device,
- &dmaConfig,
- WDF_NO_OBJECT_ATTRIBUTES,
- &pContext->DmaEnabler
- );
-
- if (!NT_SUCCESS (status))
- {
- TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
- "WdfDmaEnablerCreate failed: 0x%x\n", status);
- return status;
- }
-
if(pContext->isHostMultiport)
{
WDF_OBJECT_ATTRIBUTES attributes;
diff --git a/vioserial/sys/IsrDpc.c b/vioserial/sys/IsrDpc.c
index 6dfadf6..fe78658 100644
--- a/vioserial/sys/IsrDpc.c
+++ b/vioserial/sys/IsrDpc.c
@@ -33,7 +33,6 @@ VIOSerialInterruptDpc(
PPORTS_DEVICE pContext;
PVIOSERIAL_PORT port;
WDFDEVICE Device;
- WDFDMATRANSACTION dmaTransaction;
ULONG information;
@@ -41,7 +40,6 @@ VIOSerialInterruptDpc(
PUCHAR systemBuffer;
size_t Length;
WDFREQUEST request;
- BOOLEAN nonBlock;
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_DPC, "--> %s\n",
__FUNCTION__);
@@ -61,50 +59,40 @@ VIOSerialInterruptDpc(
{
struct virtqueue *out_vq = GetOutQueue(port);
WdfSpinLockAcquire(port->InBufLock);
- if (!port->GuestConnected)
- {
- VIOSerialDiscardPortData(port);
- }
if (!port->InBuf)
{
port->InBuf = VIOSerialGetInBuf(port);
TraceEvents(TRACE_LEVEL_INFORMATION, DBG_DPC, "%s::%d
port->InBuf = %p\n", __FUNCTION__, __LINE__, port->InBuf);
}
+ if (!port->GuestConnected)
+ {
+ VIOSerialDiscardPortData(port);
+ }
WdfSpinLockRelease(port->InBufLock);
- if (!VIOSerialWillReadBlock(port))
+ if (port->InBuf)
{
- status =
WdfIoQueueRetrieveNextRequest(port->PendingReadQueue, &request);
- if (NT_SUCCESS(status))
+ if (port->PendingReadRequest)
{
- TraceEvents(TRACE_LEVEL_INFORMATION, DBG_DPC,"Got
available read request\n");
- status = WdfRequestRetrieveOutputBuffer(request, 0,
&systemBuffer, &Length);
- if (NT_SUCCESS(status))
+ request = port->PendingReadRequest;
+ status = WdfRequestUnmarkCancelable(request);
+ if (status != STATUS_CANCELLED)
{
- information = (ULONG)VIOSerialFillReadBuf(port,
systemBuffer, Length);
- WdfRequestCompleteWithInformation(request,
STATUS_SUCCESS, information);
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_DPC,"Got
available read request\n");
+ status = WdfRequestRetrieveOutputBuffer(request, 0,
&systemBuffer, &Length);
+ if (NT_SUCCESS(status))
+ {
+ port->PendingReadRequest = NULL;
+ information = (ULONG)VIOSerialFillReadBuf(port,
systemBuffer, Length);
+ WdfRequestCompleteWithInformation(request,
STATUS_SUCCESS, information);
+ }
+ }
+ else
+ {
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_DPC,
"Request = %p was cancelled\n", request);
}
}
}
-
- if(out_vq && out_vq->vq_ops->get_buf(out_vq, &len))
- {
- BOOLEAN transactionComplete;
- dmaTransaction = port->WriteDmaTransaction;
- transactionComplete =
WdfDmaTransactionDmaCompleted( dmaTransaction,
- &status );
-
- if (transactionComplete)
- {
- WdfSpinLockAcquire(port->OutVqLock);
- VIOSerialReclaimConsumedBuffers(port);
- WdfSpinLockRelease(port->OutVqLock);
- TraceEvents(TRACE_LEVEL_INFORMATION, DBG_DPC,
- "Completing Write request in the
DpcForIsr");
- VIOSerialPortWriteRequestComplete( dmaTransaction,
status );
- }
- }
-
}
}
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_DPC, "<-- %s\n",
__FUNCTION__);
diff --git a/vioserial/sys/Port.c b/vioserial/sys/Port.c
index ec55da1..719bc10 100644
--- a/vioserial/sys/Port.c
+++ b/vioserial/sys/Port.c
@@ -6,8 +6,10 @@
#include "Port.tmh"
#endif
-EVT_WDF_WORKITEM VIOSerialPortSendPortReady;
-EVT_WDF_WORKITEM VIOSerialPortCreateSymbolicName;
+EVT_WDF_WORKITEM VIOSerialPortPortReadyWork;
+EVT_WDF_WORKITEM VIOSerialPortSymbolicNameWork;
+EVT_WDF_WORKITEM VIOSerialPortPnpNotifyWork;
+EVT_WDF_REQUEST_CANCEL VIOSerialRequestCancel;
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, VIOSerialDeviceListCreatePdo)
@@ -458,7 +460,7 @@ VIOSerialWillWriteBlock(
}
VOID
-VIOSerialPortSendPortReady(
+VIOSerialPortPortReadyWork(
IN WDFWORKITEM WorkItem
)
{
@@ -517,7 +519,7 @@ VIOSerialDeviceListCreatePdo(
);
WdfDeviceInitSetDeviceType(ChildInit, FILE_DEVICE_SERIAL_PORT);
- WdfDeviceInitSetIoType(ChildInit, WdfDeviceIoDirect);
+ WdfDeviceInitSetIoType(ChildInit, WdfDeviceIoBuffered);
do
{
@@ -525,7 +527,7 @@ VIOSerialDeviceListCreatePdo(
&buffer,
L"%ws%vport%up%u",
L"\\Device\\",
- 0,
+ pport->DeviceId,
pport->PortId
);
@@ -726,21 +728,6 @@ VIOSerialDeviceListCreatePdo(
}
WDF_IO_QUEUE_CONFIG_INIT(&queueConfig,
- WdfIoQueueDispatchManual);
-
- status = WdfIoQueueCreate(hChild,
- &queueConfig,
- WDF_NO_OBJECT_ATTRIBUTES,
- &pport->PendingReadQueue
- );
- if (!NT_SUCCESS(status))
- {
- TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
- "WdfIoQueueCreate (Pending Read Queue) failed 0x%x
\n", status);
- break;
- }
-
- WDF_IO_QUEUE_CONFIG_INIT(&queueConfig,
WdfIoQueueDispatchSequential);
queueConfig.EvtIoWrite = VIOSerialPortWrite;
@@ -824,54 +811,6 @@ VIOSerialDeviceListCreatePdo(
pContext = GetPortsDevice(pport->BusDevice);
- pport->WriteTransferElements = BYTES_TO_PAGES((ULONG)
ROUND_TO_PAGES(
- pContext->MaximumTransferLength) +
PAGE_SIZE) + 2;
-
- pport->WriteCommonBufferSize = sizeof(struct
VirtIOBufferDescriptor) * pport->WriteTransferElements;
- TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
- "pport->WriteCommonBufferSize = %d\n",
(int)pport->WriteCommonBufferSize);
-
- status = WdfCommonBufferCreate(
- pContext->DmaEnabler,
- pport->WriteCommonBufferSize,
- WDF_NO_OBJECT_ATTRIBUTES,
- &pport->WriteCommonBuffer
- );
- if (!NT_SUCCESS(status))
- {
- TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
- "WdfCommonBufferCreate (write) failed: 0x%x\n",
status);
- break;
- }
-
- pport->WriteCommonBufferBase =
-
WdfCommonBufferGetAlignedVirtualAddress(pport->WriteCommonBuffer);
-
- pport->WriteCommonBufferBaseLA =
-
WdfCommonBufferGetAlignedLogicalAddress(pport->WriteCommonBuffer);
-
- RtlZeroMemory( pport->WriteCommonBufferBase,
- pport->WriteCommonBufferSize);
-
- TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
- "WriteCommonBuffer 0x%p %08I64X,
length %d\n",
- pport->WriteCommonBufferBase,
-
pport->WriteCommonBufferBaseLA.QuadPart,
-
(int)WdfCommonBufferGetLength(pport->WriteCommonBuffer) );
-
- WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes,
TRANSACTION_CONTEXT);
- status = WdfDmaTransactionCreate(pContext->DmaEnabler,
- &attributes,
- &pport->WriteDmaTransaction
- );
-
- if (!NT_SUCCESS(status))
- {
- TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
- "WdfDmaTransactionCreate failed: 0x%x\n", status);
- break;
- }
-
status = VIOSerialFillQueue(GetInQueue(pport),
pport->InBufLock);
if(!NT_SUCCESS(status))
{
@@ -886,7 +825,7 @@ VIOSerialDeviceListCreatePdo(
WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&attributes,
RAWPDO_VIOSERIAL_PORT);
attributes.ParentObject = hChild;
- WDF_WORKITEM_CONFIG_INIT(&workitemConfig,
VIOSerialPortSendPortReady);
+ WDF_WORKITEM_CONFIG_INIT(&workitemConfig,
VIOSerialPortPortReadyWork);
status = WdfWorkItemCreate( &workitemConfig,
&attributes,
@@ -927,11 +866,14 @@ VIOSerialPortRead(
SIZE_T length;
NTSTATUS status;
PUCHAR systemBuffer;
+ BOOLEAN nonBlock;
PAGED_CODE();
TraceEvents(TRACE_LEVEL_INFORMATION, DBG_READ, "-->%s\n",
__FUNCTION__);
+ nonBlock =
((WdfFileObjectGetFlags(WdfRequestGetFileObject(Request)) &
FO_SYNCHRONOUS_IO) != FO_SYNCHRONOUS_IO);
+
status = WdfRequestRetrieveOutputBuffer(Request, Length,
&systemBuffer, &length);
if (!NT_SUCCESS(status))
{
@@ -941,23 +883,15 @@ VIOSerialPortRead(
if (!VIOSerialPortHasData(pdoData->port))
{
- if (!pdoData->port->HostConnected)
+ if (!pdoData->port->HostConnected && !nonBlock)
{
WdfRequestComplete(Request, STATUS_INSUFFICIENT_RESOURCES);
return;
}
-
- status = WdfRequestForwardToIoQueue(Request,
pdoData->port->PendingReadQueue);
- if (NT_SUCCESS(status))
- {
- return;
- }
- else
- {
- TraceEvents(TRACE_LEVEL_ERROR, DBG_READ,
"WdfRequestForwardToIoQueue failed: %x\n", status);
- WdfRequestComplete(Request, status);
- return;
- }
+ ASSERT (pdoData->port->PendingReadRequest == NULL);
+ WdfRequestMarkCancelableEx(Request, VIOSerialRequestCancel);
+ pdoData->port->PendingReadRequest = Request;
+ return;
}
length = (ULONG)VIOSerialFillReadBuf(pdoData->port, systemBuffer,
length);
@@ -982,134 +916,60 @@ VIOSerialPortWrite(
PRAWPDO_VIOSERIAL_PORT pdoData =
RawPdoSerialPortGetData(WdfIoQueueGetDevice(Queue));
NTSTATUS status = STATUS_SUCCESS;
SIZE_T length;
- WDFREQUEST readRequest;
PUCHAR systemBuffer;
PVIOSERIAL_PORT pport = pdoData->port;
-
+ BOOLEAN nonBlock;
PAGED_CODE();
- TraceEvents(TRACE_LEVEL_INFORMATION, DBG_WRITE, "-->%s length = %d
\n", __FUNCTION__, Length);
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_WRITE, "-->%s length = %d\n",
__FUNCTION__, Length);
- if (Length > PORT_MAXIMUM_TRANSFER_LENGTH)
+ if (Length == 0)
{
status = STATUS_INVALID_BUFFER_SIZE;
- WdfDmaTransactionRelease(pport->WriteDmaTransaction);
WdfRequestComplete(Request, status);
TraceEvents(TRACE_LEVEL_INFORMATION, DBG_WRITE, "<--%s::%d\n",
__FUNCTION__, __LINE__);
return;
}
-
- status = WdfDmaTransactionInitializeUsingRequest(
- pport->WriteDmaTransaction,
- Request,
- VIOSerialPortProgramWriteDma,
- WdfDmaDirectionWriteToDevice
- );
-
- if(!NT_SUCCESS(status))
+ status = WdfRequestRetrieveInputBuffer(Request, Length,
&systemBuffer, &length);
+ if (!NT_SUCCESS(status))
{
- TraceEvents(TRACE_LEVEL_ERROR, DBG_WRITE,
-
"WdfDmaTransactionInitializeUsingRequest failed: 0x%x\n",
- status
- );
- WdfDmaTransactionRelease(pport->WriteDmaTransaction);
WdfRequestComplete(Request, status);
return;
}
-
- status = WdfDmaTransactionExecute( pport->WriteDmaTransaction,
- pport);
-
- if(!NT_SUCCESS(status))
+ nonBlock = FALSE;
+ if (VIOSerialWillWriteBlock(pport))
{
- TraceEvents(TRACE_LEVEL_ERROR, DBG_WRITE,
- "WdfDmaTransactionExecute failed: 0x%x\n", status);
- WdfDmaTransactionRelease(pport->WriteDmaTransaction);
- WdfRequestComplete(Request, status);
+ if (nonBlock)
+ {
+ status = STATUS_INSUFFICIENT_RESOURCES;
+ WdfRequestComplete(Request, status);
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_WRITE, "<--%s::%d\n",
__FUNCTION__, __LINE__);
+ return;
+ }
}
+ length = VIOSerialSendBuffers(pport, systemBuffer, length,
nonBlock);
+ WdfRequestCompleteWithInformation( Request, status, length);
}
-BOOLEAN
-VIOSerialPortProgramWriteDma(
- IN WDFDMATRANSACTION Transaction,
- IN WDFDEVICE Device,
- IN PVOID Context,
- IN WDF_DMA_DIRECTION Direction,
- IN PSCATTER_GATHER_LIST SgList
- )
-{
- UINT len;
- SSIZE_T ret;
- struct VirtIOBufferDescriptor* sg;
- PVIOSERIAL_PORT port = (PVIOSERIAL_PORT)Context;
- struct virtqueue *vq = GetOutQueue(port);
- ULONG i;
-
- UNREFERENCED_PARAMETER(Device);
-
- TraceEvents(TRACE_LEVEL_INFORMATION, DBG_QUEUEING, "--> %s
port->OutVqFull = %d\n", __FUNCTION__, port->OutVqFull);
-
- WdfSpinLockAcquire(port->OutVqLock);
- VIOSerialReclaimConsumedBuffers(port);
-
- sg = (struct VirtIOBufferDescriptor*) port->WriteCommonBufferBase;
-
- for (i=0; i < SgList->NumberOfElements; i++)
- {
- sg[i].physAddr = SgList->Elements[i].Address;
- sg[i].ulSize = SgList->Elements[i].Length;
- }
-
- ret = vq->vq_ops->add_buf(vq, sg, i, 0, Context);
- if (ret < 0)
- {
- NTSTATUS status;
- port->OutVqFull = TRUE;
- WdfSpinLockRelease(port->OutVqLock);
- TraceEvents(TRACE_LEVEL_INFORMATION, DBG_QUEUEING, "<--> %s::%d
port->OutVqFull = %d\n", __FUNCTION__, __LINE__, port->OutVqFull);
-
- (VOID) WdfDmaTransactionDmaCompletedFinal(Transaction, 0,
&status);
- ASSERT(NT_SUCCESS(status));
- VIOSerialPortWriteRequestComplete( Transaction,
STATUS_INVALID_DEVICE_STATE );
- return FALSE;
- }
-
- vq->vq_ops->kick(vq);
- WdfSpinLockRelease(port->OutVqLock);
- TraceEvents(TRACE_LEVEL_INFORMATION, DBG_WRITE, "<-- %s
port->OutVqFull = %d\n", __FUNCTION__, port->OutVqFull);
- return TRUE;
-}
VOID
-VIOSerialPortWriteRequestComplete(
- IN WDFDMATRANSACTION DmaTransaction,
- IN NTSTATUS Status
+VIOSerialRequestCancel(
+ IN WDFREQUEST Request
)
{
- WDFDEVICE device=
WdfDmaTransactionGetDevice(DmaTransaction);
- PRAWPDO_VIOSERIAL_PORT pdoData = RawPdoSerialPortGetData(device);
- WDFREQUEST request;
- size_t bytesTransferred;
-
- request = WdfDmaTransactionGetRequest(DmaTransaction);
-
- bytesTransferred =
WdfDmaTransactionGetBytesTransferred( DmaTransaction );
-
- TraceEvents(TRACE_LEVEL_INFORMATION, DBG_DPC,
- "%s: Request %p, Status 0x%x, "
- "bytes transferred %d\n",
- __FUNCTION__,
- request,
- Status,
- (int)bytesTransferred
- );
+ PRAWPDO_VIOSERIAL_PORT pdoData =
RawPdoSerialPortGetData(WdfIoQueueGetDevice(WdfRequestGetIoQueue(Request)));
- WdfDmaTransactionRelease(DmaTransaction);
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_WRITE, "-->%s called on request
0x%p\n", __FUNCTION__, Request);
- WdfRequestCompleteWithInformation( request, Status,
bytesTransferred);
+ WdfRequestCompleteWithInformation(Request, STATUS_CANCELLED, 0L);
+ ASSERT(pdoData->port->PendingReadRequest == Request);
+ pdoData->port->PendingReadRequest = NULL;
+
+ return;
}
+
VOID
VIOSerialPortDeviceControl(
IN WDFQUEUE Queue,
@@ -1292,7 +1152,7 @@ VIOSerialPortCreateName(
WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&attributes,
RAWPDO_VIOSERIAL_PORT);
attributes.ParentObject = WdfDevice;
- WDF_WORKITEM_CONFIG_INIT(&workitemConfig,
VIOSerialPortCreateSymbolicName);
+ WDF_WORKITEM_CONFIG_INIT(&workitemConfig,
VIOSerialPortSymbolicNameWork);
status = WdfWorkItemCreate( &workitemConfig,
&attributes,
@@ -1316,9 +1176,45 @@ VIOSerialPortCreateName(
}
}
+VOID
+VIOSerialPortPnpNotify (
+ IN WDFDEVICE WdfDevice,
+ IN PVIOSERIAL_PORT port,
+ IN BOOLEAN connected
+)
+{
+ WDF_OBJECT_ATTRIBUTES attributes;
+ WDF_WORKITEM_CONFIG workitemConfig;
+ WDFWORKITEM hWorkItem;
+ PRAWPDO_VIOSERIAL_PORT pdoData = NULL;
+ NTSTATUS status = STATUS_SUCCESS;
+
+ port->HostConnected = connected;
+
+ WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
+ WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&attributes,
RAWPDO_VIOSERIAL_PORT);
+ attributes.ParentObject = WdfDevice;
+ WDF_WORKITEM_CONFIG_INIT(&workitemConfig,
VIOSerialPortPnpNotifyWork);
+
+ status = WdfWorkItemCreate( &workitemConfig,
+ &attributes,
+ &hWorkItem);
+
+ if (!NT_SUCCESS(status))
+ {
+ TraceEvents(TRACE_LEVEL_INFORMATION, DBG_DPC, "WdfWorkItemCreate
failed with status = 0x%08x\n", status);
+ return;
+ }
+
+ pdoData = RawPdoSerialPortGetData(hWorkItem);
+
+ pdoData->port = port;
+
+ WdfWorkItemEnqueue(hWorkItem);
+}
VOID
-VIOSerialPortCreateSymbolicName(
+VIOSerialPortSymbolicNameWork(
IN WDFWORKITEM WorkItem
)
{
@@ -1380,6 +1276,60 @@ VIOSerialPortCreateSymbolicName(
WdfObjectDelete(WorkItem);
}
+VOID
+VIOSerialPortPnpNotifyWork(
+ IN WDFWORKITEM WorkItem
+ )
+{
+ PRAWPDO_VIOSERIAL_PORT pdoData =
RawPdoSerialPortGetData(WorkItem);
+ PVIOSERIAL_PORT pport = pdoData->port;
+ PTARGET_DEVICE_CUSTOM_NOTIFICATION notification;
+ ULONG requiredSize;
+ NTSTATUS status;
+ VIRTIO_PORT_STATUS_CHANGE portStatus = {0};
+
+ portStatus.Version = 1;
+ portStatus.Reason = pport->HostConnected;
+
+ status = RtlULongAdd((sizeof(TARGET_DEVICE_CUSTOM_NOTIFICATION) -
sizeof(UCHAR)),
+ sizeof(VIRTIO_PORT_STATUS_CHANGE),
+ &requiredSize);
+
+ if (NT_SUCCESS(status))
+ {
+ notification = ExAllocatePoolWithTag(NonPagedPool,
+ requiredSize,
+ VIOSERIAL_DRIVER_MEMORY_TAG);
+
+ if (notification != NULL)
+ {
+ RtlZeroMemory(notification, requiredSize);
+ notification->Version = 1;
+ notification->Size = (USHORT)(requiredSize);
+ notification->FileObject = NULL;
+ notification->NameBufferOffset = -1;
+ notification->Event = GUID_VIOSERIAL_PORT_CHANGE_STATUS;
+ RtlCopyMemory(notification->CustomDataBuffer, &portStatus,
sizeof(VIRTIO_PORT_STATUS_CHANGE));
+ //FIXME
+ if(WdfDeviceGetDevicePnpState(pport->Device) ==
WdfDevStatePnpStarted)
+ {
+ status = IoReportTargetDeviceChangeAsynchronous(
+
WdfDeviceWdmGetPhysicalDevice(pport->Device),
+ notification,
+ NULL,
+ NULL);
+ if (!NT_SUCCESS(status))
+ {
+ TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
+
"IoReportTargetDeviceChangeAsynchronous Failed! status = 0x%x\n",
status);
+ }
+ }
+ ExFreePoolWithTag(notification,
VIOSERIAL_DRIVER_MEMORY_TAG);
+ }
+ }
+ WdfObjectDelete(WorkItem);
+}
+
NTSTATUS
VIOSerialEvtChildListIdentificationDescriptionDuplicate(
WDFCHILDLIST DeviceList,
@@ -1436,16 +1386,8 @@
VIOSerialEvtChildListIdentificationDescriptionDuplicate(
dst->GuestConnected = src->GuestConnected;
dst->ReadQueue = src->ReadQueue;
- dst->PendingReadQueue = src->PendingReadQueue;
-
+ dst->PendingReadRequest = src->PendingReadRequest;
dst->WriteQueue = src->WriteQueue;
- dst->WriteCommonBuffer = src->WriteCommonBuffer;
- dst->WriteDmaTransaction = src->WriteDmaTransaction;
- dst->WriteTransferElements = src->WriteTransferElements;
- dst->WriteCommonBufferSize = src->WriteCommonBufferSize;
- dst->WriteCommonBufferBase = src->WriteCommonBufferBase;
- dst->WriteCommonBufferBaseLA = src->WriteCommonBufferBaseLA;
-
dst->IoctlQueue = src->IoctlQueue;
return STATUS_SUCCESS;
diff --git a/vioserial/sys/vioser.h b/vioserial/sys/vioser.h
index 5caabc6..2712a0f 100644
--- a/vioserial/sys/vioser.h
+++ b/vioserial/sys/vioser.h
@@ -14,7 +14,7 @@
**********************************************************************/
#if !defined(VIOSERIAL_H)
#define VIOSERIAL_H
-
+#include "public.h"
EVT_WDF_DRIVER_DEVICE_ADD VIOSerialEvtDeviceAdd;
@@ -47,9 +47,6 @@ EVT_WDF_INTERRUPT_DISABLE
VIOSerialInterruptDisable;
#define VIRTIO_CONSOLE_PORT_NAME 7
-#define PORT_MAXIMUM_TRANSFER_LENGTH (32*1024)
-
-
#pragma pack (push)
#pragma pack (1)
@@ -92,9 +89,6 @@ typedef struct _tagPortDevice
struct virtqueue **in_vqs, **out_vqs;
WDFSPINLOCK CVqLock;
- WDFDMAENABLER DmaEnabler;
- ULONG MaximumTransferLength;
-
BOOLEAN DeviceOK;
UINT DeviceId;
} PORTS_DEVICE, *PPORTS_DEVICE;
@@ -144,16 +138,9 @@ typedef struct _tagVioSerialPort
BOOLEAN GuestConnected;
WDFQUEUE ReadQueue;
- WDFQUEUE PendingReadQueue;
+ WDFREQUEST PendingReadRequest;
WDFQUEUE WriteQueue;
- WDFCOMMONBUFFER WriteCommonBuffer;
- WDFDMATRANSACTION WriteDmaTransaction;
- ULONG WriteTransferElements;
- size_t WriteCommonBufferSize;
- PUCHAR WriteCommonBufferBase;
- PHYSICAL_ADDRESS WriteCommonBufferBaseLA;
-
WDFQUEUE IoctlQueue;
} VIOSERIAL_PORT, *PVIOSERIAL_PORT;
@@ -175,7 +162,7 @@ typedef struct _tagTransactionContext {
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(TRANSACTION_CONTEXT,
RawPdoSerialPortGetTransactionContext)
-NTSTATUS
+NTSTATUS
VIOSerialFillQueue(
IN struct virtqueue *vq,
IN WDFSPINLOCK Lock
@@ -297,7 +284,6 @@ EVT_WDF_IO_QUEUE_IO_WRITE VIOSerialPortWrite;
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL VIOSerialPortDeviceControl;
EVT_WDF_DEVICE_FILE_CREATE VIOSerialPortCreate;
EVT_WDF_FILE_CLOSE VIOSerialPortClose;
-EVT_WDF_PROGRAM_DMA VIOSerialPortProgramWriteDma;
VOID
VIOSerialPortWriteRequestComplete(
--
--
To unsubscribe from this list: send the line "unsubscribe kvm-commits" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html