⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmdsend.c

📁 Windows CE 6.0 BSP for VOIP sample phone. Intel PXA270 platform.
💻 C
📖 第 1 页 / 共 5 页
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES.
//
/** @file cmdsend.c
 *  @This module has implmentation of station command sending 
 *   function
 *
 *  Copyright (c) Marvell Semiconductor, Inc. 
 */
 
#include "precomp.h"

/******************************************************************************
 *
 *  Name: PrepareAndSendCommand()
 *
 *  Description: Prepare and send host command to station
 *
 *  Arguments:	PMRVDRV_ADAPTER Adapter
 *    
 *  Return Value:
 *      NDIS_STATUS_RESOURCES
 *      NDIS_STATUS_SUCCESS
 * 
 *  Notes: Driver will prepare and send the command to station
 *
 *****************************************************************************/
NDIS_STATUS
PrepareAndSendCommand(
	IN PMRVDRV_ADAPTER Adapter,
	IN USHORT Cmd,
	IN USHORT CmdOption,
	IN USHORT INTOption,
	IN  NDIS_OID PendingOID,
	IN  USHORT PendingInfo,
	IN  USHORT BatchQNum,
	IN  BOOLEAN IsLastBatchCmd,
	IN  PULONG BytesWritten,
	IN  PULONG BytesRead,
	IN  PULONG BytesNeeded,
	IN  PVOID InformationBuffer
)
{
	// ULONG  i,j;
	USHORT Size;
	PHostCmd_DS_GEN pCmdPtr;
	UCHAR ucTemp;
	CmdCtrlNode *pTempCmd;
	NDIS_STATUS Status;
	PNDIS_802_11_WEP pNewWEP;
	BOOLEAN  timerStatus;

	PHostCmd_DS_GET_HW_SPEC              pHWSpec;
	PHostCmd_DS_802_11_RESET             pReset;
	PHostCmd_DS_802_11_QUERY_STATUS      pStatus;
	PHostCmd_DS_802_11_QUERY_TRAFFIC     pTraffic;
	PHostCmd_DS_MAC_CONTROL              pControl;
	PHostCmd_DS_MAC_MULTICAST_ADR        pMCastAdr;
	PHostCmd_DS_802_11_GET_STAT          p11Stat;
	PHostCmd_DS_802_3_GET_STAT           p3Stat;
	PHostCmd_DS_802_11_DATA_RATE         pDataRate;
	PHostCmd_DS_802_11_PS_MODE           pPSMode;
	// PHostCmd_DS_802_11_SCAN           pScan;
	PHostCmd_DS_802_11_SET_WEP           pSetWEP;
	PHostCmd_DS_802_11_SNMP_MIB          pSNMPMIB;
	PHostCmd_DS_802_11_AUTHENTICATE	     pAuthenticate;
	PHostCmd_DS_802_11_ASSOCIATE_EXT     pAsso;
	PHostCmd_DS_802_11_DISASSOCIATE      pDisasso;
	PHostCmd_DS_802_11_RF_ANTENNA	     pAntenna;
	PHostCmd_DS_802_11_RF_TX_POWER       pRTP;
	PHostCmd_DS_802_11_DEAUTHENTICATE    pDeAuthenticate;
	PHostCmd_DS_802_11_AD_HOC_JOIN	     pAdHocJoin;
	PHostCmd_DS_802_11_AD_HOC_START	     pAdHocStart;
	PHostCmd_DS_802_11_RADIO_CONTROL     pRadioControl;
	PHostCmd_DS_802_11_RF_CHANNEL 	     pRFChannel;
	PHostCmd_DS_802_11_BAND_CONFIG	     pBandConfig;
	PHostCmd_DS_802_11_KEY_MATERIAL      pKeyMaterial;
	
	// Get next free command control node
	pTempCmd = GetFreeCmdCtrlNode(Adapter);
	
	if (!pTempCmd) 
	{
		ResetCmdBuffer(Adapter);
		DBGPRINT(DBG_ALLEN, ("return NDIS_STATUS_RESOURCES\n"));
		return NDIS_STATUS_RESOURCES;
	} 

	pTempCmd->ExpectedRetCode = GetExpectedRetCode(Cmd);
	pTempCmd->Next = NULL;

	// Set other command information
	SetCmdCtrlNode(	
			Adapter,
			pTempCmd, 
			PendingOID, 
			PendingInfo, 
			INTOption, 
			BatchQNum, 
			IsLastBatchCmd, 
			BytesWritten,
			BytesRead,
			BytesNeeded, 
			InformationBuffer
			);

	pCmdPtr = (PHostCmd_DS_GEN)pTempCmd->BufVirtualAddr;

	// Set sequnece number, command and INT option
	Adapter->SeqNum++;
	pCmdPtr->SeqNum = Adapter->SeqNum;
	pCmdPtr->Command = Cmd;
	pCmdPtr->Result = INTOption;

	// Check and prepare command
    switch( Cmd )
    {

#ifdef BG_SCAN
	case HostCmd_CMD_802_11_BG_SCAN_CONFIG:
       	{
			POID_MRVL_DS_BG_SCAN_CONFIG   pBgCfg;
			PHostCmd_DS_802_11_BG_SCAN_CONFIG   pHostCmdBgScanCfg;
            		
            		pBgCfg = (POID_MRVL_DS_BG_SCAN_CONFIG) Adapter->BgScanCfg;
			pHostCmdBgScanCfg = 	(PHostCmd_DS_802_11_BG_SCAN_CONFIG)(pTempCmd->BufVirtualAddr);

			NdisMoveMemory( (PUCHAR)(&(pHostCmdBgScanCfg->Action)), 
						       (PUCHAR)(&(pBgCfg->Action)), 
						       pBgCfg->CmdLen); 

			Size = pBgCfg->CmdLen + sizeof(USHORT)*4;       

			// Set command size
  			pCmdPtr->Size = Size;		
        	}
       	break;
	
    	case HostCmd_CMD_802_11_BG_SCAN_QUERY:

		TT_CMDPARSE_SEND_CMD_NO_ACTION( HostCmd_DS_802_11_BG_SCAN_QUERY, OID_MRVL_DS_BG_SCAN_QUERY, Flush );

		break;
#endif 

	
    case HostCmd_CMD_802_11_SUBSCRIBE_EVENT:
        {
            	PHostCmd_DS_802_11_SUBSCRIBE_EVENT    pCmdSubscribeEvent;

            	pCmdSubscribeEvent = (PHostCmd_DS_802_11_SUBSCRIBE_EVENT)pCmdPtr;

            	Size = sizeof(HostCmd_DS_802_11_SUBSCRIBE_EVENT);
            	pCmdSubscribeEvent->Size = sizeof(HostCmd_DS_802_11_SUBSCRIBE_EVENT);

            	pCmdSubscribeEvent->Action = CmdOption;
            	pCmdSubscribeEvent->Events = Adapter->EventRecord.EventMap;

            	pCmdSubscribeEvent->RssiLow.Header.Type = TLV_TYPE_RSSI_LOW;
            	pCmdSubscribeEvent->RssiLow.Header.Len  = TLV_PAYLOAD_SIZE;
            	pCmdSubscribeEvent->RssiLow.RSSIValue   = Adapter->EventRecord.RSSILowValue;
            	pCmdSubscribeEvent->RssiLow.RSSIFreq    = Adapter->EventRecord.RSSILowFreq;

            	pCmdSubscribeEvent->SnrLow.Header.Type = TLV_TYPE_SNR_LOW;
            	pCmdSubscribeEvent->SnrLow.Header.Len  = TLV_PAYLOAD_SIZE;
            	pCmdSubscribeEvent->SnrLow.SNRValue    = Adapter->EventRecord.SNRLowValue;
            	pCmdSubscribeEvent->SnrLow.SNRFreq     = Adapter->EventRecord.SNRLowFreq;

            	pCmdSubscribeEvent->FailCnt.Header.Type = TLV_TYPE_FAILCOUNT;
            	pCmdSubscribeEvent->FailCnt.Header.Len  = TLV_PAYLOAD_SIZE;
            	pCmdSubscribeEvent->FailCnt.FailValue   = Adapter->EventRecord.FailValue;
            	pCmdSubscribeEvent->FailCnt.FailFreq    = Adapter->EventRecord.FailFreq;

            	pCmdSubscribeEvent->BcnMiss.Header.Type  = TLV_TYPE_BCNMISS;
            	pCmdSubscribeEvent->BcnMiss.Header.Len   = TLV_PAYLOAD_SIZE;
            	pCmdSubscribeEvent->BcnMiss.BeaconMissed = Adapter->EventRecord.BeaconMissed;
            	pCmdSubscribeEvent->BcnMiss.Reserved     = Adapter->EventRecord.Reserved;

	       pCmdSubscribeEvent->RssiHigh.Header.Type = TLV_TYPE_RSSI_HIGH;
            	pCmdSubscribeEvent->RssiHigh.Header.Len  = TLV_PAYLOAD_SIZE;
            	pCmdSubscribeEvent->RssiHigh.RSSIValue   = Adapter->EventRecord.RSSIHighValue;
            	pCmdSubscribeEvent->RssiHigh.RSSIFreq    = Adapter->EventRecord.RSSIHighFreq;

            	pCmdSubscribeEvent->SnrHigh.Header.Type = TLV_TYPE_SNR_HIGH;
            	pCmdSubscribeEvent->SnrHigh.Header.Len  = TLV_PAYLOAD_SIZE;
            	pCmdSubscribeEvent->SnrHigh.SNRValue    = Adapter->EventRecord.SNRHighValue;
            	pCmdSubscribeEvent->SnrHigh.SNRFreq     = Adapter->EventRecord.SNRHighFreq;

		///HexDump(DBG_SUBSCRIBEEVENT,"HostCmd_CMD_802_11_SUBSCRIBE_EVENT: ",
                ///           (PUCHAR)pCmdSubscribeEvent, sizeof(HostCmd_DS_802_11_SUBSCRIBE_EVENT));
        }

		break;

#ifdef BCA
	case HostCmd_CMD_802_11_BCA_CONFIG_TIMESHARE:
		{
			PHostCmd_DS_802_11_BCA_TIMESHARE   pCmdBCATime;

			pCmdBCATime = (PHostCmd_DS_802_11_BCA_TIMESHARE)pCmdPtr;
			Size = sizeof(HostCmd_DS_802_11_BCA_TIMESHARE);

			pCmdBCATime->Action = CmdOption;

			if ( CmdOption == HostCmd_ACT_GEN_SET )
			{
				pCmdBCATime->TrafficType = (USHORT) Adapter->BTTrafficType;
				pCmdBCATime->TimeShareInterval = Adapter->BTTimeShareInterval;
				pCmdBCATime->BTTime = Adapter->BTTime;
			}
		}
		break;
#endif //BCA

	case HostCmd_CMD_802_11_LED_CONTROL:
		TT_CMDPARSE_SEND_CMD( HostCmd_DS_802_11_LED_CONTROL, OID_MRVL_DS_LED_CONTROL, NumLed );
		break;
		
#ifdef CAL_DATA
	case HostCmd_CMD_802_11_CAL_DATA_EXT:
		//TT_CMDPARSE_SEND_CMD_VAR_LEN( HostCmd_DS_802_11_CAL_DATA_EXT, OID_MRVL_DS_CAL_DATA_EXT, 
		//	Revision, CalDataLen, 
		//	sizeof(OID_MRVL_DS_CAL_DATA_EXT)-sizeof(NDIS_OID)-1024 );
		TT_CMDPARSE_SEND_CMD( HostCmd_DS_802_11_CAL_DATA_EXT, OID_MRVL_DS_CAL_DATA_EXT, Revision );
		break;
	case HostCmd_CMD_802_11_CAL_DATA:
		TT_CMDPARSE_SEND_CMD( HostCmd_DS_802_11_CAL_DATA, OID_MRVL_DS_CAL_DATA, Reserved1[0] );
		break;
#endif //CAL_DATA

	case HostCmd_CMD_802_11_PWR_CFG:
		TT_CMDPARSE_SEND_CMD( HostCmd_DS_802_11_PWR_CFG, OID_MRVL_DS_PWR_CFG, Enable );
		break;

	case HostCmd_CMD_802_11_TPC_CFG:
		TT_CMDPARSE_SEND_CMD( HostCmd_DS_802_11_TPC_CFG, OID_MRVL_DS_TPC_CFG, Enable );
/*		{
			PHostCmd_DS_802_11_TPC_CFG		pThisCmd;
			POID_MRVL_DS_TPC_CFG			pOid;

			pThisCmd = (PHostCmd_DS_802_11_TPC_CFG) pCmdPtr;
			Size = sizeof(HostCmd_DS_802_11_TPC_CFG);

			pThisCmd->Action = CmdOption;

			if ( CmdOption == HostCmd_ACT_GEN_SET )
			{
				pOid = (POID_MRVL_DS_TPC_CFG) InformationBuffer;

 				NdisMoveMemory( 
						(PUCHAR) &(pThisCmd->Enable),
						(PUCHAR) &(pOid->Enable),
						sizeof(OID_MRVL_DS_TPC_CFG) - sizeof(NDIS_OID) );
			}
		}
*/		break;
		
	case HostCmd_CMD_802_11_RATE_ADAPT_RATESET:
		TT_CMDPARSE_SEND_CMD( HostCmd_RATE_ADAPT_RATESET, OID_MRVL_DS_RATE_ADAPT_RATESET, EnableHwAuto );
/*		{
			PHostCmd_RATE_ADAPT_RATESET	pRate;
			POID_MRVL_DS_RATE_ADAPT_RATESET	pOid;

			pRate = (PHostCmd_RATE_ADAPT_RATESET) pCmdPtr;
			Size = sizeof(HostCmd_RATE_ADAPT_RATESET);

			pRate->Action = CmdOption;

			if ( CmdOption == HostCmd_ACT_GEN_SET )
			{
				pOid = (POID_MRVL_DS_RATE_ADAPT_RATESET) InformationBuffer;
				
				pRate->EnableHwAuto = pOid->EnableHwAuto;
				pRate->Bitmap = pOid->Bitmap; 
				NKDbgPrintfW( L"-v5- Ready to send RATE_ADAPTION command\n" );
			}
		}
*/		break;

	case HostCmd_CMD_BCA_CONFIG:

		 {
            		PHostCmd_DS_CMD_BCA_CONFIGURATION   pCmdBCAConfig;

            		pCmdBCAConfig = (PHostCmd_DS_CMD_BCA_CONFIGURATION)pCmdPtr;
            		Size = sizeof(HostCmd_DS_CMD_BCA_CONFIGURATION);
            
            		pCmdBCAConfig->Action = CmdOption;

            		if ( CmdOption == HostCmd_ACT_GEN_SET )
            		{
                		pCmdBCAConfig->Mode = (USHORT)Adapter->BTMode;
                		pCmdBCAConfig->AntennaConfig = (USHORT)Adapter->BTAntennaConfig;
                		pCmdBCAConfig->FreqConfig = (USHORT)Adapter->BTFrequencyConfig;
                		pCmdBCAConfig->TxPriorityLo = Adapter->BTWLANTxPriorityLo;
                		pCmdBCAConfig->TxPriorityHi = Adapter->BTWLANTxPriorityHi;
                		pCmdBCAConfig->RxPriorityLo = Adapter->BTWLANRxPriorityLo;
                		pCmdBCAConfig->RxPriorityHi = Adapter->BTWLANRxPriorityHi;
            		}
					
        		break;
		}
#ifdef	DEEP_SLEEP

	case HostCmd_CMD_802_11_DEEP_SLEEP:
		{
			Size = sizeof(HostCmd_DS_802_11_DEEP_SLEEP);
			break;
		}	
#endif 


#ifdef HOST_WAKEUP

	case HostCmd_CMD_802_11_HOST_SLEEP_CFG:
		{	
			USHORT type,len;
			
			PHostCmd_DS_HOST_WAKEUP 	pCmdHostWakeup;
            		POID_MRVL_DS_HOST_WAKEUP  pOIDHostWakeup; 
			PUCHAR pHostWakeup;
			
            		pOIDHostWakeup = (POID_MRVL_DS_HOST_WAKEUP)InformationBuffer;
			pCmdHostWakeup = (PHostCmd_DS_HOST_WAKEUP)pCmdPtr;
			
			pHostWakeup = (PUCHAR)InformationBuffer + 6;
                     type = *((USHORT *)pHostWakeup);
			len = *((USHORT *)(pHostWakeup+2));

  			//AllenDBGPRINT(1, ("type = %02x, len =%02x \n", type, len));

                     //AllenDBGPRINT(1, ("sizeof(OID_MRVL_DS_HOST_WAKEUP)  = %02x \n", sizeof(OID_MRVL_DS_HOST_WAKEUP)));

			//AllenDBGPRINT(1, ("sizeof(OID_MRVL_DS_HOST_WAKEUP_FILTER)  = %02x \n", sizeof(OID_MRVL_DS_HOST_WAKEUP_FILTER)));


                     if (type == 0x0115)
				len =(USHORT)(sizeof(OID_MRVL_DS_HOST_WAKEUP) + (len+4) - sizeof(OID_MRVL_DS_HOST_WAKEUP_FILTER));
                     else
				len =(USHORT)(sizeof(OID_MRVL_DS_HOST_WAKEUP) - sizeof(OID_MRVL_DS_HOST_WAKEUP_FILTER));

                     //AllenDBGPRINT(1, ("type = %02x, len =%02x \n", type, len));
					 
                      NdisMoveMemory((UCHAR *)(&(pCmdHostWakeup->Criteria)), 
					 	      (UCHAR *)(&(pOIDHostWakeup->ulCriteria)), 
					 	     len
					 	     );

                     Size = sizeof(HostCmd_DS_GEN) + len; 
			pCmdPtr->Size = Size;			  		
			
            		DBGPRINT(DBG_HOSTWAKEUP, ("HostCmd_CMD_802_11_HOST_SLEEP_CFG:Criteria=[0x%x],GPIO=[0x%x],Gap=[0x%x]\n",
                     pCmdHostWakeup->Criteria, pCmdHostWakeup->GPIO, pCmdHostWakeup->Gap));

			/*
			{     USHORT i;

				AllenDBGPRINT(1,("HostCmd_CMD_802_11_HOST_SLEEP_CFG InformationBuffer \n"));

				for (i=0; i< 50; i++)
				{
		       		AllenDBGPRINT(1, ("%02x  ", *((UCHAR *)InformationBuffer + i)));
			   
					if (((i %16) == 0) && i)
						AllenDBGPRINT(1, ("\n"));	
	       		}	
				AllenDBGPRINT(1, ("\n"));		
       		}	

       		{     USHORT i;

				AllenDBGPRINT(1,("HostCmd_CMD_802_11_HOST_SLEEP_CFG\n"));

				for (i=0; i< Size; i++)
				{
		       		AllenDBGPRINT(1, ("%02x  ", *((UCHAR *)(pCmdHostWakeup) + i)));
                     		//AllenDBGPRINT(1, ("%02x  ", *((UCHAR *)InformationBuffer + i)));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -