Andre,
Here is the patch as we discussed - it works, it is good. Needed for
controllers that can do native mode but not native PCI IRQs.
Tim
-- Tim Hockin Systems Software Engineer Sun Microsystems, Cobalt Server Appliances thockin@sun.com --------------E4F370938FD6A902B1104A63 Content-Type: text/plain; charset=us-ascii; name="ide-init.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="ide-init.diff"--- virgin-2.4.12/drivers/ide/ide-pci.c Wed Oct 10 14:37:29 2001 +++ CVS-checkout/drivers/ide/ide-pci.c Thu Oct 18 10:22:53 2001 @@ -653,32 +653,44 @@ /* Its attached to something else, just a random bridge. Suspect a fastrak and fall through */ } - if ((dev->class & ~(0xfa)) != ((PCI_CLASS_STORAGE_IDE << 8) | 5)) { - printk("%s: not 100%% native mode: will probe irqs later\n", d->name); - /* - * This allows offboard ide-pci cards the enable a BIOS, - * verify interrupt settings of split-mirror pci-config - * space, place chipset into init-mode, and/or preserve - * an interrupt if the card is not native ide support. - */ - pciirq = (d->init_chipset) ? d->init_chipset(dev, d->name) : ide_special_settings(dev, d->name); + + if (!tried_config && + (dev->class >> 8 == PCI_CLASS_STORAGE_IDE || + dev->class >> 8 == PCI_CLASS_STORAGE_OTHER)) { + if ((dev->class & 0x5) == 0x5 && pciirq) { + if (d->init_chipset) { + (void) d->init_chipset(dev, d->name); + } +#ifdef __sparc__ + printk("%s: 100%% native mode on irq %s\n", + d->name, __irq_itoa(pciirq)); +#else + printk("%s: 100%% native mode on irq %d\n", + d->name, pciirq); +#endif + } else if ((dev->class & 0x5) == 0x5) { + if (d->init_chipset) { + pciirq = d->init_chipset(dev, d->name); + } + printk("%s: native mode: will probe irqs later\n", + d->name); + } else { + if (d->init_chipset) { + pciirq = d->init_chipset(dev, d->name); + } else { + pciirq = ide_special_settings(dev, d->name); + } + printk("%s: non-native mode: will probe irqs later\n", + d->name); + } } else if (tried_config) { printk("%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; } else { - if (d->init_chipset) - (void) d->init_chipset(dev, d->name); -#ifdef __sparc__ - printk("%s: 100%% native mode on irq %s\n", - d->name, __irq_itoa(pciirq)); -#else - printk("%s: 100%% native mode on irq %d\n", d->name, pciirq); -#endif + printk("%s: what am I expected to do with this?\n", d->name); + pciirq = 0; } - + /* * Set up the IDE ports */ @@ -784,6 +796,7 @@ IDE_PCI_DEVID_EQ(d->devid, DEVID_CMD648) || IDE_PCI_DEVID_EQ(d->devid, DEVID_CMD649) || IDE_PCI_DEVID_EQ(d->devid, DEVID_OSB4) || + IDE_PCI_DEVID_EQ(d->devid, DEVID_CSB5) || ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE && (dev->class & 0x80))) { unsigned long dma_base = ide_get_or_set_dma_base(hwif, (!mate && d->extra) ? d->extra : 0, d->name); if (dma_base && !(pcicmd & PCI_COMMAND_MASTER)) {
--------------E4F370938FD6A902B1104A63--
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/