From: Jaegeuk Kim <jaegeuk@kernel.org>
To: asutoshd@codeaurora.org
Cc: bvanassche@acm.org, linux-kernel@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net, linux-@vger.kernel.org,
avri.altman@wdc.com, cang@codeaurora.org,
alim.akhtar@samsung.com, kernel-team@android.com
Subject: Re: [f2fs-dev] [PATCH v3 2/5] scsi: ufs: clear UAC for FFU and RPMB LUNs
Date: Mon, 26 Oct 2020 12:43:36 -0700 [thread overview]
Message-ID: <20201026194336.GA226134@google.com> (raw)
In-Reply-To: <84bad19305642b7faf21a1a48eb3e46f@codeaurora.org>
On 10/26, asutoshd@codeaurora.org wrote:
> On 2020-10-24 08:06, Jaegeuk Kim wrote:
> > From: Jaegeuk Kim <jaegeuk@google.com>
> >
> > 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.
> >
>
> What's the meaning of 'given early execution'?
I saw there's hba->wlun_dev_clr_ua to clear UA at ufshcd_set_dev_pwr_mode(),
and thus, assumed there's other path to clear UA. So, with this patch, user
can try FFU or RPMB requests regardless of that being done.
>
> > Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
> > ---
> > 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 e0b479f9eb8a..011e80a21170 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;
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
WARNING: multiple messages have this Message-ID (diff)
From: Jaegeuk Kim <jaegeuk@kernel.org>
To: asutoshd@codeaurora.org
Cc: linux-kernel@vger.kernel.org, linux-@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net, kernel-team@android.com,
cang@codeaurora.org, alim.akhtar@samsung.com,
avri.altman@wdc.com, bvanassche@acm.org
Subject: Re: [PATCH v3 2/5] scsi: ufs: clear UAC for FFU and RPMB LUNs
Date: Mon, 26 Oct 2020 12:43:36 -0700 [thread overview]
Message-ID: <20201026194336.GA226134@google.com> (raw)
In-Reply-To: <84bad19305642b7faf21a1a48eb3e46f@codeaurora.org>
On 10/26, asutoshd@codeaurora.org wrote:
> On 2020-10-24 08:06, Jaegeuk Kim wrote:
> > From: Jaegeuk Kim <jaegeuk@google.com>
> >
> > 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.
> >
>
> What's the meaning of 'given early execution'?
I saw there's hba->wlun_dev_clr_ua to clear UA at ufshcd_set_dev_pwr_mode(),
and thus, assumed there's other path to clear UA. So, with this patch, user
can try FFU or RPMB requests regardless of that being done.
>
> > Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
> > ---
> > 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 e0b479f9eb8a..011e80a21170 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;
next prev parent reply other threads:[~2020-10-26 19:43 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-24 15:06 [f2fs-dev] [UFS v3] UFS fixes Jaegeuk Kim
2020-10-24 15:06 ` Jaegeuk Kim
2020-10-24 15:06 ` [f2fs-dev] [PATCH v3 1/5] scsi: ufs: atomic update for clkgating_enable Jaegeuk Kim
2020-10-24 15:06 ` Jaegeuk Kim
2020-10-26 3:28 ` [f2fs-dev] " Can Guo
2020-10-26 3:28 ` Can Guo
2020-10-26 6:13 ` [f2fs-dev] " Jaegeuk Kim
2020-10-26 6:13 ` Jaegeuk Kim
2020-10-26 6:43 ` [f2fs-dev] " Can Guo
2020-10-26 6:43 ` Can Guo
2020-10-26 19:48 ` [f2fs-dev] " Jaegeuk Kim
2020-10-26 19:48 ` Jaegeuk Kim
2020-10-27 2:44 ` [f2fs-dev] " Can Guo
2020-10-27 2:44 ` Can Guo
2020-10-24 15:06 ` [f2fs-dev] [PATCH v3 2/5] scsi: ufs: clear UAC for FFU and RPMB LUNs Jaegeuk Kim
2020-10-24 15:06 ` Jaegeuk Kim
2020-10-26 18:25 ` [f2fs-dev] " asutoshd
2020-10-26 18:25 ` asutoshd
2020-10-26 19:43 ` Jaegeuk Kim [this message]
2020-10-26 19:43 ` Jaegeuk Kim
2020-10-27 17:48 ` kernel test robot
2020-10-27 17:48 ` kernel test robot
2020-10-24 15:06 ` [f2fs-dev] [PATCH v3 3/5] scsi: ufs: use WQ_HIGHPRI for gating work Jaegeuk Kim
2020-10-24 15:06 ` Jaegeuk Kim
2020-10-26 18:27 ` [f2fs-dev] " asutoshd
2020-10-26 18:27 ` asutoshd
2020-10-24 15:06 ` [f2fs-dev] [PATCH v3 4/5] scsi: add more contexts in the ufs tracepoints Jaegeuk Kim
2020-10-24 15:06 ` Jaegeuk Kim
2020-10-24 15:06 ` [f2fs-dev] [PATCH v3 5/5] scsi: ufs: fix clkgating on/off correctly Jaegeuk Kim
2020-10-24 15:06 ` Jaegeuk Kim
2020-10-26 18:33 ` [f2fs-dev] " asutoshd
2020-10-26 18:33 ` asutoshd
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201026194336.GA226134@google.com \
--to=jaegeuk@kernel.org \
--cc=alim.akhtar@samsung.com \
--cc=asutoshd@codeaurora.org \
--cc=avri.altman@wdc.com \
--cc=bvanassche@acm.org \
--cc=cang@codeaurora.org \
--cc=kernel-team@android.com \
--cc=linux-@vger.kernel.org \
--cc=linux-f2fs-devel@lists.sourceforge.net \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.