162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
262306a36Sopenharmony_ci/* Copyright(c) 2019-2020  Realtek Corporation
362306a36Sopenharmony_ci */
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#ifndef __RTW89_COEX_H__
662306a36Sopenharmony_ci#define __RTW89_COEX_H__
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include "core.h"
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cienum btc_mode {
1162306a36Sopenharmony_ci	BTC_MODE_NORMAL,
1262306a36Sopenharmony_ci	BTC_MODE_WL,
1362306a36Sopenharmony_ci	BTC_MODE_BT,
1462306a36Sopenharmony_ci	BTC_MODE_WLOFF,
1562306a36Sopenharmony_ci	BTC_MODE_MAX
1662306a36Sopenharmony_ci};
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cienum btc_wl_rfk_type {
1962306a36Sopenharmony_ci	BTC_WRFKT_IQK = 0,
2062306a36Sopenharmony_ci	BTC_WRFKT_LCK = 1,
2162306a36Sopenharmony_ci	BTC_WRFKT_DPK = 2,
2262306a36Sopenharmony_ci	BTC_WRFKT_TXGAPK = 3,
2362306a36Sopenharmony_ci	BTC_WRFKT_DACK = 4,
2462306a36Sopenharmony_ci	BTC_WRFKT_RXDCK = 5,
2562306a36Sopenharmony_ci	BTC_WRFKT_TSSI = 6,
2662306a36Sopenharmony_ci};
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#define NM_EXEC false
2962306a36Sopenharmony_ci#define FC_EXEC true
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#define RTW89_COEX_ACT1_WORK_PERIOD	round_jiffies_relative(HZ * 4)
3262306a36Sopenharmony_ci#define RTW89_COEX_BT_DEVINFO_WORK_PERIOD	round_jiffies_relative(HZ * 16)
3362306a36Sopenharmony_ci#define RTW89_COEX_RFK_CHK_WORK_PERIOD	msecs_to_jiffies(300)
3462306a36Sopenharmony_ci#define BTC_RFK_PATH_MAP GENMASK(3, 0)
3562306a36Sopenharmony_ci#define BTC_RFK_PHY_MAP GENMASK(5, 4)
3662306a36Sopenharmony_ci#define BTC_RFK_BAND_MAP GENMASK(7, 6)
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cienum btc_wl_rfk_state {
3962306a36Sopenharmony_ci	BTC_WRFK_STOP = 0,
4062306a36Sopenharmony_ci	BTC_WRFK_START = 1,
4162306a36Sopenharmony_ci	BTC_WRFK_ONESHOT_START = 2,
4262306a36Sopenharmony_ci	BTC_WRFK_ONESHOT_STOP = 3,
4362306a36Sopenharmony_ci};
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cienum btc_pri {
4662306a36Sopenharmony_ci	BTC_PRI_MASK_RX_RESP = 0,
4762306a36Sopenharmony_ci	BTC_PRI_MASK_TX_RESP,
4862306a36Sopenharmony_ci	BTC_PRI_MASK_BEACON,
4962306a36Sopenharmony_ci	BTC_PRI_MASK_RX_CCK,
5062306a36Sopenharmony_ci	BTC_PRI_MASK_TX_MNGQ,
5162306a36Sopenharmony_ci	BTC_PRI_MASK_MAX,
5262306a36Sopenharmony_ci};
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cienum btc_bt_trs {
5562306a36Sopenharmony_ci	BTC_BT_SS_GROUP = 0x0,
5662306a36Sopenharmony_ci	BTC_BT_TX_GROUP = 0x2,
5762306a36Sopenharmony_ci	BTC_BT_RX_GROUP = 0x3,
5862306a36Sopenharmony_ci	BTC_BT_MAX_GROUP,
5962306a36Sopenharmony_ci};
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cienum btc_rssi_st {
6262306a36Sopenharmony_ci	BTC_RSSI_ST_LOW = 0x0,
6362306a36Sopenharmony_ci	BTC_RSSI_ST_HIGH,
6462306a36Sopenharmony_ci	BTC_RSSI_ST_STAY_LOW,
6562306a36Sopenharmony_ci	BTC_RSSI_ST_STAY_HIGH,
6662306a36Sopenharmony_ci	BTC_RSSI_ST_MAX
6762306a36Sopenharmony_ci};
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_cienum btc_fddt_en {
7062306a36Sopenharmony_ci	BTC_FDDT_DISABLE,
7162306a36Sopenharmony_ci	BTC_FDDT_ENABLE,
7262306a36Sopenharmony_ci};
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci#define	BTC_RSSI_HIGH(_rssi_) \
7562306a36Sopenharmony_ci	({typeof(_rssi_) __rssi = (_rssi_); \
7662306a36Sopenharmony_ci	  ((__rssi == BTC_RSSI_ST_HIGH || \
7762306a36Sopenharmony_ci	    __rssi == BTC_RSSI_ST_STAY_HIGH) ? 1 : 0); })
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci#define	BTC_RSSI_LOW(_rssi_) \
8062306a36Sopenharmony_ci	({typeof(_rssi_) __rssi = (_rssi_); \
8162306a36Sopenharmony_ci	  ((__rssi == BTC_RSSI_ST_LOW || \
8262306a36Sopenharmony_ci	    __rssi == BTC_RSSI_ST_STAY_LOW) ? 1 : 0); })
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci#define BTC_RSSI_CHANGE(_rssi_) \
8562306a36Sopenharmony_ci	({typeof(_rssi_) __rssi = (_rssi_); \
8662306a36Sopenharmony_ci	  ((__rssi == BTC_RSSI_ST_LOW || \
8762306a36Sopenharmony_ci	    __rssi == BTC_RSSI_ST_HIGH) ? 1 : 0); })
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_cienum btc_ant {
9062306a36Sopenharmony_ci	BTC_ANT_SHARED = 0,
9162306a36Sopenharmony_ci	BTC_ANT_DEDICATED,
9262306a36Sopenharmony_ci	BTC_ANTTYPE_MAX
9362306a36Sopenharmony_ci};
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_cienum btc_bt_btg {
9662306a36Sopenharmony_ci	BTC_BT_ALONE = 0,
9762306a36Sopenharmony_ci	BTC_BT_BTG
9862306a36Sopenharmony_ci};
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_cienum btc_switch {
10162306a36Sopenharmony_ci	BTC_SWITCH_INTERNAL = 0,
10262306a36Sopenharmony_ci	BTC_SWITCH_EXTERNAL
10362306a36Sopenharmony_ci};
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_cienum btc_pkt_type {
10662306a36Sopenharmony_ci	PACKET_DHCP,
10762306a36Sopenharmony_ci	PACKET_ARP,
10862306a36Sopenharmony_ci	PACKET_EAPOL,
10962306a36Sopenharmony_ci	PACKET_EAPOL_END,
11062306a36Sopenharmony_ci	PACKET_ICMP,
11162306a36Sopenharmony_ci	PACKET_MAX
11262306a36Sopenharmony_ci};
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_cienum btc_bt_mailbox_id {
11562306a36Sopenharmony_ci	BTC_BTINFO_REPLY = 0x23,
11662306a36Sopenharmony_ci	BTC_BTINFO_AUTO = 0x27
11762306a36Sopenharmony_ci};
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_cienum btc_role_state {
12062306a36Sopenharmony_ci	BTC_ROLE_START,
12162306a36Sopenharmony_ci	BTC_ROLE_STOP,
12262306a36Sopenharmony_ci	BTC_ROLE_CHG_TYPE,
12362306a36Sopenharmony_ci	BTC_ROLE_MSTS_STA_CONN_START,
12462306a36Sopenharmony_ci	BTC_ROLE_MSTS_STA_CONN_END,
12562306a36Sopenharmony_ci	BTC_ROLE_MSTS_STA_DIS_CONN,
12662306a36Sopenharmony_ci	BTC_ROLE_MSTS_AP_START,
12762306a36Sopenharmony_ci	BTC_ROLE_MSTS_AP_STOP,
12862306a36Sopenharmony_ci	BTC_ROLE_STATE_UNKNOWN
12962306a36Sopenharmony_ci};
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_cienum btc_rfctrl {
13262306a36Sopenharmony_ci	BTC_RFCTRL_WL_OFF,
13362306a36Sopenharmony_ci	BTC_RFCTRL_WL_ON,
13462306a36Sopenharmony_ci	BTC_RFCTRL_LPS_WL_ON,
13562306a36Sopenharmony_ci	BTC_RFCTRL_FW_CTRL,
13662306a36Sopenharmony_ci	BTC_RFCTRL_MAX
13762306a36Sopenharmony_ci};
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_cienum btc_lps_state {
14062306a36Sopenharmony_ci	BTC_LPS_OFF = 0,
14162306a36Sopenharmony_ci	BTC_LPS_RF_OFF = 1,
14262306a36Sopenharmony_ci	BTC_LPS_RF_ON = 2
14362306a36Sopenharmony_ci};
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_civoid rtw89_btc_ntfy_poweron(struct rtw89_dev *rtwdev);
14662306a36Sopenharmony_civoid rtw89_btc_ntfy_poweroff(struct rtw89_dev *rtwdev);
14762306a36Sopenharmony_civoid rtw89_btc_ntfy_init(struct rtw89_dev *rtwdev, u8 mode);
14862306a36Sopenharmony_civoid rtw89_btc_ntfy_scan_start(struct rtw89_dev *rtwdev, u8 phy_idx, u8 band);
14962306a36Sopenharmony_civoid rtw89_btc_ntfy_scan_finish(struct rtw89_dev *rtwdev, u8 phy_idx);
15062306a36Sopenharmony_civoid rtw89_btc_ntfy_switch_band(struct rtw89_dev *rtwdev, u8 phy_idx, u8 band);
15162306a36Sopenharmony_civoid rtw89_btc_ntfy_specific_packet(struct rtw89_dev *rtwdev,
15262306a36Sopenharmony_ci				    enum btc_pkt_type pkt_type);
15362306a36Sopenharmony_civoid rtw89_btc_ntfy_eapol_packet_work(struct work_struct *work);
15462306a36Sopenharmony_civoid rtw89_btc_ntfy_arp_packet_work(struct work_struct *work);
15562306a36Sopenharmony_civoid rtw89_btc_ntfy_dhcp_packet_work(struct work_struct *work);
15662306a36Sopenharmony_civoid rtw89_btc_ntfy_icmp_packet_work(struct work_struct *work);
15762306a36Sopenharmony_civoid rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
15862306a36Sopenharmony_ci			      struct rtw89_sta *rtwsta, enum btc_role_state state);
15962306a36Sopenharmony_civoid rtw89_btc_ntfy_radio_state(struct rtw89_dev *rtwdev, enum btc_rfctrl rf_state);
16062306a36Sopenharmony_civoid rtw89_btc_ntfy_wl_rfk(struct rtw89_dev *rtwdev, u8 phy_map,
16162306a36Sopenharmony_ci			   enum btc_wl_rfk_type type,
16262306a36Sopenharmony_ci			   enum btc_wl_rfk_state state);
16362306a36Sopenharmony_civoid rtw89_btc_ntfy_wl_sta(struct rtw89_dev *rtwdev);
16462306a36Sopenharmony_civoid rtw89_btc_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb,
16562306a36Sopenharmony_ci			  u32 len, u8 class, u8 func);
16662306a36Sopenharmony_civoid rtw89_btc_dump_info(struct rtw89_dev *rtwdev, struct seq_file *m);
16762306a36Sopenharmony_civoid rtw89_coex_act1_work(struct work_struct *work);
16862306a36Sopenharmony_civoid rtw89_coex_bt_devinfo_work(struct work_struct *work);
16962306a36Sopenharmony_civoid rtw89_coex_rfk_chk_work(struct work_struct *work);
17062306a36Sopenharmony_civoid rtw89_coex_power_on(struct rtw89_dev *rtwdev);
17162306a36Sopenharmony_civoid rtw89_btc_set_policy(struct rtw89_dev *rtwdev, u16 policy_type);
17262306a36Sopenharmony_civoid rtw89_btc_set_policy_v1(struct rtw89_dev *rtwdev, u16 policy_type);
17362306a36Sopenharmony_civoid rtw89_coex_recognize_ver(struct rtw89_dev *rtwdev);
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_cistatic inline u8 rtw89_btc_phymap(struct rtw89_dev *rtwdev,
17662306a36Sopenharmony_ci				  enum rtw89_phy_idx phy_idx,
17762306a36Sopenharmony_ci				  enum rtw89_rf_path_bit paths)
17862306a36Sopenharmony_ci{
17962306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
18062306a36Sopenharmony_ci	u8 phy_map;
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci	phy_map = FIELD_PREP(BTC_RFK_PATH_MAP, paths) |
18362306a36Sopenharmony_ci		  FIELD_PREP(BTC_RFK_PHY_MAP, BIT(phy_idx)) |
18462306a36Sopenharmony_ci		  FIELD_PREP(BTC_RFK_BAND_MAP, chan->band_type);
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci	return phy_map;
18762306a36Sopenharmony_ci}
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_cistatic inline u8 rtw89_btc_path_phymap(struct rtw89_dev *rtwdev,
19062306a36Sopenharmony_ci				       enum rtw89_phy_idx phy_idx,
19162306a36Sopenharmony_ci				       enum rtw89_rf_path path)
19262306a36Sopenharmony_ci{
19362306a36Sopenharmony_ci	return rtw89_btc_phymap(rtwdev, phy_idx, BIT(path));
19462306a36Sopenharmony_ci}
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci/* return bt req len in TU */
19762306a36Sopenharmony_cistatic inline u16 rtw89_coex_query_bt_req_len(struct rtw89_dev *rtwdev,
19862306a36Sopenharmony_ci					      enum rtw89_phy_idx phy_idx)
19962306a36Sopenharmony_ci{
20062306a36Sopenharmony_ci	struct rtw89_btc *btc = &rtwdev->btc;
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci	return btc->bt_req_len;
20362306a36Sopenharmony_ci}
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci#endif
206