1*4882a593Smuzhiyun /****************************************************************************** 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright(c) 2019 - 2021 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_DEF_H_ 16*4882a593Smuzhiyun #define _PHL_DEF_H_ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun enum phl_packet_type { 19*4882a593Smuzhiyun PACKET_NORMAL, 20*4882a593Smuzhiyun PACKET_DHCP, 21*4882a593Smuzhiyun PACKET_ARP, 22*4882a593Smuzhiyun PACKET_EAPOL, 23*4882a593Smuzhiyun PACKET_EAPOL_START, 24*4882a593Smuzhiyun PACKET_MAX 25*4882a593Smuzhiyun }; 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /*HW_BAND0 - CMAC0 + PHY0 + S0*/ 28*4882a593Smuzhiyun /*HW_BAND1 - CMAC1 + PHY1 + S1*/ 29*4882a593Smuzhiyun /*wifi_role->hw_band*/ 30*4882a593Smuzhiyun enum phl_band_idx { 31*4882a593Smuzhiyun HW_BAND_0, 32*4882a593Smuzhiyun HW_BAND_1, 33*4882a593Smuzhiyun HW_BAND_MAX 34*4882a593Smuzhiyun }; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /*wifi_role->hw_port*/ 37*4882a593Smuzhiyun enum phl_hw_port { 38*4882a593Smuzhiyun HW_PORT0, 39*4882a593Smuzhiyun HW_PORT1, 40*4882a593Smuzhiyun HW_PORT2, 41*4882a593Smuzhiyun HW_PORT3, 42*4882a593Smuzhiyun HW_PORT4, 43*4882a593Smuzhiyun HW_PORT_MAX, 44*4882a593Smuzhiyun }; 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun #define RTW_MAX_TID_NUM 16 47*4882a593Smuzhiyun #define RTW_MAX_AC_QUEUE_NUM 4 48*4882a593Smuzhiyun enum phl_ac_queue { 49*4882a593Smuzhiyun PHL_BE_QUEUE_SEL = 0, 50*4882a593Smuzhiyun PHL_BK_QUEUE_SEL = 1, 51*4882a593Smuzhiyun PHL_VI_QUEUE_SEL = 2, 52*4882a593Smuzhiyun PHL_VO_QUEUE_SEL = 3, 53*4882a593Smuzhiyun PHL_AC_QUEUE_TOTAL 54*4882a593Smuzhiyun }; 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun enum phl_stat_info_query { 57*4882a593Smuzhiyun STAT_INFO_FA_ALL, 58*4882a593Smuzhiyun STAT_INFO_CCA_ALL, 59*4882a593Smuzhiyun }; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /** 62*4882a593Smuzhiyun * struct rtw_chan_def - channel defination 63*4882a593Smuzhiyun * @chan: the (control/primary) channel 64*4882a593Smuzhiyun * @center_ch: the center channel 65*4882a593Smuzhiyun * @bw: channel bandwidth 66*4882a593Smuzhiyun * @center_freq1: center frequency of first segment 67*4882a593Smuzhiyun * @center_freq2: center frequency of second segment 68*4882a593Smuzhiyun * (only with 80+80 MHz) 69*4882a593Smuzhiyun */ 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun struct rtw_chan_def { 72*4882a593Smuzhiyun enum band_type band; /* protocol -2.4G,5G,6G*/ 73*4882a593Smuzhiyun enum channel_width bw; 74*4882a593Smuzhiyun enum chan_offset offset; 75*4882a593Smuzhiyun u8 chan; /*primary channel*/ 76*4882a593Smuzhiyun u8 center_ch; 77*4882a593Smuzhiyun u16 hw_value; 78*4882a593Smuzhiyun u32 center_freq1; 79*4882a593Smuzhiyun u32 center_freq2; 80*4882a593Smuzhiyun }; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun struct chg_opch_param { 83*4882a593Smuzhiyun struct rtw_wifi_role_t *wrole; 84*4882a593Smuzhiyun struct rtw_chan_def new_chdef; 85*4882a593Smuzhiyun struct rtw_chan_def ori_chdef; 86*4882a593Smuzhiyun enum rtw_phl_status cmd_start_sts; 87*4882a593Smuzhiyun void (*chg_opch_done)(void *priv, u8 ridx, enum rtw_phl_status status); 88*4882a593Smuzhiyun }; 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun /** 91*4882a593Smuzhiyun * struct rtw_chan_ctx - channel context 92*4882a593Smuzhiyun * @list: 93*4882a593Smuzhiyun * @chan_ctx_lock: 94*4882a593Smuzhiyun * @chan_def: 95*4882a593Smuzhiyun */ 96*4882a593Smuzhiyun struct rtw_chan_ctx { 97*4882a593Smuzhiyun _os_list list; 98*4882a593Smuzhiyun struct rtw_chan_def chan_def; 99*4882a593Smuzhiyun u8 role_map; /*used role_idx*/ 100*4882a593Smuzhiyun bool dfs_enabled; 101*4882a593Smuzhiyun }; 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI 105*4882a593Smuzhiyun struct rtw_pci_info { 106*4882a593Smuzhiyun u8 dummy; 107*4882a593Smuzhiyun }; 108*4882a593Smuzhiyun #endif 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun #ifdef CONFIG_USB_HCI 112*4882a593Smuzhiyun struct rtw_usb_info { 113*4882a593Smuzhiyun enum rtw_usb_speed usb_speed; /* USB 1.1, 2.0 or 3.0 */ 114*4882a593Smuzhiyun u16 usb_bulkout_size; 115*4882a593Smuzhiyun u8 outep_num; 116*4882a593Smuzhiyun u8 inep_num; 117*4882a593Smuzhiyun }; 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun enum phl_usb_rx_agg_mode { 120*4882a593Smuzhiyun PHL_RX_AGG_DISABLE, 121*4882a593Smuzhiyun PHL_RX_AGG_DEFAULT, 122*4882a593Smuzhiyun PHL_RX_AGG_SMALL_PKT, 123*4882a593Smuzhiyun PHL_RX_AGG_USER_DEFINE, 124*4882a593Smuzhiyun }; 125*4882a593Smuzhiyun /* 126*4882a593Smuzhiyun * refers to _usb.h 127*4882a593Smuzhiyun * #define SWITCHMODE 0x2 128*4882a593Smuzhiyun * #define FORCEUSB3MODE 0x1 129*4882a593Smuzhiyun * #define FORCEUSB2MODE 0x0 130*4882a593Smuzhiyun */ 131*4882a593Smuzhiyun enum rtw_usb_sw_ability { 132*4882a593Smuzhiyun RTW_USB2_ONLY = 0, 133*4882a593Smuzhiyun RTW_USB3_ONLY, 134*4882a593Smuzhiyun RTW_USB_SUPPORT_SWITCH, 135*4882a593Smuzhiyun RTW_USB_SUPPORT_MAX 136*4882a593Smuzhiyun }; 137*4882a593Smuzhiyun #endif 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun #ifdef CONFIG_SDIO_HCI 140*4882a593Smuzhiyun struct rtw_sdio_info { 141*4882a593Smuzhiyun unsigned int clock; 142*4882a593Smuzhiyun unsigned int timing; 143*4882a593Smuzhiyun u8 sd3_bus_mode; 144*4882a593Smuzhiyun u16 block_sz; 145*4882a593Smuzhiyun u16 io_align_sz; 146*4882a593Smuzhiyun u16 tx_align_sz; 147*4882a593Smuzhiyun bool tx_512_by_byte_mode; /* Send 512 bytes by cmd53 byte or */ 148*4882a593Smuzhiyun /* block mode. */ 149*4882a593Smuzhiyun }; 150*4882a593Smuzhiyun #endif 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun enum rtw_rx_status { 153*4882a593Smuzhiyun RTW_STATUS_RX_OK, 154*4882a593Smuzhiyun RTW_STATUS_RXDMA_HANG, 155*4882a593Smuzhiyun RTW_STATUS_RXFIFO_HANG 156*4882a593Smuzhiyun }; 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun struct rtw_ic_info { 159*4882a593Smuzhiyun enum rtl_ic_id ic_id; 160*4882a593Smuzhiyun enum rtw_hci_type hci_type; 161*4882a593Smuzhiyun #ifdef CONFIG_SDIO_HCI 162*4882a593Smuzhiyun struct rtw_sdio_info sdio_info; 163*4882a593Smuzhiyun #endif 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun #ifdef CONFIG_USB_HCI 166*4882a593Smuzhiyun struct rtw_usb_info usb_info; 167*4882a593Smuzhiyun #endif 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI 170*4882a593Smuzhiyun struct rtw_pci_info pci_info; 171*4882a593Smuzhiyun #endif 172*4882a593Smuzhiyun }; 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun enum rtw_proc_cmd_type { 175*4882a593Smuzhiyun RTW_PROC_CMD_UNKNOW, 176*4882a593Smuzhiyun RTW_PROC_CMD_BB, /* 1 */ 177*4882a593Smuzhiyun RTW_PROC_CMD_RF, /* 2 */ 178*4882a593Smuzhiyun RTW_PROC_CMD_MAC, /* 3 */ 179*4882a593Smuzhiyun RTW_PROC_CMD_PHL, /* 4 */ 180*4882a593Smuzhiyun RTW_PROC_CMD_CORE, /* 5 */ 181*4882a593Smuzhiyun RTW_PROC_CMD_BTC, /* 6 */ 182*4882a593Smuzhiyun RTW_PROC_CMD_EFUSE, /* 7 */ 183*4882a593Smuzhiyun RTW_PROC_CMD_MAX 184*4882a593Smuzhiyun }; 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun enum rtw_arg_type { 187*4882a593Smuzhiyun RTW_ARG_TYPE_UNKNOW, 188*4882a593Smuzhiyun RTW_ARG_TYPE_BUF, /* 1 */ 189*4882a593Smuzhiyun RTW_ARG_TYPE_ARRAY, /* 2 */ 190*4882a593Smuzhiyun RTW_ARG_TYPE_MAX 191*4882a593Smuzhiyun }; 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun #define MAX_ARGC 20 194*4882a593Smuzhiyun #define MAX_ARGV 16 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun struct rtw_proc_cmd { 198*4882a593Smuzhiyun enum rtw_arg_type in_type; 199*4882a593Smuzhiyun u32 in_cnt_len; 200*4882a593Smuzhiyun union { 201*4882a593Smuzhiyun char *buf; 202*4882a593Smuzhiyun char vector[MAX_ARGC][MAX_ARGV]; 203*4882a593Smuzhiyun }in; 204*4882a593Smuzhiyun }; 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun enum rtw_para_src { 207*4882a593Smuzhiyun RTW_PARA_SRC_INTNAL, /* 0 */ 208*4882a593Smuzhiyun RTW_PARA_SRC_EXTNAL, /* 1 */ 209*4882a593Smuzhiyun RTW_PARA_SRC_EXTNAL_BUF, /* 2 */ 210*4882a593Smuzhiyun RTW_PARA_SRC_CUSTOM, /* 3 */ 211*4882a593Smuzhiyun RTW_PARA_SRC_MAX 212*4882a593Smuzhiyun }; 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun struct rtw_para_info_t { 215*4882a593Smuzhiyun enum rtw_para_src para_src; 216*4882a593Smuzhiyun char para_path[256]; 217*4882a593Smuzhiyun char *hal_phy_folder; 218*4882a593Smuzhiyun char postfix[33]; 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun u8 *ext_para_file_buf; 221*4882a593Smuzhiyun u32 ext_para_file_buf_len; 222*4882a593Smuzhiyun u32 para_data_len; 223*4882a593Smuzhiyun u32 *para_data; 224*4882a593Smuzhiyun }; 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun #define regd_name_max_size 32 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun struct rtw_para_pwrlmt_info_t { 229*4882a593Smuzhiyun enum rtw_para_src para_src; 230*4882a593Smuzhiyun char para_path[256]; 231*4882a593Smuzhiyun char *hal_phy_folder; 232*4882a593Smuzhiyun char postfix[33]; 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun u8 *ext_para_file_buf; 235*4882a593Smuzhiyun u32 ext_para_file_buf_len; 236*4882a593Smuzhiyun u32 para_data_len; 237*4882a593Smuzhiyun u32 *para_data; 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun char ext_regd_name[regd_name_max_size][10]; 240*4882a593Smuzhiyun u16 ext_regd_arridx; 241*4882a593Smuzhiyun u16 ext_reg_map_num; 242*4882a593Smuzhiyun u8 *ext_reg_codemap; 243*4882a593Smuzhiyun }; 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun #define RTW_PHL_HANDLER_STATUS_INITIALIZED BIT0 246*4882a593Smuzhiyun #define RTW_PHL_HANDLER_STATUS_SET BIT1 247*4882a593Smuzhiyun #define RTW_PHL_HANDLER_STATUS_RELEASED BIT2 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun #define RTW_PHL_HANDLER_PRIO_HIGH 0 250*4882a593Smuzhiyun #define RTW_PHL_HANDLER_PRIO_NORMAL 1 251*4882a593Smuzhiyun #define RTW_PHL_HANDLER_PRIO_LOW 2 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun #define RTW_PHL_HANDLER_CB_NAME_LEN 32 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun enum rtw_phl_evt { 256*4882a593Smuzhiyun RTW_PHL_EVT_RX = BIT0, 257*4882a593Smuzhiyun RTW_PHL_EVT_TX_RECYCLE = BIT1, 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun RTW_PHL_EVT_MAX = BIT31 260*4882a593Smuzhiyun }; 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun enum rtw_phl_config_int { 263*4882a593Smuzhiyun RTW_PHL_STOP_RX_INT, 264*4882a593Smuzhiyun RTW_PHL_RESUME_RX_INT, 265*4882a593Smuzhiyun RTW_PHL_SER_HANDSHAKE_MODE, 266*4882a593Smuzhiyun RTW_PHL_EN_HCI_INT, 267*4882a593Smuzhiyun RTW_PHL_DIS_HCI_INT, 268*4882a593Smuzhiyun RTW_PHL_CLR_HCI_INT, 269*4882a593Smuzhiyun RTW_PHL_CONFIG_INT_MAX 270*4882a593Smuzhiyun }; 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun /** 273*4882a593Smuzhiyun * phl_handler - scheduled by core layer or phl itself 274*4882a593Smuzhiyun * and the properties is assigned by different hanlder type 275*4882a593Smuzhiyun * @status: handler current status defined by RTW_PHL_HANDLER_STATUS_XXX 276*4882a593Smuzhiyun * @type: define different properties of handler - tasklet, thread, workitem 277*4882a593Smuzhiyun * @handle: store different type of handler structure 278*4882a593Smuzhiyun * @callback: handler callback function 279*4882a593Smuzhiyun * @context: context used in handler callback function 280*4882a593Smuzhiyun */ 281*4882a593Smuzhiyun struct rtw_phl_handler { 282*4882a593Smuzhiyun char status; 283*4882a593Smuzhiyun char type; 284*4882a593Smuzhiyun void *drv_priv; 285*4882a593Smuzhiyun struct _os_handler os_handler; 286*4882a593Smuzhiyun void (*callback)(void *context); 287*4882a593Smuzhiyun char cb_name[RTW_PHL_HANDLER_CB_NAME_LEN]; 288*4882a593Smuzhiyun void *context; 289*4882a593Smuzhiyun }; 290*4882a593Smuzhiyun 291*4882a593Smuzhiyun struct rtw_xmit_req; 292*4882a593Smuzhiyun struct rtw_aoac_report; 293*4882a593Smuzhiyun struct rtw_phl_evt_ops { 294*4882a593Smuzhiyun enum rtw_phl_status (*rx_process)(void *drv_priv); 295*4882a593Smuzhiyun enum rtw_phl_status (*tx_recycle)(void *drv_priv, struct rtw_xmit_req *txreq); 296*4882a593Smuzhiyun enum rtw_phl_status (*tx_test_recycle)(void *phl, struct rtw_xmit_req *txreq); 297*4882a593Smuzhiyun bool (*set_rf_state)(void *drv_priv, enum rtw_rf_state state_to_set); 298*4882a593Smuzhiyun void (*wow_handle_sec_info_update)(void *drv_priv, struct rtw_aoac_report *aoac_info, u8 aoac_report_get_ok, u8 phase); 299*4882a593Smuzhiyun void (*indicate_wake_rsn)(void *drv_priv, u8 rsn); 300*4882a593Smuzhiyun #ifdef CONFIG_SYNC_INTERRUPT 301*4882a593Smuzhiyun void (*interrupt_restore)(void *drv_priv, u8 rx); 302*4882a593Smuzhiyun void (*set_interrupt_caps)(void *drv_priv, u8 en); 303*4882a593Smuzhiyun #endif /* CONFIG_SYNC_INTERRUPT */ 304*4882a593Smuzhiyun void (*ap_ps_sta_ps_change)(void *drv_priv, u8 role_id, u8 *sta_mac, 305*4882a593Smuzhiyun int power_save); 306*4882a593Smuzhiyun u8 (*issue_null_data)(void *priv, u8 ridx, bool ps); 307*4882a593Smuzhiyun }; 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun /* 310*4882a593Smuzhiyun * PHL CMD support direct execution, no-wait: synchronization, wait:asynchronization 311*4882a593Smuzhiyun * PHL_CMD_CMD_DIRECTLY: call PHL API including I/O operation directly 312*4882a593Smuzhiyun * PHL_CMD_NO_WARIT: send phl cmd msg to cmd dispatcher and do not wait for completion 313*4882a593Smuzhiyun * PHL_CMD_WAIT: send phl cmd msg to cmd dispatcher and wait for completion 314*4882a593Smuzhiyun */ 315*4882a593Smuzhiyun enum phl_cmd_type { 316*4882a593Smuzhiyun PHL_CMD_DIRECTLY, 317*4882a593Smuzhiyun PHL_CMD_NO_WAIT, 318*4882a593Smuzhiyun PHL_CMD_WAIT, 319*4882a593Smuzhiyun PHL_CMD_MAX, 320*4882a593Smuzhiyun }; 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun enum role_type { 323*4882a593Smuzhiyun PHL_RTYPE_NONE, 324*4882a593Smuzhiyun PHL_RTYPE_STATION, 325*4882a593Smuzhiyun PHL_RTYPE_AP, 326*4882a593Smuzhiyun PHL_RTYPE_VAP, 327*4882a593Smuzhiyun PHL_RTYPE_ADHOC, 328*4882a593Smuzhiyun PHL_RTYPE_ADHOC_MASTER, 329*4882a593Smuzhiyun PHL_RTYPE_MESH, 330*4882a593Smuzhiyun PHL_RTYPE_MONITOR, 331*4882a593Smuzhiyun PHL_RTYPE_P2P_DEVICE, 332*4882a593Smuzhiyun PHL_RTYPE_P2P_GC, 333*4882a593Smuzhiyun PHL_RTYPE_P2P_GO, 334*4882a593Smuzhiyun PHL_RTYPE_TDLS, 335*4882a593Smuzhiyun PHL_RTYPE_NAN, 336*4882a593Smuzhiyun PHL_MLME_MAX 337*4882a593Smuzhiyun }; 338*4882a593Smuzhiyun 339*4882a593Smuzhiyun enum role_state { 340*4882a593Smuzhiyun PHL_ROLE_START, /* 0 - PHL*/ 341*4882a593Smuzhiyun PHL_ROLE_STOP, /* 1 - PHL*/ 342*4882a593Smuzhiyun PHL_ROLE_CHG_TYPE, /* 2 - PHL*/ 343*4882a593Smuzhiyun PHL_ROLE_UPDATE_NOA, /* 3 - PHL*/ 344*4882a593Smuzhiyun PHL_ROLE_MSTS_STA_CONN_START, /*CORE*/ 345*4882a593Smuzhiyun PHL_ROLE_MSTS_STA_CONN_END,/*CORE*/ 346*4882a593Smuzhiyun PHL_ROLE_MSTS_STA_DIS_CONN,/*CORE*/ 347*4882a593Smuzhiyun PHL_ROLE_MSTS_AP_START,/*CORE*/ 348*4882a593Smuzhiyun PHL_ROLE_MSTS_AP_STOP,/*CORE*/ 349*4882a593Smuzhiyun PHL_ROLE_STATE_UNKNOWN, 350*4882a593Smuzhiyun }; 351*4882a593Smuzhiyun 352*4882a593Smuzhiyun enum mlme_state { 353*4882a593Smuzhiyun MLME_NO_LINK, 354*4882a593Smuzhiyun MLME_LINKING, 355*4882a593Smuzhiyun MLME_LINKED 356*4882a593Smuzhiyun }; 357*4882a593Smuzhiyun enum wr_chg_id { 358*4882a593Smuzhiyun WR_CHG_TYPE, 359*4882a593Smuzhiyun WR_CHG_MADDR, 360*4882a593Smuzhiyun WR_CHG_AP_PARAM, 361*4882a593Smuzhiyun WR_CHG_EDCA_PARAM, 362*4882a593Smuzhiyun WR_CHG_MU_EDCA_PARAM, 363*4882a593Smuzhiyun WR_CHG_MU_EDCA_CFG, 364*4882a593Smuzhiyun WR_CHG_BSS_COLOR, 365*4882a593Smuzhiyun WR_CHG_RTS_TH, 366*4882a593Smuzhiyun WR_CHG_DFS_HE_TB_CFG, 367*4882a593Smuzhiyun WR_CHG_TRX_PATH, 368*4882a593Smuzhiyun WR_CHG_MAX, 369*4882a593Smuzhiyun }; 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun enum wr_status{ 372*4882a593Smuzhiyun WR_STATUS_PS_ANN = BIT0, 373*4882a593Smuzhiyun WR_STATUS_BCN_STOP = BIT1, 374*4882a593Smuzhiyun WR_STATUS_TSF_SYNC = BIT2, 375*4882a593Smuzhiyun WR_STATUS_MAX = BIT7 376*4882a593Smuzhiyun }; 377*4882a593Smuzhiyun 378*4882a593Smuzhiyun enum rtw_cfg_type { /* sync with pcfg_type */ 379*4882a593Smuzhiyun CFG_TBTT_AGG, 380*4882a593Smuzhiyun CFG_TBTT_SHIFT, 381*4882a593Smuzhiyun CFG_HIQ_WIN, 382*4882a593Smuzhiyun CFG_HIQ_DTIM, 383*4882a593Smuzhiyun CFG_HIQ_MAX, 384*4882a593Smuzhiyun CFG_BCN_INTERVAL, /* Beacon Interval */ 385*4882a593Smuzhiyun CFG_BSS_CLR 386*4882a593Smuzhiyun }; 387*4882a593Smuzhiyun 388*4882a593Smuzhiyun struct rtw_ap_param { 389*4882a593Smuzhiyun u32 cfg_id; 390*4882a593Smuzhiyun u32 value; 391*4882a593Smuzhiyun }; 392*4882a593Smuzhiyun 393*4882a593Smuzhiyun struct rtw_edca_param { 394*4882a593Smuzhiyun /* Access Category, 0:BE, 1:BK, 2:VI, 3:VO */ 395*4882a593Smuzhiyun u8 ac; 396*4882a593Smuzhiyun /* 397*4882a593Smuzhiyun * EDCA parameter 398*4882a593Smuzhiyun * |31...16|15...12|11...8|7...0| 399*4882a593Smuzhiyun * | TXOP| CWMAX| CWMIN| AIFS| 400*4882a593Smuzhiyun */ 401*4882a593Smuzhiyun u32 param; 402*4882a593Smuzhiyun }; 403*4882a593Smuzhiyun 404*4882a593Smuzhiyun struct rtw_mu_edca_param { 405*4882a593Smuzhiyun u8 ac; 406*4882a593Smuzhiyun u8 aifsn; 407*4882a593Smuzhiyun u8 cw; 408*4882a593Smuzhiyun u8 timer; 409*4882a593Smuzhiyun }; 410*4882a593Smuzhiyun 411*4882a593Smuzhiyun struct rtw_trx_path_param { 412*4882a593Smuzhiyun enum rf_path tx; 413*4882a593Smuzhiyun enum rf_path rx; 414*4882a593Smuzhiyun u8 tx_nss; 415*4882a593Smuzhiyun u8 rx_nss; 416*4882a593Smuzhiyun }; 417*4882a593Smuzhiyun 418*4882a593Smuzhiyun #define MAX_STORE_BCN_NUM 3 419*4882a593Smuzhiyun enum conf_lvl { 420*4882a593Smuzhiyun CONF_LVL_NONE = 0, 421*4882a593Smuzhiyun CONF_LVL_LOW, 422*4882a593Smuzhiyun CONF_LVL_MID, 423*4882a593Smuzhiyun CONF_LVL_HIGH 424*4882a593Smuzhiyun }; 425*4882a593Smuzhiyun 426*4882a593Smuzhiyun struct rtw_bcn_offset { 427*4882a593Smuzhiyun u16 offset; /*TU*/ 428*4882a593Smuzhiyun enum conf_lvl conf_lvl; /*confidence level*/ 429*4882a593Smuzhiyun u16 cr_tbtt_shift; /* CR current setting */ 430*4882a593Smuzhiyun }; 431*4882a593Smuzhiyun 432*4882a593Smuzhiyun /* 433*4882a593Smuzhiyun * Store rx bcn tsf info 434*4882a593Smuzhiyun * @num: the store noumber of "info" array 435*4882a593Smuzhiyun * @idx: store current index of "info" array 436*4882a593Smuzhiyun * @info: store array. info[0]: store tsf, info[1]: store mod(TU), info[2]: store hw rx time 437*4882a593Smuzhiyun * @offset_i: Bcn offset info. Dont't access directionly this variable for application. 438*4882a593Smuzhiyun You can get offset_i info from phl_get_sta_bcn_offset_info. 439*4882a593Smuzhiyun */ 440*4882a593Smuzhiyun struct rtw_rx_bcn_info { 441*4882a593Smuzhiyun u8 idx; 442*4882a593Smuzhiyun u8 num; 443*4882a593Smuzhiyun u64 info[3][MAX_STORE_BCN_NUM]; 444*4882a593Smuzhiyun struct rtw_bcn_offset offset_i; 445*4882a593Smuzhiyun }; 446*4882a593Smuzhiyun 447*4882a593Smuzhiyun struct rtw_bcn_pkt_info { 448*4882a593Smuzhiyun struct rtw_phl_stainfo_t *sta; 449*4882a593Smuzhiyun u64 tsf; 450*4882a593Smuzhiyun u64 hw_tsf; 451*4882a593Smuzhiyun }; 452*4882a593Smuzhiyun 453*4882a593Smuzhiyun struct rtw_rts_threshold { 454*4882a593Smuzhiyun u16 rts_time_th; 455*4882a593Smuzhiyun u16 rts_len_th; 456*4882a593Smuzhiyun }; 457*4882a593Smuzhiyun 458*4882a593Smuzhiyun enum phl_module_id{ 459*4882a593Smuzhiyun /* 0 ~ 128 PHL background module starts from here*/ 460*4882a593Smuzhiyun /* 1,2,3 cmd controller section */ 461*4882a593Smuzhiyun PHL_BK_MDL_START = 0, 462*4882a593Smuzhiyun PHL_MDL_PHY_MGNT = 1, 463*4882a593Smuzhiyun PHL_MDL_TX = 2, 464*4882a593Smuzhiyun PHL_MDL_RX = 3, 465*4882a593Smuzhiyun 466*4882a593Smuzhiyun /* above enum is fixed, add new module id from here*/ 467*4882a593Smuzhiyun /* 10 ~ 40 protocol, wifi role section*/ 468*4882a593Smuzhiyun PHL_BK_MDL_ROLE_START = 10, 469*4882a593Smuzhiyun PHL_MDL_MRC = 10, /* Multi-Role Controller intead of STA/P2P role /NAN/AP*/ 470*4882a593Smuzhiyun PHL_MDL_SOUND = 11, 471*4882a593Smuzhiyun 472*4882a593Smuzhiyun PHL_BK_MDL_ROLE_END = 40, 473*4882a593Smuzhiyun 474*4882a593Smuzhiyun /* 41 ~ 70 mandatory background module section*/ 475*4882a593Smuzhiyun PHL_BK_MDL_MDRY_START = 41, 476*4882a593Smuzhiyun PHL_MDL_POWER_MGNT = 41, 477*4882a593Smuzhiyun PHL_MDL_SER = 42, 478*4882a593Smuzhiyun 479*4882a593Smuzhiyun PHL_BK_MDL_MDRY_END = 70, 480*4882a593Smuzhiyun 481*4882a593Smuzhiyun /* 70 ~ 127 optional background module section*/ 482*4882a593Smuzhiyun PHL_BK_MDL_OPT_START = 71, 483*4882a593Smuzhiyun PHL_MDL_BTC = 71, 484*4882a593Smuzhiyun /*PHL_MDL_RSVD = 72,*/ 485*4882a593Smuzhiyun PHL_MDL_CUSTOM = 73, 486*4882a593Smuzhiyun PHL_MDL_WOW = 74, 487*4882a593Smuzhiyun PHL_MDL_PSTS = 75, 488*4882a593Smuzhiyun PHL_MDL_LED = 76, 489*4882a593Smuzhiyun PHL_MDL_GENERAL = 77, 490*4882a593Smuzhiyun PHL_MDL_REGU = 78, 491*4882a593Smuzhiyun 492*4882a593Smuzhiyun PHL_BK_MDL_OPT_END = 127, 493*4882a593Smuzhiyun 494*4882a593Smuzhiyun /* Fixed BK MDL Max Value*/ 495*4882a593Smuzhiyun PHL_BK_MDL_END = 128, 496*4882a593Smuzhiyun 497*4882a593Smuzhiyun /* 129 ~ 256 PHL foreground module starts from here*/ 498*4882a593Smuzhiyun PHL_FG_MDL_START = 129, 499*4882a593Smuzhiyun PHL_FUNC_MDL_TEST_MODULE = 129, 500*4882a593Smuzhiyun PHL_FG_MDL_SCAN = 130, 501*4882a593Smuzhiyun PHL_FG_MDL_CONNECT = 131, 502*4882a593Smuzhiyun PHL_FG_MDL_DISCONNECT = 132, 503*4882a593Smuzhiyun PHL_FG_MDL_AP_START = 133, 504*4882a593Smuzhiyun PHL_FG_MDL_AP_STOP = 134, 505*4882a593Smuzhiyun PHL_FG_MDL_ECSA = 135, 506*4882a593Smuzhiyun PHL_FG_MDL_END = 254, 507*4882a593Smuzhiyun 508*4882a593Smuzhiyun /* Fixed MDL Max Value*/ 509*4882a593Smuzhiyun PHL_MDL_ID_MAX = 255 510*4882a593Smuzhiyun }; 511*4882a593Smuzhiyun 512*4882a593Smuzhiyun /* General phl event id shall share this common enum definition 513*4882a593Smuzhiyun * if definition of private events for a specific module is required, 514*4882a593Smuzhiyun * please be sure to start its enum from PRIVATE_EVT_START(0x8000) 515*4882a593Smuzhiyun */ 516*4882a593Smuzhiyun enum phl_msg_evt_id { 517*4882a593Smuzhiyun MSG_EVT_NONE = 0, 518*4882a593Smuzhiyun MSG_EVT_PHY_ON = 1, 519*4882a593Smuzhiyun MSG_EVT_PHY_IDLE = 2, 520*4882a593Smuzhiyun MSG_EVT_SCAN_START = 3, 521*4882a593Smuzhiyun MSG_EVT_SCAN_END = 4, 522*4882a593Smuzhiyun MSG_EVT_CONNECT_START = 5, 523*4882a593Smuzhiyun MSG_EVT_CONNECT_LINKED = 6, 524*4882a593Smuzhiyun MSG_EVT_CONNECT_END = 7, 525*4882a593Smuzhiyun MSG_EVT_SER_L1 = 8, 526*4882a593Smuzhiyun MSG_EVT_SER_L2 = 9, 527*4882a593Smuzhiyun MSG_EVT_FWDL_OK = 10, 528*4882a593Smuzhiyun MSG_EVT_FWDL_FAIL = 11, 529*4882a593Smuzhiyun MSG_EVT_HAL_INIT_OK = 12, 530*4882a593Smuzhiyun MSG_EVT_HAL_INIT_FAIL = 13, 531*4882a593Smuzhiyun MSG_EVT_MP_CMD_DONE = 14, 532*4882a593Smuzhiyun /* wow */ 533*4882a593Smuzhiyun MSG_EVT_WOW_ENTER = 15, 534*4882a593Smuzhiyun MSG_EVT_WOW_LEAVE = 16, 535*4882a593Smuzhiyun MSG_EVT_WOW_WAKE_RSN = 17, 536*4882a593Smuzhiyun MSG_EVT_BCN_RESEND = 18, 537*4882a593Smuzhiyun MSG_EVT_DUMP_PLE_BUFFER = 19, 538*4882a593Smuzhiyun MSG_EVT_MP_RX_PHYSTS = 20, 539*4882a593Smuzhiyun MSG_EVT_ROLE_NTFY = 21, 540*4882a593Smuzhiyun MSG_EVT_RX_PSTS = 22, 541*4882a593Smuzhiyun MSG_EVT_SWCH_START = 23, 542*4882a593Smuzhiyun MSG_EVT_SWCH_DONE = 24, 543*4882a593Smuzhiyun MSG_EVT_DISCONNECT_PREPARE = 25, 544*4882a593Smuzhiyun MSG_EVT_DISCONNECT = 26, 545*4882a593Smuzhiyun MSG_EVT_TSF_SYNC_DONE = 27, 546*4882a593Smuzhiyun MSG_EVT_TX_RESUME = 28, 547*4882a593Smuzhiyun MSG_EVT_AP_START_PREPARE =29, 548*4882a593Smuzhiyun MSG_EVT_AP_START = 30, 549*4882a593Smuzhiyun MSG_EVT_AP_START_END = 31, 550*4882a593Smuzhiyun MSG_EVT_AP_STOP_PREPARE = 32, 551*4882a593Smuzhiyun MSG_EVT_AP_STOP = 33, 552*4882a593Smuzhiyun MSG_EVT_PCIE_TRX_MIT = 34, 553*4882a593Smuzhiyun MSG_EVT_BTC_TMR = 35, 554*4882a593Smuzhiyun MSG_EVT_BTC_FWEVNT = 36, 555*4882a593Smuzhiyun MSG_EVT_BTC_REQ_BT_SLOT = 37, 556*4882a593Smuzhiyun MSG_EVT_BTC_PKT_EVT_NTFY = 38, 557*4882a593Smuzhiyun /* ser*/ 558*4882a593Smuzhiyun MSG_EVT_SER_L0_RESET = 39, /* L0 notify only */ 559*4882a593Smuzhiyun MSG_EVT_SER_M1_PAUSE_TRX = 40, 560*4882a593Smuzhiyun MSG_EVT_SER_IO_TIMER_EXPIRE = 41, 561*4882a593Smuzhiyun MSG_EVT_SER_FW_TIMER_EXPIRE = 42, 562*4882a593Smuzhiyun MSG_EVT_SER_M3_DO_RECOV = 43, 563*4882a593Smuzhiyun MSG_EVT_SER_M5_READY = 44, 564*4882a593Smuzhiyun MSG_EVT_SER_M9_L2_RESET = 45, 565*4882a593Smuzhiyun MSG_EVT_SER_EVENT_CHK = 46, 566*4882a593Smuzhiyun MSG_EVT_SER_POLLING_CHK = 47, 567*4882a593Smuzhiyun MSG_EVT_ECSA_START = 48, 568*4882a593Smuzhiyun MSG_EVT_ECSA_UPDATE_FIRST_BCN_DONE = 49, 569*4882a593Smuzhiyun MSG_EVT_ECSA_COUNT_DOWN = 50, 570*4882a593Smuzhiyun MSG_EVT_ECSA_SWITCH_START = 51, 571*4882a593Smuzhiyun MSG_EVT_ECSA_SWITCH_DONE = 52, 572*4882a593Smuzhiyun MSG_EVT_ECSA_CHECK_TX_RESUME = 53, 573*4882a593Smuzhiyun MSG_EVT_ECSA_DONE = 54, 574*4882a593Smuzhiyun MSG_EVT_LISTEN_STATE_EXPIRE = 55, 575*4882a593Smuzhiyun /* beamform */ 576*4882a593Smuzhiyun MSG_EVT_SET_VHT_GID = 56, 577*4882a593Smuzhiyun MSG_EVT_HW_WATCHDOG = 57, 578*4882a593Smuzhiyun MSG_EVT_DEV_CANNOT_IO = 58, 579*4882a593Smuzhiyun MSG_EVT_DEV_RESUME_IO = 59, 580*4882a593Smuzhiyun MSG_EVT_FORCE_USB_SW = 60, 581*4882a593Smuzhiyun MSG_EVT_GET_USB_SPEED = 61, 582*4882a593Smuzhiyun MSG_EVT_GET_USB_SW_ABILITY = 62, 583*4882a593Smuzhiyun MSG_EVT_CFG_AMPDU = 63, 584*4882a593Smuzhiyun MSG_EVT_DFS_PAUSE_TX = 64, 585*4882a593Smuzhiyun MSG_EVT_ROLE_RECOVER = 65, 586*4882a593Smuzhiyun MSG_EVT_ROLE_SUSPEND = 66, 587*4882a593Smuzhiyun MSG_EVT_HAL_SET_L2_LEAVE = 67, 588*4882a593Smuzhiyun MSG_EVT_NOTIFY_HAL = 68, 589*4882a593Smuzhiyun MSG_EVT_ISSUE_BCN = 69, 590*4882a593Smuzhiyun MSG_EVT_FREE_BCN = 70, 591*4882a593Smuzhiyun MSG_EVT_STOP_BCN = 71, 592*4882a593Smuzhiyun MSG_EVT_SEC_KEY = 72, 593*4882a593Smuzhiyun MSG_EVT_ROLE_START = 73, 594*4882a593Smuzhiyun MSG_EVT_ROLE_CHANGE = 74, 595*4882a593Smuzhiyun MSG_EVT_ROLE_STOP = 75, 596*4882a593Smuzhiyun MSG_EVT_STA_INFO_CTRL = 76, 597*4882a593Smuzhiyun MSG_EVT_STA_MEDIA_STATUS_UPT = 77, 598*4882a593Smuzhiyun MSG_EVT_CFG_CHINFO = 78, 599*4882a593Smuzhiyun MSG_EVT_STA_CHG_STAINFO = 79, 600*4882a593Smuzhiyun MSG_EVT_HW_TRX_RST_RESUME = 80, 601*4882a593Smuzhiyun MSG_EVT_HW_TRX_PAUSE = 81, 602*4882a593Smuzhiyun MSG_EVT_SW_TX_RESUME = 82, 603*4882a593Smuzhiyun MSG_EVT_SW_RX_RESUME = 83, 604*4882a593Smuzhiyun MSG_EVT_SW_TX_PAUSE = 84, 605*4882a593Smuzhiyun MSG_EVT_SW_RX_PAUSE = 85, 606*4882a593Smuzhiyun MSG_EVT_SW_TX_RESET = 86, 607*4882a593Smuzhiyun MSG_EVT_SW_RX_RESET = 87, 608*4882a593Smuzhiyun MSG_EVT_TRX_SW_PAUSE = 88, 609*4882a593Smuzhiyun MSG_EVT_TRX_SW_RESUME = 89, 610*4882a593Smuzhiyun MSG_EVT_TRX_PAUSE_W_RST = 90, 611*4882a593Smuzhiyun MSG_EVT_TRX_RESUME_W_RST = 91, 612*4882a593Smuzhiyun /* Regulation*/ 613*4882a593Smuzhiyun MSG_EVT_REGU_SET_DOMAIN = 92, 614*4882a593Smuzhiyun MSG_EVT_RF_ON = 93, 615*4882a593Smuzhiyun MSG_EVT_RF_OFF = 94, 616*4882a593Smuzhiyun MSG_EVT_WPS_PRESSED = 95, 617*4882a593Smuzhiyun MSG_EVT_WPS_RELEASED = 96, 618*4882a593Smuzhiyun MSG_EVT_SURPRISE_REMOVE = 97, 619*4882a593Smuzhiyun MSG_EVT_DATA_PATH_START = 98, 620*4882a593Smuzhiyun MSG_EVT_DATA_PATH_STOP = 99, 621*4882a593Smuzhiyun MSG_EVT_TRX_PWR_REQ = 100, 622*4882a593Smuzhiyun /* tdls */ 623*4882a593Smuzhiyun MSG_EVT_TDLS_SYNC = 101, 624*4882a593Smuzhiyun /* beamformee */ 625*4882a593Smuzhiyun MSG_EVT_SET_BFEE_AID = 102, 626*4882a593Smuzhiyun /* ccx */ 627*4882a593Smuzhiyun MSG_EVT_CCX_REPORT_TX_OK = 103, 628*4882a593Smuzhiyun MSG_EVT_CCX_REPORT_TX_FAIL = 104, 629*4882a593Smuzhiyun /* ps */ 630*4882a593Smuzhiyun MSG_EVT_PS_CAP_CHG = 105, 631*4882a593Smuzhiyun MSG_EVT_PS_PERIOD_CHK = 106, 632*4882a593Smuzhiyun MSG_EVT_PS_DBG_LPS_ENTER = 107, 633*4882a593Smuzhiyun MSG_EVT_PS_DBG_LPS_LEAVE = 108, 634*4882a593Smuzhiyun MSG_EVT_PS_DBG_IPS_ENTER = 109, 635*4882a593Smuzhiyun MSG_EVT_PS_DBG_IPS_LEAVE = 110, 636*4882a593Smuzhiyun /* Change operating ch def(ch / bw) */ 637*4882a593Smuzhiyun MSG_EVT_CHG_OP_CH_DEF_START = 111, 638*4882a593Smuzhiyun MSG_EVT_CHG_OP_CH_DEF_END = 112, 639*4882a593Smuzhiyun MSG_EVT_MDL_CHECK_STOP = 113, 640*4882a593Smuzhiyun MSG_EVT_HW_RF_CHG = 114, 641*4882a593Smuzhiyun 642*4882a593Smuzhiyun MSG_EVT_TX_PKT_NTFY = 115, 643*4882a593Smuzhiyun MSG_EVT_SW_WATCHDOG = 116, 644*4882a593Smuzhiyun /* ltr */ 645*4882a593Smuzhiyun /* dbg */ 646*4882a593Smuzhiyun MSG_EVT_DBG_SIP_REG_DUMP = 200, 647*4882a593Smuzhiyun MSG_EVT_DBG_FULL_REG_DUMP = 201, 648*4882a593Smuzhiyun MSG_EVT_DBG_L2_DIAGNOSE = 202, 649*4882a593Smuzhiyun MSG_EVT_DBG_RX_DUMP = 203, 650*4882a593Smuzhiyun MSG_EVT_DBG_TX_DUMP = 204, 651*4882a593Smuzhiyun /* dbg end */ 652*4882a593Smuzhiyun /* p2pps */ 653*4882a593Smuzhiyun MSG_EVT_TSF32_TOG = 205, 654*4882a593Smuzhiyun /* p2pps end */ 655*4882a593Smuzhiyun /*Add EVT-ID for linux core cmd temporality*/ 656*4882a593Smuzhiyun 657*4882a593Smuzhiyun /* sub module IO */ 658*4882a593Smuzhiyun MSG_EVT_NOTIFY_BB = 300, 659*4882a593Smuzhiyun MSG_EVT_NOTIFY_RF = 301, 660*4882a593Smuzhiyun MSG_EVT_NOTIFY_MAC = 302, 661*4882a593Smuzhiyun /* sub module IO end*/ 662*4882a593Smuzhiyun 663*4882a593Smuzhiyun MSG_EVT_LINUX_CMD_WRK = 888, 664*4882a593Smuzhiyun MSG_EVT_LINUX_CMD_WRK_TRI_PS = 889, 665*4882a593Smuzhiyun /* LED */ 666*4882a593Smuzhiyun MSG_EVT_LED_TICK = 5000, 667*4882a593Smuzhiyun MSG_EVT_LED_EVT_START = 5001, 668*4882a593Smuzhiyun MSG_EVT_LED_EVT_END = 5050, 669*4882a593Smuzhiyun MSG_EVT_MAX = 0x7fff 670*4882a593Smuzhiyun }; 671*4882a593Smuzhiyun 672*4882a593Smuzhiyun 673*4882a593Smuzhiyun 674*4882a593Smuzhiyun enum phl_msg_recver_layer { 675*4882a593Smuzhiyun MSG_RECV_PHL = 0, 676*4882a593Smuzhiyun MSG_RECV_CORE = 1, 677*4882a593Smuzhiyun MSG_RECV_MAX 678*4882a593Smuzhiyun }; 679*4882a593Smuzhiyun 680*4882a593Smuzhiyun enum phl_msg_indicator { 681*4882a593Smuzhiyun MSG_INDC_PRE_PHASE = BIT0, 682*4882a593Smuzhiyun MSG_INDC_FAIL = BIT1, 683*4882a593Smuzhiyun MSG_INDC_CANCEL = BIT2, 684*4882a593Smuzhiyun MSG_INDC_CANNOT_IO = BIT3 685*4882a593Smuzhiyun }; 686*4882a593Smuzhiyun 687*4882a593Smuzhiyun enum phl_msg_opt { 688*4882a593Smuzhiyun MSG_OPT_SKIP_NOTIFY_OPT_MDL = BIT0, 689*4882a593Smuzhiyun MSG_OPT_BLIST_PRESENT = BIT1, 690*4882a593Smuzhiyun MSG_OPT_CLR_SNDR_MSG_IF_PENDING = BIT2, 691*4882a593Smuzhiyun MSG_OPT_SEND_IN_ABORT = BIT3, 692*4882a593Smuzhiyun MSG_OPT_PENDING_DURING_CANNOT_IO = BIT4, 693*4882a593Smuzhiyun }; 694*4882a593Smuzhiyun 695*4882a593Smuzhiyun 696*4882a593Smuzhiyun /* all module share this common enum definition */ 697*4882a593Smuzhiyun enum phy_bk_module_opcode { 698*4882a593Smuzhiyun BK_MODL_OP_NONE = 0, 699*4882a593Smuzhiyun BK_MODL_OP_CHK_NEW_MSG, 700*4882a593Smuzhiyun BK_MODL_OP_INPUT_CMD, 701*4882a593Smuzhiyun BK_MODL_OP_STATE, 702*4882a593Smuzhiyun BK_MODL_OP_CUS_SET_ROLE_CAP, 703*4882a593Smuzhiyun BK_MODL_OP_CUS_UPDATE_ROLE_CAP, 704*4882a593Smuzhiyun BK_MODL_OP_MAX 705*4882a593Smuzhiyun }; 706*4882a593Smuzhiyun 707*4882a593Smuzhiyun /* Foreground cmd token opcode */ 708*4882a593Smuzhiyun enum phy_fg_cmd_req_opcode { 709*4882a593Smuzhiyun FG_REQ_OP_NONE = 0, 710*4882a593Smuzhiyun FG_REQ_OP_GET_ROLE, 711*4882a593Smuzhiyun FG_REQ_OP_GET_MDL_ID, 712*4882a593Smuzhiyun #ifdef RTW_WKARD_MRC_ISSUE_NULL_WITH_SCAN_OPS 713*4882a593Smuzhiyun FG_REQ_OP_GET_SCAN_PARAM, 714*4882a593Smuzhiyun FG_REQ_OP_GET_ISSUE_NULL_OPS, 715*4882a593Smuzhiyun #endif 716*4882a593Smuzhiyun #ifdef RTW_WKARD_CMD_SCAN_EXTEND_ACTIVE_SCAN 717*4882a593Smuzhiyun FG_REQ_OP_NOTIFY_BCN_RCV, 718*4882a593Smuzhiyun #endif 719*4882a593Smuzhiyun #ifdef RTW_WKARD_CMD_SCAN_EXTEND_ACTION_FRAME_TX 720*4882a593Smuzhiyun FG_REQ_OP_NOTIFY_ACTION_FRAME_TX, 721*4882a593Smuzhiyun #endif 722*4882a593Smuzhiyun FG_REQ_OP_MAX 723*4882a593Smuzhiyun }; 724*4882a593Smuzhiyun 725*4882a593Smuzhiyun /* priority of phl background 726*4882a593Smuzhiyun module which would be considered when dispatching phl msg*/ 727*4882a593Smuzhiyun enum phl_bk_module_priority { 728*4882a593Smuzhiyun PHL_MDL_PRI_ROLE = 0, 729*4882a593Smuzhiyun PHL_MDL_PRI_OPTIONAL, 730*4882a593Smuzhiyun PHL_MDL_PRI_MANDATORY, 731*4882a593Smuzhiyun PHL_MDL_PRI_MAX 732*4882a593Smuzhiyun }; 733*4882a593Smuzhiyun 734*4882a593Smuzhiyun enum phl_data_ctl_cmd { 735*4882a593Smuzhiyun PHL_DATA_CTL_HW_TRX_RST_RESUME = 1, 736*4882a593Smuzhiyun PHL_DATA_CTL_HW_TRX_PAUSE = 2, 737*4882a593Smuzhiyun PHL_DATA_CTL_SW_TX_RESUME = 3, 738*4882a593Smuzhiyun PHL_DATA_CTL_SW_RX_RESUME = 4, 739*4882a593Smuzhiyun PHL_DATA_CTL_SW_TX_PAUSE = 5, 740*4882a593Smuzhiyun PHL_DATA_CTL_SW_RX_PAUSE = 6, 741*4882a593Smuzhiyun PHL_DATA_CTL_SW_TX_RESET = 7, 742*4882a593Smuzhiyun PHL_DATA_CTL_SW_RX_RESET = 8, 743*4882a593Smuzhiyun PHL_DATA_CTL_TRX_SW_PAUSE = 9, 744*4882a593Smuzhiyun PHL_DATA_CTL_TRX_SW_RESUME = 10, 745*4882a593Smuzhiyun PHL_DATA_CTL_TRX_PAUSE_W_RST = 11, 746*4882a593Smuzhiyun PHL_DATA_CTL_TRX_RESUME_W_RST = 12, 747*4882a593Smuzhiyun PHL_DATA_CTL_MAX = 0xFF 748*4882a593Smuzhiyun }; 749*4882a593Smuzhiyun 750*4882a593Smuzhiyun /** 751*4882a593Smuzhiyun * phl_msg - define a general msg format for PHL/CORE layer module to handle 752*4882a593Smuzhiyun * one can easily extend additional mgnt info by encapsulating inside a file 753*4882a593Smuzhiyun * refer to 754*4882a593Smuzhiyun * struct phl_msg_ex in phl_msg_hub.c 755*4882a593Smuzhiyun * struct phl_dispr_msg_ex in phl_cmd_dispatcher.c 756*4882a593Smuzhiyun * 757*4882a593Smuzhiyun * @msg_id: indicate msg source & msg type 758*4882a593Smuzhiyun * BYTE 3: RSVD 759*4882a593Smuzhiyun * BYTE 2: PHL Module ID, refer to enum phl_module_id 760*4882a593Smuzhiyun * BYTE 0-1: event id, refer to enum phl_msg_evt_id 761*4882a593Smuzhiyun * @inbuf: input buffer that sent along with msg 762*4882a593Smuzhiyun * @inlen: input buffer length 763*4882a593Smuzhiyun * @outbuf: output buffer that returned after all phl modules have recved msg. 764*4882a593Smuzhiyun * @outlen: output buffer length 765*4882a593Smuzhiyun * @band_idx: index of Band(PHY) which associate to this msg 766*4882a593Smuzhiyun 767*4882a593Smuzhiyun * @rsvd: feature reserved, passing object pointer. 768*4882a593Smuzhiyun * For example, 769*4882a593Smuzhiyun * - cmd_scan : [0]: wifi_role. 770*4882a593Smuzhiyun * - CANNOT_IO error: [0]: mdl handle. 771*4882a593Smuzhiyun */ 772*4882a593Smuzhiyun struct phl_msg{ 773*4882a593Smuzhiyun u32 msg_id; 774*4882a593Smuzhiyun enum phl_band_idx band_idx; 775*4882a593Smuzhiyun u8* inbuf; 776*4882a593Smuzhiyun u8* outbuf; 777*4882a593Smuzhiyun u32 inlen; 778*4882a593Smuzhiyun u32 outlen; 779*4882a593Smuzhiyun void *rsvd[4]; 780*4882a593Smuzhiyun }; 781*4882a593Smuzhiyun 782*4882a593Smuzhiyun struct msg_notify_map { 783*4882a593Smuzhiyun u8* id_arr; 784*4882a593Smuzhiyun u8 len; 785*4882a593Smuzhiyun }; 786*4882a593Smuzhiyun struct msg_dispatch_seq { 787*4882a593Smuzhiyun struct msg_notify_map map[PHL_MDL_PRI_MAX]; 788*4882a593Smuzhiyun }; 789*4882a593Smuzhiyun struct msg_self_def_seq { 790*4882a593Smuzhiyun struct msg_dispatch_seq pre_prot_phase; 791*4882a593Smuzhiyun struct msg_dispatch_seq post_prot_phase; 792*4882a593Smuzhiyun }; 793*4882a593Smuzhiyun struct msg_completion_routine { 794*4882a593Smuzhiyun void* priv; 795*4882a593Smuzhiyun void (*completion)(void* priv, struct phl_msg* msg); 796*4882a593Smuzhiyun }; 797*4882a593Smuzhiyun /** 798*4882a593Smuzhiyun * phl_msg_attribute: used in phl_disp_eng_send_msg 799*4882a593Smuzhiyun * @opt: refers to enum phl_msg_opt. 800*4882a593Smuzhiyun * @notify: input id array (refer to enum phl_module_id) 801*4882a593Smuzhiyun * for indicating additional dependency 802*4882a593Smuzhiyun * @completion: completion routine 803*4882a593Smuzhiyun */ 804*4882a593Smuzhiyun struct phl_msg_attribute { 805*4882a593Smuzhiyun u8 opt; 806*4882a593Smuzhiyun struct msg_notify_map notify; 807*4882a593Smuzhiyun struct msg_completion_routine completion; 808*4882a593Smuzhiyun #ifdef CONFIG_CMD_DISP_SUPPORT_CUSTOM_SEQ 809*4882a593Smuzhiyun void *dispr_attr; 810*4882a593Smuzhiyun #endif 811*4882a593Smuzhiyun }; 812*4882a593Smuzhiyun 813*4882a593Smuzhiyun /** 814*4882a593Smuzhiyun * phl_module_op_info - set by core layer or phl itself, 815*4882a593Smuzhiyun * op code process is an synchronous process. 816*4882a593Smuzhiyun * which would be handled directly by module handler 817*4882a593Smuzhiyun * @op_code: refer to enum phy_module_opcode 818*4882a593Smuzhiyun * @inbuf: input buffer that sent along with msg 819*4882a593Smuzhiyun * @inlen: input buffer length 820*4882a593Smuzhiyun * @outbuf: output buffer that returned after all phy modules have recved msg. 821*4882a593Smuzhiyun * @outlen: output buffer length 822*4882a593Smuzhiyun */ 823*4882a593Smuzhiyun struct phl_module_op_info{ 824*4882a593Smuzhiyun u32 op_code; 825*4882a593Smuzhiyun u8* inbuf; 826*4882a593Smuzhiyun u8* outbuf; 827*4882a593Smuzhiyun u32 inlen; 828*4882a593Smuzhiyun u32 outlen; 829*4882a593Smuzhiyun }; 830*4882a593Smuzhiyun 831*4882a593Smuzhiyun /** 832*4882a593Smuzhiyun * phl_cmd_token_req - request foramt for applying token of a specific cmd 833*4882a593Smuzhiyun * dispatcher. 834*4882a593Smuzhiyun * cmd token request is regarded as foreground module, thus, 835*4882a593Smuzhiyun * need to contend for cmd token. 836*4882a593Smuzhiyun * Normally, these req would be linked to a specific wifi role 837*4882a593Smuzhiyun * and acquiring RF resource for a specific task. 838*4882a593Smuzhiyun * 839*4882a593Smuzhiyun * @module_id: starting from PHL_FG_MDL_START 840*4882a593Smuzhiyun * @priv: private context from requestor 841*4882a593Smuzhiyun * @role: designated role info associated with current request. 842*4882a593Smuzhiyun * ----------------------------------------- 843*4882a593Smuzhiyun * regarding on "return code" for following ops, refer to enum phl_mdl_ret_code 844*4882a593Smuzhiyun * ----------------------------------------- 845*4882a593Smuzhiyun * @acquired: notify requestor when cmd token has acquired for this cmd and 846*4882a593Smuzhiyun cannot have any I/O operation. 847*4882a593Smuzhiyun * @abort: notify requestor when cmd has been canceled 848*4882a593Smuzhiyun after calling rtw_phl_phy_cancel_token_req and 849*4882a593Smuzhiyun cannot have any I/O operation. 850*4882a593Smuzhiyun * @msg_hdlr: notify requestor about incoming msg. 851*4882a593Smuzhiyun * @set_info: notify requestor to handle specific op code. 852*4882a593Smuzhiyun * @query_info: notify requestor to handle specific op code. 853*4882a593Smuzhiyun */ 854*4882a593Smuzhiyun 855*4882a593Smuzhiyun struct phl_cmd_token_req{ 856*4882a593Smuzhiyun u8 module_id; 857*4882a593Smuzhiyun void* priv; 858*4882a593Smuzhiyun void* role; 859*4882a593Smuzhiyun enum phl_mdl_ret_code (*acquired)(void* dispr, void* priv); 860*4882a593Smuzhiyun enum phl_mdl_ret_code (*abort)(void* dispr, void* priv); 861*4882a593Smuzhiyun enum phl_mdl_ret_code (*msg_hdlr)(void* dispr, void* priv, 862*4882a593Smuzhiyun struct phl_msg* msg); 863*4882a593Smuzhiyun enum phl_mdl_ret_code (*set_info)(void* dispr, void* priv, 864*4882a593Smuzhiyun struct phl_module_op_info* info); 865*4882a593Smuzhiyun enum phl_mdl_ret_code (*query_info)(void* dispr, void* priv, 866*4882a593Smuzhiyun struct phl_module_op_info* info); 867*4882a593Smuzhiyun }; 868*4882a593Smuzhiyun /** 869*4882a593Smuzhiyun * phl_module_ops - standard interface for interacting with a cmd dispatcher. 870*4882a593Smuzhiyun * ----------------------------------------- 871*4882a593Smuzhiyun * regarding on "return code" for following ops, refer to enum phl_mdl_ret_code 872*4882a593Smuzhiyun * ----------------------------------------- 873*4882a593Smuzhiyun * @init: notify module for initialization. 874*4882a593Smuzhiyun * @deinit: notify module for de-initialization. 875*4882a593Smuzhiyun * @start: notify module to start. 876*4882a593Smuzhiyun * @stop: notify module to stop. 877*4882a593Smuzhiyun * @msg_hdlr: notify module about incoming msg. 878*4882a593Smuzhiyun * @set_info: notify module to handle specific op code. 879*4882a593Smuzhiyun * @query_info: notify module to handle specific op code. 880*4882a593Smuzhiyun */ 881*4882a593Smuzhiyun struct phl_bk_module_ops { 882*4882a593Smuzhiyun enum phl_mdl_ret_code (*init)(void* phl_info, void* dispr, void** priv); 883*4882a593Smuzhiyun void (*deinit)(void* dispr, void* priv); 884*4882a593Smuzhiyun enum phl_mdl_ret_code (*start)(void* dispr, void* priv); 885*4882a593Smuzhiyun enum phl_mdl_ret_code (*stop)(void* dispr, void* priv); 886*4882a593Smuzhiyun enum phl_mdl_ret_code (*msg_hdlr)(void* dispr, void* priv, 887*4882a593Smuzhiyun struct phl_msg* msg); 888*4882a593Smuzhiyun enum phl_mdl_ret_code (*set_info)(void* dispr, void* priv, 889*4882a593Smuzhiyun struct phl_module_op_info* info); 890*4882a593Smuzhiyun enum phl_mdl_ret_code (*query_info)(void* dispr, void* priv, 891*4882a593Smuzhiyun struct phl_module_op_info* info); 892*4882a593Smuzhiyun }; 893*4882a593Smuzhiyun 894*4882a593Smuzhiyun /** 895*4882a593Smuzhiyun * phl_data_ctl_t - datapath control parameters for dispatcher controller 896*4882a593Smuzhiyun * @cmd: data path control command 897*4882a593Smuzhiyun * @id: module id which request data path control 898*4882a593Smuzhiyun */ 899*4882a593Smuzhiyun struct phl_data_ctl_t { 900*4882a593Smuzhiyun enum phl_data_ctl_cmd cmd; 901*4882a593Smuzhiyun enum phl_module_id id; 902*4882a593Smuzhiyun }; 903*4882a593Smuzhiyun 904*4882a593Smuzhiyun #define MSG_MDL_ID_FIELD(_msg_id) (((_msg_id) >> 16) & 0xFF) 905*4882a593Smuzhiyun #define MSG_EVT_ID_FIELD(_msg_id) ((_msg_id) & 0xFFFF) 906*4882a593Smuzhiyun #define MSG_INDC_FIELD(_msg_id) (((_msg_id) >> 24) & 0xFF) 907*4882a593Smuzhiyun #define IS_PRIVATE_MSG(_msg_id) ((_msg_id) & PRIVATE_EVT_START) 908*4882a593Smuzhiyun #define IS_MSG_FAIL(_msg_id) ((_msg_id) & ( MSG_INDC_FAIL << 24)) 909*4882a593Smuzhiyun #define IS_MSG_IN_PRE_PHASE(_msg_id) ((_msg_id) & ( MSG_INDC_PRE_PHASE << 24)) 910*4882a593Smuzhiyun #define IS_MSG_CANCEL(_msg_id) ((_msg_id) & ( MSG_INDC_CANCEL << 24)) 911*4882a593Smuzhiyun #define IS_MSG_CANNOT_IO(_msg_id) ((_msg_id) & ( MSG_INDC_CANNOT_IO << 24)) 912*4882a593Smuzhiyun #define SET_MSG_MDL_ID_FIELD(_msg_id, _id) \ 913*4882a593Smuzhiyun ((_msg_id) = (((_msg_id) & 0xFF00FFFF) | ((u32)(_id) << 16))) 914*4882a593Smuzhiyun #define SET_MSG_EVT_ID_FIELD(_msg_id, _id) \ 915*4882a593Smuzhiyun ((_msg_id) = (((_msg_id) & 0xFFFF0000) | (_id))) 916*4882a593Smuzhiyun #define SET_MSG_INDC_FIELD(_msg_id, _indc) \ 917*4882a593Smuzhiyun ((_msg_id) = (((_msg_id) & ~((u32)(_indc) << 24))|((u32)(_indc) << 24))) 918*4882a593Smuzhiyun #define CLEAR_MSG_INDC_FIELD(_msg_id, _indc) ((_msg_id) &= ~((_indc) << 24)) 919*4882a593Smuzhiyun 920*4882a593Smuzhiyun #define RTW_MAX_FW_SIZE 0x400000 921*4882a593Smuzhiyun 922*4882a593Smuzhiyun enum rtw_fw_src { 923*4882a593Smuzhiyun RTW_FW_SRC_INTNAL, /* 0 */ 924*4882a593Smuzhiyun RTW_FW_SRC_EXTNAL, /* 1 */ 925*4882a593Smuzhiyun RTW_FW_SRC_MAX 926*4882a593Smuzhiyun }; 927*4882a593Smuzhiyun 928*4882a593Smuzhiyun enum rtw_fw_rsn { 929*4882a593Smuzhiyun RTW_FW_RSN_INIT, /* 0 */ 930*4882a593Smuzhiyun RTW_FW_RSN_SPIC, /* 1 */ 931*4882a593Smuzhiyun RTW_FW_RSN_LPS, /* 2 */ 932*4882a593Smuzhiyun RTW_FW_RSN_MCC, /* 3 */ 933*4882a593Smuzhiyun RTW_FW_RSN_WOW, /* 4 */ 934*4882a593Smuzhiyun RTW_FW_RSN_MAX 935*4882a593Smuzhiyun }; 936*4882a593Smuzhiyun 937*4882a593Smuzhiyun struct rtw_fw_cap_t { 938*4882a593Smuzhiyun enum rtw_fw_src fw_src; 939*4882a593Smuzhiyun u32 offload_cap; 940*4882a593Smuzhiyun u8 dlram_en; 941*4882a593Smuzhiyun u8 dlrom_en; 942*4882a593Smuzhiyun }; 943*4882a593Smuzhiyun 944*4882a593Smuzhiyun #define INVALID_WIFI_ROLE_IDX MAX_WIFI_ROLE_NUMBER 945*4882a593Smuzhiyun #define UNSPECIFIED_ROLE_ID 0xFF 946*4882a593Smuzhiyun #define MAX_SECCAM_NUM_PER_ENTRY 7 947*4882a593Smuzhiyun 948*4882a593Smuzhiyun /* Role hw TX CAP*/ 949*4882a593Smuzhiyun struct role_cap_t { 950*4882a593Smuzhiyun enum wlan_mode wmode; 951*4882a593Smuzhiyun enum channel_width bw; 952*4882a593Smuzhiyun u8 rty_lmt; /* retry limit for DATA frame, 0xFF: invalid */ 953*4882a593Smuzhiyun u8 rty_lmt_rts; /* retry limit for RTS frame, 0xFF: invalid */ 954*4882a593Smuzhiyun 955*4882a593Smuzhiyun u8 tx_num_ampdu; 956*4882a593Smuzhiyun u8 tx_amsdu_in_ampdu; /*from SW & HW*/ 957*4882a593Smuzhiyun u8 tx_ampdu_len_exp; /*from SW & HW*/ 958*4882a593Smuzhiyun u8 tx_htc; 959*4882a593Smuzhiyun u8 tx_sgi; 960*4882a593Smuzhiyun 961*4882a593Smuzhiyun u8 tx_ht_ldpc:1; 962*4882a593Smuzhiyun u8 tx_vht_ldpc:1; 963*4882a593Smuzhiyun u8 tx_he_ldpc:1; 964*4882a593Smuzhiyun u8 tx_ht_stbc:1; 965*4882a593Smuzhiyun u8 tx_vht_stbc:1; 966*4882a593Smuzhiyun u8 tx_he_stbc:1; 967*4882a593Smuzhiyun 968*4882a593Smuzhiyun u8 supported_rates[12]; 969*4882a593Smuzhiyun }; 970*4882a593Smuzhiyun 971*4882a593Smuzhiyun struct role_sw_cap_t { 972*4882a593Smuzhiyun u16 bf_cap; /* use define : HW_CAP_BFER_XX_XX */ 973*4882a593Smuzhiyun u16 stbc_cap;/* use define: HW_CAP_STBC_XX */ 974*4882a593Smuzhiyun }; 975*4882a593Smuzhiyun 976*4882a593Smuzhiyun /* 977*4882a593Smuzhiyun Protocol - RX CAP from 80211 PKT, 978*4882a593Smuzhiyun driver TX related function need to 979*4882a593Smuzhiyun reference __rx__ of rtw_phl_stainfo_t->asoc_cap 980*4882a593Smuzhiyun */ 981*4882a593Smuzhiyun struct protocol_cap_t { 982*4882a593Smuzhiyun /* MAC related */ 983*4882a593Smuzhiyun u16 bcn_interval; /* beacon interval */ 984*4882a593Smuzhiyun u8 num_ampdu; 985*4882a593Smuzhiyun u8 ampdu_density:3; /* rx ampdu cap */ 986*4882a593Smuzhiyun u8 ampdu_len_exp; /* rx ampdu cap */ 987*4882a593Smuzhiyun u8 amsdu_in_ampdu:1; /* rx ampdu cap */ 988*4882a593Smuzhiyun u8 max_amsdu_len:2; /* 0: 4k, 1: 8k, 2: 11k */ 989*4882a593Smuzhiyun u8 htc_rx:1; 990*4882a593Smuzhiyun u8 sm_ps:2; 991*4882a593Smuzhiyun u8 trig_padding:2; 992*4882a593Smuzhiyun u8 twt:6; 993*4882a593Smuzhiyun u8 all_ack:1; 994*4882a593Smuzhiyun u8 a_ctrl:4; 995*4882a593Smuzhiyun u8 ops:1; 996*4882a593Smuzhiyun u8 ht_vht_trig_rx:1; 997*4882a593Smuzhiyun u8 bsscolor; 998*4882a593Smuzhiyun u16 rts_th:10; 999*4882a593Smuzhiyun 1000*4882a593Smuzhiyun u8 short_slot:1; /* Short Slot Time */ 1001*4882a593Smuzhiyun 1002*4882a593Smuzhiyun u8 preamble:1; /* Preamble, 0: long, 1: short */ 1003*4882a593Smuzhiyun u8 sgi_20:1; /* HT Short GI for 20 MHz */ 1004*4882a593Smuzhiyun u8 sgi_40:1; /* HT Short GI for 40 MHz */ 1005*4882a593Smuzhiyun u8 sgi_80:1; /* VHT Short GI for 80 MHz */ 1006*4882a593Smuzhiyun u8 sgi_160:1; /* VHT Short GI for 160/80+80 MHz */ 1007*4882a593Smuzhiyun struct rtw_edca_param edca[4]; /* Access Category, 0:BE, 1:BK, 2:VI, 3:VO */ 1008*4882a593Smuzhiyun u8 mu_qos_info; 1009*4882a593Smuzhiyun struct rtw_mu_edca_param mu_edca[4]; 1010*4882a593Smuzhiyun 1011*4882a593Smuzhiyun /* BB related */ 1012*4882a593Smuzhiyun u8 ht_ldpc:1; 1013*4882a593Smuzhiyun u8 vht_ldpc:1; 1014*4882a593Smuzhiyun u8 he_ldpc:1; 1015*4882a593Smuzhiyun u8 he_su_bfmr:1; 1016*4882a593Smuzhiyun u8 he_su_bfme:1; 1017*4882a593Smuzhiyun u8 he_mu_bfmr:1; 1018*4882a593Smuzhiyun u8 he_mu_bfme:1; 1019*4882a593Smuzhiyun u8 bfme_sts:3; 1020*4882a593Smuzhiyun u8 num_snd_dim:3; 1021*4882a593Smuzhiyun 1022*4882a593Smuzhiyun u8 ht_su_bfmr:1; 1023*4882a593Smuzhiyun u8 ht_su_bfme:1; 1024*4882a593Smuzhiyun u8 vht_su_bfmr:1; 1025*4882a593Smuzhiyun u8 vht_su_bfme:1; 1026*4882a593Smuzhiyun u8 vht_mu_bfmr:1; 1027*4882a593Smuzhiyun u8 vht_mu_bfme:1; 1028*4882a593Smuzhiyun u8 ht_vht_ng:2; 1029*4882a593Smuzhiyun u8 ht_vht_cb:2; 1030*4882a593Smuzhiyun /* 1031*4882a593Smuzhiyun * supported_rates: Supported data rate of CCK/OFDM. 1032*4882a593Smuzhiyun * The rate definition follow Wi-Fi spec, unit is 500kb/s, 1033*4882a593Smuzhiyun * and the MSB(bit 7) represent basic rate. 1034*4882a593Smuzhiyun * ex. CCK 2Mbps not basic rate is encoded as 0x04, 1035*4882a593Smuzhiyun * and OFDM 6M basic rate is encoded as 0x8c. 1036*4882a593Smuzhiyun * Suppose rates come from Supported Rates and Extended Supported 1037*4882a593Smuzhiyun * Rates IE. 1038*4882a593Smuzhiyun * Value 0 means it is end of array, and no more valid data rate follow. 1039*4882a593Smuzhiyun */ 1040*4882a593Smuzhiyun u8 supported_rates[12]; 1041*4882a593Smuzhiyun u8 ht_rx_mcs[4]; 1042*4882a593Smuzhiyun u8 ht_tx_mcs[4]; 1043*4882a593Smuzhiyun u8 ht_basic_mcs[4]; /* Basic rate of HT */ 1044*4882a593Smuzhiyun u8 vht_rx_mcs[2]; 1045*4882a593Smuzhiyun u8 vht_tx_mcs[2]; 1046*4882a593Smuzhiyun u8 vht_basic_mcs[2]; /* Basic rate of VHT */ 1047*4882a593Smuzhiyun u8 he_rx_mcs[6];/*80,160,80+80*/ 1048*4882a593Smuzhiyun u8 he_tx_mcs[6];/*80,160,80+80*/ 1049*4882a593Smuzhiyun u8 he_basic_mcs[2]; /* Basic rate of HE */ 1050*4882a593Smuzhiyun u8 stbc_ht_rx:2; 1051*4882a593Smuzhiyun u8 stbc_vht_rx:3; 1052*4882a593Smuzhiyun u8 stbc_he_rx:1; 1053*4882a593Smuzhiyun u8 stbc_tx:1; 1054*4882a593Smuzhiyun u8 stbc_ht_tx:1; 1055*4882a593Smuzhiyun u8 stbc_vht_tx:1; 1056*4882a593Smuzhiyun u8 stbc_he_tx:1; 1057*4882a593Smuzhiyun u8 ltf_gi; 1058*4882a593Smuzhiyun u8 doppler_tx:1; 1059*4882a593Smuzhiyun u8 doppler_rx:1; 1060*4882a593Smuzhiyun u8 dcm_max_const_tx:2; 1061*4882a593Smuzhiyun u8 dcm_max_nss_tx:1; 1062*4882a593Smuzhiyun u8 dcm_max_const_rx:2; 1063*4882a593Smuzhiyun u8 dcm_max_nss_rx:1; 1064*4882a593Smuzhiyun u8 partial_bw_su_in_mu:1; 1065*4882a593Smuzhiyun u8 bfme_sts_greater_80mhz:3; 1066*4882a593Smuzhiyun u8 num_snd_dim_greater_80mhz:3; 1067*4882a593Smuzhiyun u8 stbc_tx_greater_80mhz:1; 1068*4882a593Smuzhiyun u8 stbc_rx_greater_80mhz:1; 1069*4882a593Smuzhiyun u8 ng_16_su_fb:1; 1070*4882a593Smuzhiyun u8 ng_16_mu_fb:1; 1071*4882a593Smuzhiyun u8 cb_sz_su_fb:1; 1072*4882a593Smuzhiyun u8 cb_sz_mu_fb:1; 1073*4882a593Smuzhiyun u8 trig_su_bfm_fb:1; 1074*4882a593Smuzhiyun u8 trig_mu_bfm_fb:1; 1075*4882a593Smuzhiyun u8 trig_cqi_fb:1; 1076*4882a593Smuzhiyun u8 partial_bw_su_er:1; 1077*4882a593Smuzhiyun u8 pkt_padding:2; 1078*4882a593Smuzhiyun u8 ppe_thr[8][4]; 1079*4882a593Smuzhiyun u8 pwr_bst_factor:1; 1080*4882a593Smuzhiyun u8 max_nc:3; 1081*4882a593Smuzhiyun u8 dcm_max_ru:2; 1082*4882a593Smuzhiyun u8 long_sigb_symbol:1; 1083*4882a593Smuzhiyun u8 non_trig_cqi_fb:1; 1084*4882a593Smuzhiyun u8 tx_1024q_ru:1; 1085*4882a593Smuzhiyun u8 rx_1024q_ru:1; 1086*4882a593Smuzhiyun u8 fbw_su_using_mu_cmprs_sigb:1; 1087*4882a593Smuzhiyun u8 fbw_su_using_mu_non_cmprs_sigb:1; 1088*4882a593Smuzhiyun u8 er_su:1; 1089*4882a593Smuzhiyun u8 tb_pe:3; 1090*4882a593Smuzhiyun u16 txop_du_rts_th; 1091*4882a593Smuzhiyun u8 he_rx_ndp_4x32:1; 1092*4882a593Smuzhiyun 1093*4882a593Smuzhiyun /* RF related */ 1094*4882a593Smuzhiyun u8 nss_tx:3; 1095*4882a593Smuzhiyun u8 nss_rx:3; 1096*4882a593Smuzhiyun 1097*4882a593Smuzhiyun u8 num_ampdu_bk; 1098*4882a593Smuzhiyun }; 1099*4882a593Smuzhiyun 1100*4882a593Smuzhiyun 1101*4882a593Smuzhiyun 1102*4882a593Smuzhiyun #define LOAD_MAC_REG_FILE BIT0 1103*4882a593Smuzhiyun #define LOAD_BB_PHY_REG_FILE BIT1 1104*4882a593Smuzhiyun #define LOAD_BB_PHY_REG_MP_FILE BIT2 1105*4882a593Smuzhiyun #define LOAD_RF_RADIO_FILE BIT3 1106*4882a593Smuzhiyun #define LOAD_RF_TXPWR_BY_RATE BIT4 1107*4882a593Smuzhiyun #define LOAD_RF_TXPWR_TRACK_FILE BIT5 1108*4882a593Smuzhiyun #define LOAD_RF_TXPWR_LMT_FILE BIT6 1109*4882a593Smuzhiyun #define LOAD_RF_TXPWR_LMT_RU_FILE BIT7 1110*4882a593Smuzhiyun #define LOAD_BB_PHY_REG_GAIN_FILE BIT8 1111*4882a593Smuzhiyun 1112*4882a593Smuzhiyun #define PHL_UNDEFINED_SW_CAP 0xFF 1113*4882a593Smuzhiyun 1114*4882a593Smuzhiyun struct rtw_pcie_ltr_lat_ctrl { 1115*4882a593Smuzhiyun enum rtw_pcie_bus_func_cap_t ctrl; 1116*4882a593Smuzhiyun u32 val; 1117*4882a593Smuzhiyun }; 1118*4882a593Smuzhiyun 1119*4882a593Smuzhiyun enum rtw_pcie_ltr_state { 1120*4882a593Smuzhiyun RTW_PCIE_LTR_SW_ACT = 1, 1121*4882a593Smuzhiyun RTW_PCIE_LTR_SW_IDLE = 2 1122*4882a593Smuzhiyun }; 1123*4882a593Smuzhiyun 1124*4882a593Smuzhiyun struct bus_sw_cap_t { 1125*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI 1126*4882a593Smuzhiyun enum rtw_pcie_bus_func_cap_t l0s_ctrl; 1127*4882a593Smuzhiyun enum rtw_pcie_bus_func_cap_t l1_ctrl; 1128*4882a593Smuzhiyun enum rtw_pcie_bus_func_cap_t l1ss_ctrl; 1129*4882a593Smuzhiyun enum rtw_pcie_bus_func_cap_t wake_ctrl; 1130*4882a593Smuzhiyun enum rtw_pcie_bus_func_cap_t crq_ctrl; 1131*4882a593Smuzhiyun u32 txbd_num; 1132*4882a593Smuzhiyun u32 rxbd_num; 1133*4882a593Smuzhiyun u32 rpbd_num; 1134*4882a593Smuzhiyun u32 rxbuf_num; 1135*4882a593Smuzhiyun u32 rpbuf_num; 1136*4882a593Smuzhiyun u8 clkdly_ctrl; 1137*4882a593Smuzhiyun u8 l0sdly_ctrl; 1138*4882a593Smuzhiyun u8 l1dly_ctrl; 1139*4882a593Smuzhiyun struct rtw_pcie_ltr_lat_ctrl ltr_act; 1140*4882a593Smuzhiyun struct rtw_pcie_ltr_lat_ctrl ltr_idle; 1141*4882a593Smuzhiyun u8 ltr_init_state; 1142*4882a593Smuzhiyun u16 ltr_sw_ctrl_thre; /* [15:8] tx [7:0] rx */ 1143*4882a593Smuzhiyun u8 ltr_sw_ctrl; 1144*4882a593Smuzhiyun u8 ltr_hw_ctrl; 1145*4882a593Smuzhiyun u32 ltr_last_trigger_time; 1146*4882a593Smuzhiyun u32 ltr_sw_act_tri_cnt; 1147*4882a593Smuzhiyun u32 ltr_sw_idle_tri_cnt; 1148*4882a593Smuzhiyun u8 ltr_cur_state; 1149*4882a593Smuzhiyun #elif defined (CONFIG_USB_HCI) 1150*4882a593Smuzhiyun u32 tx_buf_size; 1151*4882a593Smuzhiyun u32 tx_buf_num; 1152*4882a593Smuzhiyun u32 tx_mgnt_buf_size; 1153*4882a593Smuzhiyun u32 tx_mgnt_buf_num; 1154*4882a593Smuzhiyun u32 tx_h2c_buf_num; 1155*4882a593Smuzhiyun u32 rx_buf_size; 1156*4882a593Smuzhiyun u32 rx_buf_num; 1157*4882a593Smuzhiyun u32 in_token_num; 1158*4882a593Smuzhiyun #elif defined(CONFIG_SDIO_HCI) 1159*4882a593Smuzhiyun u16 tx_buf_retry_lmt; 1160*4882a593Smuzhiyun u32 tx_buf_size; 1161*4882a593Smuzhiyun u32 tx_buf_num; 1162*4882a593Smuzhiyun u32 tx_mgnt_buf_size; 1163*4882a593Smuzhiyun u32 tx_mgnt_buf_num; 1164*4882a593Smuzhiyun u32 rx_buf_size; 1165*4882a593Smuzhiyun u32 rx_buf_num; 1166*4882a593Smuzhiyun #else 1167*4882a593Smuzhiyun u8 temp_for_struct_empty; /* for undefined interface */ 1168*4882a593Smuzhiyun #endif 1169*4882a593Smuzhiyun }; 1170*4882a593Smuzhiyun struct bus_cap_t { 1171*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI 1172*4882a593Smuzhiyun enum rtw_pcie_bus_func_cap_t l0s_ctrl; 1173*4882a593Smuzhiyun enum rtw_pcie_bus_func_cap_t l1_ctrl; 1174*4882a593Smuzhiyun enum rtw_pcie_bus_func_cap_t l1ss_ctrl; 1175*4882a593Smuzhiyun enum rtw_pcie_bus_func_cap_t wake_ctrl; 1176*4882a593Smuzhiyun enum rtw_pcie_bus_func_cap_t crq_ctrl; 1177*4882a593Smuzhiyun u32 txbd_num; 1178*4882a593Smuzhiyun u32 rxbd_num; 1179*4882a593Smuzhiyun u32 rpbd_num; 1180*4882a593Smuzhiyun u32 rxbuf_num; 1181*4882a593Smuzhiyun u32 rpbuf_num; 1182*4882a593Smuzhiyun u8 clkdly_ctrl; 1183*4882a593Smuzhiyun u8 l0sdly_ctrl; 1184*4882a593Smuzhiyun u8 l1dly_ctrl; 1185*4882a593Smuzhiyun struct rtw_pcie_ltr_lat_ctrl ltr_act; 1186*4882a593Smuzhiyun struct rtw_pcie_ltr_lat_ctrl ltr_idle; 1187*4882a593Smuzhiyun u8 ltr_init_state; 1188*4882a593Smuzhiyun u8 ltr_sw_ctrl; 1189*4882a593Smuzhiyun u8 ltr_hw_ctrl; 1190*4882a593Smuzhiyun #elif defined (CONFIG_USB_HCI) 1191*4882a593Smuzhiyun u32 tx_buf_size; 1192*4882a593Smuzhiyun u32 tx_buf_num; 1193*4882a593Smuzhiyun u32 tx_mgnt_buf_size; 1194*4882a593Smuzhiyun u32 tx_mgnt_buf_num; 1195*4882a593Smuzhiyun u32 tx_h2c_buf_num; 1196*4882a593Smuzhiyun u32 rx_buf_size; 1197*4882a593Smuzhiyun u32 rx_buf_num; 1198*4882a593Smuzhiyun u32 in_token_num; 1199*4882a593Smuzhiyun #elif defined(CONFIG_SDIO_HCI) 1200*4882a593Smuzhiyun u16 tx_buf_retry_lmt; 1201*4882a593Smuzhiyun u32 tx_buf_size; 1202*4882a593Smuzhiyun u32 tx_buf_num; 1203*4882a593Smuzhiyun u32 tx_mgnt_buf_size; 1204*4882a593Smuzhiyun u32 tx_mgnt_buf_num; 1205*4882a593Smuzhiyun u32 rx_buf_size; 1206*4882a593Smuzhiyun u32 rx_buf_num; 1207*4882a593Smuzhiyun #else 1208*4882a593Smuzhiyun u8 temp_for_struct_empty; /* for undefined interface */ 1209*4882a593Smuzhiyun #endif 1210*4882a593Smuzhiyun }; 1211*4882a593Smuzhiyun 1212*4882a593Smuzhiyun #ifdef CONFIG_PHL_TWT 1213*4882a593Smuzhiyun 1214*4882a593Smuzhiyun #define DELETE_ALL 0xFF 1215*4882a593Smuzhiyun #define IGNORE_CFG_ID 0xFF 1216*4882a593Smuzhiyun #define IGNORE_MACID 0xFF 1217*4882a593Smuzhiyun 1218*4882a593Smuzhiyun enum rtw_phl_twt_sup_cap { 1219*4882a593Smuzhiyun RTW_PHL_TWT_REQ_SUP = BIT(0), /* REQUESTER */ 1220*4882a593Smuzhiyun RTW_PHL_TWT_RSP_SUP = BIT(1)/* RESPONDER */ 1221*4882a593Smuzhiyun }; 1222*4882a593Smuzhiyun 1223*4882a593Smuzhiyun enum rtw_phl_nego_type { 1224*4882a593Smuzhiyun RTW_PHL_INDIV_TWT = 0, /*individual TWT*/ 1225*4882a593Smuzhiyun RTW_PHL_WAKE_TBTT_INR = 1, /*wake TBTT and wake interval*/ 1226*4882a593Smuzhiyun RTW_PHL_BCAST_TWT = 2, /*Broadcast TWT*/ 1227*4882a593Smuzhiyun RTW_PHL_MANAGE_BCAST_TWT = 3 /*Manage memberships in broadcast TWT schedules*/ 1228*4882a593Smuzhiyun }; 1229*4882a593Smuzhiyun 1230*4882a593Smuzhiyun enum rtw_phl_wake_dur_unit{ /*wake duration unit*/ 1231*4882a593Smuzhiyun RTW_PHL_WAKE_256US = 0, 1232*4882a593Smuzhiyun RTW_PHL_WAKE_1TU = 1 1233*4882a593Smuzhiyun }; 1234*4882a593Smuzhiyun 1235*4882a593Smuzhiyun enum rtw_phl_setup_cmd{ 1236*4882a593Smuzhiyun RTW_PHL_REQUEST_TWT = 0, 1237*4882a593Smuzhiyun RTW_PHL_SUGGEST_TWT = 1, 1238*4882a593Smuzhiyun RTW_PHL_DEMAND_TWT = 2, 1239*4882a593Smuzhiyun RTW_PHL_TWT_GROUPING = 3, 1240*4882a593Smuzhiyun RTW_PHL_ACCEPT_TWT = 4, 1241*4882a593Smuzhiyun RTW_PHL_ALTERNATE_TWT = 5, 1242*4882a593Smuzhiyun RTW_PHL_DICTATE_TWT = 6, 1243*4882a593Smuzhiyun RTW_PHL_REJECT_TWT = 7 1244*4882a593Smuzhiyun }; 1245*4882a593Smuzhiyun 1246*4882a593Smuzhiyun enum rtw_phl_flow_type{ 1247*4882a593Smuzhiyun RTW_PHL_ANNOUNCED_TWT = 0, 1248*4882a593Smuzhiyun RTW_PHL_UNANNOUNCED_TWT = 1 1249*4882a593Smuzhiyun }; 1250*4882a593Smuzhiyun 1251*4882a593Smuzhiyun enum rtw_phl_twt_sta_action { 1252*4882a593Smuzhiyun TWT_STA_NONE = 0, 1253*4882a593Smuzhiyun TWT_STA_ADD_MACID = 1, 1254*4882a593Smuzhiyun TWT_STA_DEL_MACID = 2, 1255*4882a593Smuzhiyun TWT_STA_TETMINATW_SP = 3, 1256*4882a593Smuzhiyun TWT_STA_SUSPEND_TWT = 4, 1257*4882a593Smuzhiyun TWT_STA_RESUME_TWT = 5 1258*4882a593Smuzhiyun }; 1259*4882a593Smuzhiyun 1260*4882a593Smuzhiyun enum rtw_phl_twt_cfg_action { 1261*4882a593Smuzhiyun TWT_CFG_ADD = 0, 1262*4882a593Smuzhiyun TWT_CFG_DELETE = 1, 1263*4882a593Smuzhiyun TWT_CFG_MODIFY = 2 1264*4882a593Smuzhiyun }; 1265*4882a593Smuzhiyun 1266*4882a593Smuzhiyun struct rtw_phl_twt_flow_type01 { 1267*4882a593Smuzhiyun u8 twt_flow_id; 1268*4882a593Smuzhiyun u8 teardown_all; 1269*4882a593Smuzhiyun }; 1270*4882a593Smuzhiyun 1271*4882a593Smuzhiyun struct rtw_phl_twt_flow_type2 { 1272*4882a593Smuzhiyun u8 reserved; 1273*4882a593Smuzhiyun }; 1274*4882a593Smuzhiyun 1275*4882a593Smuzhiyun struct rtw_phl_twt_flow_type3 { 1276*4882a593Smuzhiyun u8 bcast_twt_id; 1277*4882a593Smuzhiyun u8 teardown_all; 1278*4882a593Smuzhiyun }; 1279*4882a593Smuzhiyun 1280*4882a593Smuzhiyun struct rtw_phl_twt_flow_field{ 1281*4882a593Smuzhiyun enum rtw_phl_nego_type nego_type; 1282*4882a593Smuzhiyun union { 1283*4882a593Smuzhiyun struct rtw_phl_twt_flow_type01 twt_flow01; 1284*4882a593Smuzhiyun struct rtw_phl_twt_flow_type2 twt_flow2; 1285*4882a593Smuzhiyun struct rtw_phl_twt_flow_type3 twt_flow3; 1286*4882a593Smuzhiyun } info; 1287*4882a593Smuzhiyun }; 1288*4882a593Smuzhiyun 1289*4882a593Smuzhiyun /*phl_twt_setup_info Start*/ 1290*4882a593Smuzhiyun 1291*4882a593Smuzhiyun /*Broadcast TWT Parameter Set field*/ 1292*4882a593Smuzhiyun struct rtw_phl_bcast_twt_para_set{ 1293*4882a593Smuzhiyun u8 reserved; /*todo*/ 1294*4882a593Smuzhiyun }; 1295*4882a593Smuzhiyun 1296*4882a593Smuzhiyun /*Individual TWT Parameter Set field*/ 1297*4882a593Smuzhiyun struct rtw_phl_twt_group_asgmt{ 1298*4882a593Smuzhiyun u8 reserved; /*todo*/ 1299*4882a593Smuzhiyun }; 1300*4882a593Smuzhiyun 1301*4882a593Smuzhiyun struct rtw_phl_req_type_indiv{ 1302*4882a593Smuzhiyun enum rtw_phl_setup_cmd twt_setup_cmd; /*twt setup command*/ 1303*4882a593Smuzhiyun enum rtw_phl_flow_type flow_type; 1304*4882a593Smuzhiyun u8 twt_request; 1305*4882a593Smuzhiyun u8 trigger; 1306*4882a593Smuzhiyun u8 implicit; 1307*4882a593Smuzhiyun u8 twt_flow_id; 1308*4882a593Smuzhiyun u8 twt_wake_int_exp;/*twt wake interval exponent*/ 1309*4882a593Smuzhiyun u8 twt_protection; 1310*4882a593Smuzhiyun }; 1311*4882a593Smuzhiyun 1312*4882a593Smuzhiyun struct rtw_phl_indiv_twt_para_set{ 1313*4882a593Smuzhiyun struct rtw_phl_req_type_indiv req_type; 1314*4882a593Smuzhiyun struct rtw_phl_twt_group_asgmt twt_group_asgmt; /* twt group assignment*/ 1315*4882a593Smuzhiyun u32 target_wake_t_h; /* if contain twt_group_assignment then don't contain target_wake_time*/ 1316*4882a593Smuzhiyun u32 target_wake_t_l; 1317*4882a593Smuzhiyun u16 twt_wake_int_mantissa; /*twt wake interval mantissa*/ 1318*4882a593Smuzhiyun u8 nom_min_twt_wake_dur; /*nominal minimum twt wake duration*/ 1319*4882a593Smuzhiyun u8 twt_channel; 1320*4882a593Smuzhiyun }; 1321*4882a593Smuzhiyun 1322*4882a593Smuzhiyun struct rtw_phl_twt_control{ 1323*4882a593Smuzhiyun enum rtw_phl_nego_type nego_type; /*negotiation type*/ 1324*4882a593Smuzhiyun enum rtw_phl_wake_dur_unit wake_dur_unit; /*wake duration unit*/ 1325*4882a593Smuzhiyun u8 ndp_paging_indic; /*ndp paging indicator*/ 1326*4882a593Smuzhiyun u8 responder_pm_mode; 1327*4882a593Smuzhiyun u8 twt_info_frame_disable; /*twt information frame disable*/ 1328*4882a593Smuzhiyun }; 1329*4882a593Smuzhiyun struct rtw_phl_twt_element{ 1330*4882a593Smuzhiyun /* element info*/ 1331*4882a593Smuzhiyun /*control filed*/ 1332*4882a593Smuzhiyun struct rtw_phl_twt_control twt_ctrl; 1333*4882a593Smuzhiyun /*twt para info*/ 1334*4882a593Smuzhiyun union { 1335*4882a593Smuzhiyun struct rtw_phl_indiv_twt_para_set i_twt_para_set; 1336*4882a593Smuzhiyun struct rtw_phl_bcast_twt_para_set b_twt_para_set; 1337*4882a593Smuzhiyun } info; 1338*4882a593Smuzhiyun }; 1339*4882a593Smuzhiyun 1340*4882a593Smuzhiyun struct rtw_phl_twt_setup_info{ 1341*4882a593Smuzhiyun struct rtw_phl_twt_element twt_element; 1342*4882a593Smuzhiyun //struct rtw_phl_stainfo_t *phl_sta; //sta entry 1343*4882a593Smuzhiyun u8 dialog_token; 1344*4882a593Smuzhiyun }; 1345*4882a593Smuzhiyun /*phl_twt_setup_info End*/ 1346*4882a593Smuzhiyun 1347*4882a593Smuzhiyun 1348*4882a593Smuzhiyun /*phl_twt_info Start*/ 1349*4882a593Smuzhiyun struct rtw_twt_sta_info{ 1350*4882a593Smuzhiyun _os_list list; 1351*4882a593Smuzhiyun struct rtw_phl_stainfo_t *phl_sta; /*sta entry*/ 1352*4882a593Smuzhiyun u8 id; /*twt_flow_identifier or broadcast_twt_id*/ 1353*4882a593Smuzhiyun }; 1354*4882a593Smuzhiyun 1355*4882a593Smuzhiyun struct rtw_phl_twt_info{ 1356*4882a593Smuzhiyun enum rtw_phl_wake_dur_unit wake_dur_unit; 1357*4882a593Smuzhiyun enum rtw_phl_nego_type nego_type; 1358*4882a593Smuzhiyun enum rtw_phl_flow_type flow_type; 1359*4882a593Smuzhiyun u8 twt_id; /*config id*/ 1360*4882a593Smuzhiyun u8 bcast_twt_id; /*ignore in individual TWT*/ 1361*4882a593Smuzhiyun u8 twt_action; 1362*4882a593Smuzhiyun u8 responder_pm_mode; 1363*4882a593Smuzhiyun u8 trigger; 1364*4882a593Smuzhiyun u8 implicit_lastbcast; /*implicit or lastbroadcast*/ 1365*4882a593Smuzhiyun u8 twt_protection; 1366*4882a593Smuzhiyun u8 twt_wake_int_exp; 1367*4882a593Smuzhiyun u8 nom_min_twt_wake_dur; 1368*4882a593Smuzhiyun u16 twt_wake_int_mantissa; 1369*4882a593Smuzhiyun u32 target_wake_time_h; 1370*4882a593Smuzhiyun u32 target_wake_time_l; 1371*4882a593Smuzhiyun }; 1372*4882a593Smuzhiyun 1373*4882a593Smuzhiyun 1374*4882a593Smuzhiyun #endif /* CONFIG_PHL_TWT */ 1375*4882a593Smuzhiyun 1376*4882a593Smuzhiyun 1377*4882a593Smuzhiyun enum rtw_lps_listen_bcn_mode { 1378*4882a593Smuzhiyun RTW_LPS_RLBM_MIN = 0, 1379*4882a593Smuzhiyun RTW_LPS_RLBM_MAX = 1, 1380*4882a593Smuzhiyun RTW_LPS_RLBM_USERDEFINE = 2, 1381*4882a593Smuzhiyun RTW_LPS_LISTEN_BCN_MAX, 1382*4882a593Smuzhiyun }; 1383*4882a593Smuzhiyun 1384*4882a593Smuzhiyun enum rtw_lps_smart_ps_mode { 1385*4882a593Smuzhiyun RTW_LPS_LEGACY_PWR1 = 0, 1386*4882a593Smuzhiyun RTW_LPS_TRX_PWR0 = 1, 1387*4882a593Smuzhiyun RTW_LPS_SMART_PS_MAX, 1388*4882a593Smuzhiyun }; 1389*4882a593Smuzhiyun 1390*4882a593Smuzhiyun struct rtw_wow_cap_t { 1391*4882a593Smuzhiyun u8 magic_sup; 1392*4882a593Smuzhiyun u8 pattern_sup; 1393*4882a593Smuzhiyun u8 ping_pattern_wake_sup; 1394*4882a593Smuzhiyun u8 arp_ofld_sup; 1395*4882a593Smuzhiyun u8 ns_oflod_sup; 1396*4882a593Smuzhiyun u8 gtk_ofld_sup; 1397*4882a593Smuzhiyun u8 nlo_sup; 1398*4882a593Smuzhiyun }; 1399*4882a593Smuzhiyun 1400*4882a593Smuzhiyun /** 1401*4882a593Smuzhiyun * enum phl_ps_leave_fail_act decide the action when leave ps fail 1402*4882a593Smuzhiyun * BIT 0 : reject all subsequent power request 1403*4882a593Smuzhiyun * BIT 1 : trigger L2 reset 1404*4882a593Smuzhiyun */ 1405*4882a593Smuzhiyun enum phl_ps_leave_fail_act { 1406*4882a593Smuzhiyun PS_LEAVE_FAIL_ACT_REJ_PWR = BIT0, 1407*4882a593Smuzhiyun PS_LEAVE_FAIL_ACT_L2 = BIT1 1408*4882a593Smuzhiyun }; 1409*4882a593Smuzhiyun #define PS_LEAVE_FAIL_ACT_NONE 0 1410*4882a593Smuzhiyun 1411*4882a593Smuzhiyun enum phl_ps_operation_mode { 1412*4882a593Smuzhiyun PS_OP_MODE_DISABLED = 0, 1413*4882a593Smuzhiyun PS_OP_MODE_FORCE_ENABLED = 1, 1414*4882a593Smuzhiyun PS_OP_MODE_AUTO = 2 1415*4882a593Smuzhiyun }; 1416*4882a593Smuzhiyun 1417*4882a593Smuzhiyun enum phl_ps_pwr_lvl { 1418*4882a593Smuzhiyun PS_PWR_LVL_PWROFF = 0, /* hal deinit */ 1419*4882a593Smuzhiyun PS_PWR_LVL_PWR_GATED = 1, /* FW control*/ 1420*4882a593Smuzhiyun PS_PWR_LVL_CLK_GATED = 2, /* FW control*/ 1421*4882a593Smuzhiyun PS_PWR_LVL_RF_OFF = 3, /* FW control*/ 1422*4882a593Smuzhiyun PS_PWR_LVL_PWRON = 4, /* hal init */ 1423*4882a593Smuzhiyun PS_PWR_LVL_MAX 1424*4882a593Smuzhiyun }; 1425*4882a593Smuzhiyun 1426*4882a593Smuzhiyun /** 1427*4882a593Smuzhiyun * enum phl_stop_rson record the reason to stop power saving 1428*4882a593Smuzhiyun * BIT 0 : by core initialization setting 1429*4882a593Smuzhiyun * BIT 1 : by debug flow setting 1430*4882a593Smuzhiyun * BIT 2 : by battery change 1431*4882a593Smuzhiyun */ 1432*4882a593Smuzhiyun enum phl_ps_rt_rson { 1433*4882a593Smuzhiyun PS_RT_DEBUG = BIT0, 1434*4882a593Smuzhiyun PS_RT_CORE_INIT = BIT1, 1435*4882a593Smuzhiyun PS_RT_BATTERY_CHG = BIT2, 1436*4882a593Smuzhiyun }; 1437*4882a593Smuzhiyun #define PS_RT_RSON_NONE 0 1438*4882a593Smuzhiyun 1439*4882a593Smuzhiyun #define PS_CAP_PWRON BIT0 1440*4882a593Smuzhiyun #define PS_CAP_RF_OFF BIT1 1441*4882a593Smuzhiyun #define PS_CAP_CLK_GATED BIT2 1442*4882a593Smuzhiyun #define PS_CAP_PWR_GATED BIT3 1443*4882a593Smuzhiyun #define PS_CAP_PWR_OFF BIT4 1444*4882a593Smuzhiyun 1445*4882a593Smuzhiyun /** 1446*4882a593Smuzhiyun * ips_en/lps_en 1447*4882a593Smuzhiyun * refs. structure "phl_ps_operation_mode" 1448*4882a593Smuzhiyun * 0: disable -> disable all ps mechanism 1449*4882a593Smuzhiyun * 1: force enable -> ignore all other condition, force enter ps 1450*4882a593Smuzhiyun * 2: auto -> will be affected by runtime capability set by core 1451*4882a593Smuzhiyun * 1452*4882a593Smuzhiyun * ips_cap/ips_wow_cap/lps_cap/lps_wow_cap are bit defined 1453*4882a593Smuzhiyun * corresponding bit is set if specific power level is supported 1454*4882a593Smuzhiyun * BIT0: Power on 1455*4882a593Smuzhiyun * BIT1: Rf off 1456*4882a593Smuzhiyun * BIT2: Clock gating 1457*4882a593Smuzhiyun * BIT3: Power gating 1458*4882a593Smuzhiyun * BIT4: Power off 1459*4882a593Smuzhiyun */ 1460*4882a593Smuzhiyun struct rtw_ps_cap_t { 1461*4882a593Smuzhiyun /* rf state */ 1462*4882a593Smuzhiyun enum rtw_rf_state init_rf_state; 1463*4882a593Smuzhiyun u8 init_rt_stop_rson; 1464*4882a593Smuzhiyun u8 leave_fail_act; /* action when leave ps fail */ 1465*4882a593Smuzhiyun /* ips */ 1466*4882a593Smuzhiyun u8 ips_en; 1467*4882a593Smuzhiyun u8 ips_cap; 1468*4882a593Smuzhiyun u8 ips_wow_en; 1469*4882a593Smuzhiyun u8 ips_wow_cap; 1470*4882a593Smuzhiyun /* lps */ 1471*4882a593Smuzhiyun u8 lps_en; 1472*4882a593Smuzhiyun u8 lps_cap; 1473*4882a593Smuzhiyun u8 lps_awake_interval; 1474*4882a593Smuzhiyun enum rtw_lps_listen_bcn_mode lps_listen_bcn_mode; 1475*4882a593Smuzhiyun enum rtw_lps_smart_ps_mode lps_smart_ps_mode; 1476*4882a593Smuzhiyun u8 lps_rssi_enter_threshold; 1477*4882a593Smuzhiyun u8 lps_rssi_leave_threshold; 1478*4882a593Smuzhiyun u8 lps_rssi_diff_threshold; 1479*4882a593Smuzhiyun bool lps_pause_tx; 1480*4882a593Smuzhiyun /* wow lps */ 1481*4882a593Smuzhiyun u8 lps_wow_en; 1482*4882a593Smuzhiyun u8 lps_wow_cap; 1483*4882a593Smuzhiyun u8 lps_wow_awake_interval; 1484*4882a593Smuzhiyun enum rtw_lps_listen_bcn_mode lps_wow_listen_bcn_mode; 1485*4882a593Smuzhiyun enum rtw_lps_smart_ps_mode lps_wow_smart_ps_mode; 1486*4882a593Smuzhiyun }; 1487*4882a593Smuzhiyun 1488*4882a593Smuzhiyun struct rtw_edcca_cap_t { 1489*4882a593Smuzhiyun u8 edcca_adap_th_2g; 1490*4882a593Smuzhiyun u8 edcca_adap_th_5g; 1491*4882a593Smuzhiyun 1492*4882a593Smuzhiyun u8 edcca_carrier_sense_th; 1493*4882a593Smuzhiyun }; 1494*4882a593Smuzhiyun 1495*4882a593Smuzhiyun struct phy_sw_cap_t { 1496*4882a593Smuzhiyun struct rtw_para_info_t mac_reg_info; 1497*4882a593Smuzhiyun struct rtw_para_info_t bb_phy_reg_info; 1498*4882a593Smuzhiyun struct rtw_para_info_t bb_phy_reg_mp_info; 1499*4882a593Smuzhiyun struct rtw_para_info_t bb_phy_reg_gain_info; 1500*4882a593Smuzhiyun 1501*4882a593Smuzhiyun struct rtw_para_info_t rf_radio_a_info; 1502*4882a593Smuzhiyun struct rtw_para_info_t rf_radio_b_info; 1503*4882a593Smuzhiyun struct rtw_para_info_t rf_txpwr_byrate_info; 1504*4882a593Smuzhiyun struct rtw_para_info_t rf_txpwrtrack_info; 1505*4882a593Smuzhiyun 1506*4882a593Smuzhiyun struct rtw_para_pwrlmt_info_t rf_txpwrlmt_info; 1507*4882a593Smuzhiyun struct rtw_para_pwrlmt_info_t rf_txpwrlmt_ru_info; 1508*4882a593Smuzhiyun 1509*4882a593Smuzhiyun u8 proto_sup; 1510*4882a593Smuzhiyun u8 band_sup; 1511*4882a593Smuzhiyun u8 bw_sup; 1512*4882a593Smuzhiyun u8 txss; 1513*4882a593Smuzhiyun u8 rxss; 1514*4882a593Smuzhiyun u16 hw_rts_time_th; 1515*4882a593Smuzhiyun u16 hw_rts_len_th; 1516*4882a593Smuzhiyun bool bfreed_para; 1517*4882a593Smuzhiyun }; 1518*4882a593Smuzhiyun 1519*4882a593Smuzhiyun /* final capability of phy */ 1520*4882a593Smuzhiyun struct phy_cap_t { 1521*4882a593Smuzhiyun u8 proto_sup; 1522*4882a593Smuzhiyun u8 band_sup; 1523*4882a593Smuzhiyun u8 bw_sup; 1524*4882a593Smuzhiyun u8 txss; 1525*4882a593Smuzhiyun u8 rxss; 1526*4882a593Smuzhiyun u16 hw_rts_time_th; 1527*4882a593Smuzhiyun u16 hw_rts_len_th; 1528*4882a593Smuzhiyun }; 1529*4882a593Smuzhiyun 1530*4882a593Smuzhiyun /* final capability of device */ 1531*4882a593Smuzhiyun struct dev_cap_t { 1532*4882a593Smuzhiyun u64 hw_sup_flags;/*hw's feature support flags*/ 1533*4882a593Smuzhiyun #ifdef RTW_WKARD_LAMODE 1534*4882a593Smuzhiyun bool la_mode; 1535*4882a593Smuzhiyun #endif 1536*4882a593Smuzhiyun u8 pkg_type; 1537*4882a593Smuzhiyun u8 rfe_type; 1538*4882a593Smuzhiyun u8 bypass_rfe_chk; 1539*4882a593Smuzhiyun u8 xcap; 1540*4882a593Smuzhiyun struct rtw_fw_cap_t fw_cap; 1541*4882a593Smuzhiyun #ifdef CONFIG_MCC_SUPPORT 1542*4882a593Smuzhiyun bool mcc_sup; 1543*4882a593Smuzhiyun #endif 1544*4882a593Smuzhiyun #ifdef CONFIG_DBCC_SUPPORT 1545*4882a593Smuzhiyun bool dbcc_sup; 1546*4882a593Smuzhiyun #endif 1547*4882a593Smuzhiyun #ifdef CONFIG_PHL_TWT 1548*4882a593Smuzhiyun u8 twt_sup; 1549*4882a593Smuzhiyun #endif /* CONFIG_PHL_TWT */ 1550*4882a593Smuzhiyun 1551*4882a593Smuzhiyun struct rtw_wow_cap_t wow_cap; 1552*4882a593Smuzhiyun struct rtw_ps_cap_t ps_cap; 1553*4882a593Smuzhiyun u8 hw_hdr_conv; 1554*4882a593Smuzhiyun u8 domain; 1555*4882a593Smuzhiyun u8 btc_mode; 1556*4882a593Smuzhiyun u8 ap_ps; /* support for AP mode PS in PHL */ 1557*4882a593Smuzhiyun u8 pwrbyrate_off; 1558*4882a593Smuzhiyun u8 pwrlmt_type; 1559*4882a593Smuzhiyun u8 rf_board_opt; 1560*4882a593Smuzhiyun u8 sta_ulru; /* support UL OFDAM for STA mode (reply trigger frame) */ 1561*4882a593Smuzhiyun #ifdef RTW_WKARD_BB_DISABLE_STA_2G40M_ULOFDMA 1562*4882a593Smuzhiyun u8 sta_ulru_2g40mhz; /* when "sta_ulru" is enabled, support UL OFDAM on 2.4G 40MHz ? */ 1563*4882a593Smuzhiyun #endif 1564*4882a593Smuzhiyun u8 tx_mu_ru; 1565*4882a593Smuzhiyun struct rtw_edcca_cap_t edcca_cap; 1566*4882a593Smuzhiyun #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE 1567*4882a593Smuzhiyun bool bfree_para_info; /* keep load file para info buf,default 0*/ 1568*4882a593Smuzhiyun #endif 1569*4882a593Smuzhiyun u8 hw_stype_cap; 1570*4882a593Smuzhiyun u8 wl_func_cap; 1571*4882a593Smuzhiyun u8 rpq_agg_num; /* 0: no adjust, use mac default size: 121 */ 1572*4882a593Smuzhiyun bool quota_turbo; 1573*4882a593Smuzhiyun }; 1574*4882a593Smuzhiyun 1575*4882a593Smuzhiyun #ifdef RTW_PHL_BCN //phl def 1576*4882a593Smuzhiyun 1577*4882a593Smuzhiyun #define BCN_ID_MAX (0xFF) 1578*4882a593Smuzhiyun #define MAX_BCN_SIZE 1000 1579*4882a593Smuzhiyun 1580*4882a593Smuzhiyun enum bcn_offload_flags{ 1581*4882a593Smuzhiyun BCN_HW_SEQ = 0, 1582*4882a593Smuzhiyun BCN_HW_TIM, 1583*4882a593Smuzhiyun 1584*4882a593Smuzhiyun BCN_HW_MAX = 32, 1585*4882a593Smuzhiyun }; 1586*4882a593Smuzhiyun 1587*4882a593Smuzhiyun struct rtw_bcn_info_cmn { 1588*4882a593Smuzhiyun u8 role_idx; 1589*4882a593Smuzhiyun u8 bcn_id; 1590*4882a593Smuzhiyun u8 bcn_added; 1591*4882a593Smuzhiyun 1592*4882a593Smuzhiyun u8 bssid[6]; 1593*4882a593Smuzhiyun u32 bcn_interval; 1594*4882a593Smuzhiyun 1595*4882a593Smuzhiyun u8 bcn_buf[MAX_BCN_SIZE]; 1596*4882a593Smuzhiyun u32 bcn_length; 1597*4882a593Smuzhiyun u32 bcn_rate; 1598*4882a593Smuzhiyun 1599*4882a593Smuzhiyun u32 bcn_dtim; 1600*4882a593Smuzhiyun u32 ie_offset_tim; 1601*4882a593Smuzhiyun 1602*4882a593Smuzhiyun u32 bcn_offload; 1603*4882a593Smuzhiyun }; 1604*4882a593Smuzhiyun 1605*4882a593Smuzhiyun struct rtw_bcn_info_hw { 1606*4882a593Smuzhiyun u8 band; 1607*4882a593Smuzhiyun u8 port; 1608*4882a593Smuzhiyun u8 mbssid; 1609*4882a593Smuzhiyun u8 mac_id; 1610*4882a593Smuzhiyun }; 1611*4882a593Smuzhiyun 1612*4882a593Smuzhiyun struct rtw_bcn_entry { 1613*4882a593Smuzhiyun _os_list list; 1614*4882a593Smuzhiyun struct rtw_bcn_info_cmn *bcn_cmn; //fill by core 1615*4882a593Smuzhiyun struct rtw_bcn_info_hw bcn_hw; //fill by phl //?? void mapping ?? for 8852, 8834 ...blabla 1616*4882a593Smuzhiyun }; 1617*4882a593Smuzhiyun #endif 1618*4882a593Smuzhiyun 1619*4882a593Smuzhiyun struct rtw_phl_com_t; 1620*4882a593Smuzhiyun 1621*4882a593Smuzhiyun struct phl_msg_receiver { 1622*4882a593Smuzhiyun void* priv; 1623*4882a593Smuzhiyun void (*incoming_evt_notify)(void* priv, struct phl_msg *msg); 1624*4882a593Smuzhiyun }; 1625*4882a593Smuzhiyun 1626*4882a593Smuzhiyun #ifdef CONFIG_PHL_P2PPS 1627*4882a593Smuzhiyun 1628*4882a593Smuzhiyun #define MAX_NOA_DESC 5 1629*4882a593Smuzhiyun #define NOAID_NONE 0xFF 1630*4882a593Smuzhiyun 1631*4882a593Smuzhiyun enum p2pps_trig_tag { 1632*4882a593Smuzhiyun P2PPS_TRIG_GO = 0, 1633*4882a593Smuzhiyun P2PPS_TRIG_GC = 1, 1634*4882a593Smuzhiyun P2PPS_TRIG_GC_255 = 2, 1635*4882a593Smuzhiyun P2PPS_TRIG_MCC = 3, 1636*4882a593Smuzhiyun P2PPS_TRIG_2G_SCC_1AP_1STA_BT = 4, 1637*4882a593Smuzhiyun P2PPS_TRIG_MAX = MAX_NOA_DESC 1638*4882a593Smuzhiyun }; 1639*4882a593Smuzhiyun 1640*4882a593Smuzhiyun struct rtw_phl_noa_desc { 1641*4882a593Smuzhiyun u8 enable; /*false=disable, true=enable*/ 1642*4882a593Smuzhiyun struct rtw_wifi_role_t *w_role; 1643*4882a593Smuzhiyun enum p2pps_trig_tag tag; 1644*4882a593Smuzhiyun u32 start_t_h; 1645*4882a593Smuzhiyun u32 start_t_l; 1646*4882a593Smuzhiyun u32 interval; 1647*4882a593Smuzhiyun u32 duration; 1648*4882a593Smuzhiyun u8 count; 1649*4882a593Smuzhiyun u8 noa_id; /*filed by phl noa module*/ 1650*4882a593Smuzhiyun }; 1651*4882a593Smuzhiyun 1652*4882a593Smuzhiyun struct rtw_phl_opps_desc { 1653*4882a593Smuzhiyun u16 ctw; 1654*4882a593Smuzhiyun u8 all_slep; 1655*4882a593Smuzhiyun }; 1656*4882a593Smuzhiyun 1657*4882a593Smuzhiyun struct rtw_phl_tsf32_tog_rpt{ 1658*4882a593Smuzhiyun u8 band; 1659*4882a593Smuzhiyun u8 port; 1660*4882a593Smuzhiyun u8 valid; 1661*4882a593Smuzhiyun u16 early; 1662*4882a593Smuzhiyun u16 status; 1663*4882a593Smuzhiyun u32 tsf_l; 1664*4882a593Smuzhiyun u32 tsf_h; 1665*4882a593Smuzhiyun }; 1666*4882a593Smuzhiyun 1667*4882a593Smuzhiyun struct rtw_phl_p2pps_ops { 1668*4882a593Smuzhiyun void *priv; /* ops private, define by core layer*/ 1669*4882a593Smuzhiyun void (*tsf32_tog_update_noa)(void *priv, struct rtw_wifi_role_t *w_role, 1670*4882a593Smuzhiyun struct rtw_phl_tsf32_tog_rpt *rpt); 1671*4882a593Smuzhiyun void (*tsf32_tog_update_single_noa)(void *priv, 1672*4882a593Smuzhiyun struct rtw_wifi_role_t *w_role, 1673*4882a593Smuzhiyun struct rtw_phl_noa_desc *desc); 1674*4882a593Smuzhiyun }; 1675*4882a593Smuzhiyun 1676*4882a593Smuzhiyun 1677*4882a593Smuzhiyun #endif 1678*4882a593Smuzhiyun 1679*4882a593Smuzhiyun struct rtw_wifi_role_t { 1680*4882a593Smuzhiyun struct rtw_phl_com_t *phl_com;/*point to phl_com*/ 1681*4882a593Smuzhiyun #ifdef RTW_WKARD_ROLE_TYPE 1682*4882a593Smuzhiyun enum role_type real_type; 1683*4882a593Smuzhiyun #endif /* RTW_WKARD_ROLE_TYPE */ 1684*4882a593Smuzhiyun enum role_type type;/*will mapping to net type*/ 1685*4882a593Smuzhiyun enum role_type target_type; 1686*4882a593Smuzhiyun #ifdef RTW_WKARD_PHL_NTFY_MEDIA_STS 1687*4882a593Smuzhiyun bool is_gc; 1688*4882a593Smuzhiyun #endif 1689*4882a593Smuzhiyun enum mlme_state mstate; 1690*4882a593Smuzhiyun bool active; 1691*4882a593Smuzhiyun enum wr_status status; 1692*4882a593Smuzhiyun u8 id;/* recode role_idx in phl_com */ 1693*4882a593Smuzhiyun u8 hw_wmm; /*HW EDCA - wmm0 or wmm1*/ 1694*4882a593Smuzhiyun #ifdef RTW_WKARD_HW_WMM_ALLOCATE 1695*4882a593Smuzhiyun _os_atomic hw_wmm0_ref_cnt; 1696*4882a593Smuzhiyun #endif 1697*4882a593Smuzhiyun u8 mac_addr[MAC_ALEN]; 1698*4882a593Smuzhiyun u8 hw_band; /*MAC Band0 or Band1*/ 1699*4882a593Smuzhiyun u8 hw_port; /*MAC HW Port*/ 1700*4882a593Smuzhiyun /* 1701*4882a593Smuzhiyun * final protocol capability of role from intersection of 1702*4882a593Smuzhiyun * sw role cap, sw protocol cap and hw protocol cap 1703*4882a593Smuzhiyun */ 1704*4882a593Smuzhiyun struct protocol_cap_t proto_role_cap; 1705*4882a593Smuzhiyun 1706*4882a593Smuzhiyun /* 1707*4882a593Smuzhiyun * final capability of role from intersection of 1708*4882a593Smuzhiyun * sw role cap, final phy cap and final dev cap 1709*4882a593Smuzhiyun */ 1710*4882a593Smuzhiyun struct role_cap_t cap; 1711*4882a593Smuzhiyun 1712*4882a593Smuzhiyun /*#ifdef CONFIG_AP*/ 1713*4882a593Smuzhiyun #ifdef RTW_PHL_BCN 1714*4882a593Smuzhiyun struct rtw_bcn_info_cmn bcn_cmn; //todo: ieee mbssid case & multi-bcn (in one iface) case 1715*4882a593Smuzhiyun u8 hw_mbssid; 1716*4882a593Smuzhiyun #endif 1717*4882a593Smuzhiyun u8 dtim_period; 1718*4882a593Smuzhiyun u8 mbid_num; 1719*4882a593Smuzhiyun u32 hiq_win; 1720*4882a593Smuzhiyun /*#endif CONFIG_AP*/ 1721*4882a593Smuzhiyun 1722*4882a593Smuzhiyun struct rtw_chan_def chandef; 1723*4882a593Smuzhiyun struct rtw_chan_ctx *chanctx;/*point to chanctx*/ 1724*4882a593Smuzhiyun 1725*4882a593Smuzhiyun struct phl_queue assoc_sta_queue; 1726*4882a593Smuzhiyun 1727*4882a593Smuzhiyun #ifdef CONFIG_PHL_TWT 1728*4882a593Smuzhiyun struct rtw_phl_twt_setup_info twt_setup_info; 1729*4882a593Smuzhiyun #endif /* CONFIG_PHL_TWT */ 1730*4882a593Smuzhiyun 1731*4882a593Smuzhiyun #ifdef CONFIG_PHL_P2PPS 1732*4882a593Smuzhiyun struct rtw_phl_noa_desc noa_desc[MAX_NOA_DESC]; 1733*4882a593Smuzhiyun #endif 1734*4882a593Smuzhiyun 1735*4882a593Smuzhiyun void *core_data; /* Track back to counter part in core layer */ 1736*4882a593Smuzhiyun #ifdef RTW_WKARD_BFEE_SET_AID 1737*4882a593Smuzhiyun u16 last_set_aid; 1738*4882a593Smuzhiyun #endif 1739*4882a593Smuzhiyun }; 1740*4882a593Smuzhiyun 1741*4882a593Smuzhiyun #define TXTP_CALC_DIFF_MS 1000 1742*4882a593Smuzhiyun #define RXTP_CALC_DIFF_MS 1000 1743*4882a593Smuzhiyun 1744*4882a593Smuzhiyun #define TX_ULTRA_LOW_TP_THRES_KBPS 100 1745*4882a593Smuzhiyun #define RX_ULTRA_LOW_TP_THRES_KBPS 100 1746*4882a593Smuzhiyun #define TX_LOW_TP_THRES_MBPS 2 1747*4882a593Smuzhiyun #define RX_LOW_TP_THRES_MBPS 2 1748*4882a593Smuzhiyun #define TX_MID_TP_THRES_MBPS 10 1749*4882a593Smuzhiyun #define RX_MID_TP_THRES_MBPS 10 1750*4882a593Smuzhiyun #define TX_HIGH_TP_THRES_MBPS 50 1751*4882a593Smuzhiyun #define RX_HIGH_TP_THRES_MBPS 50 1752*4882a593Smuzhiyun 1753*4882a593Smuzhiyun 1754*4882a593Smuzhiyun enum rtw_tfc_lvl { 1755*4882a593Smuzhiyun RTW_TFC_IDLE = 0, 1756*4882a593Smuzhiyun RTW_TFC_ULTRA_LOW = 1, 1757*4882a593Smuzhiyun RTW_TFC_LOW = 2, 1758*4882a593Smuzhiyun RTW_TFC_MID = 3, 1759*4882a593Smuzhiyun RTW_TFC_HIGH = 4, 1760*4882a593Smuzhiyun RTW_TFC_LVL_MAX = 0xFF 1761*4882a593Smuzhiyun }; 1762*4882a593Smuzhiyun 1763*4882a593Smuzhiyun enum rtw_tfc_sts { 1764*4882a593Smuzhiyun TRAFFIC_CHANGED = BIT0, 1765*4882a593Smuzhiyun TRAFFIC_INCREASE = BIT1, 1766*4882a593Smuzhiyun TRAFFIC_DECREASE = BIT2, 1767*4882a593Smuzhiyun TRAFFIC_STS_MAX = BIT7 1768*4882a593Smuzhiyun }; 1769*4882a593Smuzhiyun 1770*4882a593Smuzhiyun struct rtw_traffic_t { 1771*4882a593Smuzhiyun enum rtw_tfc_lvl lvl; 1772*4882a593Smuzhiyun enum rtw_tfc_sts sts; 1773*4882a593Smuzhiyun }; 1774*4882a593Smuzhiyun 1775*4882a593Smuzhiyun struct rtw_stats_tp { 1776*4882a593Smuzhiyun u64 last_calc_bits; 1777*4882a593Smuzhiyun u32 last_calc_time_ms; 1778*4882a593Smuzhiyun }; 1779*4882a593Smuzhiyun /*statistic*/ 1780*4882a593Smuzhiyun struct rtw_stats { 1781*4882a593Smuzhiyun u64 tx_byte_uni;/*unicast tx byte*/ 1782*4882a593Smuzhiyun u64 rx_byte_uni;/*unicast rx byte*/ 1783*4882a593Smuzhiyun u64 tx_byte_total; 1784*4882a593Smuzhiyun u64 rx_byte_total; 1785*4882a593Smuzhiyun u32 tx_tp_kbits; 1786*4882a593Smuzhiyun u32 rx_tp_kbits; 1787*4882a593Smuzhiyun u16 tx_moving_average_tp; /* tx average MBps*/ 1788*4882a593Smuzhiyun u16 rx_moving_average_tp; /* rx average MBps*/ 1789*4882a593Smuzhiyun u32 last_tx_time_ms; 1790*4882a593Smuzhiyun u32 last_rx_time_ms; 1791*4882a593Smuzhiyun u32 txreq_num; 1792*4882a593Smuzhiyun u32 rx_rate; 1793*4882a593Smuzhiyun u32 rx_rate_nmr[RTW_DATA_RATE_HE_NSS4_MCS11 +1]; 1794*4882a593Smuzhiyun u64 ser_event[8]; /* RTW_PHL_SER_MAX */ 1795*4882a593Smuzhiyun struct rtw_stats_tp txtp; 1796*4882a593Smuzhiyun struct rtw_stats_tp rxtp; 1797*4882a593Smuzhiyun struct rtw_traffic_t tx_traffic; 1798*4882a593Smuzhiyun struct rtw_traffic_t rx_traffic; 1799*4882a593Smuzhiyun u32 rx_tf_cnt; /* rx trigger frame number (accumulated, only reset in disconnect) */ 1800*4882a593Smuzhiyun u32 pre_rx_tf_cnt; /* last record rx trigger frame number from BB */ 1801*4882a593Smuzhiyun }; 1802*4882a593Smuzhiyun enum sta_chg_id { 1803*4882a593Smuzhiyun STA_CHG_BW, 1804*4882a593Smuzhiyun STA_CHG_NSS, 1805*4882a593Smuzhiyun STA_CHG_RAMASK, 1806*4882a593Smuzhiyun STA_CHG_SEC_MODE, 1807*4882a593Smuzhiyun STA_CHG_MBSSID, 1808*4882a593Smuzhiyun STA_CHG_RA_GILTF, 1809*4882a593Smuzhiyun STA_CHG_MAX 1810*4882a593Smuzhiyun }; 1811*4882a593Smuzhiyun 1812*4882a593Smuzhiyun enum phl_upd_mode { 1813*4882a593Smuzhiyun PHL_UPD_ROLE_CREATE, 1814*4882a593Smuzhiyun PHL_UPD_ROLE_REMOVE, 1815*4882a593Smuzhiyun PHL_UPD_ROLE_TYPE_CHANGE, 1816*4882a593Smuzhiyun PHL_UPD_ROLE_INFO_CHANGE, 1817*4882a593Smuzhiyun PHL_UPD_STA_INFO_CHANGE, 1818*4882a593Smuzhiyun PHL_UPD_STA_CON_DISCONN, 1819*4882a593Smuzhiyun PHL_UPD_ROLE_MAX 1820*4882a593Smuzhiyun }; 1821*4882a593Smuzhiyun 1822*4882a593Smuzhiyun #ifdef CONFIG_PHL_TXSC 1823*4882a593Smuzhiyun #define PHL_TXSC_ENTRY_NUM 8 1824*4882a593Smuzhiyun #define MAX_WD_SIZE 128 1825*4882a593Smuzhiyun 1826*4882a593Smuzhiyun struct phl_txsc_entry { 1827*4882a593Smuzhiyun bool txsc_wd_cached; 1828*4882a593Smuzhiyun u8 txsc_wd_cache[MAX_WD_SIZE]; 1829*4882a593Smuzhiyun u8 txsc_wd_len; 1830*4882a593Smuzhiyun u32 txsc_cache_hit; 1831*4882a593Smuzhiyun }; 1832*4882a593Smuzhiyun #endif 1833*4882a593Smuzhiyun 1834*4882a593Smuzhiyun struct rtw_hal_stainfo_t; 1835*4882a593Smuzhiyun struct rtw_phl_stainfo_t { 1836*4882a593Smuzhiyun _os_list list; 1837*4882a593Smuzhiyun struct rtw_wifi_role_t *wrole; 1838*4882a593Smuzhiyun bool active; 1839*4882a593Smuzhiyun u16 aid; 1840*4882a593Smuzhiyun u16 macid; 1841*4882a593Smuzhiyun u8 mac_addr[MAC_ALEN]; 1842*4882a593Smuzhiyun 1843*4882a593Smuzhiyun struct rtw_chan_def chandef; 1844*4882a593Smuzhiyun struct rtw_stats stats; 1845*4882a593Smuzhiyun enum wlan_mode wmode; 1846*4882a593Smuzhiyun 1847*4882a593Smuzhiyun /*mlme protocol or MAC related CAP*/ 1848*4882a593Smuzhiyun u8 bcn_hit_cond; 1849*4882a593Smuzhiyun u8 hit_rule; 1850*4882a593Smuzhiyun u8 tf_trs; 1851*4882a593Smuzhiyun u8 tgt_ind; 1852*4882a593Smuzhiyun u8 frm_tgt_ind; 1853*4882a593Smuzhiyun u8 addr_sel; 1854*4882a593Smuzhiyun u8 addr_msk; 1855*4882a593Smuzhiyun 1856*4882a593Smuzhiyun /* rx agg */ 1857*4882a593Smuzhiyun struct phl_tid_ampdu_rx *tid_rx[RTW_MAX_TID_NUM]; /* TID_MAX_NUM */ 1858*4882a593Smuzhiyun _os_lock tid_rx_lock; /* guarding @tid_rx */ 1859*4882a593Smuzhiyun _os_event comp_sync; /* reorder timer completion event */ 1860*4882a593Smuzhiyun _os_timer reorder_timer; /* reorder timer for all @tid_rx of the 1861*4882a593Smuzhiyun * stainfo */ 1862*4882a593Smuzhiyun /* TODO: add missing part */ 1863*4882a593Smuzhiyun 1864*4882a593Smuzhiyun /*mlme protocol or PHY related CAP*/ 1865*4882a593Smuzhiyun struct protocol_cap_t asoc_cap; 1866*4882a593Smuzhiyun enum rtw_protect_mode protect; 1867*4882a593Smuzhiyun 1868*4882a593Smuzhiyun /*security related*/ 1869*4882a593Smuzhiyun u8 wapi; 1870*4882a593Smuzhiyun u8 sec_mode; 1871*4882a593Smuzhiyun 1872*4882a593Smuzhiyun /* 1873*4882a593Smuzhiyun * STA powersave, those could be implemented as bit flags but there's no 1874*4882a593Smuzhiyun * corresponding atomic bit operations available on Windows. 1875*4882a593Smuzhiyun */ 1876*4882a593Smuzhiyun _os_atomic ps_sta; /* the sta is in PS mode or not */ 1877*4882a593Smuzhiyun 1878*4882a593Smuzhiyun struct rtw_hal_stainfo_t *hal_sta; 1879*4882a593Smuzhiyun 1880*4882a593Smuzhiyun #ifdef CONFIG_PHL_TXSC 1881*4882a593Smuzhiyun struct phl_txsc_entry phl_txsc[PHL_TXSC_ENTRY_NUM]; 1882*4882a593Smuzhiyun #endif 1883*4882a593Smuzhiyun struct rtw_rx_bcn_info bcn_i; 1884*4882a593Smuzhiyun void *core_data; /* Track back to counter part in core layer */ 1885*4882a593Smuzhiyun }; 1886*4882a593Smuzhiyun 1887*4882a593Smuzhiyun 1888*4882a593Smuzhiyun 1889*4882a593Smuzhiyun 1890*4882a593Smuzhiyun #define WL_FUNC_P2P BIT0 1891*4882a593Smuzhiyun #define WL_FUNC_MIRACAST BIT1 1892*4882a593Smuzhiyun #define WL_FUNC_TDLS BIT2 1893*4882a593Smuzhiyun #define WL_FUNC_FTM BIT3 1894*4882a593Smuzhiyun #define WL_FUNC_BIT_NUM 4 1895*4882a593Smuzhiyun 1896*4882a593Smuzhiyun 1897*4882a593Smuzhiyun /* HW MAC capability*/ 1898*4882a593Smuzhiyun #define HW_SUP_DBCC BIT0 1899*4882a593Smuzhiyun #define HW_SUP_AMSDU BIT1 1900*4882a593Smuzhiyun #define HW_SUP_TCP_TX_CHKSUM BIT2 1901*4882a593Smuzhiyun #define HW_SUP_TCP_RX_CHKSUM BIT3 1902*4882a593Smuzhiyun #define HW_SUP_TXPKT_CONVR BIT4 1903*4882a593Smuzhiyun #define HW_SUP_RXPKT_CONVR BIT5 1904*4882a593Smuzhiyun #define HW_SUP_MULTI_BSSID BIT6 1905*4882a593Smuzhiyun #define HW_SUP_OFDMA BIT7 1906*4882a593Smuzhiyun #define HW_SUP_CHAN_INFO BIT8 1907*4882a593Smuzhiyun #define HW_SUP_TSSI BIT9 1908*4882a593Smuzhiyun #define HW_SUP_TANK_K BIT10 1909*4882a593Smuzhiyun 1910*4882a593Smuzhiyun /*BUS Section CAP */ 1911*4882a593Smuzhiyun #define HW_SUP_PCIE_PLFH BIT20 /*payload from host*/ 1912*4882a593Smuzhiyun #define HW_SUP_USB_MULTI_FUN BIT21 1913*4882a593Smuzhiyun #define HW_SUP_SDIO_MULTI_FUN BIT22 1914*4882a593Smuzhiyun 1915*4882a593Smuzhiyun /* Beamform CAP */ 1916*4882a593Smuzhiyun #define HW_CAP_BF_NON_SUPPORT 0 1917*4882a593Smuzhiyun #define HW_CAP_BFEE_HT_SU BIT(0) 1918*4882a593Smuzhiyun #define HW_CAP_BFER_HT_SU BIT(1) 1919*4882a593Smuzhiyun #define HW_CAP_BFEE_VHT_SU BIT(2) 1920*4882a593Smuzhiyun #define HW_CAP_BFER_VHT_SU BIT(3) 1921*4882a593Smuzhiyun #define HW_CAP_BFEE_VHT_MU BIT(4) 1922*4882a593Smuzhiyun #define HW_CAP_BFER_VHT_MU BIT(5) 1923*4882a593Smuzhiyun #define HW_CAP_BFEE_HE_SU BIT(6) 1924*4882a593Smuzhiyun #define HW_CAP_BFER_HE_SU BIT(7) 1925*4882a593Smuzhiyun #define HW_CAP_BFEE_HE_MU BIT(8) 1926*4882a593Smuzhiyun #define HW_CAP_BFER_HE_MU BIT(9) 1927*4882a593Smuzhiyun #define HW_CAP_HE_NON_TB_CQI BIT(10) 1928*4882a593Smuzhiyun #define HW_CAP_HE_TB_CQI BIT(11) 1929*4882a593Smuzhiyun 1930*4882a593Smuzhiyun #define RTW_HW_CAP_ULRU_AUTO 0 1931*4882a593Smuzhiyun #define RTW_HW_CAP_ULRU_DISABLE 1 1932*4882a593Smuzhiyun #define RTW_HW_CAP_ULRU_ENABLE 2 1933*4882a593Smuzhiyun 1934*4882a593Smuzhiyun /* STBC CAP */ 1935*4882a593Smuzhiyun #define HW_CAP_STBC_HT_TX BIT(0) 1936*4882a593Smuzhiyun #define HW_CAP_STBC_VHT_TX BIT(1) 1937*4882a593Smuzhiyun #define HW_CAP_STBC_HE_TX BIT(2) 1938*4882a593Smuzhiyun #define HW_CAP_STBC_HE_TX_GT_80M BIT(3) 1939*4882a593Smuzhiyun #define HW_CAP_STBC_HT_RX BIT(4) 1940*4882a593Smuzhiyun #define HW_CAP_STBC_VHT_RX BIT(5) 1941*4882a593Smuzhiyun #define HW_CAP_STBC_HE_RX BIT(6) 1942*4882a593Smuzhiyun #define HW_CAP_STBC_HE_RX_GT_80M BIT(7) 1943*4882a593Smuzhiyun 1944*4882a593Smuzhiyun struct hal_spec_t { 1945*4882a593Smuzhiyun char *ic_name; 1946*4882a593Smuzhiyun u16 macid_num; 1947*4882a593Smuzhiyun 1948*4882a593Smuzhiyun u8 sec_cam_ent_num; 1949*4882a593Smuzhiyun u8 sec_cap; 1950*4882a593Smuzhiyun u8 wow_cap; 1951*4882a593Smuzhiyun 1952*4882a593Smuzhiyun u8 rfpath_num_2g:4; /* used for tx power index path */ 1953*4882a593Smuzhiyun u8 rfpath_num_5g:4; /* used for tx power index path */ 1954*4882a593Smuzhiyun u8 rf_reg_path_num; 1955*4882a593Smuzhiyun u8 max_tx_cnt; 1956*4882a593Smuzhiyun 1957*4882a593Smuzhiyun u8 band_cap; /* value of BAND_CAP_XXX */ 1958*4882a593Smuzhiyun u8 bw_cap; /* value of BW_CAP_XXX */ 1959*4882a593Smuzhiyun u8 port_num; 1960*4882a593Smuzhiyun u8 wmm_num; 1961*4882a593Smuzhiyun u8 proto_cap; /* value of PROTO_CAP_XXX */ 1962*4882a593Smuzhiyun u8 wl_func; /* value of WL_FUNC_XXX */ 1963*4882a593Smuzhiyun 1964*4882a593Smuzhiyun /********* xmit ************/ 1965*4882a593Smuzhiyun 1966*4882a593Smuzhiyun 1967*4882a593Smuzhiyun /********* recv ************/ 1968*4882a593Smuzhiyun u8 rx_bd_info_sz; 1969*4882a593Smuzhiyun 1970*4882a593Smuzhiyun u16 rx_tag[2]; 1971*4882a593Smuzhiyun #ifdef CONFIG_USB_HCI 1972*4882a593Smuzhiyun u8 max_bulkin_num; 1973*4882a593Smuzhiyun u8 max_bulkout_num; 1974*4882a593Smuzhiyun #endif 1975*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI 1976*4882a593Smuzhiyun u16 txbd_multi_tag; 1977*4882a593Smuzhiyun u8 txbd_upd_lmt; 1978*4882a593Smuzhiyun #ifdef RTW_WKARD_BUSCAP_IN_HALSPEC 1979*4882a593Smuzhiyun u8 phyaddr_num; 1980*4882a593Smuzhiyun #endif 1981*4882a593Smuzhiyun #endif 1982*4882a593Smuzhiyun u8 cts2_thres_en; 1983*4882a593Smuzhiyun u16 cts2_thres; 1984*4882a593Smuzhiyun /********* beamformer ************/ 1985*4882a593Smuzhiyun u8 max_csi_buf_su_nr; 1986*4882a593Smuzhiyun u8 max_csi_buf_mu_nr; 1987*4882a593Smuzhiyun u8 max_bf_ent_nr; 1988*4882a593Smuzhiyun u8 max_su_sta_nr; 1989*4882a593Smuzhiyun u8 max_mu_sta_nr; 1990*4882a593Smuzhiyun 1991*4882a593Smuzhiyun }; 1992*4882a593Smuzhiyun 1993*4882a593Smuzhiyun #define phl_get_hci_type(_phlcom) (_phlcom->hci_type) 1994*4882a593Smuzhiyun #define phl_get_ic_spec(_phlcom) (&_phlcom->hal_spec) 1995*4882a593Smuzhiyun #define phl_get_fw_buf(_phlcom) (_phlcom->fw_info.ram_buff) 1996*4882a593Smuzhiyun #define phl_get_fw_size(_phlcom) (_phlcom->fw_info.ram_size) 1997*4882a593Smuzhiyun 1998*4882a593Smuzhiyun enum rtw_drv_mode { 1999*4882a593Smuzhiyun RTW_DRV_MODE_NORMAL = 0, 2000*4882a593Smuzhiyun RTW_DRV_MODE_EQC = 1, 2001*4882a593Smuzhiyun RTW_DRV_MODE_HIGH_THERMAL = 2, 2002*4882a593Smuzhiyun 2003*4882a593Smuzhiyun /* 11~20 for MP submodule section*/ 2004*4882a593Smuzhiyun RTW_DRV_MODE_MP_SMDL_START = 11, 2005*4882a593Smuzhiyun RTW_DRV_MODE_MP = 11, 2006*4882a593Smuzhiyun RTW_DRV_MODE_HOMOLOGATION = 12, 2007*4882a593Smuzhiyun RTW_DRV_MODE_MP_SMDL_END = 20, 2008*4882a593Smuzhiyun 2009*4882a593Smuzhiyun /* 21~30 for FPGA submodule section*/ 2010*4882a593Smuzhiyun RTW_DRV_MODE_FPGA_SMDL_START = 21, 2011*4882a593Smuzhiyun RTW_DRV_MODE_FPGA_SMDL_END = 30, 2012*4882a593Smuzhiyun 2013*4882a593Smuzhiyun /* 31~60 for VERIFY submodule section*/ 2014*4882a593Smuzhiyun RTW_DRV_MODE_VERIFY_SMDL_START = 31, 2015*4882a593Smuzhiyun RTW_DRV_MODE_VERIFY_SMDL_END = 60, 2016*4882a593Smuzhiyun 2017*4882a593Smuzhiyun /* 61~80 for TOOL submodule section*/ 2018*4882a593Smuzhiyun RTW_DRV_MODE_TOOL_SMDL_START = 61, 2019*4882a593Smuzhiyun RTW_DRV_MODE_TOOL_SMDL_END = 80, 2020*4882a593Smuzhiyun 2021*4882a593Smuzhiyun /* Fixed Max Value*/ 2022*4882a593Smuzhiyun RTW_DRV_MODE_MAX = 255 2023*4882a593Smuzhiyun }; 2024*4882a593Smuzhiyun 2025*4882a593Smuzhiyun struct rtw_evt_info_t { 2026*4882a593Smuzhiyun _os_lock evt_lock; 2027*4882a593Smuzhiyun enum rtw_phl_evt evt_bitmap; 2028*4882a593Smuzhiyun }; 2029*4882a593Smuzhiyun 2030*4882a593Smuzhiyun // WiFi FW 2031*4882a593Smuzhiyun struct rtw_fw_info_t { 2032*4882a593Smuzhiyun u8 fw_en; 2033*4882a593Smuzhiyun u8 fw_src; 2034*4882a593Smuzhiyun u8 fw_type; 2035*4882a593Smuzhiyun u8 dlram_en; 2036*4882a593Smuzhiyun u8 dlrom_en; 2037*4882a593Smuzhiyun u8 *rom_buff; 2038*4882a593Smuzhiyun u32 rom_addr; 2039*4882a593Smuzhiyun u32 rom_size; 2040*4882a593Smuzhiyun char rom_path[256]; 2041*4882a593Smuzhiyun u8 *ram_buff; 2042*4882a593Smuzhiyun u32 ram_size; 2043*4882a593Smuzhiyun char ram_path[256]; 2044*4882a593Smuzhiyun u8 *buf; 2045*4882a593Smuzhiyun u32 buf_size; 2046*4882a593Smuzhiyun u8 *wow_buf; 2047*4882a593Smuzhiyun u32 wow_buf_size; 2048*4882a593Smuzhiyun u8 *sym_buf; 2049*4882a593Smuzhiyun u32 sym_buf_size; 2050*4882a593Smuzhiyun }; 2051*4882a593Smuzhiyun 2052*4882a593Smuzhiyun enum rtw_fw_status { 2053*4882a593Smuzhiyun RTW_FW_STATUS_OK, 2054*4882a593Smuzhiyun RTW_FW_STATUS_NOFW, 2055*4882a593Smuzhiyun RTW_FW_STATUS_ASSERT, 2056*4882a593Smuzhiyun RTW_FW_STATUS_EXCEP, 2057*4882a593Smuzhiyun RTW_FW_STATUS_RXI300, 2058*4882a593Smuzhiyun RTW_FW_STATUS_HANG 2059*4882a593Smuzhiyun }; 2060*4882a593Smuzhiyun 2061*4882a593Smuzhiyun #ifdef CONFIG_PHL_DFS 2062*4882a593Smuzhiyun enum dfs_regd_t { 2063*4882a593Smuzhiyun DFS_REGD_UNKNOWN = 0, 2064*4882a593Smuzhiyun DFS_REGD_FCC = 1, 2065*4882a593Smuzhiyun DFS_REGD_JAP = 2, 2066*4882a593Smuzhiyun DFS_REGD_ETSI = 3, 2067*4882a593Smuzhiyun }; 2068*4882a593Smuzhiyun struct rtw_dfs_t { 2069*4882a593Smuzhiyun u8 region_domain; 2070*4882a593Smuzhiyun bool dfs_enabled; 2071*4882a593Smuzhiyun }; 2072*4882a593Smuzhiyun #endif 2073*4882a593Smuzhiyun 2074*4882a593Smuzhiyun #ifdef CONFIG_PHL_CHANNEL_INFO 2075*4882a593Smuzhiyun 2076*4882a593Smuzhiyun #define CHAN_INFO_MAX_SIZE 65535 2077*4882a593Smuzhiyun #define MAX_CHAN_INFO_PKT_KEEP 2 2078*4882a593Smuzhiyun #define CHAN_INFO_PKT_TOTAL MAX_CHAN_INFO_PKT_KEEP + 1 2079*4882a593Smuzhiyun 2080*4882a593Smuzhiyun struct csi_header_t { 2081*4882a593Smuzhiyun u8 mac_addr[6]; /* mdata: u8 ta[6]? */ 2082*4882a593Smuzhiyun u32 hw_assigned_timestamp; /* mdata: u32 freerun_cnt */ 2083*4882a593Smuzhiyun u8 channel; /* Drv define */ 2084*4882a593Smuzhiyun u8 bandwidth; /* mdata: u8 bw */ 2085*4882a593Smuzhiyun u16 rx_data_rate; /* mdata: u16 rx_rate */ 2086*4882a593Smuzhiyun u8 nc; /* ch_rpt_hdr_info */ 2087*4882a593Smuzhiyun u8 nr; /* ch_rpt_hdr_info */ 2088*4882a593Smuzhiyun u16 num_sub_carrier; /* Drv define*/ 2089*4882a593Smuzhiyun u8 num_bit_per_tone; /* Drv define per I/Q */ 2090*4882a593Smuzhiyun u8 avg_idle_noise_pwr; /* ch_rpt_hdr_info */ 2091*4882a593Smuzhiyun u8 evm[2]; /* ch_rpt_hdr_info */ 2092*4882a593Smuzhiyun u8 rssi[2]; /* phy_info_rpt */ 2093*4882a593Smuzhiyun u32 csi_data_length; /* ch_rpt_hdr_info */ 2094*4882a593Smuzhiyun u8 rxsc; /* phy_info_rpt */ 2095*4882a593Smuzhiyun u8 ch_matrix_report; /* mdata: u8 get_ch_info */ 2096*4882a593Smuzhiyun u8 csi_valid; /* ch_rpt_hdr_info */ 2097*4882a593Smuzhiyun }; 2098*4882a593Smuzhiyun 2099*4882a593Smuzhiyun struct chan_info_t { 2100*4882a593Smuzhiyun _os_list list; 2101*4882a593Smuzhiyun u8* chan_info_buffer; 2102*4882a593Smuzhiyun u32 length; 2103*4882a593Smuzhiyun struct csi_header_t csi_header; 2104*4882a593Smuzhiyun }; 2105*4882a593Smuzhiyun 2106*4882a593Smuzhiyun struct rx_chan_info_pool { 2107*4882a593Smuzhiyun struct chan_info_t channl_info_pkt[CHAN_INFO_PKT_TOTAL]; 2108*4882a593Smuzhiyun _os_list idle; 2109*4882a593Smuzhiyun _os_list busy; 2110*4882a593Smuzhiyun _os_lock idle_lock; /* spinlock */ 2111*4882a593Smuzhiyun _os_lock busy_lock; /* spinlock */ 2112*4882a593Smuzhiyun u32 idle_cnt; 2113*4882a593Smuzhiyun u32 busy_cnt; 2114*4882a593Smuzhiyun }; 2115*4882a593Smuzhiyun 2116*4882a593Smuzhiyun #endif /* CONFIG_PHL_CHANNEL_INFO */ 2117*4882a593Smuzhiyun 2118*4882a593Smuzhiyun #ifdef CONFIG_MCC_SUPPORT 2119*4882a593Smuzhiyun #define BT_SEG_NUM 2 2120*4882a593Smuzhiyun #define SLOT_NUM 4 2121*4882a593Smuzhiyun #define MIN_TDMRA_SLOT_NUM 2 2122*4882a593Smuzhiyun #define NONSPECIFIC_SETTING 0xff 2123*4882a593Smuzhiyun 2124*4882a593Smuzhiyun /*Export to core layer. Phl get the judgement of slot mode*/ 2125*4882a593Smuzhiyun enum rtw_phl_mcc_coex_mode { 2126*4882a593Smuzhiyun RTW_PHL_MCC_COEX_MODE_NONE = 0, 2127*4882a593Smuzhiyun RTW_PHL_MCC_COEX_MODE_BT_MASTER, 2128*4882a593Smuzhiyun RTW_PHL_MCC_COEX_MODE_WIFI_MASTER, 2129*4882a593Smuzhiyun RTW_PHL_MCC_COEX_MODE_BT_WIFI_BALANCE 2130*4882a593Smuzhiyun }; 2131*4882a593Smuzhiyun 2132*4882a593Smuzhiyun enum rtw_phl_tdmra_wmode { 2133*4882a593Smuzhiyun RTW_PHL_TDMRA_WMODE_NONE = 0, 2134*4882a593Smuzhiyun RTW_PHL_TDMRA_AP_CLIENT_WMODE, 2135*4882a593Smuzhiyun RTW_PHL_TDMRA_2CLIENTS_WMODE, 2136*4882a593Smuzhiyun RTW_PHL_TDMRA_AP_WMODE, 2137*4882a593Smuzhiyun RTW_PHL_TDMRA_UNKNOWN_WMODE 2138*4882a593Smuzhiyun }; 2139*4882a593Smuzhiyun 2140*4882a593Smuzhiyun enum rtw_phl_mcc_dbg_type { 2141*4882a593Smuzhiyun MCC_DBG_NONE = 0, 2142*4882a593Smuzhiyun MCC_DBG_STATE, 2143*4882a593Smuzhiyun MCC_DBG_OP_MODE, 2144*4882a593Smuzhiyun MCC_DBG_COEX_MODE, 2145*4882a593Smuzhiyun MCC_DBG_BT_INFO, 2146*4882a593Smuzhiyun MCC_DBG_EN_INFO 2147*4882a593Smuzhiyun }; 2148*4882a593Smuzhiyun 2149*4882a593Smuzhiyun enum rtw_phl_mcc_state { 2150*4882a593Smuzhiyun MCC_NONE = 0, 2151*4882a593Smuzhiyun MCC_CFG_EN_INFO, 2152*4882a593Smuzhiyun MCC_TRIGGER_FW_EN, 2153*4882a593Smuzhiyun MCC_FW_EN_FAIL, 2154*4882a593Smuzhiyun MCC_RUNING, 2155*4882a593Smuzhiyun MCC_TRIGGER_FW_DIS, 2156*4882a593Smuzhiyun MCC_FW_DIS_FAIL, 2157*4882a593Smuzhiyun MCC_STOP 2158*4882a593Smuzhiyun }; 2159*4882a593Smuzhiyun 2160*4882a593Smuzhiyun enum rtw_phl_mcc_dur_lim_tag { 2161*4882a593Smuzhiyun RTW_MCC_DUR_LIM_NONE = 0, 2162*4882a593Smuzhiyun RTW_MCC_DUR_LIM_NOA 2163*4882a593Smuzhiyun }; 2164*4882a593Smuzhiyun 2165*4882a593Smuzhiyun /*Export to core layer and hal layyer. Phl get the c2h report mode and config to halmac*/ 2166*4882a593Smuzhiyun enum rtw_phl_mcc_rpt { 2167*4882a593Smuzhiyun RTW_MCC_RPT_OFF = 0, 2168*4882a593Smuzhiyun RTW_MCC_RPT_FAIL_ONLY, 2169*4882a593Smuzhiyun RTW_MCC_RPT_ALL 2170*4882a593Smuzhiyun }; 2171*4882a593Smuzhiyun 2172*4882a593Smuzhiyun /*Export to core layer. Phl get switch ch setting of role from core layer*/ 2173*4882a593Smuzhiyun struct rtw_phl_mcc_setting_info { 2174*4882a593Smuzhiyun struct rtw_wifi_role_t *wrole; 2175*4882a593Smuzhiyun u8 role_map;/*the wifi role map in operating mcc */ 2176*4882a593Smuzhiyun u8 tx_null_early; 2177*4882a593Smuzhiyun u16 dur; /*core specific duration in a period of 100 ms */ 2178*4882a593Smuzhiyun bool en_fw_mcc_log; 2179*4882a593Smuzhiyun u8 fw_mcc_log_lv;/* fw mcc log level */ 2180*4882a593Smuzhiyun }; 2181*4882a593Smuzhiyun 2182*4882a593Smuzhiyun /*Export to core layer. Core get NOA info to update p2p beacon*/ 2183*4882a593Smuzhiyun struct rtw_phl_mcc_noa { 2184*4882a593Smuzhiyun struct rtw_wifi_role_t *wrole; 2185*4882a593Smuzhiyun u32 start_t_h; 2186*4882a593Smuzhiyun u32 start_t_l; 2187*4882a593Smuzhiyun u16 dur; 2188*4882a593Smuzhiyun u16 interval; 2189*4882a593Smuzhiyun u8 cnt; 2190*4882a593Smuzhiyun }; 2191*4882a593Smuzhiyun 2192*4882a593Smuzhiyun struct rtw_phl_mcc_ops { 2193*4882a593Smuzhiyun void *priv; /* ops private, define by core layer*/ 2194*4882a593Smuzhiyun int (*mcc_update_noa)(void *priv, struct rtw_phl_mcc_noa *param); 2195*4882a593Smuzhiyun int (*mcc_get_setting)(void *priv, struct rtw_phl_mcc_setting_info *param); 2196*4882a593Smuzhiyun }; 2197*4882a593Smuzhiyun 2198*4882a593Smuzhiyun /* 2199*4882a593Smuzhiyun * Export to phl layer and hal layer. 2200*4882a593Smuzhiyun * Record the debug info. 2201*4882a593Smuzhiyun */ 2202*4882a593Smuzhiyun struct rtw_phl_mcc_dbg_slot_info { 2203*4882a593Smuzhiyun bool bt_role; 2204*4882a593Smuzhiyun u16 dur; 2205*4882a593Smuzhiyun u16 ch; 2206*4882a593Smuzhiyun u16 macid; 2207*4882a593Smuzhiyun }; 2208*4882a593Smuzhiyun 2209*4882a593Smuzhiyun struct rtw_phl_mcc_dbg_hal_info { 2210*4882a593Smuzhiyun u8 slot_num; 2211*4882a593Smuzhiyun struct rtw_phl_mcc_dbg_slot_info dbg_slot_i[SLOT_NUM]; 2212*4882a593Smuzhiyun bool btc_in_group; 2213*4882a593Smuzhiyun }; 2214*4882a593Smuzhiyun 2215*4882a593Smuzhiyun struct rtw_phl_mcc_macid_bitmap { 2216*4882a593Smuzhiyun u32 *bitmap; 2217*4882a593Smuzhiyun u8 len; 2218*4882a593Smuzhiyun }; 2219*4882a593Smuzhiyun 2220*4882a593Smuzhiyun struct rtw_phl_mcc_sync_tsf_info { 2221*4882a593Smuzhiyun u8 sync_en; 2222*4882a593Smuzhiyun u16 source; 2223*4882a593Smuzhiyun u16 target; 2224*4882a593Smuzhiyun u16 offset; 2225*4882a593Smuzhiyun }; 2226*4882a593Smuzhiyun 2227*4882a593Smuzhiyun struct rtw_phl_mcc_dur_lim_info { 2228*4882a593Smuzhiyun bool enable; 2229*4882a593Smuzhiyun enum rtw_phl_mcc_dur_lim_tag tag; 2230*4882a593Smuzhiyun u16 max_tob; 2231*4882a593Smuzhiyun u16 max_toa; 2232*4882a593Smuzhiyun u16 max_dur; 2233*4882a593Smuzhiyun }; 2234*4882a593Smuzhiyun 2235*4882a593Smuzhiyun struct rtw_phl_mcc_dur_info { 2236*4882a593Smuzhiyun u16 dur; 2237*4882a593Smuzhiyun struct rtw_phl_mcc_dur_lim_info dur_limit; 2238*4882a593Smuzhiyun }; 2239*4882a593Smuzhiyun 2240*4882a593Smuzhiyun struct rtw_phl_mcc_policy_info { 2241*4882a593Smuzhiyun u8 c2h_rpt; 2242*4882a593Smuzhiyun u8 tx_null_early; 2243*4882a593Smuzhiyun u8 dis_tx_null; 2244*4882a593Smuzhiyun u8 in_curr_ch; 2245*4882a593Smuzhiyun u8 dis_sw_retry; 2246*4882a593Smuzhiyun u8 sw_retry_count; 2247*4882a593Smuzhiyun struct rtw_phl_mcc_dur_info dur_info; 2248*4882a593Smuzhiyun u8 rfk_chk; 2249*4882a593Smuzhiyun u8 protect_bcn; 2250*4882a593Smuzhiyun u8 courtesy_en; 2251*4882a593Smuzhiyun u8 courtesy_num; 2252*4882a593Smuzhiyun u8 courtesy_target; 2253*4882a593Smuzhiyun }; 2254*4882a593Smuzhiyun 2255*4882a593Smuzhiyun struct rtw_phl_mcc_role { 2256*4882a593Smuzhiyun struct rtw_wifi_role_t *wrole; 2257*4882a593Smuzhiyun struct rtw_phl_mcc_macid_bitmap used_macid; 2258*4882a593Smuzhiyun struct rtw_chan_def *chandef; 2259*4882a593Smuzhiyun struct rtw_phl_mcc_policy_info policy; 2260*4882a593Smuzhiyun u16 macid; 2261*4882a593Smuzhiyun u16 bcn_intvl; 2262*4882a593Smuzhiyun bool bt_role; 2263*4882a593Smuzhiyun u8 group; 2264*4882a593Smuzhiyun }; 2265*4882a593Smuzhiyun 2266*4882a593Smuzhiyun /* 2267*4882a593Smuzhiyun * @c_en: Enable courtesy function 2268*4882a593Smuzhiyun * @c_num: the time slot of src_role replace by tgt_role 2269*4882a593Smuzhiyun */ 2270*4882a593Smuzhiyun struct rtw_phl_mcc_courtesy { 2271*4882a593Smuzhiyun bool c_en; 2272*4882a593Smuzhiyun bool c_num; 2273*4882a593Smuzhiyun struct rtw_phl_mcc_role *src_role; 2274*4882a593Smuzhiyun struct rtw_phl_mcc_role *tgt_role; 2275*4882a593Smuzhiyun }; 2276*4882a593Smuzhiyun 2277*4882a593Smuzhiyun /* 2278*4882a593Smuzhiyun * @slot: duration, unit: TU 2279*4882a593Smuzhiyun * @bt_role: True: bt role, False: Wifi role 2280*4882a593Smuzhiyun * @mrole: mcc role info for Wifi Role 2281*4882a593Smuzhiyun */ 2282*4882a593Smuzhiyun struct rtw_phl_mcc_slot_info { 2283*4882a593Smuzhiyun u16 slot; 2284*4882a593Smuzhiyun bool bt_role; 2285*4882a593Smuzhiyun struct rtw_phl_mcc_role *mrole; 2286*4882a593Smuzhiyun }; 2287*4882a593Smuzhiyun 2288*4882a593Smuzhiyun /* 2289*4882a593Smuzhiyun * @slot_num: total slot num(Wifi+BT) 2290*4882a593Smuzhiyun * @bt_slot_num: total BT slot num 2291*4882a593Smuzhiyun * | Dur1 | Dur2 | 2292*4882a593Smuzhiyun * bcn bcn 2293*4882a593Smuzhiyun * |tob_r | toa_r|tob_a | toa_a| 2294*4882a593Smuzhiyun */ 2295*4882a593Smuzhiyun struct rtw_phl_mcc_pattern { 2296*4882a593Smuzhiyun u8 slot_num; 2297*4882a593Smuzhiyun u8 bt_slot_num; 2298*4882a593Smuzhiyun struct rtw_phl_mcc_role *role_ref; 2299*4882a593Smuzhiyun struct rtw_phl_mcc_role *role_ano; 2300*4882a593Smuzhiyun s16 tob_r; 2301*4882a593Smuzhiyun s16 toa_r; 2302*4882a593Smuzhiyun s16 tob_a; 2303*4882a593Smuzhiyun s16 toa_a; 2304*4882a593Smuzhiyun u16 bcns_offset; 2305*4882a593Smuzhiyun 2306*4882a593Smuzhiyun u16 calc_fail; 2307*4882a593Smuzhiyun /** 2308*4882a593Smuzhiyun * |tob_r|toa_r| 2309*4882a593Smuzhiyun * -----------<d_r_d_a_spacing>----------- 2310*4882a593Smuzhiyun * |tob_a|toa_a| 2311*4882a593Smuzhiyun **/ 2312*4882a593Smuzhiyun u16 d_r_d_a_spacing_max; 2313*4882a593Smuzhiyun struct rtw_phl_mcc_courtesy courtesy_i; 2314*4882a593Smuzhiyun /*record slot order for X wifi slot + Y bt slot*/ 2315*4882a593Smuzhiyun struct rtw_phl_mcc_slot_info slot_order[SLOT_NUM]; 2316*4882a593Smuzhiyun }; 2317*4882a593Smuzhiyun 2318*4882a593Smuzhiyun /* 2319*4882a593Smuzhiyun * Enable info for mcc 2320*4882a593Smuzhiyun * @ref_role_idx: the index of reference role 2321*4882a593Smuzhiyun * @mrole_map: use mcc role num 2322*4882a593Smuzhiyun * @mrole_num: use mcc role num 2323*4882a593Smuzhiyun * @group: assigned by halmac mcc, the group resource of fw feture, phl layer ignore it 2324*4882a593Smuzhiyun * fw mcc can handle differenec slot pattern, and the group is the id of slot pattern. 2325*4882a593Smuzhiyun * @tsf_high, tsf_low: Start TSF 2326*4882a593Smuzhiyun * @tsf_high_l, tsf_low_l: Limitation of Start TSF 2327*4882a593Smuzhiyun * @dbg_hal_i: Debug info for hal mcc 2328*4882a593Smuzhiyun */ 2329*4882a593Smuzhiyun struct rtw_phl_mcc_en_info { 2330*4882a593Smuzhiyun struct rtw_phl_mcc_role mcc_role[MCC_ROLE_NUM]; 2331*4882a593Smuzhiyun struct rtw_phl_mcc_sync_tsf_info sync_tsf_info; 2332*4882a593Smuzhiyun struct rtw_phl_mcc_pattern m_pattern; 2333*4882a593Smuzhiyun u8 ref_role_idx; 2334*4882a593Smuzhiyun u8 mrole_map; 2335*4882a593Smuzhiyun u8 mrole_num; 2336*4882a593Smuzhiyun u8 group; 2337*4882a593Smuzhiyun u16 mcc_intvl; 2338*4882a593Smuzhiyun u32 tsf_high; 2339*4882a593Smuzhiyun u32 tsf_low; 2340*4882a593Smuzhiyun u32 tsf_high_l; 2341*4882a593Smuzhiyun u32 tsf_low_l; 2342*4882a593Smuzhiyun struct rtw_phl_mcc_dbg_hal_info dbg_hal_i; 2343*4882a593Smuzhiyun }; 2344*4882a593Smuzhiyun 2345*4882a593Smuzhiyun /* 2346*4882a593Smuzhiyun * Bt info 2347*4882a593Smuzhiyun * @bt_dur: bt slot 2348*4882a593Smuzhiyun * @bt_seg: segment bt slot 2349*4882a593Smuzhiyun * @bt_seg_num: segment num 2350*4882a593Smuzhiyun * @add_bt_role: if add_bt_role = true, we need to add bt slot to fw 2351*4882a593Smuzhiyun */ 2352*4882a593Smuzhiyun struct rtw_phl_mcc_bt_info { 2353*4882a593Smuzhiyun u16 bt_dur; 2354*4882a593Smuzhiyun u16 bt_seg[BT_SEG_NUM]; 2355*4882a593Smuzhiyun u8 bt_seg_num; 2356*4882a593Smuzhiyun bool add_bt_role; 2357*4882a593Smuzhiyun }; 2358*4882a593Smuzhiyun 2359*4882a593Smuzhiyun enum rtw_phl_mcc_chk_inprocess_type { 2360*4882a593Smuzhiyun RTW_PHL_MCC_CHK_INPROGRESS = 0, 2361*4882a593Smuzhiyun RTW_PHL_MCC_CHK_INPROGRESS_SINGLE_CH, 2362*4882a593Smuzhiyun RTW_PHL_MCC_CHK_INPROGRESS_MULTI_CH, 2363*4882a593Smuzhiyun RTW_PHL_MCC_CHK_MAX, 2364*4882a593Smuzhiyun }; 2365*4882a593Smuzhiyun 2366*4882a593Smuzhiyun enum mr_coex_trigger { 2367*4882a593Smuzhiyun MR_COEX_TRIG_BY_BT, 2368*4882a593Smuzhiyun MR_COEX_TRIG_BY_LINKING, 2369*4882a593Smuzhiyun MR_COEX_TRIG_BY_DIS_LINKING, 2370*4882a593Smuzhiyun MR_COEX_TRIG_BY_CHG_SLOT, 2371*4882a593Smuzhiyun MR_COEX_TRIG_BY_SCAN, 2372*4882a593Smuzhiyun MR_COEX_TRIG_BY_ECSA, 2373*4882a593Smuzhiyun MR_COEX_TRIG_BY_CHG_OP_CHDEF, 2374*4882a593Smuzhiyun MR_COEX_TRIG_MAX, 2375*4882a593Smuzhiyun }; 2376*4882a593Smuzhiyun 2377*4882a593Smuzhiyun #endif /* CONFIG_MCC_SUPPORT */ 2378*4882a593Smuzhiyun 2379*4882a593Smuzhiyun /*multi-roles control components*/ 2380*4882a593Smuzhiyun enum mr_op_mode { 2381*4882a593Smuzhiyun MR_OP_NON, 2382*4882a593Smuzhiyun MR_OP_SCC, 2383*4882a593Smuzhiyun MR_OP_MCC, 2384*4882a593Smuzhiyun MR_OP_MAX, 2385*4882a593Smuzhiyun }; 2386*4882a593Smuzhiyun 2387*4882a593Smuzhiyun enum mr_op_type { 2388*4882a593Smuzhiyun MR_OP_TYPE_NONE, 2389*4882a593Smuzhiyun MR_OP_TYPE_STATION_ONLY, 2390*4882a593Smuzhiyun MR_OP_TYPE_AP_ONLY, 2391*4882a593Smuzhiyun MR_OP_TYPE_STATION_AP, 2392*4882a593Smuzhiyun MR_OP_TYPE_MAX, 2393*4882a593Smuzhiyun }; 2394*4882a593Smuzhiyun 2395*4882a593Smuzhiyun struct mr_info { 2396*4882a593Smuzhiyun u8 sta_num; 2397*4882a593Smuzhiyun u8 ld_sta_num; 2398*4882a593Smuzhiyun u8 lg_sta_num; /* WIFI_STATION_STATE && WIFI_UNDER_LINKING */ 2399*4882a593Smuzhiyun 2400*4882a593Smuzhiyun u8 ap_num; 2401*4882a593Smuzhiyun u8 ld_ap_num; /*&& asoc_sta_count > 2*/ 2402*4882a593Smuzhiyun u8 monitor_num; 2403*4882a593Smuzhiyun 2404*4882a593Smuzhiyun u8 p2p_device_num; 2405*4882a593Smuzhiyun u8 p2p_gc_num; 2406*4882a593Smuzhiyun u8 p2p_go_num; 2407*4882a593Smuzhiyun 2408*4882a593Smuzhiyun #ifdef CONFIG_PHL_TDLS 2409*4882a593Smuzhiyun u8 ld_tdls_num; /* phl_role->type == PHL_RTYPE_TDLS */ 2410*4882a593Smuzhiyun #endif 2411*4882a593Smuzhiyun 2412*4882a593Smuzhiyun #if 0 2413*4882a593Smuzhiyun #ifdef CONFIG_AP_MODE 2414*4882a593Smuzhiyun u8 starting_ap_num; /*WIFI_FW_AP_STATE*/ 2415*4882a593Smuzhiyun #endif 2416*4882a593Smuzhiyun u8 adhoc_num; /* (WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE) && WIFI_ASOC_STATE */ 2417*4882a593Smuzhiyun u8 ld_adhoc_num; /* (WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE) && WIFI_ASOC_STATE && asoc_sta_count > 2 */ 2418*4882a593Smuzhiyun #ifdef CONFIG_RTW_MESH 2419*4882a593Smuzhiyun u8 mesh_num; /* WIFI_MESH_STATE && WIFI_ASOC_STATE */ 2420*4882a593Smuzhiyun u8 ld_mesh_num; /* WIFI_MESH_STATE && WIFI_ASOC_STATE && asoc_sta_count > 2 */ 2421*4882a593Smuzhiyun #endif 2422*4882a593Smuzhiyun #endif 2423*4882a593Smuzhiyun }; 2424*4882a593Smuzhiyun 2425*4882a593Smuzhiyun enum mr_coex_mode { 2426*4882a593Smuzhiyun MR_COEX_MODE_NONE = 0, 2427*4882a593Smuzhiyun MR_COEX_MODE_2GSCC_1AP_1STA_BTC = 1, 2428*4882a593Smuzhiyun MR_COEX_MODE_TDMRA = 2 2429*4882a593Smuzhiyun }; 2430*4882a593Smuzhiyun 2431*4882a593Smuzhiyun /*export to core layer*/ 2432*4882a593Smuzhiyun struct mr_query_info { 2433*4882a593Smuzhiyun struct mr_info cur_info; 2434*4882a593Smuzhiyun enum mr_op_mode op_mode; 2435*4882a593Smuzhiyun enum mr_op_type op_type; 2436*4882a593Smuzhiyun }; 2437*4882a593Smuzhiyun 2438*4882a593Smuzhiyun struct hw_band_ctl_t { 2439*4882a593Smuzhiyun _os_lock lock; 2440*4882a593Smuzhiyun u8 id; 2441*4882a593Smuzhiyun u8 port_map; /*used port_idx*/ 2442*4882a593Smuzhiyun u8 role_map; /*used role_idx*/ 2443*4882a593Smuzhiyun u8 wmm_map; 2444*4882a593Smuzhiyun struct mr_info cur_info; 2445*4882a593Smuzhiyun enum mr_op_mode op_mode; 2446*4882a593Smuzhiyun enum mr_op_type op_type; 2447*4882a593Smuzhiyun enum phl_hw_port tsf_sync_port; 2448*4882a593Smuzhiyun struct phl_queue chan_ctx_queue;/*struct rtw_chan_ctx*/ 2449*4882a593Smuzhiyun enum mr_coex_mode coex_mode; 2450*4882a593Smuzhiyun #ifdef CONFIG_MCC_SUPPORT 2451*4882a593Smuzhiyun void *mcc_info; /*struct phl_mcc_info*/ 2452*4882a593Smuzhiyun #endif 2453*4882a593Smuzhiyun }; 2454*4882a593Smuzhiyun 2455*4882a593Smuzhiyun #define MAX_BAND_NUM 2 2456*4882a593Smuzhiyun struct rtw_hal_com_t; 2457*4882a593Smuzhiyun 2458*4882a593Smuzhiyun #ifdef CONFIG_PHL_P2PPS 2459*4882a593Smuzhiyun struct rtw_phl_noa { 2460*4882a593Smuzhiyun struct rtw_wifi_role_t *wrole; 2461*4882a593Smuzhiyun enum p2pps_trig_tag tag; 2462*4882a593Smuzhiyun u32 start_t_h; 2463*4882a593Smuzhiyun u32 start_t_l; 2464*4882a593Smuzhiyun u16 dur; 2465*4882a593Smuzhiyun u8 cnt; 2466*4882a593Smuzhiyun u16 interval; 2467*4882a593Smuzhiyun }; 2468*4882a593Smuzhiyun #endif 2469*4882a593Smuzhiyun 2470*4882a593Smuzhiyun struct rtw_phl_mr_ops { 2471*4882a593Smuzhiyun void *priv; /* ops private, define by core layer*/ 2472*4882a593Smuzhiyun #ifdef CONFIG_PHL_P2PPS 2473*4882a593Smuzhiyun int (*phl_mr_update_noa)(void *priv, struct rtw_phl_noa *param); 2474*4882a593Smuzhiyun #endif 2475*4882a593Smuzhiyun #ifdef CONFIG_MCC_SUPPORT 2476*4882a593Smuzhiyun struct rtw_phl_mcc_ops *mcc_ops; 2477*4882a593Smuzhiyun #endif 2478*4882a593Smuzhiyun }; 2479*4882a593Smuzhiyun 2480*4882a593Smuzhiyun struct mr_ctl_t { 2481*4882a593Smuzhiyun struct rtw_hal_com_t *hal_com; 2482*4882a593Smuzhiyun _os_lock lock; 2483*4882a593Smuzhiyun struct hw_band_ctl_t band_ctrl[MAX_BAND_NUM]; 2484*4882a593Smuzhiyun struct phl_bk_module_ops bk_ops; 2485*4882a593Smuzhiyun u8 role_map; 2486*4882a593Smuzhiyun bool is_sb; 2487*4882a593Smuzhiyun struct rtw_phl_mr_ops mr_ops; 2488*4882a593Smuzhiyun #ifdef CONFIG_MCC_SUPPORT 2489*4882a593Smuzhiyun u8 init_mcc; 2490*4882a593Smuzhiyun void *com_mcc;/*struct phl_com_mcc_info*/ 2491*4882a593Smuzhiyun #endif 2492*4882a593Smuzhiyun }; 2493*4882a593Smuzhiyun 2494*4882a593Smuzhiyun enum rtw_rssi_type { 2495*4882a593Smuzhiyun RTW_RSSI_DATA_ACAM, 2496*4882a593Smuzhiyun RTW_RSSI_DATA_ACAM_A1M, 2497*4882a593Smuzhiyun RTW_RSSI_DATA_OTHER, 2498*4882a593Smuzhiyun RTW_RSSI_CTRL_ACAM, 2499*4882a593Smuzhiyun RTW_RSSI_CTRL_ACAM_A1M, 2500*4882a593Smuzhiyun RTW_RSSI_CTRL_OTHER, 2501*4882a593Smuzhiyun RTW_RSSI_MGNT_ACAM, 2502*4882a593Smuzhiyun RTW_RSSI_MGNT_ACAM_A1M, 2503*4882a593Smuzhiyun RTW_RSSI_MGNT_OTHER, 2504*4882a593Smuzhiyun RTW_RSSI_UNKNOWN, 2505*4882a593Smuzhiyun RTW_RSSI_TYPE_MAX 2506*4882a593Smuzhiyun }; 2507*4882a593Smuzhiyun #define PHL_RSSI_MA_H 4 /*RSSI_MA_H*/ 2508*4882a593Smuzhiyun #define PHL_MAX_RSSI 110 2509*4882a593Smuzhiyun #define PHL_RSSI_MAVG_NUM 16 2510*4882a593Smuzhiyun #define UPDATE_MA_RSSI(_RSSI, _TYPE, _VAL) \ 2511*4882a593Smuzhiyun do { \ 2512*4882a593Smuzhiyun u8 oldest_rssi = 0; \ 2513*4882a593Smuzhiyun if(_RSSI->ma_rssi_ele_idx[_TYPE] < PHL_RSSI_MAVG_NUM) { \ 2514*4882a593Smuzhiyun oldest_rssi = _RSSI->ma_rssi_ele[_TYPE][\ 2515*4882a593Smuzhiyun _RSSI->ma_rssi_ele_idx[_TYPE]]; \ 2516*4882a593Smuzhiyun _RSSI->ma_rssi_ele[_TYPE][_RSSI->ma_rssi_ele_idx[_TYPE]] = \ 2517*4882a593Smuzhiyun ((_VAL > PHL_MAX_RSSI) ? PHL_MAX_RSSI : _VAL ); \ 2518*4882a593Smuzhiyun } else { \ 2519*4882a593Smuzhiyun _RSSI->ma_rssi_ele_idx[_TYPE] = 0; \ 2520*4882a593Smuzhiyun oldest_rssi = _RSSI->ma_rssi_ele[_TYPE][0]; \ 2521*4882a593Smuzhiyun _RSSI->ma_rssi_ele[_TYPE][0] = \ 2522*4882a593Smuzhiyun ((_VAL > PHL_MAX_RSSI) ? PHL_MAX_RSSI : _VAL ); \ 2523*4882a593Smuzhiyun } \ 2524*4882a593Smuzhiyun _RSSI->ma_rssi_ele_sum[_TYPE] -= oldest_rssi;\ 2525*4882a593Smuzhiyun _RSSI->ma_rssi_ele_sum[_TYPE] += \ 2526*4882a593Smuzhiyun ((_VAL > PHL_MAX_RSSI) ? PHL_MAX_RSSI : _VAL ); \ 2527*4882a593Smuzhiyun _RSSI->ma_rssi_ele_idx[_TYPE]++; \ 2528*4882a593Smuzhiyun if(_RSSI->ma_rssi_ele_cnt[_TYPE] < PHL_RSSI_MAVG_NUM) \ 2529*4882a593Smuzhiyun _RSSI->ma_rssi_ele_cnt[_TYPE]++; \ 2530*4882a593Smuzhiyun _RSSI->ma_rssi[_TYPE] = (u8)(_RSSI->ma_rssi_ele_sum[_TYPE] / \ 2531*4882a593Smuzhiyun _RSSI->ma_rssi_ele_cnt[_TYPE]);\ 2532*4882a593Smuzhiyun } while (0) 2533*4882a593Smuzhiyun 2534*4882a593Smuzhiyun #define PHL_TRANS_2_RSSI(X) (X >> 1) 2535*4882a593Smuzhiyun 2536*4882a593Smuzhiyun struct rtw_phl_rssi_stat { 2537*4882a593Smuzhiyun _os_lock lock; 2538*4882a593Smuzhiyun u8 ma_rssi_ele_idx[RTW_RSSI_TYPE_MAX]; 2539*4882a593Smuzhiyun u8 ma_rssi_ele_cnt[RTW_RSSI_TYPE_MAX]; /* maximum : PHL_RSSI_MAVG_NUM */ 2540*4882a593Smuzhiyun u8 ma_rssi_ele[RTW_RSSI_TYPE_MAX][PHL_RSSI_MAVG_NUM]; /* rssi element for moving average */ 2541*4882a593Smuzhiyun u32 ma_rssi_ele_sum[RTW_RSSI_TYPE_MAX]; 2542*4882a593Smuzhiyun u8 ma_rssi[RTW_RSSI_TYPE_MAX]; /* moving average : 0~PHL_MAX_RSSI (dBm = rssi - PHL_MAX_RSSI) */ 2543*4882a593Smuzhiyun }; 2544*4882a593Smuzhiyun 2545*4882a593Smuzhiyun #define PHL_MAX_PPDU_CNT 8 2546*4882a593Smuzhiyun #define PHL_MAX_PPDU_STA_NUM 4 2547*4882a593Smuzhiyun struct rtw_phl_ppdu_sts_sta_ent { 2548*4882a593Smuzhiyun u8 vld; 2549*4882a593Smuzhiyun /*u8 rssi;*/ 2550*4882a593Smuzhiyun u16 macid; 2551*4882a593Smuzhiyun }; 2552*4882a593Smuzhiyun struct rtw_phl_ppdu_phy_info { 2553*4882a593Smuzhiyun bool is_valid; 2554*4882a593Smuzhiyun u8 rssi; /*signal power : 0 - PHL_MAX_RSSI, rssi dbm = PHL_MAX_RSSI - value*/ 2555*4882a593Smuzhiyun u8 rssi_path[RTW_PHL_MAX_RF_PATH];/*PATH A, PATH B ... PATH D*/ 2556*4882a593Smuzhiyun u8 ch_idx; 2557*4882a593Smuzhiyun u8 tx_bf; 2558*4882a593Smuzhiyun u8 frame_type; /* type + subtype */ 2559*4882a593Smuzhiyun }; 2560*4882a593Smuzhiyun #ifdef CONFIG_PHY_INFO_NTFY 2561*4882a593Smuzhiyun struct rtw_phl_ppdu_sts_ntfy { 2562*4882a593Smuzhiyun bool vld; 2563*4882a593Smuzhiyun u8 frame_type; 2564*4882a593Smuzhiyun u8 src_mac_addr[MAC_ADDRESS_LENGTH]; 2565*4882a593Smuzhiyun struct rtw_phl_ppdu_phy_info phy_info; 2566*4882a593Smuzhiyun }; 2567*4882a593Smuzhiyun #endif 2568*4882a593Smuzhiyun struct rtw_phl_ppdu_sts_ent { 2569*4882a593Smuzhiyun /* from normal data */ 2570*4882a593Smuzhiyun u8 frame_type; 2571*4882a593Smuzhiyun u8 addr_cam_vld; 2572*4882a593Smuzhiyun u8 crc32; 2573*4882a593Smuzhiyun u8 ppdu_type; 2574*4882a593Smuzhiyun u16 rx_rate; 2575*4882a593Smuzhiyun u8 src_mac_addr[MAC_ADDRESS_LENGTH]; 2576*4882a593Smuzhiyun 2577*4882a593Smuzhiyun /* from ppdu status */ 2578*4882a593Smuzhiyun bool valid; 2579*4882a593Smuzhiyun bool phl_done; 2580*4882a593Smuzhiyun u8 usr_num; 2581*4882a593Smuzhiyun u32 freerun_cnt; 2582*4882a593Smuzhiyun struct rtw_phl_ppdu_phy_info phy_info; 2583*4882a593Smuzhiyun struct rtw_phl_ppdu_sts_sta_ent sta[PHL_MAX_PPDU_STA_NUM]; 2584*4882a593Smuzhiyun #ifdef CONFIG_PHL_RX_PSTS_PER_PKT 2585*4882a593Smuzhiyun /* for ppdu status per pkt */ 2586*4882a593Smuzhiyun struct phl_queue frames; 2587*4882a593Smuzhiyun #endif 2588*4882a593Smuzhiyun }; 2589*4882a593Smuzhiyun struct rtw_phl_ppdu_sts_info { 2590*4882a593Smuzhiyun struct rtw_phl_ppdu_sts_ent sts_ent[HW_BAND_MAX][PHL_MAX_PPDU_CNT]; 2591*4882a593Smuzhiyun u8 cur_rx_ppdu_cnt[HW_BAND_MAX]; 2592*4882a593Smuzhiyun bool en_ppdu_sts[HW_BAND_MAX]; 2593*4882a593Smuzhiyun bool latest_rx_is_psts[HW_BAND_MAX]; 2594*4882a593Smuzhiyun #ifdef CONFIG_PHL_RX_PSTS_PER_PKT 2595*4882a593Smuzhiyun bool en_psts_per_pkt; 2596*4882a593Smuzhiyun bool psts_ampdu; 2597*4882a593Smuzhiyun #define RTW_PHL_PSTS_FLTR_MGNT BIT(RTW_FRAME_TYPE_MGNT) 2598*4882a593Smuzhiyun #define RTW_PHL_PSTS_FLTR_CTRL BIT(RTW_FRAME_TYPE_CTRL) 2599*4882a593Smuzhiyun #define RTW_PHL_PSTS_FLTR_DATA BIT(RTW_FRAME_TYPE_DATA) 2600*4882a593Smuzhiyun #define RTW_PHL_PSTS_FLTR_EXT_RSVD BIT(RTW_FRAME_TYPE_EXT_RSVD) 2601*4882a593Smuzhiyun u8 ppdu_sts_filter; 2602*4882a593Smuzhiyun u8 en_fake_psts; 2603*4882a593Smuzhiyun u8 cur_ppdu_cnt[HW_BAND_MAX]; 2604*4882a593Smuzhiyun #endif 2605*4882a593Smuzhiyun #ifdef CONFIG_PHY_INFO_NTFY 2606*4882a593Smuzhiyun #define MAX_PSTS_MSG_AGGR_NUM 10 2607*4882a593Smuzhiyun struct rtw_phl_ppdu_sts_ntfy msg_aggr_buf[MAX_PSTS_MSG_AGGR_NUM]; 2608*4882a593Smuzhiyun u8 msg_aggr_cnt; 2609*4882a593Smuzhiyun #endif 2610*4882a593Smuzhiyun }; 2611*4882a593Smuzhiyun 2612*4882a593Smuzhiyun struct rtw_phl_gid_pos_tbl { 2613*4882a593Smuzhiyun #define RTW_VHT_GID_MGNT_FRAME_GID_SZ 8 2614*4882a593Smuzhiyun #define RTW_VHT_GID_MGNT_FRAME_POS_SZ 16 2615*4882a593Smuzhiyun u8 gid_vld[RTW_VHT_GID_MGNT_FRAME_GID_SZ]; /* from 0 - 63 */ 2616*4882a593Smuzhiyun u8 pos[RTW_VHT_GID_MGNT_FRAME_POS_SZ]; /* 0 - 63, per 2 bit*/ 2617*4882a593Smuzhiyun }; 2618*4882a593Smuzhiyun 2619*4882a593Smuzhiyun 2620*4882a593Smuzhiyun struct rtw_iot_t { 2621*4882a593Smuzhiyun u32 id; 2622*4882a593Smuzhiyun }; 2623*4882a593Smuzhiyun 2624*4882a593Smuzhiyun #ifdef CONFIG_PHL_THERMAL_PROTECT 2625*4882a593Smuzhiyun enum phl_thermal_protect_action{ 2626*4882a593Smuzhiyun PHL_THERMAL_PROTECT_ACTION_NONE = 0, 2627*4882a593Smuzhiyun PHL_THERMAL_PROTECT_ACTION_LEVEL1 = 1, 2628*4882a593Smuzhiyun PHL_THERMAL_PROTECT_ACTION_LEVEL2 = 2, 2629*4882a593Smuzhiyun }; 2630*4882a593Smuzhiyun #endif 2631*4882a593Smuzhiyun 2632*4882a593Smuzhiyun struct rtw_phl_evt_ops; 2633*4882a593Smuzhiyun struct rtw_phl_com_t { 2634*4882a593Smuzhiyun struct rtw_wifi_role_t wifi_roles[MAX_WIFI_ROLE_NUMBER]; 2635*4882a593Smuzhiyun struct mr_ctl_t mr_ctrl; /*multi wifi_role control module*/ 2636*4882a593Smuzhiyun struct rtw_phl_evt_ops evt_ops; 2637*4882a593Smuzhiyun enum rtw_hci_type hci_type; 2638*4882a593Smuzhiyun enum rtw_drv_mode drv_mode;/*normal or mp mode*/ 2639*4882a593Smuzhiyun enum rtw_dev_state dev_state; 2640*4882a593Smuzhiyun 2641*4882a593Smuzhiyun struct hal_spec_t hal_spec; 2642*4882a593Smuzhiyun 2643*4882a593Smuzhiyun struct role_sw_cap_t role_sw_cap; /* SW control capability of role for any purpose */ 2644*4882a593Smuzhiyun struct protocol_cap_t proto_sw_cap[2]; /* SW control wifi protocol capability for any purpose */ 2645*4882a593Smuzhiyun struct phy_sw_cap_t phy_sw_cap[2]; /* SW control phy capability for any purpose */ 2646*4882a593Smuzhiyun struct phy_cap_t phy_cap[2]; /* final capability of phy (intersection of sw/hw) */ 2647*4882a593Smuzhiyun 2648*4882a593Smuzhiyun struct dev_cap_t dev_sw_cap; 2649*4882a593Smuzhiyun struct dev_cap_t dev_cap; /* final capability of device (intersection of sw/hw) */ 2650*4882a593Smuzhiyun 2651*4882a593Smuzhiyun struct bus_sw_cap_t bus_sw_cap; /* SW controlled bus capability */ 2652*4882a593Smuzhiyun 2653*4882a593Smuzhiyun struct rtw_fw_info_t fw_info; 2654*4882a593Smuzhiyun struct rtw_evt_info_t evt_info; 2655*4882a593Smuzhiyun struct rtw_stats phl_stats; 2656*4882a593Smuzhiyun #ifdef CONFIG_PHL_DFS 2657*4882a593Smuzhiyun struct rtw_dfs_t dfs_info; 2658*4882a593Smuzhiyun #endif 2659*4882a593Smuzhiyun struct rtw_iot_t id; 2660*4882a593Smuzhiyun /* Flags to control/check RX packets */ 2661*4882a593Smuzhiyun bool append_fcs; 2662*4882a593Smuzhiyun bool accept_icv_err; 2663*4882a593Smuzhiyun 2664*4882a593Smuzhiyun u8 rf_type; /*enum rf_type , is RF_PATH - GET_HAL_RFPATH*/ 2665*4882a593Smuzhiyun u8 rf_path_num; /*GET_HAL_RFPATH_NUM*/ 2666*4882a593Smuzhiyun u8 regulation; /*regulation*/ 2667*4882a593Smuzhiyun u8 edcca_mode; 2668*4882a593Smuzhiyun 2669*4882a593Smuzhiyun #ifdef CONFIG_PHL_CHANNEL_INFO 2670*4882a593Smuzhiyun struct rx_chan_info_pool *chan_info_pool; 2671*4882a593Smuzhiyun struct chan_info_t *chan_info; /* Handle channel info packet */ 2672*4882a593Smuzhiyun #endif /* CONFIG_PHL_CHANNEL_INFO */ 2673*4882a593Smuzhiyun void *p2pps_info; 2674*4882a593Smuzhiyun 2675*4882a593Smuzhiyun struct rtw_phl_ppdu_sts_info ppdu_sts_info; 2676*4882a593Smuzhiyun struct rtw_phl_rssi_stat rssi_stat; 2677*4882a593Smuzhiyun #ifdef CONFIG_PHL_THERMAL_PROTECT 2678*4882a593Smuzhiyun enum phl_thermal_protect_action thermal_protect_action; 2679*4882a593Smuzhiyun #endif 2680*4882a593Smuzhiyun void *test_mgnt; 2681*4882a593Smuzhiyun 2682*4882a593Smuzhiyun void *phl_priv; /* pointer to phl_info */ 2683*4882a593Smuzhiyun void *drv_priv; 2684*4882a593Smuzhiyun #ifdef RTW_WKARD_BFEE_SET_AID 2685*4882a593Smuzhiyun u8 is_in_lps; 2686*4882a593Smuzhiyun #endif 2687*4882a593Smuzhiyun }; 2688*4882a593Smuzhiyun 2689*4882a593Smuzhiyun struct phl_sec_param_h { 2690*4882a593Smuzhiyun u8 keyid; 2691*4882a593Smuzhiyun u8 enc_type; 2692*4882a593Smuzhiyun u8 key_type; 2693*4882a593Smuzhiyun u8 key_len; 2694*4882a593Smuzhiyun u8 spp; 2695*4882a593Smuzhiyun }; 2696*4882a593Smuzhiyun 2697*4882a593Smuzhiyun #define PHL_MAX_AGG_WSIZE 32 2698*4882a593Smuzhiyun 2699*4882a593Smuzhiyun struct mp_usr_sw_tx_gen_in { 2700*4882a593Smuzhiyun u32 data_rate : 9; 2701*4882a593Smuzhiyun u32 mcs : 6; 2702*4882a593Smuzhiyun u32 mpdu_len : 14; 2703*4882a593Smuzhiyun u32 n_mpdu : 9; 2704*4882a593Smuzhiyun u32 fec : 1; 2705*4882a593Smuzhiyun u32 dcm : 1; 2706*4882a593Smuzhiyun u32 rsvd0 : 1; 2707*4882a593Smuzhiyun u32 aid : 12; 2708*4882a593Smuzhiyun u32 scrambler_seed : 8; // rand (1~255) 2709*4882a593Smuzhiyun u32 random_init_seed : 8; // rand (1~255) 2710*4882a593Smuzhiyun u32 rsvd1 : 4; 2711*4882a593Smuzhiyun u32 apep : 22; 2712*4882a593Smuzhiyun u32 ru_alloc : 8; 2713*4882a593Smuzhiyun u32 rsvd2 : 2; 2714*4882a593Smuzhiyun u32 nss : 4; 2715*4882a593Smuzhiyun u32 txbf : 1; 2716*4882a593Smuzhiyun u32 pwr_boost_db : 5; 2717*4882a593Smuzhiyun u32 rsvd3 : 22; 2718*4882a593Smuzhiyun }; 2719*4882a593Smuzhiyun 2720*4882a593Smuzhiyun 2721*4882a593Smuzhiyun struct mp_sw_tx_param_t { 2722*4882a593Smuzhiyun u32 dbw : 2; //0:BW20, 1:BW40, 2:BW80, 3:BW160/BW80+80 2723*4882a593Smuzhiyun u32 source_gen_mode : 2; 2724*4882a593Smuzhiyun u32 locked_clk : 1; 2725*4882a593Smuzhiyun u32 dyn_bw : 1; 2726*4882a593Smuzhiyun u32 ndp_en : 1; 2727*4882a593Smuzhiyun u32 long_preamble_en : 1; //bmode 2728*4882a593Smuzhiyun u32 stbc : 1; 2729*4882a593Smuzhiyun u32 gi : 2; //0:0.4,1:0.8,2:1.6,3:3.2 2730*4882a593Smuzhiyun u32 tb_l_len : 12; 2731*4882a593Smuzhiyun u32 tb_ru_tot_sts_max : 3; 2732*4882a593Smuzhiyun u32 vht_txop_not_allowed : 1; 2733*4882a593Smuzhiyun u32 tb_disam : 1; 2734*4882a593Smuzhiyun u32 doppler : 2; 2735*4882a593Smuzhiyun u32 he_ltf_type : 2;//0:1x,1:2x,2:4x 2736*4882a593Smuzhiyun 2737*4882a593Smuzhiyun u32 ht_l_len : 12; 2738*4882a593Smuzhiyun u32 preamble_puncture : 1; 2739*4882a593Smuzhiyun u32 he_mcs_sigb : 3;//0~5 2740*4882a593Smuzhiyun u32 he_dcm_sigb : 1; 2741*4882a593Smuzhiyun u32 he_sigb_compress_en : 1; 2742*4882a593Smuzhiyun u32 max_tx_time_0p4us : 14; 2743*4882a593Smuzhiyun 2744*4882a593Smuzhiyun 2745*4882a593Smuzhiyun u32 ul_flag : 1; 2746*4882a593Smuzhiyun u32 tb_ldpc_extra : 1; 2747*4882a593Smuzhiyun u32 bss_color : 6; 2748*4882a593Smuzhiyun u32 sr : 4; 2749*4882a593Smuzhiyun u32 beamchange_en : 1; 2750*4882a593Smuzhiyun u32 he_er_u106ru_en : 1; 2751*4882a593Smuzhiyun u32 ul_srp1 : 4; 2752*4882a593Smuzhiyun u32 ul_srp2 : 4; 2753*4882a593Smuzhiyun u32 ul_srp3 : 4; 2754*4882a593Smuzhiyun u32 ul_srp4 : 4; 2755*4882a593Smuzhiyun u32 mode : 2; 2756*4882a593Smuzhiyun 2757*4882a593Smuzhiyun u32 group_id : 6; 2758*4882a593Smuzhiyun u32 ppdu_type : 4;//0: bmode,1:Legacy,2:HT_MF,3:HT_GF,4:VHT,5:HE_SU,6:HE_ER_SU,7:HE_MU,8:HE_TB 2759*4882a593Smuzhiyun u32 txop : 7; 2760*4882a593Smuzhiyun u32 tb_strt_sts : 3; 2761*4882a593Smuzhiyun u32 tb_pre_fec_padding_factor : 2; 2762*4882a593Smuzhiyun u32 cbw : 2; 2763*4882a593Smuzhiyun u32 txsc : 4; 2764*4882a593Smuzhiyun u32 tb_mumimo_mode_en : 1; 2765*4882a593Smuzhiyun u32 rsvd1 : 3; 2766*4882a593Smuzhiyun 2767*4882a593Smuzhiyun u8 nominal_t_pe : 2; // def = 2 2768*4882a593Smuzhiyun u8 ness : 2; // def = 0 2769*4882a593Smuzhiyun u8 rsvd2 : 4; 2770*4882a593Smuzhiyun 2771*4882a593Smuzhiyun u8 n_user; 2772*4882a593Smuzhiyun u16 tb_rsvd : 9;//def = 0 2773*4882a593Smuzhiyun u16 rsvd3 : 7; 2774*4882a593Smuzhiyun 2775*4882a593Smuzhiyun struct mp_usr_sw_tx_gen_in usr[4]; 2776*4882a593Smuzhiyun }; 2777*4882a593Smuzhiyun 2778*4882a593Smuzhiyun struct mp_usr_plcp_gen_in { 2779*4882a593Smuzhiyun u32 mcs : 6; 2780*4882a593Smuzhiyun u32 mpdu_len : 14; 2781*4882a593Smuzhiyun u32 n_mpdu : 9; 2782*4882a593Smuzhiyun u32 fec : 1; 2783*4882a593Smuzhiyun u32 dcm : 1; 2784*4882a593Smuzhiyun u32 rsvd0 : 1; 2785*4882a593Smuzhiyun u32 aid : 12; 2786*4882a593Smuzhiyun u32 scrambler_seed : 8; // rand (1~255) 2787*4882a593Smuzhiyun u32 random_init_seed : 8; // rand (1~255) 2788*4882a593Smuzhiyun u32 rsvd1 : 4; 2789*4882a593Smuzhiyun u32 apep : 22; 2790*4882a593Smuzhiyun u32 ru_alloc : 8; 2791*4882a593Smuzhiyun u32 rsvd2 : 2; 2792*4882a593Smuzhiyun u32 nss : 4; 2793*4882a593Smuzhiyun u32 txbf : 1; 2794*4882a593Smuzhiyun u32 pwr_boost_db : 5; 2795*4882a593Smuzhiyun u32 rsvd3 : 22; 2796*4882a593Smuzhiyun }; 2797*4882a593Smuzhiyun 2798*4882a593Smuzhiyun enum pkt_ofld_type { 2799*4882a593Smuzhiyun PKT_TYPE_PROBE_RSP = 0, 2800*4882a593Smuzhiyun PKT_TYPE_PS_POLL = 1, 2801*4882a593Smuzhiyun PKT_TYPE_NULL_DATA = 2, 2802*4882a593Smuzhiyun PKT_TYPE_QOS_NULL = 3, 2803*4882a593Smuzhiyun PKT_TYPE_CTS2SELF = 4, 2804*4882a593Smuzhiyun PKT_TYPE_ARP_RSP = 5, 2805*4882a593Smuzhiyun PKT_TYPE_NDP = 6, 2806*4882a593Smuzhiyun PKT_TYPE_EAPOL_KEY = 7, 2807*4882a593Smuzhiyun PKT_TYPE_SA_QUERY = 8, 2808*4882a593Smuzhiyun PKT_TYPE_REALWOW_KAPKT = 9, /* RealWoW Keep Alive Packet */ 2809*4882a593Smuzhiyun PKT_TYPE_REALWOW_ACK = 10, /* RealWoW Ack Patten */ 2810*4882a593Smuzhiyun PKT_TYPE_REALWOW_WP = 11, /* RealWoW Wakeup Patten */ 2811*4882a593Smuzhiyun PKT_TYPE_PROBE_REQ = 12, 2812*4882a593Smuzhiyun PKT_OFLD_TYPE_MAX, 2813*4882a593Smuzhiyun }; 2814*4882a593Smuzhiyun 2815*4882a593Smuzhiyun struct scan_ofld_ch_info { 2816*4882a593Smuzhiyun u8 center_chan; 2817*4882a593Smuzhiyun u8 chan; /* primary channel */ 2818*4882a593Smuzhiyun u8 bw; 2819*4882a593Smuzhiyun u8 period; 2820*4882a593Smuzhiyun bool tx_pkt; /* 1:probe request will be sent */ 2821*4882a593Smuzhiyun bool tx_data_pause; /* 1:no data will be sent during fw scanning */ 2822*4882a593Smuzhiyun }; 2823*4882a593Smuzhiyun 2824*4882a593Smuzhiyun enum SCAN_OFLD_OP { 2825*4882a593Smuzhiyun SCAN_OFLD_OP_STOP, 2826*4882a593Smuzhiyun SCAN_OFLD_OP_START, 2827*4882a593Smuzhiyun SCAN_OFLD_OP_SET 2828*4882a593Smuzhiyun }; 2829*4882a593Smuzhiyun 2830*4882a593Smuzhiyun enum SCAN_OFLD_MD { 2831*4882a593Smuzhiyun /* scan once */ 2832*4882a593Smuzhiyun SCAN_OFLD_MD_ONCE, 2833*4882a593Smuzhiyun /** 2834*4882a593Smuzhiyun * normal period repeatd 2835*4882a593Smuzhiyun * e.g., period = 2s 2836*4882a593Smuzhiyun * scan - 2s - scan - 2s -.... 2837*4882a593Smuzhiyun */ 2838*4882a593Smuzhiyun 2839*4882a593Smuzhiyun SCAN_OFLD_MD_PD, 2840*4882a593Smuzhiyun /** 2841*4882a593Smuzhiyun * slow period repeat 2842*4882a593Smuzhiyun * e.g., period = 2s, cycle = 2, slow period = 3s 2843*4882a593Smuzhiyun * scan - 2s - scan - 2s - scan - 3s - scan - 3s 2844*4882a593Smuzhiyun */ 2845*4882a593Smuzhiyun SCAN_OFLD_MD_PD_SLOW, 2846*4882a593Smuzhiyun /** 2847*4882a593Smuzhiyun * seamless 2848*4882a593Smuzhiyun * scan - scan - scan - scan - scan -.... 2849*4882a593Smuzhiyun */ 2850*4882a593Smuzhiyun SCAN_OFLD_MD_SEEMLESS, 2851*4882a593Smuzhiyun }; 2852*4882a593Smuzhiyun 2853*4882a593Smuzhiyun struct scan_ofld_info { 2854*4882a593Smuzhiyun enum SCAN_OFLD_OP operation; 2855*4882a593Smuzhiyun enum SCAN_OFLD_MD mode; 2856*4882a593Smuzhiyun /* destinated tsf to start scanning, set 0 for both to scan immediately*/ 2857*4882a593Smuzhiyun u32 tsf_low; 2858*4882a593Smuzhiyun u32 tsf_high; 2859*4882a593Smuzhiyun u32 probe_req_pkt_id; 2860*4882a593Smuzhiyun u32 period; /* SCAN_OFLD_MD_PD & SCAN_OFLD_MD_PD_SLOW */ 2861*4882a593Smuzhiyun u8 cycle; /* SCAN_OFLD_MD_PD & SCAN_OFLD_MD_PD_SLOW*/ 2862*4882a593Smuzhiyun u32 slow_period; /* SCAN_OFLD_MD_PD_SLOW */ 2863*4882a593Smuzhiyun }; 2864*4882a593Smuzhiyun 2865*4882a593Smuzhiyun struct mp_plcp_param_t { 2866*4882a593Smuzhiyun u32 dbw : 2; //0:BW20, 1:BW40, 2:BW80, 3:BW160/BW80+80 2867*4882a593Smuzhiyun u32 source_gen_mode : 2; 2868*4882a593Smuzhiyun u32 locked_clk : 1; 2869*4882a593Smuzhiyun u32 dyn_bw : 1; 2870*4882a593Smuzhiyun u32 ndp_en : 1; 2871*4882a593Smuzhiyun u32 long_preamble_en : 1; //bmode 2872*4882a593Smuzhiyun u32 stbc : 1; 2873*4882a593Smuzhiyun u32 gi : 2; //0:0.4,1:0.8,2:1.6,3:3.2 2874*4882a593Smuzhiyun u32 tb_l_len : 12; 2875*4882a593Smuzhiyun u32 tb_ru_tot_sts_max : 3; 2876*4882a593Smuzhiyun u32 vht_txop_not_allowed : 1; 2877*4882a593Smuzhiyun u32 tb_disam : 1; 2878*4882a593Smuzhiyun u32 doppler : 2; 2879*4882a593Smuzhiyun u32 he_ltf_type : 2;//0:1x,1:2x,2:4x 2880*4882a593Smuzhiyun 2881*4882a593Smuzhiyun u32 ht_l_len : 12; 2882*4882a593Smuzhiyun u32 preamble_puncture : 1; 2883*4882a593Smuzhiyun u32 he_mcs_sigb : 3;//0~5 2884*4882a593Smuzhiyun u32 he_dcm_sigb : 1; 2885*4882a593Smuzhiyun u32 he_sigb_compress_en : 1; 2886*4882a593Smuzhiyun u32 max_tx_time_0p4us : 14; 2887*4882a593Smuzhiyun 2888*4882a593Smuzhiyun 2889*4882a593Smuzhiyun u32 ul_flag : 1; 2890*4882a593Smuzhiyun u32 tb_ldpc_extra : 1; 2891*4882a593Smuzhiyun u32 bss_color : 6; 2892*4882a593Smuzhiyun u32 sr : 4; 2893*4882a593Smuzhiyun u32 beamchange_en : 1; 2894*4882a593Smuzhiyun u32 he_er_u106ru_en : 1; 2895*4882a593Smuzhiyun u32 ul_srp1 : 4; 2896*4882a593Smuzhiyun u32 ul_srp2 : 4; 2897*4882a593Smuzhiyun u32 ul_srp3 : 4; 2898*4882a593Smuzhiyun u32 ul_srp4 : 4; 2899*4882a593Smuzhiyun u32 mode : 2; 2900*4882a593Smuzhiyun 2901*4882a593Smuzhiyun u32 group_id : 6; 2902*4882a593Smuzhiyun u32 ppdu_type : 4;//0: bmode,1:Legacy,2:HT_MF,3:HT_GF,4:VHT,5:HE_SU,6:HE_ER_SU,7:HE_MU,8:HE_TB 2903*4882a593Smuzhiyun u32 txop : 7; 2904*4882a593Smuzhiyun u32 tb_strt_sts : 3; 2905*4882a593Smuzhiyun u32 tb_pre_fec_padding_factor : 2; 2906*4882a593Smuzhiyun u32 cbw : 2; 2907*4882a593Smuzhiyun u32 txsc : 4; 2908*4882a593Smuzhiyun u32 tb_mumimo_mode_en : 1; 2909*4882a593Smuzhiyun u32 rsvd1 : 3; 2910*4882a593Smuzhiyun 2911*4882a593Smuzhiyun u8 nominal_t_pe : 2; // def = 2 2912*4882a593Smuzhiyun u8 ness : 2; // def = 0 2913*4882a593Smuzhiyun u8 rsvd2 : 4; 2914*4882a593Smuzhiyun 2915*4882a593Smuzhiyun u8 n_user; 2916*4882a593Smuzhiyun u16 tb_rsvd : 9;//def = 0 2917*4882a593Smuzhiyun u16 rsvd3 : 7; 2918*4882a593Smuzhiyun 2919*4882a593Smuzhiyun struct mp_usr_plcp_gen_in usr[4]; 2920*4882a593Smuzhiyun }; 2921*4882a593Smuzhiyun 2922*4882a593Smuzhiyun 2923*4882a593Smuzhiyun 2924*4882a593Smuzhiyun #define MP_MAC_AX_MAX_RU_NUM 4 2925*4882a593Smuzhiyun 2926*4882a593Smuzhiyun struct mp_mac_ax_tf_depend_user_para { 2927*4882a593Smuzhiyun u8 pref_AC: 2; 2928*4882a593Smuzhiyun u8 rsvd: 6; 2929*4882a593Smuzhiyun }; 2930*4882a593Smuzhiyun 2931*4882a593Smuzhiyun struct mp_mac_ax_tf_user_para { 2932*4882a593Smuzhiyun u16 aid12: 12; 2933*4882a593Smuzhiyun u16 ul_mcs: 4; 2934*4882a593Smuzhiyun u8 macid; 2935*4882a593Smuzhiyun u8 ru_pos; 2936*4882a593Smuzhiyun 2937*4882a593Smuzhiyun u8 ul_fec_code: 1; 2938*4882a593Smuzhiyun u8 ul_dcm: 1; 2939*4882a593Smuzhiyun u8 ss_alloc: 6; 2940*4882a593Smuzhiyun u8 ul_tgt_rssi: 7; 2941*4882a593Smuzhiyun u8 rsvd: 1; 2942*4882a593Smuzhiyun u16 rsvd2; 2943*4882a593Smuzhiyun }; 2944*4882a593Smuzhiyun 2945*4882a593Smuzhiyun 2946*4882a593Smuzhiyun struct mp_mac_ax_tf_pkt_para { 2947*4882a593Smuzhiyun u8 ul_bw: 2; 2948*4882a593Smuzhiyun u8 gi_ltf: 2; 2949*4882a593Smuzhiyun u8 num_he_ltf: 3; 2950*4882a593Smuzhiyun u8 ul_stbc: 1; 2951*4882a593Smuzhiyun u8 doppler: 1; 2952*4882a593Smuzhiyun u8 ap_tx_power: 6; 2953*4882a593Smuzhiyun u8 rsvd0: 1; 2954*4882a593Smuzhiyun u8 user_num: 3; 2955*4882a593Smuzhiyun u8 pktnum: 3; 2956*4882a593Smuzhiyun u8 rsvd1: 2; 2957*4882a593Smuzhiyun u8 pri20_bitmap; 2958*4882a593Smuzhiyun 2959*4882a593Smuzhiyun struct mp_mac_ax_tf_user_para user[MP_MAC_AX_MAX_RU_NUM]; 2960*4882a593Smuzhiyun struct mp_mac_ax_tf_depend_user_para dep_user[MP_MAC_AX_MAX_RU_NUM]; 2961*4882a593Smuzhiyun }; 2962*4882a593Smuzhiyun 2963*4882a593Smuzhiyun struct mp_mac_ax_tf_wd_para { 2964*4882a593Smuzhiyun u16 datarate: 9; 2965*4882a593Smuzhiyun u16 mulport_id: 3; 2966*4882a593Smuzhiyun u16 pwr_ofset: 3; 2967*4882a593Smuzhiyun u16 rsvd: 1; 2968*4882a593Smuzhiyun }; 2969*4882a593Smuzhiyun 2970*4882a593Smuzhiyun struct mp_mac_ax_f2p_test_para { 2971*4882a593Smuzhiyun struct mp_mac_ax_tf_pkt_para tf_pkt; 2972*4882a593Smuzhiyun struct mp_mac_ax_tf_wd_para tf_wd; 2973*4882a593Smuzhiyun u8 mode: 2; 2974*4882a593Smuzhiyun u8 frexch_type: 6; 2975*4882a593Smuzhiyun u8 sigb_len; 2976*4882a593Smuzhiyun }; 2977*4882a593Smuzhiyun 2978*4882a593Smuzhiyun struct mp_mac_ax_f2p_wd { 2979*4882a593Smuzhiyun /* dword 0 */ 2980*4882a593Smuzhiyun u32 cmd_qsel:6; 2981*4882a593Smuzhiyun u32 rsvd0:2; 2982*4882a593Smuzhiyun u32 rsvd1:2; 2983*4882a593Smuzhiyun u32 ls:1; 2984*4882a593Smuzhiyun u32 fs:1; 2985*4882a593Smuzhiyun u32 total_number:4; 2986*4882a593Smuzhiyun u32 seq:8; 2987*4882a593Smuzhiyun u32 length:8; 2988*4882a593Smuzhiyun /* dword 1 */ 2989*4882a593Smuzhiyun u32 rsvd2; 2990*4882a593Smuzhiyun }; 2991*4882a593Smuzhiyun 2992*4882a593Smuzhiyun struct mp_mac_ax_f2p_tx_cmd { 2993*4882a593Smuzhiyun /* dword 0 */ 2994*4882a593Smuzhiyun u32 cmd_type:8; 2995*4882a593Smuzhiyun u32 cmd_sub_type:8; 2996*4882a593Smuzhiyun u32 dl_user_num:5; 2997*4882a593Smuzhiyun u32 bw:2; 2998*4882a593Smuzhiyun u32 tx_power:9; 2999*4882a593Smuzhiyun /* dword 1 */ 3000*4882a593Smuzhiyun u32 fw_define:16; 3001*4882a593Smuzhiyun u32 ss_sel_mode:2; 3002*4882a593Smuzhiyun u32 next_qsel:6; 3003*4882a593Smuzhiyun u32 twt_group:4; 3004*4882a593Smuzhiyun u32 dis_chk_slp:1; 3005*4882a593Smuzhiyun u32 ru_mu_2_su:1; 3006*4882a593Smuzhiyun u32 dl_t_pe:2; 3007*4882a593Smuzhiyun /* dword 2 */ 3008*4882a593Smuzhiyun u32 sigb_ch1_len:8; 3009*4882a593Smuzhiyun u32 sigb_ch2_len:8; 3010*4882a593Smuzhiyun u32 sigb_sym_num:6; 3011*4882a593Smuzhiyun u32 sigb_ch2_ofs:5; 3012*4882a593Smuzhiyun u32 dis_htp_ack:1; 3013*4882a593Smuzhiyun u32 tx_time_ref:2; 3014*4882a593Smuzhiyun u32 pri_user_idx:2; 3015*4882a593Smuzhiyun /* dword 3 */ 3016*4882a593Smuzhiyun u32 ampdu_max_txtime:14; 3017*4882a593Smuzhiyun u32 rsvd0:2; 3018*4882a593Smuzhiyun u32 group_id:6; 3019*4882a593Smuzhiyun u32 rsvd1:2; 3020*4882a593Smuzhiyun u32 rsvd2:4; 3021*4882a593Smuzhiyun u32 twt_chk_en:1; 3022*4882a593Smuzhiyun u32 twt_port_id:3; 3023*4882a593Smuzhiyun /* dword 4 */ 3024*4882a593Smuzhiyun u32 twt_start_time:32; 3025*4882a593Smuzhiyun /* dword 5 */ 3026*4882a593Smuzhiyun u32 twt_end_time:32; 3027*4882a593Smuzhiyun /* dword 6 */ 3028*4882a593Smuzhiyun u32 apep_len:12; 3029*4882a593Smuzhiyun u32 tri_pad:2; 3030*4882a593Smuzhiyun u32 ul_t_pe:2; 3031*4882a593Smuzhiyun u32 rf_gain_idx:10; 3032*4882a593Smuzhiyun u32 fixed_gain_en:1; 3033*4882a593Smuzhiyun u32 ul_gi_ltf:3; 3034*4882a593Smuzhiyun u32 ul_doppler:1; 3035*4882a593Smuzhiyun u32 ul_stbc:1; 3036*4882a593Smuzhiyun /* dword 7 */ 3037*4882a593Smuzhiyun u32 ul_mid_per:1; 3038*4882a593Smuzhiyun u32 ul_cqi_rrp_tri:1; 3039*4882a593Smuzhiyun u32 rsvd3:6; 3040*4882a593Smuzhiyun u32 rsvd4:8; 3041*4882a593Smuzhiyun u32 sigb_dcm:1; 3042*4882a593Smuzhiyun u32 sigb_comp:1; 3043*4882a593Smuzhiyun u32 doppler:1; 3044*4882a593Smuzhiyun u32 stbc:1; 3045*4882a593Smuzhiyun u32 mid_per:1; 3046*4882a593Smuzhiyun u32 gi_ltf_size:3; 3047*4882a593Smuzhiyun u32 sigb_mcs:3; 3048*4882a593Smuzhiyun u32 rsvd5:5; 3049*4882a593Smuzhiyun /* dword 8 */ 3050*4882a593Smuzhiyun u32 macid_u0:8; 3051*4882a593Smuzhiyun u32 ac_type_u0:2; 3052*4882a593Smuzhiyun u32 mu_sta_pos_u0:2; 3053*4882a593Smuzhiyun u32 dl_rate_idx_u0:9; 3054*4882a593Smuzhiyun u32 dl_dcm_en_u0:1; 3055*4882a593Smuzhiyun u32 rsvd6:2; 3056*4882a593Smuzhiyun u32 ru_alo_idx_u0:8; 3057*4882a593Smuzhiyun /* dword 9 */ 3058*4882a593Smuzhiyun u32 pwr_boost_u0:5; 3059*4882a593Smuzhiyun u32 agg_bmp_alo_u0:3; 3060*4882a593Smuzhiyun u32 ampdu_max_txnum_u0:8; 3061*4882a593Smuzhiyun u32 user_define_u0:8; 3062*4882a593Smuzhiyun u32 user_define_ext_u0:8; 3063*4882a593Smuzhiyun /* dword 10 */ 3064*4882a593Smuzhiyun u32 ul_addr_idx_u0:8; 3065*4882a593Smuzhiyun u32 ul_dcm_u0:1; 3066*4882a593Smuzhiyun u32 ul_fec_cod_u0:1; 3067*4882a593Smuzhiyun u32 ul_ru_rate_u0:7; 3068*4882a593Smuzhiyun u32 rsvd8:7; 3069*4882a593Smuzhiyun u32 ul_ru_alo_idx_u0:8; 3070*4882a593Smuzhiyun /* dword 11 */ 3071*4882a593Smuzhiyun u32 rsvd9:32; 3072*4882a593Smuzhiyun /* dword 12 */ 3073*4882a593Smuzhiyun u32 macid_u1:8; 3074*4882a593Smuzhiyun u32 ac_type_u1:2; 3075*4882a593Smuzhiyun u32 mu_sta_pos_u1:2; 3076*4882a593Smuzhiyun u32 dl_rate_idx_u1:9; 3077*4882a593Smuzhiyun u32 dl_dcm_en_u1:1; 3078*4882a593Smuzhiyun u32 rsvd10:2; 3079*4882a593Smuzhiyun u32 ru_alo_idx_u1:8; 3080*4882a593Smuzhiyun /* dword 13 */ 3081*4882a593Smuzhiyun u32 pwr_boost_u1:5; 3082*4882a593Smuzhiyun u32 agg_bmp_alo_u1:3; 3083*4882a593Smuzhiyun u32 ampdu_max_txnum_u1:8; 3084*4882a593Smuzhiyun u32 user_define_u1:8; 3085*4882a593Smuzhiyun u32 user_define_ext_u1:8; 3086*4882a593Smuzhiyun /* dword 14 */ 3087*4882a593Smuzhiyun u32 ul_addr_idx_u1:8; 3088*4882a593Smuzhiyun u32 ul_dcm_u1:1; 3089*4882a593Smuzhiyun u32 ul_fec_cod_u1:1; 3090*4882a593Smuzhiyun u32 ul_ru_rate_u1:7; 3091*4882a593Smuzhiyun u32 rsvd12:7; 3092*4882a593Smuzhiyun u32 ul_ru_alo_idx_u1:8; 3093*4882a593Smuzhiyun /* dword 15 */ 3094*4882a593Smuzhiyun u32 rsvd13:32; 3095*4882a593Smuzhiyun /* dword 16 */ 3096*4882a593Smuzhiyun u32 macid_u2:8; 3097*4882a593Smuzhiyun u32 ac_type_u2:2; 3098*4882a593Smuzhiyun u32 mu_sta_pos_u2:2; 3099*4882a593Smuzhiyun u32 dl_rate_idx_u2:9; 3100*4882a593Smuzhiyun u32 dl_dcm_en_u2:1; 3101*4882a593Smuzhiyun u32 rsvd14:2; 3102*4882a593Smuzhiyun u32 ru_alo_idx_u2:8; 3103*4882a593Smuzhiyun /* dword 17 */ 3104*4882a593Smuzhiyun u32 pwr_boost_u2:5; 3105*4882a593Smuzhiyun u32 agg_bmp_alo_u2:3; 3106*4882a593Smuzhiyun u32 ampdu_max_txnum_u2:8; 3107*4882a593Smuzhiyun u32 user_define_u2:8; 3108*4882a593Smuzhiyun u32 user_define_ext_u2:8; 3109*4882a593Smuzhiyun /* dword 18 */ 3110*4882a593Smuzhiyun u32 ul_addr_idx_u2:8; 3111*4882a593Smuzhiyun u32 ul_dcm_u2:1; 3112*4882a593Smuzhiyun u32 ul_fec_cod_u2:1; 3113*4882a593Smuzhiyun u32 ul_ru_rate_u2:7; 3114*4882a593Smuzhiyun u32 rsvd16:7; 3115*4882a593Smuzhiyun u32 ul_ru_alo_idx_u2:8; 3116*4882a593Smuzhiyun /* dword 19 */ 3117*4882a593Smuzhiyun u32 rsvd17:32; 3118*4882a593Smuzhiyun /* dword 20 */ 3119*4882a593Smuzhiyun u32 macid_u3:8; 3120*4882a593Smuzhiyun u32 ac_type_u3:2; 3121*4882a593Smuzhiyun u32 mu_sta_pos_u3:2; 3122*4882a593Smuzhiyun u32 dl_rate_idx_u3:9; 3123*4882a593Smuzhiyun u32 dl_dcm_en_u3:1; 3124*4882a593Smuzhiyun u32 rsvd18:2; 3125*4882a593Smuzhiyun u32 ru_alo_idx_u3:8; 3126*4882a593Smuzhiyun /* dword 21 */ 3127*4882a593Smuzhiyun u32 pwr_boost_u3:5; 3128*4882a593Smuzhiyun u32 agg_bmp_alo_u3:3; 3129*4882a593Smuzhiyun u32 ampdu_max_txnum_u3:8; 3130*4882a593Smuzhiyun u32 user_define_u3:8; 3131*4882a593Smuzhiyun u32 user_define_ext_u3:8; 3132*4882a593Smuzhiyun /* dword 22 */ 3133*4882a593Smuzhiyun u32 ul_addr_idx_u3:8; 3134*4882a593Smuzhiyun u32 ul_dcm_u3:1; 3135*4882a593Smuzhiyun u32 ul_fec_cod_u3:1; 3136*4882a593Smuzhiyun u32 ul_ru_rate_u3:7; 3137*4882a593Smuzhiyun u32 rsvd20:7; 3138*4882a593Smuzhiyun u32 ul_ru_alo_idx_u3:8; 3139*4882a593Smuzhiyun /* dword 23 */ 3140*4882a593Smuzhiyun u32 rsvd21:32; 3141*4882a593Smuzhiyun /* dword 24 */ 3142*4882a593Smuzhiyun u32 pkt_id_0:12; 3143*4882a593Smuzhiyun u32 rsvd22:3; 3144*4882a593Smuzhiyun u32 valid_0:1; 3145*4882a593Smuzhiyun u32 ul_user_num_0:4; 3146*4882a593Smuzhiyun u32 rsvd23:12; 3147*4882a593Smuzhiyun /* dword 25 */ 3148*4882a593Smuzhiyun u32 pkt_id_1:12; 3149*4882a593Smuzhiyun u32 rsvd24:3; 3150*4882a593Smuzhiyun u32 valid_1:1; 3151*4882a593Smuzhiyun u32 ul_user_num_1:4; 3152*4882a593Smuzhiyun u32 rsvd25:12; 3153*4882a593Smuzhiyun /* dword 26 */ 3154*4882a593Smuzhiyun u32 pkt_id_2:12; 3155*4882a593Smuzhiyun u32 rsvd26:3; 3156*4882a593Smuzhiyun u32 valid_2:1; 3157*4882a593Smuzhiyun u32 ul_user_num_2:4; 3158*4882a593Smuzhiyun u32 rsvd27:12; 3159*4882a593Smuzhiyun /* dword 27 */ 3160*4882a593Smuzhiyun u32 pkt_id_3:12; 3161*4882a593Smuzhiyun u32 rsvd28:3; 3162*4882a593Smuzhiyun u32 valid_3:1; 3163*4882a593Smuzhiyun u32 ul_user_num_3:4; 3164*4882a593Smuzhiyun u32 rsvd29:12; 3165*4882a593Smuzhiyun /* dword 28 */ 3166*4882a593Smuzhiyun u32 pkt_id_4:12; 3167*4882a593Smuzhiyun u32 rsvd30:3; 3168*4882a593Smuzhiyun u32 valid_4:1; 3169*4882a593Smuzhiyun u32 ul_user_num_4:4; 3170*4882a593Smuzhiyun u32 rsvd31:12; 3171*4882a593Smuzhiyun /* dword 29 */ 3172*4882a593Smuzhiyun u32 pkt_id_5:12; 3173*4882a593Smuzhiyun u32 rsvd32:3; 3174*4882a593Smuzhiyun u32 valid_5:1; 3175*4882a593Smuzhiyun u32 ul_user_num_5:4; 3176*4882a593Smuzhiyun u32 rsvd33:12; 3177*4882a593Smuzhiyun }; 3178*4882a593Smuzhiyun 3179*4882a593Smuzhiyun u8 mp_start(void *priv); 3180*4882a593Smuzhiyun 3181*4882a593Smuzhiyun #ifdef CONFIG_DBCC_SUPPORT 3182*4882a593Smuzhiyun enum dbcc_test_id { 3183*4882a593Smuzhiyun DBCC_PRE_CFG, 3184*4882a593Smuzhiyun DBCC_CFG, 3185*4882a593Smuzhiyun DBCC_CLEAN_TXQ, 3186*4882a593Smuzhiyun }; 3187*4882a593Smuzhiyun #endif 3188*4882a593Smuzhiyun 3189*4882a593Smuzhiyun struct rtw_role_cmd { 3190*4882a593Smuzhiyun struct rtw_wifi_role_t *wrole; 3191*4882a593Smuzhiyun enum role_state rstate; 3192*4882a593Smuzhiyun }; 3193*4882a593Smuzhiyun 3194*4882a593Smuzhiyun enum phl_btc_pkt_evt_type { 3195*4882a593Smuzhiyun BTC_PKT_EVT_NORMAL, 3196*4882a593Smuzhiyun BTC_PKT_EVT_DHCP, 3197*4882a593Smuzhiyun BTC_PKT_EVT_ARP, 3198*4882a593Smuzhiyun BTC_PKT_EVT_EAPOL, 3199*4882a593Smuzhiyun BTC_PKT_EVT_EAPOL_START, 3200*4882a593Smuzhiyun BTC_PKT_EVT_ADD_KEY, 3201*4882a593Smuzhiyun BTC_PKT_EVT_MAX 3202*4882a593Smuzhiyun }; 3203*4882a593Smuzhiyun 3204*4882a593Smuzhiyun struct rtw_pkt_evt_ntfy { 3205*4882a593Smuzhiyun struct rtw_wifi_role_t *wrole; 3206*4882a593Smuzhiyun enum phl_btc_pkt_evt_type type; 3207*4882a593Smuzhiyun }; 3208*4882a593Smuzhiyun 3209*4882a593Smuzhiyun struct role_ntfy_info { 3210*4882a593Smuzhiyun u8 role_id; 3211*4882a593Smuzhiyun u16 macid; 3212*4882a593Smuzhiyun enum role_state rstate; 3213*4882a593Smuzhiyun }; 3214*4882a593Smuzhiyun 3215*4882a593Smuzhiyun struct battery_chg_ntfy_info { 3216*4882a593Smuzhiyun bool ips_allow; 3217*4882a593Smuzhiyun bool lps_allow; 3218*4882a593Smuzhiyun }; 3219*4882a593Smuzhiyun 3220*4882a593Smuzhiyun struct ps_ntfy_info { 3221*4882a593Smuzhiyun bool sync; 3222*4882a593Smuzhiyun void *ctx; 3223*4882a593Smuzhiyun void (*cb)(void *phl, void *hdl, void *ctx, enum rtw_phl_status stat); 3224*4882a593Smuzhiyun }; 3225*4882a593Smuzhiyun 3226*4882a593Smuzhiyun struct set_rf_ntfy_info { 3227*4882a593Smuzhiyun enum rtw_rf_state state_to_set; 3228*4882a593Smuzhiyun _os_event done; 3229*4882a593Smuzhiyun }; 3230*4882a593Smuzhiyun 3231*4882a593Smuzhiyun 3232*4882a593Smuzhiyun /** 3233*4882a593Smuzhiyun * rtw_phl_rainfo - structure use to query RA information 3234*4882a593Smuzhiyun * from hal layer to core/phl layer 3235*4882a593Smuzhiyun * @rate: current rate selected by RA, define by general definition enum rtw_data_rate 3236*4882a593Smuzhiyun * @bw: current BW, define by general definition enum channel_width 3237*4882a593Smuzhiyun * @gi_ltf: current gi_ltf, define by general definition enum rtw_gi_ltf 3238*4882a593Smuzhiyun */ 3239*4882a593Smuzhiyun struct rtw_phl_rainfo { 3240*4882a593Smuzhiyun enum rtw_data_rate rate; 3241*4882a593Smuzhiyun enum channel_width bw; 3242*4882a593Smuzhiyun enum rtw_gi_ltf gi_ltf; 3243*4882a593Smuzhiyun }; 3244*4882a593Smuzhiyun 3245*4882a593Smuzhiyun struct rtw_pcie_trx_mit_info_t { 3246*4882a593Smuzhiyun u32 tx_timer; 3247*4882a593Smuzhiyun u8 tx_counter; 3248*4882a593Smuzhiyun u32 rx_timer; 3249*4882a593Smuzhiyun u8 rx_counter; 3250*4882a593Smuzhiyun u8 fixed_mitigation; /*no watchdog dynamic setting*/ 3251*4882a593Smuzhiyun void *priv; 3252*4882a593Smuzhiyun }; 3253*4882a593Smuzhiyun 3254*4882a593Smuzhiyun struct rtw_env_report { 3255*4882a593Smuzhiyun bool rpt_status; /*1 means CCX_SUCCESS,0 means fail*/ 3256*4882a593Smuzhiyun u8 clm_ratio; 3257*4882a593Smuzhiyun u8 nhm_ratio; 3258*4882a593Smuzhiyun u8 nhm_pwr; 3259*4882a593Smuzhiyun u8 nhm_cca_ratio; 3260*4882a593Smuzhiyun }; 3261*4882a593Smuzhiyun 3262*4882a593Smuzhiyun enum rtw_phl_ser_lv1_recv_step { 3263*4882a593Smuzhiyun RTW_PHL_SER_LV1_RCVY_STEP_1 = 0, 3264*4882a593Smuzhiyun RTW_PHL_SER_LV1_SER_RCVY_STEP_2, 3265*4882a593Smuzhiyun 3266*4882a593Smuzhiyun /* keep last */ 3267*4882a593Smuzhiyun RTW_PHL_SER_LV1_RCVY_STEP_LAST, 3268*4882a593Smuzhiyun RTW_PHL_SER_LV1_RCVY_STEP_MAX = RTW_PHL_SER_LV1_RCVY_STEP_LAST, 3269*4882a593Smuzhiyun RTW_PHL_SER_LV1_RCVY_STEP_INVALID = RTW_PHL_SER_LV1_RCVY_STEP_LAST, 3270*4882a593Smuzhiyun }; 3271*4882a593Smuzhiyun 3272*4882a593Smuzhiyun #endif /*_PHL_DEF_H_*/ 3273