{
        /* Handle turning off CRTSCTS */
        if ((old_termios->c_cflag & CRTSCTS) &&
-           !(tty->termios->c_cflag & CRTSCTS)) {
+           !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
        }
 }
 
                return status;
 
        /* Disable Automatic RTSCTS */
-       memcpy(&ktermios, tty->termios, sizeof(ktermios));
+       ktermios = tty->termios;
        ktermios.c_cflag &= ~CRTSCTS;
        tty_set_termios(tty, &ktermios);
 
 
                goto out;
        }
 
-       iflag = tty->termios->c_iflag;
-       cflag = tty->termios->c_cflag;
+       iflag = tty->termios.c_iflag;
+       cflag = tty->termios.c_cflag;
        old_cflag = old ? old->c_cflag : cflag;
        gig_dbg(DEBUG_IF, "%u: iflag %x cflag %x old %x",
                cs->minor_index, iflag, cflag, old_cflag);
 
                quot;
        int i;
 
-       if (!port->tty || !port->tty->termios)
+       if (!port->tty)
                return;
-       cflag = port->tty->termios->c_cflag;
+       cflag = port->tty->termios.c_cflag;
 
        quot = i = cflag & CBAUD;
        if (i & CBAUDEX) {
                i &= ~CBAUDEX;
                if (i < 1 || i > 2)
-                       port->tty->termios->c_cflag &= ~CBAUDEX;
+                       port->tty->termios.c_cflag &= ~CBAUDEX;
                else
                        i += 15;
        }
 #endif
        isdn_unlock_drivers();
        info->msr &= ~UART_MSR_RI;
-       if (!info->port.tty || (info->port.tty->termios->c_cflag & HUPCL)) {
+       if (!info->port.tty || (info->port.tty->termios.c_cflag & HUPCL)) {
                info->mcr &= ~(UART_MCR_DTR | UART_MCR_RTS);
                if (info->emu.mdmreg[REG_DTRHUP] & BIT_DTRHUP) {
                        isdn_tty_modem_reset_regs(info, 0);
        if (!old_termios)
                isdn_tty_change_speed(info);
        else {
-               if (tty->termios->c_cflag == old_termios->c_cflag &&
-                   tty->termios->c_ispeed == old_termios->c_ispeed &&
-                   tty->termios->c_ospeed == old_termios->c_ospeed)
+               if (tty->termios.c_cflag == old_termios->c_cflag &&
+                   tty->termios.c_ispeed == old_termios->c_ispeed &&
+                   tty->termios.c_ospeed == old_termios->c_ospeed)
                        return;
                isdn_tty_change_speed(info);
                if ((old_termios->c_cflag & CRTSCTS) &&
-                   !(tty->termios->c_cflag & CRTSCTS))
+                   !(tty->termios.c_cflag & CRTSCTS))
                        tty->hw_stopped = 0;
        }
 }
 
        if (status & UART_MSR_DCTS) {
                port->icount.cts++;
                tty = tty_port_tty_get(&port->port);
-               if (tty && (tty->termios->c_cflag & CRTSCTS)) {
+               if (tty && (tty->termios.c_cflag & CRTSCTS)) {
                        int cts = (status & UART_MSR_CTS);
                        if (tty->hw_stopped) {
                                if (cts) {
        port->ier = UART_IER_RLSI|UART_IER_RDI|UART_IER_RTOIE|UART_IER_UUE;
        port->mctrl = TIOCM_OUT2;
 
-       sdio_uart_change_speed(port, tty->termios, NULL);
+       sdio_uart_change_speed(port, &tty->termios, NULL);
 
-       if (tty->termios->c_cflag & CBAUD)
+       if (tty->termios.c_cflag & CBAUD)
                sdio_uart_set_mctrl(port, TIOCM_RTS | TIOCM_DTR);
 
-       if (tty->termios->c_cflag & CRTSCTS)
+       if (tty->termios.c_cflag & CRTSCTS)
                if (!(sdio_uart_get_mctrl(port) & TIOCM_CTS))
                        tty->hw_stopped = 1;
 
 {
        struct sdio_uart_port *port = tty->driver_data;
 
-       if (!I_IXOFF(tty) && !(tty->termios->c_cflag & CRTSCTS))
+       if (!I_IXOFF(tty) && !(tty->termios.c_cflag & CRTSCTS))
                return;
 
        if (sdio_uart_claim_func(port) != 0)
                sdio_uart_start_tx(port);
        }
 
-       if (tty->termios->c_cflag & CRTSCTS)
+       if (tty->termios.c_cflag & CRTSCTS)
                sdio_uart_clear_mctrl(port, TIOCM_RTS);
 
        sdio_uart_irq(port->func);
 {
        struct sdio_uart_port *port = tty->driver_data;
 
-       if (!I_IXOFF(tty) && !(tty->termios->c_cflag & CRTSCTS))
+       if (!I_IXOFF(tty) && !(tty->termios.c_cflag & CRTSCTS))
                return;
 
        if (sdio_uart_claim_func(port) != 0)
                }
        }
 
-       if (tty->termios->c_cflag & CRTSCTS)
+       if (tty->termios.c_cflag & CRTSCTS)
                sdio_uart_set_mctrl(port, TIOCM_RTS);
 
        sdio_uart_irq(port->func);
                                                struct ktermios *old_termios)
 {
        struct sdio_uart_port *port = tty->driver_data;
-       unsigned int cflag = tty->termios->c_cflag;
+       unsigned int cflag = tty->termios.c_cflag;
 
        if (sdio_uart_claim_func(port) != 0)
                return;
 
-       sdio_uart_change_speed(port, tty->termios, old_termios);
+       sdio_uart_change_speed(port, &tty->termios, old_termios);
 
        /* Handle transition to B0 status */
        if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD))
 
        tty = priv->tty;
 
        mutex_lock(&tty->termios_mutex);
-       old_termios = *(tty->termios);
-       cflag = tty->termios->c_cflag;
+       old_termios = tty->termios;
+       cflag = tty->termios.c_cflag;
        tty_encode_baud_rate(tty, speed, speed);
        if (tty->ops->set_termios)
                tty->ops->set_termios(tty, &old_termios);
        int cflag;
 
        mutex_lock(&tty->termios_mutex);
-       old_termios = *(tty->termios);
-       cflag = tty->termios->c_cflag;
+       old_termios = tty->termios;
+       cflag = tty->termios.c_cflag;
        
        if (stop)
                cflag &= ~CREAD;
        else
                cflag |= CREAD;
 
-       tty->termios->c_cflag = cflag;
+       tty->termios.c_cflag = cflag;
        if (tty->ops->set_termios)
                tty->ops->set_termios(tty, &old_termios);
        mutex_unlock(&tty->termios_mutex);
 
                                    struct ktermios *old)
 {
        struct hso_serial *serial = tty->driver_data;
-       struct ktermios *termios;
 
        if (!serial) {
                printk(KERN_ERR "%s: no tty structures", __func__);
        /*
         *      Fix up unsupported bits
         */
-       termios = tty->termios;
-       termios->c_iflag &= ~IXON; /* disable enable XON/XOFF flow control */
+       tty->termios.c_iflag &= ~IXON; /* disable enable XON/XOFF flow control */
 
-       termios->c_cflag &=
+       tty->termios.c_cflag &=
                ~(CSIZE         /* no size */
                | PARENB        /* disable parity bit */
                | CBAUD         /* clear current baud rate */
                | CBAUDEX);     /* clear current buad rate */
 
-       termios->c_cflag |= CS8;        /* character size 8 bits */
+       tty->termios.c_cflag |= CS8;    /* character size 8 bits */
 
        /* baud rate 115200 */
        tty_encode_baud_rate(tty, 115200, 115200);
 
        if (old)
                D5("Termios called with: cflags new[%d] - old[%d]",
-                  tty->termios->c_cflag, old->c_cflag);
+                  tty->termios.c_cflag, old->c_cflag);
 
        /* the actual setup */
        spin_lock_irqsave(&serial->serial_lock, flags);
        if (serial->port.count)
                _hso_serial_set_termios(tty, old);
        else
-               tty->termios = old;
+               tty->termios = *old;
        spin_unlock_irqrestore(&serial->serial_lock, flags);
 
        /* done */
 
        custom.adkcon = AC_UARTBRK;
        mb();
 
-       if (tty->termios->c_cflag & HUPCL)
+       if (tty->termios.c_cflag & HUPCL)
                info->MCR &= ~(SER_DTR|SER_RTS);
        rtsdtr_ctrl(info->MCR);
 
        int     bits;
        unsigned long   flags;
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        /* Byte size is always 8 bits plus parity bit if requested */
 
        /* If the quotient is zero refuse the change */
        if (!quot && old_termios) {
                /* FIXME: Will need updating for new tty in the end */
-               tty->termios->c_cflag &= ~CBAUD;
-               tty->termios->c_cflag |= (old_termios->c_cflag & CBAUD);
+               tty->termios.c_cflag &= ~CBAUD;
+               tty->termios.c_cflag |= (old_termios->c_cflag & CBAUD);
                baud = tty_get_baud_rate(tty);
                if (!baud)
                        baud = 9600;
        if (I_IXOFF(tty))
                rs_send_xchar(tty, STOP_CHAR(tty));
 
-       if (tty->termios->c_cflag & CRTSCTS)
+       if (tty->termios.c_cflag & CRTSCTS)
                info->MCR &= ~SER_RTS;
 
        local_irq_save(flags);
                else
                        rs_send_xchar(tty, START_CHAR(tty));
        }
-       if (tty->termios->c_cflag & CRTSCTS)
+       if (tty->termios.c_cflag & CRTSCTS)
                info->MCR |= SER_RTS;
        local_irq_save(flags);
        rtsdtr_ctrl(info->MCR);
 {
        struct serial_state *info = tty->driver_data;
        unsigned long flags;
-       unsigned int cflag = tty->termios->c_cflag;
+       unsigned int cflag = tty->termios.c_cflag;
 
        change_speed(tty, info, old_termios);
 
        if (!(old_termios->c_cflag & CBAUD) &&
            (cflag & CBAUD)) {
                info->MCR |= SER_DTR;
-               if (!(tty->termios->c_cflag & CRTSCTS) || 
+               if (!(tty->termios.c_cflag & CRTSCTS) || 
                    !test_bit(TTY_THROTTLED, &tty->flags)) {
                        info->MCR |= SER_RTS;
                }
 
        /* Handle turning off CRTSCTS */
        if ((old_termios->c_cflag & CRTSCTS) &&
-           !(tty->termios->c_cflag & CRTSCTS)) {
+           !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
                rs_start(tty);
        }
         * or not.  Hence, this may change.....
         */
        if (!(old_termios->c_cflag & CLOCAL) &&
-           (tty->termios->c_cflag & CLOCAL))
+           (tty->termios.c_cflag & CLOCAL))
                wake_up_interruptible(&info->open_wait);
 #endif
 }
 
                        info->port.xmit_buf = NULL;
                        free_page((unsigned long)temp);
                }
-               if (tty->termios->c_cflag & HUPCL)
+               if (tty->termios.c_cflag & HUPCL)
                        cyy_change_rts_dtr(info, 0, TIOCM_RTS | TIOCM_DTR);
 
                cyy_issue_cmd(info, CyCHAN_CTL | CyDIS_RCVR);
                        free_page((unsigned long)temp);
                }
 
-               if (tty->termios->c_cflag & HUPCL)
+               if (tty->termios.c_cflag & HUPCL)
                        tty_port_lower_dtr_rts(&info->port);
 
                set_bit(TTY_IO_ERROR, &tty->flags);
        int baud, baud_rate = 0;
        int i;
 
-       if (!tty->termios) /* XXX can this happen at all? */
-               return;
-
        if (info->line == -1)
                return;
 
-       cflag = tty->termios->c_cflag;
-       iflag = tty->termios->c_iflag;
+       cflag = tty->termios.c_cflag;
+       iflag = tty->termios.c_iflag;
 
        /*
         * Set up the tty->alt_speed kludge
        cy_set_line_char(info, tty);
 
        if ((old_termios->c_cflag & CRTSCTS) &&
-                       !(tty->termios->c_cflag & CRTSCTS)) {
+                       !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
                cy_start(tty);
        }
         * or not.  Hence, this may change.....
         */
        if (!(old_termios->c_cflag & CLOCAL) &&
-           (tty->termios->c_cflag & CLOCAL))
+           (tty->termios.c_cflag & CLOCAL))
                wake_up_interruptible(&info->port.open_wait);
 #endif
 }                              /* cy_set_termios */
                        info->throttle = 1;
        }
 
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                if (!cy_is_Z(card)) {
                        spin_lock_irqsave(&card->card_lock, flags);
                        cyy_change_rts_dtr(info, 0, TIOCM_RTS);
                        cy_send_xchar(tty, START_CHAR(tty));
        }
 
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                card = info->card;
                if (!cy_is_Z(card)) {
                        spin_lock_irqsave(&card->card_lock, flags);
 
                spin_unlock_irqrestore(&hp->lock, flags);
 
                /* Clear our own DTR */
-               if (!pv->tty || (pv->tty->termios->c_cflag & HUPCL))
+               if (!pv->tty || (pv->tty->termios.c_cflag & HUPCL))
                        hvsilib_write_mctrl(pv, 0);
 
                /* Tear down the connection */
 
 
                /* 1,2,3,4 => 57.6, 115.2, 230, 460 kbps resp. */
                if (baud < 1 || baud > 4)
-                       tty->termios->c_cflag &= ~CBAUDEX;
+                       tty->termios.c_cflag &= ~CBAUDEX;
                else
                        baud += 15;
        }
        if (isicom_paranoia_check(port, tty->name, "isicom_set_termios"))
                return;
 
