📄 cmdsend.c
字号:
//
// 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 + -