18,18 → 18,17 |
static void pci_lookup_devices(pci_drv_t *drv); |
|
|
// TODO: think about locking |
void pci_bus_scan(pci_bus_t *bus) |
{ |
pci_dev_t *dev = pci_alloc_dev(); |
pci_bus_t *child_bus = NULL; |
int dnum, fnum; |
int dnum, fnum, bus_num; |
bool multi; |
uint8_t header_type; |
|
printf("PCI: scanning bus number %d\n", bus->num); |
|
for (dnum = 0; dnum < 4/*256*/; dnum++) { |
for (dnum = 0; dnum < 256; dnum++) { |
multi = true; |
for (fnum = 0; multi && fnum < 8; fnum++) { |
pci_init_dev(dev, bus, dnum, fnum); |
45,17 → 44,18 |
header_type = header_type & 0x7F; // clear the multifunction bit |
|
printf("PCI: adding new device %d : %d", dnum, fnum); |
printf(" - vendor = %x, device = %x.\n", dev->vendor_id, dev->device_id); |
printf(" - vendor = 0x%x, device = 0x%x.\n", dev->vendor_id, dev->device_id); |
pci_device_register(dev); |
dev = pci_alloc_dev(); // alloc new aux. dev. structure |
|
if (header_type == PCI_HEADER_TYPE_BRIDGE || header_type == PCI_HEADER_TYPE_CARDBUS ) { |
if (dnum != 0 && fnum != 0) { |
bus_num = pci_conf_read_8(dev, PCI_BRIDGE_SEC_BUS_NUM); |
if(bus_num != bus->num) { |
child_bus = pci_alloc_bus(); |
pci_init_bus(child_bus, bus, pci_conf_read_8(dev, PCI_BRIDGE_SEC_BUS_NUM)); |
pci_init_bus(child_bus, bus, bus_num); |
pci_bus_register(child_bus); |
pci_bus_scan(child_bus); |
} |
} |
} |
} |
} |