1
0

qcacmn: Repurpose the IPA tx ring pairs for normal use

Repurpose the IPA tx and tx completions rings for
normal use when IPA is disabled either via config
flag or ini.

Change-Id: Ia4b6a89c73d888a217bdef40e3c05435c3bb1bb2
CRs-Fixed: 3059730
Este cometimento está contido em:
Yeshwanth Sriram Guntuka
2021-10-13 14:55:12 +05:30
cometido por Madan Koyyalamudi
ascendente dcdd40116f
cometimento e4bd6bb939
8 ficheiros modificados com 139 adições e 49 eliminações

Ver ficheiro

@@ -1,5 +1,6 @@
/*
* Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -4037,6 +4038,9 @@ static bool dp_ipa_is_alt_tx_comp_ring(int index)
static void dp_ipa_get_tx_ring_size(int tx_ring_num, int *tx_ipa_ring_sz,
struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx)
{
if (!soc_cfg_ctx->ipa_enabled)
return;
if (tx_ring_num == IPA_TCL_DATA_RING_IDX)
*tx_ipa_ring_sz = wlan_cfg_ipa_tx_ring_size(soc_cfg_ctx);
else if (dp_ipa_is_alt_tx_ring(tx_ring_num))
@@ -4056,6 +4060,9 @@ static void dp_ipa_get_tx_comp_ring_size(int tx_comp_ring_num,
int *tx_comp_ipa_ring_sz,
struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx)
{
if (!soc_cfg_ctx->ipa_enabled)
return;
if (tx_comp_ring_num == IPA_TCL_DATA_RING_IDX)
*tx_comp_ipa_ring_sz =
wlan_cfg_ipa_tx_comp_ring_size(soc_cfg_ctx);

Ver ficheiro

@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -5970,6 +5971,9 @@ void dp_txrx_path_stats(struct dp_soc *soc)
DP_PRINT_STATS("successfully transmitted: %u msdus (%llu bytes)",
pdev->stats.tx.tx_success.num,
pdev->stats.tx.tx_success.bytes);
for (i = 0; i < soc->num_tcl_data_rings; i++)
DP_PRINT_STATS("Enqueue to SW2TCL%u: %u", i + 1,
soc->stats.tx.tcl_enq[i]);
DP_PRINT_STATS("Dropped in host:");
DP_PRINT_STATS("Total packets dropped: %u,",
@@ -6469,7 +6473,6 @@ dp_print_soc_tx_stats(struct dp_soc *soc)
soc->stats.tx.hp_oos2);
}
#ifdef CONFIG_BERYLLIUM
static
int dp_fill_rx_interrupt_ctx_stats(struct dp_intr *intr_ctx,
char *buf, int buf_len)
@@ -6587,34 +6590,6 @@ void dp_print_soc_interrupt_stats(struct dp_soc *soc)
}
}
#else
void dp_print_soc_interrupt_stats(struct dp_soc *soc)
{
int i = 0;
struct dp_intr_stats *intr_stats;
DP_PRINT_STATS("INT: Total |txComps|reo[0] |reo[1] |reo[2] |reo[3] |mon |rx_err | wbm |reo_sta|rxdm2hst|hst2rxdm|");
for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) {
intr_stats = &soc->intr_ctx[i].intr_stats;
DP_PRINT_STATS("%3u[%3d]: %7u %7u %7u %7u %7u %7u %7u %7u %7u %7u %8u %8u",
i,
hif_get_int_ctx_irq_num(soc->hif_handle, i),
intr_stats->num_masks,
intr_stats->num_tx_ring_masks[0],
intr_stats->num_rx_ring_masks[0],
intr_stats->num_rx_ring_masks[1],
intr_stats->num_rx_ring_masks[2],
intr_stats->num_rx_ring_masks[3],
intr_stats->num_rx_mon_ring_masks,
intr_stats->num_rx_err_ring_masks,
intr_stats->num_rx_wbm_rel_ring_masks,
intr_stats->num_reo_status_ring_masks,
intr_stats->num_rxdma2host_ring_masks,
intr_stats->num_host2rxdma_ring_masks);
}
}
#endif
void
dp_print_soc_rx_stats(struct dp_soc *soc)
{

Ver ficheiro

@@ -1,5 +1,6 @@
/*
* Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -457,16 +458,38 @@ static inline hal_ring_handle_t dp_tx_get_hal_ring_hdl(struct dp_soc *soc,
#else /* QCA_OL_TX_MULTIQ_SUPPORT */
#ifdef TX_MULTI_TCL
#ifdef IPA_OFFLOAD
static inline void dp_tx_get_queue(struct dp_vdev *vdev,
qdf_nbuf_t nbuf, struct dp_tx_queue *queue)
{
/* get flow id */
queue->desc_pool_id = DP_TX_GET_DESC_POOL_ID(vdev);
if (vdev->pdev->soc->wlan_cfg_ctx->ipa_enabled)
queue->ring_id = DP_TX_GET_RING_ID(vdev);
else
queue->ring_id = (qdf_nbuf_get_queue_mapping(nbuf) %
vdev->pdev->soc->num_tcl_data_rings);
}
#else
static inline void dp_tx_get_queue(struct dp_vdev *vdev,
qdf_nbuf_t nbuf, struct dp_tx_queue *queue)
{
/* get flow id */
queue->desc_pool_id = DP_TX_GET_DESC_POOL_ID(vdev);
queue->ring_id = (qdf_nbuf_get_queue_mapping(nbuf) %
vdev->pdev->soc->num_tcl_data_rings);
}
#endif
#else
static inline void dp_tx_get_queue(struct dp_vdev *vdev,
qdf_nbuf_t nbuf, struct dp_tx_queue *queue)
{
/* get flow id */
queue->desc_pool_id = DP_TX_GET_DESC_POOL_ID(vdev);
queue->ring_id = DP_TX_GET_RING_ID(vdev);
dp_tx_debug("pool_id:%d ring_id: %d skb %pK ",
queue->desc_pool_id, queue->ring_id, nbuf);
}
#endif
static inline hal_ring_handle_t dp_tx_get_hal_ring_hdl(struct dp_soc *soc,
uint8_t ring_id)

