qcacmn: Setup RXDMA to software Ring for WMAC1

Setup RxDMA to software ring of both MACs, required for
DBS MCC case.

Change-Id: I1a094c1fafe39a2a41e8867c82c1236c4b9b6593
CRs-Fixed: 2135851
这个提交包含在:
Manjunathappa Prakash
2017-11-10 00:17:24 -08:00
提交者 snandini
父节点 a301c8343d
当前提交 e23acaf21e
修改 6 个文件,包含 115 行新增18 行删除

查看文件

@@ -687,6 +687,12 @@ static uint32_t dp_service_srngs(void *dp_ctx, uint32_t dp_budget)
remaining_quota = budget;
}
}
for (ring = 0; ring < MAX_RX_MAC_RINGS; ring++) {
/* Need to check on this, why is required */
work_done = dp_rxdma_err_process(soc, ring,
remaining_quota);
budget -= work_done;
}
}
if (reo_status_mask)
@@ -1843,6 +1849,21 @@ static int dp_soc_cmn_setup(struct dp_soc *soc)
soc->num_reo_dest_rings = 0;
}
/* LMAC RxDMA to SW Rings configuration */
if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) {
/* Only valid for MCL */
struct dp_pdev *pdev = soc->pdev_list[0];
for (i = 0; i < MAX_RX_MAC_RINGS; i++) {
if (dp_srng_setup(soc, &pdev->rxdma_err_dst_ring[i],
RXDMA_DST, 0, i, RXDMA_ERR_DST_RING_SIZE)) {
QDF_TRACE(QDF_MODULE_ID_DP,
QDF_TRACE_LEVEL_ERROR,
FL("dp_srng_setup failed for rxdma_err_dst_ring"));
goto fail1;
}
}
}
/* TBD: call dp_rx_init to setup Rx SW descriptors */
/* REO reinjection ring */
@@ -2191,11 +2212,13 @@ static struct cdp_pdev *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc,
goto fail1;
}
if (dp_srng_setup(soc, &pdev->rxdma_err_dst_ring, RXDMA_DST, 0,
pdev_id, RXDMA_ERR_DST_RING_SIZE)) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
FL("dp_srng_setup failed for rxdma_mon_dst_ring"));
goto fail1;
if (wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) {
if (dp_srng_setup(soc, &pdev->rxdma_err_dst_ring[0], RXDMA_DST,
0, pdev_id, RXDMA_ERR_DST_RING_SIZE)) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
FL("dp_srng_setup failed for rxdma_err_dst_ring"));
goto fail1;
}
}
/* Setup second Rx refill buffer ring */
@@ -2357,7 +2380,15 @@ static void dp_pdev_detach_wifi3(struct cdp_pdev *txrx_pdev, int force)
dp_srng_cleanup(soc, &pdev->rxdma_mon_desc_ring,
RXDMA_MONITOR_DESC, 0);
dp_srng_cleanup(soc, &pdev->rxdma_err_dst_ring, RXDMA_DST, 0);
if (wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) {
dp_srng_cleanup(soc, &pdev->rxdma_err_dst_ring[0], RXDMA_DST, 0);
} else {
int i;
for (i = 0; i < MAX_RX_MAC_RINGS; i++)
dp_srng_cleanup(soc, &pdev->rxdma_err_dst_ring[i],
RXDMA_DST, 0);
}
soc->pdev_list[pdev->pdev_id] = NULL;
soc->pdev_count--;
@@ -2553,6 +2584,10 @@ static void dp_rxdma_ring_config(struct dp_soc *soc)
pdev->rx_mac_buf_ring[j]
.hal_srng,
RXDMA_BUF);
htt_srng_setup(soc->htt_handle, mac_id,
pdev->rxdma_err_dst_ring[j]
.hal_srng,
RXDMA_DST);
mac_id++;
}
@@ -2572,10 +2607,6 @@ static void dp_rxdma_ring_config(struct dp_soc *soc)
htt_srng_setup(soc->htt_handle, i,
pdev->rxdma_mon_desc_ring.hal_srng,
RXDMA_MONITOR_DESC);
htt_srng_setup(soc->htt_handle, i,
pdev->rxdma_err_dst_ring.hal_srng,
RXDMA_DST);
}
}
}
@@ -2588,6 +2619,8 @@ static void dp_rxdma_ring_config(struct dp_soc *soc)
struct dp_pdev *pdev = soc->pdev_list[i];
if (pdev) {
int ring_idx = dp_get_ring_id_for_mac_id(soc, i);
htt_srng_setup(soc->htt_handle, i,
pdev->rx_refill_buf_ring.hal_srng, RXDMA_BUF);
@@ -2604,8 +2637,8 @@ static void dp_rxdma_ring_config(struct dp_soc *soc)
pdev->rxdma_mon_desc_ring.hal_srng,
RXDMA_MONITOR_DESC);
htt_srng_setup(soc->htt_handle, i,
pdev->rxdma_err_dst_ring.hal_srng,
RXDMA_DST);
pdev->rxdma_err_dst_ring[ring_idx].hal_srng,
RXDMA_DST);
}
}
}
@@ -4134,9 +4167,14 @@ dp_print_ring_stats(struct dp_pdev *pdev)
dp_print_ring_stat_from_hal(pdev->soc,
&pdev->rxdma_mon_desc_ring,
"Rxdma mon desc Ring");
dp_print_ring_stat_from_hal(pdev->soc,
&pdev->rxdma_err_dst_ring,
"Rxdma err dst ring");
for (i = 0; i < MAX_RX_MAC_RINGS; i++) {
snprintf(ring_name, STR_MAXLEN, "Rxdma err dst ring %d", i);
dp_print_ring_stat_from_hal(pdev->soc,
&pdev->rxdma_err_dst_ring[i],
ring_name);
}
for (i = 0; i < MAX_RX_MAC_RINGS; i++) {
snprintf(ring_name, STR_MAXLEN, "Rx mac buf ring %d", i);
dp_print_ring_stat_from_hal(pdev->soc,
@@ -5653,6 +5691,43 @@ fail0:
return NULL;
}
/*
* dp_get_pdev_for_mac_id() - Return pdev for mac_id
*
* @soc: handle to DP soc
* @mac_id: MAC id
*
* Return: Return pdev corresponding to MAC
*/
void *dp_get_pdev_for_mac_id(struct dp_soc *soc, uint32_t mac_id)
{
if (wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx))
return soc->pdev_list[mac_id];
/* Typically for MCL as there only 1 PDEV*/
return soc->pdev_list[0];
}
/*
* dp_get_ring_id_for_mac_id() - Return pdev for mac_id
*
* @soc: handle to DP soc
* @mac_id: MAC id
*
* Return: ring id
*/
int dp_get_ring_id_for_mac_id(struct dp_soc *soc, uint32_t mac_id)
{
/*
* Single pdev using both MACs will operate on both MAC rings,
* which is the case for MCL.
*/
if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx))
return mac_id;
/* For WIN each PDEV will operate one ring, so index is zero. */
return 0;
}
#if defined(CONFIG_WIN) && WDI_EVENT_ENABLE
/*
* dp_set_pktlog_wifi3() - attach txrx vdev