Skip to contentSkip to conversation

indistinguishable devices with broken and unbroken firmware #2

PATCH In review Oliver Neukum 4 participants 4 messages Feb 8, 2007 – Feb 9, 2007

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 indistinguishable devices with broken and unbroken firmware #2

Hi,

there's a USB mass storage device which exists in two version. One reports the correct size and the other does not. Apart from that they are identical and cannot be told apart. Here's a heuristic based on the empirical finding that drives have even sizes.

The requested changes have been made.
Greg, can this go through your tree?

Regards
Oliver

------

drivers/usb/storage/unusual_devs.h +1 -1
@@ -1430,7 +1430,7 @@
 		"DataStor",
 		"USB4500 FW1.04",
 		US_SC_DEVICE, US_PR_DEVICE, NULL,
-		US_FL_FIX_CAPACITY),
+		US_FL_CAPACITY_HEURISTICS),
 
 /* Control/Bulk transport for all SubClass values */
 USUAL_DEV(US_SC_RBC, US_PR_CB, USB_US_TYPE_STOR),
drivers/usb/storage/scsiglue.c +6 -0
@@ -170,6 +170,12 @@
 		if (us->flags & US_FL_FIX_CAPACITY)
 			sdev->fix_capacity = 1;
 
+		/* A few disks have two indistinguishable version, one of
+		 * which reports the correct capacity and the other does not.
+		 * The sd driver has to guess which is the case. */
+		if (us->flags & US_FL_CAPACITY_HEURISTICS)
+			sdev->guess_capacity = 1;
+
 		/* Some devices report a SCSI revision level above 2 but are
 		 * unable to handle the REPORT LUNS command (for which
 		 * support is mandatory at level 3).  Since we already have
drivers/scsi/sd.c +10 -1
@@ -1270,9 +1270,18 @@
 
 	/* Some devices return the total number of sectors, not the
 	 * highest sector number.  Make the necessary adjustment. */
-	if (sdp->fix_capacity)
+	if (sdp->fix_capacity) {
 		--sdkp->capacity;
 
+	/* Some devices have version which report the correct sizes
+	 * and others which do not. We guess size according to a heuristic
+	 * and err on the side of lowering the capacity. */
+	} else {
+		if (sdp->guess_capacity)
+			if (sdkp->capacity & 0x01) /* odd sizes are odd */
+				--sdkp->capacity;
+	}
+
 got_data:
 	if (sector_size == 0) {
 		sector_size = 512;
include/linux/usb_usual.h +3 -1
@@ -46,7 +46,9 @@
 	US_FLAG(MAX_SECTORS_64,	0x00000400)			\
 		/* Sets max_sectors to 64    */			\
 	US_FLAG(IGNORE_DEVICE,	0x00000800)			\
-		/* Don't claim device */
+		/* Don't claim device */			\
+	US_FLAG(CAPACITY_HEURISTICS,	0x00001000)		\
+		/* sometimes sizes is too big */
 
 #define US_FLAG(name, value)	US_FL_##name = value ,
 enum { US_DO_ALL_FLAGS };
include/scsi/scsi_device.h +1 -0
@@ -122,6 +122,7 @@
 	unsigned no_uld_attach:1; /* disable connecting to upper level drivers */
 	unsigned select_no_atn:1;
 	unsigned fix_capacity:1;	/* READ_CAPACITY is too high by 1 */
+	unsigned guess_capacity:1;	/* READ_CAPACITY might be too high by 1 */
 	unsigned retry_hwerror:1;	/* Retry HARDWARE_ERROR */
 
 	unsigned int device_blocked;	/* Device returned QUEUE_FULL. */
#1 lore raw
Quoted 9 lines · Oliver Neukum

Hi,

there's a USB mass storage device which exists in two version. One reports the correct size and the other does not. Apart from that they are identical and cannot be told apart. Here's a heuristic based on the empirical finding that drives have even sizes.

The requested changes have been made.
Greg, can this go through your tree?

If the usb-storage people ACK it, I'll be glad to add it to my trees.

thanks,

greg k-h

maintainer Acked-by
#2 lore raw
Quoted 8 lines · Greg KH
Quoted 7 lines · Oliver Neukum

Hi,

there's a USB mass storage device which exists in two version. One reports the correct size and the other does not. Apart from that they are identical and cannot be told apart. Here's a heuristic based on the empirical finding that drives have even sizes.

Quoted 4 lines
Quoted 2 lines

The requested changes have been made.
Greg, can this go through your tree?

If the usb-storage people ACK it, I'll be glad to add it to my trees.

It's okay with me.

Alan Stern

Acked-by
#3 lore raw
Quoted 10 lines · Alan Stern
Quoted 8 lines · Greg KH
Quoted 7 lines · Oliver Neukum

Hi,

there's a USB mass storage device which exists in two version. One reports the correct size and the other does not. Apart from that they are identical and cannot be told apart. Here's a heuristic based on the empirical finding that drives have even sizes.

Quoted 8 lines
Quoted 4 lines
Quoted 2 lines

The requested changes have been made.
Greg, can this go through your tree?

If the usb-storage people ACK it, I'll be glad to add it to my trees.

It's okay with me.

Looks okay to me too.

Matt

Signature · 7 lines
Matthew Dharm                              Home: [email protected] 
Maintainer, Linux USB Mass Storage Driver

E:  You run this ship with Windows?!  YOU IDIOT!
L:  Give me a break, it came bundled with the computer!
					-- ESR and Lan Solaris
User Friendly, 12/8/1998