Re: Fwd: Waking up from resume locks up on sr device

From: Damien Le Moal
Date: Wed Jun 14 2023 - 00:49:44 EST


On 6/11/23 18:05, Joe Breuer wrote:
> I'm the reporter of this issue.
>
> I just tried this patch against 6.3.4, and it completely fixes my
> suspend/resume issue.
>
> The optical drive stays usable after resume, even suspending/resuming
> during playback of CDDA content works flawlessly and playback resumes
> seamlessly after system resume.
>
> So, from my perspective: Good one!

In place of Bart's fix, could you please try this patch ?

diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index b80e68000dd3..a81eb4f882ab 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -4006,9 +4006,32 @@ static void ata_eh_handle_port_resume(struct
ata_port *ap)
/* tell ACPI that we're resuming */
ata_acpi_on_resume(ap);

- /* update the flags */
spin_lock_irqsave(ap->lock, flags);
+
+ /* Update the flags */
ap->pflags &= ~(ATA_PFLAG_PM_PENDING | ATA_PFLAG_SUSPENDED);
+
+ /*
+ * Resuming the port will trigger a rescan of the ATA device(s)
+ * connected to it. Before scheduling the rescan, make sure that
+ * the associated scsi device(s) are fully resumed as well.
+ */
+ ata_for_each_link(link, ap, HOST_FIRST) {
+ ata_for_each_dev(dev, link, ENABLED) {
+ struct scsi_device *sdev = dev->sdev;
+
+ if (!sdev)
+ continue;
+ if (scsi_device_get(sdev))
+ continue;
+
+ spin_unlock_irqrestore(ap->lock, flags);
+ device_pm_wait_for_dev(&ap->tdev,
+ &sdev->sdev_gendev);
+ scsi_device_put(sdev);
+ spin_lock_irqsave(ap->lock, flags);
+ }
+ }
spin_unlock_irqrestore(ap->lock, flags);
}
#endif /* CONFIG_PM */

Thanks !

--
Damien Le Moal
Western Digital Research