xref: /linux/drivers/net/wireless/realtek/rtw89/coex.h (revision ee975351cf0c2a11cdf97eae58265c126cb32850)
1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2 /* Copyright(c) 2019-2020  Realtek Corporation
3  */
4 
5 #ifndef __RTW89_COEX_H__
6 #define __RTW89_COEX_H__
7 
8 #include "core.h"
9 
10 enum btc_mode {
11 	BTC_MODE_NORMAL,
12 	BTC_MODE_WL,
13 	BTC_MODE_BT,
14 	BTC_MODE_WLOFF,
15 	BTC_MODE_MAX
16 };
17 
18 enum btc_wl_rfk_type {
19 	BTC_WRFKT_IQK = 0,
20 	BTC_WRFKT_LCK = 1,
21 	BTC_WRFKT_DPK = 2,
22 	BTC_WRFKT_TXGAPK = 3,
23 	BTC_WRFKT_DACK = 4,
24 	BTC_WRFKT_RXDCK = 5,
25 	BTC_WRFKT_TSSI = 6,
26 	BTC_WRFKT_CHLK = 7,
27 };
28 
29 #define NM_EXEC false
30 #define FC_EXEC true
31 
32 #define RTW89_COEX_ACT1_WORK_PERIOD	round_jiffies_relative(HZ * 4)
33 #define RTW89_COEX_BT_DEVINFO_WORK_PERIOD	round_jiffies_relative(HZ * 16)
34 #define RTW89_COEX_RFK_CHK_WORK_PERIOD	msecs_to_jiffies(300)
35 #define BTC_RFK_PATH_MAP GENMASK(3, 0)
36 #define BTC_RFK_PHY_MAP GENMASK(5, 4)
37 #define BTC_RFK_BAND_MAP GENMASK(7, 6)
38 
39 enum btc_wl_rfk_state {
40 	BTC_WRFK_STOP = 0,
41 	BTC_WRFK_START = 1,
42 	BTC_WRFK_ONESHOT_START = 2,
43 	BTC_WRFK_ONESHOT_STOP = 3,
44 };
45 
46 enum btc_pri {
47 	BTC_PRI_MASK_RX_RESP = 0,
48 	BTC_PRI_MASK_TX_RESP,
49 	BTC_PRI_MASK_BEACON,
50 	BTC_PRI_MASK_RX_CCK,
51 	BTC_PRI_MASK_TX_MNGQ,
52 	BTC_PRI_MASK_MAX,
53 };
54 
55 enum btc_bt_trs {
56 	BTC_BT_SS_GROUP = 0x0,
57 	BTC_BT_TX_GROUP = 0x2,
58 	BTC_BT_RX_GROUP = 0x3,
59 	BTC_BT_MAX_GROUP,
60 };
61 
62 enum btc_rssi_st {
63 	BTC_RSSI_ST_LOW = 0x0,
64 	BTC_RSSI_ST_HIGH,
65 	BTC_RSSI_ST_STAY_LOW,
66 	BTC_RSSI_ST_STAY_HIGH,
67 	BTC_RSSI_ST_MAX
68 };
69 
70 enum btc_fddt_en {
71 	BTC_FDDT_DISABLE,
72 	BTC_FDDT_ENABLE,
73 };
74 
75 #define	BTC_RSSI_HIGH(_rssi_) \
76 	({typeof(_rssi_) __rssi = (_rssi_); \
77 	  ((__rssi == BTC_RSSI_ST_HIGH || \
78 	    __rssi == BTC_RSSI_ST_STAY_HIGH) ? 1 : 0); })
79 
80 #define	BTC_RSSI_LOW(_rssi_) \
81 	({typeof(_rssi_) __rssi = (_rssi_); \
82 	  ((__rssi == BTC_RSSI_ST_LOW || \
83 	    __rssi == BTC_RSSI_ST_STAY_LOW) ? 1 : 0); })
84 
85 #define BTC_RSSI_CHANGE(_rssi_) \
86 	({typeof(_rssi_) __rssi = (_rssi_); \
87 	  ((__rssi == BTC_RSSI_ST_LOW || \
88 	    __rssi == BTC_RSSI_ST_HIGH) ? 1 : 0); })
89 
90 enum btc_ant {
91 	BTC_ANT_SHARED = 0,
92 	BTC_ANT_DEDICATED,
93 	BTC_ANTTYPE_MAX
94 };
95 
96 enum btc_bt_btg {
97 	BTC_BT_ALONE = 0,
98 	BTC_BT_BTG
99 };
100 
101 enum btc_switch {
102 	BTC_SWITCH_INTERNAL = 0,
103 	BTC_SWITCH_EXTERNAL
104 };
105 
106 enum btc_pkt_type {
107 	PACKET_DHCP,
108 	PACKET_ARP,
109 	PACKET_EAPOL,
110 	PACKET_EAPOL_END,
111 	PACKET_ICMP,
112 	PACKET_MAX
113 };
114 
115 enum btc_bt_mailbox_id {
116 	BTC_BTINFO_REPLY = 0x23,
117 	BTC_BTINFO_AUTO = 0x27
118 };
119 
120 enum btc_role_state {
121 	BTC_ROLE_START,
122 	BTC_ROLE_STOP,
123 	BTC_ROLE_CHG_TYPE,
124 	BTC_ROLE_MSTS_STA_CONN_START,
125 	BTC_ROLE_MSTS_STA_CONN_END,
126 	BTC_ROLE_MSTS_STA_DIS_CONN,
127 	BTC_ROLE_MSTS_AP_START,
128 	BTC_ROLE_MSTS_AP_STOP,
129 	BTC_ROLE_STATE_UNKNOWN
130 };
131 
132 enum btc_rfctrl {
133 	BTC_RFCTRL_WL_OFF,
134 	BTC_RFCTRL_WL_ON,
135 	BTC_RFCTRL_LPS_WL_ON,
136 	BTC_RFCTRL_FW_CTRL,
137 	BTC_RFCTRL_MAX
138 };
139 
140 enum btc_lps_state {
141 	BTC_LPS_OFF = 0,
142 	BTC_LPS_RF_OFF = 1,
143 	BTC_LPS_RF_ON = 2
144 };
145 
146 #define R_BTC_BB_BTG_RX 0x980
147 #define R_BTC_BB_PRE_AGC_S1 0x476C
148 #define R_BTC_BB_PRE_AGC_S0 0x4688
149 
150 #define B_BTC_BB_GNT_MUX GENMASK(20, 17)
151 #define B_BTC_BB_PRE_AGC_MASK GENMASK(31, 24)
152 #define B_BTC_BB_PRE_AGC_VAL BIT(31)
153 
154 #define BTC_REG_NOTFOUND 0xff
155 
156 enum btc_ant_div_pos {
157 	BTC_ANT_DIV_MAIN = 0,
158 	BTC_ANT_DIV_AUX = 1,
159 };
160 
161 enum btc_get_reg_status {
162 	BTC_CSTATUS_TXDIV_POS = 0,
163 	BTC_CSTATUS_RXDIV_POS = 1,
164 	BTC_CSTATUS_BB_GNT_MUX = 2,
165 	BTC_CSTATUS_BB_GNT_MUX_MON = 3,
166 	BTC_CSTATUS_BB_PRE_AGC = 4,
167 	BTC_CSTATUS_BB_PRE_AGC_MON = 5,
168 };
169 
170 enum btc_preagc_type {
171 	BTC_PREAGC_DISABLE,
172 	BTC_PREAGC_ENABLE,
173 	BTC_PREAGC_BB_FWCTRL,
174 	BTC_PREAGC_NOTFOUND,
175 };
176 
177 enum btc_btgctrl_type {
178 	BTC_BTGCTRL_DISABLE,
179 	BTC_BTGCTRL_ENABLE,
180 	BTC_BTGCTRL_BB_GNT_FWCTRL,
181 	BTC_BTGCTRL_BB_GNT_NOTFOUND,
182 };
183 
184 void rtw89_btc_ntfy_poweron(struct rtw89_dev *rtwdev);
185 void rtw89_btc_ntfy_poweroff(struct rtw89_dev *rtwdev);
186 void rtw89_btc_ntfy_init(struct rtw89_dev *rtwdev, u8 mode);
187 void rtw89_btc_ntfy_scan_start(struct rtw89_dev *rtwdev, u8 phy_idx, u8 band);
188 void rtw89_btc_ntfy_scan_finish(struct rtw89_dev *rtwdev, u8 phy_idx);
189 void rtw89_btc_ntfy_switch_band(struct rtw89_dev *rtwdev, u8 phy_idx, u8 band);
190 void rtw89_btc_ntfy_specific_packet(struct rtw89_dev *rtwdev,
191 				    enum btc_pkt_type pkt_type);
192 void rtw89_btc_ntfy_eapol_packet_work(struct work_struct *work);
193 void rtw89_btc_ntfy_arp_packet_work(struct work_struct *work);
194 void rtw89_btc_ntfy_dhcp_packet_work(struct work_struct *work);
195 void rtw89_btc_ntfy_icmp_packet_work(struct work_struct *work);
196 void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
197 			      struct rtw89_sta *rtwsta, enum btc_role_state state);
198 void rtw89_btc_ntfy_radio_state(struct rtw89_dev *rtwdev, enum btc_rfctrl rf_state);
199 void rtw89_btc_ntfy_wl_rfk(struct rtw89_dev *rtwdev, u8 phy_map,
200 			   enum btc_wl_rfk_type type,
201 			   enum btc_wl_rfk_state state);
202 void rtw89_btc_ntfy_wl_sta(struct rtw89_dev *rtwdev);
203 void rtw89_btc_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb,
204 			  u32 len, u8 class, u8 func);
205 void rtw89_btc_dump_info(struct rtw89_dev *rtwdev, struct seq_file *m);
206 void rtw89_coex_act1_work(struct work_struct *work);
207 void rtw89_coex_bt_devinfo_work(struct work_struct *work);
208 void rtw89_coex_rfk_chk_work(struct work_struct *work);
209 void rtw89_coex_power_on(struct rtw89_dev *rtwdev);
210 void rtw89_btc_set_policy(struct rtw89_dev *rtwdev, u16 policy_type);
211 void rtw89_btc_set_policy_v1(struct rtw89_dev *rtwdev, u16 policy_type);
212 void rtw89_coex_recognize_ver(struct rtw89_dev *rtwdev);
213 
214 static inline u8 rtw89_btc_phymap(struct rtw89_dev *rtwdev,
215 				  enum rtw89_phy_idx phy_idx,
216 				  enum rtw89_rf_path_bit paths)
217 {
218 	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
219 	u8 phy_map;
220 
221 	phy_map = FIELD_PREP(BTC_RFK_PATH_MAP, paths) |
222 		  FIELD_PREP(BTC_RFK_PHY_MAP, BIT(phy_idx)) |
223 		  FIELD_PREP(BTC_RFK_BAND_MAP, chan->band_type);
224 
225 	return phy_map;
226 }
227 
228 static inline u8 rtw89_btc_path_phymap(struct rtw89_dev *rtwdev,
229 				       enum rtw89_phy_idx phy_idx,
230 				       enum rtw89_rf_path path)
231 {
232 	return rtw89_btc_phymap(rtwdev, phy_idx, BIT(path));
233 }
234 
235 /* return bt req len in TU */
236 static inline u16 rtw89_coex_query_bt_req_len(struct rtw89_dev *rtwdev,
237 					      enum rtw89_phy_idx phy_idx)
238 {
239 	struct rtw89_btc *btc = &rtwdev->btc;
240 
241 	return btc->bt_req_len;
242 }
243 
244 #endif
245