* 10-09-2001 CSH Created
*/
-#include <ddk/ntddk.h>
-#include <ddk/ntifs.h>
-#include <initguid.h>
-#include <ddk/wdmguid.h>
-#include "pcidef.h"
#include "pci.h"
#define NDEBUG
}
else if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_CARDBUS_BRIDGE_TYPE)
{
+ /* FIXME: Count Cardbus bridge resources */
}
else
{
}
/* 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);
return STATUS_INSUFFICIENT_RESOURCES;
}
+ RtlZeroMemory(ResourceList, ListSize);
ResourceList->ListSize = ListSize;
ResourceList->InterfaceType = PCIBus;
ResourceList->BusNumber = DeviceExtension->PciDevice->BusNumber;
{
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;
}
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
{
}
/* 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,
if (ResourceList == NULL)
return STATUS_INSUFFICIENT_RESOURCES;
+ RtlZeroMemory(ResourceList, ListSize);
ResourceList->Count = 1;
- ResourceList->List[0].InterfaceType = PCIConfiguration;
+ ResourceList->List[0].InterfaceType = PCIBus;
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];
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;
OUT PPHYSICAL_ADDRESS TranslatedAddress)
{
PPDO_DEVICE_EXTENSION DeviceExtension;
- PFDO_DEVICE_EXTENSION FdoDeviceExtension;
DPRINT("InterfaceBusTranslateBusAddress(%p %p 0x%lx %p %p)\n",
Context, BusAddress, Length, AddressSpace, TranslatedAddress);
DeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)Context)->DeviceExtension;
- FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceExtension->Fdo->DeviceExtension;
return HalTranslateBusAddress(
- PCIBus, FdoDeviceExtension->BusNumber,
+ PCIBus, DeviceExtension->PciDevice->BusNumber,
BusAddress, AddressSpace, TranslatedAddress);
}
{
return FALSE;
}
- if ((Parameters->Flags && PCI_USE_CLASS_SUBCLASS) && (
- PciConfig->u.type0.SubVendorID != Parameters->SubVendorID ||
- PciConfig->u.type0.SubSystemID != Parameters->SubSystemID))
+ if ((Parameters->Flags & PCI_USE_CLASS_SUBCLASS) && (
+ PciConfig->BaseClass != Parameters->BaseClass ||
+ PciConfig->SubClass != Parameters->SubClass))
{
return FALSE;
}
return FALSE;
}
if ((Parameters->Flags & PCI_USE_SUBSYSTEM_IDS) && (
- PciConfig->Command != Parameters->SubVendorID ||
- PciConfig->Status != Parameters->SubSystemID))
+ PciConfig->u.type0.SubVendorID != Parameters->SubVendorID ||
+ PciConfig->u.type0.SubSystemID != Parameters->SubSystemID))
{
return FALSE;
}
BusInterface = (PBUS_INTERFACE_STANDARD)IrpSp->Parameters.QueryInterface.Interface;
BusInterface->Size = sizeof(BUS_INTERFACE_STANDARD);
BusInterface->Version = 1;
- BusInterface->Context = DeviceObject;
- BusInterface->InterfaceReference = InterfaceReference;
- BusInterface->InterfaceDereference = InterfaceDereference;
BusInterface->TranslateBusAddress = InterfaceBusTranslateBusAddress;
BusInterface->GetDmaAdapter = InterfaceBusGetDmaAdapter;
BusInterface->SetBusData = InterfaceBusSetBusData;
PciDevicePresentInterface = (PPCI_DEVICE_PRESENT_INTERFACE)IrpSp->Parameters.QueryInterface.Interface;
PciDevicePresentInterface->Size = sizeof(PCI_DEVICE_PRESENT_INTERFACE);
PciDevicePresentInterface->Version = 1;
- PciDevicePresentInterface->Context = DeviceObject;
- PciDevicePresentInterface->InterfaceReference = InterfaceReference;
- PciDevicePresentInterface->InterfaceDereference = InterfaceDereference;
PciDevicePresentInterface->IsDevicePresent = InterfacePciDevicePresent;
PciDevicePresentInterface->IsDevicePresentEx = InterfacePciDevicePresentEx;
Status = STATUS_SUCCESS;
/* Add a reference for the returned interface */
PINTERFACE Interface;
Interface = (PINTERFACE)IrpSp->Parameters.QueryInterface.Interface;
+ Interface->Context = DeviceObject;
+ Interface->InterfaceReference = InterfaceReference;
+ Interface->InterfaceDereference = InterfaceDereference;
Interface->InterfaceReference(Interface->Context);
}