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
This commit is contained in:
@@ -796,16 +796,18 @@ void *dp_rx_cookie_2_mon_link_desc_va(struct dp_pdev *pdev,
|
|||||||
int mac_id)
|
int mac_id)
|
||||||
{
|
{
|
||||||
void *link_desc_va;
|
void *link_desc_va;
|
||||||
|
struct qdf_mem_multi_page_t *pages;
|
||||||
|
uint16_t page_id = LINK_DESC_COOKIE_PAGE_ID(buf_info->sw_cookie);
|
||||||
|
|
||||||
/* TODO */
|
pages = &pdev->soc->mon_link_desc_pages[mac_id];
|
||||||
/* Add sanity for cookie */
|
if (!pages)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
link_desc_va =
|
if (qdf_unlikely(page_id >= pages->num_pages))
|
||||||
pdev->soc->mon_link_desc_banks[mac_id][buf_info->sw_cookie]
|
return NULL;
|
||||||
.base_vaddr +
|
|
||||||
(buf_info->paddr -
|
link_desc_va = pages->dma_pages[page_id].page_v_addr_start +
|
||||||
pdev->soc->mon_link_desc_banks[mac_id][buf_info->sw_cookie]
|
(buf_info->paddr - pages->dma_pages[page_id].page_p_addr);
|
||||||
.base_paddr);
|
|
||||||
|
|
||||||
return link_desc_va;
|
return link_desc_va;
|
||||||
}
|
}
|
||||||
|
@@ -1199,216 +1199,15 @@ dp_rx_pdev_mon_buf_detach(struct dp_pdev *pdev, int mac_id)
|
|||||||
* Return: QDF_STATUS
|
* Return: QDF_STATUS
|
||||||
*/
|
*/
|
||||||
static
|
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);
|
if (!dp_is_soc_reinit(soc))
|
||||||
int link_desc_align = hal_get_link_desc_align(soc->hal_soc);
|
if (dp_hw_link_desc_pool_banks_alloc(soc, lmac_id))
|
||||||
uint32_t max_alloc_size = wlan_cfg_max_alloc_size(soc->wlan_cfg_ctx);
|
return QDF_STATUS_E_FAILURE;
|
||||||
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;
|
|
||||||
|
|
||||||
dp_srng = &soc->rxdma_mon_desc_ring[mac_id];
|
dp_link_desc_ring_replenish(soc, lmac_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);
|
|
||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
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
|
static
|
||||||
void dp_mon_link_desc_pool_cleanup(struct dp_soc *soc, uint32_t mac_id)
|
void dp_mon_link_desc_pool_cleanup(struct dp_soc *soc, uint32_t mac_id)
|
||||||
{
|
{
|
||||||
int i;
|
dp_hw_link_desc_pool_banks_free(soc, mac_id);
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1516,11 +1300,11 @@ static QDF_STATUS
|
|||||||
dp_rx_pdev_mon_cmn_detach(struct dp_pdev *pdev, int mac_id) {
|
dp_rx_pdev_mon_cmn_detach(struct dp_pdev *pdev, int mac_id) {
|
||||||
struct dp_soc *soc = pdev->soc;
|
struct dp_soc *soc = pdev->soc;
|
||||||
uint8_t pdev_id = pdev->pdev_id;
|
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_mon_link_desc_pool_cleanup(soc, lmac_id);
|
||||||
dp_rx_pdev_mon_status_detach(pdev, mac_for_pdev);
|
dp_rx_pdev_mon_status_detach(pdev, lmac_id);
|
||||||
dp_rx_pdev_mon_buf_detach(pdev, mac_for_pdev);
|
dp_rx_pdev_mon_buf_detach(pdev, lmac_id);
|
||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -1540,22 +1324,22 @@ static QDF_STATUS
|
|||||||
dp_rx_pdev_mon_cmn_attach(struct dp_pdev *pdev, int mac_id) {
|
dp_rx_pdev_mon_cmn_attach(struct dp_pdev *pdev, int mac_id) {
|
||||||
struct dp_soc *soc = pdev->soc;
|
struct dp_soc *soc = pdev->soc;
|
||||||
uint8_t pdev_id = pdev->pdev_id;
|
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;
|
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)) {
|
if (!QDF_IS_STATUS_SUCCESS(status)) {
|
||||||
dp_err("%s: dp_rx_pdev_mon_buf_attach() failed\n", __func__);
|
dp_err("%s: dp_rx_pdev_mon_buf_attach() failed\n", __func__);
|
||||||
goto fail;
|
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)) {
|
if (!QDF_IS_STATUS_SUCCESS(status)) {
|
||||||
dp_err("%s: dp_rx_pdev_mon_status_attach() failed", __func__);
|
dp_err("%s: dp_rx_pdev_mon_status_attach() failed", __func__);
|
||||||
goto mon_buf_detach;
|
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)) {
|
if (!QDF_IS_STATUS_SUCCESS(status)) {
|
||||||
dp_err("%s: dp_mon_link_desc_pool_setup() failed", __func__);
|
dp_err("%s: dp_mon_link_desc_pool_setup() failed", __func__);
|
||||||
goto mon_status_detach;
|
goto mon_status_detach;
|
||||||
@@ -1564,10 +1348,10 @@ dp_rx_pdev_mon_cmn_attach(struct dp_pdev *pdev, int mac_id) {
|
|||||||
return status;
|
return status;
|
||||||
|
|
||||||
mon_status_detach:
|
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:
|
mon_buf_detach:
|
||||||
dp_rx_pdev_mon_buf_detach(pdev, mac_for_pdev);
|
dp_rx_pdev_mon_buf_detach(pdev, lmac_id);
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
return status;
|
return status;
|
||||||
@@ -1622,13 +1406,11 @@ QDF_STATUS
|
|||||||
dp_mon_link_free(struct dp_pdev *pdev) {
|
dp_mon_link_free(struct dp_pdev *pdev) {
|
||||||
uint8_t pdev_id = pdev->pdev_id;
|
uint8_t pdev_id = pdev->pdev_id;
|
||||||
struct dp_soc *soc = pdev->soc;
|
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++) {
|
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,
|
lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev_id);
|
||||||
mac_id, pdev_id);
|
dp_mon_link_desc_pool_cleanup(soc, lmac_id);
|
||||||
|
|
||||||
dp_mon_link_desc_pool_cleanup(soc, mac_for_pdev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
|
@@ -2440,4 +2440,9 @@ struct dp_req_rx_hw_stats_t {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void dp_hw_link_desc_pool_banks_free(struct dp_soc *soc, uint32_t mac_id);
|
||||||
|
QDF_STATUS dp_hw_link_desc_pool_banks_alloc(struct dp_soc *soc,
|
||||||
|
uint32_t mac_id);
|
||||||
|
void dp_link_desc_ring_replenish(struct dp_soc *soc, uint32_t mac_id);
|
||||||
|
|
||||||
#endif /* _DP_TYPES_H_ */
|
#endif /* _DP_TYPES_H_ */
|
||||||
|
Reference in New Issue
Block a user