-       if (tty->termios->c_cflag == old_termios->c_cflag &&
-                       tty->termios->c_iflag == old_termios->c_iflag)
+       if (tty->termios.c_cflag == old_termios->c_cflag &&
+                       tty->termios.c_iflag == old_termios->c_iflag)
                return;
 
        spin_lock_irqsave(&port->card->card_lock, flags);
        spin_unlock_irqrestore(&port->card->card_lock, flags);
 
        if ((old_termios->c_cflag & CRTSCTS) &&
-                       !(tty->termios->c_cflag & CRTSCTS)) {
+                       !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
                isicom_start(tty);
        }
 
                                        tmp.dcd = 1;
 
                                ttyp = tty_port_tty_get(&p->port);
-                               if (!ttyp || !ttyp->termios)
+                               if (!ttyp)
                                        tmp.cflag = p->cflag;
                                else
-                                       tmp.cflag = ttyp->termios->c_cflag;
+                                       tmp.cflag = ttyp->termios.c_cflag;
                                tty_kref_put(ttyp);
 copy:
                                if (copy_to_user(argm, &tmp, sizeof(tmp)))
        mutex_lock(&ch->port.mutex);
        if (!(ch->port.flags & ASYNC_INITIALIZED)) {
                ch->statusflags = 0;
-               moxa_set_tty_param(tty, tty->termios);
+               moxa_set_tty_param(tty, &tty->termios);
                MoxaPortLineCtrl(ch, 1, 1);
                MoxaPortEnable(ch);
                MoxaSetFifo(ch, ch->type == PORT_16550A);
 static void moxa_close(struct tty_struct *tty, struct file *filp)
 {
        struct moxa_port *ch = tty->driver_data;
-       ch->cflag = tty->termios->c_cflag;
+       ch->cflag = tty->termios.c_cflag;
        tty_port_close(&ch->port, tty, filp);
 }
 
 
 static void moxa_set_tty_param(struct tty_struct *tty, struct ktermios *old_termios)
 {
-       register struct ktermios *ts = tty->termios;
+       register struct ktermios *ts = &tty->termios;
        struct moxa_port *ch = tty->driver_data;
        int rts, cts, txflow, rxflow, xany, baud;
 
 
        int ret = 0;
        unsigned char status;
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
        if (!info->ioaddr)
                return ret;
 
                                
                                tty = tty_port_tty_get(port);
 
-                               if (!tty || !tty->termios)
+                               if (!tty)
                                        ms.cflag = ip->normal_termios.c_cflag;
                                else
-                                       ms.cflag = tty->termios->c_cflag;
+                                       ms.cflag = tty->termios.c_cflag;
                                tty_kref_put(tty);
                                spin_lock_irq(&ip->slock);
                                status = inb(ip->ioaddr + UART_MSR);
 
                                tty = tty_port_tty_get(&ip->port);
 
-                               if (!tty || !tty->termios) {
+                               if (!tty) {
                                        cflag = ip->normal_termios.c_cflag;
                                        iflag = ip->normal_termios.c_iflag;
                                        me->baudrate[p] = tty_termios_baud_rate(&ip->normal_termios);
                                } else {
-                                       cflag = tty->termios->c_cflag;
-                                       iflag = tty->termios->c_iflag;
+                                       cflag = tty->termios.c_cflag;
+                                       iflag = tty->termios.c_iflag;
                                        me->baudrate[p] = tty_get_baud_rate(tty);
                                }
                                tty_kref_put(tty);
                }
        }
 
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                info->MCR &= ~UART_MCR_RTS;
                outb(info->MCR, info->ioaddr + UART_MCR);
        }
                }
        }
 
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                info->MCR |= UART_MCR_RTS;
                outb(info->MCR, info->ioaddr + UART_MCR);
        }
        spin_unlock_irqrestore(&info->slock, flags);
 
        if ((old_termios->c_cflag & CRTSCTS) &&
-                       !(tty->termios->c_cflag & CRTSCTS)) {
+                       !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
                mxser_start(tty);
        }
 
        /* Handle sw stopped */
        if ((old_termios->c_iflag & IXON) &&
-                       !(tty->termios->c_iflag & IXON)) {
+                       !(tty->termios.c_iflag & IXON)) {
                tty->stopped = 0;
 
                if (info->board->chip_flag) {
 
        /* Carrier drop -> hangup */
        if (tty) {
                if ((mlines & TIOCM_CD) == 0 && (dlci->modem_rx & TIOCM_CD))
-                       if (!(tty->termios->c_cflag & CLOCAL))
+                       if (!(tty->termios.c_cflag & CLOCAL))
                                tty_hangup(tty);
                if (brk & 0x01)
                        tty_insert_flip_char(tty, 0, TTY_BREAK);
           the RPN control message. This however rapidly gets nasty as we
           then have to remap modem signals each way according to whether
           our virtual cable is null modem etc .. */
-       tty_termios_copy_hw(tty->termios, old);
+       tty_termios_copy_hw(&tty->termios, old);
 }
 
 static void gsmtty_throttle(struct tty_struct *tty)
 {
        struct gsm_dlci *dlci = tty->driver_data;
-       if (tty->termios->c_cflag & CRTSCTS)
+       if (tty->termios.c_cflag & CRTSCTS)
                dlci->modem_tx &= ~TIOCM_DTR;
        dlci->throttled = 1;
        /* Send an MSC with DTR cleared */
 static void gsmtty_unthrottle(struct tty_struct *tty)
 {
        struct gsm_dlci *dlci = tty->driver_data;
-       if (tty->termios->c_cflag & CRTSCTS)
+       if (tty->termios.c_cflag & CRTSCTS)
                dlci->modem_tx |= TIOCM_DTR;
        dlci->throttled = 0;
        /* Send an MSC with DTR set */
 
        BUG_ON(!tty);
 
        if (old)
-               canon_change = (old->c_lflag ^ tty->termios->c_lflag) & ICANON;
+               canon_change = (old->c_lflag ^ tty->termios.c_lflag) & ICANON;
        if (canon_change) {
                memset(&tty->read_flags, 0, sizeof tty->read_flags);
                tty->canon_head = tty->read_tail;
 
 static void pty_set_termios(struct tty_struct *tty,
                                        struct ktermios *old_termios)
 {
-       tty->termios->c_cflag &= ~(CSIZE | PARENB);
-       tty->termios->c_cflag |= (CS8 | CREAD);
+       tty->termios.c_cflag &= ~(CSIZE | PARENB);
+       tty->termios.c_cflag |= (CS8 | CREAD);
 }
 
 /**
                driver->other->ttys[idx] = o_tty;
                driver->ttys[idx] = tty;
        } else {
-               tty->termios = kzalloc(sizeof(struct ktermios[2]), GFP_KERNEL);
-               if (tty->termios == NULL)
-                       goto err_deinit_tty;
-               *tty->termios = driver->init_termios;
-               tty->termios_locked = tty->termios + 1;
-
-               o_tty->termios = kzalloc(sizeof(struct ktermios[2]),
-                               GFP_KERNEL);
-               if (o_tty->termios == NULL)
-                       goto err_free_termios;
-               *o_tty->termios = driver->other->init_termios;
-               o_tty->termios_locked = o_tty->termios + 1;
+               memset(&tty->termios_locked, 0, sizeof(tty->termios_locked));
+               tty->termios = driver->init_termios;
+               memset(&o_tty->termios_locked, 0, sizeof(tty->termios_locked));
+               o_tty->termios = driver->other->init_termios;
        }
 
        /*
 err_free_termios:
        if (legacy)
                tty_free_termios(tty);
-       else
-               kfree(tty->termios);
 err_deinit_tty:
        deinitialize_tty_struct(o_tty);
        module_put(o_tty->driver->owner);
 {
        tty_driver_remove_tty(tty->driver, tty);
        /* We have our own method as we don't use the tty index */
-       kfree(tty->termios);
 }
 
 /* We have no need to install and remove our tty objects as devpts does all
 
        unsigned rocketMode;
        int bits, baud, divisor;
        CHANNEL_t *cp;
-       struct ktermios *t = tty->termios;
+       struct ktermios *t = &tty->termios;
 
        cp = &info->channel;
        cflag = t->c_cflag;
                        tty->alt_speed = 460800;
 
                configure_r_port(tty, info, NULL);
-               if (tty->termios->c_cflag & CBAUD) {
+               if (tty->termios.c_cflag & CBAUD) {
                        sSetDTR(cp);
                        sSetRTS(cp);
                }
        if (rocket_paranoia_check(info, "rp_set_termios"))
                return;
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        /*
         * This driver doesn't support CS5 or CS6
         */
        if (((cflag & CSIZE) == CS5) || ((cflag & CSIZE) == CS6))
-               tty->termios->c_cflag =
+               tty->termios.c_cflag =
                    ((cflag & ~CSIZE) | (old_termios->c_cflag & CSIZE));
        /* Or CMSPAR */
-       tty->termios->c_cflag &= ~CMSPAR;
+       tty->termios.c_cflag &= ~CMSPAR;
 
        configure_r_port(tty, info, old_termios);
 
        cp = &info->channel;
 
        /* Handle transition to B0 status */
-       if ((old_termios->c_cflag & CBAUD) && !(tty->termios->c_cflag & CBAUD)) {
+       if ((old_termios->c_cflag & CBAUD) && !(tty->termios.c_cflag & CBAUD)) {
                sClrDTR(cp);
                sClrRTS(cp);
        }
 
        /* Handle transition away from B0 status */
-       if (!(old_termios->c_cflag & CBAUD) && (tty->termios->c_cflag & CBAUD)) {
-               if (!tty->hw_stopped || !(tty->termios->c_cflag & CRTSCTS))
+       if (!(old_termios->c_cflag & CBAUD) && (tty->termios.c_cflag & CBAUD)) {
+               if (!tty->hw_stopped || !(tty->termios.c_cflag & CRTSCTS))
                        sSetRTS(cp);
                sSetDTR(cp);
        }
 
-       if ((old_termios->c_cflag & CRTSCTS) && !(tty->termios->c_cflag & CRTSCTS)) {
+       if ((old_termios->c_cflag & CRTSCTS) && !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
                rp_start(tty);
        }
 
         * To avoid losting RX interrupt, we reset IR function
         * before sending data.
         */
-       if (tty->termios->c_line == N_IRDA)
+       if (tty->termios.c_line == N_IRDA)
                bfin_serial_reset_irda(port);
 
 #ifdef CONFIG_SERIAL_BFIN_DMA
 
 /* Calculate the chartime depending on baudrate, numbor of bits etc. */
 static void update_char_time(struct e100_serial * info)
 {
-       tcflag_t cflags = info->port.tty->termios->c_cflag;
+       tcflag_t cflags = info->port.tty->termios.c_cflag;
        int bits;
 
        /* calc. number of bits / data byte */
                xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char,
                                STOP_CHAR(info->port.tty));
                xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, stop);
-               if (tty->termios->c_iflag & IXON ) {
+               if (tty->termios.c_iflag & IXON ) {
                        xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable);
                }
 
                                         info->xmit.tail,SERIAL_XMIT_SIZE)));
                xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(tty));
                xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, enable);
-               if (tty->termios->c_iflag & IXON ) {
+               if (tty->termios.c_iflag & IXON ) {
                        xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable);
                }
 
                        descr[i].buf = 0;
                }
 
