From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Bart Van Assche <bvanassche@acm.org>,
Stanley Chu <stanley.chu@mediatek.com>,
Adrian Hunter <adrian.hunter@intel.com>,
"Martin K . Petersen" <martin.petersen@oracle.com>,
Sasha Levin <sashal@kernel.org>,
jejb@linux.ibm.com, matthias.bgg@gmail.com, beanhuo@micron.com,
avri.altman@wdc.com, daejun7.park@samsung.com,
linux-scsi@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-mediatek@lists.infradead.org
Subject: [PATCH AUTOSEL 5.15 13/41] scsi: ufs: Support clearing multiple commands at once
Date: Mon, 27 Jun 2022 22:20:32 -0400 [thread overview]
Message-ID: <20220628022100.595243-13-sashal@kernel.org> (raw)
In-Reply-To: <20220628022100.595243-1-sashal@kernel.org>
From: Bart Van Assche <bvanassche@acm.org>
[ Upstream commit d1a7644648b7cdacaf8d1013a4285001911e9bc8 ]
Modify ufshcd_clear_cmd() such that it supports clearing multiple commands
at once instead of one command at a time. This change will be used in a
later patch to reduce the time spent in the reset handler.
Link: https://lore.kernel.org/r/20220613214442.212466-3-bvanassche@acm.org
Reviewed-by: Stanley Chu <stanley.chu@mediatek.com>
Reviewed-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/scsi/ufs/ufshcd.c | 42 ++++++++++++++++++++++++++-------------
1 file changed, 28 insertions(+), 14 deletions(-)
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 311170e63410..b5684bd32621 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -727,17 +727,28 @@ static inline int ufshcd_get_tr_ocs(struct ufshcd_lrb *lrbp)
}
/**
- * ufshcd_utrl_clear - Clear a bit in UTRLCLR register
+ * ufshcd_utrl_clear() - Clear requests from the controller request list.
* @hba: per adapter instance
- * @pos: position of the bit to be cleared
+ * @mask: mask with one bit set for each request to be cleared
*/
-static inline void ufshcd_utrl_clear(struct ufs_hba *hba, u32 pos)
+static inline void ufshcd_utrl_clear(struct ufs_hba *hba, u32 mask)
{
if (hba->quirks & UFSHCI_QUIRK_BROKEN_REQ_LIST_CLR)
- ufshcd_writel(hba, (1 << pos), REG_UTP_TRANSFER_REQ_LIST_CLEAR);
- else
- ufshcd_writel(hba, ~(1 << pos),
- REG_UTP_TRANSFER_REQ_LIST_CLEAR);
+ mask = ~mask;
+ /*
+ * From the UFSHCI specification: "UTP Transfer Request List CLear
+ * Register (UTRLCLR): This field is bit significant. Each bit
+ * corresponds to a slot in the UTP Transfer Request List, where bit 0
+ * corresponds to request slot 0. A bit in this field is set to ‘0’
+ * by host software to indicate to the host controller that a transfer
+ * request slot is cleared. The host controller
+ * shall free up any resources associated to the request slot
+ * immediately, and shall set the associated bit in UTRLDBR to ‘0’. The
+ * host software indicates no change to request slots by setting the
+ * associated bits in this field to ‘1’. Bits in this field shall only
+ * be set ‘1’ or ‘0’ by host software when UTRLRSR is set to ‘1’."
+ */
+ ufshcd_writel(hba, ~mask, REG_UTP_TRANSFER_REQ_LIST_CLEAR);
}
/**
@@ -2795,15 +2806,18 @@ static int ufshcd_compose_dev_cmd(struct ufs_hba *hba,
return ufshcd_compose_devman_upiu(hba, lrbp);
}
-static int
-ufshcd_clear_cmd(struct ufs_hba *hba, int tag)
+/*
+ * Clear all the requests from the controller for which a bit has been set in
+ * @mask and wait until the controller confirms that these requests have been
+ * cleared.
+ */
+static int ufshcd_clear_cmds(struct ufs_hba *hba, u32 mask)
{
unsigned long flags;
- u32 mask = 1 << tag;
/* clear outstanding transaction before retry */
spin_lock_irqsave(hba->host->host_lock, flags);
- ufshcd_utrl_clear(hba, tag);
+ ufshcd_utrl_clear(hba, mask);
spin_unlock_irqrestore(hba->host->host_lock, flags);
/*
@@ -2891,7 +2905,7 @@ static int ufshcd_wait_for_dev_cmd(struct ufs_hba *hba,
err = -ETIMEDOUT;
dev_dbg(hba->dev, "%s: dev_cmd request timedout, tag %d\n",
__func__, lrbp->task_tag);
- if (!ufshcd_clear_cmd(hba, lrbp->task_tag))
+ if (!ufshcd_clear_cmds(hba, 1U << lrbp->task_tag))
/* successfully cleared the command, retry if needed */
err = -EAGAIN;
/*
@@ -6820,7 +6834,7 @@ static int ufshcd_eh_device_reset_handler(struct scsi_cmnd *cmd)
/* clear the commands that were pending for corresponding LUN */
for_each_set_bit(pos, &hba->outstanding_reqs, hba->nutrs) {
if (hba->lrb[pos].lun == lun) {
- err = ufshcd_clear_cmd(hba, pos);
+ err = ufshcd_clear_cmds(hba, 1U << pos);
if (err)
break;
__ufshcd_transfer_req_compl(hba, 1U << pos, false);
@@ -6922,7 +6936,7 @@ static int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag)
goto out;
}
- err = ufshcd_clear_cmd(hba, tag);
+ err = ufshcd_clear_cmds(hba, 1U << tag);
if (err)
dev_err(hba->dev, "%s: Failed clearing cmd at tag %d, err %d\n",
__func__, tag, err);
--
2.35.1
WARNING: multiple messages have this Message-ID (diff)
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Bart Van Assche <bvanassche@acm.org>,
Stanley Chu <stanley.chu@mediatek.com>,
Adrian Hunter <adrian.hunter@intel.com>,
"Martin K . Petersen" <martin.petersen@oracle.com>,
Sasha Levin <sashal@kernel.org>,
jejb@linux.ibm.com, matthias.bgg@gmail.com, beanhuo@micron.com,
avri.altman@wdc.com, daejun7.park@samsung.com,
linux-scsi@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-mediatek@lists.infradead.org
Subject: [PATCH AUTOSEL 5.15 13/41] scsi: ufs: Support clearing multiple commands at once
Date: Mon, 27 Jun 2022 22:20:32 -0400 [thread overview]
Message-ID: <20220628022100.595243-13-sashal@kernel.org> (raw)
In-Reply-To: <20220628022100.595243-1-sashal@kernel.org>
From: Bart Van Assche <bvanassche@acm.org>
[ Upstream commit d1a7644648b7cdacaf8d1013a4285001911e9bc8 ]
Modify ufshcd_clear_cmd() such that it supports clearing multiple commands
at once instead of one command at a time. This change will be used in a
later patch to reduce the time spent in the reset handler.
Link: https://lore.kernel.org/r/20220613214442.212466-3-bvanassche@acm.org
Reviewed-by: Stanley Chu <stanley.chu@mediatek.com>
Reviewed-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/scsi/ufs/ufshcd.c | 42 ++++++++++++++++++++++++++-------------
1 file changed, 28 insertions(+), 14 deletions(-)
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 311170e63410..b5684bd32621 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -727,17 +727,28 @@ static inline int ufshcd_get_tr_ocs(struct ufshcd_lrb *lrbp)
}
/**
- * ufshcd_utrl_clear - Clear a bit in UTRLCLR register
+ * ufshcd_utrl_clear() - Clear requests from the controller request list.
* @hba: per adapter instance
- * @pos: position of the bit to be cleared
+ * @mask: mask with one bit set for each request to be cleared
*/
-static inline void ufshcd_utrl_clear(struct ufs_hba *hba, u32 pos)
+static inline void ufshcd_utrl_clear(struct ufs_hba *hba, u32 mask)
{
if (hba->quirks & UFSHCI_QUIRK_BROKEN_REQ_LIST_CLR)
- ufshcd_writel(hba, (1 << pos), REG_UTP_TRANSFER_REQ_LIST_CLEAR);
- else
- ufshcd_writel(hba, ~(1 << pos),
- REG_UTP_TRANSFER_REQ_LIST_CLEAR);
+ mask = ~mask;
+ /*
+ * From the UFSHCI specification: "UTP Transfer Request List CLear
+ * Register (UTRLCLR): This field is bit significant. Each bit
+ * corresponds to a slot in the UTP Transfer Request List, where bit 0
+ * corresponds to request slot 0. A bit in this field is set to ‘0’
+ * by host software to indicate to the host controller that a transfer
+ * request slot is cleared. The host controller
+ * shall free up any resources associated to the request slot
+ * immediately, and shall set the associated bit in UTRLDBR to ‘0’. The
+ * host software indicates no change to request slots by setting the
+ * associated bits in this field to ‘1’. Bits in this field shall only
+ * be set ‘1’ or ‘0’ by host software when UTRLRSR is set to ‘1’."
+ */
+ ufshcd_writel(hba, ~mask, REG_UTP_TRANSFER_REQ_LIST_CLEAR);
}
/**
@@ -2795,15 +2806,18 @@ static int ufshcd_compose_dev_cmd(struct ufs_hba *hba,
return ufshcd_compose_devman_upiu(hba, lrbp);
}
-static int
-ufshcd_clear_cmd(struct ufs_hba *hba, int tag)
+/*
+ * Clear all the requests from the controller for which a bit has been set in
+ * @mask and wait until the controller confirms that these requests have been
+ * cleared.
+ */
+static int ufshcd_clear_cmds(struct ufs_hba *hba, u32 mask)
{
unsigned long flags;
- u32 mask = 1 << tag;
/* clear outstanding transaction before retry */
spin_lock_irqsave(hba->host->host_lock, flags);
- ufshcd_utrl_clear(hba, tag);
+ ufshcd_utrl_clear(hba, mask);
spin_unlock_irqrestore(hba->host->host_lock, flags);
/*
@@ -2891,7 +2905,7 @@ static int ufshcd_wait_for_dev_cmd(struct ufs_hba *hba,
err = -ETIMEDOUT;
dev_dbg(hba->dev, "%s: dev_cmd request timedout, tag %d\n",
__func__, lrbp->task_tag);
- if (!ufshcd_clear_cmd(hba, lrbp->task_tag))
+ if (!ufshcd_clear_cmds(hba, 1U << lrbp->task_tag))
/* successfully cleared the command, retry if needed */
err = -EAGAIN;
/*
@@ -6820,7 +6834,7 @@ static int ufshcd_eh_device_reset_handler(struct scsi_cmnd *cmd)
/* clear the commands that were pending for corresponding LUN */
for_each_set_bit(pos, &hba->outstanding_reqs, hba->nutrs) {
if (hba->lrb[pos].lun == lun) {
- err = ufshcd_clear_cmd(hba, pos);
+ err = ufshcd_clear_cmds(hba, 1U << pos);
if (err)
break;
__ufshcd_transfer_req_compl(hba, 1U << pos, false);
@@ -6922,7 +6936,7 @@ static int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag)
goto out;
}
- err = ufshcd_clear_cmd(hba, tag);
+ err = ufshcd_clear_cmds(hba, 1U << tag);
if (err)
dev_err(hba->dev, "%s: Failed clearing cmd at tag %d, err %d\n",
__func__, tag, err);
--
2.35.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2022-06-28 2:25 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-28 2:20 [PATCH AUTOSEL 5.15 01/41] spi: spi-cadence: Fix SPI CS gets toggling sporadically Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 02/41] spi: cadence: Detect transmit FIFO depth Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 03/41] spi: spi-mem: Fix spi_mem_poll_status() Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 04/41] regulator: qcom_smd: correct MP5496 ranges Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 05/41] ALSA: usb-audio: US16x08: Move overflow check before array access Sasha Levin
2022-06-28 2:20 ` Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 06/41] bus: bt1-apb: Don't print error on -EPROBE_DEFER Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 07/41] bus: bt1-axi: " Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 08/41] drm/vc4: plane: Prevent async update if we don't have a dlist Sasha Levin
2022-06-28 2:20 ` Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 09/41] drm/vc4: crtc: Use an union to store the page flip callback Sasha Levin
2022-06-28 2:20 ` Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 10/41] drm/vc4: crtc: Move the BO handling out of common page-flip callback Sasha Levin
2022-06-28 2:20 ` Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 11/41] selftests: vm: Fix resource leak when return error Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 12/41] scsi: ufs: Simplify ufshcd_clear_cmd() Sasha Levin
2022-06-28 2:20 ` Sasha Levin
2022-06-28 2:20 ` Sasha Levin [this message]
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 13/41] scsi: ufs: Support clearing multiple commands at once Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 14/41] ALSA: x86: intel_hdmi_audio: enable pm_runtime and set autosuspend delay Sasha Levin
2022-06-28 2:20 ` Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 15/41] ALSA: x86: intel_hdmi_audio: use pm_runtime_resume_and_get() Sasha Levin
2022-06-28 2:20 ` Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 16/41] hamradio: 6pack: fix array-index-out-of-bounds in decode_std_command() Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 17/41] drivers/net/ethernet/neterion/vxge: Fix a use-after-free bug in vxge-main.c Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 18/41] powerpc/prom_init: Fix build failure with GCC_PLUGIN_STRUCTLEAK_BYREF_ALL and KASAN Sasha Levin
2022-06-28 2:20 ` Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 19/41] spi: rockchip: Unmask IRQ at the final to avoid preemption Sasha Levin
2022-06-28 2:20 ` Sasha Levin
2022-06-28 2:20 ` Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 20/41] video: fbdev: skeletonfb: Fix syntax errors in comments Sasha Levin
2022-06-28 2:20 ` Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 21/41] video: fbdev: intelfb: Use aperture size from pci_resource_len Sasha Levin
2022-06-28 2:20 ` Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 22/41] video: fbdev: pxa3xx-gcu: Fix integer overflow in pxa3xx_gcu_write Sasha Levin
2022-06-28 2:20 ` Sasha Levin
2022-09-19 8:21 ` Vitaly Chikunov
2022-09-19 22:24 ` Sasha Levin
2022-09-21 5:10 ` Vitaly Chikunov
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 23/41] video: fbdev: simplefb: Check before clk_put() not needed Sasha Levin
2022-06-28 2:20 ` Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 24/41] btrfs: add missing inode updates on each iteration when replacing extents Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 25/41] btrfs: do not BUG_ON() on failure to migrate space " Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 26/41] io_uring: fix merge error in checking send/recv addr2 flags Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 27/41] arch: mips: generic: Add missing of_node_put() in board-ranchu.c Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 28/41] mips: mti-malta: Fix refcount leak in malta-time.c Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 29/41] mips: ralink: Fix refcount leak in of.c Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 30/41] mips: lantiq: falcon: Fix refcount leak bug in sysctrl Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 31/41] mips: lantiq: xway: " Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 32/41] mips/pic32/pic32mzda: Fix refcount leak bugs Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 33/41] mips: dts: ingenic: Add TCU clock to x1000/x1830 tcu device node Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 34/41] mips: lantiq: Add missing of_node_put() in irq.c Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 35/41] drm/sun4i: Add DMA mask and segment size Sasha Levin
2022-06-28 2:20 ` Sasha Levin
2022-06-28 2:20 ` Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 36/41] drm/sun4i: Return if frontend is not present Sasha Levin
2022-06-28 2:20 ` Sasha Levin
2022-06-28 2:20 ` Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 37/41] hinic: Replace memcpy() with direct assignment Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 38/41] drm/amdgpu: Adjust logic around GTT size (v3) Sasha Levin
2022-06-28 2:20 ` Sasha Levin
2022-06-28 2:20 ` Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 39/41] nvme: add a bogus subsystem NQN quirk for Micron MTFDKBA2T0TFH Sasha Levin
2022-06-28 2:20 ` [PATCH AUTOSEL 5.15 40/41] gpio: grgpio: Fix device removing Sasha Levin
2022-06-28 2:21 ` [PATCH AUTOSEL 5.15 41/41] arm: mach-spear: Add missing of_node_put() in time.c Sasha Levin
2022-06-28 2:21 ` Sasha Levin
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=20220628022100.595243-13-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=avri.altman@wdc.com \
--cc=beanhuo@micron.com \
--cc=bvanassche@acm.org \
--cc=daejun7.park@samsung.com \
--cc=jejb@linux.ibm.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=matthias.bgg@gmail.com \
--cc=stable@vger.kernel.org \
--cc=stanley.chu@mediatek.com \
/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.