Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 31 Dec 2011 08:01:22 -0800
From:      Adrian Chadd <adrian@freebsd.org>
To:        Stefan Bethke <stb@lassitu.de>
Cc:        Aleksandr Rybalko <ray@ddteam.net>, freebsd-mips@freebsd.org
Subject:   Re: arge problem on MR3420
Message-ID:  <CAJ-VmoncaNavvGns9dM_Kc_BiuKNbNpmNijiYKAOh13bQ967Rw@mail.gmail.com>
In-Reply-To: <2A05E0AA-5AA5-47FD-90EA-BD6B23A01EFE@lassitu.de>
References:  <B40E8E4D-115F-46EF-A51F-52E562EF166E@lassitu.de> <CAJ-VmokWLzfjd%2B=_=tSt7ukc=gK2kd9H5s7sH-7bbzSpzBFUcQ@mail.gmail.com> <20111231000638.d257448c.ray@ddteam.net> <98BA8EF5-E808-43F8-92A8-68B14CAF998F@lassitu.de> <2A05E0AA-5AA5-47FD-90EA-BD6B23A01EFE@lassitu.de>

next in thread | previous in thread | raw e-mail | index | archive | help
On 31 December 2011 04:36, Stefan Bethke <stb@lassitu.de> wrote:
> Am 30.12.2011 um 23:49 schrieb Stefan Bethke:
>
>> OK, trying to pull in everyone. =A0There seems to be a problem with if_a=
rge on certain chips/platforms. =A0I've encountered it on TL-MR3420 and WRT=
-160NL. =A0I'm currently working off Adrians gitorious repo.
>
> The problem is limited to BOOTP; if I mount a USB stick as root, I can br=
ing up arge1 without issue.
>
> On the AR7241, arge0 is connected to a phy and the blue WAN port, arge1 i=
s connected to the built-in switch. =A0The port speeds are fixed (1000 for =
the switch, 100 for the phy).
>
> With BOOTP enabled, I'm getting an interrupt storm on intr 3. =A0I've ena=
bled debugging for arge, and it seems there is a TX underrun that is not be=
ing cleared in that case. =A0I'm not fully understanding the code, so I'm n=
ot sure why the TX underrun is not being cleared, or keeps reoccurring.

Is the bootp code somehow tickling the interface setup in a way that
isn't the same as the userland-driven config?

Ie, a tx underrun should only occur if it runs out of TX descriptor
slots. That's fine, it just means that it go to the end of the
descriptor list. It's not _necessarily_ an error condition.

And it should only _keep_ occuring if someone/something keeps tickling
the DMA_TX_CONTROL_EN bit.

So when the underrun occurs, what's the state of the TX ring head/tail poin=
ters?

The code in arge_intr() should be self explanatory. If any frames were
sent, call arge_start_locked(). The call to arge_encap() throws
something into the TX ring and then sets DMA_TX_CONTROL_EN.

How about adding a printf() to arge_start_locked() and arge_encap(),
see if they're constantly being called.


Adrian



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAJ-VmoncaNavvGns9dM_Kc_BiuKNbNpmNijiYKAOh13bQ967Rw>