Revert "RedirectorStrategy: Ensure there are no short buffers on read"

This reverts commit 32aadcb4fe.

Reverting commit because a regression was discovered on some devices.

Signed-off-by: Dmitry Fleytman <dfleytma@redhat.com>
This commit is contained in:
Dmitry Fleytman 2015-12-25 08:41:43 +02:00
parent 51ca12740b
commit 3b1f461d5c
4 changed files with 4 additions and 84 deletions

View file

@ -189,9 +189,6 @@ typedef struct tag_USBDK_REDIRECTOR_REQUEST_CONTEXT
WDFMEMORY LockedIsochronousPacketsArray;
WDFMEMORY LockedIsochronousResultsArray;
WDFMEMORY ShadowBuffer;
PVOID ShadowBufferPtr;
} USBDK_REDIRECTOR_REQUEST_CONTEXT, *PUSBDK_REDIRECTOR_REQUEST_CONTEXT;
class CRedirectorRequest : public CWdfRequest
@ -611,52 +608,6 @@ void CUsbDkRedirectorStrategy::TraceTransferError(const CRedirectorRequest &WdfR
DataBuffer.Size());
}
bool CUsbDkRedirectorStrategy::SupplyMaxPacketSizeShadowBuffer(CRedirectorRequest &WdfRequest,
PUSBDK_REDIRECTOR_REQUEST_CONTEXT RequestContext)
{
CPreAllocatedWdfMemoryBuffer OrigBuffer(RequestContext->LockedBuffer);
auto MaxPacketSize = m_Target.GetPipeMaxPacketSize(RequestContext->EndpointAddress);
if (OrigBuffer.Size() < MaxPacketSize)
{
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_REDIRECTOR,
"%!FUNC! Going to allocate shadow buffer of %llu bytes intead of %llu bytes for pipe %llu",
MaxPacketSize, OrigBuffer.Size(), RequestContext->EndpointAddress);
auto status = WdfMemoryCreate(WDF_NO_OBJECT_ATTRIBUTES,
NonPagedPool,
'MBSU',
MaxPacketSize,
&RequestContext->ShadowBuffer,
&RequestContext->ShadowBufferPtr);
if (!NT_SUCCESS(status))
{
TraceEvents(TRACE_LEVEL_ERROR, TRACE_REDIRECTOR,
"%!FUNC! Failed to allocate shadow buffer of %llu bytes: %!STATUS!", MaxPacketSize, status);
WdfRequest.SetStatus(status);
return false;
}
}
return true;
}
void CUsbDkRedirectorStrategy::RetireMaxPacketSizeShadowBuffer(PUSBDK_REDIRECTOR_REQUEST_CONTEXT RequestContext)
{
if (RequestContext->ShadowBufferPtr != nullptr)
{
ASSERT(RequestContext->Direction == UsbDkTransferDirection::Read);
ASSERT((RequestContext->TransferType == BulkTransferType) ||
(RequestContext->TransferType == InterruptTransferType));
CPreAllocatedWdfMemoryBuffer OrigBuffer(RequestContext->LockedBuffer);
RtlCopyMemory(OrigBuffer.Ptr(), RequestContext->ShadowBufferPtr, OrigBuffer.Size());
WdfObjectDelete(RequestContext->ShadowBuffer);
}
}
void CUsbDkRedirectorStrategy::ReadPipe(WDFREQUEST Request)
{
CRedirectorRequest WdfRequest(Request);
@ -680,14 +631,7 @@ void CUsbDkRedirectorStrategy::ReadPipe(WDFREQUEST Request)
case BulkTransferType:
case InterruptTransferType:
{
if (!SupplyMaxPacketSizeShadowBuffer(WdfRequest, Context))
{
break;
}
auto DataBuffer = (Context->ShadowBufferPtr != nullptr) ? Context->ShadowBuffer : Context->LockedBuffer;
m_Target.ReadPipeAsync(WdfRequest.Detach(), Context->EndpointAddress, DataBuffer,
m_Target.ReadPipeAsync(WdfRequest.Detach(), Context->EndpointAddress, Context->LockedBuffer,
[](WDFREQUEST Request, WDFIOTARGET, PWDF_REQUEST_COMPLETION_PARAMS Params, WDFCONTEXT)
{
auto status = Params->IoStatus.Status;
@ -699,11 +643,10 @@ void CUsbDkRedirectorStrategy::ReadPipe(WDFREQUEST Request)
TraceTransferError(WdfRequest, status, usbCompletionParams->UsbdStatus);
}
RetireMaxPacketSizeShadowBuffer(WdfRequest.Context());
CompleteTransferRequest(WdfRequest, status,
usbCompletionParams->UsbdStatus,
usbCompletionParams->Parameters.PipeRead.Length);
});
}
break;

View file

@ -57,7 +57,6 @@ private:
};
class CRedirectorRequest;
typedef struct tag_USBDK_REDIRECTOR_REQUEST_CONTEXT *PUSBDK_REDIRECTOR_REQUEST_CONTEXT;
class CUsbDkRedirectorStrategy : public CUsbDkFilterStrategy
{
@ -117,10 +116,6 @@ private:
NTSTATUS Status,
USBD_STATUS UsbdStatus);
bool SupplyMaxPacketSizeShadowBuffer(CRedirectorRequest &WdfRequest,
PUSBDK_REDIRECTOR_REQUEST_CONTEXT RequestContext);
static void RetireMaxPacketSizeShadowBuffer(PUSBDK_REDIRECTOR_REQUEST_CONTEXT RequestContext);
CWdfUsbTarget m_Target;
CUsbDkRedirectorQueueData m_IncomingDataQueue;

