Re: [PATCH v2 1/2] scsi: scsi_lib: add spinup_notify callback for ASC/ASCQ=0x04/0x11
From: John Garry
Date: Mon Jul 20 2026 - 05:50:16 EST
On 03/07/2026 03:28, Xingui Yang wrote:
+
When a SCSI device returns NOT_READY with ASC/ASCQ = 0x04/0x11
("notify (enable spinup) required"), the device is in Active_Wait or
Idle_Wait power state and will not respond to standard START_STOP
spinup commands.
Add an optional spinup_notify callback to struct scsi_host_template.
When ASCQ=0x11 is detected in the mid-layer, invoke this callback
before ACTION_DELAYED_RETRY, allowing LLDDs to perform controller-
specific spinup notification.
Example log:
[Tue Jun 23 08:34:44 2026] sd 4:0:9:0: [sde] Spinning up disk...
[Tue Jun 23 08:36:22 2026] ...not responding...
[Tue Jun 23 08:36:24 2026] sd 4:0:9:0: [sde] Sense Key : Not Ready
[Tue Jun 23 08:36:24 2026] sd 4:0:9:0: [sde] Add. Sense: Logical unit
not ready, notify (enable spinup) required
Signed-off-by: Xingui Yang <yangxingui@xxxxxxxxxx>
---
drivers/scsi/scsi_lib.c | 4 ++++
include/scsi/scsi_host.h | 12 ++++++++++++
2 files changed, 16 insertions(+)
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index b67f0dc79499..33c4339ca8c5 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -905,6 +905,10 @@ static void scsi_io_completion_action(struct scsi_cmnd *cmd, int result)
case 0x1a: /* start stop unit in progress */
case 0x1b: /* sanitize in progress */
case 0x1d: /* configuration in progress */
+ if (sshdr.ascq == 0x11 &&
+ cmd->device->host->hostt->spinup_notify)
+ cmd->device->host->hostt->spinup_notify(
+ cmd->device);
action = ACTION_DELAYED_RETRY;
break;
case 0x0a: /* ALUA state transition */
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h
index 7e2011830ba4..22bf2d3d9b36 100644
--- a/include/scsi/scsi_host.h
+++ b/include/scsi/scsi_host.h
@@ -374,6 +374,18 @@ struct scsi_host_template {
#define SCSI_ADAPTER_RESET 1
#define SCSI_FIRMWARE_RESET 2
+ /*
+ * Optional callback invoked when a device returns NOT_READY with
+ * ASC/ASCQ = 0x04/0x11 ("notify (enable spinup) required").
+ * This allows LLDDs to perform controller-specific spinup
+ * notification before the mid-layer retries.
+ *
+ * Context: Called from softirq (block layer completion) context.
+ * Implementations must not sleep or schedule.
+ *
+ * Status: OPTIONAL
+ */
+ void (*spinup_notify)(struct scsi_device *sdev);
I am not sure that adding a sht callback for a protocol issue is the best thing for this.
I'll check for other methods which could be used. Hannes, any suggestion?
/*
* Name of proc directory