-       if (!info->port.tty || (info->port.tty->termios->c_cflag & HUPCL)) {
+       if (!info->port.tty || (info->port.tty->termios.c_cflag & HUPCL)) {
                /* hang up DTR and RTS if HUPCL is enabled */
                e100_dtr(info, 0);
                e100_rts(info, 0); /* could check CRTSCTS before doing this */
        unsigned long flags;
        /* first some safety checks */
 
-       if (!info->port.tty || !info->port.tty->termios)
+       if (!info->port.tty)
                return;
        if (!info->ioport)
                return;
 
-       cflag = info->port.tty->termios->c_cflag;
+       cflag = info->port.tty->termios.c_cflag;
 
        /* possibly, the tx/rx should be disabled first to do this safely */
 
        info->ioport[REG_REC_CTRL] = info->rx_ctrl;
        xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(info->port.tty));
        xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, enable);
-       if (info->port.tty->termios->c_iflag & IXON ) {
+       if (info->port.tty->termios.c_iflag & IXON ) {
                DFLOW(DEBUG_LOG(info->line, "FLOW XOFF enabled 0x%02X\n",
                                STOP_CHAR(info->port.tty)));
                xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable);
        DFLOW(DEBUG_LOG(info->line,"rs_throttle %lu\n", tty->ldisc.chars_in_buffer(tty)));
 
        /* Do RTS before XOFF since XOFF might take some time */
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                /* Turn off RTS line */
                e100_rts(info, 0);
        }
        DFLOW(DEBUG_LOG(info->line,"rs_unthrottle ldisc %d\n", tty->ldisc.chars_in_buffer(tty)));
        DFLOW(DEBUG_LOG(info->line,"rs_unthrottle flip.count: %i\n", tty->flip.count));
        /* Do RTS before XOFF since XOFF might take some time */
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                /* Assert RTS line  */
                e100_rts(info, 1);
        }
 
        /* Handle turning off CRTSCTS */
        if ((old_termios->c_cflag & CRTSCTS) &&
-           !(tty->termios->c_cflag & CRTSCTS)) {
+           !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
                rs_start(tty);
        }
         * separate termios for callout and dialin.
         */
        if (info->flags & ASYNC_NORMAL_ACTIVE)
-               info->normal_termios = *tty->termios;
+               info->normal_termios = tty->termios;
        /*
         * Now we wait for the transmit buffer to clear; and we notify
         * the line discipline to only process XON/XOFF characters.
                return 0;
        }
 
-       if (tty->termios->c_cflag & CLOCAL) {
+       if (tty->termios.c_cflag & CLOCAL) {
                        do_clocal = 1;
        }
 
        }
 
        if ((info->count == 1) && (info->flags & ASYNC_SPLIT_TERMIOS)) {
-               *tty->termios = info->normal_termios;
+               tty->termios = info->normal_termios;
                change_speed(info);
        }
 
 
        ioc4_set_proto(port, the_port->mapbase);
 
        /* set the speed of the serial port */
-       ioc4_change_speed(the_port, state->port.tty->termios,
+       ioc4_change_speed(the_port, &state->port.tty->termios,
                          (struct ktermios *)0);
 
        return 0;
 
        struct ktermios *termios;
 
        spin_lock_irqsave(&port->lock, lock_flags);
-       termios = port->state->port.tty->termios;
+       termios = &port->state->port.tty->termios;
        if (ch == termios->c_cc[VSTART])
                channel->ch_bd->bd_ops->send_start_character(channel);
 
        channel->ch_cached_lsr = 0;
        channel->ch_stops_sent = 0;
 
-       termios = port->state->port.tty->termios;
+       termios = &port->state->port.tty->termios;
        channel->ch_c_cflag     = termios->c_cflag;
        channel->ch_c_iflag     = termios->c_iflag;
        channel->ch_c_oflag     = termios->c_oflag;
        jsm_printk(CLOSE, INFO, &channel->ch_bd->pci_dev, "start\n");
 
        bd = channel->ch_bd;
-       ts = port->state->port.tty->termios;
+       ts = &port->state->port.tty->termios;
 
        channel->ch_flags &= ~(CH_STOPI);
 
         *input data and return immediately.
         */
        if (!tp ||
-               !(tp->termios->c_cflag & CREAD) ) {
+               !(tp->termios.c_cflag & CREAD) ) {
 
                jsm_printk(READ, INFO, &ch->ch_bd->pci_dev,
                        "input. dropping %d bytes on port %d...\n", data_len, ch->ch_portnum);
 
                if (tty == NULL)
                        goto exit;
 
-               termios = tty->termios;
+               termios = &tty->termios;
 
                if (termios == NULL) {
                        printk(KERN_WARNING "%s: no termios?\n", __func__);
 
        retval = uport->ops->startup(uport);
        if (retval == 0) {
                if (uart_console(uport) && uport->cons->cflag) {
-                       tty->termios->c_cflag = uport->cons->cflag;
+                       tty->termios.c_cflag = uport->cons->cflag;
                        uport->cons->cflag = 0;
                }
                /*
                         * Setup the RTS and DTR signals once the
                         * port is open and ready to respond.
                         */
-                       if (tty->termios->c_cflag & CBAUD)
+                       if (tty->termios.c_cflag & CBAUD)
                                uart_set_mctrl(uport, TIOCM_RTS | TIOCM_DTR);
                }
 
                /*
                 * Turn off DTR and RTS early.
                 */
-               if (!tty || (tty->termios->c_cflag & HUPCL))
+               if (!tty || (tty->termios.c_cflag & HUPCL))
                        uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS);
 
                uart_port_shutdown(port);
         * If we have no tty, termios, or the port does not exist,
         * then we can't set the parameters for this port.
         */
-       if (!tty || !tty->termios || uport->type == PORT_UNKNOWN)
+       if (!tty || uport->type == PORT_UNKNOWN)
                return;
 
-       termios = tty->termios;
+       termios = &tty->termios;
 
        /*
         * Set flags based on termios cflag
        if (I_IXOFF(tty))
                uart_send_xchar(tty, STOP_CHAR(tty));
 
-       if (tty->termios->c_cflag & CRTSCTS)
+       if (tty->termios.c_cflag & CRTSCTS)
                uart_clear_mctrl(state->uart_port, TIOCM_RTS);
 }
 
                        uart_send_xchar(tty, START_CHAR(tty));
        }
 
-       if (tty->termios->c_cflag & CRTSCTS)
+       if (tty->termios.c_cflag & CRTSCTS)
                uart_set_mctrl(port, TIOCM_RTS);
 }
 
        struct uart_port *uport = state->uart_port;
 
        if (uport->ops->set_ldisc)
-               uport->ops->set_ldisc(uport, tty->termios->c_line);
+               uport->ops->set_ldisc(uport, tty->termios.c_line);
 }
 
 static void uart_set_termios(struct tty_struct *tty,
 {
        struct uart_state *state = tty->driver_data;
        unsigned long flags;
-       unsigned int cflag = tty->termios->c_cflag;
+       unsigned int cflag = tty->termios.c_cflag;
 
 
        /*
         */
 #define RELEVANT_IFLAG(iflag)  ((iflag) & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
        if ((cflag ^ old_termios->c_cflag) == 0 &&
-           tty->termios->c_ospeed == old_termios->c_ospeed &&
-           tty->termios->c_ispeed == old_termios->c_ispeed &&
-           RELEVANT_IFLAG(tty->termios->c_iflag ^ old_termios->c_iflag) == 0) {
+           tty->termios.c_ospeed == old_termios->c_ospeed &&
+           tty->termios.c_ispeed == old_termios->c_ispeed &&
+           RELEVANT_IFLAG(tty->termios.c_iflag ^ old_termios->c_iflag) == 0) {
                return;
        }
 
                /*
                 * If that's unset, use the tty termios setting.
                 */
-               if (port->tty && port->tty->termios && termios.c_cflag == 0)
-                       termios = *(port->tty->termios);
+               if (port->tty && termios.c_cflag == 0)
+                       termios = port->tty->termios;
 
                if (console_suspend_enabled)
                        uart_change_pm(state, 0);
 
        usc_DisableInterrupts(info,RECEIVE_DATA + RECEIVE_STATUS +
                TRANSMIT_DATA + TRANSMIT_STATUS + IO_PIN + MISC );
        usc_DisableDmaInterrupts(info,DICR_MASTER + DICR_TRANSMIT + DICR_RECEIVE);
-       
+
        /* Disable DMAEN (Port 7, Bit 14) */
        /* This disconnects the DMA request signal from the ISA bus */
        /* on the ISA adapter. This has no effect for the PCI adapter */
        usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT15) | BIT14));
-       
+
        /* Disable INTEN (Port 6, Bit12) */
        /* This disconnects the IRQ request signal to the ISA bus */
        /* on the ISA adapter. This has no effect for the PCI adapter */
        usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT13) | BIT12));
-       
-       if (!info->port.tty || info->port.tty->termios->c_cflag & HUPCL) {
+
+       if (!info->port.tty || info->port.tty->termios.c_cflag & HUPCL) {
                info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS);
                usc_set_serial_signals(info);
        }
-       
+
        spin_unlock_irqrestore(&info->irq_spinlock,flags);
 
        mgsl_release_resources(info);   
        usc_EnableInterrupts(info, IO_PIN);
        usc_get_serial_signals(info);
                
-       if (info->netcount || info->port.tty->termios->c_cflag & CREAD)
+       if (info->netcount || info->port.tty->termios.c_cflag & CREAD)
                usc_start_receiver(info);
                
        spin_unlock_irqrestore(&info->irq_spinlock,flags);
        unsigned cflag;
        int bits_per_char;
 
-       if (!info->port.tty || !info->port.tty->termios)
+       if (!info->port.tty)
                return;
                
        if (debug_level >= DEBUG_LEVEL_INFO)
                printk("%s(%d):mgsl_change_params(%s)\n",
                         __FILE__,__LINE__, info->device_name );
                         
-       cflag = info->port.tty->termios->c_cflag;
+       cflag = info->port.tty->termios.c_cflag;
 
        /* if B0 rate (hangup) specified then negate DTR and RTS */
        /* otherwise assert DTR and RTS */
        
        if (I_IXOFF(tty))
                mgsl_send_xchar(tty, STOP_CHAR(tty));
