From ceae5caddb9d0ada1b7829cbdb2dd610e6ddd052 Mon Sep 17 00:00:00 2001 From: Vikrampal Date: Fri, 28 Apr 2017 17:44:30 +0530 Subject: [PATCH] qcacmn: Modify H/w DBS cap check and fetch NSS Modify API policy_mgr_is_hw_dbs_2x2_capable() to check H/w DBS capability and check if downgrading needed while entering DBS. Define a new API policy_mgr_get_hw_dbs_nss() to get NSS information of both MAC0 and MAC1. Change-Id: If24817017f675e45197d060cd75317aa381256de CRs-Fixed: 2037487 --- .../policy_mgr/inc/wlan_policy_mgr_api.h | 14 ++- .../inc/wlan_policy_mgr_public_struct.h | 10 ++ .../policy_mgr/src/wlan_policy_mgr_action.c | 30 +++--- .../src/wlan_policy_mgr_get_set_utils.c | 91 ++++++++++++------- 4 files changed, 92 insertions(+), 53 deletions(-) diff --git a/umac/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h b/umac/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h index 783bf78d165d..803f0df633e9 100644 --- a/umac/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h +++ b/umac/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h @@ -1485,7 +1485,7 @@ bool policy_mgr_is_current_hwmode_dbs(struct wlan_objmgr_psoc *psoc); * policy_mgr_is_hw_dbs_2x2_capable() - if hardware is capable of dbs 2x2 * @psoc: PSOC object information * This function checks if hw_modes supported are always capable of - * DBS 2x2. + * DBS and there is no need for downgrading while entering DBS. * true: DBS 2x2 can always be supported * false: hw_modes support DBS 1x1 as well * @@ -1859,4 +1859,16 @@ void policy_mgr_update_new_hw_mode_index(struct wlan_objmgr_psoc *psoc, QDF_STATUS policy_mgr_is_chan_ok_for_dnbs(struct wlan_objmgr_psoc *psoc, uint8_t channel, bool *ok); +/** + * policy_mgr_get_hw_dbs_nss() - Computes DBS NSS + * @psoc: PSOC object information + * @nss_dbs: NSS info of both MAC0 and MAC1 + * This function computes NSS info of both MAC0 and MAC1 + * True: DBS capable + * False: not DBS capable + * + * Return: True or False + */ +bool policy_mgr_get_hw_dbs_nss(struct wlan_objmgr_psoc *psoc, + struct dbs_nss *nss_dbs); #endif /* __WLAN_POLICY_MGR_API_H */ 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 dde1b65ddd0b..156e4c6ef677 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 @@ -992,4 +992,14 @@ struct policy_mgr_user_cfg { uint32_t mcc_to_scc_switch_mode; bool sub_20_mhz_enabled; }; + +/** + * struct dbs_nss - Number of spatial streams in DBS mode + * @mac0_ss: Number of spatial streams on MAC0 + * @mac1_ss: Number of spatial streams on MAC1 + */ +struct dbs_nss { + enum hw_mode_ss_config mac0_ss; + enum hw_mode_ss_config mac1_ss; +}; #endif /* __WLAN_POLICY_MGR_PUBLIC_STRUCT_H */ 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 0e5f64b55b00..a8d34b62bbd4 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 @@ -422,6 +422,7 @@ QDF_STATUS policy_mgr_next_actions(struct wlan_objmgr_psoc *psoc, { QDF_STATUS status = QDF_STATUS_E_FAILURE; struct policy_mgr_hw_mode_params hw_mode; + struct dbs_nss nss_dbs; if (policy_mgr_is_hw_dbs_capable(psoc) == false) { policy_mgr_err("driver isn't dbs capable, no further action needed"); @@ -469,24 +470,17 @@ QDF_STATUS policy_mgr_next_actions(struct wlan_objmgr_psoc *psoc, PM_DBS, reason, session_id); break; case PM_DBS: - if (policy_mgr_is_hw_dbs_2x2_capable(psoc)) - status = policy_mgr_pdev_set_hw_mode(psoc, session_id, - HW_MODE_SS_2x2, - HW_MODE_80_MHZ, - HW_MODE_SS_2x2, HW_MODE_40_MHZ, - HW_MODE_DBS, - HW_MODE_AGILE_DFS_NONE, - HW_MODE_SBS_NONE, - reason); - else - status = policy_mgr_pdev_set_hw_mode(psoc, session_id, - HW_MODE_SS_1x1, - HW_MODE_80_MHZ, - HW_MODE_SS_1x1, HW_MODE_40_MHZ, - HW_MODE_DBS, - HW_MODE_AGILE_DFS_NONE, - HW_MODE_SBS_NONE, - reason); + (void)policy_mgr_get_hw_dbs_nss(psoc, &nss_dbs); + + status = policy_mgr_pdev_set_hw_mode(psoc, session_id, + nss_dbs.mac0_ss, + HW_MODE_80_MHZ, + nss_dbs.mac1_ss, + HW_MODE_40_MHZ, + HW_MODE_DBS, + HW_MODE_AGILE_DFS_NONE, + HW_MODE_SBS_NONE, + reason); break; case PM_SINGLE_MAC_UPGRADE: /* diff --git a/umac/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c b/umac/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c index 9c2f9054e491..9af7f9cda062 100644 --- a/umac/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c +++ b/umac/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c @@ -752,43 +752,18 @@ bool policy_mgr_is_dbs_enable(struct wlan_objmgr_psoc *psoc) bool policy_mgr_is_hw_dbs_2x2_capable(struct wlan_objmgr_psoc *psoc) { - int i, param; - uint32_t dbs, tx_chain0, rx_chain0, tx_chain1, rx_chain1; - uint32_t final_min_rf_chains = 2; - uint32_t min_rf_chains, min_mac0_rf_chains, min_mac1_rf_chains; - bool is_dbs_found = false; - struct policy_mgr_psoc_priv_obj *pm_ctx; + uint32_t max_rf_chains, final_min_rf_chains = HW_MODE_SS_2x2; + struct dbs_nss nss_dbs; - pm_ctx = policy_mgr_get_context(psoc); - if (!pm_ctx) { - policy_mgr_err("Invalid Context"); - return false; + if (policy_mgr_get_hw_dbs_nss(psoc, &nss_dbs)) { + max_rf_chains = QDF_MAX(nss_dbs.mac0_ss, nss_dbs.mac1_ss); + final_min_rf_chains + = QDF_MIN(final_min_rf_chains, max_rf_chains); + } else { + final_min_rf_chains = HW_MODE_SS_0x0; } - for (i = 0; i < pm_ctx->num_dbs_hw_modes; i++) { - param = pm_ctx->hw_mode.hw_mode_list[i]; - tx_chain0 = POLICY_MGR_HW_MODE_MAC0_TX_STREAMS_GET(param); - rx_chain0 = POLICY_MGR_HW_MODE_MAC0_RX_STREAMS_GET(param); - dbs = POLICY_MGR_HW_MODE_DBS_MODE_GET(param); - tx_chain1 = POLICY_MGR_HW_MODE_MAC1_TX_STREAMS_GET(param); - rx_chain1 = POLICY_MGR_HW_MODE_MAC1_RX_STREAMS_GET(param); - - if (dbs) { - min_mac0_rf_chains = QDF_MIN(tx_chain0, rx_chain0); - min_mac1_rf_chains = QDF_MIN(tx_chain1, rx_chain1); - min_rf_chains = QDF_MIN(min_mac0_rf_chains, - min_mac1_rf_chains); - is_dbs_found = true; - } else { - continue; - } - final_min_rf_chains = QDF_MIN(final_min_rf_chains, - min_rf_chains); - } - if (false == is_dbs_found) - final_min_rf_chains = 0; - - return (final_min_rf_chains == 2) ? true : false; + return (final_min_rf_chains == HW_MODE_SS_2x2) ? true : false; } uint32_t policy_mgr_get_connection_count(struct wlan_objmgr_psoc *psoc) @@ -2435,3 +2410,51 @@ QDF_STATUS policy_mgr_is_chan_ok_for_dnbs(struct wlan_objmgr_psoc *psoc, wlan_objmgr_vdev_release_ref(vdev, WLAN_POLICY_MGR_ID); return QDF_STATUS_SUCCESS; } + +bool policy_mgr_get_hw_dbs_nss(struct wlan_objmgr_psoc *psoc, + struct dbs_nss *nss_dbs) +{ + int i, param; + uint32_t dbs, tx_chain0, rx_chain0, tx_chain1, rx_chain1; + uint32_t min_mac0_rf_chains, min_mac1_rf_chains; + bool is_dbs_found = false; + struct policy_mgr_psoc_priv_obj *pm_ctx; + + pm_ctx = policy_mgr_get_context(psoc); + if (!pm_ctx) + policy_mgr_err("Invalid Context"); + + for (i = 0; i < pm_ctx->num_dbs_hw_modes; i++) { + param = pm_ctx->hw_mode.hw_mode_list[i]; + dbs = POLICY_MGR_HW_MODE_DBS_MODE_GET(param); + + if (dbs) { + tx_chain0 + = POLICY_MGR_HW_MODE_MAC0_TX_STREAMS_GET(param); + rx_chain0 + = POLICY_MGR_HW_MODE_MAC0_RX_STREAMS_GET(param); + + tx_chain1 + = POLICY_MGR_HW_MODE_MAC1_TX_STREAMS_GET(param); + rx_chain1 + = POLICY_MGR_HW_MODE_MAC1_RX_STREAMS_GET(param); + + min_mac0_rf_chains = QDF_MIN(tx_chain0, rx_chain0); + min_mac1_rf_chains = QDF_MIN(tx_chain1, rx_chain1); + + nss_dbs->mac0_ss + = (min_mac0_rf_chains == 2) + ? HW_MODE_SS_2x2 : HW_MODE_SS_1x1; + + nss_dbs->mac1_ss + = (min_mac1_rf_chains == 2) + ? HW_MODE_SS_2x2 : HW_MODE_SS_1x1; + + is_dbs_found = true; + } else { + continue; + } + } + + return is_dbs_found; +}