One point is to have less places where we actually need tty pointer.
The other is that low_latency is bound to buffer processing and
buffers are now in tty_port. So it makes sense to move low_latency to
tty_port too.
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
        struct tty_port *port = &info->port;
 
        tty->driver_data = info;
-       tty->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
+       port->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
 
        /*
         * figure out which console to use (should be one already)
 
        count = CIRC_CNT(port->rx_inp, port->rx_outp, MNSC_BUFFER_SIZE);
        count = tty_buffer_request_room(port, count);
        if (count == 0) {
-               if (!tty->low_latency)
+               if (!port->low_latency)
                        tty_flip_buffer_push(tty);
                return;
        }
        /* pull chars out of the hat */
        ix = ACCESS_ONCE(port->rx_outp);
        if (CIRC_CNT(port->rx_inp, ix, MNSC_BUFFER_SIZE) == 0) {
-               if (push && !tty->low_latency)
+               if (push && !port->low_latency)
                        tty_flip_buffer_push(tty);
                return;
        }
 
        count--;
        if (count <= 0) {
-               if (!tty->low_latency)
+               if (!port->low_latency)
                        tty_flip_buffer_push(tty);
                return;
        }
 
                goto cleanup;
        }
 
-       tty->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
+       port->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
 
        spin_lock_irqsave(&info->netlock, flags);
        if (info->netcount) {
 
 
        if (cs->port.count == 1) {
                tty_port_tty_set(&cs->port, tty);
-               tty->low_latency = 1;
+               cs->port.low_latency = 1;
        }
 
        mutex_unlock(&cs->mutex);
 
                ser->tty->hw_stopped << 4 |
                ser->tty->flow_stopped << 3 |
                ser->tty->packet << 2 |
-               ser->tty->low_latency << 1 |
+               ser->tty->port->low_latency << 1 |
                ser->tty->warned;
 }
 static inline void debugfs_init(struct ser_device *ser, struct tty_struct *tty)
 
  *    been received, which can now be decapsulated and delivered for
  *    further processing 
  *
- * calling context depends on underlying driver and tty->low_latency!
+ * calling context depends on underlying driver and tty->port->low_latency!
  * for example (low_latency: 1 / 0):
  * serial.c:   uart-interrupt / softint
  * usbserial:  urb-complete-interrupt / softint
 
 
        tty_port_tty_set(&raw->port, tty);
 
