diff -u -rN -p linux-2.6.10-rbtx49/drivers/scsi/scsi_error.c linux-2.6.10-usb/drivers/scsi/scsi_error.c
--- linux-2.6.10-rbtx49/drivers/scsi/scsi_error.c	Thu Feb 10 19:15:16 2005
+++ linux-2.6.10-usb/drivers/scsi/scsi_error.c	Thu Apr 28 09:44:54 2005
@@ -907,6 +907,7 @@ static int scsi_eh_try_stu(struct scsi_c
 	return 1;
 }
 
+#ifndef CONFIG_USB_STORAGE_REMOVABLE_ENHANCEMENT
  /**
  * scsi_eh_stu - send START_UNIT if needed
  * @shost:	scsi host being recovered.
@@ -1018,6 +1019,7 @@ static int scsi_eh_bus_device_reset(stru
 
 	return list_empty(work_q);
 }
+#endif
 
 /**
  * scsi_try_bus_reset - ask host to perform a bus reset
@@ -1502,8 +1504,14 @@ static void scsi_eh_ready_devs(struct Sc
 			       struct list_head *work_q,
 			       struct list_head *done_q)
 {
+#ifdef CONFIG_USB_STORAGE_REMOVABLE_ENHANCEMENT
+	// It is not necessary.
+	// Because, if the command is aborted, device reset has 
+	// already issued. 
+#else
 	if (!scsi_eh_stu(shost, work_q, done_q))
 		if (!scsi_eh_bus_device_reset(shost, work_q, done_q))
+#endif
 			if (!scsi_eh_bus_reset(shost, work_q, done_q))
 				if (!scsi_eh_host_reset(work_q, done_q))
 					scsi_eh_offline_sdevs(work_q, done_q);
@@ -1522,6 +1530,14 @@ static void scsi_eh_flush_done_q(struct 
 	list_for_each_safe(lh, lh_sf, done_q) {
 		scmd = list_entry(lh, struct scsi_cmnd, eh_entry);
 		list_del_init(lh);
+#ifdef CONFIG_USB_STORAGE_REMOVABLE_ENHANCEMENT
+		if ((scmd->sense_buffer[2] & 0xf) == NOT_READY) {
+			// Don't need to retry the command.
+			// Because, in this case, the media is not ready.
+			// So, I/O request to Media is meaningless.
+			scmd->allowed = 1;
+		}
+#endif
 		if (scsi_device_online(scmd->device) &&
 		    !blk_noretry_request(scmd->request) &&
 		    (++scmd->retries < scmd->allowed)) {
@@ -1529,6 +1545,14 @@ static void scsi_eh_flush_done_q(struct 
 							  " retry cmd: %p\n",
 							  current->comm,
 							  scmd));
+#ifdef CONFIG_USB_STORAGE_REMOVABLE_ENHANCEMENT
+				// The default timeout value might be shorten to detect
+				// the removal status. So modify timeout value for resending
+				// the command.
+				// For this feature, we use "timeout" field.
+				// This value will set by SCSI Disk driver.
+				scmd->timeout_per_command = scmd->timeout;
+#endif
 				scsi_queue_insert(scmd, SCSI_MLQUEUE_EH_RETRY);
 		} else {
 			if (!scmd->result)
diff -u -rN -p linux-2.6.10-rbtx49/drivers/scsi/sd.c linux-2.6.10-usb/drivers/scsi/sd.c
--- linux-2.6.10-rbtx49/drivers/scsi/sd.c	Thu Feb 10 19:15:16 2005
+++ linux-2.6.10-usb/drivers/scsi/sd.c	Thu Apr 28 09:45:04 2005
@@ -80,7 +80,12 @@
 /*
  * Time out in seconds for disks and Magneto-opticals (which are slower).
  */
+#ifdef CONFIG_USB_STORAGE_REMOVABLE_ENHANCEMENT
+#define SD_TIMEOUT			(5 * HZ)
+#define SD_TIMEOUT_RETRY	(30 * HZ)
+#else
 #define SD_TIMEOUT		(30 * HZ)
