linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v6 0/3] fix runtime PM for SD card readers
@ 2021-07-04  7:54 Martin Kepplinger
  2021-07-04  7:54 ` [PATCH v6 1/3] scsi: devinfo: add new flag BLIST_MEDIA_CHANGE Martin Kepplinger
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Martin Kepplinger @ 2021-07-04  7:54 UTC (permalink / raw)
  To: martin.kepplinger, bvanassche
  Cc: hch, jejb, kernel, 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
----------------
v6: (thank you Bart and Christoph)
* fix scsi command timeout for sense request
* add reviewed-by tag

v5: (thank you Bart)
* simplify the sense request itself and remove unnecessary code
https://lore.kernel.org/linux-scsi/20210630084453.186764-1-martin.kepplinger@puri.sm/T/#t

v4: (thank you Bart and Alan)
* send SENSE REQUEST in sd instead of adding a global scsi error flag.
https://lore.kernel.org/linux-scsi/20210628133412.1172068-1-martin.kepplinger@puri.sm/T/#t

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           | 23 ++++++++++++++++++++++-
 include/scsi/scsi_devinfo.h |  6 +++---
 3 files changed, 26 insertions(+), 4 deletions(-)

-- 
2.30.2


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

* [PATCH v6 1/3] scsi: devinfo: add new flag BLIST_MEDIA_CHANGE
  2021-07-04  7:54 [PATCH v6 0/3] fix runtime PM for SD card readers Martin Kepplinger
@ 2021-07-04  7:54 ` Martin Kepplinger
  2021-07-04  7:54 ` [PATCH v6 2/3] scsi: sd: send REQUEST SENSE for BLIST_MEDIA_CHANGE devices in runtime_resume() Martin Kepplinger
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Martin Kepplinger @ 2021-07-04  7:54 UTC (permalink / raw)
  To: martin.kepplinger, bvanassche
  Cc: hch, jejb, kernel, 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>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
---
 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	[flat|nested] 6+ messages in thread

* [PATCH v6 2/3] scsi: sd: send REQUEST SENSE for BLIST_MEDIA_CHANGE devices in runtime_resume()
  2021-07-04  7:54 [PATCH v6 0/3] fix runtime PM for SD card readers Martin Kepplinger
  2021-07-04  7:54 ` [PATCH v6 1/3] scsi: devinfo: add new flag BLIST_MEDIA_CHANGE Martin Kepplinger
@ 2021-07-04  7:54 ` Martin Kepplinger
  2021-07-04  7:54 ` [PATCH v6 3/3] scsi: devinfo: add BLIST_MEDIA_CHANGE for Ultra HS-SD/MMC usb cardreaders Martin Kepplinger
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Martin Kepplinger @ 2021-07-04  7:54 UTC (permalink / raw)
  To: martin.kepplinger, bvanassche
  Cc: hch, jejb, kernel, 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 a 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>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/scsi/sd.c | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 6d2d63629a90..34554224b89a 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,25 @@ 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 = sdkp->device;
+
+	if (sdp->sdev_bflags & BLIST_MEDIA_CHANGE) {
+		/* clear the devices' sense data */
+		static const u8 cmd[10] = { REQUEST_SENSE };
+
+		if (scsi_execute(sdp, cmd, DMA_NONE, NULL, 0, NULL,
+				 NULL, sdp->request_queue->rq_timeout, 1, 0,
+				 RQF_PM, NULL))
+			sd_printk(KERN_NOTICE, sdkp,
+				  "Failed to clear sense data\n");
+	}
+
+	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	[flat|nested] 6+ messages in thread

* [PATCH v6 3/3] scsi: devinfo: add BLIST_MEDIA_CHANGE for Ultra HS-SD/MMC usb cardreaders
  2021-07-04  7:54 [PATCH v6 0/3] fix runtime PM for SD card readers Martin Kepplinger
  2021-07-04  7:54 ` [PATCH v6 1/3] scsi: devinfo: add new flag BLIST_MEDIA_CHANGE Martin Kepplinger
  2021-07-04  7:54 ` [PATCH v6 2/3] scsi: sd: send REQUEST SENSE for BLIST_MEDIA_CHANGE devices in runtime_resume() Martin Kepplinger
