26,16 → 26,18 |
bool multi; |
uint8_t header_type; |
|
printf("PCI: scanning bus number %d\n", bus->num); |
|
for (dnum = 0; dnum < 256; dnum++) { |
for (dnum = 0; dnum < 32; dnum++) { |
multi = true; |
for (fnum = 0; multi && fnum < 8; fnum++) { |
pci_init_dev(dev, bus, dnum, fnum); |
dev->vendor_id = pci_conf_read_16(dev, PCI_VENDOR_ID); |
dev->device_id = pci_conf_read_16(dev, PCI_DEVICE_ID); |
if (dev->vendor_id == 0xFFFF) { |
continue; // device is not present, go on scanning the bus |
if (dev->vendor_id == 0xFFFF) { // device is not present, go on scanning the bus |
if (fnum == 0) { |
break; |
} else { |
continue; |
} |
} |
header_type = pci_conf_read_8(dev, PCI_HEADER_TYPE); |
if (fnum == 0) { |
43,14 → 45,14 |
} |
header_type = header_type & 0x7F; // clear the multifunction bit |
|
printf("PCI: adding new device %d : %d", dnum, fnum); |
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 |
printf("PCI: adding new device %d : %d : %d", dev->bus->num, dnum, fnum); |
printf(" - vendor = 0x%04X, device = 0x%04X.\n", dev->vendor_id, dev->device_id); |
pci_device_register(dev); |
|
if (header_type == PCI_HEADER_TYPE_BRIDGE || header_type == PCI_HEADER_TYPE_CARDBUS ) { |
bus_num = pci_conf_read_8(dev, PCI_BRIDGE_SEC_BUS_NUM); |
if(bus_num != bus->num) { |
printf("PCI: device is pci-to-pci bridge, secondary bus number = %d.\n", bus_num); |
if(bus_num > bus->num) { |
child_bus = pci_alloc_bus(); |
pci_init_bus(child_bus, bus, bus_num); |
pci_bus_register(child_bus); |
57,6 → 59,8 |
pci_bus_scan(child_bus); |
} |
} |
|
dev = pci_alloc_dev(); // alloc new aux. dev. structure |
} |
} |
|