-       tty->low_latency = 0;  /* don't use bottom half for pushing chars */
+       raw->port.low_latency = 0; /* don't use bottom half for pushing chars */
        /*
         * Start up 3215 device
         */
 
 {
        tty_port_tty_set(&sclp_port, tty);
        tty->driver_data = NULL;
-       tty->low_latency = 0;
+       sclp_port.low_latency = 0;
        return 0;
 }
 
 
 {
        if (tty->count == 1) {
                tty_port_tty_set(&sclp_vt220_port, tty);
-               tty->low_latency = 0;
+               sclp_vt220_port.low_latency = 0;
                if (!tty->winsize.ws_row && !tty->winsize.ws_col) {
                        tty->winsize.ws_row = 24;
                        tty->winsize.ws_col = 80;
 
                tty->driver_data = tp;
                tty->winsize.ws_row = tp->view.rows - 2;
                tty->winsize.ws_col = tp->view.cols;
-               tty->low_latency = 0;
+               tp->port.low_latency = 0;
                /* why to reassign? */
                tty_port_tty_set(&tp->port, tty);
                tp->inattr = TF_INPUT;
        }
 
        tty_port_tty_set(&tp->port, tty);
-       tty->low_latency = 0;
+       tp->port.low_latency = 0;
        tty->winsize.ws_row = tp->view.rows - 2;
        tty->winsize.ws_col = tp->view.cols;
 
 
        state->custom_divisor = new_serial.custom_divisor;
        port->close_delay = new_serial.close_delay * HZ/100;
        port->closing_wait = new_serial.closing_wait * HZ/100;
-       tty->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
+       port->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
 
 check_and_exit:
        if (port->flags & ASYNC_INITIALIZED) {
        if (serial_paranoia_check(info, tty->name, "rs_open"))
                return -ENODEV;
 
-       tty->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
+       port->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
 
        retval = startup(tty, info);
        if (retval) {
 
 
        tty->port.tty = linux_tty;
        linux_tty->driver_data = tty;
-       linux_tty->low_latency = 1;
+       tty->port.low_latency = 1;
 
        if (tty->tty_type == TTYTYPE_MODEM)
                ipwireless_ppp_open(tty->network);
 
                                (new_serial.flags & ASYNC_FLAGS));
                port->close_delay = new_serial.close_delay * HZ / 100;
                port->closing_wait = new_serial.closing_wait * HZ / 100;
-               tty->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
+               port->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
                if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST &&
                                (new_serial.baud_base != info->baud_base ||
                                new_serial.custom_divisor !=
 
 
        baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 16);
        if (baud < HW_BUF_SPD_THRESHOLD ||
-           (pinfo->port.state && pinfo->port.state->port.tty->low_latency))
+           (pinfo->port.state && pinfo->port.state->port.low_latency))
                pinfo->rx_fifosize = 1;
        else
                pinfo->rx_fifosize = RX_BUF_SIZE;
 
        info->type = new_serial.type;
        info->close_delay = new_serial.close_delay;
        info->closing_wait = new_serial.closing_wait;
-       info->port.tty->low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
+       info->port.low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
 
  check_and_exit:
        if (info->flags & ASYNC_INITIALIZED) {
        tty->driver_data = info;
        info->port.tty = tty;
 
-       tty->low_latency = !!(info->flags & ASYNC_LOW_LATENCY);
+       info->port.low_latency = !!(info->flags & ASYNC_LOW_LATENCY);
 
        /*
         * If the port is in the middle of closing, bail out now
 
        tty->driver_data = ifx_dev;
 
        /* allows flip string push from int context */
-       tty->low_latency = 1;
+       port->low_latency = 1;
 
        /* set flag to allows data transfer */
        set_bit(IFX_SPI_STATE_IO_AVAILABLE, &ifx_dev->flags);
 
 
        the_port->ignore_status_mask = N_ALL_INPUT;
 
-       state->port.tty->low_latency = 1;
+       state->port.low_latency = 1;
 
        if (iflag & IGNPAR)
                the_port->ignore_status_mask &= ~(N_PARITY_ERROR
 
 
        the_port->ignore_status_mask = N_ALL_INPUT;
 
-       state->port.tty->low_latency = 1;
+       state->port.low_latency = 1;
 
        if (iflag & IGNPAR)
                the_port->ignore_status_mask &= ~(N_PARITY_ERROR
 
                        MAX3100_STATUS_OE;
 
        /* we are sending char from a workqueue so enable */
-       s->port.state->port.tty->low_latency = 1;
+       s->port.state->port.low_latency = 1;
 
        if (s->poll_time > 0)
                del_timer_sync(&s->timer);
 
 #endif
                /* Following use of tty struct directly is deprecated */
                if (tty_buffer_request_room(port, bytes_in) < bytes_in) {
-                       if (tty->low_latency)
+                       if (port->low_latency)
                                tty_flip_buffer_push(tty);
                        /*
                         * If this failed then we will throw away the bytes
 
                        | WC_BAUD_DR2;
 
        /* as we use thread to handle tx/rx, need set low latency */
-       port->state->port.tty->low_latency = 1;
+       port->state->port.low_latency = 1;
 
        if (max->irq) {
                max->read_thread = NULL;
 
 
        /* do not let tty layer execute RX in global workqueue, use a
         * dedicated workqueue managed by this driver */
-       uport->state->port.tty->low_latency = 1;
+       uport->state->port.low_latency = 1;
 
        /* turn on uart clk */
        ret = msm_hs_init_clk_locked(uport);
 
        port->closing_wait    = closing_wait;
        if (new_info->xmit_fifo_size)
                uport->fifosize = new_info->xmit_fifo_size;
-       if (port->tty)
-               port->tty->low_latency =
-                       (uport->flags & UPF_LOW_LATENCY) ? 1 : 0;
+       port->low_latency = (uport->flags & UPF_LOW_LATENCY) ? 1 : 0;
 
  check_and_exit:
        retval = 0;
         */
        tty->driver_data = state;
        state->uart_port->state = state;
-       tty->low_latency = (state->uart_port->flags & UPF_LOW_LATENCY) ? 1 : 0;
+       state->port.low_latency =
+               (state->uart_port->flags & UPF_LOW_LATENCY) ? 1 : 0;
        tty_port_tty_set(port, tty);
 
        /*
 
                goto cleanup;
        }
        
-       info->port.tty->low_latency = (info->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0;
+       info->port.low_latency = (info->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0;
 
        spin_lock_irqsave(&info->netlock, flags);
        if (info->netcount) {
 
        }
 
        mutex_lock(&info->port.mutex);
-       info->port.tty->low_latency = (info->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0;
+       info->port.low_latency = (info->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0;
 
        spin_lock_irqsave(&info->netlock, flags);
        if (info->netcount) {
 
                goto cleanup;
        }
 
-       info->port.tty->low_latency = (info->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0;
+       info->port.low_latency = (info->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0;
 
        spin_lock_irqsave(&info->netlock, flags);
        if (info->netcount) {
 
 {
        struct tty_bufhead *buf = &tty->port->buf;
        unsigned long flags;
-       WARN_ON(tty->low_latency);
+       WARN_ON(tty->port->low_latency);
 
        spin_lock_irqsave(&buf->lock, flags);
        if (buf->tail != NULL)
  */
 void tty_flush_to_ldisc(struct tty_struct *tty)
 {
-       if (!tty->low_latency)
+       if (!tty->port->low_latency)
                flush_work(&tty->port->buf.work);
 }
 
  *     @tty: tty to push
  *
  *     Queue a push of the terminal flip buffers to the line discipline. This
- *     function must not be called from IRQ context if tty->low_latency is set.
+ *     function must not be called from IRQ context if port->low_latency is
+ *     set.
  *
  *     In the event of the queue being busy for flipping the work will be
  *     held off and retried later.
                buf->tail->commit = buf->tail->used;
        spin_unlock_irqrestore(&buf->lock, flags);
 
-       if (tty->low_latency)
+       if (tty->port->low_latency)
                flush_to_ldisc(&buf->work);
        else
                schedule_work(&buf->work);
 
        unsigned long           iflags;         /* TTYP_ internal flags */
 #define TTYP_FLUSHING                  1  /* Flushing to ldisc in progress */
 #define TTYP_FLUSHPENDING              2  /* Queued buffer flush pending */
-       unsigned char           console:1;      /* port is a console */
+       unsigned char           console:1,      /* port is a console */
+                               low_latency:1;  /* direct buffer flush */
        struct mutex            mutex;          /* Locking */
        struct mutex            buf_mutex;      /* Buffer alloc lock */
        unsigned char           *xmit_buf;      /* Optional buffer */
        int count;
        struct winsize winsize;         /* termios mutex */
        unsigned char stopped:1, hw_stopped:1, flow_stopped:1, packet:1;
-       unsigned char low_latency:1, warned:1;
+       unsigned char warned:1;
        unsigned char ctrl_status;      /* ctrl_lock */
        unsigned int receive_room;      /* Bytes free for queue */
 
 
                   self->line, self->port.count);
 
        /* Not really used by us, but lets do it anyway */
-       tty->low_latency = (self->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0;
+       self->port.low_latency = (self->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0;
 
        /*
         * If the port is the middle of closing, bail out now