[HAL]: Implement Bus Handler support for HalGetInterruptVector too. The new functiona...
authorSir Richard <sir_richard@svn.reactos.org>
Mon, 7 Jun 2010 20:39:11 +0000 (20:39 +0000)
committerSir Richard <sir_richard@svn.reactos.org>
Mon, 7 Jun 2010 20:39:11 +0000 (20:39 +0000)
svn path=/trunk/; revision=47676

reactos/hal/halx86/generic/legacy/bussupp.c

index 1e5037f..af88221 100644 (file)
@@ -1163,10 +1163,10 @@ HalpTranslateBusAddress(IN INTERFACE_TYPE InterfaceType,
 ULONG
 NTAPI
 HalpGetSystemInterruptVector_Acpi(IN ULONG BusNumber,
-                                 IN ULONG BusInterruptLevel,
-                                 IN ULONG BusInterruptVector,
-                                 OUT PKIRQL Irql,
-                                 OUT PKAFFINITY Affinity)
+                                  IN ULONG BusInterruptLevel,
+                                  IN ULONG BusInterruptVector,
+                                  OUT PKIRQL Irql,
+                                  OUT PKAFFINITY Affinity)
 {
     ULONG Vector = IRQ2VECTOR(BusInterruptLevel);
     *Irql = (KIRQL)VECTOR2IRQL(Vector);
@@ -1314,12 +1314,38 @@ HalGetInterruptVector(IN INTERFACE_TYPE InterfaceType,
                       OUT PKIRQL Irql,
                       OUT PKAFFINITY Affinity)
 {
-    /* Call the system bus translator */
-    return HalpGetSystemInterruptVector_Acpi(BusNumber,
-                                             BusInterruptLevel,
-                                             BusInterruptVector,
-                                             Irql,
-                                             Affinity);
+    PBUS_HANDLER Handler;
+    ULONG Vector;
+    PAGED_CODE();
+    
+    /* Defaults */
+    *Irql = 0;
+    *Affinity = 0;
+    
+    /* Find the handler */
+    Handler = HalReferenceHandlerForBus(InterfaceType, BusNumber);
+    if (!Handler) return 0;
+    
+    /* Do the assignment */
+    Vector = Handler->GetInterruptVector(Handler,
+                                         Handler,
+                                         BusInterruptLevel,
+                                         BusInterruptVector,
+                                         Irql,
+                                         Affinity);
+    if ((Vector != IRQ2VECTOR(BusInterruptLevel)) ||
+        (*Irql != VECTOR2IRQL(IRQ2VECTOR(BusInterruptLevel))))
+    {
+        DPRINT1("Returning IRQL %lx, Vector %lx for Level/Vector: %lx/%lx\n",
+                *Irql, Vector, BusInterruptLevel, BusInterruptVector);
+        DPRINT1("Old HAL would've returned IRQL %lx and Vector %lx\n",
+                VECTOR2IRQL(IRQ2VECTOR(BusInterruptLevel)),
+                IRQ2VECTOR(BusInterruptLevel));
+    }
+    
+    /* Dereference the handler and return */
+    HalDereferenceBusHandler(Handler);
+    return Vector;
 }
 
 /*