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.

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.641   -> 1.642  
#       drivers/usb/storage/isd200.c    1.21    -> 1.22   
#       drivers/usb/storage/transport.c 1.60    -> 1.61   
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/11/03      [EMAIL PROTECTED]       1.642
# Check for an abort condition at a high-level of command processing, so
# lower-levels don't necessarily have to do so.
# --------------------------------------------
#
diff -Nru a/drivers/usb/storage/isd200.c b/drivers/usb/storage/isd200.c
--- a/drivers/usb/storage/isd200.c      Sun Nov  3 14:52:32 2002
+++ b/drivers/usb/storage/isd200.c      Sun Nov  3 14:52:32 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   Sun Nov  3 14:52:32 2002
+++ b/drivers/usb/storage/transport.c   Sun Nov  3 14:52:32 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;

-- 
Matthew Dharm                              Home: [EMAIL PROTECTED] 
Maintainer, Linux USB Mass Storage Driver

I see you've been reading alt.sex.chubby.sheep voraciously.
                                        -- Tanya
User Friendly, 11/24/97

Attachment: msg09198/pgp00000.pgp
Description: PGP signature

Reply via email to