qcacmn: Add support for Direct Link refill ring

Add support and ops for initialization and
deinitialization of Direct Link refill ring.

Change-Id: I2c7018c4f8411fb7a590cfbb8b991f9152b22397
CRs-Fixed: 3316656
This commit is contained in:
Yeshwanth Sriram Guntuka
2022-11-04 00:58:18 +05:30
committed by Madan Koyyalamudi
parent 4fb2121bbe
commit 99615e170d
6 changed files with 118 additions and 3 deletions

View File

@@ -573,6 +573,13 @@ int htt_srng_setup(struct htt_soc *soc, int mac_id,
(lmac_id * HAL_MAX_RINGS_PER_LMAC))) {
htt_ring_id = HTT_RXDMA_HOST_BUF_RING;
htt_ring_type = HTT_SW_TO_HW_RING;
#ifdef FEATURE_DIRECT_LINK
} else if (srng_params.ring_id ==
(HAL_SRNG_WMAC1_RX_DIRECT_LINK_SW_REFILL_RING +
(lmac_id * HAL_MAX_RINGS_PER_LMAC))) {
htt_ring_id = HTT_LPASS_TO_FW_RXBUF_RING;
htt_ring_type = HTT_SW_TO_SW_RING;
#endif
} else {
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
"%s: Ring %d currently not supported",

View File

@@ -46,6 +46,19 @@
#define INVALID_WBM_RING_NUM 0xF
#ifdef FEATURE_DIRECT_LINK
#define DIRECT_LINK_REFILL_RING_ENTRIES 64
#ifdef IPA_OFFLOAD
#ifdef IPA_WDI3_VLAN_SUPPORT
#define DIRECT_LINK_REFILL_RING_IDX 4
#else
#define DIRECT_LINK_REFILL_RING_IDX 3
#endif
#else
#define DIRECT_LINK_REFILL_RING_IDX 2
#endif
#endif
/* struct htt_dbgfs_cfg - structure to maintain required htt data
* @msg_word: htt msg sent to upper layer
* @m: qdf debugfs file pointer
@@ -4256,4 +4269,40 @@ void dp_rx_err_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev,
* return: None
*/
void dp_pdev_update_fast_rx_flag(struct dp_soc *soc, struct dp_pdev *pdev);
#ifdef FEATURE_DIRECT_LINK
/*
* dp_setup_direct_link_refill_ring(): Setup direct link refill ring for pdev
* @soc_hdl: DP SOC handle
* @pdev_id: pdev id
*
* Return: Handle to SRNG
*/
struct dp_srng *dp_setup_direct_link_refill_ring(struct cdp_soc_t *soc_hdl,
uint8_t pdev_id);
/*
* dp_destroy_direct_link_refill_ring(): Destroy direct link refill ring for
* pdev
* @soc_hdl: DP SOC handle
* @pdev_id: pdev id
*
* Return: None
*/
void dp_destroy_direct_link_refill_ring(struct cdp_soc_t *soc_hdl,
uint8_t pdev_id);
#else
static inline
struct dp_srng *dp_setup_direct_link_refill_ring(struct cdp_soc_t *soc_hdl,
uint8_t pdev_id)
{
return NULL;
}
static inline
void dp_destroy_direct_link_refill_ring(struct cdp_soc_t *soc_hdl,
uint8_t pdev_id)
{
}
#endif
#endif /* #ifndef _DP_INTERNAL_H_ */

View File

@@ -17157,3 +17157,54 @@ static QDF_STATUS dp_pdev_init_wifi3(struct cdp_soc_t *txrx_soc,
return dp_pdev_init(txrx_soc, htc_handle, qdf_osdev, pdev_id);
}
#ifdef FEATURE_DIRECT_LINK
struct dp_srng *dp_setup_direct_link_refill_ring(struct cdp_soc_t *soc_hdl,
uint8_t pdev_id)
{
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
if (!pdev) {
dp_err("DP pdev is NULL");
return NULL;
}
if (dp_srng_alloc(soc, &pdev->rx_refill_buf_ring4,
RXDMA_BUF, DIRECT_LINK_REFILL_RING_ENTRIES, false)) {
dp_err("SRNG alloc failed for rx_refill_buf_ring4");
return NULL;
}
if (dp_srng_init(soc, &pdev->rx_refill_buf_ring4,
RXDMA_BUF, DIRECT_LINK_REFILL_RING_IDX, 0)) {
dp_err("SRNG init failed for rx_refill_buf_ring4");
dp_srng_free(soc, &pdev->rx_refill_buf_ring4);
return NULL;
}
if (htt_srng_setup(soc->htt_handle, pdev_id,
pdev->rx_refill_buf_ring4.hal_srng, RXDMA_BUF)) {
dp_srng_deinit(soc, &pdev->rx_refill_buf_ring4, RXDMA_BUF,
DIRECT_LINK_REFILL_RING_IDX);
dp_srng_free(soc, &pdev->rx_refill_buf_ring4);
return NULL;
}
return &pdev->rx_refill_buf_ring4;
}
void dp_destroy_direct_link_refill_ring(struct cdp_soc_t *soc_hdl,
uint8_t pdev_id)
{
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
if (!pdev) {
dp_err("DP pdev is NULL");
return;
}
dp_srng_deinit(soc, &pdev->rx_refill_buf_ring4, RXDMA_BUF, 0);
dp_srng_free(soc, &pdev->rx_refill_buf_ring4);
}
#endif

View File

@@ -2948,6 +2948,11 @@ struct dp_pdev {
struct dp_srng rx_refill_buf_ring3;
#endif
#ifdef FEATURE_DIRECT_LINK
/* Fourth ring used to replenish rx buffers */
struct dp_srng rx_refill_buf_ring4;
#endif
/* Empty ring used by firmware to post rx buffers to the MAC */
struct dp_srng rx_mac_buf_ring[MAX_RX_MAC_RINGS];

View File

@@ -283,10 +283,11 @@ enum hal_srng_ring_id {
HAL_SRNG_WMAC1_SW2RXDMA0_BUF2,
#ifdef IPA_WDI3_VLAN_SUPPORT
HAL_SRNG_WMAC1_SW2RXDMA0_BUF3,
#endif
#endif
HAL_SRNG_WMAC1_SW2RXDMA1_BUF,
#else
HAL_SRNG_WMAC1_SW2RXDMA1_BUF,
#ifdef FEATURE_DIRECT_LINK
HAL_SRNG_WMAC1_RX_DIRECT_LINK_SW_REFILL_RING,
#endif
HAL_SRNG_WMAC1_SW2RXDMA2_BUF,
HAL_SRNG_WMAC1_SW2RXDMA0_STATBUF,

View File

@@ -2606,7 +2606,9 @@ struct hal_hw_srng_config hw_srng_table_kiwi[] = {
},
{ /* RXDMA_BUF */
.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA0_BUF0,
#ifdef IPA_OFFLOAD
#if defined(IPA_OFFLOAD) && defined(FEATURE_DIRECT_LINK)
.max_rings = 4,
#elif defined(IPA_OFFLOAD) || defined(FEATURE_DIRECT_LINK)
.max_rings = 3,
#else
.max_rings = 2,