qcacmn: Split dp_rx_pdev_attach and dp_rx_pdev_detach

Split dp_rx_pdev_attach into dp_rx_pdev_desc_pool_alloc,
dp_rx_pdev_desc_pool_init, dp_rx_pdev_buffers_alloc and
dp_rx_pdev_detach into dp_rx_pdev_desc_pool_free, dp_rx
_pdev_desc_pool_deinit, dp_rx_pdev_buffers_free APIs

This split is made because dp_pdev_init is introduced
as part of this FR and these APIs will be called from
dp_pdev_init/dp_pdev_deinit or dp_pdev_attach/dp_pdev_
detach accordingly to maintain the symmetry to DP init
and deinit path

Change-Id: Ib543ddae90b90f4706004080b1f2b7d0e5cfbfbc
CRs-Fixed: 2663595
This commit is contained in:
phadiman
2020-02-19 18:20:44 +05:30
committed by nshrivas
parent 9798b16f3f
commit b133d310ec
6 changed files with 374 additions and 117 deletions

View File

@@ -2468,21 +2468,7 @@ QDF_STATUS dp_rx_vdev_detach(struct dp_vdev *vdev)
void
dp_rx_pdev_detach(struct dp_pdev *pdev)
{
uint8_t mac_for_pdev = pdev->lmac_id;
struct dp_soc *soc = pdev->soc;
struct rx_desc_pool *rx_desc_pool;
rx_desc_pool = &soc->rx_desc_buf[mac_for_pdev];
if (rx_desc_pool->pool_size != 0) {
if (!dp_is_soc_reinit(soc))
dp_rx_desc_nbuf_and_pool_free(soc, mac_for_pdev,
rx_desc_pool);
else
dp_rx_desc_nbuf_free(soc, rx_desc_pool);
}
return;
dp_rx_pdev_desc_pool_free(pdev);
}
static QDF_STATUS
@@ -2655,6 +2641,127 @@ dp_pdev_rx_buffers_attach(struct dp_soc *dp_soc, uint32_t mac_id,
return QDF_STATUS_SUCCESS;
}
/*
* dp_rx_pdev_desc_pool_alloc() - allocate memory for software rx descriptor
* pool
*
* @pdev: core txrx pdev context
*
* Return: QDF_STATUS - QDF_STATUS_SUCCESS
* QDF_STATUS_E_NOMEM
*/
QDF_STATUS
dp_rx_pdev_desc_pool_alloc(struct dp_pdev *pdev)
{
struct dp_soc *soc = pdev->soc;
uint32_t rxdma_entries;
uint32_t rx_sw_desc_weight;
struct dp_srng *dp_rxdma_srng;
struct rx_desc_pool *rx_desc_pool;
uint32_t status = QDF_STATUS_SUCCESS;
int mac_for_pdev;
mac_for_pdev = pdev->lmac_id;
if (wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
"nss-wifi<4> skip Rx refil %d", mac_for_pdev);
status = QDF_STATUS_SUCCESS;
}
dp_rxdma_srng = &soc->rx_refill_buf_ring[mac_for_pdev];
rxdma_entries = dp_rxdma_srng->num_entries;
rx_desc_pool = &soc->rx_desc_buf[mac_for_pdev];
rx_sw_desc_weight = wlan_cfg_get_dp_soc_rx_sw_desc_weight(soc->wlan_cfg_ctx);
status = dp_rx_desc_pool_alloc(soc,
rx_sw_desc_weight * rxdma_entries,
rx_desc_pool);
if (status != QDF_STATUS_SUCCESS)
return status;
rx_desc_pool->owner = DP_WBM2SW_RBM;
rx_desc_pool->buf_size = RX_DATA_BUFFER_SIZE;
rx_desc_pool->buf_alignment = RX_DATA_BUFFER_ALIGNMENT;
return status;
}
/*
* dp_rx_pdev_desc_pool_free() - free software rx descriptor pool
*
* @pdev: core txrx pdev context
*/
void dp_rx_pdev_desc_pool_free(struct dp_pdev *pdev)
{
int mac_for_pdev = pdev->lmac_id;
struct dp_soc *soc = pdev->soc;
struct rx_desc_pool *rx_desc_pool;
rx_desc_pool = &soc->rx_desc_buf[mac_for_pdev];
dp_rx_desc_pool_free(soc, rx_desc_pool);
}
/*
* dp_rx_pdev_desc_pool_init() - initialize software rx descriptors
*
* @pdev: core txrx pdev context
*
* Return: QDF_STATUS - QDF_STATUS_SUCCESS
* QDF_STATUS_E_NOMEM
*/
QDF_STATUS dp_rx_pdev_desc_pool_init(struct dp_pdev *pdev)
{
int mac_for_pdev = pdev->lmac_id;
struct dp_soc *soc = pdev->soc;
uint32_t rxdma_entries;
uint32_t rx_sw_desc_weight;
struct dp_srng *dp_rxdma_srng;
struct rx_desc_pool *rx_desc_pool;
if (wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
"nss-wifi<4> skip Rx refil %d", mac_for_pdev);
return QDF_STATUS_SUCCESS;
}
rx_desc_pool = &soc->rx_desc_buf[mac_for_pdev];
if (dp_rx_desc_pool_is_allocated(rx_desc_pool) == QDF_STATUS_E_NOMEM)
return QDF_STATUS_E_NOMEM;
dp_rxdma_srng = &soc->rx_refill_buf_ring[mac_for_pdev];
rxdma_entries = dp_rxdma_srng->num_entries;
soc->process_rx_status = CONFIG_PROCESS_RX_STATUS;
rx_sw_desc_weight =
wlan_cfg_get_dp_soc_rx_sw_desc_weight(soc->wlan_cfg_ctx);
dp_rx_desc_pool_init(soc, mac_for_pdev,
rx_sw_desc_weight * rxdma_entries,
rx_desc_pool);
return QDF_STATUS_SUCCESS;
}
/*
* dp_rx_pdev_desc_pool_deinit() - de-initialize software rx descriptor pools
* @pdev: core txrx pdev context
*
* This function resets the freelist of rx descriptors and destroys locks
* associated with this list of descriptors.
*/
void dp_rx_pdev_desc_pool_deinit(struct dp_pdev *pdev)
{
int mac_for_pdev = pdev->lmac_id;
struct dp_soc *soc = pdev->soc;
struct rx_desc_pool *rx_desc_pool;
rx_desc_pool = &soc->rx_desc_buf[mac_for_pdev];
dp_rx_desc_pool_deinit(soc, rx_desc_pool);
}
/**
* dp_rx_attach() - attach DP RX
* @pdev: core txrx pdev context
@@ -2669,55 +2776,79 @@ dp_pdev_rx_buffers_attach(struct dp_soc *dp_soc, uint32_t mac_id,
QDF_STATUS
dp_rx_pdev_attach(struct dp_pdev *pdev)
{
uint8_t pdev_id = pdev->pdev_id;
struct dp_soc *soc = pdev->soc;
uint32_t rxdma_entries;
uint32_t rx_sw_desc_weight;
struct dp_srng *dp_rxdma_srng;
struct rx_desc_pool *rx_desc_pool;
QDF_STATUS ret_val;
int mac_for_pdev;
if (wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
"nss-wifi<4> skip Rx refil %d", pdev_id);
"nss-wifi<4> skip Rx refil %d",
pdev->pdev_id);
return QDF_STATUS_SUCCESS;
}
pdev = soc->pdev_list[pdev_id];
mac_for_pdev = pdev->lmac_id;
dp_rxdma_srng = &soc->rx_refill_buf_ring[mac_for_pdev];
if (!dp_is_soc_reinit(soc)) {
ret_val = dp_rx_pdev_desc_pool_alloc(pdev);
if (ret_val != QDF_STATUS_SUCCESS)
return ret_val;
}
rxdma_entries = dp_rxdma_srng->num_entries;
soc->process_rx_status = CONFIG_PROCESS_RX_STATUS;
rx_desc_pool = &soc->rx_desc_buf[mac_for_pdev];
rx_sw_desc_weight = wlan_cfg_get_dp_soc_rx_sw_desc_weight(soc->wlan_cfg_ctx);
dp_rx_desc_pool_alloc(soc, mac_for_pdev,
rx_sw_desc_weight * rxdma_entries,
rx_desc_pool);
rx_desc_pool->owner = DP_WBM2SW_RBM;
rx_desc_pool->buf_size = RX_DATA_BUFFER_SIZE;
rx_desc_pool->buf_alignment = RX_DATA_BUFFER_ALIGNMENT;
/* For Rx buffers, WBM release ring is SW RING 3,for all pdev's */
dp_rx_pdev_desc_pool_init(pdev);
ret_val = dp_rx_fst_attach(soc, pdev);
if ((ret_val != QDF_STATUS_SUCCESS) &&
(ret_val != QDF_STATUS_E_NOSUPPORT)) {
QDF_TRACE(QDF_MODULE_ID_ANY, QDF_TRACE_LEVEL_ERROR,
"RX Flow Search Table attach failed: pdev %d err %d",
pdev_id, ret_val);
pdev->pdev_id, ret_val);
return ret_val;
}
return dp_rx_pdev_buffers_alloc(pdev);
}
/*
* dp_rx_pdev_buffers_alloc() - Allocate nbufs (skbs) and replenish RxDMA ring
*
* @pdev: core txrx pdev context
*
* Return: QDF_STATUS - QDF_STATUS_SUCCESS
* QDF_STATUS_E_NOMEM
*/
QDF_STATUS
dp_rx_pdev_buffers_alloc(struct dp_pdev *pdev)
{
int mac_for_pdev = pdev->lmac_id;
struct dp_soc *soc = pdev->soc;
struct dp_srng *dp_rxdma_srng;
struct rx_desc_pool *rx_desc_pool;
uint32_t rxdma_entries;
dp_rxdma_srng = &soc->rx_refill_buf_ring[mac_for_pdev];
rxdma_entries = dp_rxdma_srng->num_entries;
rx_desc_pool = &soc->rx_desc_buf[mac_for_pdev];
return dp_pdev_rx_buffers_attach(soc, mac_for_pdev, dp_rxdma_srng,
rx_desc_pool, rxdma_entries - 1);
}
/*
* dp_rx_pdev_buffers_free - Free nbufs (skbs)
*
* @pdev: core txrx pdev context
*/
void
dp_rx_pdev_buffers_free(struct dp_pdev *pdev)
{
int mac_for_pdev = pdev->lmac_id;
struct dp_soc *soc = pdev->soc;
struct rx_desc_pool *rx_desc_pool;
rx_desc_pool = &soc->rx_desc_buf[mac_for_pdev];
dp_rx_desc_nbuf_free(soc, rx_desc_pool);
}
/*
* dp_rx_nbuf_prepare() - prepare RX nbuf
* @soc: core txrx main context