xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852be/phl/phl_btc_fsm.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright(c) 2019 - 2020 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 #include "phl_headers.h"
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #ifdef CONFIG_FSM
18*4882a593Smuzhiyun #include "phl_btc_fsm.h"
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun struct btc_obj {
21*4882a593Smuzhiyun 	struct fsm_main *fsm;
22*4882a593Smuzhiyun 	struct fsm_obj *fsm_obj;
23*4882a593Smuzhiyun 	struct phl_info_t *phl_info;
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun 	struct rtw_phl_btc_ntfy *ntfy;
26*4882a593Smuzhiyun };
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun enum BTC_STATE_ST {
29*4882a593Smuzhiyun 	BTC_ST_IDLE,
30*4882a593Smuzhiyun 	BTC_ST_SERVICE
31*4882a593Smuzhiyun };
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun enum BTC_EV_ID {
34*4882a593Smuzhiyun 	BTC_EV_START,
35*4882a593Smuzhiyun 	BTC_EV_UPDATE_ROLE_INFO,
36*4882a593Smuzhiyun 	BTC_EV_FWINFO,
37*4882a593Smuzhiyun 	BTC_EV_WLSTA,
38*4882a593Smuzhiyun 	BTC_EV_TIMER,
39*4882a593Smuzhiyun 	BTC_EV_PACKET_EVT,
40*4882a593Smuzhiyun 	BTC_EV_MAX
41*4882a593Smuzhiyun };
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun static int btc_idle_st_hdl(void *obj, u16 event, void *param);
44*4882a593Smuzhiyun static int btc_service_st_hdl(void *obj, u16 event, void *param);
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun /* STATE table */
47*4882a593Smuzhiyun static struct fsm_state_ent btc_state_tbl[] = {
48*4882a593Smuzhiyun 	ST_ENT(BTC_ST_IDLE, btc_idle_st_hdl),
49*4882a593Smuzhiyun 	ST_ENT(BTC_ST_SERVICE, btc_service_st_hdl)
50*4882a593Smuzhiyun 	//{BTC_ST_MAX, "BTC_ST_MAX", NULL} /* ST_MAX for fsm safety checking */
51*4882a593Smuzhiyun };
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun /* EVENT table */
54*4882a593Smuzhiyun static struct fsm_event_ent btc_event_tbl[] = {
55*4882a593Smuzhiyun 	EV_ENT(BTC_EV_START),
56*4882a593Smuzhiyun 	EV_ENT(BTC_EV_UPDATE_ROLE_INFO),
57*4882a593Smuzhiyun 	EV_ENT(BTC_EV_FWINFO),
58*4882a593Smuzhiyun 	EV_ENT(BTC_EV_WLSTA),
59*4882a593Smuzhiyun 	EV_DBG(BTC_EV_TIMER),
60*4882a593Smuzhiyun 	EV_ENT(BTC_EV_PACKET_EVT),
61*4882a593Smuzhiyun 	EV_ENT(BTC_EV_MAX) /* EV_MAX for fsm safety checking */
62*4882a593Smuzhiyun };
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun /*
66*4882a593Smuzhiyun  * btc idle handler
67*4882a593Smuzhiyun  */
btc_idle_st_hdl(void * obj,u16 event,void * param)68*4882a593Smuzhiyun static int btc_idle_st_hdl(void *obj, u16 event, void *param)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun 	struct btc_obj *pbtc = (struct btc_obj *)obj;
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 	FSM_DBG(pbtc->fsm, "[BTC], %s, event : 0x%x\n", __func__, event);
73*4882a593Smuzhiyun 	switch (event) {
74*4882a593Smuzhiyun 	case FSM_EV_STATE_IN:
75*4882a593Smuzhiyun 		break;
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun 	case FSM_EV_TIMER_EXPIRE:
78*4882a593Smuzhiyun 		break;
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun 	case BTC_EV_START:
81*4882a593Smuzhiyun 		phl_fsm_state_goto(pbtc->fsm_obj, BTC_ST_SERVICE);
82*4882a593Smuzhiyun 		break;
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun 	case FSM_EV_STATE_OUT:
85*4882a593Smuzhiyun 		break;
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun 	default:
88*4882a593Smuzhiyun 		break;
89*4882a593Smuzhiyun 	}
90*4882a593Smuzhiyun 	return 0;
91*4882a593Smuzhiyun }
92*4882a593Smuzhiyun 
btc_service_st_hdl(void * obj,u16 event,void * param)93*4882a593Smuzhiyun static int btc_service_st_hdl(void *obj, u16 event, void *param)
94*4882a593Smuzhiyun {
95*4882a593Smuzhiyun 	struct btc_obj *pbtc = (struct btc_obj *)obj;
96*4882a593Smuzhiyun 	struct phl_info_t *phl_info = pbtc->phl_info;
97*4882a593Smuzhiyun 	struct rtw_phl_com_t *phl_com = phl_info->phl_com;
98*4882a593Smuzhiyun 	int rtn = FSM_FREE_PARAM;
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	FSM_DBG(pbtc->fsm, "[BTC], %s, event : 0x%x\n", __func__, event);
101*4882a593Smuzhiyun 	switch (event) {
102*4882a593Smuzhiyun 	case FSM_EV_STATE_IN:
103*4882a593Smuzhiyun 		break;
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun 	case BTC_EV_UPDATE_ROLE_INFO:
106*4882a593Smuzhiyun 		if (param) {
107*4882a593Smuzhiyun 			struct rtw_phl_btc_role_info_param *prinfo = NULL;
108*4882a593Smuzhiyun 			struct rtw_wifi_role_t *wrole = NULL;
109*4882a593Smuzhiyun 			struct rtw_phl_stainfo_t *sta = NULL;
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 			pbtc->ntfy = param;
112*4882a593Smuzhiyun 			prinfo = &pbtc->ntfy->u.rinfo;
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 			if (prinfo->role_id < MAX_WIFI_ROLE_NUMBER) {
115*4882a593Smuzhiyun 				wrole = &phl_com->wifi_roles[prinfo->role_id];
116*4882a593Smuzhiyun 				sta = rtw_phl_get_stainfo_self(phl_info, wrole);
117*4882a593Smuzhiyun 			}
118*4882a593Smuzhiyun #ifdef CONFIG_BTCOEX
119*4882a593Smuzhiyun 			rtw_hal_btc_update_role_info_ntfy(phl_info->hal,
120*4882a593Smuzhiyun 					prinfo->role_id, wrole, sta, prinfo->rstate);
121*4882a593Smuzhiyun #endif
122*4882a593Smuzhiyun 			if (pbtc->ntfy->ntfy_cb)
123*4882a593Smuzhiyun 				pbtc->ntfy->ntfy_cb(pbtc->ntfy->priv,
124*4882a593Smuzhiyun 						pbtc->ntfy->notify,
125*4882a593Smuzhiyun 						pbtc->ntfy);
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun 			rtn = FSM_FREE_PARAM;
128*4882a593Smuzhiyun 		}
129*4882a593Smuzhiyun 		break;
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 	case BTC_EV_FWINFO:
132*4882a593Smuzhiyun #ifdef CONFIG_BTCOEX
133*4882a593Smuzhiyun 		rtw_hal_btc_fwinfo_ntfy(phl_info->hal);
134*4882a593Smuzhiyun #endif
135*4882a593Smuzhiyun 		break;
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun 	case BTC_EV_TIMER:
138*4882a593Smuzhiyun 	{
139*4882a593Smuzhiyun #ifdef CONFIG_BTCOEX
140*4882a593Smuzhiyun 		struct rtw_phl_btc_tmr_param *tmr = NULL;
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun 		pbtc->ntfy = param;
143*4882a593Smuzhiyun 		tmr = &pbtc->ntfy->u.tmr;
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 		rtw_hal_btc_timer(phl_info->hal, tmr->timer);
146*4882a593Smuzhiyun #endif
147*4882a593Smuzhiyun 	}
148*4882a593Smuzhiyun 		break;
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	case BTC_EV_PACKET_EVT:
151*4882a593Smuzhiyun 		if (param) {
152*4882a593Smuzhiyun 			struct rtw_phl_btc_pkt_param *pkt = NULL;
153*4882a593Smuzhiyun 			struct rtw_wifi_role_t *wrole = NULL;
154*4882a593Smuzhiyun 			pbtc->ntfy = param;
155*4882a593Smuzhiyun 			pkt = &pbtc->ntfy->u.pkt;
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun 			if (pkt->role_id < MAX_WIFI_ROLE_NUMBER) {
158*4882a593Smuzhiyun 				wrole = &phl_com->wifi_roles[pkt->role_id];
159*4882a593Smuzhiyun 			}
160*4882a593Smuzhiyun #ifdef CONFIG_BTCOEX
161*4882a593Smuzhiyun 			rtw_hal_btc_packet_event_ntfy(phl_info->hal,
162*4882a593Smuzhiyun 							pkt->pkt_evt_type);
163*4882a593Smuzhiyun #endif
164*4882a593Smuzhiyun 			if (pbtc->ntfy->ntfy_cb)
165*4882a593Smuzhiyun 				pbtc->ntfy->ntfy_cb(pbtc->ntfy->priv,
166*4882a593Smuzhiyun 						pbtc->ntfy->notify,
167*4882a593Smuzhiyun 						pbtc->ntfy);
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 			rtn = FSM_FREE_PARAM;
170*4882a593Smuzhiyun 		}
171*4882a593Smuzhiyun 		break;
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun 	case FSM_EV_TIMER_EXPIRE:
174*4882a593Smuzhiyun 		break;
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun 	case FSM_EV_CANCEL:
177*4882a593Smuzhiyun 		phl_fsm_state_goto(pbtc->fsm_obj, BTC_ST_IDLE);
178*4882a593Smuzhiyun 		break;
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun 	case FSM_EV_STATE_OUT:
181*4882a593Smuzhiyun 		phl_fsm_cancel_alarm(pbtc->fsm_obj);
182*4882a593Smuzhiyun 		break;
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun 	default:
185*4882a593Smuzhiyun 		break;
186*4882a593Smuzhiyun 	}
187*4882a593Smuzhiyun 	return rtn;
188*4882a593Smuzhiyun }
189*4882a593Smuzhiyun 
btc_dump_obj(void * obj,char * s,int * sz)190*4882a593Smuzhiyun static void btc_dump_obj(void *obj, char *s, int *sz)
191*4882a593Smuzhiyun {
192*4882a593Smuzhiyun 	/* nothing to do for now */
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun 
btc_dump_fsm(void * fsm,char * s,int * sz)195*4882a593Smuzhiyun static void btc_dump_fsm(void *fsm, char *s, int *sz)
196*4882a593Smuzhiyun {
197*4882a593Smuzhiyun 	/* nothing to do for now */
198*4882a593Smuzhiyun }
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun /* For EXTERNAL application to create a btc FSM */
201*4882a593Smuzhiyun /* @root: FSM root structure
202*4882a593Smuzhiyun  * @phl_info: private data structure to invoke hal/phl function
203*4882a593Smuzhiyun  *
204*4882a593Smuzhiyun  * return
205*4882a593Smuzhiyun  * fsm_main: FSM main structure (Do NOT expose)
206*4882a593Smuzhiyun  */
phl_btc_new_fsm(struct fsm_root * root,struct phl_info_t * phl_info)207*4882a593Smuzhiyun struct fsm_main *phl_btc_new_fsm(struct fsm_root *root,
208*4882a593Smuzhiyun 				struct phl_info_t *phl_info)
209*4882a593Smuzhiyun {
210*4882a593Smuzhiyun 	void *d = phl_to_drvpriv(phl_info);
211*4882a593Smuzhiyun 	struct fsm_main *fsm = NULL;
212*4882a593Smuzhiyun 	struct rtw_phl_fsm_tb tb;
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun 	_os_mem_set(d, &tb, 0, sizeof(tb));
215*4882a593Smuzhiyun 	tb.max_state = sizeof(btc_state_tbl)/sizeof(btc_state_tbl[0]);
216*4882a593Smuzhiyun 	tb.max_event = sizeof(btc_event_tbl)/sizeof(btc_event_tbl[0]);
217*4882a593Smuzhiyun 	tb.state_tbl = btc_state_tbl;
218*4882a593Smuzhiyun 	tb.evt_tbl = btc_event_tbl;
219*4882a593Smuzhiyun 	tb.dump_obj = btc_dump_obj;
220*4882a593Smuzhiyun 	tb.dump_obj = btc_dump_fsm;
221*4882a593Smuzhiyun 	tb.dbg_level = FSM_DBG_INFO;
222*4882a593Smuzhiyun 	tb.evt_level = FSM_DBG_INFO;
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 	fsm = phl_fsm_init_fsm(root, "btc", phl_info, &tb);
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun 	return fsm;
227*4882a593Smuzhiyun }
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun /* For EXTERNAL application to destory btc fsm */
230*4882a593Smuzhiyun /* @fsm: see fsm_main
231*4882a593Smuzhiyun  */
phl_btc_destory_fsm(struct fsm_main * fsm)232*4882a593Smuzhiyun void phl_btc_destory_fsm(struct fsm_main *fsm)
233*4882a593Smuzhiyun {
234*4882a593Smuzhiyun 	if (fsm == NULL)
235*4882a593Smuzhiyun 		return;
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	/* deinit fsm local variable if has */
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun 	/* call FSM Framewro to deinit fsm */
240*4882a593Smuzhiyun 	phl_fsm_deinit_fsm(fsm);
241*4882a593Smuzhiyun }
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun /* For EXTERNAL application to create btcoex object */
244*4882a593Smuzhiyun /* @fsm: FSM main structure which created by phl_btc_new_fsm()
245*4882a593Smuzhiyun  * @phl_info: private data structure to invoke hal/phl function
246*4882a593Smuzhiyun  *
247*4882a593Smuzhiyun  * return
248*4882a593Smuzhiyun  * btc_obj: structure of command object (Do NOT expose)
249*4882a593Smuzhiyun  */
phl_btc_new_obj(struct fsm_main * fsm,struct phl_info_t * phl_info)250*4882a593Smuzhiyun struct btc_obj *phl_btc_new_obj(struct fsm_main *fsm,
251*4882a593Smuzhiyun 				struct phl_info_t *phl_info)
252*4882a593Smuzhiyun {
253*4882a593Smuzhiyun 	struct fsm_obj *obj;
254*4882a593Smuzhiyun 	struct btc_obj *pbtc;
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	pbtc = phl_fsm_new_obj(fsm, (void **)&obj, sizeof(*pbtc));
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun 	if (pbtc == NULL || obj == NULL) {
259*4882a593Smuzhiyun 		/* TODO free fsm; currently will be freed in deinit process */
260*4882a593Smuzhiyun 		FSM_ERR(fsm, "btc: malloc obj fail\n");
261*4882a593Smuzhiyun 		return NULL;
262*4882a593Smuzhiyun 	}
263*4882a593Smuzhiyun 	pbtc->fsm = fsm;
264*4882a593Smuzhiyun 	pbtc->fsm_obj = obj;
265*4882a593Smuzhiyun 	pbtc->phl_info = phl_info;
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun 	return pbtc;
268*4882a593Smuzhiyun }
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun /* For EXTERNAL application to destory btc object */
271*4882a593Smuzhiyun /* @pbtc: local created command object
272*4882a593Smuzhiyun  *
273*4882a593Smuzhiyun  */
phl_btc_destory_obj(struct btc_obj * pbtc)274*4882a593Smuzhiyun void phl_btc_destory_obj(struct btc_obj *pbtc)
275*4882a593Smuzhiyun {
276*4882a593Smuzhiyun 	if (pbtc == NULL)
277*4882a593Smuzhiyun 		return;
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun 	/* inform FSM framewory to recycle fsm_obj */
280*4882a593Smuzhiyun 	phl_fsm_destory_obj(pbtc->fsm_obj);
281*4882a593Smuzhiyun }
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun /* For EXTERNAL application to start btcoex service (expose) */
284*4882a593Smuzhiyun /* @pbtc: btc object
285*4882a593Smuzhiyun  */
phl_btc_start(struct btc_obj * pbtc)286*4882a593Smuzhiyun enum rtw_phl_status phl_btc_start(struct btc_obj *pbtc)
287*4882a593Smuzhiyun {
288*4882a593Smuzhiyun 	void *d = phl_to_drvpriv(pbtc->phl_info);
289*4882a593Smuzhiyun 	enum rtw_phl_status phl_status = RTW_PHL_STATUS_SUCCESS;
290*4882a593Smuzhiyun 	struct fsm_msg *msg;
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	/* Start FSM */
293*4882a593Smuzhiyun 	phl_status = phl_fsm_start_fsm(pbtc->fsm);
294*4882a593Smuzhiyun 	if (phl_status != RTW_PHL_STATUS_SUCCESS)
295*4882a593Smuzhiyun 		return phl_status;
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun 	if (pbtc->fsm_obj == NULL)
298*4882a593Smuzhiyun 		return RTW_PHL_STATUS_FAILURE;
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun 	/* NEW message to start btc object */
301*4882a593Smuzhiyun 	msg = phl_fsm_new_msg(pbtc->fsm_obj, BTC_EV_START);
302*4882a593Smuzhiyun 	if (msg == NULL) {
303*4882a593Smuzhiyun 		FSM_ERR(pbtc->fsm, "btc: alloc msg fail\n");
304*4882a593Smuzhiyun 		return RTW_PHL_STATUS_RESOURCE;
305*4882a593Smuzhiyun 	}
306*4882a593Smuzhiyun 	if (phl_fsm_sent_msg(pbtc->fsm_obj, msg) != RTW_PHL_STATUS_SUCCESS) {
307*4882a593Smuzhiyun 		_os_kmem_free(d, msg, sizeof(*msg));
308*4882a593Smuzhiyun 		return RTW_PHL_STATUS_FAILURE;
309*4882a593Smuzhiyun 	}
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 	return phl_status;
312*4882a593Smuzhiyun }
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun /* For EXTERNAL application to stop btc service (expose) */
315*4882a593Smuzhiyun /* @pbtc: btc to be cancelled
316*4882a593Smuzhiyun  */
phl_btc_cancel(struct btc_obj * pbtc)317*4882a593Smuzhiyun enum rtw_phl_status phl_btc_cancel(struct btc_obj *pbtc)
318*4882a593Smuzhiyun {
319*4882a593Smuzhiyun 	return phl_fsm_cancel_obj(pbtc->fsm_obj);
320*4882a593Smuzhiyun }
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun /* For EXTERNAL application to notify btc (expose) */
323*4882a593Smuzhiyun /* @phl: refer to phl_infi_t
324*4882a593Smuzhiyun  * @notify: notification event
325*4882a593Smuzhiyun  * @ntfy: notify information (optional)
326*4882a593Smuzhiyun  * return value:
327*4882a593Smuzhiyun  *	0: no wait
328*4882a593Smuzhiyun  *	1: have to wait call back info->ntfy_cb()
329*4882a593Smuzhiyun  *	-1: Failure
330*4882a593Smuzhiyun  */
rtw_phl_btc_notify(void * phl,enum RTW_PHL_BTC_NOTIFY notify,struct rtw_phl_btc_ntfy * ntfy)331*4882a593Smuzhiyun int rtw_phl_btc_notify(void *phl, enum RTW_PHL_BTC_NOTIFY notify,
332*4882a593Smuzhiyun 				struct rtw_phl_btc_ntfy *ntfy)
333*4882a593Smuzhiyun {
334*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
335*4882a593Smuzhiyun 	struct btc_obj *pbtc = phl_info->btc_obj;
336*4882a593Smuzhiyun 	int wait = 0, sz = 0;
337*4882a593Smuzhiyun 	u16 event;
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun 	if (ntfy)
340*4882a593Smuzhiyun 		sz = sizeof(*ntfy);
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun 	switch (notify) {
343*4882a593Smuzhiyun 	case PHL_BTC_NTFY_ROLE_INFO:
344*4882a593Smuzhiyun 		event = BTC_EV_UPDATE_ROLE_INFO;
345*4882a593Smuzhiyun 		break;
346*4882a593Smuzhiyun 	case PHL_BTC_NTFY_FWINFO:
347*4882a593Smuzhiyun 		event = BTC_EV_FWINFO;
348*4882a593Smuzhiyun 		break;
349*4882a593Smuzhiyun 	case PHL_BTC_NTFY_PACKET_EVT:
350*4882a593Smuzhiyun 		event = BTC_EV_PACKET_EVT;
351*4882a593Smuzhiyun 		break;
352*4882a593Smuzhiyun 	case PHL_BTC_NTFY_MAX:
353*4882a593Smuzhiyun 		PHL_TRACE(COMP_PHL_DBG, _PHL_DEBUG_, "rtw_phl_btc_notify(): Unsupported case:%d, please check it\n",
354*4882a593Smuzhiyun 				notify);
355*4882a593Smuzhiyun 		return wait;
356*4882a593Smuzhiyun 	case PHL_BTC_NTFY_TIMER:
357*4882a593Smuzhiyun 		event = BTC_EV_TIMER;
358*4882a593Smuzhiyun 		break;
359*4882a593Smuzhiyun 	default:
360*4882a593Smuzhiyun 		PHL_TRACE(COMP_PHL_DBG, _PHL_DEBUG_, "rtw_phl_btc_notify(): Unrecognize case:%d, please check it\n",
361*4882a593Smuzhiyun 				notify);
362*4882a593Smuzhiyun 		return wait;
363*4882a593Smuzhiyun 	}
364*4882a593Smuzhiyun 	phl_fsm_gen_msg(phl, pbtc->fsm_obj, ntfy, sz, event);
365*4882a593Smuzhiyun 	return wait;
366*4882a593Smuzhiyun }
367*4882a593Smuzhiyun 
rtw_phl_btc_role_notify(void * phl,u8 role_id,enum role_state rstate)368*4882a593Smuzhiyun void rtw_phl_btc_role_notify(void *phl, u8 role_id, enum role_state rstate)
369*4882a593Smuzhiyun {
370*4882a593Smuzhiyun 	struct rtw_phl_btc_ntfy ntfy = {0};
371*4882a593Smuzhiyun 	struct rtw_phl_btc_role_info_param *prinfo = &ntfy.u.rinfo;
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun 	prinfo->role_id = role_id;
374*4882a593Smuzhiyun 	prinfo->rstate = rstate;
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun 	ntfy.notify = PHL_BTC_NTFY_ROLE_INFO;
377*4882a593Smuzhiyun 	ntfy.ops = NULL;
378*4882a593Smuzhiyun 	ntfy.priv = NULL;
379*4882a593Smuzhiyun 	ntfy.ntfy_cb = NULL;
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun 	rtw_phl_btc_notify(phl, ntfy.notify, &ntfy);
382*4882a593Smuzhiyun }
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun #ifndef CONFIG_PHL_CMD_BTC
rtw_phl_btc_packet_event_notify(void * phl,u8 role_id,u8 pkt_evt_type)385*4882a593Smuzhiyun void rtw_phl_btc_packet_event_notify(void *phl, u8 role_id, u8 pkt_evt_type)
386*4882a593Smuzhiyun {
387*4882a593Smuzhiyun 	struct rtw_phl_btc_ntfy ntfy = {0};
388*4882a593Smuzhiyun 	struct rtw_phl_btc_pkt_param *pkt = &ntfy.u.pkt;
389*4882a593Smuzhiyun 
390*4882a593Smuzhiyun 	pkt->role_id = role_id;
391*4882a593Smuzhiyun 	pkt->pkt_evt_type = pkt_evt_type;
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun 	ntfy.notify = PHL_BTC_NTFY_PACKET_EVT;
394*4882a593Smuzhiyun 	ntfy.ops = NULL;
395*4882a593Smuzhiyun 	ntfy.priv = NULL;
396*4882a593Smuzhiyun 	ntfy.ntfy_cb = NULL;
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun 	rtw_phl_btc_notify(phl, ntfy.notify, &ntfy);
399*4882a593Smuzhiyun }
400*4882a593Smuzhiyun 
rtw_phl_btc_pkt_2_evt_type(u8 packet_type)401*4882a593Smuzhiyun u8 rtw_phl_btc_pkt_2_evt_type(u8 packet_type)
402*4882a593Smuzhiyun {
403*4882a593Smuzhiyun 	u8 pkt_evt_type = BTC_PKT_EVT_MAX;
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun 	switch (packet_type) {
406*4882a593Smuzhiyun 	case PACKET_NORMAL:
407*4882a593Smuzhiyun 		pkt_evt_type = BTC_PKT_EVT_NORMAL;
408*4882a593Smuzhiyun 		break;
409*4882a593Smuzhiyun 	case PACKET_DHCP:
410*4882a593Smuzhiyun 		pkt_evt_type = BTC_PKT_EVT_DHCP;
411*4882a593Smuzhiyun 		break;
412*4882a593Smuzhiyun 	case PACKET_ARP:
413*4882a593Smuzhiyun 		pkt_evt_type = BTC_PKT_EVT_ARP;
414*4882a593Smuzhiyun 		break;
415*4882a593Smuzhiyun 	case PACKET_EAPOL:
416*4882a593Smuzhiyun 		pkt_evt_type = BTC_PKT_EVT_EAPOL;
417*4882a593Smuzhiyun 		break;
418*4882a593Smuzhiyun 	case PACKET_EAPOL_START:
419*4882a593Smuzhiyun 		pkt_evt_type = BTC_PKT_EVT_EAPOL_START;
420*4882a593Smuzhiyun 		break;
421*4882a593Smuzhiyun 	default:
422*4882a593Smuzhiyun 		PHL_ERR("%s packet type(%d) not support\n",
423*4882a593Smuzhiyun 			__func__, packet_type);
424*4882a593Smuzhiyun 		break;
425*4882a593Smuzhiyun 	}
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun 	return pkt_evt_type;
428*4882a593Smuzhiyun }
429*4882a593Smuzhiyun #endif
430*4882a593Smuzhiyun 
_btc_fsm_tmr(void * phl,void * timer)431*4882a593Smuzhiyun static void _btc_fsm_tmr(void *phl, void *timer)
432*4882a593Smuzhiyun {
433*4882a593Smuzhiyun 	struct rtw_phl_btc_ntfy ntfy = {0};
434*4882a593Smuzhiyun 	struct rtw_phl_btc_tmr_param *tmr = &ntfy.u.tmr;
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun 	tmr->timer = timer;
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun 	ntfy.notify = PHL_BTC_NTFY_TIMER;
439*4882a593Smuzhiyun 	ntfy.ops = NULL;
440*4882a593Smuzhiyun 	ntfy.priv = NULL;
441*4882a593Smuzhiyun 	ntfy.ntfy_cb = NULL;
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun 	rtw_phl_btc_notify(phl, ntfy.notify, &ntfy);
444*4882a593Smuzhiyun }
445*4882a593Smuzhiyun 
rtw_phl_btc_hub_msg_hdl(void * phl,struct phl_msg * msg)446*4882a593Smuzhiyun void rtw_phl_btc_hub_msg_hdl(void *phl, struct phl_msg *msg)
447*4882a593Smuzhiyun {
448*4882a593Smuzhiyun 	u8 mdl_id = MSG_MDL_ID_FIELD(msg->msg_id);
449*4882a593Smuzhiyun 	u16 evt_id = MSG_EVT_ID_FIELD(msg->msg_id);
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun 	switch (mdl_id) {
452*4882a593Smuzhiyun 	case PHL_MDL_BTC:
453*4882a593Smuzhiyun 		if (evt_id == BTC_HMSG_TMR_EN) {
454*4882a593Smuzhiyun 			_btc_fsm_tmr(phl, msg->inbuf);
455*4882a593Smuzhiyun 		} else if (evt_id == BTC_HMSG_FW_EV) {
456*4882a593Smuzhiyun 			rtw_phl_btc_notify(phl, PHL_BTC_NTFY_FWINFO, NULL);
457*4882a593Smuzhiyun 		}
458*4882a593Smuzhiyun 		break;
459*4882a593Smuzhiyun 	default:
460*4882a593Smuzhiyun 		break;
461*4882a593Smuzhiyun 	}
462*4882a593Smuzhiyun }
463*4882a593Smuzhiyun #endif /*CONFIG_FSM*/
464*4882a593Smuzhiyun 
465