USB: cdc-acm: add device id for GW Instek AFG-2225
[platform/adaptation/renesas_rcar/renesas_kernel.git] / drivers / usb / class / cdc-acm.c
index 61738d9..c43d962 100644 (file)
@@ -506,6 +506,7 @@ static int acm_port_activate(struct tty_port *port, struct tty_struct *tty)
 {
        struct acm *acm = container_of(port, struct acm, port);
        int retval = -ENODEV;
+       int i;
 
        dev_dbg(&acm->control->dev, "%s\n", __func__);
 
@@ -554,6 +555,8 @@ static int acm_port_activate(struct tty_port *port, struct tty_struct *tty)
        return 0;
 
 error_submit_read_urbs:
+       for (i = 0; i < acm->rx_buflimit; i++)
+               usb_kill_urb(acm->read_urbs[i]);
        acm->ctrlout = 0;
        acm_set_control(acm, acm->ctrlout);
 error_set_control:
@@ -584,12 +587,13 @@ static void acm_port_shutdown(struct tty_port *port)
        struct urb *urb;
        struct acm_wb *wb;
        int i;
+       int pm_err;
 
        dev_dbg(&acm->control->dev, "%s\n", __func__);
 
        mutex_lock(&acm->mutex);
        if (!acm->disconnected) {
-               usb_autopm_get_interface(acm->control);
+               pm_err = usb_autopm_get_interface(acm->control);
                acm_set_control(acm, acm->ctrlout = 0);
 
                for (;;) {
@@ -607,7 +611,8 @@ static void acm_port_shutdown(struct tty_port *port)
                for (i = 0; i < acm->rx_buflimit; i++)
                        usb_kill_urb(acm->read_urbs[i]);
                acm->control->needs_remote_wakeup = 0;
-               usb_autopm_put_interface(acm->control);
+               if (!pm_err)
+                       usb_autopm_put_interface(acm->control);
        }
        mutex_unlock(&acm->mutex);
 }
@@ -666,7 +671,13 @@ static int acm_tty_write(struct tty_struct *tty,
        memcpy(wb->buf, buf, count);
        wb->len = count;
 
-       usb_autopm_get_interface_async(acm->control);
+       stat = usb_autopm_get_interface_async(acm->control);
+       if (stat) {
+               wb->use = 0;
+               spin_unlock_irqrestore(&acm->write_lock, flags);
+               return stat;
+       }
+
        if (acm->susp_count) {
                usb_anchor_urb(wb->urb, &acm->delayed);
                spin_unlock_irqrestore(&acm->write_lock, flags);
@@ -1661,6 +1672,7 @@ static const struct usb_device_id acm_ids[] = {
        { USB_DEVICE(0x0572, 0x1328), /* Shiro / Aztech USB MODEM UM-3100 */
        .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
        },
+       { USB_DEVICE(0x2184, 0x001c) }, /* GW Instek AFG-2225 */
        { USB_DEVICE(0x22b8, 0x6425), /* Motorola MOTOMAGX phones */
        },
        /* Motorola H24 HSPA module: */