summaryrefslogtreecommitdiff
path: root/hif
diff options
context:
space:
mode:
authorYun Park <yunp@codeaurora.org>2017-08-17 17:37:53 -0700
committersnandini <snandini@codeaurora.org>2017-11-14 12:07:30 -0800
commit3fb3644e6194f3b01fe2bea385ff8f713acfc7f3 (patch)
tree1231a22eab0b15014769e003398f3628a4291938 /hif
parent084aff450bd139f1a1fd8c4f50a3f851805e0ddb (diff)
downloadqca-wfi-host-cmn-3fb3644e6194f3b01fe2bea385ff8f713acfc7f3.tar.gz
qcacmn: Clarify usage on Q_TARGET_ACCESS_BEGIN/END
Document where register writes are for legacy vs srng devices. With the target access begin/end calls being associated with the register writes and the register writes being associated to specific HW, we avoid performing unneeded force wakes on common code paths shared by legacy & srng based hardware. Change-Id: Id91399d03298bfc5df56f0c5d5d14b648b665279 CRs-Fixed: 2117144
Diffstat (limited to 'hif')
-rw-r--r--hif/src/ce/ce_api.h2
-rw-r--r--hif/src/ce/ce_diag.c4
-rw-r--r--hif/src/ce/ce_main.c35
-rw-r--r--hif/src/ce/ce_service.c12
-rw-r--r--hif/src/ce/ce_service_srng.c4
-rw-r--r--hif/src/pcie/if_pci.c15
-rw-r--r--hif/src/pcie/if_pci.h2
-rw-r--r--hif/src/snoc/if_ahb.c2
8 files changed, 47 insertions, 29 deletions
diff --git a/hif/src/ce/ce_api.h b/hif/src/ce/ce_api.h
index e3fa2c72b..786f447d4 100644
--- a/hif/src/ce/ce_api.h
+++ b/hif/src/ce/ce_api.h
@@ -495,7 +495,7 @@ struct CE_ring_state;
struct ce_ops {
uint32_t (*ce_get_desc_size)(uint8_t ring_type);
- void (*ce_ring_setup)(struct hif_softc *scn, uint8_t ring_type,
+ int (*ce_ring_setup)(struct hif_softc *scn, uint8_t ring_type,
uint32_t ce_id, struct CE_ring_state *ring,
struct CE_attr *attr);
int (*ce_send_nolock)(struct CE_handle *copyeng,
diff --git a/hif/src/ce/ce_diag.c b/hif/src/ce/ce_diag.c
index e8389939c..06b914e4e 100644
--- a/hif/src/ce/ce_diag.c
+++ b/hif/src/ce/ce_diag.c
@@ -173,6 +173,8 @@ QDF_STATUS hif_diag_read_mem(struct hif_opaque_softc *hif_ctx,
HIF_ERROR("%s: DIAG CE not present", __func__);
return QDF_STATUS_E_INVAL;
}
+ /* not supporting diag ce on srng based systems, therefore we know this
+ * isn't an srng based system */
transaction_id = (mux_id & MUX_ID_MASK) |
(transaction_id & TRANSACTION_ID_MASK);
@@ -377,6 +379,8 @@ QDF_STATUS hif_diag_write_mem(struct hif_opaque_softc *hif_ctx,
HIF_ERROR("%s: DIAG CE not present", __func__);
return QDF_STATUS_E_INVAL;
}
+ /* not supporting diag ce on srng based systems, therefore we know this
+ * isn't an srng based system */
transaction_id = (mux_id & MUX_ID_MASK) |
(transaction_id & TRANSACTION_ID_MASK);
diff --git a/hif/src/ce/ce_main.c b/hif/src/ce/ce_main.c
index 876c4935a..6a9348fe8 100644
--- a/hif/src/ce/ce_main.c
+++ b/hif/src/ce/ce_main.c
@@ -786,13 +786,13 @@ static struct CE_ring_state *ce_alloc_ring_state(struct CE_state *CE_state,
return ce_ring;
}
-static void ce_ring_setup(struct hif_softc *scn, uint8_t ring_type,
+static int ce_ring_setup(struct hif_softc *scn, uint8_t ring_type,
uint32_t ce_id, struct CE_ring_state *ring,
struct CE_attr *attr)
{
struct HIF_CE_state *hif_state = HIF_GET_CE_STATE(scn);
- hif_state->ce_services->ce_ring_setup(scn, ring_type, ce_id,
+ return hif_state->ce_services->ce_ring_setup(scn, ring_type, ce_id,
ring, attr);
}
@@ -897,6 +897,7 @@ struct CE_handle *ce_init(struct hif_softc *scn,
unsigned int nentries;
bool malloc_CE_state = false;
bool malloc_src_ring = false;
+ int status;
QDF_ASSERT(CE_id < scn->ce_count);
ctrl_addr = CE_BASE_ADDRESS(CE_id);
@@ -982,13 +983,11 @@ struct CE_handle *ce_init(struct hif_softc *scn,
CE_DESC_RING_ALIGN - 1) &
~(CE_DESC_RING_ALIGN - 1));
- if (Q_TARGET_ACCESS_BEGIN(scn) < 0)
+ status = ce_ring_setup(scn, CE_RING_SRC, CE_id,
+ src_ring, attr);
+ if (status < 0)
goto error_target_access;
- ce_ring_setup(scn, CE_RING_SRC, CE_id, src_ring, attr);
-
- if (Q_TARGET_ACCESS_END(scn) < 0)
- goto error_target_access;
ce_ring_test_initial_indexes(CE_id, src_ring,
"src_ring");
}
@@ -1017,13 +1016,9 @@ struct CE_handle *ce_init(struct hif_softc *scn,
goto error_no_dma_mem;
}
- if (Q_TARGET_ACCESS_BEGIN(scn) < 0)
- goto error_target_access;
-
- ce_ring_setup(scn, CE_RING_DEST, CE_id,
+ status = ce_ring_setup(scn, CE_RING_DEST, CE_id,
dest_ring, attr);
-
- if (Q_TARGET_ACCESS_END(scn) < 0)
+ if (status < 0)
goto error_target_access;
ce_ring_test_initial_indexes(CE_id, dest_ring,
@@ -1054,13 +1049,11 @@ struct CE_handle *ce_init(struct hif_softc *scn,
return NULL;
}
- if (Q_TARGET_ACCESS_BEGIN(scn) < 0)
- goto error_target_access;
-
- ce_ring_setup(scn, CE_RING_STATUS, CE_id,
- CE_state->status_ring, attr);
- if (Q_TARGET_ACCESS_END(scn) < 0)
+ status = ce_ring_setup(scn, CE_RING_STATUS,
+ CE_id, CE_state->status_ring,
+ attr);
+ if (status < 0)
goto error_target_access;
}
@@ -3105,6 +3098,8 @@ void hif_set_attribute(struct hif_opaque_softc *osc, uint8_t hif_attrib)
scn->hif_attribute = hif_attrib;
}
+
+/* disable interrupts (only applicable for legacy copy engine currently */
void hif_disable_interrupt(struct hif_opaque_softc *osc, uint32_t pipe_num)
{
struct hif_softc *scn = HIF_GET_SOFTC(osc);
@@ -3145,6 +3140,8 @@ static inline void hif_fw_event_handler(struct HIF_CE_state *hif_state)
* Called from the PCI interrupt handler when a
* firmware-generated interrupt to the Host.
*
+ * only registered for legacy ce devices
+ *
* Return: status of handled irq
*/
irqreturn_t hif_fw_interrupt_handler(int irq, void *arg)
diff --git a/hif/src/ce/ce_service.c b/hif/src/ce/ce_service.c
index a7d5cef1b..defe1e101 100644
--- a/hif/src/ce/ce_service.c
+++ b/hif/src/ce/ce_service.c
@@ -2594,10 +2594,16 @@ static uint32_t ce_get_desc_size_legacy(uint8_t ring_type)
return 0;
}
-static void ce_ring_setup_legacy(struct hif_softc *scn, uint8_t ring_type,
+static int ce_ring_setup_legacy(struct hif_softc *scn, uint8_t ring_type,
uint32_t ce_id, struct CE_ring_state *ring,
struct CE_attr *attr)
{
+ int status = Q_TARGET_ACCESS_BEGIN(scn);
+
+ if (status < 0)
+ goto out;
+
+
switch (ring_type) {
case CE_RING_SRC:
ce_legacy_src_ring_setup(scn, ce_id, ring, attr);
@@ -2610,6 +2616,10 @@ static void ce_ring_setup_legacy(struct hif_softc *scn, uint8_t ring_type,
qdf_assert(0);
break;
}
+
+ Q_TARGET_ACCESS_END(scn);
+out:
+ return status;
}
static void ce_prepare_shadow_register_v2_cfg_legacy(struct hif_softc *scn,
diff --git a/hif/src/ce/ce_service_srng.c b/hif/src/ce/ce_service_srng.c
index e6509b045..2c2ca937b 100644
--- a/hif/src/ce/ce_service_srng.c
+++ b/hif/src/ce/ce_service_srng.c
@@ -710,7 +710,7 @@ static void ce_srng_status_ring_setup(struct hif_softc *scn, uint32_t ce_id,
ce_id, 0, &ring_params);
}
-static void ce_ring_setup_srng(struct hif_softc *scn, uint8_t ring_type,
+static int ce_ring_setup_srng(struct hif_softc *scn, uint8_t ring_type,
uint32_t ce_id, struct CE_ring_state *ring,
struct CE_attr *attr)
{
@@ -728,6 +728,8 @@ static void ce_ring_setup_srng(struct hif_softc *scn, uint8_t ring_type,
qdf_assert(0);
break;
}
+
+ return 0;
}
static void ce_construct_shadow_config_srng(struct hif_softc *scn)
diff --git a/hif/src/pcie/if_pci.c b/hif/src/pcie/if_pci.c
index ddd147746..52deaff08 100644
--- a/hif/src/pcie/if_pci.c
+++ b/hif/src/pcie/if_pci.c
@@ -159,7 +159,7 @@ static void pci_dispatch_interrupt(struct hif_softc *scn)
}
}
-irqreturn_t hif_pci_interrupt_handler(int irq, void *arg)
+irqreturn_t hif_pci_legacy_ce_interrupt_handler(int irq, void *arg)
{
struct hif_pci_softc *sc = (struct hif_pci_softc *)arg;
struct hif_softc *scn = HIF_GET_SOFTC(sc);
@@ -602,6 +602,7 @@ static void hif_pci_device_warm_reset(struct hif_pci_softc *sc)
}
#ifndef QCA_WIFI_3_0
+/* only applicable to legacy ce */
int hif_check_fw_reg(struct hif_opaque_softc *hif_ctx)
{
struct hif_softc *scn = HIF_GET_SOFTC(hif_ctx);
@@ -2436,7 +2437,7 @@ static int hif_configure_msi(struct hif_pci_softc *sc)
tasklet_init(&sc->intr_tq,
wlan_tasklet, (unsigned long)sc);
ret = request_irq(sc->pdev->irq,
- hif_pci_interrupt_handler,
+ hif_pci_legacy_ce_interrupt_handler,
IRQF_SHARED, "wlan_pci", sc);
if (ret) {
HIF_ERROR("%s: request_irq failed", __func__);
@@ -2458,8 +2459,8 @@ static int hif_configure_msi(struct hif_pci_softc *sc)
sc->num_msi_intrs = 1;
tasklet_init(&sc->intr_tq, wlan_tasklet, (unsigned long)sc);
ret = request_irq(sc->pdev->irq,
- hif_pci_interrupt_handler, IRQF_SHARED,
- "wlan_pci", sc);
+ hif_pci_legacy_ce_interrupt_handler,
+ IRQF_SHARED, "wlan_pci", sc);
if (ret) {
HIF_ERROR("%s: request_irq failed", __func__);
goto err_intr;
@@ -2495,7 +2496,7 @@ static int hif_pci_configure_legacy_irq(struct hif_pci_softc *sc)
/* do notn support MSI or MSI IRQ failed */
tasklet_init(&sc->intr_tq, wlan_tasklet, (unsigned long)sc);
ret = request_irq(sc->pdev->irq,
- hif_pci_interrupt_handler, IRQF_SHARED,
+ hif_pci_legacy_ce_interrupt_handler, IRQF_SHARED,
"wlan_pci", sc);
if (ret) {
HIF_ERROR("%s: request_irq failed, ret = %d", __func__, ret);
@@ -3118,6 +3119,8 @@ bus_resume:
* ensure that the fastpath write index register is up to date
* since runtime pm may cause ce_send_fast to skip the register
* write.
+ *
+ * fastpath only applicable to legacy copy engine
*/
void hif_fastpath_resume(struct hif_opaque_softc *hif_ctx)
{
@@ -3981,6 +3984,8 @@ void hif_pci_irq_enable(struct hif_softc *scn, int ce_id)
* @scn: hif_softc
* @ce_id: ce_id
*
+ * only applicable to legacy copy engine...
+ *
* Return: void
*/
void hif_pci_irq_disable(struct hif_softc *scn, int ce_id)
diff --git a/hif/src/pcie/if_pci.h b/hif/src/pcie/if_pci.h
index 991be8379..909e95ca9 100644
--- a/hif/src/pcie/if_pci.h
+++ b/hif/src/pcie/if_pci.h
@@ -148,7 +148,7 @@ bool hif_pci_targ_is_present(struct hif_softc *scn, void *__iomem *mem);
int hif_configure_irq(struct hif_softc *sc);
void hif_pci_cancel_deferred_target_sleep(struct hif_softc *scn);
void wlan_tasklet(unsigned long data);
-irqreturn_t hif_pci_interrupt_handler(int irq, void *arg);
+irqreturn_t hif_pci_legacy_ce_interrupt_handler(int irq, void *arg);
int hif_pci_addr_in_boundary(struct hif_softc *scn, uint32_t offset);
/*
diff --git a/hif/src/snoc/if_ahb.c b/hif/src/snoc/if_ahb.c
index ea5ab6306..18a04cfd2 100644
--- a/hif/src/snoc/if_ahb.c
+++ b/hif/src/snoc/if_ahb.c
@@ -222,7 +222,7 @@ int hif_ahb_configure_legacy_irq(struct hif_pci_softc *sc)
ret = -1;
goto end;
}
- ret = request_irq(irq, hif_pci_interrupt_handler,
+ ret = request_irq(irq, hif_pci_legacy_ce_interrupt_handler,
IRQF_DISABLED, "wlan_ahb", sc);
if (ret) {
dev_err(&pdev->dev, "ath_request_irq failed\n");