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 /*
18*4882a593Smuzhiyun * SND sub function
19*4882a593Smuzhiyun */
20*4882a593Smuzhiyun #ifdef CONFIG_FSM
snd_set_timer(struct phl_sound_obj * snd,int duration,u16 event)21*4882a593Smuzhiyun static void snd_set_timer(struct phl_sound_obj *snd, int duration, u16 event)
22*4882a593Smuzhiyun {
23*4882a593Smuzhiyun FSM_INFO(snd->fsm, "%s, duration=%d\n", __func__, duration);
24*4882a593Smuzhiyun phl_fsm_set_alarm(snd->fsm_obj, duration, event);
25*4882a593Smuzhiyun }
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun enum rtw_phl_status
phl_snd_upd_snd_para(struct phl_info_t * phl_info,void * param)29*4882a593Smuzhiyun phl_snd_upd_snd_para(struct phl_info_t *phl_info, void *param)
30*4882a593Smuzhiyun {
31*4882a593Smuzhiyun struct phl_sound_obj *snd = (struct phl_sound_obj *)phl_info->snd_obj;
32*4882a593Smuzhiyun enum rtw_phl_status pstatus = RTW_PHL_STATUS_SUCCESS;
33*4882a593Smuzhiyun struct phl_snd_start_req *req = (struct phl_snd_start_req *)param;
34*4882a593Smuzhiyun struct phl_sound_param *snd_param = &snd->snd_param;
35*4882a593Smuzhiyun struct rtw_wifi_role_t *wrole = NULL;
36*4882a593Smuzhiyun FUNCIN_WSTS(pstatus);
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun snd_param->snd_func_grp_num = 0;
39*4882a593Smuzhiyun snd_param->grp_used_map = 0;
40*4882a593Smuzhiyun snd_param->snd_fail_counter = 0;
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun if (req != NULL) {
43*4882a593Smuzhiyun snd_param->m_wrole = req->wrole;
44*4882a593Smuzhiyun wrole = (struct rtw_wifi_role_t *)req->wrole;
45*4882a593Smuzhiyun snd_param->snd_proc_timeout_ms = req->proc_timeout_ms;/* ms */
46*4882a593Smuzhiyun snd_param->snd_dialog_token = req->dialog_token;
47*4882a593Smuzhiyun snd_param->snd_proc_period = req->proc_period;
48*4882a593Smuzhiyun snd_param->test_flag = req->test_flag;
49*4882a593Smuzhiyun snd_param->bypass_snd_sts_chk = req->bypass_sts_chk;
50*4882a593Smuzhiyun }
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
53*4882a593Smuzhiyun "wrole->type = 0x%x \n",
54*4882a593Smuzhiyun wrole->type);
55*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
56*4882a593Smuzhiyun "timeout = %d ms\n", snd_param->snd_proc_timeout_ms);
57*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
58*4882a593Smuzhiyun "dialog tkn = %d\n", snd_param->snd_dialog_token);
59*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
60*4882a593Smuzhiyun "snd period = %d ms\n", snd_param->snd_proc_period);
61*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
62*4882a593Smuzhiyun "test flag = %d \n", snd_param->test_flag);
63*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
64*4882a593Smuzhiyun "by pass sts check = %d \n", snd_param->bypass_snd_sts_chk);
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun FUNCIN_WSTS(pstatus);
67*4882a593Smuzhiyun return pstatus;
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun /*
73*4882a593Smuzhiyun * SND state handler
74*4882a593Smuzhiyun */
75*4882a593Smuzhiyun
snd_fsm_func_init_st_hdl(void * obj,u16 event,void * param)76*4882a593Smuzhiyun static int snd_fsm_func_init_st_hdl(void *obj, u16 event, void *param)
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun struct phl_sound_obj *snd = (struct phl_sound_obj *)obj;
79*4882a593Smuzhiyun void *d = phl_to_drvpriv(snd->phl_info);
80*4882a593Smuzhiyun int ret = 0;
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun switch (event) {
83*4882a593Smuzhiyun case FSM_EV_STATE_IN:
84*4882a593Smuzhiyun /* Pending and waiting sounding start event */
85*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
86*4882a593Smuzhiyun "snd_fsm_func_init_st_hdl : SND FUNC pending and wait SND START\n");
87*4882a593Smuzhiyun break;
88*4882a593Smuzhiyun case SND_FUNC_EV_SND_START:
89*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
90*4882a593Smuzhiyun "snd_fsm_func_init_st_hdl : Recv SND START Event at timestamp %d\n",
91*4882a593Smuzhiyun _os_get_cur_time_us());
92*4882a593Smuzhiyun /* SND_FUNC_EV_SND_START Shall have input param */
93*4882a593Smuzhiyun _os_spinlock(d, &snd->snd_lock, _bh, NULL);
94*4882a593Smuzhiyun snd->snd_in_progress = 1; /*TODO: Check set flag timing*/
95*4882a593Smuzhiyun _os_spinunlock(d, &snd->snd_lock, _bh, NULL);
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun phl_snd_upd_snd_para(snd->phl_info, param);
98*4882a593Smuzhiyun phl_fsm_state_goto(snd->fsm_obj, SND_ST_FUNC_READY);
99*4882a593Smuzhiyun break;
100*4882a593Smuzhiyun case FSM_EV_STATE_OUT:
101*4882a593Smuzhiyun phl_fsm_cancel_alarm(snd->fsm_obj);
102*4882a593Smuzhiyun break;
103*4882a593Smuzhiyun case FSM_EV_CANCEL:
104*4882a593Smuzhiyun case FSM_EV_TIMER_EXPIRE:
105*4882a593Smuzhiyun break;
106*4882a593Smuzhiyun default:
107*4882a593Smuzhiyun break;
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun return ret;
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun }
112*4882a593Smuzhiyun
snd_fsm_func_deinit_st_hdl(void * obj,u16 event,void * param)113*4882a593Smuzhiyun static int snd_fsm_func_deinit_st_hdl(void *obj, u16 event, void *param)
114*4882a593Smuzhiyun {
115*4882a593Smuzhiyun struct phl_sound_obj *snd = (struct phl_sound_obj *)obj;
116*4882a593Smuzhiyun int ret = 0;
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun switch (event) {
120*4882a593Smuzhiyun case FSM_EV_STATE_IN:
121*4882a593Smuzhiyun break;
122*4882a593Smuzhiyun case FSM_EV_STATE_OUT:
123*4882a593Smuzhiyun phl_fsm_cancel_alarm(snd->fsm_obj);
124*4882a593Smuzhiyun break;
125*4882a593Smuzhiyun case FSM_EV_CANCEL:
126*4882a593Smuzhiyun case FSM_EV_TIMER_EXPIRE:
127*4882a593Smuzhiyun break;
128*4882a593Smuzhiyun default:
129*4882a593Smuzhiyun break;
130*4882a593Smuzhiyun }
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun return ret;
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun
snd_fsm_func_ready_st_hdl(void * obj,u16 event,void * param)136*4882a593Smuzhiyun static int snd_fsm_func_ready_st_hdl(void *obj, u16 event, void *param)
137*4882a593Smuzhiyun {
138*4882a593Smuzhiyun struct phl_sound_obj *snd = (struct phl_sound_obj *)obj;
139*4882a593Smuzhiyun int ret = 0;
140*4882a593Smuzhiyun struct rtw_wifi_role_t *m_wrole =
141*4882a593Smuzhiyun (struct rtw_wifi_role_t *)snd->snd_param.m_wrole;
142*4882a593Smuzhiyun enum rtw_phl_status pstatus = RTW_PHL_STATUS_SUCCESS;
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun switch (event) {
145*4882a593Smuzhiyun case FSM_EV_STATE_IN:
146*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
147*4882a593Smuzhiyun "snd_fsm_func_ready_st_hdl : FSM_EV_STATE_IN\n");
148*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
149*4882a593Smuzhiyun "snd_fsm_func_ready_st_hdl : (Re)Start Sounding Timestamp %d\n",
150*4882a593Smuzhiyun _os_get_cur_time_us());
151*4882a593Smuzhiyun if(NULL == m_wrole) {
152*4882a593Smuzhiyun snd_set_timer(snd, 0, SND_EV_TERMINATE);
153*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
154*4882a593Smuzhiyun "snd_fsm_func_ready_st_hdl : NULL == m_wrole\n");
155*4882a593Smuzhiyun break;
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun if ((PHL_RTYPE_STATION == m_wrole->type) &&
159*4882a593Smuzhiyun (MLME_LINKED != m_wrole->mstate)) {
160*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
161*4882a593Smuzhiyun "snd_fsm_func_ready_st_hdl : role STA in not in linked : 0x%x\n",
162*4882a593Smuzhiyun m_wrole->mstate);
163*4882a593Smuzhiyun snd_set_timer(snd, 0, SND_EV_TERMINATE);
164*4882a593Smuzhiyun break;
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun snd_set_timer(snd, 10, SND_FUNC_EV_PROC_GRP);
167*4882a593Smuzhiyun break;
168*4882a593Smuzhiyun case FSM_EV_STATE_OUT:
169*4882a593Smuzhiyun phl_fsm_cancel_alarm(snd->fsm_obj);
170*4882a593Smuzhiyun break;
171*4882a593Smuzhiyun case FSM_EV_CANCEL:
172*4882a593Smuzhiyun case FSM_EV_TIMER_EXPIRE:
173*4882a593Smuzhiyun phl_fsm_cancel_alarm(snd->fsm_obj);
174*4882a593Smuzhiyun break;
175*4882a593Smuzhiyun case SND_FUNC_EV_PROC_GRP:
176*4882a593Smuzhiyun phl_snd_func_remove_grp_all(snd->phl_info);
177*4882a593Smuzhiyun /*TODO: loop for all of the wrole */
178*4882a593Smuzhiyun if(NULL == m_wrole) {
179*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
180*4882a593Smuzhiyun "==> ROLE == NULL !!!\n STOP SND Function!!!\n");
181*4882a593Smuzhiyun snd_set_timer(snd, 10, SND_EV_TERMINATE);
182*4882a593Smuzhiyun break;
183*4882a593Smuzhiyun }
184*4882a593Smuzhiyun pstatus = phl_snd_func_grouping(snd->phl_info, m_wrole->id);
185*4882a593Smuzhiyun if (pstatus != RTW_PHL_STATUS_SUCCESS) {
186*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
187*4882a593Smuzhiyun "==> SND_FUNC_EV_PROC_GRP FAIL !!!\n STOP SND Function!!!\n");
188*4882a593Smuzhiyun snd_set_timer(snd, 10, SND_EV_TERMINATE);
189*4882a593Smuzhiyun break;
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun if (0 == snd->snd_param.snd_func_grp_num) {
192*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
193*4882a593Smuzhiyun "==> Available SND GRP == 0 !!!\n STOP SND Function!!!\n");
194*4882a593Smuzhiyun snd_set_timer(snd, 10, SND_EV_TERMINATE);
195*4882a593Smuzhiyun break;
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun /* fall through */
198*4882a593Smuzhiyun /*go through*/
199*4882a593Smuzhiyun case SND_FUNC_EV_START_SND_PROC:
200*4882a593Smuzhiyun pstatus = phl_snd_func_pre_config(snd->phl_info);
201*4882a593Smuzhiyun if (pstatus != RTW_PHL_STATUS_SUCCESS) {
202*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
203*4882a593Smuzhiyun "==> SND_FUNC_EV_START_SND_PROC FAIL !!!\n STOP SND Function!!!\n");
204*4882a593Smuzhiyun snd_set_timer(snd, 10, SND_EV_TERMINATE);
205*4882a593Smuzhiyun break;
206*4882a593Smuzhiyun }
207*4882a593Smuzhiyun phl_fsm_state_goto(snd->fsm_obj, SND_ST_PROC_IDLE);
208*4882a593Smuzhiyun break;
209*4882a593Smuzhiyun case SND_EV_TERMINATE:
210*4882a593Smuzhiyun snd->is_terminated = true;
211*4882a593Smuzhiyun phl_fsm_cancel_alarm(snd->fsm_obj);
212*4882a593Smuzhiyun phl_fsm_state_goto(snd->fsm_obj, SND_ST_PROC_TERMINATE);
213*4882a593Smuzhiyun break;
214*4882a593Smuzhiyun default:
215*4882a593Smuzhiyun break;
216*4882a593Smuzhiyun }
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun return ret;
219*4882a593Smuzhiyun }
220*4882a593Smuzhiyun
snd_fsm_func_leave_st_hdl(void * obj,u16 event,void * param)221*4882a593Smuzhiyun static int snd_fsm_func_leave_st_hdl(void *obj, u16 event, void *param)
222*4882a593Smuzhiyun {
223*4882a593Smuzhiyun struct phl_sound_obj *snd = (struct phl_sound_obj *)obj;
224*4882a593Smuzhiyun void *d = phl_to_drvpriv(snd->phl_info);
225*4882a593Smuzhiyun int ret = 0;
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun switch (event) {
229*4882a593Smuzhiyun case FSM_EV_STATE_IN:
230*4882a593Smuzhiyun _os_spinlock(d, &snd->snd_lock, _bh, NULL);
231*4882a593Smuzhiyun snd->snd_in_progress = 0;
232*4882a593Smuzhiyun _os_spinunlock(d, &snd->snd_lock, _bh, NULL);
233*4882a593Smuzhiyun phl_fsm_state_goto(snd->fsm_obj, SND_ST_FUNC_INIT);
234*4882a593Smuzhiyun break;
235*4882a593Smuzhiyun case FSM_EV_STATE_OUT:
236*4882a593Smuzhiyun phl_fsm_cancel_alarm(snd->fsm_obj);
237*4882a593Smuzhiyun break;
238*4882a593Smuzhiyun case FSM_EV_CANCEL:
239*4882a593Smuzhiyun case FSM_EV_TIMER_EXPIRE:
240*4882a593Smuzhiyun phl_fsm_cancel_alarm(snd->fsm_obj);
241*4882a593Smuzhiyun break;
242*4882a593Smuzhiyun case SND_EV_TERMINATE:
243*4882a593Smuzhiyun _os_spinlock(d, &snd->snd_lock, _bh, NULL);
244*4882a593Smuzhiyun snd->is_terminated = 1;
245*4882a593Smuzhiyun snd->snd_in_progress = 0;
246*4882a593Smuzhiyun _os_spinunlock(d, &snd->snd_lock, _bh, NULL);
247*4882a593Smuzhiyun phl_fsm_state_goto(snd->fsm_obj, SND_ST_FUNC_INIT);
248*4882a593Smuzhiyun break;
249*4882a593Smuzhiyun default:
250*4882a593Smuzhiyun break;
251*4882a593Smuzhiyun }
252*4882a593Smuzhiyun return ret;
253*4882a593Smuzhiyun }
254*4882a593Smuzhiyun
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun
snd_fsm_proc_idle_st_hdl(void * obj,u16 event,void * param)257*4882a593Smuzhiyun static int snd_fsm_proc_idle_st_hdl(void *obj, u16 event, void *param)
258*4882a593Smuzhiyun {
259*4882a593Smuzhiyun struct phl_sound_obj *snd = (struct phl_sound_obj *)obj;
260*4882a593Smuzhiyun struct phl_sound_param *snd_param = &snd->snd_param;
261*4882a593Smuzhiyun int ret = 0;
262*4882a593Smuzhiyun struct phl_snd_grp *grp = NULL;
263*4882a593Smuzhiyun
264*4882a593Smuzhiyun switch (event) {
265*4882a593Smuzhiyun case FSM_EV_STATE_IN:
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun /* go through */
268*4882a593Smuzhiyun case SND_PROC_EV_IDLE_FREE_PRE_RES :
269*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
270*4882a593Smuzhiyun "pre_proc_grp_idx : %d ; cur_proc_grp_idx : %d \n",
271*4882a593Smuzhiyun snd_param->pre_proc_grp_idx, snd_param->cur_proc_grp_idx);
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun if (snd_param->cur_proc_grp_idx !=
274*4882a593Smuzhiyun snd_param->pre_proc_grp_idx) {
275*4882a593Smuzhiyun grp = phl_snd_get_grp_byidx(snd->phl_info,
276*4882a593Smuzhiyun snd_param->pre_proc_grp_idx);
277*4882a593Smuzhiyun if (grp != NULL) {
278*4882a593Smuzhiyun phl_snd_proc_chk_prev_grp(snd->phl_info, grp);
279*4882a593Smuzhiyun }
280*4882a593Smuzhiyun }
281*4882a593Smuzhiyun /* fall through */
282*4882a593Smuzhiyun /* go through */
283*4882a593Smuzhiyun case SND_PROC_EV_IDLE_GET_SND_GRP :
284*4882a593Smuzhiyun if(MAX_SND_GRP_NUM == snd_param->cur_proc_grp_idx) {
285*4882a593Smuzhiyun snd_set_timer(snd, 10, SND_EV_TERMINATE);
286*4882a593Smuzhiyun break;
287*4882a593Smuzhiyun }
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun grp = phl_snd_get_grp_byidx(snd->phl_info,
290*4882a593Smuzhiyun snd_param->cur_proc_grp_idx);
291*4882a593Smuzhiyun /* TODO: Check Grp STA is still available */
292*4882a593Smuzhiyun /* phl_snd_check_condition() */
293*4882a593Smuzhiyun if (NULL == grp) {
294*4882a593Smuzhiyun snd_set_timer(snd, 0, SND_EV_TERMINATE);
295*4882a593Smuzhiyun break;
296*4882a593Smuzhiyun }
297*4882a593Smuzhiyun phl_fsm_state_goto(snd->fsm_obj, SND_ST_PROC_BUSY); /* For SND FSM LOOP Test */
298*4882a593Smuzhiyun break;
299*4882a593Smuzhiyun case FSM_EV_CANCEL:
300*4882a593Smuzhiyun case FSM_EV_TIMER_EXPIRE:
301*4882a593Smuzhiyun phl_fsm_cancel_alarm(snd->fsm_obj);
302*4882a593Smuzhiyun break;
303*4882a593Smuzhiyun case FSM_EV_STATE_OUT:
304*4882a593Smuzhiyun phl_fsm_cancel_alarm(snd->fsm_obj);
305*4882a593Smuzhiyun break;
306*4882a593Smuzhiyun case SND_EV_TERMINATE:
307*4882a593Smuzhiyun snd->is_terminated = true;
308*4882a593Smuzhiyun phl_fsm_state_goto(snd->fsm_obj, SND_ST_PROC_TERMINATE);
309*4882a593Smuzhiyun break;
310*4882a593Smuzhiyun default:
311*4882a593Smuzhiyun break;
312*4882a593Smuzhiyun }
313*4882a593Smuzhiyun return ret;
314*4882a593Smuzhiyun }
snd_fsm_proc_busy_st_hdl(void * obj,u16 event,void * param)315*4882a593Smuzhiyun static int snd_fsm_proc_busy_st_hdl(void *obj, u16 event, void *param)
316*4882a593Smuzhiyun {
317*4882a593Smuzhiyun struct phl_sound_obj *snd = (struct phl_sound_obj *)obj;
318*4882a593Smuzhiyun struct phl_sound_param *snd_param = &snd->snd_param;
319*4882a593Smuzhiyun int ret = 0;
320*4882a593Smuzhiyun struct phl_snd_grp *grp = NULL;
321*4882a593Smuzhiyun enum rtw_phl_status pstatus = RTW_PHL_STATUS_SUCCESS;
322*4882a593Smuzhiyun u8 sta_num = 0;
323*4882a593Smuzhiyun struct rtw_wifi_role_t *wrole =
324*4882a593Smuzhiyun (struct rtw_wifi_role_t *)snd->snd_param.m_wrole;
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun switch (event) {
327*4882a593Smuzhiyun case FSM_EV_STATE_IN:
328*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
329*4882a593Smuzhiyun "SND PROC BUSY : Process Grp idx = %d\n",
330*4882a593Smuzhiyun snd_param->cur_proc_grp_idx);
331*4882a593Smuzhiyun grp = phl_snd_get_grp_byidx(snd->phl_info,
332*4882a593Smuzhiyun snd_param->cur_proc_grp_idx);
333*4882a593Smuzhiyun if (NULL == grp) {
334*4882a593Smuzhiyun snd_set_timer(snd, 0, SND_PROC_EV_BUSY_SND_DOWN);
335*4882a593Smuzhiyun break;
336*4882a593Smuzhiyun }
337*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
338*4882a593Smuzhiyun "SND_PROC_BUSY : grp sta number = %d \n",
339*4882a593Smuzhiyun grp->num_sta);
340*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
341*4882a593Smuzhiyun "SND_PROC_BUSY : grp snd_fb_t = 0x%x \n",
342*4882a593Smuzhiyun grp->sta[0].snd_fb_t);
343*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
344*4882a593Smuzhiyun "SND_PROC_BUSY : grp primary sta macid = 0x%x \n",
345*4882a593Smuzhiyun grp->sta[0].macid);
346*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
347*4882a593Smuzhiyun "SND_PROC_BUSY : grp sta-1 macid = 0x%x \n",
348*4882a593Smuzhiyun grp->sta[1].macid);
349*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
350*4882a593Smuzhiyun "SND_PROC_BUSY : grp sta-2 macid = 0x%x \n",
351*4882a593Smuzhiyun grp->sta[2].macid);
352*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
353*4882a593Smuzhiyun "SND_PROC_BUSY : grp sta-3 macid = 0x%x \n",
354*4882a593Smuzhiyun grp->sta[3].macid);
355*4882a593Smuzhiyun /* fall through */
356*4882a593Smuzhiyun case SND_PROC_EV_BUSY_GET_BF_RES:
357*4882a593Smuzhiyun pstatus = phl_snd_proc_get_res(snd->phl_info, grp, &sta_num);
358*4882a593Smuzhiyun if ((sta_num == 0) || (RTW_PHL_STATUS_SUCCESS != pstatus)) {
359*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_, "SND_PROC_BUSY : sta_num = 0 !!! \n");
360*4882a593Smuzhiyun grp->snd_sts = PHL_SND_STS_FAILURE;
361*4882a593Smuzhiyun snd_set_timer(snd, 0, SND_PROC_EV_BUSY_SND_DOWN);
362*4882a593Smuzhiyun break;
363*4882a593Smuzhiyun }
364*4882a593Smuzhiyun /* fall through */
365*4882a593Smuzhiyun /* go through */
366*4882a593Smuzhiyun case SND_PROC_EV_BUSY_PRE_CFG:
367*4882a593Smuzhiyun pstatus = phl_snd_proc_precfg(snd->phl_info, grp);
368*4882a593Smuzhiyun /* fall through */
369*4882a593Smuzhiyun /* go through */
370*4882a593Smuzhiyun case SND_PROC_EV_BUSY_TRIG_SND:
371*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
372*4882a593Smuzhiyun "[SND] Dialog token = 0x%x\n",
373*4882a593Smuzhiyun snd->snd_param.snd_dialog_token);
374*4882a593Smuzhiyun pstatus = phl_snd_proc_start_sounding_fw(snd->phl_info, grp);
375*4882a593Smuzhiyun if (RTW_PHL_STATUS_SUCCESS != pstatus) {
376*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
377*4882a593Smuzhiyun "phl_snd_proc_start_sounding_fw FAIL\n");
378*4882a593Smuzhiyun grp->snd_sts = PHL_SND_STS_FAILURE;
379*4882a593Smuzhiyun if((grp->snd_type == PHL_SND_TYPE_HE_HW) ||
380*4882a593Smuzhiyun (grp->snd_type == PHL_SND_TYPE_VHT_HW)) {
381*4882a593Smuzhiyun phl_snd_mac_ctrl(snd->phl_info, wrole, 1);
382*4882a593Smuzhiyun }
383*4882a593Smuzhiyun /* TODO : FW / halmac might crashed , stop sounding fsm module */
384*4882a593Smuzhiyun snd_set_timer(snd, 0, SND_EV_TERMINATE);
385*4882a593Smuzhiyun }
386*4882a593Smuzhiyun snd->snd_param.snd_dialog_token++;
387*4882a593Smuzhiyun snd_set_timer(snd, 10, SND_PROC_EV_BUSY_REL_SND_CTRL);
388*4882a593Smuzhiyun break;
389*4882a593Smuzhiyun case SND_PROC_EV_BUSY_REL_SND_CTRL :
390*4882a593Smuzhiyun grp = phl_snd_get_grp_byidx(snd->phl_info,
391*4882a593Smuzhiyun snd_param->cur_proc_grp_idx);
392*4882a593Smuzhiyun if (NULL == grp) {
393*4882a593Smuzhiyun snd_set_timer(snd, 0, SND_PROC_EV_BUSY_SND_DOWN);
394*4882a593Smuzhiyun break;
395*4882a593Smuzhiyun }
396*4882a593Smuzhiyun if((grp->snd_type == PHL_SND_TYPE_HE_HW) ||
397*4882a593Smuzhiyun (grp->snd_type == PHL_SND_TYPE_VHT_HW)) {
398*4882a593Smuzhiyun phl_snd_mac_ctrl(snd->phl_info, wrole, 1);
399*4882a593Smuzhiyun }
400*4882a593Smuzhiyun snd_set_timer(snd, snd->snd_param.snd_proc_timeout_ms,
401*4882a593Smuzhiyun SND_PROC_EV_BUSY_SND_DOWN);
402*4882a593Smuzhiyun break;
403*4882a593Smuzhiyun case SND_PROC_EV_BUSY_SND_DOWN:
404*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
405*4882a593Smuzhiyun "SND_PROC_BUSY: Recv C2H or Timeout , Switch to PROC DOWN\n");
406*4882a593Smuzhiyun grp = phl_snd_get_grp_byidx(snd->phl_info,
407*4882a593Smuzhiyun snd_param->cur_proc_grp_idx);
408*4882a593Smuzhiyun if (NULL != grp)
409*4882a593Smuzhiyun phl_snd_polling_pri_sta_sts(snd->phl_info, grp);
410*4882a593Smuzhiyun phl_fsm_state_goto(snd->fsm_obj, SND_ST_PROC_DOWN); /* For SND FSM Periodic LOOP Test */
411*4882a593Smuzhiyun break;
412*4882a593Smuzhiyun case FSM_EV_STATE_OUT:
413*4882a593Smuzhiyun phl_fsm_cancel_alarm(snd->fsm_obj);
414*4882a593Smuzhiyun break;
415*4882a593Smuzhiyun case FSM_EV_CANCEL:
416*4882a593Smuzhiyun case FSM_EV_TIMER_EXPIRE:
417*4882a593Smuzhiyun break;
418*4882a593Smuzhiyun case SND_EV_TERMINATE:
419*4882a593Smuzhiyun snd->is_terminated = true;
420*4882a593Smuzhiyun phl_fsm_state_goto(snd->fsm_obj, SND_ST_PROC_TERMINATE);
421*4882a593Smuzhiyun break;
422*4882a593Smuzhiyun default:
423*4882a593Smuzhiyun break;
424*4882a593Smuzhiyun }
425*4882a593Smuzhiyun return ret;
426*4882a593Smuzhiyun }
427*4882a593Smuzhiyun
snd_fsm_proc_down_st_hdl(void * obj,u16 event,void * param)428*4882a593Smuzhiyun static int snd_fsm_proc_down_st_hdl(void *obj, u16 event, void *param)
429*4882a593Smuzhiyun {
430*4882a593Smuzhiyun struct phl_sound_obj *snd = (struct phl_sound_obj *)obj;
431*4882a593Smuzhiyun int ret = 0;
432*4882a593Smuzhiyun struct phl_sound_param *snd_param = &snd->snd_param;
433*4882a593Smuzhiyun struct phl_snd_grp *grp = NULL;
434*4882a593Smuzhiyun enum rtw_phl_status pstatus = RTW_PHL_STATUS_SUCCESS;
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun switch (event) {
437*4882a593Smuzhiyun case FSM_EV_STATE_IN:
438*4882a593Smuzhiyun grp = phl_snd_get_grp_byidx(snd->phl_info,
439*4882a593Smuzhiyun snd_param->cur_proc_grp_idx);
440*4882a593Smuzhiyun if (NULL == grp) {
441*4882a593Smuzhiyun snd_set_timer(snd, snd_param->snd_proc_period,
442*4882a593Smuzhiyun SND_PROC_EV_DOWN_SND_END);
443*4882a593Smuzhiyun break;
444*4882a593Smuzhiyun }
445*4882a593Smuzhiyun
446*4882a593Smuzhiyun if (PHL_SND_STS_FAILURE == grp->snd_sts) {
447*4882a593Smuzhiyun snd_set_timer(snd, snd_param->snd_proc_period,
448*4882a593Smuzhiyun SND_PROC_EV_DOWN_SND_END);
449*4882a593Smuzhiyun }
450*4882a593Smuzhiyun /* fall through */
451*4882a593Smuzhiyun /* go through */
452*4882a593Smuzhiyun case SND_PROC_EV_DOWN_POST_CFG:
453*4882a593Smuzhiyun pstatus = phl_snd_proc_postcfg(snd->phl_info, grp);
454*4882a593Smuzhiyun if (pstatus == RTW_PHL_STATUS_SUCCESS) {
455*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
456*4882a593Smuzhiyun "POST CONFIG SUCCESS!!!!\n");
457*4882a593Smuzhiyun }
458*4882a593Smuzhiyun /* fall through */
459*4882a593Smuzhiyun /* go through */
460*4882a593Smuzhiyun case SND_PROC_EV_DOWN_SND_END:
461*4882a593Smuzhiyun /* Check Test Mode */
462*4882a593Smuzhiyun if (snd_param->test_flag&PHL_SND_TEST_F_ONE_TIME) {
463*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
464*4882a593Smuzhiyun "TEST MODE : Set EV to TERMINATE by test_flag\n");
465*4882a593Smuzhiyun snd_set_timer(snd, snd_param->snd_proc_period,
466*4882a593Smuzhiyun SND_EV_TERMINATE);
467*4882a593Smuzhiyun break;
468*4882a593Smuzhiyun }
469*4882a593Smuzhiyun /* TODO: check next sounding needed
470*4882a593Smuzhiyun if any sta disassociate or new sta associate, need re-grouping? */
471*4882a593Smuzhiyun grp = phl_snd_get_grp_byidx(snd->phl_info,
472*4882a593Smuzhiyun snd_param->cur_proc_grp_idx);
473*4882a593Smuzhiyun if (grp == NULL) {
474*4882a593Smuzhiyun snd_set_timer(snd, snd_param->snd_proc_period,
475*4882a593Smuzhiyun SND_EV_TERMINATE);
476*4882a593Smuzhiyun }
477*4882a593Smuzhiyun if (RTW_PHL_STATUS_SUCCESS ==
478*4882a593Smuzhiyun phl_snd_proc_chk_condition(snd->phl_info, grp)) {
479*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
480*4882a593Smuzhiyun "Status : Linked ; Set Timer for Next Sounding \n");
481*4882a593Smuzhiyun snd_set_timer(snd, snd_param->snd_proc_period,
482*4882a593Smuzhiyun SND_PROC_EV_DOWN_NEXT_SND);
483*4882a593Smuzhiyun } else {
484*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
485*4882a593Smuzhiyun "Status : ERROR ; Set Timer to Terminate \n");
486*4882a593Smuzhiyun snd_set_timer(snd, snd_param->snd_proc_period,
487*4882a593Smuzhiyun SND_EV_TERMINATE);
488*4882a593Smuzhiyun }
489*4882a593Smuzhiyun break;
490*4882a593Smuzhiyun case FSM_EV_CANCEL:
491*4882a593Smuzhiyun case FSM_EV_TIMER_EXPIRE:
492*4882a593Smuzhiyun break;
493*4882a593Smuzhiyun case FSM_EV_STATE_OUT:
494*4882a593Smuzhiyun phl_fsm_cancel_alarm(snd->fsm_obj);
495*4882a593Smuzhiyun break;
496*4882a593Smuzhiyun case SND_PROC_EV_DOWN_NEXT_SND:
497*4882a593Smuzhiyun snd_param->pre_proc_grp_idx = snd_param->cur_proc_grp_idx;
498*4882a593Smuzhiyun snd_param->cur_proc_grp_idx++;
499*4882a593Smuzhiyun
500*4882a593Smuzhiyun if (snd_param->cur_proc_grp_idx >=
501*4882a593Smuzhiyun snd_param->snd_func_grp_num) {
502*4882a593Smuzhiyun /* start sounding process from group list head or terminated */
503*4882a593Smuzhiyun if (snd->is_terminated)
504*4882a593Smuzhiyun snd_param->cur_proc_grp_idx = MAX_SND_GRP_NUM;
505*4882a593Smuzhiyun else
506*4882a593Smuzhiyun snd_param->cur_proc_grp_idx = 0;
507*4882a593Smuzhiyun }
508*4882a593Smuzhiyun
509*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
510*4882a593Smuzhiyun "Next Sounding Group Idx = %d",
511*4882a593Smuzhiyun snd_param->cur_proc_grp_idx);
512*4882a593Smuzhiyun
513*4882a593Smuzhiyun phl_fsm_state_goto(snd->fsm_obj, SND_ST_PROC_IDLE);
514*4882a593Smuzhiyun break;
515*4882a593Smuzhiyun case SND_EV_TERMINATE:
516*4882a593Smuzhiyun snd->is_terminated = true;
517*4882a593Smuzhiyun phl_fsm_state_goto(snd->fsm_obj, SND_ST_PROC_TERMINATE);
518*4882a593Smuzhiyun break;
519*4882a593Smuzhiyun default:
520*4882a593Smuzhiyun break;
521*4882a593Smuzhiyun }
522*4882a593Smuzhiyun return ret;
523*4882a593Smuzhiyun }
524*4882a593Smuzhiyun
snd_fsm_proc_terminiate_st_hdl(void * obj,u16 event,void * param)525*4882a593Smuzhiyun static int snd_fsm_proc_terminiate_st_hdl(void *obj, u16 event, void *param)
526*4882a593Smuzhiyun {
527*4882a593Smuzhiyun struct phl_sound_obj *snd = (struct phl_sound_obj *)obj;
528*4882a593Smuzhiyun int ret = 0;
529*4882a593Smuzhiyun
530*4882a593Smuzhiyun switch (event) {
531*4882a593Smuzhiyun case FSM_EV_STATE_IN:
532*4882a593Smuzhiyun /* Free all sounding resource and goto FUNC Leave */
533*4882a593Smuzhiyun phl_snd_func_remove_grp_all(snd->phl_info);
534*4882a593Smuzhiyun
535*4882a593Smuzhiyun phl_fsm_state_goto(snd->fsm_obj, SND_ST_FUNC_LEAVE);
536*4882a593Smuzhiyun break;
537*4882a593Smuzhiyun case FSM_EV_CANCEL:
538*4882a593Smuzhiyun case FSM_EV_TIMER_EXPIRE:
539*4882a593Smuzhiyun phl_fsm_cancel_alarm(snd->fsm_obj);
540*4882a593Smuzhiyun break;
541*4882a593Smuzhiyun case FSM_EV_STATE_OUT:
542*4882a593Smuzhiyun phl_fsm_cancel_alarm(snd->fsm_obj);
543*4882a593Smuzhiyun break;
544*4882a593Smuzhiyun default:
545*4882a593Smuzhiyun break;
546*4882a593Smuzhiyun }
547*4882a593Smuzhiyun return ret;
548*4882a593Smuzhiyun }
549*4882a593Smuzhiyun
snd_dump_obj(void * obj,char * s,int * sz)550*4882a593Smuzhiyun static void snd_dump_obj(void *obj, char *s, int *sz)
551*4882a593Smuzhiyun {
552*4882a593Smuzhiyun /* nothing to do for now */
553*4882a593Smuzhiyun }
554*4882a593Smuzhiyun
snd_dump_fsm(void * fsm,char * s,int * sz)555*4882a593Smuzhiyun static void snd_dump_fsm(void *fsm, char *s, int *sz)
556*4882a593Smuzhiyun {
557*4882a593Smuzhiyun /* nothing to do for now */
558*4882a593Smuzhiyun }
559*4882a593Smuzhiyun
560*4882a593Smuzhiyun /* STATE table */
561*4882a593Smuzhiyun static struct fsm_state_ent snd_state_tbl[] = {
562*4882a593Smuzhiyun ST_ENT(SND_ST_FUNC_INIT, snd_fsm_func_init_st_hdl),
563*4882a593Smuzhiyun ST_ENT(SND_ST_FUNC_DEINIT, snd_fsm_func_deinit_st_hdl),
564*4882a593Smuzhiyun ST_ENT(SND_ST_FUNC_READY, snd_fsm_func_ready_st_hdl),
565*4882a593Smuzhiyun ST_ENT(SND_ST_FUNC_LEAVE, snd_fsm_func_leave_st_hdl),
566*4882a593Smuzhiyun ST_ENT(SND_ST_PROC_IDLE, snd_fsm_proc_idle_st_hdl),
567*4882a593Smuzhiyun ST_ENT(SND_ST_PROC_BUSY, snd_fsm_proc_busy_st_hdl),
568*4882a593Smuzhiyun ST_ENT(SND_ST_PROC_DOWN, snd_fsm_proc_down_st_hdl),
569*4882a593Smuzhiyun ST_ENT(SND_ST_PROC_TERMINATE,snd_fsm_proc_terminiate_st_hdl)
570*4882a593Smuzhiyun };
571*4882a593Smuzhiyun
572*4882a593Smuzhiyun /* EVENT table */
573*4882a593Smuzhiyun static struct fsm_event_ent snd_event_tbl[] = {
574*4882a593Smuzhiyun EV_ENT(SND_FUNC_EV_INIT),
575*4882a593Smuzhiyun EV_ENT(SND_FUNC_EV_DEINIT),
576*4882a593Smuzhiyun EV_ENT(SND_FUNC_EV_SND_START),
577*4882a593Smuzhiyun EV_ENT(SND_FUNC_EV_NOTIFY_PENDING_REQ),
578*4882a593Smuzhiyun EV_ENT(SND_FUNC_EV_CHK_SND_STS),
579*4882a593Smuzhiyun EV_ENT(SND_FUNC_EV_PROC_GRP),
580*4882a593Smuzhiyun EV_ENT(SND_FUNC_EV_START_SND_PROC),
581*4882a593Smuzhiyun EV_ENT(SND_FUNC_EV_END_SND),
582*4882a593Smuzhiyun /*PROC IDLE*/
583*4882a593Smuzhiyun EV_ENT(SND_PROC_EV_IDLE_GET_SND_GRP),
584*4882a593Smuzhiyun /*PROC BUSY*/
585*4882a593Smuzhiyun EV_ENT(SND_PROC_EV_BUSY_GET_BF_RES),
586*4882a593Smuzhiyun EV_ENT(SND_PROC_EV_IDLE_FREE_PRE_RES),
587*4882a593Smuzhiyun EV_ENT(SND_PROC_EV_BUSY_PRE_CFG),
588*4882a593Smuzhiyun EV_ENT(SND_PROC_EV_BUSY_TRIG_SND),
589*4882a593Smuzhiyun EV_ENT(SND_PROC_EV_BUSY_REL_SND_CTRL),
590*4882a593Smuzhiyun EV_ENT(SND_PROC_EV_BUSY_POLLING_STS),
591*4882a593Smuzhiyun EV_ENT(SND_PROC_EV_BUSY_SND_DOWN),
592*4882a593Smuzhiyun /*PROC DOWN*/
593*4882a593Smuzhiyun EV_ENT(SND_PROC_EV_DOWN_POST_CFG),
594*4882a593Smuzhiyun EV_ENT(SND_PROC_EV_DOWN_SND_END),
595*4882a593Smuzhiyun EV_ENT(SND_PROC_EV_DOWN_NEXT_SND),
596*4882a593Smuzhiyun /*COMMON*/
597*4882a593Smuzhiyun EV_ENT(SND_EV_TERMINATE),
598*4882a593Smuzhiyun EV_ENT(SND_EV_DONOTHING),
599*4882a593Smuzhiyun EV_ENT(SND_EV_MAX),
600*4882a593Smuzhiyun };
601*4882a593Smuzhiyun
602*4882a593Smuzhiyun /* For EXTERNAL application to create a SND FSM */
603*4882a593Smuzhiyun /* @root: FSM root structure
604*4882a593Smuzhiyun * @phl_info: private data structure to invoke hal/phl function
605*4882a593Smuzhiyun *
606*4882a593Smuzhiyun * return
607*4882a593Smuzhiyun * fsm_main: FSM main structure (Do NOT expose)
608*4882a593Smuzhiyun */
phl_sound_new_fsm(struct fsm_root * root,struct phl_info_t * phl_info)609*4882a593Smuzhiyun struct fsm_main *phl_sound_new_fsm(struct fsm_root *root,
610*4882a593Smuzhiyun struct phl_info_t *phl_info)
611*4882a593Smuzhiyun {
612*4882a593Smuzhiyun void *d = phl_to_drvpriv(phl_info);
613*4882a593Smuzhiyun struct fsm_main *fsm = NULL;
614*4882a593Smuzhiyun struct rtw_phl_fsm_tb tb;
615*4882a593Smuzhiyun
616*4882a593Smuzhiyun _os_mem_set(d, &tb, 0, sizeof(tb));
617*4882a593Smuzhiyun
618*4882a593Smuzhiyun
619*4882a593Smuzhiyun tb.state_tbl = snd_state_tbl;
620*4882a593Smuzhiyun tb.max_state = sizeof(snd_state_tbl)/sizeof(snd_state_tbl[0]);
621*4882a593Smuzhiyun tb.max_event = sizeof(snd_event_tbl)/sizeof(snd_event_tbl[0]);
622*4882a593Smuzhiyun tb.evt_tbl = snd_event_tbl;
623*4882a593Smuzhiyun tb.dump_obj = snd_dump_obj;
624*4882a593Smuzhiyun tb.dump_obj = snd_dump_fsm;
625*4882a593Smuzhiyun tb.dbg_level = FSM_DBG_INFO;
626*4882a593Smuzhiyun tb.evt_level = FSM_DBG_INFO;
627*4882a593Smuzhiyun
628*4882a593Smuzhiyun fsm = phl_fsm_init_fsm(root, "sound", phl_info, &tb);
629*4882a593Smuzhiyun
630*4882a593Smuzhiyun return fsm;
631*4882a593Smuzhiyun }
632*4882a593Smuzhiyun
633*4882a593Smuzhiyun /* For EXTERNAL application to destory SND FSM */
634*4882a593Smuzhiyun /* @fsm: see fsm_main
635*4882a593Smuzhiyun */
phl_snd_destory_fsm(struct fsm_main * fsm)636*4882a593Smuzhiyun void phl_snd_destory_fsm(struct fsm_main *fsm)
637*4882a593Smuzhiyun {
638*4882a593Smuzhiyun if (fsm == NULL)
639*4882a593Smuzhiyun return;
640*4882a593Smuzhiyun
641*4882a593Smuzhiyun /* deinit fsm local variable if has */
642*4882a593Smuzhiyun
643*4882a593Smuzhiyun /* call FSM Framewro to deinit fsm */
644*4882a593Smuzhiyun phl_fsm_deinit_fsm(fsm);
645*4882a593Smuzhiyun }
646*4882a593Smuzhiyun
647*4882a593Smuzhiyun /* For EXTERNAL application to destory sound object */
648*4882a593Smuzhiyun /* @pcmd: local created command object
649*4882a593Smuzhiyun *
650*4882a593Smuzhiyun */
phl_snd_destory_obj(struct phl_sound_obj * snd)651*4882a593Smuzhiyun void phl_snd_destory_obj(struct phl_sound_obj *snd)
652*4882a593Smuzhiyun {
653*4882a593Smuzhiyun void *d = phl_to_drvpriv(snd->phl_info);
654*4882a593Smuzhiyun if (snd == NULL)
655*4882a593Smuzhiyun return;
656*4882a593Smuzhiyun
657*4882a593Smuzhiyun /* deinit obj local variable if has */
658*4882a593Smuzhiyun _os_spinlock_free(d, &snd->snd_lock);
659*4882a593Smuzhiyun _os_spinlock_free(d, &snd->cmd_lock);
660*4882a593Smuzhiyun
661*4882a593Smuzhiyun /* inform FSM framewory to recycle fsm_obj */
662*4882a593Smuzhiyun phl_fsm_destory_obj(snd->fsm_obj);
663*4882a593Smuzhiyun }
664*4882a593Smuzhiyun
665*4882a593Smuzhiyun /* For EXTERNAL interrupt handler to send event into snd fsm (expose) */
666*4882a593Smuzhiyun
phl_snd_fsm_ev_c2h_snd_down(void * phl)667*4882a593Smuzhiyun enum rtw_phl_status phl_snd_fsm_ev_c2h_snd_down(void *phl)
668*4882a593Smuzhiyun {
669*4882a593Smuzhiyun enum RTW_PHL_SND_NOTIFY_EVENT notify = RTW_PHL_SND_C2H_SND_DOWN;
670*4882a593Smuzhiyun
671*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
672*4882a593Smuzhiyun "phl_snd_event_c2h_snd_down notify 0x%x\n", notify);
673*4882a593Smuzhiyun return phl_snd_fsm_send_msg(phl, notify, NULL, 0);
674*4882a593Smuzhiyun }
675*4882a593Smuzhiyun
676*4882a593Smuzhiyun
677*4882a593Smuzhiyun enum rtw_phl_status
phl_snd_fsm_ev_start_func(void * phl,void * req)678*4882a593Smuzhiyun phl_snd_fsm_ev_start_func(void *phl, void *req)
679*4882a593Smuzhiyun {
680*4882a593Smuzhiyun enum rtw_phl_status status = RTW_PHL_STATUS_FAILURE;
681*4882a593Smuzhiyun struct phl_info_t *phl_info = (struct phl_info_t *)phl;
682*4882a593Smuzhiyun void *d = phl_to_drvpriv(phl_info);
683*4882a593Smuzhiyun struct phl_snd_start_req *snd_req = NULL;//(struct phl_snd_start_req *)req;
684*4882a593Smuzhiyun
685*4882a593Smuzhiyun enum RTW_PHL_SND_NOTIFY_EVENT notify = RTW_PHL_SND_START;
686*4882a593Smuzhiyun
687*4882a593Smuzhiyun do {
688*4882a593Smuzhiyun snd_req = (struct phl_snd_start_req *)_os_kmem_alloc(d,
689*4882a593Smuzhiyun sizeof(*snd_req));
690*4882a593Smuzhiyun
691*4882a593Smuzhiyun if (snd_req == NULL)
692*4882a593Smuzhiyun break;
693*4882a593Smuzhiyun
694*4882a593Smuzhiyun _os_mem_cpy(d, snd_req, req, sizeof(*snd_req));
695*4882a593Smuzhiyun
696*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
697*4882a593Smuzhiyun "phl_snd_event_start_func notify 0x%x\n", notify);
698*4882a593Smuzhiyun
699*4882a593Smuzhiyun status = phl_snd_fsm_send_msg(phl, notify, snd_req,
700*4882a593Smuzhiyun sizeof(*snd_req));
701*4882a593Smuzhiyun
702*4882a593Smuzhiyun _os_kmem_free(d, snd_req, sizeof(*snd_req));
703*4882a593Smuzhiyun
704*4882a593Smuzhiyun } while (0);
705*4882a593Smuzhiyun
706*4882a593Smuzhiyun return status;
707*4882a593Smuzhiyun }
708*4882a593Smuzhiyun
709*4882a593Smuzhiyun
phl_snd_fsm_ev_abort(void * phl)710*4882a593Smuzhiyun enum rtw_phl_status phl_snd_fsm_ev_abort(void *phl)
711*4882a593Smuzhiyun {
712*4882a593Smuzhiyun enum RTW_PHL_SND_NOTIFY_EVENT notify = RTW_PHL_SND_ABORT;
713*4882a593Smuzhiyun
714*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
715*4882a593Smuzhiyun "phl_snd_event_abort notify 0x%x\n", notify);
716*4882a593Smuzhiyun return phl_snd_fsm_send_msg(phl, notify, NULL, 0);
717*4882a593Smuzhiyun }
718*4882a593Smuzhiyun
719*4882a593Smuzhiyun /* @phl: phl_info_t
720*4882a593Smuzhiyun * @notify: event to snd fsm
721*4882a593Smuzhiyun */
722*4882a593Smuzhiyun enum rtw_phl_status
phl_snd_fsm_send_msg(void * phl,enum RTW_PHL_SND_NOTIFY_EVENT notify,void * buf,u32 buf_sz)723*4882a593Smuzhiyun phl_snd_fsm_send_msg(void *phl, enum RTW_PHL_SND_NOTIFY_EVENT notify,
724*4882a593Smuzhiyun void *buf, u32 buf_sz)
725*4882a593Smuzhiyun {
726*4882a593Smuzhiyun struct phl_info_t *phl_info = (struct phl_info_t *)phl;
727*4882a593Smuzhiyun struct phl_sound_obj *snd = phl_info->snd_obj;
728*4882a593Smuzhiyun u16 event;
729*4882a593Smuzhiyun
730*4882a593Smuzhiyun switch (notify) {
731*4882a593Smuzhiyun case RTW_PHL_SND_START: /* Start Sound Func */
732*4882a593Smuzhiyun event = SND_FUNC_EV_SND_START;
733*4882a593Smuzhiyun break;
734*4882a593Smuzhiyun case RTW_PHL_SND_ABORT: /* Go Terminate*/
735*4882a593Smuzhiyun event = SND_EV_TERMINATE;
736*4882a593Smuzhiyun break;
737*4882a593Smuzhiyun case RTW_PHL_SND_C2H_SND_DOWN: /* Sound Dwon Configuration */
738*4882a593Smuzhiyun event = SND_PROC_EV_BUSY_SND_DOWN;
739*4882a593Smuzhiyun break;
740*4882a593Smuzhiyun default:
741*4882a593Smuzhiyun return RTW_PHL_STATUS_FAILURE;
742*4882a593Smuzhiyun }
743*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_,
744*4882a593Smuzhiyun "phl_snd_send_msg event %d\n",
745*4882a593Smuzhiyun event);
746*4882a593Smuzhiyun return phl_fsm_gen_msg(phl, snd->fsm_obj, buf, buf_sz, event);
747*4882a593Smuzhiyun }
748*4882a593Smuzhiyun
749*4882a593Smuzhiyun
750*4882a593Smuzhiyun /* For EXTERNAL application notify from upper layer*/
phl_snd_notify_from_upper_watchdog_status(void * phl,bool inprogress)751*4882a593Smuzhiyun void phl_snd_notify_from_upper_watchdog_status(void *phl, bool inprogress)
752*4882a593Smuzhiyun {
753*4882a593Smuzhiyun struct phl_info_t *phl_info = (struct phl_info_t *)phl;
754*4882a593Smuzhiyun struct phl_sound_obj *snd = NULL;
755*4882a593Smuzhiyun
756*4882a593Smuzhiyun snd = phl_info->snd_obj;
757*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_SOUND, _PHL_INFO_, "is snd in progress : %d \n",
758*4882a593Smuzhiyun snd->snd_in_progress);
759*4882a593Smuzhiyun /*TODO:*/
760*4882a593Smuzhiyun }
761*4882a593Smuzhiyun #endif /*CONFIG_FSM*/
762*4882a593Smuzhiyun
763