summaryrefslogtreecommitdiff
path: root/drivers/usb/misc/diag_ipc_bridge.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/misc/diag_ipc_bridge.c')
-rw-r--r--drivers/usb/misc/diag_ipc_bridge.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/usb/misc/diag_ipc_bridge.c b/drivers/usb/misc/diag_ipc_bridge.c
index cb3aa9375ca3..a487f7c458ed 100644
--- a/drivers/usb/misc/diag_ipc_bridge.c
+++ b/drivers/usb/misc/diag_ipc_bridge.c
@@ -300,6 +300,8 @@ int diag_bridge_read(int id, char *data, int size)
pr_err_ratelimited("submitting urb failed err:%d", ret);
dev->pending_reads--;
usb_unanchor_urb(urb);
+ usb_autopm_put_interface(dev->ifc);
+ goto free_error;
}
if (id == IPC_BRIDGE) {
@@ -307,13 +309,15 @@ int diag_bridge_read(int id, char *data, int size)
ret = dev->read_result;
}
- usb_autopm_put_interface(dev->ifc);
+ usb_free_urb(urb);
+ mutex_unlock(&dev->read_mutex);
+ return ret;
free_error:
usb_free_urb(urb);
put_error:
- if (ret < 0) /* otherwise this is done in the completion handler */
- kref_put(&dev->kref, diag_bridge_delete);
+ /* If URB submit successful, this is done in the completion handler */
+ kref_put(&dev->kref, diag_bridge_delete);
error:
mutex_unlock(&dev->read_mutex);
return ret;
@@ -449,11 +453,15 @@ int diag_bridge_write(int id, char *data, int size)
ret = dev->write_result;
}
+ usb_free_urb(urb);
+ mutex_unlock(&dev->write_mutex);
+ return ret;
+
free_error:
usb_free_urb(urb);
put_error:
- if (ret < 0) /* otherwise this is done in the completion handler */
- kref_put(&dev->kref, diag_bridge_delete);
+ /* If URB submit successful, this is done in the completion handler */
+ kref_put(&dev->kref, diag_bridge_delete);
error:
mutex_unlock(&dev->write_mutex);
return ret;