netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] de2104x: disable autonegotiation on broken hardware
@ 2010-09-23 20:59 Ondrej Zary
  2010-09-23 21:03 ` Jeff Garzik
  0 siblings, 1 reply; 4+ messages in thread
From: Ondrej Zary @ 2010-09-23 20:59 UTC (permalink / raw)
  To: jgarzik; +Cc: netdev, Kernel development list

At least on older 21041-AA chips (mine is rev. 11), TP duplex autonegotiation
causes the card not to work at all (link is up but no packets are transmitted).

de4x5 disables autonegotiation completely. But it seems to work on newer
(21041-PA rev. 21) so disable it only on rev<20 chips.

Signed-off-by: Ondrej Zary <linux@rainbow-software.org>

--- linux-2.6.36-rc3-orig/drivers/net/tulip/de2104x.c	2010-08-29 17:36:04.000000000 +0200
+++ linux-2.6.36-rc3/drivers/net/tulip/de2104x.c	2010-09-24 00:27:41.000000000 +0200
@@ -364,6 +364,8 @@ static u16 t21040_csr15[] = { 0, 0, 0x00
 /* 21041 transceiver register settings: TP AUTO, BNC, AUI, TP, TP FD*/
 static u16 t21041_csr13[] = { 0xEF01, 0xEF09, 0xEF09, 0xEF01, 0xEF09, };
 static u16 t21041_csr14[] = { 0xFFFF, 0xF7FD, 0xF7FD, 0x6F3F, 0x6F3D, };
+/* If on-chip autonegotiation is broken, use half-duplex (FF3F) instead */
+static u16 t21041_csr14_brk[] = { 0xFF3F, 0xF7FD, 0xF7FD, 0x6F3F, 0x6F3D, };
 static u16 t21041_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, };
 
 
@@ -1911,8 +1913,14 @@ fill_defaults:
 	for (i = 0; i < DE_MAX_MEDIA; i++) {
 		if (de->media[i].csr13 == 0xffff)
 			de->media[i].csr13 = t21041_csr13[i];
-		if (de->media[i].csr14 == 0xffff)
-			de->media[i].csr14 = t21041_csr14[i];
+		if (de->media[i].csr14 == 0xffff) {
+			/* autonegotiation is broken at least on some chip
+			   revisions - rev. 0x21 works, 0x11 does not */
+			if (de->pdev->revision < 0x20)
+				de->media[i].csr14 = t21041_csr14_brk[i];
+			else
+				de->media[i].csr14 = t21041_csr14[i];
+		}
 		if (de->media[i].csr15 == 0xffff)
 			de->media[i].csr15 = t21041_csr15[i];
 	}


-- 
Ondrej Zary

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] de2104x: disable autonegotiation on broken hardware
  2010-09-23 20:59 [PATCH] de2104x: disable autonegotiation on broken hardware Ondrej Zary
@ 2010-09-23 21:03 ` Jeff Garzik
  2010-09-23 21:18   ` Ondrej Zary
  0 siblings, 1 reply; 4+ messages in thread
From: Jeff Garzik @ 2010-09-23 21:03 UTC (permalink / raw)
  To: Ondrej Zary; +Cc: netdev, Kernel development list

On Thu, Sep 23, 2010 at 4:59 PM, Ondrej Zary <linux@rainbow-software.org> wrote:
> At least on older 21041-AA chips (mine is rev. 11), TP duplex autonegotiation
> causes the card not to work at all (link is up but no packets are transmitted).
>
> de4x5 disables autonegotiation completely. But it seems to work on newer
> (21041-PA rev. 21) so disable it only on rev<20 chips.
>
> Signed-off-by: Ondrej Zary <linux@rainbow-software.org>
>
> --- linux-2.6.36-rc3-orig/drivers/net/tulip/de2104x.c   2010-08-29 17:36:04.000000000 +0200
> +++ linux-2.6.36-rc3/drivers/net/tulip/de2104x.c        2010-09-24 00:27:41.000000000 +0200
> @@ -364,6 +364,8 @@ static u16 t21040_csr15[] = { 0, 0, 0x00
>  /* 21041 transceiver register settings: TP AUTO, BNC, AUI, TP, TP FD*/
>  static u16 t21041_csr13[] = { 0xEF01, 0xEF09, 0xEF09, 0xEF01, 0xEF09, };
>  static u16 t21041_csr14[] = { 0xFFFF, 0xF7FD, 0xF7FD, 0x6F3F, 0x6F3D, };
> +/* If on-chip autonegotiation is broken, use half-duplex (FF3F) instead */
> +static u16 t21041_csr14_brk[] = { 0xFF3F, 0xF7FD, 0xF7FD, 0x6F3F, 0x6F3D, };
>  static u16 t21041_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, };
>
>
> @@ -1911,8 +1913,14 @@ fill_defaults:
>        for (i = 0; i < DE_MAX_MEDIA; i++) {
>                if (de->media[i].csr13 == 0xffff)
>                        de->media[i].csr13 = t21041_csr13[i];
> -               if (de->media[i].csr14 == 0xffff)
> -                       de->media[i].csr14 = t21041_csr14[i];
> +               if (de->media[i].csr14 == 0xffff) {
> +                       /* autonegotiation is broken at least on some chip
> +                          revisions - rev. 0x21 works, 0x11 does not */
> +                       if (de->pdev->revision < 0x20)
> +                               de->media[i].csr14 = t21041_csr14_brk[i];
> +                       else
> +                               de->media[i].csr14 = t21041_csr14[i];
> +               }

Interesting...  I never knew about that quirk.

Acked-by: Jeff Garzik <jgarzik@redhat.com>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] de2104x: disable autonegotiation on broken hardware
  2010-09-23 21:03 ` Jeff Garzik
