Subversion Repositories shark

Rev

Rev 436 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
436 giacomo 1
/*
2
 * legacy.c - traditional, old school PCI bus probing
3
 */
4
#include <linuxcomp.h>
5
 
6
#include <linux/init.h>
7
#include <linux/pci.h>
8
#include "pci2.h"
9
 
10
/*
11
 * Discover remaining PCI buses in case there are peer host bridges.
12
 * We use the number of last PCI bus provided by the PCI BIOS.
13
 */
14
static void __devinit pcibios_fixup_peer_bridges(void)
15
{
16
        int n, devfn;
17
 
18
        if (pcibios_last_bus <= 0 || pcibios_last_bus >= 0xff)
19
                return;
20
        DBG("PCI: Peer bridge fixup\n");
21
 
22
        for (n=0; n <= pcibios_last_bus; n++) {
23
                u32 l;
24
                if (pci_find_bus(0, n))
25
                        continue;
26
                for (devfn = 0; devfn < 256; devfn += 8) {
27
                        if (!raw_pci_ops->read(0, n, devfn, PCI_VENDOR_ID, 2, &l) &&
28
                            l != 0x0000 && l != 0xffff) {
29
                                DBG("Found device at %02x:%02x [%04x]\n", n, devfn, l);
30
                                printk(KERN_INFO "PCI: Discovered peer bus %02x\n", n);
31
                                pci_scan_bus(n, &pci_root_ops, NULL);
32
                                break;
33
                        }
34
                }
35
        }
36
}
37
 
456 giacomo 38
int __init pci_legacy_init(void)
436 giacomo 39
{
40
        if (!raw_pci_ops) {
41
                printk("PCI: System does not support PCI\n");
42
                return 0;
43
        }
44
 
45
        if (pcibios_scanned++)
46
                return 0;
47
 
48
        printk("PCI: Probing PCI hardware\n");
49
        pci_root_bus = pcibios_scan_root(0);
50
 
51
        pcibios_fixup_peer_bridges();
52
 
53
        return 0;
54
}
55
 
56
subsys_initcall(pci_legacy_init);