diff options
author | sam <sam@FreeBSD.org> | 2005-07-24 05:11:39 +0000 |
---|---|---|
committer | sam <sam@FreeBSD.org> | 2005-07-24 05:11:39 +0000 |
commit | dae7e7f3e8cc89fb32a5e007cd67694e852b7fae (patch) | |
tree | a34dde4b9ce7319b4ee38a21f782ab7b8940784e /sys | |
parent | b9cf082129e9aee4e22881240ef45376354cdecb (diff) | |
download | FreeBSD-src-dae7e7f3e8cc89fb32a5e007cd67694e852b7fae.zip FreeBSD-src-dae7e7f3e8cc89fb32a5e007cd67694e852b7fae.tar.gz |
o fix setup of sc_diversity; the hal does not give us reliable
status after attach, only after a reset
o when setting diversity via the sysctl don't update sc_diversity
until we know the hal requested worked
o while here eliminate sc_hasdiversity and sc_hastpc; just query
the hal each time since these are the only places we need to know
MFC after: 3 days
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/ath/if_ath.c | 25 | ||||
-rw-r--r-- | sys/dev/ath/if_athvar.h | 2 |
2 files changed, 15 insertions, 12 deletions
diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c index ef50a59..009fe24 100644 --- a/sys/dev/ath/if_ath.c +++ b/sys/dev/ath/if_ath.c @@ -522,8 +522,7 @@ ath_attach(u_int16_t devid, struct ath_softc *sc) * all parts. We're a bit pedantic here as all parts * support a global cap. */ - sc->sc_hastpc = ath_hal_hastpc(ah); - if (sc->sc_hastpc || ath_hal_hastxpowlimit(ah)) + if (ath_hal_hastpc(ah) || ath_hal_hastxpowlimit(ah)) ic->ic_caps |= IEEE80211_C_TXPMGT; /* @@ -547,10 +546,6 @@ ath_attach(u_int16_t devid, struct ath_softc *sc) /* * Query the hal about antenna support. */ - if (ath_hal_hasdiversity(ah)) { - sc->sc_hasdiversity = 1; - sc->sc_diversity = ath_hal_getdiversity(ah); - } sc->sc_defant = ath_hal_getdefantenna(ah); /* @@ -880,6 +875,11 @@ ath_init(void *arg) * but it's best done after a reset. */ ath_update_txpow(sc); + /* + * Likewise this is set during reset so update + * state cached in the driver. + */ + sc->sc_diversity = ath_hal_getdiversity(ah); /* * Setup the hardware after reset: the key cache @@ -1031,6 +1031,7 @@ ath_reset(struct ifnet *ifp) if_printf(ifp, "%s: unable to reset hardware; hal status %u\n", __func__, status); ath_update_txpow(sc); /* update tx power state */ + sc->sc_diversity = ath_hal_getdiversity(ah); if (ath_startrecv(sc) != 0) /* restart recv */ if_printf(ifp, "%s: unable to start recv logic\n", __func__); /* @@ -4040,6 +4041,7 @@ ath_chan_set(struct ath_softc *sc, struct ieee80211_channel *chan) } sc->sc_curchan = hchan; ath_update_txpow(sc); /* update tx power state */ + sc->sc_diversity = ath_hal_getdiversity(ah); /* * Re-enable rx framework. @@ -4820,14 +4822,16 @@ static int ath_sysctl_diversity(SYSCTL_HANDLER_ARGS) { struct ath_softc *sc = arg1; - u_int diversity = sc->sc_diversity; + u_int diversity = ath_hal_getdiversity(sc->sc_ah); int error; error = sysctl_handle_int(oidp, &diversity, 0, req); if (error || !req->newptr) return error; + if (!ath_hal_setdiversity(sc->sc_ah, diversity)) + return EINVAL; sc->sc_diversity = diversity; - return !ath_hal_setdiversity(sc->sc_ah, diversity) ? EINVAL : 0; + return 0; } static int @@ -4878,6 +4882,7 @@ ath_sysctlattach(struct ath_softc *sc) { struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->sc_dev); struct sysctl_oid *tree = device_get_sysctl_tree(sc->sc_dev); + struct ath_hal *ah = sc->sc_ah; ath_hal_getcountrycode(sc->sc_ah, &sc->sc_countrycode); SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, @@ -4919,7 +4924,7 @@ ath_sysctlattach(struct ath_softc *sc) SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "rxantenna", CTLTYPE_INT | CTLFLAG_RW, sc, 0, ath_sysctl_rxantenna, "I", "default/rx antenna"); - if (sc->sc_hasdiversity) + if (ath_hal_hasdiversity(ah)) SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "diversity", CTLTYPE_INT | CTLFLAG_RW, sc, 0, ath_sysctl_diversity, "I", "antenna diversity"); @@ -4933,7 +4938,7 @@ ath_sysctlattach(struct ath_softc *sc) SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "tpscale", CTLTYPE_INT | CTLFLAG_RW, sc, 0, ath_sysctl_tpscale, "I", "tx power scaling"); - if (sc->sc_hastpc) + if (ath_hal_hastpc(ah)) SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "tpc", CTLTYPE_INT | CTLFLAG_RW, sc, 0, ath_sysctl_tpc, "I", "enable/disable per-packet TPC"); diff --git a/sys/dev/ath/if_athvar.h b/sys/dev/ath/if_athvar.h index 95aa365..b6e0aaf 100644 --- a/sys/dev/ath/if_athvar.h +++ b/sys/dev/ath/if_athvar.h @@ -199,10 +199,8 @@ struct ath_softc { sc_softled : 1, /* enable LED gpio status */ sc_splitmic: 1, /* split TKIP MIC keys */ sc_needmib : 1, /* enable MIB stats intr */ - sc_hasdiversity : 1,/* rx diversity available */ sc_diversity : 1,/* enable rx diversity */ sc_hasveol : 1, /* tx VEOL support */ - sc_hastpc : 1, /* per-packet TPC support */ sc_ledstate: 1, /* LED on/off state */ sc_blinking: 1, /* LED blink operation active */ sc_mcastkey: 1, /* mcast key cache search */ |