This patch puts all the code to interpret the result code from an URB into a single place, instead of copying it everywhere throughout transport.c
Greg, please apply.
Matt
# This is a BitKeeper generated patch for the following project:
# Project Name: greg k-h's linux 2.5 USB kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
# ChangeSet 1.653 -> 1.654
# drivers/usb/storage/transport.c 1.67 -> 1.68
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/11/17 [EMAIL PROTECTED] 1.654
# Code consolidation. Why do the same thing in several different places,
# when it can all be done in one place? Once again, this is from Alan Stern.
# --------------------------------------------
#
diff -Nru a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
--- a/drivers/usb/storage/transport.c Sun Nov 17 15:37:56 2002
+++ b/drivers/usb/storage/transport.c Sun Nov 17 15:37:56 2002
@@ -479,7 +479,7 @@
usb_stor_blocking_completion, NULL);
status = usb_stor_msg_common(us);
- /* return the actual length of the data transferred if no error*/
+ /* return the actual length of the data transferred if no error */
if (status >= 0)
status = us->current_urb->actual_length;
return status;
@@ -543,6 +543,65 @@
return 0;
}
+
+/*
+ * Interpret the results of a URB transfer
+ *
+ * This function prints appropriate debugging messages, clears halts on
+ * bulk endpoints, and translates the status to the corresponding
+ * USB_STOR_XFER_xxx return code.
+ */
+static int interpret_urb_result(struct us_data *us, unsigned int pipe,
+ unsigned int length, int result, unsigned int partial) {
+
+ US_DEBUGP("Status code %d; transferred %u/%u\n",
+ result, partial, length);
+
+ /* stalled */
+ if (result == -EPIPE) {
+
+ /* for non-bulk (i.e., control) endpoints, a stall indicates
+ * a protocol error */
+ if (!usb_pipebulk(pipe)) {
+ US_DEBUGP("-- stall on control pipe\n");
+ return USB_STOR_XFER_ERROR;
+ }
+
+ /* for a bulk endpoint, clear the stall */
+ US_DEBUGP("clearing endpoint halt for pipe 0x%x\n", pipe);
+ if (usb_stor_clear_halt(us, pipe) < 0)
+ return USB_STOR_XFER_ERROR;
+ return USB_STOR_XFER_STALLED;
+ }
+
+ /* NAK - that means we've retried this a few times already */
+ if (result == -ETIMEDOUT) {
+ US_DEBUGP("-- device NAKed\n");
+ return USB_STOR_XFER_ERROR;
+ }
+
+ /* the transfer was cancelled, presumably by an abort */
+ if (result == -ENODEV) {
+ US_DEBUGP("-- transfer cancelled\n");
+ return USB_STOR_XFER_ERROR;
+ }
+
+ /* the catch-all error case */
+ if (result < 0) {
+ US_DEBUGP("-- unknown error\n");
+ return USB_STOR_XFER_ERROR;
+ }
+
+ /* no error code; did we send all the data? */
+ if (partial != length) {
+ US_DEBUGP("-- transferred only %u bytes\n", partial);
+ return USB_STOR_XFER_SHORT;
+ }
+
+ US_DEBUGP("-- transfer complete\n");
+ return USB_STOR_XFER_GOOD;
+}
+
/*
* Transfer one control message
*
@@ -554,34 +613,19 @@
u8 request, u8 requesttype, u16 value, u16 index,
void *data, u16 size) {
int result;
+ unsigned int partial = 0;
US_DEBUGP("usb_stor_ctrl_transfer(): rq=%02x rqtype=%02x "
"value=%04x index=%02x len=%u\n",
request, requesttype, value, index, size);
result = usb_stor_control_msg(us, pipe, request, requesttype,
value, index, data, size);
- US_DEBUGP("usb_stor_control_msg returned %d\n", result);
- /* a stall indicates a protocol error */
- if (result == -EPIPE) {
- US_DEBUGP("-- stall on control pipe\n");
- return USB_STOR_XFER_ERROR;
+ if (result > 0) { /* Separate out the amount transferred */
+ partial = result;
+ result = 0;
}
-
- /* some other serious problem here */
- if (result < 0) {
- US_DEBUGP("-- unknown error\n");
- return USB_STOR_XFER_ERROR;
- }
-
- /* was the entire command transferred? */
- if (result < size) {
- US_DEBUGP("-- transferred only %d bytes\n", result);
- return USB_STOR_XFER_SHORT;
- }
-
- US_DEBUGP("-- transfer completed successfully\n");
- return USB_STOR_XFER_GOOD;
+ return interpret_urb_result(us, pipe, size, result, partial);
}
/*
@@ -604,42 +648,9 @@
/* transfer the data */
US_DEBUGP("usb_stor_bulk_transfer_buf(): xfer %u bytes\n", length);
result = usb_stor_bulk_msg(us, buf, pipe, length, &partial);
- US_DEBUGP("usb_stor_bulk_msg() returned %d xferred %u/%u\n",
- result, partial, length);
if (act_len)
*act_len = partial;
-
- /* if we stall, we need to clear it before we go on */
- if (result == -EPIPE) {
- US_DEBUGP("clearing endpoint halt for pipe 0x%x,"
- " stalled at %u bytes\n", pipe, partial);
- if (usb_stor_clear_halt(us, pipe) < 0)
- return USB_STOR_XFER_ERROR;
- return USB_STOR_XFER_STALLED;
- }
-
- /* NAK - that means we've retried a few times already */
- if (result == -ETIMEDOUT) {
- US_DEBUGP("-- device NAKed\n");
- return USB_STOR_XFER_ERROR;
- }
-
- /* the catch-all error case */
- if (result) {
- US_DEBUGP("-- unknown error\n");
- return USB_STOR_XFER_ERROR;
- }
-
- /* did we send all the data? */
- if (partial == length) {
- US_DEBUGP("-- transfer complete\n");
- return USB_STOR_XFER_GOOD;
- }
-
- /* no error code, so we must have transferred some data,
- * just not all of it */
- US_DEBUGP("-- transferred only %u bytes\n", partial);
- return USB_STOR_XFER_SHORT;
+ return interpret_urb_result(us, pipe, length, result, partial);
}
/*
@@ -653,7 +664,7 @@
unsigned int *act_len)
{
int result;
- int partial;
+ unsigned int partial;
/* initialize the scatter-gather request block */
US_DEBUGP("usb_stor_bulk_transfer_sglist(): xfer %u bytes, "
@@ -685,42 +696,9 @@
result = us->current_sg->status;
partial = us->current_sg->bytes;
- US_DEBUGP("usb_sg_wait() returned %d xferred %u/%u\n",
- result, partial, length);
if (act_len)
*act_len = partial;
-
- /* if we stall, we need to clear it before we go on */
- if (result == -EPIPE) {
- US_DEBUGP("clearing endpoint halt for pipe 0x%x, "
- "stalled at %u bytes\n", pipe, partial);
- if (usb_stor_clear_halt(us, pipe) < 0)
- return USB_STOR_XFER_ERROR;
- return USB_STOR_XFER_STALLED;
- }
-
- /* NAK - that means we've retried this a few times already */
- if (result == -ETIMEDOUT) {
- US_DEBUGP("-- device NAKed\n");
- return USB_STOR_XFER_ERROR;
- }
-
- /* the catch-all error case */
- if (result) {
- US_DEBUGP("-- unknown error\n");
- return USB_STOR_XFER_ERROR;
- }
-
- /* did we send all the data? */
- if (partial == length) {
- US_DEBUGP("-- transfer complete\n");
- return USB_STOR_XFER_GOOD;
- }
-
- /* no error code, so we must have transferred some data,
- * just not all of it */
- US_DEBUGP("-- transferred only %u bytes\n", partial);
- return USB_STOR_XFER_SHORT;
+ return interpret_urb_result(us, pipe, length, result, partial);
}
/*
--
Matthew Dharm Home: [EMAIL PROTECTED]
Maintainer, Linux USB Mass Storage Driver
C: They kicked your ass, didn't they?
S: They were cheating!
-- The Chief and Stef
User Friendly, 11/19/1997
msg09471/pgp00000.pgp
Description: PGP signature
