diff options
| author | Atsushi Nemoto <anemo@mba.ocn.ne.jp> | 2007-09-04 10:02:02 -0400 |
|---|---|---|
| committer | Ralf Baechle <ralf@linux-mips.org> | 2007-09-14 14:08:43 -0400 |
| commit | 6440fcfc62767028a2bbdf742549d24f6a023004 (patch) | |
| tree | 419a228bd7af0017754ac5f3cd94a21180903971 | |
| parent | b1043cc7d9d7a7dec8d807570c067e0c90b94b57 (diff) | |
[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>
| -rw-r--r-- | include/asm-mips/mach-generic/ide.h | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/include/asm-mips/mach-generic/ide.h b/include/asm-mips/mach-generic/ide.h index 2b928577be5d..a77128362a7d 100644 --- a/include/asm-mips/mach-generic/ide.h +++ b/include/asm-mips/mach-generic/ide.h | |||
| @@ -29,6 +29,35 @@ | |||
| 29 | 29 | ||
| 30 | #define IDE_ARCH_OBSOLETE_DEFAULTS | 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 | static __inline__ int ide_default_irq(unsigned long base) | 61 | static __inline__ int ide_default_irq(unsigned long base) |
| 33 | { | 62 | { |
| 34 | switch (base) { | 63 | switch (base) { |
| @@ -45,6 +74,8 @@ static __inline__ int ide_default_irq(unsigned long base) | |||
| 45 | 74 | ||
| 46 | static __inline__ unsigned long ide_default_io_base(int index) | 75 | static __inline__ unsigned long ide_default_io_base(int index) |
| 47 | { | 76 | { |
| 77 | if (!ide_probe_legacy()) | ||
| 78 | return 0; | ||
| 48 | /* | 79 | /* |
| 49 | * If PCI is present then it is not safe to poke around | 80 | * If PCI is present then it is not safe to poke around |
| 50 | * the other legacy IDE ports. Only 0x1f0 and 0x170 are | 81 | * the other legacy IDE ports. Only 0x1f0 and 0x170 are |
