Commit 6440fcfc62767028a2bbdf742549d24f6a023004
Committed by
Ralf Baechle
1 parent
b1043cc7d9
Exists in
master
and in
7 other branches
[MIPS] No ide_default_io_base() if PCI IDE was not found
Revert b5438582090406e2ccb4169d9b2df7c9939ae42b and add no_pci_devices() check to avoid crash due to early calling of pci_get_class(). Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Showing 1 changed file with 31 additions and 0 deletions Side-by-side Diff
include/asm-mips/mach-generic/ide.h
... | ... | @@ -29,6 +29,35 @@ |
29 | 29 | |
30 | 30 | #define IDE_ARCH_OBSOLETE_DEFAULTS |
31 | 31 | |
32 | +static __inline__ int ide_probe_legacy(void) | |
33 | +{ | |
34 | +#ifdef CONFIG_PCI | |
35 | + struct pci_dev *dev; | |
36 | + /* | |
37 | + * This can be called on the ide_setup() path, super-early in | |
38 | + * boot. But the down_read() will enable local interrupts, | |
39 | + * which can cause some machines to crash. So here we detect | |
40 | + * and flag that situation and bail out early. | |
41 | + */ | |
42 | + if (no_pci_devices()) | |
43 | + return 0; | |
44 | + dev = pci_get_class(PCI_CLASS_BRIDGE_EISA << 8, NULL); | |
45 | + if (dev) | |
46 | + goto found; | |
47 | + dev = pci_get_class(PCI_CLASS_BRIDGE_ISA << 8, NULL); | |
48 | + if (dev) | |
49 | + goto found; | |
50 | + return 0; | |
51 | +found: | |
52 | + pci_dev_put(dev); | |
53 | + return 1; | |
54 | +#elif defined(CONFIG_EISA) || defined(CONFIG_ISA) | |
55 | + return 1; | |
56 | +#else | |
57 | + return 0; | |
58 | +#endif | |
59 | +} | |
60 | + | |
32 | 61 | static __inline__ int ide_default_irq(unsigned long base) |
33 | 62 | { |
34 | 63 | switch (base) { |
... | ... | @@ -45,6 +74,8 @@ |
45 | 74 | |
46 | 75 | static __inline__ unsigned long ide_default_io_base(int index) |
47 | 76 | { |
77 | + if (!ide_probe_legacy()) | |
78 | + return 0; | |
48 | 79 | /* |
49 | 80 | * If PCI is present then it is not safe to poke around |
50 | 81 | * the other legacy IDE ports. Only 0x1f0 and 0x170 are |