qcacmn: MCL Buffer Replenishment
Add support for replenishing the rx buffers using the host to firmware buffer ring. This includes adding a flag QCA_HOST2FW_RXBUF_RING: When QCA_HOST2FW_RXBUF_RING is enabled the host will do the following: - Allocate the refill buffer ring (HTT_HOST1_TO_FW_RXBUF_RING) and populate it with rx buffers - Send the refill buffer ring configuration to the firmware - Allocate the rx DMA ring (HTT_RXDMA_HOST_BUF_RING), leave it empty. - Send the rx DMA ring configuration to the firmware When QCA_HOST2FW_RXBUF_RING is disabled, the host will do the following: - Allocate the rx DMA ring (HTT_RXDMA_HOST_BUF_RING), and populate it with rx buffers - Send the rx DMA ring configuration to the firmware CRs-Fixed: 1074199 Change-Id: Iec05a973cd9d628c742e3aaa16b8dabc7797625d
This commit is contained in:

committed by
qcabuildsw

parent
e3df35488a
commit
7351d17b41
@@ -264,13 +264,33 @@ int htt_srng_setup(void *htt_soc, int pdev_id, void *hal_srng,
|
|||||||
|
|
||||||
switch (hal_ring_type) {
|
switch (hal_ring_type) {
|
||||||
case RXDMA_BUF:
|
case RXDMA_BUF:
|
||||||
#if QCA_HOST2FW_RXBUF_RING
|
switch (srng_params.ring_id) {
|
||||||
htt_ring_id = HTT_HOST1_TO_FW_RXBUF_RING;
|
case HAL_SRNG_WMAC1_SW2RXDMA0_BUF:
|
||||||
htt_ring_type = HTT_SW_TO_SW_RING;
|
#ifdef QCA_HOST2FW_RXBUF_RING
|
||||||
|
htt_ring_id = HTT_HOST1_TO_FW_RXBUF_RING;
|
||||||
|
htt_ring_type = HTT_SW_TO_SW_RING;
|
||||||
#else
|
#else
|
||||||
htt_ring_id = HTT_RXDMA_HOST_BUF_RING;
|
htt_ring_id = HTT_RXDMA_HOST_BUF_RING;
|
||||||
htt_ring_type = HTT_SW_TO_HW_RING;
|
htt_ring_type = HTT_SW_TO_HW_RING;
|
||||||
#endif
|
#endif
|
||||||
|
break;
|
||||||
|
case HAL_SRNG_WMAC1_SW2RXDMA1_BUF:
|
||||||
|
htt_ring_id = HTT_RXDMA_HOST_BUF_RING;
|
||||||
|
htt_ring_type = HTT_SW_TO_HW_RING;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
||||||
|
"%s: Ring %d currently not supported\n",
|
||||||
|
__func__, srng_params.ring_id);
|
||||||
|
goto fail1;
|
||||||
|
}
|
||||||
|
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
||||||
|
"%s: ring_type %d ring_id %d\n",
|
||||||
|
__func__, hal_ring_type, srng_params.ring_id);
|
||||||
|
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
||||||
|
"hp_addr 0x%x tp_addr 0x%x\n", hp_addr, tp_addr);
|
||||||
|
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
||||||
|
"htt_ring_id %d\n", htt_ring_id);
|
||||||
break;
|
break;
|
||||||
case RXDMA_MONITOR_BUF:
|
case RXDMA_MONITOR_BUF:
|
||||||
htt_ring_id = HTT_RXDMA_MONITOR_BUF_RING;
|
htt_ring_id = HTT_RXDMA_MONITOR_BUF_RING;
|
||||||
|
@@ -768,14 +768,20 @@ void *dp_pdev_attach_wifi3(void *txrx_soc, void *ctrl_pdev,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dp_srng_setup(soc, &pdev->rxdma_buf_ring, RXDMA_BUF, 0, pdev_id,
|
if (dp_srng_setup(soc, &pdev->rx_refill_buf_ring, RXDMA_BUF, 0, pdev_id,
|
||||||
RXDMA_BUF_RING_SIZE)) {
|
RXDMA_BUF_RING_SIZE)) {
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
||||||
"%s: dp_srng_setup failed for rxdma_buf_ring\n",
|
"%s: dp_srng_setup failed rx refill ring\n", __func__);
|
||||||
__func__);
|
|
||||||
goto fail0;
|
goto fail0;
|
||||||
}
|
}
|
||||||
|
#ifdef QCA_HOST2FW_RXBUF_RING
|
||||||
|
if (dp_srng_setup(soc, &pdev->rx_mac_buf_ring, RXDMA_BUF, 1, pdev_id,
|
||||||
|
RXDMA_BUF_RING_SIZE)) {
|
||||||
|
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
||||||
|
"%s: dp_srng_setup failed rx mac ring\n", __func__);
|
||||||
|
goto fail0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
/* TODO: RXDMA destination ring is not planned to be used currently.
|
/* TODO: RXDMA destination ring is not planned to be used currently.
|
||||||
* Setup the ring when required
|
* Setup the ring when required
|
||||||
*/
|
*/
|
||||||
@@ -837,8 +843,11 @@ static void dp_pdev_detach_wifi3(void *txrx_pdev, int force)
|
|||||||
REO_DST, pdev->pdev_id);
|
REO_DST, pdev->pdev_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
dp_srng_cleanup(soc, &pdev->rxdma_buf_ring, RXDMA_BUF, 0);
|
dp_srng_cleanup(soc, &pdev->rx_refill_buf_ring, RXDMA_BUF, 0);
|
||||||
|
|
||||||
|
#ifdef QCA_HOST2FW_RXBUF_RING
|
||||||
|
dp_srng_cleanup(soc, &pdev->rx_mac_buf_ring, RXDMA_BUF, 1);
|
||||||
|
#endif
|
||||||
dp_srng_cleanup(soc, &pdev->rxdma_mon_buf_ring, RXDMA_MONITOR_BUF, 0);
|
dp_srng_cleanup(soc, &pdev->rxdma_mon_buf_ring, RXDMA_MONITOR_BUF, 0);
|
||||||
|
|
||||||
dp_srng_cleanup(soc, &pdev->rxdma_mon_dst_ring, RXDMA_MONITOR_DST, 0);
|
dp_srng_cleanup(soc, &pdev->rxdma_mon_dst_ring, RXDMA_MONITOR_DST, 0);
|
||||||
@@ -939,7 +948,11 @@ int dp_soc_attach_target_wifi3(void *txrx_soc)
|
|||||||
struct dp_pdev *pdev = soc->pdev_list[i];
|
struct dp_pdev *pdev = soc->pdev_list[i];
|
||||||
if (pdev) {
|
if (pdev) {
|
||||||
htt_srng_setup(soc->htt_handle, i,
|
htt_srng_setup(soc->htt_handle, i,
|
||||||
pdev->rxdma_buf_ring.hal_srng, RXDMA_BUF);
|
pdev->rx_refill_buf_ring.hal_srng, RXDMA_BUF);
|
||||||
|
#ifdef QCA_HOST2FW_RXBUF_RING
|
||||||
|
htt_srng_setup(soc->htt_handle, i,
|
||||||
|
pdev->rx_mac_buf_ring.hal_srng, RXDMA_BUF);
|
||||||
|
#endif
|
||||||
#ifdef notyet /* FW doesn't handle monitor rings yet */
|
#ifdef notyet /* FW doesn't handle monitor rings yet */
|
||||||
htt_srng_setup(soc->htt_handle, i,
|
htt_srng_setup(soc->htt_handle, i,
|
||||||
pdev->rxdma_mon_buf_ring.hal_srng,
|
pdev->rxdma_mon_buf_ring.hal_srng,
|
||||||
|
@@ -62,7 +62,7 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id,
|
|||||||
qdf_nbuf_t rx_netbuf;
|
qdf_nbuf_t rx_netbuf;
|
||||||
void *rxdma_ring_entry;
|
void *rxdma_ring_entry;
|
||||||
union dp_rx_desc_list_elem_t *next;
|
union dp_rx_desc_list_elem_t *next;
|
||||||
struct dp_srng *dp_rxdma_srng = &dp_pdev->rxdma_buf_ring;
|
struct dp_srng *dp_rxdma_srng = &dp_pdev->rx_refill_buf_ring;
|
||||||
void *rxdma_srng = dp_rxdma_srng->hal_srng;
|
void *rxdma_srng = dp_rxdma_srng->hal_srng;
|
||||||
|
|
||||||
if (!rxdma_srng) {
|
if (!rxdma_srng) {
|
||||||
@@ -425,7 +425,7 @@ dp_rx_pdev_attach(struct dp_pdev *pdev)
|
|||||||
|
|
||||||
qdf_spinlock_create(&soc->rx_desc_mutex[pdev_id]);
|
qdf_spinlock_create(&soc->rx_desc_mutex[pdev_id]);
|
||||||
pdev = soc->pdev_list[pdev_id];
|
pdev = soc->pdev_list[pdev_id];
|
||||||
rxdma_srng = pdev->rxdma_buf_ring;
|
rxdma_srng = pdev->rx_refill_buf_ring;
|
||||||
|
|
||||||
rxdma_entries = rxdma_srng.alloc_size/hal_srng_get_entrysize(
|
rxdma_entries = rxdma_srng.alloc_size/hal_srng_get_entrysize(
|
||||||
soc->hal_soc, RXDMA_BUF);
|
soc->hal_soc, RXDMA_BUF);
|
||||||
|
@@ -32,7 +32,7 @@ QDF_STATUS dp_rx_desc_pool_alloc(struct dp_soc *soc, uint32_t pool_id)
|
|||||||
{
|
{
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
struct dp_pdev *dp_pdev = soc->pdev_list[pool_id];
|
struct dp_pdev *dp_pdev = soc->pdev_list[pool_id];
|
||||||
struct dp_srng *rxdma_srng = &dp_pdev->rxdma_buf_ring;
|
struct dp_srng *rxdma_srng = &dp_pdev->rx_refill_buf_ring;
|
||||||
|
|
||||||
soc->rx_desc[pool_id].array = qdf_mem_malloc(
|
soc->rx_desc[pool_id].array = qdf_mem_malloc(
|
||||||
((rxdma_srng->alloc_size/hal_srng_get_entrysize(soc->hal_soc,
|
((rxdma_srng->alloc_size/hal_srng_get_entrysize(soc->hal_soc,
|
||||||
|
@@ -291,8 +291,11 @@ struct dp_pdev {
|
|||||||
/* TXRX SOC handle */
|
/* TXRX SOC handle */
|
||||||
struct dp_soc *soc;
|
struct dp_soc *soc;
|
||||||
|
|
||||||
/* RXDMA buffer replenish ring */
|
/* Ring used to replenish rx buffers (maybe to the firmware of MAC) */
|
||||||
struct dp_srng rxdma_buf_ring;
|
struct dp_srng rx_refill_buf_ring;
|
||||||
|
|
||||||
|
/* Empty ring used by firmware to post rx buffers to the MAC */
|
||||||
|
struct dp_srng rx_mac_buf_ring;
|
||||||
|
|
||||||
/* RXDMA monitor buffer replenish ring */
|
/* RXDMA monitor buffer replenish ring */
|
||||||
struct dp_srng rxdma_mon_buf_ring;
|
struct dp_srng rxdma_mon_buf_ring;
|
||||||
|
@@ -120,6 +120,8 @@ struct hal_srng_params {
|
|||||||
uint32_t low_threshold;
|
uint32_t low_threshold;
|
||||||
/* Misc flags */
|
/* Misc flags */
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
|
/* Unique ring id */
|
||||||
|
uint8_t ring_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -111,11 +111,12 @@ enum hal_srng_ring_id {
|
|||||||
HAL_SRNG_LMAC1_ID_START = 128,
|
HAL_SRNG_LMAC1_ID_START = 128,
|
||||||
HAL_SRNG_WMAC1_SW2RXDMA0_BUF = HAL_SRNG_LMAC1_ID_START,
|
HAL_SRNG_WMAC1_SW2RXDMA0_BUF = HAL_SRNG_LMAC1_ID_START,
|
||||||
HAL_SRNG_WMAC1_SW2RXDMA1_BUF = 129,
|
HAL_SRNG_WMAC1_SW2RXDMA1_BUF = 129,
|
||||||
HAL_SRNG_WMAC1_SW2RXDMA0_STATBUF = 130,
|
HAL_SRNG_WMAC1_SW2RXDMA2_BUF = 130,
|
||||||
HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF = 131,
|
HAL_SRNG_WMAC1_SW2RXDMA0_STATBUF = 131,
|
||||||
HAL_SRNG_WMAC1_RXDMA2SW0 = 132,
|
HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF = 132,
|
||||||
HAL_SRNG_WMAC1_RXDMA2SW1 = 133,
|
HAL_SRNG_WMAC1_RXDMA2SW0 = 133,
|
||||||
/* 134-142 unused */
|
HAL_SRNG_WMAC1_RXDMA2SW1 = 134,
|
||||||
|
/* 135-142 unused */
|
||||||
HAL_SRNG_LMAC1_ID_END = 143
|
HAL_SRNG_LMAC1_ID_END = 143
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -426,7 +426,7 @@ static struct hal_hw_srng_config hw_srng_table[] = {
|
|||||||
},
|
},
|
||||||
{ /* RXDMA_BUF */
|
{ /* RXDMA_BUF */
|
||||||
.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA0_BUF,
|
.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA0_BUF,
|
||||||
.max_rings = 1,
|
.max_rings = 2,
|
||||||
/* TODO: Check if the additional IPA buffer ring needs to be
|
/* TODO: Check if the additional IPA buffer ring needs to be
|
||||||
* setup here (in which case max_rings should be set to 2),
|
* setup here (in which case max_rings should be set to 2),
|
||||||
* or it will be setup by IPA host driver
|
* or it will be setup by IPA host driver
|
||||||
@@ -453,7 +453,7 @@ static struct hal_hw_srng_config hw_srng_table[] = {
|
|||||||
.reg_size = {},
|
.reg_size = {},
|
||||||
},
|
},
|
||||||
{ /* RXDMA_MONITOR_BUF */
|
{ /* RXDMA_MONITOR_BUF */
|
||||||
.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_BUF,
|
.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA2_BUF,
|
||||||
.max_rings = 1,
|
.max_rings = 1,
|
||||||
.entry_size = sizeof(struct wbm_buffer_ring) >> 2,
|
.entry_size = sizeof(struct wbm_buffer_ring) >> 2,
|
||||||
.lmac_ring = TRUE,
|
.lmac_ring = TRUE,
|
||||||
@@ -944,4 +944,5 @@ extern void hal_get_srng_params(void *hal_soc, void *hal_ring,
|
|||||||
srng->intr_batch_cntr_thres_entries;
|
srng->intr_batch_cntr_thres_entries;
|
||||||
ring_params->low_threshold = srng->u.src_ring.low_threshold;
|
ring_params->low_threshold = srng->u.src_ring.low_threshold;
|
||||||
ring_params->flags = srng->flags;
|
ring_params->flags = srng->flags;
|
||||||
|
ring_params->ring_id = srng->ring_id;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user