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