aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/char/nozomi.c34
1 files changed, 12 insertions, 22 deletions
diff --git a/drivers/char/nozomi.c b/drivers/char/nozomi.c
index cd405bcf53a6..fac9157a0ec0 100644
--- a/drivers/char/nozomi.c
+++ b/drivers/char/nozomi.c
@@ -1693,15 +1693,7 @@ static int ntty_write(struct tty_struct *tty, const unsigned char *buffer,
1693 if (!dc || !port) 1693 if (!dc || !port)
1694 return -ENODEV; 1694 return -ENODEV;
1695 1695
1696 if (unlikely(!mutex_trylock(&port->tty_sem))) { 1696 mutex_lock(&port->tty_sem);
1697 /*
1698 * must test lock as tty layer wraps calls
1699 * to this function with BKL
1700 */
1701 dev_err(&dc->pdev->dev, "Would have deadlocked - "
1702 "return EAGAIN\n");
1703 return -EAGAIN;
1704 }
1705 1697
1706 if (unlikely(!port->port.count)) { 1698 if (unlikely(!port->port.count)) {
1707 DBG1(" "); 1699 DBG1(" ");
@@ -1741,25 +1733,23 @@ exit:
1741 * This method is called by the upper tty layer. 1733 * This method is called by the upper tty layer.
1742 * #according to sources N_TTY.c it expects a value >= 0 and 1734 * #according to sources N_TTY.c it expects a value >= 0 and
1743 * does not check for negative values. 1735 * does not check for negative values.
1736 *
1737 * If the port is unplugged report lots of room and let the bits
1738 * dribble away so we don't block anything.
1744 */ 1739 */
1745static int ntty_write_room(struct tty_struct *tty) 1740static int ntty_write_room(struct tty_struct *tty)
1746{ 1741{
1747 struct port *port = tty->driver_data; 1742 struct port *port = tty->driver_data;
1748 int room = 0; 1743 int room = 4096;
1749 const struct nozomi *dc = get_dc_by_tty(tty); 1744 const struct nozomi *dc = get_dc_by_tty(tty);
1750 1745
1751 if (!dc || !port) 1746 if (dc) {
1752 return 0; 1747 mutex_lock(&port->tty_sem);
1753 if (!mutex_trylock(&port->tty_sem)) 1748 if (port->port.count)
1754 return 0; 1749 room = port->fifo_ul.size -
1755 1750 kfifo_len(&port->fifo_ul);
1756 if (!port->port.count) 1751 mutex_unlock(&port->tty_sem);
1757 goto exit; 1752 }
1758
1759 room = port->fifo_ul.size - kfifo_len(&port->fifo_ul);
1760
1761exit:
1762 mutex_unlock(&port->tty_sem);
1763 return room; 1753 return room;
1764} 1754}
1765 1755