Home | History | Annotate | Download | only in hw_ctrl
      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 
     36 /****************************************************************************
     37  *
     38  *   MODULE:  whalHwMboxCmd.c
     39  *   PURPOSE: wlan hardware commands handler
     40  *
     41  ****************************************************************************/
     42 
     43 #include "whalCommon.h"
     44 #include "whalHwMboxCmd.h"
     45 #include "whalBus_Api.h"
     46 #include "CmdQueue_api.h"
     47 
     48 /* Local Macros */
     49 
     50 #define MAC_TO_VENDOR_PREAMBLE(mac) ((mac[0] << 16) | (mac[1] << 8) | mac[2])
     51 
     52 
     53 /****************************************************************************
     54  *                      whal_hwMboxCmd_Create()
     55  ****************************************************************************
     56  * DESCRIPTION:	Create the mailbox commands object
     57  *
     58  * INPUTS:
     59  *
     60  * OUTPUT:	None
     61  *
     62  * RETURNS:	The Created object
     63  ****************************************************************************/
     64 HwMboxCmd_T *whal_hwMboxCmd_Create(TI_HANDLE hOs, WhalParams_T *pWhalParams)
     65 {
     66 	HwMboxCmd_T *pObj;
     67 
     68 	pObj = os_memoryAlloc(hOs, sizeof(HwMboxCmd_T));
     69 	if (pObj == NULL)
     70 		return NULL;
     71 
     72 	os_memoryZero(hOs, (void *)pObj, sizeof(HwMboxCmd_T));
     73 
     74 	pObj->hOs = hOs;
     75 	pObj->pWhalParams = pWhalParams;
     76 
     77 	return(pObj);
     78 }
     79 
     80 /****************************************************************************
     81  *                      whal_hwMboxCmd_Destroy()
     82  ****************************************************************************
     83  * DESCRIPTION:	Destroy the object
     84  *
     85  * INPUTS:
     86  *		pHwMboxCmd		The object to free
     87  *
     88  * OUTPUT:	None
     89  *
     90  * RETURNS:	OK or NOK
     91  ****************************************************************************/
     92 int whal_hwMboxCmd_Destroy(HwMboxCmd_T *pHwMboxCmd)
     93 {
     94 	if (pHwMboxCmd)
     95 		os_memoryFree(pHwMboxCmd->hOs, pHwMboxCmd, sizeof(HwMboxCmd_T));
     96 	return OK;
     97 }
     98 
     99 /****************************************************************************
    100  *                      whal_hwMboxCmd_Config()
    101  ****************************************************************************
    102  * DESCRIPTION:	Configure the object
    103  *
    104  * INPUTS:
    105  *
    106  * OUTPUT:	None
    107  *
    108  * RETURNS:	OK or NOK
    109  ****************************************************************************/
    110 int whal_hwMboxCmd_Config(HwMboxCmd_T *pHwMboxCmd, TI_HANDLE hCmdMboxQueue, TI_HANDLE hReport)
    111 {
    112 	pHwMboxCmd->hReport = hReport;
    113 	pHwMboxCmd->hCmdMboxQueue = hCmdMboxQueue;
    114 	return OK;
    115 }
    116 
    117 /****************************************************************************
    118  *                      whal_hwMboxCmd_StartBss()
    119  ****************************************************************************
    120  * DESCRIPTION:	Construct the StartBss command fileds and send it to the mailbox
    121  *
    122  * INPUTS: None
    123  *
    124  * OUTPUT:	None
    125  *
    126  * RETURNS:	OK or NOK
    127  ****************************************************************************/
    128 int whal_hwMboxCmd_StartBss(HwMboxCmd_T *pHwMboxCmd, BSS_e BssType, void *JoinCompleteCB, TI_HANDLE CB_handle)
    129 {
    130 	StartJoinRequest_t AcxCmd_StartBss;
    131 	StartJoinRequest_t *pCmd = &AcxCmd_StartBss;
    132 	dot11_SSID_t *pWlanElm_Ssid = whal_ParamsGetElm_Ssid(pHwMboxCmd->pWhalParams);
    133 	BssInfoParams_T *pBssInfoParams = whal_ParamsGetBssInfoParams(pHwMboxCmd->pWhalParams);
    134 	UINT8 *BssId;
    135 	UINT8 *cmdBssId;
    136 	UINT16 HwBasicRatesBitmap;
    137 	UINT16 HwSupportedRatesBitmap;
    138 	int i;
    139 
    140 	os_memoryZero(pHwMboxCmd->hOs, (void *)pCmd, sizeof(StartJoinRequest_t));
    141 
    142 	/*
    143     * Set RxCfg and RxFilterCfg values
    144     */
    145     pCmd->rxFilter.ConfigOptions = ENDIAN_HANDLE_LONG( pHwMboxCmd->pWhalParams->WlanParams.RxConfigOption );
    146     pCmd->rxFilter.FilterOptions = ENDIAN_HANDLE_LONG( pHwMboxCmd->pWhalParams->WlanParams.RxFilterOption );
    147 
    148     pCmd->beaconInterval = ENDIAN_HANDLE_WORD(whal_ParamsGetBeaconInterval(pHwMboxCmd->pWhalParams));
    149 	pCmd->dtimInterval = whal_ParamsGetDtimCount(pHwMboxCmd->pWhalParams);
    150 	pCmd->channelNumber = whal_ParamsGetRadioChannel(pHwMboxCmd->pWhalParams);
    151 
    152 
    153 	pCmd->bssType = BssType;
    154 
    155 	/* Add radio band */
    156 	pCmd->bssType |= whal_ParamsGetRadioBand (pHwMboxCmd->pWhalParams) << 4;
    157     pCmd->ctrl = pBssInfoParams->Ctrl; /* Only bit 7 is currently in use in the Ctrl field, bit 7 indicates if to flash the Tx queues */
    158 
    159 
    160     /*
    161 	 * BasicRateSet
    162 	 * The wlan hardware uses pHwMboxCmd field to determine the rate at which to transmit
    163 	 * control frame responses (such as ACK or CTS frames)
    164 	 */
    165 	whalUtils_ConvertAppRatesBitmap(pBssInfoParams->BasicRateSet, 0, &HwBasicRatesBitmap);
    166 
    167 
    168     /*
    169 	 * SupportedRateSet
    170 	 * The wlan hardware uses pHwMboxCmd information to determine which rates are allowed
    171 	 * when rate fallback is enabled
    172 	 */
    173 	whalUtils_ConvertAppRatesBitmap(pBssInfoParams->SupportedRateSet, 0, &HwSupportedRatesBitmap);
    174 	pCmd->basicRateSet  = ENDIAN_HANDLE_WORD(HwBasicRatesBitmap);
    175 
    176 	/*
    177 	 * ACX100_Frm_Rate
    178 	 * pHwMboxCmd field indicates the rate at which the wlan hardware transmits
    179 	 * Beacon, Probe Response, RTS, and PS-Poll frames
    180 	 */
    181 	pCmd->txCtrlFrmRate = pBssInfoParams->txCtrlFrmRate;
    182 
    183 	WLAN_REPORT_INFORMATION(pHwMboxCmd->hReport, HAL_HW_CTRL_MODULE_LOG,
    184 		("txCtrlFrmRate = 0x%x\n", pCmd->txCtrlFrmRate));
    185 	/*
    186 	 * PreambleOpt
    187 	 * indicates the PLCP preamble type to use when transmitting
    188 	 * Beacon, Probe Response, RTS, and PS-Poll frames.
    189 	 */
    190 	pCmd->txCtrlFrmMod = pBssInfoParams->txCtrlFrmModulation;
    191 
    192 	/* BSS ID - reversed order (see wlan hardware spec) */
    193 	BssId = whal_ParamsGetBssId(pHwMboxCmd->pWhalParams);
    194     cmdBssId = (UINT8*)&pCmd->bssIdL;
    195 	for (i=0; i<MAC_ADDR_SIZE; i++)
    196 		cmdBssId[i] = BssId[MAC_ADDR_SIZE-1-i];
    197 
    198     /* SSID string */
    199     pCmd->ssidLength = pWlanElm_Ssid->hdr.eleLen;
    200     os_memoryCopy(pHwMboxCmd->hOs, (void *)(pCmd->ssidStr),(void *)pWlanElm_Ssid->serviceSetId, pWlanElm_Ssid->hdr.eleLen);
    201 
    202 	/* Set the Frame Rate and The Frame Mode */
    203 	pCmd->txMgmtFrmRate = pBssInfoParams->txMgmtFrmRate;
    204 	pCmd->txMgmtFrmMod  = pBssInfoParams->txMgmtFrmModulation;
    205 
    206     /* Send the command */
    207 	if(JoinCompleteCB == NULL)
    208 		return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CMD_START_JOIN, (char *)pCmd, sizeof(*pCmd)));
    209 	else
    210 		return (CmdQueue_CommandWithCb(pHwMboxCmd->hCmdMboxQueue, CMD_START_JOIN, (char *)pCmd, sizeof(*pCmd), (void *)JoinCompleteCB, CB_handle, NULL));
    211 
    212 }
    213 
    214 
    215 /****************************************************************************
    216  *                      whal_hwMboxCmd_LNAControl()
    217  ****************************************************************************
    218  * DESCRIPTION:	Construct the LNA control command fileds and send it to the mailbox
    219  *
    220  * INPUTS: None
    221  *
    222  * OUTPUT:	None
    223  *
    224  * RETURNS:	OK or NOK
    225  ****************************************************************************/
    226 int whal_hwMboxCmd_LNAControl(HwMboxCmd_T *pHwMboxCmd, UINT8 LNAControlField)
    227 {
    228 	LNAControl_t AcxCmd_LNAControl;
    229 	LNAControl_t *pCmd = &AcxCmd_LNAControl;
    230 
    231 	pCmd->LNAControlField = LNAControlField;
    232 
    233 	return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CMD_LNA_CONTROL , (char *)pCmd, sizeof(*pCmd)));
    234 }
    235 
    236 
    237 /****************************************************************************
    238  *                      whal_hwMboxCmd_Reset()
    239  ****************************************************************************
    240  * DESCRIPTION:	Reset the Rx wlan hardware
    241  *
    242  * INPUTS: None
    243  *
    244  * OUTPUT:	None
    245  *
    246  * RETURNS:	OK or NOK
    247  ****************************************************************************/
    248 int whal_hwMboxCmd_RxReset(HwMboxCmd_T *pHwMboxCmd)
    249 {
    250 	/*
    251 	 * no parameters
    252 	 */
    253 
    254 	/*
    255 	 * Send the command
    256 	 */
    257 	return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CMD_RX_RESET, NULL, 0));
    258 }
    259 
    260 /****************************************************************************
    261  *                      whal_hwMboxCmd_Reset()
    262  ****************************************************************************
    263  * DESCRIPTION:	Reset the wlan hardware
    264  *
    265  * INPUTS: None
    266  *
    267  * OUTPUT:	None
    268  *
    269  * RETURNS:	OK or NOK
    270  ****************************************************************************/
    271 int whal_hwMboxCmd_Reset(HwMboxCmd_T *pHwMboxCmd)
    272 {
    273 	/*
    274 	 * no parameters
    275 	 */
    276 
    277 	/*
    278 	 * Send the command
    279 	 */
    280 	return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CMD_RESET, NULL, 0));
    281 }
    282 
    283 /****************************************************************************
    284  *                      whal_hwMboxCmd_EnableRx()
    285  ****************************************************************************
    286  * DESCRIPTION:	Construct the EnableRx command fileds and send it to the mailbox
    287  *
    288  * INPUTS: None
    289  *
    290  * OUTPUT:	None
    291  *
    292  * RETURNS:	OK or NOK
    293  ****************************************************************************/
    294 int whal_hwMboxCmd_EnableRx(HwMboxCmd_T *pHwMboxCmd)
    295 {
    296 	UINT8 ChannelNumber;
    297 
    298 	ChannelNumber = whal_ParamsGetDefaultChannel(pHwMboxCmd->pWhalParams);
    299 
    300 	/*
    301 	 * Send the command
    302 	 */
    303 	return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CMD_ENABLE_RX, (char *)&ChannelNumber, sizeof(UINT8)));
    304 }
    305 
    306 /****************************************************************************
    307  *                      whal_hwMboxCmd_EnableTx()
    308  ****************************************************************************
    309  * DESCRIPTION:	Construct the EnableTx command fileds and send it to the mailbox
    310  *				Note: This Enable_TX command is used also for changing the serving
    311  *				channel.
    312  *
    313  * INPUTS: None
    314  *
    315  * OUTPUT:	None
    316  *
    317  * RETURNS:	OK or NOK
    318  ****************************************************************************/
    319 int whal_hwMboxCmd_EnableTx(HwMboxCmd_T *pHwMboxCmd ,UINT8	defaultChannel)
    320 {
    321 	UINT8 ChannelNumber;
    322 
    323 	ChannelNumber = defaultChannel;
    324 	/*
    325 	 * Send the command
    326 	 */
    327 	return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CMD_ENABLE_TX, (char *)&ChannelNumber, sizeof(UINT8)));
    328 }
    329 
    330 /****************************************************************************
    331  *                      whal_hwMboxCmd_DisableRx()
    332  ****************************************************************************
    333  * DESCRIPTION:	Construct the DisableRx command fileds and send it to the mailbox
    334  *
    335  * INPUTS: None
    336  *
    337  * OUTPUT:	None
    338  *
    339  * RETURNS:	OK or NOK
    340  ****************************************************************************/
    341 int whal_hwMboxCmd_DisableRx(HwMboxCmd_T *pHwMboxCmd)
    342 {
    343 	/*
    344 	 * no parameters
    345 	 */
    346 
    347 	/*
    348 	 * Send the command
    349 	 */
    350 	return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CMD_DISABLE_RX, NULL, 0));
    351 }
    352 
    353 /****************************************************************************
    354  *                      whal_hwMboxCmd_DisableTx()
    355  ****************************************************************************
    356  * DESCRIPTION:	Construct the DisableTx command fileds and send it to the mailbox
    357  *
    358  * INPUTS: None
    359  *
    360  * OUTPUT:	None
    361  *
    362  * RETURNS:	OK or NOK
    363  ****************************************************************************/
    364 int whal_hwMboxCmd_DisableTx(HwMboxCmd_T *pHwMboxCmd)
    365 {
    366 	/*
    367 	 * no parameters
    368 	 */
    369 
    370 	/*
    371 	 * Send the command
    372 	 */
    373 	return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CMD_DISABLE_TX, NULL, 0));
    374 }
    375 
    376 /****************************************************************************
    377  *                      whal_hwMboxCmd_ConfigureTemplateFrame()
    378  ****************************************************************************
    379  * DESCRIPTION:	Generic function which sets the Fw with a template frame according
    380  *              to the given template type.
    381  *
    382  * INPUTS: templateType - CMD_BEACON, CMD_PROBE_REQ, CMD_PROBE_RESP etc.
    383  *
    384  * OUTPUT:	None
    385  *
    386  * RETURNS:	OK or NOK
    387  ****************************************************************************/
    388 int whal_hwMboxCmd_ConfigureTemplateFrame(HwMboxCmd_T *pHwMboxCmd, UINT8 *pFrame, UINT16 FrameSize,
    389                                           Command_e templateType, void *CBFunc,TI_HANDLE CBObj)
    390 {
    391     PktTemplate_t AcxCmd_PktTemplate;
    392 	PktTemplate_t *pCmd = &AcxCmd_PktTemplate;
    393 
    394     /* if the frame size is too big - we truncate the frame template */
    395     if (FrameSize > MAX_TEMPLATES_SIZE)
    396     {
    397         WLAN_REPORT_ERROR(pHwMboxCmd->hReport, HAL_HW_CTRL_MODULE_LOG,
    398             ("%s: Frame size (=%d) is bigger than MAX_TEMPLATES_SIZE(=%d) !!!\n",
    399             __FUNCTION__,FrameSize,MAX_TEMPLATES_SIZE));
    400 
    401         FrameSize = MAX_TEMPLATES_SIZE;
    402     }
    403 
    404     /* if pFrame is NULL than it means that we just want to reserve place in Fw, and there is no need to copy */
    405     if (pFrame != NULL)
    406     {
    407         /* Set configuration fields */
    408 	    os_memoryCopy(pHwMboxCmd->hOs, (void *)&pCmd->templateStart, (void *)pFrame, FrameSize);
    409     }
    410 	pCmd->len = ENDIAN_HANDLE_WORD(FrameSize);
    411 
    412     if (NULL == CBFunc)
    413 	{
    414 		return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, templateType, (char *)pCmd, FrameSize + sizeof(pCmd->len)));
    415 	}
    416 	else
    417 	{
    418 		return (CmdQueue_CommandWithCb(pHwMboxCmd->hCmdMboxQueue, templateType, (char *)pCmd, FrameSize + sizeof(pCmd->len),
    419 			CBFunc,CBObj,NULL));
    420 	}
    421 }
    422 
    423 /****************************************************************************
    424  *                      whal_hwMboxCmd_TimTemplate()
    425  ****************************************************************************
    426  * DESCRIPTION:	Build the tim template fileds and send it to the mailbox
    427  *
    428  * INPUTS: None
    429  *
    430  * OUTPUT:	None
    431  *
    432  * RETURNS:	OK or NOK
    433  ****************************************************************************/
    434 int whal_hwMboxCmd_TimTemplate(HwMboxCmd_T *pHwMboxCmd, char BmapControl, char *PartialBmapVec, int PartialBmapLen)
    435 {
    436 	VBMUpdateRequest_t AcxCmd_ConfTim;
    437 	VBMUpdateRequest_t *pCmd = &AcxCmd_ConfTim;
    438 
    439 	/*
    440 	 * Set command fields
    441 	 */
    442 	os_memoryZero(pHwMboxCmd->hOs, (void *)pCmd, sizeof(*pCmd));
    443 
    444 	/*
    445 	 * Copy the fields and set sizes
    446 	 */
    447 	pCmd->tim.BitMap_ctrl = BmapControl;
    448 	/* dtimCount and dtimPeriod will be filled by the wlan hardware */
    449 	os_memoryCopy(pHwMboxCmd->hOs, (void *)pCmd->tim.PVB_field, (void *)PartialBmapVec, PartialBmapLen);
    450 	pCmd->tim.identity  = DOT11_TIM_ELE_ID;
    451 	pCmd->tim.length    = 3+PartialBmapLen;
    452 	pCmd->len = ENDIAN_HANDLE_WORD(5+PartialBmapLen);
    453 
    454 	/*
    455 	 * Send the command
    456 	 */
    457 	return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CMD_VBM, (char *)pCmd, sizeof(*pCmd)));
    458 
    459 }
    460 
    461 
    462 /****************************************************************************
    463  *                      whal_hwMboxCmd_SetKey()
    464  ****************************************************************************
    465  * DESCRIPTION:	Construct the SetKey command fileds and send it to the mailbox
    466  *
    467  * INPUTS:
    468  *		Action		- add/remove key
    469  *		MacAddr		- relevant only for mapping keys
    470  *		KeySize		- key size
    471  *		KeyType		- default/mapping/TKIP
    472  *		KeyId		- relevant only for default keys
    473  *		Key			- key data
    474  *
    475  * OUTPUT:	None
    476  *
    477  * RETURNS:	OK or NOK
    478  ****************************************************************************/
    479 int whal_hwMboxCmd_SetKey(HwMboxCmd_T *pHwMboxCmd, int Action, char *MacAddr, int KeySize,
    480 						  int KeyType, int KeyId, char *Key, UINT16 SecuritySeqNumLow, UINT32 SecuritySeqNumHigh,
    481 						  void *CB_Func, TI_HANDLE CB_handle)
    482 {
    483 	SetKey_t AcxCmd_SetKey;
    484 	SetKey_t *pCmd = &AcxCmd_SetKey;
    485 
    486 	/*
    487 	* Set command fields
    488 	*/
    489 	os_memoryZero(pHwMboxCmd->hOs, (void *)pCmd, sizeof(*pCmd));
    490 
    491 	/*
    492 	* Command fields
    493 	*/
    494 	os_memoryCopy(pHwMboxCmd->hOs, (void *)pCmd->addr, (void *)MacAddr, MAC_ADDR_SIZE);
    495 	if (KeySize > MAX_KEY_SIZE)
    496 	{
    497 		os_memoryCopy(pHwMboxCmd->hOs, (void *)pCmd->key, (void *)Key, MAX_KEY_SIZE);
    498 	} else {
    499 		os_memoryCopy(pHwMboxCmd->hOs, (void *)pCmd->key, (void *)Key, KeySize);
    500 	}
    501 	pCmd->action = (UINT8)Action;
    502 	pCmd->keySize = (UINT8)KeySize;
    503 	pCmd->type = (UINT8)KeyType;
    504 	pCmd->id = (UINT8)KeyId;
    505 	pCmd->ssidProfile = 0;
    506 
    507 	/*
    508 	* Preserve TKIP/AES security sequence number after recovery.
    509 	* Note that our STA Tx is currently using only one sequence-counter
    510 	* for all ACs (unlike the Rx which is separated per AC).
    511 	*/
    512 	pCmd->AcSeqNum16[0] = SecuritySeqNumLow;
    513 	pCmd->AcSeqNum16[1] = 0;
    514 	pCmd->AcSeqNum16[2] = 0;
    515 	pCmd->AcSeqNum16[3] = 0;
    516 
    517 	pCmd->AcSeqNum32[0] = SecuritySeqNumHigh;
    518 	pCmd->AcSeqNum32[1] = 0;
    519 	pCmd->AcSeqNum32[2] = 0;
    520 	pCmd->AcSeqNum32[3] = 0;
    521 
    522 
    523 	WLAN_REPORT_WARNING(pHwMboxCmd->hReport, HAL_HW_CTRL_MODULE_LOG,
    524 		("*********************** \n"));
    525 
    526 	WLAN_REPORT_WARNING(pHwMboxCmd->hReport, HAL_HW_CTRL_MODULE_LOG,
    527 		("whal_hwMboxCmd_SetKey \n"));
    528 
    529 	WLAN_REPORT_WARNING(pHwMboxCmd->hReport, HAL_HW_CTRL_MODULE_LOG,
    530 		("*********************** \n"));
    531 
    532     WLAN_REPORT_WARNING(pHwMboxCmd->hReport, HAL_HW_CTRL_MODULE_LOG,
    533 		("addr = %x:%x:%x:%x:%x:%x \n",
    534          pCmd->addr[0], pCmd->addr[1], pCmd->addr[2], pCmd->addr[3], pCmd->addr[4], pCmd->addr[5] ));
    535 
    536 	WLAN_REPORT_WARNING(pHwMboxCmd->hReport, HAL_HW_CTRL_MODULE_LOG,
    537 		(" key= %x\n, action= %d\n keySize= %d\n type= %d\n id= %d\n AcSeqNum16[0]= %d\n AcSeqNum32[0]= %d\n",
    538 		pCmd->key,pCmd->action,pCmd->keySize,pCmd->type, pCmd->id, pCmd->AcSeqNum16[0], pCmd->AcSeqNum32[0] ));
    539 
    540 	WLAN_REPORT_WARNING(pHwMboxCmd->hReport, HAL_HW_CTRL_MODULE_LOG,
    541 		("*********************** \n"));
    542 
    543 	/*
    544 	* Send the command
    545 	*/
    546 	if((CB_Func == NULL) || (CB_handle == NULL))
    547 	{
    548 		WLAN_REPORT_WARNING(pHwMboxCmd->hReport, HAL_HW_CTRL_MODULE_LOG,
    549 			("*** whal_hwMboxCmd_SetKey:Calling CmdQueue_Command *** \n"));
    550 
    551 		return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CMD_SET_KEYS, (char *)pCmd, sizeof(*pCmd)));
    552 	}
    553 	else
    554 	{
    555 		WLAN_REPORT_WARNING(pHwMboxCmd->hReport, HAL_HW_CTRL_MODULE_LOG,
    556 			("!!! whal_hwMboxCmd_SetKey:CmdQueue_CommandwithCB !!! \n"));
    557 
    558 		return (CmdQueue_CommandWithCb(pHwMboxCmd->hCmdMboxQueue, CMD_SET_KEYS, (char *)pCmd, sizeof(*pCmd), CB_Func, CB_handle, NULL));
    559 	}
    560 }
    561 
    562 
    563 /****************************************************************************
    564  *                      whal_hwMboxCmd_Test()
    565  ****************************************************************************
    566  * DESCRIPTION:	Test NO WAIT (use EnableRx command)
    567  *
    568  * INPUTS: None
    569  *
    570  * OUTPUT:	None
    571  *
    572  * RETURNS:	OK or NOK
    573  ****************************************************************************/
    574 int whal_hwMboxCmd_Test(HwMboxCmd_T *pHwMboxCmd)
    575 {
    576 	UINT8 ChannelNumber = whal_ParamsGetRadioChannel(pHwMboxCmd->pWhalParams);
    577 
    578 	/*
    579 	 * Send the command
    580 	 */
    581 	return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CMD_ENABLE_RX, (char *)&ChannelNumber, sizeof(UINT8)));
    582 }
    583 
    584 /****************************************************************************
    585  *                      whal_hwMboxCmd_StartScan ()
    586  ****************************************************************************
    587  * DESCRIPTION:	Send SCAN Command
    588  *
    589  * INPUTS: None
    590  *
    591  * OUTPUT:	None
    592  *
    593  * RETURNS:	OK or NOK
    594  ****************************************************************************/
    595 int whal_hwMboxCmd_StartScan (HwMboxCmd_T *pHwMboxCmd, ScanParameters_t* pScanParams ,void* ScanCommandResponseCB, TI_HANDLE CB_handle)
    596 {
    597 		return CmdQueue_CommandWithCb(pHwMboxCmd->hCmdMboxQueue,CMD_SCAN, (char *)pScanParams,  sizeof(ScanParameters_t),
    598                                  (void *)ScanCommandResponseCB, CB_handle, NULL /* void* CB_Buf */);
    599 }
    600 
    601 /****************************************************************************
    602  *                      whal_hwMboxCmd_StartSPSScan ()
    603  ****************************************************************************
    604  * DESCRIPTION:	Send SPS SCAN Command
    605  *
    606  * INPUTS: None
    607  *
    608  * OUTPUT:	None
    609  *
    610  * RETURNS:	OK or NOK
    611  ****************************************************************************/
    612 int whal_hwMboxCmd_StartSPSScan (HwMboxCmd_T *pHwMboxCmd, ScheduledScanParameters_t* pScanParams, void* ScanCommandResponseCB, TI_HANDLE CB_handle)
    613 {
    614 		return (CmdQueue_CommandWithCb(pHwMboxCmd->hCmdMboxQueue, CMD_SPS_SCAN, (char *)pScanParams, sizeof(ScheduledScanParameters_t),
    615 			(void *)ScanCommandResponseCB, CB_handle, NULL ));
    616 }
    617 
    618 /****************************************************************************
    619  *                      whal_hwMboxCmd_StopScan ()
    620  ****************************************************************************
    621  * DESCRIPTION:	Construct the STOP_SCAN command fields and send it to the
    622  *				mailbox
    623  *
    624  * INPUTS: None
    625  *
    626  * OUTPUT:	None
    627  *
    628  * RETURNS:	OK or NOK
    629  ****************************************************************************/
    630 int whal_hwMboxCmd_StopScan (HwMboxCmd_T *pHwMboxCmd, void *ScanCommandResponseCB, TI_HANDLE CB_handle)
    631 {
    632 	WLAN_REPORT_INFORMATION(pHwMboxCmd->hReport, HAL_HW_CTRL_MODULE_LOG,
    633 		("whal_hwMboxCmd_StopScan: -------------- \n"));
    634 
    635 	if (NULL != ScanCommandResponseCB)
    636 		return (CmdQueue_CommandWithCb(pHwMboxCmd->hCmdMboxQueue, CMD_STOP_SCAN, 0, 0, (void *)ScanCommandResponseCB,CB_handle,NULL));
    637 	else
    638 		return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CMD_STOP_SCAN, 0, 0));
    639 }
    640 
    641 /****************************************************************************
    642  *                      whal_hwMboxCmd_StopSPSScan ()
    643  ****************************************************************************
    644  * DESCRIPTION:	Construct the STOP_SPS_SCAN command fields and send it to the
    645  *				mailbox
    646  *
    647  * INPUTS: None
    648  *
    649  * OUTPUT:	None
    650  *
    651  * RETURNS:	OK or NOK
    652  ****************************************************************************/
    653 int whal_hwMboxCmd_StopSPSScan (HwMboxCmd_T *pHwMboxCmd, void* ScanCommandResponseCB, TI_HANDLE CB_handle)
    654 {
    655 	WLAN_REPORT_INFORMATION(pHwMboxCmd->hReport, HAL_HW_CTRL_MODULE_LOG,
    656 		("whal_hwMboxCmd_StopSPSScan: -------------- \n"));
    657 	if (NULL != ScanCommandResponseCB)
    658 		return (CmdQueue_CommandWithCb(pHwMboxCmd->hCmdMboxQueue, CMD_STOP_SPS_SCAN, 0, 0, (void *)ScanCommandResponseCB, CB_handle, NULL ));
    659 	else
    660 		return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CMD_STOP_SPS_SCAN, 0, 0));
    661 
    662 }
    663 
    664 /****************************************************************************
    665  *                      whal_hwMboxCmd_GenCmd ()
    666  ****************************************************************************
    667  * DESCRIPTION:	Send any command
    668  * INPUTS: None
    669  *
    670  * OUTPUT:	None
    671  *
    672  * RETURNS:	OK or NOK
    673  ****************************************************************************/
    674 int whal_hwMboxCmd_GenCmd(HwMboxCmd_T *pHwMboxCmd,short CmdId, char* pBuf, UINT32 Length)
    675 {
    676 	WLAN_REPORT_INFORMATION(pHwMboxCmd->hReport, HAL_HW_CTRL_MODULE_LOG,
    677 		("whal_hwMboxCmd_GenCmd: -------------- \n"));
    678 
    679 	return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CmdId, pBuf, Length));
    680 }
    681 
    682 /****************************************************************************
    683  *                      whal_hwMboxCmd_NoiseHistogramCmd ()
    684  ****************************************************************************
    685  * DESCRIPTION:	Send NOISE_HISTOGRAM Command
    686  *
    687  * INPUTS: None
    688  *
    689  * OUTPUT:	None
    690  *
    691  * RETURNS:	OK or NOK
    692  ****************************************************************************/
    693 int whal_hwMboxCmd_NoiseHistogramCmd (HwMboxCmd_T *pHwMboxCmd, whalCtrl_noiseHistogram_t* pNoiseHistParams)
    694 {
    695     NoiseHistRequest_t AcxCmd_NoiseHistogram;
    696 	NoiseHistRequest_t *pCmd = &AcxCmd_NoiseHistogram;
    697 
    698     os_memoryZero(pHwMboxCmd->hOs, (void *)pCmd, sizeof(*pCmd));
    699 
    700     pCmd->mode = (uint16)pNoiseHistParams->cmd;
    701     pCmd->sampleIntervalUSec = pNoiseHistParams->sampleInterval;
    702 
    703     os_memoryCopy(pHwMboxCmd->hOs, (void *)&(pCmd->thresholds[0]), (void *)&(pNoiseHistParams->ranges[0]), MEASUREMENT_NOISE_HISTOGRAM_NUM_OF_RANGES);
    704 
    705     /* Send the command */
    706     return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CMD_NOISE_HIST, (char *)pCmd, sizeof(*pCmd)));
    707 }
    708 
    709 /****************************************************************************
    710  *                      whal_hwMboxCmd_PowerMgmtConfiguration()
    711  ****************************************************************************
    712  * DESCRIPTION:	send Command for Power Management configuration
    713  *              to the mailbox
    714  *
    715  * INPUTS: None
    716  *
    717  * OUTPUT:	None
    718  *
    719  * RETURNS:	OK or NOK
    720  ****************************************************************************/
    721 int whal_hwMboxCmd_PowerMgmtConfiguration (HwMboxCmd_T *pHwMboxCmd,whalCtrl_powerSaveParams_t* powerSaveParams)
    722 /*whalCtrl_powerMgmtConfig_t* pPowerMgmtParams)*/
    723 {
    724 	PSModeParameters_t	 Cmd_PowerMgmtCnf;
    725 	PSModeParameters_t *	pCmd = &Cmd_PowerMgmtCnf;
    726 
    727 	os_memoryZero(pHwMboxCmd->hOs, (void *)pCmd, sizeof(*pCmd));
    728 
    729 	if(powerSaveParams->ps802_11Enable == TRUE)
    730 		pCmd->mode = 1;
    731 
    732 	else
    733 		pCmd->mode = 0;
    734 
    735 	pCmd->hangOverPeriod 			= powerSaveParams->hangOverPeriod;
    736     	pCmd->needToSendNullData 		= powerSaveParams->needToSendNullData;
    737 	pCmd->rateToTransmitNullData 		= ENDIAN_HANDLE_WORD(powerSaveParams->NullPktRateModulation);
    738 	pCmd->numberOfRetries 			= powerSaveParams->numNullPktRetries;
    739 
    740 
    741 	/*
    742 	 * Send the command
    743 	 */
    744 	return (CmdQueue_CommandWithCb(pHwMboxCmd->hCmdMboxQueue, CMD_SET_PS_MODE, (char *)pCmd, sizeof(*pCmd),(void *)powerSaveParams->powerSavecmdResponseCB,powerSaveParams->powerSaveCBObject,NULL));
    745 }
    746 
    747 
    748 /****************************************************************************
    749  *                      whal_hwMboxCmd_SwitchChannelCmd ()
    750  ****************************************************************************
    751  * DESCRIPTION:	Send CMD_SWITCH_CHANNEL Command
    752  *
    753  * INPUTS: None
    754  *
    755  * OUTPUT:	None
    756  *
    757  * RETURNS:	OK or NOK
    758  ****************************************************************************/
    759 int whal_hwMboxCmd_SwitchChannelCmd (HwMboxCmd_T *pHwMboxCmd, whalCtrl_switchChannelCmd_t *pSwitchChannelCmd)
    760 {
    761     ChannelSwitchParameters_t AcxCmd_SwitchChannel;
    762 	ChannelSwitchParameters_t *pCmd = &AcxCmd_SwitchChannel;
    763 
    764     os_memoryZero(pHwMboxCmd->hOs, (void *)pCmd, sizeof(*pCmd));
    765 
    766     pCmd->channel = pSwitchChannelCmd->channelNumber;
    767     pCmd->switchTime = pSwitchChannelCmd->switchTime;
    768 	pCmd->txSuspend = pSwitchChannelCmd->txFlag;
    769 	pCmd->flush = pSwitchChannelCmd->flush;
    770 
    771     /* Send the command */
    772     return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CMD_CHANNEL_SWITCH, (char *)pCmd, sizeof(*pCmd)));
    773 }
    774 
    775 
    776 /****************************************************************************
    777  *                      whal_hwMboxCmd_SwitchChannelCancelCmd ()
    778  ****************************************************************************
    779  * DESCRIPTION:	Send CMD_SWITCH_CHANNEL_CANCEL Command
    780  *
    781  * INPUTS: None
    782  *
    783  * OUTPUT:	None
    784  *
    785  * RETURNS:	OK or NOK
    786  ****************************************************************************/
    787 int whal_hwMboxCmd_SwitchChannelCancelCmd (HwMboxCmd_T *pHwMboxCmd)
    788 {
    789 
    790     /* Send the command */
    791     return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CMD_STOP_CHANNEL_SWICTH, 0, 0));
    792 }
    793 
    794 /****************************************************************************
    795  *                      whal_hwMboxCmd_FwDisconnect()
    796  ****************************************************************************
    797  * DESCRIPTION:	Construct the Disconnect command fileds and send it to the mailbox
    798  *
    799  * INPUTS: None
    800  *
    801  * OUTPUT:	None
    802  *
    803  * RETURNS:	OK or NOK
    804  ****************************************************************************/
    805 int whal_hwMboxCmd_FwDisconnect(HwMboxCmd_T *pHwMboxCmd, uint32 ConfigOptions, uint32 FilterOptions)
    806 {
    807     DisconnectParameters_t AcxCmd_Disconnect;
    808 
    809 	AcxCmd_Disconnect.rxFilter.ConfigOptions = ConfigOptions;
    810 	AcxCmd_Disconnect.rxFilter.FilterOptions = FilterOptions;
    811 	/*
    812 	 * Send the command
    813 	 */
    814 	return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CMD_DISCONNECT, (char *)&AcxCmd_Disconnect, sizeof(AcxCmd_Disconnect)));
    815 
    816 } /* whal_hwMboxCmd_FWDisconnect()*/
    817 
    818 
    819 
    820 
    821 
    822 /****************************************************************************
    823  *                      whal_hwMboxCmd_measurementParams()
    824  ****************************************************************************
    825  * DESCRIPTION:	send Command for measurement configuration
    826  *              to the mailbox
    827  *
    828  * INPUTS: None
    829  *
    830  * OUTPUT:	None
    831  *
    832  * RETURNS:	OK or NOK
    833  ****************************************************************************/
    834 int whal_hwMboxCmd_measurement (HwMboxCmd_T *pHwMboxCmd, whalCtrl_MeasurementParameters_t* pMeasurementParams,
    835 								void* MeasureCommandResponseCB, TI_HANDLE CB_handle)
    836 {
    837 	MeasurementParameters_t Cmd_MeasurementParam;
    838 	MeasurementParameters_t *pCmd = &Cmd_MeasurementParam;
    839 
    840 	os_memoryZero(pHwMboxCmd->hOs, (void *)pCmd, sizeof(*pCmd));
    841 
    842 	pCmd->band =					pMeasurementParams->band;
    843 	pCmd->channel =					pMeasurementParams->channel;
    844 	pCmd->duration =				ENDIAN_HANDLE_LONG(pMeasurementParams->duration);
    845 	pCmd->rxFilter.ConfigOptions =	ENDIAN_HANDLE_LONG(pMeasurementParams->ConfigOptions);
    846 	pCmd->rxFilter.FilterOptions =	ENDIAN_HANDLE_LONG(pMeasurementParams->FilterOptions);
    847 	/*
    848 	 * Send the command
    849 	 */
    850 	return (CmdQueue_CommandWithCb(pHwMboxCmd->hCmdMboxQueue, CMD_MEASUREMENT, (char *)pCmd, sizeof(*pCmd),
    851 										(void *)MeasureCommandResponseCB, CB_handle, NULL));
    852 }
    853 
    854 /****************************************************************************
    855  *                      whal_hwMboxCmd_measurementStop()
    856  ****************************************************************************
    857  * DESCRIPTION:	send Command for stoping measurement
    858  *
    859  * INPUTS: None
    860  *
    861  * OUTPUT:	None
    862  *
    863  * RETURNS:	OK or NOK
    864  ****************************************************************************/
    865 int whal_hwMboxCmd_measurementStop (HwMboxCmd_T *pHwMboxCmd, void* MeasureCommandResponseCB, TI_HANDLE CB_handle)
    866 {
    867 	/*
    868 	 * Send the command
    869 	 */
    870     return (CmdQueue_CommandWithCb(pHwMboxCmd->hCmdMboxQueue, CMD_STOP_MEASUREMENT, 0, 0,
    871 										(void *)MeasureCommandResponseCB, CB_handle, NULL));
    872 }
    873 /****************************************************************************
    874  *                      whal_hwMboxCmd_ApDiscovery()
    875  ****************************************************************************
    876  * DESCRIPTION:	send Command for AP Discovery
    877  *              to the mailbox
    878  *
    879  * INPUTS: None
    880  *
    881  * OUTPUT:	None
    882  *
    883  * RETURNS:	OK or NOK
    884  ****************************************************************************/
    885 int whal_hwMboxCmd_ApDiscovery (HwMboxCmd_T *pHwMboxCmd, whalCtrl_ApDiscoveryParameters_t* pApDiscoveryParams)
    886 {
    887 	ApDiscoveryParameters_t Cmd_ApDiscovery;
    888 	ApDiscoveryParameters_t *pCmd = &Cmd_ApDiscovery;
    889 
    890 	os_memoryZero(pHwMboxCmd->hOs, (void *)pCmd, sizeof(*pCmd));
    891 
    892 	pCmd->txPowerAttenuation = pApDiscoveryParams->txPowerDbm;
    893 	pCmd->numOfProbRqst = pApDiscoveryParams->numOfProbRqst;
    894 	pCmd->scanDuration 	=  ENDIAN_HANDLE_LONG(pApDiscoveryParams->scanDuration);
    895 	pCmd->scanOptions 	=  ENDIAN_HANDLE_WORD(pApDiscoveryParams->scanOptions);
    896 	pCmd->txdRateSet	=  ENDIAN_HANDLE_WORD(pApDiscoveryParams->txdRateSet);
    897 	pCmd->rxFilter.ConfigOptions =	ENDIAN_HANDLE_LONG(pApDiscoveryParams->ConfigOptions);
    898 	pCmd->rxFilter.FilterOptions =	ENDIAN_HANDLE_LONG(pApDiscoveryParams->FilterOptions);
    899 	/*
    900 	 * Send the command
    901 	 */
    902 	return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CMD_AP_DISCOVERY, (char *)pCmd, sizeof(*pCmd)));
    903 }
    904 /****************************************************************************
    905  *                      whal_hwMboxCmd_ApDiscoveryStop()
    906  ****************************************************************************
    907  * DESCRIPTION:	send Command for stoping AP Discovery
    908  *
    909  * INPUTS: None
    910  *
    911  * OUTPUT:	None
    912  *
    913  * RETURNS:	OK or NOK
    914  ****************************************************************************/
    915 int whal_hwMboxCmd_ApDiscoveryStop (HwMboxCmd_T *pHwMboxCmd)
    916 {
    917 	/*
    918 	 * Send the command
    919 	 */
    920     return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CMD_STOP_AP_DISCOVERY, 0, 0));
    921 
    922 }
    923 
    924 
    925 /****************************************************************************
    926  *                      whal_hwMboxCmd_HealthCheck()
    927  ****************************************************************************
    928  * DESCRIPTION:
    929  *
    930  * INPUTS:
    931  *
    932  * OUTPUT:
    933  *
    934  * RETURNS:
    935  ****************************************************************************/
    936 int whal_hwMboxCmd_HealthCheck(HwMboxCmd_T *pHwMboxCmd)
    937 {
    938 	/*
    939 	 * no parameters
    940 	 */
    941 
    942 	/*
    943 	 * Send the command
    944 	 */
    945 	return (CmdQueue_Command(pHwMboxCmd->hCmdMboxQueue, CMD_HEALTH_CHECK, NULL, 0));
    946 }
    947 
    948