ChangeSet 1.823.3.2, 2002/11/11 13:13:00-08:00, [EMAIL PROTECTED]

[PATCH] usb storage: remove duplicate functions

Once upon a time, the SCSI command structure could only hold a maximum of
12 bytes.  Thus, the ISD-200 driver needed an entirely separate function to
work with 16-byte commands.

Now that 16-bytes is stored, we can cut the duplicates.


diff -Nru a/drivers/usb/storage/isd200.c b/drivers/usb/storage/isd200.c
--- a/drivers/usb/storage/isd200.c      Thu Nov 14 14:13:09 2002
+++ b/drivers/usb/storage/isd200.c      Thu Nov 14 14:13:09 2002
@@ -130,7 +130,6 @@
 #define ISD200_TRANSPORT_GOOD       0   /* Transport good, command good     */
 #define ISD200_TRANSPORT_FAILED     1   /* Transport good, command failed   */
 #define ISD200_TRANSPORT_ERROR      2   /* Transport bad (i.e. device dead) */
-#define ISD200_TRANSPORT_SHORT      4   /* Transport short                  */
 
 /* driver action codes */
 #define        ACTION_READ_STATUS      0
@@ -394,119 +393,6 @@
 
 
 /**************************************************************************
- *  ISD200 Bulk Transport
- *
- * Note:  This routine was copied from the usb_stor_Bulk_transport routine
- * located in the transport.c source file.  The scsi command is limited to
- * only 12 bytes while the CDB for the ISD200 must be 16 bytes.
- */
-int isd200_Bulk_transport( struct us_data *us, Scsi_Cmnd *srb, 
-                           union ata_cdb *AtaCdb, unsigned char AtaCdbLength )
-{
-        struct bulk_cb_wrap bcb;
-        struct bulk_cs_wrap bcs;
-        int result;
-        unsigned int transfer_length;
-
-       int dir = srb->sc_data_direction;
-       srb->sc_data_direction = SCSI_DATA_WRITE;
-        transfer_length = usb_stor_transfer_length(srb);
-       srb->sc_data_direction = dir;
-    
-        /* set up the command wrapper */
-        bcb.Signature = cpu_to_le32(US_BULK_CB_SIGN);
-        bcb.DataTransferLength = cpu_to_le32(transfer_length);
-        bcb.Flags = srb->sc_data_direction == SCSI_DATA_READ ? 1 << 7 : 0;
-        bcb.Tag = srb->serial_number;
-        bcb.Lun = srb->cmnd[1] >> 5;
-        if (us->flags & US_FL_SCM_MULT_TARG)
-                bcb.Lun |= srb->target << 4;
-        bcb.Length = AtaCdbLength;
-    
-        /* copy the command payload */
-        memset(bcb.CDB, 0, sizeof(bcb.CDB));
-        memcpy(bcb.CDB, AtaCdb, bcb.Length);
-    
-        /* send it to out endpoint */
-        US_DEBUGP("Bulk command S 0x%x T 0x%x Trg %d LUN %d L %d F %d CL %d\n",
-                  le32_to_cpu(bcb.Signature), bcb.Tag,
-                  (bcb.Lun >> 4), (bcb.Lun & 0x0F), 
-                  le32_to_cpu(bcb.DataTransferLength), bcb.Flags, bcb.Length);
-       result = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe,
-                               (char *) &bcb, US_BULK_CB_WRAP_LEN, NULL);
-        US_DEBUGP("Bulk command transfer result=%d\n", result);
-       if (result != USB_STOR_XFER_GOOD)  
-                return ISD200_TRANSPORT_ERROR;
-    
-        /* if the command transfered well, then we go to the data stage */
-       if (transfer_length) {
-               unsigned int pipe = srb->sc_data_direction == SCSI_DATA_READ ? 
-                               us->recv_bulk_pipe : us->send_bulk_pipe;
-               result = usb_stor_bulk_transfer_srb(us, pipe, srb,
-                                       transfer_length);
-               US_DEBUGP("Bulk data transfer result 0x%x\n", result);
-               if (result == USB_STOR_XFER_ERROR)
-                       return ISD200_TRANSPORT_ERROR;
-        }
-    
-        /* See flow chart on pg 15 of the Bulk Only Transport spec for
-         * an explanation of how this code works.
-         */
-    
-        /* get CSW for device status */
-        US_DEBUGP("Attempting to get CSW...\n");
-       result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
-                               (char *) &bcs, US_BULK_CS_WRAP_LEN, NULL);
-
-        /* did the attempt to read the CSW fail? */
-       if (result == USB_STOR_XFER_STALLED) {
-           
-                /* get the status again */
-                US_DEBUGP("Attempting to get CSW (2nd try)...\n");
-               result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
-                               (char *) &bcs, US_BULK_CS_WRAP_LEN, NULL);
-        }
-    
-        /* if we still have a failure at this point, we're in trouble */
-        US_DEBUGP("Bulk status result = %d\n", result);
-        if (result != USB_STOR_XFER_GOOD)
-                return ISD200_TRANSPORT_ERROR;
-    
-        /* check bulk status */
-        US_DEBUGP("Bulk status Sig 0x%x T 0x%x R %d Stat 0x%x\n",
-                  le32_to_cpu(bcs.Signature), bcs.Tag, 
-                  bcs.Residue, bcs.Status);
-        if (bcs.Signature != cpu_to_le32(US_BULK_CS_SIGN) || 
-            bcs.Tag != bcb.Tag || 
-            bcs.Status > US_BULK_STAT_PHASE) {
-                US_DEBUGP("Bulk logical error\n");
-                return ISD200_TRANSPORT_ERROR;
-        }
-    
-        /* based on the status code, we report good or bad */
-        switch (bcs.Status) {
-        case US_BULK_STAT_OK:
-                /* command good -- note that we could be short on data */
-               if (srb->resid > 0)
-                       return ISD200_TRANSPORT_SHORT;
-                return ISD200_TRANSPORT_GOOD;
-
-        case US_BULK_STAT_FAIL:
-                /* command failed */
-                return ISD200_TRANSPORT_FAILED;
-        
-        case US_BULK_STAT_PHASE:
-                /* phase error */
-                usb_stor_Bulk_reset(us);
-                return ISD200_TRANSPORT_ERROR;
-        }
-    
-        /* we should never get here, but if we do, we're in trouble */
-        return ISD200_TRANSPORT_ERROR;
-}
-
-
-/**************************************************************************
  *  isd200_action
  *
  * Routine for sending commands to the isd200
@@ -592,9 +478,11 @@
                break;
        }
 
-       status = isd200_Bulk_transport(us, &srb, &ata, sizeof(ata.generic));
-       if (status != ISD200_TRANSPORT_GOOD &&
-                       status != ISD200_TRANSPORT_SHORT) {
+       memcpy(srb.cmnd, &ata, sizeof(ata.generic));
+       status = usb_stor_Bulk_transport(&srb, us);
+       if (status == USB_STOR_TRANSPORT_GOOD)
+               status = ISD200_GOOD;
+       else {
                US_DEBUGP("   isd200_action(0x%02x) error: %d\n",action,status);
                status = ISD200_ERROR;
                /* need to reset device here */
