1*4882a593Smuzhiyun /****************************************************************************** 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright(c) 2019 - 2020 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 *****************************************************************************/ 15*4882a593Smuzhiyun #ifndef __PHL_SOUND_H__ 16*4882a593Smuzhiyun #define __PHL_SOUND_H__ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #define MAX_SND_GRP_NUM 4 19*4882a593Smuzhiyun #define MAX_SND_HE_BFRP_NUM 2 20*4882a593Smuzhiyun #define MAX_SND_HE_BFRP_USER_NUM 4 21*4882a593Smuzhiyun #define MAX_SND_VHT_BFRP_NUM 3 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define SND_PROC_DEFAULT_PERIOD 200 /* ms */ 24*4882a593Smuzhiyun #define SND_PROC_DEFAULT_TIMEOUT 10 /* ms */ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /* MAX_NUM_STA_SND_GRP :phl sounding design limit = 4, hw/fw support maximum 8 STA in a sounding frame exchange*/ 27*4882a593Smuzhiyun #define MAX_NUM_STA_SND_GRP 4 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun enum snd_type { 30*4882a593Smuzhiyun PHL_SND_TYPE_INVALID, 31*4882a593Smuzhiyun PHL_SND_TYPE_VHT_HW, 32*4882a593Smuzhiyun PHL_SND_TYPE_VHT_SW, 33*4882a593Smuzhiyun PHL_SND_TYPE_HE_HW, 34*4882a593Smuzhiyun PHL_SND_TYPE_HE_SW 35*4882a593Smuzhiyun }; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun enum snd_fb_type { 38*4882a593Smuzhiyun PHL_SND_FB_TYPE_SU, 39*4882a593Smuzhiyun PHL_SND_FB_TYPE_MU, 40*4882a593Smuzhiyun PHL_SND_FB_TYPE_CQI 41*4882a593Smuzhiyun }; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun enum snd_status { 44*4882a593Smuzhiyun PHL_SND_STS_PENDING, 45*4882a593Smuzhiyun PHL_SND_STS_ON_PROC, 46*4882a593Smuzhiyun PHL_SND_STS_SUCCESS, 47*4882a593Smuzhiyun PHL_SND_STS_FAILURE 48*4882a593Smuzhiyun }; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun enum snd_grp_tier { 51*4882a593Smuzhiyun PHL_SND_GRP_TIER_0, /* TIER_0 Group will free sounding resource in state SND_PROC_TERMINATE or group removed*/ 52*4882a593Smuzhiyun PHL_SND_GRP_TIER_1 /* TIER_1 Group will free sounding resource in next SND_PROC_IDLE*/ 53*4882a593Smuzhiyun }; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun enum snd_test_flag { 56*4882a593Smuzhiyun PHL_SND_TEST_F_NONE = 0, /* default value */ 57*4882a593Smuzhiyun PHL_SND_TEST_F_ONE_TIME = BIT(0), /* Test mode : only sounding one time */ 58*4882a593Smuzhiyun PHL_SND_TEST_F_FIX_STA = BIT(1), /* forced SND STAs (skip grouping and check TP) */ 59*4882a593Smuzhiyun PHL_SND_TEST_F_GRP_SND_PARA = BIT(2), /* Fixed SND STA's Feedback Type or BW from snd->fix_param */ 60*4882a593Smuzhiyun PHL_SND_TEST_F_GRP_EN_BF_FIX = BIT(3), /* Enable grp->en_fix_mode in grouping function */ 61*4882a593Smuzhiyun PHL_SND_TEST_F_PASS_STS_CHK = BIT(4) /* by pass sounding status check when post config */ 62*4882a593Smuzhiyun }; 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun struct npda_dialog_token { 65*4882a593Smuzhiyun u8 reserved:1; 66*4882a593Smuzhiyun u8 he:1; 67*4882a593Smuzhiyun u8 token:6; 68*4882a593Smuzhiyun }; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun struct vht_ndpa_sta_info { 71*4882a593Smuzhiyun u16 aid12:12; 72*4882a593Smuzhiyun #define VHT_NDPA_FB_TYPE_SU 0 73*4882a593Smuzhiyun #define VHT_NDPA_FB_TYPE_MU 1 74*4882a593Smuzhiyun u16 feedback_type:1; 75*4882a593Smuzhiyun u16 nc:3; 76*4882a593Smuzhiyun }; 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun struct he_ndpa_sta_info { 79*4882a593Smuzhiyun u32 aid:11; 80*4882a593Smuzhiyun u32 bw:14; 81*4882a593Smuzhiyun u32 fb_ng:2; 82*4882a593Smuzhiyun u32 disambiguation:1; 83*4882a593Smuzhiyun u32 cb:1; 84*4882a593Smuzhiyun u32 nc:3; 85*4882a593Smuzhiyun }; 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun struct phl_snd_sta { 88*4882a593Smuzhiyun u8 valid; 89*4882a593Smuzhiyun u16 macid; 90*4882a593Smuzhiyun enum channel_width bw; /* Sounding BW */ 91*4882a593Smuzhiyun enum snd_fb_type snd_fb_t; /* Sounding feedback type : SU/MU/CQI */ 92*4882a593Smuzhiyun u32 npda_sta_info; /* VHT/HE NDPA STA info*/ 93*4882a593Smuzhiyun enum snd_status snd_sts; 94*4882a593Smuzhiyun /* Query resource in SND PROC */ 95*4882a593Smuzhiyun void *bf_entry;/* HAL BF Entry for sounding */ 96*4882a593Smuzhiyun }; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun struct phl_snd_grp { 100*4882a593Smuzhiyun u8 gidx; 101*4882a593Smuzhiyun enum snd_type snd_type; 102*4882a593Smuzhiyun enum snd_grp_tier grp_tier; 103*4882a593Smuzhiyun u8 wrole_idx; 104*4882a593Smuzhiyun u8 band; 105*4882a593Smuzhiyun u8 num_sta; 106*4882a593Smuzhiyun struct phl_snd_sta sta[MAX_NUM_STA_SND_GRP]; 107*4882a593Smuzhiyun enum snd_status snd_sts; 108*4882a593Smuzhiyun u8 en_fix_mode; /* post confg forced mode setting */ 109*4882a593Smuzhiyun /** 110*4882a593Smuzhiyun * en_swap_mode : Only TIER_0 MU group support. When swap mode is enable, 111*4882a593Smuzhiyun * each MU Entry will use two CSI MU buffer. Therefore, it cannan skip Disable 112*4882a593Smuzhiyun * MU in Preconfig when next round sounding 113*4882a593Smuzhiyun **/ 114*4882a593Smuzhiyun u8 en_swap_mode; 115*4882a593Smuzhiyun u8 skip_post_cfg;/* 1: SKIP ALL; BIT1:Skip Group, BIT2:Skip GID, BIT3:Skip STA */ 116*4882a593Smuzhiyun }; 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun /* for whole phl snd fsm module fixed mode, only worked if snd_param->test_flag != 0 */ 120*4882a593Smuzhiyun struct phl_snd_fix_param { 121*4882a593Smuzhiyun u8 en_fix_gidx; 122*4882a593Smuzhiyun u8 en_fix_fb_type; 123*4882a593Smuzhiyun u8 en_fix_sta; 124*4882a593Smuzhiyun u8 en_fix_snd_bw; 125*4882a593Smuzhiyun u8 grp_idx; 126*4882a593Smuzhiyun enum snd_fb_type snd_fb_type; 127*4882a593Smuzhiyun u16 sta_macid[MAX_NUM_STA_SND_GRP]; 128*4882a593Smuzhiyun enum channel_width bw[MAX_NUM_STA_SND_GRP]; 129*4882a593Smuzhiyun u8 f_ru_tbl_20[MAX_SND_HE_BFRP_USER_NUM][MAX_SND_HE_BFRP_USER_NUM]; 130*4882a593Smuzhiyun u8 f_ru_tbl_80[MAX_SND_HE_BFRP_USER_NUM][MAX_SND_HE_BFRP_USER_NUM]; 131*4882a593Smuzhiyun }; 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun struct phl_sound_param { 134*4882a593Smuzhiyun void *m_wrole; 135*4882a593Smuzhiyun struct phl_snd_grp snd_grp[MAX_SND_GRP_NUM]; 136*4882a593Smuzhiyun u32 grp_used_map; 137*4882a593Smuzhiyun u8 cur_proc_grp_idx; 138*4882a593Smuzhiyun u8 pre_proc_grp_idx; 139*4882a593Smuzhiyun u8 snd_func_grp_num; 140*4882a593Smuzhiyun u8 snd_dialog_token; 141*4882a593Smuzhiyun u8 snd_proc_timeout_ms; 142*4882a593Smuzhiyun u32 proc_start_time; 143*4882a593Smuzhiyun u8 snd_proc_period; 144*4882a593Smuzhiyun bool bypass_snd_sts_chk; 145*4882a593Smuzhiyun u32 test_flag; 146*4882a593Smuzhiyun struct phl_snd_fix_param fix_param; 147*4882a593Smuzhiyun u8 snd_fail_counter; 148*4882a593Smuzhiyun }; 149*4882a593Smuzhiyun struct phl_snd_ops 150*4882a593Smuzhiyun { 151*4882a593Smuzhiyun enum rtw_phl_status (*snd_send_ndpa)(void *drv_priv, 152*4882a593Smuzhiyun struct rtw_wifi_role_t *wrole, 153*4882a593Smuzhiyun u8 *snd_dialog_tkn, 154*4882a593Smuzhiyun u32 *ndpa_sta, 155*4882a593Smuzhiyun enum channel_width snd_bw); 156*4882a593Smuzhiyun }; 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun struct phl_sound_obj { 159*4882a593Smuzhiyun #ifdef CONFIG_FSM 160*4882a593Smuzhiyun struct fsm_main *fsm; 161*4882a593Smuzhiyun struct fsm_obj *fsm_obj; 162*4882a593Smuzhiyun #endif 163*4882a593Smuzhiyun struct phl_sound_param snd_param; 164*4882a593Smuzhiyun struct phl_snd_ops ops; 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun struct phl_info_t *phl_info; 167*4882a593Smuzhiyun void *iface; 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun u8 snd_in_progress; 170*4882a593Smuzhiyun u8 is_terminated; 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun _os_lock snd_lock; 173*4882a593Smuzhiyun /* snd test */ 174*4882a593Smuzhiyun u8 wrole_idx; 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun /* snd cmd disp related */ 177*4882a593Smuzhiyun u8 msg_busy; 178*4882a593Smuzhiyun _os_lock cmd_lock; 179*4882a593Smuzhiyun }; 180*4882a593Smuzhiyun #ifdef CONFIG_FSM 181*4882a593Smuzhiyun enum rtw_phl_status phl_snd_new_obj( 182*4882a593Smuzhiyun struct fsm_main *fsm, 183*4882a593Smuzhiyun struct phl_info_t *phl_info); 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun #endif 186*4882a593Smuzhiyun /* phl sounding intern api*/ 187*4882a593Smuzhiyun enum rtw_phl_status phl_snd_func_snd_init(struct phl_info_t *phl_info); 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun enum rtw_phl_status phl_snd_func_pre_config(struct phl_info_t *phl_info); 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun /* phl sounding extern api*/ 192*4882a593Smuzhiyun enum rtw_phl_status 193*4882a593Smuzhiyun rtw_phl_sound_start(void *phl, u8 wrole_idx, u8 st_dlg_tkn, u8 period, u8 test_flag); 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun enum rtw_phl_status 196*4882a593Smuzhiyun rtw_phl_sound_abort(void *phl); 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun enum rtw_phl_status 199*4882a593Smuzhiyun rtw_phl_sound_down_ev(void *phl); 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun void rtw_phl_snd_fix_tx_he_mu(struct phl_info_t *phl_info, u8 gid, bool en); 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun /* snd func grp */ 204*4882a593Smuzhiyun struct phl_snd_grp * 205*4882a593Smuzhiyun phl_snd_get_grp_byidx(struct phl_info_t *phl_info, u8 gidx); 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun void 208*4882a593Smuzhiyun phl_snd_func_remove_grp_all(struct phl_info_t *phl_info); 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun enum rtw_phl_status 211*4882a593Smuzhiyun phl_snd_func_grouping(struct phl_info_t *phl_info, u8 wroleidx); 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun /* snd proc resource */ 214*4882a593Smuzhiyun enum rtw_phl_status 215*4882a593Smuzhiyun phl_snd_proc_get_res( 216*4882a593Smuzhiyun struct phl_info_t *phl_info, struct phl_snd_grp *grp, u8 *nsta); 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun enum rtw_phl_status 219*4882a593Smuzhiyun phl_snd_proc_release_res(struct phl_info_t *phl_info, struct phl_snd_grp *grp); 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun /* snd proc precfg */ 222*4882a593Smuzhiyun enum rtw_phl_status 223*4882a593Smuzhiyun phl_snd_proc_precfg(struct phl_info_t *phl_info, struct phl_snd_grp *grp); 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun /* snd proc busy cmd to fw */ 227*4882a593Smuzhiyun enum rtw_phl_status 228*4882a593Smuzhiyun phl_snd_proc_start_sounding_fw(struct phl_info_t *phl_info, 229*4882a593Smuzhiyun struct phl_snd_grp *grp); 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun /* snd proc postcfg */ 232*4882a593Smuzhiyun enum rtw_phl_status 233*4882a593Smuzhiyun phl_snd_proc_postcfg(struct phl_info_t *phl_info, struct phl_snd_grp *grp); 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun enum rtw_phl_status 236*4882a593Smuzhiyun phl_snd_proc_chk_condition(struct phl_info_t *phl_info, struct phl_snd_grp *grp); 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun void 239*4882a593Smuzhiyun phl_snd_proc_chk_prev_grp(struct phl_info_t *phl_info, 240*4882a593Smuzhiyun struct phl_snd_grp *grp); 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun enum rtw_phl_status 243*4882a593Smuzhiyun phl_snd_polling_pri_sta_sts(struct phl_info_t *phl_info, 244*4882a593Smuzhiyun struct phl_snd_grp *grp); 245*4882a593Smuzhiyun void 246*4882a593Smuzhiyun phl_snd_mac_ctrl(struct phl_info_t *phl_info, 247*4882a593Smuzhiyun struct rtw_wifi_role_t *wrole, u8 ctrl); 248*4882a593Smuzhiyun #endif 249