|
@@ -1239,23 +1239,23 @@ static void rt2800_config_channel_rf2xxx(struct rt2x00_dev *rt2x00dev,
|
|
|
* double meaning, and we should set a 7DBm boost flag.
|
|
|
*/
|
|
|
rt2x00_set_field32(&rf->rf3, RF3_TXPOWER_A_7DBM_BOOST,
|
|
|
- (info->tx_power1 >= 0));
|
|
|
+ (info->default_power1 >= 0));
|
|
|
|
|
|
- if (info->tx_power1 < 0)
|
|
|
- info->tx_power1 += 7;
|
|
|
+ if (info->default_power1 < 0)
|
|
|
+ info->default_power1 += 7;
|
|
|
|
|
|
- rt2x00_set_field32(&rf->rf3, RF3_TXPOWER_A, info->tx_power1);
|
|
|
+ rt2x00_set_field32(&rf->rf3, RF3_TXPOWER_A, info->default_power1);
|
|
|
|
|
|
rt2x00_set_field32(&rf->rf4, RF4_TXPOWER_A_7DBM_BOOST,
|
|
|
- (info->tx_power2 >= 0));
|
|
|
+ (info->default_power2 >= 0));
|
|
|
|
|
|
- if (info->tx_power2 < 0)
|
|
|
- info->tx_power2 += 7;
|
|
|
+ if (info->default_power2 < 0)
|
|
|
+ info->default_power2 += 7;
|
|
|
|
|
|
- rt2x00_set_field32(&rf->rf4, RF4_TXPOWER_A, info->tx_power2);
|
|
|
+ rt2x00_set_field32(&rf->rf4, RF4_TXPOWER_A, info->default_power2);
|
|
|
} else {
|
|
|
- rt2x00_set_field32(&rf->rf3, RF3_TXPOWER_G, info->tx_power1);
|
|
|
- rt2x00_set_field32(&rf->rf4, RF4_TXPOWER_G, info->tx_power2);
|
|
|
+ rt2x00_set_field32(&rf->rf3, RF3_TXPOWER_G, info->default_power1);
|
|
|
+ rt2x00_set_field32(&rf->rf4, RF4_TXPOWER_G, info->default_power2);
|
|
|
}
|
|
|
|
|
|
rt2x00_set_field32(&rf->rf4, RF4_HT40, conf_is_ht40(conf));
|
|
@@ -1295,11 +1295,11 @@ static void rt2800_config_channel_rf3xxx(struct rt2x00_dev *rt2x00dev,
|
|
|
rt2800_rfcsr_write(rt2x00dev, 6, rfcsr);
|
|
|
|
|
|
rt2800_rfcsr_read(rt2x00dev, 12, &rfcsr);
|
|
|
- rt2x00_set_field8(&rfcsr, RFCSR12_TX_POWER, info->tx_power1);
|
|
|
+ rt2x00_set_field8(&rfcsr, RFCSR12_TX_POWER, info->default_power1);
|
|
|
rt2800_rfcsr_write(rt2x00dev, 12, rfcsr);
|
|
|
|
|
|
rt2800_rfcsr_read(rt2x00dev, 13, &rfcsr);
|
|
|
- rt2x00_set_field8(&rfcsr, RFCSR13_TX_POWER, info->tx_power2);
|
|
|
+ rt2x00_set_field8(&rfcsr, RFCSR13_TX_POWER, info->default_power2);
|
|
|
rt2800_rfcsr_write(rt2x00dev, 13, rfcsr);
|
|
|
|
|
|
rt2800_rfcsr_read(rt2x00dev, 23, &rfcsr);
|
|
@@ -1324,11 +1324,11 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
|
|
|
u8 bbp;
|
|
|
|
|
|
if (rf->channel <= 14) {
|
|
|
- info->tx_power1 = TXPOWER_G_TO_DEV(info->tx_power1);
|
|
|
- info->tx_power2 = TXPOWER_G_TO_DEV(info->tx_power2);
|
|
|
+ info->default_power1 = TXPOWER_G_TO_DEV(info->default_power1);
|
|
|
+ info->default_power2 = TXPOWER_G_TO_DEV(info->default_power2);
|
|
|
} else {
|
|
|
- info->tx_power1 = TXPOWER_A_TO_DEV(info->tx_power1);
|
|
|
- info->tx_power2 = TXPOWER_A_TO_DEV(info->tx_power2);
|
|
|
+ info->default_power1 = TXPOWER_A_TO_DEV(info->default_power1);
|
|
|
+ info->default_power2 = TXPOWER_A_TO_DEV(info->default_power2);
|
|
|
}
|
|
|
|
|
|
if (rt2x00_rf(rt2x00dev, RF2020) ||
|
|
@@ -2729,6 +2729,13 @@ int rt2800_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
|
|
default_lna_gain);
|
|
|
rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_A2, word);
|
|
|
|
|
|
+ rt2x00_eeprom_read(rt2x00dev, EEPROM_MAX_TX_POWER, &word);
|
|
|
+ if (rt2x00_get_field16(word, EEPROM_MAX_TX_POWER_24GHZ) == 0xff)
|
|
|
+ rt2x00_set_field16(&word, EEPROM_MAX_TX_POWER_24GHZ, MAX_G_TXPOWER);
|
|
|
+ if (rt2x00_get_field16(word, EEPROM_MAX_TX_POWER_5GHZ) == 0xff)
|
|
|
+ rt2x00_set_field16(&word, EEPROM_MAX_TX_POWER_5GHZ, MAX_A_TXPOWER);
|
|
|
+ rt2x00_eeprom_write(rt2x00dev, EEPROM_MAX_TX_POWER, word);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(rt2800_validate_eeprom);
|
|
@@ -2968,9 +2975,10 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
|
|
|
{
|
|
|
struct hw_mode_spec *spec = &rt2x00dev->spec;
|
|
|
struct channel_info *info;
|
|
|
- char *tx_power1;
|
|
|
- char *tx_power2;
|
|
|
+ char *default_power1;
|
|
|
+ char *default_power2;
|
|
|
unsigned int i;
|
|
|
+ unsigned short max_power;
|
|
|
u16 eeprom;
|
|
|
|
|
|
/*
|
|
@@ -3084,21 +3092,26 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
|
|
|
|
|
|
spec->channels_info = info;
|
|
|
|
|
|
- tx_power1 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG1);
|
|
|
- tx_power2 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG2);
|
|
|
+ rt2x00_eeprom_read(rt2x00dev, EEPROM_MAX_TX_POWER, &eeprom);
|
|
|
+ max_power = rt2x00_get_field16(eeprom, EEPROM_MAX_TX_POWER_24GHZ);
|
|
|
+ default_power1 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG1);
|
|
|
+ default_power2 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG2);
|
|
|
|
|
|
for (i = 0; i < 14; i++) {
|
|
|
- info[i].tx_power1 = TXPOWER_G_FROM_DEV(tx_power1[i]);
|
|
|
- info[i].tx_power2 = TXPOWER_G_FROM_DEV(tx_power2[i]);
|
|
|
+ info[i].max_power = max_power;
|
|
|
+ info[i].default_power1 = TXPOWER_G_FROM_DEV(default_power1[i]);
|
|
|
+ info[i].default_power2 = TXPOWER_G_FROM_DEV(default_power2[i]);
|
|
|
}
|
|
|
|
|
|
if (spec->num_channels > 14) {
|
|
|
- tx_power1 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A1);
|
|
|
- tx_power2 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A2);
|
|
|
+ max_power = rt2x00_get_field16(eeprom, EEPROM_MAX_TX_POWER_5GHZ);
|
|
|
+ default_power1 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A1);
|
|
|
+ default_power2 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A2);
|
|
|
|
|
|
for (i = 14; i < spec->num_channels; i++) {
|
|
|
- info[i].tx_power1 = TXPOWER_A_FROM_DEV(tx_power1[i]);
|
|
|
- info[i].tx_power2 = TXPOWER_A_FROM_DEV(tx_power2[i]);
|
|
|
+ info[i].max_power = max_power;
|
|
|
+ info[i].default_power1 = TXPOWER_A_FROM_DEV(default_power1[i]);
|
|
|
+ info[i].default_power2 = TXPOWER_A_FROM_DEV(default_power2[i]);
|
|
|
}
|
|
|
}
|
|
|
|