#include <linux/seq_file.h>
 #include <linux/termios.h>
 #include <linux/tty.h>
+#include <linux/tty_flip.h>
 #include <linux/interrupt.h>
 #include <linux/device.h>              /* for MODULE_ALIAS_CHARDEV_MAJOR */
 
                                      struct sk_buff *skb)
 {
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;
-       struct tty_ldisc *ld;
 
        IRDA_DEBUG(2, "%s()\n", __func__ );
 
        }
 
        /*
-        * Just give it over to the line discipline. There is no need to
-        * involve the flip buffers, since we are not running in an interrupt
-        * handler
+        * Use flip buffer functions since the code may be called from interrupt
+        * context
         */
-
-       ld = tty_ldisc_ref(self->tty);
-       if (ld)
-               ld->ops->receive_buf(self->tty, skb->data, NULL, skb->len);
-       tty_ldisc_deref(ld);
+       tty_insert_flip_string(self->tty, skb->data, skb->len);
+       tty_flip_buffer_push(self->tty);
 
        /* No need to kfree_skb - see ircomm_ttp_data_indication() */