Date: Sat, 16 Feb 2008 04:03:30 GMT From: Sepherosa Ziehau <sephe@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 135475 for review Message-ID: <200802160403.m1G43Uol074303@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=135475 Change 135475 by sephe@sephe_zealot:sam_wifi on 2008/02/16 04:02:51 Merge following changes from dfly: - Try adjusting TX power as much as possible when doing the initial TX power calibration. Also the second TX power calibration happens 1 second after the initial TX power calibration. if streams are pushed immediately after NIC is brought up, this makes thing work much better for most of the 4306 BBP, whose default TX power seems to be far away from the max TX power. - Add some experimental (commented out) code to force TX power downgrade. Affected files ... .. //depot/projects/wifi/sys/dev/bwi/bwimac.c#6 edit .. //depot/projects/wifi/sys/dev/bwi/bwimac.h#2 edit .. //depot/projects/wifi/sys/dev/bwi/if_bwi.c#19 edit .. //depot/projects/wifi/sys/dev/bwi/if_bwivar.h#11 edit Differences ... ==== //depot/projects/wifi/sys/dev/bwi/bwimac.c#6 (text+ko) ==== @@ -1771,7 +1771,7 @@ * http://bcm-specs.sipsolutions.net/RecalculateTransmissionPower */ void -bwi_mac_calibrate_txpower(struct bwi_mac *mac) +bwi_mac_calibrate_txpower(struct bwi_mac *mac, enum bwi_txpwrcb_type type) { struct bwi_softc *sc = mac->mac_sc; struct bwi_rf *rf = &mac->mac_rf; @@ -1803,15 +1803,28 @@ DPRINTF(sc, BWI_DBG_MAC | BWI_DBG_TXPOWER, "%s\n", "no DS tssi"); - if (mac->mac_phy.phy_mode == IEEE80211_MODE_11B) - return; + if (mac->mac_phy.phy_mode == IEEE80211_MODE_11B) { + if (type == BWI_TXPWR_FORCE) { + rf_atten_adj = 0; + bbp_atten_adj = 1; + goto calib; + } else { + return; + } + } error = bwi_rf_get_latest_tssi(mac, tssi, BWI_COMM_MOBJ_TSSI_OFDM); if (error) { DPRINTF(sc, BWI_DBG_MAC | BWI_DBG_TXPOWER, "%s\n", "no OFDM tssi"); - return; + if (type == BWI_TXPWR_FORCE) { + rf_atten_adj = 0; + bbp_atten_adj = 1; + goto calib; + } else { + return; + } } for (i = 0; i < 4; ++i) { @@ -1847,8 +1860,15 @@ txpwr_diff = rf->rf_txpower_max - cur_txpwr; /* XXX ni_txpower */ rf_atten_adj = -howmany(txpwr_diff, 8); - bbp_atten_adj = -(txpwr_diff / 2) - - (BWI_RF_ATTEN_FACTOR * rf_atten_adj); + if (type == BWI_TXPWR_INIT) { + /* + * Move toward EEPROM max TX power as fast as we can + */ + bbp_atten_adj = -txpwr_diff; + } else { + bbp_atten_adj = -(txpwr_diff / 2); + } + bbp_atten_adj -= (BWI_RF_ATTEN_FACTOR * rf_atten_adj); if (rf_atten_adj == 0 && bbp_atten_adj == 0) { DPRINTF(sc, BWI_DBG_MAC | BWI_DBG_TXPOWER, "%s\n", @@ -1857,6 +1877,7 @@ return; } +calib: DPRINTF(sc, BWI_DBG_MAC | BWI_DBG_TXPOWER, "rf atten adjust %d, bbp atten adjust %d\n", rf_atten_adj, bbp_atten_adj); ==== //depot/projects/wifi/sys/dev/bwi/bwimac.h#2 (text+ko) ==== @@ -31,7 +31,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/dev/netif/bwi/bwimac.h,v 1.1 2007/09/08 06:15:54 sephe Exp $ + * $DragonFly: src/sys/dev/netif/bwi/bwimac.h,v 1.2 2008/02/15 11:15:38 sephe Exp $ */ #ifndef _BWI_MAC_H @@ -48,7 +48,8 @@ void bwi_mac_updateslot(struct bwi_mac *, int); void bwi_mac_set_promisc(struct bwi_mac *, int); -void bwi_mac_calibrate_txpower(struct bwi_mac *); +void bwi_mac_calibrate_txpower(struct bwi_mac *, + enum bwi_txpwrcb_type); void bwi_mac_set_tpctl_11bg(struct bwi_mac *, const struct bwi_tpctl *); void bwi_mac_init_tpctl_11bg(struct bwi_mac *); ==== //depot/projects/wifi/sys/dev/bwi/if_bwi.c#19 (text+ko) ==== @@ -1664,7 +1664,12 @@ mac = (struct bwi_mac *)sc->sc_cur_regwin; /* Initial TX power calibration */ - bwi_mac_calibrate_txpower(mac); + bwi_mac_calibrate_txpower(mac, BWI_TXPWR_INIT); +#ifdef notyet + sc->sc_txpwrcb_type = BWI_TXPWR_FORCE; +#else + sc->sc_txpwrcb_type = BWI_TXPWR_CALIB; +#endif if (ic->ic_opmode == IEEE80211_M_STA) { /* fake a join to init the tx rate */ @@ -1684,10 +1689,8 @@ back: error = sc->sc_newstate(ic, nstate, arg); - if (nstate == IEEE80211_S_RUN) { - /* XXX 15 seconds */ - callout_reset(&sc->sc_calib_ch, hz * 15, bwi_calibrate, sc); - } + if (nstate == IEEE80211_S_RUN) + callout_reset(&sc->sc_calib_ch, hz, bwi_calibrate, sc); BWI_UNLOCK(sc); return error; @@ -3571,8 +3574,10 @@ ("current regwin type %d", sc->sc_cur_regwin->rw_type)); mac = (struct bwi_mac *)sc->sc_cur_regwin; - if (ic->ic_opmode != IEEE80211_M_MONITOR) - bwi_mac_calibrate_txpower(mac); + if (ic->ic_opmode != IEEE80211_M_MONITOR) { + bwi_mac_calibrate_txpower(mac, sc->sc_txpwrcb_type); + sc->sc_txpwrcb_type = BWI_TXPWR_CALIB; + } /* XXX 15 seconds */ callout_reset(&sc->sc_calib_ch, hz * 15, bwi_calibrate, sc); ==== //depot/projects/wifi/sys/dev/bwi/if_bwivar.h#11 (text+ko) ==== @@ -62,6 +62,12 @@ #define BWI_LED_EVENT_RX 2 #define BWI_LED_SLOWDOWN(dur) (dur) = (((dur) * 3) / 2) +enum bwi_txpwrcb_type { + BWI_TXPWR_INIT = 0, + BWI_TXPWR_FORCE = 1, + BWI_TXPWR_CALIB = 2 +}; + #define BWI_NOISE_FLOOR -95 /* TODO: noise floor calc */ #define BWI_FRAME_MIN_LEN(hdr) \ ((hdr) + sizeof(struct ieee80211_frame_ack) + IEEE80211_CRC_LEN) @@ -571,6 +577,7 @@ int sc_rx_rate; int sc_tx_rate; + enum bwi_txpwrcb_type sc_txpwrcb_type; int sc_led_blinking; int sc_led_ticks;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200802160403.m1G43Uol074303>