diff options
author | sam <sam@FreeBSD.org> | 2007-02-24 23:12:58 +0000 |
---|---|---|
committer | sam <sam@FreeBSD.org> | 2007-02-24 23:12:58 +0000 |
commit | faef66011a2046c4e005e5f3746991bbe51305f4 (patch) | |
tree | 18d7b33bbe9d4f66a0df95e08d0e983e09b42406 | |
parent | 7706232aaa98c207faf91a1a5c00d438def8259d (diff) | |
download | FreeBSD-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.c | 29 | ||||
-rw-r--r-- | sys/dev/ath/if_athvar.h | 4 |
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) \ |