mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-11-08 00:17:32 +02:00
628 lines
20 KiB
Diff
628 lines
20 KiB
Diff
|
--- a/drivers/net/wireless/ath/ath.h
|
||
|
+++ b/drivers/net/wireless/ath/ath.h
|
||
|
@@ -71,7 +71,6 @@ struct ath_regulatory {
|
||
|
char alpha2[2];
|
||
|
u16 country_code;
|
||
|
u16 max_power_level;
|
||
|
- u32 tp_scale;
|
||
|
u16 current_rd;
|
||
|
u16 current_rd_ext;
|
||
|
int16_t power_limit;
|
||
|
--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||
|
+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||
|
@@ -3040,6 +3040,10 @@ static u32 ath9k_hw_ar9300_get_eeprom(st
|
||
|
return (pBase->miscConfiguration >> 0x3) & 0x1;
|
||
|
case EEP_ANT_DIV_CTL1:
|
||
|
return eep->base_ext1.ant_div_control;
|
||
|
+ case EEP_ANTENNA_GAIN_5G:
|
||
|
+ return eep->modalHeader5G.antennaGain;
|
||
|
+ case EEP_ANTENNA_GAIN_2G:
|
||
|
+ return eep->modalHeader2G.antennaGain;
|
||
|
default:
|
||
|
return 0;
|
||
|
}
|
||
|
@@ -4727,20 +4731,14 @@ static u16 ar9003_hw_get_max_edge_power(
|
||
|
static void ar9003_hw_set_power_per_rate_table(struct ath_hw *ah,
|
||
|
struct ath9k_channel *chan,
|
||
|
u8 *pPwrArray, u16 cfgCtl,
|
||
|
- u8 twiceAntennaReduction,
|
||
|
- u8 twiceMaxRegulatoryPower,
|
||
|
+ u8 antenna_reduction,
|
||
|
u16 powerLimit)
|
||
|
{
|
||
|
- struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||
|
struct ath_common *common = ath9k_hw_common(ah);
|
||
|
struct ar9300_eeprom *pEepData = &ah->eeprom.ar9300_eep;
|
||
|
u16 twiceMaxEdgePower = MAX_RATE_POWER;
|
||
|
- static const u16 tpScaleReductionTable[5] = {
|
||
|
- 0, 3, 6, 9, MAX_RATE_POWER
|
||
|
- };
|
||
|
int i;
|
||
|
- int16_t twiceLargestAntenna;
|
||
|
- u16 scaledPower = 0, minCtlPower, maxRegAllowedPower;
|
||
|
+ u16 scaledPower = 0, minCtlPower;
|
||
|
static const u16 ctlModesFor11a[] = {
|
||
|
CTL_11A, CTL_5GHT20, CTL_11A_EXT, CTL_5GHT40
|
||
|
};
|
||
|
@@ -4758,28 +4756,7 @@ static void ar9003_hw_set_power_per_rate
|
||
|
bool is2ghz = IS_CHAN_2GHZ(chan);
|
||
|
|
||
|
ath9k_hw_get_channel_centers(ah, chan, ¢ers);
|
||
|
-
|
||
|
- /* Compute TxPower reduction due to Antenna Gain */
|
||
|
- if (is2ghz)
|
||
|
- twiceLargestAntenna = pEepData->modalHeader2G.antennaGain;
|
||
|
- else
|
||
|
- twiceLargestAntenna = pEepData->modalHeader5G.antennaGain;
|
||
|
-
|
||
|
- twiceLargestAntenna = (int16_t)min((twiceAntennaReduction) -
|
||
|
- twiceLargestAntenna, 0);
|
||
|
-
|
||
|
- /*
|
||
|
- * scaledPower is the minimum of the user input power level
|
||
|
- * and the regulatory allowed power level
|
||
|
- */
|
||
|
- maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna;
|
||
|
-
|
||
|
- if (regulatory->tp_scale != ATH9K_TP_SCALE_MAX) {
|
||
|
- maxRegAllowedPower -=
|
||
|
- (tpScaleReductionTable[(regulatory->tp_scale)] * 2);
|
||
|
- }
|
||
|
-
|
||
|
- scaledPower = min(powerLimit, maxRegAllowedPower);
|
||
|
+ scaledPower = powerLimit - antenna_reduction;
|
||
|
|
||
|
/*
|
||
|
* Reduce scaled Power by number of chains active to get
|
||
|
@@ -4966,7 +4943,6 @@ static inline u8 mcsidx_to_tgtpwridx(uns
|
||
|
static void ath9k_hw_ar9300_set_txpower(struct ath_hw *ah,
|
||
|
struct ath9k_channel *chan, u16 cfgCtl,
|
||
|
u8 twiceAntennaReduction,
|
||
|
- u8 twiceMaxRegulatoryPower,
|
||
|
u8 powerLimit, bool test)
|
||
|
{
|
||
|
struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||
|
@@ -5019,7 +4995,6 @@ static void ath9k_hw_ar9300_set_txpower(
|
||
|
ar9003_hw_set_power_per_rate_table(ah, chan,
|
||
|
targetPowerValT2, cfgCtl,
|
||
|
twiceAntennaReduction,
|
||
|
- twiceMaxRegulatoryPower,
|
||
|
powerLimit);
|
||
|
|
||
|
if (ah->eep_ops->get_eeprom(ah, EEP_PAPRD)) {
|
||
|
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||
|
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||
|
@@ -429,7 +429,6 @@ static void ath9k_hw_init_defaults(struc
|
||
|
|
||
|
regulatory->country_code = CTRY_DEFAULT;
|
||
|
regulatory->power_limit = MAX_RATE_POWER;
|
||
|
- regulatory->tp_scale = ATH9K_TP_SCALE_MAX;
|
||
|
|
||
|
ah->hw_version.magic = AR5416_MAGIC;
|
||
|
ah->hw_version.subvendorid = 0;
|
||
|
@@ -1396,9 +1395,7 @@ static bool ath9k_hw_chip_reset(struct a
|
||
|
static bool ath9k_hw_channel_change(struct ath_hw *ah,
|
||
|
struct ath9k_channel *chan)
|
||
|
{
|
||
|
- struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||
|
struct ath_common *common = ath9k_hw_common(ah);
|
||
|
- struct ieee80211_channel *channel = chan->chan;
|
||
|
u32 qnum;
|
||
|
int r;
|
||
|
|
||
|
@@ -1423,14 +1420,7 @@ static bool ath9k_hw_channel_change(stru
|
||
|
return false;
|
||
|
}
|
||
|
ath9k_hw_set_clockrate(ah);
|
||
|
-
|
||
|
- ah->eep_ops->set_txpower(ah, chan,
|
||
|
- ath9k_regd_get_ctl(regulatory, chan),
|
||
|
- channel->max_antenna_gain * 2,
|
||
|
- channel->max_power * 2,
|
||
|
- min((u32) MAX_RATE_POWER,
|
||
|
- (u32) regulatory->power_limit), false);
|
||
|
-
|
||
|
+ ath9k_hw_apply_txpower(ah, chan);
|
||
|
ath9k_hw_rfbus_done(ah);
|
||
|
|
||
|
if (IS_CHAN_OFDM(chan) || IS_CHAN_HT(chan))
|
||
|
@@ -2466,23 +2456,56 @@ bool ath9k_hw_disable(struct ath_hw *ah)
|
||
|
}
|
||
|
EXPORT_SYMBOL(ath9k_hw_disable);
|
||
|
|
||
|
+static int get_antenna_gain(struct ath_hw *ah, struct ath9k_channel *chan)
|
||
|
+{
|
||
|
+ enum eeprom_param gain_param;
|
||
|
+
|
||
|
+ if (IS_CHAN_2GHZ(chan))
|
||
|
+ gain_param = EEP_ANTENNA_GAIN_2G;
|
||
|
+ else
|
||
|
+ gain_param = EEP_ANTENNA_GAIN_5G;
|
||
|
+
|
||
|
+ return ah->eep_ops->get_eeprom(ah, gain_param);
|
||
|
+}
|
||
|
+
|
||
|
+void ath9k_hw_apply_txpower(struct ath_hw *ah, struct ath9k_channel *chan)
|
||
|
+{
|
||
|
+ struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
|
||
|
+ struct ieee80211_channel *channel;
|
||
|
+ int chan_pwr, new_pwr, max_gain;
|
||
|
+ int ant_gain, ant_reduction = 0;
|
||
|
+
|
||
|
+ if (!chan)
|
||
|
+ return;
|
||
|
+
|
||
|
+ channel = chan->chan;
|
||
|
+ chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER);
|
||
|
+ new_pwr = min_t(int, chan_pwr, reg->power_limit);
|
||
|
+ max_gain = new_pwr - chan_pwr + channel->max_antenna_gain * 2;
|
||
|
+
|
||
|
+ ant_gain = get_antenna_gain(ah, chan);
|
||
|
+ if (ant_gain > max_gain)
|
||
|
+ ant_reduction = ant_gain - max_gain;
|
||
|
+
|
||
|
+ ah->eep_ops->set_txpower(ah, chan,
|
||
|
+ ath9k_regd_get_ctl(reg, chan),
|
||
|
+ ant_reduction, new_pwr, false);
|
||
|
+}
|
||
|
+
|
||
|
void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit, bool test)
|
||
|
{
|
||
|
- struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||
|
+ struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
|
||
|
struct ath9k_channel *chan = ah->curchan;
|
||
|
struct ieee80211_channel *channel = chan->chan;
|
||
|
- int reg_pwr = min_t(int, MAX_RATE_POWER, limit);
|
||
|
- int chan_pwr = channel->max_power * 2;
|
||
|
|
||
|
+ reg->power_limit = min_t(int, limit, MAX_RATE_POWER);
|
||
|
if (test)
|
||
|
- reg_pwr = chan_pwr = MAX_RATE_POWER;
|
||
|
+ channel->max_power = MAX_RATE_POWER / 2;
|
||
|
|
||
|
- regulatory->power_limit = reg_pwr;
|
||
|
+ ath9k_hw_apply_txpower(ah, chan);
|
||
|
|
||
|
- ah->eep_ops->set_txpower(ah, chan,
|
||
|
- ath9k_regd_get_ctl(regulatory, chan),
|
||
|
- channel->max_antenna_gain * 2,
|
||
|
- chan_pwr, reg_pwr, test);
|
||
|
+ if (test)
|
||
|
+ channel->max_power = DIV_ROUND_UP(reg->max_power_level, 2);
|
||
|
}
|
||
|
EXPORT_SYMBOL(ath9k_hw_set_txpowerlimit);
|
||
|
|
||
|
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||
|
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||
|
@@ -389,14 +389,6 @@ enum ath9k_power_mode {
|
||
|
ATH9K_PM_UNDEFINED
|
||
|
};
|
||
|
|
||
|
-enum ath9k_tp_scale {
|
||
|
- ATH9K_TP_SCALE_MAX = 0,
|
||
|
- ATH9K_TP_SCALE_50,
|
||
|
- ATH9K_TP_SCALE_25,
|
||
|
- ATH9K_TP_SCALE_12,
|
||
|
- ATH9K_TP_SCALE_MIN
|
||
|
-};
|
||
|
-
|
||
|
enum ser_reg_mode {
|
||
|
SER_REG_MODE_OFF = 0,
|
||
|
SER_REG_MODE_ON = 1,
|
||
|
@@ -964,6 +956,7 @@ void ath9k_hw_htc_resetinit(struct ath_h
|
||
|
/* PHY */
|
||
|
void ath9k_hw_get_delta_slope_vals(struct ath_hw *ah, u32 coef_scaled,
|
||
|
u32 *coef_mantissa, u32 *coef_exponent);
|
||
|
+void ath9k_hw_apply_txpower(struct ath_hw *ah, struct ath9k_channel *chan);
|
||
|
|
||
|
/*
|
||
|
* Code Specific to AR5008, AR9001 or AR9002,
|
||
|
--- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
|
||
|
+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
|
||
|
@@ -350,6 +350,8 @@ static u32 ath9k_hw_4k_get_eeprom(struct
|
||
|
return pModal->antdiv_ctl1;
|
||
|
case EEP_TXGAIN_TYPE:
|
||
|
return pBase->txGainType;
|
||
|
+ case EEP_ANTENNA_GAIN_2G:
|
||
|
+ return pModal->antennaGainCh[0];
|
||
|
default:
|
||
|
return 0;
|
||
|
}
|
||
|
@@ -462,8 +464,7 @@ static void ath9k_hw_set_4k_power_per_ra
|
||
|
struct ath9k_channel *chan,
|
||
|
int16_t *ratesArray,
|
||
|
u16 cfgCtl,
|
||
|
- u16 AntennaReduction,
|
||
|
- u16 twiceMaxRegulatoryPower,
|
||
|
+ u16 antenna_reduction,
|
||
|
u16 powerLimit)
|
||
|
{
|
||
|
#define CMP_TEST_GRP \
|
||
|
@@ -472,20 +473,16 @@ static void ath9k_hw_set_4k_power_per_ra
|
||
|
|| (((cfgCtl & ~CTL_MODE_M) | (pCtlMode[ctlMode] & CTL_MODE_M)) == \
|
||
|
((pEepData->ctlIndex[i] & CTL_MODE_M) | SD_NO_CTL))
|
||
|
|
||
|
- struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||
|
int i;
|
||
|
- int16_t twiceLargestAntenna;
|
||
|
u16 twiceMinEdgePower;
|
||
|
u16 twiceMaxEdgePower = MAX_RATE_POWER;
|
||
|
- u16 scaledPower = 0, minCtlPower, maxRegAllowedPower;
|
||
|
+ u16 scaledPower = 0, minCtlPower;
|
||
|
u16 numCtlModes;
|
||
|
const u16 *pCtlMode;
|
||
|
u16 ctlMode, freq;
|
||
|
struct chan_centers centers;
|
||
|
struct cal_ctl_data_4k *rep;
|
||
|
struct ar5416_eeprom_4k *pEepData = &ah->eeprom.map4k;
|
||
|
- static const u16 tpScaleReductionTable[5] =
|
||
|
- { 0, 3, 6, 9, MAX_RATE_POWER };
|
||
|
struct cal_target_power_leg targetPowerOfdm, targetPowerCck = {
|
||
|
0, { 0, 0, 0, 0}
|
||
|
};
|
||
|
@@ -503,19 +500,7 @@ static void ath9k_hw_set_4k_power_per_ra
|
||
|
|
||
|
ath9k_hw_get_channel_centers(ah, chan, ¢ers);
|
||
|
|
||
|
- twiceLargestAntenna = pEepData->modalHeader.antennaGainCh[0];
|
||
|
- twiceLargestAntenna = (int16_t)min(AntennaReduction -
|
||
|
- twiceLargestAntenna, 0);
|
||
|
-
|
||
|
- maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna;
|
||
|
- if (regulatory->tp_scale != ATH9K_TP_SCALE_MAX) {
|
||
|
- maxRegAllowedPower -=
|
||
|
- (tpScaleReductionTable[(regulatory->tp_scale)] * 2);
|
||
|
- }
|
||
|
-
|
||
|
- scaledPower = min(powerLimit, maxRegAllowedPower);
|
||
|
- scaledPower = max((u16)0, scaledPower);
|
||
|
-
|
||
|
+ scaledPower = powerLimit - antenna_reduction;
|
||
|
numCtlModes = ARRAY_SIZE(ctlModesFor11g) - SUB_NUM_CTL_MODES_AT_2G_40;
|
||
|
pCtlMode = ctlModesFor11g;
|
||
|
|
||
|
@@ -671,7 +656,6 @@ static void ath9k_hw_4k_set_txpower(stru
|
||
|
struct ath9k_channel *chan,
|
||
|
u16 cfgCtl,
|
||
|
u8 twiceAntennaReduction,
|
||
|
- u8 twiceMaxRegulatoryPower,
|
||
|
u8 powerLimit, bool test)
|
||
|
{
|
||
|
struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||
|
@@ -691,7 +675,6 @@ static void ath9k_hw_4k_set_txpower(stru
|
||
|
ath9k_hw_set_4k_power_per_rate_table(ah, chan,
|
||
|
&ratesArray[0], cfgCtl,
|
||
|
twiceAntennaReduction,
|
||
|
- twiceMaxRegulatoryPower,
|
||
|
powerLimit);
|
||
|
|
||
|
ath9k_hw_set_4k_power_cal_table(ah, chan);
|
||
|
--- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c
|
||
|
+++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c
|
||
|
@@ -336,6 +336,9 @@ static u32 ath9k_hw_ar9287_get_eeprom(st
|
||
|
return pBase->tempSensSlopePalOn;
|
||
|
else
|
||
|
return 0;
|
||
|
+ case EEP_ANTENNA_GAIN_2G:
|
||
|
+ return max_t(u8, pModal->antennaGainCh[0],
|
||
|
+ pModal->antennaGainCh[1]);
|
||
|
default:
|
||
|
return 0;
|
||
|
}
|
||
|
@@ -554,8 +557,7 @@ static void ath9k_hw_set_ar9287_power_pe
|
||
|
struct ath9k_channel *chan,
|
||
|
int16_t *ratesArray,
|
||
|
u16 cfgCtl,
|
||
|
- u16 AntennaReduction,
|
||
|
- u16 twiceMaxRegulatoryPower,
|
||
|
+ u16 antenna_reduction,
|
||
|
u16 powerLimit)
|
||
|
{
|
||
|
#define CMP_CTL \
|
||
|
@@ -569,12 +571,8 @@ static void ath9k_hw_set_ar9287_power_pe
|
||
|
#define REDUCE_SCALED_POWER_BY_TWO_CHAIN 6
|
||
|
#define REDUCE_SCALED_POWER_BY_THREE_CHAIN 10
|
||
|
|
||
|
- struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||
|
u16 twiceMaxEdgePower = MAX_RATE_POWER;
|
||
|
- static const u16 tpScaleReductionTable[5] =
|
||
|
- { 0, 3, 6, 9, MAX_RATE_POWER };
|
||
|
int i;
|
||
|
- int16_t twiceLargestAntenna;
|
||
|
struct cal_ctl_data_ar9287 *rep;
|
||
|
struct cal_target_power_leg targetPowerOfdm = {0, {0, 0, 0, 0} },
|
||
|
targetPowerCck = {0, {0, 0, 0, 0} };
|
||
|
@@ -582,7 +580,7 @@ static void ath9k_hw_set_ar9287_power_pe
|
||
|
targetPowerCckExt = {0, {0, 0, 0, 0} };
|
||
|
struct cal_target_power_ht targetPowerHt20,
|
||
|
targetPowerHt40 = {0, {0, 0, 0, 0} };
|
||
|
- u16 scaledPower = 0, minCtlPower, maxRegAllowedPower;
|
||
|
+ u16 scaledPower = 0, minCtlPower;
|
||
|
static const u16 ctlModesFor11g[] = {
|
||
|
CTL_11B, CTL_11G, CTL_2GHT20,
|
||
|
CTL_11B_EXT, CTL_11G_EXT, CTL_2GHT40
|
||
|
@@ -597,24 +595,7 @@ static void ath9k_hw_set_ar9287_power_pe
|
||
|
tx_chainmask = ah->txchainmask;
|
||
|
|
||
|
ath9k_hw_get_channel_centers(ah, chan, ¢ers);
|
||
|
-
|
||
|
- /* Compute TxPower reduction due to Antenna Gain */
|
||
|
- twiceLargestAntenna = max(pEepData->modalHeader.antennaGainCh[0],
|
||
|
- pEepData->modalHeader.antennaGainCh[1]);
|
||
|
- twiceLargestAntenna = (int16_t)min((AntennaReduction) -
|
||
|
- twiceLargestAntenna, 0);
|
||
|
-
|
||
|
- /*
|
||
|
- * scaledPower is the minimum of the user input power level
|
||
|
- * and the regulatory allowed power level.
|
||
|
- */
|
||
|
- maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna;
|
||
|
-
|
||
|
- if (regulatory->tp_scale != ATH9K_TP_SCALE_MAX)
|
||
|
- maxRegAllowedPower -=
|
||
|
- (tpScaleReductionTable[(regulatory->tp_scale)] * 2);
|
||
|
-
|
||
|
- scaledPower = min(powerLimit, maxRegAllowedPower);
|
||
|
+ scaledPower = powerLimit - antenna_reduction;
|
||
|
|
||
|
/*
|
||
|
* Reduce scaled Power by number of chains active
|
||
|
@@ -815,7 +796,6 @@ static void ath9k_hw_set_ar9287_power_pe
|
||
|
static void ath9k_hw_ar9287_set_txpower(struct ath_hw *ah,
|
||
|
struct ath9k_channel *chan, u16 cfgCtl,
|
||
|
u8 twiceAntennaReduction,
|
||
|
- u8 twiceMaxRegulatoryPower,
|
||
|
u8 powerLimit, bool test)
|
||
|
{
|
||
|
struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||
|
@@ -834,7 +814,6 @@ static void ath9k_hw_ar9287_set_txpower(
|
||
|
ath9k_hw_set_ar9287_power_per_rate_table(ah, chan,
|
||
|
&ratesArray[0], cfgCtl,
|
||
|
twiceAntennaReduction,
|
||
|
- twiceMaxRegulatoryPower,
|
||
|
powerLimit);
|
||
|
|
||
|
ath9k_hw_set_ar9287_power_cal_table(ah, chan);
|
||
|
--- a/drivers/net/wireless/ath/ath9k/eeprom_def.c
|
||
|
+++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c
|
||
|
@@ -400,6 +400,7 @@ static u32 ath9k_hw_def_get_eeprom(struc
|
||
|
struct ar5416_eeprom_def *eep = &ah->eeprom.def;
|
||
|
struct modal_eep_header *pModal = eep->modalHeader;
|
||
|
struct base_eep_header *pBase = &eep->baseEepHeader;
|
||
|
+ int band = 0;
|
||
|
|
||
|
switch (param) {
|
||
|
case EEP_NFTHRESH_5:
|
||
|
@@ -467,6 +468,14 @@ static u32 ath9k_hw_def_get_eeprom(struc
|
||
|
return pBase->pwr_table_offset;
|
||
|
else
|
||
|
return AR5416_PWR_TABLE_OFFSET_DB;
|
||
|
+ case EEP_ANTENNA_GAIN_2G:
|
||
|
+ band = 1;
|
||
|
+ /* fall through */
|
||
|
+ case EEP_ANTENNA_GAIN_5G:
|
||
|
+ return max_t(u8, max_t(u8,
|
||
|
+ pModal[band].antennaGainCh[0],
|
||
|
+ pModal[band].antennaGainCh[1]),
|
||
|
+ pModal[band].antennaGainCh[2]);
|
||
|
default:
|
||
|
return 0;
|
||
|
}
|
||
|
@@ -986,21 +995,15 @@ static void ath9k_hw_set_def_power_per_r
|
||
|
struct ath9k_channel *chan,
|
||
|
int16_t *ratesArray,
|
||
|
u16 cfgCtl,
|
||
|
- u16 AntennaReduction,
|
||
|
- u16 twiceMaxRegulatoryPower,
|
||
|
+ u16 antenna_reduction,
|
||
|
u16 powerLimit)
|
||
|
{
|
||
|
#define REDUCE_SCALED_POWER_BY_TWO_CHAIN 6 /* 10*log10(2)*2 */
|
||
|
#define REDUCE_SCALED_POWER_BY_THREE_CHAIN 9 /* 10*log10(3)*2 */
|
||
|
|
||
|
- struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||
|
struct ar5416_eeprom_def *pEepData = &ah->eeprom.def;
|
||
|
u16 twiceMaxEdgePower = MAX_RATE_POWER;
|
||
|
- static const u16 tpScaleReductionTable[5] =
|
||
|
- { 0, 3, 6, 9, MAX_RATE_POWER };
|
||
|
-
|
||
|
int i;
|
||
|
- int16_t twiceLargestAntenna;
|
||
|
struct cal_ctl_data *rep;
|
||
|
struct cal_target_power_leg targetPowerOfdm, targetPowerCck = {
|
||
|
0, { 0, 0, 0, 0}
|
||
|
@@ -1012,7 +1015,7 @@ static void ath9k_hw_set_def_power_per_r
|
||
|
struct cal_target_power_ht targetPowerHt20, targetPowerHt40 = {
|
||
|
0, {0, 0, 0, 0}
|
||
|
};
|
||
|
- u16 scaledPower = 0, minCtlPower, maxRegAllowedPower;
|
||
|
+ u16 scaledPower = 0, minCtlPower;
|
||
|
static const u16 ctlModesFor11a[] = {
|
||
|
CTL_11A, CTL_5GHT20, CTL_11A_EXT, CTL_5GHT40
|
||
|
};
|
||
|
@@ -1031,27 +1034,7 @@ static void ath9k_hw_set_def_power_per_r
|
||
|
|
||
|
ath9k_hw_get_channel_centers(ah, chan, ¢ers);
|
||
|
|
||
|
- twiceLargestAntenna = max(
|
||
|
- pEepData->modalHeader
|
||
|
- [IS_CHAN_2GHZ(chan)].antennaGainCh[0],
|
||
|
- pEepData->modalHeader
|
||
|
- [IS_CHAN_2GHZ(chan)].antennaGainCh[1]);
|
||
|
-
|
||
|
- twiceLargestAntenna = max((u8)twiceLargestAntenna,
|
||
|
- pEepData->modalHeader
|
||
|
- [IS_CHAN_2GHZ(chan)].antennaGainCh[2]);
|
||
|
-
|
||
|
- twiceLargestAntenna = (int16_t)min(AntennaReduction -
|
||
|
- twiceLargestAntenna, 0);
|
||
|
-
|
||
|
- maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna;
|
||
|
-
|
||
|
- if (regulatory->tp_scale != ATH9K_TP_SCALE_MAX) {
|
||
|
- maxRegAllowedPower -=
|
||
|
- (tpScaleReductionTable[(regulatory->tp_scale)] * 2);
|
||
|
- }
|
||
|
-
|
||
|
- scaledPower = min(powerLimit, maxRegAllowedPower);
|
||
|
+ scaledPower = powerLimit - antenna_reduction;
|
||
|
|
||
|
switch (ar5416_get_ntxchains(tx_chainmask)) {
|
||
|
case 1:
|
||
|
@@ -1256,7 +1239,6 @@ static void ath9k_hw_def_set_txpower(str
|
||
|
struct ath9k_channel *chan,
|
||
|
u16 cfgCtl,
|
||
|
u8 twiceAntennaReduction,
|
||
|
- u8 twiceMaxRegulatoryPower,
|
||
|
u8 powerLimit, bool test)
|
||
|
{
|
||
|
#define RT_AR_DELTA(x) (ratesArray[x] - cck_ofdm_delta)
|
||
|
@@ -1278,7 +1260,6 @@ static void ath9k_hw_def_set_txpower(str
|
||
|
ath9k_hw_set_def_power_per_rate_table(ah, chan,
|
||
|
&ratesArray[0], cfgCtl,
|
||
|
twiceAntennaReduction,
|
||
|
- twiceMaxRegulatoryPower,
|
||
|
powerLimit);
|
||
|
|
||
|
ath9k_hw_set_def_power_cal_table(ah, chan);
|
||
|
--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
|
||
|
+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
|
||
|
@@ -763,10 +763,8 @@ static void ar5008_hw_set_channel_regs(s
|
||
|
static int ar5008_hw_process_ini(struct ath_hw *ah,
|
||
|
struct ath9k_channel *chan)
|
||
|
{
|
||
|
- struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||
|
struct ath_common *common = ath9k_hw_common(ah);
|
||
|
int i, regWrites = 0;
|
||
|
- struct ieee80211_channel *channel = chan->chan;
|
||
|
u32 modesIndex, freqIndex;
|
||
|
|
||
|
switch (chan->chanmode) {
|
||
|
@@ -903,14 +901,7 @@ static int ar5008_hw_process_ini(struct
|
||
|
ar5008_hw_set_channel_regs(ah, chan);
|
||
|
ar5008_hw_init_chain_masks(ah);
|
||
|
ath9k_olc_init(ah);
|
||
|
-
|
||
|
- /* Set TX power */
|
||
|
- ah->eep_ops->set_txpower(ah, chan,
|
||
|
- ath9k_regd_get_ctl(regulatory, chan),
|
||
|
- channel->max_antenna_gain * 2,
|
||
|
- channel->max_power * 2,
|
||
|
- min((u32) MAX_RATE_POWER,
|
||
|
- (u32) regulatory->power_limit), false);
|
||
|
+ ath9k_hw_apply_txpower(ah, chan);
|
||
|
|
||
|
/* Write analog registers */
|
||
|
if (!ath9k_hw_set_rf_regs(ah, chan, freqIndex)) {
|
||
|
--- a/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
|
||
|
+++ b/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
|
||
|
@@ -19,7 +19,6 @@
|
||
|
|
||
|
void ar9003_paprd_enable(struct ath_hw *ah, bool val)
|
||
|
{
|
||
|
- struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||
|
struct ath9k_channel *chan = ah->curchan;
|
||
|
struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
|
||
|
|
||
|
@@ -54,13 +53,7 @@ void ar9003_paprd_enable(struct ath_hw *
|
||
|
|
||
|
if (val) {
|
||
|
ah->paprd_table_write_done = true;
|
||
|
-
|
||
|
- ah->eep_ops->set_txpower(ah, chan,
|
||
|
- ath9k_regd_get_ctl(regulatory, chan),
|
||
|
- chan->chan->max_antenna_gain * 2,
|
||
|
- chan->chan->max_power * 2,
|
||
|
- min((u32) MAX_RATE_POWER,
|
||
|
- (u32) regulatory->power_limit), false);
|
||
|
+ ath9k_hw_apply_txpower(ah, chan);
|
||
|
}
|
||
|
|
||
|
REG_RMW_FIELD(ah, AR_PHY_PAPRD_CTRL0_B0,
|
||
|
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||
|
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||
|
@@ -628,9 +628,7 @@ static void ar9003_hw_prog_ini(struct at
|
||
|
static int ar9003_hw_process_ini(struct ath_hw *ah,
|
||
|
struct ath9k_channel *chan)
|
||
|
{
|
||
|
- struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||
|
unsigned int regWrites = 0, i;
|
||
|
- struct ieee80211_channel *channel = chan->chan;
|
||
|
u32 modesIndex;
|
||
|
|
||
|
switch (chan->chanmode) {
|
||
|
@@ -683,14 +681,7 @@ static int ar9003_hw_process_ini(struct
|
||
|
ar9003_hw_override_ini(ah);
|
||
|
ar9003_hw_set_channel_regs(ah, chan);
|
||
|
ar9003_hw_set_chain_masks(ah, ah->rxchainmask, ah->txchainmask);
|
||
|
-
|
||
|
- /* Set TX power */
|
||
|
- ah->eep_ops->set_txpower(ah, chan,
|
||
|
- ath9k_regd_get_ctl(regulatory, chan),
|
||
|
- channel->max_antenna_gain * 2,
|
||
|
- channel->max_power * 2,
|
||
|
- min((u32) MAX_RATE_POWER,
|
||
|
- (u32) regulatory->power_limit), false);
|
||
|
+ ath9k_hw_apply_txpower(ah, chan);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
--- a/drivers/net/wireless/ath/ath9k/common.c
|
||
|
+++ b/drivers/net/wireless/ath/ath9k/common.c
|
||
|
@@ -161,10 +161,12 @@ EXPORT_SYMBOL(ath9k_cmn_count_streams);
|
||
|
void ath9k_cmn_update_txpow(struct ath_hw *ah, u16 cur_txpow,
|
||
|
u16 new_txpow, u16 *txpower)
|
||
|
{
|
||
|
- if (cur_txpow != new_txpow) {
|
||
|
+ struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
|
||
|
+
|
||
|
+ if (reg->power_limit != new_txpow) {
|
||
|
ath9k_hw_set_txpowerlimit(ah, new_txpow, false);
|
||
|
/* read back in case value is clamped */
|
||
|
- *txpower = ath9k_hw_regulatory(ah)->power_limit;
|
||
|
+ *txpower = reg->max_power_level;
|
||
|
}
|
||
|
}
|
||
|
EXPORT_SYMBOL(ath9k_cmn_update_txpow);
|
||
|
--- a/drivers/net/wireless/ath/ath9k/eeprom.h
|
||
|
+++ b/drivers/net/wireless/ath/ath9k/eeprom.h
|
||
|
@@ -253,7 +253,9 @@ enum eeprom_param {
|
||
|
EEP_PAPRD,
|
||
|
EEP_MODAL_VER,
|
||
|
EEP_ANT_DIV_CTL1,
|
||
|
- EEP_CHAIN_MASK_REDUCE
|
||
|
+ EEP_CHAIN_MASK_REDUCE,
|
||
|
+ EEP_ANTENNA_GAIN_2G,
|
||
|
+ EEP_ANTENNA_GAIN_5G
|
||
|
};
|
||
|
|
||
|
enum ar5416_rates {
|
||
|
@@ -657,8 +659,7 @@ struct eeprom_ops {
|
||
|
void (*set_addac)(struct ath_hw *hw, struct ath9k_channel *chan);
|
||
|
void (*set_txpower)(struct ath_hw *hw, struct ath9k_channel *chan,
|
||
|
u16 cfgCtl, u8 twiceAntennaReduction,
|
||
|
- u8 twiceMaxRegulatoryPower, u8 powerLimit,
|
||
|
- bool test);
|
||
|
+ u8 powerLimit, bool test);
|
||
|
u16 (*get_spur_channel)(struct ath_hw *ah, u16 i, bool is2GHz);
|
||
|
};
|
||
|
|
||
|
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||
|
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||
|
@@ -626,7 +626,6 @@ static void ath9k_init_band_txpower(stru
|
||
|
struct ieee80211_supported_band *sband;
|
||
|
struct ieee80211_channel *chan;
|
||
|
struct ath_hw *ah = sc->sc_ah;
|
||
|
- struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
|
||
|
int i;
|
||
|
|
||
|
sband = &sc->sbands[band];
|
||
|
@@ -635,7 +634,6 @@ static void ath9k_init_band_txpower(stru
|
||
|
ah->curchan = &ah->channels[chan->hw_value];
|
||
|
ath9k_cmn_update_ichannel(ah->curchan, chan, NL80211_CHAN_HT20);
|
||
|
ath9k_hw_set_txpowerlimit(ah, MAX_RATE_POWER, true);
|
||
|
- chan->max_power = reg->max_power_level / 2;
|
||
|
}
|
||
|
}
|
||
|
|