Message ID | 20221124105305.13214-1-hdegoede@redhat.com |
---|---|
State | Accepted |
Commit | 62a0ec9dc1dfb0f58138f1e2527e4a26567268e5 |
Headers | show |
Series | PNP: Do not disable devices on suspend when they cannot be re-enabled on resume | expand |
On Thu, Nov 24, 2022 at 11:53 AM Hans de Goede <hdegoede@redhat.com> wrote: > > On an Advantech MICA-071 tablet, with a builtin barcode scanner connected > to ttyS0, the following message is shown on suspend: > > serial 00:02: disabled > > And after suspend/resume trying to use the barcode scanner / ttyS0 shows: > > serial 00:02: LSR safety check engaged! > > Indicating that the UARTs io-ports are no longer reachable. > > This is caused by __pnp_bus_suspend() calling pnp_stop_dev() on the "00:02" > pnp device on suspend (this outputs the disabled message). > > The problem is that pnp_can_write() returns false for the "00:02" pnp > device, so after disabling it (disabling its decoding of IO addresses) > during suspend, it cannot be re-enabled. > > Add a pnp_can_write() check to the suspend path and only disable devices > which can actually be re-enabled on resume. > > This fixes the Advantech MICA-071's ttyS0 no longer working after > a suspend/resume. > > Signed-off-by: Hans de Goede <hdegoede@redhat.com> > --- > drivers/pnp/driver.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/pnp/driver.c b/drivers/pnp/driver.c > index c02e7bf643a6..46c534f6b1c9 100644 > --- a/drivers/pnp/driver.c > +++ b/drivers/pnp/driver.c > @@ -182,7 +182,8 @@ static int __pnp_bus_suspend(struct device *dev, pm_message_t state) > return error; > } > > - if (pnp_can_disable(pnp_dev)) { > + /* can_write is necessary to be able to re-start the device on resume */ > + if (pnp_can_disable(pnp_dev) && pnp_can_write(pnp_dev)) { > error = pnp_stop_dev(pnp_dev); > if (error) > return error; > -- Applied as 6.2 material, thanks!
diff --git a/drivers/pnp/driver.c b/drivers/pnp/driver.c index c02e7bf643a6..46c534f6b1c9 100644 --- a/drivers/pnp/driver.c +++ b/drivers/pnp/driver.c @@ -182,7 +182,8 @@ static int __pnp_bus_suspend(struct device *dev, pm_message_t state) return error; } - if (pnp_can_disable(pnp_dev)) { + /* can_write is necessary to be able to re-start the device on resume */ + if (pnp_can_disable(pnp_dev) && pnp_can_write(pnp_dev)) { error = pnp_stop_dev(pnp_dev); if (error) return error;
On an Advantech MICA-071 tablet, with a builtin barcode scanner connected to ttyS0, the following message is shown on suspend: serial 00:02: disabled And after suspend/resume trying to use the barcode scanner / ttyS0 shows: serial 00:02: LSR safety check engaged! Indicating that the UARTs io-ports are no longer reachable. This is caused by __pnp_bus_suspend() calling pnp_stop_dev() on the "00:02" pnp device on suspend (this outputs the disabled message). The problem is that pnp_can_write() returns false for the "00:02" pnp device, so after disabling it (disabling its decoding of IO addresses) during suspend, it cannot be re-enabled. Add a pnp_can_write() check to the suspend path and only disable devices which can actually be re-enabled on resume. This fixes the Advantech MICA-071's ttyS0 no longer working after a suspend/resume. Signed-off-by: Hans de Goede <hdegoede@redhat.com> --- drivers/pnp/driver.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)