Don't try to detect serial ports at known I/O addresses. They have to be
written in registry and enumerated by Root bus enumerator.
Get interrupt informations from AllocatedResourcesTranslated in
IRP_MN_START_DEVICE
Modified: trunk/reactos/drivers/dd/serial/legacy.c
Modified: trunk/reactos/drivers/dd/serial/pnp.c
Modified: trunk/reactos/drivers/dd/serial/serial.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-31 08:02:29 UTC
(rev 15694)
+++ trunk/reactos/drivers/dd/serial/legacy.c 2005-05-31 10:35:22 UTC
(rev 15695)
@@ -73,157 +73,3 @@
/* FIFO is only functional for 16550A+ */
return Uart16550A;
}
-
-static NTSTATUS
-DetectLegacyDevice(
- IN PDRIVER_OBJECT DriverObject,
- IN ULONG ComPortBase,
- IN ULONG Irq,
- IN PULONG pComPortNumber OPTIONAL)
-{
- 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;
- NTSTATUS Status;
-
- /* Create resource list */
- ResourceListSize = sizeof(CM_RESOURCE_LIST) +
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
- ResourceList =
(PCM_RESOURCE_LIST)ExAllocatePoolWithTag(PagedPool, ResourceListSize,
SERIAL_TAG);
- if (!ResourceList)
- return STATUS_INSUFFICIENT_RESOURCES;
- 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];
- 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];
- 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);
- ResourceDescriptorTranslated->u.Interrupt.Affinity =
ResourceDescriptor->u.Interrupt.Affinity;
-
- /* Report resource list */
- Status = IoReportResourceForDetection(
- DriverObject, ResourceList, ResourceListSize,
- NULL, NULL, 0,
- &ConflictDetected);
- if (Status == STATUS_CONFLICTING_ADDRESSES)
- {
- 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;
- }
-
- /* Test if port exists */
- UartType = SerialDetectUartType((PUCHAR)ComPortBase);
-
- /* Report device if detected... */
- if (UartType != UartUnknown)
- {
- Status = IoReportDetectedDevice(
- DriverObject,
- ResourceList->List[0].InterfaceType,
ResourceList->List[0].BusNumber, -1 /* unknown */,
- ResourceList, NULL,
- TRUE,
- &Pdo);
- if (NT_SUCCESS(Status))
- {
- Status = SerialAddDeviceInternal(DriverObject,
Pdo, UartType, pComPortNumber, &Fdo);
- if (NT_SUCCESS(Status))
- {
- Status = SerialPnpStartDevice(Fdo,
ResourceList, ResourceListTranslated);
- }
- }
- }
- else
- {
- /* Release resources */
- Status = IoReportResourceForDetection(
- DriverObject, NULL, 0,
- NULL, NULL, 0,
- &ConflictDetected);
- Status = STATUS_DEVICE_NOT_CONNECTED;
- }
- ExFreePoolWithTag(ResourceList, SERIAL_TAG);
- ExFreePoolWithTag(ResourceListTranslated, SERIAL_TAG);
- return Status;
-}
-
-NTSTATUS
-DetectLegacyDevices(
- IN PDRIVER_OBJECT DriverObject)
-{
- ULONG ComPortBase[] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 };
- ULONG Irq[] = { 4, 3, 4, 3 };
- ULONG ComPortNumber[] = { 1, 2, 3, 4 };
- ULONG i;
- NTSTATUS Status;
- NTSTATUS ReturnedStatus = STATUS_SUCCESS;
-
- for (i = 0; i < sizeof(ComPortBase)/sizeof(ComPortBase[0]); i++)
- {
- Status = DetectLegacyDevice(DriverObject,
ComPortBase[i], Irq[i], &ComPortNumber[i]);
- if (!NT_SUCCESS(Status) && Status !=
STATUS_DEVICE_NOT_CONNECTED)
- ReturnedStatus = Status;
- DPRINT("Serial: Legacy device at 0x%x (IRQ %lu): status
= 0x%08lx\n", ComPortBase[i], Irq[i], Status);
- }
-
- return ReturnedStatus;
-}
_____
Modified: trunk/reactos/drivers/dd/serial/pnp.c
--- trunk/reactos/drivers/dd/serial/pnp.c 2005-05-31 08:02:29 UTC
(rev 15694)
+++ trunk/reactos/drivers/dd/serial/pnp.c 2005-05-31 10:35:22 UTC
(rev 15695)
@@ -163,6 +163,7 @@
for (j = 0; j <
ResourceList->List[i].PartialResourceList.Count; j++)
{
PCM_PARTIAL_RESOURCE_DESCRIPTOR
PartialDescriptor =
&ResourceList->List[i].PartialResourceList.PartialDescriptors[j];
+ PCM_PARTIAL_RESOURCE_DESCRIPTOR
PartialDescriptorTranslated =
&ResourceListTranslated->List[i].PartialResourceList.PartialDescriptors[
j];
switch (PartialDescriptor->Type)
{
case CmResourceTypePort:
@@ -173,16 +174,14 @@
DeviceExtension->BaseAddress =
PartialDescriptor->u.Port.Start.u.LowPart;
break;
case CmResourceTypeInterrupt:
- if (Dirql != 0)
- return
STATUS_UNSUCCESSFUL;
- 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)
+ Dirql =
(KIRQL)PartialDescriptorTranslated->u.Interrupt.Level;
+ Vector =
PartialDescriptorTranslated->u.Interrupt.Vector;
+ Affinity =
PartialDescriptorTranslated->u.Interrupt.Affinity;
+ if
(PartialDescriptorTranslated->Flags & CM_RESOURCE_INTERRUPT_LATCHED)
InterruptMode = Latched;
else
InterruptMode =
LevelSensitive;
- ShareInterrupt =
(PartialDescriptor->ShareDisposition == CmResourceShareShared);
+ ShareInterrupt =
(PartialDescriptorTranslated->ShareDisposition ==
CmResourceShareShared);
break;
}
}
_____
Modified: trunk/reactos/drivers/dd/serial/serial.c
--- trunk/reactos/drivers/dd/serial/serial.c 2005-05-31 08:02:29 UTC
(rev 15694)
+++ trunk/reactos/drivers/dd/serial/serial.c 2005-05-31 10:35:22 UTC
(rev 15695)
@@ -42,5 +42,5 @@
DriverObject->MajorFunction[IRP_MJ_PNP] = SerialPnp;
DriverObject->MajorFunction[IRP_MJ_POWER] = SerialPower;
- return DetectLegacyDevices(DriverObject);
+ return STATUS_SUCCESS;
}
_____
Modified: trunk/reactos/drivers/dd/serial/serial.h
--- trunk/reactos/drivers/dd/serial/serial.h 2005-05-31 08:02:29 UTC
(rev 15694)
+++ trunk/reactos/drivers/dd/serial/serial.h 2005-05-31 10:35:22 UTC
(rev 15695)
@@ -274,10 +274,6 @@
SerialDetectUartType(
IN PUCHAR ComPortBase);
-NTSTATUS
-DetectLegacyDevices(
- IN PDRIVER_OBJECT DriverObject);
-
/************************************ misc.c */
NTSTATUS