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 + -
显示快捷键?