Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp41168pxk; Mon, 5 Oct 2020 17:04:07 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxNztoNhI8ArfPuhU1O7XUvBlJ+ugeJYr6BdYle2fzhB6XWP3AFpK36+VWXUn+yakxuuE7u X-Received: by 2002:a17:906:8293:: with SMTP id h19mr2261324ejx.130.1601942647657; Mon, 05 Oct 2020 17:04:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1601942647; cv=none; d=google.com; s=arc-20160816; b=VUQ58VaUW/r0et7Z3a0YH/zA5MChNvA60TkgqQCf0b/Z26Pv4PtLxApQwlXX1wDyQD qotMO3L0x2ppWssQgfJpSL2POIGvFcUSQtYQ52sJtPVRqEVsC4hr7lz5rkvA/ALNKLk0 xaQQvy4X70T3V/uGZ6XHwKoA3HoXoiLv+bK/3mUcy223ezCidXurKtYoiOWivelJvDd4 j6VlqcSvbVpscm0l92H6lk3RWhcLFLy8RUB47V63DJqJua3ElzRXI2lxs+8W+cO3tZVM h3E5bzqvpMkkzz9eNAm+0cvm3/edrMpOEVMyEVTIUYkGyLVSWoodJ6KoQlAPGB/1iE0P jTSw== 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=+tcHIeaPbkDt9gAdzrJB5gUMpRt7CctHGaDcoChbaA8=; b=tH751tK+PlOhPjqFkS1j+fFI5saZWMmnZZVQuFSH4o0wzbdqaQdR9sgp1Ujq6I/yJe i9xJkQSJ4zMaIHD+xlcQfzSBjdB1Un3yl26wwgmHL1jjNT4Ci1vvOGHQZlxcBHJk8l9X 9v0J6U+kGzwNpR1bdTBORq6ygqMyGbm7ORxfn8Y1j7wLiocYnf8uhVAH4ZARJ2En/4tZ vIAXhg0QLv7AxwY1vLFauY0ZC7TNNYh7iHhG17RmLmoazZCeRHIkHeEoEMrYsEYElb+H Au6GX25RK0ICcI9P6vXxSBst1d6FLXkvZ0s9mb9cNezbuENIebS2L0goso8BpRpvvV03 wDXQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=OCu4SgVL; 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 f23si1198082edj.426.2020.10.05.17.03.44; Mon, 05 Oct 2020 17:04:07 -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=OCu4SgVL; 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 S1727244AbgJEWgj (ORCPT + 99 others); Mon, 5 Oct 2020 18:36:39 -0400 Received: from mail.kernel.org ([198.145.29.99]:56810 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725917AbgJEWgi (ORCPT ); Mon, 5 Oct 2020 18:36:38 -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 C2A2E2078D; Mon, 5 Oct 2020 22:36:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1601937397; bh=wrNpq8pVgnumeZyDyaHsD4y/rLz7x2TT8jbfts6O5NU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OCu4SgVLxaexohyschbau50zhjLgV6fGFvgFYuJ2Dshn6cLZkept7nlVARZ3jQosE 36rca30UJRfJ79UccAwg9lnlhGzkilbrQLMmJ2kbZ90rCNoW4ROR2NTwF6we4w6s9r dzYe1OJYABMJJCUUs5tfGhaXuXc1hOV5dGIAv6/k= From: Jaegeuk Kim To: linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, kernel-team@android.com Cc: Jaegeuk Kim , Alim Akhtar , Avri Altman , Can Guo Subject: [PATCH 2/4] scsi: ufs: clear UAC for FFU and RPMB LUNs Date: Mon, 5 Oct 2020 15:36:33 -0700 Message-Id: <20201005223635.2922805-2-jaegeuk@kernel.org> X-Mailer: git-send-email 2.28.0.806.g8561365e88-goog In-Reply-To: <20201005223635.2922805-1-jaegeuk@kernel.org> References: <20201005223635.2922805-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 d929c3d1e58cc..0bb07b50bd23e 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -6841,7 +6841,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, @@ -6854,14 +6853,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); @@ -7385,6 +7384,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 @@ -7500,6 +7556,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 363589c0bd370..8344d8cb36786 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -662,6 +662,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.28.0.806.g8561365e88-goog