Sync with trunk (r48123)
[reactos.git] / drivers / bus / pcix / arb / tr_irq.c
index 7d27173..c19bf4d 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * PROJECT:         ReactOS PCI Bus Driver
  * LICENSE:         BSD - See COPYING.ARM in the top level directory
- * FILE:            drivers/bus/pci/arb/tr_irq.c
- * PURPOSE:         IRQ Resource Translation
+ * FILE:            drivers/bus/pci/intrface/tr_irq.c
+ * PURPOSE:         IRQ Translator Interface
  * PROGRAMMERS:     ReactOS Portable Systems Group
  */
 
 
 /* GLOBALS ********************************************************************/
 
+PCI_INTERFACE TranslatorInterfaceInterrupt =
+{
+    &GUID_TRANSLATOR_INTERFACE_STANDARD,
+    sizeof(TRANSLATOR_INTERFACE),
+    0,
+    0,
+    PCI_INTERFACE_FDO,
+    0,
+    PciTrans_Interrupt,
+    tranirq_Constructor,
+    tranirq_Initializer
+};
+
 /* FUNCTIONS ******************************************************************/
 
+NTSTATUS
+NTAPI
+tranirq_Initializer(IN PVOID Instance)
+{
+    /* PnP Interfaces don't get Initialized */
+    ASSERTMSG(FALSE, "PCI tranirq_Initializer, unexpected call.");
+    return STATUS_UNSUCCESSFUL;
+}
+
+NTSTATUS
+NTAPI
+tranirq_Constructor(IN PVOID DeviceExtension,
+                    IN PVOID Instance,
+                    IN PVOID InterfaceData,
+                    IN USHORT Version,
+                    IN USHORT Size,
+                    IN PINTERFACE Interface)
+{
+    PPCI_FDO_EXTENSION FdoExtension = (PPCI_FDO_EXTENSION)DeviceExtension;
+    ULONG BaseBus, ParentBus;
+    INTERFACE_TYPE ParentInterface;
+    ASSERT_FDO(FdoExtension);
+
+    /* Make sure it's the right resource type */
+    if ((ULONG)InterfaceData != CmResourceTypeInterrupt)
+    {
+        /* Fail this invalid request */
+        DPRINT1("PCI - IRQ trans constructor doesn't like %x in InterfaceSpecificData\n",
+                InterfaceData);
+        return STATUS_INVALID_PARAMETER_3;
+    }
+
+    /* Get the bus, and use this as the interface-specific data */
+    BaseBus = FdoExtension->BaseBus;
+    InterfaceData = (PVOID)BaseBus;
+
+    /* Check if this is the root bus */
+    if (PCI_IS_ROOT_FDO(FdoExtension))
+    {
+        /* It is, so there is no parent, and it's connected on the system bus */
+        ParentBus = 0;
+        ParentInterface = Internal;
+        DPRINT1("      Is root FDO\n");
+    }
+    else
+    {
+        /* It's not, so we have to get the root bus' bus number instead */
+        #if 0 // when have PDO commit
+        ParentBus = FdoExtension->PhysicalDeviceObject->DeviceExtension->ParentFdoExtension->BaseBus;
+        ParentInterface = PCIBus;
+        DPRINT1("      Is bridge FDO, parent bus %x, secondary bus %x\n",
+                ParentBus, BaseBus);
+        #endif
+    }
+
+    /* Now call the legacy HAL interface to get the correct translator */
+    return HalGetInterruptTranslator(ParentInterface,
+                                     ParentBus,
+                                     PCIBus,
+                                     sizeof(TRANSLATOR_INTERFACE),
+                                     0,
+                                     (PTRANSLATOR_INTERFACE)Interface,
+                                     (PULONG)&InterfaceData);
+}
+
 /* EOF */