diff --git a/core/hdd/src/wlan_hdd_ioctl.c b/core/hdd/src/wlan_hdd_ioctl.c index e453dfd1e805..abd8f0d612df 100644 --- a/core/hdd/src/wlan_hdd_ioctl.c +++ b/core/hdd/src/wlan_hdd_ioctl.c @@ -4497,9 +4497,19 @@ static int drv_cmd_get_scan_n_probes(struct hdd_adapter *adapter, struct hdd_priv_data *priv_data) { int ret = 0; - uint8_t val = sme_get_roam_scan_n_probes(hdd_ctx->mac_handle); + uint8_t val; char extra[32]; uint8_t len = 0; + QDF_STATUS status; + + status = sme_get_roam_scan_n_probes(hdd_ctx->mac_handle, + adapter->vdev_id, + &val); + if (QDF_IS_STATUS_ERROR(status)) + return qdf_status_to_os_return(status); + + hdd_debug("vdev_id: %u, scan_n_probes: %u", + adapter->vdev_id, val); len = scnprintf(extra, sizeof(extra), "%s %d", command, val); len = QDF_MIN(priv_data->total_len, len + 1); diff --git a/core/sme/inc/csr_neighbor_roam.h b/core/sme/inc/csr_neighbor_roam.h index 9a5f728c23b2..f2f3271836af 100644 --- a/core/sme/inc/csr_neighbor_roam.h +++ b/core/sme/inc/csr_neighbor_roam.h @@ -68,6 +68,7 @@ typedef struct sCsrNeighborRoamCfgParams { bool enable_scoring_for_roam; uint8_t roam_rssi_diff; uint16_t roam_scan_home_away_time; + uint8_t roam_scan_n_probes; } tCsrNeighborRoamCfgParams, *tpCsrNeighborRoamCfgParams; #define CSR_NEIGHBOR_ROAM_INVALID_CHANNEL_INDEX 255 diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index c89e217faa59..b2ce9386744e 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -762,9 +762,17 @@ QDF_STATUS sme_set_custom_mac_addr(tSirMacAddr customMacAddr); QDF_STATUS sme_hide_ssid(mac_handle_t mac_handle, uint8_t sessionId, uint8_t ssidHidden); +/** + * sme_update_roam_scan_n_probes() - Update no.of roam scan probes + * @mac_handle: The handle returned by mac_open + * @vdev_id: vdev identifier + * @probes: number of probe requests to be sent out + * + * Return: QDF_STATUS + */ QDF_STATUS sme_update_roam_scan_n_probes(mac_handle_t mac_handle, - uint8_t sessionId, - const uint8_t nProbes); + uint8_t vdev_id, + const uint8_t probes); /** * sme_update_roam_scan_home_away_time() - Update roam scan Home away time @@ -782,7 +790,18 @@ sme_update_roam_scan_home_away_time(mac_handle_t mac_handle, uint8_t vdev_id, const bool send_offload_cmd); bool sme_get_roam_intra_band(mac_handle_t mac_handle); -uint8_t sme_get_roam_scan_n_probes(mac_handle_t mac_handle); + +/** + * sme_get_roam_scan_n_probes() - get Roam scan number of probes + * @mac_handle: The handle returned by mac_open + * @vdev_id: vdev identifier + * @roam_scan_n_probes: Buffer to fill the number of probes. + * Valid only if the return status is success. + * + * Return: QDF_STATUS + */ +QDF_STATUS sme_get_roam_scan_n_probes(mac_handle_t mac_handle, uint8_t vdev_id, + uint8_t *roam_scan_n_probes); /** * sme_update_roam_rssi_diff() - Update RoamRssiDiff diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 338d0872a0fb..45d420ecbee8 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -5716,41 +5716,37 @@ QDF_STATUS sme_update_session_param(mac_handle_t mac_handle, uint8_t session_id, return status; } -/* - * sme_update_roam_scan_n_probes() - - * Function to update roam scan N probes - * This function is called through dynamic setConfig callback function - * to update roam scan N probes - * mac_handle: Opaque handle to the global MAC context - * sessionId - Session Identifier - * nProbes number of probe requests to be sent out - * Return Success or failure - */ QDF_STATUS sme_update_roam_scan_n_probes(mac_handle_t mac_handle, - uint8_t sessionId, - const uint8_t nProbes) + uint8_t vdev_id, + const uint8_t probes) { struct mac_context *mac = MAC_CONTEXT(mac_handle); - QDF_STATUS status = QDF_STATUS_SUCCESS; + QDF_STATUS status; + tCsrNeighborRoamControlInfo *neighbor_roam_info; + if (vdev_id >= WLAN_MAX_VDEVS) { + sme_err("Invalid vdev_id: %d", vdev_id); + return QDF_STATUS_E_INVAL; + } MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_N_PROBES, - NO_SESSION, 0)); + vdev_id, 0)); status = sme_acquire_global_lock(&mac->sme); - if (QDF_IS_STATUS_SUCCESS(status)) { - QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG, - "%s: gRoamScanNProbes is changed from %d to %d", - __func__, mac->mlme_cfg->lfr.roam_scan_n_probes, - nProbes); - mac->mlme_cfg->lfr.roam_scan_n_probes = nProbes; - - if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) { - csr_roam_offload_scan(mac, sessionId, - ROAM_SCAN_OFFLOAD_UPDATE_CFG, - REASON_NPROBES_CHANGED); - } - sme_release_global_lock(&mac->sme); + if (QDF_IS_STATUS_ERROR(status)) { + sme_err("Failed to acquire sme lock; status: %d", status); + return status; } + neighbor_roam_info = &mac->roam.neighborRoamInfo[vdev_id]; + sme_debug("gRoamScanNProbes is changed from %u to %u", + neighbor_roam_info->cfgParams.roam_scan_n_probes, probes); + neighbor_roam_info->cfgParams.roam_scan_n_probes = probes; + + if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) + csr_roam_offload_scan(mac, vdev_id, + ROAM_SCAN_OFFLOAD_UPDATE_CFG, + REASON_NPROBES_CHANGED); + sme_release_global_lock(&mac->sme); + return status; } @@ -5856,18 +5852,28 @@ bool sme_get_roam_intra_band(mac_handle_t mac_handle) return mac->mlme_cfg->lfr.roam_intra_band; } -/* - * sme_get_roam_scan_n_probes() - - * get N Probes - * - * mac_handle: Opaque handle to the global MAC context - * Return Success or failure - */ -uint8_t sme_get_roam_scan_n_probes(mac_handle_t mac_handle) +QDF_STATUS sme_get_roam_scan_n_probes(mac_handle_t mac_handle, uint8_t vdev_id, + uint8_t *roam_scan_n_probes) { struct mac_context *mac = MAC_CONTEXT(mac_handle); + QDF_STATUS status; + tCsrNeighborRoamControlInfo *neighbor_roam_info; - return mac->mlme_cfg->lfr.roam_scan_n_probes; + if (vdev_id >= WLAN_MAX_VDEVS) { + sme_err("Invalid vdev_id: %d", vdev_id); + return QDF_STATUS_E_INVAL; + } + + status = sme_acquire_global_lock(&mac->sme); + if (QDF_IS_STATUS_ERROR(status)) { + sme_err("Failed to acquire sme lock; status: %d", status); + return status; + } + neighbor_roam_info = &mac->roam.neighborRoamInfo[vdev_id]; + *roam_scan_n_probes = neighbor_roam_info->cfgParams.roam_scan_n_probes; + sme_release_global_lock(&mac->sme); + + return status; } QDF_STATUS sme_get_roam_scan_home_away_time(mac_handle_t mac_handle, diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 927fb967ec89..5f29a04d7026 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -18300,7 +18300,7 @@ csr_create_roam_scan_offload_request(struct mac_context *mac_ctx, req_buf->mdid = mac_ctx->roam.roamSession[session_id].connectedProfile.mdid; req_buf->sessionId = session_id; - req_buf->nProbes = mac_ctx->mlme_cfg->lfr.roam_scan_n_probes; + req_buf->nProbes = roam_info->cfgParams.roam_scan_n_probes; req_buf->HomeAwayTime = roam_info->cfgParams.roam_scan_home_away_time; /*