IopAssignDeviceResources():
Fix translated resource list for I/O ports and memory ranges
Fix raw resource list for interrupts
Modified: trunk/reactos/ntoskrnl/io/pnpmgr.c

Modified: trunk/reactos/ntoskrnl/io/pnpmgr.c
--- trunk/reactos/ntoskrnl/io/pnpmgr.c	2005-05-20 02:21:53 UTC (rev 15423)
+++ trunk/reactos/ntoskrnl/io/pnpmgr.c	2005-05-20 02:37:51 UTC (rev 15424)
@@ -908,6 +908,7 @@
    PCM_PARTIAL_RESOURCE_DESCRIPTOR DescriptorRaw, DescriptorTranslated;
    ULONG NumberOfResources = 0;
    ULONG i;
+   NTSTATUS Status;
    
    /* Fill DeviceNode->ResourceList and DeviceNode->ResourceListTranslated;
     * by using DeviceNode->ResourceRequirements */
@@ -923,19 +924,25 @@
    /* Actually, simply use resource list #0 as assigned resource list */
    ResourceList = &DeviceNode->ResourceRequirements->List[0];
    if (ResourceList->Version != 1 || ResourceList->Revision != 1)
-      return STATUS_REVISION_MISMATCH;
+   {
+      Status = STATUS_REVISION_MISMATCH;
+      goto ByeBye;
+   }
    
    DeviceNode->ResourceList = ExAllocatePool(PagedPool, 
       sizeof(CM_RESOURCE_LIST) + ResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
    if (!DeviceNode->ResourceList)
-      return STATUS_INSUFFICIENT_RESOURCES;
+   {
+      Status = STATUS_INSUFFICIENT_RESOURCES;
+      goto ByeBye;
+   }
    
    DeviceNode->ResourceListTranslated = ExAllocatePool(PagedPool, 
       sizeof(CM_RESOURCE_LIST) + ResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
    if (!DeviceNode->ResourceListTranslated)
    {
-      ExFreePool(DeviceNode->ResourceList);
-      return STATUS_INSUFFICIENT_RESOURCES;
+      Status = STATUS_INSUFFICIENT_RESOURCES;
+      goto ByeBye;
    }
    
    DeviceNode->ResourceList->Count = 1;
@@ -968,22 +975,32 @@
          {
             case CmResourceTypePort:
             {
+               ULONG AddressSpace = 0; /* IO space */
                DescriptorRaw->u.Port.Start = ResourceDescriptor->u.Port.MinimumAddress;
                DescriptorRaw->u.Port.Length = DescriptorTranslated->u.Port.Length
                   = ResourceDescriptor->u.Port.Length;
-               /*FIXME: DescriptorTranslated->u.Port.Start? */
+               if (!HalTranslateBusAddress(
+                  DeviceNode->ResourceRequirements->InterfaceType,
+                  DeviceNode->ResourceRequirements->BusNumber,
+                  DescriptorRaw->u.Port.Start,
+                  &AddressSpace,
+                  &DescriptorTranslated->u.Port.Start))
+               {
+                  Status = STATUS_UNSUCCESSFUL;
+                  goto ByeBye;
+               }
                break;
             }
             case CmResourceTypeInterrupt:
             {
-               DescriptorRaw->u.Interrupt.Vector = 0;
+               DescriptorRaw->u.Interrupt.Level = 0;
                /* FIXME: if IRQ 9 is in the possible range, use it.
                 * This should be a PCI device */
                if (ResourceDescriptor->u.Interrupt.MinimumVector <= 9
                   && ResourceDescriptor->u.Interrupt.MaximumVector >= 9)
-                  DescriptorRaw->u.Interrupt.Level = 9;
+                  DescriptorRaw->u.Interrupt.Vector = 9;
                else
-                  DescriptorRaw->u.Interrupt.Level = ResourceDescriptor->u.Interrupt.MinimumVector;
+                  DescriptorRaw->u.Interrupt.Vector = ResourceDescriptor->u.Interrupt.MinimumVector;
                
                DescriptorTranslated->u.Interrupt.Vector = HalGetInterruptVector(
                   DeviceNode->ResourceRequirements->InterfaceType,
@@ -997,15 +1014,24 @@
             }
             case CmResourceTypeMemory:
             {
+               ULONG AddressSpace = 1; /* Memory space */
                DescriptorRaw->u.Memory.Start = ResourceDescriptor->u.Memory.MinimumAddress;
                DescriptorRaw->u.Memory.Length = DescriptorTranslated->u.Memory.Length
-                  = ResourceDescriptor->u.Port.Length;
-               /*FIXME: DescriptorTranslated->u.Memory.Start? */
+                  = ResourceDescriptor->u.Memory.Length;
+               if (!HalTranslateBusAddress(
+                  DeviceNode->ResourceRequirements->InterfaceType,
+                  DeviceNode->ResourceRequirements->BusNumber,
+                  DescriptorRaw->u.Memory.Start,
+                  &AddressSpace,
+                  &DescriptorTranslated->u.Memory.Start))
+               {
+                  Status = STATUS_UNSUCCESSFUL;
+                  goto ByeBye;
+               }
                break;
             }
             case CmResourceTypeDma:
             {
-               DPRINT1("IopAssignDeviceResources(): CmResourceTypeDma case not implemented\n");
                DescriptorRaw->u.Dma.Channel = DescriptorTranslated->u.Dma.Channel
                   = ResourceDescriptor->u.Dma.MinimumChannel;
                DescriptorRaw->u.Dma.Port = DescriptorTranslated->u.Dma.Port
@@ -1050,6 +1076,20 @@
    DeviceNode->ResourceListTranslated->List[0].PartialResourceList.Count = NumberOfResources;
    
    return STATUS_SUCCESS;
+
+ByeBye:
+   if (DeviceNode->ResourceList)
+   {
+      ExFreePool(DeviceNode->ResourceList);
+      DeviceNode->ResourceList = NULL;
+   }
+   if (DeviceNode->ResourceListTranslated)
+   {
+      ExFreePool(DeviceNode->ResourceListTranslated);
+      DeviceNode->ResourceListTranslated = NULL;
+   }
+
+   return Status;
 }