e27b9bae855f651cdcb206be90b063255974b99b
[reactos.git] / drivers / bus / pcix / intrface / routintf.c
1 /*
2 * PROJECT: ReactOS PCI Bus Driver
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: drivers/bus/pci/intrface/routinf.c
5 * PURPOSE: Routing Interface
6 * PROGRAMMERS: ReactOS Portable Systems Group
7 */
8
9 /* INCLUDES *******************************************************************/
10
11 #include <pci.h>
12
13 #define NDEBUG
14 #include <debug.h>
15
16 /* GLOBALS ********************************************************************/
17
18 PPCI_LEGACY_DEVICE PciLegacyDeviceHead;
19
20 PCI_INTERFACE PciRoutingInterface =
21 {
22 &GUID_INT_ROUTE_INTERFACE_STANDARD,
23 sizeof(INT_ROUTE_INTERFACE_STANDARD),
24 PCI_INT_ROUTE_INTRF_STANDARD_VER,
25 PCI_INT_ROUTE_INTRF_STANDARD_VER,
26 PCI_INTERFACE_FDO,
27 0,
28 PciInterface_IntRouteHandler,
29 routeintrf_Constructor,
30 routeintrf_Initializer
31 };
32
33 /* FUNCTIONS ******************************************************************/
34
35 NTSTATUS
36 NTAPI
37 routeintrf_Initializer(IN PVOID Instance)
38 {
39 UNREFERENCED_PARAMETER(Instance);
40 /* PnP Interfaces don't get Initialized */
41 ASSERTMSG("PCI routeintrf_Initializer, unexpected call.", FALSE);
42 return STATUS_UNSUCCESSFUL;
43 }
44
45 NTSTATUS
46 NTAPI
47 routeintrf_Constructor(IN PVOID DeviceExtension,
48 IN PVOID Instance,
49 IN PVOID InterfaceData,
50 IN USHORT Version,
51 IN USHORT Size,
52 IN PINTERFACE Interface)
53 {
54 UNREFERENCED_PARAMETER(DeviceExtension);
55 UNREFERENCED_PARAMETER(Instance);
56 UNREFERENCED_PARAMETER(InterfaceData);
57 UNREFERENCED_PARAMETER(Size);
58 UNREFERENCED_PARAMETER(Interface);
59
60 /* Only version 1 is supported */
61 if (Version != PCI_INT_ROUTE_INTRF_STANDARD_VER) return STATUS_NOINTERFACE;
62
63 /* Not yet implemented */
64 UNIMPLEMENTED_DBGBREAK();
65 return STATUS_NOT_IMPLEMENTED;
66 }
67
68 NTSTATUS
69 NTAPI
70 PciCacheLegacyDeviceRouting(IN PDEVICE_OBJECT DeviceObject,
71 IN ULONG BusNumber,
72 IN ULONG SlotNumber,
73 IN UCHAR InterruptLine,
74 IN UCHAR InterruptPin,
75 IN UCHAR BaseClass,
76 IN UCHAR SubClass,
77 IN PDEVICE_OBJECT PhysicalDeviceObject,
78 IN PPCI_PDO_EXTENSION PdoExtension,
79 OUT PDEVICE_OBJECT *pFoundDeviceObject)
80 {
81 PPCI_LEGACY_DEVICE *Link;
82 PPCI_LEGACY_DEVICE LegacyDevice;
83 PDEVICE_OBJECT FoundDeviceObject;
84 PAGED_CODE();
85
86 /* Scan current registered devices */
87 LegacyDevice = PciLegacyDeviceHead;
88 Link = &PciLegacyDeviceHead;
89 while (LegacyDevice)
90 {
91 /* Find a match */
92 if ((BusNumber == LegacyDevice->BusNumber) &&
93 (SlotNumber == LegacyDevice->SlotNumber))
94 {
95 /* We already know about this routing */
96 break;
97 }
98
99 /* We know about device already, but for a different location */
100 if (LegacyDevice->DeviceObject == DeviceObject)
101 {
102 /* Free the existing structure, move to the next one */
103 *Link = LegacyDevice->Next;
104 ExFreePoolWithTag(LegacyDevice, 0);
105 LegacyDevice = *Link;
106 }
107 else
108 {
109 /* Keep going */
110 Link = &LegacyDevice->Next;
111 LegacyDevice = LegacyDevice->Next;
112 }
113 }
114
115 /* Did we find a match? */
116 if (!LegacyDevice)
117 {
118 /* Allocate a new cache structure */
119 LegacyDevice = ExAllocatePoolWithTag(PagedPool,
120 sizeof(PCI_LEGACY_DEVICE),
121 'PciR');
122 if (!LegacyDevice) return STATUS_INSUFFICIENT_RESOURCES;
123
124 /* Save all the data in it */
125 RtlZeroMemory(LegacyDevice, sizeof(PCI_LEGACY_DEVICE));
126 LegacyDevice->BusNumber = BusNumber;
127 LegacyDevice->SlotNumber = SlotNumber;
128 LegacyDevice->InterruptLine = InterruptLine;
129 LegacyDevice->InterruptPin = InterruptPin;
130 LegacyDevice->BaseClass = BaseClass;
131 LegacyDevice->SubClass = SubClass;
132 LegacyDevice->PhysicalDeviceObject = PhysicalDeviceObject;
133 LegacyDevice->DeviceObject = DeviceObject;
134 LegacyDevice->PdoExtension = PdoExtension;
135
136 /* Link it in the list */
137 LegacyDevice->Next = PciLegacyDeviceHead;
138 PciLegacyDeviceHead = LegacyDevice;
139 }
140
141 /* Check if we found, or created, a matching caching structure */
142 FoundDeviceObject = LegacyDevice->DeviceObject;
143 if (FoundDeviceObject == DeviceObject)
144 {
145 /* Return the device object and success */
146 if (pFoundDeviceObject) *pFoundDeviceObject = DeviceObject;
147 return STATUS_SUCCESS;
148 }
149
150 /* Otherwise, this is a new device object for this location */
151 LegacyDevice->DeviceObject = DeviceObject;
152 if (pFoundDeviceObject) *pFoundDeviceObject = FoundDeviceObject;
153 return STATUS_SUCCESS;
154 }
155
156 /* EOF */