--- /home/n202042/src/kernel2612/linux-2.6.12/drivers/scsi/sd.c 2005-06-18 07:48:29.000000000 +1200 +++ /usr/src/linux/drivers/scsi/sd.c 2005-07-11 15:40:45.000000000 +1200 @@ -89,6 +89,10 @@ #define SD_MAX_RETRIES 5 #define SD_PASSTHROUGH_RETRIES 1 +static unsigned int firmware_delay = 0; +module_param(firmware_delay, uint, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(firmware_delay, "Optional number of seconds delay for dodgy USB keys to settle"); + static void scsi_disk_release(struct kref *kref); struct scsi_disk { @@ -1080,6 +1084,12 @@ sd_spinup_disk(struct scsi_disk *sdkp, c /* Wait 1 second for next try */ msleep(1000); printk("."); + } else if (sense_valid && sshdr.sense_key == UNIT_ATTENTION && firmware_delay > 0 ) { + /* Some USB flash drives need a small delay (perhaps to allow internal firmware + * time to initialise + */ + printk(KERN_NOTICE "%s: Allowing time for firmware initialisation\n", diskname); + msleep(firmware_delay * HZ); } else { /* we don't understand the sense code, so it's * probably pointless to loop */