|
@@ -29,6 +29,35 @@
|
|
|
|
|
|
#define IDE_ARCH_OBSOLETE_DEFAULTS
|
|
|
|
|
|
+static __inline__ int ide_probe_legacy(void)
|
|
|
+{
|
|
|
+#ifdef CONFIG_PCI
|
|
|
+ struct pci_dev *dev;
|
|
|
+ /*
|
|
|
+ * This can be called on the ide_setup() path, super-early in
|
|
|
+ * boot. But the down_read() will enable local interrupts,
|
|
|
+ * which can cause some machines to crash. So here we detect
|
|
|
+ * and flag that situation and bail out early.
|
|
|
+ */
|
|
|
+ if (no_pci_devices())
|
|
|
+ return 0;
|
|
|
+ dev = pci_get_class(PCI_CLASS_BRIDGE_EISA << 8, NULL);
|
|
|
+ if (dev)
|
|
|
+ goto found;
|
|
|
+ dev = pci_get_class(PCI_CLASS_BRIDGE_ISA << 8, NULL);
|
|
|
+ if (dev)
|
|
|
+ goto found;
|
|
|
+ return 0;
|
|
|
+found:
|
|
|
+ pci_dev_put(dev);
|
|
|
+ return 1;
|
|
|
+#elif defined(CONFIG_EISA) || defined(CONFIG_ISA)
|
|
|
+ return 1;
|
|
|
+#else
|
|
|
+ return 0;
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
static __inline__ int ide_default_irq(unsigned long base)
|
|
|
{
|
|
|
switch (base) {
|
|
@@ -45,6 +74,8 @@ static __inline__ int ide_default_irq(unsigned long base)
|
|
|
|
|
|
static __inline__ unsigned long ide_default_io_base(int index)
|
|
|
{
|
|
|
+ if (!ide_probe_legacy())
|
|
|
+ return 0;
|
|
|
/*
|
|
|
* If PCI is present then it is not safe to poke around
|
|
|
* the other legacy IDE ports. Only 0x1f0 and 0x170 are
|