Ver ficheiro

@@ -1,5 +1,6 @@
/*
* Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -959,6 +960,8 @@ struct dp_soc_stats {
struct {
/* Total packets transmitted */
struct cdp_pkt_info egress;
/* Enqueues per tcl ring */
uint32_t tcl_enq[MAX_TCL_DATA_RINGS];
/* packets dropped on tx because of no peer */
struct cdp_pkt_info tx_invalid_peer;
/* descriptors in each tcl ring */

Ver ficheiro

@@ -1,5 +1,6 @@
/*
* Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -78,12 +79,32 @@ static inline uint8_t dp_tx_get_rbm_id_li(struct dp_soc *soc,
}
#endif
#else
#ifdef TX_MULTI_TCL
#ifdef IPA_OFFLOAD
static inline uint8_t dp_tx_get_rbm_id_li(struct dp_soc *soc,
uint8_t ring_id)
{
if (soc->wlan_cfg_ctx->ipa_enabled)
return (ring_id + soc->wbm_sw0_bm_id);
return soc->wlan_cfg_ctx->tcl_wbm_map_array[ring_id].wbm_rbm_id;
}
#else
static inline uint8_t dp_tx_get_rbm_id_li(struct dp_soc *soc,
uint8_t ring_id)
{
return soc->wlan_cfg_ctx->tcl_wbm_map_array[ring_id].wbm_rbm_id;
}
#endif
#else
static inline uint8_t dp_tx_get_rbm_id_li(struct dp_soc *soc,
uint8_t ring_id)
{
return (ring_id + soc->wbm_sw0_bm_id);
}
#endif
#endif
#if defined(CLEAR_SW2TCL_CONSUMED_DESC)
/**
@@ -232,6 +253,7 @@ dp_tx_hw_enqueue_li(struct dp_soc *soc, struct dp_vdev *vdev,
hal_tx_desc_sync(hal_tx_desc_cached, hal_tx_desc);
coalesce = dp_tx_attempt_coalescing(soc, vdev, tx_desc, tid);
DP_STATS_INC_PKT(vdev, tx_i.processed, 1, tx_desc->length);
DP_STATS_INC(soc, tx.tcl_enq[ring_id], 1);
dp_tx_update_stats(soc, tx_desc->nbuf);
status = QDF_STATUS_SUCCESS;

Ver ficheiro

@@ -1,5 +1,6 @@
/*
* Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -2134,7 +2135,7 @@ struct hal_hw_srng_config hw_srng_table_6490[] = {
},
{ /* WBM2SW_RELEASE */
.start_ring_id = HAL_SRNG_WBM2SW0_RELEASE,
#ifdef IPA_WDI3_TX_TWO_PIPES
#if defined(IPA_WDI3_TX_TWO_PIPES) || defined(TX_MULTI_TCL)
.max_rings = 5,
#else
.max_rings = 4,

