NTSTATUS ResetDevice( _In_ WDFDEVICE Device ) /*++ Routine Description: This routine calls WdfUsbTargetDeviceResetPortSynchronously to reset the device if it's still connected. Arguments: Device - Handle to a framework device Return Value: NT status value --*/ { PDEVICE_CONTEXT pDeviceContext; NTSTATUS status; Rio500_DbgPrint(3, ("ResetDevice - begins\n")); PAGED_CODE(); pDeviceContext = GetDeviceContext(Device); // // A reset-device // request will be stuck in the USB until the pending transactions // have been canceled. Similarly, if there are pending tranasfers on the BULK // _In_/OUT pipe cancel them. // To work around this issue, the driver should stop the continuous reader // (by calling WdfIoTargetStop) before resetting the device, and restart the // continuous reader (by calling WdfIoTargetStart) after the request completes. // StopAllPipes(pDeviceContext); // // It may not be necessary to check whether device is connected before // resetting the port. // status = WdfUsbTargetDeviceIsConnectedSynchronous(pDeviceContext->WdfUsbTargetDevice); if (NT_SUCCESS(status)) { status = WdfUsbTargetDeviceResetPortSynchronously(pDeviceContext->WdfUsbTargetDevice); } StartAllPipes(pDeviceContext); Rio500_DbgPrint(3, ("ResetDevice - ends\n")); return status; }
NTSTATUS ResetDevice( _In_ WDFDEVICE Device ) /*++ Routine Description: This routine calls WdfUsbTargetDeviceResetPortSynchronously to reset the device if it's still connected. Arguments: Device - Handle to a framework device Return Value: NT status value --*/ { PDEVICE_CONTEXT pDeviceContext; NTSTATUS status; PAGED_CODE(); TraceEvents(TRACE_LEVEL_INFORMATION, DBG_IOCTL, "--> ResetDevice\n"); pDeviceContext = GetDeviceContext(Device); // // A NULL timeout indicates an infinite wake // status = WdfWaitLockAcquire(pDeviceContext->ResetDeviceWaitLock, NULL); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL, "ResetDevice - could not acquire lock\n"); return status; } StopAllPipes(pDeviceContext); status = WdfUsbTargetDeviceResetPortSynchronously(pDeviceContext->UsbDevice); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL, "ResetDevice failed - 0x%x\n", status); } status = StartAllPipes(pDeviceContext); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL, "Failed to start all pipes - 0x%x\n", status); } WdfWaitLockRelease(pDeviceContext->ResetDeviceWaitLock); TraceEvents(TRACE_LEVEL_INFORMATION, DBG_IOCTL, "<-- ResetDevice\n"); return status; }
NTSTATUS ResetDevice( __in WDFDEVICE Device ) /*++ Routine Description: This routine calls WdfUsbTargetDeviceResetPortSynchronously to reset the device if it's still connected. Arguments: Device - Handle to a framework device Return Value: NT status value --*/ { PDEVICE_CONTEXT pDeviceContext; NTSTATUS status; PAGED_CODE(); TraceEvents(TRACE_LEVEL_INFORMATION, DBG_IOCTL, "--> ResetDevice\n"); pDeviceContext = GetDeviceContext(Device); StopAllPipes(pDeviceContext); status = WdfUsbTargetDeviceResetPortSynchronously(pDeviceContext->UsbDevice); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL, "ResetDevice failed - 0x%x\n", status); } StartAllPipes(pDeviceContext); TraceEvents(TRACE_LEVEL_INFORMATION, DBG_IOCTL, "<-- ResetDevice\n"); return status; }
/*++ Routine Description: This routine calls WdfUsbTargetDeviceResetPortSynchronously to reset the device if it's still connected. Arguments: Device - Handle to a framework device Return Value: NT status value --*/ NTSTATUS ResetDevice(IN WDFDEVICE Device) { PDEVICE_CONTEXT pDeviceContext; NTSTATUS status; PSDrv_DbgPrint(3, ("ResetDevice - begins\n")); PAGED_CODE(); pDeviceContext = GetDeviceContext(Device); // A reset-device // request will be stuck in the USB until the pending transactions // have been canceled. Similarly, if there are pending transfers on the BULK // IN/OUT pipe cancel them. // To work around this issue, the driver should stop the continuous reader // (by calling WdfIoTargetStop) before resetting the device, and restart the // continuous reader (by calling WdfIoTargetStart) after the request completes. StopAllPipes(pDeviceContext); // It may not be necessary to check whether device is connected before // resetting the port. status = WdfUsbTargetDeviceIsConnectedSynchronous(pDeviceContext->WdfUsbTargetDevice); if(NT_SUCCESS(status)) { status = WdfUsbTargetDeviceResetPortSynchronously(pDeviceContext->WdfUsbTargetDevice); } StartAllPipes(pDeviceContext); PSDrv_DbgPrint(3, ("ResetDevice - ends\n")); return status; }