1*4882a593Smuzhiyun /****************************************************************************** 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright(c) 2019 Realtek Corporation. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify it 6*4882a593Smuzhiyun * under the terms of version 2 of the GNU General Public License as 7*4882a593Smuzhiyun * published by the Free Software Foundation. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, but WITHOUT 10*4882a593Smuzhiyun * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12*4882a593Smuzhiyun * more details. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun *****************************************************************************/ 15*4882a593Smuzhiyun #ifndef __PHL_TRX_DEF_H_ 16*4882a593Smuzhiyun #define __PHL_TRX_DEF_H_ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun /* core / phl common structrue */ 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #ifndef MAX_PHL_TX_RING_ENTRY_NUM 21*4882a593Smuzhiyun #define MAX_PHL_TX_RING_ENTRY_NUM 4096 22*4882a593Smuzhiyun #endif /*MAX_PHL_TX_RING_ENTRY_NUM*/ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #ifndef MAX_PHL_RX_RING_ENTRY_NUM 25*4882a593Smuzhiyun #define MAX_PHL_RX_RING_ENTRY_NUM 4096 26*4882a593Smuzhiyun #endif /*MAX_PHL_RX_RING_ENTRY_NUM*/ 27*4882a593Smuzhiyun #define MAX_PHL_RING_CAT_NUM 10 /* 8 tid + 1 mgnt + 1 hiq*/ 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #ifdef CONFIG_RTW_REDUCE_MEM 31*4882a593Smuzhiyun #define MAX_PHL_RING_RX_PKT_NUM MAX_PHL_RX_RING_ENTRY_NUM 32*4882a593Smuzhiyun #else 33*4882a593Smuzhiyun #define MAX_PHL_RING_RX_PKT_NUM 8192 34*4882a593Smuzhiyun #endif 35*4882a593Smuzhiyun #define MAX_RX_BUF_SEG_NUM 4 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define _H2CB_CMD_QLEN 32 38*4882a593Smuzhiyun #define _H2CB_DATA_QLEN 32 39*4882a593Smuzhiyun #define _H2CB_LONG_DATA_QLEN 200 /* should be refined */ 40*4882a593Smuzhiyun #define MAX_H2C_PKT_NUM (_H2CB_CMD_QLEN + _H2CB_DATA_QLEN + _H2CB_LONG_DATA_QLEN) 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #define FWCMD_HDR_LEN 8 43*4882a593Smuzhiyun #define _WD_BODY_LEN 24 44*4882a593Smuzhiyun #define H2C_CMD_LEN 64 45*4882a593Smuzhiyun #define H2C_DATA_LEN 256 46*4882a593Smuzhiyun #define H2C_LONG_DATA_LEN 2048 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define get_h2c_size_by_range(i) \ 49*4882a593Smuzhiyun ((i < _H2CB_CMD_QLEN) ? \ 50*4882a593Smuzhiyun (FWCMD_HDR_LEN + _WD_BODY_LEN + H2C_CMD_LEN) : \ 51*4882a593Smuzhiyun ((i < (_H2CB_CMD_QLEN + _H2CB_DATA_QLEN)) ? \ 52*4882a593Smuzhiyun (FWCMD_HDR_LEN + _WD_BODY_LEN + H2C_DATA_LEN) : \ 53*4882a593Smuzhiyun (FWCMD_HDR_LEN + _WD_BODY_LEN + H2C_LONG_DATA_LEN))) 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun struct rtw_h2c_pkt { 56*4882a593Smuzhiyun _os_list list; 57*4882a593Smuzhiyun u8 *vir_head; /* should not reset */ 58*4882a593Smuzhiyun u8 *vir_data; 59*4882a593Smuzhiyun u8 *vir_end; 60*4882a593Smuzhiyun u8 *vir_tail; 61*4882a593Smuzhiyun void *os_rsvd[1]; 62*4882a593Smuzhiyun u8 type; 63*4882a593Smuzhiyun u32 id; /* h2c id */ 64*4882a593Smuzhiyun u32 buf_len; 65*4882a593Smuzhiyun u32 data_len; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun u32 phy_addr_l; 68*4882a593Smuzhiyun u32 phy_addr_h; 69*4882a593Smuzhiyun u8 cache; 70*4882a593Smuzhiyun u16 host_idx; 71*4882a593Smuzhiyun u8 h2c_seq; /* h2c seq */ 72*4882a593Smuzhiyun }; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun /** 75*4882a593Smuzhiyun * the category of phl ring 76*4882a593Smuzhiyun */ 77*4882a593Smuzhiyun enum rtw_phl_ring_cat { 78*4882a593Smuzhiyun RTW_PHL_RING_CAT_TID0 = 0, 79*4882a593Smuzhiyun RTW_PHL_RING_CAT_TID1 = 1, 80*4882a593Smuzhiyun RTW_PHL_RING_CAT_TID2 = 2, 81*4882a593Smuzhiyun RTW_PHL_RING_CAT_TID3 = 3, 82*4882a593Smuzhiyun RTW_PHL_RING_CAT_TID4 = 4, 83*4882a593Smuzhiyun RTW_PHL_RING_CAT_TID5 = 5, 84*4882a593Smuzhiyun RTW_PHL_RING_CAT_TID6 = 6, 85*4882a593Smuzhiyun RTW_PHL_RING_CAT_TID7 = 7, 86*4882a593Smuzhiyun RTW_PHL_RING_CAT_MGNT = 8, 87*4882a593Smuzhiyun RTW_PHL_RING_CAT_HIQ = 9, 88*4882a593Smuzhiyun RTW_PHL_RING_CAT_MAX = 0xff 89*4882a593Smuzhiyun }; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun /** 93*4882a593Smuzhiyun * @RTW_PHL_TREQ_TYPE_PHL_UPDATE_TXSC: 94*4882a593Smuzhiyun * this is for phl tx shortcut entry to update 95*4882a593Smuzhiyun * @RTW_PHL_TREQ_TYPE_CORE_TXSC: 96*4882a593Smuzhiyun * it means this txreq is a shortcut pkt, so it need a txsc recycle 97*4882a593Smuzhiyun * @RTW_PHL_TREQ_TYPE_PHL_ADD_TXSC: 98*4882a593Smuzhiyun * it means this txreq is a new cache in core layer and also need cache 99*4882a593Smuzhiyun * in phl layer 100*4882a593Smuzhiyun */ 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun enum rtw_treq_type { 103*4882a593Smuzhiyun #if defined(CONFIG_CORE_TXSC) || defined(CONFIG_PHL_TXSC) 104*4882a593Smuzhiyun RTW_PHL_TREQ_TYPE_PHL_UPDATE_TXSC = 0x80, 105*4882a593Smuzhiyun #endif 106*4882a593Smuzhiyun RTW_PHL_TREQ_TYPE_NORMAL = 0, 107*4882a593Smuzhiyun RTW_PHL_TREQ_TYPE_TEST_PATTERN = 1, 108*4882a593Smuzhiyun #if defined(CONFIG_CORE_TXSC) || defined(CONFIG_PHL_TXSC) 109*4882a593Smuzhiyun RTW_PHL_TREQ_TYPE_CORE_TXSC = 2, 110*4882a593Smuzhiyun RTW_PHL_TREQ_TYPE_PHL_ADD_TXSC = 3, 111*4882a593Smuzhiyun #endif 112*4882a593Smuzhiyun RTW_PHL_TREQ_TYPE_MAX = 0xFF 113*4882a593Smuzhiyun }; 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun enum rtw_packet_type { 117*4882a593Smuzhiyun RTW_PHL_PKT_TYPE_DATA = 0, 118*4882a593Smuzhiyun RTW_PHL_PKT_TYPE_MGNT = 1, 119*4882a593Smuzhiyun RTW_PHL_PKT_TYPE_H2C = 2, 120*4882a593Smuzhiyun RTW_PHL_PKT_TYPE_CTRL = 3, 121*4882a593Smuzhiyun RTW_PHL_PKT_TYPE_FWDL = 4, 122*4882a593Smuzhiyun RTW_PHL_PKT_TYPE_MAX = 0xFF 123*4882a593Smuzhiyun }; 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun /** 127*4882a593Smuzhiyun * struct rtw_t_mdata_non_dcpu: 128*4882a593Smuzhiyun * this settings are only used in non-dcpu mode. 129*4882a593Smuzhiyun */ 130*4882a593Smuzhiyun struct rtw_t_mdata_non_dcpu { 131*4882a593Smuzhiyun u8 tbd; 132*4882a593Smuzhiyun }; 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun /** 135*4882a593Smuzhiyun * struct rtw_t_mdata_dcpu: 136*4882a593Smuzhiyun * this settings are only used in dcpu mode. 137*4882a593Smuzhiyun */ 138*4882a593Smuzhiyun struct rtw_t_mdata_dcpu { 139*4882a593Smuzhiyun u8 tbd; 140*4882a593Smuzhiyun }; 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun /** 143*4882a593Smuzhiyun * tx packet descrption 144*4882a593Smuzhiyun * 145*4882a593Smuzhiyun * @u: the union separates dpcu mode and non-dpcu mode unique settings 146*4882a593Smuzhiyun * @mac_priv: the mac private struture only used by HV tool. 147*4882a593Smuzhiyun * normal driver won't allocate memory for this pointer. 148*4882a593Smuzhiyun */ 149*4882a593Smuzhiyun struct rtw_t_meta_data { 150*4882a593Smuzhiyun /* basic */ 151*4882a593Smuzhiyun u8 *ta; 152*4882a593Smuzhiyun u8 *ra; 153*4882a593Smuzhiyun u8 da[6]; 154*4882a593Smuzhiyun u8 sa[6]; 155*4882a593Smuzhiyun u8 to_ds; 156*4882a593Smuzhiyun u8 from_ds; 157*4882a593Smuzhiyun u8 band; /*0 or 1*/ 158*4882a593Smuzhiyun u8 wmm; /*0 or 1*/ 159*4882a593Smuzhiyun enum rtw_packet_type type; 160*4882a593Smuzhiyun u8 tid; 161*4882a593Smuzhiyun u8 bc; 162*4882a593Smuzhiyun u8 mc; 163*4882a593Smuzhiyun u16 pktlen; /* MAC header length + frame body length */ 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun u16 macid; 166*4882a593Smuzhiyun u8 hal_port; 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun /* sequence */ 169*4882a593Smuzhiyun u8 hw_seq_mode; 170*4882a593Smuzhiyun u8 hw_ssn_sel; 171*4882a593Smuzhiyun u16 sw_seq; 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun /* hdr conversion & hw amsdu */ 174*4882a593Smuzhiyun u8 smh_en; 175*4882a593Smuzhiyun u8 hw_amsdu; 176*4882a593Smuzhiyun u8 hdr_len; 177*4882a593Smuzhiyun u8 wp_offset; 178*4882a593Smuzhiyun u8 shcut_camid; 179*4882a593Smuzhiyun u8 upd_wlan_hdr; 180*4882a593Smuzhiyun u8 reuse_start_num; 181*4882a593Smuzhiyun u8 reuse_size; 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun /* sec */ 184*4882a593Smuzhiyun u8 hw_sec_iv; 185*4882a593Smuzhiyun u8 sw_sec_iv; 186*4882a593Smuzhiyun u8 sec_keyid; 187*4882a593Smuzhiyun u8 sec_cam_idx; 188*4882a593Smuzhiyun u8 sec_hw_enc; 189*4882a593Smuzhiyun u8 sec_type; 190*4882a593Smuzhiyun u8 force_key_en; 191*4882a593Smuzhiyun u8 iv[6]; 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun /* dma */ 194*4882a593Smuzhiyun u8 dma_ch; 195*4882a593Smuzhiyun u8 wd_page_size; 196*4882a593Smuzhiyun u8 wdinfo_en; 197*4882a593Smuzhiyun u8 addr_info_num; 198*4882a593Smuzhiyun u8 usb_pkt_ofst; 199*4882a593Smuzhiyun u8 usb_txagg_num; 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun /* ampdu */ 202*4882a593Smuzhiyun u8 ampdu_en; 203*4882a593Smuzhiyun u8 max_agg_num; 204*4882a593Smuzhiyun u8 bk; 205*4882a593Smuzhiyun u8 ampdu_density; 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun /* rate */ 208*4882a593Smuzhiyun u8 data_bw_er; 209*4882a593Smuzhiyun u8 f_ldpc; 210*4882a593Smuzhiyun u8 f_stbc; 211*4882a593Smuzhiyun u8 f_dcm; 212*4882a593Smuzhiyun u8 f_er; 213*4882a593Smuzhiyun u16 f_rate; 214*4882a593Smuzhiyun u8 f_gi_ltf; 215*4882a593Smuzhiyun u8 f_bw; 216*4882a593Smuzhiyun u8 userate_sel; 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun /* a ctrl */ 219*4882a593Smuzhiyun u8 a_ctrl_bqr; 220*4882a593Smuzhiyun u8 a_ctrl_uph; 221*4882a593Smuzhiyun u8 a_ctrl_bsr; 222*4882a593Smuzhiyun u8 a_ctrl_cas; 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun /* tx cnt & rty rate */ 225*4882a593Smuzhiyun u8 dis_rts_rate_fb; 226*4882a593Smuzhiyun u8 dis_data_rate_fb; 227*4882a593Smuzhiyun u16 data_rty_lowest_rate; 228*4882a593Smuzhiyun u8 data_tx_cnt_lmt; 229*4882a593Smuzhiyun u8 data_tx_cnt_lmt_en; 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun /* protection */ 232*4882a593Smuzhiyun u8 rts_en; 233*4882a593Smuzhiyun u8 cts2self; 234*4882a593Smuzhiyun u8 rts_cca_mode; 235*4882a593Smuzhiyun u8 hw_rts_en; 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun /* misc */ 238*4882a593Smuzhiyun u8 mbssid; 239*4882a593Smuzhiyun u8 nav_use_hdr; 240*4882a593Smuzhiyun u8 ack_ch_info; 241*4882a593Smuzhiyun u8 life_time_sel; 242*4882a593Smuzhiyun u8 no_ack; 243*4882a593Smuzhiyun u8 ndpa; 244*4882a593Smuzhiyun u8 snd_pkt_sel; 245*4882a593Smuzhiyun u8 sifs_tx; 246*4882a593Smuzhiyun u8 rtt_en; 247*4882a593Smuzhiyun u8 spe_rpt; 248*4882a593Smuzhiyun u8 raw; 249*4882a593Smuzhiyun u8 sw_define; 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun union { 252*4882a593Smuzhiyun struct rtw_t_mdata_non_dcpu non_dcpu; 253*4882a593Smuzhiyun struct rtw_t_mdata_dcpu dcpu; 254*4882a593Smuzhiyun } u; 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun void *mac_priv; 257*4882a593Smuzhiyun }; 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun /** 261*4882a593Smuzhiyun * packet recv information 262*4882a593Smuzhiyun */ 263*4882a593Smuzhiyun struct rtw_r_meta_data { 264*4882a593Smuzhiyun u8 dma_ch; 265*4882a593Smuzhiyun u8 hal_port; 266*4882a593Smuzhiyun u8 ta[6]; /* Transmitter Address */ 267*4882a593Smuzhiyun u8 ppdu_cnt_chg; 268*4882a593Smuzhiyun #ifdef CONFIG_PHL_CSUM_OFFLOAD_RX 269*4882a593Smuzhiyun u8 chksum_status; /*return mac_chk_rx_tcpip_chksum_ofd,0 is ok ,1 is fail*/ 270*4882a593Smuzhiyun #endif 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun u16 pktlen; /* DW0 [0:13] */ 273*4882a593Smuzhiyun u8 shift; /* DW0 [14:15] */ 274*4882a593Smuzhiyun u8 wl_hd_iv_len; /* DW0 [16:21] */ 275*4882a593Smuzhiyun u8 bb_sel; /* DW0 [22:22] */ 276*4882a593Smuzhiyun u8 mac_info_vld; /* DW0 [23:23] */ 277*4882a593Smuzhiyun u8 rpkt_type; /* DW0 [24:27] */ 278*4882a593Smuzhiyun u8 drv_info_size; /* DW0 [28:30] */ 279*4882a593Smuzhiyun u8 long_rxd; /* DW0 [31:31] */ 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun u8 ppdu_type; /* DW1 [0:3] */ 282*4882a593Smuzhiyun u8 ppdu_cnt; /* DW1 [4:6] */ 283*4882a593Smuzhiyun u8 sr_en; /* DW1 [7:7] */ 284*4882a593Smuzhiyun u8 user_id; /* DW1 [8:15] */ 285*4882a593Smuzhiyun u16 rx_rate; /* DW1 [16:24] */ 286*4882a593Smuzhiyun u8 rx_gi_ltf; /* DW1 [25:27] */ 287*4882a593Smuzhiyun u8 non_srg_ppdu; /* DW1 [28:28] */ 288*4882a593Smuzhiyun u8 inter_ppdu; /* DW1 [29:29] */ 289*4882a593Smuzhiyun u8 bw; /* DW1 [30:31] */ 290*4882a593Smuzhiyun 291*4882a593Smuzhiyun u32 freerun_cnt; /* DW2 [0:31] */ 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun u8 a1_match; /* DW3 [0:0] */ 294*4882a593Smuzhiyun u8 sw_dec; /* DW3 [1:1] */ 295*4882a593Smuzhiyun u8 hw_dec; /* DW3 [2:2] */ 296*4882a593Smuzhiyun u8 ampdu; /* DW3 [3:3] */ 297*4882a593Smuzhiyun u8 ampdu_end_pkt; /* DW3 [4:4] */ 298*4882a593Smuzhiyun u8 amsdu; /* DW3 [5:5] */ 299*4882a593Smuzhiyun u8 amsdu_cut; /* DW3 [6:6] */ 300*4882a593Smuzhiyun u8 last_msdu; /* DW3 [7:7] */ 301*4882a593Smuzhiyun u8 bypass; /* DW3 [8:8] */ 302*4882a593Smuzhiyun u8 crc32; /* DW3 [9:9] */ 303*4882a593Smuzhiyun u8 icverr; /* DW3 [10:10] */ 304*4882a593Smuzhiyun u8 magic_wake; /* DW3 [11:11] */ 305*4882a593Smuzhiyun u8 unicast_wake; /* DW3 [12:12] */ 306*4882a593Smuzhiyun u8 pattern_wake; /* DW3 [13:13] */ 307*4882a593Smuzhiyun u8 get_ch_info; /* DW3 [14:15] */ 308*4882a593Smuzhiyun u8 pattern_idx; /* DW3 [16:20] */ 309*4882a593Smuzhiyun u8 target_idc; /* DW3 [21:23] */ 310*4882a593Smuzhiyun u8 chksum_ofld_en; /* DW3 [24:24] */ 311*4882a593Smuzhiyun u8 with_llc; /* DW3 [25:25] */ 312*4882a593Smuzhiyun u8 rx_statistics; /* DW3 [26:26] */ 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun u8 frame_type; /* DW4 [0:1] */ 315*4882a593Smuzhiyun u8 mc; /* DW4 [2:2] */ 316*4882a593Smuzhiyun u8 bc; /* DW4 [3:3] */ 317*4882a593Smuzhiyun u8 more_data; /* DW4 [4:4] */ 318*4882a593Smuzhiyun u8 more_frag; /* DW4 [5:5] */ 319*4882a593Smuzhiyun u8 pwr_bit; /* DW4 [6:6] */ 320*4882a593Smuzhiyun u8 qos; /* DW4 [7:7] */ 321*4882a593Smuzhiyun u8 tid; /* DW4 [8:11] */ 322*4882a593Smuzhiyun u8 eosp; /* DW4 [12:12] */ 323*4882a593Smuzhiyun u8 htc; /* DW4 [13:13] */ 324*4882a593Smuzhiyun u8 q_null; /* DW4 [14:14] */ 325*4882a593Smuzhiyun u16 seq; /* DW4 [16:27] */ 326*4882a593Smuzhiyun u8 frag_num; /* DW4 [28:31] */ 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun u8 sec_cam_idx; /* DW5 [0:7] */ 329*4882a593Smuzhiyun u8 addr_cam; /* DW5 [8:15] */ 330*4882a593Smuzhiyun u16 macid; /* DW5 [16:23] */ 331*4882a593Smuzhiyun u8 rx_pl_id; /* DW5 [24:27] */ 332*4882a593Smuzhiyun u8 addr_cam_vld; /* DW5 [28:28] */ 333*4882a593Smuzhiyun u8 addr_fwd_en; /* DW5 [29:29] */ 334*4882a593Smuzhiyun u8 rx_pl_match; /* DW5 [30:30] */ 335*4882a593Smuzhiyun 336*4882a593Smuzhiyun u8 mac_addr[6]; /* DW6 [0:31] DW7 [0:15] */ 337*4882a593Smuzhiyun u8 smart_ant; /* DW7 [16:16] */ 338*4882a593Smuzhiyun u8 sec_type; /* DW7 [17:20] */ 339*4882a593Smuzhiyun }; 340*4882a593Smuzhiyun 341*4882a593Smuzhiyun 342*4882a593Smuzhiyun /** 343*4882a593Smuzhiyun * rtw_pkt_buf_list -- store pakcet from upper layer(ex. ndis, kernel, ethernet..) 344*4882a593Smuzhiyun * @vir_addr: virtual address of this packet 345*4882a593Smuzhiyun * @phy_addr_l: lower 32-bit physical address of this packet 346*4882a593Smuzhiyun * @phy_addr_h: higher 32-bit physical address of this packet 347*4882a593Smuzhiyun * @length: length of this packet 348*4882a593Smuzhiyun * @type: tbd 349*4882a593Smuzhiyun */ 350*4882a593Smuzhiyun struct rtw_pkt_buf_list { 351*4882a593Smuzhiyun u8 *vir_addr; 352*4882a593Smuzhiyun u32 phy_addr_l; 353*4882a593Smuzhiyun u32 phy_addr_h; 354*4882a593Smuzhiyun u16 length; 355*4882a593Smuzhiyun }; 356*4882a593Smuzhiyun 357*4882a593Smuzhiyun enum rtw_tx_status { 358*4882a593Smuzhiyun TX_STATUS_TX_DONE, 359*4882a593Smuzhiyun TX_STATUS_TX_FAIL_REACH_RTY_LMT, 360*4882a593Smuzhiyun TX_STATUS_TX_FAIL_LIFETIME_DROP, 361*4882a593Smuzhiyun TX_STATUS_TX_FAIL_MACID_DROP, 362*4882a593Smuzhiyun TX_STATUS_TX_FAIL_SW_DROP, 363*4882a593Smuzhiyun TX_STATUS_TX_FAIL_MAX 364*4882a593Smuzhiyun }; 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun #ifdef CONFIG_PHL_TX_DBG 367*4882a593Smuzhiyun typedef 368*4882a593Smuzhiyun void 369*4882a593Smuzhiyun (*CORE_TX_HANDLE_CALLBACK) 370*4882a593Smuzhiyun ( 371*4882a593Smuzhiyun void *drv_priv, 372*4882a593Smuzhiyun void *pctx, 373*4882a593Smuzhiyun bool btx_ok 374*4882a593Smuzhiyun ); 375*4882a593Smuzhiyun 376*4882a593Smuzhiyun /** 377*4882a593Smuzhiyun * @en_dbg: if en_dbg = true, phl tx will print tx dbg info for this dbg pkt. set the flag from core layer. 378*4882a593Smuzhiyun * @tx_dbg_pkt_type: Identification type, define by core layer 379*4882a593Smuzhiyun * @core_add_tx_t: core layer add tx req to phl time 380*4882a593Smuzhiyun * @enq_pending_wd_t: phl tx enqueue pending wd page time 381*4882a593Smuzhiyun * @recycle_wd_t: phl tx handle the wp report and recycle wd time 382*4882a593Smuzhiyun */ 383*4882a593Smuzhiyun struct rtw_tx_dbg { 384*4882a593Smuzhiyun bool en_dbg; 385*4882a593Smuzhiyun u16 tx_dbg_pkt_type; 386*4882a593Smuzhiyun u32 core_add_tx_t; 387*4882a593Smuzhiyun u32 enq_pending_wd_t; 388*4882a593Smuzhiyun u32 recycle_wd_t; 389*4882a593Smuzhiyun CORE_TX_HANDLE_CALLBACK statecb; 390*4882a593Smuzhiyun void *pctx; 391*4882a593Smuzhiyun }; 392*4882a593Smuzhiyun #endif /* CONFIG_PHL_TX_DBG */ 393*4882a593Smuzhiyun 394*4882a593Smuzhiyun /** 395*4882a593Smuzhiyun * context for tx feedback handler 396*4882a593Smuzhiyun * @drvpriv: driver private 397*4882a593Smuzhiyun * @ctx: private context 398*4882a593Smuzhiyun * @id: module id of this tx packet 399*4882a593Smuzhiyun * @txsts: detail tx status 400*4882a593Smuzhiyun * @txfb_cb: tx feedback handler, currently assign by core layer 401*4882a593Smuzhiyun */ 402*4882a593Smuzhiyun struct rtw_txfb_t { 403*4882a593Smuzhiyun void *drvpriv; 404*4882a593Smuzhiyun void *ctx; 405*4882a593Smuzhiyun enum phl_module_id id; 406*4882a593Smuzhiyun enum rtw_tx_status txsts; 407*4882a593Smuzhiyun void (*txfb_cb)(struct rtw_txfb_t *txfb); 408*4882a593Smuzhiyun }; 409*4882a593Smuzhiyun 410*4882a593Smuzhiyun 411*4882a593Smuzhiyun /** 412*4882a593Smuzhiyun * the xmit request from core layer, store in xmit phl ring 413*4882a593Smuzhiyun * @list: list 414*4882a593Smuzhiyun * @os_priv: the private context from core layer 415*4882a593Smuzhiyun * @mdata: see structure rtw_t_meta_data 416*4882a593Smuzhiyun * @tx_time: xmit requset tx time, unit in ms 417*4882a593Smuzhiyun * @shortcut_id: short cut id this packet will use in phl/hal 418*4882a593Smuzhiyun * @total_len: the total length of pkt_list 419*4882a593Smuzhiyun * @pkt_cnt: the packet number of pkt_list 420*4882a593Smuzhiyun * @pkt_list: see structure rtw_pkt_buf_list 421*4882a593Smuzhiyun * @txfb: tx feedback context 422*4882a593Smuzhiyun * 423*4882a593Smuzhiyun * Note, this structure are visible to core, phl and hal layer 424*4882a593Smuzhiyun */ 425*4882a593Smuzhiyun struct rtw_xmit_req { 426*4882a593Smuzhiyun _os_list list; 427*4882a593Smuzhiyun void *os_priv; 428*4882a593Smuzhiyun enum rtw_treq_type treq_type; 429*4882a593Smuzhiyun struct rtw_t_meta_data mdata; 430*4882a593Smuzhiyun u32 tx_time; 431*4882a593Smuzhiyun u8 shortcut_id; 432*4882a593Smuzhiyun u32 total_len; 433*4882a593Smuzhiyun u8 pkt_cnt; 434*4882a593Smuzhiyun u8 *pkt_list; 435*4882a593Smuzhiyun struct rtw_txfb_t *txfb; 436*4882a593Smuzhiyun #ifdef CONFIG_PHL_TX_DBG 437*4882a593Smuzhiyun struct rtw_tx_dbg tx_dbg; 438*4882a593Smuzhiyun #endif /* CONFIG_PHL_TX_DBG */ 439*4882a593Smuzhiyun }; 440*4882a593Smuzhiyun 441*4882a593Smuzhiyun /** 442*4882a593Smuzhiyun * the recv packet to core layer, store in recv phl ring 443*4882a593Smuzhiyun * @os_priv: the private context from core layer 444*4882a593Smuzhiyun * @mdata: see structure rtw_r_meta_data 445*4882a593Smuzhiyun * @shortcut_id: short cut id this packet will use in phl/hal 446*4882a593Smuzhiyun * @pkt_cnt: the packet counts of pkt_list 447*4882a593Smuzhiyun * @rx_role: the role to which the RX packet is targeted 448*4882a593Smuzhiyun * @tx_sta: the phl sta that sends this packet 449*4882a593Smuzhiyun * @pkt_list: see structure rtw_pkt_buf_list 450*4882a593Smuzhiyun * 451*4882a593Smuzhiyun * Note, this structure are visible to core, phl and hal layer 452*4882a593Smuzhiyun */ 453*4882a593Smuzhiyun struct rtw_recv_pkt { 454*4882a593Smuzhiyun void *os_priv; 455*4882a593Smuzhiyun struct rtw_r_meta_data mdata; 456*4882a593Smuzhiyun u8 shortcut_id; 457*4882a593Smuzhiyun u8 pkt_cnt; 458*4882a593Smuzhiyun u16 os_netbuf_len; 459*4882a593Smuzhiyun struct rtw_wifi_role_t *rx_role; 460*4882a593Smuzhiyun struct rtw_phl_stainfo_t *tx_sta; 461*4882a593Smuzhiyun struct rtw_pkt_buf_list pkt_list[MAX_RX_BUF_SEG_NUM]; 462*4882a593Smuzhiyun struct rtw_phl_ppdu_phy_info phy_info; 463*4882a593Smuzhiyun }; 464*4882a593Smuzhiyun 465*4882a593Smuzhiyun 466*4882a593Smuzhiyun /** 467*4882a593Smuzhiyun * the phl ring which stores XMIT requests can be access by both 468*4882a593Smuzhiyun * core and phl, and all the requests in this ring have the same TID value 469*4882a593Smuzhiyun * @tid: the TID value of this phl ring 470*4882a593Smuzhiyun * @dma_ch: dma channel of this phl ring, query by rtw_hal_tx_chnl_mapping() 471*4882a593Smuzhiyun * @tx_thres: tx threshold of this phl ring for batch handling tx requests 472*4882a593Smuzhiyun * @core_idx: record the index of latest entry accessed by core layer 473*4882a593Smuzhiyun * @phl_idx: record the index of handling done by phl layer 474*4882a593Smuzhiyun * @phl_next_idx: record the index of latest entry accessed by phl layer 475*4882a593Smuzhiyun * @entry: store the pointer of requests assigned to this phl ring 476*4882a593Smuzhiyun */ 477*4882a593Smuzhiyun struct rtw_phl_tx_ring { 478*4882a593Smuzhiyun u8 tid; 479*4882a593Smuzhiyun u8 dma_ch; 480*4882a593Smuzhiyun u16 tx_thres; 481*4882a593Smuzhiyun u16 core_idx; 482*4882a593Smuzhiyun _os_atomic phl_idx; 483*4882a593Smuzhiyun _os_atomic phl_next_idx; 484*4882a593Smuzhiyun u8 *entry[MAX_PHL_TX_RING_ENTRY_NUM];/* change to dynamic allocation */ 485*4882a593Smuzhiyun }; 486*4882a593Smuzhiyun 487*4882a593Smuzhiyun /** 488*4882a593Smuzhiyun * this structure stores sorted tx rings having frames to tx to the same sta 489*4882a593Smuzhiyun * it will change everytime _phl_check_tring_list() executed 490*4882a593Smuzhiyun * @list: link to the next sta which has frames to transmit 491*4882a593Smuzhiyun * @sleep: true if this macid is under power-saving mode 492*4882a593Smuzhiyun * @has_mgnt: true if this macid has management frames to transmit 493*4882a593Smuzhiyun * @has_hiq: true if this macid has hiq frames to transmit 494*4882a593Smuzhiyun * @sorted_ring: pre-sorted phl ring status list of this macid 495*4882a593Smuzhiyun */ 496*4882a593Smuzhiyun struct phl_tx_plan { 497*4882a593Smuzhiyun _os_list list; 498*4882a593Smuzhiyun bool sleep; 499*4882a593Smuzhiyun bool has_mgnt; 500*4882a593Smuzhiyun bool has_hiq; 501*4882a593Smuzhiyun _os_list sorted_ring; 502*4882a593Smuzhiyun }; 503*4882a593Smuzhiyun 504*4882a593Smuzhiyun /** 505*4882a593Smuzhiyun * this phl ring list contains a list of phl TX rings that have the same macid 506*4882a593Smuzhiyun * and different tid, and it can be access by both core and phl 507*4882a593Smuzhiyun * @list: link to next phl ring list with other macid 508*4882a593Smuzhiyun * @macid: the MACID value of this phl ring list 509*4882a593Smuzhiyun * @band: band of this phl ring list, band idx 0~1 510*4882a593Smuzhiyun * @wmm: wmm of this phl ring list, wmm idx 0~1 511*4882a593Smuzhiyun * @port: port of this phl ring list, port idx 0~4 512*4882a593Smuzhiyun * @mbssid: TODO 513*4882a593Smuzhiyun * @phl_ring: the phl rings with same macid but different tid, see rtw_phl_tx_ring 514*4882a593Smuzhiyun * @tx_plan: transmission plan for this macid, decide by _phl_check_tring_list() 515*4882a593Smuzhiyun */ 516*4882a593Smuzhiyun struct rtw_phl_tring_list { 517*4882a593Smuzhiyun _os_list list; 518*4882a593Smuzhiyun u16 macid; 519*4882a593Smuzhiyun u8 band;/*0 or 1*/ 520*4882a593Smuzhiyun u8 wmm;/*0 or 1*/ 521*4882a593Smuzhiyun u8 port; 522*4882a593Smuzhiyun /*u8 mbssid*/ 523*4882a593Smuzhiyun struct rtw_phl_tx_ring phl_ring[MAX_PHL_RING_CAT_NUM];/* tid 0~7, 8:mgnt, 9:hiq */ 524*4882a593Smuzhiyun struct phl_tx_plan tx_plan; 525*4882a593Smuzhiyun }; 526*4882a593Smuzhiyun 527*4882a593Smuzhiyun /** 528*4882a593Smuzhiyun * this phl RX ring can be access by both core and phl 529*4882a593Smuzhiyun * @core_idx: record the index of latest entry accessed by core layer 530*4882a593Smuzhiyun * @phl_idx: record the index of handling done by phl layer 531*4882a593Smuzhiyun * @entry: store the pointer of requests assigned to this phl ring 532*4882a593Smuzhiyun */ 533*4882a593Smuzhiyun struct rtw_phl_rx_ring { 534*4882a593Smuzhiyun _os_atomic core_idx; 535*4882a593Smuzhiyun _os_atomic phl_idx; 536*4882a593Smuzhiyun struct rtw_recv_pkt *entry[MAX_PHL_RX_RING_ENTRY_NUM];/* change to dynamic allocation */ 537*4882a593Smuzhiyun }; 538*4882a593Smuzhiyun 539*4882a593Smuzhiyun 540*4882a593Smuzhiyun /** 541*4882a593Smuzhiyun * the physical address list 542*4882a593Smuzhiyun */ 543*4882a593Smuzhiyun struct rtw_phy_addr_list { 544*4882a593Smuzhiyun _os_list list; 545*4882a593Smuzhiyun u32 phy_addr_l; 546*4882a593Smuzhiyun u32 phy_addr_h; 547*4882a593Smuzhiyun }; 548*4882a593Smuzhiyun 549*4882a593Smuzhiyun /** 550*4882a593Smuzhiyun * the phl pkt tx request from phl layer to hal layer 551*4882a593Smuzhiyun * @wd_page: the buffer of wd page allocated by phl and filled by hal 552*4882a593Smuzhiyun * @wd_len: the phl tx shortcut cached wd_page length, if wd_len = 0 means no phl txsc 553*4882a593Smuzhiyun * @wp_seq: pcie only, wp sequence of this phl packet request 554*4882a593Smuzhiyun * @tx_req: see struct rtw_xmit_req 555*4882a593Smuzhiyun * 556*4882a593Smuzhiyun * Note, this structure should be visible to phl and hal layer (hana_todo) 557*4882a593Smuzhiyun */ 558*4882a593Smuzhiyun struct rtw_phl_pkt_req { 559*4882a593Smuzhiyun u8 *wd_page; 560*4882a593Smuzhiyun u8 wd_len; 561*4882a593Smuzhiyun u16 wp_seq; 562*4882a593Smuzhiyun struct rtw_xmit_req *tx_req; 563*4882a593Smuzhiyun }; 564*4882a593Smuzhiyun 565*4882a593Smuzhiyun /* 566*4882a593Smuzhiyun 0000: WIFI packet 567*4882a593Smuzhiyun 0001: PPDU status 568*4882a593Smuzhiyun 0010: channel info 569*4882a593Smuzhiyun 0011: BB scope mode 570*4882a593Smuzhiyun 0100: F2P TX CMD report 571*4882a593Smuzhiyun 0101: SS2FW report 572*4882a593Smuzhiyun 0110: TX report 573*4882a593Smuzhiyun 0111: TX payload release to host 574*4882a593Smuzhiyun 1000: DFS report 575*4882a593Smuzhiyun 1001: TX payload release to WLCPU 576*4882a593Smuzhiyun 1010: C2H packet */ 577*4882a593Smuzhiyun enum rtw_rx_type { 578*4882a593Smuzhiyun RTW_RX_TYPE_WIFI = 0, 579*4882a593Smuzhiyun RTW_RX_TYPE_PPDU_STATUS = 1, 580*4882a593Smuzhiyun RTW_RX_TYPE_CHANNEL_INFO = 2, 581*4882a593Smuzhiyun RTW_RX_TYPE_TX_RPT = 3, 582*4882a593Smuzhiyun RTW_RX_TYPE_TX_WP_RELEASE_HOST = 4, 583*4882a593Smuzhiyun RTW_RX_TYPE_DFS_RPT = 5, 584*4882a593Smuzhiyun RTW_RX_TYPE_C2H = 6, 585*4882a593Smuzhiyun RTW_RX_TYPE_MAX = 0xFF 586*4882a593Smuzhiyun }; 587*4882a593Smuzhiyun 588*4882a593Smuzhiyun struct rtw_phl_rx_pkt { 589*4882a593Smuzhiyun _os_list list; 590*4882a593Smuzhiyun enum rtw_rx_type type; 591*4882a593Smuzhiyun u8 *rxbuf_ptr; 592*4882a593Smuzhiyun struct rtw_recv_pkt r; 593*4882a593Smuzhiyun }; 594*4882a593Smuzhiyun 595*4882a593Smuzhiyun 596*4882a593Smuzhiyun struct rtw_xmit_recycle { 597*4882a593Smuzhiyun u16 wp_seq; 598*4882a593Smuzhiyun struct rtw_xmit_req *tx_req; 599*4882a593Smuzhiyun }; 600*4882a593Smuzhiyun 601*4882a593Smuzhiyun enum rtw_traffic_dir { 602*4882a593Smuzhiyun TRAFFIC_UL = 0, /* Uplink */ 603*4882a593Smuzhiyun TRAFFIC_DL, /* Downlink */ 604*4882a593Smuzhiyun TRAFFIC_BALANCE, 605*4882a593Smuzhiyun TRAFFIC_MAX 606*4882a593Smuzhiyun }; 607*4882a593Smuzhiyun 608*4882a593Smuzhiyun enum rtw_rx_fltr_mode { 609*4882a593Smuzhiyun RX_FLTR_MODE_SNIFFER, /* 0 */ 610*4882a593Smuzhiyun RX_FLTR_MODE_SCAN, 611*4882a593Smuzhiyun RX_FLTR_MODE_STA_LINKING, 612*4882a593Smuzhiyun RX_FLTR_MODE_STA_NORMAL, 613*4882a593Smuzhiyun RX_FLTR_MODE_AP_NORMAL, 614*4882a593Smuzhiyun RX_FLTR_MODE_RESTORE = 0xFF 615*4882a593Smuzhiyun }; 616*4882a593Smuzhiyun 617*4882a593Smuzhiyun #endif /* __PHL_TRX_DEF_H_ */ 618