@ 2021-07-04  7:54 ` Martin Kepplinger
  2021-07-22  3:59 ` [PATCH v6 0/3] fix runtime PM for SD card readers Martin K. Petersen
  2021-07-27  4:14 ` Martin K. Petersen
  4 siblings, 0 replies; 6+ messages in thread
From: Martin Kepplinger @ 2021-07-04  7:54 UTC (permalink / raw)
  To: martin.kepplinger, bvanassche
  Cc: hch, jejb, kernel, linux-kernel, linux-pm, linux-scsi,
	martin.petersen, stern

These cardreader devices issue 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>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
---
 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	[flat|nested] 6+ messages in thread

* Re: [PATCH v6 0/3] fix runtime PM for SD card readers
  2021-07-04  7:54 [PATCH v6 0/3] fix runtime PM for SD card readers Martin Kepplinger
                   ` (2 preceding siblings ...)
  2021-07-04  7:54 ` [PATCH v6 3/3] scsi: devinfo: add BLIST_MEDIA_CHANGE for Ultra HS-SD/MMC usb cardreaders Martin Kepplinger
@ 2021-07-22  3:59 ` Martin K. Petersen
  2021-07-27  4:14 ` Martin K. Petersen
  4 siblings, 0 replies; 6+ messages in thread
From: Martin K. Petersen @ 2021-07-22  3:59 UTC (permalink / raw)
  To: Martin Kepplinger
  Cc: bvanassche, hch, jejb, kernel, linux-kernel, linux-pm,
	linux-scsi, martin.petersen, stern


Martin,

> (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.

Made a few changes (added "ignore" to clarify what the flag does and
twiddled how the workaround is triggered in sd.c). Applied to
5.15/scsi-staging, thanks!

-- 
Martin K. Petersen	Oracle Linux Engineering

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

* Re: [PATCH v6 0/3] fix runtime PM for SD card readers
  2021-07-04  7:54 [PATCH v6 0/3] fix runtime PM for SD card readers Martin Kepplinger
                   ` (3 preceding siblings ...)
  2021-07-22  3:59 ` [PATCH v6 0/3] fix runtime PM for SD card readers Martin K. Petersen
@ 2021-07-27  4:14 ` Martin K. Petersen
  4 siblings, 0 replies; 6+ messages in thread
From: Martin K. Petersen @ 2021-07-27  4:14 UTC (permalink / raw)
  To: bvanassche, Martin Kepplinger
  Cc: Martin K . Petersen, linux-kernel, linux-scsi, stern, hch, jejb,
	linux-pm, kernel

On Sun, 4 Jul 2021 09:54:00 +0200, Martin Kepplinger wrote:

> (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:
> 
> [...]

Applied to 5.15/scsi-queue, thanks!

[1/3] scsi: devinfo: add new flag BLIST_MEDIA_CHANGE
      https://git.kernel.org/mkp/scsi/c/f591a2e0548d
[2/3] scsi: sd: send REQUEST SENSE for BLIST_MEDIA_CHANGE devices in runtime_resume()
      https://git.kernel.org/mkp/scsi/c/ed4246d37f3b
[3/3] scsi: devinfo: add BLIST_MEDIA_CHANGE for Ultra HS-SD/MMC usb cardreaders
      https://git.kernel.org/mkp/scsi/c/9abe677951d1

-- 
Martin K. Petersen	Oracle Linux Engineering

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

end of thread, other threads:[~2021-07-27  4:15 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-04  7:54 [PATCH v6 0/3] fix runtime PM for SD card readers Martin Kepplinger
2021-07-04  7:54 ` [PATCH v6 1/3] scsi: devinfo: add new flag BLIST_MEDIA_CHANGE Martin Kepplinger
2021-07-04  7:54 ` [PATCH v6 2/3] scsi: sd: send REQUEST SENSE for BLIST_MEDIA_CHANGE devices in runtime_resume() Martin Kepplinger
2021-07-04  7:54 ` [PATCH v6 3/3] scsi: devinfo: add BLIST_MEDIA_CHANGE for Ultra HS-SD/MMC usb cardreaders Martin Kepplinger
2021-07-22  3:59 ` [PATCH v6 0/3] fix runtime PM for SD card readers Martin K. Petersen
2021-07-27  4:14 ` Martin K. Petersen

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).