by Guest »
Hello,
I'm writing WDM driver and I'm having difficulties with getting message signaled interrupts to work.
Interrupt is sent from Xilinx SoC on PCIe card. I register my ISR like this:
RtlZeroMemory( &IntParams, sizeof( IO_CONNECT_INTERRUPT_PARAMETERS ) );
IntParams.Version = CONNECT_MESSAGE_BASED;
IntParams.MessageBased.ConnectionContext.Generic = &DevExt->InterruptConnectionContext;
IntParams.MessageBased.PhysicalDeviceObject = DevExt->PhysicalDeviceObject;
IntParams.MessageBased.MessageServiceRoutine = Card_MessageSignaledISR;
IntParams.MessageBased.ServiceContext = DeviceObject;
IntParams.MessageBased.SpinLock = NULL;
IntParams.MessageBased.SynchronizeIrql = 0;
IntParams.MessageBased.FloatingSave = FALSE;
IntParams.MessageBased.FallBackServiceRoutine = Card_InterruptServiceRoutine;
Status = IoConnectInterruptEx( &IntParams );
This is called when driver receives IRP_MN_START_DEVICE. IoConntectInterruptEx returns STATUS_SUCCESS but my ISR never gets called.
Also, I enable MSI in .inf file like this:
HKR,"Interrupt Management",,0x00000010 HKR,"Interrupt Management\MessageSignaledInterruptProperties",,0x00000010
HKR,"Interrupt Management\MessageSignaledInterruptProperties",MSISupported,0x00010001,1
HKR,"Interrupt Management\MessageSignaledInterruptProperties",MessageNumberLimit,0x00010001,1
It is worth mentioning that I'm sure that SoC actually triggers interrupt since I wrote Linux driver for it and it successfully receives it.
Any idea what could be wrong with my code?
Thanks in advance.
Hello,
I'm writing WDM driver and I'm having difficulties with getting message signaled interrupts to work.
Interrupt is sent from Xilinx SoC on PCIe card. I register my ISR like this:
RtlZeroMemory( &IntParams, sizeof( IO_CONNECT_INTERRUPT_PARAMETERS ) );
IntParams.Version = CONNECT_MESSAGE_BASED;
IntParams.MessageBased.ConnectionContext.Generic = &DevExt->InterruptConnectionContext;
IntParams.MessageBased.PhysicalDeviceObject = DevExt->PhysicalDeviceObject;
IntParams.MessageBased.MessageServiceRoutine = Card_MessageSignaledISR;
IntParams.MessageBased.ServiceContext = DeviceObject;
IntParams.MessageBased.SpinLock = NULL;
IntParams.MessageBased.SynchronizeIrql = 0;
IntParams.MessageBased.FloatingSave = FALSE;
IntParams.MessageBased.FallBackServiceRoutine = Card_InterruptServiceRoutine;
Status = IoConnectInterruptEx( &IntParams );
This is called when driver receives IRP_MN_START_DEVICE. IoConntectInterruptEx returns STATUS_SUCCESS but my ISR never gets called.
Also, I enable MSI in .inf file like this:
HKR,"Interrupt Management",,0x00000010 HKR,"Interrupt Management\MessageSignaledInterruptProperties",,0x00000010
HKR,"Interrupt Management\MessageSignaledInterruptProperties",MSISupported,0x00010001,1
HKR,"Interrupt Management\MessageSignaledInterruptProperties",MessageNumberLimit,0x00010001,1
It is worth mentioning that I'm sure that SoC actually triggers interrupt since I wrote Linux driver for it and it successfully receives it.
Any idea what could be wrong with my code?
Thanks in advance.