qcacmn: Data path changes for Dynamic Mode Change FR. Changes include-

1. Move all LMAC rings to SOC from pDEV
	2. Dynamically obtain lmac->pdev mapping while handling LMAC interrupts

Change-Id: Ib017d49243405b62fc34099c01a2b898b25341d0
这个提交包含在:
Amit Shukla
2019-10-24 14:03:39 -07:00
提交者 nshrivas
父节点 3033883308
当前提交 1edfe5ae7c
修改 16 个文件,包含 758 行新增433 行删除

查看文件

@@ -62,11 +62,10 @@ dp_rx_mon_link_desc_return(struct dp_pdev *dp_pdev,
hal_soc_handle_t hal_soc;
QDF_STATUS status = QDF_STATUS_E_FAILURE;
void *src_srng_desc;
int mac_for_pdev = dp_get_mac_id_for_mac(dp_pdev->soc, mac_id);
hal_soc = dp_pdev->soc->hal_soc;
dp_srng = &dp_pdev->rxdma_mon_desc_ring[mac_for_pdev];
dp_srng = &dp_pdev->soc->rxdma_mon_desc_ring[mac_id];
hal_ring_hdl = dp_srng->hal_srng;
qdf_assert(hal_ring_hdl);
@@ -178,9 +177,9 @@ void *dp_rxdma_get_mon_dst_ring(struct dp_pdev *pdev,
uint8_t mac_for_pdev)
{
if (pdev->soc->wlan_cfg_ctx->rxdma1_enable)
return pdev->rxdma_mon_dst_ring[mac_for_pdev].hal_srng;
return pdev->soc->rxdma_mon_dst_ring[mac_for_pdev].hal_srng;
return pdev->rxdma_err_dst_ring[mac_for_pdev].hal_srng;
return pdev->soc->rxdma_err_dst_ring[mac_for_pdev].hal_srng;
}
/**
@@ -196,9 +195,9 @@ struct dp_srng *dp_rxdma_get_mon_buf_ring(struct dp_pdev *pdev,
uint8_t mac_for_pdev)
{
if (pdev->soc->wlan_cfg_ctx->rxdma1_enable)
return &pdev->rxdma_mon_buf_ring[mac_for_pdev];
return &pdev->soc->rxdma_mon_buf_ring[mac_for_pdev];
return &pdev->rx_refill_buf_ring;
return &pdev->soc->rx_refill_buf_ring[mac_for_pdev];
}
/**
@@ -261,7 +260,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
union dp_rx_desc_list_elem_t **head,
union dp_rx_desc_list_elem_t **tail)
{
struct dp_pdev *dp_pdev = dp_get_pdev_for_mac_id(soc, mac_id);
struct dp_pdev *dp_pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
void *rx_desc_tlv;
void *rx_msdu_link_desc;
qdf_nbuf_t msdu;
@@ -557,7 +556,7 @@ qdf_nbuf_t dp_rx_mon_restitch_mpdu_from_msdus(struct dp_soc *soc,
unsigned char *dest;
struct ieee80211_frame *wh;
struct ieee80211_qoscntl *qos;
struct dp_pdev *dp_pdev = dp_get_pdev_for_mac_id(soc, mac_id);
struct dp_pdev *dp_pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
head_frag_list = NULL;
mpdu_buf = NULL;
@@ -936,7 +935,7 @@ void dp_rx_extract_radiotap_info(struct cdp_mon_status *rx_status,
QDF_STATUS dp_rx_mon_deliver(struct dp_soc *soc, uint32_t mac_id,
qdf_nbuf_t head_msdu, qdf_nbuf_t tail_msdu)
{
struct dp_pdev *pdev = dp_get_pdev_for_mac_id(soc, mac_id);
struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
struct cdp_mon_status *rs = &pdev->rx_mon_recv_status;
qdf_nbuf_t mon_skb, skb_next;
qdf_nbuf_t mon_mpdu = NULL;
@@ -1011,7 +1010,7 @@ mon_deliver_fail:
QDF_STATUS dp_rx_mon_deliver_non_std(struct dp_soc *soc,
uint32_t mac_id)
{
struct dp_pdev *pdev = dp_get_pdev_for_mac_id(soc, mac_id);
struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
ol_txrx_rx_mon_fp osif_rx_mon;
qdf_nbuf_t dummy_msdu;
@@ -1073,7 +1072,7 @@ mon_deliver_non_std_fail:
*/
void dp_rx_mon_dest_process(struct dp_soc *soc, uint32_t mac_id, uint32_t quota)
{
struct dp_pdev *pdev = dp_get_pdev_for_mac_id(soc, mac_id);
struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
uint8_t pdev_id;
hal_rxdma_desc_t rxdma_dst_ring_desc;
hal_soc_handle_t hal_soc;
@@ -1083,7 +1082,7 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, uint32_t mac_id, uint32_t quota)
uint32_t ppdu_id;
uint32_t rx_bufs_used;
uint32_t mpdu_rx_bufs_used;
int mac_for_pdev = dp_get_mac_id_for_mac(soc, mac_id);
int mac_for_pdev = mac_id;
struct cdp_pdev_mon_stats *rx_mon_stats;
mon_dst_srng = dp_rxdma_get_mon_dst_ring(pdev, mac_for_pdev);
@@ -1205,10 +1204,9 @@ dp_rx_pdev_mon_buf_attach(struct dp_pdev *pdev, int mac_id) {
uint32_t num_entries;
struct rx_desc_pool *rx_desc_pool;
QDF_STATUS status = QDF_STATUS_SUCCESS;
uint8_t mac_for_pdev = dp_get_mac_id_for_mac(soc, mac_id);
uint32_t rx_desc_pool_size, replenish_size;
mon_buf_ring = &pdev->rxdma_mon_buf_ring[mac_for_pdev];
mon_buf_ring = &soc->rxdma_mon_buf_ring[mac_id];
num_entries = mon_buf_ring->num_entries;
@@ -1264,8 +1262,6 @@ dp_rx_pdev_mon_buf_detach(struct dp_pdev *pdev, int mac_id)
static
QDF_STATUS dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id)
{
struct dp_pdev *dp_pdev = dp_get_pdev_for_mac_id(soc, mac_id);
int mac_for_pdev = dp_get_mac_id_for_mac(soc, mac_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);
@@ -1279,7 +1275,7 @@ QDF_STATUS dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id)
int i;
qdf_dma_addr_t *baseaddr = NULL;
dp_srng = &dp_pdev->rxdma_mon_desc_ring[mac_for_pdev];
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);
@@ -1315,17 +1311,17 @@ QDF_STATUS dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id)
__func__, max_alloc_size, last_bank_size);
for (i = 0; i < num_link_desc_banks; i++) {
baseaddr = &dp_pdev->link_desc_banks[mac_for_pdev][i].
baseaddr = &soc->mon_link_desc_banks[mac_id][i].
base_paddr_unaligned;
if (!dp_is_soc_reinit(soc)) {
dp_pdev->link_desc_banks[mac_for_pdev][i].
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 (!dp_pdev->link_desc_banks[mac_for_pdev][i].
if (!soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned) {
QDF_TRACE(QDF_MODULE_ID_TXRX,
QDF_TRACE_LEVEL_ERROR,
@@ -1334,25 +1330,25 @@ QDF_STATUS dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id)
goto fail;
}
}
dp_pdev->link_desc_banks[mac_for_pdev][i].size = max_alloc_size;
soc->mon_link_desc_banks[mac_id][i].size = max_alloc_size;
dp_pdev->link_desc_banks[mac_for_pdev][i].base_vaddr =
soc->mon_link_desc_banks[mac_id][i].base_vaddr =
(void *)((unsigned long)
(dp_pdev->link_desc_banks[mac_for_pdev][i].
(soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned) +
((unsigned long)
(dp_pdev->link_desc_banks[mac_for_pdev][i].
(soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned) %
link_desc_align));
dp_pdev->link_desc_banks[mac_for_pdev][i].base_paddr =
soc->mon_link_desc_banks[mac_id][i].base_paddr =
(unsigned long)
(dp_pdev->link_desc_banks[mac_for_pdev][i].
(soc->mon_link_desc_banks[mac_id][i].
base_paddr_unaligned) +
((unsigned long)
(dp_pdev->link_desc_banks[mac_for_pdev][i].base_vaddr) -
(soc->mon_link_desc_banks[mac_id][i].base_vaddr) -
(unsigned long)
(dp_pdev->link_desc_banks[mac_for_pdev][i].
(soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned));
}
@@ -1360,17 +1356,17 @@ QDF_STATUS dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id)
/* Allocate last bank in case total memory required is not exact
* multiple of max_alloc_size
*/
baseaddr = &dp_pdev->link_desc_banks[mac_for_pdev][i].
baseaddr = &soc->mon_link_desc_banks[mac_id][i].
base_paddr_unaligned;
if (!dp_is_soc_reinit(soc)) {
dp_pdev->link_desc_banks[mac_for_pdev][i].
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 (!dp_pdev->link_desc_banks[mac_for_pdev][i].
if (!soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned) {
QDF_TRACE(QDF_MODULE_ID_TXRX,
QDF_TRACE_LEVEL_ERROR,
@@ -1379,33 +1375,34 @@ QDF_STATUS dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id)
goto fail;
}
}
dp_pdev->link_desc_banks[mac_for_pdev][i].size = last_bank_size;
soc->mon_link_desc_banks[mac_id][i].size =
last_bank_size;
dp_pdev->link_desc_banks[mac_for_pdev][i].base_vaddr =
soc->mon_link_desc_banks[mac_id][i].base_vaddr =
(void *)((unsigned long)
(dp_pdev->link_desc_banks[mac_for_pdev][i].
base_vaddr_unaligned) +
(soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned) +
((unsigned long)
(dp_pdev->link_desc_banks[mac_for_pdev][i].
base_vaddr_unaligned) %
(soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned) %
link_desc_align));
dp_pdev->link_desc_banks[mac_for_pdev][i].base_paddr =
soc->mon_link_desc_banks[mac_id][i].base_paddr =
(unsigned long)
(dp_pdev->link_desc_banks[mac_for_pdev][i].
base_paddr_unaligned) +
(soc->mon_link_desc_banks[mac_id][i].
base_paddr_unaligned) +
((unsigned long)
(dp_pdev->link_desc_banks[mac_for_pdev][i].base_vaddr) -
(soc->mon_link_desc_banks[mac_id][i].base_vaddr) -
(unsigned long)
(dp_pdev->link_desc_banks[mac_for_pdev][i].
base_vaddr_unaligned));
(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 = dp_pdev->rxdma_mon_desc_ring[mac_for_pdev].hal_srng;
mon_desc_srng = soc->rxdma_mon_desc_ring[mac_id].hal_srng;
num_replenish_buf = 0;
@@ -1414,22 +1411,22 @@ QDF_STATUS dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id)
for (i = 0;
i < MAX_MON_LINK_DESC_BANKS &&
dp_pdev->link_desc_banks[mac_for_pdev][i].base_paddr;
i++) {
i < MAX_MON_LINK_DESC_BANKS &&
soc->mon_link_desc_banks[mac_id][i].base_paddr;
i++) {
uint32_t num_entries =
(dp_pdev->link_desc_banks[mac_for_pdev][i].size -
(soc->mon_link_desc_banks[mac_id][i].size -
(unsigned long)
(dp_pdev->link_desc_banks[mac_for_pdev][i].base_vaddr) -
(soc->mon_link_desc_banks[mac_id][i].base_vaddr) -
(unsigned long)
(dp_pdev->link_desc_banks[mac_for_pdev][i].
(soc->mon_link_desc_banks[mac_id][i].
base_vaddr_unaligned)) / link_desc_size;
unsigned long paddr =
(unsigned long)
(dp_pdev->link_desc_banks[mac_for_pdev][i].base_paddr);
(soc->mon_link_desc_banks[mac_id][i].base_paddr);
unsigned long vaddr =
(unsigned long)
(dp_pdev->link_desc_banks[mac_for_pdev][i].base_vaddr);
(soc->mon_link_desc_banks[mac_id][i].base_vaddr);
hal_srng_access_start_unlocked(soc->hal_soc,
mon_desc_srng);
@@ -1438,7 +1435,7 @@ QDF_STATUS dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id)
hal_srng_src_get_next(soc->hal_soc,
mon_desc_srng))) {
hal_set_link_desc_addr(desc, i, paddr);
hal_set_link_desc_addr(desc, i, paddr);
num_entries--;
num_replenish_buf++;
paddr += link_desc_size;
@@ -1459,16 +1456,17 @@ QDF_STATUS dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id)
fail:
for (i = 0; i < MAX_MON_LINK_DESC_BANKS; i++) {
if (dp_pdev->link_desc_banks[mac_for_pdev][i].
base_vaddr_unaligned) {
qdf_mem_free_consistent(soc->osdev, soc->osdev->dev,
dp_pdev->link_desc_banks[mac_for_pdev][i].size,
dp_pdev->link_desc_banks[mac_for_pdev][i].
base_vaddr_unaligned,
dp_pdev->link_desc_banks[mac_for_pdev][i].
base_paddr_unaligned, 0);
dp_pdev->link_desc_banks[mac_for_pdev][i].
base_vaddr_unaligned = NULL;
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;
@@ -1480,21 +1478,20 @@ fail:
static
void dp_mon_link_desc_pool_cleanup(struct dp_soc *soc, uint32_t mac_id)
{
struct dp_pdev *dp_pdev = dp_get_pdev_for_mac_id(soc, mac_id);
int mac_for_pdev = dp_get_mac_id_for_mac(soc, mac_id);
int i;
for (i = 0; i < MAX_MON_LINK_DESC_BANKS; i++) {
if (dp_pdev->link_desc_banks[mac_for_pdev][i].
base_vaddr_unaligned) {
qdf_mem_free_consistent(soc->osdev, soc->osdev->dev,
dp_pdev->link_desc_banks[mac_for_pdev][i].size,
dp_pdev->link_desc_banks[mac_for_pdev][i].
base_vaddr_unaligned,
dp_pdev->link_desc_banks[mac_for_pdev][i].
base_paddr_unaligned, 0);
dp_pdev->link_desc_banks[mac_for_pdev][i].
base_vaddr_unaligned = NULL;
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;
}
}
}
@@ -1512,27 +1509,25 @@ void dp_mon_buf_delayed_replenish(struct dp_pdev *pdev)
union dp_rx_desc_list_elem_t *tail = NULL;
union dp_rx_desc_list_elem_t *desc_list = NULL;
uint32_t num_entries;
uint32_t mac_id, id;
uint32_t id;
soc = pdev->soc;
num_entries = wlan_cfg_get_dma_mon_buf_ring_size(pdev->wlan_cfg_ctx);
for (id = 0; id < NUM_RXDMA_RINGS_PER_PDEV; id++) {
mac_for_pdev = dp_get_mac_id_for_pdev(id,
pdev->pdev_id);
/*
* Map mac_for_pdev appropriately for both MCL & WIN,
* Get mac_for_pdev appropriately for both MCL & WIN,
* since MCL have multiple mon buf rings and WIN just
* has one mon buffer ring, below API helps identify
* accurate buffer_ring for both cases
* has one mon buffer ring mapped per pdev, below API
* helps identify accurate buffer_ring for both cases
*
*/
mac_id = dp_get_mac_id_for_mac(soc, mac_for_pdev);
mac_for_pdev =
dp_get_lmac_id_for_pdev_id(soc, id, pdev->pdev_id);
dp_rx_buffers_replenish(soc, mac_for_pdev,
dp_rxdma_get_mon_buf_ring(pdev,
mac_id),
mac_for_pdev),
dp_rx_get_mon_desc_pool(soc,
mac_for_pdev,
pdev->pdev_id),
@@ -1582,7 +1577,7 @@ 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_mac_id_for_pdev(mac_id, pdev_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);
dp_rx_pdev_mon_status_detach(pdev, mac_for_pdev);
@@ -1606,7 +1601,7 @@ 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_mac_id_for_pdev(mac_id, pdev_id);
int mac_for_pdev = 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);
@@ -1688,7 +1683,8 @@ dp_mon_link_free(struct dp_pdev *pdev) {
int mac_id;
for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) {
int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, pdev_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);
}
@@ -1713,7 +1709,8 @@ dp_rx_pdev_mon_detach(struct dp_pdev *pdev) {
qdf_spinlock_destroy(&pdev->mon_lock);
for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) {
int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, pdev_id);
int mac_for_pdev = dp_get_lmac_id_for_pdev_id(pdev->soc,
mac_id, pdev_id);
dp_rx_pdev_mon_status_detach(pdev, mac_for_pdev);
dp_rx_pdev_mon_buf_detach(pdev, mac_for_pdev);