소스 검색

qcacld-3.0: Fix NSS update during TDLS setup

Fix NSS update during TDLS setup, by calling HDD API.

Change-Id: I0a27fca151f72f64460bd7cbca8d803ade81bd10
CRs-Fixed: 3796099
Vijay Raj 1 년 전
부모
커밋
4a8ee774c7

+ 4 - 0
components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h

@@ -2221,6 +2221,7 @@ struct policy_mgr_sme_cbacks {
  *  based on target channel frequency and concurrent connections.
  * @wlan_get_sap_acs_band: get acs band from sap config
  * @wlan_check_cc_intf_cb: get interference frequency of input SAP/GO interface
+ * @wlan_set_tx_rx_nss_cb: set NSS dynamically for STA
  */
 struct policy_mgr_hdd_cbacks {
 	QDF_STATUS (*sap_restart_chan_switch_cb)(struct wlan_objmgr_psoc *psoc,
@@ -2252,6 +2253,9 @@ struct policy_mgr_hdd_cbacks {
 	QDF_STATUS (*wlan_check_cc_intf_cb)(struct wlan_objmgr_psoc *psoc,
 					    uint8_t vdev_id,
 					    uint32_t *ch_freq);
+	QDF_STATUS (*wlan_set_tx_rx_nss_cb)(struct wlan_objmgr_psoc *psoc,
+					    uint8_t vdev_id, uint8_t tx_nss,
+					    uint8_t rx_nss);
 };
 
 /**

+ 6 - 53
components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c

@@ -753,65 +753,18 @@ static void policy_mgr_get_hw_mode_params(
 }
 
 QDF_STATUS policy_mgr_update_nss_req(struct wlan_objmgr_psoc *psoc,
-				     uint8_t vdev_id)
+				     uint8_t vdev_id, uint8_t tx_nss,
+				     uint8_t rx_nss)
 {
 	struct policy_mgr_psoc_priv_obj *pm_ctx;
-	struct target_psoc_info *tgt_hdl;
-	struct wlan_psoc_host_mac_phy_caps *tmp;
-	struct tgt_info *info;
-	struct policy_mgr_mac_ss_bw_info mac_ss_bw_info;
-	uint8_t i,  mac_found = 0;
-	uint32_t lmac_id;
-	QDF_STATUS status = QDF_STATUS_E_FAILURE;
-
-	tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
-	if (!tgt_hdl) {
-		policy_mgr_err("tgt_hdl not found");
-		return QDF_STATUS_E_FAILURE;
-	}
-
-	info = &tgt_hdl->info;
-	lmac_id = policy_mgr_mode_get_macid_by_vdev_id(psoc, vdev_id);
-	if (lmac_id == 0xFF) {
-		policy_mgr_err("mac_id not found");
-		goto out;
-	}
 
 	pm_ctx = policy_mgr_get_context(psoc);
 	if (!pm_ctx) {
-		policy_mgr_err("pm ctx not found");
-		goto out;
-	}
-
-	for (i = 0; i < pm_ctx->num_dbs_hw_modes; i++) {
-		tmp = &info->mac_phy_cap[i];
-
-		if (tmp->lmac_id  != lmac_id)
-			continue;
-
-		policy_mgr_get_hw_mode_params(tmp,
-					      &mac_ss_bw_info);
-		mac_found = 1;
-		break;
-	}
-
-	if (!mac_found) {
-		policy_mgr_err("mac_id : %d not found", lmac_id);
-		return status;
+		policy_mgr_err("Invalid Context");
+		return QDF_STATUS_E_FAILURE;
 	}
-
-	status =
-	pm_ctx->sme_cbacks.sme_nss_update_request(vdev_id,
-						  mac_ss_bw_info.mac_rx_stream,
-						  mac_ss_bw_info.mac_bw,
-						  policy_mgr_nss_update_cb,
-						  PM_NOP, psoc,
-						  POLICY_MGR_UPDATE_REASON_START_AP,
-						  vdev_id,
-						  POLICY_MGR_DEF_REQ_ID);
-
-out:
-	return status;
+	return pm_ctx->hdd_cbacks.wlan_set_tx_rx_nss_cb(psoc, vdev_id,
+							tx_nss, rx_nss);
 }
 
 /**

+ 4 - 1
components/cmn_services/policy_mgr/src/wlan_policy_mgr_i.h

@@ -1036,11 +1036,14 @@ void policy_mgr_reg_chan_change_callback(struct wlan_objmgr_psoc *psoc,
  * policy_mgr_update_nss_req() - wrapper API to update nss
  * @psoc: psoc object
  * @vdev_id: vdev id
+ * @tx_nss: Tx nss to set
+ * @rx_nss: Rx nss to set
  *
  * Return: QDF_STATUS_SUCCESS
  */
 QDF_STATUS policy_mgr_update_nss_req(struct wlan_objmgr_psoc *psoc,
-				     uint8_t vdev_id);
+				     uint8_t vdev_id, uint8_t tx_nss,
+				     uint8_t rx_nss);
 
 /**
  * policy_mgr_nss_update() - update nss for AP vdev

+ 4 - 1
components/cmn_services/policy_mgr/src/wlan_policy_mgr_init_deinit.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -847,6 +847,8 @@ QDF_STATUS policy_mgr_register_hdd_cb(struct wlan_objmgr_psoc *psoc,
 		hdd_cbacks->wlan_get_sap_acs_band;
 	pm_ctx->hdd_cbacks.wlan_check_cc_intf_cb =
 		hdd_cbacks->wlan_check_cc_intf_cb;
+	pm_ctx->hdd_cbacks.wlan_set_tx_rx_nss_cb =
+		hdd_cbacks->wlan_set_tx_rx_nss_cb;
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -870,6 +872,7 @@ QDF_STATUS policy_mgr_deregister_hdd_cb(struct wlan_objmgr_psoc *psoc)
 	pm_ctx->hdd_cbacks.hdd_get_ap_6ghz_capable = NULL;
 	pm_ctx->hdd_cbacks.wlan_get_ap_prefer_conc_ch_params = NULL;
 	pm_ctx->hdd_cbacks.wlan_get_sap_acs_band = NULL;
+	pm_ctx->hdd_cbacks.wlan_set_tx_rx_nss_cb = NULL;
 
 	return QDF_STATUS_SUCCESS;
 }

+ 2 - 1
components/tdls/core/src/wlan_tdls_cmds_process.c

@@ -2401,7 +2401,8 @@ int tdls_process_set_responder(struct tdls_set_responder_req *set_req)
 	}
 
 	status = policy_mgr_update_nss_req(psoc,
-					   wlan_vdev_get_id(tdls_vdev->vdev));
+					   wlan_vdev_get_id(tdls_vdev->vdev),
+					   HW_MODE_SS_2x2, HW_MODE_SS_2x2);
 	if (QDF_IS_STATUS_ERROR(status)) {
 		tdls_err("Unable to process NSS request");
 		return -EINVAL;

+ 0 - 6
core/hdd/src/wlan_hdd_cfg.c

@@ -1143,12 +1143,6 @@ static QDF_STATUS hdd_set_nss_params(struct wlan_hdd_link_info *link_info,
 				      link_info->vdev_id)))
 		return QDF_STATUS_E_FAILURE;
 
-	/* Check TDLS status and update antenna mode */
-	if ((adapter->device_mode == QDF_STA_MODE ||
-	     adapter->device_mode == QDF_P2P_CLIENT_MODE) &&
-	     policy_mgr_is_sta_active_connection_exists(hdd_ctx->psoc))
-		wlan_hdd_tdls_antenna_switch(link_info, rx_nss);
-
 	return QDF_STATUS_SUCCESS;
 }
 

+ 16 - 0
core/hdd/src/wlan_hdd_main.c

@@ -4072,6 +4072,21 @@ static bool hdd_is_cac_in_progress(void)
 	return (hdd_ctx->dev_dfs_cac_status == DFS_CAC_IN_PROGRESS);
 }
 
+static QDF_STATUS
+wlan_hdd_set_tx_rx_nss_cb(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
+			  uint8_t tx_nss, uint8_t rx_nss)
+{
+	struct wlan_hdd_link_info *link_info;
+
+	link_info = wlan_hdd_get_link_info_from_vdev(psoc, vdev_id);
+	if (!link_info) {
+		hdd_err("Invalid vdev %d", vdev_id);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return hdd_update_nss(link_info, tx_nss, rx_nss);
+}
+
 static void hdd_register_policy_manager_callback(
 			struct wlan_objmgr_psoc *psoc)
 {
@@ -4099,6 +4114,7 @@ static void hdd_register_policy_manager_callback(
 	hdd_cbacks.wlan_get_sap_acs_band =
 			wlan_get_sap_acs_band;
 	hdd_cbacks.wlan_check_cc_intf_cb = wlan_hdd_check_cc_intf_cb;
+	hdd_cbacks.wlan_set_tx_rx_nss_cb = wlan_hdd_set_tx_rx_nss_cb;
 
 	if (QDF_STATUS_SUCCESS !=
 	    policy_mgr_register_hdd_cb(psoc, &hdd_cbacks)) {