• Ping-Ke Shih's avatar
    rtw88: 8723d: Add power tracking · 608d2a08
    Ping-Ke Shih authored
    When chip's temperature is changed, RF characters are changed. To keep the
    characters to be consistent, 8723d uses thermal meter to assist in
    calibrating LCK, IQK, crystal and TX power.
    
    A base thermal value is programmed in efuse, all calibration data in
    MP process is based on this thermal value. So we calucate the delta of
    thermal value between the base value, and use this delta to reference XTAL
    and TX power offset tables to know how much we need to adjust.
    
    For IQK and LCK, driver checks if delta of thermal value is over 8, then
    they are triggered.
    
    For crystal adjustment, when delta of thermal value is changed, we check
    XTAL tables to get offset of XTAL value. If thermal value is larger than
    base value, positive table (_p as suffix) is used. Otherwise, we use
    negative table (_n as suffix). Then, we add offset to XTAL default value
    programmed in efuse, and write sum value to register.
    
    To compensate TX power, there are two hierarchical tables. First level use
    delta of thermal value to access eight tables to yield delta of TX power
    index. Then, plus base TX power index to get index of BB swing table
    (second level tables) where register value is induced.
    
    BB swing table can't deal with all cases, if index of BB swing table is
    over the size of the table. In this case, TX AGC is used to compensate the
    remnant part. Assume 'upper' is the upper bound of BB swing table, and
    'target' is the desired index. Then, we can illustrate them as
    
      compensation method    BB swing        TX AGC
      -------------------    --------    --------------
      target > upper         upper       target - upper
      target < 0             0           target
      otherwise              target      0
    
    For debug purpose, add a column 'rem' to tx_pwr_tbl entry, and it looks
    like
    
      path rate       pwr       base      (byr  lmt ) rem
        A  CCK_1M     32(0x20)   34   -2 (   0   -2)    0
    Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
    Signed-off-by: default avatarYan-Hsuan Chuang <yhchuang@realtek.com>
    Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20200512102621.5148-4-yhchuang@realtek.com
    608d2a08
main.h 36.7 KB