I am not sure if you can call IoBuildDeviceIoControlRequest in DISPATCH_LEVEL. The functions is invoked in IRQL <= APC_LEVEL as wdk document describing, if current IRQL is higher than APC_LEVEL, the result may be unexpectable. I guess some dead lock happend in your case.
Actually, you can allocate your Irp using IoAllocatIrp and send it to bus in DISPATCH_LEVEL, but you should not wait in this level too because it is also not safe. Try to assign workitem for your job and invoke 'CallUSBDI' in the workitem process routine.