On Wed, Jun 14, 2023 at 12:49 PM Damien Le Moal <dlemoal@xxxxxxxxxx> wrote: > > 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 ? Issue still persists at my end, when /sys/power/pm_async is 0. device_pm_wait_for_dev() in its current form is only usable for async case. Kai-Heng > > 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 >