|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] ns16550: delay resume until dom0 ACPI has a chance to run
On Wed, Jan 16, 2013 at 09:40:40PM +0000, Malcolm Crossley wrote:
> On 16/01/13 21:31, Ben Guthro wrote:
> >
> >On 01/16/2013 04:24 PM, Pasi Kärkkäinen wrote:
> >>On Wed, Jan 16, 2013 at 03:20:56PM -0500, Ben Guthro wrote:
> >>>Check for ioport access, before fully resuming operation, to avoid
> >>>spinning in __ns16550_poll when reading the LSR register returns 0xFF
> >>>on failing ioport access.
> >>>
> >>>On some systems, there is a SuperIO card that provides this legacy ioport
> >>>on the LPC bus.
> >>>
> >>>In this case, we need to wait for dom0's ACPI processing to run the proper
> >>>AML to re-initialize the chip, before we can use the card again.
> >>>
> >>>This may cause a small amount of garbage to be written
> >>>to the serial log while we wait patiently for that AML to
> >>>be executed.
> >>>
> >>>It limits the number of retries, to avoid a situation where we keep trying
> >>>over and over again, in the case of some other failure on the ioport.
> >>>
> >>So I assume this patch fixes the ACPI S3 suspend/resume on the Lenovo
> >>T430/T530 laptops?
> >>It might be good to mention that aswell..
> >Yes, it seems to resolve the issues seen on T430, T530, and Intel
> >Ivybridge mobile SDP. It likely fixes others, as the Intel mobile SDP is
> >the reference platform for all the OEMs.
> >
> >If I need to re-submit this patch for any other reason, I will be sure
> >to mention this in the comment.
> >
> >That said - there seems to still be an issue on some older Sandy Bridge
> >machines, like a Lenovo T520, and X220 - but I don't yet know if it is
> >related.
>
> Do these laptops (T430/T530) have built in serial?
>
> Or is the hang fixed because you were using a serial Express card to debug?
>
At least my T430 laptop is "Intel Core i7 vPro" model, so it has the
Intel AMT (Active Management Technology), which provides Serial Over LAN (SOL)
port.
-- Pasi
> BTW, nearly all PC's have external SUPERIO devices, it just seems we
> have managed to be lucky that most platforms seem to default to
> using the BIOS to enable the serial port after resume instead of the
> OS.
>
> Malcolm
> >Ben
> >
> >
> >
> >>-- Pasi
> >>
> >>
> >>>Signed-Off-By: Ben Guthro <benjamin.guthro@xxxxxxxxxx>
> >>>---
> >>> xen/drivers/char/ns16550.c | 56
> >>> +++++++++++++++++++++++++++++++++++++++++++-
> >>> 1 file changed, 55 insertions(+), 1 deletion(-)
> >>>
> >>>diff --git a/xen/drivers/char/ns16550.c b/xen/drivers/char/ns16550.c
> >>>index d77042e..27555c7 100644
> >>>--- a/xen/drivers/char/ns16550.c
> >>>+++ b/xen/drivers/char/ns16550.c
> >>>@@ -42,6 +42,7 @@ static struct ns16550 {
> >>> struct irqaction irqaction;
> >>> /* UART with no IRQ line: periodically-polled I/O. */
> >>> struct timer timer;
> >>>+ struct timer resume_timer;
> >>> unsigned int timeout_ms;
> >>> bool_t intr_works;
> >>> /* PCI card parameters. */
> >>>@@ -120,6 +121,10 @@ static struct ns16550 {
> >>> /* Frequency of external clock source. This definition assumes PC
> >>> platform. */
> >>> #define UART_CLOCK_HZ 1843200
> >>>
> >>>+/* Resume retry settings */
> >>>+#define RESUME_DELAY MILLISECS(10)
> >>>+#define RESUME_RETRIES 100
> >>>+
> >>> static char ns_read_reg(struct ns16550 *uart, int reg)
> >>> {
> >>> if ( uart->remapped_io_base == NULL )
> >>>@@ -330,7 +335,7 @@ static void ns16550_suspend(struct serial_port *port)
> >>> uart->ps_bdf[2], PCI_COMMAND);
> >>> }
> >>>
> >>>-static void ns16550_resume(struct serial_port *port)
> >>>+static void __ns16550_resume(struct serial_port *port)
> >>> {
> >>> struct ns16550 *uart = port->uart;
> >>>
> >>>@@ -346,6 +351,55 @@ static void ns16550_resume(struct serial_port *port)
> >>> ns16550_setup_postirq(port->uart);
> >>> }
> >>>
> >>>+static int ns16550_ioport_invalid(struct ns16550 *uart)
> >>>+{
> >>>+ return ((((unsigned char)ns_read_reg(uart, LSR)) == 0xff) &&
> >>>+ (((unsigned char)ns_read_reg(uart, MCR)) == 0xff) &&
> >>>+ (((unsigned char)ns_read_reg(uart, IER)) == 0xff) &&
> >>>+ (((unsigned char)ns_read_reg(uart, IIR)) == 0xff) &&
> >>>+ (((unsigned char)ns_read_reg(uart, LCR)) == 0xff));
> >>>+}
> >>>+
> >>>+static int delayed_resume_tries;
> >>>+static void ns16550_delayed_resume(void *data)
> >>>+{
> >>>+ struct serial_port *port = data;
> >>>+ struct ns16550 *uart = port->uart;
> >>>+
> >>>+ if (ns16550_ioport_invalid(port->uart) && delayed_resume_tries--) {
> >>>+ set_timer(&uart->resume_timer, NOW() + RESUME_DELAY);
> >>>+ return;
> >>>+ }
> >>>+
> >>>+ __ns16550_resume(port);
> >>>+}
> >>>+
> >>>+static void ns16550_resume(struct serial_port *port)
> >>>+{
> >>>+ struct ns16550 *uart = port->uart;
> >>>+
> >>>+ /*
> >>>+ * Check for ioport access, before fully resuming operation.
> >>>+ * On some systems, there is a SuperIO card that provides
> >>>+ * this legacy ioport on the LPC bus.
> >>>+ *
> >>>+ * We need to wait for dom0's ACPI processing to run the proper
> >>>+ * AML to re-initialize the chip, before we can use the card again.
> >>>+ *
> >>>+ * This may cause a small amount of garbage to be written
> >>>+ * to the serial log while we wait patiently for that AML to
> >>>+ * be executed.
> >>>+ */
> >>>+ if (ns16550_ioport_invalid(uart)) {
> >>>+ delayed_resume_tries = RESUME_RETRIES;
> >>>+ init_timer(&uart->resume_timer, ns16550_delayed_resume, port, 0);
> >>>+ set_timer(&uart->resume_timer, NOW() + RESUME_DELAY);
> >>>+ return;
> >>>+ }
> >>>+
> >>>+ __ns16550_resume(port);
> >>>+}
> >>>+
> >>> #ifdef CONFIG_X86
> >>> static void __init ns16550_endboot(struct serial_port *port)
> >>> {
> >>>--
> >>>1.7.9.5
> >>>
> >>>
> >>>_______________________________________________
> >>>Xen-devel mailing list
> >>>Xen-devel@xxxxxxxxxxxxx
> >>>http://lists.xen.org/xen-devel
> >_______________________________________________
> >Xen-devel mailing list
> >Xen-devel@xxxxxxxxxxxxx
> >http://lists.xen.org/xen-devel
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |