Re: [PATCH] de2104x: remove BUG_ON() when changing media type
From: Ondrej Zary <hidden>
Date: 2008-03-24 23:02:44
Also in:
lkml
On Monday 24 March 2008 03:45:14 Grant Grundler wrote:
On Mon, Feb 25, 2008 at 12:52:17PM -0500, Jeff Garzik wrote:quoted
Ondrej Zary wrote:quoted
When the chip dies (probably because of a bug somewhere in the driver), de_stop_rxtx() fails and changing the media type crashes the whole machine. Replace BUG_ON() in de_set_media() with a warning. Signed-off-by: Ondrej Zary <redacted>--- linux-2.6.24-orig/drivers/net/tulip/de2104x.c 2008-02-2518:27:34.000000000 +0100+++ linux-2.6.24-pentium/drivers/net/tulip/de2104x.c 2008-02-2518:34:56.000000000 +0100@@ -910,7 +910,8 @@ unsigned media = de->media_type; u32 macmode = dr32(MacMode); - BUG_ON(de_is_running(de)); + if (de_is_running(de)) + printk(KERN_WARNING "%s: chip is running while changing media!\n",de->dev->name);Certainly a sane improvement...Jeff, The above patch was applied and fixes the 'panic' part of the problme. Can you take a look at this patch to fix the "chip is still running" part of this bug?
I'll test it but I doubt that it fixes the problem. IIRC, I tried something like that. Even tried resetting the chip multiple times when this problem appears but everything failed.
quoted hunk ↗ jump to hunk
BTW, I inherited a bug report for the same symptom: http://bugzilla.kernel.org/show_bug.cgi?id=3156 thanks, grant Signed-off-by: Grant Grundler--- linux-2.6.23/drivers/net/tulip/de2104x.c 2007-10-09 13:31:38.000000000 -0700 +++ linux-2.6.23/drivers/net/tulip/de2104x.c-ggg 2007-11-0223:24:46.000000000 -0700 @@ -842,7 +842,7 @@ static void de_stop_rxtx (struct de_private *de) { u32 macmode; - unsigned int work = 1000; + unsigned int i = 1300/100; macmode = dr32(MacMode); if (macmode & RxTx) {@@ -850,10 +850,14 @@ dr32(MacMode); } - while (--work > 0) { + /* wait until in-flight frame completes. + * Max time @ 10BT: 1500*8b/10Mbps == 1200us (+ 100us margin) + * Typically expect this loop to end in < 50 us on 100BT. + */ + while (--i) { if (!de_is_running(de)) return; - cpu_relax(); + udelay(100); } printk(KERN_WARNING "%s: timeout expired stopping DMA\n", de->dev->name);
-- Ondrej Zary