summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsam <sam@FreeBSD.org>2005-07-24 05:11:39 +0000
committersam <sam@FreeBSD.org>2005-07-24 05:11:39 +0000
commitdae7e7f3e8cc89fb32a5e007cd67694e852b7fae (patch)
treea34dde4b9ce7319b4ee38a21f782ab7b8940784e
parentb9cf082129e9aee4e22881240ef45376354cdecb (diff)
downloadFreeBSD-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
-rw-r--r--sys/dev/ath/if_ath.c25
-rw-r--r--sys/dev/ath/if_athvar.h2
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 */
OpenPOWER on IntegriCloud