diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 4485b3e0b5..ba4a6998b8 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -1666,6 +1666,114 @@ static void dp_soc_reset_cpu_ring_map(struct dp_soc *soc) } } +/* + * dp_soc_ring_if_nss_offloaded() - find if ring is offloaded to NSS + * @dp_soc - DP soc handle + * @ring_type - ring type + * @ring_num - ring_num + * + * return 0 or 1 + */ +static uint8_t dp_soc_ring_if_nss_offloaded(struct dp_soc *soc, enum hal_ring_type ring_type, int ring_num) +{ + uint8_t nss_config = wlan_cfg_get_dp_soc_nss_cfg(soc->wlan_cfg_ctx); + uint8_t status = 0; + + switch (ring_type) { + case WBM2SW_RELEASE: + case REO_DST: + status = ((nss_config) & (1 << ring_num)); + break; + default: + break; + } + + return status; +} + +/* + * dp_soc_reset_intr_mask() - reset interrupt mask + * @dp_soc - DP Soc handle + * + * Return: Return void + */ +static void dp_soc_reset_intr_mask(struct dp_soc *soc) +{ + uint8_t j; + int *grp_mask = NULL; + int group_number, mask, num_ring; + + /* number of tx ring */ + num_ring = wlan_cfg_num_tcl_data_rings(soc->wlan_cfg_ctx); + + /* + * group mask for tx completion ring. + */ + grp_mask = &soc->wlan_cfg_ctx->int_tx_ring_mask[0]; + + /* loop and reset the mask for only offloaded ring */ + for (j = 0; j < num_ring; j++) { + if (!dp_soc_ring_if_nss_offloaded(soc, WBM2SW_RELEASE, j)) { + continue; + } + + /* + * Group number corresponding to tx offloaded ring. + */ + group_number = dp_srng_find_ring_in_mask(j, grp_mask); + if (group_number < 0) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, + FL("ring not part of an group; ring_type: %d,ring_num %d"), + WBM2SW_RELEASE, j); + return; + } + + /* reset the tx mask for offloaded ring */ + mask = wlan_cfg_get_tx_ring_mask(soc->wlan_cfg_ctx, group_number); + mask &= (~(1 << j)); + + /* + * reset the interrupt mask for offloaded ring. + */ + wlan_cfg_set_tx_ring_mask(soc->wlan_cfg_ctx, group_number, mask); + } + + /* number of rx rings */ + num_ring = wlan_cfg_num_reo_dest_rings(soc->wlan_cfg_ctx); + + /* + * group mask for reo destination ring. + */ + grp_mask = &soc->wlan_cfg_ctx->int_rx_ring_mask[0]; + + /* loop and reset the mask for only offloaded ring */ + for (j = 0; j < num_ring; j++) { + if (!dp_soc_ring_if_nss_offloaded(soc, REO_DST, j)) { + continue; + } + + /* + * Group number corresponding to rx offloaded ring. + */ + group_number = dp_srng_find_ring_in_mask(j, grp_mask); + if (group_number < 0) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, + FL("ring not part of an group; ring_type: %d,ring_num %d"), + REO_DST, j); + return; + } + + /* set the interrupt mask for offloaded ring */ + mask = wlan_cfg_get_rx_ring_mask(soc->wlan_cfg_ctx, group_number); + mask &= (~(1 << j)); + + /* + * set the interrupt mask to zero for rx offloaded radio. + */ + wlan_cfg_set_rx_ring_mask(soc->wlan_cfg_ctx, group_number, mask); + } +} + #ifdef IPA_OFFLOAD /** * dp_reo_remap_config() - configure reo remap register value based @@ -1909,6 +2017,7 @@ static int dp_soc_cmn_setup(struct dp_soc *soc) /* Reset the cpu ring map if radio is NSS offloaded */ if (wlan_cfg_get_dp_soc_nss_cfg(soc->wlan_cfg_ctx)) { dp_soc_reset_cpu_ring_map(soc); + dp_soc_reset_intr_mask(soc); } /* Setup HW REO */ @@ -2063,24 +2172,6 @@ dp_dscp_tid_map_setup(struct dp_pdev *pdev) } } -/* - * dp_reset_intr_mask() - reset interrupt mask - * @dp_soc - DP Soc handle - * @dp_pdev - DP pdev handle - * - * Return: Return void - */ -static inline -void dp_soc_reset_intr_mask(struct dp_soc *soc, struct dp_pdev *pdev) -{ - /* - * We will set the interrupt mask to zero for NSS offloaded radio - */ - wlan_cfg_set_tx_ring_mask(soc->wlan_cfg_ctx, pdev->pdev_id, 0x0); - wlan_cfg_set_rx_ring_mask(soc->wlan_cfg_ctx, pdev->pdev_id, 0x0); - wlan_cfg_set_rxdma2host_ring_mask(soc->wlan_cfg_ctx, pdev->pdev_id, 0x0); -} - /* * dp_ipa_ring_resource_setup() - setup IPA ring resources * @soc: data path SoC handle @@ -2364,13 +2455,6 @@ static struct cdp_pdev *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, /* set the reo destination during initialization */ pdev->reo_dest = pdev->pdev_id + 1; - /* - * reset the interrupt mask for offloaded radio - */ - if (wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) { - dp_soc_reset_intr_mask(soc, pdev); - } - return (struct cdp_pdev *)pdev; fail1: