#include <linux/usb.h>
 #include <linux/usb/serial.h>
 #include <linux/uaccess.h>
+#include "usb-wwan.h"
 
 /*
  * Version Information
 
        /*--2: Start reading from the device */
        dbg("%s: setting up bulk read callback", __func__);
-       usb_serial_generic_open(tty, port);
+       usb_wwan_open(tty, port);
 
        /*--3: Tell the modem to open the floodgates on the rx bulk channel */
        dbg("%s:asking modem for RxRead (RXBULK_ON)", __func__);
        return 0;
 }
 
+/* fake probe - only to allocate data structures */
+static int ipw_probe(struct usb_serial *serial, const struct usb_device_id *id)
+{
+       struct usb_wwan_intf_private *data;
+
+       data = kzalloc(sizeof(struct usb_wwan_intf_private), GFP_KERNEL);
+       if (!data)
+               return -ENOMEM;
+
+       spin_lock_init(&data->susp_lock);
+       usb_set_serial_data(serial, data);
+       return 0;
+}
+
+static void ipw_release(struct usb_serial *serial)
+{
+       struct usb_wwan_intf_private *data = usb_get_serial_data(serial);
+
+       usb_wwan_release(serial);
+       usb_set_serial_data(serial, NULL);
+       kfree(data);
+}
+
 static void ipw_dtr_rts(struct usb_serial_port *port, int on)
 {
        struct usb_device *dev = port->serial->dev;
                dev_err(&port->dev,
                        "Disabling bulk RxRead failed (error = %d)\n", result);
 
-       usb_serial_generic_close(port);
+       usb_wwan_close(port);
 }
 
 static struct usb_serial_driver ipw_device = {
        .usb_driver =           &usb_ipw_driver,
        .id_table =             usb_ipw_ids,
        .num_ports =            1,
+       .disconnect =           usb_wwan_disconnect,
        .open =                 ipw_open,
        .close =                ipw_close,
+       .probe =                ipw_probe,
+       .attach =               usb_wwan_startup,
+       .release =              ipw_release,
        .dtr_rts =              ipw_dtr_rts,
+       .write =                usb_wwan_write,
 };