示例#1
0
/*  Api_WMIInitFinish - implements common code for sending default wmi commands 
 *                      to target.
 *	 This should be called after Api_InitFinish().
 *      A_VOID *pCxt - the driver context.    
 *****************************************************************************/
A_VOID 
Api_WMIInitFinish(A_VOID *pCxt)
{
    A_DRIVER_CONTEXT *pDCxt = GET_DRIVER_COMMON(pCxt);
    A_STATUS status;    
    WMI_ALLOW_AGGR_CMD allow_aggr_cmd;
        
    if(pDCxt->wmiReady == A_TRUE)
    {
        do{
            status = STACK_INIT(pCxt);
            
            if(status == A_OK){
                CUSTOM_WAIT_FOR_WMI_RESPONSE(pCxt);              
                break;            
            }else if(status == A_NO_MEMORY){
                pDCxt->tx_complete_pend = A_TRUE;
                
                if(A_OK != CUSTOM_DRIVER_WAIT_FOR_CONDITION(pCxt, &(pDCxt->tx_complete_pend), A_FALSE, 5000)){
                    A_ASSERT(0);
                }
            }else{
                A_ASSERT(0);
            }
        }while(1);       

      
      /* issue some default WMI commands appropriate for most systems */
#if WLAN_CONFIG_IGNORE_POWER_SAVE_FAIL_EVENT_DURING_SCAN
        wmi_cmd_process(pCxt, WMI_SET_POWER_PARAMS_CMDID, &default_power_param, sizeof(WMI_POWER_PARAMS_CMD));    
#endif
        wmi_cmd_process(pCxt, WMI_SET_SCAN_PARAMS_CMDID, &default_scan_param, sizeof(WMI_SCAN_PARAMS_CMD));
        
        wmi_cmd_process(pCxt, WMI_STORERECALL_CONFIGURE_CMDID, 
            &default_strrcl_config_cmd, sizeof(WMI_STORERECALL_CONFIGURE_CMD));                     
        pDCxt->strrclState = STRRCL_ST_INIT;
        /* technically this call to wmi_allow_aggr_cmd is not necessary if both 
         * masks are 0 as the firmware has 0,0 as the default. */
        allow_aggr_cmd.tx_allow_aggr = A_CPU2LE16(pDCxt->txAggrTidMask);
        allow_aggr_cmd.rx_allow_aggr = A_CPU2LE16(pDCxt->rxAggrTidMask);
        wmi_cmd_process(pCxt, WMI_ALLOW_AGGR_CMDID, &allow_aggr_cmd, sizeof(WMI_ALLOW_AGGR_CMD));      
#if ENABLE_P2P_MODE
        if(WLAN_NUM_OF_DEVICES == 2) {
            /* Device-0 is P2P Device and Device-1 is Legacy STA.\
               Set Default P2P Params 
             */
            wmi_cmd_process(pCxt,WMI_P2P_SET_CONFIG_CMDID,&default_p2p_config,sizeof(WMI_P2P_FW_SET_CONFIG_CMD));                           
        }
#endif
        /* Set the BSS Filter to None. If this is not set, by default the firmware 
       sets to forward the beacons to host. This causes unnecessary BSSINFO events in 
       the host even after connecting to the AP */
        wmi_bssfilter_cmd(pDCxt->pWmiCxt, NONE_BSS_FILTER, 0);
    }
}
示例#2
0
void
CAR6KMini::rssiScanTimeout()
{
    static int reScanCounter=255;
    A_UINT16 fgenable, bkenable;
    // Return if WMI is not ready yet
    if (!m_WMIReady)
        return;

    if (!m_Connected)
        return;

    //get stats from target
    if (ar6000_get_target_stats() != A_OK)
        return;


    if (m_Config.bkScanEnable) {
        bkenable = (A_UINT16)m_Config.bkScanPeriod;
    } else {
        bkenable = 0xFFFF;
    }

    if (m_Config.fgScanEnable) {
        fgenable = 0;
    } else {
        fgenable = 0xFFFF;
    }

    //Post the RSSI value relative to the Standard Noise floor value.
    if (RSSI_TO_NDIS(m_RSSI) >= -60)
    {
        m_RSSIlevel = 0;
        reScanCounter = 10;
        A_TIMEOUT_MS(&m_rssiScanTimer, 1000, 0);
    }
    else if ((RSSI_TO_NDIS(m_RSSI) >= -65) && (RSSI_TO_NDIS(m_RSSI) < -60))
    {
        reScanCounter = 10;
        A_TIMEOUT_MS(&m_rssiScanTimer, 1000, 0);
    }
    else if ((RSSI_TO_NDIS(m_RSSI) >= -70) && (RSSI_TO_NDIS(m_RSSI) < -65))
    {
        reScanCounter = 10;
        if ((1 != m_RSSIlevel) && (2 != m_RSSIlevel))
        {
            m_RSSIlevel = 1;
            wmi_bssfilter_cmd ((struct wmi_t *)m_pWMI, PROBED_SSID_FILTER, 0);
            wmi_scanparams_cmd((wmi_t *)m_pWMI,fgenable,0,bkenable,
                                        0,0,20,WMI_SHORTSCANRATIO_DEFAULT, 0, 0, 0);
            wmi_startscan_cmd((wmi_t *)m_pWMI,WMI_LONG_SCAN,TRUE,FALSE,0,100,0,NULL);
        }
        A_TIMEOUT_MS(&m_rssiScanTimer, 1000, 0);
    }
    else if ((RSSI_TO_NDIS(m_RSSI) >= -75) && (RSSI_TO_NDIS(m_RSSI) < -70))
    {
        reScanCounter = 10;
        if ((2 != m_RSSIlevel) && (3 != m_RSSIlevel))
        {
            m_RSSIlevel = 2;
            wmi_startscan_cmd((wmi_t *)m_pWMI,WMI_SHORT_SCAN,TRUE,FALSE,0,100,0,NULL);
        }
        A_TIMEOUT_MS(&m_rssiScanTimer, 500, 0);
    }
    else if ((RSSI_TO_NDIS(m_RSSI) >= -80) && (RSSI_TO_NDIS(m_RSSI) < -75))
    {
        reScanCounter = 10;
        if ((3 != m_RSSIlevel) && (4 != m_RSSIlevel))
        {
            m_RSSIlevel = 3;
            wmi_bssfilter_cmd ((struct wmi_t *)m_pWMI, PROBED_SSID_FILTER, 0);
            wmi_scanparams_cmd((wmi_t *)m_pWMI,fgenable,0,bkenable,
                                        0,0,20,WMI_SHORTSCANRATIO_DEFAULT, 0, 0, 0);
            wmi_startscan_cmd((wmi_t *)m_pWMI,WMI_LONG_SCAN,TRUE,FALSE,0,100,0,NULL);
        }
        A_TIMEOUT_MS(&m_rssiScanTimer, 400, 0);
    }
    else if ((RSSI_TO_NDIS(m_RSSI) >= -85) && (RSSI_TO_NDIS(m_RSSI) < -80))
    {
        if ((4 != m_RSSIlevel) && (5 != m_RSSIlevel))
        {
            reScanCounter = 7;
            m_RSSIlevel = 4;
            wmi_startscan_cmd((wmi_t *)m_pWMI,WMI_SHORT_SCAN,TRUE,FALSE,0,100,0,NULL);
        }
        if ((0 == reScanCounter) && (4 == m_RSSIlevel))
        {
            reScanCounter = 7;
            if (m_roamTblEntryCount > 1)
            {
                wmi_startscan_cmd((wmi_t *)m_pWMI,WMI_SHORT_SCAN,TRUE,FALSE,0,100,0,NULL);
            }
        }
        reScanCounter--;
        A_TIMEOUT_MS(&m_rssiScanTimer, 400, 0);
    }
    else if (RSSI_TO_NDIS(m_RSSI) < -85)
    {
        if (5 != m_RSSIlevel)
        {
            m_RSSIlevel = 5;
            reScanCounter = 10;
            wmi_bssfilter_cmd ((struct wmi_t *)m_pWMI, PROBED_SSID_FILTER, 0);
            wmi_scanparams_cmd((wmi_t *)m_pWMI,fgenable,0,bkenable,
                                        0,0,20,WMI_SHORTSCANRATIO_DEFAULT, 0, 0, 0);
            wmi_startscan_cmd((wmi_t *)m_pWMI,WMI_LONG_SCAN,TRUE,FALSE,0,100,0,NULL);
        }
        if ((0 == reScanCounter) && (5 == m_RSSIlevel))
        {
            reScanCounter = 6;
            if (m_roamTblEntryCount > 1)
            {
                wmi_startscan_cmd((wmi_t *)m_pWMI,WMI_SHORT_SCAN,TRUE,FALSE,0,100,0,NULL);
            }
        }
        reScanCounter--;
        A_TIMEOUT_MS(&m_rssiScanTimer, 400, 0);
    }
    else
    {
        A_TIMEOUT_MS(&m_rssiScanTimer, 1000, 0);
    }

    wmi_get_roam_tbl_cmd((wmi_t *)m_pWMI);

}
示例#3
0
void
CAR6KMini::WMIConnectIndication(
	IN USHORT		Channel, 
	IN PBYTE 		PeerBSSID,
	IN USHORT		listenInterval,
	IN USHORT		beaconInterval,
	NETWORK_TYPE	networkType, 
	IN BYTE			assocReqLen, 
	IN BYTE			assocRespLen,
	IN PBYTE		assocInfo,
	IN BYTE			beaconIeLen)
	
