1*4882a593Smuzhiyun /****************************************************************************** 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright(c) 2019 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_TWT_H_ 16*4882a593Smuzhiyun #define _PHL_TWT_H_ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #ifdef CONFIG_PHL_TWT 19*4882a593Smuzhiyun #define MIN_TWT_ELE_LEN 15 20*4882a593Smuzhiyun #define MAX_NUM_HW_TWT_CONFIG 4 21*4882a593Smuzhiyun #define CONTROL_LENGTH 1 22*4882a593Smuzhiyun #define REQUEST_TYPE_LENGTH 2 23*4882a593Smuzhiyun #define NOMINAL_MINIMUM_TWT_WAKE_DURATION_LENGTH 1 24*4882a593Smuzhiyun #define TARGET_WAKE_TIME_LENGTH 8 25*4882a593Smuzhiyun #define NOMINAL_MIN_TWT_WAKE_DURATION_LENGTH 1 26*4882a593Smuzhiyun #define TWT_WAKE_INTERVAL_MANTISSA_LENGTH 2 27*4882a593Smuzhiyun #define TWT_CHANNEL_LENGTH 1 28*4882a593Smuzhiyun #define TWT_FLOW_FIELD_LENGTH 1 29*4882a593Smuzhiyun #define TOKEN_OFFSET 2 30*4882a593Smuzhiyun #define TOKEN_LENGTH 1 31*4882a593Smuzhiyun #define ELEM_ID_LEN 1 /* Length of element id*/ 32*4882a593Smuzhiyun #define ELEM_LEN_LEN 1 /* Length of element Length*/ 33*4882a593Smuzhiyun #define C2H_FUN_WAIT_ANNC 0x0 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #define get_twt_info(_phl) (struct phl_twt_info *)(_phl->phl_twt_info) 36*4882a593Smuzhiyun #define set_config_state(_state, set_state) (_state = set_state) 37*4882a593Smuzhiyun #define twt_init(_phl) (NULL != (get_twt_info(_phl))) 38*4882a593Smuzhiyun #define twt_sup(_phl) (((struct phl_info_t *)_phl)->phl_com->dev_cap.twt_sup) 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun enum phl_operate_config_type { 41*4882a593Smuzhiyun PHL_OP_TYPE_NONE = 0, 42*4882a593Smuzhiyun PHL_GET_NEW_CONFIG, 43*4882a593Smuzhiyun PHL_FREE_CONFIG, 44*4882a593Smuzhiyun PHL_GET_CONFIG_BY_ID, 45*4882a593Smuzhiyun PHL_GET_CONFIG_BY_ROLE, 46*4882a593Smuzhiyun PHL_GET_CONFIG_BY_PARA, 47*4882a593Smuzhiyun PHL_GET_NEXT_CONFIG, 48*4882a593Smuzhiyun PHL_GET_HEAD_CONFIG 49*4882a593Smuzhiyun }; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun enum phl_twt_action { 52*4882a593Smuzhiyun PHL_TWT_ACTION_NONE = 0, 53*4882a593Smuzhiyun PHL_TWT_ACTION_FREE, 54*4882a593Smuzhiyun PHL_TWT_ACTION_ALLOC, 55*4882a593Smuzhiyun PHL_TWT_ACTION_ENABLE, 56*4882a593Smuzhiyun PHL_TWT_ACTION_DISABLE, 57*4882a593Smuzhiyun PHL_TWT_ACTION_UP_ERROR 58*4882a593Smuzhiyun }; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun enum phl_wait_annc_type { 61*4882a593Smuzhiyun PHL_WAIT_ANNC_DISABLE = 0, 62*4882a593Smuzhiyun PHL_WAIT_ANNC_ENABLE = 1 63*4882a593Smuzhiyun }; 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun enum twt_config_state { 66*4882a593Smuzhiyun twt_config_state_free = 0, 67*4882a593Smuzhiyun twt_config_state_idle, 68*4882a593Smuzhiyun twt_config_state_enable, 69*4882a593Smuzhiyun twt_config_state_error, 70*4882a593Smuzhiyun twt_config_state_unknown 71*4882a593Smuzhiyun }; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun struct phl_twt_config{ 74*4882a593Smuzhiyun u8 idx; 75*4882a593Smuzhiyun enum twt_config_state state; 76*4882a593Smuzhiyun struct rtw_wifi_role_t *role; 77*4882a593Smuzhiyun struct rtw_phl_twt_info twt_info; 78*4882a593Smuzhiyun struct phl_queue twt_sta_queue; /*struct rtw_twt_sta_info*/ 79*4882a593Smuzhiyun }; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun struct phl_twt_cfg_info { 82*4882a593Smuzhiyun u8 twt_cfg_num; 83*4882a593Smuzhiyun void *twt_cfg_ring; /*struct phl_twt_config*/ 84*4882a593Smuzhiyun }; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun struct phl_twt_info { 87*4882a593Smuzhiyun struct phl_twt_cfg_info twt_cfg_info; 88*4882a593Smuzhiyun struct phl_queue twt_annc_queue;/*struct _twt_announce_info*/ 89*4882a593Smuzhiyun }; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun struct _twt_announce_info{ 92*4882a593Smuzhiyun _os_list list; 93*4882a593Smuzhiyun u8 map_offset; 94*4882a593Smuzhiyun u32 wait_macid_map; 95*4882a593Smuzhiyun }; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun struct _twt_compare { 98*4882a593Smuzhiyun struct rtw_phl_twt_setup_info twt_setup; 99*4882a593Smuzhiyun struct rtw_wifi_role_t *role; 100*4882a593Smuzhiyun }; 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun struct _twt_teardown { 103*4882a593Smuzhiyun struct rtw_phl_stainfo_t *phl_sta; 104*4882a593Smuzhiyun enum rtw_phl_nego_type nego_type; 105*4882a593Smuzhiyun u8 id; 106*4882a593Smuzhiyun }; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun /* TWT element */ 109*4882a593Smuzhiyun /*Control*/ 110*4882a593Smuzhiyun #define SET_TWT_CONTROL_NDP_PAGING_INDICATOR(_ele_start, _val) \ 111*4882a593Smuzhiyun SET_BITS_TO_LE_1BYTE(_ele_start, 0, 1, _val) 112*4882a593Smuzhiyun #define SET_TWT_CONTROL_RESPONDER_PM_MODE(_ele_start, _val) \ 113*4882a593Smuzhiyun SET_BITS_TO_LE_1BYTE(_ele_start, 1, 1, _val) 114*4882a593Smuzhiyun #define SET_TWT_CONTROL_NEGOTIATION_TYPE(_ele_start, _val) \ 115*4882a593Smuzhiyun SET_BITS_TO_LE_1BYTE(_ele_start, 2, 2, _val) 116*4882a593Smuzhiyun #define SET_TWT_CONTROL_TWT_INFORMATION_FRAME_DISABLE(_ele_start, _val) \ 117*4882a593Smuzhiyun SET_BITS_TO_LE_1BYTE(_ele_start, 4, 1, _val) 118*4882a593Smuzhiyun #define SET_TWT_CONTROL_WAKE_DURATION_UNIT(_ele_start, _val) \ 119*4882a593Smuzhiyun SET_BITS_TO_LE_1BYTE(_ele_start, 5, 1, _val) 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun /*Individual TWT Parameter Set field*/ 122*4882a593Smuzhiyun /*Request Type*/ 123*4882a593Smuzhiyun #define SET_TWT_REQ_TYPE_TWT_REQUEST(_ele_start, _val) \ 124*4882a593Smuzhiyun SET_BITS_TO_LE_1BYTE(_ele_start, 0, 1, _val) 125*4882a593Smuzhiyun #define SET_TWT_REQ_TYPE_TWT_SETUP_COMMAND(_ele_start, _val) \ 126*4882a593Smuzhiyun SET_BITS_TO_LE_1BYTE(_ele_start, 1, 3, _val) 127*4882a593Smuzhiyun #define SET_TWT_REQ_TYPE_TRIGGER(_ele_start, _val) \ 128*4882a593Smuzhiyun SET_BITS_TO_LE_1BYTE(_ele_start, 4, 1, _val) 129*4882a593Smuzhiyun #define SET_TWT_REQ_TYPE_IMPLICIT(_ele_start, _val) \ 130*4882a593Smuzhiyun SET_BITS_TO_LE_1BYTE(_ele_start, 5, 1, _val) 131*4882a593Smuzhiyun #define SET_TWT_REQ_TYPE_FLOW_TYPE(_ele_start, _val) \ 132*4882a593Smuzhiyun SET_BITS_TO_LE_1BYTE(_ele_start, 6, 1, _val) 133*4882a593Smuzhiyun #define SET_TWT_REQ_TYPE_TWT_FLOW_IDENTIFER(_ele_start, _val) \ 134*4882a593Smuzhiyun SET_BITS_TO_LE_2BYTE(_ele_start, 7, 3, _val) 135*4882a593Smuzhiyun #define SET_TWT_REQ_TYPE_TWT_WAKE_INTERVAL_EXPONENT(_ele_start, _val) \ 136*4882a593Smuzhiyun SET_BITS_TO_LE_2BYTE(_ele_start, 10, 5, _val) 137*4882a593Smuzhiyun #define SET_TWT_REQ_TYPE_TWT_PROTECTION(_ele_start, _val) \ 138*4882a593Smuzhiyun SET_BITS_TO_LE_2BYTE(_ele_start, 15, 1, _val) 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun #define SET_TWT_TARGET_WAKE_TIME_L(_ele_start, _val) \ 141*4882a593Smuzhiyun SET_BITS_TO_LE_4BYTE((_ele_start) + 2, 0, 32, _val) 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun #define SET_TWT_TARGET_WAKE_TIME_H(_ele_start, _val) \ 144*4882a593Smuzhiyun SET_BITS_TO_LE_4BYTE((_ele_start) + 6, 0, 32, _val) 145*4882a593Smuzhiyun /*twt group assignment*/ 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun #define SET_TWT_NOMINAL_MINIMUM_TWT_WAKE_DURATION(_ele_start, _offset, _val) \ 149*4882a593Smuzhiyun SET_BITS_TO_LE_1BYTE((_ele_start) + _offset, 0, 8, _val) 150*4882a593Smuzhiyun #define SET_TWT_TWT_WAKE_INTERVAL_MANTISSA(_ele_start, _offset, _val) \ 151*4882a593Smuzhiyun SET_BITS_TO_LE_2BYTE((_ele_start) + _offset, 0, 16, _val) 152*4882a593Smuzhiyun #define SET_TWT_TWT_CHANNEL(_ele_start, _offset, _val) \ 153*4882a593Smuzhiyun SET_BITS_TO_LE_1BYTE((_ele_start) + _offset, 0, 8, _val) 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun /*Broadcast TWT Parameter Set field*/ 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun /*TWT FLOW field*/ 160*4882a593Smuzhiyun #define SET_TWT_FLOW_ID(_ele_start, _val) \ 161*4882a593Smuzhiyun SET_BITS_TO_LE_1BYTE(_ele_start, 0, 3, _val) 162*4882a593Smuzhiyun #define SET_NEGOTIATION_TYPE(_ele_start, _val) \ 163*4882a593Smuzhiyun SET_BITS_TO_LE_1BYTE(_ele_start, 5, 2, _val) 164*4882a593Smuzhiyun #define SET_TEARDOWN_ALL_TWT(_ele_start, _val) \ 165*4882a593Smuzhiyun SET_BITS_TO_LE_1BYTE(_ele_start, 7, 1, _val) 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun #define SET_BROADCAST_TWT_ID(_ele_start, _val) \ 168*4882a593Smuzhiyun SET_BITS_TO_LE_1BYTE(_ele_start, 0, 5, _val) 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun /*Control*/ 171*4882a593Smuzhiyun /*Bit0*/ 172*4882a593Smuzhiyun #define GET_TWT_CONTROL_NDP_PAGING_INDICATOR(_buf) \ 173*4882a593Smuzhiyun LE_BITS_TO_1BYTE(_buf, 0, 1) 174*4882a593Smuzhiyun /*Bit1*/ 175*4882a593Smuzhiyun #define GET_TWT_CONTROL_RESPONDER_PM_MODE(_buf) \ 176*4882a593Smuzhiyun LE_BITS_TO_1BYTE(_buf, 1, 1) 177*4882a593Smuzhiyun /*Bit2-3*/ 178*4882a593Smuzhiyun #define GET_TWT_CONTROL_NEGOTIATION_TYPE(_buf) \ 179*4882a593Smuzhiyun LE_BITS_TO_1BYTE(_buf, 2, 2) 180*4882a593Smuzhiyun /*Bit4*/ 181*4882a593Smuzhiyun #define GET_TWT_CONTROL_TWT_INFORMATION_FRAME_DISABLE(_buf) \ 182*4882a593Smuzhiyun LE_BITS_TO_1BYTE(_buf, 4, 1) 183*4882a593Smuzhiyun /*Bit5*/ 184*4882a593Smuzhiyun #define GET_TWT_CONTROL_WAKE_DURATION_UNIT(_buf) \ 185*4882a593Smuzhiyun LE_BITS_TO_1BYTE(_buf, 5, 1) 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun /*Request Type*/ 188*4882a593Smuzhiyun /*Bit0*/ 189*4882a593Smuzhiyun #define GET_TWT_REQ_TYPE_TWT_REQUEST(_buf) \ 190*4882a593Smuzhiyun LE_BITS_TO_2BYTE(_buf, 0, 1) 191*4882a593Smuzhiyun /*Bit1-3*/ 192*4882a593Smuzhiyun #define GET_TWT_REQ_TYPE_TWT_SETUP_COMMAND(_buf) \ 193*4882a593Smuzhiyun LE_BITS_TO_2BYTE(_buf, 1, 3) 194*4882a593Smuzhiyun /*Bit4*/ 195*4882a593Smuzhiyun #define GET_TWT_REQ_TYPE_TRIGGER(_buf) \ 196*4882a593Smuzhiyun LE_BITS_TO_2BYTE(_buf, 4, 1) 197*4882a593Smuzhiyun /*Bit5*/ 198*4882a593Smuzhiyun #define GET_TWT_REQ_TYPE_IMPLICIT(_buf) \ 199*4882a593Smuzhiyun LE_BITS_TO_2BYTE(_buf, 5, 1) 200*4882a593Smuzhiyun /*Bit6*/ 201*4882a593Smuzhiyun #define GET_TWT_REQ_TYPE_FLOW_TYPE(_buf) \ 202*4882a593Smuzhiyun LE_BITS_TO_2BYTE(_buf, 6, 1) 203*4882a593Smuzhiyun /*Bit7-9*/ 204*4882a593Smuzhiyun #define GET_TWT_REQ_TYPE_TWT_FLOW_IDENTIFER(_buf) \ 205*4882a593Smuzhiyun LE_BITS_TO_2BYTE(_buf, 7, 3) 206*4882a593Smuzhiyun /*Bit10-14*/ 207*4882a593Smuzhiyun #define GET_TWT_REQ_TYPE_TWT_WAKE_INTERVAL_EXPONENT(_buf) \ 208*4882a593Smuzhiyun LE_BITS_TO_2BYTE(_buf, 10, 5) 209*4882a593Smuzhiyun /*Bit15*/ 210*4882a593Smuzhiyun #define GET_TWT_REQ_TYPE_TWT_PROTECTION(_buf) \ 211*4882a593Smuzhiyun LE_BITS_TO_2BYTE(_buf, 15, 1) 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun #define GET_TWT_TARGET_WAKE_TIME_L(_buf) \ 214*4882a593Smuzhiyun LE_BITS_TO_4BYTE(_buf, 0, 32) 215*4882a593Smuzhiyun #define GET_TWT_TARGET_WAKE_TIME_H(_buf) \ 216*4882a593Smuzhiyun LE_BITS_TO_4BYTE((_buf) + 4, 0, 32) 217*4882a593Smuzhiyun #define GET_TWT_NOMINAL_MINIMUM_TWT_WAKE_DURATION(_buf) \ 218*4882a593Smuzhiyun LE_BITS_TO_1BYTE(_buf, 0 , 8); 219*4882a593Smuzhiyun #define GET_TWT_TWT_WAKE_INTERVAL_MANTISSA(_buf) \ 220*4882a593Smuzhiyun LE_BITS_TO_2BYTE(_buf, 0, 16); 221*4882a593Smuzhiyun #define GET_TWT_TWT_CHANNEL(_buf) \ 222*4882a593Smuzhiyun LE_BITS_TO_1BYTE(_buf, 0 ,8); 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun /*TWT FLOW field*/ 225*4882a593Smuzhiyun /*Bit0-2*/ 226*4882a593Smuzhiyun #define GET_TWT_FLOW_ID(_buf) \ 227*4882a593Smuzhiyun LE_BITS_TO_1BYTE(_buf, 0, 3) 228*4882a593Smuzhiyun /*Bit5-6*/ 229*4882a593Smuzhiyun #define GET_NEGOTIATION_TYPE(_buf) \ 230*4882a593Smuzhiyun LE_BITS_TO_1BYTE(_buf, 5 , 2); 231*4882a593Smuzhiyun /*Bit7*/ 232*4882a593Smuzhiyun #define GET_TEARDOWN_ALL_TWT(_buf) \ 233*4882a593Smuzhiyun LE_BITS_TO_1BYTE(_buf, 7, 1) 234*4882a593Smuzhiyun /*Bit0-4*/ 235*4882a593Smuzhiyun #define GET_BROADCAST_TWT_ID(_buf) \ 236*4882a593Smuzhiyun LE_BITS_TO_1BYTE(_buf, 0, 5) 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun #define GET_ELE_ID(_buf) \ 240*4882a593Smuzhiyun LE_BITS_TO_1BYTE(_buf, 0, 8); 241*4882a593Smuzhiyun #define GET_ELE_LEN(_buf) \ 242*4882a593Smuzhiyun LE_BITS_TO_1BYTE(_buf, 0, 8); 243*4882a593Smuzhiyun #define GET_DIALOG_TOKEN(_buf) \ 244*4882a593Smuzhiyun LE_BITS_TO_1BYTE(_buf, 0, 8); 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun enum rtw_phl_status phl_twt_init(void *phl); 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun void phl_twt_deinit(void *phl); 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun enum rtw_phl_status 252*4882a593Smuzhiyun rtw_phl_twt_disable_all_twt_by_role(void *phl, struct rtw_wifi_role_t *role); 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_twt_alloc_twt_config(void *phl, struct rtw_wifi_role_t *role, 255*4882a593Smuzhiyun struct rtw_phl_twt_setup_info setup_info, u8 benable, u8 *id); 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_twt_free_twt_config(void *phl, u8 id); 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_twt_add_sta_info(void *phl, struct rtw_phl_stainfo_t *phl_sta, 260*4882a593Smuzhiyun u8 config_id, u8 id); 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun #else 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun #define phl_twt_init(_phl) RTW_PHL_STATUS_SUCCESS 265*4882a593Smuzhiyun #define phl_twt_deinit(_phl) 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun #endif /* CONFIG_PHL_TWT */ 268*4882a593Smuzhiyun #endif /*_PHL_TWT_H_*/ 269