提交 e22a15d1 编写于 作者: L Linus Torvalds

Merge tag 'tty-5.0-rc6' 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 fixes for 5.0-rc6.

  Nothing huge, just a few small fixes for reported issues. The speakup
  fix is in here as it is a tty operation issue.

  All of these have been in linux-next for a while with no reported
  problems"

* tag 'tty-5.0-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty:
  serial: fix race between flush_to_ldisc and tty_open
  staging: speakup: fix tty-operation NULL derefs
  serial: sh-sci: Do not free irqs that have already been freed
  serial: 8250_pci: Make PCI class test non fatal
  tty: serial: 8250_mtk: Fix potential NULL pointer dereference
...@@ -265,7 +265,8 @@ static void spk_ttyio_send_xchar(char ch) ...@@ -265,7 +265,8 @@ static void spk_ttyio_send_xchar(char ch)
return; return;
} }
speakup_tty->ops->send_xchar(speakup_tty, ch); if (speakup_tty->ops->send_xchar)
speakup_tty->ops->send_xchar(speakup_tty, ch);
mutex_unlock(&speakup_tty_mutex); mutex_unlock(&speakup_tty_mutex);
} }
...@@ -277,7 +278,8 @@ static void spk_ttyio_tiocmset(unsigned int set, unsigned int clear) ...@@ -277,7 +278,8 @@ static void spk_ttyio_tiocmset(unsigned int set, unsigned int clear)
return; return;
} }
speakup_tty->ops->tiocmset(speakup_tty, set, clear); if (speakup_tty->ops->tiocmset)
speakup_tty->ops->tiocmset(speakup_tty, set, clear);
mutex_unlock(&speakup_tty_mutex); mutex_unlock(&speakup_tty_mutex);
} }
......
...@@ -357,6 +357,9 @@ static int mtk8250_probe_of(struct platform_device *pdev, struct uart_port *p, ...@@ -357,6 +357,9 @@ static int mtk8250_probe_of(struct platform_device *pdev, struct uart_port *p,
if (dmacnt == 2) { if (dmacnt == 2) {
data->dma = devm_kzalloc(&pdev->dev, sizeof(*data->dma), data->dma = devm_kzalloc(&pdev->dev, sizeof(*data->dma),
GFP_KERNEL); GFP_KERNEL);
if (!data->dma)
return -ENOMEM;
data->dma->fn = mtk8250_dma_filter; data->dma->fn = mtk8250_dma_filter;
data->dma->rx_size = MTK_UART_RX_SIZE; data->dma->rx_size = MTK_UART_RX_SIZE;
data->dma->rxconf.src_maxburst = MTK_UART_RX_TRIGGER; data->dma->rxconf.src_maxburst = MTK_UART_RX_TRIGGER;
......
...@@ -3420,6 +3420,11 @@ static int ...@@ -3420,6 +3420,11 @@ static int
serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board) serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board)
{ {
int num_iomem, num_port, first_port = -1, i; int num_iomem, num_port, first_port = -1, i;
int rc;
rc = serial_pci_is_class_communication(dev);
if (rc)
return rc;
/* /*
* Should we try to make guesses for multiport serial devices later? * Should we try to make guesses for multiport serial devices later?
...@@ -3647,10 +3652,6 @@ pciserial_init_one(struct pci_dev *dev, const struct pci_device_id *ent) ...@@ -3647,10 +3652,6 @@ pciserial_init_one(struct pci_dev *dev, const struct pci_device_id *ent)
board = &pci_boards[ent->driver_data]; board = &pci_boards[ent->driver_data];
rc = serial_pci_is_class_communication(dev);
if (rc)
return rc;
rc = serial_pci_is_blacklisted(dev); rc = serial_pci_is_blacklisted(dev);
if (rc) if (rc)
return rc; return rc;
......
...@@ -130,6 +130,9 @@ static void uart_start(struct tty_struct *tty) ...@@ -130,6 +130,9 @@ static void uart_start(struct tty_struct *tty)
struct uart_port *port; struct uart_port *port;
unsigned long flags; unsigned long flags;
if (!state)
return;
port = uart_port_lock(state, flags); port = uart_port_lock(state, flags);
__uart_start(tty); __uart_start(tty);
uart_port_unlock(port, flags); uart_port_unlock(port, flags);
...@@ -727,6 +730,9 @@ static void uart_unthrottle(struct tty_struct *tty) ...@@ -727,6 +730,9 @@ static void uart_unthrottle(struct tty_struct *tty)
upstat_t mask = UPSTAT_SYNC_FIFO; upstat_t mask = UPSTAT_SYNC_FIFO;
struct uart_port *port; struct uart_port *port;
if (!state)
return;
port = uart_port_ref(state); port = uart_port_ref(state);
if (!port) if (!port)
return; return;
......
...@@ -1921,7 +1921,7 @@ static int sci_request_irq(struct sci_port *port) ...@@ -1921,7 +1921,7 @@ static int sci_request_irq(struct sci_port *port)
static void sci_free_irq(struct sci_port *port) static void sci_free_irq(struct sci_port *port)
{ {
int i; int i, j;
/* /*
* Intentionally in reverse order so we iterate over the muxed * Intentionally in reverse order so we iterate over the muxed
...@@ -1937,6 +1937,13 @@ static void sci_free_irq(struct sci_port *port) ...@@ -1937,6 +1937,13 @@ static void sci_free_irq(struct sci_port *port)
if (unlikely(irq < 0)) if (unlikely(irq < 0))
continue; continue;
/* Check if already freed (irq was muxed) */
for (j = 0; j < i; j++)
if (port->irqs[j] == irq)
j = i + 1;
if (j > i)
continue;
free_irq(port->irqs[i], port); free_irq(port->irqs[i], port);
kfree(port->irqstr[i]); kfree(port->irqstr[i]);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册