[STORPORT] Get the interrupt from the resource list, connect it and call the miniport...
authorEric Kohl <eric.kohl@reactos.org>
Mon, 23 Oct 2017 21:21:58 +0000 (23:21 +0200)
committerEric Kohl <eric.kohl@reactos.org>
Mon, 23 Oct 2017 21:21:58 +0000 (23:21 +0200)
CORE-13866

drivers/storage/port/storport/fdo.c
drivers/storage/port/storport/miniport.c
drivers/storage/port/storport/misc.c
drivers/storage/port/storport/precomp.h

index 9072971..3c49619 100644 (file)
 
 /* FUNCTIONS ******************************************************************/
 
 
 /* FUNCTIONS ******************************************************************/
 
+static
+BOOLEAN
+NTAPI
+PortFdoInterruptRoutine(
+    _In_ PKINTERRUPT Interrupt,
+    _In_ PVOID ServiceContext)
+{
+    PFDO_DEVICE_EXTENSION DeviceExtension;
+
+    DPRINT1("PortFdoInterruptRoutine(%p %p)\n",
+            Interrupt, ServiceContext);
+
+    DeviceExtension = (PFDO_DEVICE_EXTENSION)ServiceContext;
+
+    return MiniportHwInterrupt(&DeviceExtension->Miniport);
+}
+
+
+static
+NTSTATUS
+PortFdoConnectInterrupt(
+    _In_ PFDO_DEVICE_EXTENSION DeviceExtension)
+{
+    ULONG Vector;
+    KIRQL Irql;
+    KINTERRUPT_MODE InterruptMode;
+    BOOLEAN ShareVector;
+    KAFFINITY Affinity;
+    NTSTATUS Status;
+
+    DPRINT1("PortFdoConnectInterrupt(%p)\n",
+            DeviceExtension);
+
+    /* No resources, no interrupt. Done! */
+    if (DeviceExtension->AllocatedResources == NULL ||
+        DeviceExtension->TranslatedResources == NULL)
+    {
+        DPRINT1("Checkpoint\n");
+        return STATUS_SUCCESS;
+    }
+
+    /* Get the interrupt data from the resource list */
+    Status = GetResourceListInterrupt(DeviceExtension,
+                                      &Vector,
+                                      &Irql,
+                                      &InterruptMode,
+                                      &ShareVector,
+                                      &Affinity);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("GetResourceListInterrupt() failed (Status 0x%08lx)\n", Status);
+        return Status;
+    }
+
+    DPRINT1("Vector: %lu\n", Vector);
+    DPRINT1("Irql: %lu\n", Irql);
+
+    DPRINT1("Affinity: 0x%08lx\n", Affinity);
+
+    /* Connect the interrupt */
+    Status = IoConnectInterrupt(&DeviceExtension->Interrupt,
+                                PortFdoInterruptRoutine,
+                                DeviceExtension,
+                                NULL,
+                                Vector,
+                                Irql,
+                                Irql,
+                                InterruptMode,
+                                ShareVector,
+                                Affinity,
+                                FALSE);
+    if (NT_SUCCESS(Status))
+    {
+        DeviceExtension->InterruptIrql = Irql;
+    }
+    else
+    {
+        DPRINT1("IoConnectInterrupt() failed (Status 0x%08lx)\n", Status);
+    }
+
+    return Status;
+}
+
+
 static
 NTSTATUS
 PortFdoStartMiniport(
 static
 NTSTATUS
 PortFdoStartMiniport(
@@ -55,6 +139,10 @@ PortFdoStartMiniport(
         return Status;
     }
 
         return Status;
     }
 
+
+    Status = PortFdoConnectInterrupt(DeviceExtension);
+
+
     /* Call the miniports HwInitialize function */
     Status = MiniportHwInitialize(&DeviceExtension->Miniport);
     if (!NT_SUCCESS(Status))
     /* Call the miniports HwInitialize function */
     Status = MiniportHwInitialize(&DeviceExtension->Miniport);
     if (!NT_SUCCESS(Status))
index c13a3f3..815e609 100644 (file)
@@ -346,4 +346,20 @@ MiniportHwInitialize(
     return Result ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL;
 }
 
     return Result ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL;
 }
 
+
+BOOLEAN
+MiniportHwInterrupt(
+    _In_ PMINIPORT Miniport)
+{
+    BOOLEAN Result;
+
+    DPRINT1("MiniportHwInterrupt(%p)\n",
+            Miniport);
+
+    Result = Miniport->InitData->HwInterrupt(&Miniport->MiniportExtension->HwDeviceExtension);
+    DPRINT1("HwInterrupt() returned %u\n", Result);
+
+    return Result;
+}
+
 /* EOF */
 /* EOF */
