Better debugging and final fix to the bus numbering, though that's

style not function.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@448 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
David Reid 2002-07-25 23:32:59 +00:00
parent 8d5863f44b
commit e805f0e904

View File

@ -116,39 +116,39 @@ static char *decode_class(uint8 base, uint8 sub_class)
case 0x01: case 0x01:
switch (sub_class) { switch (sub_class) {
case PCI_scsi: case PCI_scsi:
return "mass storage controller: scsi"; return "mass storage: scsi";
case PCI_ide: case PCI_ide:
return "mass storage controller: ide"; return "mass storage: ide";
case PCI_floppy: case PCI_floppy:
return "mass storage controller: floppy"; return "mass storage: floppy";
case PCI_ipi: case PCI_ipi:
return "mass storage controller: ipi"; return "mass storage: ipi";
case PCI_raid: case PCI_raid:
return "mass storage controller: raid"; return "mass storage: raid";
case PCI_mass_storage_other: case PCI_mass_storage_other:
return "mass storage controller: other"; return "mass storage: other";
} }
case 0x02: case 0x02:
switch (sub_class) { switch (sub_class) {
case PCI_ethernet: case PCI_ethernet:
return "network controller: ethernet"; return "network: ethernet";
case PCI_token_ring: case PCI_token_ring:
return "network controller: token ring"; return "network: token ring";
case PCI_fddi: case PCI_fddi:
return "network controller: fddi"; return "network: fddi";
case PCI_atm: case PCI_atm:
return "network controller: atm"; return "network: atm";
case PCI_network_other: case PCI_network_other:
return "network controller: other"; return "network: other";
} }
case 0x03: case 0x03:
switch (sub_class) { switch (sub_class) {
case PCI_vga: case PCI_vga:
return "display controller: vga"; return "display: vga";
case PCI_xga: case PCI_xga:
return "display controller: xga"; return "display: xga";
case PCI_display_other: case PCI_display_other:
return "display controller: other"; return "display: other";
} }
case 0x04: case 0x04:
switch (sub_class) { switch (sub_class) {
@ -159,27 +159,27 @@ static char *decode_class(uint8 base, uint8 sub_class)
case PCI_multimedia_other: case PCI_multimedia_other:
return "multimedia device: other"; return "multimedia device: other";
} }
case 0x05: return "memory controller"; case 0x05: return "memory";
case 0x06: case 0x06:
switch (sub_class) { switch (sub_class) {
case PCI_host: case PCI_host:
return "bridge controller: host bridge"; return "bridge: host bridge";
case PCI_isa: case PCI_isa:
return "bridge controller: isa"; return "bridge: isa";
case PCI_eisa: case PCI_eisa:
return "bridge controller: eisa"; return "bridge: eisa";
case PCI_microchannel: case PCI_microchannel:
return "bridge controller: microchannel"; return "bridge: microchannel";
case PCI_pci: case PCI_pci:
return "bridge controller: PCI"; return "bridge: PCI";
case PCI_pcmcia: case PCI_pcmcia:
return "bridge controller: PC Card"; return "bridge: PC Card";
case PCI_nubus: case PCI_nubus:
return "bridge controller: nubus"; return "bridge: nubus";
case PCI_cardbus: case PCI_cardbus:
return "bridge controller: CardBus"; return "bridge: CardBus";
case PCI_bridge_other: case PCI_bridge_other:
return "bridge controller: other"; return "bridge: other";
} }
case 0x07: return "simple comms controller"; case 0x07: return "simple comms controller";
case 0x08: return "base system peripheral"; case 0x08: return "base system peripheral";
@ -189,15 +189,15 @@ static char *decode_class(uint8 base, uint8 sub_class)
case 0x0c: case 0x0c:
switch (sub_class) { switch (sub_class) {
case PCI_firewire: case PCI_firewire:
return "bus controller: IEEE1394 FireWire"; return "bus: IEEE1394 FireWire";
case PCI_access: case PCI_access:
return "bus controller: ACCESS.bus"; return "bus: ACCESS.bus";
case PCI_ssa: case PCI_ssa:
return "bus controller: SSA"; return "bus: SSA";
case PCI_usb: case PCI_usb:
return "bus controller: USB"; return "bus: USB";
case PCI_fibre_channel: case PCI_fibre_channel:
return "bus controller: fibre channel"; return "bus: fibre channel";
} }
case 0x0d: return "wireless"; case 0x0d: return "wireless";
case 0x0e: return "intelligent i/o ??"; case 0x0e: return "intelligent i/o ??";
@ -775,6 +775,10 @@ static void print_pir_table(struct pir_table *tbl)
* and scan the bus it defines. * and scan the bus it defines.
* The bus is initially taken off-line, scanned and then put back on-line * The bus is initially taken off-line, scanned and then put back on-line
* *
* NB We increment the pci_max_bus value before we use mybus in the following
* code and pci_max_bus is incremented before we recurse to preserve the
* correct relationships with nubering.
*
* We initally set the subordinate_bus to 0xff and then adjust it to the max * We initally set the subordinate_bus to 0xff and then adjust it to the max
* once we've scanned the bus on the other side of the bridge. See the URL * once we've scanned the bus on the other side of the bridge. See the URL
* above for information on why this is done. * above for information on why this is done.
@ -782,7 +786,7 @@ static void print_pir_table(struct pir_table *tbl)
static void pci_bridge(uint8 bus, uint8 dev, uint8 func) static void pci_bridge(uint8 bus, uint8 dev, uint8 func)
{ {
uint16 command = 0; uint16 command = 0;
uint8 mybus = pci_max_bus + 1; uint8 mybus;
struct pci_device *pcid; struct pci_device *pcid;
struct pci_bus *pcib; struct pci_bus *pcib;
pci_info *pcii; pci_info *pcii;
@ -791,12 +795,14 @@ static void pci_bridge(uint8 bus, uint8 dev, uint8 func)
command &= ~ 0x03; command &= ~ 0x03;
write_pci_config(bus, dev, func, PCI_command, 2, command); write_pci_config(bus, dev, func, PCI_command, 2, command);
/* Keep Marcus happy */
pci_max_bus += 1;
mybus = pci_max_bus;
write_pci_config(bus, dev, func, PCI_primary_bus, 1, bus); write_pci_config(bus, dev, func, PCI_primary_bus, 1, bus);
write_pci_config(bus, dev, func, PCI_secondary_bus, 1, mybus); write_pci_config(bus, dev, func, PCI_secondary_bus, 1, mybus);
write_pci_config(bus, dev, func, PCI_subordinate_bus, 1, 0xff); write_pci_config(bus, dev, func, PCI_subordinate_bus, 1, 0xff);
pci_max_bus += 1;
dprintf("PCI-PCI bridge at %d:%d:%d configured as bus %d\n", bus, dev, func, mybus); dprintf("PCI-PCI bridge at %d:%d:%d configured as bus %d\n", bus, dev, func, mybus);
pci_scan_bus(mybus); pci_scan_bus(mybus);
@ -874,23 +880,30 @@ static void pci_bridge(uint8 bus, uint8 dev, uint8 func)
static void debug_show_device(pci_info *pcii) static void debug_show_device(pci_info *pcii)
{ {
dprintf("device at %d:%d:%d => %s\n", pcii->bus, pcii->device, uint16 status = read_pci_config(pcii->bus, pcii->device, pcii->function, PCI_status, 2);
dprintf("device @ %d:%d:%d > %s [%04x:%04x]\n", pcii->bus, pcii->device,
pcii->function, pcii->function,
decode_class(pcii->class_base, pcii->class_sub)); decode_class(pcii->class_base, pcii->class_sub),
dprintf("Capabilities: "); pcii->vendor_id, pcii->device_id);
if (pci_get_capability(pcii->bus, pcii->device, pcii->function, PCI_cap_id_agp, NULL))
dprintf("AGP "); if ((status & PCI_status_capabilities)) {
if (pci_get_capability(pcii->bus, pcii->device, pcii->function, PCI_cap_id_pm, NULL)) dprintf("Capabilities: ");
dprintf("Pwr Mgmt "); if (pci_get_capability(pcii->bus, pcii->device, pcii->function, PCI_cap_id_agp, NULL))
if (pci_get_capability(pcii->bus, pcii->device, pcii->function, PCI_cap_id_vpd, NULL)) dprintf("AGP ");
dprintf("VPD "); if (pci_get_capability(pcii->bus, pcii->device, pcii->function, PCI_cap_id_pm, NULL))
if (pci_get_capability(pcii->bus, pcii->device, pcii->function, PCI_cap_id_slotid, NULL)) dprintf("Pwr Mgmt ");
dprintf("slotID "); if (pci_get_capability(pcii->bus, pcii->device, pcii->function, PCI_cap_id_vpd, NULL))
if (pci_get_capability(pcii->bus, pcii->device, pcii->function, PCI_cap_id_msi, NULL)) dprintf("VPD ");
dprintf("MSI "); if (pci_get_capability(pcii->bus, pcii->device, pcii->function, PCI_cap_id_slotid, NULL))
if (pci_get_capability(pcii->bus, pcii->device, pcii->function, PCI_cap_id_hotplug, NULL)) dprintf("slotID ");
dprintf("hotplug "); if (pci_get_capability(pcii->bus, pcii->device, pcii->function, PCI_cap_id_msi, NULL))
dprintf("\n"); dprintf("MSI ");
if (pci_get_capability(pcii->bus, pcii->device, pcii->function, PCI_cap_id_hotplug, NULL))
dprintf("hotplug ");
dprintf("\n");
} else
dprintf("\t(No capabilities exist for this device)\n");
} }
static void pci_device_probe(uint8 bus, uint8 dev, uint8 func) static void pci_device_probe(uint8 bus, uint8 dev, uint8 func)