From 28e8004af2118dcca493dfff4c0aa0d80f8b5b1d Mon Sep 17 00:00:00 2001 From: Stanislaw Gruszka Date: Fri, 5 Oct 2012 13:44:14 +0200 Subject: [PATCH] --- yaml --- r: 340909 b: refs/heads/master c: 1e4cf249a43da5c441c1025aca588ca65185fb61 h: refs/heads/master i: 340907: 96b50cafe0102beb4c3ec8a1754b8f234cf72eaa v: v3 --- [refs] | 2 +- trunk/drivers/net/wireless/rt2x00/rt2800lib.c | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 01890006c655..4475bf280d02 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 146c3b0ccd09dbd21f7dd6c9ed10094cb91f9a2d +refs/heads/master: 1e4cf249a43da5c441c1025aca588ca65185fb61 diff --git a/trunk/drivers/net/wireless/rt2x00/rt2800lib.c b/trunk/drivers/net/wireless/rt2x00/rt2800lib.c index 7110e1f1e49a..3e059b6c484d 100644 --- a/trunk/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/trunk/drivers/net/wireless/rt2x00/rt2800lib.c @@ -2520,6 +2520,27 @@ static int rt2800_get_txpower_bw_comp(struct rt2x00_dev *rt2x00dev, return comp_value; } +static int rt2800_get_txpower_reg_delta(struct rt2x00_dev *rt2x00dev, + int power_level, int max_power) +{ + int delta; + + if (test_bit(CAPABILITY_POWER_LIMIT, &rt2x00dev->cap_flags)) + return 0; + + /* + * XXX: We don't know the maximum transmit power of our hardware since + * the EEPROM doesn't expose it. We only know that we are calibrated + * to 100% tx power. + * + * Hence, we assume the regulatory limit that cfg80211 calulated for + * the current channel is our maximum and if we are requested to lower + * the value we just reduce our tx power accordingly. + */ + delta = power_level - max_power; + return min(delta, 0); +} + static u8 rt2800_compensate_txpower(struct rt2x00_dev *rt2x00dev, int is_rate_b, enum ieee80211_band band, int power_level, u8 txpower, int delta) @@ -2585,6 +2606,12 @@ static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev, */ delta += rt2800_get_gain_calibration_delta(rt2x00dev); + /* + * Apply regulatory delta. + */ + delta += rt2800_get_txpower_reg_delta(rt2x00dev, power_level, + chan->max_power); + /* * BBP_R1 controls TX power for all rates, it allow to set the following * gains -12, -6, 0, +6 dBm by setting values 2, 1, 0, 3 respectively.