portdata = usb_get_serial_port_data(port);
        intfdata = serial->private;
 
+       if (port->interrupt_in_urb) {
+               err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
+               if (err) {
+                       dev_dbg(&port->dev, "%s: submit int urb failed: %d\n",
+                               __func__, err);
+               }
+       }
+
        /* Start reading from the IN endpoint */
        for (i = 0; i < N_IN_URB; i++) {
                urb = portdata->in_urbs[i];
                usb_kill_urb(portdata->in_urbs[i]);
        for (i = 0; i < N_OUT_URB; i++)
                usb_kill_urb(portdata->out_urbs[i]);
+       usb_kill_urb(port->interrupt_in_urb);
 
        /* balancing - important as an error cannot be handled*/
        usb_autopm_get_interface_no_resume(serial->interface);
        struct usb_wwan_port_private *portdata;
        struct urb *urb;
        u8 *buffer;
-       int err;
        int i;
 
        if (!port->bulk_in_size || !port->bulk_out_size)
 
        usb_set_serial_port_data(port, portdata);
 
-       if (port->interrupt_in_urb) {
-               err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
-               if (err)
-                       dev_dbg(&port->dev, "%s: submit irq_in urb failed %d\n",
-                               __func__, err);
-       }
-
        return 0;
 
 bail_out_error2:
        struct urb *urb;
        int err = 0;
 
-       /* get the interrupt URBs resubmitted unconditionally */
-       for (i = 0; i < serial->num_ports; i++) {
-               port = serial->port[i];
-               if (!port->interrupt_in_urb) {
-                       dev_dbg(&port->dev, "%s: No interrupt URB for port\n", __func__);
-                       continue;
-               }
-               err = usb_submit_urb(port->interrupt_in_urb, GFP_NOIO);
-               dev_dbg(&port->dev, "Submitted interrupt URB for port (result %d)\n", err);
-               if (err < 0) {
-                       dev_err(&port->dev, "%s: Error %d for interrupt URB\n",
-                               __func__, err);
-                       goto err_out;
-               }
-       }
-
        spin_lock_irq(&intfdata->susp_lock);
        for (i = 0; i < serial->num_ports; i++) {
                /* walk all ports */
                if (!portdata || !portdata->opened)
                        continue;
 
+               if (port->interrupt_in_urb) {
+                       err = usb_submit_urb(port->interrupt_in_urb,
+                                       GFP_ATOMIC);
+                       if (err) {
+                               dev_err(&port->dev,
+                                       "%s: submit int urb failed: %d\n",
+                                       __func__, err);
+                       }
+               }
+
                for (j = 0; j < N_IN_URB; j++) {
                        urb = portdata->in_urbs[j];
                        err = usb_submit_urb(urb, GFP_ATOMIC);