ChangeSet 1.1557.49.14, 2004/02/17 16:45:00-08:00, [EMAIL PROTECTED]

[PATCH] USB Storage: Reduce unsolicited auto-sense

This patch (a regeneration of as185) reduces the amount of auto-sensing we
do even further.  It also zeros-out the sense buffer in those cases where
we do auto-sense and get back no error.


 drivers/usb/storage/transport.c |   34 ++++++++++++----------------------
 1 files changed, 12 insertions(+), 22 deletions(-)


diff -Nru a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
--- a/drivers/usb/storage/transport.c   Thu Feb 19 17:21:57 2004
+++ b/drivers/usb/storage/transport.c   Thu Feb 19 17:21:57 2004
@@ -552,6 +552,8 @@
                return;
        }
 
+       srb->result = SAM_STAT_GOOD;
+
        /* Determine if we need to auto-sense
         *
         * I normally don't use a flag like this, but it's almost impossible
@@ -582,8 +584,8 @@
        }
 
        /*
-        * Also, if we have a short transfer on a command that can't have
-        * a short transfer, we're going to do this.
+        * A short transfer on a command where we don't expect it
+        * is unusual, but it doesn't mean we need to auto-sense.
         */
        if ((srb->resid > 0) &&
            !((srb->cmnd[0] == REQUEST_SENSE) ||
@@ -592,7 +594,6 @@
              (srb->cmnd[0] == LOG_SENSE) ||
              (srb->cmnd[0] == MODE_SENSE_10))) {
                US_DEBUGP("-- unexpectedly short transfer\n");
-               need_auto_sense = 1;
        }
 
        /* Now, if we need to do the auto-sense, let's do it */
@@ -693,26 +694,15 @@
                /* set the result so the higher layers expect this data */
                srb->result = SAM_STAT_CHECK_CONDITION;
 
-               /* If things are really okay, then let's show that */
-               if ((srb->sense_buffer[2] & 0xf) == 0x0)
+               /* If things are really okay, then let's show that.  Zero
+                * out the sense buffer so the higher layers won't realize
+                * we did an unsolicited auto-sense. */
+               if (result == USB_STOR_TRANSPORT_GOOD &&
+                               (srb->sense_buffer[2] & 0xf) == 0x0) {
                        srb->result = SAM_STAT_GOOD;
-       } else /* if (need_auto_sense) */
-               srb->result = SAM_STAT_GOOD;
-
-       /* Regardless of auto-sense, if we _know_ we have an error
-        * condition, show that in the result code
-        */
-       if (result == USB_STOR_TRANSPORT_FAILED)
-               srb->result = SAM_STAT_CHECK_CONDITION;
-
-       /* If we think we're good, then make sure the sense data shows it.
-        * This is necessary because the auto-sense for some devices always
-        * sets byte 0 == 0x70, even if there is no error
-        */
-       if ((us->protocol == US_PR_CB || us->protocol == US_PR_DPCM_USB) && 
-           (result == USB_STOR_TRANSPORT_GOOD) &&
-           ((srb->sense_buffer[2] & 0xf) == 0x0))
-               srb->sense_buffer[0] = 0x0;
+                       srb->sense_buffer[0] = 0x0;
+               }
+       }
        return;
 
        /* abort processing: the bulk-only transport requires a reset



-------------------------------------------------------
SF.Net is sponsored by: Speed Start Your Linux Apps Now.
Build and deploy apps & Web services for Linux with
a free DVD software kit from IBM. Click Now!
http://ads.osdn.com/?ad_id56&alloc_id438&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to