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