USB: sierra: avoid CDC class functions on "68A3" devices
[pandora-kernel.git] / drivers / usb / serial / sierra.c
index bed69cc..20219ab 100644 (file)
@@ -59,6 +59,7 @@ struct sierra_intf_private {
        spinlock_t susp_lock;
        unsigned int suspended:1;
        int in_flight;
+       unsigned int open_ports;
 };
 
 static int sierra_set_power_state(struct usb_device *udev, __u16 swiState)
@@ -295,14 +296,16 @@ static const struct usb_device_id id_table[] = {
        { USB_DEVICE(0x1199, 0x68A2),   /* Sierra Wireless MC77xx in QMI mode */
          .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
        },
-       { USB_DEVICE(0x1199, 0x68A3),   /* Sierra Wireless Direct IP modems */
+       /* Sierra Wireless Direct IP modems */
+       { USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x68A3, 0xFF, 0xFF, 0xFF),
          .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
        },
        /* AT&T Direct IP LTE modems */
        { USB_DEVICE_AND_INTERFACE_INFO(0x0F3D, 0x68AA, 0xFF, 0xFF, 0xFF),
          .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
        },
-       { USB_DEVICE(0x0f3d, 0x68A3),   /* Airprime/Sierra Wireless Direct IP modems */
+       /* Airprime/Sierra Wireless Direct IP modems */
+       { USB_DEVICE_AND_INTERFACE_INFO(0x0F3D, 0x68A3, 0xFF, 0xFF, 0xFF),
          .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
        },
 
@@ -814,7 +817,6 @@ static void sierra_close(struct usb_serial_port *port)
        if (serial->dev) {
                mutex_lock(&serial->disc_mutex);
                if (!serial->disconnected) {
-                       serial->interface->needs_remote_wakeup = 0;
                        /* odd error handling due to pm counters */
                        if (!usb_autopm_get_interface(serial->interface))
                                sierra_send_setup(port);
@@ -825,6 +827,8 @@ static void sierra_close(struct usb_serial_port *port)
                mutex_unlock(&serial->disc_mutex);
                spin_lock_irq(&intfdata->susp_lock);
                portdata->opened = 0;
+               if (--intfdata->open_ports == 0)
+                       serial->interface->needs_remote_wakeup = 0;
                spin_unlock_irq(&intfdata->susp_lock);
 
                for (;;) {
@@ -885,9 +889,10 @@ static int sierra_open(struct tty_struct *tty, struct usb_serial_port *port)
 
        sierra_send_setup(port);
 
-       serial->interface->needs_remote_wakeup = 1;
        spin_lock_irq(&intfdata->susp_lock);
        portdata->opened = 1;
+       if (++intfdata->open_ports == 1)
+               serial->interface->needs_remote_wakeup = 1;
        spin_unlock_irq(&intfdata->susp_lock);
        usb_autopm_put_interface(serial->interface);