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;

Reply via email to