xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/nxp/mlan/mlan_init.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /** @file mlan_init.c
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  *  @brief This file contains the initialization for FW
4*4882a593Smuzhiyun  *  and HW.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  *  Copyright 2008-2021 NXP
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  *  This software file (the File) is distributed by NXP
10*4882a593Smuzhiyun  *  under the terms of the GNU General Public License Version 2, June 1991
11*4882a593Smuzhiyun  *  (the License).  You may use, redistribute and/or modify the File in
12*4882a593Smuzhiyun  *  accordance with the terms and conditions of the License, a copy of which
13*4882a593Smuzhiyun  *  is available by writing to the Free Software Foundation, Inc.,
14*4882a593Smuzhiyun  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
15*4882a593Smuzhiyun  *  worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
16*4882a593Smuzhiyun  *
17*4882a593Smuzhiyun  *  THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
18*4882a593Smuzhiyun  *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
19*4882a593Smuzhiyun  *  ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
20*4882a593Smuzhiyun  *  this warranty disclaimer.
21*4882a593Smuzhiyun  *
22*4882a593Smuzhiyun  */
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun /********************************************************
25*4882a593Smuzhiyun Change log:
26*4882a593Smuzhiyun     10/13/2008: initial version
27*4882a593Smuzhiyun ********************************************************/
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #include "mlan.h"
30*4882a593Smuzhiyun #ifdef STA_SUPPORT
31*4882a593Smuzhiyun #include "mlan_join.h"
32*4882a593Smuzhiyun #endif
33*4882a593Smuzhiyun #include "mlan_util.h"
34*4882a593Smuzhiyun #include "mlan_fw.h"
35*4882a593Smuzhiyun #include "mlan_main.h"
36*4882a593Smuzhiyun #include "mlan_init.h"
37*4882a593Smuzhiyun #include "mlan_wmm.h"
38*4882a593Smuzhiyun #include "mlan_11n.h"
39*4882a593Smuzhiyun #include "mlan_11ac.h"
40*4882a593Smuzhiyun #include "mlan_11h.h"
41*4882a593Smuzhiyun #include "mlan_meas.h"
42*4882a593Smuzhiyun #ifdef SDIO
43*4882a593Smuzhiyun #include "mlan_sdio.h"
44*4882a593Smuzhiyun #endif
45*4882a593Smuzhiyun #ifdef PCIE
46*4882a593Smuzhiyun #include "mlan_pcie.h"
47*4882a593Smuzhiyun #endif /* PCIE */
48*4882a593Smuzhiyun #if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT)
49*4882a593Smuzhiyun #include "hostsa_init.h"
50*4882a593Smuzhiyun #endif
51*4882a593Smuzhiyun #include "mlan_11ax.h"
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun /********************************************************
54*4882a593Smuzhiyun 			Global Variables
55*4882a593Smuzhiyun ********************************************************/
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun /*******************************************************
58*4882a593Smuzhiyun 			Local Functions
59*4882a593Smuzhiyun ********************************************************/
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun /**
62*4882a593Smuzhiyun  *  @brief This function adds a BSS priority table
63*4882a593Smuzhiyun  *
64*4882a593Smuzhiyun  *  @param priv     A pointer to mlan_private structure
65*4882a593Smuzhiyun  *
66*4882a593Smuzhiyun  *  @return         MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
67*4882a593Smuzhiyun  */
wlan_add_bsspriotbl(pmlan_private priv)68*4882a593Smuzhiyun static mlan_status wlan_add_bsspriotbl(pmlan_private priv)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun 	pmlan_adapter pmadapter = priv->adapter;
71*4882a593Smuzhiyun 	mlan_bssprio_node *pbssprio = MNULL;
72*4882a593Smuzhiyun 	mlan_status status = MLAN_STATUS_SUCCESS;
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun 	ENTER();
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 	status = pmadapter->callbacks.moal_malloc(pmadapter->pmoal_handle,
77*4882a593Smuzhiyun 						  sizeof(mlan_bssprio_node),
78*4882a593Smuzhiyun 						  MLAN_MEM_DEF,
79*4882a593Smuzhiyun 						  (t_u8 **)&pbssprio);
80*4882a593Smuzhiyun 	if (status) {
81*4882a593Smuzhiyun 		PRINTM(MERROR, "Failed to allocate bsspriotbl\n");
82*4882a593Smuzhiyun 		LEAVE();
83*4882a593Smuzhiyun 		return status;
84*4882a593Smuzhiyun 	}
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	pbssprio->priv = priv;
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun 	util_init_list((pmlan_linked_list)pbssprio);
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	if (!pmadapter->bssprio_tbl[priv->bss_priority].bssprio_cur)
91*4882a593Smuzhiyun 		pmadapter->bssprio_tbl[priv->bss_priority].bssprio_cur =
92*4882a593Smuzhiyun 			pbssprio;
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	util_enqueue_list_tail(
95*4882a593Smuzhiyun 		pmadapter->pmoal_handle,
96*4882a593Smuzhiyun 		&pmadapter->bssprio_tbl[priv->bss_priority].bssprio_head,
97*4882a593Smuzhiyun 		(pmlan_linked_list)pbssprio,
98*4882a593Smuzhiyun 		pmadapter->callbacks.moal_spin_lock,
99*4882a593Smuzhiyun 		pmadapter->callbacks.moal_spin_unlock);
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun 	LEAVE();
102*4882a593Smuzhiyun 	return status;
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun /**
106*4882a593Smuzhiyun  *  @brief This function deletes the BSS priority table
107*4882a593Smuzhiyun  *
108*4882a593Smuzhiyun  *  @param priv     A pointer to mlan_private structure
109*4882a593Smuzhiyun  *
110*4882a593Smuzhiyun  *  @return         N/A
111*4882a593Smuzhiyun  */
wlan_delete_bsspriotbl(pmlan_private priv)112*4882a593Smuzhiyun static t_void wlan_delete_bsspriotbl(pmlan_private priv)
113*4882a593Smuzhiyun {
114*4882a593Smuzhiyun 	int i;
115*4882a593Smuzhiyun 	pmlan_adapter pmadapter = priv->adapter;
116*4882a593Smuzhiyun 	mlan_bssprio_node *pbssprio_node = MNULL, *ptmp_node = MNULL,
117*4882a593Smuzhiyun 			  **ppcur = MNULL;
118*4882a593Smuzhiyun 	pmlan_list_head phead;
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 	ENTER();
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 	for (i = 0; i < pmadapter->priv_num; ++i) {
123*4882a593Smuzhiyun 		phead = &pmadapter->bssprio_tbl[i].bssprio_head;
124*4882a593Smuzhiyun 		ppcur = &pmadapter->bssprio_tbl[i].bssprio_cur;
125*4882a593Smuzhiyun 		PRINTM(MINFO,
126*4882a593Smuzhiyun 		       "Delete BSS priority table, index = %d, i = %d, phead = %p, pcur = %p\n",
127*4882a593Smuzhiyun 		       priv->bss_index, i, phead, *ppcur);
128*4882a593Smuzhiyun 		if (*ppcur) {
129*4882a593Smuzhiyun 			pbssprio_node = (mlan_bssprio_node *)util_peek_list(
130*4882a593Smuzhiyun 				pmadapter->pmoal_handle, phead,
131*4882a593Smuzhiyun 				pmadapter->callbacks.moal_spin_lock,
132*4882a593Smuzhiyun 				pmadapter->callbacks.moal_spin_unlock);
133*4882a593Smuzhiyun 			while (pbssprio_node &&
134*4882a593Smuzhiyun 			       ((pmlan_list_head)pbssprio_node != phead)) {
135*4882a593Smuzhiyun 				ptmp_node = pbssprio_node->pnext;
136*4882a593Smuzhiyun 				if (pbssprio_node->priv == priv) {
137*4882a593Smuzhiyun 					PRINTM(MINFO,
138*4882a593Smuzhiyun 					       "Delete node, pnode = %p, pnext = %p\n",
139*4882a593Smuzhiyun 					       pbssprio_node, ptmp_node);
140*4882a593Smuzhiyun 					util_unlink_list(
141*4882a593Smuzhiyun 						pmadapter->pmoal_handle, phead,
142*4882a593Smuzhiyun 						(pmlan_linked_list)pbssprio_node,
143*4882a593Smuzhiyun 						pmadapter->callbacks
144*4882a593Smuzhiyun 							.moal_spin_lock,
145*4882a593Smuzhiyun 						pmadapter->callbacks
146*4882a593Smuzhiyun 							.moal_spin_unlock);
147*4882a593Smuzhiyun 					pmadapter->callbacks.moal_mfree(
148*4882a593Smuzhiyun 						pmadapter->pmoal_handle,
149*4882a593Smuzhiyun 						(t_u8 *)pbssprio_node);
150*4882a593Smuzhiyun 				}
151*4882a593Smuzhiyun 				pbssprio_node = ptmp_node;
152*4882a593Smuzhiyun 			}
153*4882a593Smuzhiyun 			*ppcur = (mlan_bssprio_node *)phead;
154*4882a593Smuzhiyun 		}
155*4882a593Smuzhiyun 	}
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun 	LEAVE();
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun /**
161*4882a593Smuzhiyun  *  @brief The function handles VDLL init
162*4882a593Smuzhiyun  *
163*4882a593Smuzhiyun  *  @param pmadapter    A pointer to mlan_adapter structure
164*4882a593Smuzhiyun  *
165*4882a593Smuzhiyun  *  @return             MLAN_STATUS_SUCCESS
166*4882a593Smuzhiyun  *
167*4882a593Smuzhiyun  */
vdll_init(pmlan_adapter pmadapter)168*4882a593Smuzhiyun static mlan_status vdll_init(pmlan_adapter pmadapter)
169*4882a593Smuzhiyun {
170*4882a593Smuzhiyun 	mlan_status status = MLAN_STATUS_SUCCESS;
171*4882a593Smuzhiyun 	vdll_dnld_ctrl *ctrl = &pmadapter->vdll_ctrl;
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun 	ENTER();
174*4882a593Smuzhiyun 	memset(pmadapter, ctrl, 0, sizeof(vdll_dnld_ctrl));
175*4882a593Smuzhiyun #if defined(SDIO) || defined(PCIE)
176*4882a593Smuzhiyun 	if (!IS_USB(pmadapter->card_type)) {
177*4882a593Smuzhiyun 		ctrl->cmd_buf =
178*4882a593Smuzhiyun 			wlan_alloc_mlan_buffer(pmadapter,
179*4882a593Smuzhiyun 					       MRVDRV_SIZE_OF_CMD_BUFFER, 0,
180*4882a593Smuzhiyun 					       MOAL_MALLOC_BUFFER);
181*4882a593Smuzhiyun 		if (!ctrl->cmd_buf) {
182*4882a593Smuzhiyun 			PRINTM(MERROR,
183*4882a593Smuzhiyun 			       "vdll init: fail to alloc command buffer");
184*4882a593Smuzhiyun 			status = MLAN_STATUS_FAILURE;
185*4882a593Smuzhiyun 		}
186*4882a593Smuzhiyun 	}
187*4882a593Smuzhiyun #endif
188*4882a593Smuzhiyun 	LEAVE();
189*4882a593Smuzhiyun 	return status;
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun /**
192*4882a593Smuzhiyun  *  @brief The function handles VDLL deinit
193*4882a593Smuzhiyun  *
194*4882a593Smuzhiyun  *  @param pmadapter    A pointer to mlan_adapter structure
195*4882a593Smuzhiyun  *
196*4882a593Smuzhiyun  *  @return             MLAN_STATUS_SUCCESS
197*4882a593Smuzhiyun  *
198*4882a593Smuzhiyun  */
vdll_deinit(pmlan_adapter pmadapter)199*4882a593Smuzhiyun static t_void vdll_deinit(pmlan_adapter pmadapter)
200*4882a593Smuzhiyun {
201*4882a593Smuzhiyun 	pmlan_callbacks pcb = &pmadapter->callbacks;
202*4882a593Smuzhiyun 	ENTER();
203*4882a593Smuzhiyun 	if (pmadapter->vdll_ctrl.vdll_mem != MNULL) {
204*4882a593Smuzhiyun 		if (pcb->moal_vmalloc && pcb->moal_vfree)
205*4882a593Smuzhiyun 			pcb->moal_vfree(pmadapter->pmoal_handle,
206*4882a593Smuzhiyun 					(t_u8 *)pmadapter->vdll_ctrl.vdll_mem);
207*4882a593Smuzhiyun 		else
208*4882a593Smuzhiyun 			pcb->moal_mfree(pmadapter->pmoal_handle,
209*4882a593Smuzhiyun 					(t_u8 *)pmadapter->vdll_ctrl.vdll_mem);
210*4882a593Smuzhiyun 		pmadapter->vdll_ctrl.vdll_mem = MNULL;
211*4882a593Smuzhiyun 		pmadapter->vdll_ctrl.vdll_len = 0;
212*4882a593Smuzhiyun 	}
213*4882a593Smuzhiyun #if defined(SDIO) || defined(PCIE)
214*4882a593Smuzhiyun 	if (!IS_USB(pmadapter->card_type) &&
215*4882a593Smuzhiyun 	    pmadapter->vdll_ctrl.cmd_buf != MNULL) {
216*4882a593Smuzhiyun 		wlan_free_mlan_buffer(pmadapter, pmadapter->vdll_ctrl.cmd_buf);
217*4882a593Smuzhiyun 		pmadapter->vdll_ctrl.cmd_buf = MNULL;
218*4882a593Smuzhiyun 	}
219*4882a593Smuzhiyun #endif
220*4882a593Smuzhiyun 	LEAVE();
221*4882a593Smuzhiyun }
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun /********************************************************
224*4882a593Smuzhiyun 			Global Functions
225*4882a593Smuzhiyun ********************************************************/
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun /**
228*4882a593Smuzhiyun  *  @brief This function allocates buffer for the members of adapter
229*4882a593Smuzhiyun  *          structure like command buffer and BSSID list.
230*4882a593Smuzhiyun  *
231*4882a593Smuzhiyun  *  @param pmadapter    A pointer to mlan_adapter structure
232*4882a593Smuzhiyun  *
233*4882a593Smuzhiyun  *  @return             MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
234*4882a593Smuzhiyun  */
wlan_allocate_adapter(pmlan_adapter pmadapter)235*4882a593Smuzhiyun mlan_status wlan_allocate_adapter(pmlan_adapter pmadapter)
236*4882a593Smuzhiyun {
237*4882a593Smuzhiyun 	mlan_status ret = MLAN_STATUS_SUCCESS;
238*4882a593Smuzhiyun #ifdef STA_SUPPORT
239*4882a593Smuzhiyun 	t_u32 beacon_buffer_size;
240*4882a593Smuzhiyun 	t_u32 buf_size;
241*4882a593Smuzhiyun 	BSSDescriptor_t *ptemp_scan_table = MNULL;
242*4882a593Smuzhiyun 	t_u8 chan_2g[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
243*4882a593Smuzhiyun 	t_u8 chan_5g[] = {12,  16,  34,	 38,  42,  46,	36,  40,  44,
244*4882a593Smuzhiyun 			  48,  52,  56,	 60,  64,  100, 104, 108, 112,
245*4882a593Smuzhiyun 			  116, 120, 124, 128, 132, 136, 140, 144, 149,
246*4882a593Smuzhiyun 			  153, 157, 161, 165, 169, 173, 177};
247*4882a593Smuzhiyun #endif
248*4882a593Smuzhiyun #ifdef SDIO
249*4882a593Smuzhiyun 	t_u32 max_mp_regs = 0;
250*4882a593Smuzhiyun 	t_u32 mp_tx_aggr_buf_size = 0;
251*4882a593Smuzhiyun 	t_u32 mp_rx_aggr_buf_size = 0;
252*4882a593Smuzhiyun #endif
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun 	ENTER();
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun #ifdef SDIO
257*4882a593Smuzhiyun 	if (IS_SD(pmadapter->card_type)) {
258*4882a593Smuzhiyun 		max_mp_regs = pmadapter->pcard_sd->reg->max_mp_regs;
259*4882a593Smuzhiyun 		mp_tx_aggr_buf_size = pmadapter->pcard_sd->mp_tx_aggr_buf_size;
260*4882a593Smuzhiyun 		mp_rx_aggr_buf_size = pmadapter->pcard_sd->mp_rx_aggr_buf_size;
261*4882a593Smuzhiyun 	}
262*4882a593Smuzhiyun #endif
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun #ifdef STA_SUPPORT
265*4882a593Smuzhiyun 	/* Allocate buffer to store the BSSID list */
266*4882a593Smuzhiyun 	buf_size = sizeof(BSSDescriptor_t) * MRVDRV_MAX_BSSID_LIST;
267*4882a593Smuzhiyun 	if (pmadapter->callbacks.moal_vmalloc &&
268*4882a593Smuzhiyun 	    pmadapter->callbacks.moal_vfree)
269*4882a593Smuzhiyun 		ret = pmadapter->callbacks.moal_vmalloc(
270*4882a593Smuzhiyun 			pmadapter->pmoal_handle, buf_size,
271*4882a593Smuzhiyun 			(t_u8 **)&ptemp_scan_table);
272*4882a593Smuzhiyun 	else
273*4882a593Smuzhiyun 		ret = pmadapter->callbacks.moal_malloc(
274*4882a593Smuzhiyun 			pmadapter->pmoal_handle, buf_size, MLAN_MEM_DEF,
275*4882a593Smuzhiyun 			(t_u8 **)&ptemp_scan_table);
276*4882a593Smuzhiyun 	if (ret != MLAN_STATUS_SUCCESS || !ptemp_scan_table) {
277*4882a593Smuzhiyun 		PRINTM(MERROR, "Failed to allocate scan table\n");
278*4882a593Smuzhiyun 		LEAVE();
279*4882a593Smuzhiyun 		return MLAN_STATUS_FAILURE;
280*4882a593Smuzhiyun 	}
281*4882a593Smuzhiyun 	pmadapter->pscan_table = ptemp_scan_table;
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun 	if (pmadapter->fixed_beacon_buffer)
284*4882a593Smuzhiyun 		beacon_buffer_size = MAX_SCAN_BEACON_BUFFER;
285*4882a593Smuzhiyun 	else
286*4882a593Smuzhiyun 		beacon_buffer_size = DEFAULT_SCAN_BEACON_BUFFER;
287*4882a593Smuzhiyun 	if (pmadapter->callbacks.moal_vmalloc &&
288*4882a593Smuzhiyun 	    pmadapter->callbacks.moal_vfree)
289*4882a593Smuzhiyun 		ret = pmadapter->callbacks.moal_vmalloc(
290*4882a593Smuzhiyun 			pmadapter->pmoal_handle, beacon_buffer_size,
291*4882a593Smuzhiyun 			(t_u8 **)&pmadapter->bcn_buf);
292*4882a593Smuzhiyun 	else
293*4882a593Smuzhiyun 		ret = pmadapter->callbacks.moal_malloc(
294*4882a593Smuzhiyun 			pmadapter->pmoal_handle, beacon_buffer_size,
295*4882a593Smuzhiyun 			MLAN_MEM_DEF, (t_u8 **)&pmadapter->bcn_buf);
296*4882a593Smuzhiyun 	if (ret != MLAN_STATUS_SUCCESS || !pmadapter->bcn_buf) {
297*4882a593Smuzhiyun 		PRINTM(MERROR, "Failed to allocate bcn buf\n");
298*4882a593Smuzhiyun 		LEAVE();
299*4882a593Smuzhiyun 		return MLAN_STATUS_FAILURE;
300*4882a593Smuzhiyun 	}
301*4882a593Smuzhiyun 	pmadapter->bcn_buf_size = beacon_buffer_size;
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun 	pmadapter->num_in_chan_stats = sizeof(chan_2g);
304*4882a593Smuzhiyun 	pmadapter->num_in_chan_stats += sizeof(chan_5g);
305*4882a593Smuzhiyun 	buf_size = sizeof(ChanStatistics_t) * pmadapter->num_in_chan_stats;
306*4882a593Smuzhiyun 	if (pmadapter->callbacks.moal_vmalloc &&
307*4882a593Smuzhiyun 	    pmadapter->callbacks.moal_vfree)
308*4882a593Smuzhiyun 		ret = pmadapter->callbacks.moal_vmalloc(
309*4882a593Smuzhiyun 			pmadapter->pmoal_handle, buf_size,
310*4882a593Smuzhiyun 			(t_u8 **)&pmadapter->pchan_stats);
311*4882a593Smuzhiyun 	else
312*4882a593Smuzhiyun 		ret = pmadapter->callbacks.moal_malloc(
313*4882a593Smuzhiyun 			pmadapter->pmoal_handle, buf_size, MLAN_MEM_DEF,
314*4882a593Smuzhiyun 			(t_u8 **)&pmadapter->pchan_stats);
315*4882a593Smuzhiyun 	if (ret != MLAN_STATUS_SUCCESS || !pmadapter->pchan_stats) {
316*4882a593Smuzhiyun 		PRINTM(MERROR, "Failed to allocate channel statistics\n");
317*4882a593Smuzhiyun 		LEAVE();
318*4882a593Smuzhiyun 		return MLAN_STATUS_FAILURE;
319*4882a593Smuzhiyun 	}
320*4882a593Smuzhiyun #endif
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun 	/* Allocate command buffer */
323*4882a593Smuzhiyun 	ret = wlan_alloc_cmd_buffer(pmadapter);
324*4882a593Smuzhiyun 	if (ret != MLAN_STATUS_SUCCESS) {
325*4882a593Smuzhiyun 		PRINTM(MERROR, "Failed to allocate command buffer\n");
326*4882a593Smuzhiyun 		LEAVE();
327*4882a593Smuzhiyun 		return MLAN_STATUS_FAILURE;
328*4882a593Smuzhiyun 	}
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun #ifdef SDIO
331*4882a593Smuzhiyun 	if (IS_SD(pmadapter->card_type)) {
332*4882a593Smuzhiyun 		ret = pmadapter->callbacks.moal_malloc(
333*4882a593Smuzhiyun 			pmadapter->pmoal_handle, max_mp_regs + DMA_ALIGNMENT,
334*4882a593Smuzhiyun 			MLAN_MEM_DEF | MLAN_MEM_DMA,
335*4882a593Smuzhiyun 			(t_u8 **)&pmadapter->pcard_sd->mp_regs_buf);
336*4882a593Smuzhiyun 		if (ret != MLAN_STATUS_SUCCESS ||
337*4882a593Smuzhiyun 		    !pmadapter->pcard_sd->mp_regs_buf) {
338*4882a593Smuzhiyun 			PRINTM(MERROR, "Failed to allocate mp_regs_buf\n");
339*4882a593Smuzhiyun 			LEAVE();
340*4882a593Smuzhiyun 			return MLAN_STATUS_FAILURE;
341*4882a593Smuzhiyun 		}
342*4882a593Smuzhiyun 		pmadapter->pcard_sd->mp_regs = (t_u8 *)ALIGN_ADDR(
343*4882a593Smuzhiyun 			pmadapter->pcard_sd->mp_regs_buf, DMA_ALIGNMENT);
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun 		ret = pmadapter->callbacks.moal_malloc(
346*4882a593Smuzhiyun 			pmadapter->pmoal_handle, MAX_SUPPORT_AMSDU_SIZE,
347*4882a593Smuzhiyun 			MLAN_MEM_DEF | MLAN_MEM_DMA,
348*4882a593Smuzhiyun 			(t_u8 **)&pmadapter->pcard_sd->rx_buffer);
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun 		if (ret != MLAN_STATUS_SUCCESS ||
351*4882a593Smuzhiyun 		    !pmadapter->pcard_sd->rx_buffer) {
352*4882a593Smuzhiyun 			PRINTM(MERROR, "Failed to allocate receive buffer\n");
353*4882a593Smuzhiyun 			LEAVE();
354*4882a593Smuzhiyun 			return MLAN_STATUS_FAILURE;
355*4882a593Smuzhiyun 		}
356*4882a593Smuzhiyun 		pmadapter->pcard_sd->rx_buf = (t_u8 *)ALIGN_ADDR(
357*4882a593Smuzhiyun 			pmadapter->pcard_sd->rx_buffer, DMA_ALIGNMENT);
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun 		pmadapter->pcard_sd->max_sp_tx_size = MAX_SUPPORT_AMSDU_SIZE;
360*4882a593Smuzhiyun 		pmadapter->pcard_sd->max_sp_rx_size = MAX_SUPPORT_AMSDU_SIZE;
361*4882a593Smuzhiyun 		ret = wlan_alloc_sdio_mpa_buffers(
362*4882a593Smuzhiyun 			pmadapter, mp_tx_aggr_buf_size, mp_rx_aggr_buf_size);
363*4882a593Smuzhiyun 		if (ret != MLAN_STATUS_SUCCESS) {
364*4882a593Smuzhiyun 			PRINTM(MERROR,
365*4882a593Smuzhiyun 			       "Failed to allocate sdio mp-a buffers\n");
366*4882a593Smuzhiyun 			LEAVE();
367*4882a593Smuzhiyun 			return MLAN_STATUS_FAILURE;
368*4882a593Smuzhiyun 		}
369*4882a593Smuzhiyun #ifdef DEBUG_LEVEL1
370*4882a593Smuzhiyun 		if (mlan_drvdbg & MMPA_D) {
371*4882a593Smuzhiyun 			pmadapter->pcard_sd->mpa_buf_size =
372*4882a593Smuzhiyun 				SDIO_MP_DBG_NUM *
373*4882a593Smuzhiyun 				pmadapter->pcard_sd->mp_aggr_pkt_limit *
374*4882a593Smuzhiyun 				MLAN_SDIO_BLOCK_SIZE;
375*4882a593Smuzhiyun 			if (pmadapter->callbacks.moal_vmalloc &&
376*4882a593Smuzhiyun 			    pmadapter->callbacks.moal_vfree)
377*4882a593Smuzhiyun 				ret = pmadapter->callbacks.moal_vmalloc(
378*4882a593Smuzhiyun 					pmadapter->pmoal_handle,
379*4882a593Smuzhiyun 					pmadapter->pcard_sd->mpa_buf_size,
380*4882a593Smuzhiyun 					(t_u8 **)&pmadapter->pcard_sd->mpa_buf);
381*4882a593Smuzhiyun 			else
382*4882a593Smuzhiyun 				ret = pmadapter->callbacks.moal_malloc(
383*4882a593Smuzhiyun 					pmadapter->pmoal_handle,
384*4882a593Smuzhiyun 					pmadapter->pcard_sd->mpa_buf_size,
385*4882a593Smuzhiyun 					MLAN_MEM_DEF,
386*4882a593Smuzhiyun 					(t_u8 **)&pmadapter->pcard_sd->mpa_buf);
387*4882a593Smuzhiyun 			if (ret != MLAN_STATUS_SUCCESS ||
388*4882a593Smuzhiyun 			    !pmadapter->pcard_sd->mpa_buf) {
389*4882a593Smuzhiyun 				PRINTM(MERROR, "Failed to allocate mpa buf\n");
390*4882a593Smuzhiyun 				LEAVE();
391*4882a593Smuzhiyun 				return MLAN_STATUS_FAILURE;
392*4882a593Smuzhiyun 			}
393*4882a593Smuzhiyun 		}
394*4882a593Smuzhiyun #endif
395*4882a593Smuzhiyun 	}
396*4882a593Smuzhiyun #endif
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun 	pmadapter->psleep_cfm =
399*4882a593Smuzhiyun 		wlan_alloc_mlan_buffer(pmadapter,
400*4882a593Smuzhiyun 				       sizeof(opt_sleep_confirm_buffer), 0,
401*4882a593Smuzhiyun 				       MOAL_MALLOC_BUFFER);
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun #ifdef PCIE
404*4882a593Smuzhiyun 	/* Initialize PCIE ring buffer */
405*4882a593Smuzhiyun 	if (IS_PCIE(pmadapter->card_type)) {
406*4882a593Smuzhiyun 		ret = wlan_alloc_pcie_ring_buf(pmadapter);
407*4882a593Smuzhiyun 		if (MLAN_STATUS_SUCCESS != ret) {
408*4882a593Smuzhiyun 			PRINTM(MERROR,
409*4882a593Smuzhiyun 			       "Failed to allocate PCIE host buffers\n");
410*4882a593Smuzhiyun 			LEAVE();
411*4882a593Smuzhiyun 			return MLAN_STATUS_FAILURE;
412*4882a593Smuzhiyun 		}
413*4882a593Smuzhiyun 	}
414*4882a593Smuzhiyun #endif /* PCIE */
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun 	vdll_init(pmadapter);
417*4882a593Smuzhiyun 	LEAVE();
418*4882a593Smuzhiyun 	return MLAN_STATUS_SUCCESS;
419*4882a593Smuzhiyun }
420*4882a593Smuzhiyun 
421*4882a593Smuzhiyun /**
422*4882a593Smuzhiyun  *  @brief This function initializes the private structure
423*4882a593Smuzhiyun  *          and sets default values to the members of mlan_private.
424*4882a593Smuzhiyun  *
425*4882a593Smuzhiyun  *  @param priv     A pointer to mlan_private structure
426*4882a593Smuzhiyun  *
427*4882a593Smuzhiyun  *  @return         MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
428*4882a593Smuzhiyun  */
wlan_init_priv(pmlan_private priv)429*4882a593Smuzhiyun mlan_status wlan_init_priv(pmlan_private priv)
430*4882a593Smuzhiyun {
431*4882a593Smuzhiyun 	t_u32 i;
432*4882a593Smuzhiyun 	pmlan_adapter pmadapter = priv->adapter;
433*4882a593Smuzhiyun 	mlan_status ret = MLAN_STATUS_SUCCESS;
434*4882a593Smuzhiyun #ifdef USB
435*4882a593Smuzhiyun 	pusb_tx_aggr_params pusb_tx_aggr = MNULL;
436*4882a593Smuzhiyun #endif
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun 	ENTER();
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun 	priv->media_connected = MFALSE;
441*4882a593Smuzhiyun 	memset(pmadapter, priv->curr_addr, 0xff, MLAN_MAC_ADDR_LENGTH);
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun #ifdef STA_SUPPORT
444*4882a593Smuzhiyun 	priv->pkt_tx_ctrl = 0;
445*4882a593Smuzhiyun 	priv->bss_mode = MLAN_BSS_MODE_INFRA;
446*4882a593Smuzhiyun 	priv->data_rate = 0; /* Initially indicate the rate as auto */
447*4882a593Smuzhiyun 	priv->is_data_rate_auto = MTRUE;
448*4882a593Smuzhiyun 	priv->bcn_avg_factor = DEFAULT_BCN_AVG_FACTOR;
449*4882a593Smuzhiyun 	priv->data_avg_factor = DEFAULT_DATA_AVG_FACTOR;
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun 	priv->sec_info.wep_status = Wlan802_11WEPDisabled;
452*4882a593Smuzhiyun 	priv->sec_info.authentication_mode = MLAN_AUTH_MODE_AUTO;
453*4882a593Smuzhiyun 	priv->sec_info.encryption_mode = MLAN_ENCRYPTION_MODE_NONE;
454*4882a593Smuzhiyun 	for (i = 0; i < MRVL_NUM_WEP_KEY; i++)
455*4882a593Smuzhiyun 		memset(pmadapter, &priv->wep_key[i], 0, sizeof(mrvl_wep_key_t));
456*4882a593Smuzhiyun 	priv->wep_key_curr_index = 0;
457*4882a593Smuzhiyun 	priv->ewpa_query = MFALSE;
458*4882a593Smuzhiyun 	priv->curr_pkt_filter = HostCmd_ACT_MAC_STATIC_DYNAMIC_BW_ENABLE |
459*4882a593Smuzhiyun 				HostCmd_ACT_MAC_RTS_CTS_ENABLE |
460*4882a593Smuzhiyun 				HostCmd_ACT_MAC_RX_ON | HostCmd_ACT_MAC_TX_ON |
461*4882a593Smuzhiyun 				HostCmd_ACT_MAC_ETHERNETII_ENABLE;
462*4882a593Smuzhiyun 
463*4882a593Smuzhiyun 	priv->beacon_period = MLAN_BEACON_INTERVAL;
464*4882a593Smuzhiyun 	priv->pattempted_bss_desc = MNULL;
465*4882a593Smuzhiyun 	memset(pmadapter, &priv->gtk_rekey, 0,
466*4882a593Smuzhiyun 	       sizeof(mlan_ds_misc_gtk_rekey_data));
467*4882a593Smuzhiyun 	memset(pmadapter, &priv->curr_bss_params, 0,
468*4882a593Smuzhiyun 	       sizeof(priv->curr_bss_params));
469*4882a593Smuzhiyun 	priv->listen_interval = MLAN_DEFAULT_LISTEN_INTERVAL;
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun 	memset(pmadapter, &priv->assoc_rsp_buf, 0, sizeof(priv->assoc_rsp_buf));
472*4882a593Smuzhiyun 	priv->assoc_rsp_size = 0;
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun 	wlan_11d_priv_init(priv);
475*4882a593Smuzhiyun 	wlan_11h_priv_init(priv);
476*4882a593Smuzhiyun 
477*4882a593Smuzhiyun #ifdef UAP_SUPPORT
478*4882a593Smuzhiyun 	priv->is_11n_enabled = MFALSE;
479*4882a593Smuzhiyun 	priv->is_11ac_enabled = MFALSE;
480*4882a593Smuzhiyun 	priv->is_11ax_enabled = MFALSE;
481*4882a593Smuzhiyun 	priv->uap_bss_started = MFALSE;
482*4882a593Smuzhiyun 	priv->uap_host_based = MFALSE;
483*4882a593Smuzhiyun 	memset(pmadapter, &priv->uap_state_chan_cb, 0,
484*4882a593Smuzhiyun 	       sizeof(priv->uap_state_chan_cb));
485*4882a593Smuzhiyun #endif
486*4882a593Smuzhiyun #ifdef UAP_SUPPORT
487*4882a593Smuzhiyun 	priv->num_drop_pkts = 0;
488*4882a593Smuzhiyun #endif
489*4882a593Smuzhiyun #if defined(STA_SUPPORT)
490*4882a593Smuzhiyun 	priv->adhoc_state_prev = ADHOC_IDLE;
491*4882a593Smuzhiyun 	memset(pmadapter, &priv->adhoc_last_start_ssid, 0,
492*4882a593Smuzhiyun 	       sizeof(priv->adhoc_last_start_ssid));
493*4882a593Smuzhiyun #endif
494*4882a593Smuzhiyun 	priv->atim_window = 0;
495*4882a593Smuzhiyun 	priv->adhoc_state = ADHOC_IDLE;
496*4882a593Smuzhiyun 	priv->tx_power_level = 0;
497*4882a593Smuzhiyun 	priv->max_tx_power_level = 0;
498*4882a593Smuzhiyun 	priv->min_tx_power_level = 0;
499*4882a593Smuzhiyun 	priv->tx_rate = 0;
500*4882a593Smuzhiyun 	priv->rxpd_rate_info = 0;
501*4882a593Smuzhiyun 	priv->rx_pkt_info = MFALSE;
502*4882a593Smuzhiyun 	/* refer to V15 CMD_TX_RATE_QUERY */
503*4882a593Smuzhiyun 	priv->rxpd_vhtinfo = 0;
504*4882a593Smuzhiyun 	priv->rxpd_rate = 0;
505*4882a593Smuzhiyun 	priv->data_rssi_last = 0;
506*4882a593Smuzhiyun 	priv->data_rssi_avg = 0;
507*4882a593Smuzhiyun 	priv->data_nf_avg = 0;
508*4882a593Smuzhiyun 	priv->data_nf_last = 0;
509*4882a593Smuzhiyun 	priv->bcn_rssi_last = 0;
510*4882a593Smuzhiyun 	priv->bcn_rssi_avg = 0;
511*4882a593Smuzhiyun 	priv->bcn_nf_avg = 0;
512*4882a593Smuzhiyun 	priv->bcn_nf_last = 0;
513*4882a593Smuzhiyun 	priv->sec_info.ewpa_enabled = MFALSE;
514*4882a593Smuzhiyun 	priv->sec_info.wpa_enabled = MFALSE;
515*4882a593Smuzhiyun 	priv->sec_info.wpa2_enabled = MFALSE;
516*4882a593Smuzhiyun 	memset(pmadapter, &priv->wpa_ie, 0, sizeof(priv->wpa_ie));
517*4882a593Smuzhiyun 	memset(pmadapter, &priv->aes_key, 0, sizeof(priv->aes_key));
518*4882a593Smuzhiyun 	priv->wpa_ie_len = 0;
519*4882a593Smuzhiyun 	priv->wpa_is_gtk_set = MFALSE;
520*4882a593Smuzhiyun #if defined(STA_SUPPORT)
521*4882a593Smuzhiyun 	priv->pmfcfg.mfpc = 0;
522*4882a593Smuzhiyun 	priv->pmfcfg.mfpr = 0;
523*4882a593Smuzhiyun 	memset(pmadapter, &priv->pmfcfg, 0, sizeof(priv->pmfcfg));
524*4882a593Smuzhiyun #endif
525*4882a593Smuzhiyun 	priv->sec_info.wapi_enabled = MFALSE;
526*4882a593Smuzhiyun 	priv->wapi_ie_len = 0;
527*4882a593Smuzhiyun 	priv->sec_info.wapi_key_on = MFALSE;
528*4882a593Smuzhiyun 	priv->osen_ie_len = 0;
529*4882a593Smuzhiyun 	memset(pmadapter, &priv->osen_ie, 0, sizeof(priv->osen_ie));
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun 	memset(pmadapter, &priv->wps, 0, sizeof(priv->wps));
532*4882a593Smuzhiyun 	memset(pmadapter, &priv->gen_ie_buf, 0, sizeof(priv->gen_ie_buf));
533*4882a593Smuzhiyun 	priv->gen_ie_buf_len = 0;
534*4882a593Smuzhiyun #endif /* STA_SUPPORT */
535*4882a593Smuzhiyun 	priv->wmm_required = MTRUE;
536*4882a593Smuzhiyun 	priv->wmm_enabled = MFALSE;
537*4882a593Smuzhiyun 	priv->disconnect_reason_code = 0;
538*4882a593Smuzhiyun 	priv->wmm_qosinfo = 0;
539*4882a593Smuzhiyun 	priv->saved_wmm_qosinfo = 0;
540*4882a593Smuzhiyun 	priv->host_tdls_cs_support = MTRUE;
541*4882a593Smuzhiyun 	priv->host_tdls_uapsd_support = MTRUE;
542*4882a593Smuzhiyun 	priv->tdls_cs_channel = 0;
543*4882a593Smuzhiyun 	priv->supp_regulatory_class_len = 0;
544*4882a593Smuzhiyun 	priv->chan_supp_len = 0;
545*4882a593Smuzhiyun 	memset(pmadapter, &priv->chan_supp, 0, sizeof(priv->chan_supp));
546*4882a593Smuzhiyun 	memset(pmadapter, &priv->supp_regulatory_class, 0,
547*4882a593Smuzhiyun 	       sizeof(priv->supp_regulatory_class));
548*4882a593Smuzhiyun 	priv->tdls_idle_time = TDLS_IDLE_TIMEOUT;
549*4882a593Smuzhiyun 	priv->txaggrctrl = MTRUE;
550*4882a593Smuzhiyun 	for (i = 0; i < MAX_MGMT_IE_INDEX; i++)
551*4882a593Smuzhiyun 		memset(pmadapter, &priv->mgmt_ie[i], 0, sizeof(custom_ie));
552*4882a593Smuzhiyun 	priv->mgmt_frame_passthru_mask = 0;
553*4882a593Smuzhiyun #ifdef STA_SUPPORT
554*4882a593Smuzhiyun 	priv->pcurr_bcn_buf = MNULL;
555*4882a593Smuzhiyun 	priv->curr_bcn_size = 0;
556*4882a593Smuzhiyun 	memset(pmadapter, &priv->ext_cap, 0, sizeof(priv->ext_cap));
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun 	SET_EXTCAP_OPERMODENTF(priv->ext_cap);
559*4882a593Smuzhiyun 	SET_EXTCAP_TDLS(priv->ext_cap);
560*4882a593Smuzhiyun 	SET_EXTCAP_QOS_MAP(priv->ext_cap);
561*4882a593Smuzhiyun 	/* Save default Extended Capability */
562*4882a593Smuzhiyun 	memcpy_ext(priv->adapter, &priv->def_ext_cap, &priv->ext_cap,
563*4882a593Smuzhiyun 		   sizeof(priv->ext_cap), sizeof(priv->def_ext_cap));
564*4882a593Smuzhiyun #endif /* STA_SUPPORT */
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun 	priv->amsdu_rx_cnt = 0;
567*4882a593Smuzhiyun 	priv->msdu_in_rx_amsdu_cnt = 0;
568*4882a593Smuzhiyun 	priv->amsdu_tx_cnt = 0;
569*4882a593Smuzhiyun 	priv->msdu_in_tx_amsdu_cnt = 0;
570*4882a593Smuzhiyun 	for (i = 0; i < MAX_NUM_TID; i++)
571*4882a593Smuzhiyun 		priv->addba_reject[i] = ADDBA_RSP_STATUS_ACCEPT;
572*4882a593Smuzhiyun 	priv->addba_reject[6] = ADDBA_RSP_STATUS_REJECT;
573*4882a593Smuzhiyun 	priv->addba_reject[7] = ADDBA_RSP_STATUS_REJECT;
574*4882a593Smuzhiyun 	memcpy_ext(priv->adapter, priv->ibss_addba_reject, priv->addba_reject,
575*4882a593Smuzhiyun 		   sizeof(priv->addba_reject), sizeof(priv->ibss_addba_reject));
576*4882a593Smuzhiyun 	priv->max_amsdu = 0;
577*4882a593Smuzhiyun #ifdef STA_SUPPORT
578*4882a593Smuzhiyun 	if (priv->bss_type == MLAN_BSS_TYPE_STA) {
579*4882a593Smuzhiyun 		priv->add_ba_param.tx_win_size = MLAN_STA_AMPDU_DEF_TXWINSIZE;
580*4882a593Smuzhiyun 		priv->add_ba_param.rx_win_size = MLAN_STA_AMPDU_DEF_RXWINSIZE;
581*4882a593Smuzhiyun 	}
582*4882a593Smuzhiyun #endif
583*4882a593Smuzhiyun #ifdef WIFI_DIRECT_SUPPORT
584*4882a593Smuzhiyun 	if (priv->bss_type == MLAN_BSS_TYPE_WIFIDIRECT) {
585*4882a593Smuzhiyun 		priv->add_ba_param.tx_win_size = MLAN_WFD_AMPDU_DEF_TXRXWINSIZE;
586*4882a593Smuzhiyun 		priv->add_ba_param.rx_win_size = MLAN_WFD_AMPDU_DEF_TXRXWINSIZE;
587*4882a593Smuzhiyun 	}
588*4882a593Smuzhiyun #endif
589*4882a593Smuzhiyun #ifdef UAP_SUPPORT
590*4882a593Smuzhiyun 	if (priv->bss_type == MLAN_BSS_TYPE_UAP) {
591*4882a593Smuzhiyun 		priv->add_ba_param.tx_win_size = MLAN_UAP_AMPDU_DEF_TXWINSIZE;
592*4882a593Smuzhiyun 		priv->add_ba_param.rx_win_size = MLAN_UAP_AMPDU_DEF_RXWINSIZE;
593*4882a593Smuzhiyun 		priv->aggr_prio_tbl[6].ampdu_user =
594*4882a593Smuzhiyun 			priv->aggr_prio_tbl[7].ampdu_user =
595*4882a593Smuzhiyun 				BA_STREAM_NOT_ALLOWED;
596*4882a593Smuzhiyun 	}
597*4882a593Smuzhiyun #endif
598*4882a593Smuzhiyun 	priv->user_rxwinsize = priv->add_ba_param.rx_win_size;
599*4882a593Smuzhiyun 	memset(pmadapter, priv->rx_seq, 0, sizeof(priv->rx_seq));
600*4882a593Smuzhiyun 	priv->port_ctrl_mode = MTRUE;
601*4882a593Smuzhiyun 	priv->port_open = MFALSE;
602*4882a593Smuzhiyun 	priv->prior_port_status = MFALSE;
603*4882a593Smuzhiyun 	priv->tx_pause = MFALSE;
604*4882a593Smuzhiyun 	priv->hotspot_cfg = 0;
605*4882a593Smuzhiyun 
606*4882a593Smuzhiyun 	priv->intf_hr_len = pmadapter->ops.intf_header_len;
607*4882a593Smuzhiyun 	memset(pmadapter, &priv->chan_rep_req, 0, sizeof(priv->chan_rep_req));
608*4882a593Smuzhiyun #ifdef USB
609*4882a593Smuzhiyun 	if (IS_USB(pmadapter->card_type)) {
610*4882a593Smuzhiyun 		pusb_tx_aggr =
611*4882a593Smuzhiyun 			wlan_get_usb_tx_aggr_params(pmadapter, priv->port);
612*4882a593Smuzhiyun 		if (pusb_tx_aggr && pusb_tx_aggr->aggr_ctrl.aggr_mode ==
613*4882a593Smuzhiyun 					    MLAN_USB_AGGR_MODE_LEN_V2) {
614*4882a593Smuzhiyun 			priv->intf_hr_len = MLAN_USB_TX_AGGR_HEADER;
615*4882a593Smuzhiyun 		}
616*4882a593Smuzhiyun 		priv->port = pmadapter->tx_data_ep;
617*4882a593Smuzhiyun 	}
618*4882a593Smuzhiyun #endif
619*4882a593Smuzhiyun 	ret = wlan_add_bsspriotbl(priv);
620*4882a593Smuzhiyun #if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT)
621*4882a593Smuzhiyun 	hostsa_init(priv);
622*4882a593Smuzhiyun #endif
623*4882a593Smuzhiyun 
624*4882a593Smuzhiyun 	LEAVE();
625*4882a593Smuzhiyun 	return ret;
626*4882a593Smuzhiyun }
627*4882a593Smuzhiyun 
628*4882a593Smuzhiyun /**
629*4882a593Smuzhiyun  *  @brief This function initializes the adapter structure
630*4882a593Smuzhiyun  *          and sets default values to the members of adapter.
631*4882a593Smuzhiyun  *
632*4882a593Smuzhiyun  *  @param pmadapter    A pointer to mlan_adapter structure
633*4882a593Smuzhiyun  *
634*4882a593Smuzhiyun  *  @return             N/A
635*4882a593Smuzhiyun  */
wlan_init_adapter(pmlan_adapter pmadapter)636*4882a593Smuzhiyun t_void wlan_init_adapter(pmlan_adapter pmadapter)
637*4882a593Smuzhiyun {
638*4882a593Smuzhiyun 	opt_sleep_confirm_buffer *sleep_cfm_buf = MNULL;
639*4882a593Smuzhiyun #ifdef USB
640*4882a593Smuzhiyun 	t_s32 i = 0;
641*4882a593Smuzhiyun #endif
642*4882a593Smuzhiyun 	ENTER();
643*4882a593Smuzhiyun 
644*4882a593Smuzhiyun 	if (pmadapter->psleep_cfm) {
645*4882a593Smuzhiyun 		sleep_cfm_buf = (opt_sleep_confirm_buffer
646*4882a593Smuzhiyun 					 *)(pmadapter->psleep_cfm->pbuf +
647*4882a593Smuzhiyun 					    pmadapter->psleep_cfm->data_offset);
648*4882a593Smuzhiyun 	}
649*4882a593Smuzhiyun #ifdef MFG_CMD_SUPPORT
650*4882a593Smuzhiyun 	if (pmadapter->init_para.mfg_mode == MLAN_INIT_PARA_DISABLED)
651*4882a593Smuzhiyun 		pmadapter->mfg_mode = MFALSE;
652*4882a593Smuzhiyun 	else
653*4882a593Smuzhiyun 		pmadapter->mfg_mode = pmadapter->init_para.mfg_mode;
654*4882a593Smuzhiyun #endif
655*4882a593Smuzhiyun 
656*4882a593Smuzhiyun #ifdef STA_SUPPORT
657*4882a593Smuzhiyun 	pmadapter->pwarm_reset_ioctl_req = MNULL;
658*4882a593Smuzhiyun #endif
659*4882a593Smuzhiyun 	pmadapter->pscan_ioctl_req = MNULL;
660*4882a593Smuzhiyun 	pmadapter->cmd_sent = MFALSE;
661*4882a593Smuzhiyun 	pmadapter->mlan_processing = MFALSE;
662*4882a593Smuzhiyun 	pmadapter->main_process_cnt = 0;
663*4882a593Smuzhiyun 	pmadapter->mlan_rx_processing = MFALSE;
664*4882a593Smuzhiyun 	pmadapter->more_rx_task_flag = MFALSE;
665*4882a593Smuzhiyun 	pmadapter->more_task_flag = MFALSE;
666*4882a593Smuzhiyun 	pmadapter->delay_task_flag = MFALSE;
667*4882a593Smuzhiyun 	pmadapter->data_sent = MFALSE;
668*4882a593Smuzhiyun 	pmadapter->data_sent_cnt = 0;
669*4882a593Smuzhiyun 
670*4882a593Smuzhiyun #ifdef SDIO
671*4882a593Smuzhiyun 	if (IS_SD(pmadapter->card_type)) {
672*4882a593Smuzhiyun 		pmadapter->pcard_sd->int_mode = pmadapter->init_para.int_mode;
673*4882a593Smuzhiyun 		pmadapter->pcard_sd->gpio_pin = pmadapter->init_para.gpio_pin;
674*4882a593Smuzhiyun 		pmadapter->data_sent = MTRUE;
675*4882a593Smuzhiyun 		pmadapter->pcard_sd->mp_rd_bitmap = 0;
676*4882a593Smuzhiyun 		pmadapter->pcard_sd->mp_wr_bitmap = 0;
677*4882a593Smuzhiyun 		pmadapter->pcard_sd->curr_rd_port =
678*4882a593Smuzhiyun 			pmadapter->pcard_sd->reg->start_rd_port;
679*4882a593Smuzhiyun 		pmadapter->pcard_sd->curr_wr_port =
680*4882a593Smuzhiyun 			pmadapter->pcard_sd->reg->start_wr_port;
681*4882a593Smuzhiyun 		pmadapter->pcard_sd->mp_data_port_mask =
682*4882a593Smuzhiyun 			pmadapter->pcard_sd->reg->data_port_mask;
683*4882a593Smuzhiyun 		pmadapter->pcard_sd->mp_invalid_update = 0;
684*4882a593Smuzhiyun 		memset(pmadapter, pmadapter->pcard_sd->mp_update, 0,
685*4882a593Smuzhiyun 		       sizeof(pmadapter->pcard_sd->mp_update));
686*4882a593Smuzhiyun 		pmadapter->pcard_sd->mpa_tx.buf_len = 0;
687*4882a593Smuzhiyun 		pmadapter->pcard_sd->mpa_tx.pkt_cnt = 0;
688*4882a593Smuzhiyun 		pmadapter->pcard_sd->mpa_tx.start_port =
689*4882a593Smuzhiyun 			pmadapter->pcard_sd->reg->start_wr_port;
690*4882a593Smuzhiyun 
691*4882a593Smuzhiyun 		if (!pmadapter->init_para.mpa_tx_cfg)
692*4882a593Smuzhiyun 			pmadapter->pcard_sd->mpa_tx.enabled = MFALSE;
693*4882a593Smuzhiyun 		else if (pmadapter->init_para.mpa_tx_cfg ==
694*4882a593Smuzhiyun 			 MLAN_INIT_PARA_DISABLED)
695*4882a593Smuzhiyun 			pmadapter->pcard_sd->mpa_tx.enabled = MFALSE;
696*4882a593Smuzhiyun 		else
697*4882a593Smuzhiyun 			pmadapter->pcard_sd->mpa_tx.enabled = MTRUE;
698*4882a593Smuzhiyun 		pmadapter->pcard_sd->mpa_tx.pkt_aggr_limit =
699*4882a593Smuzhiyun 			pmadapter->pcard_sd->mp_aggr_pkt_limit;
700*4882a593Smuzhiyun 
701*4882a593Smuzhiyun 		pmadapter->pcard_sd->mpa_rx.buf_len = 0;
702*4882a593Smuzhiyun 		pmadapter->pcard_sd->mpa_rx.pkt_cnt = 0;
703*4882a593Smuzhiyun 		pmadapter->pcard_sd->mpa_rx.start_port =
704*4882a593Smuzhiyun 			pmadapter->pcard_sd->reg->start_rd_port;
705*4882a593Smuzhiyun 
706*4882a593Smuzhiyun 		if (!pmadapter->init_para.mpa_rx_cfg)
707*4882a593Smuzhiyun 			pmadapter->pcard_sd->mpa_rx.enabled = MFALSE;
708*4882a593Smuzhiyun 		else if (pmadapter->init_para.mpa_rx_cfg ==
709*4882a593Smuzhiyun 			 MLAN_INIT_PARA_DISABLED)
710*4882a593Smuzhiyun 			pmadapter->pcard_sd->mpa_rx.enabled = MFALSE;
711*4882a593Smuzhiyun 		else
712*4882a593Smuzhiyun 			pmadapter->pcard_sd->mpa_rx.enabled = MTRUE;
713*4882a593Smuzhiyun 		pmadapter->pcard_sd->mpa_rx.pkt_aggr_limit =
714*4882a593Smuzhiyun 			pmadapter->pcard_sd->mp_aggr_pkt_limit;
715*4882a593Smuzhiyun 	}
716*4882a593Smuzhiyun #endif
717*4882a593Smuzhiyun 
718*4882a593Smuzhiyun 	pmadapter->rx_pkts_queued = 0;
719*4882a593Smuzhiyun 	pmadapter->cmd_resp_received = MFALSE;
720*4882a593Smuzhiyun 	pmadapter->event_received = MFALSE;
721*4882a593Smuzhiyun 	pmadapter->data_received = MFALSE;
722*4882a593Smuzhiyun 	pmadapter->seq_num = 0;
723*4882a593Smuzhiyun 	pmadapter->num_cmd_timeout = 0;
724*4882a593Smuzhiyun 	pmadapter->last_init_cmd = 0;
725*4882a593Smuzhiyun 	pmadapter->pending_ioctl = MFALSE;
726*4882a593Smuzhiyun 	pmadapter->scan_processing = MFALSE;
727*4882a593Smuzhiyun 	pmadapter->fw_roaming = MFALSE;
728*4882a593Smuzhiyun 	pmadapter->userset_passphrase = MFALSE;
729*4882a593Smuzhiyun 	pmadapter->cmd_timer_is_set = MFALSE;
730*4882a593Smuzhiyun 	pmadapter->dnld_cmd_in_secs = 0;
731*4882a593Smuzhiyun 
732*4882a593Smuzhiyun 	/* PnP and power profile */
733*4882a593Smuzhiyun 	pmadapter->surprise_removed = MFALSE;
734*4882a593Smuzhiyun 	/* FW hang report */
735*4882a593Smuzhiyun 	pmadapter->fw_hang_report = MFALSE;
736*4882a593Smuzhiyun 	pmadapter->ecsa_enable = MFALSE;
737*4882a593Smuzhiyun 	pmadapter->getlog_enable = MFALSE;
738*4882a593Smuzhiyun 
739*4882a593Smuzhiyun 	if (!pmadapter->init_para.ps_mode) {
740*4882a593Smuzhiyun 		pmadapter->ps_mode = DEFAULT_PS_MODE;
741*4882a593Smuzhiyun 	} else if (pmadapter->init_para.ps_mode == MLAN_INIT_PARA_DISABLED)
742*4882a593Smuzhiyun 		pmadapter->ps_mode = Wlan802_11PowerModeCAM;
743*4882a593Smuzhiyun 	else
744*4882a593Smuzhiyun 		pmadapter->ps_mode = Wlan802_11PowerModePSP;
745*4882a593Smuzhiyun 	pmadapter->ps_state = PS_STATE_AWAKE;
746*4882a593Smuzhiyun 	pmadapter->need_to_wakeup = MFALSE;
747*4882a593Smuzhiyun 
748*4882a593Smuzhiyun #ifdef STA_SUPPORT
749*4882a593Smuzhiyun 	pmadapter->scan_block = MFALSE;
750*4882a593Smuzhiyun 	/* Scan type */
751*4882a593Smuzhiyun 	pmadapter->scan_type = MLAN_SCAN_TYPE_ACTIVE;
752*4882a593Smuzhiyun 	/* Scan mode */
753*4882a593Smuzhiyun 	pmadapter->scan_mode = HostCmd_BSS_MODE_ANY;
754*4882a593Smuzhiyun 	/* Scan time */
755*4882a593Smuzhiyun 	pmadapter->specific_scan_time = MRVDRV_SPECIFIC_SCAN_CHAN_TIME;
756*4882a593Smuzhiyun 	pmadapter->active_scan_time = MRVDRV_ACTIVE_SCAN_CHAN_TIME;
757*4882a593Smuzhiyun 	pmadapter->passive_scan_time = MRVDRV_PASSIVE_SCAN_CHAN_TIME;
758*4882a593Smuzhiyun 	if (!pmadapter->init_para.passive_to_active_scan)
759*4882a593Smuzhiyun 		pmadapter->passive_to_active_scan = MLAN_PASS_TO_ACT_SCAN_EN;
760*4882a593Smuzhiyun 	else if (pmadapter->init_para.passive_to_active_scan ==
761*4882a593Smuzhiyun 		 MLAN_INIT_PARA_DISABLED)
762*4882a593Smuzhiyun 		pmadapter->passive_to_active_scan = MLAN_PASS_TO_ACT_SCAN_DIS;
763*4882a593Smuzhiyun 	else
764*4882a593Smuzhiyun 		pmadapter->passive_to_active_scan = MLAN_PASS_TO_ACT_SCAN_EN;
765*4882a593Smuzhiyun 
766*4882a593Smuzhiyun 	pmadapter->scan_chan_gap = 0;
767*4882a593Smuzhiyun 	pmadapter->num_in_scan_table = 0;
768*4882a593Smuzhiyun 	memset(pmadapter, pmadapter->pscan_table, 0,
769*4882a593Smuzhiyun 	       (sizeof(BSSDescriptor_t) * MRVDRV_MAX_BSSID_LIST));
770*4882a593Smuzhiyun 	pmadapter->active_scan_triggered = MFALSE;
771*4882a593Smuzhiyun 	if (!pmadapter->init_para.ext_scan)
772*4882a593Smuzhiyun 		pmadapter->ext_scan = EXT_SCAN_TYPE_ENH;
773*4882a593Smuzhiyun 	else if (pmadapter->init_para.ext_scan == EXT_SCAN_TYPE_ENH)
774*4882a593Smuzhiyun 		pmadapter->ext_scan = EXT_SCAN_TYPE_ENH;
775*4882a593Smuzhiyun 	else
776*4882a593Smuzhiyun 		pmadapter->ext_scan = MTRUE;
777*4882a593Smuzhiyun 	pmadapter->ext_scan_enh = MFALSE;
778*4882a593Smuzhiyun 	pmadapter->ext_scan_timeout = MFALSE;
779*4882a593Smuzhiyun 	pmadapter->scan_probes = DEFAULT_PROBES;
780*4882a593Smuzhiyun 
781*4882a593Smuzhiyun 	memset(pmadapter, pmadapter->bcn_buf, 0, pmadapter->bcn_buf_size);
782*4882a593Smuzhiyun 	pmadapter->pbcn_buf_end = pmadapter->bcn_buf;
783*4882a593Smuzhiyun 
784*4882a593Smuzhiyun 	pmadapter->radio_on = RADIO_ON;
785*4882a593Smuzhiyun 	if (!pmadapter->multiple_dtim)
786*4882a593Smuzhiyun 		pmadapter->multiple_dtim = MRVDRV_DEFAULT_MULTIPLE_DTIM;
787*4882a593Smuzhiyun 
788*4882a593Smuzhiyun 	pmadapter->local_listen_interval = 0; /* default value in firmware will
789*4882a593Smuzhiyun 						 be used */
790*4882a593Smuzhiyun #endif /* STA_SUPPORT */
791*4882a593Smuzhiyun 
792*4882a593Smuzhiyun 	pmadapter->is_deep_sleep = MFALSE;
793*4882a593Smuzhiyun 	pmadapter->idle_time = DEEP_SLEEP_IDLE_TIME;
794*4882a593Smuzhiyun 	if (!pmadapter->init_para.auto_ds)
795*4882a593Smuzhiyun 		pmadapter->init_auto_ds = DEFAULT_AUTO_DS_MODE;
796*4882a593Smuzhiyun 	else if (pmadapter->init_para.auto_ds == MLAN_INIT_PARA_DISABLED)
797*4882a593Smuzhiyun 		pmadapter->init_auto_ds = MFALSE;
798*4882a593Smuzhiyun 	else
799*4882a593Smuzhiyun 		pmadapter->init_auto_ds = MTRUE;
800*4882a593Smuzhiyun 
801*4882a593Smuzhiyun 	pmadapter->delay_null_pkt = MFALSE;
802*4882a593Smuzhiyun 	pmadapter->delay_to_ps = DELAY_TO_PS_DEFAULT;
803*4882a593Smuzhiyun 	pmadapter->enhanced_ps_mode = PS_MODE_AUTO;
804*4882a593Smuzhiyun 
805*4882a593Smuzhiyun 	pmadapter->gen_null_pkt = MFALSE; /* Disable NULL Pkt generation-default
806*4882a593Smuzhiyun 					   */
807*4882a593Smuzhiyun 	pmadapter->pps_uapsd_mode = MFALSE; /* Disable pps/uapsd mode -default
808*4882a593Smuzhiyun 					     */
809*4882a593Smuzhiyun 
810*4882a593Smuzhiyun 	pmadapter->pm_wakeup_card_req = MFALSE;
811*4882a593Smuzhiyun 
812*4882a593Smuzhiyun 	pmadapter->pm_wakeup_fw_try = MFALSE;
813*4882a593Smuzhiyun 	pmadapter->pm_wakeup_timeout = 0;
814*4882a593Smuzhiyun 
815*4882a593Smuzhiyun 	if (!pmadapter->init_para.max_tx_buf)
816*4882a593Smuzhiyun 		pmadapter->max_tx_buf_size =
817*4882a593Smuzhiyun 			pmadapter->pcard_info->max_tx_buf_size;
818*4882a593Smuzhiyun 	else
819*4882a593Smuzhiyun 		pmadapter->max_tx_buf_size =
820*4882a593Smuzhiyun 			(t_u16)pmadapter->init_para.max_tx_buf;
821*4882a593Smuzhiyun 	pmadapter->tx_buf_size = MLAN_TX_DATA_BUF_SIZE_2K;
822*4882a593Smuzhiyun 	pmadapter->curr_tx_buf_size = MLAN_TX_DATA_BUF_SIZE_2K;
823*4882a593Smuzhiyun 
824*4882a593Smuzhiyun #ifdef USB
825*4882a593Smuzhiyun 	if (IS_USB(pmadapter->card_type)) {
826*4882a593Smuzhiyun 		for (i = 0; i < MAX_USB_TX_PORT_NUM; i++) {
827*4882a593Smuzhiyun 			pmadapter->pcard_usb->usb_tx_aggr[i].aggr_ctrl.enable =
828*4882a593Smuzhiyun 				MFALSE;
829*4882a593Smuzhiyun 			pmadapter->pcard_usb->usb_tx_aggr[i]
830*4882a593Smuzhiyun 				.aggr_ctrl.aggr_mode =
831*4882a593Smuzhiyun 				MLAN_USB_AGGR_MODE_LEN_V2;
832*4882a593Smuzhiyun 			pmadapter->pcard_usb->usb_tx_aggr[i]
833*4882a593Smuzhiyun 				.aggr_ctrl.aggr_align =
834*4882a593Smuzhiyun 				MLAN_USB_TX_AGGR_V2_ALIGN;
835*4882a593Smuzhiyun 			pmadapter->pcard_usb->usb_tx_aggr[i].aggr_ctrl.aggr_max =
836*4882a593Smuzhiyun 				MLAN_USB_TX_AGGR_MAX_LEN;
837*4882a593Smuzhiyun 			pmadapter->pcard_usb->usb_tx_aggr[i].aggr_ctrl.aggr_tmo =
838*4882a593Smuzhiyun 				MLAN_USB_TX_AGGR_TIMEOUT_MSEC * 1000;
839*4882a593Smuzhiyun 
840*4882a593Smuzhiyun 			pmadapter->pcard_usb->usb_tx_aggr[i].pmbuf_aggr = MNULL;
841*4882a593Smuzhiyun 			pmadapter->pcard_usb->usb_tx_aggr[i].aggr_len = 0;
842*4882a593Smuzhiyun 			pmadapter->pcard_usb->usb_tx_aggr[i].hold_timeout_msec =
843*4882a593Smuzhiyun 				MLAN_USB_TX_AGGR_TIMEOUT_MSEC;
844*4882a593Smuzhiyun 			pmadapter->pcard_usb->usb_tx_aggr[i].port =
845*4882a593Smuzhiyun 				pmadapter->tx_data_ep;
846*4882a593Smuzhiyun 			pmadapter->pcard_usb->usb_tx_aggr[i].phandle =
847*4882a593Smuzhiyun 				(t_void *)pmadapter;
848*4882a593Smuzhiyun 		}
849*4882a593Smuzhiyun 
850*4882a593Smuzhiyun 		pmadapter->pcard_usb->usb_rx_deaggr.aggr_ctrl.enable = MFALSE;
851*4882a593Smuzhiyun 		pmadapter->pcard_usb->usb_rx_deaggr.aggr_ctrl.aggr_mode =
852*4882a593Smuzhiyun 			MLAN_USB_AGGR_MODE_NUM;
853*4882a593Smuzhiyun 		pmadapter->pcard_usb->usb_rx_deaggr.aggr_ctrl.aggr_align =
854*4882a593Smuzhiyun 			MLAN_USB_RX_ALIGN_SIZE;
855*4882a593Smuzhiyun 		pmadapter->pcard_usb->usb_rx_deaggr.aggr_ctrl.aggr_max =
856*4882a593Smuzhiyun 			MLAN_USB_RX_MAX_AGGR_NUM;
857*4882a593Smuzhiyun 		pmadapter->pcard_usb->usb_rx_deaggr.aggr_ctrl.aggr_tmo =
858*4882a593Smuzhiyun 			MLAN_USB_RX_DEAGGR_TIMEOUT_USEC;
859*4882a593Smuzhiyun 
860*4882a593Smuzhiyun 		pmadapter->pcard_usb->fw_usb_aggr = MTRUE;
861*4882a593Smuzhiyun 	}
862*4882a593Smuzhiyun #endif
863*4882a593Smuzhiyun 
864*4882a593Smuzhiyun 	pmadapter->is_hs_configured = MFALSE;
865*4882a593Smuzhiyun 	pmadapter->hs_cfg.conditions = HOST_SLEEP_DEF_COND;
866*4882a593Smuzhiyun 	pmadapter->hs_cfg.gpio = HOST_SLEEP_DEF_GPIO;
867*4882a593Smuzhiyun 	pmadapter->hs_cfg.gap = HOST_SLEEP_DEF_GAP;
868*4882a593Smuzhiyun 	pmadapter->hs_activated = MFALSE;
869*4882a593Smuzhiyun 	pmadapter->min_wake_holdoff = HOST_SLEEP_DEF_WAKE_HOLDOFF;
870*4882a593Smuzhiyun 	pmadapter->hs_inactivity_timeout = HOST_SLEEP_DEF_INACTIVITY_TIMEOUT;
871*4882a593Smuzhiyun 
872*4882a593Smuzhiyun 	memset(pmadapter, pmadapter->event_body, 0,
873*4882a593Smuzhiyun 	       sizeof(pmadapter->event_body));
874*4882a593Smuzhiyun 	pmadapter->hw_dot_11n_dev_cap = 0;
875*4882a593Smuzhiyun 	pmadapter->hw_dev_mcs_support = 0;
876*4882a593Smuzhiyun 	pmadapter->coex_rx_winsize = 1;
877*4882a593Smuzhiyun #ifdef STA_SUPPORT
878*4882a593Smuzhiyun 	pmadapter->chan_bandwidth = 0;
879*4882a593Smuzhiyun 	pmadapter->tdls_status = TDLS_NOT_SETUP;
880*4882a593Smuzhiyun #endif /* STA_SUPPORT */
881*4882a593Smuzhiyun 
882*4882a593Smuzhiyun 	pmadapter->min_ba_threshold = MIN_BA_THRESHOLD;
883*4882a593Smuzhiyun 	pmadapter->hw_dot_11ac_dev_cap = 0;
884*4882a593Smuzhiyun 	pmadapter->hw_dot_11ac_mcs_support = 0;
885*4882a593Smuzhiyun 	pmadapter->max_sta_conn = 0;
886*4882a593Smuzhiyun 	/* Initialize 802.11d */
887*4882a593Smuzhiyun 	wlan_11d_init(pmadapter);
888*4882a593Smuzhiyun 
889*4882a593Smuzhiyun 	wlan_11h_init(pmadapter);
890*4882a593Smuzhiyun 
891*4882a593Smuzhiyun 	wlan_wmm_init(pmadapter);
892*4882a593Smuzhiyun 	wlan_init_wmm_param(pmadapter);
893*4882a593Smuzhiyun 	pmadapter->bypass_pkt_count = 0;
894*4882a593Smuzhiyun 	if (pmadapter->psleep_cfm) {
895*4882a593Smuzhiyun 		pmadapter->psleep_cfm->buf_type = MLAN_BUF_TYPE_CMD;
896*4882a593Smuzhiyun 		pmadapter->psleep_cfm->data_len = sizeof(OPT_Confirm_Sleep);
897*4882a593Smuzhiyun 		memset(pmadapter, &sleep_cfm_buf->ps_cfm_sleep, 0,
898*4882a593Smuzhiyun 		       sizeof(OPT_Confirm_Sleep));
899*4882a593Smuzhiyun 		sleep_cfm_buf->ps_cfm_sleep.command =
900*4882a593Smuzhiyun 			wlan_cpu_to_le16(HostCmd_CMD_802_11_PS_MODE_ENH);
901*4882a593Smuzhiyun 		sleep_cfm_buf->ps_cfm_sleep.size =
902*4882a593Smuzhiyun 			wlan_cpu_to_le16(sizeof(OPT_Confirm_Sleep));
903*4882a593Smuzhiyun 		sleep_cfm_buf->ps_cfm_sleep.result = 0;
904*4882a593Smuzhiyun 		sleep_cfm_buf->ps_cfm_sleep.action =
905*4882a593Smuzhiyun 			wlan_cpu_to_le16(SLEEP_CONFIRM);
906*4882a593Smuzhiyun 		sleep_cfm_buf->ps_cfm_sleep.sleep_cfm.resp_ctrl =
907*4882a593Smuzhiyun 			wlan_cpu_to_le16(RESP_NEEDED);
908*4882a593Smuzhiyun #ifdef USB
909*4882a593Smuzhiyun 		if (IS_USB(pmadapter->card_type)) {
910*4882a593Smuzhiyun 			sleep_cfm_buf->hdr =
911*4882a593Smuzhiyun 				wlan_cpu_to_le32(MLAN_USB_TYPE_CMD);
912*4882a593Smuzhiyun 			pmadapter->psleep_cfm->data_len += MLAN_TYPE_LEN;
913*4882a593Smuzhiyun 		}
914*4882a593Smuzhiyun #endif
915*4882a593Smuzhiyun 	}
916*4882a593Smuzhiyun 	memset(pmadapter, &pmadapter->sleep_params, 0,
917*4882a593Smuzhiyun 	       sizeof(pmadapter->sleep_params));
918*4882a593Smuzhiyun 	memset(pmadapter, &pmadapter->sleep_period, 0,
919*4882a593Smuzhiyun 	       sizeof(pmadapter->sleep_period));
920*4882a593Smuzhiyun 	memset(pmadapter, &pmadapter->saved_sleep_period, 0,
921*4882a593Smuzhiyun 	       sizeof(pmadapter->saved_sleep_period));
922*4882a593Smuzhiyun 	pmadapter->tx_lock_flag = MFALSE;
923*4882a593Smuzhiyun 	pmadapter->rx_lock_flag = MFALSE;
924*4882a593Smuzhiyun 	pmadapter->main_lock_flag = MFALSE;
925*4882a593Smuzhiyun 	pmadapter->null_pkt_interval = 0;
926*4882a593Smuzhiyun 	pmadapter->fw_bands = 0;
927*4882a593Smuzhiyun 	pmadapter->config_bands = 0;
928*4882a593Smuzhiyun 	pmadapter->adhoc_start_band = 0;
929*4882a593Smuzhiyun 	pmadapter->pscan_channels = MNULL;
930*4882a593Smuzhiyun 	pmadapter->fw_release_number = 0;
931*4882a593Smuzhiyun 	pmadapter->fw_cap_info = 0;
932*4882a593Smuzhiyun 	memset(pmadapter, &pmadapter->upld_buf, 0, sizeof(pmadapter->upld_buf));
933*4882a593Smuzhiyun 	pmadapter->upld_len = 0;
934*4882a593Smuzhiyun 	pmadapter->event_cause = 0;
935*4882a593Smuzhiyun 	pmadapter->pmlan_buffer_event = MNULL;
936*4882a593Smuzhiyun 	memset(pmadapter, &pmadapter->region_channel, 0,
937*4882a593Smuzhiyun 	       sizeof(pmadapter->region_channel));
938*4882a593Smuzhiyun 	pmadapter->region_code = 0;
939*4882a593Smuzhiyun 	memcpy_ext(pmadapter, pmadapter->country_code,
940*4882a593Smuzhiyun 		   MRVDRV_DEFAULT_COUNTRY_CODE, COUNTRY_CODE_LEN,
941*4882a593Smuzhiyun 		   COUNTRY_CODE_LEN);
942*4882a593Smuzhiyun 	pmadapter->bcn_miss_time_out = DEFAULT_BCN_MISS_TIMEOUT;
943*4882a593Smuzhiyun #ifdef STA_SUPPORT
944*4882a593Smuzhiyun 	memset(pmadapter, &pmadapter->arp_filter, 0,
945*4882a593Smuzhiyun 	       sizeof(pmadapter->arp_filter));
946*4882a593Smuzhiyun 	pmadapter->arp_filter_size = 0;
947*4882a593Smuzhiyun #endif /* STA_SUPPORT */
948*4882a593Smuzhiyun 
949*4882a593Smuzhiyun #ifdef PCIE
950*4882a593Smuzhiyun 	if (IS_PCIE(pmadapter->card_type)) {
951*4882a593Smuzhiyun 		pmadapter->pcard_pcie->txbd_wrptr = 0;
952*4882a593Smuzhiyun 		pmadapter->pcard_pcie->txbd_rdptr = 0;
953*4882a593Smuzhiyun 		pmadapter->pcard_pcie->rxbd_rdptr = 0;
954*4882a593Smuzhiyun 		pmadapter->pcard_pcie->evtbd_rdptr = 0;
955*4882a593Smuzhiyun #if defined(PCIE8997) || defined(PCIE8897)
956*4882a593Smuzhiyun 		if (!pmadapter->pcard_pcie->reg->use_adma) {
957*4882a593Smuzhiyun 			pmadapter->pcard_pcie->rxbd_wrptr =
958*4882a593Smuzhiyun 				pmadapter->pcard_pcie->reg
959*4882a593Smuzhiyun 					->txrx_rw_ptr_rollover_ind;
960*4882a593Smuzhiyun 			pmadapter->pcard_pcie->evtbd_wrptr =
961*4882a593Smuzhiyun 				EVT_RW_PTR_ROLLOVER_IND;
962*4882a593Smuzhiyun 		}
963*4882a593Smuzhiyun #endif
964*4882a593Smuzhiyun #if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
965*4882a593Smuzhiyun 		if (pmadapter->pcard_pcie->reg->use_adma) {
966*4882a593Smuzhiyun 			pmadapter->pcard_pcie->rxbd_wrptr =
967*4882a593Smuzhiyun 				pmadapter->pcard_pcie->txrx_bd_size;
968*4882a593Smuzhiyun 			pmadapter->pcard_pcie->evtbd_wrptr = MLAN_MAX_EVT_BD;
969*4882a593Smuzhiyun 		}
970*4882a593Smuzhiyun #endif
971*4882a593Smuzhiyun 	}
972*4882a593Smuzhiyun #endif
973*4882a593Smuzhiyun 	LEAVE();
974*4882a593Smuzhiyun 	return;
975*4882a593Smuzhiyun }
976*4882a593Smuzhiyun 
977*4882a593Smuzhiyun /**
978*4882a593Smuzhiyun  *  @brief This function intializes the lock variables and
979*4882a593Smuzhiyun  *  the list heads for interface
980*4882a593Smuzhiyun  *
981*4882a593Smuzhiyun  *  @param pmadapter  A pointer to a mlan_adapter structure
982*4882a593Smuzhiyun  *  @param start_index   start index of mlan private
983*4882a593Smuzhiyun  *
984*4882a593Smuzhiyun  *  @return           MLAN_STATUS_SUCCESS -- on success,
985*4882a593Smuzhiyun  *                    otherwise MLAN_STATUS_FAILURE
986*4882a593Smuzhiyun  *
987*4882a593Smuzhiyun  */
wlan_init_priv_lock_list(pmlan_adapter pmadapter,t_u8 start_index)988*4882a593Smuzhiyun mlan_status wlan_init_priv_lock_list(pmlan_adapter pmadapter, t_u8 start_index)
989*4882a593Smuzhiyun {
990*4882a593Smuzhiyun 	mlan_status ret = MLAN_STATUS_SUCCESS;
991*4882a593Smuzhiyun 	pmlan_private priv = MNULL;
992*4882a593Smuzhiyun 	pmlan_callbacks pcb = &pmadapter->callbacks;
993*4882a593Smuzhiyun 	t_s32 i = 0;
994*4882a593Smuzhiyun 	t_u32 j = 0;
995*4882a593Smuzhiyun 	for (i = start_index; i < pmadapter->priv_num; i++) {
996*4882a593Smuzhiyun 		if (pmadapter->priv[i]) {
997*4882a593Smuzhiyun 			priv = pmadapter->priv[i];
998*4882a593Smuzhiyun 			if (pcb->moal_init_lock(pmadapter->pmoal_handle,
999*4882a593Smuzhiyun 						&priv->rx_pkt_lock) !=
1000*4882a593Smuzhiyun 			    MLAN_STATUS_SUCCESS) {
1001*4882a593Smuzhiyun 				ret = MLAN_STATUS_FAILURE;
1002*4882a593Smuzhiyun 				goto error;
1003*4882a593Smuzhiyun 			}
1004*4882a593Smuzhiyun 			if (pcb->moal_init_lock(pmadapter->pmoal_handle,
1005*4882a593Smuzhiyun 						&priv->wmm.ra_list_spinlock) !=
1006*4882a593Smuzhiyun 			    MLAN_STATUS_SUCCESS) {
1007*4882a593Smuzhiyun 				ret = MLAN_STATUS_FAILURE;
1008*4882a593Smuzhiyun 				goto error;
1009*4882a593Smuzhiyun 			}
1010*4882a593Smuzhiyun #ifdef STA_SUPPORT
1011*4882a593Smuzhiyun 			if (pcb->moal_init_lock(pmadapter->pmoal_handle,
1012*4882a593Smuzhiyun 						&priv->curr_bcn_buf_lock) !=
1013*4882a593Smuzhiyun 			    MLAN_STATUS_SUCCESS) {
1014*4882a593Smuzhiyun 				ret = MLAN_STATUS_FAILURE;
1015*4882a593Smuzhiyun 				goto error;
1016*4882a593Smuzhiyun 			}
1017*4882a593Smuzhiyun #endif
1018*4882a593Smuzhiyun 		}
1019*4882a593Smuzhiyun 	}
1020*4882a593Smuzhiyun 	for (i = start_index; i < pmadapter->priv_num; ++i) {
1021*4882a593Smuzhiyun 		util_init_list_head((t_void *)pmadapter->pmoal_handle,
1022*4882a593Smuzhiyun 				    &pmadapter->bssprio_tbl[i].bssprio_head,
1023*4882a593Smuzhiyun 				    MTRUE, pmadapter->callbacks.moal_init_lock);
1024*4882a593Smuzhiyun 		pmadapter->bssprio_tbl[i].bssprio_cur = MNULL;
1025*4882a593Smuzhiyun 	}
1026*4882a593Smuzhiyun 
1027*4882a593Smuzhiyun 	for (i = start_index; i < pmadapter->priv_num; i++) {
1028*4882a593Smuzhiyun 		if (pmadapter->priv[i]) {
1029*4882a593Smuzhiyun 			priv = pmadapter->priv[i];
1030*4882a593Smuzhiyun 			for (j = 0; j < MAX_NUM_TID; ++j) {
1031*4882a593Smuzhiyun 				util_init_list_head(
1032*4882a593Smuzhiyun 					(t_void *)pmadapter->pmoal_handle,
1033*4882a593Smuzhiyun 					&priv->wmm.tid_tbl_ptr[j].ra_list,
1034*4882a593Smuzhiyun 					MTRUE,
1035*4882a593Smuzhiyun 					priv->adapter->callbacks.moal_init_lock);
1036*4882a593Smuzhiyun 			}
1037*4882a593Smuzhiyun 			util_init_list_head(
1038*4882a593Smuzhiyun 				(t_void *)pmadapter->pmoal_handle,
1039*4882a593Smuzhiyun 				&priv->tx_ba_stream_tbl_ptr, MTRUE,
1040*4882a593Smuzhiyun 				pmadapter->callbacks.moal_init_lock);
1041*4882a593Smuzhiyun 			util_init_list_head(
1042*4882a593Smuzhiyun 				(t_void *)pmadapter->pmoal_handle,
1043*4882a593Smuzhiyun 				&priv->rx_reorder_tbl_ptr, MTRUE,
1044*4882a593Smuzhiyun 				pmadapter->callbacks.moal_init_lock);
1045*4882a593Smuzhiyun 			util_scalar_init((t_void *)pmadapter->pmoal_handle,
1046*4882a593Smuzhiyun 					 &priv->wmm.tx_pkts_queued, 0,
1047*4882a593Smuzhiyun 					 priv->wmm.ra_list_spinlock,
1048*4882a593Smuzhiyun 					 pmadapter->callbacks.moal_init_lock);
1049*4882a593Smuzhiyun 			util_scalar_init((t_void *)pmadapter->pmoal_handle,
1050*4882a593Smuzhiyun 					 &priv->wmm.highest_queued_prio,
1051*4882a593Smuzhiyun 					 HIGH_PRIO_TID,
1052*4882a593Smuzhiyun 					 priv->wmm.ra_list_spinlock,
1053*4882a593Smuzhiyun 					 pmadapter->callbacks.moal_init_lock);
1054*4882a593Smuzhiyun 			util_init_list_head(
1055*4882a593Smuzhiyun 				(t_void *)pmadapter->pmoal_handle,
1056*4882a593Smuzhiyun 				&priv->sta_list, MTRUE,
1057*4882a593Smuzhiyun 				pmadapter->callbacks.moal_init_lock);
1058*4882a593Smuzhiyun 			/* Initialize tdls_pending_txq */
1059*4882a593Smuzhiyun 			util_init_list_head(
1060*4882a593Smuzhiyun 				(t_void *)pmadapter->pmoal_handle,
1061*4882a593Smuzhiyun 				&priv->tdls_pending_txq, MTRUE,
1062*4882a593Smuzhiyun 				pmadapter->callbacks.moal_init_lock);
1063*4882a593Smuzhiyun 			/* Initialize bypass_txq */
1064*4882a593Smuzhiyun 			util_init_list_head(
1065*4882a593Smuzhiyun 				(t_void *)pmadapter->pmoal_handle,
1066*4882a593Smuzhiyun 				&priv->bypass_txq, MTRUE,
1067*4882a593Smuzhiyun 				pmadapter->callbacks.moal_init_lock);
1068*4882a593Smuzhiyun 		}
1069*4882a593Smuzhiyun 	}
1070*4882a593Smuzhiyun error:
1071*4882a593Smuzhiyun 	LEAVE();
1072*4882a593Smuzhiyun 	return ret;
1073*4882a593Smuzhiyun }
1074*4882a593Smuzhiyun 
1075*4882a593Smuzhiyun /**
1076*4882a593Smuzhiyun  *  @brief This function intializes the lock variables and
1077*4882a593Smuzhiyun  *  the list heads.
1078*4882a593Smuzhiyun  *
1079*4882a593Smuzhiyun  *  @param pmadapter  A pointer to a mlan_adapter structure
1080*4882a593Smuzhiyun  *
1081*4882a593Smuzhiyun  *  @return           MLAN_STATUS_SUCCESS -- on success,
1082*4882a593Smuzhiyun  *                    otherwise MLAN_STATUS_FAILURE
1083*4882a593Smuzhiyun  *
1084*4882a593Smuzhiyun  */
wlan_init_lock_list(pmlan_adapter pmadapter)1085*4882a593Smuzhiyun mlan_status wlan_init_lock_list(pmlan_adapter pmadapter)
1086*4882a593Smuzhiyun {
1087*4882a593Smuzhiyun 	mlan_status ret = MLAN_STATUS_SUCCESS;
1088*4882a593Smuzhiyun 	pmlan_callbacks pcb = &pmadapter->callbacks;
1089*4882a593Smuzhiyun #if defined(USB)
1090*4882a593Smuzhiyun 	t_s32 i = 0;
1091*4882a593Smuzhiyun #endif
1092*4882a593Smuzhiyun 	ENTER();
1093*4882a593Smuzhiyun 
1094*4882a593Smuzhiyun 	if (pcb->moal_init_lock(pmadapter->pmoal_handle,
1095*4882a593Smuzhiyun 				&pmadapter->pmlan_lock) !=
1096*4882a593Smuzhiyun 	    MLAN_STATUS_SUCCESS) {
1097*4882a593Smuzhiyun 		ret = MLAN_STATUS_FAILURE;
1098*4882a593Smuzhiyun 		goto error;
1099*4882a593Smuzhiyun 	}
1100*4882a593Smuzhiyun #if defined(SDIO) || defined(PCIE)
1101*4882a593Smuzhiyun 	if (!IS_USB(pmadapter->card_type)) {
1102*4882a593Smuzhiyun 		if (pcb->moal_init_lock(pmadapter->pmoal_handle,
1103*4882a593Smuzhiyun 					&pmadapter->pint_lock) !=
1104*4882a593Smuzhiyun 		    MLAN_STATUS_SUCCESS) {
1105*4882a593Smuzhiyun 			ret = MLAN_STATUS_FAILURE;
1106*4882a593Smuzhiyun 			goto error;
1107*4882a593Smuzhiyun 		}
1108*4882a593Smuzhiyun 	}
1109*4882a593Smuzhiyun #endif
1110*4882a593Smuzhiyun 	if (pcb->moal_init_lock(pmadapter->pmoal_handle,
1111*4882a593Smuzhiyun 				&pmadapter->pmain_proc_lock) !=
1112*4882a593Smuzhiyun 	    MLAN_STATUS_SUCCESS) {
1113*4882a593Smuzhiyun 		ret = MLAN_STATUS_FAILURE;
1114*4882a593Smuzhiyun 		goto error;
1115*4882a593Smuzhiyun 	}
1116*4882a593Smuzhiyun 	if (pcb->moal_init_lock(pmadapter->pmoal_handle,
1117*4882a593Smuzhiyun 				&pmadapter->prx_proc_lock) !=
1118*4882a593Smuzhiyun 	    MLAN_STATUS_SUCCESS) {
1119*4882a593Smuzhiyun 		ret = MLAN_STATUS_FAILURE;
1120*4882a593Smuzhiyun 		goto error;
1121*4882a593Smuzhiyun 	}
1122*4882a593Smuzhiyun 	if (pcb->moal_init_lock(pmadapter->pmoal_handle,
1123*4882a593Smuzhiyun 				&pmadapter->pmlan_cmd_lock) !=
1124*4882a593Smuzhiyun 	    MLAN_STATUS_SUCCESS) {
1125*4882a593Smuzhiyun 		ret = MLAN_STATUS_FAILURE;
1126*4882a593Smuzhiyun 		goto error;
1127*4882a593Smuzhiyun 	}
1128*4882a593Smuzhiyun #if defined(USB)
1129*4882a593Smuzhiyun 	if (IS_USB(pmadapter->card_type)) {
1130*4882a593Smuzhiyun 		for (i = 0; i < MAX_USB_TX_PORT_NUM; i++) {
1131*4882a593Smuzhiyun 			if (pcb->moal_init_lock(pmadapter->pmoal_handle,
1132*4882a593Smuzhiyun 						&pmadapter->pcard_usb
1133*4882a593Smuzhiyun 							 ->usb_tx_aggr[i]
1134*4882a593Smuzhiyun 							 .paggr_lock) !=
1135*4882a593Smuzhiyun 			    MLAN_STATUS_SUCCESS) {
1136*4882a593Smuzhiyun 				ret = MLAN_STATUS_FAILURE;
1137*4882a593Smuzhiyun 				goto error;
1138*4882a593Smuzhiyun 			}
1139*4882a593Smuzhiyun 		}
1140*4882a593Smuzhiyun 	}
1141*4882a593Smuzhiyun #endif
1142*4882a593Smuzhiyun 
1143*4882a593Smuzhiyun 	util_init_list_head((t_void *)pmadapter->pmoal_handle,
1144*4882a593Smuzhiyun 			    &pmadapter->rx_data_queue, MTRUE,
1145*4882a593Smuzhiyun 			    pmadapter->callbacks.moal_init_lock);
1146*4882a593Smuzhiyun 	util_scalar_init((t_void *)pmadapter->pmoal_handle,
1147*4882a593Smuzhiyun 			 &pmadapter->pending_bridge_pkts, 0, MNULL,
1148*4882a593Smuzhiyun 			 pmadapter->callbacks.moal_init_lock);
1149*4882a593Smuzhiyun 	/* Initialize cmd_free_q */
1150*4882a593Smuzhiyun 	util_init_list_head((t_void *)pmadapter->pmoal_handle,
1151*4882a593Smuzhiyun 			    &pmadapter->cmd_free_q, MTRUE,
1152*4882a593Smuzhiyun 			    pmadapter->callbacks.moal_init_lock);
1153*4882a593Smuzhiyun 	/* Initialize cmd_pending_q */
1154*4882a593Smuzhiyun 	util_init_list_head((t_void *)pmadapter->pmoal_handle,
1155*4882a593Smuzhiyun 			    &pmadapter->cmd_pending_q, MTRUE,
1156*4882a593Smuzhiyun 			    pmadapter->callbacks.moal_init_lock);
1157*4882a593Smuzhiyun 	/* Initialize scan_pending_q */
1158*4882a593Smuzhiyun 	util_init_list_head((t_void *)pmadapter->pmoal_handle,
1159*4882a593Smuzhiyun 			    &pmadapter->scan_pending_q, MTRUE,
1160*4882a593Smuzhiyun 			    pmadapter->callbacks.moal_init_lock);
1161*4882a593Smuzhiyun 	/* Initialize ext_cmd_pending_q */
1162*4882a593Smuzhiyun 	util_init_list_head((t_void *)pmadapter->pmoal_handle,
1163*4882a593Smuzhiyun 			    &pmadapter->ext_cmd_pending_q, MTRUE,
1164*4882a593Smuzhiyun 			    pmadapter->callbacks.moal_init_lock);
1165*4882a593Smuzhiyun 	/* Initialize ioctl_pending_q */
1166*4882a593Smuzhiyun 	util_init_list_head((t_void *)pmadapter->pmoal_handle,
1167*4882a593Smuzhiyun 			    &pmadapter->ioctl_pending_q, MTRUE,
1168*4882a593Smuzhiyun 			    pmadapter->callbacks.moal_init_lock);
1169*4882a593Smuzhiyun 
1170*4882a593Smuzhiyun error:
1171*4882a593Smuzhiyun 	LEAVE();
1172*4882a593Smuzhiyun 	return ret;
1173*4882a593Smuzhiyun }
1174*4882a593Smuzhiyun 
1175*4882a593Smuzhiyun /**
1176*4882a593Smuzhiyun  *  @brief This function releases the lock variables
1177*4882a593Smuzhiyun  *
1178*4882a593Smuzhiyun  *  @param pmadapter  A pointer to a mlan_adapter structure
1179*4882a593Smuzhiyun  *
1180*4882a593Smuzhiyun  *  @return           None
1181*4882a593Smuzhiyun  *
1182*4882a593Smuzhiyun  */
wlan_free_lock_list(pmlan_adapter pmadapter)1183*4882a593Smuzhiyun t_void wlan_free_lock_list(pmlan_adapter pmadapter)
1184*4882a593Smuzhiyun {
1185*4882a593Smuzhiyun 	pmlan_private priv = MNULL;
1186*4882a593Smuzhiyun 	pmlan_callbacks pcb = &pmadapter->callbacks;
1187*4882a593Smuzhiyun 	t_s32 i = 0;
1188*4882a593Smuzhiyun 	t_s32 j = 0;
1189*4882a593Smuzhiyun 
1190*4882a593Smuzhiyun 	ENTER();
1191*4882a593Smuzhiyun 
1192*4882a593Smuzhiyun 	if (pmadapter->pmlan_lock)
1193*4882a593Smuzhiyun 		pcb->moal_free_lock(pmadapter->pmoal_handle,
1194*4882a593Smuzhiyun 				    pmadapter->pmlan_lock);
1195*4882a593Smuzhiyun #if defined(SDIO) || defined(PCIE)
1196*4882a593Smuzhiyun 	if (!IS_USB(pmadapter->card_type) && pmadapter->pint_lock)
1197*4882a593Smuzhiyun 		pcb->moal_free_lock(pmadapter->pmoal_handle,
1198*4882a593Smuzhiyun 				    pmadapter->pint_lock);
1199*4882a593Smuzhiyun #endif
1200*4882a593Smuzhiyun 	if (pmadapter->prx_proc_lock)
1201*4882a593Smuzhiyun 		pcb->moal_free_lock(pmadapter->pmoal_handle,
1202*4882a593Smuzhiyun 				    pmadapter->prx_proc_lock);
1203*4882a593Smuzhiyun 	if (pmadapter->pmain_proc_lock)
1204*4882a593Smuzhiyun 		pcb->moal_free_lock(pmadapter->pmoal_handle,
1205*4882a593Smuzhiyun 				    pmadapter->pmain_proc_lock);
1206*4882a593Smuzhiyun 	if (pmadapter->pmlan_cmd_lock)
1207*4882a593Smuzhiyun 		pcb->moal_free_lock(pmadapter->pmoal_handle,
1208*4882a593Smuzhiyun 				    pmadapter->pmlan_cmd_lock);
1209*4882a593Smuzhiyun #if defined(USB)
1210*4882a593Smuzhiyun 	if (IS_USB(pmadapter->card_type)) {
1211*4882a593Smuzhiyun 		for (i = 0; i < MAX_USB_TX_PORT_NUM; i++) {
1212*4882a593Smuzhiyun 			if (pmadapter->pcard_usb->usb_tx_aggr[i].paggr_lock)
1213*4882a593Smuzhiyun 				pcb->moal_free_lock(pmadapter->pmoal_handle,
1214*4882a593Smuzhiyun 						    pmadapter->pcard_usb
1215*4882a593Smuzhiyun 							    ->usb_tx_aggr[i]
1216*4882a593Smuzhiyun 							    .paggr_lock);
1217*4882a593Smuzhiyun 		}
1218*4882a593Smuzhiyun 	}
1219*4882a593Smuzhiyun #endif
1220*4882a593Smuzhiyun 
1221*4882a593Smuzhiyun 	for (i = 0; i < pmadapter->priv_num; i++) {
1222*4882a593Smuzhiyun 		if (pmadapter->priv[i]) {
1223*4882a593Smuzhiyun 			priv = pmadapter->priv[i];
1224*4882a593Smuzhiyun 			if (priv->rx_pkt_lock)
1225*4882a593Smuzhiyun 				pcb->moal_free_lock(pmadapter->pmoal_handle,
1226*4882a593Smuzhiyun 						    priv->rx_pkt_lock);
1227*4882a593Smuzhiyun 			if (priv->wmm.ra_list_spinlock)
1228*4882a593Smuzhiyun 				pcb->moal_free_lock(pmadapter->pmoal_handle,
1229*4882a593Smuzhiyun 						    priv->wmm.ra_list_spinlock);
1230*4882a593Smuzhiyun #ifdef STA_SUPPORT
1231*4882a593Smuzhiyun 			if (priv->curr_bcn_buf_lock)
1232*4882a593Smuzhiyun 				pcb->moal_free_lock(pmadapter->pmoal_handle,
1233*4882a593Smuzhiyun 						    priv->curr_bcn_buf_lock);
1234*4882a593Smuzhiyun #endif
1235*4882a593Smuzhiyun 		}
1236*4882a593Smuzhiyun 	}
1237*4882a593Smuzhiyun 
1238*4882a593Smuzhiyun 	/* Free lists */
1239*4882a593Smuzhiyun 	util_free_list_head((t_void *)pmadapter->pmoal_handle,
1240*4882a593Smuzhiyun 			    &pmadapter->rx_data_queue, pcb->moal_free_lock);
1241*4882a593Smuzhiyun 
1242*4882a593Smuzhiyun 	util_scalar_free((t_void *)pmadapter->pmoal_handle,
1243*4882a593Smuzhiyun 			 &pmadapter->pending_bridge_pkts, pcb->moal_free_lock);
1244*4882a593Smuzhiyun 	util_free_list_head((t_void *)pmadapter->pmoal_handle,
1245*4882a593Smuzhiyun 			    &pmadapter->cmd_free_q,
1246*4882a593Smuzhiyun 			    pmadapter->callbacks.moal_free_lock);
1247*4882a593Smuzhiyun 
1248*4882a593Smuzhiyun 	util_free_list_head((t_void *)pmadapter->pmoal_handle,
1249*4882a593Smuzhiyun 			    &pmadapter->cmd_pending_q,
1250*4882a593Smuzhiyun 			    pmadapter->callbacks.moal_free_lock);
1251*4882a593Smuzhiyun 
1252*4882a593Smuzhiyun 	util_free_list_head((t_void *)pmadapter->pmoal_handle,
1253*4882a593Smuzhiyun 			    &pmadapter->scan_pending_q,
1254*4882a593Smuzhiyun 			    pmadapter->callbacks.moal_free_lock);
1255*4882a593Smuzhiyun 
1256*4882a593Smuzhiyun 	util_free_list_head((t_void *)pmadapter->pmoal_handle,
1257*4882a593Smuzhiyun 			    &pmadapter->ext_cmd_pending_q,
1258*4882a593Smuzhiyun 			    pmadapter->callbacks.moal_free_lock);
1259*4882a593Smuzhiyun 
1260*4882a593Smuzhiyun 	util_free_list_head((t_void *)pmadapter->pmoal_handle,
1261*4882a593Smuzhiyun 			    &pmadapter->ioctl_pending_q,
1262*4882a593Smuzhiyun 			    pmadapter->callbacks.moal_free_lock);
1263*4882a593Smuzhiyun 
1264*4882a593Smuzhiyun 	for (i = 0; i < pmadapter->priv_num; i++)
1265*4882a593Smuzhiyun 		util_free_list_head((t_void *)pmadapter->pmoal_handle,
1266*4882a593Smuzhiyun 				    &pmadapter->bssprio_tbl[i].bssprio_head,
1267*4882a593Smuzhiyun 				    pcb->moal_free_lock);
1268*4882a593Smuzhiyun 
1269*4882a593Smuzhiyun 	for (i = 0; i < pmadapter->priv_num; i++) {
1270*4882a593Smuzhiyun 		if (pmadapter->priv[i]) {
1271*4882a593Smuzhiyun 			priv = pmadapter->priv[i];
1272*4882a593Smuzhiyun 			util_free_list_head(
1273*4882a593Smuzhiyun 				(t_void *)pmadapter->pmoal_handle,
1274*4882a593Smuzhiyun 				&priv->sta_list,
1275*4882a593Smuzhiyun 				priv->adapter->callbacks.moal_free_lock);
1276*4882a593Smuzhiyun 			util_free_list_head(
1277*4882a593Smuzhiyun 				(t_void *)pmadapter->pmoal_handle,
1278*4882a593Smuzhiyun 				&priv->tdls_pending_txq,
1279*4882a593Smuzhiyun 				pmadapter->callbacks.moal_free_lock);
1280*4882a593Smuzhiyun 			util_free_list_head(
1281*4882a593Smuzhiyun 				(t_void *)pmadapter->pmoal_handle,
1282*4882a593Smuzhiyun 				&priv->bypass_txq,
1283*4882a593Smuzhiyun 				pmadapter->callbacks.moal_free_lock);
1284*4882a593Smuzhiyun 			for (j = 0; j < MAX_NUM_TID; ++j)
1285*4882a593Smuzhiyun 				util_free_list_head(
1286*4882a593Smuzhiyun 					(t_void *)priv->adapter->pmoal_handle,
1287*4882a593Smuzhiyun 					&priv->wmm.tid_tbl_ptr[j].ra_list,
1288*4882a593Smuzhiyun 					priv->adapter->callbacks.moal_free_lock);
1289*4882a593Smuzhiyun 			util_free_list_head(
1290*4882a593Smuzhiyun 				(t_void *)priv->adapter->pmoal_handle,
1291*4882a593Smuzhiyun 				&priv->tx_ba_stream_tbl_ptr,
1292*4882a593Smuzhiyun 				priv->adapter->callbacks.moal_free_lock);
1293*4882a593Smuzhiyun 			util_free_list_head(
1294*4882a593Smuzhiyun 				(t_void *)priv->adapter->pmoal_handle,
1295*4882a593Smuzhiyun 				&priv->rx_reorder_tbl_ptr,
1296*4882a593Smuzhiyun 				priv->adapter->callbacks.moal_free_lock);
1297*4882a593Smuzhiyun 			util_scalar_free(
1298*4882a593Smuzhiyun 				(t_void *)priv->adapter->pmoal_handle,
1299*4882a593Smuzhiyun 				&priv->wmm.tx_pkts_queued,
1300*4882a593Smuzhiyun 				priv->adapter->callbacks.moal_free_lock);
1301*4882a593Smuzhiyun 			util_scalar_free(
1302*4882a593Smuzhiyun 				(t_void *)priv->adapter->pmoal_handle,
1303*4882a593Smuzhiyun 				&priv->wmm.highest_queued_prio,
1304*4882a593Smuzhiyun 				priv->adapter->callbacks.moal_free_lock);
1305*4882a593Smuzhiyun 		}
1306*4882a593Smuzhiyun 	}
1307*4882a593Smuzhiyun 
1308*4882a593Smuzhiyun 	LEAVE();
1309*4882a593Smuzhiyun 	return;
1310*4882a593Smuzhiyun }
1311*4882a593Smuzhiyun 
1312*4882a593Smuzhiyun /**
1313*4882a593Smuzhiyun  *  @brief This function intializes the timers
1314*4882a593Smuzhiyun  *
1315*4882a593Smuzhiyun  *  @param pmadapter  A pointer to a mlan_adapter structure
1316*4882a593Smuzhiyun  *
1317*4882a593Smuzhiyun  *  @return           MLAN_STATUS_SUCCESS -- on success,
1318*4882a593Smuzhiyun  *                    otherwise MLAN_STATUS_FAILURE
1319*4882a593Smuzhiyun  *
1320*4882a593Smuzhiyun  */
wlan_init_timer(pmlan_adapter pmadapter)1321*4882a593Smuzhiyun mlan_status wlan_init_timer(pmlan_adapter pmadapter)
1322*4882a593Smuzhiyun {
1323*4882a593Smuzhiyun 	mlan_status ret = MLAN_STATUS_SUCCESS;
1324*4882a593Smuzhiyun 	pmlan_callbacks pcb = &pmadapter->callbacks;
1325*4882a593Smuzhiyun #if defined(USB)
1326*4882a593Smuzhiyun 	t_s32 i = 0;
1327*4882a593Smuzhiyun #endif
1328*4882a593Smuzhiyun 	ENTER();
1329*4882a593Smuzhiyun 
1330*4882a593Smuzhiyun 	if (pcb->moal_init_timer(
1331*4882a593Smuzhiyun 		    pmadapter->pmoal_handle, &pmadapter->pmlan_cmd_timer,
1332*4882a593Smuzhiyun 		    wlan_cmd_timeout_func, pmadapter) != MLAN_STATUS_SUCCESS) {
1333*4882a593Smuzhiyun 		ret = MLAN_STATUS_FAILURE;
1334*4882a593Smuzhiyun 		goto error;
1335*4882a593Smuzhiyun 	}
1336*4882a593Smuzhiyun #if defined(USB)
1337*4882a593Smuzhiyun 	if (IS_USB(pmadapter->card_type)) {
1338*4882a593Smuzhiyun 		for (i = 0; i < MAX_USB_TX_PORT_NUM; i++) {
1339*4882a593Smuzhiyun 			if (pcb->moal_init_timer(
1340*4882a593Smuzhiyun 				    pmadapter->pmoal_handle,
1341*4882a593Smuzhiyun 				    &pmadapter->pcard_usb->usb_tx_aggr[i]
1342*4882a593Smuzhiyun 					     .paggr_hold_timer,
1343*4882a593Smuzhiyun 				    wlan_usb_tx_aggr_timeout_func,
1344*4882a593Smuzhiyun 				    &pmadapter->pcard_usb->usb_tx_aggr[i]) !=
1345*4882a593Smuzhiyun 			    MLAN_STATUS_SUCCESS) {
1346*4882a593Smuzhiyun 				ret = MLAN_STATUS_FAILURE;
1347*4882a593Smuzhiyun 				goto error;
1348*4882a593Smuzhiyun 			}
1349*4882a593Smuzhiyun 		}
1350*4882a593Smuzhiyun 	}
1351*4882a593Smuzhiyun #endif
1352*4882a593Smuzhiyun 	if (pcb->moal_init_timer(pmadapter->pmoal_handle,
1353*4882a593Smuzhiyun 				 &pmadapter->pwakeup_fw_timer,
1354*4882a593Smuzhiyun 				 wlan_wakeup_card_timeout_func,
1355*4882a593Smuzhiyun 				 pmadapter) != MLAN_STATUS_SUCCESS) {
1356*4882a593Smuzhiyun 		ret = MLAN_STATUS_FAILURE;
1357*4882a593Smuzhiyun 		goto error;
1358*4882a593Smuzhiyun 	}
1359*4882a593Smuzhiyun 	pmadapter->wakeup_fw_timer_is_set = MFALSE;
1360*4882a593Smuzhiyun error:
1361*4882a593Smuzhiyun 	LEAVE();
1362*4882a593Smuzhiyun 	return ret;
1363*4882a593Smuzhiyun }
1364*4882a593Smuzhiyun 
1365*4882a593Smuzhiyun /**
1366*4882a593Smuzhiyun  *  @brief This function releases the timers
1367*4882a593Smuzhiyun  *
1368*4882a593Smuzhiyun  *  @param pmadapter  A pointer to a mlan_adapter structure
1369*4882a593Smuzhiyun  *
1370*4882a593Smuzhiyun  *  @return           None
1371*4882a593Smuzhiyun  *
1372*4882a593Smuzhiyun  */
wlan_free_timer(pmlan_adapter pmadapter)1373*4882a593Smuzhiyun t_void wlan_free_timer(pmlan_adapter pmadapter)
1374*4882a593Smuzhiyun {
1375*4882a593Smuzhiyun 	pmlan_callbacks pcb = &pmadapter->callbacks;
1376*4882a593Smuzhiyun #if defined(USB)
1377*4882a593Smuzhiyun 	t_s32 i = 0;
1378*4882a593Smuzhiyun #endif
1379*4882a593Smuzhiyun 	ENTER();
1380*4882a593Smuzhiyun 
1381*4882a593Smuzhiyun 	if (pmadapter->pmlan_cmd_timer)
1382*4882a593Smuzhiyun 		pcb->moal_free_timer(pmadapter->pmoal_handle,
1383*4882a593Smuzhiyun 				     pmadapter->pmlan_cmd_timer);
1384*4882a593Smuzhiyun #if defined(USB)
1385*4882a593Smuzhiyun 	if (IS_USB(pmadapter->card_type)) {
1386*4882a593Smuzhiyun 		for (i = 0; i < MAX_USB_TX_PORT_NUM; i++) {
1387*4882a593Smuzhiyun 			if (pmadapter->pcard_usb->usb_tx_aggr[i]
1388*4882a593Smuzhiyun 				    .paggr_hold_timer)
1389*4882a593Smuzhiyun 				pcb->moal_free_timer(pmadapter->pmoal_handle,
1390*4882a593Smuzhiyun 						     pmadapter->pcard_usb
1391*4882a593Smuzhiyun 							     ->usb_tx_aggr[i]
1392*4882a593Smuzhiyun 							     .paggr_hold_timer);
1393*4882a593Smuzhiyun 		}
1394*4882a593Smuzhiyun 	}
1395*4882a593Smuzhiyun #endif
1396*4882a593Smuzhiyun 
1397*4882a593Smuzhiyun 	if (pmadapter->pwakeup_fw_timer)
1398*4882a593Smuzhiyun 		pcb->moal_free_timer(pmadapter->pmoal_handle,
1399*4882a593Smuzhiyun 				     pmadapter->pwakeup_fw_timer);
1400*4882a593Smuzhiyun 
1401*4882a593Smuzhiyun 	LEAVE();
1402*4882a593Smuzhiyun 	return;
1403*4882a593Smuzhiyun }
1404*4882a593Smuzhiyun 
1405*4882a593Smuzhiyun /**
1406*4882a593Smuzhiyun  *  @brief  This function initializes firmware
1407*4882a593Smuzhiyun  *
1408*4882a593Smuzhiyun  *  @param pmadapter		A pointer to mlan_adapter
1409*4882a593Smuzhiyun  *
1410*4882a593Smuzhiyun  *  @return		MLAN_STATUS_SUCCESS, MLAN_STATUS_PENDING or
1411*4882a593Smuzhiyun  * MLAN_STATUS_FAILURE
1412*4882a593Smuzhiyun  */
wlan_init_fw(pmlan_adapter pmadapter)1413*4882a593Smuzhiyun mlan_status wlan_init_fw(pmlan_adapter pmadapter)
1414*4882a593Smuzhiyun {
1415*4882a593Smuzhiyun 	mlan_status ret = MLAN_STATUS_SUCCESS;
1416*4882a593Smuzhiyun #ifdef PCIE
1417*4882a593Smuzhiyun 	pmlan_private priv = pmadapter->priv[0];
1418*4882a593Smuzhiyun #endif
1419*4882a593Smuzhiyun 	ENTER();
1420*4882a593Smuzhiyun 	/* Initialize adapter structure */
1421*4882a593Smuzhiyun 	wlan_init_adapter(pmadapter);
1422*4882a593Smuzhiyun #ifdef MFG_CMD_SUPPORT
1423*4882a593Smuzhiyun 	if (pmadapter->mfg_mode != MTRUE) {
1424*4882a593Smuzhiyun #endif
1425*4882a593Smuzhiyun 		wlan_adapter_get_hw_spec(pmadapter);
1426*4882a593Smuzhiyun #ifdef MFG_CMD_SUPPORT
1427*4882a593Smuzhiyun 	}
1428*4882a593Smuzhiyun #ifdef PCIE
1429*4882a593Smuzhiyun 	else if (IS_PCIE(pmadapter->card_type)) {
1430*4882a593Smuzhiyun 		if (MLAN_STATUS_SUCCESS != wlan_set_pcie_buf_config(priv)) {
1431*4882a593Smuzhiyun 			ret = MLAN_STATUS_FAILURE;
1432*4882a593Smuzhiyun 			goto done;
1433*4882a593Smuzhiyun 		}
1434*4882a593Smuzhiyun 	}
1435*4882a593Smuzhiyun #endif /* PCIE */
1436*4882a593Smuzhiyun #endif /* MFG_CMD_SUPPORT */
1437*4882a593Smuzhiyun 	if (wlan_is_cmd_pending(pmadapter)) {
1438*4882a593Smuzhiyun 		/* Send the first command in queue and return */
1439*4882a593Smuzhiyun 		if (mlan_main_process(pmadapter) == MLAN_STATUS_FAILURE)
1440*4882a593Smuzhiyun 			ret = MLAN_STATUS_FAILURE;
1441*4882a593Smuzhiyun 		else
1442*4882a593Smuzhiyun 			ret = MLAN_STATUS_PENDING;
1443*4882a593Smuzhiyun #if defined(MFG_CMD_SUPPORT) && defined(PCIE)
1444*4882a593Smuzhiyun 		if (IS_PCIE(pmadapter->card_type) && pmadapter->mfg_mode) {
1445*4882a593Smuzhiyun 			ret = MLAN_STATUS_SUCCESS;
1446*4882a593Smuzhiyun 		}
1447*4882a593Smuzhiyun #endif
1448*4882a593Smuzhiyun 	}
1449*4882a593Smuzhiyun #ifdef PCIE
1450*4882a593Smuzhiyun done:
1451*4882a593Smuzhiyun #endif
1452*4882a593Smuzhiyun #ifdef MFG_CMD_SUPPORT
1453*4882a593Smuzhiyun 	if (pmadapter->mfg_mode == MTRUE) {
1454*4882a593Smuzhiyun 		pmadapter->hw_status = WlanHardwareStatusInitializing;
1455*4882a593Smuzhiyun 		ret = wlan_get_hw_spec_complete(pmadapter);
1456*4882a593Smuzhiyun 	}
1457*4882a593Smuzhiyun #endif
1458*4882a593Smuzhiyun 	LEAVE();
1459*4882a593Smuzhiyun 	return ret;
1460*4882a593Smuzhiyun }
1461*4882a593Smuzhiyun 
1462*4882a593Smuzhiyun /**
1463*4882a593Smuzhiyun  *  @brief  This function udpate hw spec info to each interface
1464*4882a593Smuzhiyun  *
1465*4882a593Smuzhiyun  *  @param pmadapter		A pointer to mlan_adapter
1466*4882a593Smuzhiyun  *
1467*4882a593Smuzhiyun  *  @return		MLAN_STATUS_SUCCESS, MLAN_STATUS_PENDING or
1468*4882a593Smuzhiyun  * MLAN_STATUS_FAILURE
1469*4882a593Smuzhiyun  */
wlan_update_hw_spec(pmlan_adapter pmadapter)1470*4882a593Smuzhiyun static void wlan_update_hw_spec(pmlan_adapter pmadapter)
1471*4882a593Smuzhiyun {
1472*4882a593Smuzhiyun 	t_u32 i;
1473*4882a593Smuzhiyun 	MrvlIEtypes_He_cap_t *user_he_cap_tlv = MNULL;
1474*4882a593Smuzhiyun 
1475*4882a593Smuzhiyun 	ENTER();
1476*4882a593Smuzhiyun 
1477*4882a593Smuzhiyun #ifdef STA_SUPPORT
1478*4882a593Smuzhiyun 	if (IS_SUPPORT_MULTI_BANDS(pmadapter))
1479*4882a593Smuzhiyun 		pmadapter->fw_bands = (t_u8)GET_FW_DEFAULT_BANDS(pmadapter);
1480*4882a593Smuzhiyun 	else
1481*4882a593Smuzhiyun 		pmadapter->fw_bands = BAND_B;
1482*4882a593Smuzhiyun 
1483*4882a593Smuzhiyun 	if ((pmadapter->fw_bands & BAND_A) && (pmadapter->fw_bands & BAND_GN))
1484*4882a593Smuzhiyun 		pmadapter->fw_bands |= BAND_AN;
1485*4882a593Smuzhiyun 	if (!(pmadapter->fw_bands & BAND_G) && (pmadapter->fw_bands & BAND_GN))
1486*4882a593Smuzhiyun 		pmadapter->fw_bands &= ~BAND_GN;
1487*4882a593Smuzhiyun 
1488*4882a593Smuzhiyun 	pmadapter->config_bands = pmadapter->fw_bands;
1489*4882a593Smuzhiyun 	for (i = 0; i < pmadapter->priv_num; i++) {
1490*4882a593Smuzhiyun 		if (pmadapter->priv[i]) {
1491*4882a593Smuzhiyun 			pmadapter->priv[i]->config_bands = pmadapter->fw_bands;
1492*4882a593Smuzhiyun 		}
1493*4882a593Smuzhiyun 	}
1494*4882a593Smuzhiyun 
1495*4882a593Smuzhiyun 	if (pmadapter->fw_bands & BAND_A) {
1496*4882a593Smuzhiyun 		if (pmadapter->fw_bands & BAND_AN) {
1497*4882a593Smuzhiyun 			pmadapter->config_bands |= BAND_AN;
1498*4882a593Smuzhiyun 			for (i = 0; i < pmadapter->priv_num; i++) {
1499*4882a593Smuzhiyun 				if (pmadapter->priv[i])
1500*4882a593Smuzhiyun 					pmadapter->priv[i]->config_bands |=
1501*4882a593Smuzhiyun 						BAND_AN;
1502*4882a593Smuzhiyun 			}
1503*4882a593Smuzhiyun 		}
1504*4882a593Smuzhiyun 		if (pmadapter->fw_bands & BAND_AAC) {
1505*4882a593Smuzhiyun 			pmadapter->config_bands |= BAND_AAC;
1506*4882a593Smuzhiyun 			for (i = 0; i < pmadapter->priv_num; i++) {
1507*4882a593Smuzhiyun 				if (pmadapter->priv[i])
1508*4882a593Smuzhiyun 					pmadapter->priv[i]->config_bands |=
1509*4882a593Smuzhiyun 						BAND_AAC;
1510*4882a593Smuzhiyun 			}
1511*4882a593Smuzhiyun 		}
1512*4882a593Smuzhiyun 		pmadapter->adhoc_start_band = BAND_A;
1513*4882a593Smuzhiyun 		for (i = 0; i < pmadapter->priv_num; i++) {
1514*4882a593Smuzhiyun 			if (pmadapter->priv[i])
1515*4882a593Smuzhiyun 				pmadapter->priv[i]->adhoc_channel =
1516*4882a593Smuzhiyun 					DEFAULT_AD_HOC_CHANNEL_A;
1517*4882a593Smuzhiyun 		}
1518*4882a593Smuzhiyun 	} else if (pmadapter->fw_bands & BAND_G) {
1519*4882a593Smuzhiyun 		pmadapter->adhoc_start_band = BAND_G | BAND_B;
1520*4882a593Smuzhiyun 		for (i = 0; i < pmadapter->priv_num; i++) {
1521*4882a593Smuzhiyun 			if (pmadapter->priv[i])
1522*4882a593Smuzhiyun 				pmadapter->priv[i]->adhoc_channel =
1523*4882a593Smuzhiyun 					DEFAULT_AD_HOC_CHANNEL;
1524*4882a593Smuzhiyun 		}
1525*4882a593Smuzhiyun 	} else if (pmadapter->fw_bands & BAND_B) {
1526*4882a593Smuzhiyun 		pmadapter->adhoc_start_band = BAND_B;
1527*4882a593Smuzhiyun 		for (i = 0; i < pmadapter->priv_num; i++) {
1528*4882a593Smuzhiyun 			if (pmadapter->priv[i])
1529*4882a593Smuzhiyun 				pmadapter->priv[i]->adhoc_channel =
1530*4882a593Smuzhiyun 					DEFAULT_AD_HOC_CHANNEL;
1531*4882a593Smuzhiyun 		}
1532*4882a593Smuzhiyun 	}
1533*4882a593Smuzhiyun #endif /* STA_SUPPORT */
1534*4882a593Smuzhiyun 	for (i = 0; i < pmadapter->priv_num; i++) {
1535*4882a593Smuzhiyun 		if (pmadapter->priv[i]->curr_addr[0] == 0xff)
1536*4882a593Smuzhiyun 			memmove(pmadapter, pmadapter->priv[i]->curr_addr,
1537*4882a593Smuzhiyun 				pmadapter->permanent_addr,
1538*4882a593Smuzhiyun 				MLAN_MAC_ADDR_LENGTH);
1539*4882a593Smuzhiyun 	}
1540*4882a593Smuzhiyun 	for (i = 0; i < pmadapter->priv_num; i++) {
1541*4882a593Smuzhiyun 		if (pmadapter->priv[i])
1542*4882a593Smuzhiyun 			wlan_update_11n_cap(pmadapter->priv[i]);
1543*4882a593Smuzhiyun 	}
1544*4882a593Smuzhiyun 	if (ISSUPP_BEAMFORMING(pmadapter->hw_dot_11n_dev_cap)) {
1545*4882a593Smuzhiyun 		PRINTM(MCMND, "Enable Beamforming\n");
1546*4882a593Smuzhiyun 		for (i = 0; i < pmadapter->priv_num; i++) {
1547*4882a593Smuzhiyun 			if (pmadapter->priv[i])
1548*4882a593Smuzhiyun 				pmadapter->priv[i]->tx_bf_cap =
1549*4882a593Smuzhiyun 					pmadapter->pcard_info
1550*4882a593Smuzhiyun 						->default_11n_tx_bf_cap;
1551*4882a593Smuzhiyun 		}
1552*4882a593Smuzhiyun 	}
1553*4882a593Smuzhiyun 	for (i = 0; i < pmadapter->priv_num; i++) {
1554*4882a593Smuzhiyun 		if (pmadapter->priv[i])
1555*4882a593Smuzhiyun 			wlan_update_11ac_cap(pmadapter->priv[i]);
1556*4882a593Smuzhiyun 	}
1557*4882a593Smuzhiyun 	if (IS_FW_SUPPORT_11AX(pmadapter)) {
1558*4882a593Smuzhiyun 		if (pmadapter->hw_2g_hecap_len) {
1559*4882a593Smuzhiyun 			pmadapter->fw_bands |= BAND_GAX;
1560*4882a593Smuzhiyun 			pmadapter->config_bands |= BAND_GAX;
1561*4882a593Smuzhiyun 		}
1562*4882a593Smuzhiyun 		if (pmadapter->hw_hecap_len) {
1563*4882a593Smuzhiyun 			pmadapter->fw_bands |= BAND_AAX;
1564*4882a593Smuzhiyun 			pmadapter->config_bands |= BAND_AAX;
1565*4882a593Smuzhiyun 		}
1566*4882a593Smuzhiyun 		for (i = 0; i < pmadapter->priv_num; i++) {
1567*4882a593Smuzhiyun 			if (pmadapter->priv[i]) {
1568*4882a593Smuzhiyun 				pmadapter->priv[i]->config_bands =
1569*4882a593Smuzhiyun 					pmadapter->config_bands;
1570*4882a593Smuzhiyun 				pmadapter->priv[i]->user_2g_hecap_len =
1571*4882a593Smuzhiyun 					pmadapter->hw_2g_hecap_len;
1572*4882a593Smuzhiyun 				memcpy_ext(pmadapter,
1573*4882a593Smuzhiyun 					   pmadapter->priv[i]->user_2g_he_cap,
1574*4882a593Smuzhiyun 					   pmadapter->hw_2g_he_cap,
1575*4882a593Smuzhiyun 					   pmadapter->hw_2g_hecap_len,
1576*4882a593Smuzhiyun 					   sizeof(pmadapter->priv[i]
1577*4882a593Smuzhiyun 							  ->user_2g_he_cap));
1578*4882a593Smuzhiyun 				pmadapter->priv[i]->user_hecap_len =
1579*4882a593Smuzhiyun 					pmadapter->hw_hecap_len;
1580*4882a593Smuzhiyun 				memcpy_ext(
1581*4882a593Smuzhiyun 					pmadapter,
1582*4882a593Smuzhiyun 					pmadapter->priv[i]->user_he_cap,
1583*4882a593Smuzhiyun 					pmadapter->hw_he_cap,
1584*4882a593Smuzhiyun 					pmadapter->hw_hecap_len,
1585*4882a593Smuzhiyun 					sizeof(pmadapter->priv[i]->user_he_cap));
1586*4882a593Smuzhiyun 				user_he_cap_tlv =
1587*4882a593Smuzhiyun 					(MrvlIEtypes_He_cap_t *)&pmadapter
1588*4882a593Smuzhiyun 						->priv[i]
1589*4882a593Smuzhiyun 						->user_2g_he_cap;
1590*4882a593Smuzhiyun 				if (pmadapter->priv[i]->bss_role ==
1591*4882a593Smuzhiyun 				    MLAN_BSS_ROLE_STA)
1592*4882a593Smuzhiyun 					user_he_cap_tlv->he_mac_cap[0] &=
1593*4882a593Smuzhiyun 						~HE_MAC_CAP_TWT_RESP_SUPPORT;
1594*4882a593Smuzhiyun 				else
1595*4882a593Smuzhiyun 					user_he_cap_tlv->he_mac_cap[0] &=
1596*4882a593Smuzhiyun 						~HE_MAC_CAP_TWT_REQ_SUPPORT;
1597*4882a593Smuzhiyun 				user_he_cap_tlv =
1598*4882a593Smuzhiyun 					(MrvlIEtypes_He_cap_t *)&pmadapter
1599*4882a593Smuzhiyun 						->priv[i]
1600*4882a593Smuzhiyun 						->user_he_cap;
1601*4882a593Smuzhiyun 				if (pmadapter->priv[i]->bss_role ==
1602*4882a593Smuzhiyun 				    MLAN_BSS_ROLE_STA)
1603*4882a593Smuzhiyun 					user_he_cap_tlv->he_mac_cap[0] &=
1604*4882a593Smuzhiyun 						~HE_MAC_CAP_TWT_RESP_SUPPORT;
1605*4882a593Smuzhiyun 				else
1606*4882a593Smuzhiyun 					user_he_cap_tlv->he_mac_cap[0] &=
1607*4882a593Smuzhiyun 						~HE_MAC_CAP_TWT_REQ_SUPPORT;
1608*4882a593Smuzhiyun 			}
1609*4882a593Smuzhiyun 		}
1610*4882a593Smuzhiyun 	}
1611*4882a593Smuzhiyun 	LEAVE();
1612*4882a593Smuzhiyun 	return;
1613*4882a593Smuzhiyun }
1614*4882a593Smuzhiyun 
1615*4882a593Smuzhiyun /**
1616*4882a593Smuzhiyun  *  @brief  This function initializes firmware for interface
1617*4882a593Smuzhiyun  *
1618*4882a593Smuzhiyun  *  @param pmadapter		A pointer to mlan_adapter
1619*4882a593Smuzhiyun  *
1620*4882a593Smuzhiyun  *  @return		MLAN_STATUS_SUCCESS, MLAN_STATUS_PENDING or
1621*4882a593Smuzhiyun  * MLAN_STATUS_FAILURE
1622*4882a593Smuzhiyun  */
wlan_init_priv_fw(pmlan_adapter pmadapter)1623*4882a593Smuzhiyun static mlan_status wlan_init_priv_fw(pmlan_adapter pmadapter)
1624*4882a593Smuzhiyun {
1625*4882a593Smuzhiyun 	mlan_status ret = MLAN_STATUS_SUCCESS;
1626*4882a593Smuzhiyun 	pmlan_private priv = MNULL;
1627*4882a593Smuzhiyun 	t_u8 i = 0;
1628*4882a593Smuzhiyun 
1629*4882a593Smuzhiyun 	ENTER();
1630*4882a593Smuzhiyun 
1631*4882a593Smuzhiyun 	wlan_init_priv_lock_list(pmadapter, 1);
1632*4882a593Smuzhiyun 	for (i = 0; i < pmadapter->priv_num; i++) {
1633*4882a593Smuzhiyun 		if (pmadapter->priv[i]) {
1634*4882a593Smuzhiyun 			priv = pmadapter->priv[i];
1635*4882a593Smuzhiyun 
1636*4882a593Smuzhiyun 			/* Initialize private structure */
1637*4882a593Smuzhiyun 			ret = wlan_init_priv(priv);
1638*4882a593Smuzhiyun 			if (ret) {
1639*4882a593Smuzhiyun 				ret = MLAN_STATUS_FAILURE;
1640*4882a593Smuzhiyun 				goto done;
1641*4882a593Smuzhiyun 			}
1642*4882a593Smuzhiyun 		}
1643*4882a593Smuzhiyun 	}
1644*4882a593Smuzhiyun #ifdef MFG_CMD_SUPPORT
1645*4882a593Smuzhiyun 	if (pmadapter->mfg_mode != MTRUE) {
1646*4882a593Smuzhiyun #endif
1647*4882a593Smuzhiyun 		wlan_update_hw_spec(pmadapter);
1648*4882a593Smuzhiyun 		/* Issue firmware initialize commands for first BSS,
1649*4882a593Smuzhiyun 		 * for other interfaces it will be called after getting
1650*4882a593Smuzhiyun 		 * the last init command response of previous interface
1651*4882a593Smuzhiyun 		 */
1652*4882a593Smuzhiyun 		priv = wlan_get_priv(pmadapter, MLAN_BSS_ROLE_ANY);
1653*4882a593Smuzhiyun 		if (!priv) {
1654*4882a593Smuzhiyun 			ret = MLAN_STATUS_FAILURE;
1655*4882a593Smuzhiyun 			goto done;
1656*4882a593Smuzhiyun 		}
1657*4882a593Smuzhiyun 
1658*4882a593Smuzhiyun 		ret = priv->ops.init_cmd(priv, MTRUE);
1659*4882a593Smuzhiyun 		if (ret == MLAN_STATUS_FAILURE)
1660*4882a593Smuzhiyun 			goto done;
1661*4882a593Smuzhiyun #ifdef MFG_CMD_SUPPORT
1662*4882a593Smuzhiyun 	}
1663*4882a593Smuzhiyun #endif /* MFG_CMD_SUPPORT */
1664*4882a593Smuzhiyun 
1665*4882a593Smuzhiyun 	if (wlan_is_cmd_pending(pmadapter)) {
1666*4882a593Smuzhiyun 		/* Send the first command in queue and return */
1667*4882a593Smuzhiyun 		if (mlan_main_process(pmadapter) == MLAN_STATUS_FAILURE)
1668*4882a593Smuzhiyun 			ret = MLAN_STATUS_FAILURE;
1669*4882a593Smuzhiyun 		else
1670*4882a593Smuzhiyun 			ret = MLAN_STATUS_PENDING;
1671*4882a593Smuzhiyun #if defined(MFG_CMD_SUPPORT) && defined(PCIE)
1672*4882a593Smuzhiyun 		if (IS_PCIE(pmadapter->card_type) && pmadapter->mfg_mode) {
1673*4882a593Smuzhiyun 			ret = MLAN_STATUS_SUCCESS;
1674*4882a593Smuzhiyun 			pmadapter->hw_status = WlanHardwareStatusReady;
1675*4882a593Smuzhiyun 		}
1676*4882a593Smuzhiyun #endif
1677*4882a593Smuzhiyun 	} else {
1678*4882a593Smuzhiyun 		pmadapter->hw_status = WlanHardwareStatusReady;
1679*4882a593Smuzhiyun 	}
1680*4882a593Smuzhiyun done:
1681*4882a593Smuzhiyun 	LEAVE();
1682*4882a593Smuzhiyun 	return ret;
1683*4882a593Smuzhiyun }
1684*4882a593Smuzhiyun 
1685*4882a593Smuzhiyun /**
1686*4882a593Smuzhiyun  *  @brief This function frees the structure of adapter
1687*4882a593Smuzhiyun  *
1688*4882a593Smuzhiyun  *  @param pmadapter    A pointer to mlan_adapter structure
1689*4882a593Smuzhiyun  *
1690*4882a593Smuzhiyun  *  @return             N/A
1691*4882a593Smuzhiyun  */
wlan_free_adapter(pmlan_adapter pmadapter)1692*4882a593Smuzhiyun t_void wlan_free_adapter(pmlan_adapter pmadapter)
1693*4882a593Smuzhiyun {
1694*4882a593Smuzhiyun 	mlan_callbacks *pcb = (mlan_callbacks *)&pmadapter->callbacks;
1695*4882a593Smuzhiyun #if defined(USB)
1696*4882a593Smuzhiyun 	t_s32 i = 0;
1697*4882a593Smuzhiyun #endif
1698*4882a593Smuzhiyun 	ENTER();
1699*4882a593Smuzhiyun 
1700*4882a593Smuzhiyun 	if (!pmadapter) {
1701*4882a593Smuzhiyun 		PRINTM(MERROR, "The adapter is NULL\n");
1702*4882a593Smuzhiyun 		LEAVE();
1703*4882a593Smuzhiyun 		return;
1704*4882a593Smuzhiyun 	}
1705*4882a593Smuzhiyun 
1706*4882a593Smuzhiyun 	wlan_cancel_all_pending_cmd(pmadapter, MTRUE);
1707*4882a593Smuzhiyun 	/* Free command buffer */
1708*4882a593Smuzhiyun 	PRINTM(MINFO, "Free Command buffer\n");
1709*4882a593Smuzhiyun 	wlan_free_cmd_buffer(pmadapter);
1710*4882a593Smuzhiyun 
1711*4882a593Smuzhiyun 	if (pmadapter->cmd_timer_is_set) {
1712*4882a593Smuzhiyun 		/* Cancel command timeout timer */
1713*4882a593Smuzhiyun 		pcb->moal_stop_timer(pmadapter->pmoal_handle,
1714*4882a593Smuzhiyun 				     pmadapter->pmlan_cmd_timer);
1715*4882a593Smuzhiyun 		pmadapter->cmd_timer_is_set = MFALSE;
1716*4882a593Smuzhiyun 	}
1717*4882a593Smuzhiyun #if defined(USB)
1718*4882a593Smuzhiyun 	if (IS_USB(pmadapter->card_type)) {
1719*4882a593Smuzhiyun 		for (i = 0; i < MAX_USB_TX_PORT_NUM; i++) {
1720*4882a593Smuzhiyun 			if (pmadapter->pcard_usb->usb_tx_aggr[i]
1721*4882a593Smuzhiyun 				    .aggr_hold_timer_is_set) {
1722*4882a593Smuzhiyun 				/* Cancel usb_tx_aggregation timeout timer */
1723*4882a593Smuzhiyun 				pcb->moal_stop_timer(pmadapter->pmoal_handle,
1724*4882a593Smuzhiyun 						     pmadapter->pcard_usb
1725*4882a593Smuzhiyun 							     ->usb_tx_aggr[i]
1726*4882a593Smuzhiyun 							     .paggr_hold_timer);
1727*4882a593Smuzhiyun 				pmadapter->pcard_usb->usb_tx_aggr[i]
1728*4882a593Smuzhiyun 					.aggr_hold_timer_is_set = MFALSE;
1729*4882a593Smuzhiyun 			}
1730*4882a593Smuzhiyun 		}
1731*4882a593Smuzhiyun 	}
1732*4882a593Smuzhiyun #endif
1733*4882a593Smuzhiyun 	if (pmadapter->wakeup_fw_timer_is_set) {
1734*4882a593Smuzhiyun 		/* Cancel wakeup card timer */
1735*4882a593Smuzhiyun 		pcb->moal_stop_timer(pmadapter->pmoal_handle,
1736*4882a593Smuzhiyun 				     pmadapter->pwakeup_fw_timer);
1737*4882a593Smuzhiyun 		pmadapter->wakeup_fw_timer_is_set = MFALSE;
1738*4882a593Smuzhiyun 	}
1739*4882a593Smuzhiyun 	wlan_free_fw_cfp_tables(pmadapter);
1740*4882a593Smuzhiyun #ifdef STA_SUPPORT
1741*4882a593Smuzhiyun 	PRINTM(MINFO, "Free ScanTable\n");
1742*4882a593Smuzhiyun 	if (pmadapter->pscan_table) {
1743*4882a593Smuzhiyun 		if (pcb->moal_vmalloc && pcb->moal_vfree)
1744*4882a593Smuzhiyun 			pcb->moal_vfree(pmadapter->pmoal_handle,
1745*4882a593Smuzhiyun 					(t_u8 *)pmadapter->pscan_table);
1746*4882a593Smuzhiyun 		else
1747*4882a593Smuzhiyun 			pcb->moal_mfree(pmadapter->pmoal_handle,
1748*4882a593Smuzhiyun 					(t_u8 *)pmadapter->pscan_table);
1749*4882a593Smuzhiyun 		pmadapter->pscan_table = MNULL;
1750*4882a593Smuzhiyun 	}
1751*4882a593Smuzhiyun 	if (pmadapter->pchan_stats) {
1752*4882a593Smuzhiyun 		if (pcb->moal_vmalloc && pcb->moal_vfree)
1753*4882a593Smuzhiyun 			pcb->moal_vfree(pmadapter->pmoal_handle,
1754*4882a593Smuzhiyun 					(t_u8 *)pmadapter->pchan_stats);
1755*4882a593Smuzhiyun 		else
1756*4882a593Smuzhiyun 			pcb->moal_mfree(pmadapter->pmoal_handle,
1757*4882a593Smuzhiyun 					(t_u8 *)pmadapter->pchan_stats);
1758*4882a593Smuzhiyun 		pmadapter->pchan_stats = MNULL;
1759*4882a593Smuzhiyun 	}
1760*4882a593Smuzhiyun 	if (pmadapter->bcn_buf) {
1761*4882a593Smuzhiyun 		if (pcb->moal_vmalloc && pcb->moal_vfree)
1762*4882a593Smuzhiyun 			pcb->moal_vfree(pmadapter->pmoal_handle,
1763*4882a593Smuzhiyun 					(t_u8 *)pmadapter->bcn_buf);
1764*4882a593Smuzhiyun 		else
1765*4882a593Smuzhiyun 			pcb->moal_mfree(pmadapter->pmoal_handle,
1766*4882a593Smuzhiyun 					(t_u8 *)pmadapter->bcn_buf);
1767*4882a593Smuzhiyun 		pmadapter->bcn_buf = MNULL;
1768*4882a593Smuzhiyun 	}
1769*4882a593Smuzhiyun #endif
1770*4882a593Smuzhiyun 
1771*4882a593Smuzhiyun 	wlan_11h_cleanup(pmadapter);
1772*4882a593Smuzhiyun 
1773*4882a593Smuzhiyun #ifdef SDIO
1774*4882a593Smuzhiyun 	if (IS_SD(pmadapter->card_type)) {
1775*4882a593Smuzhiyun 		if (pmadapter->pcard_sd->mp_regs_buf) {
1776*4882a593Smuzhiyun 			pcb->moal_mfree(
1777*4882a593Smuzhiyun 				pmadapter->pmoal_handle,
1778*4882a593Smuzhiyun 				(t_u8 *)pmadapter->pcard_sd->mp_regs_buf);
1779*4882a593Smuzhiyun 			pmadapter->pcard_sd->mp_regs_buf = MNULL;
1780*4882a593Smuzhiyun 			pmadapter->pcard_sd->mp_regs = MNULL;
1781*4882a593Smuzhiyun 		}
1782*4882a593Smuzhiyun 		if (pmadapter->pcard_sd->rx_buffer) {
1783*4882a593Smuzhiyun 			pcb->moal_mfree(pmadapter->pmoal_handle,
1784*4882a593Smuzhiyun 					(t_u8 *)pmadapter->pcard_sd->rx_buffer);
1785*4882a593Smuzhiyun 			pmadapter->pcard_sd->rx_buffer = MNULL;
1786*4882a593Smuzhiyun 			pmadapter->pcard_sd->rx_buf = MNULL;
1787*4882a593Smuzhiyun 		}
1788*4882a593Smuzhiyun 		wlan_free_sdio_mpa_buffers(pmadapter);
1789*4882a593Smuzhiyun #ifdef DEBUG_LEVEL1
1790*4882a593Smuzhiyun 		if (pmadapter->pcard_sd->mpa_buf) {
1791*4882a593Smuzhiyun 			if (pcb->moal_vmalloc && pcb->moal_vfree)
1792*4882a593Smuzhiyun 				pcb->moal_vfree(
1793*4882a593Smuzhiyun 					pmadapter->pmoal_handle,
1794*4882a593Smuzhiyun 					(t_u8 *)pmadapter->pcard_sd->mpa_buf);
1795*4882a593Smuzhiyun 			else
1796*4882a593Smuzhiyun 				pcb->moal_mfree(
1797*4882a593Smuzhiyun 					pmadapter->pmoal_handle,
1798*4882a593Smuzhiyun 					(t_u8 *)pmadapter->pcard_sd->mpa_buf);
1799*4882a593Smuzhiyun 			pmadapter->pcard_sd->mpa_buf = MNULL;
1800*4882a593Smuzhiyun 			pmadapter->pcard_sd->mpa_buf_size = 0;
1801*4882a593Smuzhiyun 		}
1802*4882a593Smuzhiyun #endif
1803*4882a593Smuzhiyun 	}
1804*4882a593Smuzhiyun #endif
1805*4882a593Smuzhiyun 
1806*4882a593Smuzhiyun 	wlan_free_mlan_buffer(pmadapter, pmadapter->psleep_cfm);
1807*4882a593Smuzhiyun 	pmadapter->psleep_cfm = MNULL;
1808*4882a593Smuzhiyun 
1809*4882a593Smuzhiyun #ifdef PCIE
1810*4882a593Smuzhiyun 	if (IS_PCIE(pmadapter->card_type)) {
1811*4882a593Smuzhiyun 		/* Free ssu dma buffer just in case  */
1812*4882a593Smuzhiyun 		wlan_free_ssu_pcie_buf(pmadapter);
1813*4882a593Smuzhiyun 		/* Free PCIE ring buffers */
1814*4882a593Smuzhiyun 		wlan_free_pcie_ring_buf(pmadapter);
1815*4882a593Smuzhiyun 	}
1816*4882a593Smuzhiyun #endif
1817*4882a593Smuzhiyun 
1818*4882a593Smuzhiyun 	/* Free timers */
1819*4882a593Smuzhiyun 	wlan_free_timer(pmadapter);
1820*4882a593Smuzhiyun 
1821*4882a593Smuzhiyun 	/* Free lock variables */
1822*4882a593Smuzhiyun 	wlan_free_lock_list(pmadapter);
1823*4882a593Smuzhiyun 
1824*4882a593Smuzhiyun #ifdef SDIO
1825*4882a593Smuzhiyun 	if (pmadapter->pcard_sd) {
1826*4882a593Smuzhiyun 		pcb->moal_mfree(pmadapter->pmoal_handle,
1827*4882a593Smuzhiyun 				(t_u8 *)pmadapter->pcard_sd);
1828*4882a593Smuzhiyun 		pmadapter->pcard_sd = MNULL;
1829*4882a593Smuzhiyun 	}
1830*4882a593Smuzhiyun #endif
1831*4882a593Smuzhiyun #ifdef PCIE
1832*4882a593Smuzhiyun 	if (pmadapter->pcard_pcie) {
1833*4882a593Smuzhiyun 		pcb->moal_mfree(pmadapter->pmoal_handle,
1834*4882a593Smuzhiyun 				(t_u8 *)pmadapter->pcard_pcie);
1835*4882a593Smuzhiyun 		pmadapter->pcard_pcie = MNULL;
1836*4882a593Smuzhiyun 	}
1837*4882a593Smuzhiyun #endif
1838*4882a593Smuzhiyun #ifdef USB
1839*4882a593Smuzhiyun 	if (pmadapter->pcard_usb) {
1840*4882a593Smuzhiyun 		pcb->moal_mfree(pmadapter->pmoal_handle,
1841*4882a593Smuzhiyun 				(t_u8 *)pmadapter->pcard_usb);
1842*4882a593Smuzhiyun 		pmadapter->pcard_usb = MNULL;
1843*4882a593Smuzhiyun 	}
1844*4882a593Smuzhiyun #endif
1845*4882a593Smuzhiyun 	vdll_deinit(pmadapter);
1846*4882a593Smuzhiyun 
1847*4882a593Smuzhiyun 	LEAVE();
1848*4882a593Smuzhiyun 	return;
1849*4882a593Smuzhiyun }
1850*4882a593Smuzhiyun 
1851*4882a593Smuzhiyun /**
1852*4882a593Smuzhiyun  *  @brief This function frees the structure of priv
1853*4882a593Smuzhiyun  *
1854*4882a593Smuzhiyun  *  @param pmpriv   A pointer to mlan_private structure
1855*4882a593Smuzhiyun  *
1856*4882a593Smuzhiyun  *  @return         N/A
1857*4882a593Smuzhiyun  */
wlan_free_priv(mlan_private * pmpriv)1858*4882a593Smuzhiyun t_void wlan_free_priv(mlan_private *pmpriv)
1859*4882a593Smuzhiyun {
1860*4882a593Smuzhiyun 	ENTER();
1861*4882a593Smuzhiyun 	wlan_clean_txrx(pmpriv);
1862*4882a593Smuzhiyun 	wlan_delete_bsspriotbl(pmpriv);
1863*4882a593Smuzhiyun 
1864*4882a593Smuzhiyun #ifdef STA_SUPPORT
1865*4882a593Smuzhiyun 	wlan_free_curr_bcn(pmpriv);
1866*4882a593Smuzhiyun #endif /* STA_SUPPORT */
1867*4882a593Smuzhiyun 
1868*4882a593Smuzhiyun #if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT)
1869*4882a593Smuzhiyun 	hostsa_cleanup(pmpriv);
1870*4882a593Smuzhiyun #endif /*EMBEDDED AUTHENTICATOR*/
1871*4882a593Smuzhiyun 
1872*4882a593Smuzhiyun 	wlan_delete_station_list(pmpriv);
1873*4882a593Smuzhiyun 	LEAVE();
1874*4882a593Smuzhiyun }
1875*4882a593Smuzhiyun 
1876*4882a593Smuzhiyun /**
1877*4882a593Smuzhiyun  *  @brief This function init interface based on pmadapter's bss_attr table
1878*4882a593Smuzhiyun  *
1879*4882a593Smuzhiyun  *  @param pmadapter    A pointer to mlan_adapter structure
1880*4882a593Smuzhiyun  *
1881*4882a593Smuzhiyun  *  @return             N/A
1882*4882a593Smuzhiyun  */
wlan_init_interface(pmlan_adapter pmadapter)1883*4882a593Smuzhiyun static mlan_status wlan_init_interface(pmlan_adapter pmadapter)
1884*4882a593Smuzhiyun {
1885*4882a593Smuzhiyun 	mlan_status ret = MLAN_STATUS_SUCCESS;
1886*4882a593Smuzhiyun 	pmlan_callbacks pcb = MNULL;
1887*4882a593Smuzhiyun 	t_u8 i = 0;
1888*4882a593Smuzhiyun 	t_u32 j = 0;
1889*4882a593Smuzhiyun 
1890*4882a593Smuzhiyun 	ENTER();
1891*4882a593Smuzhiyun 
1892*4882a593Smuzhiyun 	pcb = &pmadapter->callbacks;
1893*4882a593Smuzhiyun 	for (i = 0; i < MLAN_MAX_BSS_NUM; i++) {
1894*4882a593Smuzhiyun 		if (pmadapter->bss_attr[i].active == MTRUE) {
1895*4882a593Smuzhiyun 			if (!pmadapter->priv[i]) {
1896*4882a593Smuzhiyun 				/* For valid bss_attr, allocate memory for
1897*4882a593Smuzhiyun 				 * private structure */
1898*4882a593Smuzhiyun 				if (pcb->moal_vmalloc && pcb->moal_vfree)
1899*4882a593Smuzhiyun 					ret = pcb->moal_vmalloc(
1900*4882a593Smuzhiyun 						pmadapter->pmoal_handle,
1901*4882a593Smuzhiyun 						sizeof(mlan_private),
1902*4882a593Smuzhiyun 						(t_u8 **)&pmadapter->priv[i]);
1903*4882a593Smuzhiyun 				else
1904*4882a593Smuzhiyun 					ret = pcb->moal_malloc(
1905*4882a593Smuzhiyun 						pmadapter->pmoal_handle,
1906*4882a593Smuzhiyun 						sizeof(mlan_private),
1907*4882a593Smuzhiyun 						MLAN_MEM_DEF,
1908*4882a593Smuzhiyun 						(t_u8 **)&pmadapter->priv[i]);
1909*4882a593Smuzhiyun 				if (ret != MLAN_STATUS_SUCCESS ||
1910*4882a593Smuzhiyun 				    !pmadapter->priv[i]) {
1911*4882a593Smuzhiyun 					ret = MLAN_STATUS_FAILURE;
1912*4882a593Smuzhiyun 					goto error;
1913*4882a593Smuzhiyun 				}
1914*4882a593Smuzhiyun 
1915*4882a593Smuzhiyun 				pmadapter->priv_num++;
1916*4882a593Smuzhiyun 				memset(pmadapter, pmadapter->priv[i], 0,
1917*4882a593Smuzhiyun 				       sizeof(mlan_private));
1918*4882a593Smuzhiyun 			}
1919*4882a593Smuzhiyun 			pmadapter->priv[i]->adapter = pmadapter;
1920*4882a593Smuzhiyun 
1921*4882a593Smuzhiyun 			/* Save bss_type, frame_type & bss_priority */
1922*4882a593Smuzhiyun 			pmadapter->priv[i]->bss_type =
1923*4882a593Smuzhiyun 				(t_u8)pmadapter->bss_attr[i].bss_type;
1924*4882a593Smuzhiyun 			pmadapter->priv[i]->frame_type =
1925*4882a593Smuzhiyun 				(t_u8)pmadapter->bss_attr[i].frame_type;
1926*4882a593Smuzhiyun 			pmadapter->priv[i]->bss_priority =
1927*4882a593Smuzhiyun 				(t_u8)pmadapter->bss_attr[i].bss_priority;
1928*4882a593Smuzhiyun 			if (pmadapter->bss_attr[i].bss_type ==
1929*4882a593Smuzhiyun 			    MLAN_BSS_TYPE_STA)
1930*4882a593Smuzhiyun 				pmadapter->priv[i]->bss_role =
1931*4882a593Smuzhiyun 					MLAN_BSS_ROLE_STA;
1932*4882a593Smuzhiyun 			else if (pmadapter->bss_attr[i].bss_type ==
1933*4882a593Smuzhiyun 					 MLAN_BSS_TYPE_UAP ||
1934*4882a593Smuzhiyun 				 pmadapter->bss_attr[i].bss_type ==
1935*4882a593Smuzhiyun 					 MLAN_BSS_TYPE_DFS)
1936*4882a593Smuzhiyun 				pmadapter->priv[i]->bss_role =
1937*4882a593Smuzhiyun 					MLAN_BSS_ROLE_UAP;
1938*4882a593Smuzhiyun #ifdef WIFI_DIRECT_SUPPORT
1939*4882a593Smuzhiyun 			else if (pmadapter->bss_attr[i].bss_type ==
1940*4882a593Smuzhiyun 				 MLAN_BSS_TYPE_WIFIDIRECT) {
1941*4882a593Smuzhiyun 				pmadapter->priv[i]->bss_role =
1942*4882a593Smuzhiyun 					MLAN_BSS_ROLE_STA;
1943*4882a593Smuzhiyun 				if (pmadapter->bss_attr[i].bss_virtual)
1944*4882a593Smuzhiyun 					pmadapter->priv[i]->bss_virtual = MTRUE;
1945*4882a593Smuzhiyun 			}
1946*4882a593Smuzhiyun #endif
1947*4882a593Smuzhiyun 			/* Save bss_index and bss_num */
1948*4882a593Smuzhiyun 			pmadapter->priv[i]->bss_index = i;
1949*4882a593Smuzhiyun 			pmadapter->priv[i]->bss_num =
1950*4882a593Smuzhiyun 				(t_u8)pmadapter->bss_attr[i].bss_num;
1951*4882a593Smuzhiyun 
1952*4882a593Smuzhiyun 			/* init function table */
1953*4882a593Smuzhiyun 			for (j = 0; mlan_ops[j]; j++) {
1954*4882a593Smuzhiyun 				if (mlan_ops[j]->bss_role ==
1955*4882a593Smuzhiyun 				    GET_BSS_ROLE(pmadapter->priv[i])) {
1956*4882a593Smuzhiyun 					memcpy_ext(pmadapter,
1957*4882a593Smuzhiyun 						   &pmadapter->priv[i]->ops,
1958*4882a593Smuzhiyun 						   mlan_ops[j],
1959*4882a593Smuzhiyun 						   sizeof(mlan_operations),
1960*4882a593Smuzhiyun 						   sizeof(mlan_operations));
1961*4882a593Smuzhiyun 					break;
1962*4882a593Smuzhiyun 				}
1963*4882a593Smuzhiyun 			}
1964*4882a593Smuzhiyun 		}
1965*4882a593Smuzhiyun 	}
1966*4882a593Smuzhiyun 	/*wmm init*/
1967*4882a593Smuzhiyun 	wlan_wmm_init(pmadapter);
1968*4882a593Smuzhiyun 	/* Initialize firmware, may return PENDING */
1969*4882a593Smuzhiyun 	ret = wlan_init_priv_fw(pmadapter);
1970*4882a593Smuzhiyun 	PRINTM(MINFO, "wlan_init_priv_fw returned ret=0x%x\n", ret);
1971*4882a593Smuzhiyun error:
1972*4882a593Smuzhiyun 	LEAVE();
1973*4882a593Smuzhiyun 	return ret;
1974*4882a593Smuzhiyun }
1975*4882a593Smuzhiyun 
1976*4882a593Smuzhiyun /**
1977*4882a593Smuzhiyun  *  @brief The cmdresp handler calls this function for init_fw_complete callback
1978*4882a593Smuzhiyun  *
1979*4882a593Smuzhiyun  *  @param pmadapter	A pointer to mlan_adapter structure
1980*4882a593Smuzhiyun  *
1981*4882a593Smuzhiyun  *  @return		MLAN_STATUS_SUCCESS
1982*4882a593Smuzhiyun  *              The firmware initialization callback succeeded.
1983*4882a593Smuzhiyun  */
wlan_get_hw_spec_complete(pmlan_adapter pmadapter)1984*4882a593Smuzhiyun mlan_status wlan_get_hw_spec_complete(pmlan_adapter pmadapter)
1985*4882a593Smuzhiyun {
1986*4882a593Smuzhiyun 	mlan_status status = MLAN_STATUS_SUCCESS;
1987*4882a593Smuzhiyun 	mlan_status ret = MLAN_STATUS_SUCCESS;
1988*4882a593Smuzhiyun 	pmlan_callbacks pcb = &pmadapter->callbacks;
1989*4882a593Smuzhiyun 	mlan_hw_info info;
1990*4882a593Smuzhiyun 	mlan_bss_tbl bss_tbl;
1991*4882a593Smuzhiyun 
1992*4882a593Smuzhiyun 	ENTER();
1993*4882a593Smuzhiyun #ifdef MFG_CMD_SUPPORT
1994*4882a593Smuzhiyun 	if (pmadapter->mfg_mode != MTRUE) {
1995*4882a593Smuzhiyun #endif
1996*4882a593Smuzhiyun 		/* Check if hardware is ready */
1997*4882a593Smuzhiyun 		if (pmadapter->hw_status != WlanHardwareStatusInitializing)
1998*4882a593Smuzhiyun 			status = MLAN_STATUS_FAILURE;
1999*4882a593Smuzhiyun 		else {
2000*4882a593Smuzhiyun 			memset(pmadapter, &info, 0, sizeof(info));
2001*4882a593Smuzhiyun 			info.fw_cap = pmadapter->fw_cap_info;
2002*4882a593Smuzhiyun 			info.fw_cap_ext = pmadapter->fw_cap_ext;
2003*4882a593Smuzhiyun 			memset(pmadapter, &bss_tbl, 0, sizeof(bss_tbl));
2004*4882a593Smuzhiyun 			memcpy_ext(pmadapter, bss_tbl.bss_attr,
2005*4882a593Smuzhiyun 				   pmadapter->bss_attr, sizeof(mlan_bss_tbl),
2006*4882a593Smuzhiyun 				   sizeof(mlan_bss_tbl));
2007*4882a593Smuzhiyun 		}
2008*4882a593Smuzhiyun 		/* Invoke callback */
2009*4882a593Smuzhiyun 		ret = pcb->moal_get_hw_spec_complete(pmadapter->pmoal_handle,
2010*4882a593Smuzhiyun 						     status, &info, &bss_tbl);
2011*4882a593Smuzhiyun 		if (ret == MLAN_STATUS_SUCCESS && status == MLAN_STATUS_SUCCESS)
2012*4882a593Smuzhiyun 			memcpy_ext(pmadapter, pmadapter->bss_attr,
2013*4882a593Smuzhiyun 				   bss_tbl.bss_attr, sizeof(mlan_bss_tbl),
2014*4882a593Smuzhiyun 				   sizeof(mlan_bss_tbl));
2015*4882a593Smuzhiyun 		else {
2016*4882a593Smuzhiyun 			pmadapter->hw_status = WlanHardwareStatusNotReady;
2017*4882a593Smuzhiyun 			wlan_init_fw_complete(pmadapter);
2018*4882a593Smuzhiyun 		}
2019*4882a593Smuzhiyun #ifdef MFG_CMD_SUPPORT
2020*4882a593Smuzhiyun 	}
2021*4882a593Smuzhiyun #endif
2022*4882a593Smuzhiyun 	if (pmadapter->hw_status == WlanHardwareStatusInitializing)
2023*4882a593Smuzhiyun 		ret = wlan_init_interface(pmadapter);
2024*4882a593Smuzhiyun 	LEAVE();
2025*4882a593Smuzhiyun 	return ret;
2026*4882a593Smuzhiyun }
2027*4882a593Smuzhiyun 
2028*4882a593Smuzhiyun /**
2029*4882a593Smuzhiyun  *  @brief The cmdresp handler calls this function for init_fw_complete callback
2030*4882a593Smuzhiyun  *
2031*4882a593Smuzhiyun  *  @param pmadapter	A pointer to mlan_adapter structure
2032*4882a593Smuzhiyun  *
2033*4882a593Smuzhiyun  *  @return		MLAN_STATUS_SUCCESS
2034*4882a593Smuzhiyun  *              The firmware initialization callback succeeded.
2035*4882a593Smuzhiyun  */
wlan_init_fw_complete(pmlan_adapter pmadapter)2036*4882a593Smuzhiyun mlan_status wlan_init_fw_complete(pmlan_adapter pmadapter)
2037*4882a593Smuzhiyun {
2038*4882a593Smuzhiyun 	mlan_status status = MLAN_STATUS_SUCCESS;
2039*4882a593Smuzhiyun 	mlan_status ret = MLAN_STATUS_SUCCESS;
2040*4882a593Smuzhiyun 	pmlan_callbacks pcb = &pmadapter->callbacks;
2041*4882a593Smuzhiyun 	mlan_private *pmpriv = MNULL;
2042*4882a593Smuzhiyun 
2043*4882a593Smuzhiyun 	ENTER();
2044*4882a593Smuzhiyun 
2045*4882a593Smuzhiyun 	/* Check if hardware is ready */
2046*4882a593Smuzhiyun 	if (pmadapter->hw_status != WlanHardwareStatusReady)
2047*4882a593Smuzhiyun 		status = MLAN_STATUS_FAILURE;
2048*4882a593Smuzhiyun 
2049*4882a593Smuzhiyun 	/* Reconfigure wmm parameter*/
2050*4882a593Smuzhiyun 	if (status == MLAN_STATUS_SUCCESS) {
2051*4882a593Smuzhiyun 		pmpriv = wlan_get_priv(pmadapter, MLAN_BSS_ROLE_STA);
2052*4882a593Smuzhiyun 		if (pmpriv)
2053*4882a593Smuzhiyun 			status = wlan_prepare_cmd(pmpriv,
2054*4882a593Smuzhiyun 						  HostCmd_CMD_WMM_PARAM_CONFIG,
2055*4882a593Smuzhiyun 						  HostCmd_ACT_GEN_SET, 0, MNULL,
2056*4882a593Smuzhiyun 						  &pmadapter->ac_params);
2057*4882a593Smuzhiyun 	}
2058*4882a593Smuzhiyun 	/* Invoke callback */
2059*4882a593Smuzhiyun 	ret = pcb->moal_init_fw_complete(pmadapter->pmoal_handle, status);
2060*4882a593Smuzhiyun 	LEAVE();
2061*4882a593Smuzhiyun 	return ret;
2062*4882a593Smuzhiyun }
2063*4882a593Smuzhiyun 
2064*4882a593Smuzhiyun /**
2065*4882a593Smuzhiyun  *  @brief The cmdresp handler calls this function
2066*4882a593Smuzhiyun  *          for shutdown_fw_complete callback
2067*4882a593Smuzhiyun  *
2068*4882a593Smuzhiyun  *  @param pmadapter    A pointer to mlan_adapter structure
2069*4882a593Smuzhiyun  *
2070*4882a593Smuzhiyun  *  @return             MLAN_STATUS_SUCCESS
2071*4882a593Smuzhiyun  *                      The firmware shutdown callback succeeded.
2072*4882a593Smuzhiyun  */
wlan_shutdown_fw_complete(pmlan_adapter pmadapter)2073*4882a593Smuzhiyun mlan_status wlan_shutdown_fw_complete(pmlan_adapter pmadapter)
2074*4882a593Smuzhiyun {
2075*4882a593Smuzhiyun 	pmlan_callbacks pcb = &pmadapter->callbacks;
2076*4882a593Smuzhiyun 	mlan_status status = MLAN_STATUS_SUCCESS;
2077*4882a593Smuzhiyun 	mlan_status ret = MLAN_STATUS_SUCCESS;
2078*4882a593Smuzhiyun 
2079*4882a593Smuzhiyun 	ENTER();
2080*4882a593Smuzhiyun 	pmadapter->hw_status = WlanHardwareStatusNotReady;
2081*4882a593Smuzhiyun 	/* Invoke callback */
2082*4882a593Smuzhiyun 	ret = pcb->moal_shutdown_fw_complete(pmadapter->pmoal_handle, status);
2083*4882a593Smuzhiyun 	LEAVE();
2084*4882a593Smuzhiyun 	return ret;
2085*4882a593Smuzhiyun }
2086