xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852be/phl/phl_role.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_ROLE_C_
16*4882a593Smuzhiyun #include "phl_headers.h"
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun static enum rtw_phl_status
_phl_alloc_hw_resource(struct phl_info_t * phl,struct rtw_wifi_role_t * wrole,u8 hw_band)20*4882a593Smuzhiyun _phl_alloc_hw_resource(struct phl_info_t *phl,
21*4882a593Smuzhiyun 				struct rtw_wifi_role_t *wrole, u8 hw_band)
22*4882a593Smuzhiyun {
23*4882a593Smuzhiyun 	enum rtw_phl_status psts = RTW_PHL_STATUS_FAILURE;
24*4882a593Smuzhiyun 	void *drv = phl_to_drvpriv(phl);
25*4882a593Smuzhiyun 	struct rtw_phl_com_t *phl_com = phl->phl_com;
26*4882a593Smuzhiyun 	struct mr_ctl_t *mr_ctl = phlcom_to_mr_ctrl(phl_com);
27*4882a593Smuzhiyun 	struct hal_spec_t *hal_spec = phl_get_ic_spec(phl_com);
28*4882a593Smuzhiyun 	struct hw_band_ctl_t *band_ctrl;
29*4882a593Smuzhiyun 	u8 port_num, max_port_num;
30*4882a593Smuzhiyun 	u8 wmm_num, max_wmm_num;
31*4882a593Smuzhiyun 	int ridx;
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun 	band_ctrl = &mr_ctl->band_ctrl[hw_band];
34*4882a593Smuzhiyun 	max_port_num = hal_spec->port_num;
35*4882a593Smuzhiyun 	max_wmm_num = hal_spec->wmm_num;
36*4882a593Smuzhiyun 	ridx = wrole->id;
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun 	_os_spinlock(drv, &band_ctrl->lock, _ps, NULL);
39*4882a593Smuzhiyun 	/*alloc hw_port*/
40*4882a593Smuzhiyun 	for (port_num = 0; port_num < max_port_num; port_num++) {
41*4882a593Smuzhiyun 		if (!(band_ctrl->port_map & BIT(port_num))) {
42*4882a593Smuzhiyun 			band_ctrl->port_map |= BIT(port_num);
43*4882a593Smuzhiyun 			break;
44*4882a593Smuzhiyun 		}
45*4882a593Smuzhiyun 	}
46*4882a593Smuzhiyun 	if (port_num == max_port_num) {
47*4882a593Smuzhiyun 		PHL_ERR("%s Can't allocate hw port\n", __func__);
48*4882a593Smuzhiyun 		_os_warn_on(1);
49*4882a593Smuzhiyun 		goto _exit;
50*4882a593Smuzhiyun 	}
51*4882a593Smuzhiyun 	wrole->hw_port = port_num;
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun 	/*alloc hw_wmm*/
54*4882a593Smuzhiyun 	for (wmm_num = 0; wmm_num < max_wmm_num; wmm_num++) {
55*4882a593Smuzhiyun 		if (!(band_ctrl->wmm_map & BIT(wmm_num))) {
56*4882a593Smuzhiyun 			band_ctrl->wmm_map |= BIT(wmm_num);
57*4882a593Smuzhiyun 			break;
58*4882a593Smuzhiyun 		}
59*4882a593Smuzhiyun 	}
60*4882a593Smuzhiyun 	if (wmm_num == max_wmm_num) {
61*4882a593Smuzhiyun 		PHL_INFO("%s WID:%d - assigne wmm_id to 0\n", __func__, ridx);
62*4882a593Smuzhiyun 		wrole->hw_wmm = 0;
63*4882a593Smuzhiyun 	} else {
64*4882a593Smuzhiyun 		wrole->hw_wmm = wmm_num;
65*4882a593Smuzhiyun 	}
66*4882a593Smuzhiyun 	#ifdef RTW_WKARD_HW_WMM_ALLOCATE
67*4882a593Smuzhiyun 	if (wrole->hw_wmm == 0)
68*4882a593Smuzhiyun 		_os_atomic_inc(phl_to_drvpriv(phl), &wrole->hw_wmm0_ref_cnt);
69*4882a593Smuzhiyun 	#endif
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun 	/*set mr_role_map*/
72*4882a593Smuzhiyun 	band_ctrl->role_map |= BIT(ridx);
73*4882a593Smuzhiyun 	wrole->hw_band = hw_band;
74*4882a593Smuzhiyun 	psts = RTW_PHL_STATUS_SUCCESS;
75*4882a593Smuzhiyun _exit:
76*4882a593Smuzhiyun 	_os_spinunlock(drv, &band_ctrl->lock, _ps, NULL);
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun 	if (psts == RTW_PHL_STATUS_SUCCESS) {
79*4882a593Smuzhiyun 		PHL_INFO("%s wridx:%d success\n", __func__, ridx);
80*4882a593Smuzhiyun 		PHL_DUMP_ROLE_EX(phl, wrole);
81*4882a593Smuzhiyun 	}
82*4882a593Smuzhiyun 	return psts;
83*4882a593Smuzhiyun }
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun static enum rtw_phl_status
_phl_free_hw_resource(struct phl_info_t * phl,struct rtw_wifi_role_t * wrole)86*4882a593Smuzhiyun _phl_free_hw_resource(struct phl_info_t *phl,
87*4882a593Smuzhiyun 			struct rtw_wifi_role_t *wrole)
88*4882a593Smuzhiyun {
89*4882a593Smuzhiyun 	enum rtw_phl_status psts = RTW_PHL_STATUS_FAILURE;
90*4882a593Smuzhiyun 	void *drv = phl_to_drvpriv(phl);
91*4882a593Smuzhiyun 	struct rtw_phl_com_t *phl_com = phl->phl_com;
92*4882a593Smuzhiyun 	struct mr_ctl_t *mr_ctl = phlcom_to_mr_ctrl(phl_com);
93*4882a593Smuzhiyun 	struct hw_band_ctl_t *band_ctrl;
94*4882a593Smuzhiyun 	int ridx = wrole->id;
95*4882a593Smuzhiyun 	u8 hw_band = wrole->hw_band;
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun 	band_ctrl = &mr_ctl->band_ctrl[hw_band];
98*4882a593Smuzhiyun 	PHL_DUMP_ROLE_EX(phl, wrole);
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	_os_spinlock(drv, &band_ctrl->lock, _ps, NULL);
101*4882a593Smuzhiyun 	/*release hw_port*/
102*4882a593Smuzhiyun 	band_ctrl->port_map &= ~BIT(wrole->hw_port);
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 	/*release hw_wmm*/
105*4882a593Smuzhiyun 	#ifdef RTW_WKARD_HW_WMM_ALLOCATE
106*4882a593Smuzhiyun 	if (wrole->hw_wmm == 0) {
107*4882a593Smuzhiyun 		_os_atomic_dec(phl_to_drvpriv(phl), &wrole->hw_wmm0_ref_cnt);
108*4882a593Smuzhiyun 		if (_os_atomic_read(phl_to_drvpriv(phl), &wrole->hw_wmm0_ref_cnt) == 0)
109*4882a593Smuzhiyun 			band_ctrl->wmm_map &= ~BIT(wrole->hw_wmm);
110*4882a593Smuzhiyun 	} else
111*4882a593Smuzhiyun 	#endif
112*4882a593Smuzhiyun 	{
113*4882a593Smuzhiyun 		band_ctrl->wmm_map &= ~BIT(wrole->hw_wmm);
114*4882a593Smuzhiyun 	}
115*4882a593Smuzhiyun 	/*release mr_role_map*/
116*4882a593Smuzhiyun 	band_ctrl->role_map &= ~BIT(ridx);
117*4882a593Smuzhiyun 	_os_spinunlock(drv, &band_ctrl->lock, _ps, NULL);
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun 	psts = RTW_PHL_STATUS_SUCCESS;
120*4882a593Smuzhiyun 	PHL_INFO("%s wr-id:%d success\n", __func__, ridx);
121*4882a593Smuzhiyun 	return psts;
122*4882a593Smuzhiyun }
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun #if 0 /*TODO:DBCC*/
125*4882a593Smuzhiyun static enum rtw_phl_status
126*4882a593Smuzhiyun _phl_realloc_hw_resource(struct phl_info_t *phl,
127*4882a593Smuzhiyun 					struct rtw_wifi_role_t *wrole, u8 new_band)
128*4882a593Smuzhiyun {
129*4882a593Smuzhiyun 	enum rtw_phl_status psts = RTW_PHL_STATUS_FAILURE;
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 	if (new_band == wrole->hw_band) {
132*4882a593Smuzhiyun 		PHL_ERR("%s widx:%d at the same band(%d)\n", __func__, wrole->id, new_band);
133*4882a593Smuzhiyun 		return psts;
134*4882a593Smuzhiyun 	}
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun 	_phl_free_hw_resource(phl, wrole);
137*4882a593Smuzhiyun 	_phl_alloc_hw_resource(phl, wrole, new_band);
138*4882a593Smuzhiyun 	return psts;
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun #endif
_phl_search_roleidx_by_addr(struct phl_info_t * phl_info,u8 * mac_addr)141*4882a593Smuzhiyun static u8 _phl_search_roleidx_by_addr(
142*4882a593Smuzhiyun 			struct phl_info_t *phl_info, u8 *mac_addr)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun 	struct rtw_phl_com_t *phl_com = phl_info->phl_com;
145*4882a593Smuzhiyun 	u8 ridx = MAX_WIFI_ROLE_NUMBER;
146*4882a593Smuzhiyun 	struct mr_ctl_t *mr_ctl = phlcom_to_mr_ctrl(phl_com);
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun 	for (ridx = 0; ridx < MAX_WIFI_ROLE_NUMBER; ridx++) {
149*4882a593Smuzhiyun 		if (mr_ctl->role_map & BIT(ridx)) {
150*4882a593Smuzhiyun 			if (_os_mem_cmp(phl_to_drvpriv(phl_info),
151*4882a593Smuzhiyun 				phl_com->wifi_roles[ridx].mac_addr,
152*4882a593Smuzhiyun 				mac_addr, MAC_ALEN) == 0)
153*4882a593Smuzhiyun 				break;
154*4882a593Smuzhiyun 		}
155*4882a593Smuzhiyun 	}
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun 	#if 0
158*4882a593Smuzhiyun 	if (ridx == MAX_WIFI_ROLE_NUMBER)
159*4882a593Smuzhiyun 		PHL_INFO("%s cannot get rid\n", __func__);
160*4882a593Smuzhiyun 	#endif
161*4882a593Smuzhiyun 	return ridx;
162*4882a593Smuzhiyun }
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun struct rtw_wifi_role_t *
phl_get_wrole_by_addr(struct phl_info_t * phl_info,u8 * mac_addr)165*4882a593Smuzhiyun phl_get_wrole_by_addr(struct phl_info_t *phl_info, u8 *mac_addr)
166*4882a593Smuzhiyun {
167*4882a593Smuzhiyun 	struct rtw_phl_com_t *phl_com = phl_info->phl_com;
168*4882a593Smuzhiyun 	int ridx = MAX_WIFI_ROLE_NUMBER;
169*4882a593Smuzhiyun 	struct mr_ctl_t *mr_ctl = phlcom_to_mr_ctrl(phl_com);
170*4882a593Smuzhiyun 	struct rtw_wifi_role_t *wrole = NULL;
171*4882a593Smuzhiyun 	bool found = false;
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun 	for (ridx = 0; ridx < MAX_WIFI_ROLE_NUMBER; ridx++) {
174*4882a593Smuzhiyun 		if (mr_ctl->role_map & BIT(ridx)) {
175*4882a593Smuzhiyun 			wrole = &(phl_com->wifi_roles[ridx]);
176*4882a593Smuzhiyun 			if (_os_mem_cmp(phl_to_drvpriv(phl_info),
177*4882a593Smuzhiyun 				wrole->mac_addr, mac_addr, MAC_ALEN) == 0) {
178*4882a593Smuzhiyun 				found = true;
179*4882a593Smuzhiyun 				break;
180*4882a593Smuzhiyun 			}
181*4882a593Smuzhiyun 		}
182*4882a593Smuzhiyun 	}
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun 	if (found == false)
185*4882a593Smuzhiyun 		wrole = NULL;
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 	return wrole;
188*4882a593Smuzhiyun }
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun struct rtw_wifi_role_t *
rtw_phl_get_wrole_by_ridx(struct rtw_phl_com_t * phl_com,u8 rold_idx)191*4882a593Smuzhiyun rtw_phl_get_wrole_by_ridx(struct rtw_phl_com_t *phl_com, u8 rold_idx)
192*4882a593Smuzhiyun {
193*4882a593Smuzhiyun 	if (rold_idx < MAX_WIFI_ROLE_NUMBER)
194*4882a593Smuzhiyun 		return &(phl_com->wifi_roles[rold_idx]);
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 	return NULL;
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun static void
_phl_role_notify_buf_done(void * priv,struct phl_msg * msg)200*4882a593Smuzhiyun _phl_role_notify_buf_done(void* priv, struct phl_msg* msg)
201*4882a593Smuzhiyun {
202*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)priv;
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun 	if(msg->inbuf && msg->inlen){
205*4882a593Smuzhiyun 		_os_mem_free(phl_to_drvpriv(phl_info), msg->inbuf, msg->inlen);
206*4882a593Smuzhiyun 	}
207*4882a593Smuzhiyun }
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun #ifdef CONFIG_CMD_DISP
210*4882a593Smuzhiyun static void
_phl_role_cmd_done(void * priv,struct phl_msg * msg)211*4882a593Smuzhiyun _phl_role_cmd_done(void* priv, struct phl_msg* msg)
212*4882a593Smuzhiyun {
213*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)priv;
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun 	if(msg->inbuf && msg->inlen){
216*4882a593Smuzhiyun 		_os_kmem_free(phl_to_drvpriv(phl_info),
217*4882a593Smuzhiyun 			msg->inbuf, msg->inlen);
218*4882a593Smuzhiyun 	}
219*4882a593Smuzhiyun }
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun static void
_phl_send_role_notify_cmd(struct phl_info_t * phl_info,struct rtw_wifi_role_t * wrole,enum role_state rstate)222*4882a593Smuzhiyun _phl_send_role_notify_cmd(struct phl_info_t *phl_info,
223*4882a593Smuzhiyun 			struct rtw_wifi_role_t *wrole, enum role_state rstate)
224*4882a593Smuzhiyun {
225*4882a593Smuzhiyun 	struct phl_msg msg = {0};
226*4882a593Smuzhiyun 	struct phl_msg_attribute attr = {0};
227*4882a593Smuzhiyun 	struct rtw_role_cmd *rcmd = NULL;
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun 	rcmd = (struct rtw_role_cmd *)_os_kmem_alloc(
230*4882a593Smuzhiyun 		phl_to_drvpriv(phl_info), sizeof(struct rtw_role_cmd));
231*4882a593Smuzhiyun 	if (rcmd == NULL) {
232*4882a593Smuzhiyun 		PHL_ERR("%s: alloc role cmd fail.\n", __func__);
233*4882a593Smuzhiyun 		return;
234*4882a593Smuzhiyun 	}
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun 	rcmd->wrole = wrole;
237*4882a593Smuzhiyun 	rcmd->rstate = rstate;
238*4882a593Smuzhiyun 	msg.inbuf = (u8 *)rcmd;
239*4882a593Smuzhiyun 	msg.inlen = sizeof(struct rtw_role_cmd);
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun 	SET_MSG_MDL_ID_FIELD(msg.msg_id, PHL_MDL_MRC);
242*4882a593Smuzhiyun 	SET_MSG_EVT_ID_FIELD(msg.msg_id, MSG_EVT_ROLE_NTFY);
243*4882a593Smuzhiyun 	msg.band_idx = HW_BAND_0;
244*4882a593Smuzhiyun 	attr.completion.completion = _phl_role_cmd_done;
245*4882a593Smuzhiyun 	attr.completion.priv = phl_info;
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun 	if (phl_disp_eng_send_msg(phl_info, &msg, &attr, NULL) !=
248*4882a593Smuzhiyun 				RTW_PHL_STATUS_SUCCESS) {
249*4882a593Smuzhiyun 		PHL_ERR("%s: dispr_send_msg failed !\n", __func__);
250*4882a593Smuzhiyun 		goto cmd_fail;
251*4882a593Smuzhiyun 	}
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 	return;
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun cmd_fail:
256*4882a593Smuzhiyun 	_os_mem_free(phl_to_drvpriv(phl_info), rcmd,
257*4882a593Smuzhiyun 				sizeof(struct rtw_role_cmd));
258*4882a593Smuzhiyun }
259*4882a593Smuzhiyun #endif
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun static enum rtw_phl_status
_phl_role_notify(struct phl_info_t * phl_info,struct rtw_wifi_role_t * wrole,enum role_state rstate)262*4882a593Smuzhiyun _phl_role_notify(struct phl_info_t *phl_info,
263*4882a593Smuzhiyun 		struct rtw_wifi_role_t *wrole,
264*4882a593Smuzhiyun 		enum role_state rstate)
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun 	if (rstate >= PHL_ROLE_STATE_UNKNOWN) {
267*4882a593Smuzhiyun 		PHL_ERR("%s unknow rstate:%d\n", __func__, rstate);
268*4882a593Smuzhiyun 		return RTW_PHL_STATUS_FAILURE;
269*4882a593Smuzhiyun 	}
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun #ifdef CONFIG_PHL_CMD_BTC
272*4882a593Smuzhiyun 	_phl_send_role_notify_cmd(phl_info, wrole, rstate);
273*4882a593Smuzhiyun #else
274*4882a593Smuzhiyun #ifdef CONFIG_BTCOEX
275*4882a593Smuzhiyun 	rtw_phl_btc_role_notify(phl_info, wrole->id, rstate);
276*4882a593Smuzhiyun #endif
277*4882a593Smuzhiyun #endif
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun 	return RTW_PHL_STATUS_SUCCESS;
280*4882a593Smuzhiyun }
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun static struct rtw_wifi_role_t *
_phl_wifi_role_alloc_sw(struct phl_info_t * phl_info,u8 * mac_addr,enum role_type type,u8 ridx)283*4882a593Smuzhiyun _phl_wifi_role_alloc_sw(struct phl_info_t *phl_info,
284*4882a593Smuzhiyun 				u8 *mac_addr, enum role_type type, u8 ridx)
285*4882a593Smuzhiyun {
286*4882a593Smuzhiyun 	struct rtw_phl_com_t *phl_com = phl_info->phl_com;
287*4882a593Smuzhiyun 	struct rtw_wifi_role_t *role = NULL;
288*4882a593Smuzhiyun 	struct mr_ctl_t *mr_ctl = phlcom_to_mr_ctrl(phl_com);
289*4882a593Smuzhiyun 	u8 role_idx = INVALID_WIFI_ROLE_IDX;
290*4882a593Smuzhiyun 	u8 hw_band;
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	_os_spinlock(phl_to_drvpriv(phl_info), &mr_ctl->lock, _ps, NULL);
293*4882a593Smuzhiyun 	if (ridx == UNSPECIFIED_ROLE_ID) {
294*4882a593Smuzhiyun 		/*search avaliable rid */
295*4882a593Smuzhiyun 		for (role_idx = 0; role_idx < MAX_WIFI_ROLE_NUMBER; role_idx++) {
296*4882a593Smuzhiyun 			if (!(mr_ctl->role_map & BIT(role_idx))) {
297*4882a593Smuzhiyun 				mr_ctl->role_map |= BIT(role_idx);
298*4882a593Smuzhiyun 				break;
299*4882a593Smuzhiyun 			}
300*4882a593Smuzhiyun 		}
301*4882a593Smuzhiyun 	} else {
302*4882a593Smuzhiyun 		if (mr_ctl->role_map & BIT(ridx)) {
303*4882a593Smuzhiyun 			PHL_ERR("role_idx:%d has used\n", ridx);
304*4882a593Smuzhiyun 			_os_warn_on(1);
305*4882a593Smuzhiyun 		} else {
306*4882a593Smuzhiyun 			mr_ctl->role_map |= BIT(ridx);
307*4882a593Smuzhiyun 			role_idx = ridx;
308*4882a593Smuzhiyun 		}
309*4882a593Smuzhiyun 	}
310*4882a593Smuzhiyun 	_os_spinunlock(phl_to_drvpriv(phl_info), &mr_ctl->lock, _ps, NULL);
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun 	if (role_idx == INVALID_WIFI_ROLE_IDX) {
313*4882a593Smuzhiyun 		PHL_ERR("%s Can't get available role idx\n", __func__);
314*4882a593Smuzhiyun 		_os_warn_on(1);
315*4882a593Smuzhiyun 		return role;
316*4882a593Smuzhiyun 	}
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 	role = &phl_com->wifi_roles[role_idx];
319*4882a593Smuzhiyun 	role->type = type;
320*4882a593Smuzhiyun 	role->mstate = MLME_NO_LINK;
321*4882a593Smuzhiyun 	role->chanctx = NULL;
322*4882a593Smuzhiyun 	hw_band = 0;
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun 	/*alloc hw_band and hw_port,hw_wmm*/
325*4882a593Smuzhiyun 	if (_phl_alloc_hw_resource(phl_info, role, hw_band) != RTW_PHL_STATUS_SUCCESS) {
326*4882a593Smuzhiyun 		PHL_ERR("%s alloc_hw resource failed\n", __func__);
327*4882a593Smuzhiyun 		_os_warn_on(1);
328*4882a593Smuzhiyun 		role = NULL;
329*4882a593Smuzhiyun 		return role;
330*4882a593Smuzhiyun 	}
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun #ifdef RTW_WKARD_STA_BCN_INTERVAL
333*4882a593Smuzhiyun #ifdef RTW_PHL_BCN
334*4882a593Smuzhiyun 	if (role->type == PHL_RTYPE_AP) {
335*4882a593Smuzhiyun 		role->bcn_cmn.bcn_interval = 100;
336*4882a593Smuzhiyun 		role->mstate = MLME_LINKED;
337*4882a593Smuzhiyun 	}
338*4882a593Smuzhiyun #endif
339*4882a593Smuzhiyun #endif
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun 	_os_mem_cpy(phl_to_drvpriv(phl_info),
342*4882a593Smuzhiyun 			role->mac_addr, mac_addr, MAC_ALEN);
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun 	phl_init_role_cap(phl_info, role);
345*4882a593Smuzhiyun 	phl_init_protocol_cap(phl_info, role);
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun 	return role;
348*4882a593Smuzhiyun }
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun static enum rtw_phl_status
_phl_wifi_role_start(struct phl_info_t * phl_info,struct rtw_wifi_role_t * wrole,struct rtw_phl_stainfo_t * sta)351*4882a593Smuzhiyun _phl_wifi_role_start(struct phl_info_t *phl_info,
352*4882a593Smuzhiyun 				struct rtw_wifi_role_t *wrole,
353*4882a593Smuzhiyun 				struct rtw_phl_stainfo_t *sta)
354*4882a593Smuzhiyun {
355*4882a593Smuzhiyun 	enum rtw_phl_status psts = RTW_PHL_STATUS_FAILURE;
356*4882a593Smuzhiyun 	enum rtw_hal_status hsts = RTW_HAL_STATUS_FAILURE;
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun 	if (sta->active == false) {
359*4882a593Smuzhiyun 		psts = phl_alloc_stainfo_hw(phl_info, sta);
360*4882a593Smuzhiyun 		if (psts != RTW_PHL_STATUS_SUCCESS) {
361*4882a593Smuzhiyun 			PHL_ERR("%s can't alloc self stainfo_hw\n", __func__);
362*4882a593Smuzhiyun 			_os_warn_on(1);
363*4882a593Smuzhiyun 			goto _exit;
364*4882a593Smuzhiyun 		}
365*4882a593Smuzhiyun 		PHL_INFO("%s sta_info hw - macid:%u %02x:%02x:%02x:%02x:%02x:%02x\n",
366*4882a593Smuzhiyun 			__func__, sta->macid,
367*4882a593Smuzhiyun 			sta->mac_addr[0], sta->mac_addr[1], sta->mac_addr[2],
368*4882a593Smuzhiyun 			sta->mac_addr[3], sta->mac_addr[4], sta->mac_addr[5]);
369*4882a593Smuzhiyun 	}
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun 	hsts = rtw_hal_role_cfg(phl_info->hal, wrole);
372*4882a593Smuzhiyun 	if(hsts != RTW_HAL_STATUS_SUCCESS) {
373*4882a593Smuzhiyun 		PHL_ERR("%s hal role cfg failed\n", __func__);
374*4882a593Smuzhiyun 		_os_warn_on(1);
375*4882a593Smuzhiyun 		goto _exit;
376*4882a593Smuzhiyun 	}
377*4882a593Smuzhiyun 	wrole->active = true;
378*4882a593Smuzhiyun 	_phl_role_notify(phl_info, wrole, PHL_ROLE_START);
379*4882a593Smuzhiyun 	psts = RTW_PHL_STATUS_SUCCESS;
380*4882a593Smuzhiyun 	return psts;
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun _exit:
383*4882a593Smuzhiyun 	return psts;
384*4882a593Smuzhiyun }
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun static enum rtw_phl_status
_phl_wifi_role_free_sw(struct phl_info_t * phl_info,struct rtw_wifi_role_t * wrole)387*4882a593Smuzhiyun _phl_wifi_role_free_sw(struct phl_info_t *phl_info, struct rtw_wifi_role_t *wrole)
388*4882a593Smuzhiyun {
389*4882a593Smuzhiyun 	struct rtw_phl_com_t *phl_com = phl_info->phl_com;
390*4882a593Smuzhiyun 	struct mr_ctl_t *mr_ctl = phlcom_to_mr_ctrl(phl_com);
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun 	_phl_free_hw_resource(phl_info, wrole);
393*4882a593Smuzhiyun 	_os_mem_set(phl_to_drvpriv(phl_info), wrole->mac_addr, 0, MAC_ALEN);
394*4882a593Smuzhiyun 	_os_spinlock(phl_to_drvpriv(phl_info), &mr_ctl->lock, _ps, NULL);
395*4882a593Smuzhiyun 	mr_ctl->role_map &= ~BIT(wrole->id);
396*4882a593Smuzhiyun 	_os_spinunlock(phl_to_drvpriv(phl_info), &mr_ctl->lock, _ps, NULL);
397*4882a593Smuzhiyun 	wrole->active = false;
398*4882a593Smuzhiyun 	wrole->mstate = MLME_NO_LINK;
399*4882a593Smuzhiyun 	wrole->type = PHL_RTYPE_NONE;
400*4882a593Smuzhiyun 	return RTW_PHL_STATUS_SUCCESS;
401*4882a593Smuzhiyun }
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun #ifdef CONFIG_CMD_DISP
404*4882a593Smuzhiyun struct wr_start_param {
405*4882a593Smuzhiyun 	struct rtw_wifi_role_t *wrole;
406*4882a593Smuzhiyun 	struct rtw_phl_stainfo_t *sta;
407*4882a593Smuzhiyun };
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun enum rtw_phl_status
phl_wifi_role_start_hdl(struct phl_info_t * phl_info,u8 * param)410*4882a593Smuzhiyun phl_wifi_role_start_hdl(struct phl_info_t *phl_info, u8 *param)
411*4882a593Smuzhiyun {
412*4882a593Smuzhiyun 	struct wr_start_param *cmd_wr = (struct wr_start_param *)param;
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun 	return _phl_wifi_role_start(phl_info, cmd_wr->wrole, cmd_wr->sta);
415*4882a593Smuzhiyun }
416*4882a593Smuzhiyun 
phl_wifi_role_start_done(void * drv_priv,u8 * cmd,u32 cmd_len,enum rtw_phl_status status)417*4882a593Smuzhiyun void phl_wifi_role_start_done(void *drv_priv, u8 *cmd, u32 cmd_len,
418*4882a593Smuzhiyun 						enum rtw_phl_status status)
419*4882a593Smuzhiyun {
420*4882a593Smuzhiyun 	if (cmd) {
421*4882a593Smuzhiyun 		_os_kmem_free(drv_priv, cmd, cmd_len);
422*4882a593Smuzhiyun 		cmd = NULL;
423*4882a593Smuzhiyun 		PHL_INFO("%s.....\n", __func__);
424*4882a593Smuzhiyun 	}
425*4882a593Smuzhiyun }
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun enum rtw_phl_status
phl_wifi_role_start(struct phl_info_t * phl_info,struct rtw_wifi_role_t * wrole,struct rtw_phl_stainfo_t * sta)428*4882a593Smuzhiyun phl_wifi_role_start(struct phl_info_t *phl_info,
429*4882a593Smuzhiyun 				struct rtw_wifi_role_t *wrole,
430*4882a593Smuzhiyun 				struct rtw_phl_stainfo_t *sta)
431*4882a593Smuzhiyun {
432*4882a593Smuzhiyun 	enum rtw_phl_status psts = RTW_PHL_STATUS_FAILURE;
433*4882a593Smuzhiyun 	struct wr_start_param *wr_start = NULL;
434*4882a593Smuzhiyun 	void *drv = phl_to_drvpriv(phl_info);
435*4882a593Smuzhiyun 	u32 wr_start_len;
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun 	wr_start_len = sizeof(struct wr_start_param);
438*4882a593Smuzhiyun 	wr_start = _os_kmem_alloc(drv, wr_start_len);
439*4882a593Smuzhiyun 	if (wr_start == NULL) {
440*4882a593Smuzhiyun 		PHL_ERR("%s: alloc wr_start_param failed!\n", __func__);
441*4882a593Smuzhiyun 		psts = RTW_PHL_STATUS_RESOURCE;
442*4882a593Smuzhiyun 		goto _exit;
443*4882a593Smuzhiyun 	}
444*4882a593Smuzhiyun 	wr_start->wrole = wrole;
445*4882a593Smuzhiyun 	wr_start->sta = sta;
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun 	psts = phl_cmd_enqueue(phl_info,
448*4882a593Smuzhiyun 				wrole->hw_band,
449*4882a593Smuzhiyun 				MSG_EVT_ROLE_START,
450*4882a593Smuzhiyun 				(u8*)wr_start,
451*4882a593Smuzhiyun 				wr_start_len,
452*4882a593Smuzhiyun 				phl_wifi_role_start_done,
453*4882a593Smuzhiyun 				PHL_CMD_WAIT,
454*4882a593Smuzhiyun 				0);
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun 	if (is_cmd_failure(psts)) {
457*4882a593Smuzhiyun 		/* Send cmd success, but wait cmd fail*/
458*4882a593Smuzhiyun 		psts = RTW_PHL_STATUS_FAILURE;
459*4882a593Smuzhiyun 		PHL_INFO("%s wr-id:%d failure\n", __func__, wrole->id);
460*4882a593Smuzhiyun 	} else if (psts != RTW_PHL_STATUS_SUCCESS) {
461*4882a593Smuzhiyun 		/* Send cmd fail */
462*4882a593Smuzhiyun 		_os_kmem_free(drv, wr_start, wr_start_len);
463*4882a593Smuzhiyun 		psts = RTW_PHL_STATUS_FAILURE;
464*4882a593Smuzhiyun 		PHL_INFO("%s wr-id:%d failure\n", __func__, wrole->id);
465*4882a593Smuzhiyun 	} else {
466*4882a593Smuzhiyun 		PHL_INFO("%s wr-id:%d success\n", __func__, wrole->id);
467*4882a593Smuzhiyun 	}
468*4882a593Smuzhiyun 
469*4882a593Smuzhiyun _exit:
470*4882a593Smuzhiyun 	return psts;
471*4882a593Smuzhiyun }
472*4882a593Smuzhiyun #else
473*4882a593Smuzhiyun enum rtw_phl_status
phl_wifi_role_start(struct phl_info_t * phl_info,struct rtw_wifi_role_t * wrole,struct rtw_phl_stainfo_t * sta)474*4882a593Smuzhiyun phl_wifi_role_start(struct phl_info_t *phl_info,
475*4882a593Smuzhiyun 				struct rtw_wifi_role_t *wrole,
476*4882a593Smuzhiyun 				struct rtw_phl_stainfo_t *sta)
477*4882a593Smuzhiyun {
478*4882a593Smuzhiyun 	return _phl_wifi_role_start(phl_info, wrole, sta);
479*4882a593Smuzhiyun }
480*4882a593Smuzhiyun #endif
481*4882a593Smuzhiyun 
rtw_phl_wifi_role_alloc(void * phl,u8 * mac_addr,enum role_type type,u8 ridx,struct rtw_wifi_role_t ** wifi_role,bool ignore_hw_fail)482*4882a593Smuzhiyun u8 rtw_phl_wifi_role_alloc(void *phl, u8 *mac_addr, enum role_type type,
483*4882a593Smuzhiyun 				u8 ridx, struct rtw_wifi_role_t **wifi_role, bool ignore_hw_fail)
484*4882a593Smuzhiyun {
485*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
486*4882a593Smuzhiyun 	struct rtw_phl_com_t *phl_com = phl_info->phl_com;
487*4882a593Smuzhiyun 	u8 role_idx = INVALID_WIFI_ROLE_IDX;
488*4882a593Smuzhiyun 	struct rtw_wifi_role_t *role = NULL;
489*4882a593Smuzhiyun 	struct rtw_phl_stainfo_t *phl_sta = NULL;
490*4882a593Smuzhiyun 	enum rtw_phl_status psts = RTW_PHL_STATUS_FAILURE;
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun 	if (mac_addr == NULL) {
493*4882a593Smuzhiyun 		PHL_ERR("%s mac_addr == NULL\n", __func__);
494*4882a593Smuzhiyun 		goto _exit;
495*4882a593Smuzhiyun 	}
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun 	/*search rid by mac_addr, if had assigned then return role index*/
498*4882a593Smuzhiyun 	role_idx = _phl_search_roleidx_by_addr(phl_info, mac_addr);
499*4882a593Smuzhiyun 	if (role_idx != INVALID_WIFI_ROLE_IDX) {
500*4882a593Smuzhiyun 		PHL_INFO("%s wifi-role(%d) had allociated\n", __func__, role_idx);
501*4882a593Smuzhiyun 		*wifi_role = &phl_com->wifi_roles[role_idx];
502*4882a593Smuzhiyun 		goto _exit;
503*4882a593Smuzhiyun 	}
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun 	role = _phl_wifi_role_alloc_sw(phl_info, mac_addr, type, ridx);
506*4882a593Smuzhiyun 	if (role == NULL) {
507*4882a593Smuzhiyun 		PHL_ERR("%s role alloc sw failed\n", __func__);
508*4882a593Smuzhiyun 		_os_warn_on(1);
509*4882a593Smuzhiyun 		goto _exit;
510*4882a593Smuzhiyun 	}
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun 	/*alloc sta_info for self*/
513*4882a593Smuzhiyun 	phl_sta = phl_alloc_stainfo_sw(phl_info, role->mac_addr, role);
514*4882a593Smuzhiyun 	if (phl_sta == NULL) {
515*4882a593Smuzhiyun 		PHL_ERR("%s can't alloc self stainfo_sw\n", __func__);
516*4882a593Smuzhiyun 		_os_warn_on(1);
517*4882a593Smuzhiyun 		goto _err_stainfo_sw;
518*4882a593Smuzhiyun 	}
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun 	psts = phl_wifi_role_start(phl_info, role, phl_sta);
521*4882a593Smuzhiyun 	if (psts != RTW_PHL_STATUS_SUCCESS) {
522*4882a593Smuzhiyun 		PHL_ERR("%s role start failed\n", __func__);
523*4882a593Smuzhiyun 		if (!ignore_hw_fail) {
524*4882a593Smuzhiyun 			_os_warn_on(1);
525*4882a593Smuzhiyun 			goto _err_role_start;
526*4882a593Smuzhiyun 		}
527*4882a593Smuzhiyun 	}
528*4882a593Smuzhiyun 
529*4882a593Smuzhiyun 	*wifi_role = role;
530*4882a593Smuzhiyun 	role_idx = role->id;
531*4882a593Smuzhiyun 	PHL_DUMP_MR_EX(phl_info);
532*4882a593Smuzhiyun 	return role_idx;
533*4882a593Smuzhiyun 
534*4882a593Smuzhiyun _err_role_start:
535*4882a593Smuzhiyun 	phl_wifi_role_free_stainfo_sw(phl_info, role);
536*4882a593Smuzhiyun 
537*4882a593Smuzhiyun _err_stainfo_sw:
538*4882a593Smuzhiyun 	_phl_wifi_role_free_sw(phl_info, role);
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun _exit:
541*4882a593Smuzhiyun 	return role_idx;
542*4882a593Smuzhiyun }
543*4882a593Smuzhiyun 
544*4882a593Smuzhiyun enum rtw_phl_status
phl_role_noa_notify(struct phl_info_t * phl_info,struct rtw_wifi_role_t * wrole)545*4882a593Smuzhiyun phl_role_noa_notify(struct phl_info_t *phl_info, struct rtw_wifi_role_t *wrole)
546*4882a593Smuzhiyun {
547*4882a593Smuzhiyun 	_phl_role_notify(phl_info, wrole, PHL_ROLE_UPDATE_NOA);
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun 	return RTW_PHL_STATUS_SUCCESS;
550*4882a593Smuzhiyun }
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun enum rtw_phl_status
phl_role_ap_client_notify(struct phl_info_t * phl_info,struct rtw_wifi_role_t * wrole,u8 link_sts)553*4882a593Smuzhiyun phl_role_ap_client_notify(struct phl_info_t *phl_info,
554*4882a593Smuzhiyun 			struct rtw_wifi_role_t *wrole, u8 link_sts)
555*4882a593Smuzhiyun {
556*4882a593Smuzhiyun 	enum role_state rstate;
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun 	if (link_sts == MLME_LINKING)
559*4882a593Smuzhiyun 		rstate = PHL_ROLE_MSTS_STA_CONN_START;
560*4882a593Smuzhiyun 	else if (link_sts == MLME_LINKED)
561*4882a593Smuzhiyun 		rstate = PHL_ROLE_MSTS_STA_CONN_END;
562*4882a593Smuzhiyun 	else
563*4882a593Smuzhiyun 		rstate = PHL_ROLE_MSTS_STA_DIS_CONN;
564*4882a593Smuzhiyun 
565*4882a593Smuzhiyun 	_phl_role_notify(phl_info, wrole, rstate);
566*4882a593Smuzhiyun #ifdef CONFIG_MCC_SUPPORT
567*4882a593Smuzhiyun 	phl_mcc_client_link_notify_for_ap(phl_info, wrole, rstate);
568*4882a593Smuzhiyun #endif /* CONFIG_MCC_SUPPORT */
569*4882a593Smuzhiyun 	return RTW_PHL_STATUS_SUCCESS;
570*4882a593Smuzhiyun }
571*4882a593Smuzhiyun 
572*4882a593Smuzhiyun enum rtw_phl_status
phl_role_notify(struct phl_info_t * phl_info,struct rtw_wifi_role_t * wrole)573*4882a593Smuzhiyun phl_role_notify(struct phl_info_t *phl_info, struct rtw_wifi_role_t *wrole)
574*4882a593Smuzhiyun {
575*4882a593Smuzhiyun 	enum role_state rstate = PHL_ROLE_STATE_UNKNOWN;
576*4882a593Smuzhiyun 
577*4882a593Smuzhiyun 	switch (wrole->type) {
578*4882a593Smuzhiyun 	case PHL_RTYPE_STATION:
579*4882a593Smuzhiyun 	case PHL_RTYPE_P2P_GC:
580*4882a593Smuzhiyun 	{
581*4882a593Smuzhiyun 		if (wrole->mstate == MLME_LINKING)
582*4882a593Smuzhiyun 			rstate = PHL_ROLE_MSTS_STA_CONN_START;
583*4882a593Smuzhiyun 		else if (wrole->mstate == MLME_LINKED)
584*4882a593Smuzhiyun 			rstate = PHL_ROLE_MSTS_STA_CONN_END;
585*4882a593Smuzhiyun 		else
586*4882a593Smuzhiyun 			rstate = PHL_ROLE_MSTS_STA_DIS_CONN;
587*4882a593Smuzhiyun 	}
588*4882a593Smuzhiyun 	break;
589*4882a593Smuzhiyun 
590*4882a593Smuzhiyun 	case PHL_RTYPE_AP:
591*4882a593Smuzhiyun 	case PHL_RTYPE_VAP:
592*4882a593Smuzhiyun 	case PHL_RTYPE_MESH:
593*4882a593Smuzhiyun 	case PHL_RTYPE_P2P_GO:
594*4882a593Smuzhiyun 	{
595*4882a593Smuzhiyun 		rstate = (wrole->mstate == MLME_NO_LINK)
596*4882a593Smuzhiyun 			? PHL_ROLE_MSTS_AP_STOP
597*4882a593Smuzhiyun 			: PHL_ROLE_MSTS_AP_START;
598*4882a593Smuzhiyun 	}
599*4882a593Smuzhiyun 	break;
600*4882a593Smuzhiyun 
601*4882a593Smuzhiyun 	case PHL_RTYPE_NONE:
602*4882a593Smuzhiyun 	case PHL_RTYPE_ADHOC:
603*4882a593Smuzhiyun 	case PHL_RTYPE_ADHOC_MASTER:
604*4882a593Smuzhiyun 	case PHL_RTYPE_MONITOR:
605*4882a593Smuzhiyun 	case PHL_RTYPE_P2P_DEVICE:
606*4882a593Smuzhiyun 	case PHL_RTYPE_NAN:
607*4882a593Smuzhiyun 	case PHL_MLME_MAX:
608*4882a593Smuzhiyun 		PHL_TRACE(COMP_PHL_DBG, _PHL_ERR_,
609*4882a593Smuzhiyun 			"%s: Unsupported case:%d in wrole notify, please check it\n",
610*4882a593Smuzhiyun 			__func__, wrole->type);
611*4882a593Smuzhiyun 		break;
612*4882a593Smuzhiyun 	default:
613*4882a593Smuzhiyun 		PHL_TRACE(COMP_PHL_DBG, _PHL_ERR_,
614*4882a593Smuzhiyun 			"%s role-type(%d) not support\n",
615*4882a593Smuzhiyun 			__func__, wrole->type);
616*4882a593Smuzhiyun 		break;
617*4882a593Smuzhiyun 	}
618*4882a593Smuzhiyun 
619*4882a593Smuzhiyun 	_phl_role_notify(phl_info, wrole, rstate);
620*4882a593Smuzhiyun 	return RTW_PHL_STATUS_SUCCESS;
621*4882a593Smuzhiyun }
622*4882a593Smuzhiyun 
623*4882a593Smuzhiyun 
624*4882a593Smuzhiyun /**
625*4882a593Smuzhiyun  * This function is called once wifi info changed
626*4882a593Smuzhiyun  * (see enum wr_chg_id)
627*4882a593Smuzhiyun  * @phl: see phl_info_t
628*4882a593Smuzhiyun  * @wrole: information is updated for this wifi role
629*4882a593Smuzhiyun  * @chg_id: see enum wr_chg_id
630*4882a593Smuzhiyun  * @chg_info: the change info to be update
631*4882a593Smuzhiyun  */
632*4882a593Smuzhiyun enum rtw_phl_status
phl_wifi_role_change(struct phl_info_t * phl_info,struct rtw_wifi_role_t * wrole,enum wr_chg_id chg_id,void * chg_info)633*4882a593Smuzhiyun phl_wifi_role_change(struct phl_info_t *phl_info,
634*4882a593Smuzhiyun 				struct rtw_wifi_role_t *wrole,
635*4882a593Smuzhiyun 				enum wr_chg_id chg_id, void *chg_info)
636*4882a593Smuzhiyun {
637*4882a593Smuzhiyun 	enum rtw_phl_status pstate = RTW_PHL_STATUS_FAILURE;
638*4882a593Smuzhiyun 	enum rtw_hal_status hstate;
639*4882a593Smuzhiyun 
640*4882a593Smuzhiyun 	struct rtw_phl_stainfo_t *sta = NULL;
641*4882a593Smuzhiyun 	enum phl_upd_mode mode = PHL_UPD_ROLE_MAX;
642*4882a593Smuzhiyun 	void *drv = phl_to_drvpriv(phl_info);
643*4882a593Smuzhiyun 
644*4882a593Smuzhiyun 	switch (chg_id) {
645*4882a593Smuzhiyun 	case WR_CHG_TYPE:
646*4882a593Smuzhiyun 	{
647*4882a593Smuzhiyun 		enum role_type type = *(enum role_type *)chg_info;
648*4882a593Smuzhiyun 
649*4882a593Smuzhiyun 		if (wrole->type == type) {
650*4882a593Smuzhiyun 			PHL_WARN("wrole type(%d) not change\n", wrole->type);
651*4882a593Smuzhiyun 			pstate = RTW_PHL_STATUS_SUCCESS;
652*4882a593Smuzhiyun 			return pstate;
653*4882a593Smuzhiyun 		}
654*4882a593Smuzhiyun 		PHL_INFO("wrole type(%d) change to type(%d)\n",
655*4882a593Smuzhiyun 							wrole->type, type);
656*4882a593Smuzhiyun 
657*4882a593Smuzhiyun 		sta = rtw_phl_get_stainfo_self(phl_info, wrole);
658*4882a593Smuzhiyun 		if (sta) {
659*4882a593Smuzhiyun 			if (type == PHL_RTYPE_TDLS || wrole->type == PHL_RTYPE_TDLS) {
660*4882a593Smuzhiyun 				wrole->type = type;
661*4882a593Smuzhiyun 				pstate = RTW_PHL_STATUS_SUCCESS;
662*4882a593Smuzhiyun 			}
663*4882a593Smuzhiyun 			else {
664*4882a593Smuzhiyun 				wrole->type = type;
665*4882a593Smuzhiyun 				wrole->mstate = MLME_NO_LINK;
666*4882a593Smuzhiyun 
667*4882a593Smuzhiyun 				#ifdef RTW_WKARD_STA_BCN_INTERVAL
668*4882a593Smuzhiyun 				#ifdef RTW_PHL_BCN
669*4882a593Smuzhiyun 				if (wrole->type == PHL_RTYPE_AP) {
670*4882a593Smuzhiyun 					wrole->bcn_cmn.bcn_interval = 100;
671*4882a593Smuzhiyun 					wrole->mstate = MLME_LINKED;
672*4882a593Smuzhiyun 					wrole->hiq_win = 16; /* unit: ms */
673*4882a593Smuzhiyun 				}
674*4882a593Smuzhiyun 				#endif
675*4882a593Smuzhiyun 				#endif
676*4882a593Smuzhiyun 				phl_init_role_cap(phl_info, wrole);
677*4882a593Smuzhiyun 				phl_init_protocol_cap(phl_info, wrole);
678*4882a593Smuzhiyun 
679*4882a593Smuzhiyun 				rtw_hal_role_cfg(phl_info->hal, wrole);
680*4882a593Smuzhiyun 
681*4882a593Smuzhiyun 				mode = PHL_UPD_ROLE_TYPE_CHANGE;
682*4882a593Smuzhiyun 				_os_mem_cpy(drv, sta->mac_addr, wrole->mac_addr, MAC_ALEN);
683*4882a593Smuzhiyun 				pstate = phl_change_stainfo(phl_info, sta, mode);
684*4882a593Smuzhiyun 				/*rtw_hal_change_sta_entry(phl_info->hal, sta);*/
685*4882a593Smuzhiyun 				_phl_role_notify(phl_info, wrole, PHL_ROLE_CHG_TYPE);
686*4882a593Smuzhiyun 			}
687*4882a593Smuzhiyun 		}
688*4882a593Smuzhiyun 		else {
689*4882a593Smuzhiyun 			PHL_ERR("cannot get stainfo_self\n");
690*4882a593Smuzhiyun 		}
691*4882a593Smuzhiyun 		PHL_DUMP_MR_EX(phl_info);
692*4882a593Smuzhiyun 	}
693*4882a593Smuzhiyun 		break;
694*4882a593Smuzhiyun 	case WR_CHG_MADDR:
695*4882a593Smuzhiyun 	{
696*4882a593Smuzhiyun 		u8 *maddr = (u8 *)chg_info;
697*4882a593Smuzhiyun 
698*4882a593Smuzhiyun 		if(_os_mem_cmp(drv, wrole->mac_addr, maddr,  MAC_ALEN) == 0) {
699*4882a593Smuzhiyun 			PHL_WARN("wrole maddr %02x:%02x:%02x:%02x:%02x:%02x not change\n",
700*4882a593Smuzhiyun 			         maddr[0], maddr[1], maddr[2],
701*4882a593Smuzhiyun 			         maddr[3], maddr[4], maddr[5]);
702*4882a593Smuzhiyun 			return RTW_PHL_STATUS_SUCCESS;
703*4882a593Smuzhiyun 		}
704*4882a593Smuzhiyun 		PHL_INFO("wrole maddr %02x:%02x:%02x:%02x:%02x:%02x change to %02x:%02x:%02x:%02x:%02x:%02x\n",
705*4882a593Smuzhiyun 		         wrole->mac_addr[0], wrole->mac_addr[1],
706*4882a593Smuzhiyun 		         wrole->mac_addr[2], wrole->mac_addr[3],
707*4882a593Smuzhiyun 		         wrole->mac_addr[4], wrole->mac_addr[5],
708*4882a593Smuzhiyun 		         maddr[0], maddr[1], maddr[2],
709*4882a593Smuzhiyun 		         maddr[3], maddr[4], maddr[5]);
710*4882a593Smuzhiyun 
711*4882a593Smuzhiyun 		_os_mem_cpy(drv, wrole->mac_addr, maddr, MAC_ALEN);
712*4882a593Smuzhiyun 		sta = rtw_phl_get_stainfo_self(phl_info, wrole);
713*4882a593Smuzhiyun 		if (sta) {
714*4882a593Smuzhiyun 			mode = PHL_UPD_ROLE_INFO_CHANGE;
715*4882a593Smuzhiyun 			_os_mem_cpy(drv, sta->mac_addr, wrole->mac_addr, MAC_ALEN);
716*4882a593Smuzhiyun 			pstate = phl_change_stainfo(phl_info, sta, mode);
717*4882a593Smuzhiyun 			/*rtw_hal_change_sta_entry(phl_info->hal, sta);*/
718*4882a593Smuzhiyun 		}
719*4882a593Smuzhiyun 	}
720*4882a593Smuzhiyun 		break;
721*4882a593Smuzhiyun 	case WR_CHG_AP_PARAM:
722*4882a593Smuzhiyun 	{
723*4882a593Smuzhiyun 		struct rtw_ap_param *param = (struct rtw_ap_param *)chg_info;
724*4882a593Smuzhiyun 
725*4882a593Smuzhiyun 		if (wrole->type != PHL_RTYPE_AP)
726*4882a593Smuzhiyun 			break;
727*4882a593Smuzhiyun 
728*4882a593Smuzhiyun 		if (param->cfg_id == CFG_BSS_CLR) {
729*4882a593Smuzhiyun 			u32 bsscolor = param->value;
730*4882a593Smuzhiyun 
731*4882a593Smuzhiyun 			wrole->proto_role_cap.bsscolor = (u8)bsscolor;
732*4882a593Smuzhiyun 			rtw_hal_role_cfg_ex(phl_info->hal, wrole, PCFG_BSS_CLR, &bsscolor);
733*4882a593Smuzhiyun 		}
734*4882a593Smuzhiyun 		/* else if (param->cfg_id == CFG_HIQ_DTIM) */
735*4882a593Smuzhiyun 		else {
736*4882a593Smuzhiyun 			PHL_INFO("wrole->type(%d) WR_CHG_AP_PARAM todo.....\n", wrole->type);
737*4882a593Smuzhiyun 		}
738*4882a593Smuzhiyun 
739*4882a593Smuzhiyun 		pstate = RTW_PHL_STATUS_SUCCESS;
740*4882a593Smuzhiyun 	}
741*4882a593Smuzhiyun 		break;
742*4882a593Smuzhiyun 	case WR_CHG_EDCA_PARAM:
743*4882a593Smuzhiyun 	{
744*4882a593Smuzhiyun 		struct rtw_edca_param *param = (struct rtw_edca_param*)chg_info;
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun 		hstate = rtw_hal_set_edca(phl_info->hal, wrole, param->ac,
747*4882a593Smuzhiyun 						param->param);
748*4882a593Smuzhiyun 		if (hstate == RTW_HAL_STATUS_SUCCESS)
749*4882a593Smuzhiyun 			pstate = RTW_PHL_STATUS_SUCCESS;
750*4882a593Smuzhiyun 	}
751*4882a593Smuzhiyun 		break;
752*4882a593Smuzhiyun 	case WR_CHG_MU_EDCA_PARAM:
753*4882a593Smuzhiyun 	{
754*4882a593Smuzhiyun 		struct rtw_mu_edca_param *param = (struct rtw_mu_edca_param*)chg_info;
755*4882a593Smuzhiyun 		hstate = rtw_hal_set_mu_edca(phl_info->hal, wrole->hw_band, param->ac,
756*4882a593Smuzhiyun 					param->timer, (param->cw & 0x0f), (param->cw>>4),
757*4882a593Smuzhiyun 					param->aifsn);
758*4882a593Smuzhiyun 		if (hstate == RTW_HAL_STATUS_SUCCESS)
759*4882a593Smuzhiyun 			pstate = RTW_PHL_STATUS_SUCCESS;
760*4882a593Smuzhiyun 	}
761*4882a593Smuzhiyun 		break;
762*4882a593Smuzhiyun 	case WR_CHG_MU_EDCA_CFG:
763*4882a593Smuzhiyun 	{
764*4882a593Smuzhiyun 		u8 val = *(u8 *)chg_info;
765*4882a593Smuzhiyun 		hstate = rtw_hal_set_mu_edca_ctrl(phl_info->hal,
766*4882a593Smuzhiyun 					wrole->hw_band, wrole->hw_wmm, val);
767*4882a593Smuzhiyun 		if (hstate == RTW_HAL_STATUS_SUCCESS)
768*4882a593Smuzhiyun 			pstate = RTW_PHL_STATUS_SUCCESS;
769*4882a593Smuzhiyun 	}
770*4882a593Smuzhiyun 		break;
771*4882a593Smuzhiyun 	case WR_CHG_BSS_COLOR:
772*4882a593Smuzhiyun 	{
773*4882a593Smuzhiyun 		u32 val = *(u8 *)chg_info;
774*4882a593Smuzhiyun 		hstate = rtw_hal_role_cfg_ex(phl_info->hal, wrole, PCFG_BSS_CLR, &val);
775*4882a593Smuzhiyun 		if (hstate == RTW_HAL_STATUS_SUCCESS)
776*4882a593Smuzhiyun 			pstate = RTW_PHL_STATUS_SUCCESS;
777*4882a593Smuzhiyun 	}
778*4882a593Smuzhiyun 		break;
779*4882a593Smuzhiyun 	case WR_CHG_RTS_TH:
780*4882a593Smuzhiyun 	{
781*4882a593Smuzhiyun 		struct rtw_rts_threshold *val =
782*4882a593Smuzhiyun 				(struct rtw_rts_threshold *)chg_info;
783*4882a593Smuzhiyun 
784*4882a593Smuzhiyun 		hstate = rtw_hal_config_rts_th(phl_info->hal,
785*4882a593Smuzhiyun 					       wrole->hw_band,
786*4882a593Smuzhiyun 					       val->rts_time_th,
787*4882a593Smuzhiyun 					       val->rts_len_th);
788*4882a593Smuzhiyun 		if (hstate == RTW_HAL_STATUS_SUCCESS)
789*4882a593Smuzhiyun 			pstate = RTW_PHL_STATUS_SUCCESS;
790*4882a593Smuzhiyun 	}
791*4882a593Smuzhiyun 	break;
792*4882a593Smuzhiyun 	case WR_CHG_DFS_HE_TB_CFG:
793*4882a593Smuzhiyun 	{
794*4882a593Smuzhiyun 		u8 val = *(u8 *)chg_info;
795*4882a593Smuzhiyun 
796*4882a593Smuzhiyun 		hstate = rtw_hal_set_dfs_tb_ctrl(phl_info->hal, val);
797*4882a593Smuzhiyun 		if (hstate == RTW_HAL_STATUS_SUCCESS)
798*4882a593Smuzhiyun 			pstate = RTW_PHL_STATUS_SUCCESS;
799*4882a593Smuzhiyun 	}
800*4882a593Smuzhiyun 	break;
801*4882a593Smuzhiyun 	case WR_CHG_TRX_PATH:
802*4882a593Smuzhiyun 	{
803*4882a593Smuzhiyun 		struct rtw_trx_path_param *param = (struct rtw_trx_path_param*)chg_info;
804*4882a593Smuzhiyun 
805*4882a593Smuzhiyun 		hstate = rtw_hal_cfg_trx_path(phl_info->hal,
806*4882a593Smuzhiyun 					      param->tx,
807*4882a593Smuzhiyun 					      param->tx_nss,
808*4882a593Smuzhiyun 					      param->rx,
809*4882a593Smuzhiyun 					      param->rx_nss);
810*4882a593Smuzhiyun 
811*4882a593Smuzhiyun 		if (hstate == RTW_HAL_STATUS_SUCCESS)
812*4882a593Smuzhiyun 			pstate = RTW_PHL_STATUS_SUCCESS;
813*4882a593Smuzhiyun 	}
814*4882a593Smuzhiyun 	break;
815*4882a593Smuzhiyun 	case WR_CHG_STBC_CFG:
816*4882a593Smuzhiyun 	{
817*4882a593Smuzhiyun 		phl_init_proto_stbc_cap(wrole, phl_info, &wrole->proto_role_cap);
818*4882a593Smuzhiyun 	}
819*4882a593Smuzhiyun 	break;
820*4882a593Smuzhiyun 	case WR_CHG_MAX:
821*4882a593Smuzhiyun 		PHL_TRACE(COMP_PHL_DBG, _PHL_ERR_,
822*4882a593Smuzhiyun 				"%s: Unsupported case:%d, please check it\n",
823*4882a593Smuzhiyun 				__func__, chg_id);
824*4882a593Smuzhiyun 		break;
825*4882a593Smuzhiyun 	default :
826*4882a593Smuzhiyun 		PHL_TRACE(COMP_PHL_DBG, _PHL_ERR_,
827*4882a593Smuzhiyun 				"%s: unknown chg_id(%d), please check it\n",
828*4882a593Smuzhiyun 				__func__, chg_id);
829*4882a593Smuzhiyun 		break;
830*4882a593Smuzhiyun 	};
831*4882a593Smuzhiyun 	return pstate;
832*4882a593Smuzhiyun }
833*4882a593Smuzhiyun 
834*4882a593Smuzhiyun #ifdef CONFIG_CMD_DISP
835*4882a593Smuzhiyun struct wr_chg_param {
836*4882a593Smuzhiyun 	struct rtw_wifi_role_t *wrole;
837*4882a593Smuzhiyun 	enum wr_chg_id id;
838*4882a593Smuzhiyun 	u8 *info;
839*4882a593Smuzhiyun 	u8 info_len;
840*4882a593Smuzhiyun };
841*4882a593Smuzhiyun 
842*4882a593Smuzhiyun enum rtw_phl_status
phl_wifi_role_chg_hdl(struct phl_info_t * phl_info,u8 * param)843*4882a593Smuzhiyun phl_wifi_role_chg_hdl(struct phl_info_t *phl_info, u8 *param)
844*4882a593Smuzhiyun {
845*4882a593Smuzhiyun 	struct wr_chg_param *wr_chg = (struct wr_chg_param *)param;
846*4882a593Smuzhiyun 
847*4882a593Smuzhiyun 	return phl_wifi_role_change(phl_info, wr_chg->wrole, wr_chg->id, wr_chg->info);
848*4882a593Smuzhiyun }
849*4882a593Smuzhiyun 
phl_wifi_role_chg_done(void * drv_priv,u8 * cmd,u32 cmd_len,enum rtw_phl_status status)850*4882a593Smuzhiyun void phl_wifi_role_chg_done(void *drv_priv, u8 *cmd, u32 cmd_len,
851*4882a593Smuzhiyun 						enum rtw_phl_status status)
852*4882a593Smuzhiyun {
853*4882a593Smuzhiyun 	struct wr_chg_param *wr_chg = NULL;
854*4882a593Smuzhiyun 
855*4882a593Smuzhiyun 	if (cmd == NULL || cmd_len == 0) {
856*4882a593Smuzhiyun 		PHL_ERR("%s buf == NULL || buf_len == 0\n", __func__);
857*4882a593Smuzhiyun 		_os_warn_on(1);
858*4882a593Smuzhiyun 		return;
859*4882a593Smuzhiyun 	}
860*4882a593Smuzhiyun 
861*4882a593Smuzhiyun 	wr_chg = (struct wr_chg_param *)cmd;
862*4882a593Smuzhiyun 	PHL_INFO("%s - id:%d .....\n", __func__, wr_chg->id);
863*4882a593Smuzhiyun 
864*4882a593Smuzhiyun 	if (wr_chg->info)
865*4882a593Smuzhiyun 		_os_kmem_free(drv_priv, wr_chg->info, wr_chg->info_len);
866*4882a593Smuzhiyun 
867*4882a593Smuzhiyun 	_os_kmem_free(drv_priv, cmd, cmd_len);
868*4882a593Smuzhiyun 	cmd = NULL;
869*4882a593Smuzhiyun }
870*4882a593Smuzhiyun 
871*4882a593Smuzhiyun enum rtw_phl_status
rtw_phl_cmd_wrole_change(void * phl,struct rtw_wifi_role_t * wrole,enum wr_chg_id chg_id,u8 * chg_info,u8 chg_info_len,enum phl_cmd_type cmd_type,u32 cmd_timeout)872*4882a593Smuzhiyun rtw_phl_cmd_wrole_change(void *phl,
873*4882a593Smuzhiyun                          struct rtw_wifi_role_t *wrole,
874*4882a593Smuzhiyun                          enum wr_chg_id chg_id,
875*4882a593Smuzhiyun                          u8 *chg_info,
876*4882a593Smuzhiyun                          u8 chg_info_len,
877*4882a593Smuzhiyun                          enum phl_cmd_type cmd_type,
878*4882a593Smuzhiyun                          u32 cmd_timeout)
879*4882a593Smuzhiyun {
880*4882a593Smuzhiyun 
881*4882a593Smuzhiyun 	enum rtw_phl_status psts = RTW_PHL_STATUS_FAILURE;
882*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
883*4882a593Smuzhiyun 	void *drv = phl_to_drvpriv(phl_info);
884*4882a593Smuzhiyun 	struct wr_chg_param *wr_chg = NULL;
885*4882a593Smuzhiyun 	u32 wr_chg_len = 0;
886*4882a593Smuzhiyun 
887*4882a593Smuzhiyun 	if (cmd_type == PHL_CMD_DIRECTLY) {
888*4882a593Smuzhiyun 		psts = phl_wifi_role_change(phl_info, wrole, chg_id, chg_info);
889*4882a593Smuzhiyun 		goto _exit;
890*4882a593Smuzhiyun 	}
891*4882a593Smuzhiyun 
892*4882a593Smuzhiyun 	wr_chg_len = sizeof(struct wr_chg_param);
893*4882a593Smuzhiyun 	wr_chg = _os_kmem_alloc(drv, wr_chg_len);
894*4882a593Smuzhiyun 	if (wr_chg == NULL) {
895*4882a593Smuzhiyun 		PHL_ERR("%s: alloc wr_chg_param failed!\n", __func__);
896*4882a593Smuzhiyun 		psts = RTW_PHL_STATUS_RESOURCE;
897*4882a593Smuzhiyun 		goto _exit;
898*4882a593Smuzhiyun 	}
899*4882a593Smuzhiyun 	_os_mem_set(drv, wr_chg, 0, wr_chg_len);
900*4882a593Smuzhiyun 	wr_chg->wrole = wrole;
901*4882a593Smuzhiyun 	wr_chg->id = chg_id;
902*4882a593Smuzhiyun 
903*4882a593Smuzhiyun 	wr_chg->info_len = chg_info_len;
904*4882a593Smuzhiyun 	wr_chg->info = _os_kmem_alloc(drv, chg_info_len);
905*4882a593Smuzhiyun 	if (wr_chg->info == NULL) {
906*4882a593Smuzhiyun 		PHL_ERR("%s: alloc wr_chg_info failed!\n", __func__);
907*4882a593Smuzhiyun 		psts = RTW_PHL_STATUS_RESOURCE;
908*4882a593Smuzhiyun 		goto _err_info;
909*4882a593Smuzhiyun 	}
910*4882a593Smuzhiyun 	_os_mem_set(drv, wr_chg->info, 0, chg_info_len);
911*4882a593Smuzhiyun 	_os_mem_cpy(drv, wr_chg->info, chg_info, chg_info_len);
912*4882a593Smuzhiyun 
913*4882a593Smuzhiyun 	psts = phl_cmd_enqueue(phl_info,
914*4882a593Smuzhiyun 	                       wrole->hw_band,
915*4882a593Smuzhiyun 	                       MSG_EVT_ROLE_CHANGE,
916*4882a593Smuzhiyun 	                       (u8*)wr_chg,
917*4882a593Smuzhiyun 	                       wr_chg_len,
918*4882a593Smuzhiyun 	                       phl_wifi_role_chg_done,
919*4882a593Smuzhiyun 	                       cmd_type,
920*4882a593Smuzhiyun 	                       cmd_timeout);
921*4882a593Smuzhiyun 
922*4882a593Smuzhiyun 	if (is_cmd_failure(psts)) {
923*4882a593Smuzhiyun 		/* Send cmd success, but wait cmd fail*/
924*4882a593Smuzhiyun 		psts = RTW_PHL_STATUS_FAILURE;
925*4882a593Smuzhiyun 		PHL_INFO("%s wr-id:%d failure\n", __func__, wrole->id);
926*4882a593Smuzhiyun 	} else if (psts != RTW_PHL_STATUS_SUCCESS) {
927*4882a593Smuzhiyun 		/* Send cmd fail */
928*4882a593Smuzhiyun 		psts = RTW_PHL_STATUS_FAILURE;
929*4882a593Smuzhiyun 		PHL_INFO("%s wr-id:%d failure\n", __func__, wrole->id);
930*4882a593Smuzhiyun 		goto _err_cmd;
931*4882a593Smuzhiyun 	} else {
932*4882a593Smuzhiyun 		PHL_INFO("%s wr-id:%d success\n", __func__, wrole->id);
933*4882a593Smuzhiyun 	}
934*4882a593Smuzhiyun 
935*4882a593Smuzhiyun 	return psts;
936*4882a593Smuzhiyun 
937*4882a593Smuzhiyun _err_cmd:
938*4882a593Smuzhiyun 	if (wr_chg->info)
939*4882a593Smuzhiyun 		_os_kmem_free(drv, wr_chg->info, wr_chg->info_len);
940*4882a593Smuzhiyun _err_info:
941*4882a593Smuzhiyun 	if (wr_chg)
942*4882a593Smuzhiyun 		_os_kmem_free(drv, wr_chg, wr_chg_len);
943*4882a593Smuzhiyun _exit:
944*4882a593Smuzhiyun 	return psts;
945*4882a593Smuzhiyun }
946*4882a593Smuzhiyun 
947*4882a593Smuzhiyun #else
948*4882a593Smuzhiyun enum rtw_phl_status
rtw_phl_cmd_wrole_change(void * phl,struct rtw_wifi_role_t * wrole,enum wr_chg_id chg_id,u8 * chg_info,u8 chg_info_len,enum phl_cmd_type cmd_type,u32 cmd_timeout)949*4882a593Smuzhiyun rtw_phl_cmd_wrole_change(void *phl,
950*4882a593Smuzhiyun 			struct rtw_wifi_role_t *wrole,
951*4882a593Smuzhiyun 			enum wr_chg_id chg_id, u8 *chg_info, u8 chg_info_len,
952*4882a593Smuzhiyun 			enum phl_cmd_type cmd_type, u32 cmd_timeout)
953*4882a593Smuzhiyun {
954*4882a593Smuzhiyun 	return phl_wifi_role_change((struct phl_info_t *)phl, wrole, chg_id, chg_info);
955*4882a593Smuzhiyun }
956*4882a593Smuzhiyun #endif /*CONFIG_CMD_DISP*/
957*4882a593Smuzhiyun 
958*4882a593Smuzhiyun enum rtw_phl_status
_phl_wifi_role_stop(struct phl_info_t * phl_info,struct rtw_wifi_role_t * wrole)959*4882a593Smuzhiyun _phl_wifi_role_stop(struct phl_info_t *phl_info, struct rtw_wifi_role_t *wrole)
960*4882a593Smuzhiyun {
961*4882a593Smuzhiyun 	enum rtw_phl_status psts = RTW_PHL_STATUS_FAILURE;
962*4882a593Smuzhiyun 
963*4882a593Smuzhiyun 	wrole->active = false;
964*4882a593Smuzhiyun 	_phl_role_notify(phl_info, wrole, PHL_ROLE_STOP);
965*4882a593Smuzhiyun 	psts = phl_wifi_role_free_stainfo_hw(phl_info, wrole);
966*4882a593Smuzhiyun 	if (psts != RTW_PHL_STATUS_SUCCESS) {
967*4882a593Smuzhiyun 		PHL_ERR("%s wr free stainfo_hw failed\n", __func__);
968*4882a593Smuzhiyun 		_os_warn_on(1);
969*4882a593Smuzhiyun 	}
970*4882a593Smuzhiyun 
971*4882a593Smuzhiyun 	/*hw port cfg - mac_port_deinit*/
972*4882a593Smuzhiyun 	return psts;
973*4882a593Smuzhiyun }
974*4882a593Smuzhiyun #ifdef CONFIG_CMD_DISP
975*4882a593Smuzhiyun enum rtw_phl_status
phl_wifi_role_stop_hdl(struct phl_info_t * phl_info,u8 * param)976*4882a593Smuzhiyun phl_wifi_role_stop_hdl(struct phl_info_t *phl_info, u8 *param)
977*4882a593Smuzhiyun {
978*4882a593Smuzhiyun 	struct rtw_wifi_role_t *wrole = (struct rtw_wifi_role_t *)param;
979*4882a593Smuzhiyun 
980*4882a593Smuzhiyun 	return _phl_wifi_role_stop(phl_info, wrole);
981*4882a593Smuzhiyun }
phl_wifi_role_stop_done(void * drv_priv,u8 * cmd,u32 cmd_len,enum rtw_phl_status status)982*4882a593Smuzhiyun void phl_wifi_role_stop_done(void *drv_priv, u8 *cmd, u32 cmd_len,
983*4882a593Smuzhiyun 						enum rtw_phl_status status)
984*4882a593Smuzhiyun {
985*4882a593Smuzhiyun 	if (cmd) {
986*4882a593Smuzhiyun 		struct rtw_wifi_role_t *wrole = NULL;
987*4882a593Smuzhiyun 
988*4882a593Smuzhiyun 		wrole = (struct rtw_wifi_role_t *)cmd;
989*4882a593Smuzhiyun 		if (is_cmd_failure(status) && (RTW_PHL_STATUS_SUCCESS != status))
990*4882a593Smuzhiyun 			PHL_ERR("%s wrole(%d) fail status(%d).....\n",
991*4882a593Smuzhiyun 				__func__, wrole->id, status);
992*4882a593Smuzhiyun 		else
993*4882a593Smuzhiyun 			PHL_INFO("%s wrole(%d) success.....\n",
994*4882a593Smuzhiyun 				__func__, wrole->id);
995*4882a593Smuzhiyun 	}
996*4882a593Smuzhiyun }
997*4882a593Smuzhiyun 
998*4882a593Smuzhiyun enum rtw_phl_status
phl_wifi_role_stop(struct phl_info_t * phl_info,struct rtw_wifi_role_t * wrole)999*4882a593Smuzhiyun phl_wifi_role_stop(struct phl_info_t *phl_info, struct rtw_wifi_role_t *wrole)
1000*4882a593Smuzhiyun {
1001*4882a593Smuzhiyun 	enum rtw_phl_status psts = RTW_PHL_STATUS_FAILURE;
1002*4882a593Smuzhiyun 
1003*4882a593Smuzhiyun 	psts = phl_cmd_enqueue(phl_info,
1004*4882a593Smuzhiyun 			wrole->hw_band,
1005*4882a593Smuzhiyun 			MSG_EVT_ROLE_STOP,
1006*4882a593Smuzhiyun 			(u8 *)wrole,
1007*4882a593Smuzhiyun 			0,
1008*4882a593Smuzhiyun 			phl_wifi_role_stop_done,
1009*4882a593Smuzhiyun 			PHL_CMD_WAIT, 0);
1010*4882a593Smuzhiyun 
1011*4882a593Smuzhiyun 	if (is_cmd_failure(psts)) {
1012*4882a593Smuzhiyun 		/* Send cmd success, but wait cmd fail*/
1013*4882a593Smuzhiyun 		psts = RTW_PHL_STATUS_FAILURE;
1014*4882a593Smuzhiyun 		PHL_INFO("%s wr-id:%d failure\n", __func__, wrole->id);
1015*4882a593Smuzhiyun 	} else if (psts != RTW_PHL_STATUS_SUCCESS) {
1016*4882a593Smuzhiyun 		/* Send cmd fail */
1017*4882a593Smuzhiyun 		psts = RTW_PHL_STATUS_FAILURE;
1018*4882a593Smuzhiyun 		PHL_INFO("%s wr-id:%d failure\n", __func__, wrole->id);
1019*4882a593Smuzhiyun 	} else {
1020*4882a593Smuzhiyun 		PHL_INFO("%s wr-id:%d success\n", __func__, wrole->id);
1021*4882a593Smuzhiyun 	}
1022*4882a593Smuzhiyun 
1023*4882a593Smuzhiyun 	return psts;
1024*4882a593Smuzhiyun }
1025*4882a593Smuzhiyun #else
1026*4882a593Smuzhiyun enum rtw_phl_status
phl_wifi_role_stop(struct phl_info_t * phl_info,struct rtw_wifi_role_t * wrole)1027*4882a593Smuzhiyun phl_wifi_role_stop(struct phl_info_t *phl_info, struct rtw_wifi_role_t *wrole)
1028*4882a593Smuzhiyun {
1029*4882a593Smuzhiyun 	return _phl_wifi_role_stop(phl_info, wrole);
1030*4882a593Smuzhiyun }
1031*4882a593Smuzhiyun #endif
rtw_phl_wifi_role_free(void * phl,u8 role_idx)1032*4882a593Smuzhiyun void rtw_phl_wifi_role_free(void *phl, u8 role_idx)
1033*4882a593Smuzhiyun {
1034*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
1035*4882a593Smuzhiyun 	struct rtw_phl_com_t *phl_com = phl_info->phl_com;
1036*4882a593Smuzhiyun 	struct rtw_wifi_role_t *wrole = NULL;
1037*4882a593Smuzhiyun 
1038*4882a593Smuzhiyun 	if (role_idx >= MAX_WIFI_ROLE_NUMBER) {
1039*4882a593Smuzhiyun 		PHL_ERR("%s invalid role index :%d", __func__, role_idx);
1040*4882a593Smuzhiyun 		return;
1041*4882a593Smuzhiyun 	}
1042*4882a593Smuzhiyun 
1043*4882a593Smuzhiyun 	wrole = &phl_com->wifi_roles[role_idx];
1044*4882a593Smuzhiyun 
1045*4882a593Smuzhiyun 	if (phl_wifi_role_stop(phl_info, wrole) != RTW_PHL_STATUS_SUCCESS) {
1046*4882a593Smuzhiyun 		PHL_ERR("%s role_stop failed :%d", __func__, role_idx);
1047*4882a593Smuzhiyun 		_os_warn_on(1);
1048*4882a593Smuzhiyun 	}
1049*4882a593Smuzhiyun 
1050*4882a593Smuzhiyun 	if (phl_wifi_role_free_stainfo_sw(phl_info, wrole) != RTW_PHL_STATUS_SUCCESS) {
1051*4882a593Smuzhiyun 		PHL_ERR("%s wr free stainfo_sw failed\n", __func__);
1052*4882a593Smuzhiyun 		_os_warn_on(1);
1053*4882a593Smuzhiyun 	}
1054*4882a593Smuzhiyun 	_phl_wifi_role_free_sw(phl_info, wrole);
1055*4882a593Smuzhiyun 	PHL_DUMP_MR_EX(phl_info);
1056*4882a593Smuzhiyun }
1057*4882a593Smuzhiyun 
1058*4882a593Smuzhiyun #ifdef CONFIG_CMD_DISP
1059*4882a593Smuzhiyun enum rtw_phl_status
phl_register_mrc_module(struct phl_info_t * phl_info)1060*4882a593Smuzhiyun phl_register_mrc_module(struct phl_info_t *phl_info)
1061*4882a593Smuzhiyun {
1062*4882a593Smuzhiyun 	enum rtw_phl_status phl_status = RTW_PHL_STATUS_FAILURE;
1063*4882a593Smuzhiyun 	struct mr_ctl_t *mr_ctl = phlcom_to_mr_ctrl(phl_info->phl_com);
1064*4882a593Smuzhiyun 	struct phl_bk_module_ops bk_ops = mr_ctl->bk_ops;
1065*4882a593Smuzhiyun 	struct phl_cmd_dispatch_engine *disp_eng = &(phl_info->disp_eng);
1066*4882a593Smuzhiyun 	u8 i = 0;
1067*4882a593Smuzhiyun 
1068*4882a593Smuzhiyun 	for(i = 0; i < disp_eng->phy_num; i++)
1069*4882a593Smuzhiyun 	{
1070*4882a593Smuzhiyun 		phl_status = phl_disp_eng_register_module(phl_info, i,
1071*4882a593Smuzhiyun 						       PHL_MDL_MRC,
1072*4882a593Smuzhiyun 						       &bk_ops);
1073*4882a593Smuzhiyun 		if (RTW_PHL_STATUS_SUCCESS != phl_status) {
1074*4882a593Smuzhiyun 			PHL_ERR("%s register MRC module in cmd disp failed :%d\n", __func__, i+1);
1075*4882a593Smuzhiyun 			goto error_register_bk;
1076*4882a593Smuzhiyun 		}
1077*4882a593Smuzhiyun 	}
1078*4882a593Smuzhiyun 
1079*4882a593Smuzhiyun 	return phl_status;
1080*4882a593Smuzhiyun 
1081*4882a593Smuzhiyun error_register_bk:
1082*4882a593Smuzhiyun 	while(i > 0){
1083*4882a593Smuzhiyun 		phl_status = phl_disp_eng_deregister_module(phl_info, --i,
1084*4882a593Smuzhiyun 							 PHL_MDL_MRC);
1085*4882a593Smuzhiyun 		if (RTW_PHL_STATUS_SUCCESS != phl_status) {
1086*4882a593Smuzhiyun 			PHL_ERR("%s deregister MRC module in cmd disp failed :%d\n", __func__, i+1);
1087*4882a593Smuzhiyun 		}
1088*4882a593Smuzhiyun 	}
1089*4882a593Smuzhiyun 	return RTW_PHL_STATUS_FAILURE;
1090*4882a593Smuzhiyun }
1091*4882a593Smuzhiyun #endif
1092*4882a593Smuzhiyun 
1093*4882a593Smuzhiyun enum rtw_phl_status
phl_role_recover(struct phl_info_t * phl_info)1094*4882a593Smuzhiyun phl_role_recover(struct phl_info_t *phl_info)
1095*4882a593Smuzhiyun {
1096*4882a593Smuzhiyun 	u8 role_idx;
1097*4882a593Smuzhiyun 	struct rtw_wifi_role_t *wrole;
1098*4882a593Smuzhiyun 	struct rtw_phl_stainfo_t *sta;
1099*4882a593Smuzhiyun 	enum rtw_phl_status pstatus;
1100*4882a593Smuzhiyun 
1101*4882a593Smuzhiyun 	for (role_idx = 0; role_idx < MAX_WIFI_ROLE_NUMBER; role_idx++) {
1102*4882a593Smuzhiyun 		wrole = rtw_phl_get_wrole_by_ridx(phl_info->phl_com, role_idx);
1103*4882a593Smuzhiyun 		if(wrole == NULL)
1104*4882a593Smuzhiyun 			continue;
1105*4882a593Smuzhiyun 
1106*4882a593Smuzhiyun 		PHL_INFO("%s with role_idx %d\n", __func__, role_idx);
1107*4882a593Smuzhiyun 
1108*4882a593Smuzhiyun 		sta = rtw_phl_get_stainfo_self(phl_info, wrole);
1109*4882a593Smuzhiyun 		if(sta == NULL)
1110*4882a593Smuzhiyun 			continue;
1111*4882a593Smuzhiyun 
1112*4882a593Smuzhiyun 		pstatus = _phl_wifi_role_start(phl_info, wrole, sta);
1113*4882a593Smuzhiyun 		if (pstatus != RTW_PHL_STATUS_SUCCESS) {
1114*4882a593Smuzhiyun 			PHL_ERR("%s wifi role start failed\n", __func__);
1115*4882a593Smuzhiyun 			return RTW_PHL_STATUS_FAILURE;
1116*4882a593Smuzhiyun 		}
1117*4882a593Smuzhiyun 
1118*4882a593Smuzhiyun 		if (wrole->target_type != PHL_RTYPE_NONE) {
1119*4882a593Smuzhiyun 			PHL_INFO("%s with role_idx %d change to role type %d\n", __func__, role_idx, wrole->target_type);
1120*4882a593Smuzhiyun 			phl_wifi_role_change(phl_info, wrole, WR_CHG_TYPE, (u8 *)&wrole->target_type);
1121*4882a593Smuzhiyun 			wrole->target_type = PHL_RTYPE_NONE;
1122*4882a593Smuzhiyun 		}
1123*4882a593Smuzhiyun 	}
1124*4882a593Smuzhiyun 
1125*4882a593Smuzhiyun 	return RTW_PHL_STATUS_SUCCESS;
1126*4882a593Smuzhiyun }
1127*4882a593Smuzhiyun 
1128*4882a593Smuzhiyun enum rtw_phl_status
phl_cmd_role_recover(struct phl_info_t * phl_info)1129*4882a593Smuzhiyun phl_cmd_role_recover(struct phl_info_t *phl_info)
1130*4882a593Smuzhiyun {
1131*4882a593Smuzhiyun 	enum rtw_phl_status pstatus = RTW_PHL_STATUS_FAILURE;
1132*4882a593Smuzhiyun 
1133*4882a593Smuzhiyun #ifdef CONFIG_CMD_DISP
1134*4882a593Smuzhiyun 	pstatus = phl_cmd_enqueue(phl_info, HW_BAND_0, MSG_EVT_ROLE_RECOVER, NULL, 0, NULL, PHL_CMD_WAIT, 0);
1135*4882a593Smuzhiyun 	if (is_cmd_failure(pstatus)) {
1136*4882a593Smuzhiyun 		/* Send cmd success, but wait cmd fail*/
1137*4882a593Smuzhiyun 		pstatus = RTW_PHL_STATUS_FAILURE;
1138*4882a593Smuzhiyun 	} else if (pstatus != RTW_PHL_STATUS_SUCCESS) {
1139*4882a593Smuzhiyun 		/* Send cmd fail */
1140*4882a593Smuzhiyun 		pstatus = RTW_PHL_STATUS_FAILURE;
1141*4882a593Smuzhiyun 	}
1142*4882a593Smuzhiyun #else
1143*4882a593Smuzhiyun 	pstatus = phl_role_recover(phl_info);
1144*4882a593Smuzhiyun #endif
1145*4882a593Smuzhiyun 	return pstatus;
1146*4882a593Smuzhiyun }
1147*4882a593Smuzhiyun 
1148*4882a593Smuzhiyun enum rtw_phl_status
phl_role_suspend(struct phl_info_t * phl_info)1149*4882a593Smuzhiyun phl_role_suspend(struct phl_info_t *phl_info)
1150*4882a593Smuzhiyun {
1151*4882a593Smuzhiyun 	u8 role_idx;
1152*4882a593Smuzhiyun 	struct rtw_wifi_role_t *wrole;
1153*4882a593Smuzhiyun 	enum rtw_phl_status pstatus;
1154*4882a593Smuzhiyun 
1155*4882a593Smuzhiyun 	for (role_idx = 0; role_idx < MAX_WIFI_ROLE_NUMBER; role_idx++) {
1156*4882a593Smuzhiyun 		wrole = rtw_phl_get_wrole_by_ridx(phl_info->phl_com, role_idx);
1157*4882a593Smuzhiyun 		if (wrole == NULL)
1158*4882a593Smuzhiyun 			continue;
1159*4882a593Smuzhiyun 
1160*4882a593Smuzhiyun 		if (wrole->active == false)
1161*4882a593Smuzhiyun 			continue;
1162*4882a593Smuzhiyun 
1163*4882a593Smuzhiyun 		PHL_INFO("%s with role_idx %d\n", __func__, role_idx);
1164*4882a593Smuzhiyun 
1165*4882a593Smuzhiyun 		pstatus = _phl_wifi_role_stop(phl_info, wrole);
1166*4882a593Smuzhiyun 		if (pstatus != RTW_PHL_STATUS_SUCCESS) {
1167*4882a593Smuzhiyun 			PHL_ERR("%s wifi role stop failed\n", __func__);
1168*4882a593Smuzhiyun 			return RTW_PHL_STATUS_FAILURE;
1169*4882a593Smuzhiyun 		}
1170*4882a593Smuzhiyun 	}
1171*4882a593Smuzhiyun 
1172*4882a593Smuzhiyun 	return RTW_PHL_STATUS_SUCCESS;
1173*4882a593Smuzhiyun }
1174*4882a593Smuzhiyun enum rtw_phl_status
phl_cmd_role_suspend(struct phl_info_t * phl_info)1175*4882a593Smuzhiyun phl_cmd_role_suspend(struct phl_info_t *phl_info)
1176*4882a593Smuzhiyun {
1177*4882a593Smuzhiyun 	enum rtw_phl_status pstatus = RTW_PHL_STATUS_FAILURE;
1178*4882a593Smuzhiyun 
1179*4882a593Smuzhiyun #ifdef CONFIG_CMD_DISP
1180*4882a593Smuzhiyun 	pstatus = phl_cmd_enqueue(phl_info, HW_BAND_0, MSG_EVT_ROLE_SUSPEND, NULL, 0, NULL, PHL_CMD_WAIT, 0);
1181*4882a593Smuzhiyun 	if (is_cmd_failure(pstatus)) {
1182*4882a593Smuzhiyun 		/* Send cmd success, but wait cmd fail*/
1183*4882a593Smuzhiyun 		pstatus = RTW_PHL_STATUS_FAILURE;
1184*4882a593Smuzhiyun 	} else if (pstatus != RTW_PHL_STATUS_SUCCESS) {
1185*4882a593Smuzhiyun 		/* Send cmd fail */
1186*4882a593Smuzhiyun 		pstatus = RTW_PHL_STATUS_FAILURE;
1187*4882a593Smuzhiyun 	}
1188*4882a593Smuzhiyun #else
1189*4882a593Smuzhiyun 	pstatus = phl_role_suspend(phl_info);
1190*4882a593Smuzhiyun #endif
1191*4882a593Smuzhiyun 	return pstatus;
1192*4882a593Smuzhiyun }
1193*4882a593Smuzhiyun 
phl_role_get_bcn_intvl(struct phl_info_t * phl,struct rtw_wifi_role_t * wrole)1194*4882a593Smuzhiyun u16 phl_role_get_bcn_intvl(struct phl_info_t *phl, struct rtw_wifi_role_t *wrole)
1195*4882a593Smuzhiyun {
1196*4882a593Smuzhiyun 	struct rtw_phl_stainfo_t *sta = rtw_phl_get_stainfo_self(phl, wrole);
1197*4882a593Smuzhiyun 	u16 bcn_intvl = 0;
1198*4882a593Smuzhiyun 
1199*4882a593Smuzhiyun 	if (phl_role_is_client_category(wrole)) {
1200*4882a593Smuzhiyun 		bcn_intvl = sta->asoc_cap.bcn_interval;
1201*4882a593Smuzhiyun #ifdef RTW_PHL_BCN
1202*4882a593Smuzhiyun 	} else if (phl_role_is_ap_category(wrole)) {
1203*4882a593Smuzhiyun 		bcn_intvl = (u16)wrole->bcn_cmn.bcn_interval;
1204*4882a593Smuzhiyun #endif
1205*4882a593Smuzhiyun 	} else {
1206*4882a593Smuzhiyun 		PHL_WARN("phl_role_get_bcn_intvl() Unknown category, role id(%d), type(%d)\n",
1207*4882a593Smuzhiyun 			wrole->id, wrole->type);
1208*4882a593Smuzhiyun 	}
1209*4882a593Smuzhiyun 	return bcn_intvl;
1210*4882a593Smuzhiyun }
1211*4882a593Smuzhiyun 
1212*4882a593Smuzhiyun enum rtw_phl_status
phl_wifi_role_macid_all_pause(struct phl_info_t * phl_info,struct rtw_wifi_role_t * wrole,bool pause)1213*4882a593Smuzhiyun phl_wifi_role_macid_all_pause(struct phl_info_t *phl_info, struct rtw_wifi_role_t *wrole, bool pause)
1214*4882a593Smuzhiyun {
1215*4882a593Smuzhiyun 	enum rtw_hal_status hstatus = RTW_HAL_STATUS_SUCCESS;
1216*4882a593Smuzhiyun 	enum rtw_phl_status pstatus = RTW_PHL_STATUS_SUCCESS;
1217*4882a593Smuzhiyun 	u8 mutli_macid = false;
1218*4882a593Smuzhiyun 
1219*4882a593Smuzhiyun 	switch (wrole->type) {
1220*4882a593Smuzhiyun 	case PHL_RTYPE_NONE:
1221*4882a593Smuzhiyun 	case PHL_RTYPE_STATION:
1222*4882a593Smuzhiyun 	case PHL_RTYPE_ADHOC:
1223*4882a593Smuzhiyun 	case PHL_RTYPE_P2P_DEVICE:
1224*4882a593Smuzhiyun 	case PHL_RTYPE_P2P_GC:
1225*4882a593Smuzhiyun 		mutli_macid = false;
1226*4882a593Smuzhiyun 		break;
1227*4882a593Smuzhiyun 	default:
1228*4882a593Smuzhiyun 		mutli_macid = true;
1229*4882a593Smuzhiyun 		break;
1230*4882a593Smuzhiyun 	}
1231*4882a593Smuzhiyun 
1232*4882a593Smuzhiyun 	if (mutli_macid) {
1233*4882a593Smuzhiyun 		void *drv = phl_to_drvpriv(phl_info);
1234*4882a593Smuzhiyun 		struct macid_ctl_t *mctrl = phl_to_mac_ctrl(phl_info);
1235*4882a593Smuzhiyun 		u32 macid_pause[PHL_MACID_MAX_ARRAY_NUM] = {0};
1236*4882a593Smuzhiyun 
1237*4882a593Smuzhiyun 		_os_spinlock(phl_to_drvpriv(phl_info), &mctrl->lock, _bh, NULL);
1238*4882a593Smuzhiyun 		_os_mem_cpy(drv, macid_pause, &mctrl->wifi_role_usedmap[wrole->id][0], PHL_MACID_MAX_ARRAY_NUM);
1239*4882a593Smuzhiyun 		_os_spinunlock(phl_to_drvpriv(phl_info), &mctrl->lock, _bh, NULL);
1240*4882a593Smuzhiyun 		hstatus = rtw_hal_set_macid_grp_pause(phl_info->hal, macid_pause, PHL_MACID_MAX_ARRAY_NUM, pause);
1241*4882a593Smuzhiyun 		if (hstatus != RTW_HAL_STATUS_SUCCESS) {
1242*4882a593Smuzhiyun 			PHL_INFO("%s fail(hstatus=%d)\n", __func__, hstatus);
1243*4882a593Smuzhiyun 			pstatus = RTW_PHL_STATUS_FAILURE;
1244*4882a593Smuzhiyun 		}
1245*4882a593Smuzhiyun 	} else {
1246*4882a593Smuzhiyun 		struct rtw_phl_stainfo_t * self_sta = rtw_phl_get_stainfo_self((void *)phl_info, wrole);
1247*4882a593Smuzhiyun 
1248*4882a593Smuzhiyun 		hstatus = rtw_hal_set_macid_pause(phl_info->hal, self_sta->macid, pause);
1249*4882a593Smuzhiyun 		if (hstatus != RTW_HAL_STATUS_SUCCESS) {
1250*4882a593Smuzhiyun 			PHL_INFO("%s fail(hstatus=%d)\n", __func__, hstatus);
1251*4882a593Smuzhiyun 			pstatus = RTW_PHL_STATUS_FAILURE;
1252*4882a593Smuzhiyun 		}
1253*4882a593Smuzhiyun 	}
1254*4882a593Smuzhiyun 
1255*4882a593Smuzhiyun 	return pstatus;
1256*4882a593Smuzhiyun }
1257