Submitted urbs are not allowed when system is suspended.
Thus the submitted urb waiting at interrupt pipe is killed
during suspend callback and submitted again when system resumes.

Signed-off-by: Guido Kiener <guido.kie...@rohde-schwarz.com>
Reviewed-by: Steve Bayless <steve_bayl...@keysight.com>
---
 drivers/usb/class/usbtmc.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c
index b8a4140bd161..9953b62b7db4 100644
--- a/drivers/usb/class/usbtmc.c
+++ b/drivers/usb/class/usbtmc.c
@@ -2314,7 +2314,9 @@ static void usbtmc_free_int(struct usbtmc_device_data 
*data)
                return;
        usb_kill_urb(data->iin_urb);
        kfree(data->iin_buffer);
+       data->iin_buffer = NULL;
        usb_free_urb(data->iin_urb);
+       data->iin_urb = NULL;
        kref_put(&data->kref, usbtmc_delete);
 }
 
@@ -2496,13 +2498,25 @@ static int usbtmc_suspend(struct usb_interface *intf, 
pm_message_t message)
                                       file_elem);
                usbtmc_draw_down(file_data);
        }
+
+       if (data->iin_ep_present && data->iin_urb)
+               usb_kill_urb(data->iin_urb);
+
        mutex_unlock(&data->io_mutex);
        return 0;
 }
 
 static int usbtmc_resume(struct usb_interface *intf)
 {
-       return 0;
+       struct usbtmc_device_data *data = usb_get_intfdata(intf);
+       int retcode = 0;
+
+       if (data->iin_ep_present && data->iin_urb)
+               retcode = usb_submit_urb(data->iin_urb, GFP_KERNEL);
+       if (retcode)
+               dev_err(&intf->dev, "Failed to submit iin_urb\n");
+
+       return retcode;
 }
 
 static int usbtmc_pre_reset(struct usb_interface *intf)
-- 
2.17.1

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to