xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852be/phl/test/trx_test.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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 #define _TRX_TEST_C_
16*4882a593Smuzhiyun #include "../phl_headers.h"
17*4882a593Smuzhiyun #include "../phl_api.h"
18*4882a593Smuzhiyun /*#include "../hal_g6/hal_api_mac.h"*/
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #ifdef CONFIG_PHL_TEST_SUITE
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun void rtw_phl_test_rx_callback(void *context);
23*4882a593Smuzhiyun enum rtw_phl_status phl_recycle_test_tx(void *phl, struct rtw_xmit_req *treq);
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun 
_phl_free_rx_req_pool(void * phl)27*4882a593Smuzhiyun void _phl_free_rx_req_pool(void *phl)
28*4882a593Smuzhiyun {
29*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
30*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
31*4882a593Smuzhiyun 	struct rtw_pool *rx_req_pool = &trx_test->rx_req_pool;
32*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun 	PHL_INFO("_phl_free_rx_req_pool : idle counter (%d), busy counter (%d), total counter (%d)\n",
35*4882a593Smuzhiyun 			 rx_req_pool->idle_cnt, rx_req_pool->busy_cnt, rx_req_pool->total_cnt);
36*4882a593Smuzhiyun 	_os_spinlock_free(drv_priv, &rx_req_pool->idle_lock);
37*4882a593Smuzhiyun 	_os_spinlock_free(drv_priv, &rx_req_pool->busy_lock);
38*4882a593Smuzhiyun 	INIT_LIST_HEAD(&rx_req_pool->idle_list);
39*4882a593Smuzhiyun 	INIT_LIST_HEAD(&rx_req_pool->busy_list);
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun 	if (NULL != rx_req_pool->buf) {
42*4882a593Smuzhiyun 		_os_mem_free(drv_priv, rx_req_pool->buf, rx_req_pool->buf_len);
43*4882a593Smuzhiyun 	}
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun 	rx_req_pool->buf_len = 0;
46*4882a593Smuzhiyun 	rx_req_pool->idle_cnt = 0;
47*4882a593Smuzhiyun 	rx_req_pool->busy_cnt = 0;
48*4882a593Smuzhiyun 	rx_req_pool->total_cnt = 0;
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun }
51*4882a593Smuzhiyun 
_phl_alloc_rx_req_pool(void * phl,u32 rx_req_num)52*4882a593Smuzhiyun enum rtw_phl_status _phl_alloc_rx_req_pool(void *phl, u32 rx_req_num)
53*4882a593Smuzhiyun {
54*4882a593Smuzhiyun 	enum rtw_phl_status status = RTW_PHL_STATUS_FAILURE;
55*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
56*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
57*4882a593Smuzhiyun 	struct rtw_pool *rx_req_pool = &trx_test->rx_req_pool;
58*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
59*4882a593Smuzhiyun 	struct rtw_test_rx *rreq = NULL;
60*4882a593Smuzhiyun 	u32 buf_len = 0, i = 0;
61*4882a593Smuzhiyun 	FUNCIN_WSTS(status);
62*4882a593Smuzhiyun 	do {
63*4882a593Smuzhiyun 		if (0 == rx_req_num)
64*4882a593Smuzhiyun 			break;
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 		rx_req_pool->total_cnt = rx_req_num;
67*4882a593Smuzhiyun 		buf_len = sizeof(struct rtw_test_rx) * rx_req_num;
68*4882a593Smuzhiyun 		rx_req_pool->buf = _os_mem_alloc(drv_priv, buf_len);
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun 		if (NULL == rx_req_pool->buf)
71*4882a593Smuzhiyun 			break;
72*4882a593Smuzhiyun 		rx_req_pool->buf_len = buf_len;
73*4882a593Smuzhiyun 		INIT_LIST_HEAD(&rx_req_pool->idle_list);
74*4882a593Smuzhiyun 		INIT_LIST_HEAD(&rx_req_pool->busy_list);
75*4882a593Smuzhiyun 		_os_spinlock_init(drv_priv, &rx_req_pool->idle_lock);
76*4882a593Smuzhiyun 		_os_spinlock_init(drv_priv, &rx_req_pool->busy_lock);
77*4882a593Smuzhiyun 		rreq = (struct rtw_test_rx *)rx_req_pool->buf;
78*4882a593Smuzhiyun 		for (i = 0; i < rx_req_num; i++) {
79*4882a593Smuzhiyun 			INIT_LIST_HEAD(&rreq[i].list);
80*4882a593Smuzhiyun 			list_add_tail(&rreq[i].list, &rx_req_pool->idle_list);
81*4882a593Smuzhiyun 			rx_req_pool->idle_cnt++;
82*4882a593Smuzhiyun 		}
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun 		status = RTW_PHL_STATUS_SUCCESS;
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	} while (false);
87*4882a593Smuzhiyun 	PHL_INFO("_phl_alloc_rx_req_pool : idle counter (%d), busy counter (%d), total counter (%d)\n",
88*4882a593Smuzhiyun 			 rx_req_pool->idle_cnt, rx_req_pool->busy_cnt, rx_req_pool->total_cnt);
89*4882a593Smuzhiyun 	FUNCOUT_WSTS(status);
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun 	return status;
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun 
_phl_query_idle_rx_req(struct phl_info_t * phl_info)94*4882a593Smuzhiyun struct rtw_test_rx *_phl_query_idle_rx_req(struct phl_info_t *phl_info)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun 	struct rtw_test_rx *rreq = NULL;
97*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
98*4882a593Smuzhiyun 	struct rtw_pool *rx_req_pool = &trx_test->rx_req_pool;
99*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun 	_os_spinlock(drv_priv, &rx_req_pool->idle_lock, _ps, NULL);
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun 	if (false == list_empty(&rx_req_pool->idle_list)) {
104*4882a593Smuzhiyun 		rreq = list_first_entry(&rx_req_pool->idle_list,
105*4882a593Smuzhiyun 				  struct rtw_test_rx, list);
106*4882a593Smuzhiyun 		list_del(&rreq->list);
107*4882a593Smuzhiyun 		rx_req_pool->idle_cnt--;
108*4882a593Smuzhiyun 	}
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun 	_os_spinunlock(drv_priv, &rx_req_pool->idle_lock, _ps, NULL);
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun 	return rreq;
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun 
_phl_query_busy_rx_req(struct phl_info_t * phl_info)115*4882a593Smuzhiyun struct rtw_test_rx *_phl_query_busy_rx_req(struct phl_info_t *phl_info)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun 	struct rtw_test_rx *rreq = NULL;
118*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
119*4882a593Smuzhiyun 	struct rtw_pool *rx_req_pool = &trx_test->rx_req_pool;
120*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 	_os_spinlock(drv_priv, &rx_req_pool->busy_lock, _ps, NULL);
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 	if (false == list_empty(&rx_req_pool->busy_list)) {
125*4882a593Smuzhiyun 		rreq = list_first_entry(&rx_req_pool->busy_list,
126*4882a593Smuzhiyun 				  struct rtw_test_rx, list);
127*4882a593Smuzhiyun 		list_del(&rreq->list);
128*4882a593Smuzhiyun 		rx_req_pool->busy_cnt--;
129*4882a593Smuzhiyun 	}
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 	_os_spinunlock(drv_priv, &rx_req_pool->busy_lock, _ps, NULL);
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun 	return rreq;
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun 
_phl_release_rx_req(struct phl_info_t * phl_info,struct rtw_test_rx * rreq)136*4882a593Smuzhiyun void _phl_release_rx_req(struct phl_info_t *phl_info, struct rtw_test_rx *rreq)
137*4882a593Smuzhiyun {
138*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
139*4882a593Smuzhiyun 	struct rtw_pool *rx_req_pool = &trx_test->rx_req_pool;
140*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun 	_os_spinlock(drv_priv, &rx_req_pool->idle_lock, _ps, NULL);
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun 	_os_mem_set(drv_priv, &rreq->rx.mdata, 0,
145*4882a593Smuzhiyun 		    sizeof(rreq->rx.mdata));
146*4882a593Smuzhiyun 	_os_mem_set(drv_priv, &rreq->rx.pkt_list, 0,
147*4882a593Smuzhiyun 		    sizeof(rreq->rx.pkt_list) * rreq->rx.pkt_cnt);
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun 	rreq->rx.shortcut_id = 0;
150*4882a593Smuzhiyun 	rreq->rx.pkt_cnt = 0;
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 	INIT_LIST_HEAD(&rreq->list);
153*4882a593Smuzhiyun 	list_add_tail(&rreq->list, &rx_req_pool->idle_list);
154*4882a593Smuzhiyun 	rx_req_pool->idle_cnt++;
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun 	_os_spinunlock(drv_priv, &rx_req_pool->idle_lock, _ps, NULL);
157*4882a593Smuzhiyun }
158*4882a593Smuzhiyun 
_phl_insert_busy_rx_req(struct phl_info_t * phl_info,struct rtw_test_rx * rreq)159*4882a593Smuzhiyun void _phl_insert_busy_rx_req(struct phl_info_t *phl_info, struct rtw_test_rx *rreq)
160*4882a593Smuzhiyun {
161*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
162*4882a593Smuzhiyun 	struct rtw_pool *rx_req_pool = &trx_test->rx_req_pool;
163*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun 	_os_spinlock(drv_priv, &rx_req_pool->busy_lock, _ps, NULL);
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun 	list_add_tail(&rreq->list, &rx_req_pool->busy_list);
168*4882a593Smuzhiyun 	rx_req_pool->busy_cnt++;
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun 	_os_spinunlock(drv_priv, &rx_req_pool->busy_lock, _ps, NULL);
171*4882a593Smuzhiyun }
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun 
_phl_free_tx_req_pool(void * phl)174*4882a593Smuzhiyun void _phl_free_tx_req_pool(void *phl)
175*4882a593Smuzhiyun {
176*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
177*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
178*4882a593Smuzhiyun 	struct rtw_pool *tx_req_pool = &trx_test->tx_req_pool;
179*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun 	PHL_INFO("_phl_free_tx_req_pool : idle counter (%d), busy counter (%d), total counter (%d)\n",
182*4882a593Smuzhiyun 			 tx_req_pool->idle_cnt, tx_req_pool->busy_cnt, tx_req_pool->total_cnt);
183*4882a593Smuzhiyun 	_os_spinlock_free(drv_priv, &tx_req_pool->idle_lock);
184*4882a593Smuzhiyun 	_os_spinlock_free(drv_priv, &tx_req_pool->busy_lock);
185*4882a593Smuzhiyun 	INIT_LIST_HEAD(&tx_req_pool->idle_list);
186*4882a593Smuzhiyun 	INIT_LIST_HEAD(&tx_req_pool->busy_list);
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun 	if (NULL != tx_req_pool->buf) {
189*4882a593Smuzhiyun 		_os_mem_free(drv_priv, tx_req_pool->buf, tx_req_pool->buf_len);
190*4882a593Smuzhiyun 	}
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun 	tx_req_pool->buf_len = 0;
193*4882a593Smuzhiyun 	tx_req_pool->idle_cnt = 0;
194*4882a593Smuzhiyun 	tx_req_pool->busy_cnt = 0;
195*4882a593Smuzhiyun 	tx_req_pool->total_cnt = 0;
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun 
_phl_alloc_tx_req_pool(void * phl,u32 tx_req_num)199*4882a593Smuzhiyun enum rtw_phl_status _phl_alloc_tx_req_pool(void *phl, u32 tx_req_num)
200*4882a593Smuzhiyun {
201*4882a593Smuzhiyun 	enum rtw_phl_status status = RTW_PHL_STATUS_FAILURE;
202*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
203*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
204*4882a593Smuzhiyun 	struct rtw_pool *tx_req_pool = &trx_test->tx_req_pool;
205*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
206*4882a593Smuzhiyun 	struct rtw_xmit_req *treq = NULL;
207*4882a593Smuzhiyun 	u32 buf_len = 0, i = 0;
208*4882a593Smuzhiyun 	FUNCIN_WSTS(status);
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	do {
211*4882a593Smuzhiyun 		if (0 == tx_req_num)
212*4882a593Smuzhiyun 			break;
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun 		tx_req_pool->total_cnt = tx_req_num;
215*4882a593Smuzhiyun 		buf_len = sizeof(struct rtw_xmit_req) * tx_req_num;
216*4882a593Smuzhiyun 		tx_req_pool->buf = _os_mem_alloc(drv_priv, buf_len);
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 		if (NULL == tx_req_pool->buf)
219*4882a593Smuzhiyun 			break;
220*4882a593Smuzhiyun 		tx_req_pool->buf_len = buf_len;
221*4882a593Smuzhiyun 		INIT_LIST_HEAD(&tx_req_pool->idle_list);
222*4882a593Smuzhiyun 		INIT_LIST_HEAD(&tx_req_pool->busy_list);
223*4882a593Smuzhiyun 		_os_spinlock_init(drv_priv, &tx_req_pool->idle_lock);
224*4882a593Smuzhiyun 		_os_spinlock_init(drv_priv, &tx_req_pool->busy_lock);
225*4882a593Smuzhiyun 		treq = (struct rtw_xmit_req *)tx_req_pool->buf;
226*4882a593Smuzhiyun 		for (i = 0; i < tx_req_num; i++) {
227*4882a593Smuzhiyun 			INIT_LIST_HEAD(&treq[i].list);
228*4882a593Smuzhiyun 			treq[i].treq_type = RTW_PHL_TREQ_TYPE_TEST_PATTERN;
229*4882a593Smuzhiyun 			list_add_tail(&treq[i].list, &tx_req_pool->idle_list);
230*4882a593Smuzhiyun 			tx_req_pool->idle_cnt++;
231*4882a593Smuzhiyun 		}
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 		status = RTW_PHL_STATUS_SUCCESS;
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun 	} while (false);
236*4882a593Smuzhiyun 	PHL_INFO("_phl_alloc_tx_req_pool : idle counter (%d), busy counter (%d), total counter (%d)\n",
237*4882a593Smuzhiyun 			 tx_req_pool->idle_cnt, tx_req_pool->busy_cnt, tx_req_pool->total_cnt);
238*4882a593Smuzhiyun 	FUNCOUT_WSTS(status);
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun 	return status;
241*4882a593Smuzhiyun }
242*4882a593Smuzhiyun 
_phl_query_idle_tx_req(struct phl_info_t * phl_info)243*4882a593Smuzhiyun struct rtw_xmit_req *_phl_query_idle_tx_req(struct phl_info_t *phl_info)
244*4882a593Smuzhiyun {
245*4882a593Smuzhiyun 	struct rtw_xmit_req *treq = NULL;
246*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
247*4882a593Smuzhiyun 	struct rtw_pool *tx_req_pool = &trx_test->tx_req_pool;
248*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	_os_spinlock(drv_priv, &tx_req_pool->idle_lock, _ps, NULL);
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun 	if (false == list_empty(&tx_req_pool->idle_list)) {
253*4882a593Smuzhiyun 		treq = list_first_entry(&tx_req_pool->idle_list,
254*4882a593Smuzhiyun 				  struct rtw_xmit_req, list);
255*4882a593Smuzhiyun 		list_del(&treq->list);
256*4882a593Smuzhiyun 		tx_req_pool->idle_cnt--;
257*4882a593Smuzhiyun 	}
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun 	_os_spinunlock(drv_priv, &tx_req_pool->idle_lock, _ps, NULL);
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun 	return treq;
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun 
_phl_query_busy_tx_req(struct phl_info_t * phl_info)264*4882a593Smuzhiyun struct rtw_xmit_req *_phl_query_busy_tx_req(struct phl_info_t *phl_info)
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
267*4882a593Smuzhiyun 	struct rtw_pool *tx_req_pool = &trx_test->tx_req_pool;
268*4882a593Smuzhiyun 	struct rtw_xmit_req *treq = NULL;
269*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun 	_os_spinlock(drv_priv, &tx_req_pool->busy_lock, _ps, NULL);
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun 	if (false == list_empty(&tx_req_pool->busy_list)) {
274*4882a593Smuzhiyun 		treq = list_first_entry(&tx_req_pool->busy_list,
275*4882a593Smuzhiyun 				  struct rtw_xmit_req, list);
276*4882a593Smuzhiyun 		list_del(&treq->list);
277*4882a593Smuzhiyun 		tx_req_pool->busy_cnt--;
278*4882a593Smuzhiyun 	}
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 	_os_spinunlock(drv_priv, &tx_req_pool->busy_lock, _ps, NULL);
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun 	return treq;
283*4882a593Smuzhiyun }
284*4882a593Smuzhiyun 
_phl_remove_busy_tx_req(struct phl_info_t * phl_info,struct rtw_xmit_req * treq)285*4882a593Smuzhiyun void _phl_remove_busy_tx_req(struct phl_info_t *phl_info, struct rtw_xmit_req *treq)
286*4882a593Smuzhiyun {
287*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
288*4882a593Smuzhiyun 	struct rtw_pool *tx_req_pool = &trx_test->tx_req_pool;
289*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun 	_os_spinlock(drv_priv, &tx_req_pool->busy_lock, _ps, NULL);
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun 	if (false == list_empty(&tx_req_pool->busy_list)) {
294*4882a593Smuzhiyun 		list_del(&treq->list);
295*4882a593Smuzhiyun 		tx_req_pool->busy_cnt--;
296*4882a593Smuzhiyun 	}
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 	_os_spinunlock(drv_priv, &tx_req_pool->busy_lock, _ps, NULL);
299*4882a593Smuzhiyun }
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun 
_phl_release_tx_req(struct phl_info_t * phl_info,struct rtw_xmit_req * treq)302*4882a593Smuzhiyun void _phl_release_tx_req(struct phl_info_t *phl_info, struct rtw_xmit_req *treq)
303*4882a593Smuzhiyun {
304*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
305*4882a593Smuzhiyun 	struct rtw_pool *tx_req_pool = &trx_test->tx_req_pool;
306*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun 	_os_spinlock(drv_priv, &tx_req_pool->idle_lock, _ps, NULL);
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun 	_os_mem_set(drv_priv, &treq->mdata, 0, sizeof(treq->mdata));
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun 	treq->shortcut_id = 0;
313*4882a593Smuzhiyun 	treq->total_len = 0;
314*4882a593Smuzhiyun 	treq->pkt_cnt = 0;
315*4882a593Smuzhiyun 	treq->pkt_list = NULL;
316*4882a593Smuzhiyun 	treq->os_priv = NULL;
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 	INIT_LIST_HEAD(&treq->list);
319*4882a593Smuzhiyun 	list_add_tail(&treq->list, &tx_req_pool->idle_list);
320*4882a593Smuzhiyun 	tx_req_pool->idle_cnt++;
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun 	_os_spinunlock(drv_priv, &tx_req_pool->idle_lock, _ps, NULL);
323*4882a593Smuzhiyun }
324*4882a593Smuzhiyun 
_phl_insert_busy_tx_req(struct phl_info_t * phl_info,struct rtw_xmit_req * treq)325*4882a593Smuzhiyun void _phl_insert_busy_tx_req(struct phl_info_t *phl_info, struct rtw_xmit_req *treq)
326*4882a593Smuzhiyun {
327*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
328*4882a593Smuzhiyun 	struct rtw_pool *tx_req_pool = &trx_test->tx_req_pool;
329*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun 	_os_spinlock(drv_priv, &tx_req_pool->busy_lock, _ps, NULL);
332*4882a593Smuzhiyun 	list_add_tail(&treq->list, &tx_req_pool->busy_list);
333*4882a593Smuzhiyun 	tx_req_pool->busy_cnt++;
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun 	_os_spinunlock(drv_priv, &tx_req_pool->busy_lock, _ps, NULL);
336*4882a593Smuzhiyun }
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun 
_phl_free_tx_pkt_pool(void * phl)339*4882a593Smuzhiyun void _phl_free_tx_pkt_pool(void *phl)
340*4882a593Smuzhiyun {
341*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
342*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
343*4882a593Smuzhiyun 	struct rtw_pool *tx_pkt_pool = &trx_test->tx_pkt_pool;
344*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
345*4882a593Smuzhiyun 	struct rtw_payload *tpkt = NULL;
346*4882a593Smuzhiyun 	u32 i = 0;
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun 	PHL_INFO("_phl_free_tx_pkt_pool : idle counter (%d), busy counter (%d), total counter (%d)\n",
349*4882a593Smuzhiyun 			 tx_pkt_pool->idle_cnt, tx_pkt_pool->busy_cnt, tx_pkt_pool->total_cnt);
350*4882a593Smuzhiyun 	_os_spinlock_free(drv_priv, &tx_pkt_pool->idle_lock);
351*4882a593Smuzhiyun 	_os_spinlock_free(drv_priv, &tx_pkt_pool->busy_lock);
352*4882a593Smuzhiyun 	INIT_LIST_HEAD(&tx_pkt_pool->idle_list);
353*4882a593Smuzhiyun 	INIT_LIST_HEAD(&tx_pkt_pool->busy_list);
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun 	tpkt = (struct rtw_payload *)tx_pkt_pool->buf;
356*4882a593Smuzhiyun 	for (i = 0; i <	tx_pkt_pool->total_cnt; i++) {
357*4882a593Smuzhiyun 		INIT_LIST_HEAD(&tpkt->list);
358*4882a593Smuzhiyun 		if (NULL != tpkt->pkt.vir_addr) {
359*4882a593Smuzhiyun 			#ifdef CONFIG_PCI_HCI
360*4882a593Smuzhiyun 			_os_shmem_free(drv_priv, NULL,
361*4882a593Smuzhiyun 						tpkt->pkt.vir_addr,
362*4882a593Smuzhiyun 						(_dma *)&tpkt->pkt.phy_addr_l,
363*4882a593Smuzhiyun 						(_dma *)&tpkt->pkt.phy_addr_h,
364*4882a593Smuzhiyun 						MAX_TEST_PAYLOAD_SIZE,
365*4882a593Smuzhiyun 						false,
366*4882a593Smuzhiyun 						PCI_DMA_TODEVICE,
367*4882a593Smuzhiyun 						tpkt->os_rsvd[0]);
368*4882a593Smuzhiyun 			#else
369*4882a593Smuzhiyun 			_os_mem_free(drv_priv, tpkt->pkt.vir_addr,
370*4882a593Smuzhiyun 							tpkt->pkt.length);
371*4882a593Smuzhiyun 			#endif
372*4882a593Smuzhiyun 		}
373*4882a593Smuzhiyun 		tpkt->pkt.length = 0;
374*4882a593Smuzhiyun 		tpkt++;
375*4882a593Smuzhiyun 	}
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun 	if (NULL != tx_pkt_pool->buf) {
378*4882a593Smuzhiyun 		_os_mem_free(drv_priv, tx_pkt_pool->buf, tx_pkt_pool->buf_len);
379*4882a593Smuzhiyun 	}
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun 	tx_pkt_pool->buf_len = 0;
382*4882a593Smuzhiyun 	tx_pkt_pool->idle_cnt = 0;
383*4882a593Smuzhiyun 	tx_pkt_pool->busy_cnt = 0;
384*4882a593Smuzhiyun 	tx_pkt_pool->total_cnt = 0;
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun }
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun 
_phl_alloc_tx_pkt_pool(void * phl,u32 tx_pkt_num,u32 tx_pkt_size)389*4882a593Smuzhiyun enum rtw_phl_status _phl_alloc_tx_pkt_pool(void *phl, u32 tx_pkt_num,
390*4882a593Smuzhiyun 					   u32 tx_pkt_size)
391*4882a593Smuzhiyun {
392*4882a593Smuzhiyun 	enum rtw_phl_status status = RTW_PHL_STATUS_FAILURE;
393*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
394*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
395*4882a593Smuzhiyun 	struct rtw_pool *tx_pkt_pool = &trx_test->tx_pkt_pool;
396*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
397*4882a593Smuzhiyun 	struct rtw_payload *tpkt = NULL;
398*4882a593Smuzhiyun 	u32 buf_len = 0, i = 0;
399*4882a593Smuzhiyun 	FUNCIN_WSTS(status);
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun 	do {
402*4882a593Smuzhiyun 		if (0 == tx_pkt_num)
403*4882a593Smuzhiyun 			break;
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun 		tx_pkt_pool->total_cnt = tx_pkt_num;
406*4882a593Smuzhiyun 		buf_len = sizeof(struct rtw_payload) * tx_pkt_num;
407*4882a593Smuzhiyun 		tx_pkt_pool->buf = _os_mem_alloc(drv_priv, buf_len);
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun 		if (NULL == tx_pkt_pool->buf)
410*4882a593Smuzhiyun 			break;
411*4882a593Smuzhiyun 		tx_pkt_pool->buf_len = buf_len;
412*4882a593Smuzhiyun 		INIT_LIST_HEAD(&tx_pkt_pool->idle_list);
413*4882a593Smuzhiyun 		INIT_LIST_HEAD(&tx_pkt_pool->busy_list);
414*4882a593Smuzhiyun 		_os_spinlock_init(drv_priv, &tx_pkt_pool->idle_lock);
415*4882a593Smuzhiyun 		_os_spinlock_init(drv_priv, &tx_pkt_pool->busy_lock);
416*4882a593Smuzhiyun 		tpkt = (struct rtw_payload *)tx_pkt_pool->buf;
417*4882a593Smuzhiyun 		for (i = 0; i < tx_pkt_num; i++) {
418*4882a593Smuzhiyun 			INIT_LIST_HEAD(&tpkt[i].list);
419*4882a593Smuzhiyun 			#ifdef CONFIG_PCI_HCI
420*4882a593Smuzhiyun 			tpkt[i].pkt.vir_addr = _os_shmem_alloc(drv_priv, NULL,
421*4882a593Smuzhiyun 						  (_dma *)&tpkt[i].pkt.phy_addr_l,
422*4882a593Smuzhiyun 						  (_dma *)&tpkt[i].pkt.phy_addr_h,
423*4882a593Smuzhiyun 						  tx_pkt_size,
424*4882a593Smuzhiyun 						  false,
425*4882a593Smuzhiyun 						  PCI_DMA_TODEVICE,
426*4882a593Smuzhiyun 						  &tpkt[i].os_rsvd[0]);
427*4882a593Smuzhiyun 			#else /*USB/SDIO*/
428*4882a593Smuzhiyun 			tpkt[i].pkt.vir_addr = _os_mem_alloc(drv_priv, tx_pkt_size);
429*4882a593Smuzhiyun 			#endif
430*4882a593Smuzhiyun 			if (NULL == tpkt[i].pkt.vir_addr) {
431*4882a593Smuzhiyun 				PHL_WARN("allocate tx pkt buf fail\n");
432*4882a593Smuzhiyun 				break;
433*4882a593Smuzhiyun 			}
434*4882a593Smuzhiyun 
435*4882a593Smuzhiyun 			/* hana_todo */
436*4882a593Smuzhiyun 			/* tpkt[i].pkt.phy_addr_l = 0; */
437*4882a593Smuzhiyun 			/* tpkt[i].pkt.phy_addr_h = 0; */
438*4882a593Smuzhiyun 			tpkt[i].pkt.length = (u16)tx_pkt_size;
439*4882a593Smuzhiyun 			tpkt[i].test_id = i;
440*4882a593Smuzhiyun 
441*4882a593Smuzhiyun 			list_add_tail(&tpkt[i].list, &tx_pkt_pool->idle_list);
442*4882a593Smuzhiyun 			tx_pkt_pool->idle_cnt++;
443*4882a593Smuzhiyun 		}
444*4882a593Smuzhiyun 
445*4882a593Smuzhiyun 		status = RTW_PHL_STATUS_SUCCESS;
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun 	} while (false);
448*4882a593Smuzhiyun 	PHL_INFO("_phl_alloc_tx_pkt_pool : idle counter (%d), busy counter (%d), total counter (%d)\n",
449*4882a593Smuzhiyun 			 tx_pkt_pool->idle_cnt, tx_pkt_pool->busy_cnt, tx_pkt_pool->total_cnt);
450*4882a593Smuzhiyun 	FUNCOUT_WSTS(status);
451*4882a593Smuzhiyun 
452*4882a593Smuzhiyun 	return status;
453*4882a593Smuzhiyun }
454*4882a593Smuzhiyun 
_phl_query_idle_tx_pkt(struct phl_info_t * phl_info)455*4882a593Smuzhiyun struct rtw_payload *_phl_query_idle_tx_pkt(struct phl_info_t *phl_info)
456*4882a593Smuzhiyun {
457*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
458*4882a593Smuzhiyun 	struct rtw_pool *tx_pkt_pool = &trx_test->tx_pkt_pool;
459*4882a593Smuzhiyun 	struct rtw_payload *tpkt = NULL;
460*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun 	_os_spinlock(drv_priv, &tx_pkt_pool->idle_lock, _ps, NULL);
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun 	if (false == list_empty(&tx_pkt_pool->idle_list)) {
465*4882a593Smuzhiyun 		tpkt = list_first_entry(&tx_pkt_pool->idle_list,
466*4882a593Smuzhiyun 				  struct rtw_payload, list);
467*4882a593Smuzhiyun 		list_del(&tpkt->list);
468*4882a593Smuzhiyun 		tx_pkt_pool->idle_cnt--;
469*4882a593Smuzhiyun 	}
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun 	_os_spinunlock(drv_priv, &tx_pkt_pool->idle_lock, _ps, NULL);
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun 	return tpkt;
474*4882a593Smuzhiyun }
475*4882a593Smuzhiyun 
_phl_query_busy_tx_pkt(struct phl_info_t * phl_info)476*4882a593Smuzhiyun struct rtw_payload *_phl_query_busy_tx_pkt(struct phl_info_t *phl_info)
477*4882a593Smuzhiyun {
478*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
479*4882a593Smuzhiyun 	struct rtw_pool *tx_pkt_pool = &trx_test->tx_pkt_pool;
480*4882a593Smuzhiyun 	struct rtw_payload *tpkt = NULL;
481*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
482*4882a593Smuzhiyun 
483*4882a593Smuzhiyun 	_os_spinlock(drv_priv, &tx_pkt_pool->busy_lock, _ps, NULL);
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun 	if (false == list_empty(&tx_pkt_pool->busy_list)) {
486*4882a593Smuzhiyun 		tpkt = list_first_entry(&tx_pkt_pool->busy_list,
487*4882a593Smuzhiyun 				  struct rtw_payload, list);
488*4882a593Smuzhiyun 		list_del(&tpkt->list);
489*4882a593Smuzhiyun 		tx_pkt_pool->busy_cnt--;
490*4882a593Smuzhiyun 	}
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun 	_os_spinunlock(drv_priv, &tx_pkt_pool->busy_lock, _ps, NULL);
493*4882a593Smuzhiyun 
494*4882a593Smuzhiyun 	return tpkt;
495*4882a593Smuzhiyun }
496*4882a593Smuzhiyun 
_phl_remove_busy_tx_pkt(struct phl_info_t * phl_info,struct rtw_payload * tpkt)497*4882a593Smuzhiyun void _phl_remove_busy_tx_pkt(struct phl_info_t *phl_info, struct rtw_payload *tpkt)
498*4882a593Smuzhiyun {
499*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
500*4882a593Smuzhiyun 	struct rtw_pool *tx_pkt_pool = &trx_test->tx_pkt_pool;
501*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun 	_os_spinlock(drv_priv, &tx_pkt_pool->busy_lock, _ps, NULL);
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun 	if (false == list_empty(&tx_pkt_pool->busy_list)) {
506*4882a593Smuzhiyun 		list_del(&tpkt->list);
507*4882a593Smuzhiyun 		tx_pkt_pool->busy_cnt--;
508*4882a593Smuzhiyun 	}
509*4882a593Smuzhiyun 
510*4882a593Smuzhiyun 	_os_spinunlock(drv_priv, &tx_pkt_pool->busy_lock, _ps, NULL);
511*4882a593Smuzhiyun }
512*4882a593Smuzhiyun 
513*4882a593Smuzhiyun 
_phl_release_tx_pkt(struct phl_info_t * phl_info,struct rtw_payload * tpkt)514*4882a593Smuzhiyun void _phl_release_tx_pkt(struct phl_info_t *phl_info, struct rtw_payload *tpkt)
515*4882a593Smuzhiyun {
516*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
517*4882a593Smuzhiyun 	struct rtw_pool *tx_pkt_pool = &trx_test->tx_pkt_pool;
518*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun 	_os_spinlock(drv_priv, &tx_pkt_pool->idle_lock, _ps, NULL);
521*4882a593Smuzhiyun 
522*4882a593Smuzhiyun 	_os_mem_set(drv_priv, tpkt->pkt.vir_addr, 0, tpkt->pkt.length);
523*4882a593Smuzhiyun 	tpkt->pkt.length = 0;
524*4882a593Smuzhiyun 
525*4882a593Smuzhiyun 	INIT_LIST_HEAD(&tpkt->list);
526*4882a593Smuzhiyun 	list_add_tail(&tpkt->list, &tx_pkt_pool->idle_list);
527*4882a593Smuzhiyun 	tx_pkt_pool->idle_cnt++;
528*4882a593Smuzhiyun 
529*4882a593Smuzhiyun 	_os_spinunlock(drv_priv, &tx_pkt_pool->idle_lock, _ps, NULL);
530*4882a593Smuzhiyun }
531*4882a593Smuzhiyun 
_phl_insert_busy_tx_pkt(struct phl_info_t * phl_info,struct rtw_payload * tpkt)532*4882a593Smuzhiyun void _phl_insert_busy_tx_pkt(struct phl_info_t *phl_info, struct rtw_payload *tpkt)
533*4882a593Smuzhiyun {
534*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
535*4882a593Smuzhiyun 	struct rtw_pool *tx_pkt_pool = &trx_test->tx_pkt_pool;
536*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
537*4882a593Smuzhiyun 
538*4882a593Smuzhiyun 	_os_spinlock(drv_priv, &tx_pkt_pool->busy_lock, _ps, NULL);
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun 	list_add_tail(&tpkt->list, &tx_pkt_pool->busy_list);
541*4882a593Smuzhiyun 	tx_pkt_pool->busy_cnt++;
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun 	_os_spinunlock(drv_priv, &tx_pkt_pool->busy_lock, _ps, NULL);
544*4882a593Smuzhiyun }
545*4882a593Smuzhiyun 
_phl_is_tx_test_done(void * phl)546*4882a593Smuzhiyun u8 _phl_is_tx_test_done(void *phl)
547*4882a593Smuzhiyun {
548*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
549*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
550*4882a593Smuzhiyun 	struct rtw_pool *tx_req_pool = &trx_test->tx_req_pool;
551*4882a593Smuzhiyun 	struct rtw_pool *tx_pkt_pool = &trx_test->tx_pkt_pool;
552*4882a593Smuzhiyun 
553*4882a593Smuzhiyun 	if (list_empty(&tx_req_pool->busy_list) && list_empty(&tx_pkt_pool->busy_list))
554*4882a593Smuzhiyun 		return true;
555*4882a593Smuzhiyun 	else
556*4882a593Smuzhiyun 		return false;
557*4882a593Smuzhiyun }
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun 
560*4882a593Smuzhiyun 
phl_update_test_param(void * phl,struct rtw_trx_test_param * test_param)561*4882a593Smuzhiyun void phl_update_test_param(void *phl, struct rtw_trx_test_param *test_param)
562*4882a593Smuzhiyun {
563*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
564*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
565*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
566*4882a593Smuzhiyun 
567*4882a593Smuzhiyun 	_os_mem_cpy(drv_priv, &trx_test->test_param, test_param, sizeof(*test_param));
568*4882a593Smuzhiyun }
569*4882a593Smuzhiyun 
570*4882a593Smuzhiyun extern enum rtw_phl_status
571*4882a593Smuzhiyun phl_wifi_role_start(struct phl_info_t *phl_info,
572*4882a593Smuzhiyun 				struct rtw_wifi_role_t *wrole,
573*4882a593Smuzhiyun 				struct rtw_phl_stainfo_t *sta);
_phl_test_add_role(void * phl,struct rtw_trx_test_param * test_param)574*4882a593Smuzhiyun enum rtw_phl_status _phl_test_add_role(
575*4882a593Smuzhiyun 					   void *phl,
576*4882a593Smuzhiyun 				       struct rtw_trx_test_param *test_param)
577*4882a593Smuzhiyun {
578*4882a593Smuzhiyun 	enum rtw_phl_status phl_status = RTW_PHL_STATUS_FAILURE;
579*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
580*4882a593Smuzhiyun 	struct rtw_phl_com_t *phl_com = phl_info->phl_com;
581*4882a593Smuzhiyun 	struct rtw_t_meta_data *txcap = NULL;
582*4882a593Smuzhiyun 	struct rtw_wifi_role_t *test_wrole = &phl_com->wifi_roles[0];
583*4882a593Smuzhiyun 	struct rtw_phl_stainfo_t *sta_info = NULL;
584*4882a593Smuzhiyun 
585*4882a593Smuzhiyun 	if (NULL != test_param) {
586*4882a593Smuzhiyun 		txcap = &test_param->tx_cap;
587*4882a593Smuzhiyun 
588*4882a593Smuzhiyun 		test_wrole->hw_band = txcap->band;
589*4882a593Smuzhiyun 		test_wrole->hw_port = (u8)txcap->macid;
590*4882a593Smuzhiyun 
591*4882a593Smuzhiyun 		sta_info = rtw_phl_get_stainfo_by_addr(phl_info, test_wrole, test_wrole->mac_addr);
592*4882a593Smuzhiyun 		if (NULL != sta_info) {
593*4882a593Smuzhiyun 			test_param->tx_cap.macid = sta_info->macid;
594*4882a593Smuzhiyun 			phl_status = phl_wifi_role_start(phl_info, test_wrole, sta_info);
595*4882a593Smuzhiyun 			PHL_INFO("update test param macid to %d\n", test_param->tx_cap.macid);
596*4882a593Smuzhiyun 		} else {
597*4882a593Smuzhiyun 			PHL_ERR("fail to get stainfo from test wrole!\n");
598*4882a593Smuzhiyun 			phl_status = RTW_PHL_STATUS_FAILURE;
599*4882a593Smuzhiyun 		}
600*4882a593Smuzhiyun 	}
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun 	return phl_status;
603*4882a593Smuzhiyun }
604*4882a593Smuzhiyun 
605*4882a593Smuzhiyun extern enum rtw_phl_status
606*4882a593Smuzhiyun phl_wifi_role_stop(struct phl_info_t *phl_info, struct rtw_wifi_role_t *wrole);
_phl_test_remove_role(void * phl,struct rtw_trx_test_param * test_param)607*4882a593Smuzhiyun enum rtw_phl_status _phl_test_remove_role(
608*4882a593Smuzhiyun 					   void *phl,
609*4882a593Smuzhiyun 				       struct rtw_trx_test_param *test_param)
610*4882a593Smuzhiyun {
611*4882a593Smuzhiyun 	enum rtw_phl_status phl_status = RTW_PHL_STATUS_FAILURE;
612*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
613*4882a593Smuzhiyun 	struct rtw_phl_com_t *phl_com = phl_info->phl_com;
614*4882a593Smuzhiyun 	struct rtw_wifi_role_t *test_wrole = &phl_com->wifi_roles[0];
615*4882a593Smuzhiyun 
616*4882a593Smuzhiyun 	if (NULL != test_param)
617*4882a593Smuzhiyun 		phl_status = phl_wifi_role_stop(phl_info, test_wrole);
618*4882a593Smuzhiyun 
619*4882a593Smuzhiyun 	return phl_status;
620*4882a593Smuzhiyun }
621*4882a593Smuzhiyun 
phl_test_sw_free(void * phl)622*4882a593Smuzhiyun void phl_test_sw_free(void *phl)
623*4882a593Smuzhiyun {
624*4882a593Smuzhiyun 	FUNCIN();
625*4882a593Smuzhiyun 
626*4882a593Smuzhiyun 	_phl_free_tx_pkt_pool(phl);
627*4882a593Smuzhiyun 	_phl_free_rx_req_pool(phl);
628*4882a593Smuzhiyun 	_phl_free_tx_req_pool(phl);
629*4882a593Smuzhiyun 
630*4882a593Smuzhiyun 	FUNCOUT();
631*4882a593Smuzhiyun }
632*4882a593Smuzhiyun 
633*4882a593Smuzhiyun 
phl_test_sw_alloc(void * phl)634*4882a593Smuzhiyun enum rtw_phl_status phl_test_sw_alloc(void *phl)
635*4882a593Smuzhiyun {
636*4882a593Smuzhiyun 	enum rtw_phl_status sts = RTW_PHL_STATUS_FAILURE;
637*4882a593Smuzhiyun 	FUNCIN_WSTS(sts);
638*4882a593Smuzhiyun 	do {
639*4882a593Smuzhiyun 		sts = _phl_alloc_tx_req_pool(phl, MAX_TEST_TXREQ_NUM);
640*4882a593Smuzhiyun 		if (RTW_PHL_STATUS_SUCCESS != sts)
641*4882a593Smuzhiyun 			break;
642*4882a593Smuzhiyun 		sts = _phl_alloc_rx_req_pool(phl, MAX_TEST_RXREQ_NUM);
643*4882a593Smuzhiyun 		if (RTW_PHL_STATUS_SUCCESS != sts)
644*4882a593Smuzhiyun 			break;
645*4882a593Smuzhiyun 		sts = _phl_alloc_tx_pkt_pool(phl, MAX_TEST_PAYLOAD_NUM,
646*4882a593Smuzhiyun 					     			 MAX_TEST_PAYLOAD_SIZE);
647*4882a593Smuzhiyun 
648*4882a593Smuzhiyun 	} while (false);
649*4882a593Smuzhiyun 	FUNCOUT_WSTS(sts);
650*4882a593Smuzhiyun 
651*4882a593Smuzhiyun 	return sts;
652*4882a593Smuzhiyun }
653*4882a593Smuzhiyun 
654*4882a593Smuzhiyun 
phl_trx_test_init(void * phl)655*4882a593Smuzhiyun enum rtw_phl_status phl_trx_test_init(void *phl)
656*4882a593Smuzhiyun {
657*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
658*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = NULL;
659*4882a593Smuzhiyun 	struct rtw_phl_evt_ops *ops = &phl_info->phl_com->evt_ops;
660*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
661*4882a593Smuzhiyun 	enum rtw_phl_status phl_status = RTW_PHL_STATUS_FAILURE;
662*4882a593Smuzhiyun 
663*4882a593Smuzhiyun 	if (NULL == (trx_test = _os_mem_alloc(drv_priv, sizeof(struct phl_trx_test)))) {
664*4882a593Smuzhiyun 		phl_info->trx_test = NULL;
665*4882a593Smuzhiyun 		PHL_ERR("%s: alloc buffer failed\n", __func__);
666*4882a593Smuzhiyun 		return RTW_PHL_STATUS_FAILURE;
667*4882a593Smuzhiyun 	}
668*4882a593Smuzhiyun 
669*4882a593Smuzhiyun 	phl_info->trx_test = trx_test;
670*4882a593Smuzhiyun 
671*4882a593Smuzhiyun 	INIT_LIST_HEAD(&trx_test->rx_q);
672*4882a593Smuzhiyun 	_os_mem_set(drv_priv, &trx_test->tx_req_pool, 0, sizeof(trx_test->tx_req_pool));
673*4882a593Smuzhiyun 	_os_mem_set(drv_priv, &trx_test->rx_req_pool, 0, sizeof(trx_test->rx_req_pool));
674*4882a593Smuzhiyun 	_os_mem_set(drv_priv, &trx_test->tx_pkt_pool, 0, sizeof(trx_test->tx_pkt_pool));
675*4882a593Smuzhiyun 	_os_mem_set(drv_priv, &trx_test->test_param, 0, sizeof(trx_test->test_param));
676*4882a593Smuzhiyun 	_os_mem_set(drv_priv, &trx_test->trx_test_obj, 0, sizeof(trx_test->trx_test_obj));
677*4882a593Smuzhiyun 	ops->tx_test_recycle = phl_recycle_test_tx;
678*4882a593Smuzhiyun 	phl_status = phl_test_sw_alloc(phl);
679*4882a593Smuzhiyun #if 0
680*4882a593Smuzhiyun 	gtest_rxq_handler.type = RTW_PHL_HANDLER_PRIO_HIGH; /* tasklet */
681*4882a593Smuzhiyun 	gtest_rxq_handler.callback = rtw_phl_test_rx_callback;
682*4882a593Smuzhiyun 	gtest_rxq_handler.context = phl_info;
683*4882a593Smuzhiyun 	gtest_rxq_handler.drv_priv = phl_to_drvpriv(phl_info);
684*4882a593Smuzhiyun 	sts = phl_register_handler(phl_info->phl_com, &gtest_rxq_handler);
685*4882a593Smuzhiyun 	if (RTW_PHL_STATUS_SUCCESS != sts) {
686*4882a593Smuzhiyun 		PHL_ERR("register test rx queue handler fail\n");
687*4882a593Smuzhiyun 		phl_deregister_handler(phl_info->phl_com, &gtest_rxq_handler);
688*4882a593Smuzhiyun 	}
689*4882a593Smuzhiyun #endif
690*4882a593Smuzhiyun 	return phl_status;
691*4882a593Smuzhiyun }
692*4882a593Smuzhiyun 
phl_trx_test_deinit(void * phl)693*4882a593Smuzhiyun void phl_trx_test_deinit(void *phl)
694*4882a593Smuzhiyun {
695*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
696*4882a593Smuzhiyun 	void *drv = phl_to_drvpriv(phl_info);
697*4882a593Smuzhiyun 
698*4882a593Smuzhiyun 	phl_test_sw_free(phl);
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun 	_os_mem_free(drv, phl_info->trx_test, sizeof(struct phl_trx_test));
701*4882a593Smuzhiyun 	phl_info->trx_test = NULL;
702*4882a593Smuzhiyun }
703*4882a593Smuzhiyun 
704*4882a593Smuzhiyun 
phl_test_hw_config_init(void * phl,u8 mode)705*4882a593Smuzhiyun void phl_test_hw_config_init(void *phl, u8 mode)
706*4882a593Smuzhiyun {
707*4882a593Smuzhiyun 	switch (mode) {
708*4882a593Smuzhiyun 	case TEST_MODE_PHL_TX_RING_TEST:
709*4882a593Smuzhiyun 		/* address cam receive all */
710*4882a593Smuzhiyun 		/* rtl8852a_hal_init_misc: */
711*4882a593Smuzhiyun 		/* rtl8852ae_test_loopback: */
712*4882a593Smuzhiyun 		break;
713*4882a593Smuzhiyun 	default:
714*4882a593Smuzhiyun 		break;
715*4882a593Smuzhiyun 
716*4882a593Smuzhiyun 	}
717*4882a593Smuzhiyun 
718*4882a593Smuzhiyun 
719*4882a593Smuzhiyun }
720*4882a593Smuzhiyun 
721*4882a593Smuzhiyun 
phl_test_hw_config_runtime(void * phl,u8 mode)722*4882a593Smuzhiyun void phl_test_hw_config_runtime(void *phl, u8 mode)
723*4882a593Smuzhiyun {
724*4882a593Smuzhiyun 	switch (mode) {
725*4882a593Smuzhiyun 	case TEST_MODE_PHL_TX_RING_TEST:
726*4882a593Smuzhiyun 		/* debug register :*/
727*4882a593Smuzhiyun 		/* edca config */
728*4882a593Smuzhiyun 		/* zero delimiter counter flush */
729*4882a593Smuzhiyun 		break;
730*4882a593Smuzhiyun 	default:
731*4882a593Smuzhiyun 		break;
732*4882a593Smuzhiyun 
733*4882a593Smuzhiyun 	}
734*4882a593Smuzhiyun 
735*4882a593Smuzhiyun 
736*4882a593Smuzhiyun }
737*4882a593Smuzhiyun 
738*4882a593Smuzhiyun 
phl_test_fill_packet_content(struct phl_info_t * phl_info,u8 * pkt,u16 size,struct rtw_trx_test_param * test_param)739*4882a593Smuzhiyun void phl_test_fill_packet_content(struct phl_info_t *phl_info, u8 *pkt,
740*4882a593Smuzhiyun 				  u16 size,
741*4882a593Smuzhiyun 				  struct rtw_trx_test_param *test_param)
742*4882a593Smuzhiyun {
743*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
744*4882a593Smuzhiyun 	u8 test_pattern[7] = {0x00, 0x01, 0x02, 0x55, 0x66, 0x94, 0x87};
745*4882a593Smuzhiyun 	u16 qos_ofst = 0, payload_ofst = 0;
746*4882a593Smuzhiyun 
747*4882a593Smuzhiyun 	/* wlan header */
748*4882a593Smuzhiyun 	SET_WHDR_PROTOCOL_VERSION(pkt, 0);
749*4882a593Smuzhiyun 	SET_WHDR_TYPE(pkt, 2); //data
750*4882a593Smuzhiyun 	SET_WHDR_SUBTYPE(pkt, 0);
751*4882a593Smuzhiyun 	if (true == test_param->ap_mode) {
752*4882a593Smuzhiyun 		SET_WHDR_TO_DS(pkt, 0);
753*4882a593Smuzhiyun 		SET_WHDR_FROM_DS(pkt, 1);
754*4882a593Smuzhiyun 		SET_WHDR_ADDRESS1(drv_priv, pkt, test_param->sta_addr);
755*4882a593Smuzhiyun 		SET_WHDR_ADDRESS2(drv_priv, pkt, test_param->bssid);
756*4882a593Smuzhiyun 		SET_WHDR_ADDRESS3(drv_priv, pkt, test_param->cur_addr);
757*4882a593Smuzhiyun 	} else {
758*4882a593Smuzhiyun 		SET_WHDR_TO_DS(pkt, 1);
759*4882a593Smuzhiyun 		SET_WHDR_FROM_DS(pkt, 0);
760*4882a593Smuzhiyun 		SET_WHDR_ADDRESS1(drv_priv, pkt, test_param->bssid);
761*4882a593Smuzhiyun 		SET_WHDR_ADDRESS2(drv_priv, pkt, test_param->cur_addr);
762*4882a593Smuzhiyun 		SET_WHDR_ADDRESS3(drv_priv, pkt, test_param->sta_addr);
763*4882a593Smuzhiyun 	}
764*4882a593Smuzhiyun 
765*4882a593Smuzhiyun 	SET_WHDR_MORE_FRAG(pkt, 0);
766*4882a593Smuzhiyun 	SET_WHDR_RETRY(pkt, 0);
767*4882a593Smuzhiyun 	SET_WHDR_PWR_MGNT(pkt, 0);
768*4882a593Smuzhiyun 	SET_WHDR_MORE_DATA(pkt, 0);
769*4882a593Smuzhiyun 	SET_WHDR_WEP(pkt, 0);
770*4882a593Smuzhiyun 	SET_WHDR_ORDER(pkt, 0);
771*4882a593Smuzhiyun 
772*4882a593Smuzhiyun 	SET_WHDR_DURATION(pkt, 0);
773*4882a593Smuzhiyun 	SET_WHDR_FRAGMENT_SEQUENCE(pkt, 0);
774*4882a593Smuzhiyun 
775*4882a593Smuzhiyun 	qos_ofst = 24;
776*4882a593Smuzhiyun 
777*4882a593Smuzhiyun 	if (true == test_param->qos) {
778*4882a593Smuzhiyun 		SET_WHDR_QOS_EN(pkt, 1);
779*4882a593Smuzhiyun 		SET_WHDR_QOS_CTRL_STA_DATA_TID(pkt + qos_ofst,
780*4882a593Smuzhiyun 					       test_param->tx_cap.tid);
781*4882a593Smuzhiyun 		SET_WHDR_QOS_CTRL_STA_DATA_EOSP(pkt + qos_ofst, 0);
782*4882a593Smuzhiyun 		SET_WHDR_QOS_CTRL_STA_DATA_ACK_POLICY(pkt + qos_ofst, 0);
783*4882a593Smuzhiyun 		SET_WHDR_QOS_CTRL_STA_DATA_AMSDU(pkt + qos_ofst, 0);
784*4882a593Smuzhiyun 		SET_WHDR_QOS_CTRL_STA_DATA_TXOP(pkt + qos_ofst, 0);
785*4882a593Smuzhiyun 	}
786*4882a593Smuzhiyun 	/* wlan payload */
787*4882a593Smuzhiyun 	payload_ofst = qos_ofst + WHDR_QOS_LENGTH;
788*4882a593Smuzhiyun 	_os_mem_cpy(drv_priv, pkt + payload_ofst, test_pattern,
789*4882a593Smuzhiyun 		    sizeof(test_pattern));
790*4882a593Smuzhiyun 
791*4882a593Smuzhiyun 	debug_dump_data(pkt, size, "phl trx test pattern");
792*4882a593Smuzhiyun }
793*4882a593Smuzhiyun 
rtw_phl_test_rx_callback(void * context)794*4882a593Smuzhiyun void rtw_phl_test_rx_callback(void *context)
795*4882a593Smuzhiyun {
796*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)context;
797*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
798*4882a593Smuzhiyun 	struct rtw_pool *rx_req_pool = &trx_test->rx_req_pool;
799*4882a593Smuzhiyun 	struct rtw_test_rx *rreq = NULL;
800*4882a593Smuzhiyun 	struct rtw_recv_pkt *recvpkt = NULL;
801*4882a593Smuzhiyun 	struct rtw_payload *tpkt = NULL;
802*4882a593Smuzhiyun 
803*4882a593Smuzhiyun 	while (!list_empty(&rx_req_pool->busy_list)) {
804*4882a593Smuzhiyun 		rreq = _phl_query_busy_rx_req(phl_info);
805*4882a593Smuzhiyun 		if (NULL == rreq) {
806*4882a593Smuzhiyun 			PHL_WARN("Get NULL rx request from busy queue\n");
807*4882a593Smuzhiyun 			break;
808*4882a593Smuzhiyun 		}
809*4882a593Smuzhiyun 		recvpkt = &rreq->rx;
810*4882a593Smuzhiyun 		PHL_INFO("Rx test_id = %d\n", rreq->test_id);
811*4882a593Smuzhiyun 		PHL_INFO("Rx mac id = %d\n", recvpkt->mdata.macid);
812*4882a593Smuzhiyun 		PHL_INFO("Rx tid = %d\n", recvpkt->mdata.tid);
813*4882a593Smuzhiyun 		debug_dump_data(recvpkt->mdata.mac_addr, 6, "Rx mac address: ");
814*4882a593Smuzhiyun 		debug_dump_data(recvpkt->pkt_list[0].vir_addr,
815*4882a593Smuzhiyun 				recvpkt->pkt_list[0].length, "Rx Pkt: ");
816*4882a593Smuzhiyun 
817*4882a593Smuzhiyun 		_phl_release_rx_req(phl_info, rreq);
818*4882a593Smuzhiyun 		tpkt = (struct rtw_payload *)rreq->tpkt;
819*4882a593Smuzhiyun 	        _phl_release_tx_pkt(phl_info, tpkt);
820*4882a593Smuzhiyun 
821*4882a593Smuzhiyun 	}
822*4882a593Smuzhiyun 
823*4882a593Smuzhiyun }
824*4882a593Smuzhiyun 
825*4882a593Smuzhiyun 
rtw_phl_rx_reap(void * phl,u8 * xmit_req,struct rtw_trx_test_param * param)826*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_rx_reap(void *phl, u8 *xmit_req,
827*4882a593Smuzhiyun 				    struct rtw_trx_test_param *param)
828*4882a593Smuzhiyun {
829*4882a593Smuzhiyun 	enum rtw_phl_status sts = RTW_PHL_STATUS_FAILURE;
830*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
831*4882a593Smuzhiyun 	struct rtw_xmit_req *treq = (struct rtw_xmit_req *)xmit_req;
832*4882a593Smuzhiyun 	struct rtw_payload *tpkt = NULL;
833*4882a593Smuzhiyun 	struct rtw_test_rx *rreq = NULL;
834*4882a593Smuzhiyun 	struct rtw_recv_pkt *recvpkt = NULL;
835*4882a593Smuzhiyun 	struct rtw_pkt_buf_list *pkt = NULL;
836*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
837*4882a593Smuzhiyun 	u8 i = 0;
838*4882a593Smuzhiyun 
839*4882a593Smuzhiyun 	rreq = _phl_query_idle_rx_req(phl_info);
840*4882a593Smuzhiyun 
841*4882a593Smuzhiyun 	do {
842*4882a593Smuzhiyun 		if (NULL == rreq) {
843*4882a593Smuzhiyun 			PHL_ERR("query idle rx request fail!\n");
844*4882a593Smuzhiyun 			break;
845*4882a593Smuzhiyun 		}
846*4882a593Smuzhiyun 
847*4882a593Smuzhiyun 		recvpkt = &rreq->rx;
848*4882a593Smuzhiyun 		recvpkt->mdata.macid = treq->mdata.macid;
849*4882a593Smuzhiyun 		recvpkt->mdata.tid = treq->mdata.tid;
850*4882a593Smuzhiyun 		recvpkt->mdata.hal_port = treq->mdata.hal_port;
851*4882a593Smuzhiyun 		recvpkt->mdata.dma_ch = 0; /* normal rx ch */
852*4882a593Smuzhiyun 		_os_mem_cpy(drv_priv, recvpkt->mdata.mac_addr, param->sta_addr,
853*4882a593Smuzhiyun 			    6);
854*4882a593Smuzhiyun 		recvpkt->mdata.seq = treq->mdata.sw_seq;
855*4882a593Smuzhiyun 		recvpkt->mdata.mc = treq->mdata.mc;
856*4882a593Smuzhiyun 		recvpkt->mdata.bc = treq->mdata.bc;
857*4882a593Smuzhiyun 
858*4882a593Smuzhiyun 		pkt = (struct rtw_pkt_buf_list *)treq->pkt_list;
859*4882a593Smuzhiyun 
860*4882a593Smuzhiyun 		tpkt = phl_container_of(pkt, struct rtw_payload, pkt);
861*4882a593Smuzhiyun 		for (i = 0; i < treq->pkt_cnt; i++) {
862*4882a593Smuzhiyun 			if (i >= MAX_RX_BUF_SEG_NUM) {
863*4882a593Smuzhiyun 				PHL_ERR("tx packet has too many segments\n");
864*4882a593Smuzhiyun 				break;
865*4882a593Smuzhiyun 			}
866*4882a593Smuzhiyun 
867*4882a593Smuzhiyun 			recvpkt->pkt_list[i].vir_addr = pkt->vir_addr;
868*4882a593Smuzhiyun 			recvpkt->pkt_list[i].phy_addr_l = pkt->phy_addr_l;
869*4882a593Smuzhiyun 			recvpkt->pkt_list[i].phy_addr_h = pkt->phy_addr_h;
870*4882a593Smuzhiyun 			recvpkt->pkt_list[i].length = pkt->length;
871*4882a593Smuzhiyun 
872*4882a593Smuzhiyun 			recvpkt->pkt_cnt++;
873*4882a593Smuzhiyun 
874*4882a593Smuzhiyun 			pkt++;
875*4882a593Smuzhiyun 		}
876*4882a593Smuzhiyun 
877*4882a593Smuzhiyun 		rreq->tpkt = (u8 *)tpkt;
878*4882a593Smuzhiyun 		rreq->test_id = tpkt->test_id;
879*4882a593Smuzhiyun 
880*4882a593Smuzhiyun 		_phl_insert_busy_rx_req(phl_info, rreq);
881*4882a593Smuzhiyun 		sts = RTW_PHL_STATUS_SUCCESS;
882*4882a593Smuzhiyun 
883*4882a593Smuzhiyun 
884*4882a593Smuzhiyun 	} while (false);
885*4882a593Smuzhiyun 
886*4882a593Smuzhiyun 	if (RTW_PHL_STATUS_SUCCESS == sts) {
887*4882a593Smuzhiyun 		_phl_release_tx_req(phl_info, treq);
888*4882a593Smuzhiyun 	}
889*4882a593Smuzhiyun 
890*4882a593Smuzhiyun 	return sts;
891*4882a593Smuzhiyun }
892*4882a593Smuzhiyun 
rtw_phl_test_rxq_notify(void * phl)893*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_test_rxq_notify(void *phl)
894*4882a593Smuzhiyun {
895*4882a593Smuzhiyun 	enum rtw_phl_status pstatus = RTW_PHL_STATUS_FAILURE;
896*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
897*4882a593Smuzhiyun 
898*4882a593Smuzhiyun 	pstatus = phl_schedule_handler(phl_info->phl_com,
899*4882a593Smuzhiyun 				       &phl_info->phl_tx_handler);
900*4882a593Smuzhiyun 
901*4882a593Smuzhiyun 	return pstatus;
902*4882a593Smuzhiyun }
903*4882a593Smuzhiyun 
904*4882a593Smuzhiyun 
phl_tx_ring_test(void * phl,struct rtw_trx_test_param * test_param)905*4882a593Smuzhiyun enum rtw_phl_status phl_tx_ring_test(void *phl,
906*4882a593Smuzhiyun 				     struct rtw_trx_test_param *test_param)
907*4882a593Smuzhiyun {
908*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
909*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
910*4882a593Smuzhiyun 	enum rtw_phl_status sts = RTW_PHL_STATUS_FAILURE;
911*4882a593Smuzhiyun 	struct rtw_xmit_req *treq = NULL;
912*4882a593Smuzhiyun 	struct rtw_payload *tpkt = NULL;
913*4882a593Smuzhiyun 	u32 tx_cnt = 0;
914*4882a593Smuzhiyun 
915*4882a593Smuzhiyun 	FUNCIN_WSTS(sts);
916*4882a593Smuzhiyun 	do {
917*4882a593Smuzhiyun 		for (tx_cnt = 0; tx_cnt < test_param->tx_req_num; tx_cnt++) {
918*4882a593Smuzhiyun 			/* query tx request pool */
919*4882a593Smuzhiyun 			treq = _phl_query_idle_tx_req(phl_info);
920*4882a593Smuzhiyun 			if (NULL == treq) {
921*4882a593Smuzhiyun 				PHL_WARN("query idle tx request from pool fail\n");
922*4882a593Smuzhiyun 				break;
923*4882a593Smuzhiyun 			}
924*4882a593Smuzhiyun 
925*4882a593Smuzhiyun 			tpkt = _phl_query_idle_tx_pkt(phl_info);
926*4882a593Smuzhiyun 			if (NULL == tpkt) {
927*4882a593Smuzhiyun 				PHL_WARN("query idle tx packet from pool fail\n");
928*4882a593Smuzhiyun 				break;
929*4882a593Smuzhiyun 			}
930*4882a593Smuzhiyun 
931*4882a593Smuzhiyun 			/* fill meta_data*/
932*4882a593Smuzhiyun 			_os_mem_cpy(drv_priv, &treq->mdata, &test_param->tx_cap,
933*4882a593Smuzhiyun 						sizeof(struct rtw_t_meta_data));
934*4882a593Smuzhiyun 			/* fill tx request content */
935*4882a593Smuzhiyun 			if (test_param->tx_payload_size > MAX_TEST_PAYLOAD_SIZE)
936*4882a593Smuzhiyun 				tpkt->pkt.length = MAX_TEST_PAYLOAD_SIZE;
937*4882a593Smuzhiyun 			else
938*4882a593Smuzhiyun 				tpkt->pkt.length = (u16)test_param->tx_payload_size;
939*4882a593Smuzhiyun 
940*4882a593Smuzhiyun 			phl_test_fill_packet_content(phl_info, tpkt->pkt.vir_addr,
941*4882a593Smuzhiyun 							 tpkt->pkt.length, test_param);
942*4882a593Smuzhiyun 			/* assign this tx pkt to tx request */
943*4882a593Smuzhiyun 			treq->os_priv = tpkt;
944*4882a593Smuzhiyun 			treq->pkt_cnt = 1;
945*4882a593Smuzhiyun 			treq->mdata.wdinfo_en = 1;
946*4882a593Smuzhiyun 			treq->total_len = (u16)tpkt->pkt.length;
947*4882a593Smuzhiyun 			treq->pkt_list = (u8 *)&tpkt->pkt;
948*4882a593Smuzhiyun 
949*4882a593Smuzhiyun 			/* add to phl_tx_ring */
950*4882a593Smuzhiyun 			sts = rtw_phl_add_tx_req(phl, treq);
951*4882a593Smuzhiyun 			if (RTW_PHL_STATUS_SUCCESS != sts) {
952*4882a593Smuzhiyun 				PHL_INFO("add new tx request (%d) to phl ring fail\n", tx_cnt);
953*4882a593Smuzhiyun 				_phl_release_tx_req(phl_info, treq);
954*4882a593Smuzhiyun 				_phl_release_tx_pkt(phl_info, tpkt);
955*4882a593Smuzhiyun 				break;
956*4882a593Smuzhiyun 			} else {
957*4882a593Smuzhiyun 				_phl_insert_busy_tx_req(phl_info, treq);
958*4882a593Smuzhiyun 				_phl_insert_busy_tx_pkt(phl_info, tpkt);
959*4882a593Smuzhiyun 			}
960*4882a593Smuzhiyun 		}
961*4882a593Smuzhiyun 		/* schedule tx process */
962*4882a593Smuzhiyun 		sts = rtw_phl_tx_req_notify(phl);
963*4882a593Smuzhiyun 		if (RTW_PHL_STATUS_SUCCESS != sts) {
964*4882a593Smuzhiyun 			PHL_INFO("add notify phl start tx process fail\n");
965*4882a593Smuzhiyun 			break;
966*4882a593Smuzhiyun 		}
967*4882a593Smuzhiyun 	} while (false);
968*4882a593Smuzhiyun /*
969*4882a593Smuzhiyun 	while (false == _phl_is_tx_test_done(phl) && i < 100) {
970*4882a593Smuzhiyun 		_os_delay_ms(drv_priv, 1);
971*4882a593Smuzhiyun 		i++;
972*4882a593Smuzhiyun 	}
973*4882a593Smuzhiyun */
974*4882a593Smuzhiyun 	FUNCOUT_WSTS(sts);
975*4882a593Smuzhiyun 	return sts;
976*4882a593Smuzhiyun }
977*4882a593Smuzhiyun 
phl_rx_ring_test(void * phl,struct rtw_trx_test_param * test_param)978*4882a593Smuzhiyun enum rtw_phl_status phl_rx_ring_test(void *phl,
979*4882a593Smuzhiyun 				     struct rtw_trx_test_param *test_param)
980*4882a593Smuzhiyun {
981*4882a593Smuzhiyun 	enum rtw_phl_status sts = RTW_PHL_STATUS_FAILURE;
982*4882a593Smuzhiyun 	FUNCIN_WSTS(sts);
983*4882a593Smuzhiyun 	do {
984*4882a593Smuzhiyun 	  	sts = rtw_phl_start_rx_process(phl);
985*4882a593Smuzhiyun 
986*4882a593Smuzhiyun 		if (RTW_PHL_STATUS_FAILURE == sts) {
987*4882a593Smuzhiyun 			PHL_TRACE(COMP_PHL_DBG, _PHL_WARNING_, "[WARNING] phl_rx ring fail!\n");
988*4882a593Smuzhiyun 			break;
989*4882a593Smuzhiyun 		}
990*4882a593Smuzhiyun 	} while (false);
991*4882a593Smuzhiyun 	FUNCOUT_WSTS(sts);
992*4882a593Smuzhiyun 	return sts;
993*4882a593Smuzhiyun }
994*4882a593Smuzhiyun 
995*4882a593Smuzhiyun 
phl_hal_tx_test(void * phl,struct rtw_trx_test_param * test_param)996*4882a593Smuzhiyun enum rtw_phl_status phl_hal_tx_test(void *phl,
997*4882a593Smuzhiyun 				     struct rtw_trx_test_param *test_param)
998*4882a593Smuzhiyun {
999*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
1000*4882a593Smuzhiyun 	void *drv_priv = phl_to_drvpriv(phl_info);
1001*4882a593Smuzhiyun 	struct phl_hci_trx_ops *hci_trx_ops = phl_info->hci_trx_ops;
1002*4882a593Smuzhiyun 	enum rtw_phl_status sts = RTW_PHL_STATUS_FAILURE;
1003*4882a593Smuzhiyun 	struct rtw_xmit_req *treq = NULL;
1004*4882a593Smuzhiyun 	struct rtw_payload *tpkt = NULL;
1005*4882a593Smuzhiyun 	FUNCIN_WSTS(sts);
1006*4882a593Smuzhiyun 	do {
1007*4882a593Smuzhiyun 		/* query tx request pool */
1008*4882a593Smuzhiyun 		treq = _phl_query_idle_tx_req(phl_info);
1009*4882a593Smuzhiyun 		if (NULL == treq) {
1010*4882a593Smuzhiyun 			PHL_WARN("query idle tx request from pool fail\n");
1011*4882a593Smuzhiyun 			break;
1012*4882a593Smuzhiyun 		}
1013*4882a593Smuzhiyun 
1014*4882a593Smuzhiyun 		tpkt = _phl_query_idle_tx_pkt(phl_info);
1015*4882a593Smuzhiyun 		if (NULL == tpkt) {
1016*4882a593Smuzhiyun 			PHL_WARN("query idle tx packet from pool fail\n");
1017*4882a593Smuzhiyun 			break;
1018*4882a593Smuzhiyun 		}
1019*4882a593Smuzhiyun 
1020*4882a593Smuzhiyun 		/* fill meta_data */
1021*4882a593Smuzhiyun 		_os_mem_cpy(drv_priv, &treq->mdata, &test_param->tx_cap,
1022*4882a593Smuzhiyun 					sizeof(struct rtw_t_meta_data));
1023*4882a593Smuzhiyun 		/* fill tx request content */
1024*4882a593Smuzhiyun 		if (test_param->tx_payload_size > MAX_TEST_PAYLOAD_SIZE)
1025*4882a593Smuzhiyun 			tpkt->pkt.length = MAX_TEST_PAYLOAD_SIZE;
1026*4882a593Smuzhiyun 		else
1027*4882a593Smuzhiyun 			tpkt->pkt.length = (u16)test_param->tx_payload_size;
1028*4882a593Smuzhiyun 
1029*4882a593Smuzhiyun 		phl_test_fill_packet_content(phl_info, tpkt->pkt.vir_addr,
1030*4882a593Smuzhiyun 					     tpkt->pkt.length, test_param);
1031*4882a593Smuzhiyun 		/* assign this tx pkt to tx request */
1032*4882a593Smuzhiyun 		treq->os_priv = tpkt;
1033*4882a593Smuzhiyun 		treq->pkt_cnt = 1;
1034*4882a593Smuzhiyun 		treq->mdata.wdinfo_en = 1;
1035*4882a593Smuzhiyun 		treq->total_len = (u16)tpkt->pkt.length;
1036*4882a593Smuzhiyun 		treq->pkt_list = (u8 *)&tpkt->pkt;
1037*4882a593Smuzhiyun 		/* add to phl_tx_ring */
1038*4882a593Smuzhiyun 		sts = hci_trx_ops->prepare_tx(phl_info, treq);
1039*4882a593Smuzhiyun 		if (RTW_PHL_STATUS_SUCCESS != sts) {
1040*4882a593Smuzhiyun 			PHL_INFO("add new tx request to phl_prepare_tx_pcie fail\n");
1041*4882a593Smuzhiyun 			break;
1042*4882a593Smuzhiyun 		}
1043*4882a593Smuzhiyun 		/* schedule tx process */
1044*4882a593Smuzhiyun 		sts = hci_trx_ops->tx(phl_info);
1045*4882a593Smuzhiyun 		if (RTW_PHL_STATUS_SUCCESS != sts) {
1046*4882a593Smuzhiyun 			PHL_INFO("phl_tx_pcie fail\n");
1047*4882a593Smuzhiyun 			break;
1048*4882a593Smuzhiyun 		}
1049*4882a593Smuzhiyun 	} while (false);
1050*4882a593Smuzhiyun 
1051*4882a593Smuzhiyun 		_os_delay_ms(drv_priv, 100);
1052*4882a593Smuzhiyun 
1053*4882a593Smuzhiyun 	if (RTW_PHL_STATUS_SUCCESS != sts) {
1054*4882a593Smuzhiyun 		if (NULL != treq)
1055*4882a593Smuzhiyun 			_phl_release_tx_req(phl, treq);
1056*4882a593Smuzhiyun 		if (NULL != tpkt)
1057*4882a593Smuzhiyun 			_phl_release_tx_pkt(phl, tpkt);
1058*4882a593Smuzhiyun 	}
1059*4882a593Smuzhiyun 	FUNCOUT_WSTS(sts);
1060*4882a593Smuzhiyun 	return sts;
1061*4882a593Smuzhiyun }
1062*4882a593Smuzhiyun 
phl_hal_rx_test(void * phl,struct rtw_trx_test_param * test_param)1063*4882a593Smuzhiyun enum rtw_phl_status phl_hal_rx_test(void *phl,
1064*4882a593Smuzhiyun 				     struct rtw_trx_test_param *test_param)
1065*4882a593Smuzhiyun {
1066*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
1067*4882a593Smuzhiyun 	struct phl_hci_trx_ops *hci_trx_ops = phl_info->hci_trx_ops;
1068*4882a593Smuzhiyun 	enum rtw_phl_status sts = RTW_PHL_STATUS_FAILURE;
1069*4882a593Smuzhiyun 	FUNCIN_WSTS(sts);
1070*4882a593Smuzhiyun 	do {
1071*4882a593Smuzhiyun 
1072*4882a593Smuzhiyun 		/* add to phl_tx_ring */
1073*4882a593Smuzhiyun 		sts = hci_trx_ops->rx(phl_info);
1074*4882a593Smuzhiyun 
1075*4882a593Smuzhiyun 		if (RTW_PHL_STATUS_FAILURE == sts) {
1076*4882a593Smuzhiyun 			PHL_TRACE(COMP_PHL_DBG, _PHL_WARNING_, "[WARNING] phl_rx fail!\n");
1077*4882a593Smuzhiyun 			break;
1078*4882a593Smuzhiyun 		}
1079*4882a593Smuzhiyun 	} while (false);
1080*4882a593Smuzhiyun 	FUNCOUT_WSTS(sts);
1081*4882a593Smuzhiyun 	return sts;
1082*4882a593Smuzhiyun }
1083*4882a593Smuzhiyun 
1084*4882a593Smuzhiyun 
phl_trx_test_start(void * phl,struct rtw_trx_test_param * test_param)1085*4882a593Smuzhiyun enum rtw_phl_status phl_trx_test_start(void *phl,
1086*4882a593Smuzhiyun 				       struct rtw_trx_test_param *test_param)
1087*4882a593Smuzhiyun {
1088*4882a593Smuzhiyun 	enum rtw_phl_status status = RTW_PHL_STATUS_FAILURE;
1089*4882a593Smuzhiyun 	FUNCIN_WSTS(status);
1090*4882a593Smuzhiyun 	switch (test_param->mode) {
1091*4882a593Smuzhiyun 	case TEST_MODE_PHL_TX_RING_TEST:
1092*4882a593Smuzhiyun 		status = phl_tx_ring_test(phl, test_param);
1093*4882a593Smuzhiyun 		break;
1094*4882a593Smuzhiyun 	case TEST_MODE_PHL_RX_RING_TEST:
1095*4882a593Smuzhiyun 		status = phl_rx_ring_test(phl, test_param);
1096*4882a593Smuzhiyun 		break;
1097*4882a593Smuzhiyun 	case TEST_MODE_HAL_TX_TEST:
1098*4882a593Smuzhiyun 		status = phl_hal_tx_test(phl, test_param);
1099*4882a593Smuzhiyun 		break;
1100*4882a593Smuzhiyun 	case TEST_MODE_HAL_RX_TEST:
1101*4882a593Smuzhiyun 		status = phl_hal_rx_test(phl, test_param);
1102*4882a593Smuzhiyun 		break;
1103*4882a593Smuzhiyun 	default:
1104*4882a593Smuzhiyun 		break;
1105*4882a593Smuzhiyun 
1106*4882a593Smuzhiyun 	}
1107*4882a593Smuzhiyun 	FUNCOUT_WSTS(status);
1108*4882a593Smuzhiyun 	return status;
1109*4882a593Smuzhiyun }
1110*4882a593Smuzhiyun 
phl_trx_test_dump_result(void * phl,struct rtw_trx_test_param * test_param)1111*4882a593Smuzhiyun void phl_trx_test_dump_result(void *phl, struct rtw_trx_test_param *test_param)
1112*4882a593Smuzhiyun {
1113*4882a593Smuzhiyun 	PHL_INFO("Test Done");
1114*4882a593Smuzhiyun }
1115*4882a593Smuzhiyun 
phl_recycle_test_tx(void * phl,struct rtw_xmit_req * treq)1116*4882a593Smuzhiyun enum rtw_phl_status phl_recycle_test_tx(void *phl, struct rtw_xmit_req *treq)
1117*4882a593Smuzhiyun {
1118*4882a593Smuzhiyun 	struct phl_info_t *phl_info = NULL;
1119*4882a593Smuzhiyun 	struct rtw_payload *tpkt = NULL;
1120*4882a593Smuzhiyun 	enum rtw_phl_status sts = RTW_PHL_STATUS_FAILURE;
1121*4882a593Smuzhiyun 
1122*4882a593Smuzhiyun 	FUNCIN_WSTS(sts);
1123*4882a593Smuzhiyun 	if (NULL == phl) {
1124*4882a593Smuzhiyun 		PHL_ERR("treq is NULL!\n");
1125*4882a593Smuzhiyun 		goto end;
1126*4882a593Smuzhiyun 	}
1127*4882a593Smuzhiyun 	phl_info = (struct phl_info_t *)phl;
1128*4882a593Smuzhiyun 
1129*4882a593Smuzhiyun 	if (NULL == treq) {
1130*4882a593Smuzhiyun 		PHL_ERR("treq is NULL!\n");
1131*4882a593Smuzhiyun 		goto end;
1132*4882a593Smuzhiyun 	}
1133*4882a593Smuzhiyun 	tpkt = (struct rtw_payload *)treq->os_priv;
1134*4882a593Smuzhiyun 
1135*4882a593Smuzhiyun 	if (NULL == tpkt) {
1136*4882a593Smuzhiyun 		PHL_ERR("tpkt is NULL!\n");
1137*4882a593Smuzhiyun 		goto end;
1138*4882a593Smuzhiyun 	}
1139*4882a593Smuzhiyun 	_phl_remove_busy_tx_req(phl_info, treq);
1140*4882a593Smuzhiyun 	_phl_release_tx_req(phl_info, treq);
1141*4882a593Smuzhiyun 
1142*4882a593Smuzhiyun 	_phl_remove_busy_tx_pkt(phl_info, tpkt);
1143*4882a593Smuzhiyun 	_phl_release_tx_pkt(phl_info, tpkt);
1144*4882a593Smuzhiyun 
1145*4882a593Smuzhiyun 	sts = RTW_PHL_STATUS_SUCCESS;
1146*4882a593Smuzhiyun 
1147*4882a593Smuzhiyun end:
1148*4882a593Smuzhiyun 	FUNCOUT_WSTS(sts);
1149*4882a593Smuzhiyun 	return sts;
1150*4882a593Smuzhiyun }
1151*4882a593Smuzhiyun 
_phl_rx_test_pattern(struct phl_info_t * phl_info,void * ptr)1152*4882a593Smuzhiyun void _phl_rx_test_pattern(struct phl_info_t *phl_info, void *ptr)
1153*4882a593Smuzhiyun {
1154*4882a593Smuzhiyun 	struct rtw_recv_pkt *rpkt = NULL;
1155*4882a593Smuzhiyun 
1156*4882a593Smuzhiyun 	FUNCIN();
1157*4882a593Smuzhiyun 
1158*4882a593Smuzhiyun 	if (NULL == ptr) {
1159*4882a593Smuzhiyun 		PHL_ERR("bp_info->ptr is NULL!\n");
1160*4882a593Smuzhiyun 		goto end;
1161*4882a593Smuzhiyun 	}
1162*4882a593Smuzhiyun 
1163*4882a593Smuzhiyun 	rpkt = (struct rtw_recv_pkt *)ptr;
1164*4882a593Smuzhiyun 	if (NULL == rpkt) {
1165*4882a593Smuzhiyun 		PHL_ERR("rpkt is NULL!\n");
1166*4882a593Smuzhiyun 		goto end;
1167*4882a593Smuzhiyun 	}
1168*4882a593Smuzhiyun 
1169*4882a593Smuzhiyun 	PHL_INFO("rpkt->buf_len = %d\n", rpkt->pkt_list[0].length);
1170*4882a593Smuzhiyun 	debug_dump_data(rpkt->pkt_list[0].vir_addr, (u16)rpkt->pkt_list[0].length, "dump_rx");
1171*4882a593Smuzhiyun 
1172*4882a593Smuzhiyun end:
1173*4882a593Smuzhiyun 	FUNCOUT();
1174*4882a593Smuzhiyun }
1175*4882a593Smuzhiyun 
rtw_phl_trx_default_param(void * phl,struct rtw_trx_test_param * test_param)1176*4882a593Smuzhiyun void rtw_phl_trx_default_param(void *phl, struct rtw_trx_test_param *test_param)
1177*4882a593Smuzhiyun {
1178*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
1179*4882a593Smuzhiyun 	_os_mem_set(phl_to_drvpriv(phl_info), test_param, 0, sizeof(struct rtw_trx_test_param));
1180*4882a593Smuzhiyun 	test_param->mode = TEST_MODE_PHL_TX_RING_TEST;
1181*4882a593Smuzhiyun 	test_param->ap_mode = 0;
1182*4882a593Smuzhiyun 	test_param->pkt_type = TEST_PKT_TYPE_BC;
1183*4882a593Smuzhiyun 	test_param->tx_req_num = 1;
1184*4882a593Smuzhiyun 	test_param->rx_req_num = 1;
1185*4882a593Smuzhiyun 	test_param->tx_payload_num = 1;
1186*4882a593Smuzhiyun 	test_param->tx_payload_size = 100;
1187*4882a593Smuzhiyun 	test_param->trx_mode = 0;
1188*4882a593Smuzhiyun 	test_param->qta_mode = 0;
1189*4882a593Smuzhiyun 	test_param->cur_addr[0] = 0x00;
1190*4882a593Smuzhiyun 	test_param->cur_addr[1] = 0xE0;
1191*4882a593Smuzhiyun 	test_param->cur_addr[2] = 0x4c;
1192*4882a593Smuzhiyun 	test_param->cur_addr[3] = 0x88;
1193*4882a593Smuzhiyun 	test_param->cur_addr[4] = 0x52;
1194*4882a593Smuzhiyun 	test_param->cur_addr[5] = 0xaa;
1195*4882a593Smuzhiyun 	if (TEST_PKT_TYPE_BC == test_param->pkt_type || TEST_PKT_TYPE_MC == test_param->pkt_type) {
1196*4882a593Smuzhiyun 		test_param->sta_addr[0] = 0xFF;
1197*4882a593Smuzhiyun 		test_param->sta_addr[1] = 0xFF;
1198*4882a593Smuzhiyun 		test_param->sta_addr[2] = 0xFF;
1199*4882a593Smuzhiyun 		test_param->sta_addr[3] = 0xFF;
1200*4882a593Smuzhiyun 		test_param->sta_addr[4] = 0xFF;
1201*4882a593Smuzhiyun 		test_param->sta_addr[5] = 0xFF;
1202*4882a593Smuzhiyun 		test_param->bssid[0] = 0xFF;
1203*4882a593Smuzhiyun 		test_param->bssid[1] = 0xFF;
1204*4882a593Smuzhiyun 		test_param->bssid[2] = 0xFF;
1205*4882a593Smuzhiyun 		test_param->bssid[3] = 0xFF;
1206*4882a593Smuzhiyun 		test_param->bssid[4] = 0xFF;
1207*4882a593Smuzhiyun 		test_param->bssid[5] = 0xFF;
1208*4882a593Smuzhiyun 		test_param->tx_cap.bc = 1;
1209*4882a593Smuzhiyun 		test_param->qos = 0;
1210*4882a593Smuzhiyun 	} else if (TEST_PKT_TYPE_UNI == test_param->pkt_type){
1211*4882a593Smuzhiyun 		test_param->sta_addr[0] = 0x00;
1212*4882a593Smuzhiyun 		test_param->sta_addr[1] = 0xE0;
1213*4882a593Smuzhiyun 		test_param->sta_addr[2] = 0x4C;
1214*4882a593Smuzhiyun 		test_param->sta_addr[3] = 0x88;
1215*4882a593Smuzhiyun 		test_param->sta_addr[4] = 0x52;
1216*4882a593Smuzhiyun 		test_param->sta_addr[5] = 0xbb;
1217*4882a593Smuzhiyun 		test_param->bssid[0] = 0x00;
1218*4882a593Smuzhiyun 		test_param->bssid[1] = 0xE0;
1219*4882a593Smuzhiyun 		test_param->bssid[2] = 0x4C;
1220*4882a593Smuzhiyun 		test_param->bssid[3] = 0x88;
1221*4882a593Smuzhiyun 		test_param->bssid[4] = 0x52;
1222*4882a593Smuzhiyun 		test_param->bssid[5] = 0xbb;
1223*4882a593Smuzhiyun 		test_param->tx_cap.bc = 0;
1224*4882a593Smuzhiyun 		test_param->qos = 1;
1225*4882a593Smuzhiyun 	}
1226*4882a593Smuzhiyun 	test_param->tx_cap.macid= 0x00;
1227*4882a593Smuzhiyun 	test_param->tx_cap.tid = 0x03;
1228*4882a593Smuzhiyun 	test_param->tx_cap.dma_ch= 0x01;
1229*4882a593Smuzhiyun 	test_param->tx_cap.band= 0x0;
1230*4882a593Smuzhiyun 	test_param->tx_cap.userate_sel = 0x1;
1231*4882a593Smuzhiyun 	test_param->tx_cap.f_rate = 0x87;
1232*4882a593Smuzhiyun 	test_param->tx_cap.f_bw = 0;
1233*4882a593Smuzhiyun 	test_param->tx_cap.f_gi_ltf = 0;
1234*4882a593Smuzhiyun }
1235*4882a593Smuzhiyun 
rtw_phl_trx_testsuite(void * phl,struct rtw_trx_test_param * test_param)1236*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_trx_testsuite(void *phl,
1237*4882a593Smuzhiyun 				   struct rtw_trx_test_param *test_param)
1238*4882a593Smuzhiyun {
1239*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
1240*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
1241*4882a593Smuzhiyun 	struct rtw_trx_test_param *param = &trx_test->test_param;
1242*4882a593Smuzhiyun 	enum rtw_phl_status status = RTW_PHL_STATUS_FAILURE;
1243*4882a593Smuzhiyun 	FUNCIN_WSTS(status);
1244*4882a593Smuzhiyun 	do {
1245*4882a593Smuzhiyun 		param->is_trx_test_end = false;
1246*4882a593Smuzhiyun 		phl_update_test_param(phl, test_param);
1247*4882a593Smuzhiyun 
1248*4882a593Smuzhiyun 		phl_test_hw_config_init(phl, test_param->mode);
1249*4882a593Smuzhiyun 
1250*4882a593Smuzhiyun 		status = phl_trx_test_start(phl, test_param);
1251*4882a593Smuzhiyun 		if (RTW_PHL_STATUS_SUCCESS != status) {
1252*4882a593Smuzhiyun 			PHL_ERR("The phl trx test failure\n");
1253*4882a593Smuzhiyun 
1254*4882a593Smuzhiyun 			break;
1255*4882a593Smuzhiyun 		}
1256*4882a593Smuzhiyun 
1257*4882a593Smuzhiyun 		phl_trx_test_dump_result(phl, test_param);
1258*4882a593Smuzhiyun 
1259*4882a593Smuzhiyun 		param->is_trx_test_end = true;
1260*4882a593Smuzhiyun 	} while (false);
1261*4882a593Smuzhiyun 	FUNCOUT_WSTS(status);
1262*4882a593Smuzhiyun 	return status;
1263*4882a593Smuzhiyun }
1264*4882a593Smuzhiyun 
1265*4882a593Smuzhiyun 
trx_test_bp_handler(void * priv,struct test_bp_info * bp_info)1266*4882a593Smuzhiyun u8 trx_test_bp_handler(void *priv, struct test_bp_info* bp_info)
1267*4882a593Smuzhiyun {
1268*4882a593Smuzhiyun 	u8 ret = BP_RET_SKIP_SECTION;
1269*4882a593Smuzhiyun 
1270*4882a593Smuzhiyun 	return ret;
1271*4882a593Smuzhiyun }
1272*4882a593Smuzhiyun 
1273*4882a593Smuzhiyun 
trx_test_is_test_end(void * priv)1274*4882a593Smuzhiyun u8 trx_test_is_test_end(void *priv)
1275*4882a593Smuzhiyun {
1276*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)priv;
1277*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
1278*4882a593Smuzhiyun 	struct rtw_trx_test_param *test_param = &trx_test->test_param;
1279*4882a593Smuzhiyun 	FUNCIN();
1280*4882a593Smuzhiyun 	FUNCOUT();
1281*4882a593Smuzhiyun 	return (test_param->is_trx_test_end == true) ? (true) : (false);
1282*4882a593Smuzhiyun }
trx_test_is_test_pass(void * priv)1283*4882a593Smuzhiyun u8 trx_test_is_test_pass(void *priv)
1284*4882a593Smuzhiyun {
1285*4882a593Smuzhiyun 	FUNCIN();
1286*4882a593Smuzhiyun 	FUNCOUT();
1287*4882a593Smuzhiyun 	return true;
1288*4882a593Smuzhiyun }
1289*4882a593Smuzhiyun 
trx_test_get_fail_rsn(void * priv,char * rsn,u32 max_len)1290*4882a593Smuzhiyun u8 trx_test_get_fail_rsn(void *priv, char* rsn, u32 max_len)
1291*4882a593Smuzhiyun {
1292*4882a593Smuzhiyun 	//struct phl_info_t *phl_info = (struct phl_info_t *)priv;
1293*4882a593Smuzhiyun 	FUNCIN();
1294*4882a593Smuzhiyun 	FUNCOUT();
1295*4882a593Smuzhiyun 	return true;
1296*4882a593Smuzhiyun 
1297*4882a593Smuzhiyun }
1298*4882a593Smuzhiyun 
trx_test_start_test(void * priv)1299*4882a593Smuzhiyun u8 trx_test_start_test(void *priv)
1300*4882a593Smuzhiyun {
1301*4882a593Smuzhiyun 	//struct phl_info_t *phl_info = (struct phl_info_t *)priv;
1302*4882a593Smuzhiyun 	FUNCIN();
1303*4882a593Smuzhiyun 	FUNCOUT();
1304*4882a593Smuzhiyun 	return true;
1305*4882a593Smuzhiyun }
1306*4882a593Smuzhiyun 
1307*4882a593Smuzhiyun 
1308*4882a593Smuzhiyun void
phl_add_trx_test_obj(void * phl)1309*4882a593Smuzhiyun phl_add_trx_test_obj(void *phl)
1310*4882a593Smuzhiyun {
1311*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
1312*4882a593Smuzhiyun 	struct phl_trx_test *trx_test = (struct phl_trx_test *)phl_info->trx_test;
1313*4882a593Smuzhiyun 	struct test_obj_ctrl_interface *trx_test_obj = &trx_test->trx_test_obj;
1314*4882a593Smuzhiyun 	FUNCIN();
1315*4882a593Smuzhiyun 	trx_test_obj->bp_handler = trx_test_bp_handler;
1316*4882a593Smuzhiyun 	trx_test_obj->get_fail_rsn = trx_test_get_fail_rsn;
1317*4882a593Smuzhiyun 	trx_test_obj->is_test_end = trx_test_is_test_end;
1318*4882a593Smuzhiyun 	trx_test_obj->is_test_pass = trx_test_is_test_pass;
1319*4882a593Smuzhiyun 	trx_test_obj->start_test = trx_test_start_test;
1320*4882a593Smuzhiyun 	rtw_phl_test_add_new_test_obj(phl_info->phl_com,
1321*4882a593Smuzhiyun 	                              "tx_test",
1322*4882a593Smuzhiyun 	                              phl_info,
1323*4882a593Smuzhiyun 	                              TEST_LVL_HIGH,
1324*4882a593Smuzhiyun 	                              trx_test_obj,
1325*4882a593Smuzhiyun 	                              -1,
1326*4882a593Smuzhiyun 	                              TEST_SUB_MODULE_TRX,
1327*4882a593Smuzhiyun 	                              UNIT_TEST_MODE);
1328*4882a593Smuzhiyun 	FUNCOUT();
1329*4882a593Smuzhiyun }
1330*4882a593Smuzhiyun 
1331*4882a593Smuzhiyun #endif /* #ifdef CONFIG_PHL_TEST_SUITE */
1332