This patch avoids sending URBs which are part of the reset system when the device is being disconnected. It also makes the control thread avoid starting anything for a device in that state.
Greg, please apply.
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.718 -> 1.719
# drivers/usb/storage/scsiglue.c 1.48 -> 1.49
# drivers/usb/storage/transport.c 1.86 -> 1.87
# drivers/usb/storage/usb.c 1.77 -> 1.78
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 03/06/28 [EMAIL PROTECTED] 1.719
# Avoid sending URBs to devices which are disconnectig.
# --------------------------------------------
#
diff -Nru a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
--- a/drivers/usb/storage/scsiglue.c Sat Jun 28 20:32:32 2003
+++ b/drivers/usb/storage/scsiglue.c Sat Jun 28 20:32:32 2003
@@ -168,7 +168,11 @@
/* lock the device pointers and do the reset */
down(&(us->dev_semaphore));
- result = us->transport_reset(us);
+ if (test_bit(US_FLIDX_DISCONNECTING, &us->flags)) {
+ result = FAILED;
+ US_DEBUGP("No reset during disconnect\n");
+ } else
+ result = us->transport_reset(us);
up(&(us->dev_semaphore));
/* lock access to the state and clear it */
@@ -204,7 +208,7 @@
down(&(us->dev_semaphore));
if (test_bit(US_FLIDX_DISCONNECTING, &us->flags)) {
result = -EIO;
- US_DEBUGP("Attempt to reset during disconnect\n");
+ US_DEBUGP("No reset during disconnect\n");
} else if (us->pusb_dev->actconfig->desc.bNumInterfaces != 1) {
result = -EBUSY;
US_DEBUGP("Refusing to reset a multi-interface device\n");
diff -Nru a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
--- a/drivers/usb/storage/transport.c Sat Jun 28 20:32:33 2003
+++ b/drivers/usb/storage/transport.c Sat Jun 28 20:32:33 2003
@@ -1065,6 +1065,10 @@
schedule_timeout(HZ*6);
set_current_state(TASK_RUNNING);
down(&us->dev_semaphore);
+ if (test_bit(US_FLIDX_DISCONNECTING, &us->flags)) {
+ US_DEBUGP("Reset interrupted by disconnect\n");
+ return FAILED;
+ }
US_DEBUGP("Soft reset: clearing bulk-in endpoint halt\n");
result = usb_stor_clear_halt(us, us->recv_bulk_pipe);
diff -Nru a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c
--- a/drivers/usb/storage/usb.c Sat Jun 28 20:32:33 2003
+++ b/drivers/usb/storage/usb.c Sat Jun 28 20:32:33 2003
@@ -338,10 +338,16 @@
/* lock the device pointers */
down(&(us->dev_semaphore));
+ /* don't do anything if we are disconnecting */
+ if (test_bit(US_FLIDX_DISCONNECTING, &us->flags)) {
+ US_DEBUGP("No command during disconnect\n");
+ us->srb->result = DID_BAD_TARGET << 16;
+ }
+
/* reject the command if the direction indicator
* is UNKNOWN
*/
- if (us->srb->sc_data_direction == SCSI_DATA_UNKNOWN) {
+ else if (us->srb->sc_data_direction == SCSI_DATA_UNKNOWN) {
US_DEBUGP("UNKNOWN data direction\n");
us->srb->result = DID_ERROR << 16;
}
--
Matthew Dharm Home: [EMAIL PROTECTED]
Maintainer, Linux USB Mass Storage Driver
THEY CASTRATED MY QUAKE BITS! I WANT THEM BACK!!!!
-- Greg
User Friendly, 3/27/1998
pgp00000.pgp
Description: PGP signature
