Re: [tulip] Re: Tulip Driver, or is it the PCI subsystem ?

From: Donald Becker (becker@scyld.com)
Date: Thu Aug 02 2001 - 23:46:56 EST


On Fri, 3 Aug 2001, Alan Cox wrote:

> > now, all that i want to know, is What on earth has been changed to
> > COMPLETELY retard what i saw as a usefull card and driver, for my (and other
> > people), the card is useless, and even worse, so is the damn server its
> > connected to.
>
> Well the obvious thing is the pci scanning and hot plug interface means that
> PCI ordering is now a more generic issue. I suspect what you'd need to do
> is to implement a version of
>
> pcibios_sort()

This doesn't really address the problem.

The (Scyld) tulip driver now back-installs the EEPROM information to
already detected interfaces that didn't have an EEPROM.

The problem is the broken BIOS IRQ settings.
The tulip driver has long had patch-up code, for x86 only, to work
around this problem.

The driver used to only forward-copy the EEPROM info, and used the same
code to forward copy the IRQ setting. If the probe order was backwards,
the user set reverse_probe=1 because of the obviously bogus media
table. This fixed up the IRQ (which was never *obviously* broken.)

Reviewing the code, I now understand the crux of your bug report.
While the current driver will back-copy and forward-copy the EEPROM
media information, the IRQ setting is only forward copied.

See the references to "last_irq" in probe1().

Here is a patch that might fix your problem. The code around line 1106
does the back-copy of the EEPROM media table. Please try adding the
lines with the "+"

        if (ee_data[19] > 1) {
                struct net_device *prev_dev;
                struct tulip_private *otp;
                /* This is a multiport board. The probe order may be "backwards", so
                   we patch up already found devices. */
                last_ee_data = ee_data;
                for (prev_dev = tp->next_module; prev_dev; prev_dev = otp->next_module) {
                        otp = (struct tulip_private *)prev_dev->priv;
                        if (otp->eeprom[0] == 0xff && otp->mtable == 0) {
+#if defined(__i386__) /* Patch up x86 BIOS bug. */
+ prev_dev->irq = dev->irq;
+#endif
                                parse_eeprom(prev_dev);
                                start_link(prev_dev);
                        } else
                                break;
                }
                controller_index = 0;
        }

Donald Becker becker@scyld.com
Scyld Computing Corporation http://www.scyld.com
410 Severn Ave. Suite 210 Second Generation Beowulf Clusters
Annapolis MD 21403 410-990-9993

-
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/



This archive was generated by hypermail 2b29 : Tue Aug 07 2001 - 21:00:26 EST