ChangeSet 1.883.3.7, 2002/12/16 10:49:56-08:00, [EMAIL PROTECTED]

[PATCH] usb-storage: fixup interpret_urb_result()

This patch fixes interpret_urb_result in two major ways:
(1) Uses a switch() instead of nested if() statements
(2) Handle -EREMOTEIO to indicate a short scatter-gather transfer


diff -Nru a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
--- a/drivers/usb/storage/transport.c   Wed Dec 18 00:34:56 2002
+++ b/drivers/usb/storage/transport.c   Wed Dec 18 00:34:56 2002
@@ -480,7 +480,7 @@
        status = usb_stor_msg_common(us);
 
        /* return the actual length of the data transferred if no error */
-       if (status >= 0)
+       if (status == 0)
                status = us->current_urb->actual_length;
        return status;
 }
@@ -583,50 +583,52 @@
 
        US_DEBUGP("Status code %d; transferred %u/%u\n",
                        result, partial, length);
+       switch (result) {
 
-       /* stalled */
-       if (result == -EPIPE) {
+       /* no error code; did we send all the data? */
+       case 0:
+               if (partial != length) {
+                       US_DEBUGP("-- short transfer\n");
+                       return USB_STOR_XFER_SHORT;
+               }
+
+               US_DEBUGP("-- transfer complete\n");
+               return USB_STOR_XFER_GOOD;
 
-               /* for non-bulk (i.e., control) endpoints, a stall indicates
-                * a protocol error */
-               if (!usb_pipebulk(pipe)) {
+       /* stalled */
+       case -EPIPE:
+               /* for control endpoints, a stall indicates a protocol error */
+               if (usb_pipecontrol(pipe)) {
                        US_DEBUGP("-- stall on control pipe\n");
                        return USB_STOR_XFER_ERROR;
                }
 
-               /* for a bulk endpoint, clear the stall */
+               /* for other sorts of 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) {
+       case -ETIMEDOUT:
                US_DEBUGP("-- device NAKed\n");
                return USB_STOR_XFER_ERROR;
-       }
 
        /* the transfer was cancelled, presumably by an abort */
-       if (result == -ENODEV) {
+       case -ENODEV:
                US_DEBUGP("-- transfer cancelled\n");
                return USB_STOR_XFER_ERROR;
-       }
+
+       /* short scatter-gather read transfer */
+       case -EREMOTEIO:
+               US_DEBUGP("-- short read transfer\n");
+               return USB_STOR_XFER_SHORT;
 
        /* the catch-all error case */
-       if (result < 0) {
+       default:
                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;
 }
 
 /*


-------------------------------------------------------
This sf.net email is sponsored by:
With Great Power, Comes Great Responsibility 
Learn to use your power at OSDN's High Performance Computing Channel
http://hpc.devchannel.org/
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to