+/**\r
+ * \brief Scans a specific PCI Bus\r
+ * \param BusID PCI Bus ID to scan\r
+ * \param bFill Fill the \a gPCI_Devices array?\r
+ */\r
+int PCI_ScanBus(int BusID, int bFill)\r
+{\r
+ int dev, fcn;\r
+ tPCIDevice devInfo;\r
+ \r
+ if( gaPCI_BusBitmap[BusID/32] & (1 << (BusID%32)) )\r
+ return MODULE_ERR_OK;\r
+ \r
+ gaPCI_BusBitmap[BusID/32] |= (1 << (BusID%32));\r
+ \r
+ for( dev = 0; dev < 32; dev++ ) // 32 Devices per bus\r
+ {\r
+ for( fcn = 0; fcn < 8; fcn++ ) // Max 8 functions per device\r
+ {\r
+ // Check if the device/function exists\r
+ if(!PCI_EnumDevice(BusID, dev, fcn, &devInfo))\r
+ continue;\r
+ \r
+ if(devInfo.oc == PCI_OC_PCIBRIDGE)\r
+ {\r
+ #if LIST_DEVICES\r
+ Log_Log("PCI", "Bridge @ %i,%i:%i (0x%x:0x%x)",\r
+ BusID, dev, fcn, devInfo.vendor, devInfo.device);\r
+ #endif\r
+ //TODO: Handle PCI-PCI Bridges\r
+ //PCI_ScanBus(devInfo.???, bFill);\r
+ giPCI_BusCount ++;\r
+ }\r
+ else\r
+ {\r
+ #if LIST_DEVICES\r
+ Log_Log("PCI", "Device %i,%i:%i %04x => 0x%04x:0x%04x",\r
+ BusID, dev, fcn, devInfo.oc, devInfo.vendor, devInfo.device);\r
+ #endif\r
+ }\r
+ \r
+ if( bFill ) {\r
+ devInfo.Node.Inode = giPCI_DeviceCount;\r
+ memcpy(&gPCI_Devices[giPCI_DeviceCount], &devInfo, sizeof(tPCIDevice));\r
+ }\r
+ giPCI_DeviceCount ++;\r
+ \r
+ // WTF is this for?\r
+ // Maybe bit 23 must be set for the device to be valid?\r
+ // - Actually, maybe 23 means that there are sub-functions\r
+ if(fcn == 0) {\r
+ if( !(devInfo.ConfigCache[3] & 0x00800000) )\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ \r
+ return MODULE_ERR_OK;\r
+}\r
+\r