Sending multiple asynchronous read requests from NDIS driver to WDF driver but blocked at first only

Hi,

NDIS Driver need to submit multiple WDFReadrequests to wdfdriver. All these requests need to be submitted in asynchronous IO . First request is being received at wdf bus driver.
Below is the behavior observed

  1. Wdfrequestsend is blocked and control is not coming back even though it is submitted asynchronously.

  2. A bus driver is able to receive the request but its not completed. It will be completed later.

  3. Since the call is not returning on NDIS side , no furthermore requests are submitted to queue.

    status = WdfIoTargetOpen(Adapter->UsbTarget,&openParams);
    if (!NT_SUCCESS(status))
    {
    WdfObjectDelete(Adapter->UsbTarget);
    DEBUGP(MP_ERROR,“Failed to open SPB target - %!STATUS!”,status);
    goto Exit;
    }

//
// Create two requests - one for read and one for write.
//
WDF_OBJECT_ATTRIBUTES_INIT(&requestAttributes);
// requestAttributes.ParentObject = Adapter->UsbTarget;
status = WdfRequestCreate(&requestAttributes, Adapter->UsbTarget, &Request);
if (!NT_SUCCESS(status)) {
DEBUGP(MP_ERROR, “%s %d Failed to create Request\n”, func, LINE);
goto Exit;
}

status = WdfMemoryCreatePreallocated(WDF_NO_OBJECT_ATTRIBUTES,pRcb,sizeof(RCB),&InputMem);
if (!NT_SUCCESS(status)) {
DEBUGP(MP_ERROR, “%s %d Failed to create Memory\n”, func, LINE);
goto exit_first;
}

status = WdfIoTargetFormatRequestForRead(Adapter->UsbTarget,Request,InputMem,NULL, NULL); // OutputBufferOffset
if (!NT_SUCCESS(status)) {
KdPrint((“WdfIoTargetFormatRequestForRead failed 0x%x\n”, status));
goto exit_first;
}

WDF_REQUEST_SEND_OPTIONS_INIT(&sendOptions, 0);
WdfRequestSetCompletionRoutine(Request,ReadRequestCompletionRoutine,Adapter);
WdfObjectReference(Request);
if (!WdfRequestSend(Request, Adapter->UsbTarget, &sendOptions)) {
status = WdfRequestGetStatus(Request);
WdfRequestCompleteWithInformation(Request, status, 0);
DEBUGP(MP_ERROR, “%s %d Failed to send Request status:%x\n”, func, LINE, status);
}

Is there anything i am missing …?

Simplest first step to debug is to break into the debugger and see which function/component is blocking.

Just as a side note, your error cleanup is wrong. Never call WdfRequestComplete on a request that you created. After fetching the status, you just do WdfObjectDelete…