1 /******************************************************************************
3 * Copyright(c) 2015 Realtek Corporation. All rights reserved.
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.
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
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
18 ******************************************************************************/
19 #ifdef CONFIG_MCC_MODE
24 #include <drv_types.h> /* PADAPTER */
26 #define MCC_STATUS_PROCESS_MCC_START_SETTING BIT0
27 #define MCC_STATUS_PROCESS_MCC_STOP_SETTING BIT1
28 #define MCC_STATUS_NEED_MCC BIT2
29 #define MCC_STATUS_DOING_MCC BIT3
32 #define MCC_SWCH_FW_EARLY_TIME 10 /* ms */
33 #define MCC_EXPIRE_TIME 50 /* ms */
34 #define MCC_TOLERANCE_TIME 2 /* 2*2 = 4s */
36 #define MCC_ROLE_STA_GC_MGMT_QUEUE_MACID 0
37 #define MCC_ROLE_SOFTAP_GO_MGMT_QUEUE_MACID 1
39 /* Lower for stop, Higher for start */
40 #define MCC_SETCMD_STATUS_STOP_DISCONNECT 0x0
41 #define MCC_SETCMD_STATUS_STOP_SCAN_START 0x1
42 #define MCC_SETCMD_STATUS_START_CONNECT 0x80
43 #define MCC_SETCMD_STATUS_START_SCAN_DONE 0x81
46 * depenad platform or customer requirement(TP unit:Mbps),
47 * must be provided by PM or sales or product document
48 * too large value means not to limit tx bytes (current for ap mode)
49 * NOTE: following values ref from test results
51 #define MCC_AP_BW20_TARGET_TX_TP (300)
52 #define MCC_AP_BW40_TARGET_TX_TP (300)
53 #define MCC_AP_BW80_TARGET_TX_TP (300)
54 #define MCC_STA_BW20_TARGET_TX_TP (35)
55 #define MCC_STA_BW40_TARGET_TX_TP (70)
56 #define MCC_STA_BW80_TARGET_TX_TP (140)
57 #define MCC_SINGLE_TX_CRITERIA 5 /* Mbps */
61 #define MCC_STOP(adapter) (adapter->mcc_adapterpriv.mcc_tx_stop)
62 #define MCC_EN(adapter) (adapter->registrypriv.en_mcc)
64 /* Represent Channel Tx Null setting */
65 enum mcc_channel_tx_null {
66 MCC_ENABLE_TX_NULL = 0,
67 MCC_DISABLE_TX_NULL = 1,
70 /* Represent C2H Report setting */
72 MCC_C2H_REPORT_DISABLE = 0,
73 MCC_C2H_REPORT_FAIL_STATUS = 1,
74 MCC_C2H_REPORT_ALL_STATUS = 2,
77 /* Represent Channel Scan */
78 enum mcc_channel_scan {
80 MCC_SCANCH_RSVD_LOC = 1,
83 /* Represent FW status report of channel switch */
86 MCC_RPT_TXNULL_FAIL = 1,
89 MCC_RPT_SWICH_CHANNEL_NOTIFY = 7,
90 MCC_RPT_UPDATE_NOA_START_TIME = 8,
102 struct mcc_iqk_backup {
109 /* mcc data for adapter */
110 struct mcc_adapter_priv {
111 u8 order; /* FW document, softap/AP must be 0 */
112 u8 role; /* MCC role(AP,STA,GO,GC) */
113 u8 mcc_duration; /* channel stay period, UNIT:1TU */
116 u8 mcc_tx_stop; /* check if tp stop or not */
117 u8 mcc_tp_limit; /* check if tp limit or not */
118 u32 mcc_target_tx_bytes_to_port; /* customer require */
119 u32 mcc_tx_bytes_to_port; /* already tx to tx fifo (write port) */
121 /* data from kernel to check if enqueue data or netif stop queue */
123 u64 mcc_tx_bytes_from_kernel;
124 u64 mcc_last_tx_bytes_from_kernel;
126 /* Backup IQK value for MCC */
127 struct mcc_iqk_backup mcc_iqk_arr[MAX_RF_PATH];
129 /* mgmt queue macid to avoid RA issue */
132 /* set macid bitmap to let fw know which macid should be tx pause */
133 /* all interface share total 16 macid */
134 u16 mcc_macid_bitmap;
136 /* use for NoA start time (unit: mircoseconds) */
139 u8 p2p_go_noa_ie[MAX_P2P_IE_LEN];
140 u32 p2p_go_noa_ie_len;
143 struct mcc_obj_priv {
144 u8 duration; /* channel stay period, UNIT:1TU */
146 u8 cur_mcc_success_cnt; /* used for check mcc switch channel success */
147 u8 prev_mcc_success_cnt; /* used for check mcc switch channel success */
148 u8 mcc_tolerance_time; /* used for detect mcc switch channel success */
149 u8 mcc_loc_rsvd_paga[MAX_MCC_NUM]; /* mcc rsvd page */
150 u8 mcc_status; /* mcc status stop or start .... */
152 u32 mcc_launch_time; /* mcc launch time, used for starting detect mcc switch channel success */
155 PADAPTER iface[MAX_MCC_NUM]; /* by order, use for mcc parameter cmd */
156 struct submit_ctx mcc_sctx;
160 void rtw_hal_mcc_restore_iqk_val(PADAPTER padapter);
162 /* check mcc status */
163 u8 rtw_hal_check_mcc_status(PADAPTER padapter, u8 mcc_status);
166 void rtw_hal_set_mcc_status(PADAPTER padapter, u8 mcc_status);
168 /* clear mcc status */
169 void rtw_hal_clear_mcc_status(PADAPTER padapter, u8 mcc_status);
171 /* dl mcc rsvd page */
172 u8 rtw_hal_dl_mcc_fw_rsvd_page(_adapter *adapter, u8 *pframe, u16 *index
173 , u8 tx_desc, u32 page_size, u8 *page_num, u32 *total_pkt_len, RSVDPAGE_LOC *rsvd_page_loc);
176 void rtw_hal_mcc_c2h_handler(PADAPTER padapter, u8 buflen, u8 *tmpBuf);
178 /* switch channel successfully or not */
179 void rtw_hal_mcc_sw_status_check(PADAPTER padapter);
181 /* change some scan flags under site survey */
182 u8 rtw_hal_mcc_change_scan_flag(PADAPTER padapter, u8 *ch, u8 *bw, u8 *offset);
184 /* record data kernel TX to driver to check MCC concurrent TX */
185 void rtw_hal_mcc_calc_tx_bytes_from_kernel(PADAPTER padapter, u32 len);
187 /* record data to port to let driver do flow ctrl */
188 void rtw_hal_mcc_calc_tx_bytes_to_port(PADAPTER padapter, u32 len);
190 /* check stop write port or not */
191 u8 rtw_hal_mcc_stop_tx_bytes_to_port(PADAPTER padapter);
193 u8 rtw_hal_set_mcc_setting_scan_start(PADAPTER padapter);
195 u8 rtw_hal_set_mcc_setting_scan_complete(PADAPTER padapter);
197 u8 rtw_hal_set_mcc_setting_start_bss_network(PADAPTER padapter, u8 chbw_grouped);
199 u8 rtw_hal_set_mcc_setting_disconnect(PADAPTER padapter);
201 u8 rtw_hal_set_mcc_setting_join_done_chk_ch(PADAPTER padapter);
203 u8 rtw_hal_set_mcc_setting_chk_start_clnt_join(PADAPTER padapter, u8 *ch, u8 *bw, u8 *offset, u8 chbw_allow);
205 void rtw_hal_dump_mcc_info(void *sel, struct dvobj_priv *dvobj);
207 void update_mcc_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib);
209 u8 rtw_hal_mcc_link_status_chk(_adapter *padapter, const char *msg);
211 void rtw_hal_mcc_issue_null_data(_adapter *padapter, u8 chbw_allow, u8 ps_mode);
213 u8 *rtw_hal_mcc_append_go_p2p_ie(PADAPTER padapter, u8 *pframe, u32 *len);
215 void rtw_hal_mcc_update_switch_channel_policy_table(PADAPTER padapter);
217 void rtw_hal_dump_mcc_policy_table(void *sel);
219 #endif /* _RTW_MCC_H_ */
220 #endif /* CONFIG_MCC_MODE */