diff --git a/os_if/linux/spectral/src/wlan_cfg80211_spectral.c b/os_if/linux/spectral/src/wlan_cfg80211_spectral.c index b2f932464b..b91247fb9a 100644 --- a/os_if/linux/spectral/src/wlan_cfg80211_spectral.c +++ b/os_if/linux/spectral/src/wlan_cfg80211_spectral.c @@ -938,6 +938,16 @@ int wlan_cfg80211_spectral_scan_get_cap(struct wiphy *wiphy, if (ret) goto fail; } + if (scaps->agile_spectral_cap_320) { + int ret; + + ret = nla_put_flag + (skb, + QCA_WLAN_VENDOR_ATTR_SPECTRAL_SCAN_CAP_AGILE_SPECTRAL_320); + if (ret) + goto fail; + } + if (nla_put_u32( skb, @@ -969,6 +979,12 @@ int wlan_cfg80211_spectral_scan_get_cap(struct wiphy *wiphy, scaps->num_detectors_80p80mhz)) goto fail; + if (nla_put_u32( + skb, + QCA_WLAN_VENDOR_ATTR_SPECTRAL_SCAN_CAP_NUM_DETECTORS_320_MHZ, + scaps->num_detectors_320mhz)) + goto fail; + wlan_cfg80211_qal_devcfg_send_response((qdf_nbuf_t)skb); return 0; diff --git a/spectral/dispatcher/inc/spectral_ioctl.h b/spectral/dispatcher/inc/spectral_ioctl.h index c85f0f47c4..f21d698bff 100644 --- a/spectral/dispatcher/inc/spectral_ioctl.h +++ b/spectral/dispatcher/inc/spectral_ioctl.h @@ -354,7 +354,7 @@ struct spectral_config { * @agile_spectral_cap: agile Spectral capability for 20/40/80 * @agile_spectral_cap_160: agile Spectral capability for 160 MHz * @agile_spectral_cap_80p80: agile Spectral capability for 80p80 - * @agile_spectral_cap_320: agile Spectral capability for 320 + * @agile_spectral_cap_320: agile Spectral capability for 320 MHz * @num_detectors_20mhz: number of Spectral detectors in 20 MHz * @num_detectors_40mhz: number of Spectral detectors in 40 MHz * @num_detectors_80mhz: number of Spectral detectors in 80 MHz diff --git a/spectral/dispatcher/src/wlan_spectral_utils_api.c b/spectral/dispatcher/src/wlan_spectral_utils_api.c index 4dc2e37bc1..d254a5ed35 100644 --- a/spectral/dispatcher/src/wlan_spectral_utils_api.c +++ b/spectral/dispatcher/src/wlan_spectral_utils_api.c @@ -45,7 +45,9 @@ bool wlan_spectral_is_mode_disabled_pdev(struct wlan_objmgr_pdev *pdev, wlan_pdev_nif_feat_ext_cap_get( pdev, WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_160_DIS) && wlan_pdev_nif_feat_ext_cap_get( - pdev, WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_80P80_DIS); + pdev, WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_80P80_DIS) && + wlan_pdev_nif_feat_ext_cap_get( + pdev, WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_320_DIS); break; default: diff --git a/target_if/spectral/target_if_spectral.c b/target_if/spectral/target_if_spectral.c index c6fad4237b..a4d87797ae 100644 --- a/target_if/spectral/target_if_spectral.c +++ b/target_if/spectral/target_if_spectral.c @@ -228,6 +228,8 @@ target_if_spectral_get_agile_mode_cap( agile_cap->agile_spectral_cap = false; agile_cap->agile_spectral_cap_160 = false; agile_cap->agile_spectral_cap_80p80 = false; + agile_cap->agile_spectral_cap_320 = false; + return QDF_STATUS_SUCCESS; } @@ -259,6 +261,7 @@ target_if_spectral_get_agile_mode_cap( table->cap_list[i].supports_aSpectral; agile_cap->agile_spectral_cap_160 |= table->cap_list[i].supports_aSpectral_160; + agile_cap->agile_spectral_cap_320 |= 0; } agile_cap->agile_spectral_cap_80p80 = agile_cap->agile_spectral_cap_160; @@ -327,6 +330,8 @@ target_if_spectral_init_pdev_feature_cap_per_mode(struct wlan_objmgr_pdev *pdev, pdev, WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_160_DIS); wlan_pdev_nif_feat_ext_cap_set( pdev, WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_80P80_DIS); + wlan_pdev_nif_feat_ext_cap_set( + pdev, WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_320_DIS); return QDF_STATUS_SUCCESS; } @@ -358,6 +363,13 @@ target_if_spectral_init_pdev_feature_cap_per_mode(struct wlan_objmgr_pdev *pdev, wlan_pdev_nif_feat_ext_cap_clear( pdev, WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_80P80_DIS); + if (!agile_cap.agile_spectral_cap_320) + wlan_pdev_nif_feat_ext_cap_set( + pdev, WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_320_DIS); + else + wlan_pdev_nif_feat_ext_cap_clear( + pdev, WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_320_DIS); + break; default: @@ -2428,6 +2440,8 @@ target_if_init_spectral_capability(struct target_if_spectral *spectral, pdev, WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_160_DIS); pcap->agile_spectral_cap_80p80 = !wlan_pdev_nif_feat_ext_cap_get( pdev, WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_80P80_DIS); + pcap->agile_spectral_cap_320 = !wlan_pdev_nif_feat_ext_cap_get( + pdev, WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_320_DIS); if (scaling_params) { for (param_idx = 0; param_idx < num_bin_scaling_params; @@ -2457,9 +2471,15 @@ target_if_init_spectral_capability(struct target_if_spectral *spectral, target_type == TARGET_TYPE_QCA6490) { pcap->num_detectors_160mhz = 1; pcap->num_detectors_80p80mhz = 1; + pcap->num_detectors_320mhz = 0; + } else if (is_spectral_arch_beryllium(target_type)) { + pcap->num_detectors_160mhz = 1; + pcap->num_detectors_80p80mhz = 0; + pcap->num_detectors_320mhz = 1; } else { pcap->num_detectors_160mhz = 2; pcap->num_detectors_80p80mhz = 2; + pcap->num_detectors_320mhz = 0; } status = target_if_populate_supported_sscan_bws(spectral, target_type); @@ -4813,6 +4833,49 @@ target_if_get_spectral_config(struct wlan_objmgr_pdev *pdev, return QDF_STATUS_SUCCESS; } +#ifdef WLAN_FEATURE_11BE +/** + * target_if_spectral_get_num_detectors_for_higher_bws() - Get number of + * Spectral detectors for higher bandwidths + * @spectral: Pointer to target if Spectral object + * @ch_width: channel width + * @num_detectors: Pointer to the variable to store number of Spectral detectors + * + * API to get number of Spectral detectors used for scan in the given channel + * width. + * + * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_INVAL on failure + */ +static QDF_STATUS +target_if_spectral_get_num_detectors_for_higher_bws( + struct target_if_spectral *spectral, + enum phy_ch_width ch_width, + uint32_t *num_detectors) +{ + switch (ch_width) { + case CH_WIDTH_320MHZ: + *num_detectors = spectral->capability.num_detectors_320mhz; + break; + + default: + spectral_err("Unsupported channel width %d", ch_width); + return QDF_STATUS_E_INVAL; + } + + return QDF_STATUS_SUCCESS; +} +#else +static QDF_STATUS +target_if_spectral_get_num_detectors_for_higher_bws( + struct target_if_spectral *spectral, + enum phy_ch_width ch_width, + uint32_t *num_detectors) +{ + spectral_err("Unsupported channel width %d", ch_width); + return QDF_STATUS_E_INVAL; +} +#endif + /** * target_if_spectral_get_num_detectors() - Get number of Spectral detectors * @spectral: Pointer to target if Spectral object @@ -4866,8 +4929,8 @@ target_if_spectral_get_num_detectors(struct target_if_spectral *spectral, break; default: - spectral_err("Unsupported channel width %d", ch_width); - return QDF_STATUS_E_INVAL; + return target_if_spectral_get_num_detectors_for_higher_bws( + spectral, ch_width, num_detectors); } return QDF_STATUS_SUCCESS; diff --git a/target_if/spectral/target_if_spectral.h b/target_if/spectral/target_if_spectral.h index 55214d7cf3..bbd0a0cfbd 100644 --- a/target_if/spectral/target_if_spectral.h +++ b/target_if/spectral/target_if_spectral.h @@ -1563,11 +1563,13 @@ struct target_if_samp_msg_params { * @agile_spectral_cap: agile Spectral scan capability for 20/40/80 MHz * @agile_spectral_cap_160: agile Spectral scan capability for 160 MHz * @agile_spectral_cap_80p80: agile Spectral scan capability for 80+80 MHz + * @agile_spectral_cap_320: agile Spectral scan capability for 320 MHz */ struct target_if_spectral_agile_mode_cap { bool agile_spectral_cap; bool agile_spectral_cap_160; bool agile_spectral_cap_80p80; + bool agile_spectral_cap_320; }; #ifdef WLAN_CONV_SPECTRAL_ENABLE diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h index 1caac242fe..19e4ecbadf 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h @@ -107,6 +107,8 @@ #define WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_160_DIS 0x00000040 /* agile Spectral scan support disable for 80+80 MHz */ #define WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_80P80_DIS 0x00000080 +/* agile Spectral scan support disable for 320 MHz */ +#define WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_320_DIS 0x00000100 /* PDEV op flags */ /* Enable htrate for wep and tkip */