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 sapComputeSpectWeight DESCRIPTION Main function for computing the weight of each channel in the spectrum based on the RSSI value of the BSSes on the channel and number of BSS DEPENDENCIES NA. PARAMETERS IN pSpectInfoParams : Pointer to the tSpectInfoParams structure halHandle : Pointer to HAL handle pResult : Pointer to tScanResultHandle RETURN VALUE void : NULL SIDE EFFECTS ============================================================================*/ void sapComputeSpectWeight( tSapChSelSpectInfo* pSpectInfoParams, tHalHandle halHandle, tScanResultHandle pResult) { v_S7_t rssi = 0; v_U8_t chn_num = 0; v_U8_t channel_id = 0; tCsrScanResultInfo *pScanResult; tSapSpectChInfo *pSpectCh = pSpectInfoParams->pSpectCh; VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, Computing spectral weight", __FUNCTION__); /** * Soft AP specific channel weight calculation using DFS formula */ pScanResult = sme_ScanResultGetFirst(halHandle, pResult); while (pScanResult) { pSpectCh = pSpectInfoParams->pSpectCh; // Processing for each tCsrScanResultInfo in the tCsrScanResult DLink list for (chn_num = 0; chn_num < pSpectInfoParams->numSpectChans; chn_num++) { /* * if the Beacon has channel ID, use it other wise we will * rely on the channelIdSelf */ if(pScanResult->BssDescriptor.channelId == 0) channel_id = pScanResult->BssDescriptor.channelIdSelf; else channel_id = pScanResult->BssDescriptor.channelId; if (channel_id == pSpectCh->chNum) { if (pSpectCh->rssiAgr < pScanResult->BssDescriptor.rssi) pSpectCh->rssiAgr = pScanResult->BssDescriptor.rssi; ++pSpectCh->bssCount; // Increment the count of BSS VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, bssdes.ch_self=%d, bssdes.ch_ID=%d, bssdes.rssi=%d, SpectCh.bssCount=%d, pScanResult=0x%x", __FUNCTION__, pScanResult->BssDescriptor.channelIdSelf, pScanResult->BssDescriptor.channelId, pScanResult->BssDescriptor.rssi, pSpectCh->bssCount, pScanResult); pSpectCh++; break; } else { pSpectCh++; } } pScanResult = sme_ScanResultGetNext(halHandle, pResult); } // Calculate the weights for all channels in the spectrum pSpectCh pSpectCh = pSpectInfoParams->pSpectCh; VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, Spectrum Channels Weight", __FUNCTION__); for (chn_num = 0; chn_num < (pSpectInfoParams->numSpectChans); chn_num++) { /* rssi : Maximum received signal strength among all BSS on that channel bssCount : Number of BSS on that channel */ rssi = (v_S7_t)pSpectCh->rssiAgr; pSpectCh->weight = SAPDFS_NORMALISE_1000 * sapweightRssiCount(rssi, pSpectCh->bssCount); //------ Debug Info ------ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, Chan=%d Weight= %d rssiAgr=%d bssCount=%d", __FUNCTION__, pSpectCh->chNum, pSpectCh->weight, pSpectCh->rssiAgr, pSpectCh->bssCount); //------ Debug Info ------ pSpectCh++; } }