qcacmn: Add Wake MSI support
Using the same MSI for wake and copy engines has a number of negative
side effects. Instead, set aside a whole MSI just for the wake
notification from firmware.
Change-Id: If871b88ca255ad970dabb4a7773d2b4d3b71c3fe
CRs-Fixed: 2055359
diff --git a/hif/src/dispatcher/multibus.c b/hif/src/dispatcher/multibus.c
index 0570df8..e22eabe 100644
--- a/hif/src/dispatcher/multibus.c
+++ b/hif/src/dispatcher/multibus.c
@@ -439,7 +439,6 @@
* Return: int 0 for success, non zero for failure
*/
int hif_bus_reset_resume(struct hif_opaque_softc *scn)
-
{
struct hif_softc *hif_sc = HIF_GET_SOFTC(scn);
@@ -451,14 +450,19 @@
struct hif_softc *scn;
int i;
+ QDF_BUG(hif_ctx);
scn = HIF_GET_SOFTC(hif_ctx);
- if (!scn) {
- QDF_BUG(0);
+ if (!scn)
return -EINVAL;
- }
- for (i = 0; i < scn->ce_count; ++i)
- disable_irq(scn->bus_ops.hif_map_ce_to_irq(scn, i));
+ /* if the wake_irq is shared, don't disable it twice */
+ disable_irq(scn->wake_irq);
+ for (i = 0; i < scn->ce_count; ++i) {
+ int irq = scn->bus_ops.hif_map_ce_to_irq(scn, i);
+
+ if (irq != scn->wake_irq)
+ disable_irq(irq);
+ }
return 0;
}
@@ -468,60 +472,47 @@
struct hif_softc *scn;
int i;
+ QDF_BUG(hif_ctx);
scn = HIF_GET_SOFTC(hif_ctx);
- if (!scn) {
- QDF_BUG(0);
+ if (!scn)
return -EINVAL;
- }
- for (i = 0; i < scn->ce_count; ++i)
- enable_irq(scn->bus_ops.hif_map_ce_to_irq(scn, i));
+ /* if the wake_irq is shared, don't enable it twice */
+ enable_irq(scn->wake_irq);
+ for (i = 0; i < scn->ce_count; ++i) {
+ int irq = scn->bus_ops.hif_map_ce_to_irq(scn, i);
+
+ if (irq != scn->wake_irq)
+ enable_irq(irq);
+ }
return 0;
}
int hif_apps_wake_irq_disable(struct hif_opaque_softc *hif_ctx)
{
- int errno;
struct hif_softc *scn;
- uint8_t wake_ce_id;
+ QDF_BUG(hif_ctx);
scn = HIF_GET_SOFTC(hif_ctx);
- if (!scn) {
- QDF_BUG(0);
+ if (!scn)
return -EINVAL;
- }
- errno = hif_get_wake_ce_id(scn, &wake_ce_id);
- if (errno) {
- HIF_ERROR("%s: failed to get wake CE Id: %d", __func__, errno);
- return errno;
- }
-
- disable_irq(scn->bus_ops.hif_map_ce_to_irq(scn, wake_ce_id));
+ disable_irq(scn->wake_irq);
return 0;
}
int hif_apps_wake_irq_enable(struct hif_opaque_softc *hif_ctx)
{
- int errno;
struct hif_softc *scn;
- uint8_t wake_ce_id;
+ QDF_BUG(hif_ctx);
scn = HIF_GET_SOFTC(hif_ctx);
- if (!scn) {
- QDF_BUG(0);
+ if (!scn)
return -EINVAL;
- }
- errno = hif_get_wake_ce_id(scn, &wake_ce_id);
- if (errno) {
- HIF_ERROR("%s: failed to get wake CE Id: %d", __func__, errno);
- return errno;
- }
-
- enable_irq(scn->bus_ops.hif_map_ce_to_irq(scn, wake_ce_id));
+ enable_irq(scn->wake_irq);
return 0;
}