diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index cc9a405f57b7..257ff5d706ef 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -227,14 +227,21 @@ static const struct dp_rate_debug dp_rate_string[DOT11_MAX][MAX_MCS] = { }; /** - * @brief Cpu ring map types + * dp_cpu_ring_map_type - dp tx cpu ring map + * @DP_NSS_DEFAULT_MAP: Default mode with no NSS offloaded + * @DP_NSS_FIRST_RADIO_OFFLOADED_MAP: Only First Radio is offloaded + * @DP_NSS_SECOND_RADIO_OFFLOADED_MAP: Only second radio is offloaded + * @DP_NSS_DBDC_OFFLOADED_MAP: Both radios are offloaded + * @DP_NSS_DBTC_OFFLOADED_MAP: All three radios are offloaded + * @DP_NSS_CPU_RING_MAP_MAX: Max cpu ring map val */ enum dp_cpu_ring_map_types { - DP_DEFAULT_MAP, + DP_NSS_DEFAULT_MAP, DP_NSS_FIRST_RADIO_OFFLOADED_MAP, DP_NSS_SECOND_RADIO_OFFLOADED_MAP, - DP_NSS_ALL_RADIO_OFFLOADED_MAP, - DP_CPU_RING_MAP_MAX + DP_NSS_DBDC_OFFLOADED_MAP, + DP_NSS_DBTC_OFFLOADED_MAP, + DP_NSS_CPU_RING_MAP_MAX }; /** @@ -242,19 +249,21 @@ enum dp_cpu_ring_map_types { */ #ifdef CONFIG_WIN static uint8_t -dp_cpu_ring_map[DP_CPU_RING_MAP_MAX][WLAN_CFG_INT_NUM_CONTEXTS] = { +dp_cpu_ring_map[DP_NSS_CPU_RING_MAP_MAX][WLAN_CFG_INT_NUM_CONTEXTS] = { {0x0, 0x1, 0x2, 0x0, 0x0, 0x1, 0x2, 0x0, 0x0, 0x1, 0x2}, {0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1}, {0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0}, - {0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2} + {0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2}, + {0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3} }; #else static uint8_t -dp_cpu_ring_map[DP_CPU_RING_MAP_MAX][WLAN_CFG_INT_NUM_CONTEXTS] = { +dp_cpu_ring_map[DP_NSS_CPU_RING_MAP_MAX][WLAN_CFG_INT_NUM_CONTEXTS] = { {0x0, 0x1, 0x2, 0x0, 0x0, 0x1, 0x2}, {0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1}, {0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0}, - {0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2} + {0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2}, + {0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3} }; #endif @@ -459,7 +468,7 @@ uint32_t dp_soc_get_mon_mask_for_interrupt_mode(struct dp_soc *soc, int intr_ctx * Return: pointer to dp_vdev */ static -struct dp_vdev * dp_get_dp_vdev_from_cdp_vdev(struct cdp_vdev *cdp_opaque_vdev) +struct dp_vdev *dp_get_dp_vdev_from_cdp_vdev(struct cdp_vdev *cdp_opaque_vdev) { return (struct dp_vdev *)cdp_opaque_vdev; } @@ -2068,21 +2077,40 @@ static void dp_soc_reset_cpu_ring_map(struct dp_soc *soc) int nss_config = wlan_cfg_get_dp_soc_nss_cfg(soc->wlan_cfg_ctx); for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) { - if (nss_config == 1) { + switch (nss_config) { + case dp_nss_cfg_first_radio: /* * Setting Tx ring map for one nss offloaded radio */ soc->tx_ring_map[i] = dp_cpu_ring_map[DP_NSS_FIRST_RADIO_OFFLOADED_MAP][i]; - } else if (nss_config == 2) { + break; + + case dp_nss_cfg_second_radio: /* * Setting Tx ring for two nss offloaded radios */ soc->tx_ring_map[i] = dp_cpu_ring_map[DP_NSS_SECOND_RADIO_OFFLOADED_MAP][i]; - } else { + break; + + case dp_nss_cfg_dbdc: /* - * Setting Tx ring map for all nss offloaded radios + * Setting Tx ring map for 2 nss offloaded radios */ - soc->tx_ring_map[i] = dp_cpu_ring_map[DP_NSS_ALL_RADIO_OFFLOADED_MAP][i]; + soc->tx_ring_map[i] = + dp_cpu_ring_map[DP_NSS_DBDC_OFFLOADED_MAP][i]; + break; + + case dp_nss_cfg_dbtc: + /* + * Setting Tx ring map for 3 nss offloaded radios + */ + soc->tx_ring_map[i] = + dp_cpu_ring_map[DP_NSS_DBTC_OFFLOADED_MAP][i]; + break; + + default: + dp_err("tx_ring_map failed due to invalid nss cfg"); + break; } } } @@ -2268,7 +2296,7 @@ static bool dp_reo_remap_config(struct dp_soc *soc, uint8_t offload_radio = wlan_cfg_get_dp_soc_nss_cfg(soc->wlan_cfg_ctx); switch (offload_radio) { - case 0: + case dp_nss_cfg_default: *remap1 = ((0x1 << 0) | (0x2 << 3) | (0x3 << 6) | (0x4 << 9) | (0x1 << 12) | (0x2 << 15) | (0x3 << 18) | (0x4 << 21)) << 8; @@ -2277,7 +2305,7 @@ static bool dp_reo_remap_config(struct dp_soc *soc, (0x4 << 9) | (0x1 << 12) | (0x2 << 15) | (0x3 << 18) | (0x4 << 21)) << 8; break; - case 1: + case dp_nss_cfg_first_radio: *remap1 = ((0x2 << 0) | (0x3 << 3) | (0x4 << 6) | (0x2 << 9) | (0x3 << 12) | (0x4 << 15) | (0x2 << 18) | (0x3 << 21)) << 8; @@ -2287,7 +2315,7 @@ static bool dp_reo_remap_config(struct dp_soc *soc, (0x4 << 18) | (0x2 << 21)) << 8; break; - case 2: + case dp_nss_cfg_second_radio: *remap1 = ((0x1 << 0) | (0x3 << 3) | (0x4 << 6) | (0x1 << 9) | (0x3 << 12) | (0x4 << 15) | (0x1 << 18) | (0x3 << 21)) << 8; @@ -2297,8 +2325,9 @@ static bool dp_reo_remap_config(struct dp_soc *soc, (0x4 << 18) | (0x1 << 21)) << 8; break; - case 3: - /* return false if both radios are offloaded to NSS */ + case dp_nss_cfg_dbdc: + case dp_nss_cfg_dbtc: + /* return false if both or all are offloaded to NSS */ return false; } @@ -2331,10 +2360,11 @@ static void dp_reo_frag_dst_set(struct dp_soc *soc, uint8_t *frag_dst_ring) uint8_t offload_radio = wlan_cfg_get_dp_soc_nss_cfg(soc->wlan_cfg_ctx); switch (offload_radio) { - case 0: + case dp_nss_cfg_default: *frag_dst_ring = HAL_SRNG_REO_EXCEPTION; break; - case 3: + case dp_nss_cfg_dbdc: + case dp_nss_cfg_dbtc: *frag_dst_ring = HAL_SRNG_REO_ALTERNATE_SELECT; break; default: @@ -3699,11 +3729,19 @@ static void dp_soc_set_nss_cfg_wifi3(struct cdp_soc_t *cdp_soc, int config) /* * TODO: masked out based on the per offloaded radio */ - if (config == dp_nss_cfg_dbdc) { + switch (config) { + case dp_nss_cfg_default: + break; + case dp_nss_cfg_dbdc: + case dp_nss_cfg_dbtc: wlan_cfg_set_num_tx_desc_pool(wlan_cfg_ctx, 0); wlan_cfg_set_num_tx_ext_desc_pool(wlan_cfg_ctx, 0); wlan_cfg_set_num_tx_desc(wlan_cfg_ctx, 0); wlan_cfg_set_num_tx_ext_desc(wlan_cfg_ctx, 0); + break; + default: + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "Invalid offload config %d", config); } QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, @@ -8764,7 +8802,7 @@ static void dp_soc_set_txrx_ring_map(struct dp_soc *soc) { uint32_t i; for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) { - soc->tx_ring_map[i] = dp_cpu_ring_map[DP_DEFAULT_MAP][i]; + soc->tx_ring_map[i] = dp_cpu_ring_map[DP_NSS_DEFAULT_MAP][i]; } } diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 740ff2108053..b11fe1ee21e8 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -219,12 +219,15 @@ enum dp_ast_type { * @dp_nss_cfg_first_radio: First radio offloaded * @dp_nss_cfg_second_radio: Second radio offloaded * @dp_nss_cfg_dbdc: Dual radios offloaded + * @dp_nss_cfg_dbtc: Three radios offloaded */ enum dp_nss_cfg { - dp_nss_cfg_default, - dp_nss_cfg_first_radio, - dp_nss_cfg_second_radio, - dp_nss_cfg_dbdc, + dp_nss_cfg_default = 0x0, + dp_nss_cfg_first_radio = 0x1, + dp_nss_cfg_second_radio = 0x2, + dp_nss_cfg_dbdc = 0x3, + dp_nss_cfg_dbtc = 0x7, + dp_nss_cfg_max }; /** diff --git a/target_if/init_deinit/inc/init_deinit_lmac.h b/target_if/init_deinit/inc/init_deinit_lmac.h index 3afb5b90fba8..bf1b43cb0b87 100644 --- a/target_if/init_deinit/inc/init_deinit_lmac.h +++ b/target_if/init_deinit/inc/init_deinit_lmac.h @@ -223,4 +223,15 @@ void *lmac_get_pdev_feature_ptr(struct wlan_objmgr_pdev *pdev); */ uint32_t lmac_get_num_radios(struct wlan_objmgr_psoc *psoc); +/** + * lmac_get_preferred_hw_mode() - get preferred hw mode + * @psoc: pointer to psoc + * + * API to get the preferred hw mode + * + * Return: preferred how mode + */ +enum wmi_host_hw_mode_config_type lmac_get_preferred_hw_mode( + struct wlan_objmgr_psoc *psoc); + #endif /* _INIT_DEINIT_LMAC_H_ */ diff --git a/target_if/init_deinit/src/init_deinit_lmac.c b/target_if/init_deinit/src/init_deinit_lmac.c index 790dd6c1297e..282934ac231c 100644 --- a/target_if/init_deinit/src/init_deinit_lmac.c +++ b/target_if/init_deinit/src/init_deinit_lmac.c @@ -353,3 +353,23 @@ void *lmac_get_pdev_feature_ptr(struct wlan_objmgr_pdev *pdev) return target_pdev_get_feature_ptr(tgt_hdl); } qdf_export_symbol(lmac_get_pdev_feature_ptr); + +enum wmi_host_hw_mode_config_type lmac_get_preferred_hw_mode( + struct wlan_objmgr_psoc *psoc) +{ + struct target_psoc_info *tgt_hdl; + + if (!psoc) { + target_if_err("psoc is null"); + return WMI_HOST_HW_MODE_MAX; + } + tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc); + if (!tgt_hdl) { + target_if_err("target_psoc_info is null"); + return WMI_HOST_HW_MODE_MAX; + } + + return target_psoc_get_preferred_hw_mode(tgt_hdl); +} + +qdf_export_symbol(lmac_get_preferred_hw_mode);