ChangeSet 1.855.9.12, 2002/11/05 11:17:27-08:00, [EMAIL PROTECTED]

[PATCH] USB storage: check for abort at higher levels

This patch adds tests for an aborted command to higher-level functions.
This allows faster exit from a couple of paths and will allow code
consolidation in the lower-level transport functions.


diff -Nru a/drivers/usb/storage/isd200.c b/drivers/usb/storage/isd200.c
--- a/drivers/usb/storage/isd200.c      Tue Nov  5 16:10:18 2002
+++ b/drivers/usb/storage/isd200.c      Tue Nov  5 16:10:18 2002
@@ -818,11 +818,22 @@
 {
        int need_auto_sense = 0;
        int transferStatus;
+       int result;
 
        /* send the command to the transport layer */
        srb->resid = 0;
        transferStatus = isd200_Bulk_transport(us, srb, ataCdb,
                                               sizeof(ataCdb->generic));
+
+       /* if the command gets aborted by the higher layers, we need to
+        * short-circuit all other processing
+        */
+       if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
+               US_DEBUGP("-- transport indicates command was aborted\n");
+               srb->result = DID_ABORT << 16;
+               return;
+       }
+
        switch (transferStatus) {
 
        case ISD200_TRANSPORT_GOOD:
@@ -866,9 +877,14 @@
        
        }
 
-       if (need_auto_sense)
-               if (isd200_read_regs(us) == ISD200_GOOD)
+       if (need_auto_sense) {
+               result = isd200_read_regs(us);
+               if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
+                       US_DEBUGP("-- auto-sense aborted\n");
+                       srb->result = DID_ABORT << 16;
+               } else if (result == ISD200_GOOD)
                        isd200_build_sense(us, srb);
+       }
 
        /* Regardless of auto-sense, if we _know_ we have an error
         * condition, show that in the result code
diff -Nru a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
--- a/drivers/usb/storage/transport.c   Tue Nov  5 16:10:18 2002
+++ b/drivers/usb/storage/transport.c   Tue Nov  5 16:10:18 2002
@@ -790,13 +790,14 @@
        /* if the command gets aborted by the higher layers, we need to
         * short-circuit all other processing
         */
-       if (result == USB_STOR_TRANSPORT_ABORTED) {
+       if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
                US_DEBUGP("-- transport indicates command was aborted\n");
                srb->result = DID_ABORT << 16;
                return;
        }
 
        /* if there is a transport error, reset and don't auto-sense */
+       /* What if we want to abort during the reset? */
        if (result == USB_STOR_TRANSPORT_ERROR) {
                US_DEBUGP("-- transport indicates error, resetting\n");
                us->transport_reset(us);
@@ -904,7 +905,7 @@
                srb->sc_data_direction = old_sc_data_direction;
                memcpy(srb->cmnd, old_cmnd, MAX_COMMAND_SIZE);
 
-               if (temp_result == USB_STOR_TRANSPORT_ABORTED) {
+               if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
                        US_DEBUGP("-- auto-sense aborted\n");
                        srb->result = DID_ABORT << 16;
                        return;
@@ -917,6 +918,7 @@
                         * auto-sense is perfectly valid
                         */
                        if (!(us->flags & US_FL_SCM_MULT_TARG)) {
+                               /* What if we try to abort during the reset? */
                                us->transport_reset(us);
                        }
                        srb->result = DID_ERROR << 16;


-------------------------------------------------------
This sf.net email is sponsored by: See the NEW Palm 
Tungsten T handheld. Power & Color in a compact size!
http://ads.sourceforge.net/cgi-bin/redirect.pl?palm0001en
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to