• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /****************************************************************************
2 **+-----------------------------------------------------------------------+**
3 **|                                                                       |**
4 **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved.      |**
5 **| All rights reserved.                                                  |**
6 **|                                                                       |**
7 **| Redistribution and use in source and binary forms, with or without    |**
8 **| modification, are permitted provided that the following conditions    |**
9 **| are met:                                                              |**
10 **|                                                                       |**
11 **|  * Redistributions of source code must retain the above copyright     |**
12 **|    notice, this list of conditions and the following disclaimer.      |**
13 **|  * Redistributions in binary form must reproduce the above copyright  |**
14 **|    notice, this list of conditions and the following disclaimer in    |**
15 **|    the documentation and/or other materials provided with the         |**
16 **|    distribution.                                                      |**
17 **|  * Neither the name Texas Instruments nor the names of its            |**
18 **|    contributors may be used to endorse or promote products derived    |**
19 **|    from this software without specific prior written permission.      |**
20 **|                                                                       |**
21 **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |**
22 **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |**
23 **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
24 **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |**
25 **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
26 **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |**
27 **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
28 **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
29 **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |**
30 **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
31 **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |**
32 **|                                                                       |**
33 **+-----------------------------------------------------------------------+**
34 ****************************************************************************/
35 #include "osTIType.h"
36 #include "whalCommon.h"
37 #include "whalHwDefs.h"
38 #include "whalBus_Api.h"
39 #include "CmdMBox_api.h"
40 #include "CmdQueue_api.h"
41 #include "CmdQueue.h"
42 
43 #ifdef TI_DBG
44 static char *StateString[CMDQUEUE_STATE_NUM] = {
45 	"CMDQUEUE_STATE_IDLE",  /* 0 */
46 	"CMDQUEUE_STATE_SEND_CMD_v",  /* 1 */
47 	"CMDQUEUE_STATE_WAIT_SEND_CMPLT",  /* 2 */
48 	"CMDQUEUE_STATE_INTERROGATE_v",  /* 3 */
49 	"CMDQUEUE_STATE_WAIT_RESULT",  /* 4 */
50 	"CMDQUEUE_STATE_FINISH_v",  /* 5 */
51 };
52 
53 static char *EventString[CMDQUEUE_EVENT_NUM] = {
54 	"CMDQUEUE_EVENT_RUN",  /* 1 */
55 	"CMDQUEUE_EVENT_SEND_CMPLT",  /* 2 */
56 	"CMDQUEUE_EVENT_RESULT_RECEIVED",  /* 3 */
57 };
58 
59 #endif /* TI_DBG */
60 
61 
62 /****************************************************************************
63  *                      CmdQueue_Create()
64  ****************************************************************************
65  * DESCRIPTION: Create the CmdQueue object
66  *
67  * INPUTS:  TI_HANDLE *hOs
68  *
69  * OUTPUT:  None
70  *
71  * RETURNS: The Created object
72  *****************************************************************************/
CmdQueue_Create(TI_HANDLE hOs)73 TI_HANDLE CmdQueue_Create(TI_HANDLE hOs)
74 {
75 
76     CmdQueue_T  *pObj;
77 
78     pObj = os_memoryAlloc(hOs, sizeof(CmdQueue_T));
79     if (pObj == NULL)
80     {
81         WLAN_OS_REPORT(("FATAL ERROR: CmdQueue_Create(): Error Creating CmdQueue - Aborting\n"));
82         return NULL;
83     }
84 
85     /* reset control module control block */
86     os_memoryZero(hOs, pObj, sizeof(CmdQueue_T));
87     pObj->hOs = hOs;
88 
89     return(pObj);
90 }
91 
92 
93 /****************************************************************************
94  *                      CmdQueue_Destroy()
95  ****************************************************************************
96  * DESCRIPTION: Destroy the object
97  *
98  * INPUTS:  hCmdQueue   The object to free
99  *
100  * OUTPUT:  None
101  *
102  * RETURNS: OK or NOK
103  ****************************************************************************/
CmdQueue_Destroy(TI_HANDLE hCmdQueue)104 int					CmdQueue_Destroy(TI_HANDLE hCmdQueue)
105 {
106 	CmdQueue_T* pCmdQueue = (CmdQueue_T*)	hCmdQueue;
107 
108 	/* free context */
109        os_memoryFree(pCmdQueue->hOs, pCmdQueue, sizeof(CmdQueue_T));
110 
111 	return OK;
112 }
113 
114 /****************************************************************************
115  *                      CmdQueue_Config()
116  ****************************************************************************
117  * DESCRIPTION: Config the CmdQueue object
118  *
119  * INPUTS:
120  *
121  * OUTPUT:  None
122  *
123  * RETURNS: OK or NOK
124  ****************************************************************************/
CmdQueue_Config(TI_HANDLE hCmdQueue,TI_HANDLE hCmdMBox,TI_HANDLE hReport)125 int CmdQueue_Config (TI_HANDLE hCmdQueue, TI_HANDLE hCmdMBox, TI_HANDLE hReport)
126 {
127     CmdQueue_T* pCmdQueue = (CmdQueue_T*) hCmdQueue;
128 
129     pCmdQueue->Head = 0;
130     pCmdQueue->Tail = 0;
131     pCmdQueue->NumberOfCommandInQueue = 0;
132     pCmdQueue->MaxNumberOfCommandInQueue = 0;
133     pCmdQueue->State = CMDQUEUE_STATE_IDLE;
134     pCmdQueue->CmdCompleteGenericCB_Func = NULL;
135     pCmdQueue->CmdCompleteGenericCB_Arg = NULL;
136     pCmdQueue->FailureCB = NULL;
137     pCmdQueue->FailureCbHandle = NULL;
138     pCmdQueue->SM_RC = 0;
139     pCmdQueue->hReport = hReport;
140     pCmdQueue->hCmdMBox = hCmdMBox;
141     pCmdQueue->ErrorFlag = FALSE;
142 
143     /*
144      * NOTE: don't set NumberOfRecoveryNodes = 0;
145      *       its value is used by recovery process
146      */
147 
148     return OK;
149 }
150 
151 /****************************************************************************
152  *                      CmdQueue_StartReconfig()
153  ****************************************************************************
154  * DESCRIPTION: Restart the module for recovery. Clean the queue but save al the CB in the queue.
155  *
156  * INPUTS:
157  *
158  * OUTPUT:
159  *
160  * RETURNS: OK or NOK
161  ****************************************************************************/
CmdQueue_StartReconfig(TI_HANDLE hCmdQueue)162 int					CmdQueue_StartReconfig(TI_HANDLE hCmdQueue)
163 {
164 	CmdQueue_T* pCmdQueue = (CmdQueue_T*)	hCmdQueue;
165 	int CurrentCmdindex;
166     	int first  = pCmdQueue->Head;
167 	CmdQueue_CmdNode_T* pHead ;
168 	CmdQueue_RecoveryNode_T* pRecoveryNode;
169 
170 	/*
171 	stop the SM
172 	*/
173     	pCmdQueue->State = CMDQUEUE_STATE_IDLE;
174 
175 	WLAN_REPORT_INFORMATION(pCmdQueue->hReport, CMD_MBOX_MODULE_LOG,
176         							("CmdQueue_Clean: Cleaning CmdQueue Queue"));
177 
178 	/*
179 	Save The Call Back Function in the Queue in order the return them after the recovery
180 	with on error status
181 	*/
182 
183 	/* Clean The Command Call Back Counter */
184 	pCmdQueue->NumberOfRecoveryNodes = 0;
185 	pRecoveryNode = &pCmdQueue->RecoveryQueue[pCmdQueue->NumberOfRecoveryNodes];
186 	for(CurrentCmdindex = 0 ; CurrentCmdindex < pCmdQueue->NumberOfCommandInQueue ; CurrentCmdindex++)
187     	{
188 		pHead  =  &pCmdQueue->CmdQueue[first];
189 
190 		if(pHead->CB_Func != NULL)
191 		{ /*Copy the interrogate CB and the interrogate data buffer pointer */
192 			pRecoveryNode->CB_Func = pHead->CB_Func;
193 			pRecoveryNode->CB_Arg = pHead->CB_Arg;
194 			pRecoveryNode->interrogateParamsBuf = pHead->interrogateParamsBuf;
195 			pCmdQueue->NumberOfRecoveryNodes++;
196 			pRecoveryNode = &pCmdQueue->RecoveryQueue[pCmdQueue->NumberOfRecoveryNodes];
197 		}
198 		first++;
199 		if(first == CMDQUEUE_QUEUE_DEPTH)
200 			first = 0;
201 	}
202 
203 	/*
204 	init the queue
205 	*/
206 	pCmdQueue->Head = 0;
207     pCmdQueue->Tail = 0;
208     pCmdQueue->NumberOfCommandInQueue = 0;
209 
210 	return OK;
211 }
212 
213 /****************************************************************************
214  *                      CmdQueue_EndReconfig()
215  ****************************************************************************
216  * DESCRIPTION: Call the stored CB to end the recovery of the MBox queue
217  *
218  * INPUTS:
219  *
220  * OUTPUT:
221  *
222  * RETURNS: OK or NOK
223  ****************************************************************************/
CmdQueue_EndReconfig(TI_HANDLE hCmdQueue)224 int					CmdQueue_EndReconfig(TI_HANDLE hCmdQueue)
225 {
226 	CmdQueue_T* pCmdQueue = (CmdQueue_T*)	hCmdQueue;
227 
228 	int	Cbindex;
229 	CmdQueue_RecoveryNode_T *pHead;
230 
231 	for(Cbindex = 0; Cbindex < pCmdQueue->NumberOfRecoveryNodes; Cbindex++)
232 	{
233 		pHead  =  &pCmdQueue->RecoveryQueue[Cbindex];
234 
235 		if(pHead->interrogateParamsBuf)
236 	    	{
237     			((CmdQueue_InterrogateCB_t)pHead->CB_Func)(pHead->CB_Arg, CMD_STATUS_FW_RESET,pHead->interrogateParamsBuf);
238     		}
239 		else
240 		{
241 			((CmdQueue_CB_t)pHead->CB_Func)(pHead->CB_Arg, CMD_STATUS_FW_RESET);
242 		}
243 	}
244 
245 	pCmdQueue->NumberOfRecoveryNodes = 0;
246 
247 	return OK;
248 }
249 
250 /****************************************************************************
251  *                 CmdQueue_RegisterCmdCompleteGenericCB()
252  ****************************************************************************
253  * DESCRIPTION: Register for a call back to be called when Command Complete
254  *              Occur and the CmdMboxCB was NULL
255  *
256  * RETURNS:None
257  ****************************************************************************/
CmdQueue_RegisterCmdCompleteGenericCB(TI_HANDLE hCmdQueue,void * CB_Func,TI_HANDLE CB_handle)258 int					CmdQueue_RegisterCmdCompleteGenericCB(TI_HANDLE hCmdQueue, void *CB_Func, TI_HANDLE CB_handle)
259 {
260 	CmdQueue_T* pCmdQueue = (CmdQueue_T*)	hCmdQueue;
261 
262 	if ((CB_Func == NULL) || (CB_handle == NULL))
263 	{
264 		WLAN_REPORT_ERROR(pCmdQueue->hReport, HAL_CTRL_MODULE_LOG, ("CmdQueue_RegisterCmdCompleteGenericCB: NULL parameter\n"));
265 		return NOK;
266 	}
267 
268 	pCmdQueue->CmdCompleteGenericCB_Func = (CmdQueue_GenericCB_t)CB_Func;
269 	pCmdQueue->CmdCompleteGenericCB_Arg = CB_handle;
270 
271 	return OK;
272 }
273 
274 /****************************************************************************
275  *                      CmdQueue_RegisterForErrorCB()
276  ****************************************************************************
277  * DESCRIPTION: Register for a call back to be called when an Error (Timeout)
278  *              Occur
279  *
280  * RETURNS:None
281  ****************************************************************************/
CmdQueue_RegisterForErrorCB(TI_HANDLE hCmdQueue,void * CB_Func,TI_HANDLE CB_handle)282 int 					CmdQueue_RegisterForErrorCB(TI_HANDLE hCmdQueue, void *CB_Func, TI_HANDLE CB_handle)
283 {
284 	CmdQueue_T* pCmdQueue = (CmdQueue_T*)	hCmdQueue;
285 
286 	if ((CB_Func == NULL) || (CB_handle == NULL))
287 	{
288 		WLAN_REPORT_ERROR(pCmdQueue->hReport, HAL_CTRL_MODULE_LOG, ("CmdQueue_RegisterForErrorCB: NULL parameters\n"));
289 		return NOK;
290 	}
291 
292     	pCmdQueue->FailureCbHandle = CB_handle;
293     	pCmdQueue->FailureCB = (CmdQueue_CB_t)CB_Func;
294 
295 	return OK;
296 }
297 
298 /****************************************************************************
299  *                      CmdQueue_CmdConfigure()
300  ****************************************************************************
301  * DESCRIPTION: Send configure command with its information element parameter
302  *
303  * INPUTS:
304  *
305  * OUTPUT:  None
306  *
307  * RETURNS: OK or NOK
308  ****************************************************************************/
CmdQueue_CmdConfigure(TI_HANDLE hCmdQueue,void * MboxBuf,UINT32 ParamsLen)309 int 					CmdQueue_CmdConfigure(TI_HANDLE hCmdQueue, void *MboxBuf,UINT32 ParamsLen)
310 {
311 	int status;
312 	CmdQueue_T* pCmdQueue = (CmdQueue_T*)	hCmdQueue;
313 
314 	CHECK_ERROR_FLAG(pCmdQueue->ErrorFlag);
315 
316 	status = CmdQueue_Push(pCmdQueue, CMD_CONFIGURE,
317                        				(UINT8*)MboxBuf, ParamsLen,
318 					   		NULL, NULL, NULL);
319 
320 	CMDQUEUE_CONVERT_RC(status);
321 }
322 
323 /****************************************************************************
324  *                      CmdQueue_CmdConfigureWithCb()
325  ****************************************************************************
326  * DESCRIPTION: Send configure command with its information element parameter
327  *
328  * INPUTS:
329  *
330  * OUTPUT:  None
331  *
332  * RETURNS: OK or NOK
333  ****************************************************************************/
CmdQueue_CmdConfigureWithCb(TI_HANDLE hCmdQueue,void * MboxBuf,UINT32 ParamsLen,void * CB_Func,TI_HANDLE CB_handle)334 int					CmdQueue_CmdConfigureWithCb(TI_HANDLE hCmdQueue, void *MboxBuf, UINT32 ParamsLen,
335 										 					void *CB_Func, TI_HANDLE CB_handle)
336 {
337 
338 	int status;
339 	CmdQueue_T* pCmdQueue = (CmdQueue_T*)	hCmdQueue;
340 
341 	CHECK_ERROR_FLAG(pCmdQueue->ErrorFlag);
342 
343 	status = CmdQueue_Push(pCmdQueue, CMD_CONFIGURE,
344                        				(UINT8*)MboxBuf, ParamsLen,
345 					   		CB_Func, CB_handle, NULL);
346 
347 	CMDQUEUE_CONVERT_RC(status);
348 }
349 
350 
351 #if 0
352 
353 /*
354  * NOTE: The following function may NOT be used in fully asynchronous mode.
355  *       Its source code remained only for easier backword rollback
356  */
357 
358 /****************************************************************************
359  *                      CmdQueue_CmdInterrogate()
360  ****************************************************************************
361  * DESCRIPTION: Send interrogate command with its information element parameter
362  *
363  * INPUTS:
364  *
365  * OUTPUT:  None
366  *
367  * RETURNS: OK or NOK
368  ****************************************************************************/
369 int     				CmdQueue_CmdInterrogate(TI_HANDLE hCmdQueue, void *MboxBuf, UINT32 ParamsLen)
370 {
371 	CmdQueue_T* pCmdQueue = (CmdQueue_T*)	hCmdQueue;
372 	int status = OK;
373 
374 	CHECK_ERROR_FLAG(pCmdQueue->ErrorFlag);
375 
376 	status = CmdQueue_Push(pCmdQueue, CMD_INTERROGATE,
377                        				(UINT8*)MboxBuf, ParamsLen,
378 					   		NULL, NULL, (UINT8*)MboxBuf);
379 
380 	/*
381 	cause we called an interrogate cmd without a CB function then the Cmd needs to be finished
382 	in this context
383 	*/
384 	if (status == TNETWIF_PENDING)
385 	{
386 		WLAN_REPORT_ERROR(pCmdQueue->hReport, CMD_MBOX_MODULE_LOG,
387         		("CmdQueue_CmdInterrogate:Cmd INTERROGATE ,MboxBuf = 0x%x, Len = %d \n"
388 		 	, MboxBuf, ParamsLen));
389 	}
390 
391 	CMDQUEUE_CONVERT_RC(status);
392 }
393 #endif
394 
395 
396 /****************************************************************************
397  *                      CmdQueue_CmdInterrogateWithCb()
398  ****************************************************************************
399  * DESCRIPTION: Send interrogate command with its information element parameter
400  *
401  * INPUTS:
402  *
403  * OUTPUT:  None
404  *
405  * RETURNS: OK or NOK
406  ****************************************************************************/
CmdQueue_CmdInterrogateWithCb(TI_HANDLE hCmdQueue,void * MboxBuf,UINT32 ParamsLen,void * CB_Func,TI_HANDLE CB_handle,void * CB_Buf)407 int					CmdQueue_CmdInterrogateWithCb(TI_HANDLE hCmdQueue, void *MboxBuf, UINT32 ParamsLen,
408 															void *CB_Func, TI_HANDLE CB_handle, void *CB_Buf)
409 {
410 	CmdQueue_T* pCmdQueue = (CmdQueue_T*)	hCmdQueue;
411 	int status;
412 
413 	CHECK_ERROR_FLAG(pCmdQueue->ErrorFlag);
414 
415 	if((CB_Func == NULL) || (CB_handle == NULL) || (CB_Buf == NULL))
416 	{
417 		WLAN_REPORT_ERROR(pCmdQueue->hReport, HAL_CTRL_MODULE_LOG,
418 			("CmdQueue_CommandWithCb: NULL parameters\n"));
419 		return NOK;
420 	}
421 
422 	status = CmdQueue_Push(pCmdQueue, CMD_INTERROGATE,
423                        				(UINT8*)MboxBuf, ParamsLen,
424 					   		CB_Func, CB_handle, (UINT8*)CB_Buf);
425 
426 	CMDQUEUE_CONVERT_RC(status);
427 }
428 
429 /***************************************************************************
430  *                      CmdQueue_Command()
431  ****************************************************************************
432  * DESCRIPTION: Send command to the wlan hardware command mailbox
433  *
434  * INPUTS:
435  *
436  * OUTPUT:  None
437  *
438  * RETURNS: OK or NOK
439  ****************************************************************************/
CmdQueue_Command(TI_HANDLE hCmdQueue,Command_e MboxCmdType,char * MboxBuf,UINT32 ParamsLen)440 int	    				CmdQueue_Command(TI_HANDLE hCmdQueue, Command_e MboxCmdType, char *MboxBuf, UINT32 ParamsLen)
441 {
442 	CmdQueue_T* pCmdQueue = (CmdQueue_T*)	hCmdQueue;
443 	int status;
444 
445 	CHECK_ERROR_FLAG(pCmdQueue->ErrorFlag);
446 
447 	status = CmdQueue_Push(pCmdQueue, MboxCmdType,
448                        				(UINT8*)MboxBuf, ParamsLen,
449 					   		NULL, NULL, NULL);
450 
451 	CMDQUEUE_CONVERT_RC(status);
452 }
453 
454 /****************************************************************************
455  *                      CmdQueue_CommandWithCb()
456  ****************************************************************************
457  * DESCRIPTION: Send command with CB to the wlan hardware command mailbox
458  *
459  * INPUTS:
460  *
461  * OUTPUT:  None
462  *
463  * RETURNS: OK or NOK
464  ****************************************************************************/
CmdQueue_CommandWithCb(TI_HANDLE hCmdQueue,Command_e MboxCmdType,void * MboxBuf,UINT32 ParamsLen,void * CB_Func,TI_HANDLE CB_handle,void * CB_Buf)465 int	   			 	CmdQueue_CommandWithCb(TI_HANDLE hCmdQueue, Command_e MboxCmdType, void *MboxBuf, UINT32 ParamsLen,
466 															void *CB_Func, TI_HANDLE CB_handle, void* CB_Buf)
467 {
468 	CmdQueue_T* pCmdQueue = (CmdQueue_T*)hCmdQueue;
469 	int status;
470 
471 	CHECK_ERROR_FLAG(pCmdQueue->ErrorFlag);
472 
473 	if(((CB_Func != NULL) && (CB_handle == NULL)) || ((CB_Func == NULL) && (CB_handle != NULL)))
474 	{
475 		WLAN_REPORT_ERROR(pCmdQueue->hReport, HAL_CTRL_MODULE_LOG,
476 			("CmdQueue_CommandWithCb: NULL Object with none NULL CB\n"));
477 		return NOK;
478 	}
479 
480 	status = CmdQueue_Push(pCmdQueue, MboxCmdType,
481                        				(UINT8*)MboxBuf, ParamsLen,
482 					   		CB_Func, CB_handle, (UINT8*)CB_Buf);
483 
484 	CMDQUEUE_CONVERT_RC(status);
485 }
486 
487 
488 /****************************************************************************
489  *                      CmdQueue_Push()
490  ****************************************************************************
491  * DESCRIPTION: Push the command Node to the Queue with its information element parameter
492  *
493  * INPUTS:
494  *
495  * OUTPUT:  None
496  *
497  * RETURNS: NOK OK
498  ****************************************************************************/
CmdQueue_Push(CmdQueue_T * pCmdQueue,Command_e cmdType,UINT8 * pParamsBuf,UINT32 paramsLen,void * CB_Func,TI_HANDLE CB_Arg,UINT8 * pCB_Buf)499 int				CmdQueue_Push(CmdQueue_T  *pCmdQueue, Command_e  cmdType,
500                        							UINT8* pParamsBuf, UINT32 paramsLen,
501 					   					void *CB_Func, TI_HANDLE CB_Arg, UINT8* pCB_Buf)
502 {
503 
504 #ifdef TI_DBG
505 
506 	/*
507 	check if Queue is Full
508 	*/
509     	if(pCmdQueue->NumberOfCommandInQueue == CMDQUEUE_QUEUE_DEPTH)
510     	{
511 		WLAN_REPORT_ERROR(pCmdQueue->hReport, CMD_MBOX_MODULE_LOG,
512             		("CmdQueue_Push: ** ERROR ** The Queue is full\n"
513 			 "CmdType = %s %s , Len = %d   InfoElemId = 0x%x\n",
514 			 CmdQueue_GetCmdString(cmdType),
515 			 CmdQueue_GetIEString( cmdType,*(UINT16 *)pParamsBuf), paramsLen, *(UINT16 *)pParamsBuf));
516         	return  NOK;
517     	}
518 #endif /* TI_DBG*/
519 
520     /* initializes the last Node in the Queue with the arrgs */
521     	pCmdQueue->CmdQueue[pCmdQueue->Tail].cmdType   = cmdType;
522     	pCmdQueue->CmdQueue[pCmdQueue->Tail].paramsLen = paramsLen;
523     	pCmdQueue->CmdQueue[pCmdQueue->Tail].CB_Func = CB_Func;
524 	pCmdQueue->CmdQueue[pCmdQueue->Tail].CB_Arg = CB_Arg;
525 	if(cmdType == CMD_INTERROGATE)
526 	{
527 		os_memoryCopy(pCmdQueue->hOs, pCmdQueue->CmdQueue[pCmdQueue->Tail].paramsBuf, pParamsBuf, CMDQUEUE_INFO_ELEM_HEADER_LEN);
528 	}
529 	else
530 		os_memoryCopy(pCmdQueue->hOs, pCmdQueue->CmdQueue[pCmdQueue->Tail].paramsBuf, pParamsBuf, paramsLen);
531 	pCmdQueue->CmdQueue[pCmdQueue->Tail].interrogateParamsBuf = pCB_Buf;
532 
533 	/*advance the Queue tail*/
534 	pCmdQueue->Tail++;
535 	if(pCmdQueue->Tail == CMDQUEUE_QUEUE_DEPTH)
536 		pCmdQueue->Tail = 0;
537 
538 	/* update counters */
539     	pCmdQueue->NumberOfCommandInQueue++;
540 #ifdef TI_DBG
541     	if(pCmdQueue->MaxNumberOfCommandInQueue < pCmdQueue->NumberOfCommandInQueue)
542       		pCmdQueue->MaxNumberOfCommandInQueue = pCmdQueue->NumberOfCommandInQueue;
543 #endif /* TI_DBG*/
544 
545     WLAN_REPORT_INFORMATION(pCmdQueue->hReport, CMDQUEUE_MODULE_LOG,
546             ("CmdQueue_Push: CmdType = %s (%s(%d))\n"
547 			"Len = %d, NumOfCmd = %d \n",
548 			CmdQueue_GetCmdString(cmdType),
549 			(pParamsBuf) ?  CmdQueue_GetIEString(cmdType,*(UINT16 *)pParamsBuf):"",
550 			(pParamsBuf) ?  *(UINT16 *)pParamsBuf:0,
551 			paramsLen, pCmdQueue->NumberOfCommandInQueue));
552 
553 	/*if Queue has only one command trigger the send command form Queue */
554 	if (pCmdQueue->NumberOfCommandInQueue == 1)
555 	{
556 		return (CmdQueue_SM(pCmdQueue,CMDQUEUE_EVENT_RUN));
557 	}
558 	else
559 		return (OK);
560 }
561 
562 /****************************************************************************
563  *                     CmdQueue_SM()
564  ****************************************************************************
565  * DESCRIPTION: inplement the CmdQueue SM
566  *
567  * INPUTS:
568  *
569  * OUTPUT:  None
570  *
571  * RETURNS: OK or NOK
572  ****************************************************************************/
CmdQueue_SM(CmdQueue_T * pCmdQueue,CmdQueue_SMEvents_e event)573 int                 CmdQueue_SM(CmdQueue_T* pCmdQueue,CmdQueue_SMEvents_e event)
574 {
575     int rc = OK;
576     int breakWhile = FALSE;
577     CmdQueue_CmdNode_T* pHead;
578     TI_STATUS status;
579 
580     while(!breakWhile)
581     {
582             WLAN_REPORT_INFORMATION(pCmdQueue->hReport, CMDQUEUE_MODULE_LOG,
583             ("CmdQueue_SM: state = %s (%d) event = %s(%d), rc = %d\n",
584             StateString[pCmdQueue->State],
585             pCmdQueue->State,
586             EventString[event],
587             event,rc));
588 
589         switch(pCmdQueue->State)
590         {
591             /***************************************
592             CMDQUEUE_STATE_IDLE
593             ***************************************/
594             case CMDQUEUE_STATE_IDLE:
595                 switch(event)
596                 {
597                     case CMDQUEUE_EVENT_RUN:
598                         pCmdQueue->State = CMDQUEUE_STATE_SEND_CMD_v;
599                         break;
600                     default:
601                         WLAN_REPORT_ERROR(pCmdQueue->hReport, CMD_MBOX_MODULE_LOG,
602                             ("CmdQueue_SM: ** ERROR **  No such event (%d) for state CMDQUEUE_STATE_IDLE\n",event));
603                             return NOK;
604                 }
605                 break;
606 
607             /***************************************
608             CMDQUEUE_STATE_SEND_CMD_v
609             ***************************************/
610             case CMDQUEUE_STATE_SEND_CMD_v:
611                 pHead = &pCmdQueue->CmdQueue[pCmdQueue->Head];
612 
613                 WLAN_REPORT_INFORMATION(pCmdQueue->hReport, CMDQUEUE_MODULE_LOG,
614                     ("CmdQueue_SM: Send Cmd: CmdType = %s(%s)\n"
615             			"Len = %d, NumOfCmd = %d \n",
616             			CmdQueue_GetCmdString(pHead->cmdType),
617 		            (pHead->paramsBuf) ?  CmdQueue_GetIEString(pHead->cmdType,*(UINT16 *)pHead->paramsBuf):"",
618 		            pHead->paramsLen, pCmdQueue->NumberOfCommandInQueue));
619 
620 #ifdef TI_DBG
621                 pCmdQueue->CmdSendCounter++;
622 #endif /* TI_DBG    */
623                 pCmdQueue->State = CMDQUEUE_STATE_INTERROGATE_v;
624 
625                     /* send the command to TNET */
626                 if(pHead->cmdType == CMD_INTERROGATE)
627                     rc = CmdMBox_SendCmd(pCmdQueue->hCmdMBox,
628                             pHead->cmdType,
629                             pHead->paramsBuf,
630                             CMDQUEUE_INFO_ELEM_HEADER_LEN);
631                 else
632                     rc = CmdMBox_SendCmd(pCmdQueue->hCmdMBox,
633                             pHead->cmdType,
634                             pHead->paramsBuf,
635                             pHead->paramsLen);
636 
637                 if(rc == TNETWIF_PENDING)
638                 {
639                     if(pCmdQueue->SM_RC)
640                     {
641                         rc = pCmdQueue->SM_RC;
642                     }
643                     pCmdQueue->State = CMDQUEUE_STATE_WAIT_SEND_CMPLT;
644                     breakWhile = TRUE;
645                 }
646                 else
647                 {
648                     breakWhile = TRUE;
649                 }
650                 break;
651 
652             /***************************************
653             CMDQUEUE_STATE_WAIT_SEND_CMPLT
654             ***************************************/
655             case CMDQUEUE_STATE_WAIT_SEND_CMPLT:
656                 switch(event)
657                 {
658                     case CMDQUEUE_EVENT_SEND_CMPLT:
659 #ifdef TI_DBG
660                             pCmdQueue->CmdCompltCounter++;
661 #endif /* TI_DBG                        */
662                         pCmdQueue->State = CMDQUEUE_STATE_INTERROGATE_v;
663                         break;
664                     default:
665                         WLAN_REPORT_ERROR(pCmdQueue->hReport, CMD_MBOX_MODULE_LOG,
666                             ("CmdQueue_SM: ** ERROR **  No such event (%d) for state CMDQUEUE_STATE_WAIT_SEND_CMPLT\n",event));
667                             return NOK;
668                 }
669                 break;
670 
671             /***************************************
672             CMDQUEUE_STATE_INTERROGATE_v
673             ***************************************/
674             case CMDQUEUE_STATE_INTERROGATE_v:
675                 pHead = &pCmdQueue->CmdQueue[pCmdQueue->Head];
676                     rc = CmdMBox_GetResult(pCmdQueue->hCmdMBox,
677                             pHead->interrogateParamsBuf, pHead->paramsLen, (UINT32*)&status);
678                     if(rc == TNETWIF_PENDING)
679                     {
680                         pCmdQueue->State = CMDQUEUE_STATE_WAIT_RESULT;
681                         breakWhile = TRUE;
682                     }
683                     else
684                     {
685                         if(status != OK)
686                         {
687                             pCmdQueue->ErrorFlag = TRUE;
688                             return OK;
689                         }
690                         pCmdQueue->State = CMDQUEUE_STATE_FINISH_v;
691                     }
692                 break;
693 
694             /***************************************
695             CMDQUEUE_STATE_WAIT_RESULT
696             ***************************************/
697             case CMDQUEUE_STATE_WAIT_RESULT:
698                 switch(event)
699                 {
700                     case CMDQUEUE_EVENT_RESULT_RECEIVED:
701                         rc = TNETWIF_COMPLETE;
702                         pCmdQueue->State = CMDQUEUE_STATE_FINISH_v;
703                         break;
704                     default:
705                         WLAN_REPORT_ERROR(pCmdQueue->hReport, CMD_MBOX_MODULE_LOG,
706                             ("CmdQueue_SM: ** ERROR **  No such event (%d) for state CMDQUEUE_STATE_WAIT_RESULT\n",event));
707                             return NOK;
708                 }
709                 break;
710 
711             /***************************************
712             CMDQUEUE_STATE_FINISH_v
713             ***************************************/
714             case CMDQUEUE_STATE_FINISH_v:
715             {
716                 Command_e cmdType;
717                 UINT16        uParam;
718                 void *fCb, *hCb, *pCb;
719 
720                 pHead = &pCmdQueue->CmdQueue[pCmdQueue->Head];
721 
722                 /* Keep callback parameters in temporary variables */
723                 cmdType = pHead->cmdType;
724                 uParam  = *(UINT16 *)pHead->paramsBuf;
725                 fCb = pHead->CB_Func;
726                 hCb = pHead->CB_Arg;
727                 pCb = pHead->interrogateParamsBuf;
728 
729                 /*
730                  * Delete the command from the queue before calling a callback
731                  * because there may be nested calls inside a callback
732                  */
733                 pCmdQueue->Head ++;
734                 if (pCmdQueue->Head >= CMDQUEUE_QUEUE_DEPTH)
735                     pCmdQueue->Head = 0;
736                 pCmdQueue->NumberOfCommandInQueue --;
737 
738                 /* Check if queue is empty to send the next command */
739                 if (pCmdQueue->NumberOfCommandInQueue > 0)
740                 {
741                     pCmdQueue->SM_RC = rc;
742                     pCmdQueue->State = CMDQUEUE_STATE_SEND_CMD_v;
743                 }
744                 else
745                 {
746                     pCmdQueue->SM_RC = 0;
747                     pCmdQueue->State = CMDQUEUE_STATE_IDLE;
748                     breakWhile = TRUE;
749                 }
750 
751                 /*
752                  * Call the user callback after deleting the command from the queue
753                  * because there may be nested calls inside a callback
754                  */
755                 status = CmdMBox_GetStatus(pCmdQueue->hCmdMBox);
756                 if (fCb)
757                 {
758                     if(pCb)
759                     {
760                         ((CmdQueue_InterrogateCB_t)fCb) (hCb, status, pCb);
761                     }
762                     else
763                     {
764                         ((CmdQueue_CB_t)fCb) (hCb, status);
765                     }
766                 }
767                 else
768                 {
769                     /* Call the generic callback */
770                     if (pCmdQueue->CmdCompleteGenericCB_Func)
771                     {
772                         pCmdQueue->CmdCompleteGenericCB_Func (pCmdQueue->CmdCompleteGenericCB_Arg,
773                                                               cmdType,
774                                                               uParam,
775                                                               status);
776                     }
777                 }
778             }
779                 break;
780 
781             default:
782                 WLAN_REPORT_ERROR(pCmdQueue->hReport, CMD_MBOX_MODULE_LOG,
783                     ("CmdQueue_SM: ** ERROR **  No such state (%d)\n",pCmdQueue->State));
784                     return NOK;
785         }
786     }
787             WLAN_REPORT_INFORMATION(pCmdQueue->hReport, CMDQUEUE_MODULE_LOG,
788                              ("CmdQueue_SM: rc = %d\n",rc));
789 
790     return rc;
791 }
792 
793 /*******************************************************************************************************
794  *                     CmdQueue_SendCmplt()
795  ******************************************************************************************************
796  * DESCRIPTION: This function is the CB from the CmdMBox that will issue the "SendCmplt" event to
797  * 				the CmdQueue SM. Indicates that the Cmd was transferred to the FW.
798  *
799  * RETURNS: OK
800  *************************************************************************************************/
CmdQueue_SendCmplt(TI_HANDLE hCmdQueue)801 int 			CmdQueue_SendCmplt(TI_HANDLE hCmdQueue)
802 {
803 	CmdQueue_T* pCmdQueue = (CmdQueue_T*)hCmdQueue;
804 
805 	/* call the SM for further execution */
806 	return CmdQueue_SM(pCmdQueue,CMDQUEUE_EVENT_SEND_CMPLT);
807 }
808 
809 /*******************************************************************************************************
810  *                     CmdQueue_ResultReceived()
811  ******************************************************************************************************
812  * DESCRIPTION: This function is the CB from the CmdMBox that will issue the "ResultReceived"
813  * 				event to the CmdQueue SM. Indicates that the Cmd's results were read from
814  *				the FW.
815  *
816  * RETURNS: OK
817  *************************************************************************************************/
CmdQueue_ResultReceived(TI_HANDLE hCmdQueue,UINT32 status)818 int					CmdQueue_ResultReceived(TI_HANDLE hCmdQueue, UINT32 status)
819 {
820     	CmdQueue_T* pCmdQueue = (CmdQueue_T*)hCmdQueue;
821 
822 	/* call the SM for further execution */
823 	return CmdQueue_SM(pCmdQueue,CMDQUEUE_EVENT_RESULT_RECEIVED);
824 }
825 
826 /****************************************************************************
827  *                      CmdQueue_TimeOut()
828  ****************************************************************************
829  * DESCRIPTION: Called when a command timeout occur
830  *
831  * OUTPUT:  None
832  *
833  * RETURNS: OK or NOK
834  ******************************************************************************/
CmdQueue_Error(TI_HANDLE hCmdQueue)835 int 			CmdQueue_Error(TI_HANDLE hCmdQueue)
836 {
837 
838 	CmdQueue_T* pCmdQueue = (CmdQueue_T*)hCmdQueue;
839 
840 #ifdef TI_DBG
841 	CmdQueue_CmdNode_T* pHead = &pCmdQueue->CmdQueue[pCmdQueue->Head];
842 	UINT32 TimeStamp = os_timeStampMs(pCmdQueue->hOs);
843 
844    	WLAN_REPORT_ERROR(pCmdQueue->hReport, CMD_MBOX_MODULE_LOG,
845     		("CmdQueue_Error: **ERROR**  Command Occured \n"
846 	     	"                                        Cmd = %s %s , Len = %d \n "
847 	   		"                                        NumOfCmd = %d \n"
848 			"                                        MAC TimeStamp on timeout = %d\n ",
849     		CmdQueue_GetCmdString(pHead->cmdType),
850     		CmdQueue_GetIEString(pHead->cmdType, *(UINT16 *)pHead->paramsBuf),
851     		pHead->paramsLen,
852     		pCmdQueue->NumberOfCommandInQueue,
853     		TimeStamp));
854 #endif
855 
856 	/* Print The command that was sent before the timeout occur */
857 	CmdQueue_PrintHistory(pCmdQueue, CMDQUEUE_HISTORY_DEPTH);
858 
859 	/* preform Recovery */
860 #ifdef TI_DBG
861 	if(pCmdQueue->FailureCB)
862 #endif
863     	pCmdQueue->FailureCB(pCmdQueue->FailureCbHandle,NOK);
864 
865 	return OK;
866 
867 	}
868 
869 /****************************************************************************
870  *                      CmdQueue_Print()
871  ****************************************************************************
872  * DESCRIPTION:
873  *
874  * INPUTS:
875  *
876  * OUTPUT:  None
877  *
878  * RETURNS:
879  ****************************************************************************/
CmdQueue_Print(TI_HANDLE hCmdQueue)880 void					CmdQueue_Print(TI_HANDLE hCmdQueue)
881 {
882 	CmdQueue_T* pCmdQueue = (CmdQueue_T*)hCmdQueue;
883 
884     	WLAN_REPORT_REPLY(pCmdQueue->hReport, CMD_MBOX_MODULE_LOG,
885        	("------------- CmdQueue Queue -------------------\n"));
886 
887     	WLAN_REPORT_REPLY(pCmdQueue->hReport, CMD_MBOX_MODULE_LOG,
888         	("CmdQueue_Print:The Max NumOfCmd in Queue was = %d\n",
889         	pCmdQueue->MaxNumberOfCommandInQueue));
890     	WLAN_REPORT_REPLY(pCmdQueue->hReport, CMD_MBOX_MODULE_LOG,
891         	("CmdQueue_Print:The Current NumOfCmd in Queue = %d\n",
892         	pCmdQueue->NumberOfCommandInQueue));
893 #ifdef TI_DBG
894     	WLAN_REPORT_REPLY(pCmdQueue->hReport, CMD_MBOX_MODULE_LOG,
895         	("CmdQueue_Print:The Total number of Cmd send from Queue= %d\n",
896         	pCmdQueue->CmdSendCounter));
897     	WLAN_REPORT_REPLY(pCmdQueue->hReport, CMD_MBOX_MODULE_LOG,
898         	("CmdQueue_Print:The Total number of Cmd Completed interrupt= %d\n",
899         	pCmdQueue->CmdCompltCounter));
900 #endif
901 
902     	CmdQueue_PrintQueue(pCmdQueue);
903 }
904 
905 /****************************************************************************
906  *                      CmdQueue_PrintQueue()
907  ****************************************************************************
908  * DESCRIPTION:
909  *
910  * INPUTS:
911  *
912  * OUTPUT:  None
913  *
914  * RETURNS:
915  ****************************************************************************/
CmdQueue_PrintQueue(CmdQueue_T * pCmdQueue)916 void				CmdQueue_PrintQueue(CmdQueue_T  *pCmdQueue)
917 {
918 	int CurrentCmdindex;
919     	int first  = pCmdQueue->Head;
920 	CmdQueue_CmdNode_T* pHead;
921     	int NumberOfCommand = pCmdQueue->NumberOfCommandInQueue;
922 
923 	WLAN_OS_REPORT(("CmdQueue_PrintQueue \n"));
924 
925     	for(CurrentCmdindex = 0 ; CurrentCmdindex < NumberOfCommand ; CurrentCmdindex++)
926     	{
927 		pHead = &pCmdQueue->CmdQueue[first];
928 #ifdef TI_DBG
929         	WLAN_OS_REPORT(("Cmd index %d CmdType = %s %s, Len = %d, Place in Queue = %d \n",
930             		CurrentCmdindex,
931             		CmdQueue_GetCmdString(pHead->cmdType),
932             		CmdQueue_GetIEString(pHead->cmdType, (((pHead->cmdType == CMD_INTERROGATE)||(pHead->cmdType == CMD_CONFIGURE)) ? *(UINT16 *)pHead->paramsBuf : 0)),
933             		pHead->paramsLen,
934             		first));
935 #else
936 		WLAN_OS_REPORT(("Cmd index %d CmdType = %d %d, Len = %d, Place in Queue = %d \n",
937             		CurrentCmdindex,
938             		pHead->cmdType,
939             		(((pHead->cmdType == CMD_INTERROGATE)||(pHead->cmdType == CMD_CONFIGURE)||
940                       (pHead->cmdType == CMD_READ_MEMORY)||(pHead->cmdType == CMD_WRITE_MEMORY)) ? *(UINT16 *)pHead->paramsBuf : 0),
941             		pHead->paramsLen,
942             		first));
943 #endif
944 
945         	first++;
946 		if(first == CMDQUEUE_QUEUE_DEPTH)
947 			first = 0;
948     	}
949 }
950 
951 /****************************************************************************
952  *                      CmdQueue_PrintHistory()
953  ****************************************************************************
954  * DESCRIPTION: print the last command according to a value
955  *
956  * INPUTS:  NunOfCmd : the number of the last command to print
957  *
958  ****************************************************************************/
CmdQueue_PrintHistory(TI_HANDLE hCmdQueue,int NunOfCmd)959 void					CmdQueue_PrintHistory(TI_HANDLE hCmdQueue, int NunOfCmd)
960 {
961 	CmdQueue_T* pCmdQueue = (CmdQueue_T*)hCmdQueue;
962 	int CurrentCmdindex;
963     	int first  = pCmdQueue->Head;
964 	CmdQueue_CmdNode_T* pHead ;
965 
966     WLAN_OS_REPORT(("--------------- CmdQueue_PrintHistory of %d -------------------\n",NunOfCmd));
967 
968 	for(CurrentCmdindex = 0 ; CurrentCmdindex < NunOfCmd ; CurrentCmdindex++)
969 	{
970 		pHead  =  &pCmdQueue->CmdQueue[first];
971 
972 #ifdef TI_DBG
973 	    	WLAN_OS_REPORT(("Cmd index %d CmdType = %s %s, Len = %d, Place in Queue = %d \n",
974             		CurrentCmdindex,
975             		CmdQueue_GetCmdString(pHead->cmdType),
976             		CmdQueue_GetIEString(pHead->cmdType, (((pHead->cmdType == CMD_INTERROGATE)||(pHead->cmdType == CMD_CONFIGURE)) ? *(UINT16 *)pHead->paramsBuf : 0)),
977             		pHead->paramsLen,
978             		first));
979 #else
980 		WLAN_OS_REPORT(("Cmd index %d CmdType = %d %d, Len = %d, Place in Queue = %d \n",
981             		CurrentCmdindex,
982             		pHead->cmdType,
983             		(((pHead->cmdType == CMD_INTERROGATE)||(pHead->cmdType == CMD_CONFIGURE)||
984                       (pHead->cmdType == CMD_READ_MEMORY)||(pHead->cmdType == CMD_WRITE_MEMORY)) ? *(UINT16 *)pHead->paramsBuf : 0),
985             		pHead->paramsLen,
986             		first));
987 #endif
988 
989 		if(first == 0)
990 			first = CMDQUEUE_QUEUE_DEPTH-1;
991 		else
992 			first--;
993 	}
994 
995 	WLAN_OS_REPORT(("-----------------------------------------------------------------------\n"));
996 
997 }
998 
999 /****************************************************************************
1000  *                      CmdQueue_GetMaxNumberOfCommands()
1001  ****************************************************************************
1002  * DESCRIPTION: returns maximum number of commands (ever) in CmdQueue queue
1003  *
1004  * INPUTS:
1005  *
1006  * OUTPUT:  None
1007  *
1008  * RETURNS: maximum number of commands (ever) in mailbox queue
1009  ****************************************************************************/
CmdQueue_GetMaxNumberOfCommands(TI_HANDLE hCmdQueue)1010 int 					CmdQueue_GetMaxNumberOfCommands (TI_HANDLE hCmdQueue)
1011 {
1012 	CmdQueue_T* pCmdQueue = (CmdQueue_T*)hCmdQueue;
1013 
1014 	return (pCmdQueue->MaxNumberOfCommandInQueue);
1015 }
1016 
1017 #ifdef REPORT_LOG
1018 
1019 /****************************************************************************
1020  *                      CmdQueue_GetCmdString()
1021  ****************************************************************************
1022  * DESCRIPTION:
1023  *
1024  * INPUTS:
1025  *
1026  * OUTPUT:  None
1027  *
1028  * RETURNS:
1029  ****************************************************************************/
CmdQueue_GetCmdString(int MboxCmdType)1030 char* 			CmdQueue_GetCmdString(int MboxCmdType)
1031 {
1032 	switch (MboxCmdType)
1033 	{
1034 		case 0: return "CMD_RESET";
1035 		case 1: return "CMD_INTERROGATE";
1036 	 	case 2: return "CMD_CONFIGURE";
1037 	    	case 3: return "CMD_ENABLE_RX";
1038 		case 4: return "CMD_ENABLE_TX";
1039 		case 5: return "CMD_DISABLE_RX";
1040 	    	case 6: return "CMD_DISABLE_TX";
1041 		case 8: return "CMD_SCAN";
1042 		case 9: return "CMD_STOP_SCAN";
1043 	    	case 10: return "CMD_VBM";
1044 		case 11: return "CMD_START_JOIN";
1045 		case 12: return "CMD_SET_KEYS";
1046 		case 13: return "CMD_READ_MEMORY";
1047 	    	case 14: return "CMD_WRITE_MEMORY";
1048 		case 19: return "CMD_BEACON";
1049 		case 20: return "CMD_PROBE_RESP";
1050 		case 21: return "CMD_NULL_DATA";
1051 	    	case 22: return "CMD_PROBE_REQ";
1052 		case 23: return "CMD_TEST";
1053 		case 27: return "CMD_ENABLE_RX_PATH";
1054 		case 28: return "CMD_NOISE_HIST";
1055 	    	case 29: return "CMD_RX_RESET";
1056 		case 30: return "CMD_PS_POLL";
1057 		case 31: return "CMD_QOS_NULL_DATA";
1058 		case 32: return "CMD_LNA_CONTROL";
1059 		case 33: return "CMD_SET_BCN_MODE";
1060 		case 34: return "CMD_MEASUREMENT";
1061 		case 35: return "CMD_STOP_MEASUREMENT";
1062 		case 36: return "CMD_DISCONNECT";
1063 		case 37: return "CMD_SET_PS_MODE";
1064 		case 38: return "CMD_CHANNEL_SWITCH";
1065 		case 39: return "CMD_STOP_CHANNEL_SWICTH";
1066 		case 40: return "CMD_AP_DISCOVERY";
1067 		case 41: return "CMD_STOP_AP_DISCOVERY";
1068 		case 42: return "CMD_SPS_SCAN";
1069 		case 43: return "CMD_STOP_SPS_SCAN";
1070 		case 45: return "CMD_HEALTH_CHECK";
1071 		default: return " *** Error No Such CMD **** ";
1072 	}
1073 };
1074 
1075 /****************************************************************************
1076  *                      CmdQueue_GetErrorString()
1077  ****************************************************************************
1078  * DESCRIPTION:
1079  *
1080  * INPUTS:
1081  *
1082  * OUTPUT:  None
1083  *
1084  * RETURNS:
1085  ****************************************************************************/
CmdQueue_GetErrorString(CommandStatus_e MboxError)1086 char*            CmdQueue_GetErrorString(CommandStatus_e MboxError)
1087 {
1088     switch (MboxError)
1089     {
1090     case CMD_MAILBOX_IDLE:
1091         return "CMD_MAILBOX_IDLE";
1092         /* break; to avoid compilation warning */
1093 
1094     case CMD_STATUS_SUCCESS:
1095         return "CMD_STATUS_SUCCESS";
1096         /* break; to avoid compilation warning */
1097 
1098     case CMD_STATUS_UNKNOWN_CMD:
1099         return "CMD_STATUS_UNKNOWN_CMD";
1100         /* break; to avoid compilation warning */
1101 
1102     case CMD_STATUS_UNKNOWN_IE:
1103         return "CMD_STATUS_UNKNOWN_IE";
1104         /* break; to avoid compilation warning */
1105 
1106     case CMD_STATUS_RX_BUSY:
1107         return "CMD_STATUS_RX_BUSY";
1108         /* break; to avoid compilation warning */
1109 
1110     case CMD_STATUS_INVALID_PARAM:
1111         return "CMD_STATUS_INVALID_PARAM";
1112         /* break; to avoid compilation warning */
1113 
1114     case CMD_STATUS_TEMPLATE_TOO_LARGE:
1115         return "CMD_STATUS_TEMPLATE_TOO_LARGE";
1116         /* break; to avoid compilation warning */
1117 
1118     case CMD_STATUS_OUT_OF_MEMORY:
1119         return "CMD_STATUS_OUT_OF_MEMORY";
1120         /* break; to avoid compilation warning */
1121 
1122     case CMD_STATUS_STA_TABLE_FULL:
1123         return "CMD_STATUS_STA_TABLE_FULL";
1124         /* break; to avoid compilation warning */
1125 
1126     case CMD_STATUS_RADIO_ERROR:
1127         return "CMD_STATUS_RADIO_ERROR";
1128         /* break; to avoid compilation warning */
1129 
1130     case CMD_STATUS_WRONG_NESTING:
1131         return "CMD_STATUS_WRONG_NESTING";
1132         /* break; to avoid compilation warning */
1133 
1134     case CMD_STATUS_TIMEOUT:
1135         return "CMD_STATUS_TIMEOUT";
1136         /* break; to avoid compilation warning */
1137 
1138     case CMD_STATUS_FW_RESET:
1139         return "CMD_STATUS_FW_RESET";
1140         /* break; to avoid compilation warning */
1141 
1142     default:
1143         return "Unrecognized error code";
1144         /* break; to avoid compilation warning */
1145     }
1146 }
1147 
1148 
1149 /****************************************************************************
1150  *                      CmdQueue_GetIEString()
1151  ****************************************************************************
1152  * DESCRIPTION:
1153  *
1154  * INPUTS:
1155  *
1156  * OUTPUT:  None
1157  *
1158  * RETURNS:
1159  ****************************************************************************/
CmdQueue_GetIEString(int MboxCmdType,UINT16 Id)1160 char* 			CmdQueue_GetIEString(int MboxCmdType, UINT16 Id)
1161 {
1162 	if( MboxCmdType== CMD_INTERROGATE || MboxCmdType == CMD_CONFIGURE)
1163 	{
1164 		switch (Id)
1165 		{
1166 		case ACX_WAKE_UP_CONDITIONS: 		return " (ACX_WAKE_UP_CONDITIONS)";
1167 		case ACX_MEM_CFG: 					return " (ACX_MEM_CFG)";
1168 		case ACX_SLOT: 						return " (ACX_SLOT) ";
1169 		case ACX_QUEUE_HEAD: 				return " (ACX_QUEUE_HEAD)";
1170 		case ACX_AC_CFG: 					return " (ACX_AC_CFG) ";
1171 		case ACX_MEM_MAP: 					return " (ACX_MEM_MAP)";
1172 		case ACX_AID: 						return " (ACX_AID)";
1173 		case ACX_RADIO_PARAM: 				return " (ACX_RADIO_PARAM)";
1174 		case ACX_CFG: 						return " (ACX_CFG) ";
1175         case ACX_FW_REV: 					return " (ACX_FW_REV) ";
1176         case ACX_FCS_ERROR_CNT: 			return " (ACX_FCS_ERROR_CNT) ";
1177         case ACX_MEDIUM_USAGE: 				return " (ACX_MEDIUM_USAGE) ";
1178 		case ACX_RX_CFG: 					return " (ACX_RX_CFG) ";
1179 		case ACX_TX_QUEUE_CFG: 				return " (ACX_TX_QUEUE_CFG) ";
1180 		case ACX_BSS_IN_PS: 				return " (ACX_BSS_IN_PS) ";
1181 		case ACX_STATISTICS: 				return " (ACX_STATISTICS) ";
1182 		case ACX_FEATURE_CFG: 				return " (ACX_FEATURE_CFG) ";
1183 		case ACX_MISC_CFG: 					return " (ACX_MISC_CFG) ";
1184 		case ACX_TID_CFG: 					return " (ACX_TID_CFG) ";
1185 		case ACX_CAL_ASSESSMENT: 			return " (ACX_CAL_ASSESSMENT) ";
1186 		case ACX_BEACON_FILTER_OPT: 		return " (ACX_BEACON_FILTER_OPT) ";
1187 		case ACX_LOW_RSSI: 					return " (ACX_LOW_RSSI)";
1188         case ACX_NOISE_HIST: 				return " (ACX_NOISE_HIST)";
1189 		case ACX_HDK_VERSION: 				return " (ACX_HDK_VERSION)";
1190 		case ACX_PD_THRESHOLD: 				return " (ACX_PD_THRESHOLD) ";
1191 		case ACX_DATA_PATH_PARAMS: 			return " (ACX_DATA_PATH_PARAMS) ";
1192    	case ACX_CCA_THRESHOLD: 				return " (ACX_CCA_THRESHOLD)";
1193 		case ACX_EVENT_MBOX_MASK: 			return " (ACX_EVENT_MBOX_MASK) ";
1194 #ifdef FW_RUNNING_AS_AP
1195 		case ACX_DTIM_PERIOD: 				return " (ACX_DTIM_PERIOD) ";
1196 #else
1197 		case ACX_WR_TBTT_AND_DTIM: 			return " (ACX_WR_TBTT_AND_DTIM) ";
1198 #endif
1199 		case ACX_ACI_OPTION_CFG: 			return " (ACX_ACI_OPTION_CFG) ";
1200         case ACX_GPIO_CFG: 					return " (ACX_GPIO_CFG) ";
1201         case ACX_GPIO_SET: 					return " (ACX_GPIO_SET) ";
1202 		case ACX_PM_CFG: 					return " (ACX_PM_CFG) ";
1203 		case ACX_CONN_MONIT_PARAMS: 		return " (ACX_CONN_MONIT_PARAMS) ";
1204 		case ACX_AVERAGE_RSSI: 				return " (ACX_AVERAGE_RSSI) ";
1205 		case ACX_CONS_TX_FAILURE: 			return " (ACX_CONS_TX_FAILURE) ";
1206 		case ACX_BCN_DTIM_OPTIONS: 			return " (ACX_BCN_DTIM_OPTIONS) ";
1207 		case ACX_SG_ENABLE: 				return " (ACX_SG_ENABLE) ";
1208 		case ACX_SG_CFG: 					return " (ACX_SG_CFG) ";
1209 		case ACX_ANTENNA_DIVERSITY_CFG: 	return " (ACX_ANTENNA_DIVERSITY_CFG) ";
1210 		case ACX_LOW_SNR: 					return " (ACX_LOW_SNR) ";
1211 		case ACX_BEACON_FILTER_TABLE: 		return " (ACX_BEACON_FILTER_TABLE) ";
1212 		case ACX_ARP_IP_FILTER: 			return " (ACX_ARP_IP_FILTER) ";
1213 		case ACX_ROAMING_STATISTICS_TBL:	return " (ACX_ROAMING_STATISTICS_TBL) ";
1214 		case ACX_RATE_POLICY: 				return " (ACX_RATE_POLICY) ";
1215 		case ACX_CTS_PROTECTION: 			return " (ACX_CTS_PROTECTION) ";
1216 		case ACX_SLEEP_AUTH: 				return " (ACX_SLEEP_AUTH) ";
1217 		case ACX_PREAMBLE_TYPE: 			return " (ACX_PREAMBLE_TYPE) ";
1218 		case ACX_ERROR_CNT: 				return " (ACX_ERROR_CNT) ";
1219 		case ACX_FW_GEN_FRAME_RATES: 		return " (ACX_FW_GEN_FRAME_RATES) ";
1220 		case ACX_IBSS_FILTER: 				return " (ACX_IBSS_FILTER) ";
1221 		case ACX_SERVICE_PERIOD_TIMEOUT:	return " (ACX_SERVICE_PERIOD_TIMEOUT) ";
1222 		case ACX_TSF_INFO: 					return " (ACX_TSF_INFO) ";
1223 		case ACX_CONFIG_PS_WMM: 			return " (ACX_CONFIG_PS_WMM) ";
1224 		case ACX_ENABLE_RX_DATA_FILTER: 	return " (ACX_ENABLE_RX_DATA_FILTER) ";
1225 		case ACX_SET_RX_DATA_FILTER: 		return " (ACX_SET_RX_DATA_FILTER) ";
1226 		case ACX_GET_DATA_FILTER_STATISTICS:return " (ACX_GET_DATA_FILTER_STATISTICS) ";
1227 		case ACX_POWER_LEVEL_TABLE: 		return " (ACX_POWER_LEVEL_TABLE) ";
1228 		case ACX_BET_ENABLE: 				return " (ACX_BET_ENABLE) ";
1229 		case DOT11_STATION_ID: 				return " (DOT11_STATION_ID) ";
1230 		case DOT11_RX_MSDU_LIFE_TIME: 		return " (DOT11_RX_MSDU_LIFE_TIME) ";
1231 		case DOT11_CUR_TX_PWR: 				return " (DOT11_CUR_TX_PWR) ";
1232 		case DOT11_DEFAULT_KEY: 			return " (DOT11_DEFAULT_KEY) ";
1233 		case DOT11_RX_DOT11_MODE: 			return " (DOT11_RX_DOT11_MODE) ";
1234 		case DOT11_RTS_THRESHOLD: 			return " (DOT11_RTS_THRESHOLD) ";
1235 		case DOT11_GROUP_ADDRESS_TBL: 		return " (DOT11_GROUP_ADDRESS_TBL) ";
1236 
1237 		default:	return " *** Error No Such IE **** ";
1238 		}
1239 	}
1240 	return "";
1241 }
1242 #endif /* REPORT_LOG */
1243 
1244