mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-12-20 10:51:27 +00:00
176 lines
5.6 KiB
Diff
176 lines
5.6 KiB
Diff
From c62991534012b71651ccc909090d97c06e6a3c8d Mon Sep 17 00:00:00 2001
|
|
From: Anilkumar Kolli <akolli@codeaurora.org>
|
|
Date: Tue, 24 Mar 2020 23:21:23 +0530
|
|
Subject: [PATCH 5/9] ath11k: add extended interrupt support for qcn9000
|
|
|
|
update the specific hw ring mask for qcn9000. Update the timestamp
|
|
while processing DP and CE interrupts.
|
|
|
|
Note: This patch is depends on below patches,
|
|
1. Add pci/mhi support for qcn9000
|
|
|
|
Tested-on: QCN9000 hw1.0 WLAN.HK.2.4.0.1-00097-QCAHKSWPL_SILICONZ-1
|
|
|
|
Signed-off-by: Karthikeyan Periyasamy <periyasa@codeaurora.org>
|
|
Signed-off-by: Anilkumar Kolli <akolli@codeaurora.org>
|
|
---
|
|
drivers/net/wireless/ath/ath11k/core.c | 1 +
|
|
drivers/net/wireless/ath/ath11k/dp_tx.c | 6 ++---
|
|
drivers/net/wireless/ath/ath11k/hal.c | 2 ++
|
|
drivers/net/wireless/ath/ath11k/hw.c | 45 +++++++++++++++++++++++++++++++++
|
|
drivers/net/wireless/ath/ath11k/hw.h | 1 +
|
|
drivers/net/wireless/ath/ath11k/pci.c | 13 ++++++++--
|
|
6 files changed, 63 insertions(+), 5 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/ath/ath11k/core.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/core.c
|
|
@@ -136,6 +136,7 @@ static const struct ath11k_hw_params ath
|
|
.single_pdev_only = false,
|
|
.qmi_service_ins_id = ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_QCN9000,
|
|
.hal_desc_sz = sizeof(struct hal_rx_desc_qcn9000),
|
|
+ .ring_mask = &ath11k_hw_ring_mask_qcn9000,
|
|
.regs = &qcn9000_regs,
|
|
.hw_ops = &qcn9000_ops,
|
|
.credit_flow = false,
|
|
--- a/drivers/net/wireless/ath/ath11k/dp_tx.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/dp_tx.c
|
|
@@ -817,9 +817,9 @@ int ath11k_dp_tx_htt_srng_setup(struct a
|
|
cmd->ring_tail_off32_remote_addr_hi = (u64)tp_addr >>
|
|
HAL_ADDR_MSB_REG_SHIFT;
|
|
|
|
- cmd->ring_msi_addr_lo = 0;
|
|
- cmd->ring_msi_addr_hi = 0;
|
|
- cmd->msi_data = 0;
|
|
+ cmd->ring_msi_addr_lo = lower_32_bits(params.msi_addr);
|
|
+ cmd->ring_msi_addr_hi = upper_32_bits(params.msi_addr);
|
|
+ cmd->msi_data = params.msi_data;
|
|
|
|
cmd->intr_info = FIELD_PREP(
|
|
HTT_SRNG_SETUP_CMD_INTR_INFO_BATCH_COUNTER_THRESH,
|
|
--- a/drivers/net/wireless/ath/ath11k/hal.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/hal.c
|
|
@@ -507,6 +507,8 @@ void ath11k_hal_srng_get_params(struct a
|
|
srng->intr_batch_cntr_thres_entries;
|
|
params->low_threshold = srng->u.src_ring.low_threshold;
|
|
params->flags = srng->flags;
|
|
+ params->msi_addr = srng->msi_addr;
|
|
+ params->msi_data = srng->msi_data;
|
|
}
|
|
|
|
dma_addr_t ath11k_hal_srng_get_hp_addr(struct ath11k_base *ab,
|
|
--- a/drivers/net/wireless/ath/ath11k/hw.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/hw.c
|
|
@@ -1468,6 +1468,51 @@ const struct service_to_pipe ath11k_targ
|
|
|
|
};
|
|
|
|
+const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qcn9000 = {
|
|
+ .tx = {
|
|
+ ATH11K_TX_RING_MASK_0,
|
|
+ ATH11K_TX_RING_MASK_1,
|
|
+ ATH11K_TX_RING_MASK_2,
|
|
+ },
|
|
+ .rx_mon_status = {
|
|
+ 0, 0, 0,
|
|
+ ATH11K_RX_MON_STATUS_RING_MASK_0,
|
|
+ ATH11K_RX_MON_STATUS_RING_MASK_1,
|
|
+ ATH11K_RX_MON_STATUS_RING_MASK_2,
|
|
+ },
|
|
+ .rx = {
|
|
+ 0, 0, 0, 0,
|
|
+ ATH11K_RX_RING_MASK_0,
|
|
+ ATH11K_RX_RING_MASK_1,
|
|
+ ATH11K_RX_RING_MASK_2,
|
|
+ ATH11K_RX_RING_MASK_3,
|
|
+ },
|
|
+ .rx_err = {
|
|
+ 0, 0, 0,
|
|
+ ATH11K_RX_ERR_RING_MASK_0,
|
|
+ },
|
|
+ .rx_wbm_rel = {
|
|
+ 0, 0, 0,
|
|
+ ATH11K_RX_WBM_REL_RING_MASK_0,
|
|
+ },
|
|
+ .reo_status = {
|
|
+ 0, 0, 0,
|
|
+ ATH11K_REO_STATUS_RING_MASK_0,
|
|
+ },
|
|
+ .rxdma2host = {
|
|
+ 0, 0, 0,
|
|
+ ATH11K_RXDMA2HOST_RING_MASK_0,
|
|
+ ATH11K_RXDMA2HOST_RING_MASK_1,
|
|
+ ATH11K_RXDMA2HOST_RING_MASK_2,
|
|
+ },
|
|
+ .host2rxdma = {
|
|
+ 0, 0, 0,
|
|
+ ATH11K_HOST2RXDMA_RING_MASK_0,
|
|
+ ATH11K_HOST2RXDMA_RING_MASK_1,
|
|
+ ATH11K_HOST2RXDMA_RING_MASK_2,
|
|
+ },
|
|
+};
|
|
+
|
|
const struct ath11k_hw_regs ipq8074_regs = {
|
|
/* SW2TCL(x) R0 ring configuration address */
|
|
.hal_tcl1_ring_base_lsb = 0x00000510,
|
|
--- a/drivers/net/wireless/ath/ath11k/hw.h
|
|
+++ b/drivers/net/wireless/ath/ath11k/hw.h
|
|
@@ -211,6 +211,7 @@ extern const struct ath11k_hw_ops qcn900
|
|
|
|
extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_ipq8074;
|
|
extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qca6390;
|
|
+extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qcn9000;
|
|
|
|
static inline
|
|
int ath11k_hw_get_mac_from_pdev_id(struct ath11k_hw_params *hw,
|
|
--- a/drivers/net/wireless/ath/ath11k/pci.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/pci.c
|
|
@@ -441,6 +441,9 @@ static irqreturn_t ath11k_pci_ce_interru
|
|
{
|
|
struct ath11k_ce_pipe *ce_pipe = arg;
|
|
|
|
+ /* last interrupt received for this CE */
|
|
+ ce_pipe->timestamp = jiffies;
|
|
+
|
|
ath11k_pci_ce_irq_disable(ce_pipe->ab, ce_pipe->pipe_num);
|
|
tasklet_schedule(&ce_pipe->intr_tq);
|
|
|
|
@@ -535,6 +538,9 @@ static irqreturn_t ath11k_pci_ext_interr
|
|
|
|
ath11k_dbg(irq_grp->ab, ATH11K_DBG_PCI, "ext irq:%d\n", irq);
|
|
|
|
+ /* last interrupt received for this group */
|
|
+ irq_grp->timestamp = jiffies;
|
|
+
|
|
ath11k_pci_ext_grp_disable(irq_grp);
|
|
|
|
napi_schedule(&irq_grp->napi);
|
|
@@ -545,8 +551,9 @@ static irqreturn_t ath11k_pci_ext_interr
|
|
static int ath11k_pci_ext_irq_config(struct ath11k_base *ab)
|
|
{
|
|
int i, j, ret, num_vectors = 0;
|
|
- u32 user_base_data = 0, base_vector = 0;
|
|
+ u32 user_base_data = 0, base_vector = 0, base_idx;
|
|
|
|
+ base_idx = ATH11K_PCI_IRQ_CE0_OFFSET + CE_COUNT_MAX;
|
|
ret = ath11k_pci_get_user_msi_assignment(ath11k_pci_priv(ab), "DP",
|
|
&num_vectors,
|
|
&user_base_data,
|
|
@@ -576,7 +583,7 @@ static int ath11k_pci_ext_irq_config(str
|
|
}
|
|
|
|
irq_grp->num_irq = num_irq;
|
|
- irq_grp->irqs[0] = base_vector + i;
|
|
+ irq_grp->irqs[0] = base_idx + i;
|
|
|
|
for (j = 0; j < irq_grp->num_irq; j++) {
|
|
int irq_idx = irq_grp->irqs[j];
|
|
@@ -587,6 +594,8 @@ static int ath11k_pci_ext_irq_config(str
|
|
|
|
ath11k_dbg(ab, ATH11K_DBG_PCI,
|
|
"irq:%d group:%d\n", irq, i);
|
|
+
|
|
+ irq_set_status_flags(irq, IRQ_DISABLE_UNLAZY);
|
|
ret = request_irq(irq, ath11k_pci_ext_interrupt_handler,
|
|
IRQF_SHARED,
|
|
"DP_EXT_IRQ", irq_grp);
|