index 7710201..f74fd35 100644 (file)
@@ -287,6 +287,55 @@ TranslateResourceListAddress(
 }
 
 
 }
 
 
+NTSTATUS
+GetResourceListInterrupt(
+    PFDO_DEVICE_EXTENSION DeviceExtension,
+    PULONG Vector,
+    PKIRQL Irql,
+    KINTERRUPT_MODE *InterruptMode,
+    PBOOLEAN ShareVector,
+    PKAFFINITY Affinity)
+{
+    PCM_FULL_RESOURCE_DESCRIPTOR FullDescriptor;
+    PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
+    INT i, j;
+
+    DPRINT1("GetResourceListInterrupt(%p)\n",
+            DeviceExtension);
+
+    FullDescriptor = DeviceExtension->TranslatedResources->List;
+    for (i = 0; i < DeviceExtension->TranslatedResources->Count; i++)
+    {
+        for (j = 0; j < FullDescriptor->PartialResourceList.Count; j++)
+        {
+            PartialDescriptor = FullDescriptor->PartialResourceList.PartialDescriptors + j;
+
+            switch (PartialDescriptor->Type)
+            {
+                case CmResourceTypeInterrupt:
+                    DPRINT1("Interrupt: Level %lu  Vector %lu\n",
+                            PartialDescriptor->u.Interrupt.Level,
+                            PartialDescriptor->u.Interrupt.Vector);
+
+                    *Vector = PartialDescriptor->u.Interrupt.Vector;
+                    *Irql = (KIRQL)PartialDescriptor->u.Interrupt.Level;
+                    *InterruptMode = (PartialDescriptor->Flags & CM_RESOURCE_INTERRUPT_LATCHED) ? Latched : LevelSensitive;
+                    *ShareVector = (PartialDescriptor->ShareDisposition == CmResourceShareShared) ? TRUE : FALSE;
+                    *Affinity = PartialDescriptor->u.Interrupt.Affinity;
+
+                    return STATUS_SUCCESS;
+            }
+        }
+
+        /* Advance to next CM_FULL_RESOURCE_DESCRIPTOR block in memory. */
+        FullDescriptor = (PCM_FULL_RESOURCE_DESCRIPTOR)(FullDescriptor->PartialResourceList.PartialDescriptors + 
+                                                        FullDescriptor->PartialResourceList.Count);
+    }
+
+    return STATUS_NOT_FOUND;
+}
+
+
 NTSTATUS
 AllocateAddressMapping(
     PMAPPED_ADDRESS *MappedAddressList,
 NTSTATUS
 AllocateAddressMapping(
     PMAPPED_ADDRESS *MappedAddressList,
index 168c318..5bd16f3 100644 (file)
@@ -101,6 +101,8 @@ typedef struct _FDO_DEVICE_EXTENSION
     PHYSICAL_ADDRESS UncachedExtensionPhysicalBase;
     ULONG UncachedExtensionSize;
     PHW_PASSIVE_INITIALIZE_ROUTINE HwPassiveInitRoutine;
     PHYSICAL_ADDRESS UncachedExtensionPhysicalBase;
     ULONG UncachedExtensionSize;
     PHW_PASSIVE_INITIALIZE_ROUTINE HwPassiveInitRoutine;
+    PKINTERRUPT Interrupt;
+    ULONG InterruptIrql;
 } FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
 
 
 } FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
 
 
@@ -140,6 +142,9 @@ NTSTATUS
 MiniportHwInitialize(
     _In_ PMINIPORT Miniport);
 
 MiniportHwInitialize(
     _In_ PMINIPORT Miniport);
 
+BOOLEAN
+MiniportHwInterrupt(
+    _In_ PMINIPORT Miniport);
 
 /* misc.c */
 
 
 /* misc.c */
 
@@ -182,6 +187,15 @@ TranslateResourceListAddress(
     BOOLEAN InIoSpace,
     PPHYSICAL_ADDRESS TranslatedAddress);
 
     BOOLEAN InIoSpace,
     PPHYSICAL_ADDRESS TranslatedAddress);
 
+NTSTATUS
+GetResourceListInterrupt(
+    PFDO_DEVICE_EXTENSION DeviceExtension,
+    PULONG Vector,
+    PKIRQL Irql,
+    KINTERRUPT_MODE *InterruptMode,
+    PBOOLEAN ShareVector,
+    PKAFFINITY Affinity);
+
 NTSTATUS
 AllocateAddressMapping(
     PMAPPED_ADDRESS *MappedAddressList,
 NTSTATUS
 AllocateAddressMapping(
     PMAPPED_ADDRESS *MappedAddressList,