xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852be/phl/phl_cmd_general.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 _PHL_CMD_GENERAL_C_
16*4882a593Smuzhiyun #include "phl_headers.h"
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #ifdef CONFIG_CMD_DISP
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun enum phl_cmd_sts {
21*4882a593Smuzhiyun 	PHL_CMD_SUBMITTED = -1,
22*4882a593Smuzhiyun 	PHL_CMD_DONE_SUCCESS = 0,
23*4882a593Smuzhiyun 	PHL_CMD_DONE_TIMEOUT,
24*4882a593Smuzhiyun 	PHL_CMD_DONE_CMD_ERROR,
25*4882a593Smuzhiyun 	PHL_CMD_DONE_CMD_DROP,
26*4882a593Smuzhiyun 	PHL_CMD_DONE_CANNOT_IO,
27*4882a593Smuzhiyun 	PHL_CMD_DONE_UNKNOWN,
28*4882a593Smuzhiyun };
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun struct phl_sync {
31*4882a593Smuzhiyun 	u32 submit_time;
32*4882a593Smuzhiyun 	u32 timeout_ms; /* 0: wait forever, >0: up to ms waiting */
33*4882a593Smuzhiyun 	enum phl_cmd_sts status; /* status for operation */
34*4882a593Smuzhiyun 	_os_event done;
35*4882a593Smuzhiyun };
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun struct phl_cmd_sync {
38*4882a593Smuzhiyun 	enum phl_msg_evt_id evt_id;
39*4882a593Smuzhiyun 	struct phl_sync sync;
40*4882a593Smuzhiyun 	_os_lock lock;
41*4882a593Smuzhiyun };
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun struct phl_cmd_obj {
44*4882a593Smuzhiyun 	enum phl_msg_evt_id evt_id; /* u8 id */
45*4882a593Smuzhiyun 	u8 *buf;
46*4882a593Smuzhiyun 	u32 buf_len;
47*4882a593Smuzhiyun 	bool no_io;
48*4882a593Smuzhiyun 	void (*cmd_complete)(void* priv, u8 *buf, u32 buf_len, enum rtw_phl_status status);
49*4882a593Smuzhiyun 	/*cmd sync*/
50*4882a593Smuzhiyun 	bool is_cmd_wait;
51*4882a593Smuzhiyun 	_os_atomic ref_cnt;
52*4882a593Smuzhiyun 	struct phl_cmd_sync cmd_sync;
53*4882a593Smuzhiyun };
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun #define DBG_CMD_SYNC
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun #ifdef DBG_CMD_SYNC
_phl_cmd_sync_dump(struct phl_cmd_sync * cmd_sync,const char * caller)59*4882a593Smuzhiyun static void _phl_cmd_sync_dump(struct phl_cmd_sync *cmd_sync, const char *caller)
60*4882a593Smuzhiyun {
61*4882a593Smuzhiyun 	PHL_INFO("[CMD_SYNC] %s\n", caller);
62*4882a593Smuzhiyun 	PHL_INFO("[CMD_SYNC] evt_id:%d status:%d\n", cmd_sync->evt_id, cmd_sync->sync.status);
63*4882a593Smuzhiyun 	PHL_INFO("[CMD_SYNC] take:%d ms\n", phl_get_passing_time_ms(cmd_sync->sync.submit_time));
64*4882a593Smuzhiyun }
65*4882a593Smuzhiyun #endif
66*4882a593Smuzhiyun 
_phl_cmd_sync_init(struct phl_info_t * phl_info,enum phl_msg_evt_id evt_id,struct phl_cmd_sync * cmd_sync,u32 timeout_ms)67*4882a593Smuzhiyun static void _phl_cmd_sync_init(struct phl_info_t *phl_info,
68*4882a593Smuzhiyun 		enum phl_msg_evt_id evt_id,
69*4882a593Smuzhiyun 		struct phl_cmd_sync *cmd_sync, u32 timeout_ms)
70*4882a593Smuzhiyun {
71*4882a593Smuzhiyun 	void *drv = phl_to_drvpriv(phl_info);
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 	_os_spinlock_init(drv, &cmd_sync->lock);
74*4882a593Smuzhiyun 	cmd_sync->evt_id = evt_id;
75*4882a593Smuzhiyun 	cmd_sync->sync.timeout_ms = timeout_ms;
76*4882a593Smuzhiyun 	cmd_sync->sync.submit_time = _os_get_cur_time_ms();
77*4882a593Smuzhiyun 	_os_event_init(drv, &(cmd_sync->sync.done));
78*4882a593Smuzhiyun 	cmd_sync->sync.status = PHL_CMD_SUBMITTED;
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun 
_phl_cmd_sync_deinit(struct phl_info_t * phl_info,struct phl_cmd_sync * cmd_sync)81*4882a593Smuzhiyun static void _phl_cmd_sync_deinit(struct phl_info_t *phl_info,
82*4882a593Smuzhiyun 			struct phl_cmd_sync *cmd_sync)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun 	#ifdef DBG_CMD_SYNC
85*4882a593Smuzhiyun 	_phl_cmd_sync_dump(cmd_sync, __func__);
86*4882a593Smuzhiyun 	#endif
87*4882a593Smuzhiyun 	_os_event_free(phl_to_drvpriv(phl_info), &(cmd_sync->sync.done));
88*4882a593Smuzhiyun 	_os_spinlock_free(phl_to_drvpriv(phl_info), &cmd_sync->lock);
89*4882a593Smuzhiyun }
90*4882a593Smuzhiyun 
_cmd_stat_2_phl_stat(enum phl_cmd_sts status)91*4882a593Smuzhiyun inline static enum rtw_phl_status _cmd_stat_2_phl_stat(enum phl_cmd_sts status)
92*4882a593Smuzhiyun {
93*4882a593Smuzhiyun 	if (status == PHL_CMD_DONE_TIMEOUT)
94*4882a593Smuzhiyun 		return RTW_PHL_STATUS_CMD_TIMEOUT;
95*4882a593Smuzhiyun 	else if(status == PHL_CMD_DONE_CANNOT_IO)
96*4882a593Smuzhiyun 		return RTW_PHL_STATUS_CMD_CANNOT_IO;
97*4882a593Smuzhiyun 	else if (status == PHL_CMD_DONE_CMD_ERROR)
98*4882a593Smuzhiyun 		return RTW_PHL_STATUS_CMD_ERROR;
99*4882a593Smuzhiyun 	else if (status == PHL_CMD_DONE_CMD_DROP)
100*4882a593Smuzhiyun 		return RTW_PHL_STATUS_CMD_DROP;
101*4882a593Smuzhiyun 	else
102*4882a593Smuzhiyun 		return RTW_PHL_STATUS_CMD_SUCCESS;
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun static enum rtw_phl_status
_phl_cmd_wait(struct phl_info_t * phl_info,struct phl_cmd_sync * cmd_sync)106*4882a593Smuzhiyun _phl_cmd_wait(struct phl_info_t *phl_info, struct phl_cmd_sync *cmd_sync)
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun 	void *drv = phl_to_drvpriv(phl_info);
109*4882a593Smuzhiyun 	u32 cmd_wait_ms = cmd_sync->sync.timeout_ms;/*0: wait forever, >0: up to ms waiting*/
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 	#ifdef DBG_CMD_SYNC
112*4882a593Smuzhiyun 	PHL_INFO("evt_id:%d %s in...............\n", cmd_sync->evt_id, __func__);
113*4882a593Smuzhiyun 	#endif
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun 	if (_os_event_wait(drv, &cmd_sync->sync.done, cmd_wait_ms) == 0) {
116*4882a593Smuzhiyun 		_os_spinlock(drv, &cmd_sync->lock, _bh, NULL);
117*4882a593Smuzhiyun 		cmd_sync->sync.status = PHL_CMD_DONE_TIMEOUT;
118*4882a593Smuzhiyun 		_os_spinunlock(drv, &cmd_sync->lock, _bh, NULL);
119*4882a593Smuzhiyun 		PHL_ERR("%s evt_id:%d timeout\n", __func__, cmd_sync->evt_id);
120*4882a593Smuzhiyun 	}
121*4882a593Smuzhiyun 	#ifdef DBG_CMD_SYNC
122*4882a593Smuzhiyun 	PHL_INFO("evt_id:%d %s out...............\n", cmd_sync->evt_id, __func__);
123*4882a593Smuzhiyun 	_phl_cmd_sync_dump(cmd_sync, __func__);
124*4882a593Smuzhiyun 	#endif
125*4882a593Smuzhiyun 	return _cmd_stat_2_phl_stat(cmd_sync->sync.status);
126*4882a593Smuzhiyun }
127*4882a593Smuzhiyun 
_phl_cmd_chk_wating_status(enum phl_cmd_sts status)128*4882a593Smuzhiyun static bool _phl_cmd_chk_wating_status(enum phl_cmd_sts status)
129*4882a593Smuzhiyun {
130*4882a593Smuzhiyun 	switch (status) {
131*4882a593Smuzhiyun 	case PHL_CMD_SUBMITTED:
132*4882a593Smuzhiyun 		/* fall through */
133*4882a593Smuzhiyun 	case PHL_CMD_DONE_UNKNOWN:
134*4882a593Smuzhiyun 		return true;
135*4882a593Smuzhiyun 	default:
136*4882a593Smuzhiyun 		return false;
137*4882a593Smuzhiyun 	}
138*4882a593Smuzhiyun }
139*4882a593Smuzhiyun 
_phl_cmd_done(struct phl_info_t * phl_info,struct phl_cmd_sync * cmd_sync,enum phl_cmd_sts status)140*4882a593Smuzhiyun static void _phl_cmd_done(struct phl_info_t *phl_info,
141*4882a593Smuzhiyun 		struct phl_cmd_sync *cmd_sync, enum phl_cmd_sts status)
142*4882a593Smuzhiyun {
143*4882a593Smuzhiyun 	void *drv = phl_to_drvpriv(phl_info);
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	if (!cmd_sync) {
146*4882a593Smuzhiyun 		PHL_ERR("%s cmd_sync is NULL\n", __func__);
147*4882a593Smuzhiyun 		_os_warn_on(1);
148*4882a593Smuzhiyun 		return;
149*4882a593Smuzhiyun 	}
150*4882a593Smuzhiyun 	#ifdef DBG_CMD_SYNC
151*4882a593Smuzhiyun 	PHL_INFO("evt_id:%d %s in...............\n", cmd_sync->evt_id, __func__);
152*4882a593Smuzhiyun 	#endif
153*4882a593Smuzhiyun 	_os_spinlock(drv, &cmd_sync->lock, _bh, NULL);
154*4882a593Smuzhiyun 	if (_phl_cmd_chk_wating_status(cmd_sync->sync.status)) {
155*4882a593Smuzhiyun 		PHL_INFO("%s status:%d\n", __func__, status);
156*4882a593Smuzhiyun 		cmd_sync->sync.status = status;
157*4882a593Smuzhiyun 	}
158*4882a593Smuzhiyun 	_os_spinunlock(drv, &cmd_sync->lock, _bh, NULL);
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun 	_os_event_set(drv, &cmd_sync->sync.done);
161*4882a593Smuzhiyun 	#ifdef DBG_CMD_SYNC
162*4882a593Smuzhiyun 	PHL_INFO("evt_id:%d %s out...............\n", cmd_sync->evt_id, __func__);
163*4882a593Smuzhiyun 	_phl_cmd_sync_dump(cmd_sync, __func__);
164*4882a593Smuzhiyun 	#endif
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun /********************************************************/
167*4882a593Smuzhiyun static enum rtw_phl_status
_phl_cmd_general_pre_phase_msg_hdlr(struct phl_info_t * phl_info,void * dispr,struct phl_msg * msg)168*4882a593Smuzhiyun _phl_cmd_general_pre_phase_msg_hdlr(struct phl_info_t *phl_info, void *dispr,
169*4882a593Smuzhiyun 				    struct phl_msg *msg)
170*4882a593Smuzhiyun {
171*4882a593Smuzhiyun 	enum phl_msg_evt_id evt_id = MSG_EVT_ID_FIELD(msg->msg_id);
172*4882a593Smuzhiyun 	enum rtw_phl_status psts = RTW_PHL_STATUS_FAILURE;
173*4882a593Smuzhiyun 	struct phl_cmd_obj *phl_cmd = NULL;
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 	phl_cmd = (struct phl_cmd_obj *)msg->inbuf;
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun 	switch (evt_id) {
178*4882a593Smuzhiyun 	case MSG_EVT_DBG_RX_DUMP:
179*4882a593Smuzhiyun 		/* Do Nothing */
180*4882a593Smuzhiyun 		psts = RTW_PHL_STATUS_SUCCESS;
181*4882a593Smuzhiyun 	break;
182*4882a593Smuzhiyun 	case MSG_EVT_NONE:
183*4882a593Smuzhiyun 		/* fall through */
184*4882a593Smuzhiyun 	default:
185*4882a593Smuzhiyun 		psts = RTW_PHL_STATUS_SUCCESS;
186*4882a593Smuzhiyun 		break;
187*4882a593Smuzhiyun 	}
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	return psts;
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun static enum rtw_phl_status
_phl_cmd_general_post_phase_msg_hdlr(struct phl_info_t * phl_info,void * dispr,struct phl_msg * msg)193*4882a593Smuzhiyun _phl_cmd_general_post_phase_msg_hdlr(struct phl_info_t *phl_info, void *dispr,
194*4882a593Smuzhiyun 				     struct phl_msg *msg)
195*4882a593Smuzhiyun {
196*4882a593Smuzhiyun 	enum rtw_phl_status psts = RTW_PHL_STATUS_FAILURE;
197*4882a593Smuzhiyun 	enum phl_msg_evt_id evt_id = MSG_EVT_ID_FIELD(msg->msg_id);
198*4882a593Smuzhiyun 	struct phl_cmd_obj *phl_cmd = NULL;
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun 	phl_cmd = (struct phl_cmd_obj *)msg->inbuf;
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun 	switch (evt_id) {
203*4882a593Smuzhiyun 	case MSG_EVT_CHG_OP_CH_DEF_START:
204*4882a593Smuzhiyun 		psts = phl_cmd_chg_op_chdef_start_hdl(phl_info, phl_cmd->buf);
205*4882a593Smuzhiyun 	break;
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun 	case MSG_EVT_SWCH_START:
208*4882a593Smuzhiyun 		psts = phl_cmd_set_ch_bw_hdl(phl_info, phl_cmd->buf);
209*4882a593Smuzhiyun 	break;
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun 	#if defined(CONFIG_PCI_HCI) && defined(PCIE_TRX_MIT_EN)
212*4882a593Smuzhiyun 	case MSG_EVT_PCIE_TRX_MIT:
213*4882a593Smuzhiyun 		psts = phl_evt_pcie_trx_mit_hdlr(phl_info, phl_cmd->buf);
214*4882a593Smuzhiyun 	break;
215*4882a593Smuzhiyun 	#endif
216*4882a593Smuzhiyun 	case MSG_EVT_DBG_RX_DUMP:
217*4882a593Smuzhiyun 	{
218*4882a593Smuzhiyun 		PHL_TRACE(COMP_PHL_DBG, _PHL_INFO_, "===> %s : MSG_EVT_DBG_RX_DUMP\n", __func__);
219*4882a593Smuzhiyun 		rtw_hal_notification(phl_info->hal, MSG_EVT_DBG_RX_DUMP, HW_PHY_0);
220*4882a593Smuzhiyun 		PHL_TRACE(COMP_PHL_DBG, _PHL_INFO_, "<=== %s : MSG_EVT_DBG_RX_DUMP\n", __func__);
221*4882a593Smuzhiyun 		psts = RTW_PHL_STATUS_SUCCESS;
222*4882a593Smuzhiyun 	}
223*4882a593Smuzhiyun 	break;
224*4882a593Smuzhiyun 	case MSG_EVT_SW_WATCHDOG:
225*4882a593Smuzhiyun 		if (IS_MSG_FAIL(msg->msg_id))
226*4882a593Smuzhiyun 			psts = RTW_PHL_STATUS_FAILURE;
227*4882a593Smuzhiyun 		else if (IS_MSG_CANCEL(msg->msg_id))
228*4882a593Smuzhiyun 			psts = RTW_PHL_STATUS_FAILURE;
229*4882a593Smuzhiyun 		else
230*4882a593Smuzhiyun 			psts = RTW_PHL_STATUS_SUCCESS;
231*4882a593Smuzhiyun 		psts = phl_watchdog_sw_cmd_hdl(phl_info, psts);
232*4882a593Smuzhiyun 	break;
233*4882a593Smuzhiyun 	case MSG_EVT_HW_WATCHDOG:
234*4882a593Smuzhiyun 	{
235*4882a593Smuzhiyun 		if (IS_MSG_CANNOT_IO(msg->msg_id))
236*4882a593Smuzhiyun 			psts = RTW_PHL_STATUS_CANNOT_IO;
237*4882a593Smuzhiyun 		else if (IS_MSG_FAIL(msg->msg_id))
238*4882a593Smuzhiyun 			psts = RTW_PHL_STATUS_FAILURE;
239*4882a593Smuzhiyun 		else if (IS_MSG_CANCEL(msg->msg_id))
240*4882a593Smuzhiyun 			psts = RTW_PHL_STATUS_FAILURE;
241*4882a593Smuzhiyun 		else
242*4882a593Smuzhiyun 			psts = RTW_PHL_STATUS_SUCCESS;
243*4882a593Smuzhiyun 		psts = phl_watchdog_hw_cmd_hdl(phl_info, psts);
244*4882a593Smuzhiyun 	}
245*4882a593Smuzhiyun 	break;
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun #if defined(CONFIG_USB_HCI)
248*4882a593Smuzhiyun 	case MSG_EVT_FORCE_USB_SW:
249*4882a593Smuzhiyun 		psts = phl_force_usb_switch(phl_info, *(u32*)(phl_cmd->buf));
250*4882a593Smuzhiyun 	break;
251*4882a593Smuzhiyun 	case MSG_EVT_GET_USB_SPEED:
252*4882a593Smuzhiyun 		psts = phl_get_cur_usb_speed(phl_info, (u32*)(phl_cmd->buf));
253*4882a593Smuzhiyun 	break;
254*4882a593Smuzhiyun 	case MSG_EVT_GET_USB_SW_ABILITY:
255*4882a593Smuzhiyun 		psts = phl_get_usb_support_ability(phl_info, (u32*)(phl_cmd->buf));
256*4882a593Smuzhiyun 	break;
257*4882a593Smuzhiyun #endif
258*4882a593Smuzhiyun 	case MSG_EVT_CFG_AMPDU:
259*4882a593Smuzhiyun 		psts = phl_cmd_cfg_ampdu_hdl(phl_info, phl_cmd->buf);
260*4882a593Smuzhiyun 	break;
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun 	case MSG_EVT_DFS_PAUSE_TX:
263*4882a593Smuzhiyun 		psts = phl_cmd_dfs_tx_pause_hdl(phl_info, phl_cmd->buf);
264*4882a593Smuzhiyun 	break;
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun 	case MSG_EVT_ROLE_RECOVER:
267*4882a593Smuzhiyun 		psts = phl_role_recover(phl_info);
268*4882a593Smuzhiyun 	break;
269*4882a593Smuzhiyun 	case MSG_EVT_ROLE_SUSPEND:
270*4882a593Smuzhiyun 		psts = phl_role_suspend(phl_info);
271*4882a593Smuzhiyun 	break;
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun #if defined(CONFIG_PCI_HCI)
274*4882a593Smuzhiyun 	case MSG_EVT_HAL_SET_L2_LEAVE:
275*4882a593Smuzhiyun 		if (rtw_hal_set_l2_leave(phl_info->hal) == RTW_HAL_STATUS_SUCCESS)
276*4882a593Smuzhiyun 			psts = RTW_PHL_STATUS_SUCCESS;
277*4882a593Smuzhiyun 	break;
278*4882a593Smuzhiyun #endif
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 	case MSG_EVT_NOTIFY_HAL:
281*4882a593Smuzhiyun 		psts = phl_notify_cmd_hdl(phl_info, phl_cmd->buf);
282*4882a593Smuzhiyun 	break;
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun 	case MSG_EVT_ISSUE_BCN:
285*4882a593Smuzhiyun #ifdef RTW_PHL_BCN
286*4882a593Smuzhiyun 		psts = phl_cmd_issue_bcn_hdl(phl_info, phl_cmd->buf);
287*4882a593Smuzhiyun #endif
288*4882a593Smuzhiyun 	break;
289*4882a593Smuzhiyun 	case MSG_EVT_STOP_BCN:
290*4882a593Smuzhiyun #ifdef RTW_PHL_BCN
291*4882a593Smuzhiyun 		psts = phl_cmd_stop_bcn_hdl(phl_info, phl_cmd->buf);
292*4882a593Smuzhiyun #endif
293*4882a593Smuzhiyun 	break;
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun 	case MSG_EVT_SEC_KEY:
296*4882a593Smuzhiyun 		psts = phl_cmd_set_key_hdl(phl_info, phl_cmd->buf);
297*4882a593Smuzhiyun 	break;
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun 	case MSG_EVT_ROLE_START:
300*4882a593Smuzhiyun 		psts = phl_wifi_role_start_hdl(phl_info, phl_cmd->buf);
301*4882a593Smuzhiyun 	break;
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun 	case MSG_EVT_ROLE_CHANGE:
304*4882a593Smuzhiyun 		psts = phl_wifi_role_chg_hdl(phl_info, phl_cmd->buf);
305*4882a593Smuzhiyun 	break;
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun 	case MSG_EVT_ROLE_STOP:
308*4882a593Smuzhiyun 		psts = phl_wifi_role_stop_hdl(phl_info, phl_cmd->buf);
309*4882a593Smuzhiyun 	break;
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 	case MSG_EVT_STA_INFO_CTRL:
312*4882a593Smuzhiyun 		psts = phl_cmd_alloc_stainfo_hdl(phl_info, phl_cmd->buf);
313*4882a593Smuzhiyun 	break;
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun 	case MSG_EVT_STA_MEDIA_STATUS_UPT:
316*4882a593Smuzhiyun 		psts = phl_update_media_status_hdl(phl_info, phl_cmd->buf);
317*4882a593Smuzhiyun 	break;
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun 	case MSG_EVT_CFG_CHINFO:
320*4882a593Smuzhiyun #ifdef CONFIG_PHL_CHANNEL_INFO
321*4882a593Smuzhiyun 		psts = phl_cmd_cfg_chinfo_hdl(phl_info, phl_cmd->buf);
322*4882a593Smuzhiyun #endif
323*4882a593Smuzhiyun 	break;
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun 	case MSG_EVT_STA_CHG_STAINFO:
326*4882a593Smuzhiyun 		psts = phl_cmd_change_stainfo_hdl(phl_info, phl_cmd->buf);
327*4882a593Smuzhiyun 	break;
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun 	default:
330*4882a593Smuzhiyun 		psts = RTW_PHL_STATUS_SUCCESS;
331*4882a593Smuzhiyun 	break;
332*4882a593Smuzhiyun 	}
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun 	return psts;
335*4882a593Smuzhiyun }
336*4882a593Smuzhiyun 
_phl_cmd_general_init(void * phl,void * dispr,void ** priv)337*4882a593Smuzhiyun static enum phl_mdl_ret_code _phl_cmd_general_init(void *phl, void *dispr,
338*4882a593Smuzhiyun 						   void **priv)
339*4882a593Smuzhiyun {
340*4882a593Smuzhiyun 	*priv = phl;
341*4882a593Smuzhiyun 	return MDL_RET_SUCCESS;
342*4882a593Smuzhiyun }
343*4882a593Smuzhiyun 
_phl_cmd_general_deinit(void * dispr,void * priv)344*4882a593Smuzhiyun static void _phl_cmd_general_deinit(void *dispr, void *priv)
345*4882a593Smuzhiyun {
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun }
348*4882a593Smuzhiyun 
_phl_cmd_general_start(void * dispr,void * priv)349*4882a593Smuzhiyun static enum phl_mdl_ret_code _phl_cmd_general_start(void *dispr, void *priv)
350*4882a593Smuzhiyun {
351*4882a593Smuzhiyun 	u8 dispr_idx = 0;
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun 	if (RTW_PHL_STATUS_SUCCESS != phl_dispr_get_idx(dispr, &dispr_idx))
354*4882a593Smuzhiyun 		return MDL_RET_FAIL;
355*4882a593Smuzhiyun 
356*4882a593Smuzhiyun 	#if defined(CONFIG_PCI_HCI) && defined(PCIE_TRX_MIT_EN)
357*4882a593Smuzhiyun 	{
358*4882a593Smuzhiyun 		struct phl_info_t *phl_info = (struct phl_info_t *)priv;
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun 		if (RTW_PHL_STATUS_SUCCESS !=
361*4882a593Smuzhiyun 		phl_pcie_trx_mit_start(phl_info, dispr_idx))
362*4882a593Smuzhiyun 			return MDL_RET_FAIL;
363*4882a593Smuzhiyun 	}
364*4882a593Smuzhiyun 	#endif
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun 	return MDL_RET_SUCCESS;
367*4882a593Smuzhiyun }
368*4882a593Smuzhiyun 
_stop_operation_on_general(void * phl)369*4882a593Smuzhiyun static void _stop_operation_on_general(void *phl)
370*4882a593Smuzhiyun {
371*4882a593Smuzhiyun 	rtw_phl_watchdog_stop(phl);
372*4882a593Smuzhiyun }
373*4882a593Smuzhiyun 
_phl_cmd_general_stop(void * dispr,void * priv)374*4882a593Smuzhiyun static enum phl_mdl_ret_code _phl_cmd_general_stop(void *dispr, void *priv)
375*4882a593Smuzhiyun {
376*4882a593Smuzhiyun 	_stop_operation_on_general(priv);
377*4882a593Smuzhiyun 	return MDL_RET_SUCCESS;
378*4882a593Smuzhiyun }
379*4882a593Smuzhiyun 
_fail_evt_hdlr(void * dispr,void * priv,struct phl_msg * msg)380*4882a593Smuzhiyun static void _fail_evt_hdlr(void *dispr, void *priv, struct phl_msg *msg)
381*4882a593Smuzhiyun {
382*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)priv;
383*4882a593Smuzhiyun 	u16 evt_id = MSG_EVT_ID_FIELD(msg->msg_id);
384*4882a593Smuzhiyun 	u8 idx = 0;
385*4882a593Smuzhiyun #ifdef CONFIG_POWER_SAVE
386*4882a593Smuzhiyun 	struct phl_module_op_info op_info = {0};
387*4882a593Smuzhiyun #endif
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun 	phl_dispr_get_idx(dispr, &idx);
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun 	switch (evt_id) {
392*4882a593Smuzhiyun 	case MSG_EVT_HW_WATCHDOG:
393*4882a593Smuzhiyun 		/* watchdog do not need to handle fail case */
394*4882a593Smuzhiyun 		PHL_DBG("%s do simple watchdog!\n", __func__);
395*4882a593Smuzhiyun 		rtw_hal_simple_watchdog(phl_info->hal, false);
396*4882a593Smuzhiyun 		break;
397*4882a593Smuzhiyun 	default:
398*4882a593Smuzhiyun #ifdef CONFIG_POWER_SAVE
399*4882a593Smuzhiyun 		op_info.op_code = PS_MDL_OP_CANCEL_PWR_REQ;
400*4882a593Smuzhiyun 		op_info.inbuf = (u8 *)&evt_id;
401*4882a593Smuzhiyun 		phl_disp_eng_set_bk_module_info(phl_info, idx,
402*4882a593Smuzhiyun 				PHL_MDL_POWER_MGNT, &op_info);
403*4882a593Smuzhiyun #endif
404*4882a593Smuzhiyun 		break;
405*4882a593Smuzhiyun 	}
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun 
_phl_cmd_general_msg_hdlr(void * dispr,void * priv,struct phl_msg * msg)408*4882a593Smuzhiyun static enum phl_mdl_ret_code _phl_cmd_general_msg_hdlr(void *dispr, void *priv,
409*4882a593Smuzhiyun 						       struct phl_msg *msg)
410*4882a593Smuzhiyun {
411*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)priv;
412*4882a593Smuzhiyun 	enum rtw_phl_status status = RTW_PHL_STATUS_FAILURE;
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun 	if (IS_MSG_FAIL(msg->msg_id)) {
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun 		PHL_INFO("%s :: MDL_ID(%d)_FAIL - MSG_EVT_ID=%d \n", __func__,
417*4882a593Smuzhiyun 			 MSG_MDL_ID_FIELD(msg->msg_id),
418*4882a593Smuzhiyun 			 MSG_EVT_ID_FIELD(msg->msg_id));
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun 		_fail_evt_hdlr(dispr, priv, msg);
421*4882a593Smuzhiyun 
422*4882a593Smuzhiyun 		return MDL_RET_FAIL;
423*4882a593Smuzhiyun 	}
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun 	if (MSG_MDL_ID_FIELD(msg->msg_id) != PHL_MDL_GENERAL)
426*4882a593Smuzhiyun 		return MDL_RET_IGNORE;
427*4882a593Smuzhiyun 
428*4882a593Smuzhiyun 	/*
429*4882a593Smuzhiyun 	 * GENERAL is optional module, msg pass through mandatory module,
430*4882a593Smuzhiyun 	 * optional module, and wifi role(protocol). So msg shall be handled
431*4882a593Smuzhiyun 	 * at post phase to make sure that wifi role is at valid state
432*4882a593Smuzhiyun 	 * if the msg is relative to wifi role(protocol)
433*4882a593Smuzhiyun 	 */
434*4882a593Smuzhiyun 	if (IS_MSG_IN_PRE_PHASE(msg->msg_id))
435*4882a593Smuzhiyun 		status =
436*4882a593Smuzhiyun 		    _phl_cmd_general_pre_phase_msg_hdlr(phl_info, dispr, msg);
437*4882a593Smuzhiyun 	else
438*4882a593Smuzhiyun 		status =
439*4882a593Smuzhiyun 		    _phl_cmd_general_post_phase_msg_hdlr(phl_info, dispr, msg);
440*4882a593Smuzhiyun 
441*4882a593Smuzhiyun 	if (status != RTW_PHL_STATUS_SUCCESS)
442*4882a593Smuzhiyun 		return MDL_RET_FAIL;
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun 	return MDL_RET_SUCCESS;
445*4882a593Smuzhiyun }
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun static enum phl_mdl_ret_code
_phl_cmd_general_set_info(void * dispr,void * priv,struct phl_module_op_info * info)448*4882a593Smuzhiyun _phl_cmd_general_set_info(void *dispr, void *priv,
449*4882a593Smuzhiyun 			  struct phl_module_op_info *info)
450*4882a593Smuzhiyun {
451*4882a593Smuzhiyun 	return MDL_RET_SUCCESS;
452*4882a593Smuzhiyun }
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun enum rtw_phl_status
phl_cmd_get_cur_cmdinfo(struct phl_info_t * phl_info,u8 band_idx,struct phl_msg * msg,u8 ** cmd,u32 * cmd_len)455*4882a593Smuzhiyun phl_cmd_get_cur_cmdinfo(struct phl_info_t *phl_info,
456*4882a593Smuzhiyun 						u8 band_idx,
457*4882a593Smuzhiyun 						struct phl_msg *msg,
458*4882a593Smuzhiyun 						u8 **cmd,
459*4882a593Smuzhiyun 						u32 *cmd_len)
460*4882a593Smuzhiyun {
461*4882a593Smuzhiyun 	enum rtw_phl_status psts = RTW_PHL_STATUS_FAILURE;
462*4882a593Smuzhiyun 	struct phl_cmd_obj *phl_cmd = NULL;
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun 	phl_cmd = (struct phl_cmd_obj *)msg->inbuf;
465*4882a593Smuzhiyun 	if (NULL != phl_cmd) {
466*4882a593Smuzhiyun 		*cmd = phl_cmd->buf;
467*4882a593Smuzhiyun 		*cmd_len = phl_cmd->buf_len;
468*4882a593Smuzhiyun 		psts = RTW_PHL_STATUS_SUCCESS;
469*4882a593Smuzhiyun 	}
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun 	return psts;
472*4882a593Smuzhiyun }
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun static enum phl_mdl_ret_code
_phl_cmd_general_query_info(void * dispr,void * priv,struct phl_module_op_info * info)475*4882a593Smuzhiyun _phl_cmd_general_query_info(void *dispr, void *priv,
476*4882a593Smuzhiyun 			    struct phl_module_op_info *info)
477*4882a593Smuzhiyun {
478*4882a593Smuzhiyun 	return MDL_RET_SUCCESS;
479*4882a593Smuzhiyun }
480*4882a593Smuzhiyun 
phl_register_cmd_general(struct phl_info_t * phl_info)481*4882a593Smuzhiyun enum rtw_phl_status phl_register_cmd_general(struct phl_info_t *phl_info)
482*4882a593Smuzhiyun {
483*4882a593Smuzhiyun 	enum rtw_phl_status status = RTW_PHL_STATUS_FAILURE;
484*4882a593Smuzhiyun 	struct phl_cmd_dispatch_engine *disp_eng = &(phl_info->disp_eng);
485*4882a593Smuzhiyun 	struct phl_bk_module_ops bk_ops;
486*4882a593Smuzhiyun 	u8 band_idx = 0;
487*4882a593Smuzhiyun 
488*4882a593Smuzhiyun 	bk_ops.init = _phl_cmd_general_init;
489*4882a593Smuzhiyun 	bk_ops.deinit = _phl_cmd_general_deinit;
490*4882a593Smuzhiyun 	bk_ops.start = _phl_cmd_general_start;
491*4882a593Smuzhiyun 	bk_ops.stop = _phl_cmd_general_stop;
492*4882a593Smuzhiyun 	bk_ops.msg_hdlr = _phl_cmd_general_msg_hdlr;
493*4882a593Smuzhiyun 	bk_ops.set_info = _phl_cmd_general_set_info;
494*4882a593Smuzhiyun 	bk_ops.query_info = _phl_cmd_general_query_info;
495*4882a593Smuzhiyun 
496*4882a593Smuzhiyun 	for (band_idx = 0; band_idx < disp_eng->phy_num; band_idx++) {
497*4882a593Smuzhiyun 		status = phl_disp_eng_register_module(phl_info, band_idx,
498*4882a593Smuzhiyun 						 PHL_MDL_GENERAL, &bk_ops);
499*4882a593Smuzhiyun 		if (status != RTW_PHL_STATUS_SUCCESS) {
500*4882a593Smuzhiyun 			PHL_ERR(
501*4882a593Smuzhiyun 			    "%s register MDL_GENRAL in cmd disp failed :%d\n",
502*4882a593Smuzhiyun 			    __func__, band_idx + 1);
503*4882a593Smuzhiyun 			break;
504*4882a593Smuzhiyun 		}
505*4882a593Smuzhiyun 	}
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun 	return status;
508*4882a593Smuzhiyun }
509*4882a593Smuzhiyun 
510*4882a593Smuzhiyun static enum rtw_phl_status
_phl_cmd_obj_free(struct phl_info_t * phl_info,struct phl_cmd_obj * phl_cmd)511*4882a593Smuzhiyun _phl_cmd_obj_free(struct phl_info_t *phl_info, struct phl_cmd_obj *phl_cmd)
512*4882a593Smuzhiyun {
513*4882a593Smuzhiyun 	void *drv = phl_to_drvpriv(phl_info);
514*4882a593Smuzhiyun 
515*4882a593Smuzhiyun 	if(phl_cmd == NULL) {
516*4882a593Smuzhiyun 		PHL_ERR("%s phl_cmd is NULL\n", __func__);
517*4882a593Smuzhiyun 		_os_warn_on(1);
518*4882a593Smuzhiyun 		return RTW_PHL_STATUS_FAILURE;
519*4882a593Smuzhiyun 	}
520*4882a593Smuzhiyun 
521*4882a593Smuzhiyun 	if (phl_cmd->is_cmd_wait == true)
522*4882a593Smuzhiyun 		_phl_cmd_sync_deinit(phl_info, &phl_cmd->cmd_sync);
523*4882a593Smuzhiyun 	_os_kmem_free(drv, phl_cmd, sizeof(struct phl_cmd_obj));
524*4882a593Smuzhiyun 	phl_cmd = NULL;
525*4882a593Smuzhiyun 	return RTW_PHL_STATUS_SUCCESS;
526*4882a593Smuzhiyun }
527*4882a593Smuzhiyun 
_phl_cmd_complete(void * priv,struct phl_msg * msg)528*4882a593Smuzhiyun static void _phl_cmd_complete(void *priv, struct phl_msg *msg)
529*4882a593Smuzhiyun {
530*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)priv;
531*4882a593Smuzhiyun 	void *drv = phl_to_drvpriv(phl_info);
532*4882a593Smuzhiyun 	struct phl_cmd_obj *phl_cmd = (struct phl_cmd_obj *)msg->inbuf;
533*4882a593Smuzhiyun 	enum phl_cmd_sts csts = PHL_CMD_DONE_UNKNOWN;
534*4882a593Smuzhiyun 	enum rtw_phl_status pstst = RTW_PHL_STATUS_SUCCESS;
535*4882a593Smuzhiyun 
536*4882a593Smuzhiyun 	PHL_DBG("%s evt_id:%d\n", __func__, phl_cmd->evt_id);
537*4882a593Smuzhiyun 
538*4882a593Smuzhiyun 	if (IS_MSG_CANNOT_IO(msg->msg_id))
539*4882a593Smuzhiyun 		csts = PHL_CMD_DONE_CANNOT_IO;
540*4882a593Smuzhiyun 	else if (IS_MSG_FAIL(msg->msg_id))
541*4882a593Smuzhiyun 		csts = PHL_CMD_DONE_CMD_ERROR;
542*4882a593Smuzhiyun 	else if (IS_MSG_CANCEL(msg->msg_id))
543*4882a593Smuzhiyun 		csts = PHL_CMD_DONE_CMD_DROP;
544*4882a593Smuzhiyun 	else
545*4882a593Smuzhiyun 		csts = PHL_CMD_DONE_SUCCESS;
546*4882a593Smuzhiyun 
547*4882a593Smuzhiyun 	if (phl_cmd->is_cmd_wait)
548*4882a593Smuzhiyun 		_phl_cmd_done(phl_info, &phl_cmd->cmd_sync, csts);
549*4882a593Smuzhiyun 
550*4882a593Smuzhiyun 	pstst = _cmd_stat_2_phl_stat(csts);
551*4882a593Smuzhiyun 	if (phl_cmd->cmd_complete)
552*4882a593Smuzhiyun 		phl_cmd->cmd_complete(drv, phl_cmd->buf, phl_cmd->buf_len, pstst);
553*4882a593Smuzhiyun 
554*4882a593Smuzhiyun 	if (phl_cmd->is_cmd_wait) {
555*4882a593Smuzhiyun 		#define PHL_MAX_SCHEDULE_TIMEOUT 100000
556*4882a593Smuzhiyun 		u32 try_cnt = 0;
557*4882a593Smuzhiyun 		u32 start = _os_get_cur_time_ms();
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun 		do {
560*4882a593Smuzhiyun 			if (_os_atomic_read(drv, &(phl_cmd->ref_cnt)) == 1)
561*4882a593Smuzhiyun 				break;
562*4882a593Smuzhiyun 			_os_sleep_ms(drv, 10);
563*4882a593Smuzhiyun 			try_cnt++;
564*4882a593Smuzhiyun 			if (try_cnt == 50)
565*4882a593Smuzhiyun 				PHL_ERR("F-%s, L-%d polling is_cmd_wait to false\n",
566*4882a593Smuzhiyun 							__FUNCTION__, __LINE__);
567*4882a593Smuzhiyun 		} while (phl_get_passing_time_ms(start) < PHL_MAX_SCHEDULE_TIMEOUT);
568*4882a593Smuzhiyun 	}
569*4882a593Smuzhiyun 
570*4882a593Smuzhiyun 	_phl_cmd_obj_free(phl_info, phl_cmd);
571*4882a593Smuzhiyun }
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun enum rtw_phl_status
phl_cmd_enqueue(struct phl_info_t * phl_info,enum phl_band_idx band_idx,enum phl_msg_evt_id evt_id,u8 * cmd_buf,u32 cmd_len,void (* cmd_complete)(void * priv,u8 * buf,u32 buf_len,enum rtw_phl_status status),enum phl_cmd_type cmd_type,u32 cmd_timeout)574*4882a593Smuzhiyun phl_cmd_enqueue(struct phl_info_t *phl_info,
575*4882a593Smuzhiyun                 enum phl_band_idx band_idx,
576*4882a593Smuzhiyun                 enum phl_msg_evt_id evt_id,
577*4882a593Smuzhiyun                 u8 *cmd_buf,
578*4882a593Smuzhiyun                 u32 cmd_len,
579*4882a593Smuzhiyun                 void (*cmd_complete)(void* priv, u8 *buf, u32 buf_len, enum rtw_phl_status status),
580*4882a593Smuzhiyun                 enum phl_cmd_type cmd_type,
581*4882a593Smuzhiyun                 u32 cmd_timeout)
582*4882a593Smuzhiyun {
583*4882a593Smuzhiyun 	void *drv = phl_to_drvpriv(phl_info);
584*4882a593Smuzhiyun 	enum rtw_phl_status psts = RTW_PHL_STATUS_FAILURE;
585*4882a593Smuzhiyun 	struct phl_cmd_obj *phl_cmd = NULL;
586*4882a593Smuzhiyun 	struct phl_msg msg = {0};
587*4882a593Smuzhiyun 	struct phl_msg_attribute attr = {0};
588*4882a593Smuzhiyun 
589*4882a593Smuzhiyun 	phl_cmd = _os_kmem_alloc(drv, sizeof(struct phl_cmd_obj));
590*4882a593Smuzhiyun 	if (phl_cmd == NULL) {
591*4882a593Smuzhiyun 		PHL_ERR("%s: alloc phl_cmd failed!\n", __func__);
592*4882a593Smuzhiyun 		psts = RTW_PHL_STATUS_RESOURCE;
593*4882a593Smuzhiyun 		goto _exit;
594*4882a593Smuzhiyun 	}
595*4882a593Smuzhiyun 	phl_cmd->evt_id = evt_id;
596*4882a593Smuzhiyun 	phl_cmd->buf = cmd_buf;
597*4882a593Smuzhiyun 	phl_cmd->buf_len = cmd_len;
598*4882a593Smuzhiyun 	phl_cmd->cmd_complete = cmd_complete;
599*4882a593Smuzhiyun 
600*4882a593Smuzhiyun 	SET_MSG_MDL_ID_FIELD(msg.msg_id, PHL_MDL_GENERAL);
601*4882a593Smuzhiyun 	SET_MSG_EVT_ID_FIELD(msg.msg_id, evt_id);
602*4882a593Smuzhiyun 	msg.inbuf = (u8 *)phl_cmd;
603*4882a593Smuzhiyun 	msg.inlen = sizeof(struct phl_cmd_obj);
604*4882a593Smuzhiyun 	msg.band_idx = band_idx;
605*4882a593Smuzhiyun 	attr.completion.completion = _phl_cmd_complete;
606*4882a593Smuzhiyun 	attr.completion.priv = phl_info;
607*4882a593Smuzhiyun 
608*4882a593Smuzhiyun 	if (cmd_type == PHL_CMD_WAIT) {
609*4882a593Smuzhiyun 		phl_cmd->is_cmd_wait = true;
610*4882a593Smuzhiyun 		_os_atomic_set(drv, &phl_cmd->ref_cnt, 0);
611*4882a593Smuzhiyun 		_phl_cmd_sync_init(phl_info, evt_id, &phl_cmd->cmd_sync, cmd_timeout);
612*4882a593Smuzhiyun 	}
613*4882a593Smuzhiyun 
614*4882a593Smuzhiyun 	psts = phl_disp_eng_send_msg(phl_info, &msg, &attr, NULL);
615*4882a593Smuzhiyun 	if (psts == RTW_PHL_STATUS_SUCCESS) {
616*4882a593Smuzhiyun 		if (cmd_type == PHL_CMD_WAIT) {
617*4882a593Smuzhiyun 			psts = _phl_cmd_wait(phl_info, &phl_cmd->cmd_sync);
618*4882a593Smuzhiyun 			/*ref_cnt++ for cmd wait done*/
619*4882a593Smuzhiyun 			_os_atomic_inc(drv, &phl_cmd->ref_cnt);
620*4882a593Smuzhiyun 			/* Check wait cmd status */
621*4882a593Smuzhiyun 			if (psts == RTW_PHL_STATUS_CMD_SUCCESS)
622*4882a593Smuzhiyun 				psts = RTW_PHL_STATUS_SUCCESS;
623*4882a593Smuzhiyun 		} else {
624*4882a593Smuzhiyun 			psts = RTW_PHL_STATUS_SUCCESS;
625*4882a593Smuzhiyun 		}
626*4882a593Smuzhiyun 	} else {
627*4882a593Smuzhiyun 		PHL_TRACE(COMP_PHL_CMDDISP, _PHL_INFO_, "%s: evt_id(%d)\n", __func__, evt_id);
628*4882a593Smuzhiyun 		_phl_cmd_obj_free(phl_info, phl_cmd);
629*4882a593Smuzhiyun 	}
630*4882a593Smuzhiyun 
631*4882a593Smuzhiyun _exit:
632*4882a593Smuzhiyun 	return psts;
633*4882a593Smuzhiyun }
634*4882a593Smuzhiyun 
635*4882a593Smuzhiyun enum rtw_phl_status
rtw_phl_cmd_enqueue(void * phl,enum phl_band_idx band_idx,enum phl_msg_evt_id evt_id,u8 * cmd_buf,u32 cmd_len,void (* core_cmd_complete)(void * priv,u8 * cmd,u32 cmd_len,enum rtw_phl_status status),enum phl_cmd_type cmd_type,u32 cmd_timeout)636*4882a593Smuzhiyun rtw_phl_cmd_enqueue(void *phl,
637*4882a593Smuzhiyun                     enum phl_band_idx band_idx,
638*4882a593Smuzhiyun                     enum phl_msg_evt_id evt_id,
639*4882a593Smuzhiyun                     u8 *cmd_buf,
640*4882a593Smuzhiyun                     u32 cmd_len,
641*4882a593Smuzhiyun                     void (*core_cmd_complete)(void *priv, u8 *cmd, u32 cmd_len, enum rtw_phl_status status),
642*4882a593Smuzhiyun                     enum phl_cmd_type cmd_type,
643*4882a593Smuzhiyun                     u32 cmd_timeout)
644*4882a593Smuzhiyun {
645*4882a593Smuzhiyun 	return phl_cmd_enqueue((struct phl_info_t *)phl,
646*4882a593Smuzhiyun 	                       band_idx,
647*4882a593Smuzhiyun 	                       evt_id,
648*4882a593Smuzhiyun 	                       cmd_buf,
649*4882a593Smuzhiyun 	                       cmd_len,
650*4882a593Smuzhiyun 	                       core_cmd_complete,
651*4882a593Smuzhiyun 	                       cmd_type,
652*4882a593Smuzhiyun 	                       cmd_timeout);
653*4882a593Smuzhiyun }
654*4882a593Smuzhiyun 
655*4882a593Smuzhiyun #endif /*CONFIG_CMD_DISP*/
656*4882a593Smuzhiyun 
657