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