From owner-p4-projects@FreeBSD.ORG Sun Jan 21 00:02:11 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 1461016A406; Sun, 21 Jan 2007 00:02:11 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id E632516A404 for ; Sun, 21 Jan 2007 00:02:10 +0000 (UTC) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id D462E13C45A for ; Sun, 21 Jan 2007 00:02:10 +0000 (UTC) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id l0L02AW3048813 for ; Sun, 21 Jan 2007 00:02:10 GMT (envelope-from sam@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id l0L02AwA048810 for perforce@freebsd.org; Sun, 21 Jan 2007 00:02:10 GMT (envelope-from sam@freebsd.org) Date: Sun, 21 Jan 2007 00:02:10 GMT Message-Id: <200701210002.l0L02AwA048810@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to sam@freebsd.org using -f From: Sam Leffler To: Perforce Change Reviews Cc: Subject: PERFORCE change 113230 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 21 Jan 2007 00:02:11 -0000 http://perforce.freebsd.org/chv.cgi?CH=113230 Change 113230 by sam@sam_ebb on 2007/01/21 00:01:21 IFC @ 113228 Affected files ... .. //depot/projects/wifi/sys/dev/ath/ath_rate/sample/sample.c#11 integrate .. //depot/projects/wifi/sys/dev/ath/ath_rate/sample/sample.h#6 integrate .. //depot/projects/wifi/sys/dev/ath/if_ath.c#127 integrate .. //depot/projects/wifi/sys/dev/ath/if_athvar.h#52 integrate Differences ... ==== //depot/projects/wifi/sys/dev/ath/ath_rate/sample/sample.c#11 (text+ko) ==== @@ -36,7 +36,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/ath/ath_rate/sample/sample.c,v 1.15 2006/12/13 19:34:35 sam Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/ath/ath_rate/sample/sample.c,v 1.16 2007/01/15 01:17:44 sam Exp $"); /* * John Bicket's SampleRate control algorithm. @@ -534,24 +534,6 @@ short_tries, long_tries); return; } - - if (ts->ts_status) { /* this packet failed */ - DPRINTF(sc, ATH_DEBUG_RATE, -"%s: %s size %d rate/try [%d/%d %d/%d %d/%d %d/%d] FAIL tries [%d/%d]\n", - __func__, - ether_sprintf(an->an_node.ni_macaddr), - bin_to_size(size_to_bin(frame_size)), - sc->sc_hwmap[MS(ds0->ds_ctl3, AR_XmitRate0)].ieeerate, - MS(ds0->ds_ctl2, AR_XmitDataTries0), - sc->sc_hwmap[MS(ds0->ds_ctl3, AR_XmitRate1)].ieeerate, - MS(ds0->ds_ctl2, AR_XmitDataTries1), - sc->sc_hwmap[MS(ds0->ds_ctl3, AR_XmitRate2)].ieeerate, - MS(ds0->ds_ctl2, AR_XmitDataTries2), - sc->sc_hwmap[MS(ds0->ds_ctl3, AR_XmitRate3)].ieeerate, - MS(ds0->ds_ctl2, AR_XmitDataTries3), - short_tries, long_tries); - } - mrr = sc->sc_mrretry && !(ic->ic_flags & IEEE80211_F_USEPROT); if (!mrr || !(ts->ts_rate & HAL_TXSTAT_ALTRATE)) { int ndx = rate_to_ndx(sn, final_rate); @@ -572,32 +554,43 @@ 0, 0, short_tries, long_tries, ts->ts_status); } else { - int rate0, tries0, ndx0; - int rate1, tries1, ndx1; - int rate2, tries2, ndx2; - int rate3, tries3, ndx3; + int hwrate0, rate0, tries0, ndx0; + int hwrate1, rate1, tries1, ndx1; + int hwrate2, rate2, tries2, ndx2; + int hwrate3, rate3, tries3, ndx3; int finalTSIdx = ts->ts_finaltsi; /* * Process intermediate rates that failed. */ - rate0 = sc->sc_hwmap[MS(ds0->ds_ctl3, AR_XmitRate0)].ieeerate; + if (sc->sc_ah->ah_magic != 0x20065416) { + hwrate0 = MS(ds0->ds_ctl3, AR_XmitRate0); + hwrate1 = MS(ds0->ds_ctl3, AR_XmitRate1); + hwrate2 = MS(ds0->ds_ctl3, AR_XmitRate2); + hwrate3 = MS(ds0->ds_ctl3, AR_XmitRate3); + } else { + hwrate0 = MS(ds0->ds_ctl3, AR5416_XmitRate0); + hwrate1 = MS(ds0->ds_ctl3, AR5416_XmitRate1); + hwrate2 = MS(ds0->ds_ctl3, AR5416_XmitRate2); + hwrate3 = MS(ds0->ds_ctl3, AR5416_XmitRate3); + } + + rate0 = sc->sc_hwmap[hwrate0].ieeerate; tries0 = MS(ds0->ds_ctl2, AR_XmitDataTries0); ndx0 = rate_to_ndx(sn, rate0); - rate1 = sc->sc_hwmap[MS(ds0->ds_ctl3, AR_XmitRate1)].ieeerate; + rate1 = sc->sc_hwmap[hwrate1].ieeerate; tries1 = MS(ds0->ds_ctl2, AR_XmitDataTries1); ndx1 = rate_to_ndx(sn, rate1); - rate2 = sc->sc_hwmap[MS(ds0->ds_ctl3, AR_XmitRate2)].ieeerate; + rate2 = sc->sc_hwmap[hwrate2].ieeerate; tries2 = MS(ds0->ds_ctl2, AR_XmitDataTries2); ndx2 = rate_to_ndx(sn, rate2); - rate3 = sc->sc_hwmap[MS(ds0->ds_ctl3, AR_XmitRate3)].ieeerate; + rate3 = sc->sc_hwmap[hwrate3].ieeerate; tries3 = MS(ds0->ds_ctl2, AR_XmitDataTries3); ndx3 = rate_to_ndx(sn, rate3); -#if 1 DPRINTF(sc, ATH_DEBUG_RATE, "%s: %s size %d finaltsidx %d tries %d %s rate/try [%d/%d %d/%d %d/%d %d/%d]\n", __func__, ether_sprintf(an->an_node.ni_macaddr), @@ -609,7 +602,6 @@ rate1, tries1, rate2, tries2, rate3, tries3); -#endif /* * NB: series > 0 are not penalized for failure ==== //depot/projects/wifi/sys/dev/ath/ath_rate/sample/sample.h#6 (text+ko) ==== @@ -33,7 +33,7 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGES. * - * $FreeBSD: src/sys/dev/ath/ath_rate/sample/sample.h,v 1.6 2006/12/13 19:34:35 sam Exp $ + * $FreeBSD: src/sys/dev/ath/ath_rate/sample/sample.h,v 1.7 2007/01/15 01:17:44 sam Exp $ */ /* @@ -136,6 +136,16 @@ #define AR_XmitRate3 0x000f8000 /* series 3 tx rate */ #define AR_XmitRate3_S 15 +/* TX ds_ctl3 for 5416 */ +#define AR5416_XmitRate0 0x000000ff /* series 0 tx rate */ +#define AR5416_XmitRate0_S 0 +#define AR5416_XmitRate1 0x0000ff00 /* series 1 tx rate */ +#define AR5416_XmitRate1_S 8 +#define AR5416_XmitRate2 0x00ff0000 /* series 2 tx rate */ +#define AR5416_XmitRate2_S 16 +#define AR5416_XmitRate3 0xff000000 /* series 3 tx rate */ +#define AR5416_XmitRate3_S 24 + #define MS(_v, _f) (((_v) & (_f)) >> _f##_S) /* ==== //depot/projects/wifi/sys/dev/ath/if_ath.c#127 (text+ko) ==== @@ -35,7 +35,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/ath/if_ath.c,v 1.158 2006/12/27 19:07:09 sam Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/ath/if_ath.c,v 1.159 2007/01/15 01:15:57 sam Exp $"); /* * Driver for the Atheros Wireless LAN controller. @@ -370,8 +370,8 @@ ath_rate_setup(sc, IEEE80211_MODE_TURBO_A); ath_rate_setup(sc, IEEE80211_MODE_TURBO_G); ath_rate_setup(sc, IEEE80211_MODE_STURBO_A); - ath_rate_setup(sc, IEEE80211_MODE_11A_HALF); - ath_rate_setup(sc, IEEE80211_MODE_11A_QUARTER); + ath_rate_setup(sc, IEEE80211_MODE_HALF); + ath_rate_setup(sc, IEEE80211_MODE_QUARTER); /* NB: setup here so ath_rate_update is happy */ ath_setcurmode(sc, IEEE80211_MODE_11A); @@ -945,8 +945,13 @@ } } -static u_int -ath_chan2flags(struct ieee80211_channel *chan) +/* + * Convert net80211 channel to a HAL channel with the flags + * constrained to reflect the current operating mode and + * the frequency possibly mapped for GSM channels. + */ +static void +ath_mapchan(HAL_CHANNEL *hc, const struct ieee80211_channel *chan) { #define N(a) (sizeof(a) / sizeof(a[0])) static const u_int modeflags[] = { @@ -960,16 +965,17 @@ CHANNEL_ST /* IEEE80211_MODE_STURBO_A */ }; enum ieee80211_phymode mode = ieee80211_chan2mode(chan); - int flags; KASSERT(mode < N(modeflags), ("unexpected phy mode %u", mode)); KASSERT(modeflags[mode] != 0, ("mode %u undefined", mode)); - flags = modeflags[mode]; + hc->channelFlags = modeflags[mode]; if (IEEE80211_IS_CHAN_HALF(chan)) - flags |= CHANNEL_HALF; - else if (IEEE80211_IS_CHAN_QUARTER(chan)) - flags |= CHANNEL_QUARTER; - return flags; + hc->channelFlags |= CHANNEL_HALF; + if (IEEE80211_IS_CHAN_QUARTER(chan)) + hc->channelFlags |= CHANNEL_QUARTER; + + hc->channel = IEEE80211_IS_CHAN_GSM(chan) ? + 2422 + (922 - chan->ic_freq) : chan->ic_freq; #undef N } @@ -999,8 +1005,7 @@ * be followed by initialization of the appropriate bits * and then setup of the interrupt mask. */ - sc->sc_curchan.channel = ic->ic_curchan->ic_freq; - sc->sc_curchan.channelFlags = ath_chan2flags(ic->ic_curchan); + ath_mapchan(&sc->sc_curchan, ic->ic_curchan); if (!ath_hal_reset(ah, sc->sc_opmode, &sc->sc_curchan, AH_FALSE, &status)) { if_printf(ifp, "unable to reset hardware; hal status %u\n", status); @@ -1158,16 +1163,13 @@ struct ath_softc *sc = ifp->if_softc; struct ieee80211com *ic = &sc->sc_ic; struct ath_hal *ah = sc->sc_ah; - struct ieee80211_channel *c; HAL_STATUS status; /* * Convert to a HAL channel description with the flags * constrained to reflect the current operating mode. */ - c = ic->ic_curchan; - sc->sc_curchan.channel = c->ic_freq; - sc->sc_curchan.channelFlags = ath_chan2flags(c); + ath_mapchan(&sc->sc_curchan, ic->ic_curchan); ath_hal_intrset(ah, 0); /* disable interrupts */ ath_draintxq(sc); /* stop xmit side */ @@ -1185,7 +1187,7 @@ * that changes the channel so update any state that * might change as a result. */ - ath_chan_change(sc, c); + ath_chan_change(sc, ic->ic_curchan); if (ath_startrecv(sc) != 0) /* restart recv */ if_printf(ifp, "%s: unable to start recv logic\n", __func__); if (ic->ic_state == IEEE80211_S_RUN) @@ -2376,17 +2378,19 @@ struct ath_hal *ah = sc->sc_ah; u_int usec; - if (IEEE80211_IS_CHAN_A(ic->ic_curchan)) { - if (IEEE80211_IS_CHAN_HALF(ic->ic_curchan)) - usec = 13; - else if (IEEE80211_IS_CHAN_QUARTER(ic->ic_curchan)) - usec = 21; + if (IEEE80211_IS_CHAN_HALF(ic->ic_curchan)) + usec = 13; + else if (IEEE80211_IS_CHAN_QUARTER(ic->ic_curchan)) + usec = 21; + else if (IEEE80211_IS_CHAN_ANYG(ic->ic_curchan)) { + /* honor short/long slot time only in 11g */ + /* XXX shouldn't honor on pure g or turbo g channel */ + if (ic->ic_flags & IEEE80211_F_SHSLOT) + usec = HAL_SLOT_TIME_9; else - usec = HAL_SLOT_TIME_9; - } else if (ic->ic_flags & IEEE80211_F_SHSLOT) + usec = HAL_SLOT_TIME_20; + } else usec = HAL_SLOT_TIME_9; - else - usec = HAL_SLOT_TIME_20; DPRINTF(sc, ATH_DEBUG_RESET, "%s: chan %u MHz flags 0x%x %s slot, %u usec\n", @@ -3243,8 +3247,7 @@ *rssi = ath_node_getrssi(ni); if (ni->ni_chan != IEEE80211_CHAN_ANYC) { - hchan.channel = ni->ni_chan->ic_freq; - hchan.channelFlags = ath_chan2flags(ni->ni_chan); + ath_mapchan(&hchan, ni->ni_chan); *noise = ath_hal_getchannoise(ah, &hchan); } else *noise = -95; /* nominally correct */ @@ -4959,13 +4962,12 @@ * Change channels and update the h/w rate map * if we're switching; e.g. 11a to 11b/g. */ - mode = ieee80211_chan2mode(chan); - if (mode == IEEE80211_MODE_11A) { - if (IEEE80211_IS_CHAN_HALF(chan)) - mode = IEEE80211_MODE_11A_HALF; - else if (IEEE80211_IS_CHAN_QUARTER(chan)) - mode = IEEE80211_MODE_11A_QUARTER; - } + if (IEEE80211_IS_CHAN_HALF(chan)) + mode = IEEE80211_MODE_HALF; + else if (IEEE80211_IS_CHAN_QUARTER(chan)) + mode = IEEE80211_MODE_QUARTER; + else + mode = ieee80211_chan2mode(chan); if (mode != sc->sc_curmode) ath_setcurmode(sc, mode); /* @@ -4980,6 +4982,10 @@ flags = IEEE80211_CHAN_B; if (IEEE80211_IS_CHAN_TURBO(chan)) flags |= IEEE80211_CHAN_TURBO; + if (IEEE80211_IS_CHAN_HALF(chan)) + flags |= IEEE80211_CHAN_HALF; + if (IEEE80211_IS_CHAN_QUARTER(chan)) + flags |= IEEE80211_CHAN_QUARTER; sc->sc_tx_th.wt_chan_freq = sc->sc_rx_th.wr_chan_freq = htole16(chan->ic_freq); sc->sc_tx_th.wt_chan_flags = sc->sc_rx_th.wr_chan_flags = @@ -5040,8 +5046,7 @@ * the flags constrained to reflect the current * operating mode. */ - hchan.channel = chan->ic_freq; - hchan.channelFlags = ath_chan2flags(chan); + ath_mapchan(&hchan, chan); DPRINTF(sc, ATH_DEBUG_RESET, "%s: %u (%u MHz, hal flags 0x%x) -> %u (%u MHz, hal flags 0x%x)\n", @@ -5488,6 +5493,13 @@ ichan->ic_ieee += 37; /* XXX */ ichan->ic_freq = c->channel; ichan->ic_flags = c->channelFlags; + if (ath_hal_isgsmsku(ah)) { + /* remap to true frequencies */ + ichan->ic_freq = 922 + (2422 - ichan->ic_freq); + ichan->ic_flags |= IEEE80211_CHAN_GSM; + ichan->ic_ieee = ieee80211_mhz2ieee(ichan->ic_freq, + ichan->ic_flags); + } ichan->ic_maxregpower = c->maxRegTxPower; /* dBm */ ichan->ic_maxpower = c->maxTxPower / 2; /* 1/2 dBm */ ichan->ic_minpower = c->minTxPower / 2; /* 1/2 dBm */ @@ -5590,10 +5602,10 @@ case IEEE80211_MODE_11A: rt = ath_hal_getratetable(ah, HAL_MODE_11A); break; - case IEEE80211_MODE_11A_HALF: + case IEEE80211_MODE_HALF: rt = ath_hal_getratetable(ah, HAL_MODE_11A_HALF_RATE); break; - case IEEE80211_MODE_11A_QUARTER: + case IEEE80211_MODE_QUARTER: rt = ath_hal_getratetable(ah, HAL_MODE_11A_QUARTER_RATE); break; case IEEE80211_MODE_11B: @@ -5644,6 +5656,7 @@ { 4, 267, 66 }, { 2, 400, 100 }, { 0, 500, 130 }, + /* XXX half/quarter rates */ }; const HAL_RATE_TABLE *rt; int i, j; ==== //depot/projects/wifi/sys/dev/ath/if_athvar.h#52 (text+ko) ==== @@ -33,7 +33,7 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGES. * - * $FreeBSD: src/sys/dev/ath/if_athvar.h,v 1.56 2006/12/27 19:07:09 sam Exp $ + * $FreeBSD: src/sys/dev/ath/if_athvar.h,v 1.58 2007/01/15 04:26:19 sam Exp $ */ /* @@ -227,8 +227,8 @@ sc_outdoor : 1,/* outdoor operation */ sc_dturbo : 1; /* dynamic turbo in use */ /* rate tables */ -#define IEEE80211_MODE_11A_HALF (IEEE80211_MODE_MAX+0) -#define IEEE80211_MODE_11A_QUARTER (IEEE80211_MODE_MAX+1) +#define IEEE80211_MODE_HALF (IEEE80211_MODE_MAX+0) +#define IEEE80211_MODE_QUARTER (IEEE80211_MODE_MAX+1) const HAL_RATE_TABLE *sc_rates[IEEE80211_MODE_MAX+2]; const HAL_RATE_TABLE *sc_half_rates; /* half rate table */ const HAL_RATE_TABLE *sc_quarter_rates;/* quarter rate table */ @@ -579,6 +579,11 @@ (((ah)->ah_regdomain == 0 && (ah)->ah_countryCode == 842) || \ (ah)->ah_regdomain == 0x12) #endif +#if HAL_ABI_VERSION < 0x06122400 +/* XXX yech, can't get to regdomain so just hack a compat shim */ +#define ath_hal_isgsmsku(ah) \ + ((ah)->ah_countryCode == 843) +#endif #define ath_hal_setuprxdesc(_ah, _ds, _size, _intreq) \ ((*(_ah)->ah_setupRxDesc)((_ah), (_ds), (_size), (_intreq)))