On Wed, 30 Aug 2006, Anton Litvinov wrote:

> This device doesn't work if it was hot-plugged.
> But if I plug it before I boot Linux, it works sometimes (see attached log).

Apparently the BIOS gets the device working and after that it's okay.

> If device was hot-plugged then log look like this:
> 
> >
> > Linux:
> > INQUIRY
> > TEST UNIT READY (failed: Not ready to ready change)
> > TEST UNIT READY
> > READ CAPACITY
> > MODE SENSE 3f
> > TEST UNIT READY
> > TEST UNIT READY
> > READ CAPACITY
> > MODE SENSE 3f
> > READ(10) 8 sectors at 0 -- crashed
> >
> 
> If device was plugged before boot then log look like this:
> 
> INQUIRY
> TEST_UNIT_READY
> READ_CAPACITY
> MODE_SENSE
> TEST_UNIT_READY
> ALLOW_MEDIUM_REMOVAL (failure)
> TEST_UNIT_READY
> READ_CAPACITY
> MODE_SENSE
> READ_10
> INQUIRY
> TEST_UNIT_READY
> READ_CAPACITY
> ...
> READ_10
> READ_10
> READ_10
> READ_10
> READ_10
> ...

All right.  It looks like you don't need the earlier patch adding the 
US_FL_NOT_LOCKABLE flag to unusual_devs.h.

Try this patch instead.  It should cause the SCSI disk driver to read a 
single sector at location 0, and hopefully the device will work 
correctly after that.

Alan Stern



Index: usb-2.6/drivers/scsi/sd.c
===================================================================
--- usb-2.6.orig/drivers/scsi/sd.c
+++ usb-2.6/drivers/scsi/sd.c
@@ -1524,6 +1524,42 @@ defaults:
        sdkp->DPOFUA = 0;
 }
 
+/*
+ * Pre-read the partition sector (sector 0) -- one sector only!
+ * Some weird USB flash devices won't work without this.
+ */
+static void
+sd_preread_sector0(struct scsi_disk *sdkp, unsigned char *buffer)
+{
+       unsigned char cmd[16];
+       int the_result, retries;
+       struct scsi_sense_hdr sshdr;
+       struct scsi_device *sdp = sdkp->device;
+
+       if (sdp->sector_size > 512)     /* Forget about funny sector sizes */
+               return;
+
+       memset(cmd, 0, sizeof(cmd));
+       if (sdp->use_10_for_rw) {
+               cmd[0] = READ_10;
+               cmd[8] = 1;
+       } else {
+               cmd[0] = READ_6;
+               cmd[4] = 1;
+       }
+
+       for (retries = 0; retries < 3; ++retries) {
+               
+               the_result = scsi_execute_req(sdp, cmd, DMA_FROM_DEVICE,
+                                             buffer, 512, &sshdr,
+                                             SD_TIMEOUT, SD_MAX_RETRIES);
+               if (the_result == 0)
+                       break;
+               if (media_not_present(sdkp, &sshdr))
+                       break;
+       } while (the_result && retries);
+}
+
 /**
  *     sd_revalidate_disk - called the first time a new disk is seen,
  *     performs disk spin up, read_capacity, etc.
@@ -1570,6 +1606,7 @@ static int sd_revalidate_disk(struct gen
                sd_read_capacity(sdkp, disk->disk_name, buffer);
                sd_read_write_protect_flag(sdkp, disk->disk_name, buffer);
                sd_read_cache_type(sdkp, disk->disk_name, buffer);
+               sd_preread_sector0(sdkp, buffer);
        }
 
        /*


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Linux-usb-users@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-users

Reply via email to