summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsam <sam@FreeBSD.org>2007-02-24 23:12:58 +0000
committersam <sam@FreeBSD.org>2007-02-24 23:12:58 +0000
commitfaef66011a2046c4e005e5f3746991bbe51305f4 (patch)
tree18d7b33bbe9d4f66a0df95e08d0e983e09b42406
parent7706232aaa98c207faf91a1a5c00d438def8259d (diff)
downloadFreeBSD-src-faef66011a2046c4e005e5f3746991bbe51305f4.zip
FreeBSD-src-faef66011a2046c4e005e5f3746991bbe51305f4.tar.gz
set the antenna switch when fixing the tx antenna using the
dev.ath.X.txantenna sysctl; this is typically what folks want but beware this has the side effect of disabling rx diversity MFC after: 2 weeks
-rw-r--r--sys/dev/ath/if_ath.c29
-rw-r--r--sys/dev/ath/if_athvar.h4
2 files changed, 30 insertions, 3 deletions
diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c
index f0fe1ee..5adb917 100644
--- a/sys/dev/ath/if_ath.c
+++ b/sys/dev/ath/if_ath.c
@@ -5343,6 +5343,29 @@ ath_sysctl_softled(SYSCTL_HANDLER_ARGS)
}
static int
+ath_sysctl_txantenna(SYSCTL_HANDLER_ARGS)
+{
+ struct ath_softc *sc = arg1;
+ u_int txantenna = ath_hal_getantennaswitch(sc->sc_ah);
+ int error;
+
+ error = sysctl_handle_int(oidp, &txantenna, 0, req);
+ if (!error && req->newptr) {
+ /* XXX assumes 2 antenna ports */
+ if (txantenna < HAL_ANT_VARIABLE || txantenna > HAL_ANT_FIXED_B)
+ return EINVAL;
+ ath_hal_setantennaswitch(sc->sc_ah, txantenna);
+ /*
+ * NB: with the switch locked this isn't meaningful,
+ * but set it anyway so things like radiotap get
+ * consistent info in their data.
+ */
+ sc->sc_txantenna = txantenna;
+ }
+ return error;
+}
+
+static int
ath_sysctl_rxantenna(SYSCTL_HANDLER_ARGS)
{
struct ath_softc *sc = arg1;
@@ -5561,9 +5584,9 @@ ath_sysctlattach(struct ath_softc *sc)
SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
"ledidle", CTLFLAG_RW, &sc->sc_ledidle, 0,
"idle time for inactivity LED (ticks)");
- SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
- "txantenna", CTLFLAG_RW, &sc->sc_txantenna, 0,
- "tx antenna (0=auto)");
+ SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
+ "txantenna", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
+ ath_sysctl_txantenna, "I", "antenna switch");
SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
"rxantenna", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
ath_sysctl_rxantenna, "I", "default/rx antenna");
diff --git a/sys/dev/ath/if_athvar.h b/sys/dev/ath/if_athvar.h
index 25f6bf2..f44b4f5 100644
--- a/sys/dev/ath/if_athvar.h
+++ b/sys/dev/ath/if_athvar.h
@@ -484,6 +484,10 @@ void ath_intr(void *);
(ath_hal_getcapability(_ah, HAL_CAP_DIVERSITY, 1, NULL) == HAL_OK)
#define ath_hal_setdiversity(_ah, _v) \
ath_hal_setcapability(_ah, HAL_CAP_DIVERSITY, 1, _v, NULL)
+#define ath_hal_getantennaswitch(_ah) \
+ ((*(_ah)->ah_getAntennaSwitch)((_ah)))
+#define ath_hal_setantennaswitch(_ah, _v) \
+ ((*(_ah)->ah_setAntennaSwitch)((_ah), (_v)))
#define ath_hal_getdiag(_ah, _pv) \
(ath_hal_getcapability(_ah, HAL_CAP_DIAG, 0, _pv) == HAL_OK)
#define ath_hal_setdiag(_ah, _v) \
OpenPOWER on IntegriCloud