1*4882a593Smuzhiyun /****************************************************************************** 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright(c) 2007 - 2017 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 * The full GNU General Public License is included in this distribution in the 15*4882a593Smuzhiyun * file called LICENSE. 16*4882a593Smuzhiyun * 17*4882a593Smuzhiyun * Contact Information: 18*4882a593Smuzhiyun * wlanfae <wlanfae@realtek.com> 19*4882a593Smuzhiyun * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, 20*4882a593Smuzhiyun * Hsinchu 300, Taiwan. 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun * Larry Finger <Larry.Finger@lwfinger.net> 23*4882a593Smuzhiyun * 24*4882a593Smuzhiyun *****************************************************************************/ 25*4882a593Smuzhiyun #ifndef __PHYDMSOML_H__ 26*4882a593Smuzhiyun #define __PHYDMSOML_H__ 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun /*@#define ADAPTIVE_SOML_VERSION "1.0" Byte counter version*/ 29*4882a593Smuzhiyun #define ADAPTIVE_SOML_VERSION "2.0" /*@add avg. phy rate decision 20180126*/ 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #define PHYDM_ADAPTIVE_SOML_IC (ODM_RTL8822B | ODM_RTL8197F | ODM_RTL8192F) 32*4882a593Smuzhiyun /*@jj add 20170822*/ 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #define INIT_SOML_TIMMER 0 35*4882a593Smuzhiyun #define CANCEL_SOML_TIMMER 1 36*4882a593Smuzhiyun #define RELEASE_SOML_TIMMER 2 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun #define SOML_RSSI_TH_HIGH 25 39*4882a593Smuzhiyun #define SOML_RSSI_TH_LOW 20 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun #define HT_RATE_IDX 16 42*4882a593Smuzhiyun #define VHT_RATE_IDX 20 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #define HT_ORDER_TYPE 3 45*4882a593Smuzhiyun #define VHT_ORDER_TYPE 4 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun #define CRC_FAIL 1 48*4882a593Smuzhiyun #define CRC_OK 0 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun #if 0 51*4882a593Smuzhiyun #define CFO_QPSK_TH 20 52*4882a593Smuzhiyun #define CFO_QAM16_TH 20 53*4882a593Smuzhiyun #define CFO_QAM64_TH 20 54*4882a593Smuzhiyun #define CFO_QAM256_TH 20 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun #define BPSK_QPSK_DIST 20 57*4882a593Smuzhiyun #define QAM16_DIST 30 58*4882a593Smuzhiyun #define QAM64_DIST 30 59*4882a593Smuzhiyun #define QAM256_DIST 20 60*4882a593Smuzhiyun #endif 61*4882a593Smuzhiyun #define HT_TYPE 1 62*4882a593Smuzhiyun #define VHT_TYPE 2 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun #define SOML_ON 1 65*4882a593Smuzhiyun #define SOML_OFF 0 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #ifdef CONFIG_ADAPTIVE_SOML 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun struct adaptive_soml { 70*4882a593Smuzhiyun u32 rvrt_val; /*all rvrt_val for pause API must set to u32*/ 71*4882a593Smuzhiyun boolean is_soml_method_enable; 72*4882a593Smuzhiyun boolean get_stats; 73*4882a593Smuzhiyun u8 soml_on_off; 74*4882a593Smuzhiyun u8 soml_state_cnt; 75*4882a593Smuzhiyun u8 soml_delay_time; 76*4882a593Smuzhiyun u8 soml_intvl; 77*4882a593Smuzhiyun u8 soml_train_num; 78*4882a593Smuzhiyun u8 soml_counter; 79*4882a593Smuzhiyun u8 soml_period; 80*4882a593Smuzhiyun u8 soml_select; 81*4882a593Smuzhiyun u8 soml_last_state; 82*4882a593Smuzhiyun u8 cfo_qpsk_th; 83*4882a593Smuzhiyun u8 cfo_qam16_th; 84*4882a593Smuzhiyun u8 cfo_qam64_th; 85*4882a593Smuzhiyun u8 cfo_qam256_th; 86*4882a593Smuzhiyun u8 bpsk_qpsk_dist_th; 87*4882a593Smuzhiyun u8 qam16_dist_th; 88*4882a593Smuzhiyun u8 qam64_dist_th; 89*4882a593Smuzhiyun u8 qam256_dist_th; 90*4882a593Smuzhiyun u8 cfo_cnt; 91*4882a593Smuzhiyun s32 cfo_diff_a; 92*4882a593Smuzhiyun s32 cfo_diff_b; 93*4882a593Smuzhiyun s32 cfo_diff_sum_a; 94*4882a593Smuzhiyun s32 cfo_diff_sum_b; 95*4882a593Smuzhiyun s32 cfo_diff_avg_a; 96*4882a593Smuzhiyun s32 cfo_diff_avg_b; 97*4882a593Smuzhiyun u16 ht_cnt[HT_RATE_IDX]; 98*4882a593Smuzhiyun u16 pre_ht_cnt[HT_RATE_IDX]; 99*4882a593Smuzhiyun u16 ht_cnt_on[HT_RATE_IDX]; 100*4882a593Smuzhiyun u16 ht_cnt_off[HT_RATE_IDX]; 101*4882a593Smuzhiyun u16 ht_crc_ok_cnt_on[HT_RATE_IDX]; 102*4882a593Smuzhiyun u16 ht_crc_fail_cnt_on[HT_RATE_IDX]; 103*4882a593Smuzhiyun u16 ht_crc_ok_cnt_off[HT_RATE_IDX]; 104*4882a593Smuzhiyun u16 ht_crc_fail_cnt_off[HT_RATE_IDX]; 105*4882a593Smuzhiyun u16 vht_crc_ok_cnt_on[VHT_RATE_IDX]; 106*4882a593Smuzhiyun u16 vht_crc_fail_cnt_on[VHT_RATE_IDX]; 107*4882a593Smuzhiyun u16 vht_crc_ok_cnt_off[VHT_RATE_IDX]; 108*4882a593Smuzhiyun u16 vht_crc_fail_cnt_off[VHT_RATE_IDX]; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun u16 vht_cnt[VHT_RATE_IDX]; 111*4882a593Smuzhiyun u16 pre_vht_cnt[VHT_RATE_IDX]; 112*4882a593Smuzhiyun u16 vht_cnt_on[VHT_RATE_IDX]; 113*4882a593Smuzhiyun u16 vht_cnt_off[VHT_RATE_IDX]; 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun u16 num_ht_qam[HT_ORDER_TYPE]; 116*4882a593Smuzhiyun u16 ht_byte[HT_RATE_IDX]; 117*4882a593Smuzhiyun u16 pre_ht_byte[HT_RATE_IDX]; 118*4882a593Smuzhiyun u16 ht_byte_on[HT_RATE_IDX]; 119*4882a593Smuzhiyun u16 ht_byte_off[HT_RATE_IDX]; 120*4882a593Smuzhiyun u16 num_vht_qam[VHT_ORDER_TYPE]; 121*4882a593Smuzhiyun u16 vht_byte[VHT_RATE_IDX]; 122*4882a593Smuzhiyun u16 pre_vht_byte[VHT_RATE_IDX]; 123*4882a593Smuzhiyun u16 vht_byte_on[VHT_RATE_IDX]; 124*4882a593Smuzhiyun u16 vht_byte_off[VHT_RATE_IDX]; 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) 127*4882a593Smuzhiyun #if USE_WORKITEM 128*4882a593Smuzhiyun RT_WORK_ITEM phydm_adaptive_soml_workitem; 129*4882a593Smuzhiyun #endif 130*4882a593Smuzhiyun #endif 131*4882a593Smuzhiyun struct phydm_timer_list phydm_adaptive_soml_timer; 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun }; 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun enum qam_order { 136*4882a593Smuzhiyun BPSK_QPSK = 0, 137*4882a593Smuzhiyun QAM16 = 1, 138*4882a593Smuzhiyun QAM64 = 2, 139*4882a593Smuzhiyun QAM256 = 3 140*4882a593Smuzhiyun }; 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun void phydm_dynamicsoftmletting(void *dm_void); 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun void phydm_soml_on_off(void *dm_void, u8 swch); 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) 147*4882a593Smuzhiyun void phydm_adaptive_soml_callback(struct phydm_timer_list *timer); 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun void phydm_adaptive_soml_workitem_callback(void *context); 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun #elif (DM_ODM_SUPPORT_TYPE == ODM_CE) 152*4882a593Smuzhiyun void phydm_adaptive_soml_callback(void *dm_void); 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun void phydm_adaptive_soml_workitem_callback(void *context); 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun #else 157*4882a593Smuzhiyun void phydm_adaptive_soml_callback(void *dm_void); 158*4882a593Smuzhiyun #endif 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun void phydm_rx_rate_for_soml(void *dm_void, void *pkt_info_void); 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun void phydm_rx_qam_for_soml(void *dm_void, void *pkt_info_void); 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun void phydm_soml_reset_rx_rate(void *dm_void); 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun void phydm_soml_reset_qam(void *dm_void); 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun void phydm_soml_cfo_process(void *dm_void, s32 *diff_a, s32 *diff_b); 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun void phydm_soml_debug(void *dm_void, char input[][16], u32 *_used, 171*4882a593Smuzhiyun char *output, u32 *_out_len); 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun void phydm_soml_statistics(void *dm_void, u8 on_off_state); 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun void phydm_adsl(void *dm_void); 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun void phydm_adaptive_soml_reset(void *dm_void); 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun void phydm_set_adsl_val(void *dm_void, u32 *val_buf, u8 val_len); 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun void phydm_soml_crc_acq(void *dm_void, u8 rate_id, boolean crc32, u32 length); 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun void phydm_soml_bytes_acq(void *dm_void, u8 rate_id, u32 length); 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun void phydm_adaptive_soml_timers(void *dm_void, u8 state); 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun void phydm_adaptive_soml_init(void *dm_void); 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun void phydm_adaptive_soml(void *dm_void); 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun void phydm_enable_adaptive_soml(void *dm_void); 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun void phydm_stop_adaptive_soml(void *dm_void); 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun void phydm_adaptive_soml_para_set(void *dm_void, u8 train_num, u8 intvl, 196*4882a593Smuzhiyun u8 period, u8 delay_time); 197*4882a593Smuzhiyun #endif 198*4882a593Smuzhiyun void phydm_init_soft_ml_setting(void *dm_void); 199*4882a593Smuzhiyun #endif /*@#ifndef __PHYDMSOML_H__*/ 200