}
 }
 
+void deactivate_chan(struct list_head *chans, int irq)
+{
+       struct list_head *ele;
+
+       struct chan *chan;
+       list_for_each(ele, chans) {
+               chan = list_entry(ele, struct chan, list);
+
+               if(chan->enabled && chan->input)
+                       deactivate_fd(chan->fd, irq);
+       }
+}
+
+void reactivate_chan(struct list_head *chans, int irq)
+{
+       struct list_head *ele;
+       struct chan *chan;
+
+       list_for_each(ele, chans) {
+               chan = list_entry(ele, struct chan, list);
+
+               if(chan->enabled && chan->input)
+                       reactivate_fd(chan->fd, irq);
+       }
+}
+
 int write_chan(struct list_head *chans, const char *buf, int len,
               int write_irq)
 {
 
 {
        struct line *line = arg;
 
-       chan_interrupt(&line->chan_list, &line->task, line->tty,
-                      line->driver->read_irq);
+       if(!line->throttled)
+               chan_interrupt(&line->chan_list, &line->task, line->tty,
+                              line->driver->read_irq);
 }
 
 /* Returns the free space inside the ring buffer of this line.
        return ret;
 }
 
+void line_throttle(struct tty_struct *tty)
+{
+       struct line *line = tty->driver_data;
+
+       deactivate_chan(&line->chan_list, line->driver->read_irq);
+       line->throttled = 1;
+}
+
+void line_unthrottle(struct tty_struct *tty)
+{
+       struct line *line = tty->driver_data;
+
+       line->throttled = 0;
+       chan_interrupt(&line->chan_list, &line->task, tty,
+                      line->driver->read_irq);
+
+       /* Maybe there is enough stuff pending that calling the interrupt
+        * throttles us again.  In this case, line->throttled will be 1
+        * again and we shouldn't turn the interrupt back on.
+        */
+       if(!line->throttled)
+               reactivate_chan(&line->chan_list, line->driver->read_irq);
+}
+
 static irqreturn_t line_write_interrupt(int irq, void *data,
                                        struct pt_regs *unused)
 {
 
        return;
 }
 
-static void ssl_throttle(struct tty_struct * tty)
-{
-       printk(KERN_ERR "Someone should implement ssl_throttle\n");
-}
-
-static void ssl_unthrottle(struct tty_struct * tty)
-{
-       printk(KERN_ERR "Someone should implement ssl_unthrottle\n");
-}
-
 static void ssl_stop(struct tty_struct *tty)
 {
        printk(KERN_ERR "Someone should implement ssl_stop\n");
        .flush_chars            = line_flush_chars,
        .set_termios            = line_set_termios,
        .ioctl                  = line_ioctl,
+       .throttle               = line_throttle,
+       .unthrottle             = line_unthrottle,
 #if 0
-       .throttle               = ssl_throttle,
-       .unthrottle             = ssl_unthrottle,
        .stop                   = ssl_stop,
        .start                  = ssl_start,
        .hangup                 = ssl_hangup,
 
        .flush_chars            = line_flush_chars,
        .set_termios            = line_set_termios,
        .ioctl                  = line_ioctl,
+       .throttle               = line_throttle,
+       .unthrottle             = line_unthrottle,
 };
 
 static void uml_console_write(struct console *console, const char *string,
 
                              int len);
 extern int console_open_chan(struct line *line, struct console *co,
                             struct chan_opts *opts);
+extern void deactivate_chan(struct list_head *chans, int irq);
+extern void reactivate_chan(struct list_head *chans, int irq);
 extern void chan_enable_winch(struct list_head *chans, struct tty_struct *tty);
 extern void enable_chan(struct line *line);
 extern void close_chan(struct list_head *chans, int delay_free_irq);
 
        struct list_head chan_list;
        int valid;
        int count;
+       int throttled;
        /*This lock is actually, mostly, local to*/
        spinlock_t lock;
 
        { init_str :    str, \
          init_pri :    INIT_STATIC, \
          valid :       1, \
+         throttled :   0, \
          lock :        SPIN_LOCK_UNLOCKED, \
          buffer :      NULL, \
          head :        NULL, \
 extern int line_write_room(struct tty_struct *tty);
 extern int line_ioctl(struct tty_struct *tty, struct file * file,
                      unsigned int cmd, unsigned long arg);
+extern void line_throttle(struct tty_struct *tty);
+extern void line_unthrottle(struct tty_struct *tty);
 
 extern char *add_xterm_umid(char *base);
 extern int line_setup_irq(int fd, int input, int output, struct line *line,