TTY: switch tty_schedule_flip
Now, we start converting tty buffer functions to actually use tty_port. This will allow us to get rid of the need of tty in many call sites. Only tty_port will needed and hence no more tty_port_tty_get in those paths. This is the last one: tty_schedule_flip Signed-off-by: Jiri Slaby <jslaby@suse.cz> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
2e124b4a39
Коммит
6732c8bb86
|
@ -44,9 +44,8 @@ typedef union _srmcons_result {
|
|||
|
||||
/* called with callback_lock held */
|
||||
static int
|
||||
srmcons_do_receive_chars(struct tty_struct *tty)
|
||||
srmcons_do_receive_chars(struct tty_port *port)
|
||||
{
|
||||
struct tty_port *port = tty->port;
|
||||
srmcons_result result;
|
||||
int count = 0, loops = 0;
|
||||
|
||||
|
@ -59,7 +58,7 @@ srmcons_do_receive_chars(struct tty_struct *tty)
|
|||
} while((result.bits.status & 1) && (++loops < 10));
|
||||
|
||||
if (count)
|
||||
tty_schedule_flip(tty);
|
||||
tty_schedule_flip(port);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
@ -74,7 +73,7 @@ srmcons_receive_chars(unsigned long data)
|
|||
|
||||
local_irq_save(flags);
|
||||
if (spin_trylock(&srmcons_callback_lock)) {
|
||||
if (!srmcons_do_receive_chars(port->tty))
|
||||
if (!srmcons_do_receive_chars(port))
|
||||
incr = 100;
|
||||
spin_unlock(&srmcons_callback_lock);
|
||||
}
|
||||
|
@ -89,7 +88,7 @@ srmcons_receive_chars(unsigned long data)
|
|||
|
||||
/* called with callback_lock held */
|
||||
static int
|
||||
srmcons_do_write(struct tty_struct *tty, const char *buf, int count)
|
||||
srmcons_do_write(struct tty_port *port, const char *buf, int count)
|
||||
{
|
||||
static char str_cr[1] = "\r";
|
||||
long c, remaining = count;
|
||||
|
@ -114,10 +113,10 @@ srmcons_do_write(struct tty_struct *tty, const char *buf, int count)
|
|||
cur += result.bits.c;
|
||||
|
||||
/*
|
||||
* Check for pending input iff a tty was provided
|
||||
* Check for pending input iff a tty port was provided
|
||||
*/
|
||||
if (tty)
|
||||
srmcons_do_receive_chars(tty);
|
||||
if (port)
|
||||
srmcons_do_receive_chars(port);
|
||||
}
|
||||
|
||||
while (need_cr) {
|
||||
|
@ -136,7 +135,7 @@ srmcons_write(struct tty_struct *tty,
|
|||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&srmcons_callback_lock, flags);
|
||||
srmcons_do_write(tty, (const char *) buf, count);
|
||||
srmcons_do_write(tty->port, (const char *) buf, count);
|
||||
spin_unlock_irqrestore(&srmcons_callback_lock, flags);
|
||||
|
||||
return count;
|
||||
|
|
|
@ -43,22 +43,14 @@ int kbd_ioctl(struct kbd_data *, unsigned int, unsigned long);
|
|||
static inline void
|
||||
kbd_put_queue(struct tty_port *port, int ch)
|
||||
{
|
||||
struct tty_struct *tty = tty_port_tty_get(port);
|
||||
if (!tty)
|
||||
return;
|
||||
tty_insert_flip_char(port, ch, 0);
|
||||
tty_schedule_flip(tty);
|
||||
tty_kref_put(tty);
|
||||
tty_schedule_flip(port);
|
||||
}
|
||||
|
||||
static inline void
|
||||
kbd_puts_queue(struct tty_port *port, char *cp)
|
||||
{
|
||||
struct tty_struct *tty = tty_port_tty_get(port);
|
||||
if (!tty)
|
||||
return;
|
||||
while (*cp)
|
||||
tty_insert_flip_char(port, *cp++, 0);
|
||||
tty_schedule_flip(tty);
|
||||
tty_kref_put(tty);
|
||||
tty_schedule_flip(port);
|
||||
}
|
||||
|
|
|
@ -356,7 +356,6 @@ static void qt_read_bulk_callback(struct urb *urb)
|
|||
struct usb_serial_port *port = urb->context;
|
||||
struct usb_serial *serial = get_usb_serial(port, __func__);
|
||||
struct quatech_port *qt_port = qt_get_port_private(port);
|
||||
struct tty_struct *tty;
|
||||
int result;
|
||||
|
||||
if (urb->status) {
|
||||
|
@ -367,27 +366,23 @@ static void qt_read_bulk_callback(struct urb *urb)
|
|||
return;
|
||||
}
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (!tty)
|
||||
return;
|
||||
|
||||
dev_dbg(&port->dev,
|
||||
"%s - port->RxHolding = %d\n", __func__, qt_port->RxHolding);
|
||||
|
||||
if (port_paranoia_check(port, __func__) != 0) {
|
||||
qt_port->ReadBulkStopped = 1;
|
||||
goto exit;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!serial)
|
||||
goto exit;
|
||||
return;
|
||||
|
||||
if (qt_port->closePending == 1) {
|
||||
/* Were closing , stop reading */
|
||||
dev_dbg(&port->dev,
|
||||
"%s - (qt_port->closepending == 1\n", __func__);
|
||||
qt_port->ReadBulkStopped = 1;
|
||||
goto exit;
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -397,7 +392,7 @@ static void qt_read_bulk_callback(struct urb *urb)
|
|||
*/
|
||||
if (qt_port->RxHolding == 1) {
|
||||
qt_port->ReadBulkStopped = 1;
|
||||
goto exit;
|
||||
return;
|
||||
}
|
||||
|
||||
if (urb->status) {
|
||||
|
@ -406,7 +401,7 @@ static void qt_read_bulk_callback(struct urb *urb)
|
|||
dev_dbg(&port->dev,
|
||||
"%s - nonzero read bulk status received: %d\n",
|
||||
__func__, urb->status);
|
||||
goto exit;
|
||||
return;
|
||||
}
|
||||
|
||||
if (urb->actual_length)
|
||||
|
@ -427,13 +422,11 @@ static void qt_read_bulk_callback(struct urb *urb)
|
|||
else {
|
||||
if (urb->actual_length) {
|
||||
tty_flip_buffer_push(&port->port);
|
||||
tty_schedule_flip(tty);
|
||||
tty_schedule_flip(&port->port);
|
||||
}
|
||||
}
|
||||
|
||||
schedule_work(&port->work);
|
||||
exit:
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -441,7 +441,6 @@ static void cyy_chip_rx(struct cyclades_card *cinfo, int chip,
|
|||
void __iomem *base_addr)
|
||||
{
|
||||
struct cyclades_port *info;
|
||||
struct tty_struct *tty;
|
||||
struct tty_port *port;
|
||||
int len, index = cinfo->bus_index;
|
||||
u8 ivr, save_xir, channel, save_car, data, char_count;
|
||||
|
@ -458,18 +457,6 @@ static void cyy_chip_rx(struct cyclades_card *cinfo, int chip,
|
|||
cyy_writeb(info, CyCAR, save_xir);
|
||||
ivr = cyy_readb(info, CyRIVR) & CyIVRMask;
|
||||
|
||||
tty = tty_port_tty_get(port);
|
||||
/* if there is nowhere to put the data, discard it */
|
||||
if (tty == NULL) {
|
||||
if (ivr == CyIVRRxEx) { /* exception */
|
||||
data = cyy_readb(info, CyRDSR);
|
||||
} else { /* normal character reception */
|
||||
char_count = cyy_readb(info, CyRDCR);
|
||||
while (char_count--)
|
||||
data = cyy_readb(info, CyRDSR);
|
||||
}
|
||||
goto end;
|
||||
}
|
||||
/* there is an open port for this data */
|
||||
if (ivr == CyIVRRxEx) { /* exception */
|
||||
data = cyy_readb(info, CyRDSR);
|
||||
|
@ -486,7 +473,6 @@ static void cyy_chip_rx(struct cyclades_card *cinfo, int chip,
|
|||
|
||||
if (data & info->ignore_status_mask) {
|
||||
info->icount.rx++;
|
||||
tty_kref_put(tty);
|
||||
return;
|
||||
}
|
||||
if (tty_buffer_request_room(port, 1)) {
|
||||
|
@ -496,8 +482,14 @@ static void cyy_chip_rx(struct cyclades_card *cinfo, int chip,
|
|||
cyy_readb(info, CyRDSR),
|
||||
TTY_BREAK);
|
||||
info->icount.rx++;
|
||||
if (port->flags & ASYNC_SAK)
|
||||
do_SAK(tty);
|
||||
if (port->flags & ASYNC_SAK) {
|
||||
struct tty_struct *tty =
|
||||
tty_port_tty_get(port);
|
||||
if (tty) {
|
||||
do_SAK(tty);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
}
|
||||
} else if (data & CyFRAME) {
|
||||
tty_insert_flip_char(port,
|
||||
cyy_readb(info, CyRDSR),
|
||||
|
@ -566,9 +558,8 @@ static void cyy_chip_rx(struct cyclades_card *cinfo, int chip,
|
|||
}
|
||||
info->idle_stats.recv_idle = jiffies;
|
||||
}
|
||||
tty_schedule_flip(tty);
|
||||
tty_kref_put(tty);
|
||||
end:
|
||||
tty_schedule_flip(port);
|
||||
|
||||
/* end of service */
|
||||
cyy_writeb(info, CyRIR, save_xir & 0x3f);
|
||||
cyy_writeb(info, CyCAR, save_car);
|
||||
|
@ -1012,7 +1003,7 @@ static void cyz_handle_rx(struct cyclades_port *info, struct tty_struct *tty)
|
|||
jiffies + 1);
|
||||
#endif
|
||||
info->idle_stats.recv_idle = jiffies;
|
||||
tty_schedule_flip(tty);
|
||||
tty_schedule_flip(&info->port);
|
||||
}
|
||||
/* Update rx_get */
|
||||
cy_writel(&buf_ctrl->rx_get, new_rx_get);
|
||||
|
@ -1191,7 +1182,7 @@ static void cyz_handle_cmd(struct cyclades_card *cinfo)
|
|||
if (delta_count)
|
||||
wake_up_interruptible(&info->port.delta_msr_wait);
|
||||
if (special_count)
|
||||
tty_schedule_flip(tty);
|
||||
tty_schedule_flip(&info->port);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1405,7 +1405,7 @@ static int moxa_poll_port(struct moxa_port *p, unsigned int handle,
|
|||
if (inited && !test_bit(TTY_THROTTLED, &tty->flags) &&
|
||||
MoxaPortRxQueue(p) > 0) { /* RX */
|
||||
MoxaPortReadData(p);
|
||||
tty_schedule_flip(tty);
|
||||
tty_schedule_flip(&p->port);
|
||||
}
|
||||
} else {
|
||||
clear_bit(EMPTYWAIT, &p->statusflags);
|
||||
|
@ -1430,7 +1430,7 @@ static int moxa_poll_port(struct moxa_port *p, unsigned int handle,
|
|||
|
||||
if (tty && (intr & IntrBreak) && !I_IGNBRK(tty)) { /* BREAK */
|
||||
tty_insert_flip_char(&p->port, 0, TTY_BREAK);
|
||||
tty_schedule_flip(tty);
|
||||
tty_schedule_flip(&p->port);
|
||||
}
|
||||
|
||||
if (intr & IntrLine)
|
||||
|
|
|
@ -262,8 +262,7 @@ static void rs_start(struct tty_struct *tty)
|
|||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static void receive_chars(struct m68k_serial *info, struct tty_struct *tty,
|
||||
unsigned short rx)
|
||||
static void receive_chars(struct m68k_serial *info, unsigned short rx)
|
||||
{
|
||||
m68328_uart *uart = &uart_addr[info->line];
|
||||
unsigned char ch, flag;
|
||||
|
@ -293,9 +292,6 @@ static void receive_chars(struct m68k_serial *info, struct tty_struct *tty,
|
|||
}
|
||||
}
|
||||
|
||||
if(!tty)
|
||||
goto clear_and_exit;
|
||||
|
||||
flag = TTY_NORMAL;
|
||||
|
||||
if (rx & URX_PARITY_ERROR)
|
||||
|
@ -310,10 +306,7 @@ static void receive_chars(struct m68k_serial *info, struct tty_struct *tty,
|
|||
} while((rx = uart->urx.w) & URX_DATA_READY);
|
||||
#endif
|
||||
|
||||
tty_schedule_flip(tty);
|
||||
|
||||
clear_and_exit:
|
||||
return;
|
||||
tty_schedule_flip(&info->tport);
|
||||
}
|
||||
|
||||
static void transmit_chars(struct m68k_serial *info, struct tty_struct *tty)
|
||||
|
@ -367,11 +360,11 @@ irqreturn_t rs_interrupt(int irq, void *dev_id)
|
|||
tx = uart->utx.w;
|
||||
|
||||
if (rx & URX_DATA_READY)
|
||||
receive_chars(info, tty, rx);
|
||||
receive_chars(info, rx);
|
||||
if (tx & UTX_TX_AVAIL)
|
||||
transmit_chars(info, tty);
|
||||
#else
|
||||
receive_chars(info, tty, rx);
|
||||
receive_chars(info, rx);
|
||||
#endif
|
||||
tty_kref_put(tty);
|
||||
|
||||
|
|
|
@ -323,7 +323,6 @@ static irqreturn_t serial_lpc32xx_interrupt(int irq, void *dev_id)
|
|||
{
|
||||
struct uart_port *port = dev_id;
|
||||
struct tty_port *port = &port->state->port;
|
||||
struct tty_struct *tty = tty_port_tty_get(tport);
|
||||
u32 status;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
|
@ -348,9 +347,7 @@ static irqreturn_t serial_lpc32xx_interrupt(int irq, void *dev_id)
|
|||
LPC32XX_HSUART_IIR(port->membase));
|
||||
port->icount.overrun++;
|
||||
tty_insert_flip_char(tport, 0, TTY_OVERRUN);
|
||||
if (tty) {
|
||||
tty_schedule_flip(tty);
|
||||
}
|
||||
tty_schedule_flip(tport);
|
||||
}
|
||||
|
||||
/* Data received? */
|
||||
|
@ -366,7 +363,6 @@ static irqreturn_t serial_lpc32xx_interrupt(int irq, void *dev_id)
|
|||
}
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
tty_kref_put(tty);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
|
|
@ -349,7 +349,7 @@ EXPORT_SYMBOL(tty_insert_flip_string_flags);
|
|||
|
||||
/**
|
||||
* tty_schedule_flip - push characters to ldisc
|
||||
* @tty: tty to push from
|
||||
* @port: tty port to push from
|
||||
*
|
||||
* Takes any pending buffers and transfers their ownership to the
|
||||
* ldisc side of the queue. It then schedules those characters for
|
||||
|
@ -360,11 +360,11 @@ EXPORT_SYMBOL(tty_insert_flip_string_flags);
|
|||
* Locking: Takes port->buf.lock
|
||||
*/
|
||||
|
||||
void tty_schedule_flip(struct tty_struct *tty)
|
||||
void tty_schedule_flip(struct tty_port *port)
|
||||
{
|
||||
struct tty_bufhead *buf = &tty->port->buf;
|
||||
struct tty_bufhead *buf = &port->buf;
|
||||
unsigned long flags;
|
||||
WARN_ON(tty->port->low_latency);
|
||||
WARN_ON(port->low_latency);
|
||||
|
||||
spin_lock_irqsave(&buf->lock, flags);
|
||||
if (buf->tail != NULL)
|
||||
|
|
|
@ -307,26 +307,17 @@ int kbd_rate(struct kbd_repeat *rep)
|
|||
*/
|
||||
static void put_queue(struct vc_data *vc, int ch)
|
||||
{
|
||||
struct tty_struct *tty = vc->port.tty;
|
||||
|
||||
tty_insert_flip_char(&vc->port, ch, 0);
|
||||
if (tty) {
|
||||
tty_schedule_flip(tty);
|
||||
}
|
||||
tty_schedule_flip(&vc->port);
|
||||
}
|
||||
|
||||
static void puts_queue(struct vc_data *vc, char *cp)
|
||||
{
|
||||
struct tty_struct *tty = vc->port.tty;
|
||||
|
||||
if (!tty)
|
||||
return;
|
||||
|
||||
while (*cp) {
|
||||
tty_insert_flip_char(&vc->port, *cp, 0);
|
||||
cp++;
|
||||
}
|
||||
tty_schedule_flip(tty);
|
||||
tty_schedule_flip(&vc->port);
|
||||
}
|
||||
|
||||
static void applkey(struct vc_data *vc, int key, char mode)
|
||||
|
@ -582,12 +573,8 @@ static void fn_inc_console(struct vc_data *vc)
|
|||
|
||||
static void fn_send_intr(struct vc_data *vc)
|
||||
{
|
||||
struct tty_struct *tty = vc->port.tty;
|
||||
|
||||
if (!tty)
|
||||
return;
|
||||
tty_insert_flip_char(&vc->port, 0, TTY_BREAK);
|
||||
tty_schedule_flip(tty);
|
||||
tty_schedule_flip(&vc->port);
|
||||
}
|
||||
|
||||
static void fn_scroll_forw(struct vc_data *vc)
|
||||
|
|
|
@ -1333,13 +1333,13 @@ static void csi_m(struct vc_data *vc)
|
|||
update_attr(vc);
|
||||
}
|
||||
|
||||
static void respond_string(const char *p, struct tty_struct *tty)
|
||||
static void respond_string(const char *p, struct tty_port *port)
|
||||
{
|
||||
while (*p) {
|
||||
tty_insert_flip_char(tty->port, *p, 0);
|
||||
tty_insert_flip_char(port, *p, 0);
|
||||
p++;
|
||||
}
|
||||
tty_schedule_flip(tty);
|
||||
tty_schedule_flip(port);
|
||||
}
|
||||
|
||||
static void cursor_report(struct vc_data *vc, struct tty_struct *tty)
|
||||
|
@ -1347,17 +1347,17 @@ static void cursor_report(struct vc_data *vc, struct tty_struct *tty)
|
|||
char buf[40];
|
||||
|
||||
sprintf(buf, "\033[%d;%dR", vc->vc_y + (vc->vc_decom ? vc->vc_top + 1 : 1), vc->vc_x + 1);
|
||||
respond_string(buf, tty);
|
||||
respond_string(buf, tty->port);
|
||||
}
|
||||
|
||||
static inline void status_report(struct tty_struct *tty)
|
||||
{
|
||||
respond_string("\033[0n", tty); /* Terminal ok */
|
||||
respond_string("\033[0n", tty->port); /* Terminal ok */
|
||||
}
|
||||
|
||||
static inline void respond_ID(struct tty_struct * tty)
|
||||
static inline void respond_ID(struct tty_struct *tty)
|
||||
{
|
||||
respond_string(VT102ID, tty);
|
||||
respond_string(VT102ID, tty->port);
|
||||
}
|
||||
|
||||
void mouse_report(struct tty_struct *tty, int butt, int mrx, int mry)
|
||||
|
@ -1366,7 +1366,7 @@ void mouse_report(struct tty_struct *tty, int butt, int mrx, int mry)
|
|||
|
||||
sprintf(buf, "\033[M%c%c%c", (char)(' ' + butt), (char)('!' + mrx),
|
||||
(char)('!' + mry));
|
||||
respond_string(buf, tty);
|
||||
respond_string(buf, tty->port);
|
||||
}
|
||||
|
||||
/* invoked via ioctl(TIOCLINUX) and through set_selection */
|
||||
|
|
|
@ -11,7 +11,7 @@ extern int tty_prepare_flip_string(struct tty_port *port,
|
|||
extern int tty_prepare_flip_string_flags(struct tty_port *port,
|
||||
unsigned char **chars, char **flags, size_t size);
|
||||
extern void tty_flip_buffer_push(struct tty_port *port);
|
||||
void tty_schedule_flip(struct tty_struct *tty);
|
||||
void tty_schedule_flip(struct tty_port *port);
|
||||
|
||||
static inline int tty_insert_flip_char(struct tty_port *port,
|
||||
unsigned char ch, char flag)
|
||||
|
|
Загрузка…
Ссылка в новой задаче