Changeset 33014


Ignore:
Timestamp:
2012-08-06T17:33:24+02:00 (5 years ago)
Author:
nbd
Message:

ath5k: add various pending tx power fixes, vastly improves stability and performance with various cards

Location:
trunk/package/mac80211/patches
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/mac80211/patches/300-pending_work.patch

    r32793 r33014  
    11--- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c 
    22+++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c 
     3@@ -210,8 +210,8 @@ ath5k_config(struct ieee80211_hw *hw, u3 
     4        } 
     5  
     6        if ((changed & IEEE80211_CONF_CHANGE_POWER) && 
     7-       (ah->power_level != conf->power_level)) { 
     8-               ah->power_level = conf->power_level; 
     9+       (ah->ah_txpower.txp_requested != conf->power_level)) { 
     10+               ah->ah_txpower.txp_requested = conf->power_level; 
     11  
     12                /* Half dB steps */ 
     13                ath5k_hw_set_txpower_limit(ah, (conf->power_level * 2)); 
    314@@ -622,7 +622,7 @@ ath5k_conf_tx(struct ieee80211_hw *hw, s 
    415        qi.tqi_aifs = params->aifs; 
     
    42574268--- a/drivers/net/wireless/ath/ath5k/ath5k.h 
    42584269+++ b/drivers/net/wireless/ath/ath5k/ath5k.h 
    4259 @@ -1418,6 +1418,7 @@ struct ath5k_hw { 
    4260                 s16             txp_min_pwr; 
    4261                 s16             txp_max_pwr; 
    4262                 s16             txp_cur_pwr; 
    4263 +               s16             txp_user_pwr; 
    4264                 /* Values in 0.5dB units */ 
    4265                 s16             txp_offset; 
    4266                 s16             txp_ofdm; 
     4270@@ -1331,7 +1331,6 @@ struct ath5k_hw { 
     4271        unsigned int            nexttbtt;       /* next beacon time in TU */ 
     4272        struct ath5k_txq        *cabq;          /* content after beacon */ 
     4273  
     4274-       int                     power_level;    /* Requested tx power in dBm */ 
     4275        bool                    assoc;          /* associate state */ 
     4276        bool                    enable_beacon;  /* true if beacons are on */ 
     4277  
     4278@@ -1425,6 +1424,7 @@ struct ath5k_hw { 
     4279                /* Value in dB units */ 
     4280                s16             txp_cck_ofdm_pwr_delta; 
     4281                bool            txp_setup; 
     4282+               int             txp_requested;  /* Requested tx power in dBm */ 
     4283        } ah_txpower; 
     4284  
     4285        struct ath5k_nfcal_hist ah_nfcal_hist; 
    42674286--- a/drivers/net/wireless/ath/ath5k/base.c 
    42684287+++ b/drivers/net/wireless/ath/ath5k/base.c 
    4269 @@ -2953,6 +2953,9 @@ ath5k_init(struct ieee80211_hw *hw) 
    4270                 hw->queues = 1; 
    4271         } 
    4272   
    4273 +       /* init tx_power setting to maximum */ 
    4274 +       ah->ah_txpower.txp_user_pwr = AR5K_TUNE_MAX_TXPOWER; 
    4275 + 
    4276         tasklet_init(&ah->rxtq, ath5k_tasklet_rx, (unsigned long)ah); 
    4277         tasklet_init(&ah->txtq, ath5k_tasklet_tx, (unsigned long)ah); 
    4278         tasklet_init(&ah->beacontq, ath5k_tasklet_beacon, (unsigned long)ah); 
     4288@@ -325,6 +325,8 @@ ath5k_setup_channels(struct ath5k_hw *ah 
     4289                if (!ath5k_is_standard_channel(ch, band)) 
     4290                        continue; 
     4291  
     4292+               channels[count].max_power = AR5K_TUNE_MAX_TXPOWER/2; 
     4293+ 
     4294                count++; 
     4295        } 
     4296  
     4297@@ -725,7 +727,7 @@ ath5k_txbuf_setup(struct ath5k_hw *ah, s 
     4298        ret = ah->ah_setup_tx_desc(ah, ds, pktlen, 
     4299                ieee80211_get_hdrlen_from_skb(skb), padsize, 
     4300                get_hw_packet_type(skb), 
     4301-               (ah->power_level * 2), 
     4302+               (ah->ah_txpower.txp_requested * 2), 
     4303                hw_rate, 
     4304                info->control.rates[0].count, keyidx, ah->ah_tx_ant, flags, 
     4305                cts_rate, duration); 
     4306@@ -1780,7 +1782,8 @@ ath5k_beacon_setup(struct ath5k_hw *ah,  
     4307        ds->ds_data = bf->skbaddr; 
     4308        ret = ah->ah_setup_tx_desc(ah, ds, skb->len, 
     4309                        ieee80211_get_hdrlen_from_skb(skb), padsize, 
     4310-                       AR5K_PKT_TYPE_BEACON, (ah->power_level * 2), 
     4311+                       AR5K_PKT_TYPE_BEACON, 
     4312+                       (ah->ah_txpower.txp_requested * 2), 
     4313                        ieee80211_get_tx_rate(ah->hw, info)->hw_value, 
     4314                        1, AR5K_TXKEYIX_INVALID, 
     4315                        antenna, flags, 0, 0); 
    42794316--- a/drivers/net/wireless/ath/ath5k/eeprom.c 
    42804317+++ b/drivers/net/wireless/ath/ath5k/eeprom.c 
    4281 @@ -1484,7 +1484,7 @@ ath5k_eeprom_read_target_rate_pwr_info(s 
    4282         case AR5K_EEPROM_MODE_11A: 
    4283                 offset += AR5K_EEPROM_TARGET_PWR_OFF_11A(ee->ee_version); 
    4284                 rate_pcal_info = ee->ee_rate_tpwr_a; 
    4285 -               ee->ee_rate_target_pwr_num[mode] = AR5K_EEPROM_N_5GHZ_CHAN; 
    4286 +               ee->ee_rate_target_pwr_num[mode] = AR5K_EEPROM_N_5GHZ_RATE_CHAN; 
    4287                 break; 
    4288         case AR5K_EEPROM_MODE_11B: 
    4289                 offset += AR5K_EEPROM_TARGET_PWR_OFF_11B(ee->ee_version); 
    4290 --- a/drivers/net/wireless/ath/ath5k/eeprom.h 
    4291 +++ b/drivers/net/wireless/ath/ath5k/eeprom.h 
    4292 @@ -182,6 +182,7 @@ 
    4293  #define AR5K_EEPROM_EEP_DELTA          10 
    4294  #define AR5K_EEPROM_N_MODES            3 
    4295  #define AR5K_EEPROM_N_5GHZ_CHAN                10 
    4296 +#define AR5K_EEPROM_N_5GHZ_RATE_CHAN   8 
    4297  #define AR5K_EEPROM_N_2GHZ_CHAN                3 
    4298  #define AR5K_EEPROM_N_2GHZ_CHAN_2413   4 
    4299  #define        AR5K_EEPROM_N_2GHZ_CHAN_MAX     4 
     4318@@ -524,7 +524,7 @@ ath5k_eeprom_read_freq_list(struct ath5k 
     4319  
     4320                freq1 = val & 0xff; 
     4321                if (!freq1) 
     4322-                       break; 
     4323+                       continue; 
     4324  
     4325                pc[i++].freq = ath5k_eeprom_bin2freq(ee, 
     4326                                freq1, mode); 
     4327@@ -532,7 +532,7 @@ ath5k_eeprom_read_freq_list(struct ath5k 
     4328  
     4329                freq2 = (val >> 8) & 0xff; 
     4330                if (!freq2) 
     4331-                       break; 
     4332+                       continue; 
     4333  
     4334                pc[i++].freq = ath5k_eeprom_bin2freq(ee, 
     4335                                freq2, mode); 
    43004336--- a/drivers/net/wireless/ath/ath5k/phy.c 
    43014337+++ b/drivers/net/wireless/ath/ath5k/phy.c 
    4302 @@ -3585,14 +3585,12 @@ ath5k_setup_rate_powertable(struct ath5k 
    4303   * ath5k_hw_txpower() - Set transmission power limit for a given channel 
    4304   * @ah: The &struct ath5k_hw 
    4305   * @channel: The &struct ieee80211_channel 
    4306 - * @txpower: Requested tx power in 0.5dB steps 
    4307   * 
    4308   * Combines all of the above to set the requested tx power limit 
    4309 - * on hw. 
    4310 + * on hw to ah->ah_txpower.txp_user_pwr. 
    4311   */ 
    4312  static int 
    4313 -ath5k_hw_txpower(struct ath5k_hw *ah, struct ieee80211_channel *channel, 
    4314 -                u8 txpower) 
    4315 +ath5k_hw_txpower(struct ath5k_hw *ah, struct ieee80211_channel *channel) 
    4316  { 
    4317         struct ath5k_rate_pcal_info rate_info; 
    4318         struct ieee80211_channel *curr_channel = ah->ah_current_channel; 
    4319 @@ -3600,11 +3598,6 @@ ath5k_hw_txpower(struct ath5k_hw *ah, st 
    4320         u8 type; 
    4321         int ret; 
    4322   
    4323 -       if (txpower > AR5K_TUNE_MAX_TXPOWER) { 
    4324 -               ATH5K_ERR(ah, "invalid tx power: %u\n", txpower); 
    4325 -               return -EINVAL; 
    4326 -       } 
    4327 - 
    4328         ee_mode = ath5k_eeprom_mode_from_channel(channel); 
    4329         if (ee_mode < 0) { 
    4330                 ATH5K_ERR(ah, 
    4331 @@ -3669,7 +3662,7 @@ ath5k_hw_txpower(struct ath5k_hw *ah, st 
    4332         ath5k_get_rate_pcal_data(ah, channel, &rate_info); 
    4333   
    4334         /* Setup rate power table */ 
    4335 -       ath5k_setup_rate_powertable(ah, txpower, &rate_info, ee_mode); 
    4336 +       ath5k_setup_rate_powertable(ah, ah->ah_txpower.txp_user_pwr, &rate_info, ee_mode); 
    4337   
    4338         /* Write rate power table on hw */ 
    4339         ath5k_hw_reg_write(ah, AR5K_TXPOWER_OFDM(3, 24) | 
    4340 @@ -3719,8 +3712,16 @@ ath5k_hw_set_txpower_limit(struct ath5k_ 
    4341  { 
    4342         ATH5K_DBG(ah, ATH5K_DEBUG_TXPOWER, 
    4343                 "changing txpower to %d\n", txpower); 
    4344 +       if (txpower) { 
    4345 +               ah->ah_txpower.txp_user_pwr = txpower; 
    4346   
    4347 -       return ath5k_hw_txpower(ah, ah->ah_current_channel, txpower); 
    4348 +               if (ah->ah_txpower.txp_user_pwr > AR5K_TUNE_MAX_TXPOWER) { 
    4349 +                       ATH5K_ERR(ah, "invalid tx power: %u\n", ah->ah_txpower.txp_user_pwr); 
    4350 +                       return -EINVAL; 
    4351 +               } 
    4352 +       } 
    4353 + 
    4354 +       return ath5k_hw_txpower(ah, ah->ah_current_channel); 
    4355  } 
    4356   
    4357   
    4358 @@ -3791,8 +3792,8 @@ ath5k_hw_phy_init(struct ath5k_hw *ah, s 
     4338@@ -3518,6 +3518,7 @@ ath5k_setup_rate_powertable(struct ath5k 
     4339 { 
     4340        unsigned int i; 
     4341        u16 *rates; 
     4342+       s16 rate_idx_scaled = 0; 
     4343  
     4344        /* max_pwr is power level we got from driver/user in 0.5dB 
     4345         * units, switch to 0.25dB units so we can compare */ 
     4346@@ -3564,20 +3565,32 @@ ath5k_setup_rate_powertable(struct ath5k 
     4347                for (i = 8; i <= 15; i++) 
     4348                        rates[i] -= ah->ah_txpower.txp_cck_ofdm_gainf_delta; 
     4349  
     4350+       /* Save min/max and current tx power for this channel 
     4351+        * in 0.25dB units. 
     4352+        * 
     4353+        * Note: We use rates[0] for current tx power because 
     4354+        * it covers most of the rates, in most cases. It's our 
     4355+        * tx power limit and what the user expects to see. */ 
     4356+       ah->ah_txpower.txp_min_pwr = 2 * rates[7]; 
     4357+       ah->ah_txpower.txp_cur_pwr = 2 * rates[0]; 
     4358+ 
     4359+       /* Set max txpower for correct OFDM operation on all rates 
     4360+        * -that is the txpower for 54Mbit-, it's used for the PAPD 
     4361+        * gain probe and it's in 0.5dB units */ 
     4362+       ah->ah_txpower.txp_ofdm = rates[7]; 
     4363+ 
     4364        /* Now that we have all rates setup use table offset to 
     4365         * match the power range set by user with the power indices 
     4366         * on PCDAC/PDADC table */ 
     4367        for (i = 0; i < 16; i++) { 
     4368-               rates[i] += ah->ah_txpower.txp_offset; 
     4369+               rate_idx_scaled = rates[i] + ah->ah_txpower.txp_offset; 
     4370                /* Don't get out of bounds */ 
     4371-               if (rates[i] > 63) 
     4372-                       rates[i] = 63; 
     4373+               if (rate_idx_scaled > 63) 
     4374+                       rate_idx_scaled = 63; 
     4375+               if (rate_idx_scaled < 0) 
     4376+                       rate_idx_scaled = 0; 
     4377+               rates[i] = rate_idx_scaled; 
     4378        } 
     4379- 
     4380-       /* Min/max in 0.25dB units */ 
     4381-       ah->ah_txpower.txp_min_pwr = 2 * rates[7]; 
     4382-       ah->ah_txpower.txp_cur_pwr = 2 * rates[0]; 
     4383-       ah->ah_txpower.txp_ofdm = rates[7]; 
     4384 } 
     4385  
     4386  
     4387@@ -3641,10 +3654,17 @@ ath5k_hw_txpower(struct ath5k_hw *ah, st 
     4388        if (!ah->ah_txpower.txp_setup || 
     4389            (channel->hw_value != curr_channel->hw_value) || 
     4390            (channel->center_freq != curr_channel->center_freq)) { 
     4391-               /* Reset TX power values */ 
     4392+               /* Reset TX power values but preserve requested 
     4393+                * tx power from above */ 
     4394+               int requested_txpower = ah->ah_txpower.txp_requested; 
     4395+ 
     4396                memset(&ah->ah_txpower, 0, sizeof(ah->ah_txpower)); 
     4397+ 
     4398+               /* Restore TPC setting and requested tx power */ 
     4399                ah->ah_txpower.txp_tpc = AR5K_TUNE_TPC_TXPOWER; 
     4400  
     4401+               ah->ah_txpower.txp_requested = requested_txpower; 
     4402+ 
     4403                /* Calculate the powertable */ 
     4404                ret = ath5k_setup_channel_powertable(ah, channel, 
     4405                                                        ee_mode, type); 
     4406@@ -3791,8 +3811,9 @@ ath5k_hw_phy_init(struct ath5k_hw *ah, s 
    43594407         * RF buffer settings on 5211/5212+ so that we 
    43604408         * properly set curve indices. 
     
    43624410-       ret = ath5k_hw_txpower(ah, channel, ah->ah_txpower.txp_cur_pwr ? 
    43634411-                       ah->ah_txpower.txp_cur_pwr / 2 : AR5K_TUNE_MAX_TXPOWER); 
    4364 +       ret = ath5k_hw_txpower(ah, channel); 
    4365 + 
     4412+       ret = ath5k_hw_txpower(ah, channel, ah->ah_txpower.txp_requested ? 
     4413+                                       ah->ah_txpower.txp_requested * 2 : 
     4414+                                       AR5K_TUNE_MAX_TXPOWER); 
    43664415        if (ret) 
    43674416                return ret; 
  • trunk/package/mac80211/patches/411-ath5k_allow_adhoc_and_ap.patch

    r32760 r33014  
    1919--- a/drivers/net/wireless/ath/ath5k/base.c 
    2020+++ b/drivers/net/wireless/ath/ath5k/base.c 
    21 @@ -1875,7 +1875,7 @@ ath5k_beacon_send(struct ath5k_hw *ah) 
     21@@ -1878,7 +1878,7 @@ ath5k_beacon_send(struct ath5k_hw *ah) 
    2222        } 
    2323  
     
    2828                u64 tsf = ath5k_hw_get_tsf64(ah); 
    2929                u32 tsftu = TSF_TO_TU(tsf); 
    30 @@ -1961,7 +1961,7 @@ ath5k_beacon_update_timers(struct ath5k_ 
     30@@ -1964,7 +1964,7 @@ ath5k_beacon_update_timers(struct ath5k_ 
    3131  
    3232        intval = ah->bintval & AR5K_BEACON_PERIOD; 
     
    3737                if (intval < 15) 
    3838                        ATH5K_WARN(ah, "intval %u is too low, min 15\n", 
    39 @@ -2426,6 +2426,7 @@ static const struct ieee80211_iface_limi 
     39@@ -2429,6 +2429,7 @@ static const struct ieee80211_iface_limi 
    4040 #ifdef CONFIG_MAC80211_MESH 
    4141                                 BIT(NL80211_IFTYPE_MESH_POINT) | 
  • trunk/package/mac80211/patches/620-rt2x00-support-rt3352.patch

    r32817 r33014  
    128128  
    129129 static int rt2800_get_gain_calibration_delta(struct rt2x00_dev *rt2x00dev) 
    130 @@ -2893,11 +2970,15 @@ static int rt2800_init_registers(struct 
     130@@ -2893,11 +2970,15 @@ static int rt2800_init_registers(struct  
    131131        if (rt2x00_rt(rt2x00dev, RT3071) || 
    132132            rt2x00_rt(rt2x00dev, RT3090) || 
Note: See TracChangeset for help on using the changeset viewer.