diff mbox series

PNP: Do not disable devices on suspend when they cannot be re-enabled on resume

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

Commit Message

Hans de Goede Nov. 24, 2022, 10:53 a.m. UTC
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(-)

Comments

Rafael J. Wysocki Nov. 25, 2022, 6:38 p.m. UTC | #1
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 mbox series

Patch

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;