Report current bus number during IRP_MN_QUERY_RESOURCES
Child bus number is in u.type1.SecondaryBus field, not
u.type1.SubordinateBus
Modified: trunk/reactos/drivers/bus/pci/pdo.c
_____
Modified: trunk/reactos/drivers/bus/pci/pdo.c
--- trunk/reactos/drivers/bus/pci/pdo.c 2006-01-02 11:37:00 UTC (rev
20527)
+++ trunk/reactos/drivers/bus/pci/pdo.c 2006-01-02 11:39:15 UTC (rev
20528)
@@ -373,6 +373,7 @@
}
else if (PCI_CONFIGURATION_TYPE(&PciConfig) ==
PCI_CARDBUS_BRIDGE_TYPE)
{
+ /* FIXME: Count Cardbus bridge resources */
}
else
{
@@ -386,11 +387,8 @@
}
/* Calculate the resource list size */
- ListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST);
- if (ResCount > 1)
- {
- ListSize += ((ResCount - 1) * sizeof(IO_RESOURCE_DESCRIPTOR));
- }
+ ListSize = FIELD_OFFSET(IO_RESOURCE_REQUIREMENTS_LIST,
List->Descriptors)
+ + ResCount * sizeof(IO_RESOURCE_DESCRIPTOR);
DPRINT("ListSize %lu (0x%lx)\n", ListSize, ListSize);
@@ -403,6 +401,7 @@
return STATUS_INSUFFICIENT_RESOURCES;
}
+ RtlZeroMemory(ResourceList, ListSize);
ResourceList->ListSize = ListSize;
ResourceList->InterfaceType = PCIBus;
ResourceList->BusNumber = DeviceExtension->PciDevice->BusNumber;
@@ -584,11 +583,10 @@
{
Descriptor->Option = 0; /* Required */
Descriptor->Type = CmResourceTypeBusNumber;
- Descriptor->ShareDisposition = CmResourceShareShared;
- Descriptor->Flags = CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE;
+ Descriptor->ShareDisposition = CmResourceShareDeviceExclusive;
Descriptor->u.BusNumber.MinBusNumber =
- Descriptor->u.BusNumber.MaxBusNumber =
DeviceExtension->PciDevice->PciConfig.u.type1.SubordinateBus;
+ Descriptor->u.BusNumber.MaxBusNumber =
DeviceExtension->PciDevice->PciConfig.u.type1.SecondaryBus;
Descriptor->u.BusNumber.Length = 1;
Descriptor->u.BusNumber.Reserved = 0;
}
@@ -677,10 +675,12 @@
if (Length != 0)
ResCount++;
}
+ if (DeviceExtension->PciDevice->PciConfig.BaseClass ==
PCI_CLASS_BRIDGE_DEV)
+ ResCount++;
}
else if (PCI_CONFIGURATION_TYPE(&PciConfig) ==
PCI_CARDBUS_BRIDGE_TYPE)
{
-
+ /* FIXME: Count Cardbus bridge resources */
}
else
{
@@ -694,11 +694,8 @@
}
/* Calculate the resource list size */
- ListSize = sizeof(CM_RESOURCE_LIST);
- if (ResCount > 1)
- {
- ListSize += ((ResCount - 1) *
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
- }
+ ListSize = FIELD_OFFSET(CM_RESOURCE_LIST,
List->PartialResourceList.PartialDescriptors)
+ + ResCount * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
/* Allocate the resource list */
ResourceList = ExAllocatePool(PagedPool,
@@ -706,13 +703,14 @@
if (ResourceList == NULL)
return STATUS_INSUFFICIENT_RESOURCES;
+ RtlZeroMemory(ResourceList, ListSize);
ResourceList->Count = 1;
ResourceList->List[0].InterfaceType = PCIConfiguration;
ResourceList->List[0].BusNumber =
DeviceExtension->PciDevice->BusNumber;
PartialList = &ResourceList->List[0].PartialResourceList;
- PartialList->Version = 0;
- PartialList->Revision = 0;
+ PartialList->Version = 1;
+ PartialList->Revision = 1;
PartialList->Count = ResCount;
Descriptor = &PartialList->PartialDescriptors[0];
@@ -811,10 +809,19 @@
Descriptor++;
}
+ if (DeviceExtension->PciDevice->PciConfig.BaseClass ==
PCI_CLASS_BRIDGE_DEV)
+ {
+ Descriptor->Type = CmResourceTypeBusNumber;
+ Descriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+
+ Descriptor->u.BusNumber.Start =
DeviceExtension->PciDevice->PciConfig.u.type1.SecondaryBus;
+ Descriptor->u.BusNumber.Length = 1;
+ Descriptor->u.BusNumber.Reserved = 0;
+ }
}
else if (PCI_CONFIGURATION_TYPE(&PciConfig) ==
PCI_CARDBUS_BRIDGE_TYPE)
{
- /* FIXME: Cardbus */
+ /* FIXME: Add Cardbus bridge resources */
}
Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
Show replies by date