Skip to content

Commit

Permalink
Merge tag 'tty-4.13-rc2' of git://git.kernel.org/pub/scm/linux/kernel…
Browse files Browse the repository at this point in the history
…/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
  • Loading branch information
Linus Torvalds committed Jul 22, 2017
2 parents dedaff2 + c632517 commit ae75d1a
Show file tree
Hide file tree
Showing 14 changed files with 83 additions and 84 deletions.
2 changes: 0 additions & 2 deletions Documentation/devicetree/bindings/serial/fsl-imx-uart.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -29,5 +28,4 @@ uart1: serial@73fbc000 {
interrupts = <31>;
uart-has-rtscts;
fsl,dte-mode;
fsl,dma-size = <1024 4>;
};
2 changes: 1 addition & 1 deletion arch/alpha/include/uapi/asm/ioctls.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion arch/mips/include/uapi/asm/ioctls.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion arch/parisc/include/uapi/asm/ioctls.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion arch/powerpc/include/uapi/asm/ioctls.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion arch/sh/include/uapi/asm/ioctls.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion arch/sparc/include/uapi/asm/ioctls.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion arch/xtensa/include/uapi/asm/ioctls.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
85 changes: 42 additions & 43 deletions drivers/tty/pty.c
Original file line number Diff line number Diff line change
Expand Up @@ -448,48 +448,6 @@ static int pty_common_install(struct tty_driver *driver, struct tty_struct *tty,
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);
Expand Down Expand Up @@ -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)
{
Expand Down
24 changes: 15 additions & 9 deletions drivers/tty/serial/fsl_lpuart.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -627,22 +633,22 @@ 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);
goto out;
}

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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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 |
Expand Down
27 changes: 9 additions & 18 deletions drivers/tty/serial/imx.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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;
Expand All @@ -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");
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand Down
12 changes: 8 additions & 4 deletions drivers/tty/serial/sh-sci.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions drivers/tty/serial/st-asc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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] =
Expand Down
Loading

0 comments on commit ae75d1a

Please sign in to comment.