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

📄 cmdsend.c

📁 marvell wifi driver CF-8385PN-NDIS-ARM4-WINCE50-5.24.17.p5-27.p11.src.zip
💻 C
📖 第 1 页 / 共 5 页
字号:
 /******************* ?Marvell Semiconductor, Inc., 2001-2004 *****************
 *
 *  Purpose:    This module has implmentation of station command sending 
 *              function
 *
 *	$Author: schiu $
 *
 *	$Date: 2005/01/19 $
 *
 *	$Revision: #17 $
 *
 *****************************************************************************/

#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);

            // Fill the command node with data in private structure 
            pCmdSubscribeEvent->Action = CmdOption;
            pCmdSubscribeEvent->Events = Adapter->EventRecord.EventMap;

            pCmdSubscribeEvent->Rssi.Header.Type = TLV_TYPE_RSSI;
            pCmdSubscribeEvent->Rssi.Header.Len  = TLV_PAYLOAD_SIZE;
            pCmdSubscribeEvent->Rssi.RSSIValue   = Adapter->EventRecord.RSSIValue;
            pCmdSubscribeEvent->Rssi.RSSIFreq    = Adapter->EventRecord.RSSIFreq;

            pCmdSubscribeEvent->Snr.Header.Type = TLV_TYPE_SNR;
            pCmdSubscribeEvent->Snr.Header.Len  = TLV_PAYLOAD_SIZE;
            pCmdSubscribeEvent->Snr.SNRValue    = Adapter->EventRecord.SNRValue;
            pCmdSubscribeEvent->Snr.SNRFreq     = Adapter->EventRecord.SNRFreq;

            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;

            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:
		{	
			PHostCmd_DS_HOST_WAKEUP 	pCmdHostWakeup;
            		POID_MRVL_DS_HOST_WAKEUP  pOIDHostWakeup; 

            		pOIDHostWakeup = (POID_MRVL_DS_HOST_WAKEUP)InformationBuffer;
			pCmdHostWakeup = (PHostCmd_DS_HOST_WAKEUP)pCmdPtr;

                      NdisMoveMemory((UCHAR *)(&(pCmdHostWakeup->Criteria)), 
					 	     (UCHAR *)(&(pOIDHostWakeup->ulCriteria)), 
					 	     pOIDHostWakeup->CmdLen
					 	     );

                     Size = sizeof(HostCmd_DS_GEN) + pOIDHostWakeup->CmdLen; 
			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));
        	}
			break;
	
	case HostCmd_CMD_802_11_HOST_SLEEP_AWAKE_CONFIRM:
             	{
        		DBGPRINT(DBG_HOSTWAKEUP, ("HostCmd_CMD_802_11_HOST_SLEEP_AWAKE_CONFIRM\n"));
			Size = sizeof( HostCmd_DS_WAKEUP_CONFIRM);
		}	
			break;
#endif


#ifdef MRVL_SLEEPPARAMS
	case HostCmd_CMD_802_11_SLEEP_PARAMS:
		{
            		PHostCmd_DS_802_11_SLEEP_PARAMS    pCmdSleepParams;
            		POID_MRVL_DS_SLEEP_PARAMS          pOIDSleep_Params; 

            		pCmdSleepParams= (PHostCmd_DS_802_11_SLEEP_PARAMS)pCmdPtr; 
			Size = sizeof(HostCmd_DS_802_11_SLEEP_PARAMS);
		    	if (CmdOption ==HostCmd_ACT_SET)
			{	 
				pOIDSleep_Params = (POID_MRVL_DS_SLEEP_PARAMS)InformationBuffer;
			  	pCmdSleepParams->Action=HostCmd_ACT_SET;
              		pCmdSleepParams->Error=pOIDSleep_Params->Error;
              		pCmdSleepParams->Offset=pOIDSleep_Params->Offset;
              		pCmdSleepParams->StableTime=pOIDSleep_Params->StableTime;
			  	pCmdSleepParams->CalControl=pOIDSleep_Params->CalControl;
			  	pCmdSleepParams->ExternalSleepClk=pOIDSleep_Params->ExternalSleepClk;
			  	pCmdSleepParams->Reserved=pOIDSleep_Params->Reserved;
               
			  	DBGPRINT(DBG_OID, ("Set HostCmd_CMD_802_11_SLEEP_PARAMS:Size=%d\n, pCmdSleepParams->Error=%d\n,pCmdSleepParams->Offset=%d\n,pCmdHostWakeup->Gap =%d\n,pCmdSleepParams->CalControl=%d\n,pCmdSleepParams->ExternalSleepClk=%d\n,pCmdSleepParams->Reserved=%d\n",Size, pCmdSleepParams->Error ,pCmdSleepParams->Offset,pCmdSleepParams->StableTime,pCmdSleepParams->CalControl,pCmdSleepParams->ExternalSleepClk,pCmdSleepParams->Reserved));    			    		
		    	}
                    	else
                    	{
                     	if(CmdOption ==HostCmd_ACT_GET)
		    		{
		    	  		pCmdSleepParams->Action=HostCmd_ACT_GET;
		    		}
		    	}
		}
        	break;
#endif	

	case HostCmd_CMD_802_11_MULTIPLE_DTIM:

		{
            		POID_MRVL_DS_MULTIPLE_DTIM              pOIDMultipleDtim;
            		PHostCmd_DS_CMD_802_11_MULTIPLE_DTIM    pCmdMultipleDtim;

            		pCmdMultipleDtim = (PHostCmd_DS_CMD_802_11_MULTIPLE_DTIM)pCmdPtr;
            		Size = sizeof(HostCmd_DS_CMD_802_11_MULTIPLE_DTIM);

          
#ifdef MRVL_USE_MULTIPLE_DTIM

			if (CmdOption ==HostCmd_ACT_SET)
	    		{
	        		pOIDMultipleDtim = (POID_MRVL_DS_MULTIPLE_DTIM)InformationBuffer;

				if (Adapter->DTIMFlag==TRUE)
            			{   	//execute initproc.c: MrvDrvInitialize
                		     	//set DTIMNum initial value
                			Adapter->DTIMFlag=FALSE;		  
                			pCmdMultipleDtim->DtimNum =(USHORT)Adapter->DTIMNum;			     
            			} 
				else 
            			{
                			//execute OID_MRVL_MULTIPLE_DTIM 
                			pCmdMultipleDtim->DtimNum =(USHORT)pOIDMultipleDtim->DtimNum;	
		        		Adapter->DTIMNum=pCmdMultipleDtim->DtimNum;

⌨️ 快捷键说明

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