[PATCH] Fix for using NFS root with if_arge
Juli Mallett
jmallett at FreeBSD.org
Sat Mar 10 22:55:15 UTC 2012
On Sat, Mar 10, 2012 at 14:50, Juli Mallett <jmallett at freebsd.org> wrote:
> On Sat, Mar 10, 2012 at 14:29, Aleksandr Rybalko <ray at ddteam.net> wrote:
>> On Sat, 10 Mar 2012 14:24:09 -0800
>> Juli Mallett <jmallett at FreeBSD.org> wrote:
>>> This patch seems to cause interrupt storms on rb450g's arge1
>>> interface, at least if that interface is wired to the switch. I would
>>> guess it has to do with the MAC clock?
>>
>> Yeah, but not really this patch. This patch just workaround one problem
>> which is unhide second. I'm still not sure what is real problem
>> source, but think it is because clock for MAC output, or not run, or
>> run on incorrect frequency.
>
> I guess I really don't understand the nature of the problem. It looks
> like this relates to moving the ring initialization out to attach-time
> — why not just make the stop function do the right thing and free
> allocated resources, instead of doing the latter in detach? Is it
> simply the lack of resetting the tx_prod, tx_cons, tx_cnt and rx_cons
> fields in the init function if you move the ring initialization to
> attach? It looks to me like that could be the problem.
Indeed, that's the issue. If I modify your patch to instead be like
below, no more interrupt storm:
@@ -849,20 +860,17 @@
arge_stop(sc);
- /* Init circular RX list. */
- if (arge_rx_ring_init(sc) != 0) {
- device_printf(sc->arge_dev,
- "initialization failed: no memory for rx buffers\n");
- arge_stop(sc);
- return;
- }
+ /*
+ * Reset ring consumer and producer values, etc.
+ */
+ sc->arge_cdata.arge_rx_cons = 0;
- /* Init tx descriptors. */
- arge_tx_ring_init(sc);
+ sc->arge_cdata.arge_tx_prod = 0;
+ sc->arge_cdata.arge_tx_cons = 0;
+ sc->arge_cdata.arge_tx_cnt = 0;
arge_reset_dma(sc);
-
if (sc->arge_miibus) {
mii = device_get_softc(sc->arge_miibus);
mii_mediachg(mii);
More information about the freebsd-mips
mailing list