qcacmn: Route soc init/deinit handling via arch ops API's

Currently dp_soc_init/deinit API's are called first for
common soc initialization/deinitialization and then architecture
level init/deinit APIs are called from base dp_soc_init/deinit.
But with RHINE architecture dp_soc_init/deinit API's are not common,
so we cannot call these APIs as base. To handle this scenario
routing all the soc level init/deinit from arch ops APIs and
arch ops APIs will take care of calling common soc_init/deinit.

Change-Id: Ibb10d452931630c917088b4d222c7fbd82621f6a
CRs-Fixed: 3404205
这个提交包含在:
Karthik Kantamneni
2023-02-08 10:09:17 +05:30
提交者 Madan Koyyalamudi
父节点 88804f2cfc
当前提交 a7cd30b5da
修改 5 个文件,包含 172 行新增77 行删除

查看文件

@@ -19,6 +19,7 @@
#include <wlan_utility.h>
#include <dp_internal.h>
#include "dp_rings.h"
#include <dp_htt.h>
#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);
}

查看文件

@@ -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

查看文件

@@ -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)

查看文件

@@ -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);
};
/**

查看文件

@@ -18,6 +18,7 @@
*/
#include "dp_types.h"
#include "dp_rings.h"
#include <dp_internal.h>
#include <dp_htt.h>
#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