|
@@ -667,30 +667,21 @@ static int pop_tx_x(struct eg20t_port *priv, unsigned char *buf)
|
|
|
|
|
|
static int dma_push_rx(struct eg20t_port *priv, int size)
|
|
static int dma_push_rx(struct eg20t_port *priv, int size)
|
|
{
|
|
{
|
|
- struct tty_struct *tty;
|
|
|
|
int room;
|
|
int room;
|
|
struct uart_port *port = &priv->port;
|
|
struct uart_port *port = &priv->port;
|
|
struct tty_port *tport = &port->state->port;
|
|
struct tty_port *tport = &port->state->port;
|
|
|
|
|
|
- port = &priv->port;
|
|
|
|
- tty = tty_port_tty_get(tport);
|
|
|
|
- if (!tty) {
|
|
|
|
- dev_dbg(priv->port.dev, "%s:tty is busy now", __func__);
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
room = tty_buffer_request_room(tport, size);
|
|
room = tty_buffer_request_room(tport, size);
|
|
|
|
|
|
if (room < size)
|
|
if (room < size)
|
|
dev_warn(port->dev, "Rx overrun: dropping %u bytes\n",
|
|
dev_warn(port->dev, "Rx overrun: dropping %u bytes\n",
|
|
size - room);
|
|
size - room);
|
|
if (!room)
|
|
if (!room)
|
|
- return room;
|
|
|
|
|
|
+ return 0;
|
|
|
|
|
|
tty_insert_flip_string(tport, sg_virt(&priv->sg_rx), size);
|
|
tty_insert_flip_string(tport, sg_virt(&priv->sg_rx), size);
|
|
|
|
|
|
port->icount.rx += room;
|
|
port->icount.rx += room;
|
|
- tty_kref_put(tty);
|
|
|
|
|
|
|
|
return room;
|
|
return room;
|
|
}
|
|
}
|
|
@@ -1098,6 +1089,8 @@ static void pch_uart_err_ir(struct eg20t_port *priv, unsigned int lsr)
|
|
if (tty == NULL) {
|
|
if (tty == NULL) {
|
|
for (i = 0; error_msg[i] != NULL; i++)
|
|
for (i = 0; error_msg[i] != NULL; i++)
|
|
dev_err(&priv->pdev->dev, error_msg[i]);
|
|
dev_err(&priv->pdev->dev, error_msg[i]);
|
|
|
|
+ } else {
|
|
|
|
+ tty_kref_put(tty);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|