[ISAPNP] Make the driver pageable
[reactos.git] / drivers / bus / isapnp / pdo.c
index 57c217f..402f626 100644 (file)
@@ -11,8 +11,9 @@
 #define NDEBUG
 #include <debug.h>
 
+static
+CODE_SEG("PAGE")
 NTSTATUS
-NTAPI
 IsaPdoQueryDeviceRelations(
     _In_ PISAPNP_PDO_EXTENSION PdoExt,
     _Inout_ PIRP Irp,
@@ -20,6 +21,8 @@ IsaPdoQueryDeviceRelations(
 {
     PDEVICE_RELATIONS DeviceRelations;
 
+    PAGED_CODE();
+
     if (IrpSp->Parameters.QueryDeviceRelations.Type == RemovalRelations &&
         PdoExt->Common.Self == PdoExt->FdoExt->ReadPortPdo)
     {
@@ -41,8 +44,9 @@ IsaPdoQueryDeviceRelations(
     return STATUS_SUCCESS;
 }
 
+static
+CODE_SEG("PAGE")
 NTSTATUS
-NTAPI
 IsaPdoQueryCapabilities(
     _In_ PISAPNP_PDO_EXTENSION PdoExt,
     _Inout_ PIRP Irp,
@@ -52,6 +56,8 @@ IsaPdoQueryCapabilities(
     PISAPNP_LOGICAL_DEVICE LogDev = PdoExt->IsaPnpDevice;
     ULONG i;
 
+    PAGED_CODE();
+
     DeviceCapabilities = IrpSp->Parameters.DeviceCapabilities.Capabilities;
     if (DeviceCapabilities->Version != 1)
         return STATUS_REVISION_MISMATCH;
@@ -75,19 +81,23 @@ IsaPdoQueryCapabilities(
     return STATUS_SUCCESS;
 }
 
+static
+CODE_SEG("PAGE")
 NTSTATUS
-NTAPI
 IsaPdoQueryPnpDeviceState(
     _In_ PISAPNP_PDO_EXTENSION PdoExt,
     _Inout_ PIRP Irp,
     _In_ PIO_STACK_LOCATION IrpSp)
 {
+    PAGED_CODE();
+
     Irp->IoStatus.Information |= PNP_DEVICE_NOT_DISABLEABLE;
     return STATUS_SUCCESS;
 }
 
+static
+CODE_SEG("PAGE")
 NTSTATUS
-NTAPI
 IsaPdoQueryId(
     _In_ PISAPNP_PDO_EXTENSION PdoExt,
     _Inout_ PIRP Irp,
@@ -96,6 +106,8 @@ IsaPdoQueryId(
     PUNICODE_STRING Source;
     PWCHAR Buffer;
 
+    PAGED_CODE();
+
     switch (IrpSp->Parameters.QueryId.IdType)
     {
         case BusQueryDeviceID:
@@ -136,8 +148,9 @@ IsaPdoQueryId(
     return STATUS_SUCCESS;
 }
 
+static
+CODE_SEG("PAGE")
 NTSTATUS
-NTAPI
 IsaPdoQueryResources(
     _In_ PISAPNP_PDO_EXTENSION PdoExt,
     _Inout_ PIRP Irp,
@@ -146,6 +159,8 @@ IsaPdoQueryResources(
     ULONG ListSize;
     PCM_RESOURCE_LIST ResourceList;
 
+    PAGED_CODE();
+
     if (!PdoExt->ResourceList)
         return Irp->IoStatus.Status;
 
@@ -159,8 +174,9 @@ IsaPdoQueryResources(
     return STATUS_SUCCESS;
 }
 
+static
+CODE_SEG("PAGE")
 NTSTATUS
-NTAPI
 IsaPdoQueryResourceRequirements(
     _In_ PISAPNP_PDO_EXTENSION PdoExt,
     _Inout_ PIRP Irp,
@@ -169,6 +185,8 @@ IsaPdoQueryResourceRequirements(
     ULONG ListSize;
     PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList;
 
+    PAGED_CODE();
+
     if (!PdoExt->RequirementsList)
         return Irp->IoStatus.Status;
 
@@ -183,17 +201,18 @@ IsaPdoQueryResourceRequirements(
 }
 
 static
+CODE_SEG("PAGE")
 NTSTATUS
-NTAPI
 IsaPdoStartReadPort(
     _In_ PISAPNP_FDO_EXTENSION FdoExt,
     _In_ PIO_STACK_LOCATION IrpSp)
 {
     PCM_RESOURCE_LIST ResourceList = IrpSp->Parameters.StartDevice.AllocatedResources;
     NTSTATUS Status = STATUS_INSUFFICIENT_RESOURCES;
-    KIRQL OldIrql;
     ULONG i;
 
+    PAGED_CODE();
+
     if (!ResourceList || ResourceList->Count != 1)
     {
         DPRINT1("No resource list (%p) or bad count (%d)\n",
@@ -222,10 +241,13 @@ IsaPdoStartReadPort(
             if (NT_SUCCESS(IsaHwTryReadDataPort(ReadDataPort)))
             {
                 /* We detected some ISAPNP cards */
+
                 FdoExt->ReadDataPort = ReadDataPort;
-                KeAcquireSpinLock(&FdoExt->Lock, &OldIrql);
+
+                IsaPnpAcquireDeviceDataLock(FdoExt);
                 Status = IsaHwFillDeviceList(FdoExt);
-                KeReleaseSpinLock(&FdoExt->Lock, OldIrql);
+                IsaPnpReleaseDeviceDataLock(FdoExt);
+
                 if (FdoExt->DeviceCount > 0)
                 {
                     IoInvalidateDeviceRelations(FdoExt->Pdo, BusRelations);
@@ -301,8 +323,8 @@ IsaPdoRepeatRequest(
     return STATUS_PENDING;
 }
 
+CODE_SEG("PAGE")
 NTSTATUS
-NTAPI
 IsaPdoPnp(
     _In_ PISAPNP_PDO_EXTENSION PdoExt,
     _Inout_ PIRP Irp,
@@ -310,6 +332,8 @@ IsaPdoPnp(
 {
     NTSTATUS Status = Irp->IoStatus.Status;
 
+    PAGED_CODE();
+
     switch (IrpSp->MinorFunction)
     {
         case IRP_MN_START_DEVICE: