serial: 8250: Add missing wakeup event reporting
Commit Message
An 8250 UART configured as a wake-up source would not have reported
itself through sysfs as being the source of wake-up, correct that.
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
drivers/tty/serial/8250/8250_port.c | 4 ++++
1 file changed, 4 insertions(+)
Comments
On Thu, Apr 13, 2023 at 02:39:54PM -0700, Florian Fainelli wrote:
> An 8250 UART configured as a wake-up source would not have reported
> itself through sysfs as being the source of wake-up, correct that.
>
> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
> ---
> drivers/tty/serial/8250/8250_port.c | 4 ++++
> 1 file changed, 4 insertions(+)
What commit does this fix? Is it needed to go to stable kernel(s)?
thanks,
gre gk-h
On 4/14/2023 12:19 AM, Greg Kroah-Hartman wrote:
> On Thu, Apr 13, 2023 at 02:39:54PM -0700, Florian Fainelli wrote:
>> An 8250 UART configured as a wake-up source would not have reported
>> itself through sysfs as being the source of wake-up, correct that.
>>
>> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
>> ---
>> drivers/tty/serial/8250/8250_port.c | 4 ++++
>> 1 file changed, 4 insertions(+)
>
> What commit does this fix? Is it needed to go to stable kernel(s)?
That would be b3b708fa2780cd2b5d8266a8f0c3a1cab364d4d2 ("wake up from a
serial port").
I do not know of standard Linux distribution user-space relying on the
wake-up counts from sysfs, though I certainly do care.
The patch I submitted should backport fine all the way down to 4.14
where irqd_is_wakeup_set is available. Do you want me to submit a v2
with that Fixes tag?
@@ -15,6 +15,7 @@
#include <linux/moduleparam.h>
#include <linux/ioport.h>
#include <linux/init.h>
+#include <linux/irq.h>
#include <linux/console.h>
#include <linux/gpio/consumer.h>
#include <linux/sysrq.h>
@@ -1932,6 +1933,7 @@ static bool handle_rx_dma(struct uart_8250_port *up, unsigned int iir)
int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
{
struct uart_8250_port *up = up_to_u8250p(port);
+ struct tty_port *tport = &port->state->port;
bool skip_rx = false;
unsigned long flags;
u16 status;
@@ -1957,6 +1959,8 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
skip_rx = true;
if (status & (UART_LSR_DR | UART_LSR_BI) && !skip_rx) {
+ if (irqd_is_wakeup_set(irq_get_irq_data(port->irq)))
+ pm_wakeup_event(tport->tty->dev, 0);
if (!up->dma || handle_rx_dma(up, iir))
status = serial8250_rx_chars(up, status);
}