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