Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 4399 → Rev 4418

/branches/dd/uspace/srv/pci/pci.c
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);
}
}
}
}
}