Skip to content

Commit

Permalink
rt2x00: Don't recalculate HT40 compensation for each rate
Browse files Browse the repository at this point in the history
Previously the HT40 tx power compensation value was calculated for each
rate. However, the calculation is independent of the tx rate and as such
can be precalculated and just passed in for each rate.

Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Helmut Schaa authored and John W. Linville committed Apr 4, 2011
1 parent 75faae8 commit 2af242e
Showing 1 changed file with 18 additions and 14 deletions.
32 changes: 18 additions & 14 deletions drivers/net/wireless/rt2x00/rt2800lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -1861,21 +1861,19 @@ static u8 rt2800_compesate_txpower(struct rt2x00_dev *rt2x00dev,
int is_rate_b,
enum ieee80211_band band,
int power_level,
u8 txpower)
u8 txpower,
int delta)
{
u32 reg;
u16 eeprom;
u8 criterion;
u8 eirp_txpower;
u8 eirp_txpower_criterion;
u8 reg_limit;
int bw_comp;

if (!((band == IEEE80211_BAND_5GHZ) && is_rate_b))
return txpower;

bw_comp = rt2800_get_txpower_bw_comp(rt2x00dev, band);

if (test_bit(CONFIG_SUPPORT_POWER_LIMIT, &rt2x00dev->flags)) {
/*
* Check if eirp txpower exceed txpower_limit.
Expand All @@ -1898,14 +1896,14 @@ static u8 rt2800_compesate_txpower(struct rt2x00_dev *rt2x00dev,
EEPROM_EIRP_MAX_TX_POWER_5GHZ);

eirp_txpower = eirp_txpower_criterion + (txpower - criterion) +
(is_rate_b ? 4 : 0) + bw_comp;
(is_rate_b ? 4 : 0) + delta;

reg_limit = (eirp_txpower > power_level) ?
(eirp_txpower - power_level) : 0;
} else
reg_limit = 0;

return txpower + bw_comp - reg_limit;
return txpower + delta - reg_limit;
}

static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
Expand All @@ -1919,6 +1917,12 @@ static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
u32 offset;
enum ieee80211_band band = conf->channel->band;
int power_level = conf->power_level;
int delta;

/*
* Calculate HT40 compensation delta
*/
delta = rt2800_get_txpower_bw_comp(rt2x00dev, band);

/*
* set to normal bbp tx power control mode: +/- 0dBm
Expand Down Expand Up @@ -1948,7 +1952,7 @@ static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
txpower = rt2x00_get_field16(eeprom,
EEPROM_TXPOWER_BYRATE_RATE0);
txpower = rt2800_compesate_txpower(rt2x00dev, is_rate_b, band,
power_level, txpower);
power_level, txpower, delta);
rt2x00_set_field32(&reg, TX_PWR_CFG_RATE0, txpower);

/*
Expand All @@ -1959,7 +1963,7 @@ static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
txpower = rt2x00_get_field16(eeprom,
EEPROM_TXPOWER_BYRATE_RATE1);
txpower = rt2800_compesate_txpower(rt2x00dev, is_rate_b, band,
power_level, txpower);
power_level, txpower, delta);
rt2x00_set_field32(&reg, TX_PWR_CFG_RATE1, txpower);

/*
Expand All @@ -1970,7 +1974,7 @@ static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
txpower = rt2x00_get_field16(eeprom,
EEPROM_TXPOWER_BYRATE_RATE2);
txpower = rt2800_compesate_txpower(rt2x00dev, is_rate_b, band,
power_level, txpower);
power_level, txpower, delta);
rt2x00_set_field32(&reg, TX_PWR_CFG_RATE2, txpower);

/*
Expand All @@ -1981,7 +1985,7 @@ static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
txpower = rt2x00_get_field16(eeprom,
EEPROM_TXPOWER_BYRATE_RATE3);
txpower = rt2800_compesate_txpower(rt2x00dev, is_rate_b, band,
power_level, txpower);
power_level, txpower, delta);
rt2x00_set_field32(&reg, TX_PWR_CFG_RATE3, txpower);

/* read the next four txpower values */
Expand All @@ -1997,7 +2001,7 @@ static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
txpower = rt2x00_get_field16(eeprom,
EEPROM_TXPOWER_BYRATE_RATE0);
txpower = rt2800_compesate_txpower(rt2x00dev, is_rate_b, band,
power_level, txpower);
power_level, txpower, delta);
rt2x00_set_field32(&reg, TX_PWR_CFG_RATE4, txpower);

/*
Expand All @@ -2008,7 +2012,7 @@ static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
txpower = rt2x00_get_field16(eeprom,
EEPROM_TXPOWER_BYRATE_RATE1);
txpower = rt2800_compesate_txpower(rt2x00dev, is_rate_b, band,
power_level, txpower);
power_level, txpower, delta);
rt2x00_set_field32(&reg, TX_PWR_CFG_RATE5, txpower);

/*
Expand All @@ -2019,7 +2023,7 @@ static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
txpower = rt2x00_get_field16(eeprom,
EEPROM_TXPOWER_BYRATE_RATE2);
txpower = rt2800_compesate_txpower(rt2x00dev, is_rate_b, band,
power_level, txpower);
power_level, txpower, delta);
rt2x00_set_field32(&reg, TX_PWR_CFG_RATE6, txpower);

/*
Expand All @@ -2030,7 +2034,7 @@ static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
txpower = rt2x00_get_field16(eeprom,
EEPROM_TXPOWER_BYRATE_RATE3);
txpower = rt2800_compesate_txpower(rt2x00dev, is_rate_b, band,
power_level, txpower);
power_level, txpower, delta);
rt2x00_set_field32(&reg, TX_PWR_CFG_RATE7, txpower);

rt2800_register_write(rt2x00dev, offset, reg);
Expand Down

0 comments on commit 2af242e

Please sign in to comment.