[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