cmdsend.c
来自「marvell8385 GSPI开发驱动」· C语言 代码 · 共 1,764 行 · 第 1/5 页
C
1,764 行
/******************* ?Marvell Semiconductor, Inc., 2001-2004 *****************
*
* Purpose: This module has implmentation of station command sending
* function
*
* $Author: heb $
*
* $Date: 2007/07/13 08:01:34 $
*
* $Revision: 1.8.2.3 $
*
*****************************************************************************/
#include "precomp.h"
#include "ParaRoamingProc.h"
#ifdef DEBUG_PARA_ROAMING
extern PRIVATE_PARAROAMING_ADAPTER priv;
#endif
#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
// Get next free command control node
pTempCmd = GetFreeCmdCtrlNode(Adapter);
if( !pTempCmd)
{
ResetCmdBuffer(Adapter);
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;
V5DbgMsg( (L" # pre: 0x%x (ps=%d, cfm=%d)\n", Cmd, Adapter->psState, Adapter->bPSConfirm) );
// Check and prepare command
switch( Cmd ) {
//tt ++ v5 firmware
case HostCmd_CMD_802_11_SUBSCRIBE_EVENT:
//TT_CMDPARSE_SEND_CMD( HostCmd_DS_802_11_SUBSCRIBE_EVENT, OID_MRVL_DS_SUBSCRIBE_EVENT, Events );
{
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 = RSSI_LOW | RSSI_HIGH;
//pCmdSubscribeEvent->Events = RSSI_HIGH;
pCmdSubscribeEvent->Events = RSSI_LOW | LINK_LOSS ;
pCmdSubscribeEvent->RssiLow.Header.Type = TLV_TYPE_RSSI;
pCmdSubscribeEvent->RssiLow.Header.Len = TLV_PAYLOAD_SIZE;
pCmdSubscribeEvent->RssiLow.RSSIValue = 83;
pCmdSubscribeEvent->RssiLow.RSSIFreq = 2;
/*
pCmdSubscribeEvent->RssiHigh.Header.Type = TLV_TYPE_RSSI;
pCmdSubscribeEvent->RssiHigh.Header.Len = TLV_PAYLOAD_SIZE;
pCmdSubscribeEvent->RssiHigh.RSSIValue = 80;
pCmdSubscribeEvent->RssiHigh.RSSIFreq = 2;
*/
pCmdSubscribeEvent->BcnMiss.Header.Type = TLV_TYPE_BCNMISS;
pCmdSubscribeEvent->BcnMiss.Header.Len = TLV_PAYLOAD_SIZE;
pCmdSubscribeEvent->BcnMiss.BeaconMissed = 20;
pCmdSubscribeEvent->BcnMiss.Reserved = 0;
break;
}
#ifdef IF_SPI
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;
#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;
//tt --
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_SLEEP
case HostCmd_CMD_802_11_HOST_SLEEP_CFG:
{
PHostCmd_DS_HOST_SLEEP pCmdHostSleep;
POID_MRVL_DS_HOST_SLEEP_CFG pOIDHostSleep;
pOIDHostSleep = (POID_MRVL_DS_HOST_SLEEP_CFG)InformationBuffer;
pCmdHostSleep= (PHostCmd_DS_HOST_SLEEP)pCmdPtr;
Size = sizeof(HostCmd_DS_HOST_SLEEP);
pCmdHostSleep->Size =sizeof(HostCmd_DS_HOST_SLEEP);
pCmdHostSleep->Criteria=pOIDHostSleep->ulCriteria;
pCmdHostSleep->GPIO=pOIDHostSleep->ucGPIO;
pCmdHostSleep->Gap=pOIDHostSleep->ucGap;
DBGPRINT(DBG_HOSTSLEEP, ("HostCmd_CMD_802_11_HOST_SLEEP_CFG:pCmdHostSleep->Criteria=0x%x\n,pCmdHostSleep->GPIO=0x%x\n,pCmdHostSleep->Gap =0x%x,pCmdHostSleep->Size =0x%x\n", pCmdHostSleep->Criteria ,pCmdHostSleep->GPIO,pCmdHostSleep->Gap,pCmdHostSleep->Size));
#ifdef WLAN_PMU_DEBUG
RETAILMSG(1, (L"HostCmd_CMD_802_11_HOST_SLEEP_CFG:pCmdHostSleep->Criteria=0x%x\n,pCmdHostSleep->GPIO=0x%x\n,pCmdHostSleep->Gap =0x%x,pCmdHostSleep->Size =0x%x\n", pCmdHostSleep->Criteria ,pCmdHostSleep->GPIO,pCmdHostSleep->Gap,pCmdHostSleep->Size));
#endif
}
break;
case HostCmd_CMD_802_11_HOST_SLEEP_AWAKE_CONFIRM:
Size = sizeof( HostCmd_DS_WAKEUP_CONFIRM);
break;
#endif
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;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?