Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 48743
b: refs/heads/master
c: 61bf54b
h: refs/heads/master
i:
  48741: 26bd065
  48739: 012f5cc
  48735: 50bdc07
v: v3
  • Loading branch information
Oliver Neukum authored and Greg Kroah-Hartman committed Feb 16, 2007
1 parent e9cd814 commit d4ad60d
Show file tree
Hide file tree
Showing 6 changed files with 22 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 5b06470816fb5e658e81db2a55b530ff2ba711c9
refs/heads/master: 61bf54b71d5abf767ee46284be19965d7253ddbf
11 changes: 10 additions & 1 deletion trunk/drivers/scsi/sd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1269,9 +1269,18 @@ sd_read_capacity(struct scsi_disk *sdkp, char *diskname,

/* 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;
Expand Down
6 changes: 6 additions & 0 deletions trunk/drivers/usb/storage/scsiglue.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,12 @@ static int slave_configure(struct scsi_device *sdev)
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
Expand Down
2 changes: 1 addition & 1 deletion trunk/drivers/usb/storage/unusual_devs.h
Original file line number Diff line number Diff line change
Expand Up @@ -1434,7 +1434,7 @@ UNUSUAL_DEV( 0xed06, 0x4500, 0x0001, 0x0001,
"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),
Expand Down
4 changes: 3 additions & 1 deletion trunk/include/linux/usb_usual.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 };
Expand Down
1 change: 1 addition & 0 deletions trunk/include/scsi/scsi_device.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ struct scsi_device {
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. */
Expand Down

0 comments on commit d4ad60d

Please sign in to comment.