Summary: | [ath] operational mode change doesn't poke the underlying rate control module hard enough | ||
---|---|---|---|
Product: | Base System | Reporter: | Adrian Chadd <adrian> |
Component: | wireless | Assignee: | freebsd-wireless (Nobody) <wireless> |
Status: | Closed FIXED | ||
Severity: | Affects Only Me | CC: | gonzo |
Priority: | Normal | ||
Version: | 9.0-RELEASE | ||
Hardware: | Any | ||
OS: | Any |
Description
Adrian Chadd
2012-02-25 19:50:11 UTC
Responsible Changed From-To: freebsd-bugs->freebsd-wireless Reassign Author: adrian Date: Sun Feb 26 06:04:44 2012 New Revision: 232170 URL: http://svn.freebsd.org/changeset/base/232170 Log: Add in some debugging code to check whether the current rate table has been bait-and-switched from the rate control code. This will avoid the panic that I saw and will avoid sending invalid rates (eg 11a/11g OFDM rates when in 11b, on 11b-only NICs (AR5211)) where the rate table is not "big". It also will point out situations where this occurs for the 11n NICs which will have sufficiently large rate tables that "invalid rix" doesn't occur. I'll try to follow this up with a commit that adds a current operating mode check. The "rix" is only relevant to the current operating mode and rate table. PR: kern/165475 Modified: head/sys/dev/ath/ath_rate/sample/sample.c head/sys/dev/ath/ath_rate/sample/sample.h Modified: head/sys/dev/ath/ath_rate/sample/sample.c ============================================================================== --- head/sys/dev/ath/ath_rate/sample/sample.c Sun Feb 26 02:24:40 2012 (r232169) +++ head/sys/dev/ath/ath_rate/sample/sample.c Sun Feb 26 06:04:44 2012 (r232170) @@ -495,6 +495,14 @@ ath_rate_findrate(struct ath_softc *sc, ath_rate_update_static_rix(sc, &an->an_node); + if (sn->currates != sc->sc_currates) { + device_printf(sc->sc_dev, "%s: currates != sc_currates!\n", + __func__); + rix = 0; + *try0 = ATH_TXMAXTRY; + goto done; + } + if (sn->static_rix != -1) { rix = sn->static_rix; *try0 = ATH_TXMAXTRY; @@ -621,6 +629,20 @@ ath_rate_findrate(struct ath_softc *sc, } *try0 = mrr ? sn->sched[rix].t0 : ATH_TXMAXTRY; done: + + /* + * This bug totally sucks and should be fixed. + * + * For now though, let's not panic, so we can start to figure + * out how to better reproduce it. + */ + if (rix < 0 || rix >= rt->rateCount) { + printf("%s: ERROR: rix %d out of bounds (rateCount=%d)\n", + __func__, + rix, + rt->rateCount); + rix = 0; /* XXX just default for now */ + } KASSERT(rix >= 0 && rix < rt->rateCount, ("rix is %d", rix)); *rix0 = rix; @@ -1073,6 +1095,8 @@ ath_rate_ctl_reset(struct ath_softc *sc, sn->static_rix = -1; ath_rate_update_static_rix(sc, ni); + sn->currates = sc->sc_currates; + /* * Construct a bitmask of usable rates. This has all * negotiated rates minus those marked by the hal as Modified: head/sys/dev/ath/ath_rate/sample/sample.h ============================================================================== --- head/sys/dev/ath/ath_rate/sample/sample.h Sun Feb 26 02:24:40 2012 (r232169) +++ head/sys/dev/ath/ath_rate/sample/sample.h Sun Feb 26 06:04:44 2012 (r232170) @@ -86,6 +86,8 @@ struct sample_node { uint32_t ratemask; /* bit mask of valid rate indices */ const struct txschedule *sched; /* tx schedule table */ + const HAL_RATE_TABLE *currates; + struct rate_stats stats[NUM_PACKET_SIZE_BINS][SAMPLE_MAXRATES]; int last_sample_rix[NUM_PACKET_SIZE_BINS]; _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org" batch change: For bugs that match the following - Status Is In progress AND - Untouched since 2018-01-01. AND - Affects Base System OR Documentation DO: Reset to open status. Note: I did a quick pass but if you are getting this email it might be worthwhile to double check to see if this bug ought to be closed. There was a commit referencing this bug, but it's still not closed and has been inactive for some time. Closing as fixed. Please re-open it if the issue hasn't been completely resolved. |