xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852bs/phl/phl_cmd_btc.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_BTC_C_
16*4882a593Smuzhiyun #include "phl_headers.h"
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #ifdef CONFIG_BTCOEX
19*4882a593Smuzhiyun #ifdef CONFIG_PHL_CMD_BTC
_fail_hdlr(void * phl,struct phl_msg * msg)20*4882a593Smuzhiyun static void _fail_hdlr(void *phl, struct phl_msg *msg)
21*4882a593Smuzhiyun {
22*4882a593Smuzhiyun }
23*4882a593Smuzhiyun 
_hdl_tmr(void * phl,struct phl_msg * msg)24*4882a593Smuzhiyun static void _hdl_tmr(void *phl, struct phl_msg *msg)
25*4882a593Smuzhiyun {
26*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun 	rtw_hal_btc_timer(phl_info->hal, (void *)msg->inbuf);
29*4882a593Smuzhiyun }
30*4882a593Smuzhiyun 
_hdl_role_notify(void * phl,struct phl_msg * msg)31*4882a593Smuzhiyun static void _hdl_role_notify(void *phl, struct phl_msg *msg)
32*4882a593Smuzhiyun {
33*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
34*4882a593Smuzhiyun 	struct rtw_role_cmd *rcmd = NULL;
35*4882a593Smuzhiyun 	struct rtw_wifi_role_t *wrole = NULL;
36*4882a593Smuzhiyun 	struct rtw_phl_stainfo_t *sta = NULL;
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun 	if (msg->inbuf && (msg->inlen == sizeof(struct rtw_role_cmd))) {
39*4882a593Smuzhiyun 		rcmd  = (struct rtw_role_cmd *)msg->inbuf;
40*4882a593Smuzhiyun 		wrole = rcmd->wrole;
41*4882a593Smuzhiyun 		sta = rtw_phl_get_stainfo_self(phl_info, wrole);
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun 		rtw_hal_btc_update_role_info_ntfy(phl_info->hal,
44*4882a593Smuzhiyun 			rcmd->wrole->id, wrole, sta, rcmd->rstate);
45*4882a593Smuzhiyun 	} else {
46*4882a593Smuzhiyun 		PHL_ERR("%s: invalid msg, buf = %p, len = %d\n",
47*4882a593Smuzhiyun 			__func__, msg->inbuf, msg->inlen);
48*4882a593Smuzhiyun 	}
49*4882a593Smuzhiyun }
50*4882a593Smuzhiyun 
_hdl_pkt_evt_notify(void * phl,struct phl_msg * msg)51*4882a593Smuzhiyun static void _hdl_pkt_evt_notify(void *phl, struct phl_msg *msg)
52*4882a593Smuzhiyun {
53*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
54*4882a593Smuzhiyun 	struct rtw_pkt_evt_ntfy *pkt_evt = NULL;
55*4882a593Smuzhiyun 	struct rtw_wifi_role_t *wrole = NULL;
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun 	if (msg->inbuf && (msg->inlen == sizeof(struct rtw_pkt_evt_ntfy))) {
58*4882a593Smuzhiyun 		pkt_evt = (struct rtw_pkt_evt_ntfy *)msg->inbuf;
59*4882a593Smuzhiyun 		wrole = pkt_evt->wrole; /* not used currently */
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun 		rtw_hal_btc_packet_event_ntfy(phl_info->hal,
62*4882a593Smuzhiyun 					(u8)pkt_evt->type);
63*4882a593Smuzhiyun 	} else {
64*4882a593Smuzhiyun 		PHL_ERR("%s: invalid msg, buf = %p, len = %d\n",
65*4882a593Smuzhiyun 			__func__, msg->inbuf, msg->inlen);
66*4882a593Smuzhiyun 	}
67*4882a593Smuzhiyun }
68*4882a593Smuzhiyun 
_btc_cmd_init(void * phl,void * dispr,void ** priv)69*4882a593Smuzhiyun static enum phl_mdl_ret_code _btc_cmd_init(void *phl, void *dispr,
70*4882a593Smuzhiyun 						  void **priv)
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun 	PHL_INFO("[BTCCMD], %s(): \n", __func__);
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun 	*priv = phl;
75*4882a593Smuzhiyun 	return MDL_RET_SUCCESS;
76*4882a593Smuzhiyun }
77*4882a593Smuzhiyun 
_btc_cmd_deinit(void * dispr,void * priv)78*4882a593Smuzhiyun static void _btc_cmd_deinit(void *dispr, void *priv)
79*4882a593Smuzhiyun {
80*4882a593Smuzhiyun 	PHL_INFO("[BTCCMD], %s(): \n", __func__);
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun 
_btc_cmd_start(void * dispr,void * priv)83*4882a593Smuzhiyun static enum phl_mdl_ret_code _btc_cmd_start(void *dispr, void *priv)
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun 	enum phl_mdl_ret_code ret = MDL_RET_SUCCESS;
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun 	PHL_INFO("[BTCCMD], %s(): \n", __func__);
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun 	return ret;
90*4882a593Smuzhiyun }
91*4882a593Smuzhiyun 
_btc_cmd_stop(void * dispr,void * priv)92*4882a593Smuzhiyun static enum phl_mdl_ret_code _btc_cmd_stop(void *dispr, void *priv)
93*4882a593Smuzhiyun {
94*4882a593Smuzhiyun 	enum phl_mdl_ret_code ret = MDL_RET_SUCCESS;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 	PHL_INFO("[BTCCMD], %s(): \n", __func__);
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	return ret;
99*4882a593Smuzhiyun }
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun static enum phl_mdl_ret_code
_btc_internal_pre_msg_hdlr(struct phl_info_t * phl_info,void * dispr,struct phl_msg * msg)102*4882a593Smuzhiyun _btc_internal_pre_msg_hdlr(struct phl_info_t *phl_info,
103*4882a593Smuzhiyun                            void *dispr,
104*4882a593Smuzhiyun                            struct phl_msg *msg)
105*4882a593Smuzhiyun {
106*4882a593Smuzhiyun 	enum phl_mdl_ret_code ret = MDL_RET_IGNORE;
107*4882a593Smuzhiyun 	enum phl_msg_evt_id evt_id = MSG_EVT_ID_FIELD(msg->msg_id);
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	/*PHL_INFO("[BTCCMD], msg->band_idx = %d,  msg->msg_id = 0x%x\n",
110*4882a593Smuzhiyun 		msg->band_idx, msg->msg_id);*/
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun 	switch(evt_id) {
113*4882a593Smuzhiyun 	case MSG_EVT_BTC_REQ_BT_SLOT:
114*4882a593Smuzhiyun 		PHL_INFO("[BTCCMD], MSG_EVT_BTC_REQ_BT_SLOT \n");
115*4882a593Smuzhiyun 		ret = MDL_RET_SUCCESS;
116*4882a593Smuzhiyun 		break;
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun 	case MSG_EVT_BTC_PKT_EVT_NTFY:
119*4882a593Smuzhiyun 		PHL_INFO("[BTCCMD], MSG_EVT_BTC_PKT_EVT_NTFY \n");
120*4882a593Smuzhiyun 		_hdl_pkt_evt_notify(phl_info, msg);
121*4882a593Smuzhiyun 		ret = MDL_RET_SUCCESS;
122*4882a593Smuzhiyun 		break;
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 	default:
125*4882a593Smuzhiyun 		break;
126*4882a593Smuzhiyun 	}
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun 	return ret;
129*4882a593Smuzhiyun }
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun static enum phl_mdl_ret_code
_btc_internal_post_msg_hdlr(struct phl_info_t * phl_info,void * dispr,struct phl_msg * msg)132*4882a593Smuzhiyun _btc_internal_post_msg_hdlr(struct phl_info_t *phl_info,
133*4882a593Smuzhiyun                             void *dispr,
134*4882a593Smuzhiyun                             struct phl_msg *msg)
135*4882a593Smuzhiyun {
136*4882a593Smuzhiyun 	enum phl_mdl_ret_code ret = MDL_RET_IGNORE;
137*4882a593Smuzhiyun 	enum phl_msg_evt_id evt_id = MSG_EVT_ID_FIELD(msg->msg_id);
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun 	switch(evt_id) {
140*4882a593Smuzhiyun 	case MSG_EVT_BTC_TMR:
141*4882a593Smuzhiyun 		PHL_DBG("[BTCCMD], MSG_EVT_BTC_TMR \n");
142*4882a593Smuzhiyun 		_hdl_tmr(phl_info, msg);
143*4882a593Smuzhiyun 		ret = MDL_RET_SUCCESS;
144*4882a593Smuzhiyun 		break;
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun 	case MSG_EVT_BTC_FWEVNT:
147*4882a593Smuzhiyun 		PHL_DBG("[BTCCMD], MSG_EVT_BTC_FWEVNT \n");
148*4882a593Smuzhiyun 		rtw_hal_btc_fwinfo_ntfy(phl_info->hal);
149*4882a593Smuzhiyun 		ret = MDL_RET_SUCCESS;
150*4882a593Smuzhiyun 		break;
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 	default:
153*4882a593Smuzhiyun 		break;
154*4882a593Smuzhiyun 	}
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun 	return ret;
157*4882a593Smuzhiyun }
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun static enum phl_mdl_ret_code
_btc_internal_msg_hdlr(struct phl_info_t * phl_info,void * dispr,struct phl_msg * msg)160*4882a593Smuzhiyun _btc_internal_msg_hdlr(struct phl_info_t *phl_info,
161*4882a593Smuzhiyun                        void *dispr,
162*4882a593Smuzhiyun                        struct phl_msg *msg)
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun 	enum phl_mdl_ret_code ret = MDL_RET_FAIL;
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 	if (IS_MSG_IN_PRE_PHASE(msg->msg_id))
167*4882a593Smuzhiyun 		ret = _btc_internal_pre_msg_hdlr(phl_info, dispr, msg);
168*4882a593Smuzhiyun 	else
169*4882a593Smuzhiyun 		ret = _btc_internal_post_msg_hdlr(phl_info, dispr, msg);
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun 	return ret;
172*4882a593Smuzhiyun }
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun static enum phl_mdl_ret_code
_btc_external_pre_msg_hdlr(struct phl_info_t * phl_info,void * dispr,struct phl_msg * msg)175*4882a593Smuzhiyun _btc_external_pre_msg_hdlr(struct phl_info_t *phl_info,
176*4882a593Smuzhiyun                            void *dispr,
177*4882a593Smuzhiyun                            struct phl_msg *msg)
178*4882a593Smuzhiyun {
179*4882a593Smuzhiyun 	enum phl_mdl_ret_code ret = MDL_RET_IGNORE;
180*4882a593Smuzhiyun 	enum phl_msg_evt_id evt_id = MSG_EVT_ID_FIELD(msg->msg_id);
181*4882a593Smuzhiyun 	enum band_type band = BAND_ON_5G;
182*4882a593Smuzhiyun 	struct rtw_hal_com_t *hal_com = rtw_hal_get_halcom(phl_info->hal);
183*4882a593Smuzhiyun 	enum phl_phy_idx phy_idx = HW_PHY_0;
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun 	/*PHL_INFO("[BTCCMD], msg->band_idx = %d,  msg->msg_id = 0x%x\n",
186*4882a593Smuzhiyun 		msg->band_idx, msg->msg_id);*/
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun 	switch(evt_id) {
189*4882a593Smuzhiyun 		case MSG_EVT_SCAN_START:
190*4882a593Smuzhiyun 			if (MSG_MDL_ID_FIELD(msg->msg_id) != PHL_FG_MDL_SCAN)
191*4882a593Smuzhiyun 				break;
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun 			if (msg->band_idx == HW_BAND_1)
194*4882a593Smuzhiyun 				phy_idx = HW_PHY_1;
195*4882a593Smuzhiyun 			PHL_INFO("[BTCCMD], MSG_EVT_SCAN_START \n");
196*4882a593Smuzhiyun 			band = hal_com->band[msg->band_idx].cur_chandef.band;
197*4882a593Smuzhiyun 			rtw_hal_btc_scan_start_ntfy(phl_info->hal, phy_idx, band);
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 			ret = MDL_RET_SUCCESS;
200*4882a593Smuzhiyun 			break;
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun 		case MSG_EVT_CONNECT_START:
203*4882a593Smuzhiyun 			if (MSG_MDL_ID_FIELD(msg->msg_id) != PHL_FG_MDL_CONNECT)
204*4882a593Smuzhiyun 				break;
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun 			PHL_INFO("[BTCCMD], MSG_EVT_CONNECT_START \n");
207*4882a593Smuzhiyun 			ret = MDL_RET_SUCCESS;
208*4882a593Smuzhiyun 			break;
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 		default:
211*4882a593Smuzhiyun 			break;
212*4882a593Smuzhiyun 	}
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun 	return ret;
215*4882a593Smuzhiyun }
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun static enum phl_mdl_ret_code
_btc_external_post_msg_hdlr(struct phl_info_t * phl_info,void * dispr,struct phl_msg * msg)218*4882a593Smuzhiyun _btc_external_post_msg_hdlr(struct phl_info_t *phl_info,
219*4882a593Smuzhiyun                             void *dispr,
220*4882a593Smuzhiyun                             struct phl_msg *msg)
221*4882a593Smuzhiyun {
222*4882a593Smuzhiyun 	enum phl_mdl_ret_code ret = MDL_RET_IGNORE;
223*4882a593Smuzhiyun 	enum phl_msg_evt_id evt_id = MSG_EVT_ID_FIELD(msg->msg_id);
224*4882a593Smuzhiyun 	struct hal_info_t *hal_info = (struct hal_info_t *)phl_info->hal;
225*4882a593Smuzhiyun 	enum phl_phy_idx phy_idx = HW_PHY_0;
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 	switch(evt_id) {
228*4882a593Smuzhiyun 		case MSG_EVT_SCAN_END:
229*4882a593Smuzhiyun 			if (MSG_MDL_ID_FIELD(msg->msg_id) != PHL_FG_MDL_SCAN)
230*4882a593Smuzhiyun 				break;
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 			if (msg->band_idx == HW_BAND_1)
233*4882a593Smuzhiyun 				phy_idx = HW_PHY_1;
234*4882a593Smuzhiyun 			PHL_DBG("[BTCCMD], MSG_EVT_SCAN_END \n");
235*4882a593Smuzhiyun 			rtw_hal_btc_scan_finish_ntfy(hal_info, phy_idx);
236*4882a593Smuzhiyun 			ret = MDL_RET_SUCCESS;
237*4882a593Smuzhiyun 			break;
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun 		case MSG_EVT_CONNECT_END:
240*4882a593Smuzhiyun 			if (MSG_MDL_ID_FIELD(msg->msg_id) != PHL_FG_MDL_CONNECT)
241*4882a593Smuzhiyun 				break;
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun 			PHL_DBG("[BTCCMD], MSG_EVT_CONNECT_END \n");
244*4882a593Smuzhiyun 			ret = MDL_RET_SUCCESS;
245*4882a593Smuzhiyun 			break;
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun 		case MSG_EVT_ROLE_NTFY:
248*4882a593Smuzhiyun 			if (MSG_MDL_ID_FIELD(msg->msg_id) != PHL_MDL_MRC)
249*4882a593Smuzhiyun 				break;
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun 			PHL_DBG("[BTCCMD], MSG_EVT_ROLE_NTFY \n");
252*4882a593Smuzhiyun 			_hdl_role_notify(phl_info, msg);
253*4882a593Smuzhiyun 			ret = MDL_RET_SUCCESS;
254*4882a593Smuzhiyun 			break;
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 		case MSG_EVT_BTC_TMR:
257*4882a593Smuzhiyun 			PHL_DBG("[BTCCMD], MSG_EVT_BTC_TMR \n");
258*4882a593Smuzhiyun 			_hdl_tmr(phl_info, msg);
259*4882a593Smuzhiyun 			ret = MDL_RET_SUCCESS;
260*4882a593Smuzhiyun 			break;
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun 		case MSG_EVT_BTC_FWEVNT:
263*4882a593Smuzhiyun 			PHL_DBG("[BTCCMD], MSG_EVT_BTC_FWEVNT \n");
264*4882a593Smuzhiyun 			rtw_hal_btc_fwinfo_ntfy(phl_info->hal);
265*4882a593Smuzhiyun 			ret = MDL_RET_SUCCESS;
266*4882a593Smuzhiyun 			break;
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 		default:
269*4882a593Smuzhiyun 			break;
270*4882a593Smuzhiyun 	}
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 	return ret;
273*4882a593Smuzhiyun }
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun static enum phl_mdl_ret_code
_btc_external_msg_hdlr(struct phl_info_t * phl_info,void * dispr,struct phl_msg * msg)276*4882a593Smuzhiyun _btc_external_msg_hdlr(struct phl_info_t *phl_info,
277*4882a593Smuzhiyun                        void *dispr,
278*4882a593Smuzhiyun                        struct phl_msg *msg)
279*4882a593Smuzhiyun {
280*4882a593Smuzhiyun 	enum phl_mdl_ret_code ret = MDL_RET_FAIL;
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun 	if (IS_MSG_IN_PRE_PHASE(msg->msg_id))
283*4882a593Smuzhiyun 		ret = _btc_external_pre_msg_hdlr(phl_info, dispr, msg);
284*4882a593Smuzhiyun 	else
285*4882a593Smuzhiyun 		ret = _btc_external_post_msg_hdlr(phl_info, dispr, msg);
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun 	return ret;
288*4882a593Smuzhiyun }
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun static enum phl_mdl_ret_code
_btc_msg_hdlr(void * dispr,void * priv,struct phl_msg * msg)291*4882a593Smuzhiyun _btc_msg_hdlr(void *dispr, void *priv, struct phl_msg *msg)
292*4882a593Smuzhiyun {
293*4882a593Smuzhiyun 	enum phl_mdl_ret_code ret = MDL_RET_IGNORE;
294*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)priv;
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun 	FUNCIN();
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 	if (IS_MSG_FAIL(msg->msg_id)) {
299*4882a593Smuzhiyun 		PHL_TRACE(COMP_PHL_DBG, _PHL_WARNING_,
300*4882a593Smuzhiyun 			  "%s: cmd dispatcher notify cmd failure: 0x%x.\n",
301*4882a593Smuzhiyun 			   __FUNCTION__, msg->msg_id);
302*4882a593Smuzhiyun 		_fail_hdlr(phl_info, msg);
303*4882a593Smuzhiyun 		FUNCOUT();
304*4882a593Smuzhiyun 		return MDL_RET_FAIL;
305*4882a593Smuzhiyun 	}
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun 	if (IS_PRIVATE_MSG(msg->msg_id)) {
308*4882a593Smuzhiyun 		FUNCOUT();
309*4882a593Smuzhiyun 		return ret;
310*4882a593Smuzhiyun 	}
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun 	switch(MSG_MDL_ID_FIELD(msg->msg_id)) {
313*4882a593Smuzhiyun 		case PHL_MDL_BTC:
314*4882a593Smuzhiyun 			ret = _btc_internal_msg_hdlr(phl_info, dispr, msg);
315*4882a593Smuzhiyun 			break;
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun 		default:
318*4882a593Smuzhiyun 			ret = _btc_external_msg_hdlr(phl_info, dispr, msg);
319*4882a593Smuzhiyun 			break;
320*4882a593Smuzhiyun 	}
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun 	FUNCOUT();
323*4882a593Smuzhiyun 	return ret;
324*4882a593Smuzhiyun }
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun static enum phl_mdl_ret_code
_btc_set_info(void * dispr,void * priv,struct phl_module_op_info * info)327*4882a593Smuzhiyun _btc_set_info(void *dispr, void *priv,
328*4882a593Smuzhiyun 			 struct phl_module_op_info *info)
329*4882a593Smuzhiyun {
330*4882a593Smuzhiyun 	PHL_INFO("[BTCCMD], %s(): \n", __func__);
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun 	return MDL_RET_SUCCESS;
333*4882a593Smuzhiyun }
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun static enum phl_mdl_ret_code
_btc_query_info(void * dispr,void * priv,struct phl_module_op_info * info)336*4882a593Smuzhiyun _btc_query_info(void *dispr, void *priv,
337*4882a593Smuzhiyun 			   struct phl_module_op_info *info)
338*4882a593Smuzhiyun {
339*4882a593Smuzhiyun 	PHL_INFO("[BTCCMD], %s(): \n", __func__);
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun 	return MDL_RET_SUCCESS;
342*4882a593Smuzhiyun }
343*4882a593Smuzhiyun 
phl_register_btc_module(struct phl_info_t * phl_info)344*4882a593Smuzhiyun enum rtw_phl_status phl_register_btc_module(struct phl_info_t *phl_info)
345*4882a593Smuzhiyun {
346*4882a593Smuzhiyun 	enum rtw_phl_status phl_status = RTW_PHL_STATUS_FAILURE;
347*4882a593Smuzhiyun 	struct phl_bk_module_ops bk_ops = {0};
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun 	PHL_INFO("[BTCCMD], %s(): \n", __func__);
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun 	bk_ops.init = _btc_cmd_init;
352*4882a593Smuzhiyun 	bk_ops.deinit = _btc_cmd_deinit;
353*4882a593Smuzhiyun 	bk_ops.start = _btc_cmd_start;
354*4882a593Smuzhiyun 	bk_ops.stop = _btc_cmd_stop;
355*4882a593Smuzhiyun 	bk_ops.msg_hdlr = _btc_msg_hdlr;
356*4882a593Smuzhiyun 	bk_ops.set_info = _btc_set_info;
357*4882a593Smuzhiyun 	bk_ops.query_info = _btc_query_info;
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun 	phl_status = phl_disp_eng_register_module(phl_info, HW_BAND_0,
360*4882a593Smuzhiyun 						PHL_MDL_BTC, &bk_ops);
361*4882a593Smuzhiyun 	if (RTW_PHL_STATUS_SUCCESS != phl_status) {
362*4882a593Smuzhiyun 		PHL_ERR("Failed to register BTC module in cmd dispr of hw band 0\n");
363*4882a593Smuzhiyun 	}
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun 	return phl_status;
366*4882a593Smuzhiyun }
367*4882a593Smuzhiyun 
rtw_phl_btc_send_cmd(struct rtw_phl_com_t * phl_com,u8 * buf,u32 len,u16 ev_id)368*4882a593Smuzhiyun bool rtw_phl_btc_send_cmd(struct rtw_phl_com_t *phl_com,
369*4882a593Smuzhiyun 				u8 *buf, u32 len, u16 ev_id)
370*4882a593Smuzhiyun {
371*4882a593Smuzhiyun 	struct phl_info_t *phl_info = phl_com->phl_priv;
372*4882a593Smuzhiyun 	u8 band_idx = HW_BAND_0;
373*4882a593Smuzhiyun 	struct phl_msg msg = {0};
374*4882a593Smuzhiyun 	struct phl_msg_attribute attr = {0};
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun 	msg.inbuf = buf;
377*4882a593Smuzhiyun 	msg.inlen = len;
378*4882a593Smuzhiyun 	SET_MSG_MDL_ID_FIELD(msg.msg_id, PHL_MDL_BTC);
379*4882a593Smuzhiyun 	msg.band_idx = band_idx;
380*4882a593Smuzhiyun 	switch (ev_id) {
381*4882a593Smuzhiyun 	case BTC_HMSG_TMR_EN:
382*4882a593Smuzhiyun 		SET_MSG_EVT_ID_FIELD(msg.msg_id,
383*4882a593Smuzhiyun 			MSG_EVT_BTC_TMR);
384*4882a593Smuzhiyun 		break;
385*4882a593Smuzhiyun 	case BTC_HMSG_SET_BT_REQ_SLOT:
386*4882a593Smuzhiyun 		SET_MSG_EVT_ID_FIELD(msg.msg_id,
387*4882a593Smuzhiyun 			MSG_EVT_BTC_REQ_BT_SLOT);
388*4882a593Smuzhiyun 		break;
389*4882a593Smuzhiyun 	case BTC_HMSG_FW_EV:
390*4882a593Smuzhiyun 		SET_MSG_EVT_ID_FIELD(msg.msg_id,
391*4882a593Smuzhiyun 			MSG_EVT_BTC_FWEVNT);
392*4882a593Smuzhiyun 		break;
393*4882a593Smuzhiyun 	default:
394*4882a593Smuzhiyun 		PHL_ERR("%s: Unknown msg !\n", __func__);
395*4882a593Smuzhiyun 		return false;
396*4882a593Smuzhiyun 	}
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun 	if (phl_disp_eng_send_msg(phl_info, &msg, &attr, NULL) !=
399*4882a593Smuzhiyun 				RTW_PHL_STATUS_SUCCESS) {
400*4882a593Smuzhiyun 		PHL_ERR("%s: [BTC] dispr_send_msg failed !\n", __func__);
401*4882a593Smuzhiyun 		return false;
402*4882a593Smuzhiyun 	}
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun 	return true;
405*4882a593Smuzhiyun }
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun static void
_phl_pkt_evt_ntfy_done(void * priv,struct phl_msg * msg)408*4882a593Smuzhiyun _phl_pkt_evt_ntfy_done(void* priv, struct phl_msg* msg)
409*4882a593Smuzhiyun {
410*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)priv;
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun 	if(msg->inbuf && msg->inlen){
413*4882a593Smuzhiyun 		_os_mem_free(phl_to_drvpriv(phl_info),
414*4882a593Smuzhiyun 			msg->inbuf, msg->inlen);
415*4882a593Smuzhiyun 	}
416*4882a593Smuzhiyun }
417*4882a593Smuzhiyun 
rtw_phl_btc_packet_event_notify(void * phl,u8 role_id,u8 pkt_evt_type)418*4882a593Smuzhiyun void rtw_phl_btc_packet_event_notify(void *phl, u8 role_id, u8 pkt_evt_type)
419*4882a593Smuzhiyun {
420*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
421*4882a593Smuzhiyun 	struct phl_msg msg = {0};
422*4882a593Smuzhiyun 	struct phl_msg_attribute attr = {0};
423*4882a593Smuzhiyun 	struct rtw_pkt_evt_ntfy *pkt_evt = NULL;
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun 	pkt_evt = (struct rtw_pkt_evt_ntfy *)_os_mem_alloc(
426*4882a593Smuzhiyun 		phl_to_drvpriv(phl_info), sizeof(struct rtw_pkt_evt_ntfy));
427*4882a593Smuzhiyun 	if (pkt_evt == NULL) {
428*4882a593Smuzhiyun 		PHL_ERR("%s: alloc packet cmd fail.\n", __func__);
429*4882a593Smuzhiyun 		return;
430*4882a593Smuzhiyun 	}
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun 	pkt_evt->type = pkt_evt_type;
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun 	msg.inbuf = (u8 *)pkt_evt;
435*4882a593Smuzhiyun 	msg.inlen = sizeof(struct rtw_pkt_evt_ntfy);
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun 	SET_MSG_MDL_ID_FIELD(msg.msg_id, PHL_MDL_BTC);
438*4882a593Smuzhiyun 	SET_MSG_EVT_ID_FIELD(msg.msg_id, MSG_EVT_BTC_PKT_EVT_NTFY);
439*4882a593Smuzhiyun 	msg.band_idx = HW_BAND_0;
440*4882a593Smuzhiyun 	attr.completion.completion = _phl_pkt_evt_ntfy_done;
441*4882a593Smuzhiyun 	attr.completion.priv = phl_info;
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun 	if (phl_disp_eng_send_msg(phl_info, &msg, &attr, NULL) !=
444*4882a593Smuzhiyun 				RTW_PHL_STATUS_SUCCESS) {
445*4882a593Smuzhiyun 		PHL_ERR("%s: dispr_send_msg failed !\n", __func__);
446*4882a593Smuzhiyun 		goto cmd_fail;
447*4882a593Smuzhiyun 	}
448*4882a593Smuzhiyun 
449*4882a593Smuzhiyun 	return;
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun cmd_fail:
452*4882a593Smuzhiyun 	_os_mem_free(phl_to_drvpriv(phl_info), pkt_evt,
453*4882a593Smuzhiyun 			sizeof(struct rtw_pkt_evt_ntfy));
454*4882a593Smuzhiyun }
455*4882a593Smuzhiyun 
rtw_phl_btc_pkt_2_evt_type(u8 packet_type)456*4882a593Smuzhiyun u8 rtw_phl_btc_pkt_2_evt_type(u8 packet_type)
457*4882a593Smuzhiyun {
458*4882a593Smuzhiyun 	u8 pkt_evt_type = BTC_PKT_EVT_MAX;
459*4882a593Smuzhiyun 
460*4882a593Smuzhiyun 	switch (packet_type) {
461*4882a593Smuzhiyun 	case PACKET_NORMAL:
462*4882a593Smuzhiyun 		pkt_evt_type = BTC_PKT_EVT_NORMAL;
463*4882a593Smuzhiyun 		break;
464*4882a593Smuzhiyun 	case PACKET_DHCP:
465*4882a593Smuzhiyun 		pkt_evt_type = BTC_PKT_EVT_DHCP;
466*4882a593Smuzhiyun 		break;
467*4882a593Smuzhiyun 	case PACKET_ARP:
468*4882a593Smuzhiyun 		pkt_evt_type = BTC_PKT_EVT_ARP;
469*4882a593Smuzhiyun 		break;
470*4882a593Smuzhiyun 	case PACKET_EAPOL:
471*4882a593Smuzhiyun 		pkt_evt_type = BTC_PKT_EVT_EAPOL;
472*4882a593Smuzhiyun 		break;
473*4882a593Smuzhiyun 	case PACKET_EAPOL_START:
474*4882a593Smuzhiyun 		pkt_evt_type = BTC_PKT_EVT_EAPOL_START;
475*4882a593Smuzhiyun 		break;
476*4882a593Smuzhiyun 	default:
477*4882a593Smuzhiyun 		PHL_ERR("%s packet type(%d) not support\n",
478*4882a593Smuzhiyun 			__func__, packet_type);
479*4882a593Smuzhiyun 		break;
480*4882a593Smuzhiyun 	}
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun 	return pkt_evt_type;
483*4882a593Smuzhiyun }
484*4882a593Smuzhiyun #endif /*CONFIG_PHL_CMD_BTC*/
485*4882a593Smuzhiyun 
486*4882a593Smuzhiyun #ifndef CONFIG_FSM
rtw_phl_btc_notify(void * phl,enum RTW_PHL_BTC_NOTIFY notify,struct rtw_phl_btc_ntfy * ntfy)487*4882a593Smuzhiyun int rtw_phl_btc_notify(void *phl, enum RTW_PHL_BTC_NOTIFY notify,
488*4882a593Smuzhiyun 				struct rtw_phl_btc_ntfy *ntfy)
489*4882a593Smuzhiyun {
490*4882a593Smuzhiyun 	PHL_ERR("CMD_BTC not support :%s\n", __func__);
491*4882a593Smuzhiyun 	return 0;
492*4882a593Smuzhiyun }
rtw_phl_btc_role_notify(void * phl,u8 role_id,enum role_state rstate)493*4882a593Smuzhiyun void rtw_phl_btc_role_notify(void *phl, u8 role_id, enum role_state rstate)
494*4882a593Smuzhiyun {
495*4882a593Smuzhiyun 	struct rtw_phl_btc_ntfy ntfy = {0};
496*4882a593Smuzhiyun 	struct rtw_phl_btc_role_info_param *prinfo = &ntfy.u.rinfo;
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun 	prinfo->role_id = role_id;
499*4882a593Smuzhiyun 	prinfo->rstate = rstate;
500*4882a593Smuzhiyun 
501*4882a593Smuzhiyun 	ntfy.notify = PHL_BTC_NTFY_ROLE_INFO;
502*4882a593Smuzhiyun 	ntfy.ops = NULL;
503*4882a593Smuzhiyun 	ntfy.priv = NULL;
504*4882a593Smuzhiyun 	ntfy.ntfy_cb = NULL;
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun 	rtw_phl_btc_notify(phl, ntfy.notify, &ntfy);
507*4882a593Smuzhiyun }
508*4882a593Smuzhiyun 
rtw_phl_btc_hub_msg_hdl(void * phl,struct phl_msg * msg)509*4882a593Smuzhiyun void rtw_phl_btc_hub_msg_hdl(void *phl, struct phl_msg *msg)
510*4882a593Smuzhiyun {
511*4882a593Smuzhiyun }
512*4882a593Smuzhiyun #endif
513*4882a593Smuzhiyun 
514*4882a593Smuzhiyun #endif /*CONFIG_BTCOEX*/
515*4882a593Smuzhiyun 
516