diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/eeprom_def.c')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/eeprom_def.c | 43 |
1 files changed, 12 insertions, 31 deletions
diff --git a/drivers/net/wireless/ath/ath9k/eeprom_def.c b/drivers/net/wireless/ath/ath9k/eeprom_def.c index eda681fc7ba..e175e2078a3 100644 --- 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(struct ath_hw *ah, | |||
400 | struct ar5416_eeprom_def *eep = &ah->eeprom.def; | 400 | struct ar5416_eeprom_def *eep = &ah->eeprom.def; |
401 | struct modal_eep_header *pModal = eep->modalHeader; | 401 | struct modal_eep_header *pModal = eep->modalHeader; |
402 | struct base_eep_header *pBase = &eep->baseEepHeader; | 402 | struct base_eep_header *pBase = &eep->baseEepHeader; |
403 | int band = 0; | ||
403 | 404 | ||
404 | switch (param) { | 405 | switch (param) { |
405 | case EEP_NFTHRESH_5: | 406 | case EEP_NFTHRESH_5: |
@@ -467,6 +468,14 @@ static u32 ath9k_hw_def_get_eeprom(struct ath_hw *ah, | |||
467 | return pBase->pwr_table_offset; | 468 | return pBase->pwr_table_offset; |
468 | else | 469 | else |
469 | return AR5416_PWR_TABLE_OFFSET_DB; | 470 | return AR5416_PWR_TABLE_OFFSET_DB; |
471 | case EEP_ANTENNA_GAIN_2G: | ||
472 | band = 1; | ||
473 | /* fall through */ | ||
474 | case EEP_ANTENNA_GAIN_5G: | ||
475 | return max_t(u8, max_t(u8, | ||
476 | pModal[band].antennaGainCh[0], | ||
477 | pModal[band].antennaGainCh[1]), | ||
478 | pModal[band].antennaGainCh[2]); | ||
470 | default: | 479 | default: |
471 | return 0; | 480 | return 0; |
472 | } | 481 | } |
@@ -986,21 +995,15 @@ static void ath9k_hw_set_def_power_per_rate_table(struct ath_hw *ah, | |||
986 | struct ath9k_channel *chan, | 995 | struct ath9k_channel *chan, |
987 | int16_t *ratesArray, | 996 | int16_t *ratesArray, |
988 | u16 cfgCtl, | 997 | u16 cfgCtl, |
989 | u16 AntennaReduction, | 998 | u16 antenna_reduction, |
990 | u16 twiceMaxRegulatoryPower, | ||
991 | u16 powerLimit) | 999 | u16 powerLimit) |
992 | { | 1000 | { |
993 | #define REDUCE_SCALED_POWER_BY_TWO_CHAIN 6 /* 10*log10(2)*2 */ | 1001 | #define REDUCE_SCALED_POWER_BY_TWO_CHAIN 6 /* 10*log10(2)*2 */ |
994 | #define REDUCE_SCALED_POWER_BY_THREE_CHAIN 9 /* 10*log10(3)*2 */ | 1002 | #define REDUCE_SCALED_POWER_BY_THREE_CHAIN 9 /* 10*log10(3)*2 */ |
995 | 1003 | ||
996 | struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah); | ||
997 | struct ar5416_eeprom_def *pEepData = &ah->eeprom.def; | 1004 | struct ar5416_eeprom_def *pEepData = &ah->eeprom.def; |
998 | u16 twiceMaxEdgePower = MAX_RATE_POWER; | 1005 | u16 twiceMaxEdgePower = MAX_RATE_POWER; |
999 | static const u16 tpScaleReductionTable[5] = | ||
1000 | { 0, 3, 6, 9, MAX_RATE_POWER }; | ||
1001 | |||
1002 | int i; | 1006 | int i; |
1003 | int16_t twiceLargestAntenna; | ||
1004 | struct cal_ctl_data *rep; | 1007 | struct cal_ctl_data *rep; |
1005 | struct cal_target_power_leg targetPowerOfdm, targetPowerCck = { | 1008 | struct cal_target_power_leg targetPowerOfdm, targetPowerCck = { |
1006 | 0, { 0, 0, 0, 0} | 1009 | 0, { 0, 0, 0, 0} |
@@ -1012,7 +1015,7 @@ static void ath9k_hw_set_def_power_per_rate_table(struct ath_hw *ah, | |||
1012 | struct cal_target_power_ht targetPowerHt20, targetPowerHt40 = { | 1015 | struct cal_target_power_ht targetPowerHt20, targetPowerHt40 = { |
1013 | 0, {0, 0, 0, 0} | 1016 | 0, {0, 0, 0, 0} |
1014 | }; | 1017 | }; |
1015 | u16 scaledPower = 0, minCtlPower, maxRegAllowedPower; | 1018 | u16 scaledPower = 0, minCtlPower; |
1016 | static const u16 ctlModesFor11a[] = { | 1019 | static const u16 ctlModesFor11a[] = { |
1017 | CTL_11A, CTL_5GHT20, CTL_11A_EXT, CTL_5GHT40 | 1020 | CTL_11A, CTL_5GHT20, CTL_11A_EXT, CTL_5GHT40 |
1018 | }; | 1021 | }; |
@@ -1031,27 +1034,7 @@ static void ath9k_hw_set_def_power_per_rate_table(struct ath_hw *ah, | |||
1031 | 1034 | ||
1032 | ath9k_hw_get_channel_centers(ah, chan, ¢ers); | 1035 | ath9k_hw_get_channel_centers(ah, chan, ¢ers); |
1033 | 1036 | ||
1034 | twiceLargestAntenna = max( | 1037 | scaledPower = powerLimit - antenna_reduction; |
1035 | pEepData->modalHeader | ||
1036 | [IS_CHAN_2GHZ(chan)].antennaGainCh[0], | ||
1037 | pEepData->modalHeader | ||
1038 | [IS_CHAN_2GHZ(chan)].antennaGainCh[1]); | ||
1039 | |||
1040 | twiceLargestAntenna = max((u8)twiceLargestAntenna, | ||
1041 | pEepData->modalHeader | ||
1042 | [IS_CHAN_2GHZ(chan)].antennaGainCh[2]); | ||
1043 | |||
1044 | twiceLargestAntenna = (int16_t)min(AntennaReduction - | ||
1045 | twiceLargestAntenna, 0); | ||
1046 | |||
1047 | maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna; | ||
1048 | |||
1049 | if (regulatory->tp_scale != ATH9K_TP_SCALE_MAX) { | ||
1050 | maxRegAllowedPower -= | ||
1051 | (tpScaleReductionTable[(regulatory->tp_scale)] * 2); | ||
1052 | } | ||
1053 | |||
1054 | scaledPower = min(powerLimit, maxRegAllowedPower); | ||
1055 | 1038 | ||
1056 | switch (ar5416_get_ntxchains(tx_chainmask)) { | 1039 | switch (ar5416_get_ntxchains(tx_chainmask)) { |
1057 | case 1: | 1040 | case 1: |
@@ -1256,7 +1239,6 @@ static void ath9k_hw_def_set_txpower(struct ath_hw *ah, | |||
1256 | struct ath9k_channel *chan, | 1239 | struct ath9k_channel *chan, |
1257 | u16 cfgCtl, | 1240 | u16 cfgCtl, |
1258 | u8 twiceAntennaReduction, | 1241 | u8 twiceAntennaReduction, |
1259 | u8 twiceMaxRegulatoryPower, | ||
1260 | u8 powerLimit, bool test) | 1242 | u8 powerLimit, bool test) |
1261 | { | 1243 | { |
1262 | #define RT_AR_DELTA(x) (ratesArray[x] - cck_ofdm_delta) | 1244 | #define RT_AR_DELTA(x) (ratesArray[x] - cck_ofdm_delta) |
@@ -1278,7 +1260,6 @@ static void ath9k_hw_def_set_txpower(struct ath_hw *ah, | |||
1278 | ath9k_hw_set_def_power_per_rate_table(ah, chan, | 1260 | ath9k_hw_set_def_power_per_rate_table(ah, chan, |
1279 | &ratesArray[0], cfgCtl, | 1261 | &ratesArray[0], cfgCtl, |
1280 | twiceAntennaReduction, | 1262 | twiceAntennaReduction, |
1281 | twiceMaxRegulatoryPower, | ||
1282 | powerLimit); | 1263 | powerLimit); |
1283 | 1264 | ||
1284 | ath9k_hw_set_def_power_cal_table(ah, chan); | 1265 | ath9k_hw_set_def_power_cal_table(ah, chan); |