@ 2010-09-23 21:18   ` Ondrej Zary
  2010-09-25  5:41     ` David Miller
  0 siblings, 1 reply; 4+ messages in thread
From: Ondrej Zary @ 2010-09-23 21:18 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: netdev, Kernel development list

On Thursday 23 September 2010 23:03:13 Jeff Garzik wrote:
> On Thu, Sep 23, 2010 at 4:59 PM, Ondrej Zary <linux@rainbow-software.org> 
wrote:
> > At least on older 21041-AA chips (mine is rev. 11), TP duplex
> > autonegotiation causes the card not to work at all (link is up but no
> > packets are transmitted).
> >
> > de4x5 disables autonegotiation completely. But it seems to work on newer
> > (21041-PA rev. 21) so disable it only on rev<20 chips.
> >
> > Signed-off-by: Ondrej Zary <linux@rainbow-software.org>
> >
> > --- linux-2.6.36-rc3-orig/drivers/net/tulip/de2104x.c   2010-08-29
> > 17:36:04.000000000 +0200 +++ linux-2.6.36-rc3/drivers/net/tulip/de2104x.c
> >        2010-09-24 00:27:41.000000000 +0200 @@ -364,6 +364,8 @@ static u16
> > t21040_csr15[] = { 0, 0, 0x00
> >  /* 21041 transceiver register settings: TP AUTO, BNC, AUI, TP, TP FD*/
> >  static u16 t21041_csr13[] = { 0xEF01, 0xEF09, 0xEF09, 0xEF01, 0xEF09, };
> >  static u16 t21041_csr14[] = { 0xFFFF, 0xF7FD, 0xF7FD, 0x6F3F, 0x6F3D, };
> > +/* If on-chip autonegotiation is broken, use half-duplex (FF3F) instead
> > */ +static u16 t21041_csr14_brk[] = { 0xFF3F, 0xF7FD, 0xF7FD, 0x6F3F,
> > 0x6F3D, }; static u16 t21041_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008,
> > 0x0008, };
> >
> >
> > @@ -1911,8 +1913,14 @@ fill_defaults:
> >        for (i = 0; i < DE_MAX_MEDIA; i++) {
> >                if (de->media[i].csr13 == 0xffff)
> >                        de->media[i].csr13 = t21041_csr13[i];
> > -               if (de->media[i].csr14 == 0xffff)
> > -                       de->media[i].csr14 = t21041_csr14[i];
> > +               if (de->media[i].csr14 == 0xffff) {
> > +                       /* autonegotiation is broken at least on some
> > chip +                          revisions - rev. 0x21 works, 0x11 does
> > not */ +                       if (de->pdev->revision < 0x20)
> > +                               de->media[i].csr14 = t21041_csr14_brk[i];
> > +                       else
> > +                               de->media[i].csr14 = t21041_csr14[i];
> > +               }
>
> Interesting...  I never knew about that quirk.

This errata document says that autonegotiation is somehow broken but it does 
not specify it further:
http://ftp.nluug.nl/ftp/ftp/pub/os/NetBSD/misc/dec-docs/ec-qd2ma-te.ps.gz

-- 
Ondrej Zary

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] de2104x: disable autonegotiation on broken hardware
  2010-09-23 21:18   ` Ondrej Zary
@ 2010-09-25  5:41     ` David Miller
  0 siblings, 0 replies; 4+ messages in thread
From: David Miller @ 2010-09-25  5:41 UTC (permalink / raw)
  To: linux; +Cc: jgarzik, netdev, linux-kernel

From: Ondrej Zary <linux@rainbow-software.org>
Date: Thu, 23 Sep 2010 23:18:08 +0200

> On Thursday 23 September 2010 23:03:13 Jeff Garzik wrote:
>> On Thu, Sep 23, 2010 at 4:59 PM, Ondrej Zary <linux@rainbow-software.org> 
> wrote:
>> > At least on older 21041-AA chips (mine is rev. 11), TP duplex
>> > autonegotiation causes the card not to work at all (link is up but no
>> > packets are transmitted).
>> >
>> > de4x5 disables autonegotiation completely. But it seems to work on newer
>> > (21041-PA rev. 21) so disable it only on rev<20 chips.
>> >
>> > Signed-off-by: Ondrej Zary <linux@rainbow-software.org>
...
>> Interesting...  I never knew about that quirk.
> 
> This errata document says that autonegotiation is somehow broken but it does 
> not specify it further:
> http://ftp.nluug.nl/ftp/ftp/pub/os/NetBSD/misc/dec-docs/ec-qd2ma-te.ps.gz

Applied, thanks guys!

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-09-25  5:40 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-23 20:59 [PATCH] de2104x: disable autonegotiation on broken hardware Ondrej Zary
2010-09-23 21:03 ` Jeff Garzik
2010-09-23 21:18   ` Ondrej Zary
2010-09-25  5:41     ` David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).