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 _TRX_TEST_H_ 16*4882a593Smuzhiyun #define _TRX_TEST_H_ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #ifdef CONFIG_PHL_TEST_SUITE 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define MAX_TEST_TXREQ_NUM 256 21*4882a593Smuzhiyun #define MAX_TEST_PAYLOAD_NUM MAX_TEST_TXREQ_NUM 22*4882a593Smuzhiyun #define MAX_TEST_RXREQ_NUM 256 23*4882a593Smuzhiyun #define MAX_TEST_PAYLOAD_SIZE 2308 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun enum test_mode { 27*4882a593Smuzhiyun TEST_MODE_PHL_TX_RING_TEST = 1, 28*4882a593Smuzhiyun TEST_MODE_PHL_RX_RING_TEST = 2, 29*4882a593Smuzhiyun TEST_MODE_PHL_RING_LOOPBACK = 3, 30*4882a593Smuzhiyun TEST_MODE_PHL_PCIE_LOOPBACK = 4, 31*4882a593Smuzhiyun TEST_MODE_HAL_TX_TEST = 5, 32*4882a593Smuzhiyun TEST_MODE_HAL_RX_TEST = 6, 33*4882a593Smuzhiyun TEST_MODE_HAL_WP_REPORT_PARSE = 7, 34*4882a593Smuzhiyun TEST_MODE_HAL_RXDESC_PARSE = 8, 35*4882a593Smuzhiyun TEST_MODE_HAL_RXBD_PARSE = 9 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun enum pkt_type { 39*4882a593Smuzhiyun TEST_PKT_TYPE_UNI = 1, 40*4882a593Smuzhiyun TEST_PKT_TYPE_MC = 2, 41*4882a593Smuzhiyun TEST_PKT_TYPE_BC = 3, 42*4882a593Smuzhiyun TEST_PKT_TYPE_MAX = 0xFF, 43*4882a593Smuzhiyun }; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun struct rtw_tx_cap { 46*4882a593Smuzhiyun u16 macid; 47*4882a593Smuzhiyun u8 tid; 48*4882a593Smuzhiyun u8 wmm; /* for halmac add role */ 49*4882a593Smuzhiyun u8 dma_ch; 50*4882a593Smuzhiyun u8 band; 51*4882a593Smuzhiyun u8 force_txcap; 52*4882a593Smuzhiyun u16 rate; 53*4882a593Smuzhiyun u8 bw; 54*4882a593Smuzhiyun u8 gi_ltf; 55*4882a593Smuzhiyun u8 stbc; 56*4882a593Smuzhiyun u8 ldpc; 57*4882a593Smuzhiyun u8 bk; 58*4882a593Smuzhiyun u8 type; 59*4882a593Smuzhiyun }; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun struct rtw_pool { 62*4882a593Smuzhiyun u8 *buf; 63*4882a593Smuzhiyun u32 buf_len; 64*4882a593Smuzhiyun _os_list idle_list; 65*4882a593Smuzhiyun _os_list busy_list; 66*4882a593Smuzhiyun _os_lock idle_lock; 67*4882a593Smuzhiyun _os_lock busy_lock; 68*4882a593Smuzhiyun u32 total_cnt; 69*4882a593Smuzhiyun u32 idle_cnt; 70*4882a593Smuzhiyun u32 busy_cnt; 71*4882a593Smuzhiyun }; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun struct rtw_test_rx { 74*4882a593Smuzhiyun _os_list list; 75*4882a593Smuzhiyun u32 test_id; 76*4882a593Smuzhiyun struct rtw_recv_pkt rx; 77*4882a593Smuzhiyun u8 *tpkt; /* for loopback mode */ 78*4882a593Smuzhiyun }; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun struct rtw_payload { 81*4882a593Smuzhiyun _os_list list; 82*4882a593Smuzhiyun u32 test_id; 83*4882a593Smuzhiyun struct rtw_pkt_buf_list pkt; 84*4882a593Smuzhiyun void *os_rsvd[1]; 85*4882a593Smuzhiyun }; 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun struct rtw_trx_test_param { 88*4882a593Smuzhiyun u8 is_trx_test_end; 89*4882a593Smuzhiyun u8 mode; 90*4882a593Smuzhiyun /* parameter for trx resource*/ 91*4882a593Smuzhiyun u32 tx_req_num; 92*4882a593Smuzhiyun u32 rx_req_num; 93*4882a593Smuzhiyun u32 tx_payload_num; 94*4882a593Smuzhiyun u32 tx_payload_size; 95*4882a593Smuzhiyun enum pkt_type pkt_type; 96*4882a593Smuzhiyun u8 ap_mode; 97*4882a593Smuzhiyun u8 trx_mode; 98*4882a593Smuzhiyun u8 qta_mode; 99*4882a593Smuzhiyun u8 qos; 100*4882a593Smuzhiyun u8 cur_addr[6]; /* mac address of this device */ 101*4882a593Smuzhiyun u8 sta_addr[6]; /* mac address of associating device */ 102*4882a593Smuzhiyun u8 bssid[6]; 103*4882a593Smuzhiyun /* parameter for tx capability */ 104*4882a593Smuzhiyun struct rtw_t_meta_data tx_cap; 105*4882a593Smuzhiyun /* parameter for hw configure */ 106*4882a593Smuzhiyun /* misc */ 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun }; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun struct phl_trx_test { 111*4882a593Smuzhiyun _os_list rx_q; 112*4882a593Smuzhiyun _os_lock rx_q_lock; 113*4882a593Smuzhiyun struct rtw_pool tx_req_pool; 114*4882a593Smuzhiyun struct rtw_pool rx_req_pool; 115*4882a593Smuzhiyun struct rtw_pool tx_pkt_pool; 116*4882a593Smuzhiyun struct test_obj_ctrl_interface trx_test_obj; 117*4882a593Smuzhiyun struct rtw_trx_test_param test_param; 118*4882a593Smuzhiyun struct rtw_phl_handler test_rxq_handler; 119*4882a593Smuzhiyun }; 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun #define WHDR_OFST_FRAME_CONTROL 0 122*4882a593Smuzhiyun #define WHDR_OFST_DURATION 2 123*4882a593Smuzhiyun #define WHDR_OFST_ADDRESS1 4 124*4882a593Smuzhiyun #define WHDR_OFST_ADDRESS2 10 125*4882a593Smuzhiyun #define WHDR_OFST_ADDRESS3 16 126*4882a593Smuzhiyun #define WHDR_OFST_SEQUENCE 22 127*4882a593Smuzhiyun #define WHDR_OFST_ADDRESS4 24 128*4882a593Smuzhiyun #define WHDR_QOS_LENGTH 2 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun #define SET_WHDR_PROTOCOL_VERSION(_hdr, _val) \ 131*4882a593Smuzhiyun SET_BITS_TO_LE_2BYTE(_hdr, 0, 2, _val) 132*4882a593Smuzhiyun #define SET_WHDR_TYPE(_hdr, _val) \ 133*4882a593Smuzhiyun SET_BITS_TO_LE_2BYTE(_hdr, 2, 2, _val) 134*4882a593Smuzhiyun #define SET_WHDR_SUBTYPE(_hdr, _val) \ 135*4882a593Smuzhiyun SET_BITS_TO_LE_2BYTE(_hdr, 4, 4, _val) 136*4882a593Smuzhiyun #define SET_WHDR_TO_DS(_hdr, _val) \ 137*4882a593Smuzhiyun SET_BITS_TO_LE_2BYTE(_hdr, 8, 1, _val) 138*4882a593Smuzhiyun #define SET_WHDR_FROM_DS(_hdr, _val) \ 139*4882a593Smuzhiyun SET_BITS_TO_LE_2BYTE(_hdr, 9, 1, _val) 140*4882a593Smuzhiyun #define SET_WHDR_MORE_FRAG(_hdr, _val) \ 141*4882a593Smuzhiyun SET_BITS_TO_LE_2BYTE(_hdr, 10, 1, _val) 142*4882a593Smuzhiyun #define SET_WHDR_RETRY(_hdr, _val) \ 143*4882a593Smuzhiyun SET_BITS_TO_LE_2BYTE(_hdr, 11, 1, _val) 144*4882a593Smuzhiyun #define SET_WHDR_PWR_MGNT(_hdr, _val) \ 145*4882a593Smuzhiyun SET_BITS_TO_LE_2BYTE(_hdr, 12, 1, _val) 146*4882a593Smuzhiyun #define SET_WHDR_MORE_DATA(_hdr, _val) \ 147*4882a593Smuzhiyun SET_BITS_TO_LE_2BYTE(_hdr, 13, 1, _val) 148*4882a593Smuzhiyun #define SET_WHDR_WEP(_hdr, _val) \ 149*4882a593Smuzhiyun SET_BITS_TO_LE_2BYTE(_hdr, 14, 1, _val) 150*4882a593Smuzhiyun #define SET_WHDR_ORDER(_hdr, _val) \ 151*4882a593Smuzhiyun SET_BITS_TO_LE_2BYTE(_hdr, 15, 1, _val) 152*4882a593Smuzhiyun #define SET_WHDR_QOS_EN(_hdr, _val) \ 153*4882a593Smuzhiyun SET_BITS_TO_LE_2BYTE(_hdr, 7, 1, _val) 154*4882a593Smuzhiyun #define SET_WHDR_DURATION(_hdr, _val) \ 155*4882a593Smuzhiyun WriteLE2Byte(_hdr + WHDR_OFST_DURATION, _val) 156*4882a593Smuzhiyun #define SET_WHDR_ADDRESS1(_drv, _hdr, _val) \ 157*4882a593Smuzhiyun _os_mem_cpy(_drv, _hdr + WHDR_OFST_ADDRESS1, _val, 6) 158*4882a593Smuzhiyun #define SET_WHDR_ADDRESS2(_drv, _hdr, _val) \ 159*4882a593Smuzhiyun _os_mem_cpy(_drv, _hdr + WHDR_OFST_ADDRESS2, _val, 6) 160*4882a593Smuzhiyun #define SET_WHDR_ADDRESS3(_drv, _hdr, _val) \ 161*4882a593Smuzhiyun _os_mem_cpy(_drv, _hdr + WHDR_OFST_ADDRESS3, _val, 6) 162*4882a593Smuzhiyun #define SET_WHDR_FRAGMENT_SEQUENCE(_hdr, _val) \ 163*4882a593Smuzhiyun WriteLE2Byte(_hdr + WHDR_OFST_SEQUENCE, _val) 164*4882a593Smuzhiyun #define SET_WHDR_ADDRESS4(_drv, _hdr, _val) \ 165*4882a593Smuzhiyun _os_mem_cpy(_drv, _hdr + WHDR_OFST_ADDRESS4, _val, 6) 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun #define SET_WHDR_QOS_CTRL_STA_DATA_TID(_qos, _value) \ 169*4882a593Smuzhiyun SET_BITS_TO_LE_2BYTE((u8 *)_qos, 0, 4, (u8)(_value)) 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun #define SET_WHDR_QOS_CTRL_STA_DATA_EOSP(_qos, _value) \ 172*4882a593Smuzhiyun SET_BITS_TO_LE_2BYTE((u8 *)_qos, 4, 1, (u8)(_value)) 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun #define SET_WHDR_QOS_CTRL_STA_DATA_ACK_POLICY(_qos, _value) \ 175*4882a593Smuzhiyun SET_BITS_TO_LE_2BYTE((u8 *)_qos, 5, 2, (u8)(_value)) 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun #define SET_WHDR_QOS_CTRL_STA_DATA_AMSDU(_qos, _value) \ 178*4882a593Smuzhiyun SET_BITS_TO_LE_2BYTE((u8 *)_qos, 7, 1, (u8)(_value)) 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun #define SET_WHDR_QOS_CTRL_STA_DATA_TXOP(_qos, _value) \ 181*4882a593Smuzhiyun SET_BITS_TO_LE_1BYTE((u8 *)_qos + 1, 0, 8, (u8)(_value)) 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun enum rtw_phl_status phl_trx_test_init(void *phl); 185*4882a593Smuzhiyun void phl_trx_test_deinit(void *phl); 186*4882a593Smuzhiyun void rtw_phl_trx_default_param(void *phl, 187*4882a593Smuzhiyun struct rtw_trx_test_param *test_param); 188*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_trx_testsuite(void *phl, 189*4882a593Smuzhiyun struct rtw_trx_test_param *test_param); 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun #else /*!CONFIG_PHL_TEST_SUITE*/ 192*4882a593Smuzhiyun #define phl_trx_test_init(phl) 193*4882a593Smuzhiyun #define phl_trx_test_deinit(phl) 194*4882a593Smuzhiyun #define rtw_phl_trx_default_param(phl, test_param) 195*4882a593Smuzhiyun #define rtw_phl_trx_testsuite(phl, test_param) RTW_PHL_STATUS_SUCCESS 196*4882a593Smuzhiyun #endif 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun #endif /*_TRX_TEST_H_*/ 199