- 
-       if (tty->termios->c_cflag & CRTSCTS) {
+
+       if (tty->termios.c_cflag & CRTSCTS) {
                spin_lock_irqsave(&info->irq_spinlock,flags);
                info->serial_signals &= ~SerialSignal_RTS;
                usc_set_serial_signals(info);
                else
                        mgsl_send_xchar(tty, START_CHAR(tty));
        }
-       
-       if (tty->termios->c_cflag & CRTSCTS) {
+
+       if (tty->termios.c_cflag & CRTSCTS) {
                spin_lock_irqsave(&info->irq_spinlock,flags);
                info->serial_signals |= SerialSignal_RTS;
                usc_set_serial_signals(info);
 
        /* Handle transition to B0 status */
        if (old_termios->c_cflag & CBAUD &&
-           !(tty->termios->c_cflag & CBAUD)) {
+           !(tty->termios.c_cflag & CBAUD)) {
                info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR);
                spin_lock_irqsave(&info->irq_spinlock,flags);
                usc_set_serial_signals(info);
        
        /* Handle transition away from B0 status */
        if (!(old_termios->c_cflag & CBAUD) &&
-           tty->termios->c_cflag & CBAUD) {
+           tty->termios.c_cflag & CBAUD) {
                info->serial_signals |= SerialSignal_DTR;
-               if (!(tty->termios->c_cflag & CRTSCTS) || 
+               if (!(tty->termios.c_cflag & CRTSCTS) || 
                    !test_bit(TTY_THROTTLED, &tty->flags)) {
                        info->serial_signals |= SerialSignal_RTS;
                }
        
        /* Handle turning off CRTSCTS */
        if (old_termios->c_cflag & CRTSCTS &&
-           !(tty->termios->c_cflag & CRTSCTS)) {
+           !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
                mgsl_start(tty);
        }
                return 0;
        }
 
-       if (tty->termios->c_cflag & CLOCAL)
+       if (tty->termios.c_cflag & CLOCAL)
                do_clocal = true;
 
        /* Wait for carrier detect and the line to become
        port->blocked_open++;
        
        while (1) {
-               if (tty->termios->c_cflag & CBAUD)
+               if (tty->termios.c_cflag & CBAUD)
                        tty_port_raise_dtr_rts(port);
                
                set_current_state(TASK_INTERRUPTIBLE);
 
 
        /* Handle transition to B0 status */
        if (old_termios->c_cflag & CBAUD &&
-           !(tty->termios->c_cflag & CBAUD)) {
+           !(tty->termios.c_cflag & CBAUD)) {
                info->signals &= ~(SerialSignal_RTS + SerialSignal_DTR);
                spin_lock_irqsave(&info->lock,flags);
                set_signals(info);
 
        /* Handle transition away from B0 status */
        if (!(old_termios->c_cflag & CBAUD) &&
-           tty->termios->c_cflag & CBAUD) {
+           tty->termios.c_cflag & CBAUD) {
                info->signals |= SerialSignal_DTR;
-               if (!(tty->termios->c_cflag & CRTSCTS) ||
+               if (!(tty->termios.c_cflag & CRTSCTS) ||
                    !test_bit(TTY_THROTTLED, &tty->flags)) {
                        info->signals |= SerialSignal_RTS;
                }
 
        /* Handle turning off CRTSCTS */
        if (old_termios->c_cflag & CRTSCTS &&
-           !(tty->termios->c_cflag & CRTSCTS)) {
+           !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
                tx_release(tty);
        }
        DBGINFO(("%s throttle\n", info->device_name));
        if (I_IXOFF(tty))
                send_xchar(tty, STOP_CHAR(tty));
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                spin_lock_irqsave(&info->lock,flags);
                info->signals &= ~SerialSignal_RTS;
                set_signals(info);
                else
                        send_xchar(tty, START_CHAR(tty));
        }
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                spin_lock_irqsave(&info->lock,flags);
                info->signals |= SerialSignal_RTS;
                set_signals(info);
 
        slgt_irq_off(info, IRQ_ALL | IRQ_MASTER);
 
-       if (!info->port.tty || info->port.tty->termios->c_cflag & HUPCL) {
+       if (!info->port.tty || info->port.tty->termios.c_cflag & HUPCL) {
                info->signals &= ~(SerialSignal_DTR + SerialSignal_RTS);
                set_signals(info);
        }
        get_signals(info);
 
        if (info->netcount ||
-           (info->port.tty && info->port.tty->termios->c_cflag & CREAD))
+           (info->port.tty && info->port.tty->termios.c_cflag & CREAD))
                rx_start(info);
 
        spin_unlock_irqrestore(&info->lock,flags);
        unsigned cflag;
        int bits_per_char;
 
-       if (!info->port.tty || !info->port.tty->termios)
+       if (!info->port.tty)
                return;
        DBGINFO(("%s change_params\n", info->device_name));
 
-       cflag = info->port.tty->termios->c_cflag;
+       cflag = info->port.tty->termios.c_cflag;
 
        /* if B0 rate (hangup) specified then negate DTR and RTS */
        /* otherwise assert DTR and RTS */
                return 0;
        }
 
-       if (tty->termios->c_cflag & CLOCAL)
+       if (tty->termios.c_cflag & CLOCAL)
                do_clocal = true;
 
        /* Wait for carrier detect and the line to become
        port->blocked_open++;
 
        while (1) {
-               if ((tty->termios->c_cflag & CBAUD))
+               if ((tty->termios.c_cflag & CBAUD))
                        tty_port_raise_dtr_rts(port);
 
                set_current_state(TASK_INTERRUPTIBLE);
 
 
        /* Handle transition to B0 status */
        if (old_termios->c_cflag & CBAUD &&
-           !(tty->termios->c_cflag & CBAUD)) {
+           !(tty->termios.c_cflag & CBAUD)) {
                info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR);
                spin_lock_irqsave(&info->lock,flags);
                set_signals(info);
 
        /* Handle transition away from B0 status */
        if (!(old_termios->c_cflag & CBAUD) &&
-           tty->termios->c_cflag & CBAUD) {
+           tty->termios.c_cflag & CBAUD) {
                info->serial_signals |= SerialSignal_DTR;
-               if (!(tty->termios->c_cflag & CRTSCTS) ||
+               if (!(tty->termios.c_cflag & CRTSCTS) ||
                    !test_bit(TTY_THROTTLED, &tty->flags)) {
                        info->serial_signals |= SerialSignal_RTS;
                }
 
        /* Handle turning off CRTSCTS */
        if (old_termios->c_cflag & CRTSCTS &&
-           !(tty->termios->c_cflag & CRTSCTS)) {
+           !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
                tx_release(tty);
        }
        if (I_IXOFF(tty))
                send_xchar(tty, STOP_CHAR(tty));
 
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                spin_lock_irqsave(&info->lock,flags);
                info->serial_signals &= ~SerialSignal_RTS;
                set_signals(info);
                        send_xchar(tty, START_CHAR(tty));
        }
 
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                spin_lock_irqsave(&info->lock,flags);
                info->serial_signals |= SerialSignal_RTS;
                set_signals(info);
 
        reset_port(info);
 
-       if (!info->port.tty || info->port.tty->termios->c_cflag & HUPCL) {
+       if (!info->port.tty || info->port.tty->termios.c_cflag & HUPCL) {
                info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS);
                set_signals(info);
        }
 
        get_signals(info);
 
-       if (info->netcount || (info->port.tty && info->port.tty->termios->c_cflag & CREAD) )
+       if (info->netcount || (info->port.tty && info->port.tty->termios.c_cflag & CREAD) )
                rx_start(info);
 
        spin_unlock_irqrestore(&info->lock,flags);
        unsigned cflag;
        int bits_per_char;
 
-       if (!info->port.tty || !info->port.tty->termios)
+       if (!info->port.tty)
                return;
 
        if (debug_level >= DEBUG_LEVEL_INFO)
                printk("%s(%d):%s change_params()\n",
                         __FILE__,__LINE__, info->device_name );
 
-       cflag = info->port.tty->termios->c_cflag;
+       cflag = info->port.tty->termios.c_cflag;
 
        /* if B0 rate (hangup) specified then negate DTR and RTS */
        /* otherwise assert DTR and RTS */
                return 0;
        }
 
-       if (tty->termios->c_cflag & CLOCAL)
+       if (tty->termios.c_cflag & CLOCAL)
                do_clocal = true;
 
        /* Wait for carrier detect and the line to become
        port->blocked_open++;
 
        while (1) {
-               if (tty->termios->c_cflag & CBAUD)
+               if (tty->termios.c_cflag & CBAUD)
                        tty_port_raise_dtr_rts(port);
 
                set_current_state(TASK_INTERRUPTIBLE);
 
 
        tp = tty->driver->termios[idx];
        if (tp == NULL) {
-               tp = kzalloc(sizeof(struct ktermios[2]), GFP_KERNEL);
+               tp = kmalloc(sizeof(struct ktermios), GFP_KERNEL);
                if (tp == NULL)
                        return -ENOMEM;
-               memcpy(tp, &tty->driver->init_termios,
-                                               sizeof(struct ktermios));
+               *tp = tty->driver->init_termios;
                tty->driver->termios[idx] = tp;
        }
-       tty->termios = tp;
-       tty->termios_locked = tp + 1;
+       tty->termios = *tp;
 
        /* Compatibility until drivers always set this */
-       tty->termios->c_ispeed = tty_termios_input_baud_rate(tty->termios);
-       tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios);
+       tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios);
+       tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios);
        return 0;
 }
 EXPORT_SYMBOL_GPL(tty_init_termios);
        /* Kill this flag and push into drivers for locking etc */
        if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) {
                /* FIXME: Locking on ->termios array */
-               tp = tty->termios;
+               tp = tty->driver->termios[idx];
                tty->driver->termios[idx] = NULL;
                kfree(tp);
        }
+       else
+               *tty->driver->termios[idx] = tty->termios;
 }
 EXPORT_SYMBOL(tty_free_termios);
 
                                __func__, idx, tty->name);
                return -1;
        }
