cmdsend.c

来自「marvell8385 GSPI开发驱动」· C语言 代码 · 共 1,764 行 · 第 1/5 页

C
1,764
字号
            // count the channels need to scan 
      TotalChan = 0;
      for ( i=0; i < MAX_REGION_BAND_NUM; i++ ) 
      { 
          region_channel = &(Adapter->region_channel[i]);
          if (region_channel->Valid == TRUE)
          TotalChan += region_channel->NrCFP;
      } 
      DBGPRINT(DBG_CMDRESP,(">>> SCAN command TotalChan = %d\n", TotalChan));
                     //NKDbgPrintfW(L"[Marvell]HostCmd_CMD_802_11_SCAN: + SCAN command TotalChan = %d", TotalChan);   
           
            // no channel need to be scaned 
      if (TotalChan == 0)
            { 
              Adapter->bIsScanInProgress = FALSE;  
        return NDIS_STATUS_SUCCESS;
            }
      
      for ( i=0; i < MAX_REGION_BAND_NUM; i++ )
      {
        region_channel = &(Adapter->region_channel[i]);

          if (region_channel->Valid == FALSE)
            continue;
                  
          j=0;
          cmd_index=0;  
    
          while (j<region_channel->NrCFP)
          { 
          

          bc.BandSelection = region_channel->Band;
            bc.Channel = region_channel->CFP[j].Channel;
          
#ifdef MRV_CHIP_8385H
          PrepareAndSendCommand(  
              Adapter,
                HostCmd_CMD_802_11_BAND_CONFIG,
                  HostCmd_ACT_SET,
                  HostCmd_OPTION_USE_INT,
                  (NDIS_OID)0,
                  HostCmd_PENDING_ON_NONE,
                  0,
                  FALSE,
                  NULL,
                  NULL,
                  NULL,
                  &bc); 
#endif          
          pTempScanCmd[cmd_index] = GetFreeCmdCtrlNode(Adapter);
          if ( pTempScanCmd[cmd_index] == NULL )
          {
                  NdisAcquireSpinLock(&Adapter->FreeQSpinLock);
                    CleanUpCmdCtrlNode(pTempCmd);
                  InsertQNodeAtTail(&Adapter->CmdFreeQ, (PQ_NODE)pTempCmd);
                    NdisReleaseSpinLock(&Adapter->FreeQSpinLock);

            DBGPRINT(DBG_CMDRESP,(">>> Get Free CmdNode Fail \n"));
            
                    return NDIS_STATUS_FAILURE;
                }

                // setup the command
                pTempScanCmd[cmd_index]->ExpectedRetCode = GetExpectedRetCode(HostCmd_CMD_802_11_SCAN);
                pScanCMD = (PHostCmd_DS_802_11_SCAN)pTempScanCmd[cmd_index]->BufVirtualAddr;

          // setup scan command and parameter
                pScanCMD->SeqNum = (Adapter->SeqNum++);
                pScanCMD->Command = HostCmd_CMD_802_11_SCAN;
                pScanCMD->Result = INTOption;
                pScanCMD->Size = sizeof(HostCmd_DS_802_11_SCAN);
         
                pScanCMD->BSSType = HostCmd_BSS_TYPE_ANY;
          
                pScanCMD->IsAutoAssociation = 0;
                if (Adapter->bIsAssociationBlockedByScan)
                  pTempScanCmd[cmd_index]->Pad[1] |= MRVDRV_ES_ASSOCIATIONBLOCKED;
              
              if (Adapter->SetActiveScanSSID)
                {
                  NdisMoveMemory (pScanCMD->SSID,
                    Adapter->ActiveScanSSID.Ssid,
                    Adapter->ActiveScanSSID.SsidLength);
                    pTempScanCmd[cmd_index]->Pad[0] |= MRVDRV_ES_SPECIFICSCAN;
          }
          else if (Adapter->SetActiveScanBSSID) 
                {
            NdisMoveMemory (pScanCMD->BSSID,
                    Adapter->ActiveScanBSSID,
                    MRVDRV_ETH_ADDR_LEN);
                    pTempScanCmd[cmd_index]->Pad[0] |= MRVDRV_ES_SPECIFICSCAN;
          }
          else 
                {   
                    pTempScanCmd[cmd_index]->Pad[0] |= MRVDRV_ES_NOTSPECIFICSCAN;
            NdisZeroMemory(pScanCMD->SSID, MRVDRV_MAX_SSID_LENGTH);   
            NdisZeroMemory(pScanCMD->BSSID, MRVDRV_ETH_ADDR_LEN);     
                } 

          pScanCMD->ScanType = HostCmd_SCAN_TYPE_ACTIVE;
        
                pScanCMD->MinCHTime = HostCmd_SCAN_MIN_CH_TIME; 
            pScanCMD->MaxCHTime = HostCmd_SCAN_MAX_CH_TIME; 

                NdisZeroMemory(pScanCMD->CHList, MRVDRV_MAX_CHANNEL_NUMBER);
           
                for (k=0; k<PSCAN_NUM_CH_PER_SCAN; k++)
                {     
                  // fill channel info
                    pScanCMD->CHList[k] =(UCHAR)region_channel->CFP[j].Channel;
            
            j++;  
            TotalChan--; 
            
                    if (j >= region_channel->NrCFP)
                      break;
                }           
        
                // this is the last command, copy the attributes
                SetCmdCtrlNode (Adapter,
                              pTempScanCmd[cmd_index], 
                            0, 
                            HostCmd_PENDING_ON_NONE, 
                            HostCmd_OPTION_USE_INT, 
                            0, 
                            FALSE, 
                            NULL,
                            NULL,
                            NULL, 
                            NULL);

          pTempScanCmd[cmd_index]->Pad[2] |= (0x03 & region_channel->Band);

          if (cmd_index == 0)
          {  
            pTempScanCmd[cmd_index]->Pad[2] |= MRVDRV_SCAN_CMD_START;  // scan start
          }
          if (TotalChan == 0)
            pTempScanCmd[cmd_index]->Pad[2] |= MRVDRV_SCAN_CMD_END;  // scan end 

          switch (region_channel->Band)
          {
            case MRVDRV_802_11_BAND_B:
              pTempScanCmd[cmd_index]->Pad[2] |= MRVDRV_802_11_BAND_B;
              
              break;
              case MRVDRV_802_11_BAND_BG:
              pTempScanCmd[cmd_index]->Pad[2] |= MRVDRV_802_11_BAND_BG;
              
            break;
            case MRVDRV_802_11_BAND_A:
              pTempScanCmd[cmd_index]->Pad[2] |= MRVDRV_802_11_BAND_A;
              
            break;
            default:
              pTempScanCmd[cmd_index]->Pad[2] |= MRVDRV_802_11_BAND_BG;
              
            break;
          }
          DBGPRINT(DBG_CMDRESP,("Set Band to %d\n", (pTempScanCmd[cmd_index]->Pad[2] & 0x3)));
  
          pTempScanCmd[cmd_index]->PadExt[0] = (UCHAR)(bc.Channel);
            DBGPRINT(DBG_CMDRESP,("Set Channel to %d\n", pTempScanCmd[cmd_index]->PadExt[0]));  

          // send command    
                DBGPRINT(DBG_CMDRESP,(">>> send scan command %d\n", cmd_index));
                ///DownloadCommandToStation(Adapter, pTempScanCmd[cmd_index]); 
           
          //dralee_1108++
          EnterCriticalSection(&Adapter->CmdQueueExeSection);

          InsertCmdToQueue (Adapter, pTempScanCmd[cmd_index]); 

          //dralee_1108++ 
          LeaveCriticalSection(&Adapter->CmdQueueExeSection); 

          GetCmdFromQueueToExecute(Adapter);
          
                cmd_index ++;
        }
      } 

      Adapter->SeqNum--; 
      NdisAcquireSpinLock(&Adapter->FreeQSpinLock);
      CleanUpCmdCtrlNode(pTempCmd);
      InsertQNodeAtTail(&Adapter->CmdFreeQ, (PQ_NODE)pTempCmd);
      NdisReleaseSpinLock(&Adapter->FreeQSpinLock);              

      DBGPRINT(DBG_CMDRESP,("HWAC - Progressive SCAN commnad is ready\n"));

        return NDIS_STATUS_SUCCESS;   
    } 

    break;
