lkml.org 
[lkml]   [2004]   [Sep]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: TG3 doesn't work in kernel 2.4.27 (David S. Miller)
David S. Miller wrote:
> On Thu, 26 Aug 2004 11:49:57 +0100
> Brian Somers <brian.somers@sun.com> wrote:
>
>
>>Can we get this guy to try running an older version of tg3 to see
>>what change introduce the issue?
>
>
> Brian, we already narrowed it down to exactly the hw autoneg
> changes Sun wrote. It breaks the IBM blades onboard 5704
> fibre chips. Reverting your change or disabling hw autoneg
> in the new code both fix the problem.

The problem seems to be that autoneg is disabled on the IBM switches.
After disabling autoneg on the Sun shelf switches, I see the problem.
This patch fixes things by reverting to sw autoneg which defaults to
a 1000Mbps/full-duplex link but with no flow control when it fails
(IBM should really have autoneg enabled!) - I'd appreciate it if
someone could test this against an IBM blade.

The patch is against the 2.6.8-1.521 version of tg3.c but should
hopefully apply to other recent versions. If there are problems,
because tw32_f() isn't defined, change

tw32_f(x, y);

to

tw32(x, y);
tr32(x);

Cheers.

--
Brian Somers Sun Microsystems
Sparc House, Guillemont Park
Software Engineer - LSE Minley Road, Blackwater
Tel: +44 1252 421 263 Ext: 21263 Camberley GU17 9QG
--- tg3.c.orig 2004-09-10 13:24:28.000000000 +0100
+++ tg3.c 2004-09-10 13:24:14.000000000 +0100
@@ -2051,9 +2051,25 @@
break;
udelay(1);
}
- if (tick >= 195000)
- printk(KERN_INFO PFX "%s: HW autoneg failed !\n",
+ if (tick >= 195000) {
+ u32 digctrl, txctrl;
+
+ printk(KERN_INFO PFX
+ "%s: HW autoneg failed - disabled\n",
tp->dev->name);
+
+ digctrl = tr32(SG_DIG_CTRL);
+ digctrl &= ~SG_DIG_USING_HW_AUTONEG;
+
+ txctrl = tr32(MAC_SERDES_CFG);
+ txctrl &= ~MAC_SERDES_CFG_EDGE_SELECT;
+ tw32_f(MAC_SERDES_CFG, txctrl);
+ tw32_f(SG_DIG_CTRL, digctrl | SG_DIG_SOFT_RESET);
+ udelay(5);
+ tw32_f(SG_DIG_CTRL, digctrl);
+
+ tp->tg3_flags2 &= ~TG3_FLG2_HW_AUTONEG;
+ }
}

/* Reset when initting first time or we have a link. */
@@ -5280,7 +5296,6 @@
txctrl = tr32(MAC_SERDES_CFG);
tw32_f(MAC_SERDES_CFG, txctrl | MAC_SERDES_CFG_EDGE_SELECT);
tw32_f(SG_DIG_CTRL, digctrl | SG_DIG_SOFT_RESET);
- tr32(SG_DIG_CTRL);
udelay(5);
tw32_f(SG_DIG_CTRL, digctrl);
\
 
 \ /
  Last update: 2005-03-22 14:06    [from the cache]
©2003-2011 Jasper Spaans