- Assign a proper InterfaceType to the resource descriptor. Fixes assert when using...
[reactos.git] / reactos / drivers / bus / pci / pdo.c
index 2477a00..1f04bb8 100644 (file)
@@ -7,11 +7,6 @@
  *      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
@@ -378,6 +373,7 @@ PdoQueryResourceRequirements(
   }
   else if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_CARDBUS_BRIDGE_TYPE)
   {
+    /* FIXME: Count Cardbus bridge resources */
   }
   else
   {
@@ -391,11 +387,8 @@ PdoQueryResourceRequirements(
   }
 
   /* 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);
 
@@ -408,6 +401,7 @@ PdoQueryResourceRequirements(
     return STATUS_INSUFFICIENT_RESOURCES;
   }
 
+  RtlZeroMemory(ResourceList, ListSize);
   ResourceList->ListSize = ListSize;
   ResourceList->InterfaceType = PCIBus;
   ResourceList->BusNumber = DeviceExtension->PciDevice->BusNumber;
@@ -589,11 +583,10 @@ PdoQueryResourceRequirements(
     {
       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;
     }
@@ -682,10 +675,12 @@ PdoQueryResources(
       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
   {
@@ -699,11 +694,8 @@ PdoQueryResources(
   }
 
   /* 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,
@@ -711,13 +703,14 @@ PdoQueryResources(
   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];
@@ -816,10 +809,19 @@ PdoQueryResources(
 
       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;
@@ -863,16 +865,14 @@ InterfaceBusTranslateBusAddress(
   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);
 }
 
@@ -1020,9 +1020,9 @@ CheckPciDevice(
   {
     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;
   }
@@ -1032,8 +1032,8 @@ CheckPciDevice(
     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;
   }
@@ -1127,9 +1127,6 @@ PdoQueryInterface(
       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;
@@ -1151,9 +1148,6 @@ PdoQueryInterface(
       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;
@@ -1170,6 +1164,9 @@ PdoQueryInterface(
     /* 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);
   }