coex.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
  2. /* Copyright(c) 2019-2020 Realtek Corporation
  3. */
  4. #ifndef __RTW89_COEX_H__
  5. #define __RTW89_COEX_H__
  6. #include "core.h"
  7. enum btc_mode {
  8. BTC_MODE_NORMAL,
  9. BTC_MODE_WL,
  10. BTC_MODE_BT,
  11. BTC_MODE_WLOFF,
  12. BTC_MODE_MAX
  13. };
  14. enum btc_wl_rfk_type {
  15. BTC_WRFKT_IQK = 0,
  16. BTC_WRFKT_LCK = 1,
  17. BTC_WRFKT_DPK = 2,
  18. BTC_WRFKT_TXGAPK = 3,
  19. BTC_WRFKT_DACK = 4,
  20. BTC_WRFKT_RXDCK = 5,
  21. BTC_WRFKT_TSSI = 6,
  22. };
  23. #define NM_EXEC false
  24. #define FC_EXEC true
  25. #define RTW89_COEX_ACT1_WORK_PERIOD round_jiffies_relative(HZ * 4)
  26. #define RTW89_COEX_BT_DEVINFO_WORK_PERIOD round_jiffies_relative(HZ * 16)
  27. #define RTW89_COEX_RFK_CHK_WORK_PERIOD msecs_to_jiffies(300)
  28. #define BTC_RFK_PATH_MAP GENMASK(3, 0)
  29. #define BTC_RFK_PHY_MAP GENMASK(5, 4)
  30. #define BTC_RFK_BAND_MAP GENMASK(7, 6)
  31. enum btc_wl_rfk_state {
  32. BTC_WRFK_STOP = 0,
  33. BTC_WRFK_START = 1,
  34. BTC_WRFK_ONESHOT_START = 2,
  35. BTC_WRFK_ONESHOT_STOP = 3,
  36. };
  37. enum btc_pri {
  38. BTC_PRI_MASK_RX_RESP = 0,
  39. BTC_PRI_MASK_TX_RESP,
  40. BTC_PRI_MASK_BEACON,
  41. BTC_PRI_MASK_RX_CCK,
  42. BTC_PRI_MASK_TX_MNGQ,
  43. BTC_PRI_MASK_MAX,
  44. };
  45. enum btc_bt_trs {
  46. BTC_BT_SS_GROUP = 0x0,
  47. BTC_BT_TX_GROUP = 0x2,
  48. BTC_BT_RX_GROUP = 0x3,
  49. BTC_BT_MAX_GROUP,
  50. };
  51. enum btc_rssi_st {
  52. BTC_RSSI_ST_LOW = 0x0,
  53. BTC_RSSI_ST_HIGH,
  54. BTC_RSSI_ST_STAY_LOW,
  55. BTC_RSSI_ST_STAY_HIGH,
  56. BTC_RSSI_ST_MAX
  57. };
  58. #define BTC_RSSI_HIGH(_rssi_) \
  59. ({typeof(_rssi_) __rssi = (_rssi_); \
  60. ((__rssi == BTC_RSSI_ST_HIGH || \
  61. __rssi == BTC_RSSI_ST_STAY_HIGH) ? 1 : 0); })
  62. #define BTC_RSSI_LOW(_rssi_) \
  63. ({typeof(_rssi_) __rssi = (_rssi_); \
  64. ((__rssi == BTC_RSSI_ST_LOW || \
  65. __rssi == BTC_RSSI_ST_STAY_LOW) ? 1 : 0); })
  66. #define BTC_RSSI_CHANGE(_rssi_) \
  67. ({typeof(_rssi_) __rssi = (_rssi_); \
  68. ((__rssi == BTC_RSSI_ST_LOW || \
  69. __rssi == BTC_RSSI_ST_HIGH) ? 1 : 0); })
  70. enum btc_ant {
  71. BTC_ANT_SHARED = 0,
  72. BTC_ANT_DEDICATED,
  73. BTC_ANTTYPE_MAX
  74. };
  75. enum btc_bt_btg {
  76. BTC_BT_ALONE = 0,
  77. BTC_BT_BTG
  78. };
  79. enum btc_switch {
  80. BTC_SWITCH_INTERNAL = 0,
  81. BTC_SWITCH_EXTERNAL
  82. };
  83. enum btc_pkt_type {
  84. PACKET_DHCP,
  85. PACKET_ARP,
  86. PACKET_EAPOL,
  87. PACKET_EAPOL_END,
  88. PACKET_ICMP,
  89. PACKET_MAX
  90. };
  91. enum btc_bt_mailbox_id {
  92. BTC_BTINFO_REPLY = 0x23,
  93. BTC_BTINFO_AUTO = 0x27
  94. };
  95. enum btc_role_state {
  96. BTC_ROLE_START,
  97. BTC_ROLE_STOP,
  98. BTC_ROLE_CHG_TYPE,
  99. BTC_ROLE_MSTS_STA_CONN_START,
  100. BTC_ROLE_MSTS_STA_CONN_END,
  101. BTC_ROLE_MSTS_STA_DIS_CONN,
  102. BTC_ROLE_MSTS_AP_START,
  103. BTC_ROLE_MSTS_AP_STOP,
  104. BTC_ROLE_STATE_UNKNOWN
  105. };
  106. enum btc_rfctrl {
  107. BTC_RFCTRL_WL_OFF,
  108. BTC_RFCTRL_WL_ON,
  109. BTC_RFCTRL_FW_CTRL,
  110. BTC_RFCTRL_MAX
  111. };
  112. enum btc_lps_state {
  113. BTC_LPS_OFF = 0,
  114. BTC_LPS_RF_OFF = 1,
  115. BTC_LPS_RF_ON = 2
  116. };
  117. void rtw89_btc_ntfy_poweron(struct rtw89_dev *rtwdev);
  118. void rtw89_btc_ntfy_poweroff(struct rtw89_dev *rtwdev);
  119. void rtw89_btc_ntfy_init(struct rtw89_dev *rtwdev, u8 mode);
  120. void rtw89_btc_ntfy_scan_start(struct rtw89_dev *rtwdev, u8 phy_idx, u8 band);
  121. void rtw89_btc_ntfy_scan_finish(struct rtw89_dev *rtwdev, u8 phy_idx);
  122. void rtw89_btc_ntfy_switch_band(struct rtw89_dev *rtwdev, u8 phy_idx, u8 band);
  123. void rtw89_btc_ntfy_specific_packet(struct rtw89_dev *rtwdev,
  124. enum btc_pkt_type pkt_type);
  125. void rtw89_btc_ntfy_eapol_packet_work(struct work_struct *work);
  126. void rtw89_btc_ntfy_arp_packet_work(struct work_struct *work);
  127. void rtw89_btc_ntfy_dhcp_packet_work(struct work_struct *work);
  128. void rtw89_btc_ntfy_icmp_packet_work(struct work_struct *work);
  129. void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
  130. struct rtw89_sta *rtwsta, enum btc_role_state state);
  131. void rtw89_btc_ntfy_radio_state(struct rtw89_dev *rtwdev, enum btc_rfctrl rf_state);
  132. void rtw89_btc_ntfy_wl_rfk(struct rtw89_dev *rtwdev, u8 phy_map,
  133. enum btc_wl_rfk_type type,
  134. enum btc_wl_rfk_state state);
  135. void rtw89_btc_ntfy_wl_sta(struct rtw89_dev *rtwdev);
  136. void rtw89_btc_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb,
  137. u32 len, u8 class, u8 func);
  138. void rtw89_btc_dump_info(struct rtw89_dev *rtwdev, struct seq_file *m);
  139. void rtw89_coex_act1_work(struct work_struct *work);
  140. void rtw89_coex_bt_devinfo_work(struct work_struct *work);
  141. void rtw89_coex_rfk_chk_work(struct work_struct *work);
  142. void rtw89_coex_power_on(struct rtw89_dev *rtwdev);
  143. void rtw89_btc_set_policy(struct rtw89_dev *rtwdev, u16 policy_type);
  144. void rtw89_btc_set_policy_v1(struct rtw89_dev *rtwdev, u16 policy_type);
  145. static inline u8 rtw89_btc_phymap(struct rtw89_dev *rtwdev,
  146. enum rtw89_phy_idx phy_idx,
  147. enum rtw89_rf_path_bit paths)
  148. {
  149. const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
  150. u8 phy_map;
  151. phy_map = FIELD_PREP(BTC_RFK_PATH_MAP, paths) |
  152. FIELD_PREP(BTC_RFK_PHY_MAP, BIT(phy_idx)) |
  153. FIELD_PREP(BTC_RFK_BAND_MAP, chan->band_type);
  154. return phy_map;
  155. }
  156. static inline u8 rtw89_btc_path_phymap(struct rtw89_dev *rtwdev,
  157. enum rtw89_phy_idx phy_idx,
  158. enum rtw89_rf_path path)
  159. {
  160. return rtw89_btc_phymap(rtwdev, phy_idx, BIT(path));
  161. }
  162. #endif