diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index ca84000cf5..67675b55ba 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -1696,7 +1696,7 @@ static void dp_soc_set_interrupt_mode(struct dp_soc *soc) uint32_t msi_base_data, msi_vector_start; int msi_vector_count, ret; - soc->intr_mode = DP_INTR_LEGACY; + soc->intr_mode = DP_INTR_INTEGRATED; if (!(soc->wlan_cfg_ctx->napi_enabled) || (soc->cdp_soc.ol_ops->get_con_mode && @@ -1784,7 +1784,7 @@ static void dp_soc_interrupt_map_calculate_integrated(struct dp_soc *soc, int host2rxdma_mon_ring_mask = wlan_cfg_get_host2rxdma_mon_ring_mask( soc->wlan_cfg_ctx, intr_ctx_num); - soc->intr_mode = DP_INTR_LEGACY; + soc->intr_mode = DP_INTR_INTEGRATED; for (j = 0; j < HIF_MAX_GRP_IRQ; j++) { @@ -10606,6 +10606,7 @@ void *dp_soc_init(struct dp_soc *dpsoc, HTC_HANDLE htc_handle, } dp_soc_set_interrupt_mode(soc); + wlan_cfg_fill_interrupt_mask(soc->wlan_cfg_ctx, soc->intr_mode); wlan_cfg_set_rx_hash(soc->wlan_cfg_ctx, cfg_get(soc->ctrl_psoc, CFG_DP_RX_HASH)); soc->cce_disable = false; diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 37c3e07cbb..ca8609ac30 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -200,12 +200,12 @@ enum dp_fl_ctrl_threshold { /** * enum dp_intr_mode - * @DP_INTR_LEGACY: Legacy/Line interrupts, for WIN - * @DP_INTR_MSI: MSI interrupts, for MCL + * @DP_INTR_INTEGRATED: Line interrupts + * @DP_INTR_MSI: MSI interrupts * @DP_INTR_POLL: Polling */ enum dp_intr_mode { - DP_INTR_LEGACY = 0, + DP_INTR_INTEGRATED = 0, DP_INTR_MSI, DP_INTR_POLL, }; diff --git a/wlan_cfg/wlan_cfg.c b/wlan_cfg/wlan_cfg.c index 09e4915e21..24da573691 100644 --- a/wlan_cfg/wlan_cfg.c +++ b/wlan_cfg/wlan_cfg.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -28,6 +28,7 @@ #include "wlan_cfg.h" #include "cfg_ucfg_api.h" #include "hal_api.h" +#include "dp_types.h" /* * FIX THIS - @@ -91,48 +92,129 @@ #define WLAN_CFG_HOST2RXDMA_RING_MASK_3 0x0 #if defined(WLAN_MAX_PDEVS) && (WLAN_MAX_PDEVS == 1) -static const int tx_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { +static const int tx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { WLAN_CFG_TX_RING_MASK_0, 0, 0, 0, 0, 0, 0}; #ifndef IPA_OFFLOAD -static const int rx_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { +static const int rx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { 0, WLAN_CFG_RX_RING_MASK_0, WLAN_CFG_RX_RING_MASK_1, WLAN_CFG_RX_RING_MASK_2, WLAN_CFG_RX_RING_MASK_3, 0, 0}; #else -static const int rx_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { +static const int rx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { 0, WLAN_CFG_RX_RING_MASK_0, WLAN_CFG_RX_RING_MASK_1, WLAN_CFG_RX_RING_MASK_2, 0, 0, 0}; #endif -static const int rx_mon_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { +static const int rx_mon_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { 0, WLAN_CFG_RX_MON_RING_MASK_0, WLAN_CFG_RX_MON_RING_MASK_1, 0, 0, 0, 0}; -static const int host2rxdma_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { +static const int host2rxdma_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { 0, 0, 0, 0, 0, 0, 0}; -static const int rxdma2host_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { +static const int rxdma2host_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { 0, 0, 0, 0, 0, WLAN_CFG_RXDMA2HOST_RING_MASK_0, WLAN_CFG_RXDMA2HOST_RING_MASK_1}; -static const int host2rxdma_mon_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { +static const int host2rxdma_mon_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { 0, 0, 0, 0, 0, 0, 0}; -static const int rxdma2host_mon_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { +static const int rxdma2host_mon_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { 0, 0, 0, 0, 0, 0, 0}; -static const int rx_err_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { +static const int rx_err_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { 0, 0, 0, 0, 0, 0, WLAN_CFG_RX_ERR_RING_MASK_0}; -static const int rx_wbm_rel_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { +static const int rx_wbm_rel_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { 0, 0, 0, 0, 0, 0, WLAN_CFG_RX_WBM_REL_RING_MASK_0}; -static const int reo_status_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { +static const int reo_status_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { 0, 0, 0, 0, 0, 0, WLAN_CFG_REO_STATUS_RING_MASK_0}; + +static const int tx_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = { + 0, 0, 0, 0, 0, 0, 0}; + +static const int rx_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = { + 0, 0, 0, 0, 0, 0, 0}; + +static const int rx_mon_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = { + 0, 0, 0, 0, 0, 0, 0}; + +static const int host2rxdma_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = { + 0, 0, 0, 0, 0, 0, 0}; + +static const int rxdma2host_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = { + 0, 0, 0, 0, 0, 0, 0}; + +static const int host2rxdma_mon_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = { + 0, 0, 0, 0, 0, 0, 0}; + +static const int rxdma2host_mon_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = { + 0, 0, 0, 0, 0, 0, 0}; + +static const int rx_err_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = { + 0, 0, 0, 0, 0, 0, 0}; + +static const int rx_wbm_rel_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = { + 0, 0, 0, 0, 0, 0, 0}; + +static const int reo_status_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = { + 0, 0, 0, 0, 0, 0, 0}; + #else -static const int tx_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { + +static const int tx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { WLAN_CFG_TX_RING_MASK_0, WLAN_CFG_TX_RING_MASK_1, WLAN_CFG_TX_RING_MASK_2, WLAN_CFG_TX_RING_MASK_3}; -static const int rx_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { +static const int rx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { + WLAN_CFG_RX_RING_MASK_0, + WLAN_CFG_RX_RING_MASK_1, + WLAN_CFG_RX_RING_MASK_2, + WLAN_CFG_RX_RING_MASK_3}; + +static const int rx_mon_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { + 0, 0, 0}; + +static const int host2rxdma_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { + 0, 0, 0, 0}; + +static const int rxdma2host_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { + 0, 0, 0, 0}; + +static const int host2rxdma_mon_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { + WLAN_CFG_HOST2RXDMA_MON_RING_MASK_0, + WLAN_CFG_HOST2RXDMA_MON_RING_MASK_1, + WLAN_CFG_HOST2RXDMA_MON_RING_MASK_2}; + +static const int rxdma2host_mon_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { + WLAN_CFG_RXDMA2HOST_MON_RING_MASK_0, + WLAN_CFG_RXDMA2HOST_MON_RING_MASK_1, + WLAN_CFG_RXDMA2HOST_MON_RING_MASK_2}; + +static const int rx_err_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { + WLAN_CFG_RX_ERR_RING_MASK_0, + WLAN_CFG_RX_ERR_RING_MASK_1, + WLAN_CFG_RX_ERR_RING_MASK_2, + WLAN_CFG_RX_ERR_RING_MASK_3}; + +static const int rx_wbm_rel_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { + WLAN_CFG_RX_WBM_REL_RING_MASK_0, + WLAN_CFG_RX_WBM_REL_RING_MASK_1, + WLAN_CFG_RX_WBM_REL_RING_MASK_2, + WLAN_CFG_RX_WBM_REL_RING_MASK_3}; + +static const int reo_status_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { + WLAN_CFG_REO_STATUS_RING_MASK_0, + WLAN_CFG_REO_STATUS_RING_MASK_1, + WLAN_CFG_REO_STATUS_RING_MASK_2, + WLAN_CFG_REO_STATUS_RING_MASK_3}; + +static const int tx_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = { + WLAN_CFG_TX_RING_MASK_0, + WLAN_CFG_TX_RING_MASK_1, + WLAN_CFG_TX_RING_MASK_2, + WLAN_CFG_TX_RING_MASK_3}; + +static const int rx_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = { 0, 0, 0, @@ -145,7 +227,7 @@ static const int rx_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { WLAN_CFG_RX_RING_MASK_2, WLAN_CFG_RX_RING_MASK_3}; -static const int rx_mon_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { +static const int rx_mon_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = { 0, 0, 0, @@ -154,19 +236,19 @@ static const int rx_mon_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { WLAN_CFG_RX_MON_RING_MASK_1, WLAN_CFG_RX_MON_RING_MASK_2}; -static const int host2rxdma_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { +static const int host2rxdma_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = { WLAN_CFG_HOST2RXDMA_RING_MASK_0, WLAN_CFG_HOST2RXDMA_RING_MASK_1, WLAN_CFG_HOST2RXDMA_RING_MASK_2, WLAN_CFG_HOST2RXDMA_RING_MASK_3}; -static const int rxdma2host_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { +static const int rxdma2host_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = { WLAN_CFG_RXDMA2HOST_RING_MASK_0, WLAN_CFG_RXDMA2HOST_RING_MASK_1, WLAN_CFG_RXDMA2HOST_RING_MASK_2, WLAN_CFG_RXDMA2HOST_RING_MASK_3}; -static const int host2rxdma_mon_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { +static const int host2rxdma_mon_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = { 0, 0, 0, @@ -175,7 +257,7 @@ static const int host2rxdma_mon_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { WLAN_CFG_HOST2RXDMA_MON_RING_MASK_1, WLAN_CFG_HOST2RXDMA_MON_RING_MASK_2}; -static const int rxdma2host_mon_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { +static const int rxdma2host_mon_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = { 0, 0, 0, @@ -184,19 +266,19 @@ static const int rxdma2host_mon_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { WLAN_CFG_RXDMA2HOST_MON_RING_MASK_1, WLAN_CFG_RXDMA2HOST_MON_RING_MASK_2}; -static const int rx_err_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { +static const int rx_err_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = { WLAN_CFG_RX_ERR_RING_MASK_0, WLAN_CFG_RX_ERR_RING_MASK_1, WLAN_CFG_RX_ERR_RING_MASK_2, WLAN_CFG_RX_ERR_RING_MASK_3}; -static const int rx_wbm_rel_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { +static const int rx_wbm_rel_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = { WLAN_CFG_RX_WBM_REL_RING_MASK_0, WLAN_CFG_RX_WBM_REL_RING_MASK_1, WLAN_CFG_RX_WBM_REL_RING_MASK_2, WLAN_CFG_RX_WBM_REL_RING_MASK_3}; -static const int reo_status_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { +static const int reo_status_ring_mask_integrated[WLAN_CFG_INT_NUM_CONTEXTS] = { WLAN_CFG_REO_STATUS_RING_MASK_0, WLAN_CFG_REO_STATUS_RING_MASK_1, WLAN_CFG_REO_STATUS_RING_MASK_2, @@ -287,6 +369,59 @@ static const uint8_t rx_fst_toeplitz_key[WLAN_CFG_RX_FST_TOEPLITZ_KEYLEN] = { 0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa }; +void wlan_cfg_fill_interrupt_mask(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx, + int interrupt_mode) { + int i = 0; + + if (interrupt_mode == DP_INTR_INTEGRATED) { + for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) { + wlan_cfg_ctx->int_tx_ring_mask[i] = + tx_ring_mask_integrated[i]; + wlan_cfg_ctx->int_rx_ring_mask[i] = + rx_ring_mask_integrated[i]; + wlan_cfg_ctx->int_rx_mon_ring_mask[i] = + rx_mon_ring_mask_integrated[i]; + wlan_cfg_ctx->int_rx_err_ring_mask[i] = + rx_err_ring_mask_integrated[i]; + wlan_cfg_ctx->int_rx_wbm_rel_ring_mask[i] = + rx_wbm_rel_ring_mask_integrated[i]; + wlan_cfg_ctx->int_reo_status_ring_mask[i] = + reo_status_ring_mask_integrated[i]; + wlan_cfg_ctx->int_rxdma2host_ring_mask[i] = + rxdma2host_ring_mask_integrated[i]; + wlan_cfg_ctx->int_host2rxdma_ring_mask[i] = + host2rxdma_ring_mask_integrated[i]; + wlan_cfg_ctx->int_host2rxdma_mon_ring_mask[i] = + host2rxdma_mon_ring_mask_integrated[i]; + wlan_cfg_ctx->int_rxdma2host_mon_ring_mask[i] = + rxdma2host_mon_ring_mask_integrated[i]; + } + } else if (interrupt_mode == DP_INTR_MSI){ + for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) { + wlan_cfg_ctx->int_tx_ring_mask[i] = tx_ring_mask_msi[i]; + wlan_cfg_ctx->int_rx_ring_mask[i] = rx_ring_mask_msi[i]; + wlan_cfg_ctx->int_rx_mon_ring_mask[i] = + rx_mon_ring_mask_msi[i]; + wlan_cfg_ctx->int_rx_err_ring_mask[i] = + rx_err_ring_mask_msi[i]; + wlan_cfg_ctx->int_rx_wbm_rel_ring_mask[i] = + rx_wbm_rel_ring_mask_msi[i]; + wlan_cfg_ctx->int_reo_status_ring_mask[i] = + reo_status_ring_mask_msi[i]; + wlan_cfg_ctx->int_rxdma2host_ring_mask[i] = + rxdma2host_ring_mask_msi[i]; + wlan_cfg_ctx->int_host2rxdma_ring_mask[i] = + host2rxdma_ring_mask_msi[i]; + wlan_cfg_ctx->int_host2rxdma_mon_ring_mask[i] = + host2rxdma_mon_ring_mask_msi[i]; + wlan_cfg_ctx->int_rxdma2host_mon_ring_mask[i] = + rxdma2host_mon_ring_mask_msi[i]; + } + } else { + qdf_err("Interrupt mode %d", interrupt_mode); + } +} + /** * wlan_cfg_soc_attach() - Allocate and prepare SoC configuration * @psoc - Object manager psoc @@ -295,8 +430,6 @@ static const uint8_t rx_fst_toeplitz_key[WLAN_CFG_RX_FST_TOEPLITZ_KEYLEN] = { struct wlan_cfg_dp_soc_ctxt * wlan_cfg_soc_attach(struct cdp_ctrl_objmgr_psoc *psoc) { - int i = 0; - struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx = qdf_mem_malloc(sizeof(struct wlan_cfg_dp_soc_ctxt)); @@ -341,25 +474,6 @@ wlan_cfg_soc_attach(struct cdp_ctrl_objmgr_psoc *psoc) wlan_cfg_ctx->int_timer_threshold_other = cfg_get(psoc, CFG_DP_INT_TIMER_THRESHOLD_OTHER); - for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) { - wlan_cfg_ctx->int_tx_ring_mask[i] = tx_ring_mask[i]; - wlan_cfg_ctx->int_rx_ring_mask[i] = rx_ring_mask[i]; - wlan_cfg_ctx->int_rx_mon_ring_mask[i] = rx_mon_ring_mask[i]; - wlan_cfg_ctx->int_rx_err_ring_mask[i] = rx_err_ring_mask[i]; - wlan_cfg_ctx->int_rx_wbm_rel_ring_mask[i] = - rx_wbm_rel_ring_mask[i]; - wlan_cfg_ctx->int_reo_status_ring_mask[i] = - reo_status_ring_mask[i]; - wlan_cfg_ctx->int_rxdma2host_ring_mask[i] = - rxdma2host_ring_mask[i]; - wlan_cfg_ctx->int_host2rxdma_ring_mask[i] = - host2rxdma_ring_mask[i]; - wlan_cfg_ctx->int_host2rxdma_mon_ring_mask[i] = - host2rxdma_mon_ring_mask[i]; - wlan_cfg_ctx->int_rxdma2host_mon_ring_mask[i] = - rxdma2host_mon_ring_mask[i]; - } - /* This is default mapping and can be overridden by HW config * received from FW */ wlan_cfg_set_hw_macid(wlan_cfg_ctx, 0, 1); diff --git a/wlan_cfg/wlan_cfg.h b/wlan_cfg/wlan_cfg.h index 8c50e134ab..31026fa624 100644 --- a/wlan_cfg/wlan_cfg.h +++ b/wlan_cfg/wlan_cfg.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -1230,4 +1230,15 @@ wlan_cfg_set_rx_mon_protocol_flow_tag_enabled(struct wlan_cfg_dp_soc_ctxt *cfg, */ bool wlan_cfg_is_rx_mon_protocol_flow_tag_enabled(struct wlan_cfg_dp_soc_ctxt *cfg); + +/** + * wlan_cfg_fill_interrupt_mask() - set interrupt mask + * + * @wlan_cfg_dp_soc_ctxt: soc configuration context + * @interrupt_mode: interrupt_mode: MSI/LEGACY + * + * Return: void + */ +void wlan_cfg_fill_interrupt_mask(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx, + int interrupt_mode); #endif