mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 18:15:11 +00:00
[STORPORT] Get the interrupt from the resource list, connect it and call the miniports HwInterrupt routine.
CORE-13866
This commit is contained in:
parent
deb9c5416f
commit
5cfc1e3152
4 changed files with 167 additions and 0 deletions
|
@ -15,6 +15,90 @@
|
||||||
|
|
||||||
/* 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
|
static
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
PortFdoStartMiniport(
|
PortFdoStartMiniport(
|
||||||
|
@ -55,6 +139,10 @@ PortFdoStartMiniport(
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Status = PortFdoConnectInterrupt(DeviceExtension);
|
||||||
|
|
||||||
|
|
||||||
/* Call the miniports HwInitialize function */
|
/* Call the miniports HwInitialize function */
|
||||||
Status = MiniportHwInitialize(&DeviceExtension->Miniport);
|
Status = MiniportHwInitialize(&DeviceExtension->Miniport);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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
|
NTSTATUS
|
||||||
AllocateAddressMapping(
|
AllocateAddressMapping(
|
||||||
PMAPPED_ADDRESS *MappedAddressList,
|
PMAPPED_ADDRESS *MappedAddressList,
|
||||||
|
|
|
@ -101,6 +101,8 @@ typedef struct _FDO_DEVICE_EXTENSION
|
||||||
PHYSICAL_ADDRESS UncachedExtensionPhysicalBase;
|
PHYSICAL_ADDRESS UncachedExtensionPhysicalBase;
|
||||||
ULONG UncachedExtensionSize;
|
ULONG UncachedExtensionSize;
|
||||||
PHW_PASSIVE_INITIALIZE_ROUTINE HwPassiveInitRoutine;
|
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(
|
MiniportHwInitialize(
|
||||||
_In_ PMINIPORT Miniport);
|
_In_ PMINIPORT Miniport);
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
MiniportHwInterrupt(
|
||||||
|
_In_ PMINIPORT Miniport);
|
||||||
|
|
||||||
/* misc.c */
|
/* misc.c */
|
||||||
|
|
||||||
|
@ -182,6 +187,15 @@ TranslateResourceListAddress(
|
||||||
BOOLEAN InIoSpace,
|
BOOLEAN InIoSpace,
|
||||||
PPHYSICAL_ADDRESS TranslatedAddress);
|
PPHYSICAL_ADDRESS TranslatedAddress);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
GetResourceListInterrupt(
|
||||||
|
PFDO_DEVICE_EXTENSION DeviceExtension,
|
||||||
|
PULONG Vector,
|
||||||
|
PKIRQL Irql,
|
||||||
|
KINTERRUPT_MODE *InterruptMode,
|
||||||
|
PBOOLEAN ShareVector,
|
||||||
|
PKAFFINITY Affinity);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
AllocateAddressMapping(
|
AllocateAddressMapping(
|
||||||
PMAPPED_ADDRESS *MappedAddressList,
|
PMAPPED_ADDRESS *MappedAddressList,
|
||||||
|
|
Loading…
Reference in a new issue