Greg, attached is a patch to usb-storage for 2.5.x -- please apply. This patch generally cleans up the return codes between the various layers of the usb-storage driver. There was previously some confusion about when to use what set of return codes. This patch should clean that up.
It is originally from Alan Stern.
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.619 -> 1.620
# drivers/usb/storage/sddr09.c 1.14 -> 1.15
# drivers/usb/storage/transport.h 1.7 -> 1.8
# drivers/usb/storage/datafab.c 1.8 -> 1.9
# drivers/usb/storage/transport.c 1.43 -> 1.44
# drivers/usb/storage/jumpshot.c 1.10 -> 1.11
# drivers/usb/storage/shuttle_usbat.c 1.11 -> 1.12
# drivers/usb/storage/sddr55.c 1.3 -> 1.4
# drivers/usb/storage/raw_bulk.c 1.7 -> 1.8
# drivers/usb/storage/freecom.c 1.11 -> 1.12
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/09/22 [EMAIL PROTECTED] 1.620
# Originally from Alan Stern:
#
# Like the header says, this patch fixes up the various Transfer- and
# Transport-level return codes. There were a lot of places in the various
# subdrivers that were not particularly careful about distinguishing the
# two; it would help if the people currently maintaining those drivers could
# take a look at my changes to make sure I haven't screwed anything up.
#
# # Converted US_BULK_TRANSFER_xxx to USB_STOR_XFER_xxx, to make it more
# # easily distinguishable from USB_STOR_TRANSPORT_xxx. (Also, in the
# # future these codes may apply to control transfers as well as to bulk
# # transfers.)
# #
# # Changed USB_STOR_XFER_FAILED to USB_STOR_XFER_ERROR, since it implies
# # a transport error rather than a transport failure.
# #
# # Added a USB_STOR_XFER_STALLED code, to indicate a transfer that was
# # terminated by an endpoint stall.
#
# This patch is in preparation for one in which usb_stor_transfer_partial()
# and usb_stor_transfer() are replaced by usb_stor_bulk_transfer_buf() and
# usb_stor_bulk_transfer_srb() respectively, with slightly different
# argument lists. Ultimately the subdrivers will be able to use these
# routines in place of the slightly specialized versions they have now and
# in place of the ones in raw_bulk.c.
# --------------------------------------------
#
diff -Nru a/drivers/usb/storage/datafab.c b/drivers/usb/storage/datafab.c
--- a/drivers/usb/storage/datafab.c Sun Sep 22 16:31:55 2002
+++ b/drivers/usb/storage/datafab.c Sun Sep 22 16:31:55 2002
@@ -70,7 +70,7 @@
unsigned int act_len; /* ignored */
if (len == 0)
- return USB_STOR_TRANSPORT_GOOD;
+ return USB_STOR_XFER_GOOD;
US_DEBUGP("datafab_bulk_read: len = %d\n", len);
return usb_storage_raw_bulk(us, SCSI_DATA_READ, data, len, &act_len);
@@ -82,7 +82,7 @@
unsigned int act_len; /* ignored */
if (len == 0)
- return USB_STOR_TRANSPORT_GOOD;
+ return USB_STOR_XFER_GOOD;
US_DEBUGP("datafab_bulk_write: len = %d\n", len);
return usb_storage_raw_bulk(us, SCSI_DATA_WRITE, data, len, &act_len);
@@ -144,12 +144,12 @@
// send the read command
result = datafab_bulk_write(us, command, sizeof(command));
- if (result != USB_STOR_TRANSPORT_GOOD)
+ if (result != USB_STOR_XFER_GOOD)
goto leave;
// read the result
result = datafab_bulk_read(us, ptr, len);
- if (result != USB_STOR_TRANSPORT_GOOD)
+ if (result != USB_STOR_XFER_GOOD)
goto leave;
sectors -= thistime;
@@ -171,7 +171,7 @@
leave:
if (use_sg)
kfree(buffer);
- return result;
+ return USB_STOR_TRANSPORT_ERROR;
}
@@ -243,17 +243,17 @@
// send the command
result = datafab_bulk_write(us, command, sizeof(command));
- if (result != USB_STOR_TRANSPORT_GOOD)
+ if (result != USB_STOR_XFER_GOOD)
goto leave;
// send the data
result = datafab_bulk_write(us, ptr, len);
- if (result != USB_STOR_TRANSPORT_GOOD)
+ if (result != USB_STOR_XFER_GOOD)
goto leave;
// read the result
result = datafab_bulk_read(us, reply, sizeof(reply));
- if (result != USB_STOR_TRANSPORT_GOOD)
+ if (result != USB_STOR_XFER_GOOD)
goto leave;
if (reply[0] != 0x50 && reply[1] != 0) {
@@ -280,7 +280,7 @@
leave:
if (use_sg)
kfree(buffer);
- return result;
+ return USB_STOR_TRANSPORT_ERROR;
}
@@ -308,11 +308,11 @@
command[5] = 0xa0;
rc = datafab_bulk_write(us, command, 8);
- if (rc != USB_STOR_TRANSPORT_GOOD)
- return rc;
+ if (rc != USB_STOR_XFER_GOOD)
+ return USB_STOR_TRANSPORT_ERROR;
rc = datafab_bulk_read(us, buf, sizeof(buf));
- if (rc == USB_STOR_TRANSPORT_GOOD) {
+ if (rc == USB_STOR_XFER_GOOD) {
info->lun = 0;
return USB_STOR_TRANSPORT_GOOD;
}
@@ -320,11 +320,11 @@
command[5] = 0xb0;
rc = datafab_bulk_write(us, command, 8);
- if (rc != USB_STOR_TRANSPORT_GOOD)
- return rc;
+ if (rc != USB_STOR_XFER_GOOD)
+ return USB_STOR_TRANSPORT_ERROR;
rc = datafab_bulk_read(us, buf, sizeof(buf));
- if (rc == USB_STOR_TRANSPORT_GOOD) {
+ if (rc == USB_STOR_XFER_GOOD) {
info->lun = 1;
return USB_STOR_TRANSPORT_GOOD;
}
@@ -332,7 +332,7 @@
wait_ms(20);
}
- return USB_STOR_TRANSPORT_FAILED;
+ return USB_STOR_TRANSPORT_ERROR;
}
static int datafab_id_device(struct us_data *us,
@@ -358,22 +358,23 @@
command[5] += (info->lun << 4);
rc = datafab_bulk_write(us, command, 8);
- if (rc != USB_STOR_TRANSPORT_GOOD)
- return rc;
+ if (rc != USB_STOR_XFER_GOOD)
+ return USB_STOR_TRANSPORT_ERROR;
// we'll go ahead and extract the media capacity while we're here...
//
rc = datafab_bulk_read(us, reply, sizeof(reply));
- if (rc == USB_STOR_TRANSPORT_GOOD) {
+ if (rc == USB_STOR_XFER_GOOD) {
// capacity is at word offset 57-58
//
info->sectors = ((u32)(reply[117]) << 24) |
((u32)(reply[116]) << 16) |
((u32)(reply[115]) << 8) |
((u32)(reply[114]) );
+ return USB_STOR_TRANSPORT_GOOD;
}
- return rc;
+ return USB_STOR_TRANSPORT_ERROR;
}
diff -Nru a/drivers/usb/storage/freecom.c b/drivers/usb/storage/freecom.c
--- a/drivers/usb/storage/freecom.c Sun Sep 22 16:31:55 2002
+++ b/drivers/usb/storage/freecom.c Sun Sep 22 16:31:55 2002
@@ -197,7 +197,7 @@
/* has the current command been aborted? */
if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
US_DEBUGP("freecom_readdata(): transfer aborted\n");
- return US_BULK_TRANSFER_ABORTED;
+ return USB_STOR_TRANSPORT_ABORTED;
}
return USB_STOR_TRANSPORT_ERROR;
@@ -238,7 +238,7 @@
/* has the current command been aborted? */
if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
US_DEBUGP("freecom_writedata(): transfer aborted\n");
- return US_BULK_TRANSFER_ABORTED;
+ return USB_STOR_TRANSPORT_ABORTED;
}
return USB_STOR_TRANSPORT_ERROR;
@@ -301,7 +301,7 @@
/* we canceled this transfer */
if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
US_DEBUGP("freecom_transport(): transfer aborted\n");
- return US_BULK_TRANSFER_ABORTED;
+ return USB_STOR_TRANSPORT_ABORTED;
}
return USB_STOR_TRANSPORT_ERROR;
@@ -316,7 +316,7 @@
/* we canceled this transfer */
if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
US_DEBUGP("freecom_transport(): transfer aborted\n");
- return US_BULK_TRANSFER_ABORTED;
+ return USB_STOR_TRANSPORT_ABORTED;
}
US_DEBUG(pdump ((void *) fst, partial));
@@ -354,7 +354,7 @@
/* we canceled this transfer */
if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
US_DEBUGP("freecom_transport(): transfer aborted\n");
- return US_BULK_TRANSFER_ABORTED;
+ return USB_STOR_TRANSPORT_ABORTED;
}
return USB_STOR_TRANSPORT_ERROR;
@@ -369,7 +369,7 @@
/* we canceled this transfer */
if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
US_DEBUGP("freecom_transport(): transfer aborted\n");
- return US_BULK_TRANSFER_ABORTED;
+ return USB_STOR_TRANSPORT_ABORTED;
}
US_DEBUG(pdump ((void *) fst, partial));
@@ -430,7 +430,7 @@
if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
US_DEBUGP ("freecom_transport: transfer aborted\n");
- return US_BULK_TRANSFER_ABORTED;
+ return USB_STOR_TRANSPORT_ABORTED;
}
if (partial != 4 || result != 0)
return USB_STOR_TRANSPORT_ERROR;
@@ -459,7 +459,7 @@
if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
US_DEBUGP ("freecom_transport: transfer aborted\n");
- return US_BULK_TRANSFER_ABORTED;
+ return USB_STOR_TRANSPORT_ABORTED;
}
if (partial != 4 || result != 0)
return USB_STOR_TRANSPORT_ERROR;
diff -Nru a/drivers/usb/storage/jumpshot.c b/drivers/usb/storage/jumpshot.c
--- a/drivers/usb/storage/jumpshot.c Sun Sep 22 16:31:55 2002
+++ b/drivers/usb/storage/jumpshot.c Sun Sep 22 16:31:55 2002
@@ -65,7 +65,7 @@
unsigned int act_len; /* ignored */
if (len == 0)
- return USB_STOR_TRANSPORT_GOOD;
+ return USB_STOR_XFER_GOOD;
US_DEBUGP("jumpshot_bulk_read: len = %d\n", len);
return usb_storage_raw_bulk(us, SCSI_DATA_READ, data, len, &act_len);
@@ -79,7 +79,7 @@
unsigned int act_len; /* ignored */
if (len == 0)
- return USB_STOR_TRANSPORT_GOOD;
+ return USB_STOR_XFER_GOOD;
US_DEBUGP("jumpshot_bulk_write: len = %d\n", len);
return usb_storage_raw_bulk(us, SCSI_DATA_WRITE, data, len, &act_len);
@@ -168,7 +168,7 @@
// read the result
result = jumpshot_bulk_read(us, ptr, len);
- if (result != USB_STOR_TRANSPORT_GOOD)
+ if (result != USB_STOR_XFER_GOOD)
goto leave;
US_DEBUGP("jumpshot_read_data: %d bytes\n", len);
@@ -192,7 +192,7 @@
leave:
if (use_sg)
kfree(buffer);
- return result;
+ return USB_STOR_TRANSPORT_ERROR;
}
@@ -253,7 +253,7 @@
// send the data
result = jumpshot_bulk_write(us, ptr, len);
- if (result != USB_STOR_TRANSPORT_GOOD)
+ if (result != USB_STOR_XFER_GOOD)
goto leave;
// read the result. apparently the bulk write can complete
@@ -288,7 +288,7 @@
leave:
if (use_sg)
kfree(buffer);
- return result;
+ return USB_STOR_TRANSPORT_ERROR;
}
static int jumpshot_id_device(struct us_data *us,
@@ -314,8 +314,8 @@
// read the reply
rc = jumpshot_bulk_read(us, reply, sizeof(reply));
- if (rc != USB_STOR_TRANSPORT_GOOD)
- return rc;
+ if (rc != USB_STOR_XFER_GOOD)
+ return USB_STOR_TRANSPORT_ERROR;
info->sectors = ((u32)(reply[117]) << 24) |
((u32)(reply[116]) << 16) |
diff -Nru a/drivers/usb/storage/raw_bulk.c b/drivers/usb/storage/raw_bulk.c
--- a/drivers/usb/storage/raw_bulk.c Sun Sep 22 16:31:55 2002
+++ b/drivers/usb/storage/raw_bulk.c Sun Sep 22 16:31:55 2002
@@ -61,7 +61,7 @@
/* did we abort this command? */
if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
US_DEBUGP("usb_stor_send_control(): transfer aborted\n");
- return US_BULK_TRANSFER_ABORTED;
+ return USB_STOR_TRANSPORT_ABORTED;
}
// Check the return code for the command.
@@ -70,7 +70,7 @@
/* a stall indicates a protocol error */
if (result == -EPIPE) {
US_DEBUGP("-- Stall on control pipe\n");
- return USB_STOR_TRANSPORT_FAILED;
+ return USB_STOR_TRANSPORT_ERROR;
}
/* Uh oh... serious problem here */
@@ -100,14 +100,14 @@
" pipe 0x%x, stalled at %d bytes\n",
pipe, *act_len);
if (usb_stor_clear_halt(us, pipe) < 0)
- return US_BULK_TRANSFER_FAILED;
- /* return US_BULK_TRANSFER_SHORT; */
+ return USB_STOR_XFER_ERROR;
+ return USB_STOR_XFER_STALLED;
}
/* did we abort this command? */
if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
US_DEBUGP("usb_storage_raw_bulk(): transfer aborted\n");
- return US_BULK_TRANSFER_ABORTED;
+ return USB_STOR_XFER_ABORTED;
}
if (result) {
@@ -122,13 +122,13 @@
US_DEBUGP("raw_bulk(): unknown error %d\n",
result);
- return US_BULK_TRANSFER_FAILED;
+ return USB_STOR_XFER_ERROR;
}
if (*act_len != len) {
US_DEBUGP("Warning: Transferred only %d of %d bytes\n",
*act_len, len);
- return US_BULK_TRANSFER_SHORT;
+ return USB_STOR_XFER_SHORT;
}
#if 0
@@ -137,7 +137,7 @@
*act_len, len);
#endif
- return US_BULK_TRANSFER_GOOD;
+ return USB_STOR_XFER_GOOD;
}
int
@@ -145,14 +145,14 @@
unsigned char *data, unsigned int len,
int use_sg) {
- int result = USB_STOR_TRANSPORT_GOOD;
+ int result = USB_STOR_XFER_ERROR;
int transferred = 0;
int i;
struct scatterlist *sg;
unsigned int act_len;
if (len == 0)
- return USB_STOR_TRANSPORT_GOOD;
+ return USB_STOR_XFER_GOOD;
#if DEBUG_PRCT
@@ -196,7 +196,7 @@
result = usb_storage_raw_bulk(us, direction,
buf, length, &act_len);
- if (result != US_BULK_TRANSFER_GOOD)
+ if (result != USB_STOR_XFER_GOOD)
break;
transferred += length;
}
diff -Nru a/drivers/usb/storage/sddr09.c b/drivers/usb/storage/sddr09.c
--- a/drivers/usb/storage/sddr09.c Sun Sep 22 16:31:54 2002
+++ b/drivers/usb/storage/sddr09.c Sun Sep 22 16:31:54 2002
@@ -285,12 +285,14 @@
}
result = usb_storage_raw_bulk(us, SCSI_DATA_READ, sensebuf, buflen, &act_len);
- if (result != USB_STOR_TRANSPORT_GOOD)
+ if (result != USB_STOR_XFER_GOOD) {
US_DEBUGP("request sense bulk in failed\n");
- else
+ return USB_STOR_TRANSPORT_ERROR;
+ }
+ else {
US_DEBUGP("request sense worked\n");
-
- return result;
+ return USB_STOR_TRANSPORT_GOOD;
+ }
}
/*
@@ -344,11 +346,12 @@
result = usb_storage_bulk_transport(us, SCSI_DATA_READ,
buf, bulklen, use_sg);
- if (result != USB_STOR_TRANSPORT_GOOD)
+ if (result != USB_STOR_XFER_GOOD) {
US_DEBUGP("Result for bulk_transport in sddr09_read2%d %d\n",
x, result);
-
- return result;
+ return USB_STOR_TRANSPORT_ERROR;
+ }
+ return USB_STOR_TRANSPORT_GOOD;
}
/*
@@ -510,11 +513,12 @@
result = usb_storage_bulk_transport(us, SCSI_DATA_WRITE,
buf, bulklen, use_sg);
- if (result != USB_STOR_TRANSPORT_GOOD)
+ if (result != USB_STOR_XFER_GOOD) {
US_DEBUGP("Result for bulk_transport in sddr09_writeX %d\n",
result);
-
- return result;
+ return USB_STOR_TRANSPORT_ERROR;
+ }
+ return USB_STOR_TRANSPORT_GOOD;
}
/* erase address, write same address */
@@ -590,13 +594,14 @@
result = usb_storage_bulk_transport(us, SCSI_DATA_READ,
buf, bulklen, 0);
- if (result != USB_STOR_TRANSPORT_GOOD)
+ kfree(buf);
+ if (result != USB_STOR_XFER_GOOD) {
US_DEBUGP("Result for bulk_transport in sddr09_read_sg %d\n",
result);
+ return USB_STOR_TRANSPORT_ERROR;
+ }
- kfree(buf);
-
- return result;
+ return USB_STOR_TRANSPORT_GOOD;
}
#endif
@@ -629,7 +634,8 @@
result = usb_storage_bulk_transport(us, SCSI_DATA_READ,
data, sizeof(data), 0);
*status = data[0];
- return result;
+ return (result == USB_STOR_XFER_GOOD ?
+ USB_STOR_TRANSPORT_GOOD : USB_STOR_TRANSPORT_ERROR);
}
static int
@@ -953,7 +959,8 @@
for (i = 0; i < 4; i++)
deviceID[i] = content[i];
- return result;
+ return (result == USB_STOR_XFER_GOOD ?
+ USB_STOR_TRANSPORT_GOOD : USB_STOR_TRANSPORT_ERROR);
}
static int
@@ -1549,7 +1556,8 @@
srb->request_bufflen,
srb->use_sg);
- return result;
+ return (result == USB_STOR_XFER_GOOD ?
+ USB_STOR_TRANSPORT_GOOD : USB_STOR_TRANSPORT_ERROR);
}
return USB_STOR_TRANSPORT_GOOD;
diff -Nru a/drivers/usb/storage/sddr55.c b/drivers/usb/storage/sddr55.c
--- a/drivers/usb/storage/sddr55.c Sun Sep 22 16:31:55 2002
+++ b/drivers/usb/storage/sddr55.c Sun Sep 22 16:31:55 2002
@@ -101,16 +101,16 @@
US_DEBUGP("Result for send_command in status %d\n",
result);
- if (result != US_BULK_TRANSFER_GOOD) {
+ if (result != USB_STOR_XFER_GOOD) {
set_sense_info (4, 0, 0); /* hardware error */
- return result;
+ return USB_STOR_TRANSPORT_ERROR;
}
result = sddr55_bulk_transport(us,
SCSI_DATA_READ, status, 4);
/* expect to get short transfer if no card fitted */
- if (result == US_BULK_TRANSFER_SHORT) {
+ if (result == USB_STOR_XFER_SHORT || result == USB_STOR_XFER_STALLED) {
/* had a short transfer, no card inserted, free map memory */
if (info->lba_to_pba)
kfree(info->lba_to_pba);
@@ -123,12 +123,12 @@
info->force_read_only = 0;
set_sense_info (2, 0x3a, 0); /* not ready, medium not present */
- return result;
+ return USB_STOR_TRANSPORT_FAILED;
}
- if (result != US_BULK_TRANSFER_GOOD) {
+ if (result != USB_STOR_XFER_GOOD) {
set_sense_info (4, 0, 0); /* hardware error */
- return result;
+ return USB_STOR_TRANSPORT_FAILED;
}
/* check write protect status */
@@ -138,11 +138,12 @@
result = sddr55_bulk_transport(us,
SCSI_DATA_READ, status, 2);
- if (result != US_BULK_TRANSFER_GOOD) {
+ if (result != USB_STOR_XFER_GOOD) {
set_sense_info (4, 0, 0); /* hardware error */
}
- return result;
+ return (result == USB_STOR_XFER_GOOD ?
+ USB_STOR_TRANSPORT_GOOD : USB_STOR_TRANSPORT_FAILED);
}
@@ -214,23 +215,29 @@
US_DEBUGP("Result for send_command in read_data %d\n",
result);
- if (result != US_BULK_TRANSFER_GOOD)
+ if (result != USB_STOR_XFER_GOOD) {
+ result = USB_STOR_TRANSPORT_ERROR;
goto leave;
+ }
/* read data */
result = sddr55_bulk_transport(us,
SCSI_DATA_READ, ptr,
pages<<info->pageshift);
- if (result != US_BULK_TRANSFER_GOOD)
+ if (result != USB_STOR_XFER_GOOD) {
+ result = USB_STOR_TRANSPORT_ERROR;
goto leave;
+ }
/* now read status */
result = sddr55_bulk_transport(us,
SCSI_DATA_READ, status, 2);
- if (result != US_BULK_TRANSFER_GOOD)
+ if (result != USB_STOR_XFER_GOOD) {
+ result = USB_STOR_TRANSPORT_ERROR;
goto leave;
+ }
/* check status for error */
if (status[0] == 0xff && status[1] == 0x4) {
@@ -247,6 +254,7 @@
}
us_copy_to_sgbuf_all(buffer, len, content, use_sg);
+ result = USB_STOR_TRANSPORT_GOOD;
leave:
if (use_sg)
@@ -374,12 +382,13 @@
result = sddr55_bulk_transport(us,
SCSI_DATA_WRITE, command, 8);
- if (result != US_BULK_TRANSFER_GOOD) {
+ if (result != USB_STOR_XFER_GOOD) {
US_DEBUGP("Result for send_command in write_data %d\n",
result);
/* set_sense_info is superfluous here? */
set_sense_info (3, 0x3, 0);/* peripheral write error */
+ result = USB_STOR_TRANSPORT_FAILED;
goto leave;
}
@@ -388,24 +397,26 @@
SCSI_DATA_WRITE, ptr,
pages<<info->pageshift);
- if (result != US_BULK_TRANSFER_GOOD) {
+ if (result != USB_STOR_XFER_GOOD) {
US_DEBUGP("Result for send_data in write_data %d\n",
result);
/* set_sense_info is superfluous here? */
set_sense_info (3, 0x3, 0);/* peripheral write error */
+ result = USB_STOR_TRANSPORT_FAILED;
goto leave;
}
/* now read status */
result = sddr55_bulk_transport(us, SCSI_DATA_READ, status, 6);
- if (result != US_BULK_TRANSFER_GOOD) {
+ if (result != USB_STOR_XFER_GOOD) {
US_DEBUGP("Result for get_status in write_data %d\n",
result);
/* set_sense_info is superfluous here? */
set_sense_info (3, 0x3, 0);/* peripheral write error */
+ result = USB_STOR_TRANSPORT_FAILED;
goto leave;
}
@@ -446,6 +457,7 @@
sectors -= pages >> info->smallpageshift;
ptr += (pages << info->pageshift);
}
+ result = USB_STOR_TRANSPORT_GOOD;
leave:
if (use_sg)
@@ -468,14 +480,14 @@
US_DEBUGP("Result of send_control for device ID is %d\n",
result);
- if (result != US_BULK_TRANSFER_GOOD)
- return result;
+ if (result != USB_STOR_XFER_GOOD)
+ return USB_STOR_TRANSPORT_ERROR;
result = sddr55_bulk_transport(us,
SCSI_DATA_READ, content, 4);
- if (result != US_BULK_TRANSFER_GOOD)
- return result;
+ if (result != USB_STOR_XFER_GOOD)
+ return USB_STOR_TRANSPORT_ERROR;
*manufacturerID = content[0];
*deviceID = content[1];
@@ -485,7 +497,7 @@
SCSI_DATA_READ, content, 2);
}
- return result;
+ return USB_STOR_TRANSPORT_GOOD;
}
@@ -510,7 +522,7 @@
US_DEBUGP("Result of read_deviceID is %d\n",
result);
- if (result != US_BULK_TRANSFER_GOOD)
+ if (result != USB_STOR_XFER_GOOD)
return 0;
US_DEBUGP("Device ID = %02X\n", deviceID);
@@ -603,21 +615,21 @@
result = sddr55_bulk_transport(us, SCSI_DATA_WRITE, command, 8);
- if ( result != US_BULK_TRANSFER_GOOD) {
+ if ( result != USB_STOR_XFER_GOOD) {
kfree (buffer);
return -1;
}
result = sddr55_bulk_transport(us, SCSI_DATA_READ, buffer, numblocks * 2);
- if ( result != US_BULK_TRANSFER_GOOD) {
+ if ( result != USB_STOR_XFER_GOOD) {
kfree (buffer);
return -1;
}
result = sddr55_bulk_transport(us, SCSI_DATA_READ, command, 2);
- if ( result != US_BULK_TRANSFER_GOOD) {
+ if ( result != USB_STOR_XFER_GOOD) {
kfree (buffer);
return -1;
}
diff -Nru a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c
--- a/drivers/usb/storage/shuttle_usbat.c Sun Sep 22 16:31:55 2002
+++ b/drivers/usb/storage/shuttle_usbat.c Sun Sep 22 16:31:55 2002
@@ -153,7 +153,8 @@
result = usb_storage_bulk_transport(us, SCSI_DATA_READ, content, len, use_sg);
- return result;
+ return (result == USB_STOR_XFER_GOOD ?
+ USB_STOR_TRANSPORT_GOOD : USB_STOR_TRANSPORT_ERROR);
}
/*
@@ -234,8 +235,8 @@
result = usb_storage_bulk_transport(us, SCSI_DATA_WRITE, content, len, use_sg);
- if (result != USB_STOR_TRANSPORT_GOOD)
- return result;
+ if (result != USB_STOR_XFER_GOOD)
+ return USB_STOR_TRANSPORT_ERROR;
return usbat_wait_not_busy(us, minutes);
}
@@ -309,8 +310,8 @@
SCSI_DATA_WRITE,
data, num_registers*2, 0);
- if (result!=USB_STOR_TRANSPORT_GOOD)
- return result;
+ if (result!=USB_STOR_XFER_GOOD)
+ return USB_STOR_TRANSPORT_ERROR;
}
@@ -341,7 +342,8 @@
* transferred.
*/
- if (result == US_BULK_TRANSFER_SHORT) {
+ if (result == USB_STOR_XFER_SHORT ||
+ result == USB_STOR_XFER_STALLED) {
/*
* If we're reading and we stalled, then clear
@@ -373,8 +375,8 @@
US_DEBUGP("Redoing %s\n",
direction==SCSI_DATA_WRITE ? "write" : "read");
- } else if (result != US_BULK_TRANSFER_GOOD)
- return result;
+ } else if (result != USB_STOR_XFER_GOOD)
+ return USB_STOR_TRANSPORT_ERROR;
else
return usbat_wait_not_busy(us, minutes);
@@ -425,8 +427,8 @@
result = usb_storage_bulk_transport(us,
SCSI_DATA_WRITE, data, num_registers*2, 0);
- if (result != USB_STOR_TRANSPORT_GOOD)
- return result;
+ if (result != USB_STOR_XFER_GOOD)
+ return USB_STOR_TRANSPORT_ERROR;
return usbat_wait_not_busy(us, 0);
}
diff -Nru a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
--- a/drivers/usb/storage/transport.c Sun Sep 22 16:31:55 2002
+++ b/drivers/usb/storage/transport.c Sun Sep 22 16:31:55 2002
@@ -572,36 +572,37 @@
if (result == -EPIPE) {
US_DEBUGP("clearing endpoint halt for pipe 0x%x\n", pipe);
if (usb_stor_clear_halt(us, pipe) < 0)
- return US_BULK_TRANSFER_FAILED;
+ return USB_STOR_XFER_ERROR;
+ return USB_STOR_XFER_STALLED;
}
/* did we abort this command? */
if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
US_DEBUGP("usb_stor_transfer_partial(): transfer aborted\n");
- return US_BULK_TRANSFER_ABORTED;
- }
-
- /* did we send all the data? */
- if (partial == length) {
- US_DEBUGP("usb_stor_transfer_partial(): transfer complete\n");
- return US_BULK_TRANSFER_GOOD;
+ return USB_STOR_XFER_ABORTED;
}
/* NAK - that means we've retried a few times already */
if (result == -ETIMEDOUT) {
US_DEBUGP("usb_stor_transfer_partial(): device NAKed\n");
- return US_BULK_TRANSFER_FAILED;
+ return USB_STOR_XFER_ERROR;
}
/* the catch-all error case */
if (result) {
US_DEBUGP("usb_stor_transfer_partial(): unknown error\n");
- return US_BULK_TRANSFER_FAILED;
+ return USB_STOR_XFER_ERROR;
+ }
+
+ /* did we send all the data? */
+ if (partial == length) {
+ US_DEBUGP("usb_stor_transfer_partial(): transfer complete\n");
+ return USB_STOR_XFER_GOOD;
}
/* no error code, so we must have transferred some data,
* just not all of it */
- return US_BULK_TRANSFER_SHORT;
+ return USB_STOR_XFER_SHORT;
}
/*
@@ -739,7 +740,7 @@
* Also, if we have a short transfer on a command that can't have
* a short transfer, we're going to do this.
*/
- if ((srb->result == US_BULK_TRANSFER_SHORT) &&
+ if ((srb->result == USB_STOR_XFER_SHORT) &&
!((srb->cmnd[0] == REQUEST_SENSE) ||
(srb->cmnd[0] == INQUIRY) ||
(srb->cmnd[0] == MODE_SENSE) ||
@@ -995,13 +996,13 @@
/* did we abort this command? */
if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
US_DEBUGP("usb_stor_control_msg(): transfer aborted\n");
- return US_BULK_TRANSFER_ABORTED;
+ return USB_STOR_TRANSPORT_ABORTED;
}
/* a stall indicates a protocol error */
if (result == -EPIPE) {
US_DEBUGP("-- Stall on control pipe\n");
- return USB_STOR_TRANSPORT_FAILED;
+ return USB_STOR_TRANSPORT_ERROR;
}
if (result < 0) {
@@ -1017,13 +1018,13 @@
US_DEBUGP("CBI data stage result is 0x%x\n", result);
/* report any errors */
- if (result == US_BULK_TRANSFER_ABORTED) {
+ if (result == USB_STOR_XFER_ABORTED) {
clear_bit(US_FLIDX_IP_WANTED, &us->flags);
return USB_STOR_TRANSPORT_ABORTED;
}
- if (result == US_BULK_TRANSFER_FAILED) {
+ if (result == USB_STOR_XFER_ERROR) {
clear_bit(US_FLIDX_IP_WANTED, &us->flags);
- return USB_STOR_TRANSPORT_FAILED;
+ return USB_STOR_TRANSPORT_ERROR;
}
}
@@ -1103,13 +1104,13 @@
/* did we abort this command? */
if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
US_DEBUGP("usb_stor_CB_transport(): transfer aborted\n");
- return US_BULK_TRANSFER_ABORTED;
+ return USB_STOR_TRANSPORT_ABORTED;
}
/* a stall indicates a protocol error */
if (result == -EPIPE) {
US_DEBUGP("-- Stall on control pipe\n");
- return USB_STOR_TRANSPORT_FAILED;
+ return USB_STOR_TRANSPORT_ERROR;
}
/* Uh oh... serious problem here */
@@ -1124,11 +1125,11 @@
US_DEBUGP("CB data stage result is 0x%x\n", result);
/* report any errors */
- if (result == US_BULK_TRANSFER_ABORTED) {
+ if (result == USB_STOR_XFER_ABORTED) {
return USB_STOR_TRANSPORT_ABORTED;
}
- if (result == US_BULK_TRANSFER_FAILED) {
- return USB_STOR_TRANSPORT_FAILED;
+ if (result == USB_STOR_XFER_ERROR) {
+ return USB_STOR_TRANSPORT_ERROR;
}
}
@@ -1207,7 +1208,7 @@
/* did we abort this command? */
if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
US_DEBUGP("usb_stor_Bulk_transport(): transfer aborted\n");
- return US_BULK_TRANSFER_ABORTED;
+ return USB_STOR_TRANSPORT_ABORTED;
}
/* if we stall, we need to clear it before we go on */
@@ -1218,7 +1219,7 @@
/* did we abort this command? */
if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
US_DEBUGP("usb_stor_Bulk_transport(): transfer aborted\n");
- return US_BULK_TRANSFER_ABORTED;
+ return USB_STOR_TRANSPORT_ABORTED;
}
if (result < 0)
return USB_STOR_TRANSPORT_ERROR;
@@ -1237,7 +1238,7 @@
US_DEBUGP("Bulk data transfer result 0x%x\n", result);
/* if it was aborted, we need to indicate that */
- if (result == US_BULK_TRANSFER_ABORTED)
+ if (result == USB_STOR_XFER_ABORTED)
return USB_STOR_TRANSPORT_ABORTED;
}
}
@@ -1257,7 +1258,7 @@
/* did we abort this command? */
if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
US_DEBUGP("usb_stor_Bulk_transport(): transfer aborted\n");
- return US_BULK_TRANSFER_ABORTED;
+ return USB_STOR_TRANSPORT_ABORTED;
}
/* did the attempt to read the CSW fail? */
@@ -1268,7 +1269,7 @@
/* did we abort this command? */
if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
US_DEBUGP("usb_stor_Bulk_transport(): transfer aborted\n");
- return US_BULK_TRANSFER_ABORTED;
+ return USB_STOR_TRANSPORT_ABORTED;
}
if (result < 0)
return USB_STOR_TRANSPORT_ERROR;
@@ -1281,7 +1282,7 @@
/* did we abort this command? */
if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
US_DEBUGP("usb_stor_Bulk_transport(): transfer aborted\n");
- return US_BULK_TRANSFER_ABORTED;
+ return USB_STOR_TRANSPORT_ABORTED;
}
/* if it fails again, we need a reset and return an error*/
@@ -1292,7 +1293,7 @@
/* did we abort this command? */
if (atomic_read(&us->sm_state) == US_STATE_ABORTING) {
US_DEBUGP("usb_stor_Bulk_transport(): transfer
aborted\n");
- return US_BULK_TRANSFER_ABORTED;
+ return USB_STOR_TRANSPORT_ABORTED;
}
return USB_STOR_TRANSPORT_ERROR;
}
diff -Nru a/drivers/usb/storage/transport.h b/drivers/usb/storage/transport.h
--- a/drivers/usb/storage/transport.h Sun Sep 22 16:31:55 2002
+++ b/drivers/usb/storage/transport.h Sun Sep 22 16:31:55 2002
@@ -115,12 +115,13 @@
#define US_BULK_GET_MAX_LUN 0xfe
/*
- * usb_stor_transfer() return codes
+ * usb_stor_transfer() return codes, in order of severity
*/
-#define US_BULK_TRANSFER_GOOD 0 /* good transfer */
-#define US_BULK_TRANSFER_SHORT 1 /* transfered less than expected */
-#define US_BULK_TRANSFER_FAILED 2 /* transfer died in the middle */
-#define US_BULK_TRANSFER_ABORTED 3 /* transfer canceled */
+#define USB_STOR_XFER_GOOD 0 /* good transfer */
+#define USB_STOR_XFER_SHORT 1 /* transfered less than expected */
+#define USB_STOR_XFER_STALLED 2 /* endpoint stalled */
+#define USB_STOR_XFER_ERROR 3 /* transfer died in the middle */
+#define USB_STOR_XFER_ABORTED 4 /* transfer canceled */
/*
* Transport return codes
--
Matthew Dharm Home: [EMAIL PROTECTED]
Maintainer, Linux USB Mass Storage Driver
Why am I talking to a toilet brush?
-- CEO
User Friendly, 4/30/1998
msg08063/pgp00000.pgp
Description: PGP signature
