Hi,

this should fix a bug with error handling visible on the Sacn Dual II

        Regards
                Oliver

--- hpusbscsi.h.alt     Sun Oct  7 19:12:48 2001
+++ hpusbscsi.h Sun Dec  9 13:58:14 2001
@@ -50,7 +50,8 @@
 static int hpusbscsi_scsi_detect (struct SHT * sht);
 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 simple_payload_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);
--- hpusbscsi.c.alt     Tue Oct  9 19:17:54 2001
+++ hpusbscsi.c Sun Dec  9 13:58:09 2001
@@ -270,7 +270,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) {
+                       usb_callback = simple_command_callback;
+               } else { /* transfer into an internal buffer */
+                       usb_callback = request_sense_callback;
+                       hpusbscsi->current_data_pipe = usb_rcvbulkpipe(hpusbscsi->dev, 
+hpusbscsi->ep_in);
+               }
        } else {
                if (srb->use_sg) {
                        usb_callback = scatter_gather_callback;
@@ -517,3 +522,39 @@
        }
 }
 
+static void request_sense_callback (struct urb *u)
+{
+       struct hpusbscsi * hpusbscsi = (struct hpusbscsi *)u->context;
+       int res;
+
+       if (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
+       );
+
+       res = usb_submit_urb(u);
+       if (res) {
+                handle_usb_error(hpusbscsi);
+               return;
+        }
+       TRACE_STATE;
+       if (hpusbscsi->state != HP_STATE_PREMATURE) {
+               hpusbscsi->state = HP_STATE_WORKING;
+       TRACE_STATE;
+       } else {
+               if (hpusbscsi->scallback != NULL)
+                       hpusbscsi->scallback(hpusbscsi->srb);
+               hpusbscsi->state = HP_STATE_FREE;
+       TRACE_STATE;
+       }
+}


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

Reply via email to