static int  ftdi_write_room(struct tty_struct *tty);
 static int  ftdi_chars_in_buffer(struct tty_struct *tty);
 static void ftdi_write_bulk_callback(struct urb *urb);
-static void ftdi_read_bulk_callback(struct urb *urb);
-static void ftdi_process_read(struct usb_serial_port *port);
+static void ftdi_process_read_urb(struct urb *urb);
 static void ftdi_set_termios(struct tty_struct *tty,
                        struct usb_serial_port *port, struct ktermios *old);
 static int  ftdi_tiocmget(struct tty_struct *tty, struct file *file);
 static int  ftdi_ioctl(struct tty_struct *tty, struct file *file,
                        unsigned int cmd, unsigned long arg);
 static void ftdi_break_ctl(struct tty_struct *tty, int break_state);
-static void ftdi_throttle(struct tty_struct *tty);
-static void ftdi_unthrottle(struct tty_struct *tty);
 
 static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base);
 static unsigned short int ftdi_232am_baud_to_divisor(int baud);
        .open =                 ftdi_open,
        .close =                ftdi_close,
        .dtr_rts =              ftdi_dtr_rts,
-       .throttle =             ftdi_throttle,
-       .unthrottle =           ftdi_unthrottle,
+       .throttle =             usb_serial_generic_throttle,
+       .unthrottle =           usb_serial_generic_unthrottle,
        .write =                ftdi_write,
        .write_room =           ftdi_write_room,
        .chars_in_buffer =      ftdi_chars_in_buffer,
-       .read_bulk_callback =   ftdi_read_bulk_callback,
+       .process_read_urb =     ftdi_process_read_urb,
        .write_bulk_callback =  ftdi_write_bulk_callback,
        .tiocmget =             ftdi_tiocmget,
        .tiocmset =             ftdi_tiocmset,
        return 0;
 }
 
-static int ftdi_submit_read_urb(struct usb_serial_port *port, gfp_t mem_flags)
-{
-       struct urb *urb = port->read_urb;
-       struct usb_serial *serial = port->serial;
-       int result;
-
-       usb_fill_bulk_urb(urb, serial->dev,
-                          usb_rcvbulkpipe(serial->dev,
-                                       port->bulk_in_endpointAddress),
-                          urb->transfer_buffer,
-                          urb->transfer_buffer_length,
-                          ftdi_read_bulk_callback, port);
-       result = usb_submit_urb(urb, mem_flags);
-       if (result && result != -EPERM)
-               dev_err(&port->dev,
-                       "%s - failed submitting read urb, error %d\n",
-                                                       __func__, result);
-       return result;
-}
-
 static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port)
 { /* ftdi_open */
        struct usb_device *dev = port->serial->dev;
        struct ftdi_private *priv = usb_get_serial_port_data(port);
-       unsigned long flags;
        int result;
 
        dbg("%s", __func__);
        if (tty)
                ftdi_set_termios(tty, port, tty->termios);
 
-       /* Not throttled */
-       spin_lock_irqsave(&port->lock, flags);
-       port->throttled = 0;
-       port->throttle_req = 0;
-       spin_unlock_irqrestore(&port->lock, flags);
-
        /* Start reading from the device */
-       result = ftdi_submit_read_urb(port, GFP_KERNEL);
+       result = usb_serial_generic_open(tty, port);
        if (!result)
                kref_get(&priv->kref);
 
        return len;
 }
 
-static void ftdi_process_read(struct usb_serial_port *port)
+static void ftdi_process_read_urb(struct urb *urb)
 {
-       struct urb *urb = port->read_urb;
+       struct usb_serial_port *port = urb->context;
        struct tty_struct *tty;
        struct ftdi_private *priv = usb_get_serial_port_data(port);
        char *data = (char *)urb->transfer_buffer;
        tty_kref_put(tty);
 }
 
-static void ftdi_read_bulk_callback(struct urb *urb)
-{
-       struct usb_serial_port *port = urb->context;
-       unsigned long flags;
-
-       dbg("%s - port %d", __func__, port->number);
-
-       if (urb->status) {
-               dbg("%s - nonzero read bulk status received: %d",
-                                               __func__, urb->status);
-               return;
-       }
-
-       usb_serial_debug_data(debug, &port->dev, __func__,
-                               urb->actual_length, urb->transfer_buffer);
-       ftdi_process_read(port);
-
-       spin_lock_irqsave(&port->lock, flags);
-       port->throttled = port->throttle_req;
-       if (!port->throttled) {
-               spin_unlock_irqrestore(&port->lock, flags);
-               ftdi_submit_read_urb(port, GFP_ATOMIC);
-       } else
-               spin_unlock_irqrestore(&port->lock, flags);
-}
-
 static void ftdi_break_ctl(struct tty_struct *tty, int break_state)
 {
        struct usb_serial_port *port = tty->driver_data;
        return -ENOIOCTLCMD;
 }
 
-static void ftdi_throttle(struct tty_struct *tty)
-{
-       struct usb_serial_port *port = tty->driver_data;
-       unsigned long flags;
-
-       dbg("%s - port %d", __func__, port->number);
-
-       spin_lock_irqsave(&port->lock, flags);
-       port->throttle_req = 1;
-       spin_unlock_irqrestore(&port->lock, flags);
-}
-
-void ftdi_unthrottle(struct tty_struct *tty)
-{
-       struct usb_serial_port *port = tty->driver_data;
-       int was_throttled;
-       unsigned long flags;
-
-       dbg("%s - port %d", __func__, port->number);
-
-       spin_lock_irqsave(&port->lock, flags);
-       was_throttled = port->throttled;
-       port->throttled = port->throttle_req = 0;
-       spin_unlock_irqrestore(&port->lock, flags);
-
-       if (was_throttled)
-               ftdi_submit_read_urb(port, GFP_KERNEL);
-}
-
 static int __init ftdi_init(void)
 {
        int retval;