aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00
diff options
context:
space:
mode:
authorStanislaw Gruszka <sgruszka@redhat.com>2012-10-05 07:44:14 -0400
committerJohn W. Linville <linville@tuxdriver.com>2012-10-19 15:53:14 -0400
commit1e4cf249a43da5c441c1025aca588ca65185fb61 (patch)
tree356e18db72e59a729b30ebccaf42f5b76185203b /drivers/net/wireless/rt2x00
parent146c3b0ccd09dbd21f7dd6c9ed10094cb91f9a2d (diff)
rt2800: allow to reduce tx power on devices not exporting power limit
Some rt2800 devices don't have their calibrated max eirp tx power in their calibration data. For those devices reduce tx power according to difference between regulatory max channel power and requested tx power. This patch is based on Helmut Schaa work. Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> Acked-by: Gertjan van Wingerde <gwingerde@gmail.com> Acked-by: Ivo van Doorn <IvDoorn@gmail.com> Acked-by: Helmut Schaa <helmut.schaa@googlemail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rt2x00')
-rw-r--r--drivers/net/wireless/rt2x00/rt2800lib.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index 7110e1f1e49a..3e059b6c484d 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -2520,6 +2520,27 @@ static int rt2800_get_txpower_bw_comp(struct rt2x00_dev *rt2x00dev,
2520 return comp_value; 2520 return comp_value;
2521} 2521}
2522 2522
2523static int rt2800_get_txpower_reg_delta(struct rt2x00_dev *rt2x00dev,
2524 int power_level, int max_power)
2525{
2526 int delta;
2527
2528 if (test_bit(CAPABILITY_POWER_LIMIT, &rt2x00dev->cap_flags))
2529 return 0;
2530
2531 /*
2532 * XXX: We don't know the maximum transmit power of our hardware since
2533 * the EEPROM doesn't expose it. We only know that we are calibrated
2534 * to 100% tx power.
2535 *
2536 * Hence, we assume the regulatory limit that cfg80211 calulated for
2537 * the current channel is our maximum and if we are requested to lower
2538 * the value we just reduce our tx power accordingly.
2539 */
2540 delta = power_level - max_power;
2541 return min(delta, 0);
2542}
2543
2523static u8 rt2800_compensate_txpower(struct rt2x00_dev *rt2x00dev, int is_rate_b, 2544static u8 rt2800_compensate_txpower(struct rt2x00_dev *rt2x00dev, int is_rate_b,
2524 enum ieee80211_band band, int power_level, 2545 enum ieee80211_band band, int power_level,
2525 u8 txpower, int delta) 2546 u8 txpower, int delta)
@@ -2586,6 +2607,12 @@ static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
2586 delta += rt2800_get_gain_calibration_delta(rt2x00dev); 2607 delta += rt2800_get_gain_calibration_delta(rt2x00dev);
2587 2608
2588 /* 2609 /*
2610 * Apply regulatory delta.
2611 */
2612 delta += rt2800_get_txpower_reg_delta(rt2x00dev, power_level,
2613 chan->max_power);
2614
2615 /*
2589 * BBP_R1 controls TX power for all rates, it allow to set the following 2616 * BBP_R1 controls TX power for all rates, it allow to set the following
2590 * gains -12, -6, 0, +6 dBm by setting values 2, 1, 0, 3 respectively. 2617 * gains -12, -6, 0, +6 dBm by setting values 2, 1, 0, 3 respectively.
2591 * 2618 *