qcacmn: Split dp_mon_link_desc_pool_setup to alloc and init APIs

Split dp_mon_link_desc_pool_setup to alloc and init APIs and
dp_mon_link_desc_pool_cleanup to deinit and 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: I36b2a98bd317010124916e0b2779938eba3883ea
CRs-Fixed: 2663595
这个提交包含在:
phadiman
2020-02-19 18:14:13 +05:30
提交者 nshrivas
父节点 8db0b893b4
当前提交 9798b16f3f
修改 3 个文件,包含 34 行新增245 行删除

查看文件

@@ -1199,216 +1199,15 @@ dp_rx_pdev_mon_buf_detach(struct dp_pdev *pdev, int mac_id)
* Return: QDF_STATUS
*/
static
QDF_STATUS dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id)
QDF_STATUS dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t lmac_id)
{
int link_desc_size = hal_get_link_desc_size(soc->hal_soc);
int link_desc_align = hal_get_link_desc_align(soc->hal_soc);
uint32_t max_alloc_size = wlan_cfg_max_alloc_size(soc->wlan_cfg_ctx);
uint32_t total_link_descs, total_mem_size;
uint32_t num_link_desc_banks;
uint32_t last_bank_size = 0;
uint32_t entry_size, num_entries;
void *mon_desc_srng;
uint32_t num_replenish_buf;
struct dp_srng *dp_srng;
int i;
qdf_dma_addr_t *baseaddr = NULL;
if (!dp_is_soc_reinit(soc))
if (dp_hw_link_desc_pool_banks_alloc(soc, lmac_id))
return QDF_STATUS_E_FAILURE;
dp_srng = &soc->rxdma_mon_desc_ring[mac_id];
num_entries = dp_srng->alloc_size/hal_srng_get_entrysize(
soc->hal_soc, RXDMA_MONITOR_DESC);
/* Round up to power of 2 */
total_link_descs = 1;
while (total_link_descs < num_entries)
total_link_descs <<= 1;
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
"%s: total_link_descs: %u, link_desc_size: %d",
__func__, total_link_descs, link_desc_size);
total_mem_size = total_link_descs * link_desc_size;
total_mem_size += link_desc_align;
if (total_mem_size <= max_alloc_size) {
num_link_desc_banks = 0;
last_bank_size = total_mem_size;
} else {
num_link_desc_banks = (total_mem_size) /
(max_alloc_size - link_desc_align);
last_bank_size = total_mem_size %
(max_alloc_size - link_desc_align);
}
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_WARN,
"%s: total_mem_size: %d, num_link_desc_banks: %u",
__func__, total_mem_size, num_link_desc_banks);
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_WARN,
"%s: max_alloc_size: %d last_bank_size: %d",
__func__, max_alloc_size, last_bank_size);
for (i = 0; i < num_link_desc_banks; i++) {
baseaddr = &soc->mon_link_desc_banks[mac_id][i].
base_paddr_unaligned;
if (!dp_is_soc_reinit(soc)) {
soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned =
qdf_mem_alloc_consistent(soc->osdev,
soc->osdev->dev,
max_alloc_size,
baseaddr);
if (!soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned) {
QDF_TRACE(QDF_MODULE_ID_TXRX,
QDF_TRACE_LEVEL_ERROR,
"%s: Link desc mem alloc failed",
__func__);
goto fail;
}
}
soc->mon_link_desc_banks[mac_id][i].size = max_alloc_size;
soc->mon_link_desc_banks[mac_id][i].base_vaddr =
(void *)((unsigned long)
(soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned) +
((unsigned long)
(soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned) %
link_desc_align));
soc->mon_link_desc_banks[mac_id][i].base_paddr =
(unsigned long)
(soc->mon_link_desc_banks[mac_id][i].
base_paddr_unaligned) +
((unsigned long)
(soc->mon_link_desc_banks[mac_id][i].base_vaddr) -
(unsigned long)
(soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned));
}
if (last_bank_size) {
/* Allocate last bank in case total memory required is not exact
* multiple of max_alloc_size
*/
baseaddr = &soc->mon_link_desc_banks[mac_id][i].
base_paddr_unaligned;
if (!dp_is_soc_reinit(soc)) {
soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned =
qdf_mem_alloc_consistent(soc->osdev,
soc->osdev->dev,
last_bank_size,
baseaddr);
if (!soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned) {
QDF_TRACE(QDF_MODULE_ID_TXRX,
QDF_TRACE_LEVEL_ERROR,
"%s: alloc fail:mon link desc pool",
__func__);
goto fail;
}
}
soc->mon_link_desc_banks[mac_id][i].size =
last_bank_size;
soc->mon_link_desc_banks[mac_id][i].base_vaddr =
(void *)((unsigned long)
(soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned) +
((unsigned long)
(soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned) %
link_desc_align));
soc->mon_link_desc_banks[mac_id][i].base_paddr =
(unsigned long)
(soc->mon_link_desc_banks[mac_id][i].
base_paddr_unaligned) +
((unsigned long)
(soc->mon_link_desc_banks[mac_id][i].base_vaddr) -
(unsigned long)
(soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned));
}
/* Allocate and setup link descriptor idle list for HW internal use */
entry_size = hal_srng_get_entrysize(soc->hal_soc, RXDMA_MONITOR_DESC);
total_mem_size = entry_size * total_link_descs;
mon_desc_srng = soc->rxdma_mon_desc_ring[mac_id].hal_srng;
num_replenish_buf = 0;
if (total_mem_size <= max_alloc_size) {
void *desc;
for (i = 0;
i < MAX_MON_LINK_DESC_BANKS &&
soc->mon_link_desc_banks[mac_id][i].base_paddr;
i++) {
uint32_t num_entries =
(soc->mon_link_desc_banks[mac_id][i].size -
(unsigned long)
(soc->mon_link_desc_banks[mac_id][i].base_vaddr) -
(unsigned long)
(soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned)) / link_desc_size;
unsigned long paddr =
(unsigned long)
(soc->mon_link_desc_banks[mac_id][i].base_paddr);
unsigned long vaddr =
(unsigned long)
(soc->mon_link_desc_banks[mac_id][i].base_vaddr);
hal_srng_access_start_unlocked(soc->hal_soc,
mon_desc_srng);
while (num_entries && (desc =
hal_srng_src_get_next(soc->hal_soc,
mon_desc_srng))) {
hal_set_link_desc_addr(desc, i, paddr);
num_entries--;
num_replenish_buf++;
paddr += link_desc_size;
vaddr += link_desc_size;
}
hal_srng_access_end_unlocked(soc->hal_soc,
mon_desc_srng);
}
} else {
qdf_assert(0);
}
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_WARN,
"%s: successfully replenished %d buffer",
__func__, num_replenish_buf);
dp_link_desc_ring_replenish(soc, lmac_id);
return QDF_STATUS_SUCCESS;
fail:
for (i = 0; i < MAX_MON_LINK_DESC_BANKS; i++) {
if (soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned) {
qdf_mem_free_consistent(soc->osdev, soc->osdev->dev,
soc->mon_link_desc_banks[mac_id][i].
size,
soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned,
soc->mon_link_desc_banks[mac_id][i].
base_paddr_unaligned, 0);
soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned = NULL;
}
}
return QDF_STATUS_E_FAILURE;
}
/*
@@ -1417,22 +1216,7 @@ fail:
static
void dp_mon_link_desc_pool_cleanup(struct dp_soc *soc, uint32_t mac_id)
{
int i;
for (i = 0; i < MAX_MON_LINK_DESC_BANKS; i++) {
if (soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned) {
qdf_mem_free_consistent(soc->osdev, soc->osdev->dev,
soc->mon_link_desc_banks[mac_id][i].
size,
soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned,
soc->mon_link_desc_banks[mac_id][i].
base_paddr_unaligned, 0);
soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned = NULL;
}
}
dp_hw_link_desc_pool_banks_free(soc, mac_id);
}
/**
@@ -1516,11 +1300,11 @@ static QDF_STATUS
dp_rx_pdev_mon_cmn_detach(struct dp_pdev *pdev, int mac_id) {
struct dp_soc *soc = pdev->soc;
uint8_t pdev_id = pdev->pdev_id;
int mac_for_pdev = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev_id);
int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev_id);
dp_mon_link_desc_pool_cleanup(soc, mac_for_pdev);
dp_rx_pdev_mon_status_detach(pdev, mac_for_pdev);
dp_rx_pdev_mon_buf_detach(pdev, mac_for_pdev);
dp_mon_link_desc_pool_cleanup(soc, lmac_id);
dp_rx_pdev_mon_status_detach(pdev, lmac_id);
dp_rx_pdev_mon_buf_detach(pdev, lmac_id);
return QDF_STATUS_SUCCESS;
}
@@ -1540,22 +1324,22 @@ static QDF_STATUS
dp_rx_pdev_mon_cmn_attach(struct dp_pdev *pdev, int mac_id) {
struct dp_soc *soc = pdev->soc;
uint8_t pdev_id = pdev->pdev_id;
int mac_for_pdev = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev_id);
int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev_id);
QDF_STATUS status;
status = dp_rx_pdev_mon_buf_attach(pdev, mac_for_pdev);
status = dp_rx_pdev_mon_buf_attach(pdev, lmac_id);
if (!QDF_IS_STATUS_SUCCESS(status)) {
dp_err("%s: dp_rx_pdev_mon_buf_attach() failed\n", __func__);
goto fail;
}
status = dp_rx_pdev_mon_status_attach(pdev, mac_for_pdev);
status = dp_rx_pdev_mon_status_attach(pdev, lmac_id);
if (!QDF_IS_STATUS_SUCCESS(status)) {
dp_err("%s: dp_rx_pdev_mon_status_attach() failed", __func__);
goto mon_buf_detach;
}
status = dp_mon_link_desc_pool_setup(soc, mac_for_pdev);
status = dp_mon_link_desc_pool_setup(soc, lmac_id);
if (!QDF_IS_STATUS_SUCCESS(status)) {
dp_err("%s: dp_mon_link_desc_pool_setup() failed", __func__);
goto mon_status_detach;
@@ -1564,10 +1348,10 @@ dp_rx_pdev_mon_cmn_attach(struct dp_pdev *pdev, int mac_id) {
return status;
mon_status_detach:
dp_rx_pdev_mon_status_detach(pdev, mac_for_pdev);
dp_rx_pdev_mon_status_detach(pdev, lmac_id);
mon_buf_detach:
dp_rx_pdev_mon_buf_detach(pdev, mac_for_pdev);
dp_rx_pdev_mon_buf_detach(pdev, lmac_id);
fail:
return status;
@@ -1622,13 +1406,11 @@ QDF_STATUS
dp_mon_link_free(struct dp_pdev *pdev) {
uint8_t pdev_id = pdev->pdev_id;
struct dp_soc *soc = pdev->soc;
int mac_id;
int mac_id, lmac_id;
for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) {
int mac_for_pdev = dp_get_lmac_id_for_pdev_id(soc,
mac_id, pdev_id);
dp_mon_link_desc_pool_cleanup(soc, mac_for_pdev);
lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev_id);
dp_mon_link_desc_pool_cleanup(soc, lmac_id);
}
return QDF_STATUS_SUCCESS;