static ssize_t gsmld_write(struct tty_struct *tty, struct file *file,
                           const unsigned char *buf, size_t nr)
 {
-       int space = tty_write_room(tty);
+       struct gsm_mux *gsm = tty->disc_data;
+       unsigned long flags;
+       int space;
+       int ret;
+
+       if (!gsm)
+               return -ENODEV;
+
+       ret = -ENOBUFS;
+       spin_lock_irqsave(&gsm->tx_lock, flags);
+       space = tty_write_room(tty);
        if (space >= nr)
-               return tty->ops->write(tty, buf, nr);
-       set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
-       return -ENOBUFS;
+               ret = tty->ops->write(tty, buf, nr);
+       else
+               set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
+       spin_unlock_irqrestore(&gsm->tx_lock, flags);
+
+       return ret;
 }
 
 /**