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; }