forked from Minki/linux
TTY/Serial fixes for 4.13-rc2
Here are some small tty and serial driver fixes for 4.13-rc2. Nothing huge at all, a revert of a patch that turned out to break things, a fix up for a new tty ioctl we added in 4.13-rc1 to get the uapi definition correct, and a few minor serial driver fixes for reported issues. All of these have been in linux-next for a while with no reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCWXMebA8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+yn9MgCdGsIEQlTvTeG4QikxUPB7dkEJQacAoLWOKJzQ A65mBAeOfiJztczi8uo4 =KEXp -----END PGP SIGNATURE----- Merge tag 'tty-4.13-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty Pull tty/serial fixes from Greg KH: "Here are some small tty and serial driver fixes for 4.13-rc2. Nothing huge at all, a revert of a patch that turned out to break things, a fix up for a new tty ioctl we added in 4.13-rc1 to get the uapi definition correct, and a few minor serial driver fixes for reported issues. All of these have been in linux-next for a while with no reported issues" * tag 'tty-4.13-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: tty: Fix TIOCGPTPEER ioctl definition tty: hide unused pty_get_peer function tty: serial: lpuart: Fix the logic for detecting the 32-bit type UART serial: imx: Prevent TX buffer PIO write when a DMA has been started Revert "serial: imx-serial - move DMA buffer configuration to DT" serial: sh-sci: Uninitialized variables in sysfs files serial: st-asc: Potential error pointer dereference
This commit is contained in:
commit
ae75d1aefe
@ -9,7 +9,6 @@ Optional properties:
|
||||
- fsl,irda-mode : Indicate the uart supports irda mode
|
||||
- fsl,dte-mode : Indicate the uart works in DTE mode. The uart works
|
||||
in DCE mode by default.
|
||||
- fsl,dma-size : Indicate the size of the DMA buffer and its periods
|
||||
|
||||
Please check Documentation/devicetree/bindings/serial/serial.txt
|
||||
for the complete list of generic properties.
|
||||
@ -29,5 +28,4 @@ uart1: serial@73fbc000 {
|
||||
interrupts = <31>;
|
||||
uart-has-rtscts;
|
||||
fsl,dte-mode;
|
||||
fsl,dma-size = <1024 4>;
|
||||
};
|
||||
|
@ -100,7 +100,7 @@
|
||||
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
||||
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
||||
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
||||
#define TIOCGPTPEER _IOR('T', 0x41, int) /* Safely open the slave */
|
||||
#define TIOCGPTPEER _IO('T', 0x41) /* Safely open the slave */
|
||||
|
||||
#define TIOCSERCONFIG 0x5453
|
||||
#define TIOCSERGWILD 0x5454
|
||||
|
@ -91,7 +91,7 @@
|
||||
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
||||
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
||||
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
||||
#define TIOCGPTPEER _IOR('T', 0x41, int) /* Safely open the slave */
|
||||
#define TIOCGPTPEER _IO('T', 0x41) /* Safely open the slave */
|
||||
|
||||
/* I hope the range from 0x5480 on is free ... */
|
||||
#define TIOCSCTTY 0x5480 /* become controlling tty */
|
||||
|
@ -60,7 +60,7 @@
|
||||
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
||||
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
||||
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
||||
#define TIOCGPTPEER _IOR('T', 0x41, int) /* Safely open the slave */
|
||||
#define TIOCGPTPEER _IO('T', 0x41) /* Safely open the slave */
|
||||
|
||||
#define FIONCLEX 0x5450 /* these numbers need to be adjusted. */
|
||||
#define FIOCLEX 0x5451
|
||||
|
@ -100,7 +100,7 @@
|
||||
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
||||
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
||||
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
||||
#define TIOCGPTPEER _IOR('T', 0x41, int) /* Safely open the slave */
|
||||
#define TIOCGPTPEER _IO('T', 0x41) /* Safely open the slave */
|
||||
|
||||
#define TIOCSERCONFIG 0x5453
|
||||
#define TIOCSERGWILD 0x5454
|
||||
|
@ -93,7 +93,7 @@
|
||||
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
||||
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
||||
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
||||
#define TIOCGPTPEER _IOR('T', 0x41, int) /* Safely open the slave */
|
||||
#define TIOCGPTPEER _IO('T', 0x41) /* Safely open the slave */
|
||||
|
||||
#define TIOCSERCONFIG _IO('T', 83) /* 0x5453 */
|
||||
#define TIOCSERGWILD _IOR('T', 84, int) /* 0x5454 */
|
||||
|
@ -88,7 +88,7 @@
|
||||
#define TIOCGPTN _IOR('t', 134, unsigned int) /* Get Pty Number */
|
||||
#define TIOCSPTLCK _IOW('t', 135, int) /* Lock/unlock PTY */
|
||||
#define TIOCSIG _IOW('t', 136, int) /* Generate signal on Pty slave */
|
||||
#define TIOCGPTPEER _IOR('t', 137, int) /* Safely open the slave */
|
||||
#define TIOCGPTPEER _IO('t', 137) /* Safely open the slave */
|
||||
|
||||
/* Little f */
|
||||
#define FIOCLEX _IO('f', 1)
|
||||
|
@ -105,7 +105,7 @@
|
||||
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
||||
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
||||
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
||||
#define TIOCGPTPEER _IOR('T', 0x41, int) /* Safely open the slave */
|
||||
#define TIOCGPTPEER _IO('T', 0x41) /* Safely open the slave */
|
||||
|
||||
#define TIOCSERCONFIG _IO('T', 83)
|
||||
#define TIOCSERGWILD _IOR('T', 84, int)
|
||||
|
@ -448,48 +448,6 @@ err:
|
||||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
* pty_open_peer - open the peer of a pty
|
||||
* @tty: the peer of the pty being opened
|
||||
*
|
||||
* Open the cached dentry in tty->link, providing a safe way for userspace
|
||||
* to get the slave end of a pty (where they have the master fd and cannot
|
||||
* access or trust the mount namespace /dev/pts was mounted inside).
|
||||
*/
|
||||
static struct file *pty_open_peer(struct tty_struct *tty, int flags)
|
||||
{
|
||||
if (tty->driver->subtype != PTY_TYPE_MASTER)
|
||||
return ERR_PTR(-EIO);
|
||||
return dentry_open(tty->link->driver_data, flags, current_cred());
|
||||
}
|
||||
|
||||
static int pty_get_peer(struct tty_struct *tty, int flags)
|
||||
{
|
||||
int fd = -1;
|
||||
struct file *filp = NULL;
|
||||
int retval = -EINVAL;
|
||||
|
||||
fd = get_unused_fd_flags(0);
|
||||
if (fd < 0) {
|
||||
retval = fd;
|
||||
goto err;
|
||||
}
|
||||
|
||||
filp = pty_open_peer(tty, flags);
|
||||
if (IS_ERR(filp)) {
|
||||
retval = PTR_ERR(filp);
|
||||
goto err_put;
|
||||
}
|
||||
|
||||
fd_install(fd, filp);
|
||||
return fd;
|
||||
|
||||
err_put:
|
||||
put_unused_fd(fd);
|
||||
err:
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void pty_cleanup(struct tty_struct *tty)
|
||||
{
|
||||
tty_port_put(tty->port);
|
||||
@ -646,9 +604,50 @@ static inline void legacy_pty_init(void) { }
|
||||
|
||||
/* Unix98 devices */
|
||||
#ifdef CONFIG_UNIX98_PTYS
|
||||
|
||||
static struct cdev ptmx_cdev;
|
||||
|
||||
/**
|
||||
* pty_open_peer - open the peer of a pty
|
||||
* @tty: the peer of the pty being opened
|
||||
*
|
||||
* Open the cached dentry in tty->link, providing a safe way for userspace
|
||||
* to get the slave end of a pty (where they have the master fd and cannot
|
||||
* access or trust the mount namespace /dev/pts was mounted inside).
|
||||
*/
|
||||
static struct file *pty_open_peer(struct tty_struct *tty, int flags)
|
||||
{
|
||||
if (tty->driver->subtype != PTY_TYPE_MASTER)
|
||||
return ERR_PTR(-EIO);
|
||||
return dentry_open(tty->link->driver_data, flags, current_cred());
|
||||
}
|
||||
|
||||
static int pty_get_peer(struct tty_struct *tty, int flags)
|
||||
{
|
||||
int fd = -1;
|
||||
struct file *filp = NULL;
|
||||
int retval = -EINVAL;
|
||||
|
||||
fd = get_unused_fd_flags(0);
|
||||
if (fd < 0) {
|
||||
retval = fd;
|
||||
goto err;
|
||||
}
|
||||
|
||||
filp = pty_open_peer(tty, flags);
|
||||
if (IS_ERR(filp)) {
|
||||
retval = PTR_ERR(filp);
|
||||
goto err_put;
|
||||
}
|
||||
|
||||
fd_install(fd, filp);
|
||||
return fd;
|
||||
|
||||
err_put:
|
||||
put_unused_fd(fd);
|
||||
err:
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int pty_unix98_ioctl(struct tty_struct *tty,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
|
@ -619,6 +619,12 @@ static unsigned int lpuart32_tx_empty(struct uart_port *port)
|
||||
TIOCSER_TEMT : 0;
|
||||
}
|
||||
|
||||
static bool lpuart_is_32(struct lpuart_port *sport)
|
||||
{
|
||||
return sport->port.iotype == UPIO_MEM32 ||
|
||||
sport->port.iotype == UPIO_MEM32BE;
|
||||
}
|
||||
|
||||
static irqreturn_t lpuart_txint(int irq, void *dev_id)
|
||||
{
|
||||
struct lpuart_port *sport = dev_id;
|
||||
@ -627,7 +633,7 @@ static irqreturn_t lpuart_txint(int irq, void *dev_id)
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
if (sport->port.x_char) {
|
||||
if (sport->port.iotype & (UPIO_MEM32 | UPIO_MEM32BE))
|
||||
if (lpuart_is_32(sport))
|
||||
lpuart32_write(&sport->port, sport->port.x_char, UARTDATA);
|
||||
else
|
||||
writeb(sport->port.x_char, sport->port.membase + UARTDR);
|
||||
@ -635,14 +641,14 @@ static irqreturn_t lpuart_txint(int irq, void *dev_id)
|
||||
}
|
||||
|
||||
if (uart_circ_empty(xmit) || uart_tx_stopped(&sport->port)) {
|
||||
if (sport->port.iotype & (UPIO_MEM32 | UPIO_MEM32BE))
|
||||
if (lpuart_is_32(sport))
|
||||
lpuart32_stop_tx(&sport->port);
|
||||
else
|
||||
lpuart_stop_tx(&sport->port);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (sport->port.iotype & (UPIO_MEM32 | UPIO_MEM32BE))
|
||||
if (lpuart_is_32(sport))
|
||||
lpuart32_transmit_buffer(sport);
|
||||
else
|
||||
lpuart_transmit_buffer(sport);
|
||||
@ -1978,12 +1984,12 @@ static int __init lpuart_console_setup(struct console *co, char *options)
|
||||
if (options)
|
||||
uart_parse_options(options, &baud, &parity, &bits, &flow);
|
||||
else
|
||||
if (sport->port.iotype & (UPIO_MEM32 | UPIO_MEM32BE))
|
||||
if (lpuart_is_32(sport))
|
||||
lpuart32_console_get_options(sport, &baud, &parity, &bits);
|
||||
else
|
||||
lpuart_console_get_options(sport, &baud, &parity, &bits);
|
||||
|
||||
if (sport->port.iotype & (UPIO_MEM32 | UPIO_MEM32BE))
|
||||
if (lpuart_is_32(sport))
|
||||
lpuart32_setup_watermark(sport);
|
||||
else
|
||||
lpuart_setup_watermark(sport);
|
||||
@ -2118,7 +2124,7 @@ static int lpuart_probe(struct platform_device *pdev)
|
||||
}
|
||||
sport->port.irq = ret;
|
||||
sport->port.iotype = sdata->iotype;
|
||||
if (sport->port.iotype & (UPIO_MEM32 | UPIO_MEM32BE))
|
||||
if (lpuart_is_32(sport))
|
||||
sport->port.ops = &lpuart32_pops;
|
||||
else
|
||||
sport->port.ops = &lpuart_pops;
|
||||
@ -2145,7 +2151,7 @@ static int lpuart_probe(struct platform_device *pdev)
|
||||
|
||||
platform_set_drvdata(pdev, &sport->port);
|
||||
|
||||
if (sport->port.iotype & (UPIO_MEM32 | UPIO_MEM32BE))
|
||||
if (lpuart_is_32(sport))
|
||||
lpuart_reg.cons = LPUART32_CONSOLE;
|
||||
else
|
||||
lpuart_reg.cons = LPUART_CONSOLE;
|
||||
@ -2198,7 +2204,7 @@ static int lpuart_suspend(struct device *dev)
|
||||
struct lpuart_port *sport = dev_get_drvdata(dev);
|
||||
unsigned long temp;
|
||||
|
||||
if (sport->port.iotype & (UPIO_MEM32 | UPIO_MEM32BE)) {
|
||||
if (lpuart_is_32(sport)) {
|
||||
/* disable Rx/Tx and interrupts */
|
||||
temp = lpuart32_read(&sport->port, UARTCTRL);
|
||||
temp &= ~(UARTCTRL_TE | UARTCTRL_TIE | UARTCTRL_TCIE);
|
||||
@ -2249,7 +2255,7 @@ static int lpuart_resume(struct device *dev)
|
||||
if (sport->port.suspended && !sport->port.irq_wake)
|
||||
clk_prepare_enable(sport->clk);
|
||||
|
||||
if (sport->port.iotype & (UPIO_MEM32 | UPIO_MEM32BE)) {
|
||||
if (lpuart_is_32(sport)) {
|
||||
lpuart32_setup_watermark(sport);
|
||||
temp = lpuart32_read(&sport->port, UARTCTRL);
|
||||
temp |= (UARTCTRL_RIE | UARTCTRL_TIE | UARTCTRL_RE |
|
||||
|
@ -186,11 +186,6 @@
|
||||
|
||||
#define UART_NR 8
|
||||
|
||||
/* RX DMA buffer periods */
|
||||
#define RX_DMA_PERIODS 4
|
||||
#define RX_BUF_SIZE (PAGE_SIZE)
|
||||
|
||||
|
||||
/* i.MX21 type uart runs on all i.mx except i.MX1 and i.MX6q */
|
||||
enum imx_uart_type {
|
||||
IMX1_UART,
|
||||
@ -226,7 +221,6 @@ struct imx_port {
|
||||
struct dma_chan *dma_chan_rx, *dma_chan_tx;
|
||||
struct scatterlist rx_sgl, tx_sgl[2];
|
||||
void *rx_buf;
|
||||
unsigned int rx_buf_size;
|
||||
struct circ_buf rx_ring;
|
||||
unsigned int rx_periods;
|
||||
dma_cookie_t rx_cookie;
|
||||
@ -464,7 +458,7 @@ static inline void imx_transmit_buffer(struct imx_port *sport)
|
||||
}
|
||||
}
|
||||
|
||||
while (!uart_circ_empty(xmit) &&
|
||||
while (!uart_circ_empty(xmit) && !sport->dma_is_txing &&
|
||||
!(readl(sport->port.membase + uts_reg(sport)) & UTS_TXFULL)) {
|
||||
/* send xmit->buf[xmit->tail]
|
||||
* out the port here */
|
||||
@ -967,6 +961,8 @@ static void imx_timeout(unsigned long data)
|
||||
}
|
||||
}
|
||||
|
||||
#define RX_BUF_SIZE (PAGE_SIZE)
|
||||
|
||||
/*
|
||||
* There are two kinds of RX DMA interrupts(such as in the MX6Q):
|
||||
* [1] the RX DMA buffer is full.
|
||||
@ -1049,6 +1045,9 @@ static void dma_rx_callback(void *data)
|
||||
}
|
||||
}
|
||||
|
||||
/* RX DMA buffer periods */
|
||||
#define RX_DMA_PERIODS 4
|
||||
|
||||
static int start_rx_dma(struct imx_port *sport)
|
||||
{
|
||||
struct scatterlist *sgl = &sport->rx_sgl;
|
||||
@ -1059,8 +1058,9 @@ static int start_rx_dma(struct imx_port *sport)
|
||||
|
||||
sport->rx_ring.head = 0;
|
||||
sport->rx_ring.tail = 0;
|
||||
sport->rx_periods = RX_DMA_PERIODS;
|
||||
|
||||
sg_init_one(sgl, sport->rx_buf, sport->rx_buf_size);
|
||||
sg_init_one(sgl, sport->rx_buf, RX_BUF_SIZE);
|
||||
ret = dma_map_sg(dev, sgl, 1, DMA_FROM_DEVICE);
|
||||
if (ret == 0) {
|
||||
dev_err(dev, "DMA mapping error for RX.\n");
|
||||
@ -1171,7 +1171,7 @@ static int imx_uart_dma_init(struct imx_port *sport)
|
||||
goto err;
|
||||
}
|
||||
|
||||
sport->rx_buf = kzalloc(sport->rx_buf_size, GFP_KERNEL);
|
||||
sport->rx_buf = kzalloc(PAGE_SIZE, GFP_KERNEL);
|
||||
if (!sport->rx_buf) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
@ -2036,7 +2036,6 @@ static int serial_imx_probe_dt(struct imx_port *sport,
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
int ret;
|
||||
u32 dma_buf_size[2];
|
||||
|
||||
sport->devdata = of_device_get_match_data(&pdev->dev);
|
||||
if (!sport->devdata)
|
||||
@ -2060,14 +2059,6 @@ static int serial_imx_probe_dt(struct imx_port *sport,
|
||||
if (of_get_property(np, "rts-gpios", NULL))
|
||||
sport->have_rtsgpio = 1;
|
||||
|
||||
if (!of_property_read_u32_array(np, "fsl,dma-size", dma_buf_size, 2)) {
|
||||
sport->rx_buf_size = dma_buf_size[0] * dma_buf_size[1];
|
||||
sport->rx_periods = dma_buf_size[1];
|
||||
} else {
|
||||
sport->rx_buf_size = RX_BUF_SIZE;
|
||||
sport->rx_periods = RX_DMA_PERIODS;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
|
@ -1085,10 +1085,12 @@ static ssize_t rx_trigger_store(struct device *dev,
|
||||
{
|
||||
struct uart_port *port = dev_get_drvdata(dev);
|
||||
struct sci_port *sci = to_sci_port(port);
|
||||
int ret;
|
||||
long r;
|
||||
|
||||
if (kstrtol(buf, 0, &r) == -EINVAL)
|
||||
return -EINVAL;
|
||||
ret = kstrtol(buf, 0, &r);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
sci->rx_trigger = scif_set_rtrg(port, r);
|
||||
if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
|
||||
@ -1116,10 +1118,12 @@ static ssize_t rx_fifo_timeout_store(struct device *dev,
|
||||
{
|
||||
struct uart_port *port = dev_get_drvdata(dev);
|
||||
struct sci_port *sci = to_sci_port(port);
|
||||
int ret;
|
||||
long r;
|
||||
|
||||
if (kstrtol(buf, 0, &r) == -EINVAL)
|
||||
return -EINVAL;
|
||||
ret = kstrtol(buf, 0, &r);
|
||||
if (ret)
|
||||
return ret;
|
||||
sci->rx_fifo_timeout = r;
|
||||
scif_set_rtrg(port, 1);
|
||||
if (r > 0)
|
||||
|
@ -758,6 +758,7 @@ static int asc_init_port(struct asc_port *ascport,
|
||||
if (IS_ERR(ascport->pinctrl)) {
|
||||
ret = PTR_ERR(ascport->pinctrl);
|
||||
dev_err(&pdev->dev, "Failed to get Pinctrl: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ascport->states[DEFAULT] =
|
||||
|
@ -77,7 +77,7 @@
|
||||
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
||||
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
||||
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
||||
#define TIOCGPTPEER _IOR('T', 0x41, int) /* Safely open the slave */
|
||||
#define TIOCGPTPEER _IO('T', 0x41) /* Safely open the slave */
|
||||
|
||||
#define FIONCLEX 0x5450
|
||||
#define FIOCLEX 0x5451
|
||||
|
Loading…
Reference in New Issue
Block a user