From 0351824ff8a8ca62dea3fa4a6718440b78d66869 Mon Sep 17 00:00:00 2001 From: Kevin Lo Date: Fri, 30 Dec 2016 03:08:46 +0000 Subject: [PATCH] - Fix incorrect values in the computation of OFDM and MCS Tx power. - Make power a uint8_t rather than a uint16_t. - Replace the hardcoded RF chains. Reviewed by: avos --- sys/dev/rtwn/rtl8812a/r12a_chan.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/sys/dev/rtwn/rtl8812a/r12a_chan.c b/sys/dev/rtwn/rtl8812a/r12a_chan.c index 004a1839b9cb..25ab394ff466 100644 --- a/sys/dev/rtwn/rtl8812a/r12a_chan.c +++ b/sys/dev/rtwn/rtl8812a/r12a_chan.c @@ -64,7 +64,7 @@ __FBSDID("$FreeBSD$"); static void r12a_write_txpower(struct rtwn_softc *sc, int chain, - struct ieee80211_channel *c, uint16_t power[RTWN_RIDX_COUNT]) + struct ieee80211_channel *c, uint8_t power[RTWN_RIDX_COUNT]) { if (IEEE80211_IS_CHAN_2GHZ(c)) { @@ -163,7 +163,7 @@ r12a_get_power_group(struct rtwn_softc *sc, struct ieee80211_channel *c) static void r12a_get_txpower(struct rtwn_softc *sc, int chain, - struct ieee80211_channel *c, uint16_t power[RTWN_RIDX_COUNT]) + struct ieee80211_channel *c, uint8_t power[RTWN_RIDX_COUNT]) { struct r12a_softc *rs = sc->sc_priv; int i, ridx, group, max_mcs; @@ -187,11 +187,8 @@ r12a_get_txpower(struct rtwn_softc *sc, int chain, for (ridx = RTWN_RIDX_OFDM6; ridx <= max_mcs; ridx++) power[ridx] = rs->ht40_tx_pwr_2g[chain][group]; - if (RTWN_RATE_IS_OFDM(ridx)) { - uint8_t pwr_diff = rs->ofdm_tx_pwr_diff_2g[chain][0]; - for (ridx = RTWN_RIDX_CCK1; ridx <= max_mcs; ridx++) - power[ridx] += pwr_diff; - } + for (ridx = RTWN_RIDX_OFDM6; ridx <= RTWN_RIDX_OFDM54; ridx++) + power[ridx] += rs->ofdm_tx_pwr_diff_2g[chain][0]; for (i = 0; i < sc->ntxchains; i++) { uint8_t min_mcs; @@ -208,7 +205,7 @@ r12a_get_txpower(struct rtwn_softc *sc, int chain, else pwr_diff = rs->bw20_tx_pwr_diff_2g[chain][i]; - min_mcs = RTWN_RIDX_MCS(i * 8 + 7); + min_mcs = RTWN_RIDX_MCS(i * 8); for (ridx = min_mcs; ridx <= max_mcs; ridx++) power[ridx] += pwr_diff; } @@ -216,6 +213,9 @@ r12a_get_txpower(struct rtwn_softc *sc, int chain, for (ridx = RTWN_RIDX_OFDM6; ridx <= max_mcs; ridx++) power[ridx] = rs->ht40_tx_pwr_5g[chain][group]; + for (ridx = RTWN_RIDX_OFDM6; ridx <= RTWN_RIDX_OFDM54; ridx++) + power[ridx] += rs->ofdm_tx_pwr_diff_5g[chain][0]; + for (i = 0; i < sc->ntxchains; i++) { uint8_t min_mcs; uint8_t pwr_diff; @@ -231,7 +231,7 @@ r12a_get_txpower(struct rtwn_softc *sc, int chain, else pwr_diff = rs->bw20_tx_pwr_diff_5g[chain][i]; - min_mcs = RTWN_RIDX_MCS(i * 8 + 7); + min_mcs = RTWN_RIDX_MCS(i * 8); for (ridx = min_mcs; ridx <= max_mcs; ridx++) power[ridx] += pwr_diff; } @@ -256,7 +256,7 @@ r12a_get_txpower(struct rtwn_softc *sc, int chain, static void r12a_set_txpower(struct rtwn_softc *sc, struct ieee80211_channel *c) { - uint16_t power[RTWN_RIDX_COUNT]; + uint8_t power[RTWN_RIDX_COUNT]; int i; for (i = 0; i < sc->ntxchains; i++) { @@ -463,7 +463,7 @@ r12a_set_chan(struct rtwn_softc *sc, struct ieee80211_channel *c) /* RTL8812AU-specific */ rtwn_r12a_fix_spur(sc, c); - for (i = 0; i < 2; i++) + for (i = 0; i < sc->nrxchains; i++) rtwn_rf_setbits(sc, i, R92C_RF_CHNLBW, 0xc00, val); /* Set Tx power for this new channel. */