|
@@ -58,6 +58,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)
|
|
@@ -768,7 +769,6 @@ static void sierra_close(struct usb_serial_port *port)
|
|
|
|
|
|
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);
|
|
@@ -779,6 +779,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 (;;) {
|
|
@@ -834,9 +836,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);
|
|
|
|