IOCTLs time / Driver Load

Hi

One of our USB device opens the USB communication window for about "4 seconds" when powered on. After this it goes into normal boot mode and the USB communication will be closed immediately.

However at the PC side my driver (USB-Serial KMDF) is taking more than 5 to 6 seconds to load when this device is powered on. Hence not able to catch the usb communication mode.

I tried with minimizing other calls such as co-installer loading.
However I was able to achieve only 6 seconds time before 1st read or write event is captured.

I was able to capture the dbgview logs of various callbacks (please refer below)
From the logs, it appears about 4 seconds time is taken in handling various IOCTLS, even I am not forwarding these requests to USB, as I am just completing internally (as device is not a strict USB-CDC).

Is there any way, I can skip these IOCTLs or further speed up the driver loading time taken?

================================
00000000 7:36:18.125 PM In [UsbEvtPrepareHardware]
00000001 7:36:18.218 PM In [UsbWdmDeviceFileCreate]
00000002 7:36:18.218 PM In [UsbEvtIoInternalDeviceControl]
00000003 7:36:18.218 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_DTR] for: 768DA350
00000004 7:36:18.218 PM Usb_ProcessIOCTL [IOCTL_SERIAL_CLR_RTS] for: 768DA350
00000005 7:36:18.421 PM Usb_ProcessIOCTL [IOCTL_SERIAL_GET_MODEMSTATUS] for: 768DA350
00000006 7:36:18.421 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_BAUD_RATE] for: 768DA350
00000007 7:36:18.421 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_LINE_CONTROL] for: 768DA350
00000008 7:36:18.421 PM Usb_ProcessIOCTL [IOCTL_SERIAL_PURGE] for: 768DA350
00000009 7:36:18.421 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_DTR] for: 768DA350
00000010 7:36:18.421 PM Usb_ProcessIOCTL [IOCTL_SERIAL_CLR_RTS] for: 768DA350
00000011 7:36:18.625 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_DTR] for: 768DA350
00000012 7:36:18.812 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_RTS] for: 768DA350
00000013 7:36:18.812 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_TIMEOUTS] for: 768DA350
00000014 7:36:19.062 PM Usb_ProcessIOCTL [IOCTL_SERIAL_PURGE] for: 768DA350
00000015 7:36:19.062 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_DTR] for: 768DA350
00000016 7:36:19.062 PM Usb_ProcessIOCTL [IOCTL_SERIAL_CLR_RTS] for: 768DA350
00000017 7:36:19.265 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_DTR] for: 768DA350
00000018 7:36:19.265 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_RTS] for: 768DA350
00000019 7:36:19.265 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_TIMEOUTS] for: 768DA350
00000020 7:36:19.500 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_DTR] for: 768DA350
00000021 7:36:19.500 PM Usb_ProcessIOCTL [IOCTL_SERIAL_CLR_RTS] for: 768DA350
00000022 7:36:19.703 PM Usb_ProcessIOCTL [IOCTL_SERIAL_GET_MODEMSTATUS] for: 768DA350
00000023 7:36:19.703 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_BAUD_RATE] for: 768DA350
00000024 7:36:19.703 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_LINE_CONTROL] for: 768DA350
00000025 7:36:19.703 PM Usb_ProcessIOCTL [IOCTL_SERIAL_PURGE] for: 768DA350
00000026 7:36:19.703 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_DTR] for: 768DA350
00000027 7:36:19.703 PM Usb_ProcessIOCTL [IOCTL_SERIAL_CLR_RTS] for: 768DA350
00000028 7:36:19.906 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_DTR] for: 768DA350
00000029 7:36:20.093 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_RTS] for: 768DA350
00000030 7:36:20.093 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_TIMEOUTS] for: 768DA350
00000031 7:36:20.343 PM Usb_ProcessIOCTL [IOCTL_SERIAL_PURGE] for: 768DA350
00000032 7:36:20.343 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_DTR] for: 768DA350
00000033 7:36:20.343 PM Usb_ProcessIOCTL [IOCTL_SERIAL_CLR_RTS] for: 768DA350
00000034 7:36:20.546 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_DTR] for: 768DA350
00000035 7:36:20.546 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_RTS] for: 768DA350
00000036 7:36:20.546 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_TIMEOUTS] for: 768DA350
00000037 7:36:20.781 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_DTR] for: 768DA350
00000038 7:36:20.781 PM Usb_ProcessIOCTL [IOCTL_SERIAL_CLR_RTS] for: 768DA350
00000039 7:36:20.984 PM Usb_ProcessIOCTL [IOCTL_SERIAL_GET_MODEMSTATUS] for: 768DA350
00000040 7:36:20.984 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_BAUD_RATE] for: 768DA350
00000041 7:36:20.984 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_LINE_CONTROL] for: 768DA350
00000042 7:36:20.984 PM Usb_ProcessIOCTL [IOCTL_SERIAL_PURGE] for: 768DA350
00000043 7:36:20.984 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_DTR] for: 768DA350
00000044 7:36:20.984 PM Usb_ProcessIOCTL [IOCTL_SERIAL_CLR_RTS] for: 768DA350
00000045 7:36:21.187 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_DTR] for: 768DA350
00000046 7:36:21.375 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_RTS] for: 768DA350
00000047 7:36:21.375 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_TIMEOUTS] for: 768DA350
00000048 7:36:21.625 PM Usb_ProcessIOCTL [IOCTL_SERIAL_PURGE] for: 768DA350
00000049 7:36:21.625 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_DTR] for: 768DA350
00000050 7:36:21.625 PM Usb_ProcessIOCTL [IOCTL_SERIAL_CLR_RTS] for: 768DA350
00000051 7:36:21.828 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_DTR] for: 768DA350
00000052 7:36:21.828 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_RTS] for: 768DA350
00000053 7:36:21.828 PM Usb_ProcessIOCTL [IOCTL_SERIAL_SET_TIMEOUTS] for: 768DA350
00000054 7:36:22.062 PM In [UsbEvtIoInternalDeviceControl]
00000055 7:36:22.062 PM In [UsbWdmFileClose]

Awaiting for inputs..

Thanks in adv.

There is no guarantee when your driver will load. You have to live with it. If your device only opens its window after power up, you’re screwed; your design is unworkable.

Thanks for updates.

However this behavior is not seen with MS usbser.sys where in we have seen the application picks the com port within 4 seconds.

Also there should must be some time limit for any driver to get loaded, certainly more than 6 seconds is not feasible.

I was able to identify the delay with IOCTLs processing using DbgView (4 seconds between UsbEvtIoInternalDeviceControl statements)

Appreciate more inputs or alternate ideas if any to speedup loading.