diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 80f3258177..264131d0d8 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -418,12 +418,14 @@ enum cdp_peer_type { * @is_first_link: set true for first MLO link peer * @is_primary_link: set true for MLO primary link peer * @primary_umac_id: primary umac_id + * @num_links: number of links in MLO */ struct cdp_peer_setup_info { uint8_t *mld_peer_mac; uint8_t is_first_link:1, is_primary_link:1; uint8_t primary_umac_id; + uint8_t num_links; }; /** diff --git a/dp/wifi3.0/be/dp_be.c b/dp/wifi3.0/be/dp_be.c index dc6432f29e..b9bde84f75 100644 --- a/dp/wifi3.0/be/dp_be.c +++ b/dp/wifi3.0/be/dp_be.c @@ -1866,6 +1866,89 @@ dp_initialize_arch_ops_be_mlo(struct dp_arch_ops *arch_ops) } #endif /* WLAN_FEATURE_11BE_MLO */ +#if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP) +#define DP_LMAC_PEER_ID_MSB_LEGACY 2 +#define DP_LMAC_PEER_ID_MSB_MLO 3 + +static void dp_peer_get_reo_hash_be(struct dp_vdev *vdev, + struct cdp_peer_setup_info *setup_info, + enum cdp_host_reo_dest_ring *reo_dest, + bool *hash_based, + uint8_t *lmac_peer_id_msb) +{ + struct dp_soc *soc = vdev->pdev->soc; + struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); + + if (!be_soc->mlo_enabled) + return dp_vdev_get_default_reo_hash(vdev, reo_dest, + hash_based); + + *hash_based = wlan_cfg_is_rx_hash_enabled(soc->wlan_cfg_ctx); + *reo_dest = vdev->pdev->reo_dest; + + /* Not a ML link peer use non-mlo */ + if (!setup_info) { + *lmac_peer_id_msb = DP_LMAC_PEER_ID_MSB_LEGACY; + return; + } + + /* For STA ML VAP we do not have num links info at this point + * use MLO case always + */ + if (vdev->opmode == wlan_op_mode_sta) { + *lmac_peer_id_msb = DP_LMAC_PEER_ID_MSB_MLO; + return; + } + + /* For AP ML VAP consider the peer as ML only it associates with + * multiple links + */ + if (setup_info->num_links == 1) { + *lmac_peer_id_msb = DP_LMAC_PEER_ID_MSB_LEGACY; + return; + } + + *lmac_peer_id_msb = DP_LMAC_PEER_ID_MSB_MLO; +} + +static bool dp_reo_remap_config_be(struct dp_soc *soc, + uint32_t *remap0, + uint32_t *remap1, + uint32_t *remap2) +{ + struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); + uint32_t reo_config = wlan_cfg_get_reo_rings_mapping(soc->wlan_cfg_ctx); + uint32_t reo_mlo_config = + wlan_cfg_mlo_rx_ring_map_get(soc->wlan_cfg_ctx); + + if (!be_soc->mlo_enabled) + return dp_reo_remap_config(soc, remap0, remap1, remap2); + + *remap0 = hal_reo_ix_remap_value_get_be(soc->hal_soc, reo_mlo_config); + *remap1 = hal_reo_ix_remap_value_get_be(soc->hal_soc, reo_config); + *remap2 = hal_reo_ix_remap_value_get_be(soc->hal_soc, reo_mlo_config); + + return true; +} +#else +static void dp_peer_get_reo_hash_be(struct dp_vdev *vdev, + struct cdp_peer_setup_info *setup_info, + enum cdp_host_reo_dest_ring *reo_dest, + bool *hash_based, + uint8_t *lmac_peer_id_msb) +{ + dp_vdev_get_default_reo_hash(vdev, reo_dest, hash_based); +} + +static bool dp_reo_remap_config_be(struct dp_soc *soc, + uint32_t *remap0, + uint32_t *remap1, + uint32_t *remap2) +{ + return dp_reo_remap_config(soc, remap0, remap1, remap2); +} +#endif + void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops) { #ifndef QCA_HOST_MODE_WIFI_DISABLED @@ -1924,4 +2007,6 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops) dp_init_near_full_arch_ops_be(arch_ops); arch_ops->get_rx_hash_key = dp_get_rx_hash_key_be; arch_ops->print_mlo_ast_stats = dp_print_mlo_ast_stats_be; + arch_ops->peer_get_reo_hash = dp_peer_get_reo_hash_be; + arch_ops->reo_remap_config = dp_reo_remap_config_be; } diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 3e5bc0068a..74dda22b11 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -6594,6 +6594,7 @@ dp_soc_attach_target_wifi3(struct cdp_soc_t *cdp_soc) { struct dp_soc *soc = (struct dp_soc *)cdp_soc; QDF_STATUS status = QDF_STATUS_SUCCESS; + struct hal_reo_params reo_params; htt_soc_attach_target(soc->htt_handle); @@ -6649,6 +6650,39 @@ dp_soc_attach_target_wifi3(struct cdp_soc_t *cdp_soc) /* initialize work queue for stats processing */ qdf_create_work(0, &soc->htt_stats.work, htt_t2h_stats_handler, soc); + wlan_cfg_soc_update_tgt_params(soc->wlan_cfg_ctx, + soc->ctrl_psoc); + /* Setup HW REO */ + qdf_mem_zero(&reo_params, sizeof(reo_params)); + + if (wlan_cfg_is_rx_hash_enabled(soc->wlan_cfg_ctx)) { + /* + * Reo ring remap is not required if both radios + * are offloaded to NSS + */ + + if (soc->arch_ops.reo_remap_config(soc, &reo_params.remap0, + &reo_params.remap1, + &reo_params.remap2)) + reo_params.rx_hash_enabled = true; + else + reo_params.rx_hash_enabled = false; + } + + /* + * set the fragment destination ring + */ + dp_reo_frag_dst_set(soc, &reo_params.frag_dst_ring); + + if (wlan_cfg_get_dp_soc_nss_cfg(soc->wlan_cfg_ctx)) + reo_params.alt_dst_ind_0 = REO_REMAP_RELEASE; + + hal_reo_setup(soc->hal_soc, &reo_params, 1); + + hal_reo_set_err_dst_remap(soc->hal_soc); + + soc->features.pn_in_reo_dest = hal_reo_enable_pn_in_dest(soc->hal_soc); + return QDF_STATUS_SUCCESS; } @@ -8039,8 +8073,10 @@ static inline bool dp_is_vdev_subtype_p2p(struct dp_vdev *vdev) * Return: None */ static void dp_peer_setup_get_reo_hash(struct dp_vdev *vdev, + struct cdp_peer_setup_info *setup_info, enum cdp_host_reo_dest_ring *reo_dest, - bool *hash_based) + bool *hash_based, + uint8_t *lmac_peer_id_msb) { struct dp_soc *soc; struct dp_pdev *pdev; @@ -8088,10 +8124,15 @@ static void dp_peer_setup_get_reo_hash(struct dp_vdev *vdev, * Return: None */ static void dp_peer_setup_get_reo_hash(struct dp_vdev *vdev, + struct cdp_peer_setup_info *setup_info, enum cdp_host_reo_dest_ring *reo_dest, - bool *hash_based) + bool *hash_based, + uint8_t *lmac_peer_id_msb) { - dp_vdev_get_default_reo_hash(vdev, reo_dest, hash_based); + struct dp_soc *soc = vdev->pdev->soc; + + soc->arch_ops.peer_get_reo_hash(vdev, setup_info, reo_dest, hash_based, + lmac_peer_id_msb); } #endif /* IPA_OFFLOAD */ @@ -8134,7 +8175,9 @@ dp_peer_setup_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, /* save vdev related member in case vdev freed */ vdev_opmode = vdev->opmode; pdev = vdev->pdev; - dp_peer_setup_get_reo_hash(vdev, &reo_dest, &hash_based); + dp_peer_setup_get_reo_hash(vdev, setup_info, + &reo_dest, &hash_based, + &lmac_peer_id_msb); dp_info("pdev: %d vdev :%d opmode:%u hash-based-steering:%d default-reo_dest:%u", pdev->pdev_id, vdev->vdev_id, @@ -14879,7 +14922,6 @@ void *dp_soc_init(struct dp_soc *soc, HTC_HANDLE htc_handle, { struct htt_soc *htt_soc = (struct htt_soc *)soc->htt_handle; bool is_monitor_mode = false; - struct hal_reo_params reo_params; uint8_t i; int num_dp_msi; struct dp_mon_ops *mon_ops; @@ -15004,23 +15046,6 @@ void *dp_soc_init(struct dp_soc *soc, HTC_HANDLE htc_handle, if (soc->disable_mac1_intr) dp_soc_disable_unused_mac_intr_mask(soc, 0x1); - /* Setup HW REO */ - qdf_mem_zero(&reo_params, sizeof(reo_params)); - - if (wlan_cfg_is_rx_hash_enabled(soc->wlan_cfg_ctx)) { - /* - * Reo ring remap is not required if both radios - * are offloaded to NSS - */ - - if (dp_reo_remap_config(soc, &reo_params.remap0, - &reo_params.remap1, - &reo_params.remap2)) - reo_params.rx_hash_enabled = true; - else - reo_params.rx_hash_enabled = false; - } - /* setup the global rx defrag waitlist */ TAILQ_INIT(&soc->rx.defrag.waitlist); soc->rx.defrag.timeout_ms = @@ -15030,20 +15055,6 @@ void *dp_soc_init(struct dp_soc *soc, HTC_HANDLE htc_handle, wlan_cfg_get_defrag_timeout_check(soc->wlan_cfg_ctx); qdf_spinlock_create(&soc->rx.defrag.defrag_lock); - /* - * set the fragment destination ring - */ - dp_reo_frag_dst_set(soc, &reo_params.frag_dst_ring); - - if (wlan_cfg_get_dp_soc_nss_cfg(soc->wlan_cfg_ctx)) - reo_params.alt_dst_ind_0 = REO_REMAP_RELEASE; - - hal_reo_setup(soc->hal_soc, &reo_params, 1); - - hal_reo_set_err_dst_remap(soc->hal_soc); - - soc->features.pn_in_reo_dest = hal_reo_enable_pn_in_dest(soc->hal_soc); - mon_ops = dp_mon_ops_get(soc); if (mon_ops && mon_ops->mon_soc_init) mon_ops->mon_soc_init(soc); diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index d53510b0c3..c45655a50a 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -1830,6 +1830,13 @@ struct dp_arch_ops { void (*txrx_peer_map_detach)(struct dp_soc *soc); QDF_STATUS (*dp_rxdma_ring_sel_cfg)(struct dp_soc *soc); void (*soc_cfg_attach)(struct dp_soc *soc); + void (*peer_get_reo_hash)(struct dp_vdev *vdev, + struct cdp_peer_setup_info *setup_info, + enum cdp_host_reo_dest_ring *reo_dest, + bool *hash_based, + uint8_t *lmac_peer_id_msb); + bool (*reo_remap_config)(struct dp_soc *soc, uint32_t *remap0, + uint32_t *remap1, uint32_t *remap2); /* TX RX Arch Ops */ QDF_STATUS (*tx_hw_enqueue)(struct dp_soc *soc, struct dp_vdev *vdev, diff --git a/dp/wifi3.0/li/dp_li.c b/dp/wifi3.0/li/dp_li.c index 5e157483f9..4aed39dcfb 100644 --- a/dp/wifi3.0/li/dp_li.c +++ b/dp/wifi3.0/li/dp_li.c @@ -558,6 +558,23 @@ static void dp_get_rx_hash_key_li(struct dp_soc *soc, dp_get_rx_hash_key_bytes(lro_hash); } +static void dp_peer_get_reo_hash_li(struct dp_vdev *vdev, + struct cdp_peer_setup_info *setup_info, + enum cdp_host_reo_dest_ring *reo_dest, + bool *hash_based, + uint8_t *lmac_peer_id_msb) +{ + dp_vdev_get_default_reo_hash(vdev, reo_dest, hash_based); +} + +static bool dp_reo_remap_config_li(struct dp_soc *soc, + uint32_t *remap0, + uint32_t *remap1, + uint32_t *remap2) +{ + return dp_reo_remap_config(soc, remap0, remap1, remap2); +} + void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops) { #ifndef QCA_HOST_MODE_WIFI_DISABLED @@ -609,6 +626,8 @@ void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops) arch_ops->dp_peer_rx_reorder_queue_setup = dp_peer_rx_reorder_queue_setup_li; arch_ops->dp_find_peer_by_destmac = dp_find_peer_by_destmac_li; + arch_ops->peer_get_reo_hash = dp_peer_get_reo_hash_li; + arch_ops->reo_remap_config = dp_reo_remap_config_li; } #ifdef QCA_DP_TX_HW_SW_NBUF_DESC_PREFETCH diff --git a/wlan_cfg/cfg_dp.h b/wlan_cfg/cfg_dp.h index bab1387faa..ecc8704790 100644 --- a/wlan_cfg/cfg_dp.h +++ b/wlan_cfg/cfg_dp.h @@ -450,7 +450,7 @@ #define WLAN_CFG_PPE_RELEASE_RING_SIZE_MAX 1024 #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP) -#define WLAN_CFG_MLO_RX_RING_MAP 0xF +#define WLAN_CFG_MLO_RX_RING_MAP 0x7 #define WLAN_CFG_MLO_RX_RING_MAP_MIN 0x0 #define WLAN_CFG_MLO_RX_RING_MAP_MAX 0xFF #endif @@ -1614,57 +1614,16 @@ * * */ -#define CFG_DP_MLO_CHIP0_RX_RING_MAP \ - CFG_INI_UINT("dp_chip0_rx_ring_map", \ +#define CFG_DP_MLO_RX_RING_MAP \ + CFG_INI_UINT("dp_mlo_reo_rings_map", \ WLAN_CFG_MLO_RX_RING_MAP_MIN, \ WLAN_CFG_MLO_RX_RING_MAP_MAX, \ WLAN_CFG_MLO_RX_RING_MAP, \ - CFG_VALUE_OR_DEFAULT, "DP Rx ring map chip0") + CFG_VALUE_OR_DEFAULT, "DP MLO Rx ring map") -/* - * - * dp_chip1_rx_ring_map - Set Rx ring map for CHIP 1 - * @Min: 0x0 - * @Max: 0xFF - * @Default: 0xF - * - * This ini sets Rx ring map for CHIP 1 - * - * Usage: Internal - * - * - */ -#define CFG_DP_MLO_CHIP1_RX_RING_MAP \ - CFG_INI_UINT("dp_chip1_rx_ring_map", \ - WLAN_CFG_MLO_RX_RING_MAP_MIN, \ - WLAN_CFG_MLO_RX_RING_MAP_MAX, \ - WLAN_CFG_MLO_RX_RING_MAP, \ - CFG_VALUE_OR_DEFAULT, "DP Rx ring map chip1") - -/* - * - * dp_chip2_rx_ring_map - Set Rx ring map for CHIP 2 - * @Min: 0x0 - * @Max: 0xFF - * @Default: 0xF - * - * This ini sets Rx ring map for CHIP 2 - * - * Usage: Internal - * - * - */ -#define CFG_DP_MLO_CHIP2_RX_RING_MAP \ - CFG_INI_UINT("dp_chip2_rx_ring_map", \ - WLAN_CFG_MLO_RX_RING_MAP_MIN, \ - WLAN_CFG_MLO_RX_RING_MAP_MAX, \ - WLAN_CFG_MLO_RX_RING_MAP, \ - CFG_VALUE_OR_DEFAULT, "DP Rx ring map chip2") #define CFG_DP_MLO_CONFIG \ - CFG(CFG_DP_MLO_CHIP0_RX_RING_MAP) \ - CFG(CFG_DP_MLO_CHIP1_RX_RING_MAP) \ - CFG(CFG_DP_MLO_CHIP2_RX_RING_MAP) + CFG(CFG_DP_MLO_RX_RING_MAP) #else #define CFG_DP_MLO_CONFIG #endif diff --git a/wlan_cfg/wlan_cfg.c b/wlan_cfg/wlan_cfg.c index f3a053c7b5..c842167273 100644 --- a/wlan_cfg/wlan_cfg.c +++ b/wlan_cfg/wlan_cfg.c @@ -2546,25 +2546,8 @@ wlan_multi_soc_mlo_cfg_attach(struct cdp_ctrl_objmgr_psoc *psoc, uint8_t rx_ring_map; rx_ring_map = - cfg_get(psoc, CFG_DP_MLO_CHIP0_RX_RING_MAP); - wlan_cfg_ctx->mlo_chip_rx_ring_map[0] = rx_ring_map; - wlan_cfg_ctx->mlo_chip_default_rx_ring_id[0] = - wlan_cfg_get_lsb_set_pos(rx_ring_map); - wlan_cfg_ctx->lmac_peer_id_msb[0] = 1; - - rx_ring_map = - cfg_get(psoc, CFG_DP_MLO_CHIP1_RX_RING_MAP); - wlan_cfg_ctx->mlo_chip_rx_ring_map[1] = rx_ring_map; - wlan_cfg_ctx->mlo_chip_default_rx_ring_id[1] = - wlan_cfg_get_lsb_set_pos(rx_ring_map); - wlan_cfg_ctx->lmac_peer_id_msb[1] = 2; - - rx_ring_map = - cfg_get(psoc, CFG_DP_MLO_CHIP2_RX_RING_MAP); - wlan_cfg_ctx->mlo_chip_rx_ring_map[2] = rx_ring_map; - wlan_cfg_ctx->mlo_chip_default_rx_ring_id[2] = - wlan_cfg_get_lsb_set_pos(rx_ring_map); - wlan_cfg_ctx->lmac_peer_id_msb[2] = 3; + cfg_get(psoc, CFG_DP_MLO_RX_RING_MAP); + wlan_cfg_ctx->mlo_chip_rx_ring_map = rx_ring_map; } #else static inline void @@ -2637,6 +2620,14 @@ static void wlan_soc_tx_capt_cfg_attach(struct cdp_ctrl_objmgr_psoc *psoc, } #endif +void +wlan_cfg_soc_update_tgt_params(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx, + struct cdp_ctrl_objmgr_psoc *psoc) +{ + wlan_cfg_ctx->reo_rings_mapping = cfg_get(psoc, + CFG_DP_REO_RINGS_MAP); +} + /** * wlan_cfg_soc_attach() - Allocate and prepare SoC configuration * @psoc - Object manager psoc @@ -3983,24 +3974,9 @@ wlan_cfg_set_rx_rel_ring_id(struct wlan_cfg_dp_soc_ctxt *cfg, #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP) uint8_t -wlan_cfg_mlo_rx_ring_map_get_by_chip_id(struct wlan_cfg_dp_soc_ctxt *cfg, - uint8_t chip_id) +wlan_cfg_mlo_rx_ring_map_get(struct wlan_cfg_dp_soc_ctxt *cfg) { - return cfg->mlo_chip_rx_ring_map[chip_id]; -} - -uint8_t -wlan_cfg_mlo_default_rx_ring_get_by_chip_id(struct wlan_cfg_dp_soc_ctxt *cfg, - uint8_t chip_id) -{ - return cfg->mlo_chip_default_rx_ring_id[chip_id]; -} - -uint8_t -wlan_cfg_mlo_lmac_peer_id_msb_get_by_chip_id(struct wlan_cfg_dp_soc_ctxt *cfg, - uint8_t chip_id) -{ - return cfg->lmac_peer_id_msb[chip_id]; + return cfg->mlo_chip_rx_ring_map; } #endif diff --git a/wlan_cfg/wlan_cfg.h b/wlan_cfg/wlan_cfg.h index 20eb6300ec..957a0b6331 100644 --- a/wlan_cfg/wlan_cfg.h +++ b/wlan_cfg/wlan_cfg.h @@ -260,8 +260,6 @@ struct wlan_srng_cfg { * @tx_rings_grp_bitmap: bitmap of group intr contexts which have * non-zero tx ring mask * @mlo_chip_rx_ring_map: map of chip_id to rx ring map - * @mlo_chip_default_rx_ring_id: default rx_ring of chip when hash is not found - * @lmac_peer_id_msb: value used for hash based routing * @vdev_stats_hw_offload_config: HW vdev stats config * @vdev_stats_hw_offload_timer: HW vdev stats timer duration * @txmon_hw_support: TxMON HW support @@ -424,9 +422,7 @@ struct wlan_cfg_dp_soc_ctxt { uint8_t rx_rel_wbm2sw_ring_id; uint32_t tx_rings_grp_bitmap; #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP) - uint8_t mlo_chip_rx_ring_map[WLAN_MAX_MLO_CHIPS]; - uint8_t mlo_chip_default_rx_ring_id[WLAN_MAX_MLO_CHIPS]; - uint8_t lmac_peer_id_msb[WLAN_MAX_MLO_CHIPS]; + uint8_t mlo_chip_rx_ring_map; #endif #ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT bool vdev_stats_hw_offload_config; @@ -2099,38 +2095,13 @@ wlan_cfg_get_sawf_config(struct wlan_cfg_dp_soc_ctxt *cfg); #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP) /** - * wlan_cfg_mlo_rx_ring_map_get_by_chip_id() - get rx ring map + * wlan_cfg_mlo_rx_ring_map_get() - get rx ring map * @cfg: soc configuration context - * @chip_id: mlo_chip_id * * Return: rx_ring_map */ uint8_t -wlan_cfg_mlo_rx_ring_map_get_by_chip_id(struct wlan_cfg_dp_soc_ctxt *cfg, - uint8_t chip_id); - -/** - * wlan_cfg_mlo_default_rx_ring_get_by_chip_id() - get default RX ring - * @cfg: soc configuration context - * @chip_id: mlo_chip_id - * - * Return: default rx ring - */ -uint8_t -wlan_cfg_mlo_default_rx_ring_get_by_chip_id(struct wlan_cfg_dp_soc_ctxt *cfg, - uint8_t chip_id); - -/** - * wlan_cfg_mlo_lmac_peer_id_msb_get_by_chip_id() - get chip's lmac_peer_id_msb - * @cfg: soc configuration context - * @chip_id: mlo_chip_id - * - * Return: lmac_peer_id_msb - */ -uint8_t -wlan_cfg_mlo_lmac_peer_id_msb_get_by_chip_id(struct wlan_cfg_dp_soc_ctxt *cfg, - uint8_t chip_id); - +wlan_cfg_mlo_rx_ring_map_get(struct wlan_cfg_dp_soc_ctxt *cfg); #endif /* @@ -2194,4 +2165,14 @@ wlan_cfg_get_tx_capt_max_mem(struct wlan_cfg_dp_soc_ctxt *cfg) */ uint8_t wlan_cfg_get_napi_scale_factor(struct wlan_cfg_dp_soc_ctxt *cfg); +/** + * wlan_cfg_soc_update_tgt_params() - Update band specific params + * @wlan_cfg_ctx - SOC cfg context + * @ctrl_obj - PSOC object + * + * Return: void + */ +void +wlan_cfg_soc_update_tgt_params(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx, + struct cdp_ctrl_objmgr_psoc *ctrl_obj); #endif /*__WLAN_CFG_H*/