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