Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp1625891pxk; Fri, 18 Sep 2020 19:04:19 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzQIqwAYi463kDKoI5RuNCXdK7/2BSS12xvZ5orWJSkYOLf8BGbFWUNSfynJnfMHthUM7zH X-Received: by 2002:a17:906:b7d1:: with SMTP id fy17mr40456213ejb.391.1600481059581; Fri, 18 Sep 2020 19:04:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1600481059; cv=none; d=google.com; s=arc-20160816; b=QpEmiSsakfJ6ovXdIEIShAkGhEZlG+xAu+NxbJzB/k/99ZLmuuPPLr7Ygb2EnkmD74 px7osy9xbU5C46mWn6cxpo6K0sjRfQK6tk2fj9iygSbIpDFFtrr33xAp/877DLb7j+pV kF4LHBw4uMnydI99V5lXMujzgT9cHvu4GvK+Wnnlfz1cC4lMrFECNpgE8vX6EJqt853b 6n332brgyxhb9TfsXl6Nmr6lnXLkWvHiCVjECB5ddLnQvEqdakyIRPWeAucfOcDxET/8 zfgkLxHzSp1C3Ecbzta7uFLyBDmpedgBVn4raRCfWE4RwST4VRWXNmGqoQCr5hAtZpv0 mDwA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dmarc-filter:sender:dkim-signature; bh=/06be2WqbhKuXJzJdazBcUlFvcleAekB8N5QwkQrdyo=; b=ri4ynMseY3o6W1MyaWmf/AsDTTB4wIcUWvg9CclJXWs8hkiTotwrszaPjGiFAzeg00 fjNE7FVL7d28VfPISha74P7NC/IZOvZfvH2d1FjqOGHbMYj9np18UJMWUYnVj25wUq1T Uddnl+L0krEgqOY3Ui6pUYmYbC2GR5Ja1rkPROIvntBNsHrssUbd2zb0FELIvVlFMAOv ovM/E12+u6WspsvPPem3TWGID0/dqP2V1XDpP8azAbFpbygVmf2S3IiyqRtM9KsLd3dK zXIeLIAnafKNgNLUKy+0tLW50RKGBeGyVdAJKOpcS+G8OrgNAei+qMwN8fN4J9qaEbJk /pgA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@mg.codeaurora.org header.s=smtp header.b=EOEEjvZN; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f9si4647202ejl.32.2020.09.18.19.03.56; Fri, 18 Sep 2020 19:04:19 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@mg.codeaurora.org header.s=smtp header.b=EOEEjvZN; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726382AbgISCCy (ORCPT + 99 others); Fri, 18 Sep 2020 22:02:54 -0400 Received: from m42-11.mailgun.net ([69.72.42.11]:54999 "EHLO m42-11.mailgun.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726360AbgISCCu (ORCPT ); Fri, 18 Sep 2020 22:02:50 -0400 DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.codeaurora.org; q=dns/txt; s=smtp; t=1600480970; h=References: In-Reply-To: Message-Id: Date: Subject: Cc: To: From: Sender; bh=/06be2WqbhKuXJzJdazBcUlFvcleAekB8N5QwkQrdyo=; b=EOEEjvZNb+dmg2bIDe1V/SJ0McvV1sQgYnguZD22kwf9ObCn7M1tGaCux2VsmXX7o8ujCqzk mZDRBm3RAuBdpwI/5ICIRqLvWOF/9YSW0hVW40X5irtzxh6fTXqfyjXSJ/lQANuaXy08t7Hl H2yas8KECeJLTlXg1HyiHJN7huE= X-Mailgun-Sending-Ip: 69.72.42.11 X-Mailgun-Sid: WyI0MWYwYSIsICJsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnIiwgImJlOWU0YSJd Received: from smtp.codeaurora.org (ec2-35-166-182-171.us-west-2.compute.amazonaws.com [35.166.182.171]) by smtp-out-n02.prod.us-west-2.postgun.com with SMTP id 5f6566c92131f7663acaa4cb (version=TLS1.2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256); Sat, 19 Sep 2020 02:02:49 GMT Sender: bbhatt=codeaurora.org@mg.codeaurora.org Received: by smtp.codeaurora.org (Postfix, from userid 1001) id 5DB58C433FF; Sat, 19 Sep 2020 02:02:49 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-caf-mail-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=ALL_TRUSTED,BAYES_00,SPF_FAIL, URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.0 Received: from malabar-linux.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: bbhatt) by smtp.codeaurora.org (Postfix) with ESMTPSA id 94B9DC433C8; Sat, 19 Sep 2020 02:02:48 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 94B9DC433C8 Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; spf=fail smtp.mailfrom=bbhatt@codeaurora.org From: Bhaumik Bhatt To: manivannan.sadhasivam@linaro.org Cc: linux-arm-msm@vger.kernel.org, hemantk@codeaurora.org, jhugo@codeaurora.org, linux-kernel@vger.kernel.org, Bhaumik Bhatt Subject: [PATCH v1 10/10] bus: mhi: core: Mark device inactive soon after host issues a shutdown Date: Fri, 18 Sep 2020 19:02:35 -0700 Message-Id: <1600480955-16827-11-git-send-email-bbhatt@codeaurora.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1600480955-16827-1-git-send-email-bbhatt@codeaurora.org> References: <1600480955-16827-1-git-send-email-bbhatt@codeaurora.org> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Clients on the host may see the device in an active state for a short period of time after the host detects a device error or power down. Prevent any further host activity which could lead to race conditions or multiple callbacks to the controller or any timeouts seen by clients attempting to push data as they must be notified of the host intent sooner rather than later. This also allows the host and device states to be in sync with one another and prevents unnecessary host operations. Signed-off-by: Bhaumik Bhatt --- drivers/bus/mhi/core/main.c | 4 ++++ drivers/bus/mhi/core/pm.c | 31 +++++++++++++++++++------------ 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/drivers/bus/mhi/core/main.c b/drivers/bus/mhi/core/main.c index 1c8e332..5ec89e9 100644 --- a/drivers/bus/mhi/core/main.c +++ b/drivers/bus/mhi/core/main.c @@ -400,6 +400,10 @@ irqreturn_t mhi_intvec_threaded_handler(int irq_number, void *priv) /* If device supports RDDM don't bother processing SYS error */ if (mhi_cntrl->rddm_image) { + /* host may be performing a device power down already */ + if (!mhi_is_active(mhi_cntrl)) + goto exit_intvec; + if (mhi_cntrl->ee == MHI_EE_RDDM && mhi_cntrl->ee != ee) { /* prevent clients from queueing any more packets */ write_lock_irq(&mhi_cntrl->pm_lock); diff --git a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c index 16c04ab..4e2cb41 100644 --- a/drivers/bus/mhi/core/pm.c +++ b/drivers/bus/mhi/core/pm.c @@ -469,15 +469,10 @@ static void mhi_pm_disable_transition(struct mhi_controller *mhi_cntrl, write_lock_irq(&mhi_cntrl->pm_lock); prev_state = mhi_cntrl->pm_state; cur_state = mhi_tryset_pm_state(mhi_cntrl, transition_state); - if (cur_state == transition_state) { - mhi_cntrl->ee = MHI_EE_DISABLE_TRANSITION; + if (cur_state == MHI_PM_SYS_ERR_PROCESS) mhi_cntrl->dev_state = MHI_STATE_RESET; - } write_unlock_irq(&mhi_cntrl->pm_lock); - /* Wake up threads waiting for state transition */ - wake_up_all(&mhi_cntrl->state_event); - if (cur_state != transition_state) { dev_err(dev, "Failed to transition to state: %s from: %s\n", to_mhi_pm_state_str(transition_state), @@ -486,6 +481,11 @@ static void mhi_pm_disable_transition(struct mhi_controller *mhi_cntrl, return; } + mhi_cntrl->ee = MHI_EE_DISABLE_TRANSITION; + + /* Wake up threads waiting for state transition */ + wake_up_all(&mhi_cntrl->state_event); + /* Trigger MHI RESET so that the device will not access host memory */ if (MHI_REG_ACCESS_VALID(prev_state)) { u32 in_reset = -1; @@ -1051,22 +1051,29 @@ void mhi_power_down(struct mhi_controller *mhi_cntrl, bool graceful) enum dev_st_transition next_state = DEV_ST_TRANSITION_DISABLE; struct device *dev = &mhi_cntrl->mhi_dev->dev; + mutex_lock(&mhi_cntrl->pm_mutex); + write_lock_irq(&mhi_cntrl->pm_lock); + /* If it's not a graceful shutdown, force MHI to linkdown state */ if (!graceful) { - mutex_lock(&mhi_cntrl->pm_mutex); - write_lock_irq(&mhi_cntrl->pm_lock); cur_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_LD_ERR_FATAL_DETECT); - write_unlock_irq(&mhi_cntrl->pm_lock); - mutex_unlock(&mhi_cntrl->pm_mutex); - if (cur_state != MHI_PM_LD_ERR_FATAL_DETECT) + if (cur_state != MHI_PM_LD_ERR_FATAL_DETECT) { dev_dbg(dev, "Failed to move to state: %s from: %s\n", to_mhi_pm_state_str(MHI_PM_LD_ERR_FATAL_DETECT), to_mhi_pm_state_str(mhi_cntrl->pm_state)); - else + } else { next_state = DEV_ST_TRANSITION_FATAL; + wake_up_all(&mhi_cntrl->state_event); + } } + /* mark device inactive to avoid any further host processing */ + mhi_cntrl->dev_state = MHI_STATE_RESET; + + write_unlock_irq(&mhi_cntrl->pm_lock); + mutex_unlock(&mhi_cntrl->pm_mutex); + mhi_queue_state_transition(mhi_cntrl, next_state); /* Wait for shutdown to complete */ -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project