[HAL]: Use Bus Handler support for HalFindBusAddressTranslation. Implement HalpContex...
[reactos.git] / reactos / hal / halx86 / generic / legacy / bus / bushndlr.c
index 6186d54..2ab551c 100644 (file)
@@ -201,6 +201,41 @@ HaliReferenceHandlerForConfigSpace(IN BUS_DATA_TYPE ConfigType,
     return HalpLookupHandler(HalpConfigTable, ConfigType, BusNumber, TRUE);
 }
 
+PBUS_HANDLER
+NTAPI
+HalpContextToBusHandler(IN ULONG_PTR ContextValue)
+{
+    PLIST_ENTRY NextEntry;
+    PHAL_BUS_HANDLER BusHandler, ThisHandler;
+    
+    /* Start lookup */
+    NextEntry = HalpAllBusHandlers.Flink;
+    ThisHandler = CONTAINING_RECORD(NextEntry, HAL_BUS_HANDLER, AllHandlers);
+    if (ContextValue)
+    {
+        /* If the list is empty, quit */
+        if (IsListEmpty(&HalpAllBusHandlers)) return NULL;
+
+        /* Otherwise, scan the list */
+        BusHandler = CONTAINING_RECORD(ContextValue, HAL_BUS_HANDLER, Handler);
+        do
+        {
+            /* Check if we've reached the right one */
+            ThisHandler = CONTAINING_RECORD(NextEntry, HAL_BUS_HANDLER, AllHandlers);
+            if (ThisHandler == BusHandler) break;
+            
+            /* Try the next one */
+            NextEntry = NextEntry->Flink;
+        } while (NextEntry != &HalpAllBusHandlers);
+    }
+    
+    /* If we looped back to the end, we didn't find anything */
+    if (NextEntry == &HalpAllBusHandlers) return NULL;
+    
+    /* Otherwise return the handler */
+    return &ThisHandler->Handler;
+}
+
 #ifndef _MINIHAL_
 NTSTATUS
 NTAPI
@@ -215,13 +250,11 @@ HaliRegisterBusHandler(IN INTERFACE_TYPE InterfaceType,
 {
     PHAL_BUS_HANDLER Bus, OldHandler = NULL;
     PHAL_BUS_HANDLER* BusEntry;
-    PVOID CodeHandle;
+    //PVOID CodeHandle;
     PARRAY InterfaceArray, InterfaceBusNumberArray, ConfigArray, ConfigBusNumberArray;
     PBUS_HANDLER ParentHandler;
     KIRQL OldIrql;
     NTSTATUS Status;
-    DPRINT1("HAL BUS REGISTRATION: %d.%d on bus %d with parent %d on bus %d\n",
-            InterfaceType, ConfigType, BusNumber, ParentBusType, ParentBusNumber);
     
     /* Make sure we have a valid handler */
     ASSERT((InterfaceType != InterfaceTypeUndefined) ||
@@ -236,8 +269,8 @@ HaliRegisterBusHandler(IN INTERFACE_TYPE InterfaceType,
     /* Return the handler */
     *ReturnedBusHandler = &Bus->Handler;
     
-    /* Don't page us out */
-    CodeHandle = MmLockPagableDataSection(&HaliRegisterBusHandler);
+    /* FIXME: Fix the kernel first. Don't page us out */
+    //CodeHandle = MmLockPagableDataSection(&HaliRegisterBusHandler);
 
     /* Synchronize with anyone else */
     KeWaitForSingleObject(&HalpBusDatabaseEvent,
@@ -264,7 +297,7 @@ HaliRegisterBusHandler(IN INTERFACE_TYPE InterfaceType,
     ConfigBusNumberArray = HalpAllocateArray(BusNumber);
     
     /* Only proceed if all allocations succeeded */
-    if (InterfaceArray && InterfaceBusNumberArray && ConfigArray && ConfigBusNumberArray)
+    if ((InterfaceArray) && (InterfaceBusNumberArray) && (ConfigArray) && (ConfigBusNumberArray))
     {
         /* Find the parent handler if any */
         ParentHandler = HaliReferenceHandlerForBus(ParentBusType, ParentBusNumber);
@@ -367,8 +400,8 @@ HaliRegisterBusHandler(IN INTERFACE_TYPE InterfaceType,
     /* Signal the event */
     KeSetEvent(&HalpBusDatabaseEvent, 0, FALSE);
     
-    /* Re-page the function */
-    MmUnlockPagableImageSection(CodeHandle);
+    /* FIXME: Fix the kernel first. Re-page the function */
+    //MmUnlockPagableImageSection(CodeHandle);
 
     /* Free all allocations */
     if (Bus) ExFreePool(Bus);
@@ -378,7 +411,6 @@ HaliRegisterBusHandler(IN INTERFACE_TYPE InterfaceType,
     if (ConfigBusNumberArray) ExFreePool(ConfigBusNumberArray);
 
     /* And we're done */
-    DPRINT1("Bus handler has been registered: %p\n", *ReturnedBusHandler);
     return Status;
 }
 #endif
@@ -410,15 +442,8 @@ HalpInitBusHandler(VOID)
     HalDereferenceBusHandler = HaliDereferenceBusHandler;
 #endif
     HalPciAssignSlotResources = HalpAssignSlotResources;
-    /* FIXME: Fix later */
-#if 0
-    HalPciTranslateBusAddress = HaliTranslateBusAddress;
+    HalPciTranslateBusAddress = HaliTranslateBusAddress; /* PCI Driver can override */
     if (!HalFindBusAddressTranslation) HalFindBusAddressTranslation = HaliFindBusAddressTranslation;
-#else
-    /* These should be written by the PCI driver later, but we give defaults */
-    HalPciTranslateBusAddress = HalpTranslateBusAddress;
-    HalFindBusAddressTranslation = HalpFindBusAddressTranslation;
-#endif
 }
 
 /* EOF */