qcacmn: Delay allocation of rings for monitor mode

In existing implementation, for monitor mode below allocation
are done at pdev attach and init time.

	a. 64 monitor buffer allocation for RxDMA monitor buffer ring
	b. Link descriptor memory allocation for monitor link descriptor ring

This memory is waste of memory for customers not using monitor mode and
low memory profile.

To optimize this memory, allocate all buffers and link descriptor memory
at monitor vdev creation time.

Change-Id: I873c76d2f625a782532a101037915b0353928a5b
CRs-Fixed: 2829402
This commit is contained in:
Amir Patel
2020-12-24 14:34:34 +05:30
committed by snandini
parent d36905a34a
commit 76b9febd3d
7 changed files with 189 additions and 30 deletions

View File

@@ -2799,6 +2799,10 @@ QDF_STATUS dp_hw_link_desc_pool_banks_alloc(struct dp_soc *soc, uint32_t mac_id)
MINIDUMP_STR_SIZE);
}
/* If link descriptor banks are allocated, return from here */
if (pages->num_pages)
return QDF_STATUS_SUCCESS;
/* Round up to power of 2 */
*total_link_descs = 1;
while (*total_link_descs < num_entries)
@@ -5056,7 +5060,8 @@ static QDF_STATUS dp_rxdma_ring_config(struct dp_soc *soc)
hal_srng, RXDMA_BUF);
#ifndef DISABLE_MON_CONFIG
if (soc->wlan_cfg_ctx->rxdma1_enable) {
if (soc->wlan_cfg_ctx->rxdma1_enable &&
wlan_cfg_is_delay_mon_replenish(soc->wlan_cfg_ctx)) {
htt_srng_setup(soc->htt_handle, mac_for_pdev,
soc->rxdma_mon_buf_ring[lmac_id].hal_srng,
RXDMA_MONITOR_BUF);
@@ -7318,6 +7323,92 @@ static QDF_STATUS dp_get_peer_mac_from_peer_id(struct cdp_soc_t *soc,
return QDF_STATUS_E_FAILURE;
}
/**
* dp_vdev_set_monitor_mode_rings () - set monitor mode rings
*
* Allocate SW descriptor pool, buffers, link descriptor memory
* Initialize monitor related SRNGs
*
* @pdev: DP pdev object
*
* Return: QDF_STATUS
*/
static QDF_STATUS dp_vdev_set_monitor_mode_rings(struct dp_pdev *pdev,
uint8_t delayed_replenish)
{
struct wlan_cfg_dp_pdev_ctxt *pdev_cfg_ctx;
uint32_t mac_id;
uint32_t mac_for_pdev;
struct dp_soc *soc = pdev->soc;
QDF_STATUS status = QDF_STATUS_SUCCESS;
struct dp_srng *mon_buf_ring;
uint32_t num_entries;
pdev_cfg_ctx = pdev->wlan_cfg_ctx;
/* If monitor rings are aleady initilized, return from here */
if (!pdev->pdev_mon_init)
return QDF_STATUS_SUCCESS;
for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) {
mac_for_pdev = dp_get_lmac_id_for_pdev_id(pdev->soc, mac_id,
pdev->pdev_id);
/* Allocate sw rx descriptor pool for mon RxDMA buffer ring */
status = dp_rx_pdev_mon_buf_desc_pool_alloc(pdev, mac_for_pdev);
if (!QDF_IS_STATUS_SUCCESS(status)) {
dp_err("%s: dp_rx_pdev_mon_buf_desc_pool_alloc() failed\n",
__func__);
goto fail0;
}
dp_rx_pdev_mon_buf_desc_pool_init(pdev, mac_for_pdev);
/* If monitor buffers are already allocated,
* do not allocate.
*/
status = dp_rx_pdev_mon_buf_buffers_alloc(pdev, mac_for_pdev,
delayed_replenish);
mon_buf_ring = &pdev->soc->rxdma_mon_buf_ring[mac_for_pdev];
/*
* Configure low interrupt threshld when monitor mode is
* configured.
*/
if (mon_buf_ring->hal_srng) {
num_entries = mon_buf_ring->num_entries;
hal_set_low_threshold(mon_buf_ring->hal_srng,
num_entries >> 3);
htt_srng_setup(pdev->soc->htt_handle,
pdev->pdev_id,
mon_buf_ring->hal_srng,
RXDMA_MONITOR_BUF);
}
/* Allocate link descriptors for the mon link descriptor ring */
status = dp_hw_link_desc_pool_banks_alloc(soc, mac_for_pdev);
if (!QDF_IS_STATUS_SUCCESS(status)) {
dp_err("%s: dp_hw_link_desc_pool_banks_alloc() failed",
__func__);
goto fail0;
}
dp_link_desc_ring_replenish(soc, mac_for_pdev);
htt_srng_setup(soc->htt_handle, pdev->pdev_id,
soc->rxdma_mon_desc_ring[mac_for_pdev].hal_srng,
RXDMA_MONITOR_DESC);
htt_srng_setup(soc->htt_handle, pdev->pdev_id,
soc->rxdma_mon_dst_ring[mac_for_pdev].hal_srng,
RXDMA_MONITOR_DST);
}
pdev->pdev_mon_init = 1;
return QDF_STATUS_SUCCESS;
fail0:
return QDF_STATUS_E_FAILURE;
}
/**
* dp_vdev_set_monitor_mode() - Set DP VDEV to monitor mode
* @vdev_handle: Datapath VDEV handle
@@ -7325,11 +7416,11 @@ static QDF_STATUS dp_get_peer_mac_from_peer_id(struct cdp_soc_t *soc,
*
* Return: 0 on success, not 0 on failure
*/
static QDF_STATUS dp_vdev_set_monitor_mode(struct cdp_soc_t *soc_hdl,
static QDF_STATUS dp_vdev_set_monitor_mode(struct cdp_soc_t *dp_soc,
uint8_t vdev_id,
uint8_t special_monitor)
{
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
struct dp_soc *soc = (struct dp_soc *)dp_soc;
uint32_t mac_id;
uint32_t mac_for_pdev;
struct dp_pdev *pdev;
@@ -7370,29 +7461,38 @@ static QDF_STATUS dp_vdev_set_monitor_mode(struct cdp_soc_t *soc_hdl,
pdev->monitor_configured = true;
for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) {
mac_for_pdev = dp_get_lmac_id_for_pdev_id(pdev->soc, mac_id,
pdev->pdev_id);
dp_rx_pdev_mon_buf_buffers_alloc(pdev, mac_for_pdev,
FALSE);
/*
* Configure low interrupt threshld when monitor mode is
* configured.
*/
mon_buf_ring = &pdev->soc->rxdma_mon_buf_ring[mac_for_pdev];
if (mon_buf_ring->hal_srng) {
num_entries = mon_buf_ring->num_entries;
hal_set_low_threshold(mon_buf_ring->hal_srng,
num_entries >> 3);
htt_srng_setup(pdev->soc->htt_handle,
pdev->pdev_id,
mon_buf_ring->hal_srng,
RXDMA_MONITOR_BUF);
dp_soc_config_full_mon_mode(pdev, DP_FULL_MON_ENABLE);
/* If delay monitor replenish is disabled, allocate link descriptor
* monitor ring buffers of ring size.
*/
if (!wlan_cfg_is_delay_mon_replenish(soc->wlan_cfg_ctx)) {
dp_vdev_set_monitor_mode_rings(pdev, false);
} else {
for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) {
mac_for_pdev = dp_get_lmac_id_for_pdev_id(pdev->soc,
mac_id,
pdev->pdev_id);
dp_rx_pdev_mon_buf_buffers_alloc(pdev, mac_for_pdev,
FALSE);
mon_buf_ring = &pdev->soc->rxdma_mon_buf_ring[mac_for_pdev];
/*
* Configure low interrupt threshld when monitor mode is
* configured.
*/
if (mon_buf_ring->hal_srng) {
num_entries = mon_buf_ring->num_entries;
hal_set_low_threshold(mon_buf_ring->hal_srng,
num_entries >> 3);
htt_srng_setup(pdev->soc->htt_handle,
pdev->pdev_id,
mon_buf_ring->hal_srng,
RXDMA_MONITOR_BUF);
}
}
}
dp_soc_config_full_mon_mode(pdev, DP_FULL_MON_ENABLE);
dp_mon_filter_setup_mon_mode(pdev);
status = dp_mon_filter_update(pdev);
if (status != QDF_STATUS_SUCCESS) {
@@ -8415,6 +8515,9 @@ dp_config_debug_sniffer(struct dp_pdev *pdev, int val)
pdev->tx_sniffer_enable = 0;
pdev->monitor_configured = true;
if (!wlan_cfg_is_delay_mon_replenish(pdev->soc->wlan_cfg_ctx))
dp_vdev_set_monitor_mode_rings(pdev, true);
/*
* Setup the M copy mode filter.
*/