diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c index 918a037392d5..19b1a9ceabcb 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c @@ -3965,6 +3965,8 @@ void ipa3_update_ssr_state(bool is_ssr) */ void ipa3_q6_pre_shutdown_cleanup(void) { + bool prod = false; + IPADBG_LOW("ENTER\n"); IPA_ACTIVE_CLIENTS_INC_SIMPLE(); @@ -3973,6 +3975,10 @@ void ipa3_q6_pre_shutdown_cleanup(void) if (!ipa3_ctx->ipa_endp_delay_wa) ipa3_q6_pipe_delay(true); ipa3_q6_avoid_holb(); + if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_0) { + prod = true; + ipa3_halt_q6_gsi_channels(prod); + } if (ipa3_ctx->ipa_config_is_mhi) ipa3_set_reset_client_cons_pipe_sus_holb(true, IPA_CLIENT_MHI_CONS); @@ -4030,8 +4036,6 @@ void ipa3_q6_post_shutdown_cleanup(void) /* halt both prod and cons channels starting at IPAv4 */ if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_0) { - prod = true; - ipa3_halt_q6_gsi_channels(prod); IPA_ACTIVE_CLIENTS_DEC_SIMPLE(); IPADBG("Exit without consumer check\n"); return; diff --git a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c index 81d093b9a3e3..69d9656eb3a5 100644 --- a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c @@ -2857,12 +2857,13 @@ static int ipa3_lcl_mdm_ssr_notifier_cb(struct notifier_block *this, switch (code) { case SUBSYS_BEFORE_SHUTDOWN: IPAWANINFO("IPA received MPSS BEFORE_SHUTDOWN\n"); + /*Stop netdev first to stop queueing pkts to Q6 */ + if (IPA_NETDEV()) + netif_stop_queue(IPA_NETDEV()); /* send SSR before-shutdown notification to IPACM */ rmnet_ipa_send_ssr_notification(false); atomic_set(&rmnet_ipa3_ctx->is_ssr, 1); ipa3_q6_pre_shutdown_cleanup(); - if (IPA_NETDEV()) - netif_stop_queue(IPA_NETDEV()); ipa3_qmi_stop_workqueues(); ipa3_wan_ioctl_stop_qmi_messages(); ipa_stop_polling_stats();