source: trunk/package/mac80211/patches/532-ath9k_paprd_training_power.patch @ 24539

Last change on this file since 24539 was 24539, checked in by nbd, 5 years ago

ath9k: fix some more issues in the paprd changes

File size: 7.1 KB
  • drivers/net/wireless/ath/ath9k/ar9003_paprd.c

    a b void ar9003_paprd_enable(struct ath_hw * 
    3030} 
    3131EXPORT_SYMBOL(ar9003_paprd_enable); 
    3232 
    33 static void ar9003_paprd_setup_single_table(struct ath_hw *ah) 
     33static int ar9003_get_training_power_2g(struct ath_hw *ah) 
    3434{ 
    3535        struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; 
     36        struct ar9300_modal_eep_header *hdr = &eep->modalHeader2G; 
     37        unsigned int power, scale, delta; 
     38 
     39        scale = MS(le32_to_cpu(hdr->papdRateMaskHt20), AR9300_PAPRD_SCALE_1); 
     40        power = REG_READ_FIELD(ah, AR_PHY_POWERTX_RATE5, 
     41                               AR_PHY_POWERTX_RATE5_POWERTXHT20_0); 
     42 
     43        delta = abs((int) ah->paprd_target_power - (int) power); 
     44        if (delta > scale) 
     45                return -1; 
     46 
     47        if (delta < 4) 
     48                power -= 4 - delta; 
     49 
     50        return power; 
     51} 
     52 
     53static int get_streams(int mask) 
     54{ 
     55        return !!(mask & BIT(0)) + !!(mask & BIT(1)) + !!(mask & BIT(2)); 
     56} 
     57 
     58static int ar9003_get_training_power_5g(struct ath_hw *ah) 
     59{ 
     60        struct ath_common *common = ath9k_hw_common(ah); 
     61        struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; 
     62        struct ar9300_modal_eep_header *hdr = &eep->modalHeader5G; 
     63        struct ath9k_channel *chan = ah->curchan; 
     64        unsigned int power, scale, delta; 
     65 
     66        if (chan->channel >= 5700) 
     67                scale = MS(le32_to_cpu(hdr->papdRateMaskHt20), 
     68                           AR9300_PAPRD_SCALE_1); 
     69        else if (chan->channel >= 5400) 
     70                scale = MS(le32_to_cpu(hdr->papdRateMaskHt40), 
     71                           AR9300_PAPRD_SCALE_2); 
     72        else 
     73                scale = MS(le32_to_cpu(hdr->papdRateMaskHt40), 
     74                           AR9300_PAPRD_SCALE_1); 
     75 
     76        if (IS_CHAN_HT40(chan)) 
     77                power = REG_READ_FIELD(ah, AR_PHY_POWERTX_RATE8, 
     78                        AR_PHY_POWERTX_RATE8_POWERTXHT40_5); 
     79        else 
     80                power = REG_READ_FIELD(ah, AR_PHY_POWERTX_RATE6, 
     81                        AR_PHY_POWERTX_RATE6_POWERTXHT20_5); 
     82 
     83        power += scale; 
     84        delta = abs((int) ah->paprd_target_power - (int) power); 
     85        if (delta > scale) 
     86                return -1; 
     87 
     88        power += 2 * get_streams(common->tx_chainmask); 
     89        return power; 
     90} 
     91 
     92static int ar9003_paprd_setup_single_table(struct ath_hw *ah) 
     93{ 
     94        struct ath_common *common = ath9k_hw_common(ah); 
     95        struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; 
    3696        struct ar9300_modal_eep_header *hdr; 
    3797        static const u32 ctrl0[3] = { 
    3898                AR_PHY_PAPRD_CTRL0_B0, 
    static void ar9003_paprd_setup_single_ta 
    45105                AR_PHY_PAPRD_CTRL1_B2 
    46106        }; 
    47107        u32 am_mask, ht40_mask; 
     108        int training_power; 
    48109        int i; 
    49110 
    50111        if (ah->curchan && IS_CHAN_5GHZ(ah->curchan)) 
    static void ar9003_paprd_setup_single_ta 
    55116        am_mask = le32_to_cpu(hdr->papdRateMaskHt20) & AR9300_PAPRD_RATE_MASK; 
    56117        ht40_mask = le32_to_cpu(hdr->papdRateMaskHt40) & AR9300_PAPRD_RATE_MASK; 
    57118 
     119        if (IS_CHAN_2GHZ(ah->curchan)) 
     120                training_power = ar9003_get_training_power_2g(ah); 
     121        else 
     122                training_power = ar9003_get_training_power_5g(ah); 
     123 
     124        if (training_power < 0) { 
     125                ath_dbg(common, ATH_DBG_CALIBRATE, 
     126                        "PAPRD target power delta out of range"); 
     127                return -ERANGE; 
     128        } 
     129        ah->paprd_training_power = training_power; 
     130        ath_dbg(common, ATH_DBG_CALIBRATE, 
     131                "Training power: %d, Target power: %d\n", 
     132                ah->paprd_training_power, ah->paprd_target_power); 
     133 
    58134        REG_RMW_FIELD(ah, AR_PHY_PAPRD_AM2AM, AR_PHY_PAPRD_AM2AM_MASK, am_mask); 
    59135        REG_RMW_FIELD(ah, AR_PHY_PAPRD_AM2PM, AR_PHY_PAPRD_AM2PM_MASK, am_mask); 
    60136        REG_RMW_FIELD(ah, AR_PHY_PAPRD_HT40, AR_PHY_PAPRD_HT40_MASK, ht40_mask); 
    61137 
    62  
    63138        for (i = 0; i < ah->caps.max_txchains; i++) { 
    64139                REG_RMW_FIELD(ah, ctrl0[i], 
    65140                              AR_PHY_PAPRD_CTRL0_USE_SINGLE_TABLE_MASK, 1); 
    static void ar9003_paprd_setup_single_ta 
    141216                      AR_PHY_PAPRD_PRE_POST_SCALING, 185706); 
    142217        REG_RMW_FIELD(ah, AR_PHY_PAPRD_PRE_POST_SCALE_7_B0, 
    143218                      AR_PHY_PAPRD_PRE_POST_SCALING, 175487); 
     219        return 0; 
    144220} 
    145221 
    146222static void ar9003_paprd_get_gain_table(struct ath_hw *ah) 
    void ar9003_paprd_populate_single_table( 
    595671{ 
    596672        u32 *paprd_table_val = caldata->pa_table[chain]; 
    597673        u32 small_signal_gain = caldata->small_signal_gain[chain]; 
    598         u32 training_power; 
     674        u32 training_power = ah->paprd_training_power; 
    599675        u32 reg = 0; 
    600676        int i; 
    601677 
    602         training_power = 
    603             REG_READ_FIELD(ah, AR_PHY_POWERTX_RATE5, 
    604                            AR_PHY_POWERTX_RATE5_POWERTXHT20_0); 
    605         training_power -= 4; 
    606  
    607678        if (chain == 0) 
    608679                reg = AR_PHY_PAPRD_MEM_TAB_B0; 
    609680        else if (chain == 1) 
    EXPORT_SYMBOL(ar9003_paprd_populate_sing 
    643714 
    644715int ar9003_paprd_setup_gain_table(struct ath_hw *ah, int chain) 
    645716{ 
    646  
    647717        unsigned int i, desired_gain, gain_index; 
    648         unsigned int train_power; 
    649  
    650         train_power = REG_READ_FIELD(ah, AR_PHY_POWERTX_RATE5, 
    651                                      AR_PHY_POWERTX_RATE5_POWERTXHT20_0); 
    652  
    653         train_power = train_power - 4; 
     718        unsigned int train_power = ah->paprd_training_power; 
    654719 
    655720        desired_gain = ar9003_get_desired_gain(ah, chain, train_power); 
    656721 
    EXPORT_SYMBOL(ar9003_paprd_create_curve) 
    716781 
    717782int ar9003_paprd_init_table(struct ath_hw *ah) 
    718783{ 
    719         ar9003_paprd_setup_single_table(ah); 
     784        int ret; 
     785 
     786        ret = ar9003_paprd_setup_single_table(ah); 
     787        if (ret < 0) 
     788            return ret; 
     789 
    720790        ar9003_paprd_get_gain_table(ah); 
    721791        return 0; 
    722792} 
  • drivers/net/wireless/ath/ath9k/hw.h

    a b struct ath_hw { 
    835835        u32 bb_watchdog_last_status; 
    836836        u32 bb_watchdog_timeout_ms; /* in ms, 0 to disable */ 
    837837 
     838        unsigned int paprd_target_power; 
     839        unsigned int paprd_training_power; 
    838840        u32 paprd_gain_table_entries[PAPRD_GAIN_TABLE_ENTRIES]; 
    839841        u8 paprd_gain_table_index[PAPRD_GAIN_TABLE_ENTRIES]; 
    840842        /* 
  • drivers/net/wireless/ath/ath9k/ar9003_phy.h

    a b  
    10901090#define AR_PHY_POWERTX_RATE5_POWERTXHT20_0      0x3F 
    10911091#define AR_PHY_POWERTX_RATE5_POWERTXHT20_0_S    0 
    10921092 
     1093#define AR_PHY_POWERTX_RATE6                    (AR_SM_BASE + 0x1d4) 
     1094#define AR_PHY_POWERTX_RATE6_POWERTXHT20_5      0x3F00 
     1095#define AR_PHY_POWERTX_RATE6_POWERTXHT20_5_S    8 
     1096 
     1097#define AR_PHY_POWERTX_RATE8                    (AR_SM_BASE + 0x1dc) 
     1098#define AR_PHY_POWERTX_RATE8_POWERTXHT40_5      0x3F00 
     1099#define AR_PHY_POWERTX_RATE8_POWERTXHT40_5_S    8 
     1100 
    10931101void ar9003_hw_set_chain_masks(struct ath_hw *ah, u8 rx, u8 tx); 
    10941102 
    10951103#endif  /* AR9003_PHY_H */ 
  • drivers/net/wireless/ath/ath9k/ar9003_eeprom.c

    a b static void ath9k_hw_ar9300_set_txpower( 
    47984798        /* Write target power array to registers */ 
    47994799        ar9003_hw_tx_power_regwrite(ah, targetPowerValT2); 
    48004800        ar9003_hw_calibration_apply(ah, chan->channel); 
     4801 
     4802        if (IS_CHAN_2GHZ(chan)) { 
     4803                if (IS_CHAN_HT40(chan)) 
     4804                        i = ALL_TARGET_HT40_0_8_16; 
     4805                else 
     4806                        i = ALL_TARGET_HT20_0_8_16; 
     4807        } else { 
     4808                if (IS_CHAN_HT40(chan)) 
     4809                        i = ALL_TARGET_HT40_7; 
     4810                else 
     4811                        i = ALL_TARGET_HT20_7; 
     4812        } 
     4813        ah->paprd_target_power = targetPowerValT2[i]; 
    48014814} 
    48024815 
    48034816static u16 ath9k_hw_ar9300_get_spur_channel(struct ath_hw *ah, 
  • drivers/net/wireless/ath/ath9k/main.c

    a b void ath_paprd_calibrate(struct work_str 
    373373        if (!caldata) 
    374374                return; 
    375375 
     376        if (ar9003_paprd_init_table(ah) < 0) 
     377                return; 
     378 
    376379        skb = alloc_skb(len, GFP_KERNEL); 
    377380        if (!skb) 
    378381                return; 
    void ath_paprd_calibrate(struct work_str 
    388391        memcpy(hdr->addr3, hw->wiphy->perm_addr, ETH_ALEN); 
    389392 
    390393        ath9k_ps_wakeup(sc); 
    391         ar9003_paprd_init_table(ah); 
    392394        for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) { 
    393395                if (!(common->tx_chainmask & BIT(chain))) 
    394396                        continue; 
Note: See TracBrowser for help on using the repository browser.