Received: by 2002:a05:6a10:6744:0:0:0:0 with SMTP id w4csp5005269pxu; Wed, 21 Oct 2020 10:37:48 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzITn4CA/e9GEvxWNkTld6p6exERmFh/Pwg/u8BCqt0Do77WJLR+PRVa6fD1lK2Ivg3DhJG X-Received: by 2002:a50:d796:: with SMTP id w22mr4382522edi.123.1603301868350; Wed, 21 Oct 2020 10:37:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603301868; cv=none; d=google.com; s=arc-20160816; b=kBD/4XBWZOt1rFVbSvjqeDmCYKV1MKikZDNPC153plS6Bz/eyT+JJTiLsQYxCD79Qf ufB0YyekgXB7kE6MlgtNXUsmE7LZ7DU5K9NfkPg4+e5RNP/5Py53tPeCFwWJ4hYYYASX L+fae353/J0vBfeAp4j4sDr8I/LmGOP+2sGS846Fvchz3Xe0tbHAZSCVuV3+VLDuQDsK 6dC4bScZJV9p5uUklM3+oXPvcnn0iWcGsrNvDnEOFm5+hKAG+so7aU7Pav8xuF2CGVQY eBlLaQi/sz5FbUzanyCGR3W3/69E3Iz2x22DjVY9mPtBncex1LTGgW538SqX8Sr1ZGeE Ew5A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=2PeEjEDQdL0oGAodPM0OT9lqMWvZe0lC+G9KysQrN8U=; b=E8nCV4t5tEHZC5K2RLbmWDzUoj1Bq9EypGaa+Gjzdhvzj9ZnNdq/38rY6gSZgGr4/P 19RAOjBtspd9xVviKm8I7yYlsDo9REODZTS9M9fIL8S7aL++fQ8ILxKEdJd77t4eFn13 lHG+TTWxfDcXg4o9MN4SaW00DGa/o2jRPtfU4v4jbp2YesGjLkp0VeleCfwOFeRwCxsW bUm2aKRyP3i7sbHKJoi/10qc9UmU0F3Ih1OVgZALo6EXd1IKm6rBFeYooLQ1VbBM4euN MNr5r96hAcT+8R/9Xy13ceUvk0WmTIQCJXrNmKhPtQt6vzH9QL0HmmtIjr07ymFPB0TL i5aQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=qh93qn0g; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id di13si1794999edb.375.2020.10.21.10.37.26; Wed, 21 Oct 2020 10:37:48 -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=@kernel.org header.s=default header.b=qh93qn0g; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2438419AbgJTTxJ (ORCPT + 99 others); Tue, 20 Oct 2020 15:53:09 -0400 Received: from mail.kernel.org ([198.145.29.99]:48206 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2438405AbgJTTxH (ORCPT ); Tue, 20 Oct 2020 15:53:07 -0400 Received: from localhost (unknown [104.132.1.66]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id A77E622282; Tue, 20 Oct 2020 19:53:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1603223586; bh=HFw5+71HxddWiKI+OKbHJX9yPW71lc2G7ouCtgAn7H8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qh93qn0gxoSkPfnbNv42ZaqbpkOU4v+AhENYU9zbvcumaQvrtkmibx2qUrM7YVFtr eCiEvqEKmjZvAgXuwRUhycdL0ehjKQ0rzVVWo+c5ZJdgjh2VsLj5519UOEAHxZO5JN mNtAvucjDN+7XLBphtWmVvsh0TVoew8mS9BD7INw= From: Jaegeuk Kim To: linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, kernel-team@android.com Cc: Jaegeuk Kim , Alim Akhtar , Avri Altman , Can Guo Subject: [PATCH v2 2/5] scsi: ufs: clear UAC for FFU and RPMB LUNs Date: Tue, 20 Oct 2020 12:52:55 -0700 Message-Id: <20201020195258.2005605-3-jaegeuk@kernel.org> X-Mailer: git-send-email 2.29.0.rc1.297.gfa9743e501-goog In-Reply-To: <20201020195258.2005605-1-jaegeuk@kernel.org> References: <20201020195258.2005605-1-jaegeuk@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jaegeuk Kim In order to conduct FFU or RPMB operations, UFS needs to clear UAC. This patch clears it explicitly, so that we could get no failure given early execution. Cc: Alim Akhtar Cc: Avri Altman Cc: Can Guo Signed-off-by: Jaegeuk Kim --- drivers/scsi/ufs/ufshcd.c | 70 +++++++++++++++++++++++++++++++++++---- drivers/scsi/ufs/ufshcd.h | 1 + 2 files changed, 65 insertions(+), 6 deletions(-) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 7344353a9167..feb10ebf7a35 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -7057,7 +7057,6 @@ static inline void ufshcd_blk_pm_runtime_init(struct scsi_device *sdev) static int ufshcd_scsi_add_wlus(struct ufs_hba *hba) { int ret = 0; - struct scsi_device *sdev_rpmb; struct scsi_device *sdev_boot; hba->sdev_ufs_device = __scsi_add_device(hba->host, 0, 0, @@ -7070,14 +7069,14 @@ static int ufshcd_scsi_add_wlus(struct ufs_hba *hba) ufshcd_blk_pm_runtime_init(hba->sdev_ufs_device); scsi_device_put(hba->sdev_ufs_device); - sdev_rpmb = __scsi_add_device(hba->host, 0, 0, + hba->sdev_rpmb = __scsi_add_device(hba->host, 0, 0, ufshcd_upiu_wlun_to_scsi_wlun(UFS_UPIU_RPMB_WLUN), NULL); - if (IS_ERR(sdev_rpmb)) { - ret = PTR_ERR(sdev_rpmb); + if (IS_ERR(hba->sdev_rpmb)) { + ret = PTR_ERR(hba->sdev_rpmb); goto remove_sdev_ufs_device; } - ufshcd_blk_pm_runtime_init(sdev_rpmb); - scsi_device_put(sdev_rpmb); + ufshcd_blk_pm_runtime_init(hba->sdev_rpmb); + scsi_device_put(hba->sdev_rpmb); sdev_boot = __scsi_add_device(hba->host, 0, 0, ufshcd_upiu_wlun_to_scsi_wlun(UFS_UPIU_BOOT_WLUN), NULL); @@ -7601,6 +7600,63 @@ static int ufshcd_add_lus(struct ufs_hba *hba) return ret; } +static int +ufshcd_send_request_sense(struct ufs_hba *hba, struct scsi_device *sdp); + +static int ufshcd_clear_ua_wlun(struct ufs_hba *hba, u8 wlun) +{ + struct scsi_device *sdp; + unsigned long flags; + int ret = 0; + + spin_lock_irqsave(hba->host->host_lock, flags); + if (wlun == UFS_UPIU_UFS_DEVICE_WLUN) + sdp = hba->sdev_ufs_device; + else if (wlun == UFS_UPIU_RPMB_WLUN) + sdp = hba->sdev_rpmb; + else + BUG_ON(1); + if (sdp) { + ret = scsi_device_get(sdp); + if (!ret && !scsi_device_online(sdp)) { + ret = -ENODEV; + scsi_device_put(sdp); + } + } else { + ret = -ENODEV; + } + spin_unlock_irqrestore(hba->host->host_lock, flags); + if (ret) + goto out_err; + + ret = ufshcd_send_request_sense(hba, sdp); + scsi_device_put(sdp); +out_err: + if (ret) + dev_err(hba->dev, "%s: UAC clear LU=%x ret = %d\n", + __func__, wlun, ret); + return ret; +} + +static int ufshcd_clear_ua_wluns(struct ufs_hba *hba) +{ + int ret = 0; + + if (!hba->wlun_dev_clr_ua) + goto out; + + ret = ufshcd_clear_ua_wlun(hba, UFS_UPIU_UFS_DEVICE_WLUN); + if (!ret) + ret = ufshcd_clear_ua_wlun(hba, UFS_UPIU_RPMB_WLUN); + if (!ret) + hba->wlun_dev_clr_ua = false; +out: + if (ret) + dev_err(hba->dev, "%s: Failed to clear UAC WLUNS ret = %d\n", + __func__, ret); + return ret; +} + /** * ufshcd_probe_hba - probe hba to detect device and initialize * @hba: per-adapter instance @@ -7720,6 +7776,8 @@ static void ufshcd_async_scan(void *data, async_cookie_t cookie) pm_runtime_put_sync(hba->dev); ufshcd_exit_clk_scaling(hba); ufshcd_hba_exit(hba); + } else { + ufshcd_clear_ua_wluns(hba); } } diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index 47eb1430274c..718881d038f5 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -681,6 +681,7 @@ struct ufs_hba { * "UFS device" W-LU. */ struct scsi_device *sdev_ufs_device; + struct scsi_device *sdev_rpmb; enum ufs_dev_pwr_mode curr_dev_pwr_mode; enum uic_link_state uic_link_state; -- 2.29.0.rc1.297.gfa9743e501-goog