Report current bus number during IRP_MN_QUERY_RESOURCES

Child bus number is in u.type1.SecondaryBus field, not u.type1.SubordinateBus

svn path=/trunk/; revision=20528
This commit is contained in:
Hervé Poussineau 2006-01-02 11:39:15 +00:00
parent c513265500
commit cebd9c6b25

View file

@ -373,6 +373,7 @@ PdoQueryResourceRequirements(
} }
else if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_CARDBUS_BRIDGE_TYPE) else if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_CARDBUS_BRIDGE_TYPE)
{ {
/* FIXME: Count Cardbus bridge resources */
} }
else else
{ {
@ -386,11 +387,8 @@ PdoQueryResourceRequirements(
} }
/* Calculate the resource list size */ /* Calculate the resource list size */
ListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST); ListSize = FIELD_OFFSET(IO_RESOURCE_REQUIREMENTS_LIST, List->Descriptors)
if (ResCount > 1) + ResCount * sizeof(IO_RESOURCE_DESCRIPTOR);
{
ListSize += ((ResCount - 1) * sizeof(IO_RESOURCE_DESCRIPTOR));
}
DPRINT("ListSize %lu (0x%lx)\n", ListSize, ListSize); DPRINT("ListSize %lu (0x%lx)\n", ListSize, ListSize);
@ -403,6 +401,7 @@ PdoQueryResourceRequirements(
return STATUS_INSUFFICIENT_RESOURCES; return STATUS_INSUFFICIENT_RESOURCES;
} }
RtlZeroMemory(ResourceList, ListSize);
ResourceList->ListSize = ListSize; ResourceList->ListSize = ListSize;
ResourceList->InterfaceType = PCIBus; ResourceList->InterfaceType = PCIBus;
ResourceList->BusNumber = DeviceExtension->PciDevice->BusNumber; ResourceList->BusNumber = DeviceExtension->PciDevice->BusNumber;
@ -584,11 +583,10 @@ PdoQueryResourceRequirements(
{ {
Descriptor->Option = 0; /* Required */ Descriptor->Option = 0; /* Required */
Descriptor->Type = CmResourceTypeBusNumber; Descriptor->Type = CmResourceTypeBusNumber;
Descriptor->ShareDisposition = CmResourceShareShared; Descriptor->ShareDisposition = CmResourceShareDeviceExclusive;
Descriptor->Flags = CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE;
Descriptor->u.BusNumber.MinBusNumber = 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.Length = 1;
Descriptor->u.BusNumber.Reserved = 0; Descriptor->u.BusNumber.Reserved = 0;
} }
@ -677,10 +675,12 @@ PdoQueryResources(
if (Length != 0) if (Length != 0)
ResCount++; ResCount++;
} }
if (DeviceExtension->PciDevice->PciConfig.BaseClass == PCI_CLASS_BRIDGE_DEV)
ResCount++;
} }
else if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_CARDBUS_BRIDGE_TYPE) else if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_CARDBUS_BRIDGE_TYPE)
{ {
/* FIXME: Count Cardbus bridge resources */
} }
else else
{ {
@ -694,11 +694,8 @@ PdoQueryResources(
} }
/* Calculate the resource list size */ /* Calculate the resource list size */
ListSize = sizeof(CM_RESOURCE_LIST); ListSize = FIELD_OFFSET(CM_RESOURCE_LIST, List->PartialResourceList.PartialDescriptors)
if (ResCount > 1) + ResCount * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
{
ListSize += ((ResCount - 1) * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
}
/* Allocate the resource list */ /* Allocate the resource list */
ResourceList = ExAllocatePool(PagedPool, ResourceList = ExAllocatePool(PagedPool,
@ -706,13 +703,14 @@ PdoQueryResources(
if (ResourceList == NULL) if (ResourceList == NULL)
return STATUS_INSUFFICIENT_RESOURCES; return STATUS_INSUFFICIENT_RESOURCES;
RtlZeroMemory(ResourceList, ListSize);
ResourceList->Count = 1; ResourceList->Count = 1;
ResourceList->List[0].InterfaceType = PCIConfiguration; ResourceList->List[0].InterfaceType = PCIConfiguration;
ResourceList->List[0].BusNumber = DeviceExtension->PciDevice->BusNumber; ResourceList->List[0].BusNumber = DeviceExtension->PciDevice->BusNumber;
PartialList = &ResourceList->List[0].PartialResourceList; PartialList = &ResourceList->List[0].PartialResourceList;
PartialList->Version = 0; PartialList->Version = 1;
PartialList->Revision = 0; PartialList->Revision = 1;
PartialList->Count = ResCount; PartialList->Count = ResCount;
Descriptor = &PartialList->PartialDescriptors[0]; Descriptor = &PartialList->PartialDescriptors[0];
@ -811,10 +809,19 @@ PdoQueryResources(
Descriptor++; 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) else if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_CARDBUS_BRIDGE_TYPE)
{ {
/* FIXME: Cardbus */ /* FIXME: Add Cardbus bridge resources */
} }
Irp->IoStatus.Information = (ULONG_PTR)ResourceList; Irp->IoStatus.Information = (ULONG_PTR)ResourceList;