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