summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2012-12-03 13:34:41 +0100
committerHans de Goede <hdegoede@redhat.com>2012-12-05 00:39:09 +0100
commitbac505aabbd45eb7d45466ab778a8386d860cbe4 (patch)
tree7b94cb73dfbb3508f66b7f79c152670960fdc5f2
parentc2bc3c9ebbde2a2e00334c46283d24e2ce6619e3 (diff)
usbredirhost: Misc. stream cleanups
1) Any stream failure which causes the stream to stop, should return usb_redir_stall, push this logic into the actual functions causing the failure, rather then letting the callers translate the error code. 2) Rename usbredirhost_alloc_stream to usbredirhost_alloc_stream_unlocked, add a new usbredirhost_alloc_stream() which does the locking on behalf of the caller. Signed-off-by: Hans de Goede <hdegoede@redhat.com>
-rw-r--r--usbredirhost/usbredirhost.c53
1 files changed, 28 insertions, 25 deletions
diff --git a/usbredirhost/usbredirhost.c b/usbredirhost/usbredirhost.c
index c37cba3..2663d6a 100644
--- a/usbredirhost/usbredirhost.c
+++ b/usbredirhost/usbredirhost.c
@@ -889,7 +889,7 @@ static int usbredirhost_submit_stream_transfer_unlocked(
ERROR("error submitting transfer on ep %02X: %s, stopping stream",
ep, libusb_error_name(r));
usbredirhost_cancel_stream_unlocked(host, ep);
- return libusb_status_or_error_to_redir_status(host, r);
+ return usb_redir_stall;
}
transfer->packet_idx = SUBMITTED_IDX;
@@ -914,21 +914,25 @@ static int usbredirhost_start_stream_unlocked(struct usbredirhost *host,
status = usbredirhost_submit_stream_transfer_unlocked(host,
host->endpoint[EP2I(ep)].transfer[i]);
if (status != usb_redir_success) {
- return usb_redir_stall;
+ return status;
}
}
host->endpoint[EP2I(ep)].stream_started = 1;
return usb_redir_success;
}
-/* Called from both parser read and packet complete callbacks,
- caller must hold host-lock */
-static int usbredirhost_alloc_stream(struct usbredirhost *host, uint8_t ep,
- uint8_t type, uint8_t pkts_per_transfer, uint8_t transfer_count)
+/* Called from both parser read and packet complete callbacks */
+static int usbredirhost_alloc_stream_unlocked(struct usbredirhost *host,
+ uint8_t ep, uint8_t type, uint8_t pkts_per_transfer,
+ uint8_t transfer_count)
{
int i, buf_size;
unsigned char *buffer;
+ if (host->disconnected) {
+ return usb_redir_stall;
+ }
+
if (host->endpoint[EP2I(ep)].type != type) {
ERROR("error start stream type %d on type %d endpoint",
type, host->endpoint[EP2I(ep)].type);
@@ -940,7 +944,7 @@ static int usbredirhost_alloc_stream(struct usbredirhost *host, uint8_t ep,
transfer_count < 1 ||
transfer_count > MAX_TRANSFER_COUNT) {
ERROR("error start stream type %d invalid parameters", type);
- return usb_redir_inval;
+ return usb_redir_stall;
}
if (host->endpoint[EP2I(ep)].transfer_count) {
@@ -996,7 +1000,19 @@ alloc_error:
host->endpoint[EP2I(ep)].transfer[i] = NULL;
i--;
} while (i >= 0);
- return usb_redir_ioerror;
+ return usb_redir_stall;
+}
+
+static int usbredirhost_alloc_stream(struct usbredirhost *host, uint8_t ep,
+ uint8_t type, uint8_t pkts_per_transfer, uint8_t transfer_count)
+{
+ int status;
+
+ LOCK(host);
+ status = usbredirhost_alloc_stream_unlocked(host, ep, type,
+ pkts_per_transfer, transfer_count);
+ UNLOCK(host);
+ return status;
}
/**************************************************************************/
@@ -1143,10 +1159,11 @@ static int usbredirhost_handle_iso_status(struct usbredirhost *host,
usbredirhost_send_iso_status(host, id, ep, usb_redir_stall);
return 2;
}
- status = usbredirhost_alloc_stream(host, ep, usb_redir_type_iso,
+ status = usbredirhost_alloc_stream_unlocked(host, ep,
+ usb_redir_type_iso,
pkts_per_transfer, transfer_count);
if (status != usb_redir_success) {
- usbredirhost_send_iso_status(host, id, ep, usb_redir_stall);
+ usbredirhost_send_iso_status(host, id, ep, status);
}
return 2;
}
@@ -1263,8 +1280,7 @@ resubmit:
libusb_transfer->num_iso_packets;
status = usbredirhost_submit_stream_transfer_unlocked(host, transfer);
if (status != usb_redir_success) {
- usbredirhost_send_iso_status(host, transfer->id, ep,
- usb_redir_stall);
+ usbredirhost_send_iso_status(host, transfer->id, ep, status);
}
} else {
for (i = 0; i < host->endpoint[EP2I(ep)].transfer_count; i++) {
@@ -1645,20 +1661,8 @@ static void usbredirhost_start_iso_stream(void *priv, uint64_t id,
uint8_t ep = start_iso_stream->endpoint;
int status;
- LOCK(host);
-
- if (host->disconnected) {
- status = usb_redir_ioerror;
- goto leave;
- }
-
status = usbredirhost_alloc_stream(host, ep, usb_redir_type_iso,
start_iso_stream->pkts_per_urb, start_iso_stream->no_urbs);
- if (status != usb_redir_success) {
- status = usb_redir_stall;
- }
-leave:
- UNLOCK(host);
usbredirhost_send_iso_status(host, id, ep, status);
FLUSH(host);
}
@@ -2182,7 +2186,6 @@ static void usbredirhost_iso_packet(void *priv, uint64_t id,
status = usbredirhost_submit_stream_transfer_unlocked(host,
transfer);
if (status != usb_redir_success) {
- status = usb_redir_stall;
goto leave;
}
}