PATCH 2.4.0.9.8: Fix IDE...

From: Jeff Garzik (jgarzik@mandrakesoft.mandrakesoft.com)
Date: Mon Oct 02 2000 - 13:39:40 EST


Linus,

Ug. Why do I feel like the IDE "driver" is code layered upon code
layered upon code, through the ages, with nary a cleanup in between?

My previous patch was a fix, but (brown paper bag time) standard IDE
devices no longer called chipset init. People either had no IDE, or
were stuck in legacy mode. This fixes it.

The IDE layer is in serious need of a cleanup though, IMHO...

With this tested patch full functionality should be restored, without
reverting to the previously-crazy code found in test9-pre7 and before.

        Jeff

Index: drivers/ide/ide-pci.c
===================================================================
RCS file: /usr/jgarzik/cvslan/linux_2_3/drivers/ide/ide-pci.c,v
retrieving revision 1.1.1.9
diff -u -r1.1.1.9 ide-pci.c
--- drivers/ide/ide-pci.c 2000/10/02 08:32:44 1.1.1.9
+++ drivers/ide/ide-pci.c 2000/10/02 18:28:10
@@ -493,6 +493,7 @@
         byte tmp = 0;
         ide_hwif_t *hwif, *mate = NULL;
         unsigned int class_rev;
+ int pci_class_ide;
 
 #ifdef CONFIG_IDEDMA_AUTO
         autodma = 1;
@@ -538,7 +539,8 @@
          * Can we trust the reported IRQ?
          */
         pciirq = dev->irq;
- if ((dev->class & ~(0xff)) != (PCI_CLASS_STORAGE_IDE << 8)) {
+ pci_class_ide = ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE);
+ if (!pci_class_ide) {
                 printk("%s: not 100%% native mode: will probe irqs later\n", d->name);
                 /*
                  * This allows offboard ide-pci cards the enable a BIOS,
@@ -548,11 +550,17 @@
                  */
                 pciirq = (d->init_chipset) ? d->init_chipset(dev, d->name) : ide_special_settings(dev, d->name);
         } else if (tried_config) {
- printk("%s: will probe irqs later\n", d->name);
+ printk(KERN_INFO "%s: will probe irqs later\n", d->name);
                 pciirq = 0;
         } else if (!pciirq) {
- printk("%s: bad irq (%d): will probe later\n", d->name, pciirq);
- pciirq = 0;
+ if (pci_class_ide) {
+ /* this is the normal path for most IDE devices */
+ if (d->init_chipset)
+ pciirq = d->init_chipset(dev, d->name);
+ else
+ printk(KERN_INFO "%s standard IDE storage device detected\n", d->name);
+ } else
+ printk(KERN_WARNING "%s: bad irq (0): will probe later\n", d->name);
         } else {
                 if (d->init_chipset)
                         (void) d->init_chipset(dev, d->name);

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sat Oct 07 2000 - 21:00:10 EST