diff --git a/os_if/linux/spectral/inc/wlan_cfg80211_spectral.h b/os_if/linux/spectral/inc/wlan_cfg80211_spectral.h index fc04f58c4f..17bc0b39bd 100644 --- a/os_if/linux/spectral/inc/wlan_cfg80211_spectral.h +++ b/os_if/linux/spectral/inc/wlan_cfg80211_spectral.h @@ -60,6 +60,7 @@ void wlan_cfg80211_register_spectral_cmd_handler(struct wlan_objmgr_pdev *pdev, * wlan_cfg80211_spectral_scan_config_and_start() - Start spectral scan * @wiphy: Pointer to wiphy * @pdev: Pointer to pdev + * @vdev: Pointer to vdev * @data: Reference to data * @data_len: Length of @data * @@ -67,6 +68,7 @@ void wlan_cfg80211_register_spectral_cmd_handler(struct wlan_objmgr_pdev *pdev, */ int wlan_cfg80211_spectral_scan_config_and_start(struct wiphy *wiphy, struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_vdev *vdev, const void *data, int data_len); @@ -74,6 +76,7 @@ int wlan_cfg80211_spectral_scan_config_and_start(struct wiphy *wiphy, * wlan_cfg80211_spectral_scan_stop() - Stop spectral scan * @wiphy: Pointer to wiphy * @pdev: Pointer to pdev + * @vdev: Pointer to vdev * @data: Reference to data * @data_len: Length of @data * @@ -81,6 +84,7 @@ int wlan_cfg80211_spectral_scan_config_and_start(struct wiphy *wiphy, */ int wlan_cfg80211_spectral_scan_stop(struct wiphy *wiphy, struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_vdev *vdev, const void *data, int data_len); @@ -88,6 +92,7 @@ int wlan_cfg80211_spectral_scan_stop(struct wiphy *wiphy, * wlan_cfg80211_spectral_scan_get_config() - Get spectral scan config * @wiphy: Pointer to wiphy * @pdev: Pointer to pdev + * @vdev: Pointer to vdev * @data: Reference to data * @data_len: Length of @data * @@ -95,6 +100,7 @@ int wlan_cfg80211_spectral_scan_stop(struct wiphy *wiphy, */ int wlan_cfg80211_spectral_scan_get_config(struct wiphy *wiphy, struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_vdev *vdev, const void *data, int data_len); @@ -102,6 +108,7 @@ int wlan_cfg80211_spectral_scan_get_config(struct wiphy *wiphy, * wlan_cfg80211_spectral_scan_get_cap() - Get spectral system capabilities * @wiphy: Pointer to wiphy * @pdev: Pointer to pdev + * @vdev: Pointer to vdev * @data: Reference to data * @data_len: Length of @data * @@ -109,6 +116,7 @@ int wlan_cfg80211_spectral_scan_get_config(struct wiphy *wiphy, */ int wlan_cfg80211_spectral_scan_get_cap(struct wiphy *wiphy, struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_vdev *vdev, const void *data, int data_len); @@ -116,6 +124,7 @@ int wlan_cfg80211_spectral_scan_get_cap(struct wiphy *wiphy, * wlan_cfg80211_spectral_scan_get_diag_stats() - Get spectral diag stats * @wiphy: Pointer to wiphy * @pdev: Pointer to pdev + * @vdev: Pointer to vdev * @data: Reference to data * @data_len: Length of @data * @@ -123,6 +132,7 @@ int wlan_cfg80211_spectral_scan_get_cap(struct wiphy *wiphy, */ int wlan_cfg80211_spectral_scan_get_diag_stats(struct wiphy *wiphy, struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_vdev *vdev, const void *data, int data_len); @@ -130,6 +140,7 @@ int wlan_cfg80211_spectral_scan_get_diag_stats(struct wiphy *wiphy, * wlan_cfg80211_spectral_scan_get_status() - Get spectral scan status * @wiphy: Pointer to wiphy * @pdev: Pointer to pdev + * @vdev: Pointer to vdev * @data: Reference to data * @data_len: Length of @data * @@ -137,12 +148,14 @@ int wlan_cfg80211_spectral_scan_get_diag_stats(struct wiphy *wiphy, */ int wlan_cfg80211_spectral_scan_get_status(struct wiphy *wiphy, struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_vdev *vdev, const void *data, int data_len); /** * wlan_cfg80211_spectral_scan_dma_debug_config() - configure DMA debug * @pdev: Pointer to pdev + * @vdev: Pointer to vdev * @tb: Pointer to Spectral Scan config attribute * @sscan_mode: Spectral scan mode * @@ -150,6 +163,7 @@ int wlan_cfg80211_spectral_scan_get_status(struct wiphy *wiphy, */ QDF_STATUS wlan_cfg80211_spectral_scan_dma_debug_config( struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_vdev *vdev, struct nlattr **tb, enum spectral_scan_mode sscan_mode); #endif diff --git a/os_if/linux/spectral/src/wlan_cfg80211_spectral.c b/os_if/linux/spectral/src/wlan_cfg80211_spectral.c index 6e270cd9af..e55d4f0c00 100644 --- a/os_if/linux/spectral/src/wlan_cfg80211_spectral.c +++ b/os_if/linux/spectral/src/wlan_cfg80211_spectral.c @@ -31,6 +31,7 @@ #include #include #include +#include const struct nla_policy spectral_scan_policy[ QCA_WLAN_VENDOR_ATTR_SPECTRAL_SCAN_CONFIG_MAX + 1] = { @@ -191,6 +192,7 @@ convert_spectral_err_code_internal_to_nl #ifdef DIRECT_BUF_RX_DEBUG QDF_STATUS wlan_cfg80211_spectral_scan_dma_debug_config( struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_vdev *vdev, struct nlattr **tb, enum spectral_scan_mode sscan_mode) { @@ -232,6 +234,7 @@ QDF_STATUS wlan_cfg80211_spectral_scan_dma_debug_config( #else QDF_STATUS wlan_cfg80211_spectral_scan_dma_debug_config( struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_vdev *vdev, struct nlattr **tb, enum spectral_scan_mode sscan_mode) { @@ -241,6 +244,7 @@ QDF_STATUS wlan_cfg80211_spectral_scan_dma_debug_config( int wlan_cfg80211_spectral_scan_config_and_start(struct wiphy *wiphy, struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_vdev *vdev, const void *data, int data_len) { @@ -392,12 +396,17 @@ int wlan_cfg80211_spectral_scan_config_and_start(struct wiphy *wiphy, } status = wlan_cfg80211_spectral_scan_dma_debug_config( - pdev, tb, sscan_mode); + pdev, vdev, tb, sscan_mode); if (QDF_IS_STATUS_ERROR(status)) { status = QDF_STATUS_E_INVAL; goto free_skb_return_os_status; } + if (vdev) + sscan_req.vdev_id = wlan_vdev_get_id(vdev); + else + sscan_req.vdev_id = WLAN_INVALID_VDEV_ID; + if (CONFIG_REQUESTED(scan_req_type)) { sscan_req.ss_mode = sscan_mode; sscan_req.req_id = SPECTRAL_SET_CONFIG; @@ -480,6 +489,7 @@ free_skb_return_os_status: int wlan_cfg80211_spectral_scan_stop(struct wiphy *wiphy, struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_vdev *vdev, const void *data, int data_len) { @@ -548,6 +558,7 @@ int wlan_cfg80211_spectral_scan_stop(struct wiphy *wiphy, int wlan_cfg80211_spectral_scan_get_config(struct wiphy *wiphy, struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_vdev *vdev, const void *data, int data_len) { @@ -678,6 +689,7 @@ fail: int wlan_cfg80211_spectral_scan_get_cap(struct wiphy *wiphy, struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_vdev *vdev, const void *data, int data_len) { @@ -829,6 +841,7 @@ fail: int wlan_cfg80211_spectral_scan_get_diag_stats(struct wiphy *wiphy, struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_vdev *vdev, const void *data, int data_len) { @@ -880,6 +893,7 @@ int wlan_cfg80211_spectral_scan_get_diag_stats(struct wiphy *wiphy, int wlan_cfg80211_spectral_scan_get_status(struct wiphy *wiphy, struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_vdev *vdev, const void *data, int data_len) { diff --git a/spectral/core/spectral_common.c b/spectral/core/spectral_common.c index 3a1471146f..2ad9e7d16b 100644 --- a/spectral/core/spectral_common.c +++ b/spectral/core/spectral_common.c @@ -32,6 +32,7 @@ * spectral_get_vdev() - Get pointer to vdev to be used for Spectral * operations * @pdev: Pointer to pdev + * @vdev_id: vdev_id * * Spectral operates on pdev. However, in order to retrieve some WLAN * properties, a vdev is required. To facilitate this, the function returns the @@ -50,14 +51,17 @@ * Return: Pointer to vdev on success, NULL on failure */ static struct wlan_objmgr_vdev* -spectral_get_vdev(struct wlan_objmgr_pdev *pdev) +spectral_get_vdev(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id) { struct wlan_objmgr_vdev *vdev = NULL; qdf_assert_always(pdev); - vdev = wlan_objmgr_pdev_get_first_vdev(pdev, WLAN_SPECTRAL_ID); - + if (vdev_id == WLAN_INVALID_VDEV_ID) + vdev = wlan_objmgr_pdev_get_first_vdev(pdev, WLAN_SPECTRAL_ID); + else + vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id, + WLAN_SPECTRAL_ID); if (!vdev) { spectral_warn("Unable to get first vdev of pdev"); return NULL; @@ -318,7 +322,7 @@ spectral_control_cmn(struct wlan_objmgr_pdev *pdev, * Check if any of the inactive Rx antenna * chains is set active in spectral chainmask */ - vdev = spectral_get_vdev(pdev); + vdev = spectral_get_vdev(pdev, sscan_req->vdev_id); if (!vdev) goto bad; @@ -406,7 +410,8 @@ spectral_control_cmn(struct wlan_objmgr_pdev *pdev, case SPECTRAL_ACTIVATE_SCAN: err = &sscan_req->action_req.sscan_err_code; - ret = sc->sptrlc_start_spectral_scan(pdev, smode, err); + ret = sc->sptrlc_start_spectral_scan(pdev, sscan_req->vdev_id, + smode, err); if (QDF_IS_STATUS_ERROR(ret)) goto bad; break; @@ -440,7 +445,7 @@ spectral_control_cmn(struct wlan_objmgr_pdev *pdev, { uint32_t chan_width; - vdev = spectral_get_vdev(pdev); + vdev = spectral_get_vdev(pdev, sscan_req->vdev_id); if (!vdev) goto bad; diff --git a/spectral/core/spectral_defs_i.h b/spectral/core/spectral_defs_i.h index e687746009..aff670faf0 100644 --- a/spectral/core/spectral_defs_i.h +++ b/spectral/core/spectral_defs_i.h @@ -150,6 +150,7 @@ struct spectral_context { const enum spectral_scan_mode smode); QDF_STATUS (*sptrlc_start_spectral_scan) (struct wlan_objmgr_pdev *pdev, + uint8_t vdev_id, const enum spectral_scan_mode smode, enum spectral_cp_error_code *err); QDF_STATUS (*sptrlc_stop_spectral_scan) diff --git a/spectral/dispatcher/inc/wlan_spectral_public_structs.h b/spectral/dispatcher/inc/wlan_spectral_public_structs.h index a822d2aecf..b2e7b810fd 100644 --- a/spectral/dispatcher/inc/wlan_spectral_public_structs.h +++ b/spectral/dispatcher/inc/wlan_spectral_public_structs.h @@ -421,11 +421,13 @@ struct spectral_scan_dma_debug_request { * be atomic. * @ss_mode: Spectral scan mode * @req_id: Request identifier + * @vdev_id: VDEV id * @dma_debug_req: Spectral DMA debug request */ struct spectral_cp_request { enum spectral_scan_mode ss_mode; uint8_t req_id; + uint8_t vdev_id; union { struct spectral_scan_config_request config_req; struct spectral_scan_action_request action_req; diff --git a/spectral/dispatcher/inc/wlan_spectral_tgt_api.h b/spectral/dispatcher/inc/wlan_spectral_tgt_api.h index c1ae3f5c97..0b2bb15546 100644 --- a/spectral/dispatcher/inc/wlan_spectral_tgt_api.h +++ b/spectral/dispatcher/inc/wlan_spectral_tgt_api.h @@ -127,6 +127,7 @@ QDF_STATUS tgt_get_spectral_config(struct wlan_objmgr_pdev *pdev, /** * tgt_start_spectral_scan() - Start spectral scan * @pdev: Pointer to pdev object + * @vdev_id: VDEV id * @smode: Spectral scan mode * @err: Spectral control path error code * @@ -135,6 +136,7 @@ QDF_STATUS tgt_get_spectral_config(struct wlan_objmgr_pdev *pdev, * Return: QDF_STATUS_SUCCESS on success, else QDF_STATUS_E_FAILURE */ QDF_STATUS tgt_start_spectral_scan(struct wlan_objmgr_pdev *pdev, + uint8_t vdev_id, enum spectral_scan_mode smode, enum spectral_cp_error_code *err); diff --git a/spectral/dispatcher/src/wlan_spectral_tgt_api.c b/spectral/dispatcher/src/wlan_spectral_tgt_api.c index 7db316dd24..fea4178dac 100644 --- a/spectral/dispatcher/src/wlan_spectral_tgt_api.c +++ b/spectral/dispatcher/src/wlan_spectral_tgt_api.c @@ -197,6 +197,7 @@ tgt_get_spectral_config(struct wlan_objmgr_pdev *pdev, QDF_STATUS tgt_start_spectral_scan(struct wlan_objmgr_pdev *pdev, + uint8_t vdev_id, enum spectral_scan_mode smode, enum spectral_cp_error_code *err) { @@ -210,8 +211,8 @@ tgt_start_spectral_scan(struct wlan_objmgr_pdev *pdev, return QDF_STATUS_E_FAILURE; } - return tx_ops->sptrl_tx_ops.sptrlto_start_spectral_scan(pdev, smode, - err); + return tx_ops->sptrl_tx_ops.sptrlto_start_spectral_scan(pdev, vdev_id, + smode, err); } QDF_STATUS diff --git a/target_if/spectral/target_if_spectral.c b/target_if/spectral/target_if_spectral.c index 06cfd4de4b..8aa1772a54 100644 --- a/target_if/spectral/target_if_spectral.c +++ b/target_if/spectral/target_if_spectral.c @@ -54,7 +54,8 @@ static void target_if_spectral_get_firstvdev_pdev(struct wlan_objmgr_pdev *pdev, } struct wlan_objmgr_vdev * -target_if_spectral_get_vdev(struct target_if_spectral *spectral) +target_if_spectral_get_vdev(struct target_if_spectral *spectral, + enum spectral_scan_mode smode) { struct wlan_objmgr_pdev *pdev = NULL; struct wlan_objmgr_vdev *first_vdev = NULL; @@ -63,6 +64,18 @@ target_if_spectral_get_vdev(struct target_if_spectral *spectral) pdev = spectral->pdev_obj; qdf_assert_always(pdev); + if (smode >= SPECTRAL_SCAN_MODE_MAX) { + spectral_err("Invalid Spectral mode %u", smode); + return NULL; + } + + if (spectral->vdev_id[smode] != WLAN_INVALID_VDEV_ID) { + first_vdev = wlan_objmgr_get_vdev_by_id_from_pdev( + pdev, spectral->vdev_id[smode], + WLAN_SPECTRAL_ID); + return first_vdev; + } + if (wlan_objmgr_pdev_try_get_ref(pdev, WLAN_SPECTRAL_ID) != QDF_STATUS_SUCCESS) { spectral_err("Unable to get pdev reference."); @@ -82,7 +95,6 @@ target_if_spectral_get_vdev(struct target_if_spectral *spectral) QDF_STATUS_SUCCESS) first_vdev = NULL; - return first_vdev; } @@ -124,7 +136,7 @@ target_if_send_vdev_spectral_configure_cmd(struct target_if_spectral *spectral, return qdf_status_to_os_return(QDF_STATUS_E_FAILURE); } - vdev = target_if_spectral_get_vdev(spectral); + vdev = target_if_spectral_get_vdev(spectral, smode); if (!vdev) return QDF_STATUS_E_NOENT; @@ -205,7 +217,7 @@ target_if_send_vdev_spectral_enable_cmd(struct target_if_spectral *spectral, return qdf_status_to_os_return(QDF_STATUS_E_FAILURE); } - vdev = target_if_spectral_get_vdev(spectral); + vdev = target_if_spectral_get_vdev(spectral, smode); if (!vdev) return QDF_STATUS_E_NOENT; @@ -308,7 +320,7 @@ target_if_spectral_info_init_defaults(struct target_if_spectral *spectral, info->osps_cache.osc_params.ss_dbm_adj = SPECTRAL_SCAN_DBM_ADJ_DEFAULT; - vdev = target_if_spectral_get_vdev(spectral); + vdev = target_if_spectral_get_vdev(spectral, smode); if (!vdev) return QDF_STATUS_E_NOENT; @@ -1138,6 +1150,7 @@ target_if_sops_stop_spectral_scan(void *arg, enum spectral_scan_mode smode) /** * target_if_spectral_get_extension_channel() - Get the Extension channel * @arg: Pointer to handle for Spectral target_if internal private data + * @smode: Spectral scan mode * * Function to get the current Extension channel (in MHz) * @@ -1145,7 +1158,8 @@ target_if_sops_stop_spectral_scan(void *arg, enum spectral_scan_mode smode) * extension channel is not present. */ uint32_t -target_if_spectral_get_extension_channel(void *arg) +target_if_spectral_get_extension_channel(void *arg, + enum spectral_scan_mode smode) { /* * XXX: Once we expand to use cases where Spectral could be activated @@ -1160,7 +1174,11 @@ target_if_spectral_get_extension_channel(void *arg) qdf_assert_always(arg); spectral = (struct target_if_spectral *)arg; - vdev = target_if_spectral_get_vdev(spectral); + if (smode >= SPECTRAL_SCAN_MODE_MAX) { + spectral_err("Invalid Spectral mode %u", smode); + return 0; + } + vdev = target_if_spectral_get_vdev(spectral, smode); if (!vdev) return 0; @@ -1177,13 +1195,14 @@ target_if_spectral_get_extension_channel(void *arg) /** * target_if_spectral_get_current_channel() - Get the current channel * @arg: Pointer to handle for Spectral target_if internal private data + * @smode: Spectral scan mode * * Function to get the current channel (in MHz) * * Return: Current channel (in MHz) on success, 0 on failure */ uint32_t -target_if_spectral_get_current_channel(void *arg) +target_if_spectral_get_current_channel(void *arg, enum spectral_scan_mode smode) { /* * XXX: Once we expand to use cases where Spectral could be activated @@ -1198,7 +1217,11 @@ target_if_spectral_get_current_channel(void *arg) qdf_assert_always(arg); spectral = (struct target_if_spectral *)arg; - vdev = target_if_spectral_get_vdev(spectral); + if (smode >= SPECTRAL_SCAN_MODE_MAX) { + spectral_err("Invalid Spectral mode %u", smode); + return 0; + } + vdev = target_if_spectral_get_vdev(spectral, smode); if (!vdev) return 0; @@ -1804,7 +1827,7 @@ null_stop_spectral_scan(void *arg, enum spectral_scan_mode smode) } static uint32_t -null_get_extension_channel(void *arg) +null_get_extension_channel(void *arg, enum spectral_scan_mode smode) { spectral_ops_not_registered("get_extension_channel"); return 1; @@ -1855,7 +1878,7 @@ null_get_mac_address(void *arg, char *addr) } static uint32_t -null_get_current_channel(void *arg) +null_get_current_channel(void *arg, enum spectral_scan_mode smode) { spectral_ops_not_registered("get_current_channel"); return 0; @@ -2301,6 +2324,8 @@ target_if_pdev_spectral_init(struct wlan_objmgr_pdev *pdev) qdf_mem_zero(spectral, sizeof(struct target_if_spectral)); /* Store pdev in Spectral */ spectral->pdev_obj = pdev; + spectral->vdev_id[SPECTRAL_SCAN_MODE_NORMAL] = WLAN_INVALID_VDEV_ID; + spectral->vdev_id[SPECTRAL_SCAN_MODE_AGILE] = WLAN_INVALID_VDEV_ID; psoc = wlan_pdev_get_psoc(pdev); @@ -2899,7 +2924,7 @@ target_if_is_agile_span_overlap_with_operating_span } *is_overlapping = false; - vdev = target_if_spectral_get_vdev(spectral); + vdev = target_if_spectral_get_vdev(spectral, SPECTRAL_SCAN_MODE_AGILE); if (!vdev) { spectral_err("vdev is NULL"); return QDF_STATUS_E_FAILURE; @@ -3021,7 +3046,7 @@ target_if_spectral_populate_chwidth(struct target_if_spectral *spectral, return QDF_STATUS_E_INVAL; } - vdev = target_if_spectral_get_vdev(spectral); + vdev = target_if_spectral_get_vdev(spectral, SPECTRAL_SCAN_MODE_NORMAL); if (!vdev) { spectral_err("vdev is null"); return QDF_STATUS_E_FAILURE; @@ -3489,8 +3514,8 @@ target_if_get_fft_bin_count(int fft_len) /** * target_if_init_upper_lower_flags() - Initializes control and extension * segment flags - * @fft_len: FFT length - * @pdev: Pointer to pdev object + * @spectral: pointer to target if spectral object + * @smode: Spectral scan mode * * API to initialize the control and extension flags with the lower/upper * segment based on the HT mode @@ -3498,15 +3523,20 @@ target_if_get_fft_bin_count(int fft_len) * Return: FFt bin count */ static void -target_if_init_upper_lower_flags(struct target_if_spectral *spectral) +target_if_init_upper_lower_flags(struct target_if_spectral *spectral, + enum spectral_scan_mode smode) { int current_channel = 0; int ext_channel = 0; struct target_if_spectral_ops *p_sops = GET_TARGET_IF_SPECTRAL_OPS(spectral); - current_channel = p_sops->get_current_channel(spectral); - ext_channel = p_sops->get_extension_channel(spectral); + if (smode >= SPECTRAL_SCAN_MODE_MAX) { + spectral_err("Invalid Spectral mode %u", smode); + return; + } + current_channel = p_sops->get_current_channel(spectral, smode); + ext_channel = p_sops->get_extension_channel(spectral, smode); if ((current_channel == 0) || (ext_channel == 0)) return; @@ -3636,8 +3666,8 @@ target_if_spectral_scan_enable_params(struct target_if_spectral *spectral, spectral_params->ss_spectral_pri ? 1 : 0; /* check if extension channel is present */ - extension_channel = p_sops->get_extension_channel(spectral); - current_channel = p_sops->get_current_channel(spectral); + extension_channel = p_sops->get_extension_channel(spectral, smode); + current_channel = p_sops->get_current_channel(spectral, smode); status = target_if_spectral_populate_chwidth( spectral, spectral->ch_width, @@ -3895,7 +3925,7 @@ target_if_spectral_scan_enable_params(struct target_if_spectral *spectral, /* get current spectral configuration */ p_sops->get_spectral_config(spectral, &spectral->params[smode], smode); - target_if_init_upper_lower_flags(spectral); + target_if_init_upper_lower_flags(spectral, smode); return 0; } @@ -3946,14 +3976,14 @@ target_if_is_aspectral_prohibited_by_adfs(struct wlan_objmgr_psoc *psoc, /** * target_if_get_curr_band() - Get current operating band of pdev * - * @spectral: pointer to spectral object + * @pdev: pointer to pdev object * * API to get current operating band of a given pdev. * * Return: if success enum reg_wifi_band, REG_BAND_UNKNOWN in case of failure */ static enum reg_wifi_band -target_if_get_curr_band(struct wlan_objmgr_pdev *pdev) +target_if_get_curr_band(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id) { struct wlan_objmgr_vdev *vdev; int16_t chan_freq; @@ -3964,7 +3994,11 @@ target_if_get_curr_band(struct wlan_objmgr_pdev *pdev) return REG_BAND_UNKNOWN; } - vdev = wlan_objmgr_pdev_get_first_vdev(pdev, WLAN_SPECTRAL_ID); + if (vdev_id == WLAN_INVALID_VDEV_ID) + vdev = wlan_objmgr_pdev_get_first_vdev(pdev, WLAN_SPECTRAL_ID); + else + vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id, + WLAN_SPECTRAL_ID); if (!vdev) { spectral_debug("vdev is NULL"); return REG_BAND_UNKNOWN; @@ -4006,7 +4040,8 @@ target_if_is_agile_scan_active_in_5g(struct wlan_objmgr_psoc *psoc, } p_sops = GET_TARGET_IF_SPECTRAL_OPS(spectral); - band = target_if_get_curr_band(cur_pdev); + band = target_if_get_curr_band( + cur_pdev, spectral->vdev_id[SPECTRAL_SCAN_MODE_AGILE]); if (band == REG_BAND_UNKNOWN) { spectral_debug("Failed to get current band"); return; @@ -4071,7 +4106,7 @@ target_if_is_agile_supported_cur_chmask(struct target_if_spectral *spectral, return QDF_STATUS_E_FAILURE; } - vdev = target_if_spectral_get_vdev(spectral); + vdev = target_if_spectral_get_vdev(spectral, SPECTRAL_SCAN_MODE_AGILE); if (!vdev) { spectral_err("First vdev is NULL"); return QDF_STATUS_E_FAILURE; @@ -4147,6 +4182,7 @@ target_if_is_agile_supported_cur_chmask(struct target_if_spectral *spectral, QDF_STATUS target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev, + uint8_t vdev_id, const enum spectral_scan_mode smode, enum spectral_cp_error_code *err) { @@ -4191,6 +4227,13 @@ target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev, return QDF_STATUS_E_FAILURE; } + if (p_sops->is_spectral_active(spectral, smode)) { + spectral_err("spectral in progress in current pdev, mode %d", + smode); + return QDF_STATUS_E_FAILURE; + } + spectral->vdev_id[smode] = vdev_id; + if (smode == SPECTRAL_SCAN_MODE_AGILE) { QDF_STATUS status; bool is_supported = false; @@ -4209,7 +4252,7 @@ target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev, } } - band = target_if_get_curr_band(spectral->pdev_obj); + band = target_if_get_curr_band(spectral->pdev_obj, vdev_id); if (band == REG_BAND_UNKNOWN) { spectral_err("Failed to get current band"); return QDF_STATUS_E_FAILURE; @@ -4219,12 +4262,6 @@ target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev, enum wmi_host_hw_mode_config_type mode; bool is_agile_scan_inprog_5g_pdev; - if (p_sops->is_spectral_active(spectral, - SPECTRAL_SCAN_MODE_AGILE)) { - spectral_err("Agile Scan in progress in current pdev"); - return QDF_STATUS_E_FAILURE; - } - tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc); if (!tgt_hdl) { target_if_err("target_psoc_info is null"); @@ -4386,6 +4423,7 @@ target_if_stop_spectral_scan(struct wlan_objmgr_pdev *pdev, spectral->send_single_packet = 0; spectral->sc_spectral_scan = 0; + spectral->vdev_id[smode] = WLAN_INVALID_VDEV_ID; qdf_spin_unlock(&spectral->spectral_lock); diff --git a/target_if/spectral/target_if_spectral.h b/target_if/spectral/target_if_spectral.h index 6de5faf47a..10b06a566a 100644 --- a/target_if/spectral/target_if_spectral.h +++ b/target_if/spectral/target_if_spectral.h @@ -669,7 +669,8 @@ struct target_if_spectral_ops { enum spectral_cp_error_code *err); uint32_t (*stop_spectral_scan)(void *arg, enum spectral_scan_mode smode); - uint32_t (*get_extension_channel)(void *arg); + uint32_t (*get_extension_channel)(void *arg, + enum spectral_scan_mode smode); int8_t (*get_ctl_noisefloor)(void *arg); int8_t (*get_ext_noisefloor)(void *arg); uint32_t (*configure_spectral)( @@ -682,7 +683,8 @@ struct target_if_spectral_ops { enum spectral_scan_mode smode); uint32_t (*get_ent_spectral_mask)(void *arg); uint32_t (*get_mac_address)(void *arg, char *addr); - uint32_t (*get_current_channel)(void *arg); + uint32_t (*get_current_channel)(void *arg, + enum spectral_scan_mode smode); uint32_t (*reset_hw)(void *arg); uint32_t (*get_chain_noise_floor)(void *arg, int16_t *nf_buf); int (*spectral_process_phyerr)(struct target_if_spectral *spectral, @@ -886,6 +888,7 @@ struct spectral_param_properties { * @capability: Spectral capabilities structure * @properties: Spectral parameter properties per mode * @spectral_lock: Lock used for internal Spectral operations + * @vdev_id: VDEV id for all spectral modes * @spectral_curchan_radindex: Current channel spectral index * @spectral_extchan_radindex: Extension channel spectral index * @spectraldomain: Current Spectral domain @@ -980,6 +983,7 @@ struct target_if_spectral { struct spectral_param_properties properties[SPECTRAL_SCAN_MODE_MAX][SPECTRAL_PARAM_MAX]; qdf_spinlock_t spectral_lock; + uint8_t vdev_id[SPECTRAL_SCAN_MODE_MAX]; int16_t spectral_curchan_radindex; int16_t spectral_extchan_radindex; uint32_t spectraldomain; @@ -1340,6 +1344,7 @@ QDF_STATUS target_if_stop_spectral_scan(struct wlan_objmgr_pdev *pdev, * target_if_spectral_get_vdev() - Get pointer to vdev to be used for Spectral * operations * @spectral: Pointer to Spectral target_if internal private data + * @smode: spectral scan mode * * Spectral operates on pdev. However, in order to retrieve some WLAN * properties, a vdev is required. To facilitate this, the function returns the @@ -1351,7 +1356,8 @@ QDF_STATUS target_if_stop_spectral_scan(struct wlan_objmgr_pdev *pdev, * Return: Pointer to vdev on success, NULL on failure */ struct wlan_objmgr_vdev *target_if_spectral_get_vdev( - struct target_if_spectral *spectral); + struct target_if_spectral *spectral, + enum spectral_scan_mode smode); /** * target_if_spectral_dump_hdr_gen2() - Dump Spectral header for gen2 @@ -1952,19 +1958,25 @@ uint32_t target_if_sops_stop_spectral_scan(void *arg, * target_if_spectral_get_extension_channel() - Get the current Extension * channel (in MHz) * @arg: Pointer to handle for Spectral target_if internal private data + * @smode: Spectral scan mode * * Return: Current Extension channel (in MHz) on success, 0 on failure or if * extension channel is not present. */ -uint32_t target_if_spectral_get_extension_channel(void *arg); +uint32_t +target_if_spectral_get_extension_channel(void *arg, + enum spectral_scan_mode smode); /** * target_if_spectral_get_current_channel() - Get the current channel (in MHz) * @arg: Pointer to handle for Spectral target_if internal private data + * @smode: Spectral scan mode * * Return: Current channel (in MHz) on success, 0 on failure */ -uint32_t target_if_spectral_get_current_channel(void *arg); +uint32_t +target_if_spectral_get_current_channel(void *arg, + enum spectral_scan_mode smode); /** @@ -2127,6 +2139,7 @@ target_if_init_spectral_capability(struct target_if_spectral *spectral, /** * target_if_start_spectral_scan() - Start spectral scan * @pdev: Pointer to pdev object + * @vdev_id: VDEV id * @smode: Spectral scan mode * @err: Spectral error code * @@ -2135,6 +2148,7 @@ target_if_init_spectral_capability(struct target_if_spectral *spectral, * Return: QDF_STATUS_SUCCESS in case of success, else QDF_STATUS_E_FAILURE */ QDF_STATUS target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev, + uint8_t vdev_id, enum spectral_scan_mode smode, enum spectral_cp_error_code *err); diff --git a/target_if/spectral/target_if_spectral_phyerr.c b/target_if/spectral/target_if_spectral_phyerr.c index 5c5c082181..471cc8bcd4 100644 --- a/target_if/spectral/target_if_spectral_phyerr.c +++ b/target_if/spectral/target_if_spectral_phyerr.c @@ -972,7 +972,8 @@ target_if_process_phyerr_gen2(struct target_if_spectral *spectral, params.max_exp = 0; params.peak = 0; params.bin_pwr_data = (uint8_t *)pfft; - params.freq = p_sops->get_current_channel(spectral); + params.freq = p_sops->get_current_channel(spectral, + params.smode); params.freq_loading = 0; params.interf_list.count = 0; @@ -1970,7 +1971,7 @@ target_if_consume_spectral_report_gen3( params.rssi = rssi; - vdev = target_if_spectral_get_vdev(spectral); + vdev = target_if_spectral_get_vdev(spectral, spectral_mode); if (!vdev) { spectral_info("First vdev is NULL"); reset_160mhz_delivery_state_machine( @@ -1991,7 +1992,8 @@ target_if_consume_spectral_report_gen3( params.max_mag = p_sfft->fft_peak_mag; - params.freq = p_sops->get_current_channel(spectral); + params.freq = p_sops->get_current_channel(spectral, + spectral_mode); params.agile_freq1 = spectral->params[SPECTRAL_SCAN_MODE_AGILE]. ss_frequency.cfreq1; params.agile_freq2 = spectral->params[SPECTRAL_SCAN_MODE_AGILE]. @@ -2112,7 +2114,7 @@ target_if_consume_spectral_report_gen3( params.rssi_sec80 = rssi; - vdev = target_if_spectral_get_vdev(spectral); + vdev = target_if_spectral_get_vdev(spectral, spectral_mode); if (!vdev) { spectral_info("First vdev is NULL"); reset_160mhz_delivery_state_machine diff --git a/target_if/spectral/target_if_spectral_sim.c b/target_if/spectral/target_if_spectral_sim.c index ccbe8b7bed..421d32aeab 100644 --- a/target_if/spectral/target_if_spectral_sim.c +++ b/target_if/spectral/target_if_spectral_sim.c @@ -841,7 +841,8 @@ target_if_log_sim_spectral_params(struct spectral_config *params) uint32_t target_if_spectral_sops_sim_configure_params( void *arg, - struct spectral_config *params) + struct spectral_config *params, + enum spectral_scan_mode smode) { struct target_if_spectral *spectral = NULL; struct spectralsim_context *simctx = NULL; @@ -860,7 +861,7 @@ target_if_spectral_sops_sim_configure_params( simctx = (struct spectralsim_context *)spectral->simctx; qdf_assert_always(simctx); - vdev = target_if_spectral_get_vdev(spectral); + vdev = target_if_spectral_get_vdev(spectral, smode); if (!vdev) { spectral_warn("Spectral simulation: No VAPs found - not proceeding with param config."); return 0; diff --git a/target_if/spectral/target_if_spectral_sim.h b/target_if/spectral/target_if_spectral_sim.h index 308186c1be..fe1ef5262a 100644 --- a/target_if/spectral/target_if_spectral_sim.h +++ b/target_if/spectral/target_if_spectral_sim.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015,2017-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2015,2017-2020 The Linux Foundation. All rights reserved. * * * Permission to use, copy, modify, and/or distribute this software for @@ -92,9 +92,10 @@ uint32_t target_if_spectral_sops_sim_stop_scan(void *arg); /** * target_if_spectral_sops_sim_configure_params() - Configure Spectral * parameters into simulation - * arg - pointer to ath_spectral structure - * params - pointer to struct spectral_config structure bearing Spectral + * @arg: pointer to ath_spectral structure + * @params: pointer to struct spectral_config structure bearing Spectral * configuration + * @smode: Spectral scan mode * * Internally, this function actually searches if a record set with the desired * configuration has been loaded. If so, it points to the record set for @@ -104,7 +105,8 @@ uint32_t target_if_spectral_sops_sim_stop_scan(void *arg); */ uint32_t target_if_spectral_sops_sim_configure_params( void *arg, - struct spectral_config *params); + struct spectral_config *params, + enum spectral_scan_mode smode); /** * target_if_spectral_sops_sim_get_params() - Get Spectral parameters configured diff --git a/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h b/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h index 6285cdcf15..55736ac1fe 100644 --- a/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h +++ b/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h @@ -633,6 +633,7 @@ struct wlan_lmac_if_sptrl_tx_ops { enum spectral_scan_mode smode); QDF_STATUS (*sptrlto_start_spectral_scan) (struct wlan_objmgr_pdev *pdev, + uint8_t vdev_id, const enum spectral_scan_mode smode, enum spectral_cp_error_code *err); QDF_STATUS (*sptrlto_stop_spectral_scan)