From 5a8305cdd59c4a150bb514d6af21c6f83f30f445 Mon Sep 17 00:00:00 2001 From: abhinav kumar Date: Sun, 22 Aug 2021 01:08:36 +0530 Subject: [PATCH] qcacld-3.0: Send roam band value to userspace OEM-SS sends ROAMBAND attribute via the vendor command QCA_WLAN_VENDOR_ROAMING_SUBCMD_CONTROL_SET to host to get current roam band value in the host. Fix is to process ROAMBAND attribute and send roam band value to upper layer. Change-Id: I56b208d00b40d4d3e6d3658d23fa1073f6fe1146 CRs-Fixed: 3009753 --- .../dispatcher/inc/wlan_cm_roam_ucfg_api.h | 11 ++++ .../dispatcher/src/wlan_cm_roam_ucfg_api.c | 12 ++++ core/hdd/src/wlan_hdd_cfg80211.c | 59 ++++++++++++++----- 3 files changed, 66 insertions(+), 16 deletions(-) diff --git a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_ucfg_api.h b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_ucfg_api.h index 3b9c93a39a..11a782818e 100644 --- a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_ucfg_api.h +++ b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_ucfg_api.h @@ -81,6 +81,17 @@ QDF_STATUS ucfg_cm_set_cckm_ie(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, const uint8_t *cck_ie, const uint8_t cck_ie_len); #endif +/** + * ucfg_cm_get_roam_band() - Get roam band from rso config + * @psoc: Pointer to psoc + * @vdev_id: vdev id + * @roam_band: Pointer of a buffer to fill the roam band + * + * Return: QDF_STATUS + */ +QDF_STATUS ucfg_cm_get_roam_band(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, + uint32_t *roam_band); + /** * ucfg_cm_rso_set_roam_trigger() - Send roam trigger bitmap firmware * @pdev: Pointer to pdev diff --git a/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_ucfg_api.c b/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_ucfg_api.c index 94561cde81..35aa9a061d 100644 --- a/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_ucfg_api.c +++ b/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_ucfg_api.c @@ -139,6 +139,18 @@ release_ref: return status; } +QDF_STATUS ucfg_cm_get_roam_band(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, + uint32_t *roam_band) +{ + struct cm_roam_values_copy temp; + + wlan_cm_roam_cfg_get_value(psoc, vdev_id, ROAM_BAND, &temp); + + *roam_band = temp.uint_value; + + return QDF_STATUS_SUCCESS; +} + #ifdef FEATURE_WLAN_ESE QDF_STATUS ucfg_cm_set_ese_roam_scan_channel_list(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 434cbe5560..f23106ff96 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -5409,9 +5409,34 @@ hdd_roam_control_config_buf_size(struct hdd_context *hdd_ctx, (nla_total_size(sizeof(uint32_t)) * NUM_CHANNELS); + if (tb[QCA_ATTR_ROAM_CONTROL_BAND_MASK]) + skb_len += NLA_HDRLEN + sizeof(uint32_t); + return skb_len; } +/** + * wlan_reg_wifi_band_bitmap_to_vendor_bitmap() - Convert enum reg_wifi_band + * to enum qca_set_band + * @reg_wifi_band_bitmap: enum reg_wifi_band + * + * Return: qca_set_band value + */ +static uint32_t +wlan_reg_wifi_band_bitmap_to_vendor_bitmap(uint32_t reg_wifi_band_bitmap) +{ + uint32_t vendor_mask = 0; + + if (reg_wifi_band_bitmap & BIT(REG_BAND_2G)) + vendor_mask |= QCA_SETBAND_2G; + if (reg_wifi_band_bitmap & BIT(REG_BAND_5G)) + vendor_mask |= QCA_SETBAND_5G; + if (reg_wifi_band_bitmap & BIT(REG_BAND_6G)) + vendor_mask |= QCA_SETBAND_6G; + + return vendor_mask; +} + /** * hdd_roam_control_config_fill_data() - Fill the data requested by userspace * @hdd_ctx: HDD context @@ -5431,7 +5456,7 @@ hdd_roam_control_config_fill_data(struct hdd_context *hdd_ctx, uint8_t vdev_id, QDF_STATUS status = QDF_STATUS_SUCCESS; uint8_t roam_control; struct nlattr *config, *get_freq_scheme, *get_freq; - uint32_t full_roam_scan_period; + uint32_t full_roam_scan_period, roam_band, vendor_band_mask; uint8_t num_channels = 0; uint32_t i = 0, freq_list[NUM_CHANNELS] = { 0 }; struct hdd_adapter *hdd_adapter = NULL; @@ -5518,6 +5543,23 @@ hdd_roam_control_config_fill_data(struct hdd_context *hdd_ctx, uint8_t vdev_id, nla_nest_end(skb, get_freq); nla_nest_end(skb, get_freq_scheme); } + + if (tb[QCA_ATTR_ROAM_CONTROL_BAND_MASK]) { + status = ucfg_cm_get_roam_band(hdd_ctx->psoc, vdev_id, + &roam_band); + if (QDF_IS_STATUS_ERROR(status)) + goto out; + vendor_band_mask = + wlan_reg_wifi_band_bitmap_to_vendor_bitmap(roam_band); + if (nla_put_u32(skb, QCA_ATTR_ROAM_CONTROL_BAND_MASK, + vendor_band_mask)) { + hdd_info("failed to put roam_band"); + return -EINVAL; + } + hdd_debug("sending vendor_band_mask: %d reg band:%d", + vendor_band_mask, roam_band); + } + nla_nest_end(skb, config); out: @@ -13687,21 +13729,6 @@ static int wlan_hdd_cfg80211_setband(struct wiphy *wiphy, return errno; } -static uint32_t -wlan_reg_wifi_band_bitmap_to_vendor_bitmap(uint32_t reg_wifi_band_bitmap) -{ - uint32_t vendor_mask = 0; - - if (reg_wifi_band_bitmap & BIT(REG_BAND_2G)) - vendor_mask |= QCA_SETBAND_2G; - if (reg_wifi_band_bitmap & BIT(REG_BAND_5G)) - vendor_mask |= QCA_SETBAND_5G; - if (reg_wifi_band_bitmap & BIT(REG_BAND_6G)) - vendor_mask |= QCA_SETBAND_6G; - - return vendor_mask; -} - /** *__wlan_hdd_cfg80211_getband() - get band * @wiphy: Pointer to wireless phy