#else
    case HostCmd_CMD_802_11_SCAN:
    {   
       RETAILMSG(1,(TEXT("Enter HostCmd_CMD_802_11_SCAN : 1 : \n"))); 
      Adapter->SeqNum--; 
          NdisAcquireSpinLock(&Adapter->FreeQSpinLock);
          CleanUpCmdCtrlNode(pTempCmd);
          InsertQNodeAtTail(&Adapter->CmdFreeQ, (PQ_NODE)pTempCmd);
          NdisReleaseSpinLock(&Adapter->FreeQSpinLock);   

      pTempCmd = NULL;

#ifdef AUTO_REASSOCIATION
      SetupScanCommand (Adapter, PendingInfo );
#else
	SetupScanCommand (Adapter );
#endif
    } 
    
    break;

#endif
    case HostCmd_CMD_802_11_SET_WEP:
        pSetWEP = (PHostCmd_DS_802_11_SET_WEP)pCmdPtr;
      pNewWEP = (PNDIS_802_11_WEP)InformationBuffer;

       RETAILMSG(1,(TEXT("Enter HostCmd_DS_802_11_SET_WEP : \n")));
      
      Size = (USHORT)(sizeof(HostCmd_DS_802_11_SET_WEP));

      SetupWepKeys(
        PendingOID,
        pSetWEP, 
        pNewWEP,
        InformationBuffer,
        Adapter,
        CmdOption);
  
      break;

    case HostCmd_CMD_802_11_SNMP_MIB:

      switch (PendingOID)
      {
        case OID_802_11_INFRASTRUCTURE_MODE:
        {
          Size = (USHORT)(sizeof(HostCmd_DS_802_11_SNMP_MIB));
          pSNMPMIB = (PHostCmd_DS_802_11_SNMP_MIB)pCmdPtr;
          pSNMPMIB->QueryType = HostCmd_ACT_GEN_SET;
          pSNMPMIB->OID = (USHORT)DesiredBssType_i; // InfrastructureMode Index = 0
          pSNMPMIB->BufSize = sizeof(UCHAR);
        
          if( Adapter->InfrastructureMode == Ndis802_11Infrastructure )
            ucTemp = 1; // Infrastructure mode
          else
            ucTemp = 2; // Ad hoc mode
        
          NdisMoveMemory(pSNMPMIB->Value, &ucTemp, sizeof(UCHAR));        
          break;
        }   
      
        case OID_802_11_FRAGMENTATION_THRESHOLD:
        {
          NDIS_802_11_FRAGMENTATION_THRESHOLD ulTemp;
          USHORT usTemp;
        
          Size = (USHORT)(sizeof(HostCmd_DS_802_11_SNMP_MIB));
          pSNMPMIB = (PHostCmd_DS_802_11_SNMP_MIB)pCmdPtr;
          pSNMPMIB->OID = (USHORT)FragThresh_i; 
          
          if(PendingInfo==HostCmd_PENDING_ON_GET_OID){
            pSNMPMIB->QueryType = HostCmd_ACT_GEN_GET;
          }
          else if(PendingInfo==HostCmd_PENDING_ON_SET_OID){
            pSNMPMIB->QueryType = HostCmd_ACT_GEN_SET;
            pSNMPMIB->BufSize = sizeof(USHORT);
            ulTemp=*((NDIS_802_11_FRAGMENTATION_THRESHOLD *)InformationBuffer);
            *((PUSHORT)(pSNMPMIB->Value))=(USHORT)ulTemp;
            DBGPRINT(DBG_OID,("OID: Setting Fragmentation threshold to %d\n", ulTemp ));
          }
          else if(PendingInfo==HostCmd_PENDING_ON_NONE){
            pSNMPMIB->QueryType = HostCmd_ACT_GEN_SET;
            pSNMPMIB->BufSize = sizeof(USHORT);
            usTemp=(USHORT)Adapter->FragThsd;
            NdisMoveMemory(pSNMPMIB->Value, &usTemp, sizeof(USHORT));
          }                       
          break;          
        } 
      
        case OID_802_11_RTS_THRESHOLD:
        {
          USHORT usTemp;
          NDIS_802_11_RTS_THRESHOLD ulTemp;
        
          Size = (USHORT)(sizeof(HostCmd_DS_802_11_SNMP_MIB));
          pSNMPMIB = (PHostCmd_DS_802_11_SNMP_MIB)pCmdPtr;
          pSNMPMIB->OID = (USHORT)RtsThresh_i; 
      
          if(PendingInfo==HostCmd_PENDING_ON_GET_OID){
            pSNMPMIB->QueryType = HostCmd_ACT_GEN_GET;
          }
          else if(PendingInfo==HostCmd_PENDING_ON_SET_OID){
            pSNMPMIB->QueryType = HostCmd_ACT_GEN_SET;
            pSNMPMIB->BufSize = sizeof(USHORT);
            ulTemp=*((NDIS_802_11_RTS_THRESHOLD *)InformationBuffer);
            *((PUSHORT)(pSNMPMIB->Value))=(USHORT)ulTemp;
            DBGPRINT(DBG_OID,("OID: Setting RTS threshold to %d\n", ulTemp ));
          }
          else if(PendingInfo==HostCmd_PENDING_ON_NONE){
            pSNMPMIB->QueryType = HostCmd_ACT_GEN_SET;
            pSNMPMIB->BufSize = sizeof(USHORT);
            usTemp=(USHORT)Adapter->RTSThsd;
            NdisMoveMemory(pSNMPMIB->Value, &usTemp, sizeof(USHORT));
          }       
          break;    
        }         
#ifdef ENABLE_802_11D
        case OID_802_11D_ENABLE:
        {
          USHORT  usTemp;

          Size = (USHORT)(sizeof(HostCmd_DS_802_11_SNMP_MIB));
          pSNMPMIB = (PHostCmd_DS_802_11_SNMP_MIB)pCmdPtr;
          pSNMPMIB->OID = Dot11D_i;

          pSNMPMIB->QueryType = HostCmd_ACT_GEN_SET;
          pSNMPMIB->BufSize = sizeof(USHORT);
          usTemp = *(USHORT*) InformationBuffer;
          *((USHORT *) (pSNMPMIB->Value)) = usTemp;
  
          break;
        }
#endif
        
        default:
          break;
            }     
    break;    

    case HostCmd_CMD_802_11_AUTHENTICATE:
        {
            UCHAR ucAuth;

      Size = (USHORT)(sizeof(HostCmd_DS_802_11_AUTHENTICATE));
      pAuthenticate = (PHostCmd_DS_802_11_AUTHENTICATE) pCmdPtr;

      // if the authentication type need to be determined at initialization time
      if(PendingInfo == HostCmd_PENDING_ON_NONE)
            {
        ucAuth = (UCHAR)Adapter->AuthenticationMode;          
      } 
      else
            {
                ucAuth = (UCHAR) (*((PNDIS_802_11_AUTHENTICATION_MODE) InformationBuffer));
            }

            switch (ucAuth)
            {

⌨️ 快捷键说明

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