summaryrefslogtreecommitdiff
path: root/usbredirhost/usbredirhost.c
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2012-02-12 15:51:41 +0100
committerHans de Goede <hdegoede@redhat.com>2012-02-14 18:56:08 +0100
commitf12ed95d1721918d05ff1f7cdb9293aabe7e0588 (patch)
treec69a877cdc93fe7a0b216a72fd0aeda5eea2b3a1 /usbredirhost/usbredirhost.c
parentdf5b37a3c3409a8d686fecbb8cee1d84e357f8d3 (diff)
usbredirhost: Better locking for interrupt receiving handling
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Diffstat (limited to 'usbredirhost/usbredirhost.c')
-rw-r--r--usbredirhost/usbredirhost.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/usbredirhost/usbredirhost.c b/usbredirhost/usbredirhost.c
index 6bd28ea..0801d4d 100644
--- a/usbredirhost/usbredirhost.c
+++ b/usbredirhost/usbredirhost.c
@@ -1531,27 +1531,27 @@ static void usbredirhost_start_interrupt_receiving(void *priv, uint32_t id,
uint8_t ep = start_interrupt_receiving->endpoint;
int status;
+ LOCK(host);
+
if (host->disconnected) {
- usbredirhost_send_interrupt_recv_status(host, id, ep,
- usb_redir_ioerror);
- FLUSH(host);
- return;
+ status = usb_redir_ioerror;
+ goto leave;
}
if (host->endpoint[EP2I(ep)].interrupt_in_transfer) {
ERROR("received interrupt start for already active ep %02X", ep);
- usbredirhost_send_interrupt_recv_status(host, id, ep, usb_redir_inval);
- FLUSH(host);
- return;
+ status = usb_redir_inval;
+ goto leave;
}
status = usbredirhost_alloc_interrupt_in_transfer(host, ep);
if (status != usb_redir_success) {
- usbredirhost_send_interrupt_recv_status(host, id, ep, usb_redir_stall);
- FLUSH(host);
- return;
+ status = usb_redir_stall;
+ goto leave;
}
status = usbredirhost_submit_interrupt_in_transfer(host, ep);
+leave:
+ UNLOCK(host);
usbredirhost_send_interrupt_recv_status(host, id, ep, status);
FLUSH(host);
}