xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852be/include/rtw_csa.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright(c) 2019 - 2021 Realtek Corporation.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or modify it
6*4882a593Smuzhiyun  * under the terms of version 2 of the GNU General Public License as
7*4882a593Smuzhiyun  * published by the Free Software Foundation.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * This program is distributed in the hope that it will be useful, but WITHOUT
10*4882a593Smuzhiyun  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12*4882a593Smuzhiyun  * more details.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  *****************************************************************************/
15*4882a593Smuzhiyun #ifndef __RTW_CSA_H_
16*4882a593Smuzhiyun #define __RTW_CSA_H_
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #if CONFIG_DFS
19*4882a593Smuzhiyun #define CSA_IE_LEN 3 /* Length of Channel Switch element */
20*4882a593Smuzhiyun #define CSA_SWITCH_MODE 0
21*4882a593Smuzhiyun #define CSA_NEW_CH 1
22*4882a593Smuzhiyun #define CSA_SWITCH_COUNT 2
23*4882a593Smuzhiyun #define MAX_CSA_CNT 10
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #define CS_WR_DATA_LEN 5 /* Length of Channel Switch Wrapper element */
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun void reset_csa_param(struct rf_ctl_t *rfctl);
28*4882a593Smuzhiyun bool rtw_get_csa_setting(struct dvobj_priv *d, s16 *req_ch, u8 *req_bw, u8 *req_offset);
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #ifdef CONFIG_ECSA_PHL
31*4882a593Smuzhiyun #define MCC_ECSA_DELAY_START_TIME 30000 /* ms */
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun enum ecsa_state_t {
34*4882a593Smuzhiyun 	ECSA_ST_NONE,
35*4882a593Smuzhiyun 	ECSA_ST_SW_START, /* ready to switch */
36*4882a593Smuzhiyun 	ECSA_ST_SW_DONE /* switch done */
37*4882a593Smuzhiyun };
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun struct core_ecsa_info {
40*4882a593Smuzhiyun 	enum ecsa_state_t state;
41*4882a593Smuzhiyun 	u32 ecsa_allow_case;
42*4882a593Smuzhiyun 	u32 ecsa_delay_time;
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun 	/* @channel_width defined in 802.11-2016, Table 9-252 VHT operation information subfields
45*4882a593Smuzhiyun 	* 0 for 20 MHz or 40 MHz
46*4882a593Smuzhiyun 	* 1 for 80 MHz, 160 MHz or 80+80 MHz
47*4882a593Smuzhiyun 	* 2 for 160 MHz (deprecated)
48*4882a593Smuzhiyun 	* 3 for non-contiguous 80+80 MHz (deprecated)
49*4882a593Smuzhiyun 	*/
50*4882a593Smuzhiyun 	u8 channel_width;
51*4882a593Smuzhiyun 	struct createbss_parm *bss_param;
52*4882a593Smuzhiyun 	struct rtw_phl_ecsa_param phl_ecsa_param;
53*4882a593Smuzhiyun };
54*4882a593Smuzhiyun 
set_ecsa_state(struct core_ecsa_info * ecsa_info,enum ecsa_state_t state)55*4882a593Smuzhiyun __inline static void set_ecsa_state(struct core_ecsa_info *ecsa_info, enum ecsa_state_t state)
56*4882a593Smuzhiyun {
57*4882a593Smuzhiyun 	ecsa_info->state = state;
58*4882a593Smuzhiyun }
59*4882a593Smuzhiyun 
check_ecsa_state(struct core_ecsa_info * ecsa_info,enum ecsa_state_t state)60*4882a593Smuzhiyun __inline static bool check_ecsa_state(struct core_ecsa_info *ecsa_info, enum ecsa_state_t state)
61*4882a593Smuzhiyun {
62*4882a593Smuzhiyun 	if (ecsa_info->state == state)
63*4882a593Smuzhiyun 		return _TRUE;
64*4882a593Smuzhiyun 	return _FALSE;
65*4882a593Smuzhiyun }
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #define SET_ECSA_STATE(adapter, state) set_ecsa_state(&((adapter)->ecsa_info), (state))
68*4882a593Smuzhiyun #define CHK_ECSA_STATE(adapter, state) check_ecsa_state(&((adapter)->ecsa_info), (state))
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun bool rtw_mr_is_ecsa_running(struct _ADAPTER *a);
71*4882a593Smuzhiyun void rtw_ecsa_update_probe_resp(struct xmit_frame *xframe);
72*4882a593Smuzhiyun void rtw_ecsa_update_beacon(void *priv, struct rtw_wifi_role_t *role);
73*4882a593Smuzhiyun bool rtw_ap_check_ecsa_allow(
74*4882a593Smuzhiyun 	void *priv,
75*4882a593Smuzhiyun 	struct rtw_wifi_role_t *role,
76*4882a593Smuzhiyun 	struct rtw_chan_def chan_def,
77*4882a593Smuzhiyun 	enum phl_ecsa_start_reason reason,
78*4882a593Smuzhiyun 	u32 *delay_start_ms
79*4882a593Smuzhiyun );
80*4882a593Smuzhiyun void rtw_ecsa_mr_update_chan_info_by_role(
81*4882a593Smuzhiyun 	void *priv,
82*4882a593Smuzhiyun 	struct rtw_wifi_role_t *role,
83*4882a593Smuzhiyun 	struct rtw_chan_def new_chan_def
84*4882a593Smuzhiyun );
85*4882a593Smuzhiyun bool rtw_ecsa_check_tx_resume_allow(void *priv, struct rtw_wifi_role_t *role);
86*4882a593Smuzhiyun void rtw_ecsa_complete(void *priv, struct rtw_wifi_role_t *role);
87*4882a593Smuzhiyun void rtw_trigger_phl_ecsa_start(struct _ADAPTER *a);
88*4882a593Smuzhiyun #endif /* CONFIG_ECSA_PHL */
89*4882a593Smuzhiyun #endif /* CONFIG_DFS */
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun #endif
92