TTY/serial driver fixes for .38
Subsystems (4)
PATCH 1/1 TTY/serial driver fixes for .38
Here are a few tty and serial fixes for your .38 tree.
A file got moved back that shouldn't have been moved in the tty/hvc renames, and a few other tiny bugfixes, nothing major.
Please pull from:
master.kernel.org:/pub/scm/linux/kernel/git/gregkh/tty-2.6.git/ tty-linus
All of these patches have been in the -mm and -next trees for the past week or so.
Patches will be sent to the linux-kernel mailing list, if anyone wants to see them.
thanks,
greg k-h
------------
arch/blackfin/include/asm/bfin_serial.h | 2 ++
drivers/char/Makefile | 1 +
drivers/{tty/hvc => char}/virtio_console.c | 2 +-
drivers/tty/hvc/Makefile | 1 -
drivers/tty/n_gsm.c | 1 +
drivers/tty/serial/68360serial.c | 1 +
drivers/tty/serial/bfin_5xx.c | 15 ++++++---------
7 files changed, 12 insertions(+), 11 deletions(-)
rename drivers/{tty/hvc => char}/virtio_console.c (99%)---------------
Amit Shah (1):
virtio: console: Move file back to drivers/char/
Ben Hutchings (1):
68360serial: Plumb in rs_360_get_icount()
Ken Mills (1):
n_gsm: copy mtu over when configuring via ioctl interface
Sonic Zhang (1):
serial: bfin_5xx: split uart RX lock from uart port lock to avoid deadlock
PATCH 1/4 virtio: console: Move file back to drivers/char/
From: Amit Shah <[email protected]>
Commit 728674a7e466628df2aeec6d11a2ae1ef968fb67 moved virtio_console.c to drivers/tty/hvc/ under the perception of this being an hvc driver. It was such once, but these days it has generic communication capabilities as well, so move it to drivers/char/.
In the future, the hvc part from this file can be split off and moved under drivers/tty/hvc/.
---
drivers/char/Makefile | 1 +
drivers/{tty/hvc => char}/virtio_console.c | 2 +-
drivers/tty/hvc/Makefile | 1 -
3 files changed, 2 insertions(+), 2 deletions(-)
rename drivers/{tty/hvc => char}/virtio_console.c (99%)drivers/char/Makefile +1 -0
@@ -30,6 +30,7 @@ obj-$(CONFIG_SYNCLINK_GT) += synclink_gt.o obj-$(CONFIG_AMIGA_BUILTIN_SERIAL) += amiserial.o obj-$(CONFIG_SX) += sx.o generic_serial.o obj-$(CONFIG_RIO) += rio/ generic_serial.o +obj-$(CONFIG_VIRTIO_CONSOLE) += virtio_console.o obj-$(CONFIG_RAW_DRIVER) += raw.o obj-$(CONFIG_SGI_SNSC) += snsc.o snsc_event.o obj-$(CONFIG_MSPEC) += mspec.o
drivers/char/virtio_console.c renamed from drivers/tty/hvc/virtio_console.c +1 -1
@@ -31,7 +31,7 @@#include <linux/virtio_console.h> #include <linux/wait.h> #include <linux/workqueue.h> -#include "hvc_console.h" +#include "../tty/hvc/hvc_console.h" /* * This is a global struct for storing common data for all the devices
drivers/tty/hvc/Makefile +0 -1
@@ -10,4 +10,3 @@ obj-$(CONFIG_HVC_XEN) += hvc_xen.o obj-$(CONFIG_HVC_IUCV) += hvc_iucv.o obj-$(CONFIG_HVC_UDBG) += hvc_udbg.o obj-$(CONFIG_HVCS) += hvcs.o -obj-$(CONFIG_VIRTIO_CONSOLE) += virtio_console.o
Signature · 1 line
1.7.3.2
PATCH 2/4 n_gsm: copy mtu over when configuring via ioctl interface
In reply to Greg KHFrom: Ken Mills <[email protected]>
This field is settable but did not get copied.
--- drivers/tty/n_gsm.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
drivers/tty/n_gsm.c +1 -0
@@ -2414,6 +2414,7 @@ static int gsmld_config(struct tty_struct *tty, struct gsm_mux *gsm, gsm->initiator = c->initiator; gsm->mru = c->mru; + gsm->mtu = c->mtu; gsm->encoding = c->encapsulation; gsm->adaption = c->adaption; gsm->n2 = c->n2;
Signature · 1 line
1.7.3.2
PATCH 4/4 serial: bfin_5xx: split uart RX lock from uart port lock to avoid deadlock
In reply to Greg KHFrom: Sonic Zhang <[email protected]>
The RX lock is used to protect the RX buffer from concurrent access in DMA mode between the timer and RX interrupt routines. It is independent from the uart lock which is used to protect the TX buffer. It is possible for a uart TX transfer to be started up from the RX interrupt handler if low latency is enabled. So we need to split the locks to avoid deadlocking in this situation.
In PIO mode, the RX lock is not necessary because the handle_simple_irq and handle_level_irq functions ensure driver interrupt handlers are called once on one core.
And now that the RX path has its own lock, the TX interrupt has nothing to do with the RX path, so disabling it at the same time.
--- arch/blackfin/include/asm/bfin_serial.h | 2 ++ drivers/tty/serial/bfin_5xx.c | 15 ++++++--------- 2 files changed, 8 insertions(+), 9 deletions(-)
arch/blackfin/include/asm/bfin_serial.h +2 -0
@@ -10,6 +10,7 @@#define __BFIN_ASM_SERIAL_H__#include <linux/serial_core.h> +#include <linux/spinlock.h> #include <mach/anomaly.h> #include <mach/bfin_serial.h>
@@ -41,6 +42,7 @@ struct bfin_serial_port {struct circ_buf rx_dma_buf;struct timer_list rx_dma_timer;int rx_dma_nrows; +spinlock_t rx_lock;unsigned int tx_dma_channel;unsigned int rx_dma_channel;struct work_struct tx_dma_workqueue;
drivers/tty/serial/bfin_5xx.c +6 -9
@@ -370,10 +370,8 @@ static irqreturn_t bfin_serial_rx_int(int irq, void *dev_id) {struct bfin_serial_port *uart = dev_id; -spin_lock (&uart->port.lock);while (UART_GET_LSR (uart) &DR )bfin_serial_rx_chars (uart); -spin_unlock (&uart->port.lock);return IRQ_HANDLED ; }
@@ -490,9 +488,8 @@ void bfin_serial_rx_dma_timeout(struct bfin_serial_port *uart) {int x_pos, pos; -dma_disable_irq (uart->tx_dma_channel); -dma_disable_irq (uart->rx_dma_channel); -spin_lock_bh (&uart->port.lock); +dma_disable_irq_nosync (uart->rx_dma_channel); +spin_lock_bh (&uart->rx_lock);/* 2D DMA RX buffer ring is used. Because curr_y_count and * curr_x_count can't be read as an atomic operation,
@@ -523,8 +520,7 @@ void bfin_serial_rx_dma_timeout(struct bfin_serial_port *uart) uart->rx_dma_buf.tail = uart->rx_dma_buf.head; } -spin_unlock_bh (&uart->port.lock); -dma_enable_irq (uart->tx_dma_channel); +spin_unlock_bh (&uart->rx_lock);dma_enable_irq (uart->rx_dma_channel);mod_timer (&(uart->rx_dma_timer), jiffies +DMA_RX_FLUSH_JIFFIES );
@@ -571,7 +567,7 @@ static irqreturn_t bfin_serial_dma_rx_int(int irq, void *dev_id)unsigned short irqstat;int x_pos, pos; -spin_lock (&uart->port.lock); +spin_lock (&uart->rx_lock); irqstat =get_dma_curr_irqstat (uart->rx_dma_channel);clear_dma_irqstat (uart->rx_dma_channel);
@@ -589,7 +585,7 @@ static irqreturn_t bfin_serial_dma_rx_int(int irq, void *dev_id) uart->rx_dma_buf.tail = uart->rx_dma_buf.head; } -spin_unlock (&uart->port.lock); +spin_unlock (&uart->rx_lock);return IRQ_HANDLED ; }
@@ -1332,6 +1328,7 @@ static int bfin_serial_probe(struct platform_device *pdev) }#ifdef CONFIG_SERIAL_BFIN_DMA +spin_lock_init (&uart->rx_lock); uart->tx_done =1 ; uart->tx_count =0 ;
Signature · 1 line
1.7.3.2