Hello,
diff below adds missing antenna selection to rt2661.
rt2x00.serialmonkey.com used as reference.

//maxim

Index: rt2661.c
===================================================================
RCS file: /cvs/src/sys/dev/ic/rt2661.c,v
retrieving revision 1.48
diff -u -p -r1.48 rt2661.c
--- rt2661.c    29 Mar 2009 21:53:52 -0000      1.48
+++ rt2661.c    6 Jun 2009 16:04:18 -0000
@@ -127,7 +127,7 @@ void rt2661_bbp_write(struct rt2661_sof uint8_t rt2661_bbp_read(struct rt2661_softc *, uint8_t); void rt2661_rf_write(struct rt2661_softc *, uint8_t, uint32_t); int rt2661_tx_cmd(struct rt2661_softc *, uint8_t, uint16_t);
-void           rt2661_select_antenna(struct rt2661_softc *);
+void           rt2661_select_antenna(struct rt2661_softc *, int);
 void           rt2661_enable_mrr(struct rt2661_softc *);
 void           rt2661_set_txpreamble(struct rt2661_softc *);
 void           rt2661_set_basicrates(struct rt2661_softc *);
@@ -2011,23 +2011,31 @@ rt2661_tx_cmd(struct rt2661_softc *sc, u
 }

 void
-rt2661_select_antenna(struct rt2661_softc *sc)
+rt2661_select_antenna(struct rt2661_softc *sc, int antenna)
 {
        uint8_t bbp4, bbp77;
        uint32_t tmp;

-       bbp4  = rt2661_bbp_read(sc,  4);
-       bbp77 = rt2661_bbp_read(sc, 77);
-
-       /* TBD */
+       bbp4  = rt2661_bbp_read(sc,  4) & ~0x3;
+       bbp77 = rt2661_bbp_read(sc, 77) & ~0x3;

        /* make sure Rx is disabled before switching antenna */
        tmp = RAL_READ(sc, RT2661_TXRX_CSR0);
        RAL_WRITE(sc, RT2661_TXRX_CSR0, tmp | RT2661_DISABLE_RX);

+       /* Select Rx-antenna */
+       if (antenna == 1) {
+               bbp4 |= RT2661_BBP_ANTA;
+               bbp77 |= 0x3;
+       } else if (antenna == 2) {
+               bbp4 |= RT2661_BBP_ANTB;
+               bbp77 |= 0x0;
+       } else
+               bbp4 |= RT2661_BBP_DIVERCITY;
+
        rt2661_bbp_write(sc,  4, bbp4);
        rt2661_bbp_write(sc, 77, bbp77);
-
+
        /* restore Rx filter */
        RAL_WRITE(sc, RT2661_TXRX_CSR0, tmp);
 }
@@ -2168,7 +2176,10 @@ rt2661_set_chan(struct rt2661_softc *sc,
         */
        if (c->ic_flags != sc->sc_curchan->ic_flags) {
                rt2661_select_band(sc, c);
-               rt2661_select_antenna(sc);
+               if (sc->nb_ant == 2)
+                       rt2661_select_antenna(sc, 0);
+               else /* default to ANTA */
+                       rt2661_select_antenna(sc, 1);
        }
        sc->sc_curchan = c;

@@ -2539,7 +2550,12 @@ rt2661_init(struct ifnet *ifp)
        /* select default channel */
        sc->sc_curchan = ic->ic_bss->ni_chan = ic->ic_ibss_chan;
        rt2661_select_band(sc, sc->sc_curchan);
-       rt2661_select_antenna(sc);
+       /* set divercity if two antennas attachaed */
+       if (sc->nb_ant == 2)
+               rt2661_select_antenna(sc, 0);
+       else
+               rt2661_select_antenna(sc, 1);
+
        rt2661_set_chan(sc, sc->sc_curchan);

        /* update Rx filter */
Index: rt2661reg.h
===================================================================
RCS file: /cvs/src/sys/dev/ic/rt2661reg.h,v
retrieving revision 1.9
diff -u -p -r1.9 rt2661reg.h
--- rt2661reg.h 9 Aug 2006 07:46:37 -0000       1.9
+++ rt2661reg.h 6 Jun 2009 16:09:45 -0000
@@ -293,6 +293,11 @@ struct rt2661_rx_desc {

 #define RT2661_SMART_MODE      (1 << 0)

+/* antenna selection */
+#define RT2661_BBP_ANTA                0x01
+#define RT2661_BBP_ANTB                0x01
+#define RT2661_BBP_DIVERCITY   0x02
+
 #define RT2661_BBPR94_DEFAULT  6

 #define RT2661_SHIFT_D 3

Reply via email to