Use translated resources list to get informations about interrupt Modified: trunk/reactos/drivers/dd/serial/legacy.c Modified: trunk/reactos/drivers/dd/serial/pnp.c Modified: trunk/reactos/drivers/dd/serial/serial.h _____
Modified: trunk/reactos/drivers/dd/serial/legacy.c --- trunk/reactos/drivers/dd/serial/legacy.c 2005-05-18 21:28:12 UTC (rev 15400) +++ trunk/reactos/drivers/dd/serial/legacy.c 2005-05-18 21:48:41 UTC (rev 15401) @@ -83,12 +83,13 @@
{ ULONG ResourceListSize; PCM_RESOURCE_LIST ResourceList; + PCM_RESOURCE_LIST ResourceListTranslated; PCM_PARTIAL_RESOURCE_DESCRIPTOR ResourceDescriptor; + PCM_PARTIAL_RESOURCE_DESCRIPTOR ResourceDescriptorTranslated; BOOLEAN ConflictDetected; UART_TYPE UartType; PDEVICE_OBJECT Pdo = NULL; PDEVICE_OBJECT Fdo; - KIRQL Dirql; NTSTATUS Status;
/* Create resource list */ @@ -96,29 +97,60 @@ ResourceList = (PCM_RESOURCE_LIST)ExAllocatePoolWithTag(PagedPool, ResourceListSize, SERIAL_TAG); if (!ResourceList) return STATUS_INSUFFICIENT_RESOURCES; - ResourceList->Count = 1; - ResourceList->List[0].InterfaceType = InterfaceTypeUndefined; - ResourceList->List[0].BusNumber = -1; /* unknown */ - ResourceList->List[0].PartialResourceList.Version = 1; - ResourceList->List[0].PartialResourceList.Revision = 1; - ResourceList->List[0].PartialResourceList.Count = 2; + ResourceListTranslated = (PCM_RESOURCE_LIST)ExAllocatePoolWithTag(PagedPool, ResourceListSize, SERIAL_TAG); + if (!ResourceListTranslated) + { + ExFreePoolWithTag(ResourceList, SERIAL_TAG); + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* Resource header */ + ResourceList->Count = ResourceListTranslated->Count + = 1; + ResourceList->List[0].InterfaceType = ResourceListTranslated->List[0].InterfaceType + = InterfaceTypeUndefined; + ResourceList->List[0].BusNumber = ResourceListTranslated->List[0].BusNumber + = -1; /* unknown */ + ResourceList->List[0].PartialResourceList.Version = ResourceListTranslated->List[0].PartialResourceList.Version + = 1; + ResourceList->List[0].PartialResourceList.Revision = ResourceListTranslated->List[0].PartialResourceList.Revision + = 1; + ResourceList->List[0].PartialResourceList.Count = ResourceListTranslated->List[0].PartialResourceList.Count + = 2; + + /* I/O port */ ResourceDescriptor = &ResourceList->List[0].PartialResourceList.PartialDescriptors[0]; - ResourceDescriptor->Type = CmResourceTypePort; - ResourceDescriptor->ShareDisposition = CmResourceShareDriverExclusive; - ResourceDescriptor->Flags = CM_RESOURCE_PORT_IO; - ResourceDescriptor->u.Port.Start.u.HighPart = 0; - ResourceDescriptor->u.Port.Start.u.LowPart = ComPortBase; - ResourceDescriptor->u.Port.Length = 8; + ResourceDescriptorTranslated = &ResourceListTranslated->List[0].PartialResourceList.PartialDescriptors[ 0]; + ResourceDescriptor->Type = ResourceDescriptorTranslated->Type + = CmResourceTypePort; + ResourceDescriptor->ShareDisposition = ResourceDescriptorTranslated->ShareDisposition + = CmResourceShareDriverExclusive; + ResourceDescriptor->Flags = ResourceDescriptorTranslated->Flags + = CM_RESOURCE_PORT_IO; + ResourceDescriptor->u.Port.Start.u.HighPart = ResourceDescriptorTranslated->u.Port.Start.u.HighPart + = 0; + ResourceDescriptor->u.Port.Start.u.LowPart = ResourceDescriptorTranslated->u.Port.Start.u.LowPart + = ComPortBase; + ResourceDescriptor->u.Port.Length = ResourceDescriptorTranslated->u.Port.Length + = 8;
ResourceDescriptor = &ResourceList->List[0].PartialResourceList.PartialDescriptors[1]; - ResourceDescriptor->Type = CmResourceTypeInterrupt; - ResourceDescriptor->ShareDisposition = CmResourceShareShared; - ResourceDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED; - ResourceDescriptor->u.Interrupt.Vector = HalGetInterruptVector( - Internal, 0, 0, Irq, - &Dirql, + ResourceDescriptorTranslated = &ResourceListTranslated->List[0].PartialResourceList.PartialDescriptors[ 1]; + ResourceDescriptor->Type = ResourceDescriptorTranslated->Type + = CmResourceTypeInterrupt; + ResourceDescriptor->ShareDisposition = ResourceDescriptorTranslated->ShareDisposition + = CmResourceShareShared; + ResourceDescriptor->Flags = ResourceDescriptorTranslated->Flags + = CM_RESOURCE_INTERRUPT_LATCHED; + ResourceDescriptor->u.Interrupt.Level = Irq; + ResourceDescriptorTranslated->u.Interrupt.Vector = HalGetInterruptVector( + ResourceList->List[0].InterfaceType, + ResourceList->List[0].BusNumber, + ResourceDescriptor->u.Interrupt.Level, + ResourceDescriptor->u.Interrupt.Vector, + (PKIRQL)&ResourceDescriptorTranslated->u.Interrupt.Level, &ResourceDescriptor->u.Interrupt.Affinity); - ResourceDescriptor->u.Interrupt.Level = (ULONG)Dirql; + ResourceDescriptorTranslated->u.Interrupt.Affinity = ResourceDescriptor->u.Interrupt.Affinity;
/* Report resource list */ Status = IoReportResourceForDetection( @@ -129,11 +161,13 @@ { DPRINT("Serial: conflict detected for serial port at 0x%lx (Irq %lu)\n", ComPortBase, Irq); ExFreePoolWithTag(ResourceList, SERIAL_TAG); + ExFreePoolWithTag(ResourceListTranslated, SERIAL_TAG); return STATUS_DEVICE_NOT_CONNECTED; } if (!NT_SUCCESS(Status)) { ExFreePoolWithTag(ResourceList, SERIAL_TAG); + ExFreePoolWithTag(ResourceListTranslated, SERIAL_TAG); return Status; }
@@ -154,7 +188,7 @@ Status = SerialAddDeviceInternal(DriverObject, Pdo, UartType, pComPortNumber, &Fdo); if (NT_SUCCESS(Status)) { - Status = SerialPnpStartDevice(Fdo, ResourceList); + Status = SerialPnpStartDevice(Fdo, ResourceList, ResourceListTranslated); } } } @@ -168,6 +202,7 @@ Status = STATUS_DEVICE_NOT_CONNECTED; } ExFreePoolWithTag(ResourceList, SERIAL_TAG); + ExFreePoolWithTag(ResourceListTranslated, SERIAL_TAG); return Status; }
_____
Modified: trunk/reactos/drivers/dd/serial/pnp.c --- trunk/reactos/drivers/dd/serial/pnp.c 2005-05-18 21:28:12 UTC (rev 15400) +++ trunk/reactos/drivers/dd/serial/pnp.c 2005-05-18 21:48:41 UTC (rev 15401) @@ -126,7 +126,8 @@
NTSTATUS STDCALL SerialPnpStartDevice( IN PDEVICE_OBJECT DeviceObject, - IN PCM_RESOURCE_LIST ResourceList) + IN PCM_RESOURCE_LIST ResourceList, + IN PCM_RESOURCE_LIST ResourceListTranslated) { PSERIAL_DEVICE_EXTENSION DeviceExtension; WCHAR DeviceNameBuffer[32]; @@ -174,8 +175,8 @@ case CmResourceTypeInterrupt: if (Dirql != 0) return STATUS_UNSUCCESSFUL; - Dirql = (KIRQL)PartialDescriptor->u.Interrupt.Level; - Vector = PartialDescriptor->u.Interrupt.Vector; + Dirql = (KIRQL)ResourceListTranslated->List[i].PartialResourceList.PartialDescri ptors[j].u.Interrupt.Level; + Vector = ResourceListTranslated->List[i].PartialResourceList.PartialDescriptors[j ].u.Interrupt.Vector; Affinity = PartialDescriptor->u.Interrupt.Affinity; if (PartialDescriptor->Flags & CM_RESOURCE_INTERRUPT_LATCHED) InterruptMode = Latched; @@ -338,16 +339,9 @@ BOOLEAN ConflictDetected; DPRINT("Serial: IRP_MJ_PNP / IRP_MN_START_DEVICE\n");
- /* FIXME: first HACK: PnP manager can send multiple - * IRP_MN_START_DEVICE for one device - */ - if (((PSERIAL_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->PnpState != dsStopped) - { - DPRINT1("Serial: device already started. Ignoring this irp!\n"); - Status = STATUS_SUCCESS; - break; - } - /* FIXME: second HACK: verify that we have some allocated resources. + ASSERT(((PSERIAL_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->PnpSta te == dsStopped); + + /* FIXME: HACK: verify that we have some allocated resources. * It seems not to be always the case on some hardware */ if (Stack->Parameters.StartDevice.AllocatedResources == NULL) @@ -357,7 +351,7 @@ Status = STATUS_INSUFFICIENT_RESOURCES; break; } - /* FIXME: third HACK: verify that we don't have resource conflict, + /* FIXME: HACK: verify that we don't have resource conflict, * because PnP manager doesn't do it automatically */ Status = IoReportResourceForDetection( @@ -377,7 +371,8 @@ if (NT_SUCCESS(Status)) Status = SerialPnpStartDevice( DeviceObject, - Stack->Parameters.StartDevice.AllocatedResources); + Stack->Parameters.StartDevice.AllocatedResources, + Stack->Parameters.StartDevice.AllocatedResourcesTranslated); break; } case IRP_MN_QUERY_DEVICE_RELATIONS: /* (optional) 0x7 */ _____
Modified: trunk/reactos/drivers/dd/serial/serial.h --- trunk/reactos/drivers/dd/serial/serial.h 2005-05-18 21:28:12 UTC (rev 15400) +++ trunk/reactos/drivers/dd/serial/serial.h 2005-05-18 21:48:41 UTC (rev 15401) @@ -327,7 +327,8 @@
NTSTATUS STDCALL SerialPnpStartDevice( IN PDEVICE_OBJECT DeviceObject, - IN PCM_RESOURCE_LIST ResourceList); + IN PCM_RESOURCE_LIST ResourceList, + IN PCM_RESOURCE_LIST ResourceListTranslated);
NTSTATUS STDCALL SerialPnp(