summaryrefslogtreecommitdiff
path: root/drivers/tty
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-10-26 01:10:24 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-10-26 01:10:23 -0700
commit7269d7991e1c2ed1add0714f6b3203d8647db4e9 (patch)
tree803fb5054ebe8cfd5aa4f73333c1dd5ae3d1568f /drivers/tty
parente76e6c8d9389f1123869451b6af46b0b03420d28 (diff)
parentb663776b59caf5b9ed14693fec01fa9a47a907b7 (diff)
Merge "msm_serial_hs: Add defensive checks due to sudden port close"
Diffstat (limited to 'drivers/tty')
-rw-r--r--drivers/tty/serial/msm_serial_hs.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/drivers/tty/serial/msm_serial_hs.c b/drivers/tty/serial/msm_serial_hs.c
index ec9288791667..f0d5c96ac2e0 100644
--- a/drivers/tty/serial/msm_serial_hs.c
+++ b/drivers/tty/serial/msm_serial_hs.c
@@ -1596,6 +1596,16 @@ static void flip_insert_work(struct work_struct *work)
struct tty_struct *tty = msm_uport->uport.state->port.tty;
spin_lock_irqsave(&msm_uport->uport.lock, flags);
+ if (!tty || msm_uport->rx.flush == FLUSH_SHUTDOWN) {
+ dev_err(msm_uport->uport.dev,
+ "%s:Invalid driver state flush %d\n",
+ __func__, msm_uport->rx.flush);
+ MSM_HS_ERR("%s:Invalid driver state flush %d\n",
+ __func__, msm_uport->rx.flush);
+ spin_unlock_irqrestore(&msm_uport->uport.lock, flags);
+ return;
+ }
+
if (msm_uport->rx.buffer_pending == NONE_PENDING) {
MSM_HS_ERR("Error: No buffer pending in %s", __func__);
spin_unlock_irqrestore(&msm_uport->uport.lock, flags);
@@ -1668,6 +1678,16 @@ static void msm_serial_hs_rx_work(struct kthread_work *work)
spin_lock_irqsave(&uport->lock, flags);
+ if (!tty || rx->flush == FLUSH_SHUTDOWN) {
+ dev_err(uport->dev, "%s:Invalid driver state flush %d\n",
+ __func__, rx->flush);
+ MSM_HS_ERR("%s:Invalid driver state flush %d\n",
+ __func__, rx->flush);
+ spin_unlock_irqrestore(&uport->lock, flags);
+ msm_hs_resource_unvote(msm_uport);
+ return;
+ }
+
/*
* Process all pending descs or if nothing is
* queued - called from termios
@@ -3664,12 +3684,12 @@ static void msm_hs_shutdown(struct uart_port *uport)
if (msm_uport->rx.flush != FLUSH_SHUTDOWN) {
/* disable and disconnect rx */
- msm_hs_disconnect_rx(uport);
ret = wait_event_timeout(msm_uport->rx.wait,
- msm_uport->rx.flush == FLUSH_SHUTDOWN, 500);
+ !msm_uport->rx.pending_flag, 500);
if (!ret)
MSM_HS_WARN("%s(): rx disconnect not complete",
__func__);
+ msm_hs_disconnect_rx(uport);
}
cancel_delayed_work_sync(&msm_uport->rx.flip_insert_work);