[ros-diffs] [fireball] 26212: - Fix ScsiPortGetDeviceBase() / ScsiPortSetDeviceBase().

fireball at svn.reactos.org fireball at svn.reactos.org
Fri Mar 30 21:24:12 CEST 2007


Author: fireball
Date: Fri Mar 30 23:24:11 2007
New Revision: 26212

URL: http://svn.reactos.org/svn/reactos?rev=26212&view=rev
Log:
- Fix ScsiPortGetDeviceBase() / ScsiPortSetDeviceBase().

Modified:
    trunk/reactos/drivers/storage/scsiport-new/scsiport.c
    trunk/reactos/drivers/storage/scsiport-new/scsiport_int.h

Modified: trunk/reactos/drivers/storage/scsiport-new/scsiport.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/scsiport-new/scsiport.c?rev=26212&r1=26211&r2=26212&view=diff
==============================================================================
--- trunk/reactos/drivers/storage/scsiport-new/scsiport.c (original)
+++ trunk/reactos/drivers/storage/scsiport-new/scsiport.c Fri Mar 30 23:24:11 2007
@@ -306,35 +306,45 @@
 ScsiPortFreeDeviceBase(IN PVOID HwDeviceExtension,
 		       IN PVOID MappedAddress)
 {
-  PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
-  PSCSI_PORT_DEVICE_BASE DeviceBase;
-  PLIST_ENTRY Entry;
-
-  //DPRINT("ScsiPortFreeDeviceBase() called\n");
-
-  DeviceExtension = CONTAINING_RECORD(HwDeviceExtension,
-				      SCSI_PORT_DEVICE_EXTENSION,
-				      MiniPortDeviceExtension);
-  if (IsListEmpty(&DeviceExtension->DeviceBaseListHead))
-    return;
-
-  Entry = DeviceExtension->DeviceBaseListHead.Flink;
-  while (Entry != &DeviceExtension->DeviceBaseListHead)
-    {
-      DeviceBase = CONTAINING_RECORD(Entry,
-				     SCSI_PORT_DEVICE_BASE,
-				     List);
-      if (DeviceBase->MappedAddress == MappedAddress)
-	{
-	  MmUnmapIoSpace(DeviceBase->MappedAddress,
-			 DeviceBase->NumberOfBytes);
-	  RemoveEntryList(Entry);
-	  ExFreePool(DeviceBase);
-
-	  return;
-	}
-
-      Entry = Entry->Flink;
+    PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
+    PMAPPED_ADDRESS NextMa, LastMa;
+
+    //DPRINT("ScsiPortFreeDeviceBase() called\n");
+
+    DeviceExtension = ((PSCSI_PORT_DEVICE_EXTENSION)HwDeviceExtension) - 1;
+
+    /* Initialize our pointers */
+    NextMa = DeviceExtension->MappedAddressList;
+    LastMa = NextMa;
+
+    while (NextMa)
+    {
+        if (NextMa->MappedAddress == MappedAddress)
+        {
+            /* Unmap it first */
+            MmUnmapIoSpace(MappedAddress, NextMa->NumberOfBytes);
+
+            /* Remove it from the list */
+            if (NextMa == DeviceExtension->MappedAddressList)
+            {
+                /* Remove the first entry */
+                DeviceExtension->MappedAddressList = NextMa->NextMappedAddress;
+            }
+            else
+            {
+                LastMa->NextMappedAddress = NextMa->NextMappedAddress;
+            }
+
+            /* Free the resources and quit */
+            ExFreePool(NextMa);
+
+            return;
+        }
+        else
+        {
+            LastMa = NextMa;
+            NextMa = NextMa->NextMappedAddress;
+        }
     }
 }
 
@@ -369,50 +379,51 @@
 		      IN ULONG NumberOfBytes,
 		      IN BOOLEAN InIoSpace)
 {
-  PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
-  PHYSICAL_ADDRESS TranslatedAddress;
-  PSCSI_PORT_DEVICE_BASE DeviceBase;
-  ULONG AddressSpace;
-  PVOID MappedAddress;
-
-  //DPRINT ("ScsiPortGetDeviceBase() called\n");
-
-  AddressSpace = (ULONG)InIoSpace;
-  if (HalTranslateBusAddress(BusType,
-			     SystemIoBusNumber,
-			     IoAddress,
-			     &AddressSpace,
-			     &TranslatedAddress) == FALSE)
-    return NULL;
-
-  /* i/o space */
-  if (AddressSpace != 0)
-    return((PVOID)TranslatedAddress.u.LowPart);
-
-  MappedAddress = MmMapIoSpace(TranslatedAddress,
-			       NumberOfBytes,
-			       FALSE);
-
-  DeviceBase = ExAllocatePool(NonPagedPool,
-			      sizeof(SCSI_PORT_DEVICE_BASE));
-  if (DeviceBase == NULL)
-    return(MappedAddress);
-
-  DeviceBase->MappedAddress = MappedAddress;
-  DeviceBase->NumberOfBytes = NumberOfBytes;
-  DeviceBase->IoAddress = IoAddress;
-  DeviceBase->SystemIoBusNumber = SystemIoBusNumber;
-
-  DeviceExtension = CONTAINING_RECORD(HwDeviceExtension,
-				      SCSI_PORT_DEVICE_EXTENSION,
-				      MiniPortDeviceExtension);
-
-  InsertHeadList(&DeviceExtension->DeviceBaseListHead,
-		 &DeviceBase->List);
-
-  return(MappedAddress);
-}
-
+    PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
+    PHYSICAL_ADDRESS TranslatedAddress;
+    PMAPPED_ADDRESS DeviceBase;
+    ULONG AddressSpace;
+    PVOID MappedAddress;
+
+    //DPRINT ("ScsiPortGetDeviceBase() called\n");
+
+    DeviceExtension = ((PSCSI_PORT_DEVICE_EXTENSION)HwDeviceExtension) - 1;
+
+    AddressSpace = (ULONG)InIoSpace;
+    if (HalTranslateBusAddress(BusType,
+                               SystemIoBusNumber,
+                               IoAddress,
+                               &AddressSpace,
+                               &TranslatedAddress) == FALSE)
+    {
+        return NULL;
+    }
+
+    /* i/o space */
+    if (AddressSpace != 0)
+        return((PVOID)TranslatedAddress.u.LowPart);
+
+    MappedAddress = MmMapIoSpace(TranslatedAddress,
+                                 NumberOfBytes,
+                                 FALSE);
+
+    DeviceBase = ExAllocatePool(NonPagedPool,
+                                sizeof(MAPPED_ADDRESS));
+
+    if (DeviceBase == NULL)
+        return MappedAddress;
+
+    DeviceBase->MappedAddress = MappedAddress;
+    DeviceBase->NumberOfBytes = NumberOfBytes;
+    DeviceBase->IoAddress = IoAddress;
+    DeviceBase->BusNumber = SystemIoBusNumber;
+
+    /* Link it to the Device Extension list */
+    DeviceBase->NextMappedAddress = DeviceExtension->MappedAddressList;
+    DeviceExtension->MappedAddressList = DeviceBase;
+
+    return MappedAddress;
+}
 
 /*
  * @implemented

Modified: trunk/reactos/drivers/storage/scsiport-new/scsiport_int.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/scsiport-new/scsiport_int.h?rev=26212&r1=26211&r2=26212&view=diff
==============================================================================
--- trunk/reactos/drivers/storage/scsiport-new/scsiport_int.h (original)
+++ trunk/reactos/drivers/storage/scsiport-new/scsiport_int.h Fri Mar 30 23:24:11 2007
@@ -216,7 +216,7 @@
   KTIMER MiniportTimer;
   KDPC MiniportTimerDpc;
 
-  LIST_ENTRY DeviceBaseListHead;
+  PMAPPED_ADDRESS MappedAddressList;
 
   ULONG LunExtensionSize;
   PSCSI_PORT_LUN_EXTENSION LunExtensionList[LUS_NUMBER];




More information about the Ros-diffs mailing list