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