if_ral regression

Sepherosa Ziehau sepherosa at gmail.com
Mon Dec 31 22:55:03 PST 2007

On Dec 29, 2007 8:33 PM, Dag-Erling Smørgrav <des at des.no> wrote:
> I upgraded my router cum firewall cum access point (soekris net4801 with
> a cheap third-party ralink-based wlan adapter) from RELENG_6 to HEAD and
> noticed what seems to be a regression in if_ral.  After a certain amount
> of use (i.e. actually having a client connected to it and transferring
> data), the connection falters, and eventually the client can no longer
> see even see the access point in a scan.  Restarting the interface on
> the router (/etc/rc.d/netif restart ral0) fixes it.  I now have a cron
> job that does this every five minutes.  I still get occasional outages,
> but all I have to do is wait a few minutes for the cron job to kick in.
> Outages are clearly related to traffic; a sure-fire way to trigger one
> is to start a backup job on my laptop (rsync to my file server).  I will
> lose the wlan connection repeatedly until I either stop trying or run
> the script with a bandwidth limit.
> des at soe ~% uname -a
> FreeBSD soe.des.no 8.0-CURRENT FreeBSD 8.0-CURRENT #0: Sat Dec 15 20:46:29 UTC 2007     des at pwd.des.no:/usr/obj/usr/src/sys/soe  i386
> des at soe ~% kldstat -v
> Id Refs Address    Size     Name
>  1   18 0xc0400000 33fdfc   kernel (/boot/soe/kernel)
>  2    1 0xc0740000 7690     if_sis.ko (/boot/soe/if_sis.ko)
>  3    2 0xc0748000 1dbe0    miibus.ko (/boot/soe/miibus.ko)
>  4    1 0xc0766000 18e28    if_ral.ko (/boot/soe/if_ral.ko)
>  5    4 0xc077f000 2a95c    wlan.ko (/boot/soe/wlan.ko)
>  6    1 0xc07aa000 2cb0     wlan_acl.ko (/boot/soe/wlan_acl.ko)
>  7    1 0xc07ad000 1924     wlan_scan_ap.ko (/boot/soe/wlan_scan_ap.ko)
>  8    1 0xc107f000 6000     geom_md.ko (/boot/soe/geom_md.ko)
>  9    1 0xc10f9000 2000     pflog.ko (/boot/soe/pflog.ko)
> 10    1 0xc10fb000 2f000    pf.ko (/boot/soe/pf.ko)
> 11    4 0xc118d000 a000     netgraph.ko (/boot/soe/netgraph.ko)
> 12    1 0xc119c000 3000     ng_ether.ko (/boot/soe/ng_ether.ko)
> 13    1 0xc11a8000 5000     ng_pppoe.ko (/boot/soe/ng_pppoe.ko)
> 14    1 0xc11ad000 4000     ng_socket.ko (/boot/soe/ng_socket.ko)
> des at soe ~% grep ral0 /var/run/dmesg.boot
> ral0: <Ralink Technology RT2560> mem 0xa0004000-0xa0005fff irq 11 at device 10.0 on pci0

I don't whether following thingies will fix your problem:

rt2560.c: rt2560_setup_tx_desc()
Set RT2560_{TX,TX_CIPHER}_BUSY desc flag at the end of this function,
instead of at the beginning of this function.  The original way _may_
confuse hardware encryption/tx engine.

And the rt2560_bbp_read() is not correct, it should look like following:
static uint8_t
rt2560_bbp_read(struct rt2560_softc *sc, uint8_t reg)
	uint32_t val;
	int ntries;

	for (ntries = 0; ntries < 100; ntries++) {
		if (!(RAL_READ(sc, RT2560_BBPCSR) & RT2560_BBP_BUSY))
	if (ntries == 100) {
		device_printf(sc->sc_dev, "could not read from BBP\n");
		return 0;

	val = RT2560_BBP_BUSY | reg << 8;
	RAL_WRITE(sc, RT2560_BBPCSR, val);

	for (ntries = 0; ntries < 100; ntries++) {
		val = RAL_READ(sc, RT2560_BBPCSR);
		if (!(val & RT2560_BBP_BUSY))
			return val & 0xff;

	device_printf(sc->sc_dev, "could not read from BBP\n");
	return 0;

After above fix,
rt2560_set_txantenna() and rt2560_set_rxantenna() should be called
after rt2560_bbp_init(), since above two function touch BBP.  NOTE:
without above fix, you may burn your card.

Even with these in place in dfly, I still have strange TX performance
regression in sta mode (drop from 20Mb/s to 3Mb/s under very well
condition) on certain hardwares after 20sec~30sec TCP_STREAM netperf
testing; didn't have enough time to dig, however, all of the tested
hardwares stayed connected during testing (I usually run netperf
stream test for 12 hours or more).

Best Regards,

Live Free or Die

More information about the freebsd-net mailing list