-       if (tty->termios != tty->driver->termios[idx]) {
-               printk(KERN_DEBUG "%s: driver.termios[%d] not termios for (%s)\n",
-                               __func__, idx, tty->name);
-               return -1;
-       }
        if (tty->driver->other) {
                if (o_tty != tty->driver->other->ttys[idx]) {
                        printk(KERN_DEBUG "%s: other->table[%d] not o_tty for (%s)\n",
                                        __func__, idx, tty->name);
                        return -1;
                }
-               if (o_tty->termios != tty->driver->other->termios[idx]) {
-                       printk(KERN_DEBUG "%s: other->termios[%d] not o_termios for (%s)\n",
-                                       __func__, idx, tty->name);
-                       return -1;
-               }
                if (o_tty->link != tty) {
                        printk(KERN_DEBUG "%s: bad pty pointers\n", __func__);
                        return -1;
 
 
 void tty_encode_baud_rate(struct tty_struct *tty, speed_t ibaud, speed_t obaud)
 {
-       tty_termios_encode_baud_rate(tty->termios, ibaud, obaud);
+       tty_termios_encode_baud_rate(&tty->termios, ibaud, obaud);
 }
 EXPORT_SYMBOL_GPL(tty_encode_baud_rate);
 
 
 speed_t tty_get_baud_rate(struct tty_struct *tty)
 {
-       speed_t baud = tty_termios_baud_rate(tty->termios);
+       speed_t baud = tty_termios_baud_rate(&tty->termios);
 
        if (baud == 38400 && tty->alt_speed) {
                if (!tty->warned) {
        /* FIXME: we need to decide on some locking/ordering semantics
           for the set_termios notification eventually */
        mutex_lock(&tty->termios_mutex);
-       old_termios = *tty->termios;
-       *tty->termios = *new_termios;
-       unset_locked_termios(tty->termios, &old_termios, tty->termios_locked);
+       old_termios = tty->termios;
+       tty->termios = *new_termios;
+       unset_locked_termios(&tty->termios, &old_termios, &tty->termios_locked);
 
        /* See if packet mode change of state. */
        if (tty->link && tty->link->packet) {
                int extproc = (old_termios.c_lflag & EXTPROC) |
-                               (tty->termios->c_lflag & EXTPROC);
+                               (tty->termios.c_lflag & EXTPROC);
                int old_flow = ((old_termios.c_iflag & IXON) &&
                                (old_termios.c_cc[VSTOP] == '\023') &&
                                (old_termios.c_cc[VSTART] == '\021'));
        if (tty->ops->set_termios)
                (*tty->ops->set_termios)(tty, &old_termios);
        else
-               tty_termios_copy_hw(tty->termios, &old_termios);
+               tty_termios_copy_hw(&tty->termios, &old_termios);
 
        ld = tty_ldisc_ref(tty);
        if (ld != NULL) {
                return retval;
 
        mutex_lock(&tty->termios_mutex);
-       memcpy(&tmp_termios, tty->termios, sizeof(struct ktermios));
+       tmp_termios = tty->termios;
        mutex_unlock(&tty->termios_mutex);
 
        if (opt & TERMIOS_TERMIO) {
 static void copy_termios(struct tty_struct *tty, struct ktermios *kterm)
 {
        mutex_lock(&tty->termios_mutex);
-       memcpy(kterm, tty->termios, sizeof(struct ktermios));
+       *kterm = tty->termios;
        mutex_unlock(&tty->termios_mutex);
 }
 
 static void copy_termios_locked(struct tty_struct *tty, struct ktermios *kterm)
 {
        mutex_lock(&tty->termios_mutex);
-       memcpy(kterm, tty->termios_locked, sizeof(struct ktermios));
+       *kterm = tty->termios_locked;
        mutex_unlock(&tty->termios_mutex);
 }
 
 {
        int flags = 0;
 
-       if (!(tty->termios->c_lflag & ICANON)) {
-               if (tty->termios->c_lflag & ISIG)
+       if (!(tty->termios.c_lflag & ICANON)) {
+               if (tty->termios.c_lflag & ISIG)
                        flags |= 0x02;          /* cbreak */
                else
                        flags |= 0x20;          /* raw */
        }
-       if (tty->termios->c_lflag & ECHO)
+       if (tty->termios.c_lflag & ECHO)
                flags |= 0x08;                  /* echo */
-       if (tty->termios->c_oflag & OPOST)
-               if (tty->termios->c_oflag & ONLCR)
+       if (tty->termios.c_oflag & OPOST)
+               if (tty->termios.c_oflag & ONLCR)
                        flags |= 0x10;          /* crmod */
        return flags;
 }
        struct sgttyb tmp;
 
        mutex_lock(&tty->termios_mutex);
-       tmp.sg_ispeed = tty->termios->c_ispeed;
-       tmp.sg_ospeed = tty->termios->c_ospeed;
-       tmp.sg_erase = tty->termios->c_cc[VERASE];
-       tmp.sg_kill = tty->termios->c_cc[VKILL];
+       tmp.sg_ispeed = tty->termios.c_ispeed;
+       tmp.sg_ospeed = tty->termios.c_ospeed;
+       tmp.sg_erase = tty->termios.c_cc[VERASE];
+       tmp.sg_kill = tty->termios.c_cc[VKILL];
        tmp.sg_flags = get_sgflags(tty);
        mutex_unlock(&tty->termios_mutex);
 
 
 static void set_sgflags(struct ktermios *termios, int flags)
 {
-       termios->c_iflag = ICRNL | IXON;
-       termios->c_oflag = 0;
-       termios->c_lflag = ISIG | ICANON;
+       termios.c_iflag = ICRNL | IXON;
+       termios.c_oflag = 0;
+       termios.c_lflag = ISIG | ICANON;
        if (flags & 0x02) {     /* cbreak */
-               termios->c_iflag = 0;
-               termios->c_lflag &= ~ICANON;
+               termios.c_iflag = 0;
+               termios.c_lflag &= ~ICANON;
        }
        if (flags & 0x08) {             /* echo */
-               termios->c_lflag |= ECHO | ECHOE | ECHOK |
+               termios.c_lflag |= ECHO | ECHOE | ECHOK |
                                    ECHOCTL | ECHOKE | IEXTEN;
        }
        if (flags & 0x10) {             /* crmod */
-               termios->c_oflag |= OPOST | ONLCR;
+               termios.c_oflag |= OPOST | ONLCR;
        }
        if (flags & 0x20) {     /* raw */
-               termios->c_iflag = 0;
-               termios->c_lflag &= ~(ISIG | ICANON);
+               termios.c_iflag = 0;
+               termios.c_lflag &= ~(ISIG | ICANON);
        }
-       if (!(termios->c_lflag & ICANON)) {
-               termios->c_cc[VMIN] = 1;
-               termios->c_cc[VTIME] = 0;
+       if (!(termios.c_lflag & ICANON)) {
+               termios.c_cc[VMIN] = 1;
+               termios.c_cc[VTIME] = 0;
        }
 }
 
                return -EFAULT;
 
        mutex_lock(&tty->termios_mutex);
-       termios = *tty->termios;
+       termios = tty->termios;
        termios.c_cc[VERASE] = tmp.sg_erase;
        termios.c_cc[VKILL] = tmp.sg_kill;
        set_sgflags(&termios, tmp.sg_flags);
        struct tchars tmp;
 
        mutex_lock(&tty->termios_mutex);
-       tmp.t_intrc = tty->termios->c_cc[VINTR];
-       tmp.t_quitc = tty->termios->c_cc[VQUIT];
-       tmp.t_startc = tty->termios->c_cc[VSTART];
-       tmp.t_stopc = tty->termios->c_cc[VSTOP];
-       tmp.t_eofc = tty->termios->c_cc[VEOF];
-       tmp.t_brkc = tty->termios->c_cc[VEOL2]; /* what is brkc anyway? */
+       tmp.t_intrc = tty->termios.c_cc[VINTR];
+       tmp.t_quitc = tty->termios.c_cc[VQUIT];
+       tmp.t_startc = tty->termios.c_cc[VSTART];
+       tmp.t_stopc = tty->termios.c_cc[VSTOP];
+       tmp.t_eofc = tty->termios.c_cc[VEOF];
+       tmp.t_brkc = tty->termios.c_cc[VEOL2];  /* what is brkc anyway? */
        mutex_unlock(&tty->termios_mutex);
        return copy_to_user(tchars, &tmp, sizeof(tmp)) ? -EFAULT : 0;
 }
        if (copy_from_user(&tmp, tchars, sizeof(tmp)))
                return -EFAULT;
        mutex_lock(&tty->termios_mutex);
-       tty->termios->c_cc[VINTR] = tmp.t_intrc;
-       tty->termios->c_cc[VQUIT] = tmp.t_quitc;
-       tty->termios->c_cc[VSTART] = tmp.t_startc;
-       tty->termios->c_cc[VSTOP] = tmp.t_stopc;
-       tty->termios->c_cc[VEOF] = tmp.t_eofc;
-       tty->termios->c_cc[VEOL2] = tmp.t_brkc; /* what is brkc anyway? */
+       tty->termios.c_cc[VINTR] = tmp.t_intrc;
+       tty->termios.c_cc[VQUIT] = tmp.t_quitc;
+       tty->termios.c_cc[VSTART] = tmp.t_startc;
+       tty->termios.c_cc[VSTOP] = tmp.t_stopc;
+       tty->termios.c_cc[VEOF] = tmp.t_eofc;
+       tty->termios.c_cc[VEOL2] = tmp.t_brkc;  /* what is brkc anyway? */
        mutex_unlock(&tty->termios_mutex);
        return 0;
 }
        struct ltchars tmp;
 
        mutex_lock(&tty->termios_mutex);
-       tmp.t_suspc = tty->termios->c_cc[VSUSP];
+       tmp.t_suspc = tty->termios.c_cc[VSUSP];
        /* what is dsuspc anyway? */
-       tmp.t_dsuspc = tty->termios->c_cc[VSUSP];
-       tmp.t_rprntc = tty->termios->c_cc[VREPRINT];
+       tmp.t_dsuspc = tty->termios.c_cc[VSUSP];
+       tmp.t_rprntc = tty->termios.c_cc[VREPRINT];
        /* what is flushc anyway? */
-       tmp.t_flushc = tty->termios->c_cc[VEOL2];
-       tmp.t_werasc = tty->termios->c_cc[VWERASE];
-       tmp.t_lnextc = tty->termios->c_cc[VLNEXT];
+       tmp.t_flushc = tty->termios.c_cc[VEOL2];
+       tmp.t_werasc = tty->termios.c_cc[VWERASE];
+       tmp.t_lnextc = tty->termios.c_cc[VLNEXT];
        mutex_unlock(&tty->termios_mutex);
        return copy_to_user(ltchars, &tmp, sizeof(tmp)) ? -EFAULT : 0;
 }
                return -EFAULT;
 
        mutex_lock(&tty->termios_mutex);
-       tty->termios->c_cc[VSUSP] = tmp.t_suspc;
+       tty->termios.c_cc[VSUSP] = tmp.t_suspc;
        /* what is dsuspc anyway? */
-       tty->termios->c_cc[VEOL2] = tmp.t_dsuspc;
-       tty->termios->c_cc[VREPRINT] = tmp.t_rprntc;
+       tty->termios.c_cc[VEOL2] = tmp.t_dsuspc;
+       tty->termios.c_cc[VREPRINT] = tmp.t_rprntc;
        /* what is flushc anyway? */
-       tty->termios->c_cc[VEOL2] = tmp.t_flushc;
-       tty->termios->c_cc[VWERASE] = tmp.t_werasc;
-       tty->termios->c_cc[VLNEXT] = tmp.t_lnextc;
+       tty->termios.c_cc[VEOL2] = tmp.t_flushc;
+       tty->termios.c_cc[VWERASE] = tmp.t_werasc;
+       tty->termios.c_cc[VLNEXT] = tmp.t_lnextc;
        mutex_unlock(&tty->termios_mutex);
        return 0;
 }
        struct ktermios old;
 
        mutex_lock(&tty->termios_mutex);
-       old = *tty->termios;
-       tty->termios->c_cflag &= ~CLOCAL;
-       tty->termios->c_cflag |= bit;
+       old = tty->termios;
+       tty->termios.c_cflag &= ~CLOCAL;
+       tty->termios.c_cflag |= bit;
        if (tty->ops->set_termios)
                tty->ops->set_termios(tty, &old);
-       if ((tty->termios->c_cflag & CLOCAL) != bit)
+       if ((tty->termios.c_cflag & CLOCAL) != bit)
                ret = -EINVAL;
        mutex_unlock(&tty->termios_mutex);
        return ret;
                                               (struct termios __user *) arg))
                        return -EFAULT;
                mutex_lock(&real_tty->termios_mutex);
-               memcpy(real_tty->termios_locked, &kterm, sizeof(struct ktermios));
+               real_tty->termios_locked = kterm;
                mutex_unlock(&real_tty->termios_mutex);
                return 0;
 #else
                                               (struct termios __user *) arg))
                        return -EFAULT;
                mutex_lock(&real_tty->termios_mutex);
-               memcpy(real_tty->termios_locked, &kterm, sizeof(struct ktermios));
+               real_tty->termios_locked = kterm;
                mutex_unlock(&real_tty->termios_mutex);
                return ret;
 #endif
 
 static void tty_set_termios_ldisc(struct tty_struct *tty, int num)
 {
        mutex_lock(&tty->termios_mutex);
-       tty->termios->c_line = num;
+       tty->termios.c_line = num;
        mutex_unlock(&tty->termios_mutex);
 }
 
 static void tty_reset_termios(struct tty_struct *tty)
 {
        mutex_lock(&tty->termios_mutex);
-       *tty->termios = tty->driver->init_termios;
-       tty->termios->c_ispeed = tty_termios_input_baud_rate(tty->termios);
-       tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios);
+       tty->termios = tty->driver->init_termios;
+       tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios);
+       tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios);
        mutex_unlock(&tty->termios_mutex);
 }
 
 
                if (reset == 0) {
 
-                       if (!tty_ldisc_reinit(tty, tty->termios->c_line))
+                       if (!tty_ldisc_reinit(tty, tty->termios.c_line))
                                err = tty_ldisc_open(tty, tty->ldisc);
                        else
                                err = 1;
 
        }
        if (filp->f_flags & O_NONBLOCK) {
                /* Indicate we are open */
-               if (tty->termios->c_cflag & CBAUD)
+               if (tty->termios.c_cflag & CBAUD)
                        tty_port_raise_dtr_rts(port);
                port->flags |= ASYNC_NORMAL_ACTIVE;
                return 0;
 
        while (1) {
                /* Indicate we are open */
-               if (tty->termios->c_cflag & CBAUD)
+               if (tty->termios.c_cflag & CBAUD)
                        tty_port_raise_dtr_rts(port);
 
                prepare_to_wait(&port->open_wait, &wait, TASK_INTERRUPTIBLE);
 
        /* Drop DTR/RTS if HUPCL is set. This causes any attached modem to
           hang up the line */
-       if (tty->termios->c_cflag & HUPCL)
+       if (tty->termios.c_cflag & HUPCL)
                tty_port_lower_dtr_rts(port);
 
        /* Don't call port->drop for the last reference. Callers will want
 
                tty->winsize.ws_col = vc_cons[currcons].d->vc_cols;
        }
        if (vc->vc_utf)
-               tty->termios->c_iflag |= IUTF8;
+               tty->termios.c_iflag |= IUTF8;
        else
-               tty->termios->c_iflag &= ~IUTF8;
+               tty->termios.c_iflag &= ~IUTF8;
 unlock:
        console_unlock();
        return ret;
 
                                                struct ktermios *termios_old)
 {
        struct acm *acm = tty->driver_data;
-       struct ktermios *termios = tty->termios;
+       struct ktermios *termios = &tty->termios;
        struct usb_cdc_line_coding newline;
        int newctrl = acm->ctrlout;
 
 
 
 static void ark3116_init_termios(struct tty_struct *tty)
 {
-       struct ktermios *termios = tty->termios;
+       struct ktermios *termios = &tty->termios;
        *termios = tty_std_termios;
        termios->c_cflag = B9600 | CS8
                                      | CREAD | HUPCL | CLOCAL;
 {
        struct usb_serial *serial = port->serial;
        struct ark3116_private *priv = usb_get_serial_port_data(port);
-       struct ktermios *termios = tty->termios;
+       struct ktermios *termios = &tty->termios;
        unsigned int cflag = termios->c_cflag;
        int bps = tty_get_baud_rate(tty);
        int quot;
 
        unsigned long control_state;
        int bad_flow_control;
        speed_t baud;
-       struct ktermios *termios = tty->termios;
+       struct ktermios *termios = &tty->termios;
 
        iflag = termios->c_iflag;
        cflag = termios->c_cflag;
 
 
        if (tty) {
                cp210x_get_termios_port(tty->driver_data,
-                       &tty->termios->c_cflag, &baud);
+                       &tty->termios.c_cflag, &baud);
                tty_encode_baud_rate(tty, baud, baud);
        }
 
 {
        u32 baud;
 
-       baud = tty->termios->c_ospeed;
+       baud = tty->termios.c_ospeed;
 
        /* This maps the requested rate to a rate valid on cp2102 or cp2103,
         * or to an arbitrary rate in [1M,2M].
        if (!tty)
                return;
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
        old_cflag = old_termios->c_cflag;
 
-       if (tty->termios->c_ospeed != old_termios->c_ospeed)
+       if (tty->termios.c_ospeed != old_termios->c_ospeed)
                cp210x_change_speed(tty, port, old_termios);
 
        /* If the number of data bits is to be updated */
 
           early enough */
        if (!priv->termios_initialized) {
                if (priv->chiptype == CT_EARTHMATE) {
-                       *(tty->termios) = tty_std_termios;
-                       tty->termios->c_cflag = B4800 | CS8 | CREAD | HUPCL |
+                       tty->termios = tty_std_termios;
+                       tty->termios.c_cflag = B4800 | CS8 | CREAD | HUPCL |
                                CLOCAL;
-                       tty->termios->c_ispeed = 4800;
-                       tty->termios->c_ospeed = 4800;
+                       tty->termios.c_ispeed = 4800;
+                       tty->termios.c_ospeed = 4800;
                } else if (priv->chiptype == CT_CYPHIDCOM) {
-                       *(tty->termios) = tty_std_termios;
-                       tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL |
+                       tty->termios = tty_std_termios;
+                       tty->termios.c_cflag = B9600 | CS8 | CREAD | HUPCL |
                                CLOCAL;
-                       tty->termios->c_ispeed = 9600;
-                       tty->termios->c_ospeed = 9600;
+                       tty->termios.c_ispeed = 9600;
+                       tty->termios.c_ospeed = 9600;
                } else if (priv->chiptype == CT_CA42V2) {
-                       *(tty->termios) = tty_std_termios;
-                       tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL |
+                       tty->termios = tty_std_termios;
+                       tty->termios.c_cflag = B9600 | CS8 | CREAD | HUPCL |
                                CLOCAL;
-                       tty->termios->c_ispeed = 9600;
-                       tty->termios->c_ospeed = 9600;
+                       tty->termios.c_ispeed = 9600;
+                       tty->termios.c_ospeed = 9600;
                }
                priv->termios_initialized = 1;
        }
        spin_unlock_irqrestore(&priv->lock, flags);
 
        /* Unsupported features need clearing */
-       tty->termios->c_cflag &= ~(CMSPAR|CRTSCTS);
+       tty->termios.c_cflag &= ~(CMSPAR|CRTSCTS);
 
-       cflag = tty->termios->c_cflag;
-       iflag = tty->termios->c_iflag;
+       cflag = tty->termios.c_cflag;
+       iflag = tty->termios.c_iflag;
 
        /* check if there are new settings */
        if (old_termios) {
                spin_lock_irqsave(&priv->lock, flags);
-               priv->tmp_termios = *(tty->termios);
+               priv->tmp_termios = tty->termios;
                spin_unlock_irqrestore(&priv->lock, flags);
        }
 
                                "4800bps.");
                /* define custom termios settings for NMEA protocol */
 
-               tty->termios->c_iflag /* input modes - */
+               tty->termios.c_iflag /* input modes - */
                        &= ~(IGNBRK  /* disable ignore break */
                        | BRKINT     /* disable break causes interrupt */
                        | PARMRK     /* disable mark parity errors */
                        | ICRNL      /* disable translate CR to NL */
                        | IXON);     /* disable enable XON/XOFF flow control */
 
-               tty->termios->c_oflag /* output modes */
+               tty->termios.c_oflag /* output modes */
                        &= ~OPOST;    /* disable postprocess output char */
 
-               tty->termios->c_lflag /* line discipline modes */
+               tty->termios.c_lflag /* line discipline modes */
                        &= ~(ECHO     /* disable echo input characters */
                        | ECHONL      /* disable echo new line */
                        | ICANON      /* disable erase, kill, werase, and rprnt
 
        /* hangup, as defined in acm.c... this might be a bad place for it
         * though */
-       if (tty && !(tty->termios->c_cflag & CLOCAL) &&
+       if (tty && !(tty->termios.c_cflag & CLOCAL) &&
                        !(priv->current_status & UART_CD)) {
                dbg("%s - calling hangup", __func__);
                tty_hangup(tty);
 
                struct usb_serial_port *port, struct ktermios *old_termios)
 {
        struct digi_port *priv = usb_get_serial_port_data(port);
-       unsigned int iflag = tty->termios->c_iflag;
-       unsigned int cflag = tty->termios->c_cflag;
+       unsigned int iflag = tty->termios.c_iflag;
+       unsigned int cflag = tty->termios.c_cflag;
        unsigned int old_iflag = old_termios->c_iflag;
        unsigned int old_cflag = old_termios->c_cflag;
        unsigned char buf[32];
                        /* don't set RTS if using hardware flow control */
                        /* and throttling input */
                        modem_signals = TIOCM_DTR;
-                       if (!(tty->termios->c_cflag & CRTSCTS) ||
+                       if (!(tty->termios.c_cflag & CRTSCTS) ||
                            !test_bit(TTY_THROTTLED, &tty->flags))
                                modem_signals |= TIOCM_RTS;
                        digi_set_modem_signals(port, modem_signals, 1);
                }
        }
        /* set parity */
-       tty->termios->c_cflag &= ~CMSPAR;
+       tty->termios.c_cflag &= ~CMSPAR;
 
        if ((cflag&(PARENB|PARODD)) != (old_cflag&(PARENB|PARODD))) {
                if (cflag&PARENB) {
 
        /* set termios settings */
        if (tty) {
-               not_termios.c_cflag = ~tty->termios->c_cflag;
-               not_termios.c_iflag = ~tty->termios->c_iflag;
+               not_termios.c_cflag = ~tty->termios.c_cflag;
+               not_termios.c_iflag = ~tty->termios.c_iflag;
                digi_set_termios(tty, port, ¬_termios);
        }
        return 0;
 
                rts = 0;
                if (tty)
-                       rts = tty->termios->c_cflag & CRTSCTS;
+                       rts = tty->termios.c_cflag & CRTSCTS;
                
                if (tty && opcode == DIGI_CMD_READ_INPUT_SIGNALS) {
                        spin_lock(&priv->dp_port_lock);
 
 
 static void empeg_init_termios(struct tty_struct *tty)
 {
-       struct ktermios *termios = tty->termios;
+       struct ktermios *termios = &tty->termios;
 
        /*
         * The empeg-car player wants these particular tty settings.
 
        /* FIXME - Stubbed out for now */
 
        /* Don't change anything if nothing has changed */
-       if (!tty_termios_hw_change(tty->termios, old_termios))
+       if (!tty_termios_hw_change(&tty->termios, old_termios))
                return;
 
        /* Do the real work here... */
 
 {
        struct usb_device *dev = port->serial->dev;
        struct ftdi_private *priv = usb_get_serial_port_data(port);
-       struct ktermios *termios = tty->termios;
+       struct ktermios *termios = &tty->termios;
        unsigned int cflag = termios->c_cflag;
        __u16 urb_value; /* will hold the new flags */
 
 
        }
 
        /* if we are implementing RTS/CTS, toggle that line */
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                edge_port->shadowMCR &= ~MCR_RTS;
                status = send_cmd_write_uart_register(edge_port, MCR,
                                                        edge_port->shadowMCR);
                        return;
        }
        /* if we are implementing RTS/CTS, toggle that line */
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                edge_port->shadowMCR |= MCR_RTS;
                send_cmd_write_uart_register(edge_port, MCR,
                                                edge_port->shadowMCR);
        struct edgeport_port *edge_port = usb_get_serial_port_data(port);
        unsigned int cflag;
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
        dbg("%s - clfag %08x iflag %08x", __func__,
-           tty->termios->c_cflag, tty->termios->c_iflag);
+           tty->termios.c_cflag, tty->termios.c_iflag);
        dbg("%s - old clfag %08x old iflag %08x", __func__,
            old_termios->c_cflag, old_termios->c_iflag);
 
                tty = tty_port_tty_get(&edge_port->port->port);
                if (tty) {
                        change_port_settings(tty,
-                               edge_port, tty->termios);
+                               edge_port, &tty->termios);
                        tty_kref_put(tty);
                }
 
                return;
        }
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        switch (cflag & CSIZE) {
        case CS5:
 
 
        /* set up the port settings */
        if (tty)
-               edge_set_termios(tty, port, tty->termios);
+               edge_set_termios(tty, port, &tty->termios);
 
        /* open up the port */
 
 
        config = kmalloc (sizeof (*config), GFP_KERNEL);
        if (!config) {
-               *tty->termios = *old_termios;
+               tty->termios = *old_termios;
                dev_err(&edge_port->port->dev, "%s - out of memory\n",
                                                                __func__);
                return;
        }
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        config->wFlags = 0;
 
        } else
                dbg("%s - OUTBOUND XON/XOFF is disabled", __func__);
 
-       tty->termios->c_cflag &= ~CMSPAR;
+       tty->termios.c_cflag &= ~CMSPAR;
 
        /* Round the baud rate */
        baud = tty_get_baud_rate(tty);
        struct edgeport_port *edge_port = usb_get_serial_port_data(port);
        unsigned int cflag;
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        dbg("%s - clfag %08x iflag %08x", __func__,
-           tty->termios->c_cflag, tty->termios->c_iflag);
+           tty->termios.c_cflag, tty->termios.c_iflag);
        dbg("%s - old clfag %08x old iflag %08x", __func__,
            old_termios->c_cflag, old_termios->c_iflag);
        dbg("%s - port %d", __func__, port->number);
 
                ir_xbof = ir_xbof_change(xbof) ;
 
        /* Only speed changes are supported */
-       tty_termios_copy_hw(tty->termios, old_termios);
+       tty_termios_copy_hw(&tty->termios, old_termios);
        tty_encode_baud_rate(tty, baud, baud);
 
        /*
 
 {
        const u32 supported_mask = CMSPAR|PARENB|PARODD;
        struct iuu_private *priv = usb_get_serial_port_data(port);
-       unsigned int cflag = tty->termios->c_cflag;
+       unsigned int cflag = tty->termios.c_cflag;
        int status;
        u32 actual;
        u32 parity;
        u32 newval = cflag & supported_mask;
 
        /* Just use the ospeed. ispeed should be the same. */
-       baud = tty->termios->c_ospeed;
+       baud = tty->termios.c_ospeed;
 
        dbg("%s - enter c_ospeed or baud=%d", __func__, baud);
 
         * settings back over and then adjust them
         */
        if (old_termios)
-               tty_termios_copy_hw(tty->termios, old_termios);
+               tty_termios_copy_hw(&tty->termios, old_termios);
        if (status != 0)        /* Set failed - return old bits */
                return;
        /* Re-encode speed, parity and csize */
        tty_encode_baud_rate(tty, baud, baud);
-       tty->termios->c_cflag &= ~(supported_mask|CSIZE);
-       tty->termios->c_cflag |= newval | csize;
+       tty->termios.c_cflag &= ~(supported_mask|CSIZE);
+       tty->termios.c_cflag |= newval | csize;
 }
 
 static void iuu_close(struct usb_serial_port *port)
 
 static void iuu_init_termios(struct tty_struct *tty)
 {
-       *(tty->termios) = tty_std_termios;
-       tty->termios->c_cflag = CLOCAL | CREAD | CS8 | B9600
+       tty->termios = tty_std_termios;
+       tty->termios.c_cflag = CLOCAL | CREAD | CS8 | B9600
                                | TIOCM_CTS | CSTOPB | PARENB;
-       tty->termios->c_ispeed = 9600;
-       tty->termios->c_ospeed = 9600;
-       tty->termios->c_lflag = 0;
-       tty->termios->c_oflag = 0;
-       tty->termios->c_iflag = 0;
+       tty->termios.c_ispeed = 9600;
+       tty->termios.c_ospeed = 9600;
+       tty->termios.c_lflag = 0;
+       tty->termios.c_oflag = 0;
+       tty->termios.c_iflag = 0;
 }
 
 static int iuu_open(struct tty_struct *tty, struct usb_serial_port *port)
        u32 actual;
        struct iuu_private *priv = usb_get_serial_port_data(port);
 
-       baud = tty->termios->c_ospeed;
-       tty->termios->c_ispeed = baud;
+       baud = tty->termios.c_ospeed;
+       tty->termios.c_ispeed = baud;
        /* Re-encode speed */
        tty_encode_baud_rate(tty, baud, baud);
 
 
 
        p_priv = usb_get_serial_port_data(port);
        d_details = p_priv->device_details;
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
        device_port = port->number - port->serial->minor;
 
        /* Baud rate calculation takes baud rate as an integer
        p_priv->flow_control = (cflag & CRTSCTS)? flow_cts: flow_none;
 
        /* Mark/Space not supported */
-       tty->termios->c_cflag &= ~CMSPAR;
+       tty->termios.c_cflag &= ~CMSPAR;
 
        keyspan_send_setup(port, 0);
 }
 
        device_port = port->number - port->serial->minor;
        if (tty) {
-               cflag = tty->termios->c_cflag;
+               cflag = tty->termios.c_cflag;
                /* Baud rate calculation takes baud rate as an integer
                   so other rates can be generated if desired. */
                baud_rate = tty_get_baud_rate(tty);
 
           7[EOMS]1: 10 bit, b0/b7 is parity
           7[EOMS]2: 11 bit, b0/b7 is parity, extra bit always (mark?)
 
-          HW flow control is dictated by the tty->termios->c_cflags & CRTSCTS
+          HW flow control is dictated by the tty->termios.c_cflags & CRTSCTS
           bit.
 
           For now, just do baud. */
        }
        /* Only speed can change so copy the old h/w parameters
           then encode the new speed */
