qcacmn: Remove icnss_dispatch_irq
icnss_dispatch_irq is a stub for a non-existent function.
Make a pci function that doesn't use a global data structure.
Change-Id: I636d59cb465acf1366269d96a5dcacf910f8d78c
CRs-Fixed: 1002083
diff --git a/hif/inc/hif_napi.h b/hif/inc/hif_napi.h
index 5a7e338..2ce3ea5 100644
--- a/hif/inc/hif_napi.h
+++ b/hif/inc/hif_napi.h
@@ -89,7 +89,7 @@
/* called from hdd (napi_poll), using napi id as a selector */
void hif_napi_enable_irq(struct hif_opaque_softc *hif, int id);
-/* called by ce_tasklet.c::ce_irq_handler */
+/* called by ce_tasklet.c::ce_dispatch_interrupt*/
int hif_napi_schedule(struct hif_opaque_softc *scn, int ce_id);
/* called by hdd_napi, which is called by kernel */
diff --git a/hif/src/ce/ce_tasklet.c b/hif/src/ce/ce_tasklet.c
index 43bd5b2..b401610 100644
--- a/hif/src/ce/ce_tasklet.c
+++ b/hif/src/ce/ce_tasklet.c
@@ -39,6 +39,7 @@
#include "ce_api.h"
#include "ce_reg.h"
#include "ce_internal.h"
+#include "ce_tasklet.h"
#ifdef CONFIG_CNSS
#include <net/cnss.h>
#include "platform_icnss.h"
@@ -249,20 +250,33 @@
}
qdf_atomic_set(&scn->active_tasklet_cnt, 0);
}
+
/**
- * ce_irq_handler() - ce_irq_handler
- * @ce_id: ce_id
+ * hif_snoc_interrupt_handler() - hif_snoc_interrupt_handler
+ * @irq: irq coming from kernel
* @context: context
*
* Return: N/A
*/
-static irqreturn_t ce_irq_handler(int irq, void *context)
+static irqreturn_t hif_snoc_interrupt_handler(int irq, void *context)
{
struct ce_tasklet_entry *tasklet_entry = context;
+ return ce_dispatch_interrupt(icnss_get_ce_id(irq), tasklet_entry);
+}
+
+/**
+ * ce_dispatch_interrupt() - dispatch an interrupt to a processing context
+ * @ce_id: ce_id
+ * @tasklet_entry: context
+ *
+ * Return: N/A
+ */
+irqreturn_t ce_dispatch_interrupt(int ce_id,
+ struct ce_tasklet_entry *tasklet_entry)
+{
struct HIF_CE_state *hif_ce_state = tasklet_entry->hif_ce_state;
struct hif_softc *scn = HIF_GET_SOFTC(hif_ce_state);
struct hif_opaque_softc *hif_hdl = GET_HIF_OPAQUE_HDL(scn);
- int ce_id = icnss_get_ce_id(irq);
if (tasklet_entry->ce_id != ce_id) {
HIF_ERROR("%s: ce_id (expect %d, received %d) does not match",
@@ -354,7 +368,8 @@
for (id = 0; id < CE_COUNT_MAX; id++) {
if ((mask & (1 << id)) && hif_ce_state->tasklets[id].inited) {
- ret = icnss_ce_request_irq(id, ce_irq_handler,
+ ret = icnss_ce_request_irq(id,
+ hif_snoc_interrupt_handler,
irqflags, ce_name[id],
&hif_ce_state->tasklets[id]);
if (ret) {
diff --git a/hif/src/ce/ce_tasklet.h b/hif/src/ce/ce_tasklet.h
index d20402e..d2fa22c 100644
--- a/hif/src/ce/ce_tasklet.h
+++ b/hif/src/ce/ce_tasklet.h
@@ -33,4 +33,6 @@
void ce_tasklet_kill(struct hif_softc *scn);
QDF_STATUS ce_register_irq(struct HIF_CE_state *hif_ce_state, uint32_t mask);
QDF_STATUS ce_unregister_irq(struct HIF_CE_state *hif_ce_state, uint32_t mask);
+irqreturn_t ce_dispatch_interrupt(int irq,
+ struct ce_tasklet_entry *tasklet_entry);
#endif /* __CE_TASKLET_H__ */
diff --git a/hif/src/icnss_stub/icnss_stub.c b/hif/src/icnss_stub/icnss_stub.c
index 86b9b34..20ed4ce 100644
--- a/hif/src/icnss_stub/icnss_stub.c
+++ b/hif/src/icnss_stub/icnss_stub.c
@@ -36,8 +36,6 @@
#include "qwlan_version.h"
#include <net/cnss.h>
-static int icnss_get_irq_num(int ce_id);
-
/**
* struct icnss_stub_entry
*
@@ -63,9 +61,6 @@
struct icnss_stub_entry stub[ICNSS_MAX_IRQ_REGISTRATIONS];
uint32_t regged_irq;
};
-
-static struct icnss_stub_context cnss_stub;
-
#ifndef QCA_WIFI_3_0_ADRASTEA
/**
* icnss_wlan_enable() - icnss_wlan_enable
@@ -210,16 +205,6 @@
unsigned long flags, const char *name,
void *context)
{
- if (ce_id >= ICNSS_MAX_IRQ_REGISTRATIONS) {
- HIF_ERROR("%s: invalid ce_id = %d", __func__, ce_id);
- return -EINVAL;
- }
-
- cnss_stub.stub[ce_id].irq_handler = handler;
- cnss_stub.stub[ce_id].ce_id = ce_id;
- cnss_stub.stub[ce_id].data = context;
- cnss_stub.stub[ce_id].name = name;
- cnss_stub.regged_irq |= (1 << ce_id);
return 0;
}
@@ -231,141 +216,12 @@
*/
int icnss_ce_free_irq(int ce_id, void *context)
{
- if (ce_id >= ICNSS_MAX_IRQ_REGISTRATIONS) {
- HIF_ERROR("%s: invalid ce_id = %d", __func__, ce_id);
- return -EINVAL;
- }
-
- if (cnss_stub.stub[ce_id].data != context) {
- HIF_ERROR("%s: context match failure for ce_id %d",
- __func__, ce_id);
- return -EINVAL;
- }
-
- if (cnss_stub.regged_irq & (1 << ce_id)) {
- cnss_stub.stub[ce_id].irq_handler = NULL;
- cnss_stub.stub[ce_id].ce_id = 0;
- cnss_stub.stub[ce_id].data = 0;
- cnss_stub.stub[ce_id].name = NULL;
- cnss_stub.regged_irq &= ~(1 << ce_id);
- }
return 0;
}
-/**
- * icnss_dispatch_one_ce_irq() - icnss_dispatch_one_ce_irq
- * @ce_id: ce_id
- *
- * Return: irqreturn_t
- */
-static irqreturn_t icnss_dispatch_one_ce_irq(int ce_id)
-{
- irqreturn_t ret = IRQ_NONE;
-
- if (cnss_stub.stub[ce_id].irq_handler)
- ret = cnss_stub.stub[ce_id].irq_handler(
- icnss_get_irq_num(ce_id),
- (void *)cnss_stub.stub[ce_id].data);
- else
- HIF_ERROR(
- "%sd: error - ce_id = %d, no IRQ handler",
- __func__, ce_id);
-
- return ret;
-}
-
-/**
- * icnss_dispatch_ce_irq() - icnss_dispatch_ce_irq
- * @scn: scn
- *
- * Return: N/A
- */
-void icnss_dispatch_ce_irq(struct hif_softc *scn)
-{
- uint32_t intr_summary;
- int id;
- irqreturn_t ret;
-
- if (scn->hif_init_done != true)
- return;
-
- if (Q_TARGET_ACCESS_BEGIN(scn) < 0)
- return;
-
- intr_summary = CE_INTERRUPT_SUMMARY(scn);
-
- if (intr_summary == 0) {
- if ((scn->target_status != OL_TRGET_STATUS_RESET) &&
- (!qdf_atomic_read(&scn->link_suspended))) {
-
- hif_write32_mb(scn->mem +
- (SOC_CORE_BASE_ADDRESS |
- PCIE_INTR_ENABLE_ADDRESS),
- HOST_GROUP0_MASK);
-
- hif_read32_mb(scn->mem +
- (SOC_CORE_BASE_ADDRESS |
- PCIE_INTR_ENABLE_ADDRESS));
- }
- Q_TARGET_ACCESS_END(scn);
- return;
- } else {
- Q_TARGET_ACCESS_END(scn);
- }
-
- scn->ce_irq_summary = intr_summary;
- for (id = 0; intr_summary && (id < scn->ce_count); id++) {
- if (intr_summary & (1 << id)) {
- intr_summary &= ~(1 << id);
- ret = icnss_dispatch_one_ce_irq(id);
- }
- }
-}
-
-/**
- * icnss_get_soc_info() - get soc info
- *
- * This function query the soc information from the platform
- * driver
- *
- * @info: struct icnss_soc_info
- *
- * Return: 0 for success
- */
-int icnss_get_soc_info(void *hif_ctx, struct icnss_soc_info *info)
-{
- struct hif_softc *scn = hif_ctx;
-
- if (!scn) {
- HIF_ERROR("%s: SCN = NULL", __func__);
- return -EINVAL;
- }
-
- info->v_addr = scn->mem;
- info->p_addr = scn->mem_pa;
- info->version = 0;
- return 0;
-}
-
-
-/* icnss_get_irq_num() - generate a number to represent an irq number
-*/
-static int icnss_get_irq_num(int ce_id)
-{
- if (ce_id < CE_COUNT_MAX && ce_id >= 0)
- return ce_id + 100;
-
- pr_err("icnss: No irq registered for CE id %d\n", ce_id);
- return -EINVAL;
-}
-
int icnss_get_ce_id(int irq)
{
- int ce_id = irq - 100;
- if (ce_id < CE_COUNT_MAX && ce_id >= 0)
- return ce_id;
-
- pr_err("icnss: No matching CE id for irq %d\n", irq);
+ pr_err("icnss: icnss not valid for pci %d\n", irq);
return -EINVAL;
}
#endif /* HIF_PCI */
diff --git a/hif/src/pcie/if_pci.c b/hif/src/pcie/if_pci.c
index 82cda05..0d78d85 100644
--- a/hif/src/pcie/if_pci.c
+++ b/hif/src/pcie/if_pci.c
@@ -124,6 +124,54 @@
}
#endif
+/**
+ * pci_dispatch_ce_irq() - pci_dispatch_ce_irq
+ * @scn: scn
+ *
+ * Return: N/A
+ */
+static void pci_dispatch_interrupt(struct hif_softc *scn)
+{
+ uint32_t intr_summary;
+ int id;
+ struct HIF_CE_state *hif_state = HIF_GET_CE_STATE(scn);
+
+ if (scn->hif_init_done != true)
+ return;
+
+ if (Q_TARGET_ACCESS_BEGIN(scn) < 0)
+ return;
+
+ intr_summary = CE_INTERRUPT_SUMMARY(scn);
+
+ if (intr_summary == 0) {
+ if ((scn->target_status != OL_TRGET_STATUS_RESET) &&
+ (!qdf_atomic_read(&scn->link_suspended))) {
+
+ hif_write32_mb(scn->mem +
+ (SOC_CORE_BASE_ADDRESS |
+ PCIE_INTR_ENABLE_ADDRESS),
+ HOST_GROUP0_MASK);
+
+ hif_read32_mb(scn->mem +
+ (SOC_CORE_BASE_ADDRESS |
+ PCIE_INTR_ENABLE_ADDRESS));
+ }
+ Q_TARGET_ACCESS_END(scn);
+ return;
+ } else {
+ Q_TARGET_ACCESS_END(scn);
+ }
+
+ scn->ce_irq_summary = intr_summary;
+ for (id = 0; intr_summary && (id < scn->ce_count); id++) {
+ if (intr_summary & (1 << id)) {
+ intr_summary &= ~(1 << id);
+ ce_dispatch_interrupt(id, &hif_state->tasklets[id]);
+ }
+ }
+}
+
static irqreturn_t hif_pci_interrupt_handler(int irq, void *arg)
{
struct hif_pci_softc *sc = (struct hif_pci_softc *)arg;
@@ -249,7 +297,7 @@
qdf_atomic_inc(&scn->active_tasklet_cnt);
tasklet_schedule(&sc->intr_tq);
} else {
- icnss_dispatch_ce_irq(scn);
+ pci_dispatch_interrupt(scn);
}
return IRQ_HANDLED;
diff --git a/hif/src/pcie/if_pci.h b/hif/src/pcie/if_pci.h
index 86e45bd..a36a10f 100644
--- a/hif/src/pcie/if_pci.h
+++ b/hif/src/pcie/if_pci.h
@@ -146,7 +146,6 @@
};
bool hif_pci_targ_is_present(struct hif_softc *scn, void *__iomem *mem);
-void icnss_dispatch_ce_irq(struct hif_softc *scn);
int hif_configure_irq(struct hif_softc *sc);
void hif_pci_cancel_deferred_target_sleep(struct hif_softc *scn);