linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 0/3] fix runtime PM for SD card readers
@ 2021-06-28 13:34 Martin Kepplinger
  2021-06-28 13:34 ` [PATCH v4 1/3] scsi: devinfo: add new flag BLIST_MEDIA_CHANGE Martin Kepplinger
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Martin Kepplinger @ 2021-06-28 13:34 UTC (permalink / raw)
  To: martin.kepplinger
  Cc: bvanassche, jejb, linux-kernel, linux-pm, linux-scsi,
	martin.petersen, stern

hi,

(According to Alan Stern, "as far as I know, all") SD card readers send
MEDIA_CHANGED unit attention notification on (runtime) resume. We cannot
use runtime PM with these devices as I/O always fails in that case.

This fixes runtime PM for SD cardreaders. I'd appreciate any feedback.

To enable runtime PM for an SD cardreader number 0:0:0:0, do:
    
echo 0 > /sys/module/block/parameters/events_dfl_poll_msecs
echo 1000 > /sys/bus/scsi/devices/0:0:0:0/power/autosuspend_delay_ms
echo auto > /sys/bus/scsi/devices/0:0:0:0/power/control

thank you,
                           martin

revision history
----------------
v4: (thank you Bart and Alan)
* send SENSE REQUEST in sd instead of adding a global scsi error flag.

v3: (thank you Bart)
 * create a new BLIST entry to mark affected devices instead of the
   sysfs module parameter for sd only. still, only sd implements handling
   the flag for now.
 * cc linux-pm list
https://lore.kernel.org/linux-scsi/20210328102531.1114535-1-martin.kepplinger@puri.sm/

v2:
https://lore.kernel.org/linux-scsi/20210112093329.3639-1-martin.kepplinger@puri.sm/
 * move module parameter to sd
 * add Documentation
v1:
https://lore.kernel.org/linux-scsi/20210111152029.28426-1-martin.kepplinger@puri.sm/T/
For the full background, the discussion started in June 2020 here:
https://lore.kernel.org/linux-scsi/20200623111018.31954-1-martin.kepplinger@puri.sm/


Martin Kepplinger (3):
  scsi: devinfo: add new flag BLIST_MEDIA_CHANGE
  scsi: sd: send REQUEST SENSE for BLIST_MEDIA_CHANGE devices in
    runtime_resume()
  scsi: devinfo: add BLIST_MEDIA_CHANGE for Ultra HS-SD/MMC usb
    cardreaders

 drivers/scsi/scsi_devinfo.c |  1 +
 drivers/scsi/sd.c           | 37 ++++++++++++++++++++++++++++++++++++-
 include/scsi/scsi_devinfo.h |  6 +++---
 3 files changed, 40 insertions(+), 4 deletions(-)

-- 
2.30.2


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v4 1/3] scsi: devinfo: add new flag BLIST_MEDIA_CHANGE
  2021-06-28 13:34 [PATCH v4 0/3] fix runtime PM for SD card readers Martin Kepplinger
@ 2021-06-28 13:34 ` Martin Kepplinger
  2021-06-30  4:20   ` Bart Van Assche
  2021-06-28 13:34 ` [PATCH v4 2/3] scsi: sd: send REQUEST SENSE for BLIST_MEDIA_CHANGE devices in runtime_resume() Martin Kepplinger
  2021-06-28 13:34 ` [PATCH v4 3/3] scsi: devinfo: add BLIST_MEDIA_CHANGE for Ultra HS-SD/MMC usb cardreaders Martin Kepplinger
  2 siblings, 1 reply; 7+ messages in thread
From: Martin Kepplinger @ 2021-06-28 13:34 UTC (permalink / raw)
  To: martin.kepplinger
  Cc: bvanassche, jejb, linux-kernel, linux-pm, linux-scsi,
	martin.petersen, stern

add a new flag for devices that issue MEDIA CHANGE unit attentions
when actually no medium changed. Drivers can then act accordingly in
case they need to work around it, i.e. in resume().

Signed-off-by: Martin Kepplinger <martin.kepplinger@puri.sm>
---
 include/scsi/scsi_devinfo.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/include/scsi/scsi_devinfo.h b/include/scsi/scsi_devinfo.h
index 3fdb322d4c4b..766fa876598e 100644
--- a/include/scsi/scsi_devinfo.h
+++ b/include/scsi/scsi_devinfo.h
@@ -28,7 +28,8 @@
 #define BLIST_LARGELUN		((__force blist_flags_t)(1ULL << 9))
 /* override additional length field */
 #define BLIST_INQUIRY_36	((__force blist_flags_t)(1ULL << 10))
-#define __BLIST_UNUSED_11	((__force blist_flags_t)(1ULL << 11))
+/* ignore one MEDIA CHANGE unit attention after resuming from runtime suspend */
+#define BLIST_MEDIA_CHANGE	((__force blist_flags_t)(1ULL << 11))
 /* do not do automatic start on add */
 #define BLIST_NOSTARTONADD	((__force blist_flags_t)(1ULL << 12))
 #define __BLIST_UNUSED_13	((__force blist_flags_t)(1ULL << 13))
@@ -73,8 +74,7 @@
 #define __BLIST_HIGH_UNUSED (~(__BLIST_LAST_USED | \
 			       (__force blist_flags_t) \
 			       ((__force __u64)__BLIST_LAST_USED - 1ULL)))
-#define __BLIST_UNUSED_MASK (__BLIST_UNUSED_11 | \
-			     __BLIST_UNUSED_13 | \
+#define __BLIST_UNUSED_MASK (__BLIST_UNUSED_13 | \
 			     __BLIST_UNUSED_14 | \
 			     __BLIST_UNUSED_15 | \
 			     __BLIST_UNUSED_16 | \
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v4 2/3] scsi: sd: send REQUEST SENSE for BLIST_MEDIA_CHANGE devices in runtime_resume()
  2021-06-28 13:34 [PATCH v4 0/3] fix runtime PM for SD card readers Martin Kepplinger
  2021-06-28 13:34 ` [PATCH v4 1/3] scsi: devinfo: add new flag BLIST_MEDIA_CHANGE Martin Kepplinger
