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(