+#endif
 #define SD_MOD_TIMEOUT		(75 * HZ)
 
 /*
@@ -389,6 +394,9 @@ static int sd_init_command(struct scsi_c
 queue:
 	SCpnt->allowed = SD_MAX_RETRIES;
 	SCpnt->timeout_per_command = timeout;
+#ifdef CONFIG_USB_STORAGE_REMOVABLE_ENHANCEMENT
+	SCpnt->timeout = SD_TIMEOUT_RETRY;
+#endif
 
 	/*
 	 * This is the completion routine we use.  This is matched in terms
@@ -734,8 +742,16 @@ static int sd_issue_flush(struct device 
 
 static void sd_rescan(struct device *dev)
 {
+#ifdef CONFIG_USB_STORAGE_REMOVABLE_ENHANCEMENT
+	struct scsi_disk *sdkp;
+	down(&sd_ref_sem);
+	sdkp = dev_get_drvdata(dev);
+	sd_revalidate_disk(sdkp->disk);
+	up(&sd_ref_sem);
+#else
 	struct scsi_disk *sdkp = dev_get_drvdata(dev);
 	sd_revalidate_disk(sdkp->disk);
+#endif
 }
 
 static struct block_device_operations sd_fops = {
@@ -844,6 +860,16 @@ static void sd_rw_intr(struct scsi_cmnd 
 				SCpnt->device->use_10_for_ms = 0;
 			break;
 
+#ifdef CONFIG_USB_STORAGE_REMOVABLE_ENHANCEMENT
+		case HARDWARE_ERROR:
+		case NOT_READY: /* Device is removed. */
+			if (SCpnt->device->removable) {
+				struct scsi_disk *sdkp = dev_get_drvdata(&SCpnt->device->sdev_gendev);
+				set_media_not_present(sdkp);
+			}
+			break;
+#endif
+
 		default:
 			break;
 		}
diff -u -rN -p linux-2.6.10-rbtx49/drivers/usb/storage/Kconfig linux-2.6.10-usb/drivers/usb/storage/Kconfig
--- linux-2.6.10-rbtx49/drivers/usb/storage/Kconfig	Thu Feb 10 19:15:20 2005
+++ linux-2.6.10-usb/drivers/usb/storage/Kconfig	Thu Apr 28 09:46:00 2005
@@ -118,3 +118,9 @@ config USB_STORAGE_JUMPSHOT
 	  Say Y here to include additional code to support the Lexar Jumpshot
 	  USB CompactFlash reader.
 
+config USB_STORAGE_REMOVABLE_ENHANCEMENT
+	bool "Enable removable media handling enhancement"
+	depends on USB_STORAGE
+	help
+	  This enables removable media handling enhancement.
+
diff -u -rN -p linux-2.6.10-rbtx49/drivers/usb/storage/transport.c linux-2.6.10-usb/drivers/usb/storage/transport.c
--- linux-2.6.10-rbtx49/drivers/usb/storage/transport.c	Thu Feb 10 19:15:20 2005
+++ linux-2.6.10-usb/drivers/usb/storage/transport.c	Thu Apr 28 09:50:57 2005
@@ -1114,6 +1114,14 @@ static int usb_stor_reset_common(struct 
 	int result2;
 	int rc = FAILED;
 
+#ifdef CONFIG_USB_STORAGE_REMOVABLE_ENHANCEMENT
+	int timeout = 20*HZ;
+	
+	if (test_bit(US_FLIDX_TIMED_OUT, &us->flags)) {
+		timeout = 5*HZ;
+	}
+#endif
+
 	/* Let the SCSI layer know we are doing a reset, set the
 	 * RESETTING bit, and clear the ABORTING bit so that the reset
 	 * may proceed.
@@ -1130,7 +1138,11 @@ static int usb_stor_reset_common(struct 
 	 */
 	result = usb_stor_control_msg(us, us->send_ctrl_pipe,
 			request, requesttype, value, index, data, size,
+#ifdef CONFIG_USB_STORAGE_REMOVABLE_ENHANCEMENT
+			timeout);
+#else
 			20*HZ);
+#endif
 	if (result < 0) {
 		US_DEBUGP("Soft reset failed: %d\n", result);
 		goto Done;