@ 2021-06-28 13:34 ` Martin Kepplinger
  2021-06-30  4:18   ` Bart Van Assche
  2021-06-28 13:34 ` [PATCH v4 3/3] scsi: devinfo: add BLIST_MEDIA_CHANGE for Ultra HS-SD/MMC usb cardreaders Martin Kepplinger
  2 siblings, 1 reply; 7+ messages in thread
From: Martin Kepplinger @ 2021-06-28 13:34 UTC (permalink / raw)
  To: martin.kepplinger
  Cc: bvanassche, jejb, linux-kernel, linux-pm, linux-scsi,
	martin.petersen, stern

For SD cardreader devices that have the BLIST_MEDIA_CHANGE flag set,
a MEDIA CHANGE unit attention is received after resuming from runtime
suspend. Send REQUEST SENSE to avoid that.

The "downside" is that for these devices we now rely on users not to
really change the medium (SD card) *during* a runtime suspend/resume
cycle, i.e. when not unmounting.

To enable runtime PM for an SD cardreader (device number 0:0:0:0), do:

echo 0 > /sys/module/block/parameters/events_dfl_poll_msecs
echo 1000 > /sys/bus/scsi/devices/0:0:0:0/power/autosuspend_delay_ms
echo auto > /sys/bus/scsi/devices/0:0:0:0/power/control

Signed-off-by: Martin Kepplinger <martin.kepplinger@puri.sm>
---
 drivers/scsi/sd.c | 37 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 6d2d63629a90..0acc732f1933 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -63,6 +63,7 @@
 #include <scsi/scsi_cmnd.h>
 #include <scsi/scsi_dbg.h>
 #include <scsi/scsi_device.h>
+#include <scsi/scsi_devinfo.h>
 #include <scsi/scsi_driver.h>
 #include <scsi/scsi_eh.h>
 #include <scsi/scsi_host.h>
@@ -114,6 +115,7 @@ static void sd_shutdown(struct device *);
 static int sd_suspend_system(struct device *);
 static int sd_suspend_runtime(struct device *);
 static int sd_resume(struct device *);
+static int sd_resume_runtime(struct device *);
 static void sd_rescan(struct device *);
 static blk_status_t sd_init_command(struct scsi_cmnd *SCpnt);
 static void sd_uninit_command(struct scsi_cmnd *SCpnt);
@@ -608,7 +610,7 @@ static const struct dev_pm_ops sd_pm_ops = {
 	.poweroff		= sd_suspend_system,
 	.restore		= sd_resume,
 	.runtime_suspend	= sd_suspend_runtime,
-	.runtime_resume		= sd_resume,
+	.runtime_resume		= sd_resume_runtime,
 };
 
 static struct scsi_driver sd_template = {
@@ -3720,6 +3722,39 @@ static int sd_resume(struct device *dev)
 	return ret;
 }
 
+static int sd_resume_runtime(struct device *dev)
+{
+	struct scsi_disk *sdkp = dev_get_drvdata(dev);
+	struct scsi_device *sdp;
+	int timeout, retries, res;
+	struct scsi_sense_hdr my_sshdr;
+
+	if (!sdkp)	/* E.g.: runtime resume at the start of sd_probe() */
+		return 0;
+
+	sdp = sdkp->device;
+	timeout = sdp->request_queue->rq_timeout * SD_FLUSH_TIMEOUT_MULTIPLIER;
+
+	if (sdp->sdev_bflags & BLIST_MEDIA_CHANGE) {
+		for (retries = 3; retries > 0; --retries) {
+			unsigned char cmd[10] = { 0 };
+
+			cmd[0] = REQUEST_SENSE;
+			/*
+			 * Leave the rest of the command zero to indicate
+			 * flush everything.
+			 */
+			res = scsi_execute(sdp, cmd, DMA_NONE, NULL, 0, NULL,
+					   &my_sshdr, timeout,
+					   sdkp->max_retries, 0, RQF_PM, NULL);
+			if (res == 0)
+				break;
+		}
+	}
+
+	return sd_resume(dev);
+}
+
 /**
  *	init_sd - entry point for this driver (both when built in or when
  *	a module).
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v4 3/3] scsi: devinfo: add BLIST_MEDIA_CHANGE for Ultra HS-SD/MMC usb cardreaders
  2021-06-28 13:34 [PATCH v4 0/3] fix runtime PM for SD card readers Martin Kepplinger
  2021-06-28 13:34 ` [PATCH v4 1/3] scsi: devinfo: add new flag BLIST_MEDIA_CHANGE Martin Kepplinger
  2021-06-28 13:34 ` [PATCH v4 2/3] scsi: sd: send REQUEST SENSE for BLIST_MEDIA_CHANGE devices in runtime_resume() Martin Kepplinger
@ 2021-06-28 13:34 ` Martin Kepplinger
  2021-06-30  4:20   ` Bart Van Assche
  2 siblings, 1 reply; 7+ messages in thread
From: Martin Kepplinger @ 2021-06-28 13:34 UTC (permalink / raw)
  To: martin.kepplinger
  Cc: bvanassche, jejb, linux-kernel, linux-pm, linux-scsi,
	martin.petersen, stern

These cardreader device issues a MEDIA CHANGE unit attention not only
when actually a medium changed but also simply when resuming from suspend.

Setting the BLIST_MEDIA_CHANGE flag enables using runtime pm for SD cardreaders.

Signed-off-by: Martin Kepplinger <martin.kepplinger@puri.sm>
---
 drivers/scsi/scsi_devinfo.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c
index d33355ab6e14..8ac0a11ac541 100644
--- a/drivers/scsi/scsi_devinfo.c
+++ b/drivers/scsi/scsi_devinfo.c
@@ -171,6 +171,7 @@ static struct {
 	{"FUJITSU", "ETERNUS_DXM", "*", BLIST_RETRY_ASC_C1},
 	{"Generic", "USB SD Reader", "1.00", BLIST_FORCELUN | BLIST_INQUIRY_36},
 	{"Generic", "USB Storage-SMC", NULL, BLIST_FORCELUN | BLIST_INQUIRY_36}, /* FW: 0180 and 0207 */
+	{"Generic", "Ultra HS-SD/MMC", "2.09", BLIST_MEDIA_CHANGE | BLIST_INQUIRY_36},
 	{"HITACHI", "DF400", "*", BLIST_REPORTLUN2},
 	{"HITACHI", "DF500", "*", BLIST_REPORTLUN2},
 	{"HITACHI", "DISK-SUBSYSTEM", "*", BLIST_REPORTLUN2},
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 2/3] scsi: sd: send REQUEST SENSE for BLIST_MEDIA_CHANGE devices in runtime_resume()
  2021-06-28 13:34 ` [PATCH v4 2/3] scsi: sd: send REQUEST SENSE for BLIST_MEDIA_CHANGE devices in runtime_resume() Martin Kepplinger
