Commit 3f667b5d authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull tty/serial fixes from Greg KH:
 "Here are two small tty/serial fixes for 5.16-rc6.  They include:

   - n_hdlc fix for syzbot reported problem that you were previously
     copied on.

   - 8250_fintek driver fix that resolved a console problem by removing
     a previous change.

  Both have been in linux-next with no reported issues"

* tag 'tty-5.16-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty:
  serial: 8250_fintek: Fix garbled text for console
  tty: n_hdlc: make n_hdlc_tty_wakeup() asynchronous
parents fb7d0829 6c33ff72
Loading
Loading
Loading
Loading
+22 −1
Original line number Diff line number Diff line
@@ -140,6 +140,8 @@ struct n_hdlc {
	struct n_hdlc_buf_list	rx_buf_list;
	struct n_hdlc_buf_list	tx_free_buf_list;
	struct n_hdlc_buf_list	rx_free_buf_list;
	struct work_struct	write_work;
	struct tty_struct	*tty_for_write_work;
};

/*
@@ -154,6 +156,7 @@ static struct n_hdlc_buf *n_hdlc_buf_get(struct n_hdlc_buf_list *list);
/* Local functions */

static struct n_hdlc *n_hdlc_alloc(void);
static void n_hdlc_tty_write_work(struct work_struct *work);

/* max frame size for memory allocations */
static int maxframe = 4096;
@@ -210,6 +213,8 @@ static void n_hdlc_tty_close(struct tty_struct *tty)
	wake_up_interruptible(&tty->read_wait);
	wake_up_interruptible(&tty->write_wait);

	cancel_work_sync(&n_hdlc->write_work);

	n_hdlc_free_buf_list(&n_hdlc->rx_free_buf_list);
	n_hdlc_free_buf_list(&n_hdlc->tx_free_buf_list);
	n_hdlc_free_buf_list(&n_hdlc->rx_buf_list);
@@ -241,6 +246,8 @@ static int n_hdlc_tty_open(struct tty_struct *tty)
		return -ENFILE;
	}

	INIT_WORK(&n_hdlc->write_work, n_hdlc_tty_write_work);
	n_hdlc->tty_for_write_work = tty;
	tty->disc_data = n_hdlc;
	tty->receive_room = 65536;

@@ -334,6 +341,20 @@ static void n_hdlc_send_frames(struct n_hdlc *n_hdlc, struct tty_struct *tty)
		goto check_again;
}	/* end of n_hdlc_send_frames() */

/**
 * n_hdlc_tty_write_work - Asynchronous callback for transmit wakeup
 * @work: pointer to work_struct
 *
 * Called when low level device driver can accept more send data.
 */
static void n_hdlc_tty_write_work(struct work_struct *work)
{
	struct n_hdlc *n_hdlc = container_of(work, struct n_hdlc, write_work);
	struct tty_struct *tty = n_hdlc->tty_for_write_work;

	n_hdlc_send_frames(n_hdlc, tty);
}	/* end of n_hdlc_tty_write_work() */

/**
 * n_hdlc_tty_wakeup - Callback for transmit wakeup
 * @tty: pointer to associated tty instance data
@@ -344,7 +365,7 @@ static void n_hdlc_tty_wakeup(struct tty_struct *tty)
{
	struct n_hdlc *n_hdlc = tty->disc_data;

	n_hdlc_send_frames(n_hdlc, tty);
	schedule_work(&n_hdlc->write_work);
}	/* end of n_hdlc_tty_wakeup() */

/**
+0 −20
Original line number Diff line number Diff line
@@ -290,25 +290,6 @@ static void fintek_8250_set_max_fifo(struct fintek_8250 *pdata)
	}
}

static void fintek_8250_goto_highspeed(struct uart_8250_port *uart,
			      struct fintek_8250 *pdata)
{
	sio_write_reg(pdata, LDN, pdata->index);

	switch (pdata->pid) {
	case CHIP_ID_F81966:
	case CHIP_ID_F81866: /* set uart clock for high speed serial mode */
		sio_write_mask_reg(pdata, F81866_UART_CLK,
			F81866_UART_CLK_MASK,
			F81866_UART_CLK_14_769MHZ);

		uart->port.uartclk = 921600 * 16;
		break;
	default: /* leave clock speed untouched */
		break;
	}
}

static void fintek_8250_set_termios(struct uart_port *port,
				    struct ktermios *termios,
				    struct ktermios *old)
@@ -430,7 +411,6 @@ static int probe_setup_port(struct fintek_8250 *pdata,

				fintek_8250_set_irq_mode(pdata, level_mode);
				fintek_8250_set_max_fifo(pdata);
				fintek_8250_goto_highspeed(uart, pdata);

				fintek_8250_exit_key(addr[i]);