All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Thompson <daniel.thompson@linaro.org>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Daniel Thompson <daniel.thompson@linaro.org>,
	David Brown <davidb@codeaurora.org>,
	Daniel Walker <dwalker@fifo99.com>,
	Bryan Huntsman <bryanh@codeaurora.org>,
	Jiri Slaby <jslaby@suse.cz>,
	linux-arm-msm@vger.kernel.org, linux-serial@vger.kernel.org,
	linux-kernel@vger.kernel.org, patches@linaro.org,
	linaro-kernel@lists.linaro.org,
	John Stultz <john.stultz@linaro.org>,
	Sumit Semwal <sumit.semwal@linaro.org>
Subject: [PATCH] serial: msm: Add magic SysRq support in dmmode
Date: Wed, 29 Oct 2014 16:38:32 +0000	[thread overview]
Message-ID: <1414600712-20721-1-git-send-email-daniel.thompson@linaro.org> (raw)

Currently the _dm RX handler detects breaks but does not pass any
characters to uart_handle_sysrq_char().

The _dm optimizations combined with the port's spin lock make if
difficult to pass all characters to the sysrq logic because we cannot
safely call uart_handle_sysrq_char() when the lock is held without
deadlock (the console handler also takes the lock).

Rather than passing all characters via uart_handle_sysrq_char() this patch
only passes the last few characters in the FIFO. This should include all
characters typed as a slow (human) rate. This makes the problem much
simpler and allows us to move the handling of these characters outside
of the port lock. This makes magic SysRq work if there is a human at
the keyboard (or a short delay in a script).

Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
---
 drivers/tty/serial/msm_serial.c | 26 +++++++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

diff --git a/drivers/tty/serial/msm_serial.c b/drivers/tty/serial/msm_serial.c
index 4b6c783..24c4fd1 100644
--- a/drivers/tty/serial/msm_serial.c
+++ b/drivers/tty/serial/msm_serial.c
@@ -104,6 +104,7 @@ static void handle_rx_dm(struct uart_port *port, unsigned int misr)
 	unsigned int sr;
 	int count = 0;
 	struct msm_port *msm_port = UART_TO_MSM(port);
+	unsigned char buf[4];

 	if ((msm_read(port, UART_SR) & UART_SR_OVERRUN)) {
 		port->icount.overrun++;
@@ -125,11 +126,10 @@ static void handle_rx_dm(struct uart_port *port, unsigned int misr)
 	port->icount.rx += count;

 	while (count > 0) {
-		unsigned char buf[4];
-
 		sr = msm_read(port, UART_SR);
 		if ((sr & UART_SR_RX_READY) == 0) {
 			msm_port->old_snap_state -= count;
+			count = 0;
 			break;
 		}
 		ioread32_rep(port->membase + UARTDM_RF, buf, 1);
@@ -140,13 +140,33 @@ static void handle_rx_dm(struct uart_port *port, unsigned int misr)
 		} else if (sr & UART_SR_PAR_FRAME_ERR)
 			port->icount.frame++;

-		/* TODO: handle sysrq */
+		/* The last few characters receive special processing below. */
+		if (count <= 2)
+			break;
+
 		tty_insert_flip_string(tport, buf, min(count, 4));
 		count -= 4;
 	}

 	spin_unlock(&port->lock);
+
+	/*
+	 * We have deferred the last few characters to be processed
+	 * with the port unlocked. This allows all characters received at
+	 * "human speed" to be passed through the magic SysRq handling.
+	 * The hardware sends us two characters after a break (the second
+	 * of which is \0) so we are forced to process up to two final
+	 * characters rather than just one.
+	 */
+	if (count > 0) {
+		if (!uart_handle_sysrq_char(port, buf[0]))
+			tty_insert_flip_string(tport, buf, count);
+		else if (count > 1 && !uart_handle_sysrq_char(port, buf[1]))
+			tty_insert_flip_char(tport, buf[1], 0);
+	}
+
 	tty_flip_buffer_push(tport);
+
 	spin_lock(&port->lock);

 	if (misr & (UART_IMR_RXSTALE))
--
1.9.3

             reply	other threads:[~2014-10-29 16:38 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-29 16:38 Daniel Thompson [this message]
2014-10-29 18:01 ` [PATCH] serial: msm: Add magic SysRq support in dmmode Stephen Boyd
2014-10-30 12:00   ` Daniel Thompson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1414600712-20721-1-git-send-email-daniel.thompson@linaro.org \
    --to=daniel.thompson@linaro.org \
    --cc=bryanh@codeaurora.org \
    --cc=davidb@codeaurora.org \
    --cc=dwalker@fifo99.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=john.stultz@linaro.org \
    --cc=jslaby@suse.cz \
    --cc=linaro-kernel@lists.linaro.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-serial@vger.kernel.org \
    --cc=patches@linaro.org \
    --cc=sumit.semwal@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.