View file

@ -110,6 +110,7 @@ void CWdfUsbPipe::Create(WDFUSBDEVICE Device, WDFUSBINTERFACE Interface, UCHAR P
m_Pipe = WdfUsbInterfaceGetConfiguredPipe(m_Interface, PipeIndex, &m_Info);
ASSERT(m_Pipe != nullptr);
WdfUsbTargetPipeSetNoMaximumPacketSizeCheck(m_Pipe);
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_USBTARGET,
"%!FUNC! Created pipe #%d, "
@ -332,19 +333,6 @@ void CWdfUsbTarget::ReadPipeAsync(WDFREQUEST Request, ULONG64 EndpointAddress, W
}
}
size_t CWdfUsbTarget::GetPipeMaxPacketSize(ULONG64 EndpointAddress)
{
size_t res;
if (!DoPipeOperation<CWdfUsbInterface::SharedLock>(EndpointAddress, [&res](CWdfUsbPipe &Pipe) { res = Pipe.MaxPacketSize(); }))
{
TraceEvents(TRACE_LEVEL_ERROR, TRACE_USBTARGET, "%!FUNC! Failed because pipe was not found");
return 0;
}
return res;
}
void CWdfUsbTarget::ReadIsochronousPipeAsync(WDFREQUEST Request, ULONG64 EndpointAddress, WDFMEMORY Buffer,
PULONG64 PacketSizes, size_t PacketNumber,
PFN_WDF_REQUEST_COMPLETION_ROUTINE Completion)

View file

@ -64,11 +64,6 @@ public:
return m_Info.EndpointAddress;
}
size_t MaxPacketSize() const
{
return m_Info.MaximumPacketSize;
}
private:
WDFUSBINTERFACE m_Interface = WDF_NO_HANDLE;
WDFUSBDEVICE m_Device = WDF_NO_HANDLE;
@ -81,7 +76,6 @@ private:
PULONG64 PacketSizes,
size_t PacketNumber,
PFN_WDF_REQUEST_COMPLETION_ROUTINE Completion);
CWdfUsbPipe(const CWdfUsbPipe&) = delete;
CWdfUsbPipe& operator= (const CWdfUsbPipe&) = delete;
};
@ -164,7 +158,7 @@ public:
NTSTATUS AbortPipe(WDFREQUEST Request, ULONG64 EndpointAddress);
NTSTATUS ResetPipe(WDFREQUEST Request, ULONG64 EndpointAddress);
NTSTATUS ResetDevice(WDFREQUEST Request);
size_t GetPipeMaxPacketSize(ULONG64 EndpointAddress);
private:
void TracePipeNotFoundError(ULONG64 EndpointAddress);