From 1024d06f3ff5c305c5ad81af899681c5cdba29c7 Mon Sep 17 00:00:00 2001 From: Ashok Vuyyuru Date: Thu, 17 Mar 2022 18:43:30 +0530 Subject: [PATCH] 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;