https://git.reactos.org/?p=reactos.git;a=commitdiff;h=6091dde0d348d138bc6f80fbe7354cc30627cbe2

commit 6091dde0d348d138bc6f80fbe7354cc30627cbe2
Author:     Dmitry Borisov <di.s...@protonmail.com>
AuthorDate: Fri May 3 20:43:40 2024 +0600
Commit:     Dmitry Borisov <di.s...@protonmail.com>
CommitDate: Sat Aug 3 17:08:43 2024 +0600

    [ISAPNP] Improvements around hardware access helpers
    
    - Reimplement WriteWord using the WriteByte helper.
    - Remove inline qualifiers from the bus read and write functions.
      This code path is considered "cold" and using an inline for it is 
overkill.
    - Don't apply the IRQL restrictions to our PnP state transition helpers.
      They are only called at IRQL below dispatch level.
---
 drivers/bus/isapnp/hardware.c | 33 +++++++++++++++++++++++----------
 drivers/bus/isapnp/isapnp.h   |  8 ++++----
 2 files changed, 27 insertions(+), 14 deletions(-)

diff --git a/drivers/bus/isapnp/hardware.c b/drivers/bus/isapnp/hardware.c
index ecaec120c14..443fb787bbd 100644
--- a/drivers/bus/isapnp/hardware.c
+++ b/drivers/bus/isapnp/hardware.c
@@ -48,12 +48,14 @@ ReadData(
 }
 
 static
-inline
+CODE_SEG("PAGE")
 VOID
 WriteByte(
     _In_ UCHAR Address,
     _In_ UCHAR Value)
 {
+    PAGED_CODE();
+
     WriteAddress(Address);
     WriteData(Value);
 }
@@ -65,10 +67,8 @@ WriteWord(
     _In_ UCHAR Address,
     _In_ USHORT Value)
 {
-    WriteAddress(Address + 1);
-    WriteData((UCHAR)Value);
-    WriteAddress(Address);
-    WriteData(Value >> 8);
+    WriteByte(Address + 1, (UCHAR)Value);
+    WriteByte(Address, Value >> 8);
 }
 
 static
@@ -83,12 +83,14 @@ WriteDoubleWord(
 }
 
 static
-inline
+CODE_SEG("PAGE")
 UCHAR
 ReadByte(
     _In_ PUCHAR ReadDataPort,
     _In_ UCHAR Address)
 {
+    PAGED_CODE();
+
     WriteAddress(Address);
     return ReadData(ReadDataPort);
 }
@@ -325,11 +327,14 @@ NextLFSR(
 }
 
 static
+CODE_SEG("PAGE")
 VOID
 SendKey(VOID)
 {
     UCHAR i, Lfsr;
 
+    PAGED_CODE();
+
     WriteAddress(0x00);
     WriteAddress(0x00);
 
@@ -1634,37 +1639,45 @@ IsaHwConfigureDevice(
     return STATUS_SUCCESS;
 }
 
-_IRQL_requires_max_(DISPATCH_LEVEL)
+CODE_SEG("PAGE")
 VOID
 IsaHwWakeDevice(
     _In_ PISAPNP_LOGICAL_DEVICE LogicalDevice)
 {
+    PAGED_CODE();
+
     SendKey();
     Wake(LogicalDevice->CSN);
 }
 
-_IRQL_requires_max_(DISPATCH_LEVEL)
+CODE_SEG("PAGE")
 VOID
 IsaHwActivateDevice(
     _In_ PISAPNP_FDO_EXTENSION FdoExt,
     _In_ PISAPNP_LOGICAL_DEVICE LogicalDevice)
 {
+    PAGED_CODE();
+
     ActivateDevice(FdoExt->ReadDataPort, LogicalDevice->LDN);
 }
 
 #ifndef UNIT_TEST
-_IRQL_requires_max_(DISPATCH_LEVEL)
+CODE_SEG("PAGE")
 VOID
 IsaHwDeactivateDevice(
     _In_ PISAPNP_LOGICAL_DEVICE LogicalDevice)
 {
+    PAGED_CODE();
+
     DeactivateDevice(LogicalDevice->LDN);
 }
 #endif /* UNIT_TEST */
 
-_IRQL_requires_max_(DISPATCH_LEVEL)
+CODE_SEG("PAGE")
 VOID
 IsaHwWaitForKey(VOID)
 {
+    PAGED_CODE();
+
     WaitForKey();
 }
diff --git a/drivers/bus/isapnp/isapnp.h b/drivers/bus/isapnp/isapnp.h
index 998c7e766f0..344cc23691d 100644
--- a/drivers/bus/isapnp/isapnp.h
+++ b/drivers/bus/isapnp/isapnp.h
@@ -244,23 +244,23 @@ IsaHwConfigureDevice(
     _In_ PISAPNP_LOGICAL_DEVICE LogicalDevice,
     _In_ PCM_RESOURCE_LIST Resources);
 
-_IRQL_requires_max_(DISPATCH_LEVEL)
+CODE_SEG("PAGE")
 VOID
 IsaHwWakeDevice(
     _In_ PISAPNP_LOGICAL_DEVICE LogicalDevice);
 
-_IRQL_requires_max_(DISPATCH_LEVEL)
+CODE_SEG("PAGE")
 VOID
 IsaHwDeactivateDevice(
     _In_ PISAPNP_LOGICAL_DEVICE LogicalDevice);
 
-_IRQL_requires_max_(DISPATCH_LEVEL)
+CODE_SEG("PAGE")
 VOID
 IsaHwActivateDevice(
     _In_ PISAPNP_FDO_EXTENSION FdoExt,
     _In_ PISAPNP_LOGICAL_DEVICE LogicalDevice);
 
-_IRQL_requires_max_(DISPATCH_LEVEL)
+CODE_SEG("PAGE")
 VOID
 IsaHwWaitForKey(VOID);
 

Reply via email to