/*========================================================================== FUNCTION WLANSAP_ScanCallback() DESCRIPTION Callback for Scan (scan results) Events DEPENDENCIES NA. PARAMETERS IN tHalHandle : tHalHandle passed in with the scan request *pContext : The second context pass in for the caller (sapContext) scanID : scanID got after the scan status : Status of scan -success, failure or abort RETURN VALUE The eHalStatus code associated with performing the operation eHAL_STATUS_SUCCESS: Success SIDE EFFECTS ============================================================================*/ eHalStatus WLANSAP_ScanCallback ( tHalHandle halHandle, void *pContext, /* Opaque SAP handle */ v_U8_t sessionId, v_U32_t scanID, eCsrScanStatus scanStatus ) { tScanResultHandle pResult = NULL; eHalStatus scanGetResultStatus = eHAL_STATUS_FAILURE; ptSapContext psapContext = (ptSapContext)pContext; tWLAN_SAPEvent sapEvent; /* State machine event */ v_U8_t operChannel = 0; VOS_STATUS sapstatus; #ifdef SOFTAP_CHANNEL_RANGE v_U32_t operatingBand; v_U32_t event; #endif if (psapContext->sapsMachine == eSAP_DISCONNECTED) { VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_WARN, "In %s BSS already stopped", __func__); return eHAL_STATUS_FAILURE; } /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, before switch on scanStatus = %d", __func__, scanStatus); switch (scanStatus) { case eCSR_SCAN_SUCCESS: // sapScanCompleteCallback with eCSR_SCAN_SUCCESS VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR scanStatus = %s (%d)", __func__, "eCSR_SCAN_SUCCESS", scanStatus); // Get scan results, Run channel selection algorithm, select channel and keep in pSapContext->Channel scanGetResultStatus = sme_ScanGetResult(halHandle, psapContext->sessionId, NULL, &pResult); if ((scanGetResultStatus != eHAL_STATUS_SUCCESS)&& (scanGetResultStatus != eHAL_STATUS_E_NULL_VALUE)) { // No scan results VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, "In %s, Get scan result failed! ret = %d", __func__, scanGetResultStatus); break; } #ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE if (scanID != 0) { VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "%s: Sending ACS Scan skip event", __func__); sapSignalHDDevent(psapContext, NULL, eSAP_ACS_SCAN_SUCCESS_EVENT, (v_PVOID_t) eSAP_STATUS_SUCCESS); } else VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "%s: ACS scan id: %d (skipped ACS SCAN)", __func__, scanID); #endif operChannel = sapSelectChannel(halHandle, psapContext, pResult); sme_ScanResultPurge(halHandle, pResult); event = eSAP_MAC_SCAN_COMPLETE; break; default: event = eSAP_CHANNEL_SELECTION_FAILED; VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR scanStatus = %s (%d)", __func__, "eCSR_SCAN_ABORT/FAILURE", scanStatus); } if (operChannel == SAP_CHANNEL_NOT_SELECTED) #ifdef SOFTAP_CHANNEL_RANGE { VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, "%s: No suitable channel selected", __func__); if ( eCSR_BAND_ALL == psapContext->scanBandPreference || psapContext->allBandScanned == eSAP_TRUE) { if(psapContext->channelList != NULL) { psapContext->channel = psapContext->channelList[0]; } else { /* if the channel list is empty then there is no valid channel in the selected sub-band so select default channel in the BAND(2.4GHz/5GHZ) */ ccmCfgGetInt( halHandle, WNI_CFG_SAP_CHANNEL_SELECT_OPERATING_BAND, &operatingBand); if(eSAP_RF_SUBBAND_2_4_GHZ == operatingBand ) psapContext->channel = SAP_DEFAULT_CHANNEL; else psapContext->channel = SAP_DEFAULT_5GHZ_CHANNEL; } } else { VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, "%s: Has scan band preference", __func__); if (eCSR_BAND_24 == psapContext->currentPreferredBand) psapContext->currentPreferredBand = eCSR_BAND_5G; else psapContext->currentPreferredBand = eCSR_BAND_24; psapContext->allBandScanned = eSAP_TRUE; //go back to DISCONNECT state, scan next band psapContext->sapsMachine = eSAP_DISCONNECTED; event = eSAP_CHANNEL_SELECTION_FAILED; } } #else psapContext->channel = SAP_DEFAULT_CHANNEL; #endif else {
/*========================================================================== FUNCTION WLANSAP_ScanCallback() DESCRIPTION Callback for Scan (scan results) Events DEPENDENCIES NA. PARAMETERS IN tHalHandle : tHalHandle passed in with the scan request *pContext : The second context pass in for the caller (sapContext) scanID : scanID got after the scan status : Status of scan -success, failure or abort RETURN VALUE The eHalStatus code associated with performing the operation eHAL_STATUS_SUCCESS: Success SIDE EFFECTS ============================================================================*/ eHalStatus WLANSAP_ScanCallback ( tHalHandle halHandle, void *pContext, /* Opaque SAP handle */ v_U32_t scanID, eCsrScanStatus scanStatus ) { tScanResultHandle pResult = NULL; eHalStatus scanGetResultStatus = eHAL_STATUS_FAILURE; ptSapContext psapContext = (ptSapContext)pContext; void *pTempHddCtx; tWLAN_SAPEvent sapEvent; /* State machine event */ v_U8_t operChannel = 0; VOS_STATUS sapstatus; #ifdef SOFTAP_CHANNEL_RANGE v_U32_t operatingBand; #endif /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ pTempHddCtx = vos_get_context( VOS_MODULE_ID_HDD, psapContext->pvosGCtx); if (NULL == pTempHddCtx) { VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL, "HDD context is NULL"); return eHAL_STATUS_FAILURE; } VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, before switch on scanStatus = %d", __func__, scanStatus); switch (scanStatus) { case eCSR_SCAN_SUCCESS: // sapScanCompleteCallback with eCSR_SCAN_SUCCESS VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR scanStatus = %s (%d)", __func__, "eCSR_SCAN_SUCCESS", scanStatus); // Get scan results, Run channel selection algorithm, select channel and keep in pSapContext->Channel scanGetResultStatus = sme_ScanGetResult(halHandle, 0, NULL, &pResult); if ((NULL == pResult) || (scanGetResultStatus != eHAL_STATUS_SUCCESS)) { // No scan results VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, "In %s, sme_ScanGetResult = NULL", __func__); break; } operChannel = sapSelectChannel(halHandle, psapContext, pResult); sme_ScanResultPurge(halHandle, pResult); break; default: VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR scanStatus = %s (%d)", __func__, "eCSR_SCAN_ABORT/FAILURE", scanStatus); } if (operChannel == SAP_CHANNEL_NOT_SELECTED) #ifdef SOFTAP_CHANNEL_RANGE { if(psapContext->channelList != NULL) { psapContext->channel = psapContext->channelList[0]; } else { /* if the channel list is empty then there is no valid channel in the selected sub-band so select default channel in the BAND(2.4GHz/5GHZ) */ ccmCfgGetInt( halHandle, WNI_CFG_SAP_CHANNEL_SELECT_OPERATING_BAND, &operatingBand); if(RF_SUBBAND_2_4_GHZ == operatingBand ) psapContext->channel = SAP_DEFAULT_CHANNEL; else psapContext->channel = SAP_DEFAULT_5GHZ_CHANNEL; } } #else psapContext->channel = SAP_DEFAULT_CHANNEL; #endif else {
eHalStatus WLANSAP_ScanCallback ( tHalHandle halHandle, void *pContext, v_U32_t scanID, eCsrScanStatus scanStatus ) { tScanResultHandle pResult = NULL; eHalStatus scanGetResultStatus = eHAL_STATUS_FAILURE; ptSapContext psapContext = (ptSapContext)pContext; void *pTempHddCtx; tWLAN_SAPEvent sapEvent; v_U8_t operChannel = 0; VOS_STATUS sapstatus; #ifdef SOFTAP_CHANNEL_RANGE v_U32_t operatingBand; #endif pTempHddCtx = vos_get_context( VOS_MODULE_ID_HDD, psapContext->pvosGCtx); if (NULL == pTempHddCtx) { VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL, "HDD context is NULL"); return eHAL_STATUS_FAILURE; } VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, before switch on scanStatus = %d", __func__, scanStatus); switch (scanStatus) { case eCSR_SCAN_SUCCESS: VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR scanStatus = %s (%d)", __func__, "eCSR_SCAN_SUCCESS", scanStatus); scanGetResultStatus = sme_ScanGetResult(halHandle, 0, NULL, &pResult); if ((NULL == pResult) || (scanGetResultStatus != eHAL_STATUS_SUCCESS)) { VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, "In %s, sme_ScanGetResult = NULL", __func__); break; } operChannel = sapSelectChannel(halHandle, psapContext, pResult); sme_ScanResultPurge(halHandle, pResult); break; default: VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR scanStatus = %s (%d)", __func__, "eCSR_SCAN_ABORT/FAILURE", scanStatus); } if (operChannel == SAP_CHANNEL_NOT_SELECTED) #ifdef SOFTAP_CHANNEL_RANGE { if(psapContext->channelList != NULL) { psapContext->channel = psapContext->channelList[0]; } else { ccmCfgGetInt( halHandle, WNI_CFG_SAP_CHANNEL_SELECT_OPERATING_BAND, &operatingBand); if(RF_SUBBAND_2_4_GHZ == operatingBand ) psapContext->channel = SAP_DEFAULT_CHANNEL; else psapContext->channel = SAP_DEFAULT_5GHZ_CHANNEL; } } #else psapContext->channel = SAP_DEFAULT_CHANNEL; #endif else {
int iw_get_scan(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev) ; hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter); tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter); tCsrScanResultInfo *pScanResult; eHalStatus status = eHAL_STATUS_SUCCESS; hdd_scan_info_t scanInfo; tScanResultHandle pResult; int i = 0; VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: enter buffer length %d!!!", __func__, (wrqu->data.length)?wrqu->data.length:IW_SCAN_MAX_DATA); ENTER(); if (TRUE == pHddCtx->scan_info.mScanPending) { VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:mScanPending is TRUE !!!",__func__); return -EAGAIN; } if ((WLAN_HDD_GET_CTX(pAdapter))->isLogpInProgress) { VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:LOGP in Progress. Ignore!!!",__func__); return -EAGAIN; } scanInfo.dev = dev; scanInfo.start = extra; scanInfo.info = info; if (0 == wrqu->data.length) { scanInfo.end = extra + IW_SCAN_MAX_DATA; } else { scanInfo.end = extra + wrqu->data.length; } status = sme_ScanGetResult(hHal,pAdapter->sessionId,NULL,&pResult); if (NULL == pResult) { hddLog(LOG1,"iw_get_scan: NULL Scan Result "); return 0; } pScanResult = sme_ScanResultGetFirst(hHal, pResult); while (pScanResult) { status = hdd_IndicateScanResult(&scanInfo, pScanResult); if (0 != status) { break; } i++; pScanResult = sme_ScanResultGetNext(hHal, pResult); } sme_ScanResultPurge(hHal, pResult); EXIT(); VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: exit total %d BSS reported !!!",__func__, i); return status; }
/*========================================================================== FUNCTION WLANSAP_ScanCallback() DESCRIPTION Callback for Scan (scan results) Events DEPENDENCIES NA. PARAMETERS IN tHalHandle : tHalHandle passed in with the scan request *pContext : The second context pass in for the caller (sapContext) scanID : scanID got after the scan status : Status of scan -success, failure or abort RETURN VALUE The eHalStatus code associated with performing the operation eHAL_STATUS_SUCCESS: Success SIDE EFFECTS ============================================================================*/ eHalStatus WLANSAP_ScanCallback ( tHalHandle halHandle, void *pContext, /* Opaque SAP handle */ v_U32_t scanID, eCsrScanStatus scanStatus ) { tScanResultHandle pResult = NULL; eHalStatus scanGetResultStatus = eHAL_STATUS_FAILURE; ptSapContext psapContext = (ptSapContext)pContext; void *pTempHddCtx; tWLAN_SAPEvent sapEvent; /* State machine event */ v_U8_t operChannel = 0; v_U8_t i = 0; VOS_STATUS sapstatus; v_U32_t event; /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ pTempHddCtx = vos_get_context( VOS_MODULE_ID_HDD, psapContext->pvosGCtx); if (NULL == pTempHddCtx) { VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL, "HDD context is NULL"); return eHAL_STATUS_FAILURE; } VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, before switch on scanStatus = %d", __func__, scanStatus); switch (scanStatus) { case eCSR_SCAN_SUCCESS: // sapScanCompleteCallback with eCSR_SCAN_SUCCESS VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR scanStatus = %s (%d)", __func__, "eCSR_SCAN_SUCCESS", scanStatus); // Get scan results, Run channel selection algorithm, select channel and keep in pSapContext->Channel scanGetResultStatus = sme_ScanGetResult(halHandle, 0, NULL, &pResult); event = eSAP_MAC_SCAN_COMPLETE; if ((scanGetResultStatus != eHAL_STATUS_SUCCESS)&& (scanGetResultStatus != eHAL_STATUS_E_NULL_VALUE)) { // No scan results VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, "In %s, Get scan result failed! ret = %d", __func__, scanGetResultStatus); break; } operChannel = sapSelectChannel(halHandle, psapContext, pResult); sme_ScanResultPurge(halHandle, pResult); break; default: event = eSAP_CHANNEL_SELECTION_FAILED; VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR scanStatus = %s (%d)", __func__, "eCSR_SCAN_ABORT/FAILURE", scanStatus); } if (operChannel == SAP_CHANNEL_NOT_SELECTED) #ifdef SOFTAP_CHANNEL_RANGE { VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, "%s: No suitable channel selected", __func__); if ( eCSR_BAND_ALL == psapContext->scanBandPreference || psapContext->allBandScanned == eSAP_TRUE) { if(psapContext->channelList != NULL) { psapContext->channel = SAP_DEFAULT_CHANNEL; for ( i = 0 ; i < psapContext->numofChannel ; i++) { if (NV_CHANNEL_ENABLE == vos_nv_getChannelEnabledState(psapContext->channelList[i])) { psapContext->channel = psapContext->channelList[i]; break; } } } else { /* if the channel list is empty then there is no valid channel in the selected sub-band so select default channel in the BAND(2.4GHz) as 2.4 channels are available in all the countries*/ psapContext->channel = SAP_DEFAULT_CHANNEL; } } else { VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, "%s: Has scan band preference", __func__); if (eCSR_BAND_24 == psapContext->currentPreferredBand) psapContext->currentPreferredBand = eCSR_BAND_5G; else psapContext->currentPreferredBand = eCSR_BAND_24; psapContext->allBandScanned = eSAP_TRUE; //go back to DISCONNECT state, scan next band psapContext->sapsMachine = eSAP_DISCONNECTED; event = eSAP_CHANNEL_SELECTION_FAILED; } } #else psapContext->channel = SAP_DEFAULT_CHANNEL; #endif else {