Bladeren bron

qcacld-3.0: Handle GET_PARAMS operations

Send NON-SRG and SRG PD offset,
HE_SIG_SR_Value_15_Disallow and
Non-SRG OBSS PD SR Disallowed from SRPIE
and SRP_CTRL attributes of the connected
AP.

Change-Id: Ic43876a4ee7c6ded8ad75937671790acb06e6647
CRs-Fixed: 3304744
Sheenam Monga 2 jaren geleden
bovenliggende
commit
2570d35546
1 gewijzigde bestanden met toevoegingen van 91 en 0 verwijderingen
  1. 91 0
      core/hdd/src/wlan_hdd_he.c

+ 91 - 0
core/hdd/src/wlan_hdd_he.c

@@ -262,6 +262,72 @@ static int hdd_get_srp_stats_len(void)
 	return len;
 }
 
+static int hdd_get_srp_param_len(void)
+{
+	uint32_t len = NLMSG_HDRLEN;
+
+	len += nla_total_size(sizeof(bool)) +
+	       nla_total_size(sizeof(bool))+
+	       nla_total_size(sizeof(uint8_t))+
+	       nla_total_size(sizeof(uint8_t))+
+	       nla_total_size(sizeof(uint8_t));
+
+	return len;
+}
+
+static int
+hdd_add_param_info(struct sk_buff *skb, uint8_t srg_max_pd_offset,
+		   uint8_t srg_min_pd_offset, uint8_t non_srg_pd_offset,
+		   uint8_t sr_ctrl, int idx)
+{
+	struct nlattr *nla_attr;
+	bool non_srg_obss_pd_disallow = sr_ctrl & NON_SRG_PD_SR_DISALLOWED;
+	bool hesega_val_15_enable = sr_ctrl & HE_SIG_VAL_15_ALLOWED;
+
+	nla_attr = nla_nest_start(skb, idx);
+	if (!nla_attr)
+		goto fail;
+	hdd_debug("SR params of connected AP srg_max_pd_offset %d srg_min_pd_offset %d non_srg_pd_offset %d non_srg_obss_pd_disallow %d hesega_val_15_enable %d",
+		  srg_max_pd_offset, srg_min_pd_offset, non_srg_pd_offset,
+		  non_srg_obss_pd_disallow, hesega_val_15_enable);
+
+	if (nla_put_u32(skb,
+			QCA_WLAN_VENDOR_ATTR_SR_PARAMS_SRG_OBSS_PD_MIN_OFFSET,
+			srg_min_pd_offset)) {
+		hdd_err("srg_pd_min_offset put fail");
+		goto fail;
+	}
+	if (nla_put_u32(skb,
+			QCA_WLAN_VENDOR_ATTR_SR_PARAMS_SRG_OBSS_PD_MAX_OFFSET,
+			srg_max_pd_offset)) {
+		hdd_err("srg_pd_min_offset put fail");
+		goto fail;
+	}
+	if (nla_put_u32(
+		skb,
+		QCA_WLAN_VENDOR_ATTR_SR_PARAMS_NON_SRG_OBSS_PD_MAX_OFFSET,
+		non_srg_pd_offset)) {
+		hdd_err("non_srg_pd_offset put fail");
+		goto fail;
+	}
+	if (non_srg_obss_pd_disallow && nla_put_flag(
+		skb,
+		QCA_WLAN_VENDOR_ATTR_SR_PARAMS_NON_SRG_OBSS_PD_DISALLOW)) {
+		hdd_err("non_srg_obss_pd_disallow put fail or enabled");
+		goto fail;
+	}
+	if (hesega_val_15_enable && nla_put_flag(
+			 skb,
+			 QCA_WLAN_VENDOR_ATTR_SR_PARAMS_HESIGA_VAL15_ENABLE)) {
+		hdd_err("hesega_val_15_enable put fail or disabled");
+		goto fail;
+	}
+
+	nla_nest_end(skb, nla_attr);
+	return 0;
+fail:
+	return -EINVAL;
+}
 static int
 hdd_add_stats_info(struct sk_buff *skb,
 		   struct cdp_pdev_obss_pd_stats_tlv *stats)
@@ -272,6 +338,11 @@ hdd_add_stats_info(struct sk_buff *skb,
 	if (!nla_attr)
 		goto fail;
 
+	hdd_debug("SR stats - srg: ppdu_success %d tried %d opportunities %d non-srg: ppdu_success %d tried %d opportunities %d",
+		  stats->num_srg_ppdu_success, stats->num_srg_ppdu_tried,
+		  stats->num_srg_opportunities, stats->num_non_srg_ppdu_success,
+		  stats->num_non_srg_ppdu_tried,
+		  stats->num_non_srg_opportunities);
 	if (nla_put_u32(skb,
 			QCA_WLAN_VENDOR_ATTR_SR_STATS_SRG_TX_PPDU_SUCCESS_COUNT,
 			stats->num_srg_ppdu_success)) {
@@ -359,6 +430,7 @@ static int __wlan_hdd_cfg80211_sr_operations(struct wiphy *wiphy,
 	int32_t pd_threshold = 0;
 	uint8_t sr_he_siga_val15_allowed = true;
 	uint8_t pdev_id, sr_ctrl, non_srg_max_pd_offset;
+	uint8_t srg_min_pd_offset = 0, srg_max_pd_offset = 0;
 	uint32_t nl_buf_len;
 	int ret;
 	struct hdd_context *hdd_ctx = wiphy_priv(wiphy);
@@ -493,6 +565,25 @@ static int __wlan_hdd_cfg80211_sr_operations(struct wiphy *wiphy,
 		ucfg_spatial_reuse_send_sr_prohibit(adapter->vdev, false);
 		break;
 	case QCA_WLAN_SR_OPERATION_GET_PARAMS:
+		wlan_vdev_mlme_get_srg_pd_offset(adapter->vdev,
+						 &srg_max_pd_offset,
+						 &srg_min_pd_offset);
+		non_srg_max_pd_offset =
+			wlan_vdev_mlme_get_pd_offset(adapter->vdev);
+		sr_ctrl = wlan_vdev_mlme_get_sr_ctrl(adapter->vdev);
+		nl_buf_len = hdd_get_srp_param_len();
+		skb = cfg80211_vendor_cmd_alloc_reply_skb(hdd_ctx->wiphy,
+							  nl_buf_len);
+		if (!skb) {
+			hdd_err("cfg80211_vendor_cmd_alloc_reply_skb failed");
+			return -ENOMEM;
+		}
+		if (hdd_add_param_info(skb, srg_max_pd_offset,
+				       srg_min_pd_offset, non_srg_max_pd_offset,
+				       sr_ctrl,
+				       QCA_WLAN_VENDOR_ATTR_SR_PARAMS))
+			return -EINVAL;
+		ret = cfg80211_vendor_cmd_reply(skb);
 		break;
 	default:
 		hdd_err("Invalid SR Operation");