diff --git a/dp/wifi3.0/be/dp_be.c b/dp/wifi3.0/be/dp_be.c index 066b86cf58..c270fab5c7 100644 --- a/dp/wifi3.0/be/dp_be.c +++ b/dp/wifi3.0/be/dp_be.c @@ -19,6 +19,7 @@ #include #include +#include "dp_rings.h" #include #include "dp_be.h" #include "dp_be_tx.h" @@ -100,6 +101,7 @@ static void dp_ppeds_inuse_desc(struct dp_soc *soc) static void dp_soc_cfg_attach_be(struct dp_soc *soc) { struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx = soc->wlan_cfg_ctx; + dp_soc_cfg_attach(soc); wlan_cfg_set_rx_rel_ring_id(soc_cfg_ctx, WBM2SW_REL_ERR_RING_NUM); @@ -744,6 +746,10 @@ QDF_STATUS dp_peer_setup_ppeds_be(struct dp_soc *soc, struct dp_peer *peer, { return QDF_STATUS_SUCCESS; } + +static inline void dp_ppeds_stop_soc_be(struct dp_soc *soc) +{ +} #endif /* WLAN_SUPPORT_PPEDS */ void dp_reo_shared_qaddr_detach(struct dp_soc *soc) @@ -993,6 +999,10 @@ static QDF_STATUS dp_soc_deinit_be(struct dp_soc *soc) struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); int i = 0; + qdf_atomic_set(&soc->cmn_init_done, 0); + + dp_ppeds_stop_soc_be(soc); + dp_tx_deinit_bank_profiles(be_soc); for (i = 0; i < MAX_TXDESC_POOLS; i++) dp_hw_cookie_conversion_deinit(be_soc, @@ -1007,11 +1017,35 @@ static QDF_STATUS dp_soc_deinit_be(struct dp_soc *soc) return QDF_STATUS_SUCCESS; } -static QDF_STATUS dp_soc_init_be(struct dp_soc *soc) +static QDF_STATUS dp_soc_deinit_be_wrapper(struct dp_soc *soc) +{ + QDF_STATUS qdf_status; + + qdf_status = dp_soc_deinit_be(soc); + if (QDF_IS_STATUS_ERROR(qdf_status)) + return qdf_status; + + dp_soc_deinit(soc); + + return QDF_STATUS_SUCCESS; +} + +static void *dp_soc_init_be(struct dp_soc *soc, HTC_HANDLE htc_handle, + struct hif_opaque_softc *hif_handle) { QDF_STATUS qdf_status = QDF_STATUS_SUCCESS; struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); int i = 0; + void *ret_addr; + + wlan_minidump_log(soc, sizeof(*soc), soc->ctrl_psoc, + WLAN_MD_DP_SOC, "dp_soc"); + + soc->hif_handle = hif_handle; + + soc->hal_soc = hif_get_hal_handle(soc->hif_handle); + if (!soc->hal_soc) + return NULL; dp_ppeds_init_soc_be(soc); @@ -1042,10 +1076,14 @@ static QDF_STATUS dp_soc_init_be(struct dp_soc *soc) /* write WBM/REO cookie conversion CFG register */ dp_cc_reg_cfg_init(soc, true); - return qdf_status; + ret_addr = dp_soc_init(soc, htc_handle, hif_handle); + if (!ret_addr) + goto fail; + + return ret_addr; fail: dp_soc_deinit_be(soc); - return qdf_status; + return NULL; } static QDF_STATUS dp_pdev_attach_be(struct dp_pdev *pdev, @@ -1137,18 +1175,33 @@ static QDF_STATUS dp_vdev_detach_be(struct dp_soc *soc, struct dp_vdev *vdev) } #ifdef WLAN_SUPPORT_PPEDS -static QDF_STATUS dp_peer_setup_be(struct dp_soc *soc, struct dp_peer *peer) +static void dp_soc_txrx_peer_setup_be(struct dp_soc *soc, uint8_t vdev_id, + uint8_t *peer_mac) { struct dp_vdev_be *be_vdev; QDF_STATUS qdf_status = QDF_STATUS_SUCCESS; struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); struct cdp_ds_vp_params vp_params = {0}; struct cdp_soc_t *cdp_soc = &soc->cdp_soc; + enum wlan_op_mode vdev_opmode; + struct dp_peer *peer; + + peer = dp_peer_find_hash_find(soc, peer_mac, 0, vdev_id, DP_MOD_ID_CDP); + if (!peer) + return; + vdev_opmode = peer->vdev->opmode; + + if (vdev_opmode != wlan_op_mode_ap && + vdev_opmode != wlan_op_mode_sta) { + dp_peer_unref_delete(peer, DP_MOD_ID_CDP); + return; + } be_vdev = dp_get_be_vdev_from_dp_vdev(peer->vdev); if (!be_vdev) { qdf_err("BE vap is null"); - return QDF_STATUS_E_NULL_VALUE; + qdf_status = QDF_STATUS_E_NULL_VALUE; + goto fail; } /* @@ -1156,7 +1209,8 @@ static QDF_STATUS dp_peer_setup_be(struct dp_soc *soc, struct dp_peer *peer) */ if (!cdp_soc->ol_ops->get_ppeds_profile_info_for_vap) { dp_err("%pK: Register get ppeds profile info first\n", cdp_soc); - return QDF_STATUS_E_NULL_VALUE; + qdf_status = QDF_STATUS_E_NULL_VALUE; + goto fail; } /* @@ -1167,7 +1221,8 @@ static QDF_STATUS dp_peer_setup_be(struct dp_soc *soc, struct dp_peer *peer) &vp_params); if (qdf_status == QDF_STATUS_E_NULL_VALUE) { dp_err("%pK: Could not find ppeds profile info vdev\n", be_vdev); - return QDF_STATUS_E_NULL_VALUE; + qdf_status = QDF_STATUS_E_NULL_VALUE; + goto fail; } if (vp_params.ppe_vp_type == PPE_VP_USER_TYPE_DS) { @@ -1175,15 +1230,41 @@ static QDF_STATUS dp_peer_setup_be(struct dp_soc *soc, struct dp_peer *peer) (void *)&be_soc->ppe_vp_profile[vp_params.ppe_vp_profile_idx]); } - return qdf_status; +fail: + dp_peer_unref_delete(peer, DP_MOD_ID_CDP); + if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { + dp_err("Unable to do ppeds peer setup"); + qdf_assert_always(0); + } } + #else -static QDF_STATUS dp_peer_setup_be(struct dp_soc *soc, struct dp_peer *peer) +static inline +void dp_soc_txrx_peer_setup_be(struct dp_soc *soc, uint8_t vdev_id, + uint8_t *peer_mac) { - return QDF_STATUS_SUCCESS; } #endif +static QDF_STATUS dp_peer_setup_be(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, + uint8_t *peer_mac, + struct cdp_peer_setup_info *setup_info) +{ + struct dp_soc *soc = (struct dp_soc *)soc_hdl; + QDF_STATUS qdf_status = QDF_STATUS_SUCCESS; + + qdf_status = dp_peer_setup_wifi3(soc_hdl, vdev_id, peer_mac, + setup_info); + if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { + dp_err("Unable to dp peer setup"); + return qdf_status; + } + + dp_soc_txrx_peer_setup_be(soc, vdev_id, peer_mac); + + return QDF_STATUS_SUCCESS; +} + qdf_size_t dp_get_soc_context_size_be(void) { return sizeof(struct dp_soc_be); @@ -1654,6 +1735,13 @@ dp_init_near_full_arch_ops_be(struct dp_arch_ops *arch_ops) } #endif +static inline +QDF_STATUS dp_srng_init_be(struct dp_soc *soc, struct dp_srng *srng, + int ring_type, int ring_num, int mac_id) +{ + return dp_srng_init_idx(soc, srng, ring_type, ring_num, mac_id, 0); +} + #ifdef WLAN_SUPPORT_PPEDS static void dp_soc_ppeds_srng_deinit(struct dp_soc *soc) { @@ -2735,7 +2823,7 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops) arch_ops->txrx_soc_attach = dp_soc_attach_be; arch_ops->txrx_soc_detach = dp_soc_detach_be; arch_ops->txrx_soc_init = dp_soc_init_be; - arch_ops->txrx_soc_deinit = dp_soc_deinit_be; + arch_ops->txrx_soc_deinit = dp_soc_deinit_be_wrapper; arch_ops->txrx_soc_srng_alloc = dp_soc_srng_alloc_be; arch_ops->txrx_soc_srng_init = dp_soc_srng_init_be; arch_ops->txrx_soc_srng_deinit = dp_soc_srng_deinit_be; @@ -2790,6 +2878,7 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops) arch_ops->peer_get_reo_hash = dp_peer_get_reo_hash_be; arch_ops->reo_remap_config = dp_reo_remap_config_be; arch_ops->txrx_get_vdev_mcast_param = dp_txrx_get_vdev_mcast_param_be; + arch_ops->txrx_srng_init = dp_srng_init_be; dp_initialize_arch_ops_be_ipa(arch_ops); dp_initialize_arch_ops_be_single_dev(arch_ops); } diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index a26105c9c3..30daa9370a 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -1392,7 +1392,8 @@ qdf_export_symbol(dp_srng_free); QDF_STATUS dp_srng_init(struct dp_soc *soc, struct dp_srng *srng, int ring_type, int ring_num, int mac_id) { - return dp_srng_init_idx(soc, srng, ring_type, ring_num, mac_id, 0); + return soc->arch_ops.txrx_srng_init(soc, srng, ring_type, + ring_num, mac_id); } qdf_export_symbol(dp_srng_init); @@ -2951,7 +2952,9 @@ void dp_soc_print_inactive_objects(struct dp_soc *soc) */ static void dp_soc_deinit_wifi3(struct cdp_soc_t *txrx_soc) { - dp_soc_deinit(txrx_soc); + struct dp_soc *soc = (struct dp_soc *)txrx_soc; + + soc->arch_ops.txrx_soc_deinit(soc); } /** @@ -4861,6 +4864,26 @@ static void dp_mlo_peer_authorize(struct dp_soc *soc, } #endif +/** + * dp_peer_setup_wifi3_wrapper() - initialize the peer + * @soc_hdl: soc handle object + * @vdev_id : vdev_id of vdev object + * @peer_mac: Peer's mac address + * @setup_info: peer setup info for MLO + * + * Return: QDF_STATUS + */ +static QDF_STATUS +dp_peer_setup_wifi3_wrapper(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, + uint8_t *peer_mac, + struct cdp_peer_setup_info *setup_info) +{ + struct dp_soc *soc = (struct dp_soc *)soc_hdl; + + return soc->arch_ops.txrx_peer_setup(soc_hdl, vdev_id, + peer_mac, setup_info); +} + /** * dp_cp_peer_del_resp_handler() - Handle the peer delete response * @soc_hdl: Datapath SOC handle @@ -10093,7 +10116,7 @@ static struct cdp_cmn_ops dp_ops_cmn = { .txrx_pdev_detach = dp_pdev_detach_wifi3, .txrx_pdev_deinit = dp_pdev_deinit_wifi3, .txrx_peer_create = dp_peer_create_wifi3, - .txrx_peer_setup = dp_peer_setup_wifi3, + .txrx_peer_setup = dp_peer_setup_wifi3_wrapper, #ifdef FEATURE_AST .txrx_peer_teardown = dp_peer_teardown_wifi3, #else @@ -11273,7 +11296,8 @@ dp_soc_attach(struct cdp_ctrl_objmgr_psoc *ctrl_psoc, dp_err("wlan_cfg_ctx failed\n"); goto fail2; } - dp_soc_cfg_attach(soc); + + soc->arch_ops.soc_cfg_attach(soc); if (dp_hw_link_desc_pool_banks_alloc(soc, WLAN_INVALID_PDEV_ID)) { dp_err("failed to allocate link desc pool banks"); @@ -11353,13 +11377,15 @@ fail0: return NULL; } -void *dp_soc_init_wifi3(struct cdp_soc_t *soc, +void *dp_soc_init_wifi3(struct cdp_soc_t *cdp_soc, struct cdp_ctrl_objmgr_psoc *ctrl_psoc, struct hif_opaque_softc *hif_handle, HTC_HANDLE htc_handle, qdf_device_t qdf_osdev, struct ol_if_ops *ol_ops, uint16_t device_id) { - return dp_soc_init((struct dp_soc *)soc, htc_handle, hif_handle); + struct dp_soc *soc = (struct dp_soc *)cdp_soc; + + return soc->arch_ops.txrx_soc_init(soc, htc_handle, hif_handle); } #endif diff --git a/dp/wifi3.0/dp_rings_main.c b/dp/wifi3.0/dp_rings_main.c index c1cec23ec8..946674d6af 100644 --- a/dp/wifi3.0/dp_rings_main.c +++ b/dp/wifi3.0/dp_rings_main.c @@ -3393,13 +3393,6 @@ void dp_soc_deinit(void *txrx_soc) struct dp_soc *soc = (struct dp_soc *)txrx_soc; struct htt_soc *htt_soc = soc->htt_handle; - qdf_atomic_set(&soc->cmn_init_done, 0); - - if (soc->arch_ops.txrx_soc_ppeds_stop) - soc->arch_ops.txrx_soc_ppeds_stop(soc); - - soc->arch_ops.txrx_soc_deinit(soc); - dp_monitor_soc_deinit(soc); /* free peer tables & AST tables allocated during peer_map_attach */ @@ -3469,33 +3462,6 @@ dp_htt_setup_rxdma_err_dst_ring(struct dp_soc *soc, int mac_id, } #endif -#ifdef WLAN_SUPPORT_PPEDS - -static inline -void dp_soc_txrx_peer_setup(enum wlan_op_mode vdev_opmode, struct dp_soc *soc, - struct dp_peer *peer) -{ - if (((vdev_opmode == wlan_op_mode_ap) || - (vdev_opmode == wlan_op_mode_sta)) && - (soc->arch_ops.txrx_peer_setup)) { - if (soc->arch_ops.txrx_peer_setup(soc, peer) - != QDF_STATUS_SUCCESS) { - dp_err("unable to setup target peer features"); - qdf_assert_always(0); - } - } -} - -#else - -static inline -void dp_soc_txrx_peer_setup(enum wlan_op_mode vdev_opmode, struct dp_soc *soc, - struct dp_peer *peer) -{ -} - -#endif /* WLAN_SUPPORT_PPEDS */ - void dp_vdev_get_default_reo_hash(struct dp_vdev *vdev, enum cdp_host_reo_dest_ring *reo_dest, bool *hash_based) @@ -3729,8 +3695,6 @@ dp_peer_setup_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, } } - dp_soc_txrx_peer_setup(vdev_opmode, soc, peer); - if (!IS_MLO_DP_MLD_PEER(peer)) dp_peer_ppdu_delayed_ba_init(peer); @@ -4482,20 +4446,6 @@ void *dp_soc_init(struct dp_soc *soc, HTC_HANDLE htc_handle, uint8_t i; int num_dp_msi; - wlan_minidump_log(soc, sizeof(*soc), soc->ctrl_psoc, - WLAN_MD_DP_SOC, "dp_soc"); - - soc->hif_handle = hif_handle; - - soc->hal_soc = hif_get_hal_handle(soc->hif_handle); - if (!soc->hal_soc) - goto fail0; - - if (!QDF_IS_STATUS_SUCCESS(soc->arch_ops.txrx_soc_init(soc))) { - dp_err("unable to do target specific init"); - goto fail0; - } - htt_soc = htt_soc_attach(soc, htc_handle); if (!htt_soc) goto fail1; @@ -4672,8 +4622,6 @@ fail3: fail2: htt_soc_detach(htt_soc); fail1: - soc->arch_ops.txrx_soc_deinit(soc); -fail0: return NULL; } @@ -5301,7 +5249,6 @@ void dp_soc_cfg_attach(struct dp_soc *soc) wlan_cfg_num_reo_dest_rings(soc->wlan_cfg_ctx); } - soc->arch_ops.soc_cfg_attach(soc); } void dp_pdev_set_default_reo(struct dp_pdev *pdev) diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index cc2076d1c3..049217f2c3 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -2231,13 +2231,15 @@ enum dp_context_type { * @dp_rx_null_q_desc_handle: Handle Null Queue Exception Error * @dp_tx_desc_pool_alloc: Allocate arch specific TX descriptor pool * @dp_tx_desc_pool_free: Free arch specific TX descriptor pool + * @txrx_srng_init: Init txrx srng */ struct dp_arch_ops { /* INIT/DEINIT Arch Ops */ QDF_STATUS (*txrx_soc_attach)(struct dp_soc *soc, struct cdp_soc_attach_params *params); QDF_STATUS (*txrx_soc_detach)(struct dp_soc *soc); - QDF_STATUS (*txrx_soc_init)(struct dp_soc *soc); + void* (*txrx_soc_init)(struct dp_soc *soc, HTC_HANDLE htc_handle, + struct hif_opaque_softc *hif_handle); QDF_STATUS (*txrx_soc_deinit)(struct dp_soc *soc); QDF_STATUS (*txrx_soc_srng_alloc)(struct dp_soc *soc); QDF_STATUS (*txrx_soc_srng_init)(struct dp_soc *soc); @@ -2254,8 +2256,9 @@ 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); - QDF_STATUS (*txrx_peer_setup)(struct dp_soc *soc, - struct dp_peer *peer); + QDF_STATUS (*txrx_peer_setup)(struct cdp_soc_t *soc_hdl, + uint8_t vdev_id, uint8_t *peer_mac, + struct cdp_peer_setup_info *setup_info); void (*peer_get_reo_hash)(struct dp_vdev *vdev, struct cdp_peer_setup_info *setup_info, enum cdp_host_reo_dest_ring *reo_dest, @@ -2464,6 +2467,9 @@ struct dp_arch_ops { uint32_t num_elem, uint8_t pool_id); void (*dp_tx_desc_pool_free)(struct dp_soc *soc, uint8_t pool_id); + + QDF_STATUS (*txrx_srng_init)(struct dp_soc *soc, struct dp_srng *srng, + int ring_type, int ring_num, int mac_id); }; /** diff --git a/dp/wifi3.0/li/dp_li.c b/dp/wifi3.0/li/dp_li.c index 9da87ee995..f381cffd38 100644 --- a/dp/wifi3.0/li/dp_li.c +++ b/dp/wifi3.0/li/dp_li.c @@ -18,6 +18,7 @@ */ #include "dp_types.h" +#include "dp_rings.h" #include #include #include "dp_li.h" @@ -77,6 +78,8 @@ static void dp_soc_cfg_attach_li(struct dp_soc *soc) { struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx = soc->wlan_cfg_ctx; + dp_soc_cfg_attach(soc); + wlan_cfg_set_rx_rel_ring_id(soc_cfg_ctx, WBM2SW_REL_ERR_RING_NUM); soc_cfg_ctx->tcl_wbm_map_array = g_tcl_wbm_map_array; @@ -112,13 +115,27 @@ static QDF_STATUS dp_soc_detach_li(struct dp_soc *soc) return QDF_STATUS_SUCCESS; } -static QDF_STATUS dp_soc_init_li(struct dp_soc *soc) +static void *dp_soc_init_li(struct dp_soc *soc, HTC_HANDLE htc_handle, + struct hif_opaque_softc *hif_handle) { - return QDF_STATUS_SUCCESS; + wlan_minidump_log(soc, sizeof(*soc), soc->ctrl_psoc, + WLAN_MD_DP_SOC, "dp_soc"); + + soc->hif_handle = hif_handle; + + soc->hal_soc = hif_get_hal_handle(soc->hif_handle); + if (!soc->hal_soc) + return NULL; + + return dp_soc_init(soc, htc_handle, hif_handle); } static QDF_STATUS dp_soc_deinit_li(struct dp_soc *soc) { + qdf_atomic_set(&soc->cmn_init_done, 0); + + dp_soc_deinit(soc); + return QDF_STATUS_SUCCESS; } @@ -194,9 +211,11 @@ static QDF_STATUS dp_peer_map_attach_li(struct dp_soc *soc) } #endif -static QDF_STATUS dp_peer_setup_li(struct dp_soc *soc, struct dp_peer *peer) +static QDF_STATUS dp_peer_setup_li(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, + uint8_t *peer_mac, + struct cdp_peer_setup_info *setup_info) { - return QDF_STATUS_SUCCESS; + return dp_peer_setup_wifi3(soc_hdl, vdev_id, peer_mac, setup_info); } qdf_size_t dp_get_soc_context_size_li(void) @@ -382,6 +401,13 @@ dp_rxdma_ring_sel_cfg_li(struct dp_soc *soc) } #endif +static inline +QDF_STATUS dp_srng_init_li(struct dp_soc *soc, struct dp_srng *srng, + int ring_type, int ring_num, int mac_id) +{ + return dp_srng_init_idx(soc, srng, ring_type, ring_num, mac_id, 0); +} + #ifdef QCA_DP_ENABLE_TX_COMP_RING4 static inline void dp_deinit_txcomp_ring4(struct dp_soc *soc) @@ -683,6 +709,7 @@ void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops) arch_ops->get_reo_qdesc_addr = dp_rx_get_reo_qdesc_addr_li; arch_ops->txrx_get_vdev_mcast_param = dp_txrx_get_vdev_mcast_param_li; arch_ops->get_hw_link_id = dp_get_hw_link_id_li; + arch_ops->txrx_srng_init = dp_srng_init_li; } #ifdef QCA_DP_TX_HW_SW_NBUF_DESC_PREFETCH