Message ID | 1457740175-8327-1-git-send-email-gabriele.mzt@gmail.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
I tried this patch on a Latitude with ACPI Device with DELLABCE and this patch fixes the problem. Tested-by: Alex Hung <alex.hung@canonical.com> On Sat, Mar 12, 2016 at 7:49 AM, Gabriele Mazzotta <gabriele.mzt@gmail.com> wrote: > Some BIOSes unconditionally send an ACPI notification to RBTN when the > system is resuming from suspend. This makes dell-rbtn send an input > event to userspace as if a function key was pressed. Prevent this by > ignoring all the notifications received while the device is suspended. > > Link: https://bugzilla.kernel.org/show_bug.cgi?id=106031 > Signed-off-by: Gabriele Mazzotta <gabriele.mzt@gmail.com> > --- > drivers/platform/x86/dell-rbtn.c | 41 ++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 41 insertions(+) > > diff --git a/drivers/platform/x86/dell-rbtn.c b/drivers/platform/x86/dell-rbtn.c > index cd410e3..56b0da7 100644 > --- a/drivers/platform/x86/dell-rbtn.c > +++ b/drivers/platform/x86/dell-rbtn.c > @@ -28,6 +28,7 @@ struct rbtn_data { > enum rbtn_type type; > struct rfkill *rfkill; > struct input_dev *input_dev; > + bool suspended; > }; > > > @@ -220,9 +221,44 @@ static const struct acpi_device_id rbtn_ids[] = { > { "", 0 }, > }; > > +#ifdef CONFIG_PM_SLEEP > +static void ACPI_SYSTEM_XFACE rbtn_acpi_clear_flag(void *context) > +{ > + struct rbtn_data *rbtn_data = context; > + > + rbtn_data->suspended = false; > +} > + > +static int rbtn_suspend(struct device *dev) > +{ > + struct acpi_device *device = to_acpi_device(dev); > + struct rbtn_data *rbtn_data = acpi_driver_data(device); > + > + rbtn_data->suspended = true; > + > + return 0; > +} > + > +static int rbtn_resume(struct device *dev) > +{ > + struct acpi_device *device = to_acpi_device(dev); > + struct rbtn_data *rbtn_data = acpi_driver_data(device); > + acpi_status status; > + > + status = acpi_os_execute(OSL_NOTIFY_HANDLER, > + rbtn_acpi_clear_flag, rbtn_data); > + if (ACPI_FAILURE(status)) > + rbtn_data->suspended = false; > + > + return 0; > +} > +#endif > +static SIMPLE_DEV_PM_OPS(rbtn_pm_ops, rbtn_suspend, rbtn_resume); > + > static struct acpi_driver rbtn_driver = { > .name = "dell-rbtn", > .ids = rbtn_ids, > + .drv.pm = &rbtn_pm_ops, > .ops = { > .add = rbtn_add, > .remove = rbtn_remove, > @@ -384,6 +420,11 @@ static void rbtn_notify(struct acpi_device *device, u32 event) > { > struct rbtn_data *rbtn_data = device->driver_data; > > + if (rbtn_data->suspended) { > + dev_dbg(&device->dev, "ACPI notification ignored\n"); > + return; > + } > + > if (event != 0x80) { > dev_info(&device->dev, "Received unknown event (0x%x)\n", > event); > -- > 2.7.0 >
2016-03-12 0:49 GMT+01:00 Gabriele Mazzotta <gabriele.mzt@gmail.com>: > Some BIOSes unconditionally send an ACPI notification to RBTN when the > system is resuming from suspend. This makes dell-rbtn send an input > event to userspace as if a function key was pressed. Prevent this by > ignoring all the notifications received while the device is suspended. > > Link: https://bugzilla.kernel.org/show_bug.cgi?id=106031 > Signed-off-by: Gabriele Mazzotta <gabriele.mzt@gmail.com> > --- > drivers/platform/x86/dell-rbtn.c | 41 ++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 41 insertions(+) > > diff --git a/drivers/platform/x86/dell-rbtn.c b/drivers/platform/x86/dell-rbtn.c > index cd410e3..56b0da7 100644 > --- a/drivers/platform/x86/dell-rbtn.c > +++ b/drivers/platform/x86/dell-rbtn.c > @@ -28,6 +28,7 @@ struct rbtn_data { > enum rbtn_type type; > struct rfkill *rfkill; > struct input_dev *input_dev; > + bool suspended; > }; > > > @@ -220,9 +221,44 @@ static const struct acpi_device_id rbtn_ids[] = { > { "", 0 }, > }; > > +#ifdef CONFIG_PM_SLEEP > +static void ACPI_SYSTEM_XFACE rbtn_acpi_clear_flag(void *context) > +{ > + struct rbtn_data *rbtn_data = context; > + > + rbtn_data->suspended = false; > +} > + > +static int rbtn_suspend(struct device *dev) > +{ > + struct acpi_device *device = to_acpi_device(dev); > + struct rbtn_data *rbtn_data = acpi_driver_data(device); > + > + rbtn_data->suspended = true; > + > + return 0; > +} > + > +static int rbtn_resume(struct device *dev) > +{ > + struct acpi_device *device = to_acpi_device(dev); > + struct rbtn_data *rbtn_data = acpi_driver_data(device); > + acpi_status status; > + > + status = acpi_os_execute(OSL_NOTIFY_HANDLER, > + rbtn_acpi_clear_flag, rbtn_data); > + if (ACPI_FAILURE(status)) > + rbtn_data->suspended = false; > + > + return 0; > +} > +#endif > +static SIMPLE_DEV_PM_OPS(rbtn_pm_ops, rbtn_suspend, rbtn_resume); > + > static struct acpi_driver rbtn_driver = { > .name = "dell-rbtn", > .ids = rbtn_ids, > + .drv.pm = &rbtn_pm_ops, > .ops = { > .add = rbtn_add, > .remove = rbtn_remove, > @@ -384,6 +420,11 @@ static void rbtn_notify(struct acpi_device *device, u32 event) > { > struct rbtn_data *rbtn_data = device->driver_data; > > + if (rbtn_data->suspended) { > + dev_dbg(&device->dev, "ACPI notification ignored\n"); > + return; > + } > + > if (event != 0x80) { > dev_info(&device->dev, "Received unknown event (0x%x)\n", > event); > -- > 2.7.0 > I'm sorry, Pali, I must have missed your email address while sending this updated version. -- To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Monday 14 March 2016 12:34:31 Gabriele Mazzotta wrote: > 2016-03-12 0:49 GMT+01:00 Gabriele Mazzotta <gabriele.mzt@gmail.com>: > > Some BIOSes unconditionally send an ACPI notification to RBTN when the > > system is resuming from suspend. This makes dell-rbtn send an input > > event to userspace as if a function key was pressed. Prevent this by > > ignoring all the notifications received while the device is suspended. > > > > Link: https://bugzilla.kernel.org/show_bug.cgi?id=106031 > > Signed-off-by: Gabriele Mazzotta <gabriele.mzt@gmail.com> > > --- > > drivers/platform/x86/dell-rbtn.c | 41 ++++++++++++++++++++++++++++++++++++++++ > > 1 file changed, 41 insertions(+) > > > > diff --git a/drivers/platform/x86/dell-rbtn.c b/drivers/platform/x86/dell-rbtn.c > > index cd410e3..56b0da7 100644 > > --- a/drivers/platform/x86/dell-rbtn.c > > +++ b/drivers/platform/x86/dell-rbtn.c > > @@ -28,6 +28,7 @@ struct rbtn_data { > > enum rbtn_type type; > > struct rfkill *rfkill; > > struct input_dev *input_dev; > > + bool suspended; > > }; > > > > > > @@ -220,9 +221,44 @@ static const struct acpi_device_id rbtn_ids[] = { > > { "", 0 }, > > }; > > > > +#ifdef CONFIG_PM_SLEEP > > +static void ACPI_SYSTEM_XFACE rbtn_acpi_clear_flag(void *context) > > +{ > > + struct rbtn_data *rbtn_data = context; > > + > > + rbtn_data->suspended = false; > > +} > > + > > +static int rbtn_suspend(struct device *dev) > > +{ > > + struct acpi_device *device = to_acpi_device(dev); > > + struct rbtn_data *rbtn_data = acpi_driver_data(device); > > + > > + rbtn_data->suspended = true; > > + > > + return 0; > > +} > > + > > +static int rbtn_resume(struct device *dev) > > +{ > > + struct acpi_device *device = to_acpi_device(dev); > > + struct rbtn_data *rbtn_data = acpi_driver_data(device); > > + acpi_status status; > > + > > + status = acpi_os_execute(OSL_NOTIFY_HANDLER, > > + rbtn_acpi_clear_flag, rbtn_data); > > + if (ACPI_FAILURE(status)) > > + rbtn_data->suspended = false; > > + > > + return 0; > > +} > > +#endif > > +static SIMPLE_DEV_PM_OPS(rbtn_pm_ops, rbtn_suspend, rbtn_resume); > > + > > static struct acpi_driver rbtn_driver = { > > .name = "dell-rbtn", > > .ids = rbtn_ids, > > + .drv.pm = &rbtn_pm_ops, > > .ops = { > > .add = rbtn_add, > > .remove = rbtn_remove, > > @@ -384,6 +420,11 @@ static void rbtn_notify(struct acpi_device *device, u32 event) > > { > > struct rbtn_data *rbtn_data = device->driver_data; > > > > + if (rbtn_data->suspended) { > > + dev_dbg(&device->dev, "ACPI notification ignored\n"); > > + return; > > + } > > + > > if (event != 0x80) { > > dev_info(&device->dev, "Received unknown event (0x%x)\n", > > event); > > -- > > 2.7.0 > > > > I'm sorry, Pali, I must have missed your email address while sending > this updated version. For me patch looks OK. I would suggest to add some comment about BIOS into code too. Rafael, can you review that ACPI suspended/OSL_NOTIFY_HANDLER part? Andrei, can you test if it now really fix it on your machine?
On Mon, Mar 14, 2016 at 2:45 PM, Pali Rohár <pali.rohar@gmail.com> wrote: > On Monday 14 March 2016 12:34:31 Gabriele Mazzotta wrote: >> 2016-03-12 0:49 GMT+01:00 Gabriele Mazzotta <gabriele.mzt@gmail.com>: >> > Some BIOSes unconditionally send an ACPI notification to RBTN when the >> > system is resuming from suspend. This makes dell-rbtn send an input >> > event to userspace as if a function key was pressed. Prevent this by >> > ignoring all the notifications received while the device is suspended. >> > >> > Link: https://bugzilla.kernel.org/show_bug.cgi?id=106031 >> > Signed-off-by: Gabriele Mazzotta <gabriele.mzt@gmail.com> >> > --- >> > drivers/platform/x86/dell-rbtn.c | 41 ++++++++++++++++++++++++++++++++++++++++ >> > 1 file changed, 41 insertions(+) >> > >> > diff --git a/drivers/platform/x86/dell-rbtn.c b/drivers/platform/x86/dell-rbtn.c >> > index cd410e3..56b0da7 100644 >> > --- a/drivers/platform/x86/dell-rbtn.c >> > +++ b/drivers/platform/x86/dell-rbtn.c >> > @@ -28,6 +28,7 @@ struct rbtn_data { >> > enum rbtn_type type; >> > struct rfkill *rfkill; >> > struct input_dev *input_dev; >> > + bool suspended; >> > }; >> > >> > >> > @@ -220,9 +221,44 @@ static const struct acpi_device_id rbtn_ids[] = { >> > { "", 0 }, >> > }; >> > >> > +#ifdef CONFIG_PM_SLEEP >> > +static void ACPI_SYSTEM_XFACE rbtn_acpi_clear_flag(void *context) >> > +{ >> > + struct rbtn_data *rbtn_data = context; >> > + >> > + rbtn_data->suspended = false; >> > +} >> > + >> > +static int rbtn_suspend(struct device *dev) >> > +{ >> > + struct acpi_device *device = to_acpi_device(dev); >> > + struct rbtn_data *rbtn_data = acpi_driver_data(device); >> > + >> > + rbtn_data->suspended = true; >> > + >> > + return 0; >> > +} >> > + >> > +static int rbtn_resume(struct device *dev) >> > +{ >> > + struct acpi_device *device = to_acpi_device(dev); >> > + struct rbtn_data *rbtn_data = acpi_driver_data(device); >> > + acpi_status status; >> > + >> > + status = acpi_os_execute(OSL_NOTIFY_HANDLER, >> > + rbtn_acpi_clear_flag, rbtn_data); >> > + if (ACPI_FAILURE(status)) >> > + rbtn_data->suspended = false; >> > + >> > + return 0; >> > +} >> > +#endif >> > +static SIMPLE_DEV_PM_OPS(rbtn_pm_ops, rbtn_suspend, rbtn_resume); >> > + >> > static struct acpi_driver rbtn_driver = { >> > .name = "dell-rbtn", >> > .ids = rbtn_ids, >> > + .drv.pm = &rbtn_pm_ops, >> > .ops = { >> > .add = rbtn_add, >> > .remove = rbtn_remove, >> > @@ -384,6 +420,11 @@ static void rbtn_notify(struct acpi_device *device, u32 event) >> > { >> > struct rbtn_data *rbtn_data = device->driver_data; >> > >> > + if (rbtn_data->suspended) { >> > + dev_dbg(&device->dev, "ACPI notification ignored\n"); >> > + return; >> > + } >> > + >> > if (event != 0x80) { >> > dev_info(&device->dev, "Received unknown event (0x%x)\n", >> > event); >> > -- >> > 2.7.0 >> > >> >> I'm sorry, Pali, I must have missed your email address while sending >> this updated version. > > For me patch looks OK. I would suggest to add some comment about BIOS > into code too. > > Rafael, can you review that ACPI suspended/OSL_NOTIFY_HANDLER part? > > Andrei, can you test if it now really fix it on your machine? > Yes, but will take some time, later this week. -- To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
14.03.2016 14:45, Pali Rohár ?????: > On Monday 14 March 2016 12:34:31 Gabriele Mazzotta wrote: >> 2016-03-12 0:49 GMT+01:00 Gabriele Mazzotta <gabriele.mzt@gmail.com>: >>> Some BIOSes unconditionally send an ACPI notification to RBTN when the >>> system is resuming from suspend. This makes dell-rbtn send an input >>> event to userspace as if a function key was pressed. Prevent this by >>> ignoring all the notifications received while the device is suspended. >>> >>> Link: https://bugzilla.kernel.org/show_bug.cgi?id=106031 >>> Signed-off-by: Gabriele Mazzotta <gabriele.mzt@gmail.com> >>> --- >>> drivers/platform/x86/dell-rbtn.c | 41 ++++++++++++++++++++++++++++++++++++++++ >>> 1 file changed, 41 insertions(+) >>> >>> diff --git a/drivers/platform/x86/dell-rbtn.c b/drivers/platform/x86/dell-rbtn.c >>> index cd410e3..56b0da7 100644 >>> --- a/drivers/platform/x86/dell-rbtn.c >>> +++ b/drivers/platform/x86/dell-rbtn.c >>> @@ -28,6 +28,7 @@ struct rbtn_data { >>> enum rbtn_type type; >>> struct rfkill *rfkill; >>> struct input_dev *input_dev; >>> + bool suspended; >>> }; >>> >>> >>> @@ -220,9 +221,44 @@ static const struct acpi_device_id rbtn_ids[] = { >>> { "", 0 }, >>> }; >>> >>> +#ifdef CONFIG_PM_SLEEP >>> +static void ACPI_SYSTEM_XFACE rbtn_acpi_clear_flag(void *context) >>> +{ >>> + struct rbtn_data *rbtn_data = context; >>> + >>> + rbtn_data->suspended = false; >>> +} >>> + >>> +static int rbtn_suspend(struct device *dev) >>> +{ >>> + struct acpi_device *device = to_acpi_device(dev); >>> + struct rbtn_data *rbtn_data = acpi_driver_data(device); >>> + >>> + rbtn_data->suspended = true; >>> + >>> + return 0; >>> +} >>> + >>> +static int rbtn_resume(struct device *dev) >>> +{ >>> + struct acpi_device *device = to_acpi_device(dev); >>> + struct rbtn_data *rbtn_data = acpi_driver_data(device); >>> + acpi_status status; >>> + >>> + status = acpi_os_execute(OSL_NOTIFY_HANDLER, >>> + rbtn_acpi_clear_flag, rbtn_data); >>> + if (ACPI_FAILURE(status)) >>> + rbtn_data->suspended = false; >>> + >>> + return 0; >>> +} >>> +#endif >>> +static SIMPLE_DEV_PM_OPS(rbtn_pm_ops, rbtn_suspend, rbtn_resume); >>> + >>> static struct acpi_driver rbtn_driver = { >>> .name = "dell-rbtn", >>> .ids = rbtn_ids, >>> + .drv.pm = &rbtn_pm_ops, >>> .ops = { >>> .add = rbtn_add, >>> .remove = rbtn_remove, >>> @@ -384,6 +420,11 @@ static void rbtn_notify(struct acpi_device *device, u32 event) >>> { >>> struct rbtn_data *rbtn_data = device->driver_data; >>> >>> + if (rbtn_data->suspended) { >>> + dev_dbg(&device->dev, "ACPI notification ignored\n"); >>> + return; >>> + } >>> + >>> if (event != 0x80) { >>> dev_info(&device->dev, "Received unknown event (0x%x)\n", >>> event); >>> -- >>> 2.7.0 >>> >> >> I'm sorry, Pali, I must have missed your email address while sending >> this updated version. > > For me patch looks OK. I would suggest to add some comment about BIOS > into code too. > > Rafael, can you review that ACPI suspended/OSL_NOTIFY_HANDLER part? > > Andrei, can you test if it now really fix it on your machine? > TBH I'm still unsure if this fixes root cause or just decreases race window, but so far after multiple suspend/resume cycles on my Dell Latitude E5450 WiFi was restored every time. So Tested-By: Andrei Borzenkov <arvidjaar@gmail.com> -- To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Friday 18 March 2016 18:57:33 Andrei Borzenkov wrote: > 14.03.2016 14:45, Pali Rohár ?????: > > On Monday 14 March 2016 12:34:31 Gabriele Mazzotta wrote: > >> 2016-03-12 0:49 GMT+01:00 Gabriele Mazzotta <gabriele.mzt@gmail.com>: > >>> Some BIOSes unconditionally send an ACPI notification to RBTN when the > >>> system is resuming from suspend. This makes dell-rbtn send an input > >>> event to userspace as if a function key was pressed. Prevent this by > >>> ignoring all the notifications received while the device is suspended. > >>> > >>> Link: https://bugzilla.kernel.org/show_bug.cgi?id=106031 > >>> Signed-off-by: Gabriele Mazzotta <gabriele.mzt@gmail.com> > >>> --- > >>> drivers/platform/x86/dell-rbtn.c | 41 ++++++++++++++++++++++++++++++++++++++++ > >>> 1 file changed, 41 insertions(+) > >>> > >>> diff --git a/drivers/platform/x86/dell-rbtn.c b/drivers/platform/x86/dell-rbtn.c > >>> index cd410e3..56b0da7 100644 > >>> --- a/drivers/platform/x86/dell-rbtn.c > >>> +++ b/drivers/platform/x86/dell-rbtn.c > >>> @@ -28,6 +28,7 @@ struct rbtn_data { > >>> enum rbtn_type type; > >>> struct rfkill *rfkill; > >>> struct input_dev *input_dev; > >>> + bool suspended; > >>> }; > >>> > >>> > >>> @@ -220,9 +221,44 @@ static const struct acpi_device_id rbtn_ids[] = { > >>> { "", 0 }, > >>> }; > >>> > >>> +#ifdef CONFIG_PM_SLEEP > >>> +static void ACPI_SYSTEM_XFACE rbtn_acpi_clear_flag(void *context) > >>> +{ > >>> + struct rbtn_data *rbtn_data = context; > >>> + > >>> + rbtn_data->suspended = false; > >>> +} > >>> + > >>> +static int rbtn_suspend(struct device *dev) > >>> +{ > >>> + struct acpi_device *device = to_acpi_device(dev); > >>> + struct rbtn_data *rbtn_data = acpi_driver_data(device); > >>> + > >>> + rbtn_data->suspended = true; > >>> + > >>> + return 0; > >>> +} > >>> + > >>> +static int rbtn_resume(struct device *dev) > >>> +{ > >>> + struct acpi_device *device = to_acpi_device(dev); > >>> + struct rbtn_data *rbtn_data = acpi_driver_data(device); > >>> + acpi_status status; > >>> + > >>> + status = acpi_os_execute(OSL_NOTIFY_HANDLER, > >>> + rbtn_acpi_clear_flag, rbtn_data); > >>> + if (ACPI_FAILURE(status)) > >>> + rbtn_data->suspended = false; > >>> + > >>> + return 0; > >>> +} > >>> +#endif > >>> +static SIMPLE_DEV_PM_OPS(rbtn_pm_ops, rbtn_suspend, rbtn_resume); > >>> + > >>> static struct acpi_driver rbtn_driver = { > >>> .name = "dell-rbtn", > >>> .ids = rbtn_ids, > >>> + .drv.pm = &rbtn_pm_ops, > >>> .ops = { > >>> .add = rbtn_add, > >>> .remove = rbtn_remove, > >>> @@ -384,6 +420,11 @@ static void rbtn_notify(struct acpi_device *device, u32 event) > >>> { > >>> struct rbtn_data *rbtn_data = device->driver_data; > >>> > >>> + if (rbtn_data->suspended) { > >>> + dev_dbg(&device->dev, "ACPI notification ignored\n"); > >>> + return; > >>> + } > >>> + > >>> if (event != 0x80) { > >>> dev_info(&device->dev, "Received unknown event (0x%x)\n", > >>> event); > >>> -- > >>> 2.7.0 > >>> > >> > >> I'm sorry, Pali, I must have missed your email address while sending > >> this updated version. > > > > For me patch looks OK. I would suggest to add some comment about BIOS > > into code too. > > > > Rafael, can you review that ACPI suspended/OSL_NOTIFY_HANDLER part? > > > > Andrei, can you test if it now really fix it on your machine? > > > > TBH I'm still unsure if this fixes root cause or just decreases race > window, but so far after multiple suspend/resume cycles on my Dell > Latitude E5450 WiFi was restored every time. So > > Tested-By: Andrei Borzenkov <arvidjaar@gmail.com> So that means that you cannot reproduce it anymore. Anyway, if you get it again, let us know.
diff --git a/drivers/platform/x86/dell-rbtn.c b/drivers/platform/x86/dell-rbtn.c index cd410e3..56b0da7 100644 --- a/drivers/platform/x86/dell-rbtn.c +++ b/drivers/platform/x86/dell-rbtn.c @@ -28,6 +28,7 @@ struct rbtn_data { enum rbtn_type type; struct rfkill *rfkill; struct input_dev *input_dev; + bool suspended; }; @@ -220,9 +221,44 @@ static const struct acpi_device_id rbtn_ids[] = { { "", 0 }, }; +#ifdef CONFIG_PM_SLEEP +static void ACPI_SYSTEM_XFACE rbtn_acpi_clear_flag(void *context) +{ + struct rbtn_data *rbtn_data = context; + + rbtn_data->suspended = false; +} + +static int rbtn_suspend(struct device *dev) +{ + struct acpi_device *device = to_acpi_device(dev); + struct rbtn_data *rbtn_data = acpi_driver_data(device); + + rbtn_data->suspended = true; + + return 0; +} + +static int rbtn_resume(struct device *dev) +{ + struct acpi_device *device = to_acpi_device(dev); + struct rbtn_data *rbtn_data = acpi_driver_data(device); + acpi_status status; + + status = acpi_os_execute(OSL_NOTIFY_HANDLER, + rbtn_acpi_clear_flag, rbtn_data); + if (ACPI_FAILURE(status)) + rbtn_data->suspended = false; + + return 0; +} +#endif +static SIMPLE_DEV_PM_OPS(rbtn_pm_ops, rbtn_suspend, rbtn_resume); + static struct acpi_driver rbtn_driver = { .name = "dell-rbtn", .ids = rbtn_ids, + .drv.pm = &rbtn_pm_ops, .ops = { .add = rbtn_add, .remove = rbtn_remove, @@ -384,6 +420,11 @@ static void rbtn_notify(struct acpi_device *device, u32 event) { struct rbtn_data *rbtn_data = device->driver_data; + if (rbtn_data->suspended) { + dev_dbg(&device->dev, "ACPI notification ignored\n"); + return; + } + if (event != 0x80) { dev_info(&device->dev, "Received unknown event (0x%x)\n", event);
Some BIOSes unconditionally send an ACPI notification to RBTN when the system is resuming from suspend. This makes dell-rbtn send an input event to userspace as if a function key was pressed. Prevent this by ignoring all the notifications received while the device is suspended. Link: https://bugzilla.kernel.org/show_bug.cgi?id=106031 Signed-off-by: Gabriele Mazzotta <gabriele.mzt@gmail.com> --- drivers/platform/x86/dell-rbtn.c | 41 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+)