qcacmn: Add Band selection for NSS Update API

Add parameter to NSS Update API to specify
which Band to downgrade/upgrade.

Change-Id: I57ae4304fbf8de366531154f03d04792c18e176d
CRs-Fixed: 2256803
diff --git a/umac/cmn_services/policy_mgr/inc/wlan_policy_mgr_public_struct.h b/umac/cmn_services/policy_mgr/inc/wlan_policy_mgr_public_struct.h
index 6b46aab..448f7b0 100644
--- a/umac/cmn_services/policy_mgr/inc/wlan_policy_mgr_public_struct.h
+++ b/umac/cmn_services/policy_mgr/inc/wlan_policy_mgr_public_struct.h
@@ -714,6 +714,7 @@
  *
  * @POLICY_MGR_BAND_24: 2.4 Ghz band
  * @POLICY_MGR_BAND_5: 5 Ghz band
+ * @POLICY_MGR_ANY: to specify all band
  * @POLICY_MGR_MAX_BAND: Max place holder
  *
  * These are generic IDs that identify the various roles
@@ -722,7 +723,8 @@
 enum policy_mgr_band {
 	POLICY_MGR_BAND_24 = 0,
 	POLICY_MGR_BAND_5,
-	POLICY_MGR_MAX_BAND
+	POLICY_MGR_ANY,
+	POLICY_MGR_MAX_BAND = POLICY_MGR_ANY,
 };
 
 /**
diff --git a/umac/cmn_services/policy_mgr/src/wlan_policy_mgr_action.c b/umac/cmn_services/policy_mgr/src/wlan_policy_mgr_action.c
index 603382b..2d9cab4 100644
--- a/umac/cmn_services/policy_mgr/src/wlan_policy_mgr_action.c
+++ b/umac/cmn_services/policy_mgr/src/wlan_policy_mgr_action.c
@@ -722,7 +722,7 @@
 		 * intially. If yes, update the beacon template & notify FW.
 		 */
 		status = policy_mgr_nss_update(psoc, POLICY_MGR_RX_NSS_1,
-					PM_NOP, reason);
+					PM_NOP, POLICY_MGR_ANY, reason);
 		break;
 	case PM_UPGRADE:
 		/*
@@ -730,7 +730,7 @@
 		 * intially. If yes, update the beacon template & notify FW.
 		 */
 		status = policy_mgr_nss_update(psoc, POLICY_MGR_RX_NSS_2,
-					PM_NOP, reason);
+					PM_NOP, POLICY_MGR_ANY, reason);
 		break;
 	default:
 		policy_mgr_err("unexpected action value %d", action);
diff --git a/umac/cmn_services/policy_mgr/src/wlan_policy_mgr_core.c b/umac/cmn_services/policy_mgr/src/wlan_policy_mgr_core.c
index b766441..7882bf2 100644
--- a/umac/cmn_services/policy_mgr/src/wlan_policy_mgr_core.c
+++ b/umac/cmn_services/policy_mgr/src/wlan_policy_mgr_core.c
@@ -2501,6 +2501,7 @@
 
 QDF_STATUS policy_mgr_nss_update(struct wlan_objmgr_psoc *psoc,
 		uint8_t  new_nss, uint8_t next_action,
+		enum policy_mgr_band band,
 		enum policy_mgr_conn_update_reason reason)
 {
 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
@@ -2510,6 +2511,7 @@
 	uint32_t vdev_id;
 	uint32_t original_nss;
 	struct policy_mgr_psoc_priv_obj *pm_ctx;
+	uint8_t chan;
 
 	pm_ctx = policy_mgr_get_context(psoc);
 	if (!pm_ctx) {
@@ -2524,6 +2526,7 @@
 		vdev_id = pm_conc_connection_list[list[index]].vdev_id;
 		original_nss =
 		pm_conc_connection_list[list[index]].original_nss;
+		chan = pm_conc_connection_list[list[index]].chan;
 		qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
 		conn_index = policy_mgr_get_connection_for_vdev_id(
 			psoc, vdev_id);
@@ -2533,7 +2536,12 @@
 			continue;
 		}
 
-		if (2 == original_nss) {
+		if (original_nss == 2 &&
+		    (band == POLICY_MGR_ANY ||
+		    (band == POLICY_MGR_BAND_24 &&
+		    WLAN_REG_IS_24GHZ_CH(chan)) ||
+		    (band == POLICY_MGR_BAND_5 &&
+		    WLAN_REG_IS_5GHZ_CH(chan)))) {
 			status = pm_ctx->sme_cbacks.sme_nss_update_request(
 					vdev_id, new_nss,
 					policy_mgr_nss_update_cb,
@@ -2552,6 +2560,7 @@
 		vdev_id = pm_conc_connection_list[list[index]].vdev_id;
 		original_nss =
 		pm_conc_connection_list[list[index]].original_nss;
+		chan = pm_conc_connection_list[list[index]].chan;
 		qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
 		conn_index = policy_mgr_get_connection_for_vdev_id(
 			psoc, vdev_id);
@@ -2560,7 +2569,12 @@
 				vdev_id);
 			continue;
 		}
-		if (2 == original_nss) {
+		if (original_nss == 2 &&
+		    (band == POLICY_MGR_ANY ||
+		    (band == POLICY_MGR_BAND_24 &&
+		    WLAN_REG_IS_24GHZ_CH(chan)) ||
+		    (band == POLICY_MGR_BAND_5 &&
+		    WLAN_REG_IS_5GHZ_CH(chan)))) {
 			status = pm_ctx->sme_cbacks.sme_nss_update_request(
 					vdev_id, new_nss,
 					policy_mgr_nss_update_cb,
@@ -2608,7 +2622,8 @@
 	 * protection. So, not taking any lock inside
 	 * policy_mgr_complete_action() during pm_conc_connection_list access.
 	 */
-	status = policy_mgr_nss_update(psoc, new_nss, next_action, reason);
+	status = policy_mgr_nss_update(psoc, new_nss, next_action,
+				       POLICY_MGR_ANY, reason);
 	if (!QDF_IS_STATUS_SUCCESS(status))
 		status = policy_mgr_next_actions(psoc, session_id,
 						next_action, reason);
diff --git a/umac/cmn_services/policy_mgr/src/wlan_policy_mgr_i.h b/umac/cmn_services/policy_mgr/src/wlan_policy_mgr_i.h
index 393d4d4..15c9d9b 100644
--- a/umac/cmn_services/policy_mgr/src/wlan_policy_mgr_i.h
+++ b/umac/cmn_services/policy_mgr/src/wlan_policy_mgr_i.h
@@ -457,7 +457,21 @@
 		struct avoid_freq_ind_data *avoid_freq_ind,
 		void *arg);
 
+/**
+ * policy_mgr_nss_update() - update nss for AP vdev
+ * @psoc: PSOC object information
+ * @new_nss: new NSS value
+ * @next_action: Next action after nss update
+ * @band: update AP vdev on the Band.
+ * @reason: action reason
+ *
+ * The function will update AP vdevs on specific band.
+ *  eg. band = POLICY_MGR_ANY will request to update all band (2g and 5g)
+ *
+ * Return: QDF_STATUS_SUCCESS, update requested successfully.
+ */
 QDF_STATUS policy_mgr_nss_update(struct wlan_objmgr_psoc *psoc,
 		uint8_t  new_nss, uint8_t next_action,
+		enum policy_mgr_band band,
 		enum policy_mgr_conn_update_reason reason);
 #endif