-       tty_termios_copy_hw(tty->termios, old_termios);
+       tty_termios_copy_hw(&tty->termios, old_termios);
        tty_encode_baud_rate(tty, speed, speed);
 }
 
 
 
        /* set up termios structure */
        spin_lock_irqsave(&priv->lock, flags);
-       priv->termios.c_iflag = tty->termios->c_iflag;
-       priv->termios.c_oflag = tty->termios->c_oflag;
-       priv->termios.c_cflag = tty->termios->c_cflag;
-       priv->termios.c_lflag = tty->termios->c_lflag;
+       priv->termios.c_iflag = tty->termios.c_iflag;
+       priv->termios.c_oflag = tty->termios.c_oflag;
+       priv->termios.c_cflag = tty->termios.c_cflag;
+       priv->termios.c_lflag = tty->termios.c_lflag;
        for (i = 0; i < NCCS; i++)
-               priv->termios.c_cc[i] = tty->termios->c_cc[i];
+               priv->termios.c_cc[i] = tty->termios.c_cc[i];
        priv->cfg.pktlen   = cfg->pktlen;
        priv->cfg.baudrate = cfg->baudrate;
        priv->cfg.databits = cfg->databits;
                                 struct ktermios *old_termios)
 {
        struct klsi_105_private *priv = usb_get_serial_port_data(port);
-       unsigned int iflag = tty->termios->c_iflag;
+       unsigned int iflag = tty->termios.c_iflag;
        unsigned int old_iflag = old_termios->c_iflag;
-       unsigned int cflag = tty->termios->c_cflag;
+       unsigned int cflag = tty->termios.c_cflag;
        unsigned int old_cflag = old_termios->c_cflag;
        struct klsi_105_port_settings *cfg;
        unsigned long flags;
        if ((cflag & (PARENB|PARODD)) != (old_cflag & (PARENB|PARODD))
            || (cflag & CSTOPB) != (old_cflag & CSTOPB)) {
                /* Not currently supported */
-               tty->termios->c_cflag &= ~(PARENB|PARODD|CSTOPB);
+               tty->termios.c_cflag &= ~(PARENB|PARODD|CSTOPB);
 #if 0
                priv->last_lcr = 0;
 
            || (iflag & IXON) != (old_iflag & IXON)
            ||  (cflag & CRTSCTS) != (old_cflag & CRTSCTS)) {
                /* Not currently supported */
-               tty->termios->c_cflag &= ~CRTSCTS;
+               tty->termios.c_cflag &= ~CRTSCTS;
                /* Drop DTR/RTS if no flow control otherwise assert */
 #if 0
                if ((iflag & IXOFF) || (iflag & IXON) || (cflag & CRTSCTS))
 
 static void kobil_init_termios(struct tty_struct *tty)
 {
        /* Default to echo off and other sane device settings */
-       tty->termios->c_lflag = 0;
-       tty->termios->c_lflag &= ~(ISIG | ICANON | ECHO | IEXTEN | XCASE);
-       tty->termios->c_iflag = IGNBRK | IGNPAR | IXOFF;
+       tty->termios.c_lflag = 0;
+       tty->termios.c_lflag &= ~(ISIG | ICANON | ECHO | IEXTEN | XCASE);
+       tty->termios.c_lflag = IGNBRK | IGNPAR | IXOFF;
        /* do NOT translate CR to CR-NL (0x0A -> 0x0A 0x0D) */
-       tty->termios->c_oflag &= ~ONLCR;
+       tty->termios.c_oflag &= ~ONLCR;
 }
 
 static int kobil_open(struct tty_struct *tty, struct usb_serial_port *port)
        struct kobil_private *priv;
        int result;
        unsigned short urb_val = 0;
-       int c_cflag = tty->termios->c_cflag;
+       int c_cflag = tty->termios.c_cflag;
        speed_t speed;
 
        priv = usb_get_serial_port_data(port);
        if (priv->device_type == KOBIL_USBTWIN_PRODUCT_ID ||
                        priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID) {
                /* This device doesn't support ioctl calls */
-               *tty->termios = *old;
+               tty->termios = *old;
                return;
        }
 
                        urb_val |= SUSBCR_SPASB_EvenParity;
        } else
                urb_val |= SUSBCR_SPASB_NoParity;
-       tty->termios->c_cflag &= ~CMSPAR;
+       tty->termios.c_cflag &= ~CMSPAR;
        tty_encode_baud_rate(tty, speed, speed);
 
        result = usb_control_msg(port->serial->dev,
 
         * either.
         */
        spin_lock_irqsave(&priv->lock, flags);
-       if (tty && (tty->termios->c_cflag & CBAUD))
+       if (tty && (tty->termios.c_cflag & CBAUD))
                priv->control_state = TIOCM_DTR | TIOCM_RTS;
        else
                priv->control_state = 0;
 {
        struct usb_serial *serial = port->serial;
        struct mct_u232_private *priv = usb_get_serial_port_data(port);
-       struct ktermios *termios = tty->termios;
+       struct ktermios *termios = &tty->termios;
        unsigned int cflag = termios->c_cflag;
        unsigned int old_cflag = old_termios->c_cflag;
        unsigned long flags;
 
        }
 
        /* if we are implementing RTS/CTS, toggle that line */
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                mos7720_port->shadowMCR &= ~UART_MCR_RTS;
                write_mos_reg(port->serial, port->number - port->serial->minor,
                              MCR, mos7720_port->shadowMCR);
        }
 
        /* if we are implementing RTS/CTS, toggle that line */
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                mos7720_port->shadowMCR |= UART_MCR_RTS;
                write_mos_reg(port->serial, port->number - port->serial->minor,
                              MCR, mos7720_port->shadowMCR);
        lStop = 0x00;   /* 1 stop bit */
        lParity = 0x00; /* No parity */
 
-       cflag = tty->termios->c_cflag;
-       iflag = tty->termios->c_iflag;
+       cflag = tty->termios.c_cflag;
+       iflag = tty->termios.c_iflag;
 
        /* Change the number of bits */
        switch (cflag & CSIZE) {
 
        dbg("%s\n", "setting termios - ASPIRE");
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        dbg("%s - cflag %08x iflag %08x", __func__,
-           tty->termios->c_cflag,
-           RELEVANT_IFLAG(tty->termios->c_iflag));
+           tty->termios.c_cflag,
+           RELEVANT_IFLAG(tty->termios.c_iflag));
 
        dbg("%s - old cflag %08x old iflag %08x", __func__,
            old_termios->c_cflag,
 
                        return;
        }
        /* if we are implementing RTS/CTS, toggle that line */
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                mos7840_port->shadowMCR &= ~MCR_RTS;
                status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
                                         mos7840_port->shadowMCR);
        }
 
        /* if we are implementing RTS/CTS, toggle that line */
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                mos7840_port->shadowMCR |= MCR_RTS;
                status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
                                         mos7840_port->shadowMCR);
        lStop = LCR_STOP_1;
        lParity = LCR_PAR_NONE;
 