{
	BYTE       len = 0;
	int        i = 0;
	A_STATUS wmiStatus;
	bss_t * bss;

	NDIS_DEBUG_PRINTF(1,"WMIConnectIndication Enter , %02x:%02x:%02x:%02x:%02x:%02x \r\n",
							PeerBSSID[0],PeerBSSID[1],PeerBSSID[2],PeerBSSID[3],PeerBSSID[4],PeerBSSID[5]);

	/* Set the Listen interval to appropriate value (100/1000 TUs) depending
	 * on the power mode setting. For REC Mode we always indicate 1000TUs to the
	 * AP in the conn. req. but reset it appropriately here upon conn Ind.
	 */
	if( m_80211_PowerMode == Ndis802_11PowerModeFast_PSP ) 
	{
	

		wmiStatus = wmi_listeninterval_cmd((struct wmi_t *)m_pWMI, 
			m_ListenInterval, 0);
	
		if (wmiStatus != A_OK) 
		{
			NDIS_DEBUG_PRINTF(DBG_ERR_LOG,"AR6K: ERROR - wmi_listeninterval_cmd failed = %u \r\n", wmiStatus);
		}
	}


	memcpy(m_PeerBSSID, PeerBSSID, ETHERNET_MAC_ADDRESS_LENGTH);
	m_ConnectedChannel = Channel;
	m_Connected = true;
	m_ConnectInProgress = false;
	m_AssocReqLen = assocReqLen;
	m_AssocRespLen = assocRespLen;
	m_BeaconIeLen = beaconIeLen;
	
	if (m_pAssocInfo != NULL) {
		A_FREE(m_pAssocInfo);
	}


	m_pAssocInfo = (PBYTE)malloc(m_AssocReqLen + m_AssocRespLen + m_BeaconIeLen);
	if(m_pAssocInfo == NULL ) 
	{
		NDIS_DEBUG_PRINTF(DBG_ERR, " %s() -> malloc faile!! size = %d \r\n",__FUNCTION__, m_AssocReqLen + m_AssocRespLen + m_BeaconIeLen);
		return;
	}
	else 
	{
		memcpy(m_pAssocInfo, assocInfo, m_AssocReqLen + m_AssocRespLen + m_BeaconIeLen);
	}


    // Send Command to Enable or disable Background Scan
	if (m_Config.bkScanEnable) 
	{
	    m_WMIBssFilter = ALL_BUT_BSS_FILTER;
	} 
	else 
	{
	    m_WMIBssFilter = NONE_BSS_FILTER;
    }
	
	wmi_bssfilter_cmd((struct wmi_t *)m_pWMI, m_WMIBssFilter,0);

	//Add the key here for WEP encryption with open Auth or Autoswitch.
	// For Shared Auth, the keys are plumbed before the connect cmd is issued and
	// for WPA/WPA2, the keys are plumbed when the AddKey OID comes.

	if (m_AuthenticationMode == Ndis802_11AuthModeOpen ||
		m_AuthenticationMode == Ndis802_11AuthModeAutoSwitch ) 

	{

		if (m_EncryptionStatus == Ndis802_11WEPEnabled) 
		{
			
			NDIS_DEBUG_PRINTF(DBG_TRACE, "WEP encryption  \r\n");
			
			for (i=0;i<4;i++) 
			{
				if (m_cbKey[i] != 0) 
				{
					NDIS_DEBUG_PRINTF(DBG_TRACE, "AR6K: adding WEP keys @ index %d \r\n", i);

					wmiStatus = wmi_addKey_cmd((wmi_t *)m_pWMI, (A_UINT8)m_KeyIndex[i], 	
						WEP_CRYPT, m_KeyUsage[i], (A_UINT8)m_cbKey[i], NULL, m_Key[i],
						KEY_OP_INIT_VAL,NULL,NO_SYNC_WMIFLAG);

                    if (wmiStatus != A_OK) 
					{
					    NDIS_DEBUG_PRINTF(DBG_TRACE, "AR6K: ERROR - wmi_addKey_cmd failed = %u \r\n", wmiStatus);
                    }
				}
			}
		}
	}

	// Indicate MEDIA_CONNECT to Ndis
	NdisMIndicateStatus(m_MiniportAdapterHandle, NDIS_STATUS_MEDIA_CONNECT, 0, 0);
	NdisMIndicateStatusComplete(m_MiniportAdapterHandle);
	bss=wmi_find_node((wmi_t *)m_pWMI,m_PeerBSSID);
    if (bss != NULL) {
	    m_beaconInterval = bss->ni_cie.ie_beaconInt;
    }

	NDIS_DEBUG_PRINTF(DBG_TRACE,"%s() - Exit !! \r\n",__FUNCTION__);
	return;
}
示例#4
0
void
CAR6KMini::WMIScanCompleteEvent()
{
    A_UINT16 fgenable, bkenable;

    if (m_Config.hostAssistedRoaming)
    {
        wmi_bssfilter_cmd ((struct wmi_t *)m_pWMI, m_WMIBssFilter, 0);
            // Restore scan parameters
            if (m_Config.bkScanEnable) {
                bkenable = (A_UINT16)m_Config.bkScanPeriod;
            } else {
                bkenable = 0xFFFF;
            }

            if (m_Config.fgScanEnable) {
                fgenable = 0;
            } else {
                fgenable = 0xFFFF;
            }
            wmi_scanparams_cmd((wmi_t *)m_pWMI,fgenable,0,bkenable,
                               0,0,0,WMI_SHORTSCANRATIO_DEFAULT, 0, 0, 0);
    }
#ifdef OS_ROAM_MANAGEMENT
    if ((m_ChannelScan) && (!m_osRoamControl))
#else
    if (m_ChannelScan)
#endif
    {

        //
        // Restore channel parameters
        //
        wmi_set_channelParams_cmd ((wmi_t *)m_pWMI, TRUE, (WMI_PHY_MODE)m_80211PhyCapability, 0, NULL);

        if (m_Connected)
        {
            // Restore scan parameters
            if (m_Config.bkScanEnable) {
                bkenable = (A_UINT16)m_Config.bkScanPeriod;
            } else {
                bkenable = 0xFFFF;
            }

            if (m_Config.fgScanEnable) {
                fgenable = 0;
            } else {
                fgenable = 0xFFFF;
            }
            wmi_scanparams_cmd((wmi_t *)m_pWMI,fgenable,0,bkenable,
                                0,0,0,WMI_SHORTSCANRATIO_DEFAULT, 0, 0, 0);
        }

        m_ChannelScan = FALSE;
    }
#ifdef OS_ROAM_MANAGEMENT
    if (m_osRoamControl)
    {
        wmi_scan_indication ((wmi_t *)m_pWMI);
    }
#endif
}