phy.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
  2. /* Copyright(c) 2018-2019 Realtek Corporation
  3. */
  4. #ifndef __RTW_PHY_H_
  5. #define __RTW_PHY_H_
  6. #include "debug.h"
  7. extern u8 rtw_cck_rates[];
  8. extern u8 rtw_ofdm_rates[];
  9. extern u8 rtw_ht_1s_rates[];
  10. extern u8 rtw_ht_2s_rates[];
  11. extern u8 rtw_vht_1s_rates[];
  12. extern u8 rtw_vht_2s_rates[];
  13. extern u8 *rtw_rate_section[];
  14. extern u8 rtw_rate_size[];
  15. void rtw_phy_init(struct rtw_dev *rtwdev);
  16. void rtw_phy_dynamic_mechanism(struct rtw_dev *rtwdev);
  17. u8 rtw_phy_rf_power_2_rssi(s8 *rf_power, u8 path_num);
  18. u32 rtw_phy_read_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
  19. u32 addr, u32 mask);
  20. u32 rtw_phy_read_rf_sipi(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
  21. u32 addr, u32 mask);
  22. bool rtw_phy_write_rf_reg_sipi(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
  23. u32 addr, u32 mask, u32 data);
  24. bool rtw_phy_write_rf_reg(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
  25. u32 addr, u32 mask, u32 data);
  26. bool rtw_phy_write_rf_reg_mix(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
  27. u32 addr, u32 mask, u32 data);
  28. void rtw_phy_setup_phy_cond(struct rtw_dev *rtwdev, u32 pkg);
  29. void rtw_parse_tbl_phy_cond(struct rtw_dev *rtwdev, const struct rtw_table *tbl);
  30. void rtw_parse_tbl_bb_pg(struct rtw_dev *rtwdev, const struct rtw_table *tbl);
  31. void rtw_parse_tbl_txpwr_lmt(struct rtw_dev *rtwdev, const struct rtw_table *tbl);
  32. void rtw_phy_cfg_mac(struct rtw_dev *rtwdev, const struct rtw_table *tbl,
  33. u32 addr, u32 data);
  34. void rtw_phy_cfg_agc(struct rtw_dev *rtwdev, const struct rtw_table *tbl,
  35. u32 addr, u32 data);
  36. void rtw_phy_cfg_bb(struct rtw_dev *rtwdev, const struct rtw_table *tbl,
  37. u32 addr, u32 data);
  38. void rtw_phy_cfg_rf(struct rtw_dev *rtwdev, const struct rtw_table *tbl,
  39. u32 addr, u32 data);
  40. void rtw_phy_init_tx_power(struct rtw_dev *rtwdev);
  41. void rtw_phy_load_tables(struct rtw_dev *rtwdev);
  42. u8 rtw_phy_get_tx_power_index(struct rtw_dev *rtwdev, u8 rf_path, u8 rate,
  43. enum rtw_bandwidth bw, u8 channel, u8 regd);
  44. void rtw_phy_set_tx_power_level(struct rtw_dev *rtwdev, u8 channel);
  45. void rtw_phy_tx_power_by_rate_config(struct rtw_hal *hal);
  46. void rtw_phy_tx_power_limit_config(struct rtw_hal *hal);
  47. void rtw_phy_pwrtrack_avg(struct rtw_dev *rtwdev, u8 thermal, u8 path);
  48. bool rtw_phy_pwrtrack_thermal_changed(struct rtw_dev *rtwdev, u8 thermal,
  49. u8 path);
  50. u8 rtw_phy_pwrtrack_get_delta(struct rtw_dev *rtwdev, u8 path);
  51. s8 rtw_phy_pwrtrack_get_pwridx(struct rtw_dev *rtwdev,
  52. struct rtw_swing_table *swing_table,
  53. u8 tbl_path, u8 therm_path, u8 delta);
  54. bool rtw_phy_pwrtrack_need_lck(struct rtw_dev *rtwdev);
  55. bool rtw_phy_pwrtrack_need_iqk(struct rtw_dev *rtwdev);
  56. void rtw_phy_config_swing_table(struct rtw_dev *rtwdev,
  57. struct rtw_swing_table *swing_table);
  58. void rtw_phy_set_edcca_th(struct rtw_dev *rtwdev, u8 l2h, u8 h2l);
  59. void rtw_phy_adaptivity_set_mode(struct rtw_dev *rtwdev);
  60. void rtw_phy_parsing_cfo(struct rtw_dev *rtwdev,
  61. struct rtw_rx_pkt_stat *pkt_stat);
  62. void rtw_phy_tx_path_diversity(struct rtw_dev *rtwdev);
  63. struct rtw_txpwr_lmt_cfg_pair {
  64. u8 regd;
  65. u8 band;
  66. u8 bw;
  67. u8 rs;
  68. u8 ch;
  69. s8 txpwr_lmt;
  70. };
  71. struct rtw_phy_pg_cfg_pair {
  72. u32 band;
  73. u32 rf_path;
  74. u32 tx_num;
  75. u32 addr;
  76. u32 bitmask;
  77. u32 data;
  78. };
  79. #define RTW_DECL_TABLE_PHY_COND_CORE(name, cfg, path) \
  80. const struct rtw_table name ## _tbl = { \
  81. .data = name, \
  82. .size = ARRAY_SIZE(name), \
  83. .parse = rtw_parse_tbl_phy_cond, \
  84. .do_cfg = cfg, \
  85. .rf_path = path, \
  86. }
  87. #define RTW_DECL_TABLE_PHY_COND(name, cfg) \
  88. RTW_DECL_TABLE_PHY_COND_CORE(name, cfg, 0)
  89. #define RTW_DECL_TABLE_RF_RADIO(name, path) \
  90. RTW_DECL_TABLE_PHY_COND_CORE(name, rtw_phy_cfg_rf, RF_PATH_ ## path)
  91. #define RTW_DECL_TABLE_BB_PG(name) \
  92. const struct rtw_table name ## _tbl = { \
  93. .data = name, \
  94. .size = ARRAY_SIZE(name), \
  95. .parse = rtw_parse_tbl_bb_pg, \
  96. }
  97. #define RTW_DECL_TABLE_TXPWR_LMT(name) \
  98. const struct rtw_table name ## _tbl = { \
  99. .data = name, \
  100. .size = ARRAY_SIZE(name), \
  101. .parse = rtw_parse_tbl_txpwr_lmt, \
  102. }
  103. static inline const struct rtw_rfe_def *rtw_get_rfe_def(struct rtw_dev *rtwdev)
  104. {
  105. const struct rtw_chip_info *chip = rtwdev->chip;
  106. struct rtw_efuse *efuse = &rtwdev->efuse;
  107. const struct rtw_rfe_def *rfe_def = NULL;
  108. if (chip->rfe_defs_size == 0)
  109. return NULL;
  110. if (efuse->rfe_option < chip->rfe_defs_size)
  111. rfe_def = &chip->rfe_defs[efuse->rfe_option];
  112. rtw_dbg(rtwdev, RTW_DBG_PHY, "use rfe_def[%d]\n", efuse->rfe_option);
  113. return rfe_def;
  114. }
  115. static inline int rtw_check_supported_rfe(struct rtw_dev *rtwdev)
  116. {
  117. const struct rtw_rfe_def *rfe_def = rtw_get_rfe_def(rtwdev);
  118. if (!rfe_def || !rfe_def->phy_pg_tbl || !rfe_def->txpwr_lmt_tbl) {
  119. rtw_err(rtwdev, "rfe %d isn't supported\n",
  120. rtwdev->efuse.rfe_option);
  121. return -ENODEV;
  122. }
  123. return 0;
  124. }
  125. void rtw_phy_dig_write(struct rtw_dev *rtwdev, u8 igi);
  126. struct rtw_power_params {
  127. u8 pwr_base;
  128. s8 pwr_offset;
  129. s8 pwr_limit;
  130. s8 pwr_remnant;
  131. s8 pwr_sar;
  132. };
  133. void
  134. rtw_get_tx_power_params(struct rtw_dev *rtwdev, u8 path,
  135. u8 rate, u8 bw, u8 ch, u8 regd,
  136. struct rtw_power_params *pwr_param);
  137. enum rtw_phy_cck_pd_lv {
  138. CCK_PD_LV0,
  139. CCK_PD_LV1,
  140. CCK_PD_LV2,
  141. CCK_PD_LV3,
  142. CCK_PD_LV4,
  143. CCK_PD_LV_MAX,
  144. };
  145. #define MASKBYTE0 0xff
  146. #define MASKBYTE1 0xff00
  147. #define MASKBYTE2 0xff0000
  148. #define MASKBYTE3 0xff000000
  149. #define MASKHWORD 0xffff0000
  150. #define MASKLWORD 0x0000ffff
  151. #define MASKDWORD 0xffffffff
  152. #define RFREG_MASK 0xfffff
  153. #define MASK7BITS 0x7f
  154. #define MASK12BITS 0xfff
  155. #define MASKH4BITS 0xf0000000
  156. #define MASK20BITS 0xfffff
  157. #define MASK24BITS 0xffffff
  158. #define MASKH3BYTES 0xffffff00
  159. #define MASKL3BYTES 0x00ffffff
  160. #define MASKBYTE2HIGHNIBBLE 0x00f00000
  161. #define MASKBYTE3LOWNIBBLE 0x0f000000
  162. #define MASKL3BYTES 0x00ffffff
  163. #define CCK_FA_AVG_RESET 0xffffffff
  164. #define LSSI_READ_ADDR_MASK 0x7f800000
  165. #define LSSI_READ_EDGE_MASK 0x80000000
  166. #define LSSI_READ_DATA_MASK 0xfffff
  167. #define RRSR_RATE_ORDER_MAX 0xfffff
  168. #define RRSR_RATE_ORDER_CCK_LEN 4
  169. #endif