On Wed, Feb 13, 2002 at 05:55:30PM -0800, Greg KH wrote:
> [EMAIL PROTECTED], 2002-02-13 17:15:28-08:00, [EMAIL PROTECTED]
>   usb hpusbscsi driver fixes:
>       - special case for REQUEST_SENSE
>       - reset handling won't work properly -> disabled
>       - error reporting corrected
> 
>  drivers/usb/hpusbscsi.c |   39 +++++++++++++++++++++++++++++++++++----
>  drivers/usb/hpusbscsi.h |    3 ++-
>  2 files changed, 37 insertions(+), 5 deletions(-)

# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#                  ChangeSet    1.332   -> 1.333  
#       drivers/usb/hpusbscsi.h 1.3     -> 1.4    
#       drivers/usb/hpusbscsi.c 1.7     -> 1.8    
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/02/13      [EMAIL PROTECTED]       1.333
# usb hpusbscsi driver fixes:
#       - special case for REQUEST_SENSE
#       - reset handling won't work properly -> disabled
#       - error reporting corrected
# --------------------------------------------
#
diff -Nru a/drivers/usb/hpusbscsi.c b/drivers/usb/hpusbscsi.c
--- a/drivers/usb/hpusbscsi.c   Wed Feb 13 17:51:04 2002
+++ b/drivers/usb/hpusbscsi.c   Wed Feb 13 17:51:04 2002
@@ -283,7 +283,12 @@
        /* Now we need to decide which callback to give to the urb we send the command 
with */
 
        if (!srb->bufflen) {
-               usb_callback = simple_command_callback;
+               if (srb->cmnd[0] == REQUEST_SENSE){
+                       hpusbscsi->current_data_pipe = usb_rcvbulkpipe(hpusbscsi->dev, 
+hpusbscsi->ep_in);
+                       usb_callback = request_sense_callback;
+               } else {
+                       usb_callback = simple_command_callback;
+               }
        } else {
                if (likely(srb->use_sg)) {
                        usb_callback = scatter_gather_callback;
@@ -341,8 +346,8 @@
        struct hpusbscsi* hpusbscsi = (struct hpusbscsi*)(srb->host->hostdata[0]);
 
        printk(KERN_DEBUG"SCSI reset requested.\n");
-       usb_reset_device(hpusbscsi->dev);
-       printk(KERN_DEBUG"SCSI reset completed.\n");
+       //usb_reset_device(hpusbscsi->dev);
+       //printk(KERN_DEBUG"SCSI reset completed.\n");
        hpusbscsi->state = HP_STATE_FREE;
 
        return 0;
@@ -382,7 +387,7 @@
                return;
        }
        hpusbscsi->srb->result &= SCSI_ERR_MASK;
-       hpusbscsi->srb->result |= hpusbscsi->scsi_state_byte<<1;
+       hpusbscsi->srb->result |= hpusbscsi->scsi_state_byte;
 
        if (hpusbscsi->scallback != NULL && hpusbscsi->state == HP_STATE_WAIT)
                /* we do a callback to the scsi layer if and only if all data has been 
transfered */
@@ -425,6 +430,32 @@
                hpusbscsi->state = HP_STATE_FREE;
        TRACE_STATE;
        }
+}
+
+static void request_sense_callback (struct urb *u)
+{
+       struct hpusbscsi * hpusbscsi = (struct hpusbscsi *)u->context;
+
+       if (unlikely(u->status<0)) {
+               handle_usb_error(hpusbscsi);
+               return;
+        }
+
+       FILL_BULK_URB(
+               u,
+               hpusbscsi->dev,
+               hpusbscsi->current_data_pipe,
+               hpusbscsi->srb->sense_buffer,
+               SCSI_SENSE_BUFFERSIZE,
+               simple_done,
+               hpusbscsi
+       );
+
+       if (unlikely(0 > usb_submit_urb(u, GFP_ATOMIC))) {
+               handle_usb_error(hpusbscsi);
+               return;
+       }
+       hpusbscsi->state = HP_STATE_WORKING;
 }
 
 static void scatter_gather_callback(struct urb *u)
diff -Nru a/drivers/usb/hpusbscsi.h b/drivers/usb/hpusbscsi.h
--- a/drivers/usb/hpusbscsi.h   Wed Feb 13 17:51:04 2002
+++ b/drivers/usb/hpusbscsi.h   Wed Feb 13 17:51:04 2002
@@ -51,7 +51,8 @@
 static void simple_command_callback(struct urb *u);
 static void scatter_gather_callback(struct urb *u);
 static void simple_payload_callback (struct urb *u);
-static void  control_interrupt_callback (struct urb *u);
+static void request_sense_callback (struct urb *u);
+static void control_interrupt_callback (struct urb *u);
 static void simple_done (struct urb *u);
 static int hpusbscsi_scsi_queuecommand (Scsi_Cmnd *srb, scsi_callback callback);
 static int hpusbscsi_scsi_host_reset (Scsi_Cmnd *srb);

_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to