Received: by 2002:a05:6a10:9e8c:0:0:0:0 with SMTP id y12csp807710pxx; Tue, 27 Oct 2020 00:19:54 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzLZZTw8/dJk2+3FkFkl8CmN0dkVaDC8I+702/tCTV6WfdKu4TpcT8YVrKXZ6uvO/gNkazh X-Received: by 2002:a17:906:19d1:: with SMTP id h17mr1114314ejd.184.1603783194459; Tue, 27 Oct 2020 00:19:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603783194; cv=none; d=google.com; s=arc-20160816; b=TbXtggmmBM0mayQJv4aoKQTTUYFbsDPay3nzqUyu46jAbx0tb/sPE42KQ70iyJGbqQ 8mo01Xi9W7QaJ6aSr52bDSSt6uODEDPHmE4+TEefMF3FpwLrFaDH83Co9j4yr0P1pi7y QMyvYHoJBSbvoLMSnid6OMEsvg8MYPjt47IDoCZEOsWbt7JZJUKxfxhdQZ9OiKz2cFZm ad0ajVOTnNZL4LcJgvS3JFqcLxp7QXgcI9fDhUFh1QzCfYdWHvG+xDWncxfvrvCBK+sO 30LuzD6bwuStG0RYZ46VvsmcveJ+YZLabrjkqfxKH4l8KadzQu/sHqDuxQWcKMuVGveo qAuA== 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=sAPec548s0DjmZNGuGUBGyk82TEeUs97ZszXwWQ5Nc8=; b=f7rA2WGia69zQ/Tdh807tB5o8BZ8d/S+cSIpUMbmtnpDtRI5vTR2XM+fvK6fJI8Qbn viS1VfVlgiL1+QaVZD0Fyao9jBiPpuLW1Dg5Pdfx5TeOgWhEyAsXaUoPIdCPp+YLcTSd yBzYY3MbxixS0By9a3tvv2JXYoqp3o8zxEFR8ezUwz3WiUdBewSWFwp1jDiuwq6WaZf4 ZSrDOjnuUHTMUodOfO3m2qWhuV4hxcnXL0HGRBJSJg4kMafFzP27JK2JBsO45Tm33aMg cLfLiq8ayFxhymRy5NGQj7UBKSZ7Lp9c8eO4WoU1L7P9rmO3dOcd2LmfP0J4Qd8nu/Y2 Wiqw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=ouJWYybP; 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 dn1si278037edb.319.2020.10.27.00.19.32; Tue, 27 Oct 2020 00:19:54 -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=ouJWYybP; 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 S1729103AbgJZTvl (ORCPT + 99 others); Mon, 26 Oct 2020 15:51:41 -0400 Received: from mail.kernel.org ([198.145.29.99]:47518 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728825AbgJZTvc (ORCPT ); Mon, 26 Oct 2020 15:51:32 -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 D3E8820795; Mon, 26 Oct 2020 19:51:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1603741891; bh=5/B5kXe42i+Um1gYnjQ8fFlsUDUeqbDAVDmwgsZKkhI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ouJWYybP4cPUuRgmcKU77BelUfft9OhrE9Vjy8qyMIoNo01SDGqLDr7lO2pWK5LJd eliZQrGJ7Tal67vK/3mu5aGcKMF8A9QZwpdSKEWU7ji/n2oH9+vDPkYxGs1djJZBMu ovro2Js9zBZztEFBEc5sBIAt2UQxk96DsHorHiaw= From: Jaegeuk Kim To: linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, kernel-team@android.com Cc: cang@codeaurora.org, alim.akhtar@samsung.com, avri.altman@wdc.com, bvanassche@acm.org, Jaegeuk Kim Subject: [PATCH v4 2/5] scsi: ufs: clear UAC for FFU and RPMB LUNs Date: Mon, 26 Oct 2020 12:51:21 -0700 Message-Id: <20201026195124.363096-3-jaegeuk@kernel.org> X-Mailer: git-send-email 2.29.0.rc1.297.gfa9743e501-goog In-Reply-To: <20201026195124.363096-1-jaegeuk@kernel.org> References: <20201026195124.363096-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. 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 6c9269bffcbd..8e696ca79b40 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -7058,7 +7058,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, @@ -7071,14 +7070,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); @@ -7602,6 +7601,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 @@ -7721,6 +7777,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