xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/rockchip_wlan/rtl8821cs/include/rtw_mcc.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /******************************************************************************
3  *
4  * Copyright(c) 2015 - 2017 Realtek Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of version 2 of the GNU General Public License as
8  * published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13  * more details.
14  *
15  *****************************************************************************/
16 #ifdef CONFIG_MCC_MODE
17 
18 #ifndef _RTW_MCC_H_
19 #define _RTW_MCC_H_
20 
21 #include <drv_types.h> /* PADAPTER */
22 
23 #define MCC_STATUS_PROCESS_MCC_START_SETTING BIT0
24 #define MCC_STATUS_PROCESS_MCC_STOP_SETTING BIT1
25 #define MCC_STATUS_NEED_MCC BIT2
26 #define MCC_STATUS_DOING_MCC BIT3
27 
28 
29 #define MCC_SWCH_FW_EARLY_TIME 10 /* ms */
30 #define MCC_EXPIRE_TIME 50 /* ms */
31 #define MCC_TOLERANCE_TIME 2 /* 2*2 = 4s */
32 #define MCC_UPDATE_PARAMETER_THRESHOLD 5 /* ms */
33 
34 #define MCC_ROLE_STA_GC_MGMT_QUEUE_MACID 0
35 #define MCC_ROLE_SOFTAP_GO_MGMT_QUEUE_MACID 1
36 
37 /* Lower for stop, Higher for start */
38 #define MCC_SETCMD_STATUS_STOP_DISCONNECT 0x0
39 #define MCC_SETCMD_STATUS_STOP_SCAN_START 0x1
40 #define MCC_SETCMD_STATUS_START_CONNECT 0x80
41 #define MCC_SETCMD_STATUS_START_SCAN_DONE 0x81
42 
43 /*
44 * depenad platform or customer requirement(TP unit:Mbps),
45 * must be provided by PM or sales or product document
46 * too large value means not to limit tx bytes (current for ap mode)
47 * NOTE: following values ref from test results
48 */
49 #define MCC_AP_BW20_TARGET_TX_TP (300)
50 #define MCC_AP_BW40_TARGET_TX_TP (300)
51 #define MCC_AP_BW80_TARGET_TX_TP (300)
52 #define MCC_STA_BW20_TARGET_TX_TP (35)
53 #define MCC_STA_BW40_TARGET_TX_TP (70)
54 #define MCC_STA_BW80_TARGET_TX_TP (140)
55 #define MCC_SINGLE_TX_CRITERIA 5 /* Mbps */
56 
57 #define MAX_MCC_NUM 2
58 #ifdef CONFIG_RTL8822C
59 #define DBG_MCC_REG_NUM 3
60 #else
61 #define DBG_MCC_REG_NUM 4
62 #endif
63 #define DBG_MCC_RF_REG_NUM 1
64 
65 #define MCC_STOP(adapter) (adapter->mcc_adapterpriv.mcc_tx_stop)
66 #define MCC_EN(adapter) (adapter_to_dvobj(adapter)->mcc_objpriv.en_mcc)
67 #define adapter_to_mccobjpriv(adapter) (&(adapter_to_dvobj(adapter)->mcc_objpriv))
68 #define SET_MCC_EN_FLAG(adapter, flag)\
69 	do { \
70 		adapter_to_dvobj(adapter)->mcc_objpriv.en_mcc = (flag); \
71 	} while (0)
72 #define SET_MCC_DURATION(adapter, val)\
73 	do { \
74 		adapter_to_dvobj(adapter)->mcc_objpriv.duration = (val); \
75 	} while (0)
76 #define SET_MCC_RUNTIME_DURATION(adapter, flag)\
77 	do { \
78 		adapter_to_dvobj(adapter)->mcc_objpriv.enable_runtime_duration = (flag); \
79 	} while (0)
80 
81 #define SET_MCC_PHYDM_OFFLOAD(adapter, flag)\
82 	do { \
83 		adapter_to_dvobj(adapter)->mcc_objpriv.mcc_phydm_offload = (flag); \
84 	} while (0)
85 
86 #ifdef CONFIG_MCC_PHYDM_OFFLOAD
87 enum mcc_cfg_phydm_ops {
88 	MCC_CFG_PHYDM_OFFLOAD = 0,
89 	MCC_CFG_PHYDM_RF_CH,
90 	MCC_CFG_PHYDM_ADD_CLIENT,
91 	MCC_CFG_PHYDM_REMOVE_CLIENT,
92 	MCC_CFG_PHYDM_START,
93 	MCC_CFG_PHYDM_STOP,
94 	MCC_CFG_PHYDM_DUMP,
95 	MCC_CFG_PHYDM_MAX,
96 };
97 #endif
98 
99 enum rtw_mcc_cmd_id {
100 	MCC_CMD_WK_CID = 0,
101 	MCC_SET_DURATION_WK_CID,
102 	MCC_GET_DBG_REG_WK_CID,
103 	#ifdef CONFIG_MCC_PHYDM_OFFLOAD
104 	MCC_SET_PHYDM_OFFLOAD_WK_CID,
105 	#endif
106 };
107 
108 /* Represent Channel Tx Null setting */
109 enum mcc_channel_tx_null {
110 	MCC_ENABLE_TX_NULL = 0,
111 	MCC_DISABLE_TX_NULL = 1,
112 };
113 
114 /* Represent C2H Report setting */
115 enum mcc_c2h_report {
116 	MCC_C2H_REPORT_DISABLE = 0,
117 	MCC_C2H_REPORT_FAIL_STATUS = 1,
118 	MCC_C2H_REPORT_ALL_STATUS = 2,
119 };
120 
121 /* Represent Channel Scan */
122 enum mcc_channel_scan {
123 	MCC_CHIDX = 0,
124 	MCC_SCANCH_RSVD_LOC = 1,
125 };
126 
127 /* Represent FW status report of channel switch */
128 enum mcc_status_rpt {
129 	MCC_RPT_SUCCESS = 0,
130 	MCC_RPT_TXNULL_FAIL = 1,
131 	MCC_RPT_STOPMCC = 2,
132 	MCC_RPT_READY = 3,
133 	MCC_RPT_SWICH_CHANNEL_NOTIFY = 7,
134 	MCC_RPT_UPDATE_NOA_START_TIME = 8,
135 	MCC_RPT_TSF = 9,
136 	MCC_RPT_MAX,
137 };
138 
139 enum mcc_role {
140 	MCC_ROLE_STA = 0,
141 	MCC_ROLE_AP = 1,
142 	MCC_ROLE_GC = 2,
143 	MCC_ROLE_GO = 3,
144 	MCC_ROLE_MAX,
145 };
146 
147 struct mcc_iqk_backup {
148 	u16 TX_X;
149 	u16 TX_Y;
150 	u16 RX_X;
151 	u16 RX_Y;
152 };
153 
154 enum mcc_duration_setting {
155 	MCC_DURATION_MAPPING = 0,
156 	MCC_DURATION_DIRECET = 1,
157 };
158 
159 enum mcc_sched_mode {
160 	MCC_FAIR_SCHEDULE = 0,
161 	MCC_FAVOR_STA = 1,
162 	MCC_FAVOR_P2P = 2,
163 };
164 
165 /*  mcc data for adapter */
166 struct mcc_adapter_priv {
167 	u8 order;		/* FW document, softap/AP must be 0 */
168 	enum mcc_role role;			/* MCC role(AP,STA,GO,GC) */
169 	u8 mcc_duration; /* channel stay period, UNIT:1TU */
170 
171 	/* flow control */
172 	u8 mcc_tx_stop;				/* check if tp stop or not */
173 	u8 mcc_tp_limit;				/* check if tp limit or not */
174 	u32 mcc_target_tx_bytes_to_port;		/* customer require  */
175 	u32 mcc_tx_bytes_to_port;	/* already tx to tx fifo (write port) */
176 
177 	/* data from kernel to check if enqueue data or netif stop queue */
178 	u32 mcc_tp;
179 	u64 mcc_tx_bytes_from_kernel;
180 	u64 mcc_last_tx_bytes_from_kernel;
181 
182 	/* Backup IQK value for MCC */
183 	struct mcc_iqk_backup mcc_iqk_arr[MAX_RF_PATH];
184 
185 	/* mgmt queue macid to avoid RA issue */
186 	u8 mgmt_queue_macid;
187 
188 	/* set macid bitmap to let fw know which macid should be tx pause */
189 	/* all interface share total 16 macid */
190 	u16 mcc_macid_bitmap;
191 
192 	/* use for NoA start time (unit: mircoseconds) */
193 	u32 noa_start_time;
194 
195 	u8 p2p_go_noa_ie[MAX_P2P_IE_LEN];
196 	u32 p2p_go_noa_ie_len;
197 	u64 tsf;
198 #ifdef CONFIG_TDLS
199 	u8 backup_tdls_en;
200 #endif /* CONFIG_TDLS */
201 
202 	u8 null_early;
203 	u8 null_rty_num;
204 };
205 
206 struct mcc_obj_priv {
207 	u8 en_mcc; /* enable MCC or not */
208 	u8 duration; /* store duration(%) from registry, for primary adapter */
209 	u8 interval;
210 	u8 start_time;
211 	u8 mcc_c2h_status;
212 	u8 cur_mcc_success_cnt; /* used for check mcc switch channel success */
213 	u8 prev_mcc_success_cnt; /* used for check mcc switch channel success */
214 	u8 mcc_tolerance_time; /* used for detect mcc switch channel success */
215 	u8 mcc_loc_rsvd_paga[MAX_MCC_NUM];  /* mcc rsvd page */
216 	u8 mcc_status; /* mcc status stop or start .... */
217 	u8 policy_index;
218 	u8 mcc_stop_threshold;
219 	u8 current_order;
220 	u8 last_tsfdiff;
221 	systime mcc_launch_time; /* mcc launch time, used for starting detect mcc switch channel success */
222 	_mutex mcc_mutex;
223 	_lock mcc_lock;
224 	PADAPTER iface[MAX_MCC_NUM]; /* by order, use for mcc parameter cmd */
225 	struct submit_ctx mcc_sctx;
226 	struct submit_ctx mcc_tsf_req_sctx;
227 	_mutex mcc_tsf_req_mutex;
228 	u8 mcc_tsf_req_sctx_order; /* record current order for mcc_tsf_req_sctx */
229 #ifdef CONFIG_MCC_MODE_V2
230 	u8 mcc_iqk_value_rsvd_page[3];
231 #endif /* CONFIG_MCC_MODE_V2 */
232 	u8 mcc_pwr_idx_rsvd_page[MAX_MCC_NUM];
233 	u8 enable_runtime_duration;
234 	/* for LG */
235 	u8 mchan_sched_mode;
236 
237 	_mutex mcc_dbg_reg_mutex;
238 	u32 dbg_reg[DBG_MCC_REG_NUM];
239 	u32 dbg_reg_val[DBG_MCC_REG_NUM];
240 	u32 dbg_rf_reg[DBG_MCC_RF_REG_NUM];
241 	u32 dbg_rf_reg_val[DBG_MCC_RF_REG_NUM][MAX_RF_PATH];
242 	u8 mcc_phydm_offload;
243 };
244 
245 /* backup IQK val */
246 void rtw_hal_mcc_restore_iqk_val(PADAPTER padapter);
247 
248 /* check mcc status */
249 u8 rtw_hal_check_mcc_status(PADAPTER padapter, u8 mcc_status);
250 
251 /* set mcc status */
252 void rtw_hal_set_mcc_status(PADAPTER padapter, u8 mcc_status);
253 
254 /* clear mcc status */
255 void rtw_hal_clear_mcc_status(PADAPTER padapter, u8 mcc_status);
256 
257 /* dl mcc rsvd page */
258 u8 rtw_hal_dl_mcc_fw_rsvd_page(_adapter *adapter, u8 *pframe, u16 *index
259 	, u8 tx_desc, u32 page_size, u8 *total_page_num, RSVDPAGE_LOC *rsvd_page_loc, u8 *page_num);
260 
261 /* handle C2H */
262 void rtw_hal_mcc_c2h_handler(PADAPTER padapter, u8 buflen, u8 *tmpBuf);
263 
264 /* switch channel successfully or not */
265 void rtw_hal_mcc_sw_status_check(PADAPTER padapter);
266 
267 /* change some scan flags under site survey */
268 u8 rtw_hal_mcc_change_scan_flag(PADAPTER padapter, u8 *ch, u8 *bw, u8 *offset);
269 
270 /* record data kernel TX to driver to check MCC concurrent TX  */
271 void rtw_hal_mcc_calc_tx_bytes_from_kernel(PADAPTER padapter, u32 len);
272 
273 /* record data to port to let driver do flow ctrl  */
274 void rtw_hal_mcc_calc_tx_bytes_to_port(PADAPTER padapter, u32 len);
275 
276 /* check stop write port or not  */
277 u8 rtw_hal_mcc_stop_tx_bytes_to_port(PADAPTER padapter);
278 
279 u8 rtw_hal_set_mcc_setting_scan_start(PADAPTER padapter);
280 
281 u8 rtw_hal_set_mcc_setting_scan_complete(PADAPTER padapter);
282 
283 u8 rtw_hal_set_mcc_setting_start_bss_network(PADAPTER padapter, u8 chbw_grouped);
284 
285 u8 rtw_hal_set_mcc_setting_disconnect(PADAPTER padapter);
286 
287 u8 rtw_hal_set_mcc_setting_join_done_chk_ch(PADAPTER padapter);
288 
289 u8 rtw_hal_set_mcc_setting_chk_start_clnt_join(PADAPTER padapter, u8 *ch, u8 *bw, u8 *offset, u8 chbw_allow);
290 
291 void rtw_hal_dump_mcc_info(void *sel, struct dvobj_priv *dvobj);
292 
293 void update_mcc_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib);
294 
295 u8 rtw_hal_mcc_link_status_chk(_adapter *padapter, const char *msg);
296 
297 void rtw_hal_mcc_issue_null_data(_adapter *padapter, u8 chbw_allow, u8 ps_mode);
298 
299 u8 *rtw_hal_mcc_append_go_p2p_ie(PADAPTER padapter, u8 *pframe, u32 *len);
300 
301 void rtw_hal_dump_mcc_policy_table(void *sel);
302 
303 void rtw_hal_mcc_update_macid_bitmap(PADAPTER padapter, int mac_id, u8 add);
304 
305 void rtw_hal_mcc_process_noa(PADAPTER padapter);
306 
307 void rtw_hal_mcc_parameter_init(PADAPTER padapter);
308 
309 u8 rtw_mcc_cmd_hdl(PADAPTER adapter, u8 type, const u8 *val);
310 
311 u8 rtw_set_mcc_duration_cmd(_adapter *adapter, u8 type, u8 val);
312 #ifdef CONFIG_MCC_PHYDM_OFFLOAD
313 u8 rtw_set_mcc_phydm_offload_enable_cmd(PADAPTER adapter, u8 enable, u8 enqueue);
314 #endif /* CONFIG_MCC_PHYDM_OFFLOAD */
315 #endif /* _RTW_MCC_H_ */
316 #endif /* CONFIG_MCC_MODE */
317