-       cflag = tty->termios->c_cflag;
-       iflag = tty->termios->c_iflag;
+       cflag = tty->termios.c_cflag;
+       iflag = tty->termios.c_iflag;
 
        /* Change the number of bits */
        if (cflag & CSIZE) {
 
        dbg("%s", "setting termios - ");
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        dbg("%s - clfag %08x iflag %08x", __func__,
-           tty->termios->c_cflag, RELEVANT_IFLAG(tty->termios->c_iflag));
+           tty->termios.c_cflag, RELEVANT_IFLAG(tty->termios.c_iflag));
        dbg("%s - old clfag %08x old iflag %08x", __func__,
            old_termios->c_cflag, RELEVANT_IFLAG(old_termios->c_iflag));
        dbg("%s - port %d", __func__, port->number);
 
 
 static void oti6858_init_termios(struct tty_struct *tty)
 {
-       *(tty->termios) = tty_std_termios;
-       tty->termios->c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL;
-       tty->termios->c_ispeed = 38400;
-       tty->termios->c_ospeed = 38400;
+       tty->termios = tty_std_termios;
+       tty->termios.c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL;
+       tty->termios.c_ispeed = 38400;
+       tty->termios.c_ospeed = 38400;
 }
 
 static void oti6858_set_termios(struct tty_struct *tty,
                return;
        }
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        spin_lock_irqsave(&priv->lock, flags);
        divisor = priv->pending_setup.divisor;
 
           serial settings even to the same values as before. Thus
           we actually need to filter in this specific case */
 
