From 1024d06f3ff5c305c5ad81af899681c5cdba29c7 Mon Sep 17 00:00:00 2001 From: Ashok Vuyyuru Date: Thu, 17 Mar 2022 18:43:30 +0530 Subject: [PATCH 1/2] msm: ipa3: In deep sleep scenario destroy/ reinitialize uC interrupts In deep sleep suspend/resume scenario destroy the uC interrupts in suspend and reinitialize the interrupts in resume Change-Id: Ib3631cef8e1e78651b6b79aef7f3d65dae0411c2 Signed-off-by: Ashok Vuyyuru --- drivers/platform/msm/ipa/ipa_v3/ipa.c | 1 + drivers/platform/msm/ipa/ipa_v3/ipa_i.h | 1 + drivers/platform/msm/ipa/ipa_v3/ipa_interrupts.c | 4 +++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c index a0ca7bd1697f..b95f98e5da48 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c @@ -9660,6 +9660,7 @@ static void ipa3_deepsleep_suspend(void) /*Disabling IPA interrupt*/ ipa3_remove_interrupt_handler(IPA_TX_SUSPEND_IRQ); ipa3_interrupts_destroy(ipa3_res.ipa_irq, &ipa3_ctx->master_pdev->dev); + ipa3_uc_interface_destroy(); /*Destroy the NAT device*/ ipa3_nat_ipv6ct_destroy_devices(); /*Freeing memory allocated for coalesing and dma task*/ diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h index 4267d36c54f2..10a4650c7335 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h @@ -2978,6 +2978,7 @@ int ipa3_uc_send_cmd(u32 cmd, u32 opcode, u32 expected_status, void ipa3_uc_register_handlers(enum ipa3_hw_features feature, struct ipa3_uc_hdlrs *hdlrs); int ipa3_uc_notify_clk_state(bool enabled); +void ipa3_uc_interface_destroy(void); int ipa3_dma_setup(void); void ipa3_dma_shutdown(void); void ipa3_dma_async_memcpy_notify_cb(void *priv, diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_interrupts.c b/drivers/platform/msm/ipa/ipa_v3/ipa_interrupts.c index d52a80003b2d..a51c34fb27cd 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_interrupts.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_interrupts.c @@ -454,7 +454,9 @@ int ipa3_remove_interrupt_handler(enum ipa_irq_type interrupt) return -EFAULT; } - kfree(ipa_interrupt_to_cb[irq_num].private_data); + /*If free ipa3_ctx pointer causing device crash during remove interrupt*/ + if(ipa_interrupt_to_cb[irq_num].private_data != ipa3_ctx) + kfree(ipa_interrupt_to_cb[irq_num].private_data); ipa_interrupt_to_cb[irq_num].deferred_flag = false; ipa_interrupt_to_cb[irq_num].handler = NULL; ipa_interrupt_to_cb[irq_num].private_data = NULL; From 8aa0d102d81fb2632ce988fcc8d816e7fed7b5b1 Mon Sep 17 00:00:00 2001 From: Cheng Zeng Date: Thu, 24 Mar 2022 16:09:28 +0800 Subject: [PATCH 2/2] msm: gsi: Fix the incorrect evt ring pointer The pointer should be event ring pointer, not transfer ring pointer, it has chance to get wrong upper 32 bits when smmu is disabled. Signed-off-by: Cheng Zeng --- drivers/platform/msm/gsi/gsi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/platform/msm/gsi/gsi.c b/drivers/platform/msm/gsi/gsi.c index 7d75084783e0..2ae33a7bbb2a 100644 --- a/drivers/platform/msm/gsi/gsi.c +++ b/drivers/platform/msm/gsi/gsi.c @@ -4057,7 +4057,7 @@ int gsi_poll_n_channel(unsigned long chan_hdl, /* update rp to see of we have anything new to process */ rp = ctx->evtr->props.gsi_read_event_ring_rp( &ctx->evtr->props, ctx->evtr->id, ee); - rp |= ctx->ring.rp & 0xFFFFFFFF00000000ULL; + rp |= ctx->evtr->ring.rp & 0xFFFFFFFF00000000ULL; ctx->evtr->ring.rp = rp; /* read gsi event ring rp again if last read is empty */ @@ -4069,7 +4069,7 @@ int gsi_poll_n_channel(unsigned long chan_hdl, __iowmb(); rp = ctx->evtr->props.gsi_read_event_ring_rp( &ctx->evtr->props, ctx->evtr->id, ee); - rp |= ctx->ring.rp & 0xFFFFFFFF00000000ULL; + rp |= ctx->evtr->ring.rp & 0xFFFFFFFF00000000ULL; ctx->evtr->ring.rp = rp; if (rp == ctx->evtr->ring.rp_local) { spin_unlock_irqrestore(