@ 2021-06-30  4:18   ` Bart Van Assche
  0 siblings, 0 replies; 7+ messages in thread
From: Bart Van Assche @ 2021-06-30  4:18 UTC (permalink / raw)
  To: Martin Kepplinger
  Cc: jejb, linux-kernel, linux-pm, linux-scsi, martin.petersen, stern

On 6/28/21 6:34 AM, Martin Kepplinger wrote:
> +static int sd_resume_runtime(struct device *dev)
> +{
> +	struct scsi_disk *sdkp = dev_get_drvdata(dev);
> +	struct scsi_device *sdp;
> +	int timeout, retries, res;
> +	struct scsi_sense_hdr my_sshdr;

Since the sense data is ignored, consider removing the "my_sshdr"
declaration and passing NULL as sense pointer to scsi_execute().

> +	if (!sdkp)	/* E.g.: runtime resume at the start of sd_probe() */
> +		return 0;

Are you sure that this code is necessary? There is an
scsi_autopm_get_device(sdp) call at the start of sd_probe() and
scsi_autopm_put_device(sdp) call at the end of sd_probe(). In other
words, no runtime suspend will happen between the
device_initialize(&sdkp->dev) call in sd_probe() and the
dev_set_drvdata(dev, sdkp) call in the same function.

> +	if (sdp->sdev_bflags & BLIST_MEDIA_CHANGE) {
> +		for (retries = 3; retries > 0; --retries) {
> +			unsigned char cmd[10] = { 0 };
> +
> +			cmd[0] = REQUEST_SENSE;

Please define the CDB as follows:

	static const u8 cmd[10] = { REQUEST_SENSE };

> +			/*
> +			 * Leave the rest of the command zero to indicate
> +			 * flush everything.
> +			 */

Shouldn't this comment appear above the CDB definition? Also, what does
"flush everything" mean? According to SPC sense data is discarded from
the device while processing REQUEST SENSE, no matter what the value of
the ALLOCATION LENGTH parameter in that command is. From SPC-6: "the
REQUEST SENSE command with any allocation length clears the sense data."

> +			res = scsi_execute(sdp, cmd, DMA_NONE, NULL, 0, NULL,
> +					   &my_sshdr, timeout,
> +					   sdkp->max_retries, 0, RQF_PM, NULL);

Only one level of retries please. Can sdkp->max_retries be changed into 1?

Thanks,

Bart.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 3/3] scsi: devinfo: add BLIST_MEDIA_CHANGE for Ultra HS-SD/MMC usb cardreaders
  2021-06-28 13:34 ` [PATCH v4 3/3] scsi: devinfo: add BLIST_MEDIA_CHANGE for Ultra HS-SD/MMC usb cardreaders Martin Kepplinger