@@ -649,8 +537,8 @@
 
        /* send the command to the transport layer */
        srb->resid = 0;
-       transferStatus = isd200_Bulk_transport(us, srb, ataCdb,
-                                              sizeof(ataCdb->generic));
+       memcpy(srb->cmnd, ataCdb, sizeof(ataCdb->generic));
+       transferStatus = usb_stor_Bulk_transport(srb, us);
 
        /* if the command gets aborted by the higher layers, we need to
         * short-circuit all other processing
@@ -663,37 +551,37 @@
 
        switch (transferStatus) {
 
-       case ISD200_TRANSPORT_GOOD:
+       case USB_STOR_TRANSPORT_GOOD:
                /* Indicate a good result */
                srb->result = GOOD << 1;
                break;
 
-       case ISD200_TRANSPORT_FAILED:
+       case USB_STOR_TRANSPORT_FAILED:
                US_DEBUGP("-- transport indicates command failure\n");
                need_auto_sense = 1;
                break;
 
-       case ISD200_TRANSPORT_ERROR:
-               US_DEBUGP("-- transport indicates transport failure\n");
+       case USB_STOR_TRANSPORT_ERROR:
+               US_DEBUGP("-- transport indicates transport error\n");
                srb->result = DID_ERROR << 16;
-               break;
-
-       case ISD200_TRANSPORT_SHORT:
-               srb->result = GOOD << 1;
-               if (!((srb->cmnd[0] == REQUEST_SENSE) ||
-                     (srb->cmnd[0] == INQUIRY) ||
-                     (srb->cmnd[0] == MODE_SENSE) ||
-                     (srb->cmnd[0] == LOG_SENSE) ||
-                     (srb->cmnd[0] == MODE_SENSE_10))) {
-                       US_DEBUGP("-- unexpectedly short transfer\n");
-                       need_auto_sense = 1;
-               }
-               break;
+               /* Need reset here */
+               return;
     
        default:
-               US_DEBUGP("-- transport indicates unknown failure\n");   
+               US_DEBUGP("-- transport indicates unknown error\n");   
                srb->result = DID_ERROR << 16;
-       
+               /* Need reset here */
+               return;
+       }
+
+       if ((srb->resid > 0) &&
+           !((srb->cmnd[0] == REQUEST_SENSE) ||
+             (srb->cmnd[0] == INQUIRY) ||
+             (srb->cmnd[0] == MODE_SENSE) ||
+             (srb->cmnd[0] == LOG_SENSE) ||
+             (srb->cmnd[0] == MODE_SENSE_10))) {
+               US_DEBUGP("-- unexpectedly short transfer\n");
+               need_auto_sense = 1;
        }
 
        if (need_auto_sense) {
@@ -701,14 +589,21 @@
                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)
+               } else if (result == ISD200_GOOD) {
                        isd200_build_sense(us, srb);
+                       srb->result = CHECK_CONDITION << 1;
+
+                       /* If things are really okay, then let's show that */
+                       if ((srb->sense_buffer[2] & 0xf) == 0x0)
+                               srb->result = GOOD << 1;
+               } else
+                       srb->result = DID_ERROR << 16;
        }
 
        /* Regardless of auto-sense, if we _know_ we have an error
         * condition, show that in the result code
         */
-       if (transferStatus == ISD200_TRANSPORT_FAILED)
+       if (transferStatus == USB_STOR_TRANSPORT_FAILED)
                srb->result = CHECK_CONDITION << 1;
 }
 


-------------------------------------------------------
This sf.net email is sponsored by: To learn the basics of securing 
your web site with SSL, click here to get a FREE TRIAL of a Thawte 
Server Certificate: http://www.gothawte.com/rd524.html
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to