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 * Author: vincent_fann@realtek.com
15*4882a593Smuzhiyun *
16*4882a593Smuzhiyun *****************************************************************************/
17*4882a593Smuzhiyun #include "phl_headers.h"
18*4882a593Smuzhiyun #define MODL_MASK_LEN (PHL_BK_MDL_END / 8)
19*4882a593Smuzhiyun #define MAX_MSG_NUM (16)
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun enum msg_hub_status {
22*4882a593Smuzhiyun MSG_HUB_INIT = BIT0,
23*4882a593Smuzhiyun MSG_HUB_STARTED = BIT1,
24*4882a593Smuzhiyun };
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun enum msg_recver_status {
27*4882a593Smuzhiyun MSG_RECVER_INIT = BIT0,
28*4882a593Smuzhiyun MSG_RECVER_CLR_CTX = BIT1,
29*4882a593Smuzhiyun };
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun struct phl_msg_receiver_ex {
32*4882a593Smuzhiyun u8 status;
33*4882a593Smuzhiyun u8 bitmap[ MODL_MASK_LEN ];
34*4882a593Smuzhiyun struct phl_msg_receiver ctx;
35*4882a593Smuzhiyun };
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun struct phl_msg_ex {
39*4882a593Smuzhiyun _os_list list;
40*4882a593Smuzhiyun struct phl_msg ctx;
41*4882a593Smuzhiyun struct msg_completion_routine completion;
42*4882a593Smuzhiyun };
43*4882a593Smuzhiyun /**
44*4882a593Smuzhiyun * phl_msg_hub - responsible for phl msg forwarding,
45*4882a593Smuzhiyun * @status: contain mgnt status flags, refer to enum msg_hub_status
46*4882a593Smuzhiyun * @msg_pool: msg extension pool
47*4882a593Smuzhiyun * @msg_notify_thread: thread fot forwarding msg
48*4882a593Smuzhiyun * @recver: msg receiver, refer to enum phl_msg_recver_layer
49*4882a593Smuzhiyun */
50*4882a593Smuzhiyun struct phl_msg_hub {
51*4882a593Smuzhiyun u32 status;
52*4882a593Smuzhiyun struct phl_msg_ex msg_pool[MAX_MSG_NUM];
53*4882a593Smuzhiyun struct phl_queue idle_msg_q;
54*4882a593Smuzhiyun struct phl_queue wait_msg_q;
55*4882a593Smuzhiyun _os_sema msg_q_sema;
56*4882a593Smuzhiyun _os_thread msg_notify_thread;
57*4882a593Smuzhiyun /* for core & phl layer respectively */
58*4882a593Smuzhiyun struct phl_msg_receiver_ex recver[MSG_RECV_MAX];
59*4882a593Smuzhiyun };
60*4882a593Smuzhiyun
_is_bitmap_empty(void * d,u8 * bitmap)61*4882a593Smuzhiyun inline static u8 _is_bitmap_empty(void* d, u8* bitmap){
62*4882a593Smuzhiyun u8 empty[MODL_MASK_LEN] = {0};
63*4882a593Smuzhiyun return (!_os_mem_cmp(d, bitmap, empty, MODL_MASK_LEN))?(true):(false);
64*4882a593Smuzhiyun }
65*4882a593Smuzhiyun
pop_front_idle_msg(struct phl_info_t * phl,struct phl_msg_ex ** msg)66*4882a593Smuzhiyun static u8 pop_front_idle_msg(struct phl_info_t* phl, struct phl_msg_ex** msg)
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun void *d = phl_to_drvpriv(phl);
69*4882a593Smuzhiyun struct phl_msg_hub* hub = (struct phl_msg_hub*)phl->msg_hub;
70*4882a593Smuzhiyun _os_list* new_msg = NULL;
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun (*msg) = NULL;
73*4882a593Smuzhiyun if(pq_pop(d, &hub->idle_msg_q, &new_msg, _first, _bh)) {
74*4882a593Smuzhiyun (*msg) = (struct phl_msg_ex*)new_msg;
75*4882a593Smuzhiyun _os_mem_set(d, &((*msg)->ctx), 0, sizeof(struct phl_msg));
76*4882a593Smuzhiyun (*msg)->completion.completion = NULL;
77*4882a593Smuzhiyun (*msg)->completion.priv = NULL;
78*4882a593Smuzhiyun return true;
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun else
81*4882a593Smuzhiyun return false;
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun
push_back_idle_msg(struct phl_info_t * phl,struct phl_msg_ex * ex)84*4882a593Smuzhiyun static void push_back_idle_msg(struct phl_info_t* phl, struct phl_msg_ex* ex)
85*4882a593Smuzhiyun {
86*4882a593Smuzhiyun void *d = phl_to_drvpriv(phl);
87*4882a593Smuzhiyun struct phl_msg_hub* hub = (struct phl_msg_hub*)phl->msg_hub;
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun if(ex->completion.completion)
90*4882a593Smuzhiyun ex->completion.completion(ex->completion.priv, &(ex->ctx));
91*4882a593Smuzhiyun pq_push(d, &hub->idle_msg_q, &ex->list, _tail, _bh);
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun
pop_front_wait_msg(struct phl_info_t * phl,struct phl_msg_ex ** msg)94*4882a593Smuzhiyun static u8 pop_front_wait_msg(struct phl_info_t* phl, struct phl_msg_ex** msg)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun void *d = phl_to_drvpriv(phl);
97*4882a593Smuzhiyun struct phl_msg_hub* hub = (struct phl_msg_hub*)phl->msg_hub;
98*4882a593Smuzhiyun _os_list* new_msg = NULL;
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun (*msg) = NULL;
101*4882a593Smuzhiyun if(pq_pop(d, &hub->wait_msg_q, &new_msg, _first, _bh)) {
102*4882a593Smuzhiyun (*msg) = (struct phl_msg_ex*)new_msg;
103*4882a593Smuzhiyun return true;
104*4882a593Smuzhiyun }
105*4882a593Smuzhiyun else
106*4882a593Smuzhiyun return false;
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun
push_back_wait_msg(struct phl_info_t * phl,struct phl_msg_ex * ex)109*4882a593Smuzhiyun static void push_back_wait_msg(struct phl_info_t* phl, struct phl_msg_ex* ex)
110*4882a593Smuzhiyun {
111*4882a593Smuzhiyun void *d = phl_to_drvpriv(phl);
112*4882a593Smuzhiyun struct phl_msg_hub* hub = (struct phl_msg_hub*)phl->msg_hub;
113*4882a593Smuzhiyun pq_push(d, &hub->wait_msg_q, &ex->list, _tail, _bh);
114*4882a593Smuzhiyun _os_sema_up(d, &(hub->msg_q_sema));
115*4882a593Smuzhiyun }
116*4882a593Smuzhiyun
msg_forward(struct phl_info_t * phl,struct phl_msg_ex * ex)117*4882a593Smuzhiyun void msg_forward(struct phl_info_t* phl, struct phl_msg_ex* ex)
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun void *d = phl_to_drvpriv(phl);
120*4882a593Smuzhiyun u8 i = 0;
121*4882a593Smuzhiyun struct phl_msg_hub* hub = (struct phl_msg_hub*)phl->msg_hub;
122*4882a593Smuzhiyun struct phl_msg_receiver_ex* recver = NULL;
123*4882a593Smuzhiyun u8 module_id = MSG_MDL_ID_FIELD(ex->ctx.msg_id);
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun if (!TEST_STATUS_FLAG(hub->status, MSG_HUB_STARTED)) {
126*4882a593Smuzhiyun PHL_INFO("%s, msg hub not working\n",__FUNCTION__);
127*4882a593Smuzhiyun return;
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun for(i = 0; i < MSG_RECV_MAX; i++) {
130*4882a593Smuzhiyun recver = &(hub->recver[i]);
131*4882a593Smuzhiyun if(!TEST_STATUS_FLAG(recver->status, MSG_RECVER_INIT)) {
132*4882a593Smuzhiyun if(TEST_STATUS_FLAG(recver->status, MSG_RECVER_CLR_CTX))
133*4882a593Smuzhiyun _os_mem_set(d, recver, 0, sizeof(struct phl_msg_receiver_ex));
134*4882a593Smuzhiyun continue;
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun if(_chk_bitmap_bit(recver->bitmap, module_id)) {
137*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_DBG, _PHL_DEBUG_, "%s notify %d layer\n",
138*4882a593Smuzhiyun __FUNCTION__, i);
139*4882a593Smuzhiyun recver->ctx.incoming_evt_notify(recver->ctx.priv,
140*4882a593Smuzhiyun &(ex->ctx));
141*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_DBG, _PHL_DEBUG_, "%s notify %d layer\n",
142*4882a593Smuzhiyun __FUNCTION__, i);
143*4882a593Smuzhiyun }
144*4882a593Smuzhiyun }
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun }
147*4882a593Smuzhiyun
msg_thread_hdl(void * param)148*4882a593Smuzhiyun int msg_thread_hdl(void* param)
149*4882a593Smuzhiyun {
150*4882a593Smuzhiyun struct phl_info_t* phl = (struct phl_info_t *)param;
151*4882a593Smuzhiyun void *d = phl_to_drvpriv(phl);
152*4882a593Smuzhiyun struct phl_msg_hub* hub = (struct phl_msg_hub*)phl->msg_hub;
153*4882a593Smuzhiyun struct phl_msg_ex* ex = NULL;
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun PHL_INFO("%s enter\n",__FUNCTION__);
156*4882a593Smuzhiyun while(!_os_thread_check_stop(d, &(hub->msg_notify_thread))) {
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun _os_sema_down(d, &hub->msg_q_sema);
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun if(_os_thread_check_stop(d, &(hub->msg_notify_thread)))
161*4882a593Smuzhiyun break;
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun while(pop_front_wait_msg(phl, &ex)){
164*4882a593Smuzhiyun msg_forward(phl, ex);
165*4882a593Smuzhiyun push_back_idle_msg(phl, ex);
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun }
168*4882a593Smuzhiyun while (hub->idle_msg_q.cnt != MAX_MSG_NUM) {
169*4882a593Smuzhiyun while(pop_front_wait_msg(phl, &ex))
170*4882a593Smuzhiyun push_back_idle_msg(phl, ex);
171*4882a593Smuzhiyun }
172*4882a593Smuzhiyun _os_thread_wait_stop(d, &(hub->msg_notify_thread));
173*4882a593Smuzhiyun PHL_INFO("%s down\n",__FUNCTION__);
174*4882a593Smuzhiyun return 0;
175*4882a593Smuzhiyun }
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun
phl_msg_hub_init(struct phl_info_t * phl)178*4882a593Smuzhiyun enum rtw_phl_status phl_msg_hub_init(struct phl_info_t* phl)
179*4882a593Smuzhiyun {
180*4882a593Smuzhiyun struct phl_msg_hub* hub = NULL;
181*4882a593Smuzhiyun void *d = phl_to_drvpriv(phl);
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun if(phl->msg_hub != NULL)
185*4882a593Smuzhiyun return RTW_PHL_STATUS_FAILURE;
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun hub = (struct phl_msg_hub *)_os_mem_alloc(d,
188*4882a593Smuzhiyun sizeof(struct phl_msg_hub));
189*4882a593Smuzhiyun if(hub == NULL) {
190*4882a593Smuzhiyun PHL_ERR("%s, alloc fail\n",__FUNCTION__);
191*4882a593Smuzhiyun return RTW_PHL_STATUS_RESOURCE;
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun phl->msg_hub = hub;
194*4882a593Smuzhiyun _os_sema_init(d, &(hub->msg_q_sema), 0);
195*4882a593Smuzhiyun pq_init(d, &(hub->idle_msg_q));
196*4882a593Smuzhiyun pq_init(d, &(hub->wait_msg_q));
197*4882a593Smuzhiyun SET_STATUS_FLAG(hub->status, MSG_HUB_INIT);
198*4882a593Smuzhiyun PHL_INFO("%s\n",__FUNCTION__);
199*4882a593Smuzhiyun return RTW_PHL_STATUS_SUCCESS;
200*4882a593Smuzhiyun }
201*4882a593Smuzhiyun
phl_msg_hub_deinit(struct phl_info_t * phl)202*4882a593Smuzhiyun enum rtw_phl_status phl_msg_hub_deinit(struct phl_info_t* phl)
203*4882a593Smuzhiyun {
204*4882a593Smuzhiyun struct phl_msg_hub* hub = (struct phl_msg_hub*)phl->msg_hub;
205*4882a593Smuzhiyun void *d = phl_to_drvpriv(phl);
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun if(!TEST_STATUS_FLAG(hub->status, MSG_HUB_INIT))
208*4882a593Smuzhiyun return RTW_PHL_STATUS_FAILURE;
209*4882a593Smuzhiyun CLEAR_STATUS_FLAG(hub->status, MSG_HUB_INIT);
210*4882a593Smuzhiyun phl_msg_hub_stop(phl);
211*4882a593Smuzhiyun pq_deinit(d, &(hub->idle_msg_q));
212*4882a593Smuzhiyun pq_deinit(d, &(hub->wait_msg_q));
213*4882a593Smuzhiyun _os_sema_free(d, &(hub->msg_q_sema));
214*4882a593Smuzhiyun _os_mem_free(d, hub, sizeof(struct phl_msg_hub));
215*4882a593Smuzhiyun PHL_INFO("%s\n",__FUNCTION__);
216*4882a593Smuzhiyun return RTW_PHL_STATUS_SUCCESS;
217*4882a593Smuzhiyun }
218*4882a593Smuzhiyun
phl_msg_hub_start(struct phl_info_t * phl)219*4882a593Smuzhiyun enum rtw_phl_status phl_msg_hub_start(struct phl_info_t* phl)
220*4882a593Smuzhiyun {
221*4882a593Smuzhiyun u8 i = 0;
222*4882a593Smuzhiyun struct phl_msg_hub* hub = (struct phl_msg_hub*)phl->msg_hub;
223*4882a593Smuzhiyun void *d = phl_to_drvpriv(phl);
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun if(!TEST_STATUS_FLAG(hub->status, MSG_HUB_INIT)||
226*4882a593Smuzhiyun TEST_STATUS_FLAG(hub->status, MSG_HUB_STARTED))
227*4882a593Smuzhiyun return RTW_PHL_STATUS_FAILURE;
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun _os_mem_set(d, hub->msg_pool, 0,
230*4882a593Smuzhiyun sizeof(struct phl_msg_ex) * MAX_MSG_NUM );
231*4882a593Smuzhiyun pq_reset(d, &(hub->idle_msg_q), _bh);
232*4882a593Smuzhiyun pq_reset(d, &(hub->wait_msg_q), _bh);
233*4882a593Smuzhiyun for(i = 0; i < MAX_MSG_NUM; i++) {
234*4882a593Smuzhiyun pq_push(d, &hub->idle_msg_q, &hub->msg_pool[i].list, _tail, _bh);
235*4882a593Smuzhiyun }
236*4882a593Smuzhiyun _os_thread_init(d, &(hub->msg_notify_thread), msg_thread_hdl, phl,
237*4882a593Smuzhiyun "msg_notify_thread");
238*4882a593Smuzhiyun _os_thread_schedule(d, &(hub->msg_notify_thread));
239*4882a593Smuzhiyun SET_STATUS_FLAG(hub->status, MSG_HUB_STARTED);
240*4882a593Smuzhiyun PHL_INFO("%s\n",__FUNCTION__);
241*4882a593Smuzhiyun return RTW_PHL_STATUS_SUCCESS;
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun
phl_msg_hub_stop(struct phl_info_t * phl)244*4882a593Smuzhiyun enum rtw_phl_status phl_msg_hub_stop(struct phl_info_t* phl)
245*4882a593Smuzhiyun {
246*4882a593Smuzhiyun struct phl_msg_hub* hub = (struct phl_msg_hub*)phl->msg_hub;
247*4882a593Smuzhiyun void *d = phl_to_drvpriv(phl);
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun if(!TEST_STATUS_FLAG(hub->status, MSG_HUB_STARTED))
250*4882a593Smuzhiyun return RTW_PHL_STATUS_FAILURE;
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun CLEAR_STATUS_FLAG(hub->status, MSG_HUB_STARTED);
253*4882a593Smuzhiyun _os_thread_stop(d, &(hub->msg_notify_thread));
254*4882a593Smuzhiyun _os_sema_up(d, &(hub->msg_q_sema));
255*4882a593Smuzhiyun _os_thread_deinit(d, &(hub->msg_notify_thread));
256*4882a593Smuzhiyun pq_reset(d, &(hub->idle_msg_q), _bh);
257*4882a593Smuzhiyun pq_reset(d, &(hub->wait_msg_q), _bh);
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun PHL_INFO("%s\n",__FUNCTION__);
260*4882a593Smuzhiyun return RTW_PHL_STATUS_SUCCESS;
261*4882a593Smuzhiyun }
262*4882a593Smuzhiyun
phl_msg_hub_send(struct phl_info_t * phl,struct phl_msg_attribute * attr,struct phl_msg * msg)263*4882a593Smuzhiyun enum rtw_phl_status phl_msg_hub_send(struct phl_info_t* phl,
264*4882a593Smuzhiyun struct phl_msg_attribute* attr, struct phl_msg* msg)
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun struct phl_msg_hub* hub = (struct phl_msg_hub*)phl->msg_hub;
267*4882a593Smuzhiyun void *d = phl_to_drvpriv(phl);
268*4882a593Smuzhiyun struct phl_msg_ex* ex = NULL;
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun if(!TEST_STATUS_FLAG(hub->status, MSG_HUB_STARTED) || msg == NULL)
271*4882a593Smuzhiyun return RTW_PHL_STATUS_FAILURE;
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun if(!pop_front_idle_msg(phl, &ex)) {
274*4882a593Smuzhiyun PHL_ERR(" %s idle msg empty\n",__FUNCTION__);
275*4882a593Smuzhiyun return RTW_PHL_STATUS_RESOURCE;
276*4882a593Smuzhiyun }
277*4882a593Smuzhiyun _os_mem_cpy(d, &(ex->ctx), msg, sizeof(struct phl_msg));
278*4882a593Smuzhiyun if(attr && attr->completion.completion) {
279*4882a593Smuzhiyun ex->completion.completion = attr->completion.completion;
280*4882a593Smuzhiyun ex->completion.priv = attr->completion.priv;
281*4882a593Smuzhiyun }
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun push_back_wait_msg(phl, ex);
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_DBG, _PHL_DEBUG_, "%s, msg_id:0x%x enqueue\n",
286*4882a593Smuzhiyun __FUNCTION__, msg->msg_id);
287*4882a593Smuzhiyun return RTW_PHL_STATUS_SUCCESS;
288*4882a593Smuzhiyun }
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun
phl_msg_hub_register_recver(void * phl,struct phl_msg_receiver * ctx,enum phl_msg_recver_layer layer)291*4882a593Smuzhiyun enum rtw_phl_status phl_msg_hub_register_recver(void* phl,
292*4882a593Smuzhiyun struct phl_msg_receiver* ctx, enum phl_msg_recver_layer layer)
293*4882a593Smuzhiyun {
294*4882a593Smuzhiyun struct phl_info_t* phl_info = (struct phl_info_t*)phl;
295*4882a593Smuzhiyun struct phl_msg_hub* hub = (struct phl_msg_hub*)phl_info->msg_hub;
296*4882a593Smuzhiyun void *d = phl_to_drvpriv(phl_info);
297*4882a593Smuzhiyun struct phl_msg_receiver_ex* recver = NULL;
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun if(!TEST_STATUS_FLAG(hub->status, MSG_HUB_INIT) ||
300*4882a593Smuzhiyun layer >= MSG_RECV_MAX ||
301*4882a593Smuzhiyun ctx == NULL)
302*4882a593Smuzhiyun return RTW_PHL_STATUS_FAILURE;
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun recver = &(hub->recver[layer]);
305*4882a593Smuzhiyun if(TEST_STATUS_FLAG(recver->status, MSG_RECVER_INIT)) {
306*4882a593Smuzhiyun PHL_ERR("%s, layer registered\n",__FUNCTION__);
307*4882a593Smuzhiyun return RTW_PHL_STATUS_FAILURE;
308*4882a593Smuzhiyun }
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun _os_mem_cpy(d, &(recver->ctx), ctx, sizeof(struct phl_msg_receiver));
311*4882a593Smuzhiyun _os_mem_set(d, &(recver->bitmap), 0, MODL_MASK_LEN);
312*4882a593Smuzhiyun SET_STATUS_FLAG(recver->status, MSG_RECVER_INIT);
313*4882a593Smuzhiyun PHL_INFO("%s\n",__FUNCTION__);
314*4882a593Smuzhiyun return RTW_PHL_STATUS_SUCCESS;
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun
phl_msg_hub_update_recver_mask(void * phl,enum phl_msg_recver_layer layer,u8 * mdl_id,u32 len,u8 clr)317*4882a593Smuzhiyun enum rtw_phl_status phl_msg_hub_update_recver_mask(void* phl,
318*4882a593Smuzhiyun enum phl_msg_recver_layer layer, u8* mdl_id, u32 len, u8 clr)
319*4882a593Smuzhiyun {
320*4882a593Smuzhiyun struct phl_info_t* phl_info = (struct phl_info_t*)phl;
321*4882a593Smuzhiyun struct phl_msg_hub* hub = (struct phl_msg_hub*)phl_info->msg_hub;
322*4882a593Smuzhiyun struct phl_msg_receiver_ex* recver = NULL;
323*4882a593Smuzhiyun if(!TEST_STATUS_FLAG(hub->status, MSG_HUB_INIT) ||
324*4882a593Smuzhiyun layer >= MSG_RECV_MAX)
325*4882a593Smuzhiyun return RTW_PHL_STATUS_FAILURE;
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun recver = &(hub->recver[layer]);
328*4882a593Smuzhiyun if(!TEST_STATUS_FLAG(recver->status, MSG_RECVER_INIT)) {
329*4882a593Smuzhiyun PHL_ERR("%s, layer not registered\n",__FUNCTION__);
330*4882a593Smuzhiyun return RTW_PHL_STATUS_FAILURE;
331*4882a593Smuzhiyun }
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun if(clr == true)
334*4882a593Smuzhiyun _clr_bitmap_bit(recver->bitmap, mdl_id, len);
335*4882a593Smuzhiyun else
336*4882a593Smuzhiyun _add_bitmap_bit(recver->bitmap, mdl_id, len);
337*4882a593Smuzhiyun PHL_INFO(" %s\n",__FUNCTION__);
338*4882a593Smuzhiyun return RTW_PHL_STATUS_SUCCESS;
339*4882a593Smuzhiyun }
340*4882a593Smuzhiyun
phl_msg_hub_deregister_recver(void * phl,enum phl_msg_recver_layer layer)341*4882a593Smuzhiyun enum rtw_phl_status phl_msg_hub_deregister_recver(void* phl,
342*4882a593Smuzhiyun enum phl_msg_recver_layer layer)
343*4882a593Smuzhiyun {
344*4882a593Smuzhiyun struct phl_info_t* phl_info = (struct phl_info_t*)phl;
345*4882a593Smuzhiyun struct phl_msg_hub* hub = (struct phl_msg_hub*)phl_info->msg_hub;
346*4882a593Smuzhiyun struct phl_msg_receiver_ex* recver = NULL;
347*4882a593Smuzhiyun if(!TEST_STATUS_FLAG(hub->status, MSG_HUB_INIT) ||
348*4882a593Smuzhiyun layer >= MSG_RECV_MAX)
349*4882a593Smuzhiyun return RTW_PHL_STATUS_FAILURE;
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun recver = &(hub->recver[layer]);
352*4882a593Smuzhiyun if(!TEST_STATUS_FLAG(recver->status, MSG_RECVER_INIT)) {
353*4882a593Smuzhiyun PHL_ERR("%s, layer not registered\n",__FUNCTION__);
354*4882a593Smuzhiyun return RTW_PHL_STATUS_FAILURE;
355*4882a593Smuzhiyun }
356*4882a593Smuzhiyun CLEAR_STATUS_FLAG(recver->status, MSG_RECVER_INIT);
357*4882a593Smuzhiyun SET_STATUS_FLAG(recver->status, MSG_RECVER_CLR_CTX);
358*4882a593Smuzhiyun PHL_INFO("%s\n",__FUNCTION__);
359*4882a593Smuzhiyun return RTW_PHL_STATUS_SUCCESS;
360*4882a593Smuzhiyun }
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun /* handling msg hub event with PHL_MDL_PHY_MGNT as module id */
phl_msg_hub_phy_mgnt_evt_hdlr(struct phl_info_t * phl,u16 evt_id)363*4882a593Smuzhiyun void phl_msg_hub_phy_mgnt_evt_hdlr(struct phl_info_t* phl, u16 evt_id)
364*4882a593Smuzhiyun {
365*4882a593Smuzhiyun PHL_INFO("%s : evt_id %d.\n", __func__, evt_id);
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun switch (evt_id) {
368*4882a593Smuzhiyun case MSG_EVT_FWDL_OK:
369*4882a593Smuzhiyun break;
370*4882a593Smuzhiyun case MSG_EVT_FWDL_FAIL:
371*4882a593Smuzhiyun break;
372*4882a593Smuzhiyun case MSG_EVT_DUMP_PLE_BUFFER:
373*4882a593Smuzhiyun rtw_phl_ser_dump_ple_buffer(phl);
374*4882a593Smuzhiyun break;
375*4882a593Smuzhiyun default:
376*4882a593Smuzhiyun break;
377*4882a593Smuzhiyun }
378*4882a593Smuzhiyun }
379*4882a593Smuzhiyun
phl_msg_hub_rx_evt_hdlr(struct phl_info_t * phl,u16 evt_id,u8 * buf,u32 len)380*4882a593Smuzhiyun void phl_msg_hub_rx_evt_hdlr(struct phl_info_t* phl, u16 evt_id,
381*4882a593Smuzhiyun u8 *buf, u32 len)
382*4882a593Smuzhiyun {
383*4882a593Smuzhiyun PHL_DBG("%s : evt_id %d.\n", __func__, evt_id);
384*4882a593Smuzhiyun
385*4882a593Smuzhiyun switch (evt_id) {
386*4882a593Smuzhiyun case HAL_C2H_EV_BB_MUGRP_DOWN:
387*4882a593Smuzhiyun break;
388*4882a593Smuzhiyun case MSG_EVT_TSF32_TOG:
389*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]phl_msg_hub_rx_evt_hdlr():toggle happen!!\n");
390*4882a593Smuzhiyun phl_p2pps_tsf32_tog_handler(phl);
391*4882a593Smuzhiyun break;
392*4882a593Smuzhiyun case MSG_EVT_DBG_RX_DUMP:
393*4882a593Smuzhiyun phl_rx_dbg_dump(phl, HW_PHY_0);
394*4882a593Smuzhiyun break;
395*4882a593Smuzhiyun default:
396*4882a593Smuzhiyun break;
397*4882a593Smuzhiyun }
398*4882a593Smuzhiyun }