📄 cmdsend.c
字号:
/******************* ?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"
#ifdef WMM
static UCHAR WMM_IE[WMM_IE_LENGTH] = {0xDD,0x07,0x00,0x50,0xf2,0x02,0x00,0x01,0x00};
#endif
#ifdef WPA2
int SetupKeyMaterial(
PMRVDRV_ADAPTER Adapter,
PHostCmd_DS_802_11_KEY_MATERIAL pKeyMaterial,
USHORT option,
USHORT enable,
void *InformationBuffer);
#endif ///WPA2
/******************************************************************************
*
* 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 = 0;
PHostCmd_DS_GEN pCmdPtr;
UCHAR ucTemp;
CmdCtrlNode *pTempCmd;
NDIS_STATUS Status;
PNDIS_802_11_WEP pNewWEP;
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_11D_DOMAIN_INFO pDomainInfo;
PHostCmd_DS_802_11_KEY_MATERIAL pKeyMaterial;
#ifdef WMM
PHostCmd_DS_802_11_WMM_ACK_POLICY pWmmAckPolicy;
PHostCmd_DS_802_11_WMM_GET_STATUS pWmmGetStatus;
POID_MRVL_DS_WMM_ACK_POLICY pAckPolicy;
///POID_MRVL_DS_WMM_AC_STATUS pAcStatus;
#endif
#ifdef NEW_RSSI
PHostCmd_DS_802_11_RSSI prssi;
#endif
#ifdef AvoidOidSetScan
BOOLEAN timerStatus;
#endif
#ifdef CCX_v4
/* PHostCmd_DS_802_11_GET_TSF pGetTSF;
PHostCmd_DS_802_11_WMM_ADDTS pAddTS;
PHostCmd_DS_802_11_WMM_DELTS pDelTS;
PHostCmd_DS_802_11_WMM_QUEUE_CONFIG pQueueCfg;
PHostCmd_DS_802_11_WMM_QUEUE_STATS pQueueStats;
*/
#endif ///CCX_v4
// Get next free command control node
pTempCmd = GetFreeCmdCtrlNode(Adapter);
//AllenDBGPRINT(DBG_ALLEN, ("PrepareAndSendCommand _0 \n"));
if( !pTempCmd)
{
//AllenDBGPRINT(DBG_ALLEN, ("PrepareAndSendCommand _1 \n"));
ResetCmdBuffer(Adapter);
return NDIS_STATUS_RESOURCES;
}
pTempCmd->ExpectedRetCode = GetExpectedRetCode(Cmd);
pTempCmd->Next = NULL;
//AllenDBGPRINT(DBG_ALLEN, ("PrepareAndSendCommand _2 \n"));
// 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;
//AllenDBGPRINT(DBG_ALLEN, ("PrepareAndSendCommand _2 \n"));
/// V5DbgMsg( (L" # pre: 0x%x (ps=%d, cfm=%d)\n", Cmd, Adapter->psState, Adapter->bPSConfirm) );
// 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;
//AllenDBGPRINT(DBG_ALLEN, ("HostCmd_CMD_802_11_BG_SCAN_CONFIG _1 \n"));
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;
/*
{
ULONG i;
//AllenDBGPRINT(DBG_ALLEN, ("pHostCmdBgScanCfg \n"));
for (i=0; i<Size; i++)
{
if (((i %16) == 0) && i)
{
AllenDBGPRINT(DBG_ALLEN, ("\n"));
}
AllenDBGPRINT(DBG_ALLEN, ("%02x ", *(((UCHAR *)(pHostCmdBgScanCfg))+ i)));
}
AllenDBGPRINT(DBG_ALLEN, ("\n"));
}
*/
}
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
#ifdef PA_CFG_EXT
case HostCmd_CMD_802_11_POWER_ADAPT_CFG_EXT:
{
POID_MRVL_DS_POWER_ADAPT_CFG_EXT pPACfg;
PHostCmd_DS_802_11_POWER_ADAPT_CFG_EXT pHostCmdPACfg;
//AllenDBGPRINT(DBG_ALLEN, ("HostCmd_CMD_802_11_BG_SCAN_CONFIG _1 \n"));
pPACfg = (POID_MRVL_DS_POWER_ADAPT_CFG_EXT) Adapter->PACfg;
pHostCmdPACfg = (PHostCmd_DS_802_11_POWER_ADAPT_CFG_EXT)(pTempCmd->BufVirtualAddr);
#ifdef MRVL_DBG_PA_CFG_EXT
#ifdef MRVL_PRINT_DBG_MSG
if ( CmdOption == HostCmd_ACT_GET )
{
MrvPrintFile("\n[Marvell]Get: HostCmd_CMD_802_11_POWER_ADAPT_CFG_EXT: \n");
MrvPrintFile("\n[Marvell]pPACfg->CmdLen=0x%x,pPACfg->Action=%d,pPACfg->EnablePA=%d,pPACfg->PowerAdaptGroup.Header.Type=0x%x !!\n",pPACfg->CmdLen,pPACfg->Action,pPACfg->EnablePA,pPACfg->PowerAdaptGroup.Header.Type);
}
#endif
#endif
NdisMoveMemory( (PUCHAR)(&(pHostCmdPACfg->Action)),
(PUCHAR)(&(pPACfg->Action)),
pPACfg->CmdLen);
Size = pPACfg->CmdLen + sizeof(USHORT)*4;
// Set command size
pCmdPtr->Size = Size;
#ifdef MRVL_DBG_PA_CFG_EXT
#ifdef MRVL_PRINT_DBG_MSG
MrvPrintFile("\t[Marvell]HostCmd_CMD_802_11_POWER_ADAPT_CFG_EXT:pHostCmdPACfg->Action= %d,pHostCmdPACfg->EnablePA= %d,pCmdPtr->Size=0x%x\n",pHostCmdPACfg->Action,pHostCmdPACfg->EnablePA,pCmdPtr->Size);
#endif
#endif
}
break;
#endif
//tt ++ v5 firmware
case HostCmd_CMD_802_11_SUBSCRIBE_EVENT:
//ahan [2005-12-13] ++dralee_20060217
{
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->RssiLow.Header.Type = TLV_TYPE_RSSI;
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;
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;
#ifdef SubEvent_RSSI_SNR_HIGH
pCmdSubscribeEvent->RssiHigh.Header.Type = TLV_TYPE_RSSI;
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;
pCmdSubscribeEvent->SnrHigh.Header.Len = TLV_PAYLOAD_SIZE;
pCmdSubscribeEvent->SnrHigh.SNRValue = Adapter->EventRecord.SNRHighValue;
pCmdSubscribeEvent->SnrHigh.SNRFreq = Adapter->EventRecord.SNRHighFreq;
#endif
HexDump(DBG_SUBSCRIBEEVENT,"HostCmd_CMD_802_11_SUBSCRIBE_EVENT: ",
(PUCHAR)pCmdSubscribeEvent, sizeof(HostCmd_DS_802_11_SUBSCRIBE_EVENT));
}
//ahan [2005-12-13] ++dralee_20060217
break;
#ifdef IF_GSPI
case HostCmd_CMD_GSPI_BUS_CONFIG:
{
PHostCmd_DS_CMD_GSPI_BUS_CONFIG pCmdGSPIBusConfig;
pCmdGSPIBusConfig = (PHostCmd_DS_CMD_GSPI_BUS_CONFIG)pCmdPtr;
Size = sizeof(HostCmd_DS_CMD_GSPI_BUS_CONFIG);
pCmdGSPIBusConfig->Action = CmdOption;
if ( CmdOption == HostCmd_ACT_GEN_SET )
{
pCmdGSPIBusConfig->BusDelayMode = 0x06 | B_BIT_4;
pCmdGSPIBusConfig->HostTimeDelayToReadPort = g_spi_dummy_clk_data*16;//1*16;
pCmdGSPIBusConfig->HostTimeDelayToReadregister = g_spi_dummy_clk_reg*16;
}
}
break;
#endif
#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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -