* [PATCH] scsi: ufs: core: Clear power-on UNIT ATTENTION on BIWIN devices
@ 2026-10-28 12:54 Alexey Charkov
2026-10-28 18:40 ` Bart Van Assche
0 siblings, 1 reply; 3+ messages in thread
From: Alexey Charkov @ 2026-10-28 12:54 UTC (permalink / raw)
To: Alim Akhtar, Bart Van Assche, Bean Huo, Stanley Jhu,
James E.J. Bottomley, Martin K. Petersen
Cc: linux-scsi, linux-kernel, Alexey Charkov
With the link off across suspend (UFS_PM_LVL_5), resume resets the device,
which leaves a power-on UNIT ATTENTION pending on every logical unit. The
SCSI core retries the command that receives it and relies on the device to
clear the condition once reported.
The BIWIN BWU2A0526B128G and BWU2A0516B064G do not clear it when reporting
it to a WRITE. Writes queued across a system suspend then fail on every
retry for the full 180s retry window, until the SCSI error handler's
TEST UNIT READY clears it, and end in I/O errors. A single TEST UNIT READY
or READ clears it. This seems to be limited to the particular BIWIN device
family (with 128GB and 64GB variants exhibiting this behavior), as Samsung
and FORESEE ones I have tested clear it on WRITE as they should.
Add a device quirk that sends a TEST UNIT READY to each logical unit at
the end of ufshcd_host_reset_and_restore(), and enable it for BIWIN
models starting with BWU2A05. That function follows every device reset:
on resume from link off, system or runtime, and in the UFS error
handler, which also carries out the SCSI error handler's host resets.
Signed-off-by: Alexey Charkov <alchark@flipper.net>
---
drivers/ufs/core/ufshcd.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++
include/ufs/ufs_quirks.h | 9 ++++++++
include/ufs/ufshcd.h | 1 +
3 files changed, 64 insertions(+)
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index ee643830a57a..d52275a813fd 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -321,6 +321,9 @@ static const struct ufs_dev_quirk ufs_fixups[] = {
{ .wmanufacturerid = UFS_VENDOR_TOSHIBA,
.model = "THGJFJT1E45BATP",
.quirk = UFS_DEVICE_QUIRK_NO_TIMESTAMP_SUPPORT },
+ { .wmanufacturerid = UFS_VENDOR_BIWIN,
+ .model = "BWU2A05",
+ .quirk = UFS_DEVICE_QUIRK_TUR_TO_CLEAR_UA },
{}
};
@@ -8265,6 +8268,55 @@ static void ufshcd_process_probe_result(struct ufs_hba *hba,
hba->curr_dev_pwr_mode, hba->uic_link_state);
}
+/**
+ * ufshcd_clear_unit_attention - clear the power-on UNIT ATTENTION of each LU
+ * @hba: per adapter instance
+ *
+ * Send a TEST UNIT READY to each logical unit to clear the power-on UNIT
+ * ATTENTION left by a device reset, for devices that keep reporting it to
+ * WRITE commands instead. Receiving the UNIT ATTENTION is what clears it, so
+ * only transport failures matter.
+ *
+ * Use the device management slot rather than the logical units' request
+ * queues: those are blocked during error handling, and during a runtime
+ * resume of the device W-LU its runtime suspended consumers cannot take
+ * requests until it has resumed.
+ */
+static void ufshcd_clear_unit_attention(struct ufs_hba *hba)
+{
+ struct utp_upiu_req req_upiu, rsp_upiu;
+ struct scsi_device *sdev;
+ int err;
+
+ shost_for_each_device(sdev, hba->host) {
+ if (scsi_is_wlun(sdev->lun))
+ continue;
+
+ req_upiu = (struct utp_upiu_req){
+ .header = {
+ .transaction_code = UPIU_TRANSACTION_COMMAND,
+ .lun = ufshcd_scsi_to_upiu_lun(sdev->lun),
+ .command_set_type = UPIU_COMMAND_SET_TYPE_SCSI,
+ },
+ .sc.cdb[0] = TEST_UNIT_READY,
+ };
+
+ ufshcd_dev_man_lock(hba);
+ err = ufshcd_issue_devman_upiu_cmd(hba, &req_upiu, &rsp_upiu,
+ NULL, NULL,
+ DEV_CMD_TYPE_SCSI,
+ UPIU_QUERY_OPCODE_NOP);
+ ufshcd_dev_man_unlock(hba);
+ if (err) {
+ dev_warn(hba->dev,
+ "TEST UNIT READY to LUN %llu failed: %d\n",
+ sdev->lun, err);
+ scsi_device_put(sdev);
+ break;
+ }
+ }
+}
+
/**
* ufshcd_host_reset_and_restore - reset and restore host controller
* @hba: per-adapter instance
@@ -8306,6 +8358,8 @@ static int ufshcd_host_reset_and_restore(struct ufs_hba *hba)
if (err)
dev_err(hba->dev, "%s: Host init failed %d\n", __func__, err);
+ else if (hba->dev_quirks & UFS_DEVICE_QUIRK_TUR_TO_CLEAR_UA)
+ ufshcd_clear_unit_attention(hba);
ufshcd_update_evt_hist(hba, UFS_EVT_HOST_RESET, (u32)err);
return err;
}
diff --git a/include/ufs/ufs_quirks.h b/include/ufs/ufs_quirks.h
index e9c59ec1ceae..74d4ca3badb7 100644
--- a/include/ufs/ufs_quirks.h
+++ b/include/ufs/ufs_quirks.h
@@ -17,6 +17,7 @@
#define UFS_VENDOR_SKHYNIX 0x1AD
#define UFS_VENDOR_TOSHIBA 0x198
#define UFS_VENDOR_WDC 0x145
+#define UFS_VENDOR_BIWIN 0xDAB
/**
* ufs_dev_quirk - ufs device quirk info
@@ -109,4 +110,12 @@ struct ufs_dev_quirk {
/* Some UFS 4 devices do not support the qTimestamp attribute */
#define UFS_DEVICE_QUIRK_NO_TIMESTAMP_SUPPORT (1 << 13)
+/*
+ * Some UFS devices do not clear the power-on UNIT ATTENTION condition when
+ * reporting it to a WRITE command, so writes keep failing with it. A TEST
+ * UNIT READY clears it. Enable this quirk to send one to each logical unit
+ * after every host reset and restore, which follows each device reset.
+ */
+#define UFS_DEVICE_QUIRK_TUR_TO_CLEAR_UA (1 << 14)
+
#endif /* UFS_QUIRKS_H_ */
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index be62165b785e..6140798ed128 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -37,6 +37,7 @@ enum dev_cmd_type {
DEV_CMD_TYPE_NOP = 0x0,
DEV_CMD_TYPE_QUERY = 0x1,
DEV_CMD_TYPE_RPMB = 0x2,
+ DEV_CMD_TYPE_SCSI = 0x3,
};
enum ufs_event_type {
---
base-commit: 151a134a4e6ec66f69db8750c66006f5207f7a9d
change-id: 20261028-biwin-tua-quirk-4f543fc96116
Best regards,
--
Alexey Charkov <alchark@flipper.net>
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] scsi: ufs: core: Clear power-on UNIT ATTENTION on BIWIN devices
2026-10-28 12:54 [PATCH] scsi: ufs: core: Clear power-on UNIT ATTENTION on BIWIN devices Alexey Charkov
@ 2026-10-28 18:40 ` Bart Van Assche
2026-10-29 8:46 ` Alexey Charkov
0 siblings, 1 reply; 3+ messages in thread
From: Bart Van Assche @ 2026-10-28 18:40 UTC (permalink / raw)
To: Alexey Charkov, Alim Akhtar, Bean Huo, Stanley Jhu,
James E.J. Bottomley, Martin K. Petersen
Cc: linux-scsi, linux-kernel
On 10/28/26 5:54 AM, Alexey Charkov wrote:
> drivers/ufs/core/ufshcd.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++
> include/ufs/ufs_quirks.h | 9 ++++++++
> include/ufs/ufshcd.h | 1 +
The quirk has been implemented in the wrong layer. The right layer to
implement this type of quirk is the SCSI disk driver (sd.c).
Bart.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] scsi: ufs: core: Clear power-on UNIT ATTENTION on BIWIN devices
2026-10-28 18:40 ` Bart Van Assche
@ 2026-10-29 8:46 ` Alexey Charkov
0 siblings, 0 replies; 3+ messages in thread
From: Alexey Charkov @ 2026-10-29 8:46 UTC (permalink / raw)
To: Bart Van Assche
Cc: Alim Akhtar, Bean Huo, Stanley Jhu, James E.J. Bottomley,
Martin K. Petersen, linux-scsi, linux-kernel
On Wed, Oct 28, 2026 at 10:40 PM Bart Van Assche <bvanassche@acm.org> wrote:
>
> On 10/28/26 5:54 AM, Alexey Charkov wrote:
> > drivers/ufs/core/ufshcd.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++
> > include/ufs/ufs_quirks.h | 9 ++++++++
> > include/ufs/ufshcd.h | 1 +
>
> The quirk has been implemented in the wrong layer. The right layer to
> implement this type of quirk is the SCSI disk driver (sd.c).
Thanks, Bart. I'll see how to redo it at that layer and send a v2.
Best regards,
Alexey
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-10-29 8:46 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-28 12:54 [PATCH] scsi: ufs: core: Clear power-on UNIT ATTENTION on BIWIN devices Alexey Charkov
2026-10-28 18:40 ` Bart Van Assche
2026-10-29 8:46 ` Alexey Charkov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®