@ 2021-06-30  4:20   ` Bart Van Assche
  0 siblings, 0 replies; 7+ messages in thread
From: Bart Van Assche @ 2021-06-30  4:20 UTC (permalink / raw)
  To: Martin Kepplinger
  Cc: jejb, linux-kernel, linux-pm, linux-scsi, martin.petersen, stern

On 6/28/21 6:34 AM, Martin Kepplinger wrote:
> These cardreader device issues a MEDIA CHANGE unit attention not only
> when actually a medium changed but also simply when resuming from suspend.
> 
> Setting the BLIST_MEDIA_CHANGE flag enables using runtime pm for SD cardreaders.

"device issues" -> "devices issue"? Anyway:

Reviewed-by: Bart Van Assche <bvanassche@acm.org>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 1/3] scsi: devinfo: add new flag BLIST_MEDIA_CHANGE
  2021-06-28 13:34 ` [PATCH v4 1/3] scsi: devinfo: add new flag BLIST_MEDIA_CHANGE Martin Kepplinger
@ 2021-06-30  4:20   ` Bart Van Assche
  0 siblings, 0 replies; 7+ messages in thread
From: Bart Van Assche @ 2021-06-30  4:20 UTC (permalink / raw)
  To: Martin Kepplinger
  Cc: jejb, linux-kernel, linux-pm, linux-scsi, martin.petersen, stern

On 6/28/21 6:34 AM, Martin Kepplinger wrote:
> add a new flag for devices that issue MEDIA CHANGE unit attentions
> when actually no medium changed. Drivers can then act accordingly in
> case they need to work around it, i.e. in resume().

Reviewed-by: Bart Van Assche <bvanassche@acm.org>

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-06-30  4:20 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-28 13:34 [PATCH v4 0/3] fix runtime PM for SD card readers Martin Kepplinger
2021-06-28 13:34 ` [PATCH v4 1/3] scsi: devinfo: add new flag BLIST_MEDIA_CHANGE Martin Kepplinger
2021-06-30  4:20   ` Bart Van Assche
2021-06-28 13:34 ` [PATCH v4 2/3] scsi: sd: send REQUEST SENSE for BLIST_MEDIA_CHANGE devices in runtime_resume() Martin Kepplinger
2021-06-30  4:18   ` Bart Van Assche
2021-06-28 13:34 ` [PATCH v4 3/3] scsi: devinfo: add BLIST_MEDIA_CHANGE for Ultra HS-SD/MMC usb cardreaders Martin Kepplinger
2021-06-30  4:20   ` Bart Van Assche

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).