xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_mcc.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /******************************************************************************
2  *
3  * Copyright(c) 2015 - 2017 Realtek Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  *****************************************************************************/
15 #ifdef CONFIG_MCC_MODE
16 
17 #ifndef _RTW_MCC_H_
18 #define _RTW_MCC_H_
19 
20 #include <drv_types.h> /* PADAPTER */
21 
22 #define MCC_STATUS_PROCESS_MCC_START_SETTING BIT0
23 #define MCC_STATUS_PROCESS_MCC_STOP_SETTING BIT1
24 #define MCC_STATUS_NEED_MCC BIT2
25 #define MCC_STATUS_DOING_MCC BIT3
26 
27 
28 #define MCC_SWCH_FW_EARLY_TIME 10 /* ms */
29 #define MCC_EXPIRE_TIME 50 /* ms */
30 #define MCC_TOLERANCE_TIME 2 /* 2*2 = 4s */
31 
32 #define MCC_ROLE_STA_GC_MGMT_QUEUE_MACID 0
33 #define MCC_ROLE_SOFTAP_GO_MGMT_QUEUE_MACID 1
34 
35 /* Lower for stop, Higher for start */
36 #define MCC_SETCMD_STATUS_STOP_DISCONNECT 0x0
37 #define MCC_SETCMD_STATUS_STOP_SCAN_START 0x1
38 #define MCC_SETCMD_STATUS_START_CONNECT 0x80
39 #define MCC_SETCMD_STATUS_START_SCAN_DONE 0x81
40 
41 /*
42 * depenad platform or customer requirement(TP unit:Mbps),
43 * must be provided by PM or sales or product document
44 * too large value means not to limit tx bytes (current for ap mode)
45 * NOTE: following values ref from test results
46 */
47 #define MCC_AP_BW20_TARGET_TX_TP (300)
48 #define MCC_AP_BW40_TARGET_TX_TP (300)
49 #define MCC_AP_BW80_TARGET_TX_TP (300)
50 #define MCC_STA_BW20_TARGET_TX_TP (35)
51 #define MCC_STA_BW40_TARGET_TX_TP (70)
52 #define MCC_STA_BW80_TARGET_TX_TP (140)
53 #define MCC_SINGLE_TX_CRITERIA 5 /* Mbps */
54 
55 #define MAX_MCC_NUM 2
56 
57 #define MCC_STOP(adapter) (adapter->mcc_adapterpriv.mcc_tx_stop)
58 #define MCC_EN(adapter) (adapter->registrypriv.en_mcc)
59 
60 /* Represent Channel Tx Null setting */
61 enum mcc_channel_tx_null {
62 	MCC_ENABLE_TX_NULL = 0,
63 	MCC_DISABLE_TX_NULL = 1,
64 };
65 
66 /* Represent C2H Report setting */
67 enum mcc_c2h_report {
68 	MCC_C2H_REPORT_DISABLE = 0,
69 	MCC_C2H_REPORT_FAIL_STATUS = 1,
70 	MCC_C2H_REPORT_ALL_STATUS = 2,
71 };
72 
73 /* Represent Channel Scan */
74 enum mcc_channel_scan {
75 	MCC_CHIDX = 0,
76 	MCC_SCANCH_RSVD_LOC = 1,
77 };
78 
79 /* Represent FW status report of channel switch */
80 enum mcc_status_rpt {
81 	MCC_RPT_SUCCESS = 0,
82 	MCC_RPT_TXNULL_FAIL = 1,
83 	MCC_RPT_STOPMCC = 2,
84 	MCC_RPT_READY = 3,
85 	MCC_RPT_SWICH_CHANNEL_NOTIFY = 7,
86 	MCC_RPT_UPDATE_NOA_START_TIME = 8,
87 	MCC_RPT_MAX,
88 };
89 
90 enum MCC_ROLE {
91 	MCC_ROLE_STA = 0,
92 	MCC_ROLE_AP = 1,
93 	MCC_ROLE_GC = 2,
94 	MCC_ROLE_GO = 3,
95 	MCC_ROLE_MAX,
96 };
97 
98 struct mcc_iqk_backup {
99 	u16 TX_X;
100 	u16 TX_Y;
101 	u16 RX_X;
102 	u16 RX_Y;
103 };
104 
105 /*  mcc data for adapter */
106 struct mcc_adapter_priv {
107 	u8 order;		/* FW document, softap/AP must be 0 */
108 	u8 role;			/* MCC role(AP,STA,GO,GC) */
109 	u8 mcc_duration; /* channel stay period, UNIT:1TU */
110 
111 	/* flow control */
112 	u8 mcc_tx_stop;				/* check if tp stop or not */
113 	u8 mcc_tp_limit;				/* check if tp limit or not */
114 	u32 mcc_target_tx_bytes_to_port;		/* customer require  */
115 	u32 mcc_tx_bytes_to_port;	/* already tx to tx fifo (write port) */
116 
117 	/* data from kernel to check if enqueue data or netif stop queue */
118 	u32 mcc_tp;
119 	u64 mcc_tx_bytes_from_kernel;
120 	u64 mcc_last_tx_bytes_from_kernel;
121 
122 	/* Backup IQK value for MCC */
123 	struct mcc_iqk_backup mcc_iqk_arr[MAX_RF_PATH];
124 
125 	/* mgmt queue macid to avoid RA issue */
126 	u8 mgmt_queue_macid;
127 
128 	/* set macid bitmap to let fw know which macid should be tx pause */
129 	/* all interface share total 16 macid */
130 	u16 mcc_macid_bitmap;
131 
132 	/* use for NoA start time (unit: mircoseconds) */
133 	u32 noa_start_time;
134 
135 	u8 p2p_go_noa_ie[MAX_P2P_IE_LEN];
136 	u32 p2p_go_noa_ie_len;
137 };
138 
139 struct mcc_obj_priv {
140 	u8 duration; /* channel stay period, UNIT:1TU */
141 	u8 mcc_c2h_status;
142 	u8 cur_mcc_success_cnt; /* used for check mcc switch channel success */
143 	u8 prev_mcc_success_cnt; /* used for check mcc switch channel success */
144 	u8 mcc_tolerance_time; /* used for detect mcc switch channel success */
145 	u8 mcc_loc_rsvd_paga[MAX_MCC_NUM];  /* mcc rsvd page */
146 	u8 mcc_status; /* mcc status stop or start .... */
147 	u8 policy_index;
148 	systime mcc_launch_time; /* mcc launch time, used for starting detect mcc switch channel success */
149 	_mutex mcc_mutex;
150 	_lock mcc_lock;
151 	PADAPTER iface[MAX_MCC_NUM]; /* by order, use for mcc parameter cmd */
152 	struct submit_ctx mcc_sctx;
153 };
154 
155 /* backup IQK val */
156 void rtw_hal_mcc_restore_iqk_val(PADAPTER padapter);
157 
158 /* check mcc status */
159 u8 rtw_hal_check_mcc_status(PADAPTER padapter, u8 mcc_status);
160 
161 /* set mcc status */
162 void rtw_hal_set_mcc_status(PADAPTER padapter, u8 mcc_status);
163 
164 /* clear mcc status */
165 void rtw_hal_clear_mcc_status(PADAPTER padapter, u8 mcc_status);
166 
167 /* dl mcc rsvd page */
168 u8 rtw_hal_dl_mcc_fw_rsvd_page(_adapter *adapter, u8 *pframe, u16 *index
169 	, u8 tx_desc, u32 page_size, u8 *page_num, u32 *total_pkt_len, RSVDPAGE_LOC *rsvd_page_loc);
170 
171 /* handle C2H */
172 void rtw_hal_mcc_c2h_handler(PADAPTER padapter, u8 buflen, u8 *tmpBuf);
173 
174 /* switch channel successfully or not */
175 void rtw_hal_mcc_sw_status_check(PADAPTER padapter);
176 
177 /* change some scan flags under site survey */
178 u8 rtw_hal_mcc_change_scan_flag(PADAPTER padapter, u8 *ch, u8 *bw, u8 *offset);
179 
180 /* record data kernel TX to driver to check MCC concurrent TX  */
181 void rtw_hal_mcc_calc_tx_bytes_from_kernel(PADAPTER padapter, u32 len);
182 
183 /* record data to port to let driver do flow ctrl  */
184 void rtw_hal_mcc_calc_tx_bytes_to_port(PADAPTER padapter, u32 len);
185 
186 /* check stop write port or not  */
187 u8 rtw_hal_mcc_stop_tx_bytes_to_port(PADAPTER padapter);
188 
189 u8 rtw_hal_set_mcc_setting_scan_start(PADAPTER padapter);
190 
191 u8 rtw_hal_set_mcc_setting_scan_complete(PADAPTER padapter);
192 
193 u8 rtw_hal_set_mcc_setting_start_bss_network(PADAPTER padapter, u8 chbw_grouped);
194 
195 u8 rtw_hal_set_mcc_setting_disconnect(PADAPTER padapter);
196 
197 u8 rtw_hal_set_mcc_setting_join_done_chk_ch(PADAPTER padapter);
198 
199 u8 rtw_hal_set_mcc_setting_chk_start_clnt_join(PADAPTER padapter, u8 *ch, u8 *bw, u8 *offset, u8 chbw_allow);
200 
201 void rtw_hal_dump_mcc_info(void *sel, struct dvobj_priv *dvobj);
202 
203 void update_mcc_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib);
204 
205 u8 rtw_hal_mcc_link_status_chk(_adapter *padapter, const char *msg);
206 
207 void rtw_hal_mcc_issue_null_data(_adapter *padapter, u8 chbw_allow, u8 ps_mode);
208 
209 u8 *rtw_hal_mcc_append_go_p2p_ie(PADAPTER padapter, u8 *pframe, u32 *len);
210 
211 void rtw_hal_mcc_update_switch_channel_policy_table(PADAPTER padapter);
212 
213 void rtw_hal_dump_mcc_policy_table(void *sel);
214 
215 #endif /* _RTW_MCC_H_ */
216 #endif /* CONFIG_MCC_MODE */
217