Ver ficheiro

@@ -1,5 +1,6 @@
/*
* Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -129,10 +130,45 @@ static const uint8_t tx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
[0] = WLAN_CFG_TX_RING_MASK_0, [1] = WLAN_CFG_TX_RING_MASK_4,
[2] = WLAN_CFG_TX_RING_MASK_2, [3] = WLAN_CFG_TX_RING_MASK_6,
[4] = WLAN_CFG_TX_RING_MASK_7};
#endif
#endif /* IPA_OFFLOAD */
static inline const
uint8_t *wlan_cfg_get_tx_ring_int_mask(struct wlan_cfg_dp_soc_ctxt *cfg_ctx)
{
return &tx_ring_mask_msi[0];
}
#else
static const uint8_t tx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
WLAN_CFG_TX_RING_MASK_0, 0, 0, 0, 0, 0, 0};
[0] = WLAN_CFG_TX_RING_MASK_0};
#ifdef TX_MULTI_TCL
static const uint8_t multi_tx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
[0] = WLAN_CFG_TX_RING_MASK_0, [7] = WLAN_CFG_TX_RING_MASK_2,
[8] = WLAN_CFG_TX_RING_MASK_4};
#ifdef IPA_OFFLOAD
static inline const
uint8_t *wlan_cfg_get_tx_ring_int_mask(struct wlan_cfg_dp_soc_ctxt *cfg_ctx)
{
if (cfg_ctx->ipa_enabled)
return &tx_ring_mask_msi[0];
return &multi_tx_ring_mask_msi[0];
}
#else
static inline const
uint8_t *wlan_cfg_get_tx_ring_int_mask(struct wlan_cfg_dp_soc_ctxt *cfg_ctx)
{
return &multi_tx_ring_mask_msi[0];
}
#endif /* IPA_OFFLOAD */
#else
static inline const
uint8_t *wlan_cfg_get_tx_ring_int_mask(struct wlan_cfg_dp_soc_ctxt *cfg_ctx)
{
return &tx_ring_mask_msi[0];
}
#endif /* TX_MULTI_TCL */
#endif /* CONFIG_BERYLLIUM */
#ifdef CONFIG_BERYLLIUM
@@ -151,12 +187,12 @@ static const uint8_t rx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
#else /* !defined(CONFIG_BERYLLIUM) */
#ifdef IPA_OFFLOAD
static const uint8_t rx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
0, WLAN_CFG_RX_RING_MASK_0, WLAN_CFG_RX_RING_MASK_1,
WLAN_CFG_RX_RING_MASK_2, 0, 0, 0};
[1] = WLAN_CFG_RX_RING_MASK_0, [2] = WLAN_CFG_RX_RING_MASK_1,
[3] = WLAN_CFG_RX_RING_MASK_2};
#else
static const uint8_t rx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
0, WLAN_CFG_RX_RING_MASK_0, WLAN_CFG_RX_RING_MASK_1,
WLAN_CFG_RX_RING_MASK_2, WLAN_CFG_RX_RING_MASK_3, 0, 0};
[1] = WLAN_CFG_RX_RING_MASK_0, [2] = WLAN_CFG_RX_RING_MASK_1,
[3] = WLAN_CFG_RX_RING_MASK_2, [4] = WLAN_CFG_RX_RING_MASK_3};
#endif
#endif /* CONFIG_BERYLLIUM */
@@ -166,13 +202,12 @@ static const uint8_t rxdma2host_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
WLAN_CFG_RXDMA2HOST_RING_MASK_1};
#else
static const uint8_t rxdma2host_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
0, 0, 0, 0, 0, WLAN_CFG_RXDMA2HOST_RING_MASK_0,
WLAN_CFG_RXDMA2HOST_RING_MASK_1};
[5] = WLAN_CFG_RXDMA2HOST_RING_MASK_0,
[6] = WLAN_CFG_RXDMA2HOST_RING_MASK_1};
#endif /* CONFIG_BERYLLIUM */
static const uint8_t rx_mon_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
[1] = WLAN_CFG_RX_MON_RING_MASK_0,
[2] = WLAN_CFG_RX_MON_RING_MASK_1};
[1] = WLAN_CFG_RX_MON_RING_MASK_0, [2] = WLAN_CFG_RX_MON_RING_MASK_1};
static const uint8_t host2rxdma_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {0};
@@ -191,11 +226,11 @@ static const uint8_t reo_status_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
[13] = WLAN_CFG_REO_STATUS_RING_MASK_0};
#else
static const uint8_t rx_err_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
0, 0, 0, 0, 0, 0, WLAN_CFG_RX_ERR_RING_MASK_0};
[6] = WLAN_CFG_RX_ERR_RING_MASK_0};
static const uint8_t rx_wbm_rel_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
0, 0, 0, 0, 0, 0, WLAN_CFG_RX_WBM_REL_RING_MASK_0};
[6] = WLAN_CFG_RX_WBM_REL_RING_MASK_0};
static const uint8_t reo_status_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
0, 0, 0, 0, 0, 0, WLAN_CFG_REO_STATUS_RING_MASK_0};
[6] = WLAN_CFG_REO_STATUS_RING_MASK_0};
#endif
#ifdef CONFIG_BERYLLIUM
@@ -1462,9 +1497,11 @@ void wlan_cfg_fill_interrupt_mask(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx,
int interrupt_mode,
bool is_monitor_mode)
{ int i = 0;
const uint8_t *tx_ring_intr_mask =
wlan_cfg_get_tx_ring_int_mask(wlan_cfg_ctx);
for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) {
wlan_cfg_ctx->int_tx_ring_mask[i] = tx_ring_mask_msi[i];
wlan_cfg_ctx->int_tx_ring_mask[i] = tx_ring_intr_mask[i];
wlan_cfg_ctx->int_rx_mon_ring_mask[i] =
rx_mon_ring_mask_msi[i];
wlan_cfg_ctx->int_tx_mon_ring_mask[i] = 0;
@@ -2167,7 +2204,7 @@ int wlan_cfg_per_pdev_lmac_ring(struct wlan_cfg_dp_soc_ctxt *cfg)
qdf_export_symbol(wlan_cfg_per_pdev_lmac_ring);
#if defined(DP_USE_SINGLE_TCL)
#if defined(DP_USE_SINGLE_TCL) && !defined(TX_MULTI_TCL)
int wlan_cfg_num_tcl_data_rings(struct wlan_cfg_dp_soc_ctxt *cfg)
{
return 1;
@@ -2180,6 +2217,23 @@ int wlan_cfg_num_nss_tcl_data_rings(struct wlan_cfg_dp_soc_ctxt *cfg)
#else
#if defined(IPA_OFFLOAD) && defined(TX_MULTI_TCL)
int wlan_cfg_num_tcl_data_rings(struct wlan_cfg_dp_soc_ctxt *cfg)
{
if (!cfg->ipa_enabled)
return cfg->num_tcl_data_rings;
return 1;
}
int wlan_cfg_num_nss_tcl_data_rings(struct wlan_cfg_dp_soc_ctxt *cfg)
{
if (!cfg->ipa_enabled)
return cfg->num_tcl_data_rings;
return 1;
}
#else
int wlan_cfg_num_tcl_data_rings(struct wlan_cfg_dp_soc_ctxt *cfg)
{
return cfg->num_tcl_data_rings;
@@ -2189,7 +2243,7 @@ int wlan_cfg_num_nss_tcl_data_rings(struct wlan_cfg_dp_soc_ctxt *cfg)
{
return cfg->num_nss_tcl_data_rings;
}
#endif
#endif
int wlan_cfg_tx_ring_size(struct wlan_cfg_dp_soc_ctxt *cfg)

Ver ficheiro

@@ -1,5 +1,6 @@
/*
* Copyright (c) 2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -32,7 +33,11 @@
#define WLAN_CFG_INT_NUM_CONTEXTS 18
#define WLAN_CFG_INT_NUM_CONTEXTS_MAX 18
#else
#if defined(TX_MULTI_TCL)
#define WLAN_CFG_INT_NUM_CONTEXTS 9
#else
#define WLAN_CFG_INT_NUM_CONTEXTS 7
#endif
#define WLAN_CFG_INT_NUM_CONTEXTS_MAX 14
#endif
#define WLAN_CFG_RXDMA1_ENABLE 1