+ return MODULE_ERR_OK;\r
+}\r
+\r
+/**\r
+ * \brief Scans a specific PCI Bus\r
+ */\r
+int PCI_ScanBus(int BusID)\r
+{\r
+ int dev, fcn;\r
+ tPCIDevice devInfo;\r
+ void *tmpPtr = NULL;\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
+ // Allocate\r
+ tmpPtr = realloc(gPCI_Devices, (giPCI_DeviceCount+1)*sizeof(tPCIDevice));\r
+ if(tmpPtr == NULL)\r
+ return MODULE_ERR_MALLOC;\r
+ gPCI_Devices = tmpPtr;\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( );\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
+ devInfo.Node.Inode = giPCI_DeviceCount;\r
+ memcpy(&gPCI_Devices[giPCI_DeviceCount], &devInfo, sizeof(tPCIDevice));\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] & 0x800000) )\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ \r
+ return MODULE_ERR_OK;\r