-       if (!tty_termios_hw_change(tty->termios, old_termios))
+       if (!tty_termios_hw_change(&tty->termios, old_termios))
                return;
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        buf = kzalloc(7, GFP_KERNEL);
        if (!buf) {
                dev_err(&port->dev, "%s - out of memory.\n", __func__);
                /* Report back no change occurred */
-               *tty->termios = *old_termios;
+               tty->termios = *old_termios;
                return;
        }
 
 
 {
        struct usb_device *dev = port->serial->dev;
        struct qt2_port_private *port_priv;
-       struct ktermios *termios = tty->termios;
+       struct ktermios *termios = &tty->termios;
        u16 baud;
        unsigned int cflag = termios->c_cflag;
        u16 new_lcr = 0;
        port_priv->device_port = (u8) device_port;
 
        if (tty)
-               qt2_set_termios(tty, port, tty->termios);
+               qt2_set_termios(tty, port, &tty->termios);
 
        return 0;
 
 
 static void sierra_set_termios(struct tty_struct *tty,
                struct usb_serial_port *port, struct ktermios *old_termios)
 {
-       tty_termios_copy_hw(tty->termios, old_termios);
+       tty_termios_copy_hw(&tty->termios, old_termios);
        sierra_send_setup(port);
 }
 
 
 static void spcp8x5_init_termios(struct tty_struct *tty)
 {
        /* for the 1st time call this function */
-       *(tty->termios) = tty_std_termios;
-       tty->termios->c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL;
-       tty->termios->c_ispeed = 115200;
-       tty->termios->c_ospeed = 115200;
+       tty->termios = tty_std_termios;
+       tty->termios.c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL;
+       tty->termios.c_ispeed = 115200;
+       tty->termios.c_ospeed = 115200;
 }
 
 /* set the serial param for transfer. we should check if we really need to
        struct usb_serial *serial = port->serial;
        struct spcp8x5_private *priv = usb_get_serial_port_data(port);
        unsigned long flags;
-       unsigned int cflag = tty->termios->c_cflag;
+       unsigned int cflag = tty->termios.c_cflag;
        unsigned int old_cflag = old_termios->c_cflag;
        unsigned short uartdata;
        unsigned char buf[2] = {0, 0};
 
 
        /* check that they really want us to change something */
-       if (!tty_termios_hw_change(tty->termios, old_termios))
+       if (!tty_termios_hw_change(&tty->termios, old_termios))
                return;
 
        /* set DTR/RTS active */
 
                               struct ktermios *old_termios)
 {
        struct usb_device *dev = port->serial->dev;
-       struct ktermios *termios = tty->termios;
+       struct ktermios *termios = &tty->termios;
        u16 baud, divisor, remainder;
        unsigned int cflag = termios->c_cflag;
        u16 urb_value = 0; /* will hold the new flags */
                dbg("%s - set uart failed", __func__);
 
        if (tty)
-               ssu100_set_termios(tty, port, tty->termios);
+               ssu100_set_termios(tty, port, &tty->termios);
 
        return usb_serial_generic_open(tty, port);
 }
 
        }
 
        if (tty)
-               ti_set_termios(tty, port, tty->termios);
+               ti_set_termios(tty, port, &tty->termios);
 
        dbg("%s - sending TI_OPEN_PORT", __func__);
        status = ti_command_out_sync(tdev, TI_OPEN_PORT,
        usb_clear_halt(dev, port->read_urb->pipe);
 
        if (tty)
-               ti_set_termios(tty, port, tty->termios);
+               ti_set_termios(tty, port, &tty->termios);
 
        dbg("%s - sending TI_OPEN_PORT (2)", __func__);
        status = ti_command_out_sync(tdev, TI_OPEN_PORT,
        int port_number = port->number - port->serial->minor;
        unsigned int mcr;
 
-       cflag = tty->termios->c_cflag;
-       iflag = tty->termios->c_iflag;
+       cflag = tty->termios.c_cflag;
+       iflag = tty->termios.c_iflag;
 
        dbg("%s - cflag %08x, iflag %08x", __func__, cflag, iflag);
        dbg("%s - old clfag %08x, old iflag %08x", __func__,
        }
 
        /* CMSPAR isn't supported by this driver */
-       tty->termios->c_cflag &= ~CMSPAR;
+       tty->termios.c_cflag &= ~CMSPAR;
 
        if (cflag & PARENB) {
                if (cflag & PARODD) {
 
        if (port->serial->type->set_termios)
                port->serial->type->set_termios(tty, port, old);
        else
-               tty_termios_copy_hw(tty->termios, old);
+               tty_termios_copy_hw(&tty->termios, old);
 }
 
 static int serial_break(struct tty_struct *tty, int break_state)
 
        struct usb_wwan_intf_private *intfdata = port->serial->private;
 
        /* Doesn't support option setting */
-       tty_termios_copy_hw(tty->termios, old_termios);
+       tty_termios_copy_hw(&tty->termios, old_termios);
 
        if (intfdata->send_setup)
                intfdata->send_setup(port);
 
 {
        struct usb_serial_port *port = tty->driver_data;
        struct whiteheat_port_settings port_settings;
-       unsigned int cflag = tty->termios->c_cflag;
+       unsigned int cflag = tty->termios.c_cflag;
 
        port_settings.port = port->number + 1;
 
 
 #define TTY_PARITY     3
 #define TTY_OVERRUN    4
 
-#define INTR_CHAR(tty) ((tty)->termios->c_cc[VINTR])
-#define QUIT_CHAR(tty) ((tty)->termios->c_cc[VQUIT])
-#define ERASE_CHAR(tty) ((tty)->termios->c_cc[VERASE])
-#define KILL_CHAR(tty) ((tty)->termios->c_cc[VKILL])
-#define EOF_CHAR(tty) ((tty)->termios->c_cc[VEOF])
-#define TIME_CHAR(tty) ((tty)->termios->c_cc[VTIME])
-#define MIN_CHAR(tty) ((tty)->termios->c_cc[VMIN])
-#define SWTC_CHAR(tty) ((tty)->termios->c_cc[VSWTC])
-#define START_CHAR(tty) ((tty)->termios->c_cc[VSTART])
-#define STOP_CHAR(tty) ((tty)->termios->c_cc[VSTOP])
-#define SUSP_CHAR(tty) ((tty)->termios->c_cc[VSUSP])
-#define EOL_CHAR(tty) ((tty)->termios->c_cc[VEOL])
-#define REPRINT_CHAR(tty) ((tty)->termios->c_cc[VREPRINT])
-#define DISCARD_CHAR(tty) ((tty)->termios->c_cc[VDISCARD])
-#define WERASE_CHAR(tty) ((tty)->termios->c_cc[VWERASE])
-#define LNEXT_CHAR(tty)        ((tty)->termios->c_cc[VLNEXT])
-#define EOL2_CHAR(tty) ((tty)->termios->c_cc[VEOL2])
-
-#define _I_FLAG(tty, f)        ((tty)->termios->c_iflag & (f))
-#define _O_FLAG(tty, f)        ((tty)->termios->c_oflag & (f))
-#define _C_FLAG(tty, f)        ((tty)->termios->c_cflag & (f))
-#define _L_FLAG(tty, f)        ((tty)->termios->c_lflag & (f))
+#define INTR_CHAR(tty) ((tty)->termios.c_cc[VINTR])
+#define QUIT_CHAR(tty) ((tty)->termios.c_cc[VQUIT])
+#define ERASE_CHAR(tty) ((tty)->termios.c_cc[VERASE])
+#define KILL_CHAR(tty) ((tty)->termios.c_cc[VKILL])
+#define EOF_CHAR(tty) ((tty)->termios.c_cc[VEOF])
+#define TIME_CHAR(tty) ((tty)->termios.c_cc[VTIME])
+#define MIN_CHAR(tty) ((tty)->termios.c_cc[VMIN])
+#define SWTC_CHAR(tty) ((tty)->termios.c_cc[VSWTC])
+#define START_CHAR(tty) ((tty)->termios.c_cc[VSTART])
+#define STOP_CHAR(tty) ((tty)->termios.c_cc[VSTOP])
+#define SUSP_CHAR(tty) ((tty)->termios.c_cc[VSUSP])
+#define EOL_CHAR(tty) ((tty)->termios.c_cc[VEOL])
+#define REPRINT_CHAR(tty) ((tty)->termios.c_cc[VREPRINT])
+#define DISCARD_CHAR(tty) ((tty)->termios.c_cc[VDISCARD])
+#define WERASE_CHAR(tty) ((tty)->termios.c_cc[VWERASE])
+#define LNEXT_CHAR(tty)        ((tty)->termios.c_cc[VLNEXT])
+#define EOL2_CHAR(tty) ((tty)->termios.c_cc[VEOL2])
+
+#define _I_FLAG(tty, f)        ((tty)->termios.c_iflag & (f))
+#define _O_FLAG(tty, f)        ((tty)->termios.c_oflag & (f))
+#define _C_FLAG(tty, f)        ((tty)->termios.c_cflag & (f))
+#define _L_FLAG(tty, f)        ((tty)->termios.c_lflag & (f))
 
 #define I_IGNBRK(tty)  _I_FLAG((tty), IGNBRK)
 #define I_BRKINT(tty)  _I_FLAG((tty), BRKINT)
        struct mutex termios_mutex;
        spinlock_t ctrl_lock;
        /* Termios values are protected by the termios mutex */
-       struct ktermios *termios, *termios_locked;
+       struct ktermios termios, termios_locked;
        struct termiox *termiox;        /* May be NULL for unsupported */
        char name[64];
        struct pid *pgrp;               /* Protected by ctrl lock */
 
 
 static void rfcomm_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
 {
-       struct ktermios *new = tty->termios;
+       struct ktermios *new = &tty->termios;
        int old_baud_rate = tty_termios_baud_rate(old);
        int new_baud_rate = tty_termios_baud_rate(new);
 
 
                return 0;
        }
 
-       if (tty->termios->c_cflag & CLOCAL) {
+       if (tty->termios.c_cflag & CLOCAL) {
                IRDA_DEBUG(1, "%s(), doing CLOCAL!\n", __func__ );
                do_clocal = 1;
        }
        port->blocked_open++;
 
        while (1) {
-               if (tty->termios->c_cflag & CBAUD)
+               if (tty->termios.c_cflag & CBAUD)
                        tty_port_raise_dtr_rts(port);
 
                current->state = TASK_INTERRUPTIBLE;
                 *
                 * Note this is completely usafe and doesn't work properly
                 */
-               tty->termios->c_iflag = 0;
-               tty->termios->c_oflag = 0;
+               tty->termios.c_iflag = 0;
+               tty->termios.c_oflag = 0;
 
                /* Insert into hash */
                /* FIXME there is a window from find to here */
                ircomm_tty_send_xchar(tty, STOP_CHAR(tty));
 
        /* Hardware flow control? */
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                self->settings.dte &= ~IRCOMM_RTS;
                self->settings.dte |= IRCOMM_DELTA_RTS;
 
        }
 
        /* Using hardware flow control? */
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                self->settings.dte |= (IRCOMM_RTS|IRCOMM_DELTA_RTS);
 
                ircomm_param_request(self, IRCOMM_DTE, TRUE);
 
        if (!self->ircomm)
                return;
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        /*  byte size and parity */
        switch (cflag & CSIZE) {
                            struct ktermios *old_termios)
 {
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
-       unsigned int cflag = tty->termios->c_cflag;
+       unsigned int cflag = tty->termios.c_cflag;
 
        IRDA_DEBUG(2, "%s()\n", __func__ );
 
        if ((cflag == old_termios->c_cflag) &&
-           (RELEVANT_IFLAG(tty->termios->c_iflag) ==
+           (RELEVANT_IFLAG(tty->termios.c_iflag) ==
             RELEVANT_IFLAG(old_termios->c_iflag)))
        {
                return;
        if (!(old_termios->c_cflag & CBAUD) &&
            (cflag & CBAUD)) {
                self->settings.dte |= IRCOMM_DTR;
-               if (!(tty->termios->c_cflag & CRTSCTS) ||
+               if (!(tty->termios.c_cflag & CRTSCTS) ||
                    !test_bit(TTY_THROTTLED, &tty->flags)) {
                        self->settings.dte |= IRCOMM_RTS;
                }
 
        /* Handle turning off CRTSCTS */
        if ((old_termios->c_cflag & CRTSCTS) &&
-           !(tty->termios->c_cflag & CRTSCTS))
+           !(tty->termios.c_cflag & CRTSCTS))
        {
                tty->hw_stopped = 0;
                ircomm_tty_start(tty);