rt2560 is selecting antennas before initialising the baseband processor (BBP), however initialising antennas involves tweaking of BBP registers.
The diff below (taken from dragonfly, written by sephe) ensures antennas are selected after the BBP has been initialised. Part of this diff was committed in r1.26 of rt2560.c and subsequently backed out because it caused problems. Apparently the missing piece was a busy-wait loop before reading in rt2560_bbp_read(), which has since been added to dragonfly: commit dd8ea05f8d30bd38ecd334718e4263d8c56ce67a Author: Sepherosa Ziehau <se...@dragonflybsd.org> Date: Thu Apr 12 12:54:07 2007 +0000 When read BBP registers, avoid writing to BBPCSR until it is no longer busy. After this bug fixing, TX/RX antenna setup can be safely put after BBP initialization, which is a correct place for it, since BBP initialization will overwrite RX antenna BBP register with default value. Before this bug fixing, putting TX/RX antenna setup after BBP initailization always results in strange TX/RX problems, which I experienced when I fiddled with my ASUS WL-107G; and some OpenBSD folks had this problems too, before Damien reverted related changes in OpenBSD. Tested with an RT2560 cardbus ral which still seems happy. Any testers/oks? Index: rt2560.c =================================================================== RCS file: /cvs/src/sys/dev/ic/rt2560.c,v retrieving revision 1.58 diff -u -p -r1.58 rt2560.c --- rt2560.c 22 Feb 2011 20:05:03 -0000 1.58 +++ rt2560.c 7 Jul 2012 14:23:42 -0000 @@ -2102,6 +2102,16 @@ rt2560_bbp_read(struct rt2560_softc *sc, uint32_t val; int ntries; + for (ntries = 0; ntries < 100; ntries++) { + if (!(RAL_READ(sc, RT2560_BBPCSR) & RT2560_BBP_BUSY)) + break; + DELAY(1); + } + if (ntries == 100) { + printf("%s: could not read from BBP\n", sc->sc_dev.dv_xname); + return 0; + } + val = RT2560_BBP_BUSY | reg << 8; RAL_WRITE(sc, RT2560_BBPCSR, val); @@ -2626,8 +2636,6 @@ rt2560_init(struct ifnet *ifp) /* set basic rate set (will be updated later) */ RAL_WRITE(sc, RT2560_ARSP_PLCP_1, 0x153); - rt2560_set_txantenna(sc, 1); - rt2560_set_rxantenna(sc, 1); rt2560_set_slottime(sc); rt2560_update_plcp(sc); rt2560_update_led(sc, 0, 0); @@ -2639,6 +2647,9 @@ rt2560_init(struct ifnet *ifp) rt2560_stop(ifp, 1); return EIO; } + + rt2560_set_txantenna(sc, 1); + rt2560_set_rxantenna(sc, 1); /* set default BSS channel */ ic->ic_bss->ni_chan = ic->ic_ibss_chan;