enigma2 20150309 -> 20150316
[opendreambox.git] / meta-bsp / common / recipes / linux / linux-dreambox-3.2 / 0001-SCSI-sd-Use-SCSI-read-write-16-with-32-bit-LBA-drive.patch
1 From cbb869c0b3c62cdf12ffbbaab242a01c9468e5cf Mon Sep 17 00:00:00 2001
2 From: Andreas Monzner <andreas.monzner@dream-property.net>
3 Date: Wed, 20 Mar 2013 22:02:15 +0100
4 Subject: [PATCH 1/7] [SCSI] sd: Use SCSI read/write(16) with > 32-bit LBA
5  drives
6
7 Force large capacity (> 0xFFFFFFFF blocks) drives to use READ/WRITE(16) instead
8 of READ/WRITE(10). Some(most/all?) USB enclosures do not like READ(10) commands
9 when a large capacity drive is installed. This issue was reported and discussed
10 here: http://marc.info/?l=linux-usb&m=135247705222324
11
12 Signed-off-by: Jason J. Herne <hernejj@gmail.com>
13 Signed-off-by: James Bottomley <JBottomley@Parallels.com>
14
15 Conflicts:
16         include/scsi/scsi_device.h
17 ---
18  drivers/scsi/sd.c          |    4 +++-
19  include/scsi/scsi_device.h |    1 +
20  2 files changed, 4 insertions(+), 1 deletion(-)
21
22 diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
23 index f44d633..ba3503b 100644
24 --- a/drivers/scsi/sd.c
25 +++ b/drivers/scsi/sd.c
26 @@ -833,7 +833,7 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq)
27                 SCpnt->cmnd[29] = (unsigned char) (this_count >> 16) & 0xff;
28                 SCpnt->cmnd[30] = (unsigned char) (this_count >> 8) & 0xff;
29                 SCpnt->cmnd[31] = (unsigned char) this_count & 0xff;
30 -       } else if (block > 0xffffffff) {
31 +       } else if (sdp->use_16_for_rw) {
32                 SCpnt->cmnd[0] += READ_16 - READ_6;
33                 SCpnt->cmnd[1] = protect | ((rq->cmd_flags & REQ_FUA) ? 0x8 : 0);
34                 SCpnt->cmnd[2] = sizeof(block) > 4 ? (unsigned char) (block >> 56) & 0xff : 0;
35 @@ -1931,6 +1931,8 @@ got_data:
36                 }
37         }
38  
39 +       sdp->use_16_for_rw = (sdkp->capacity > 0xffffffff);
40 +
41         /* Rescale capacity to 512-byte units */
42         if (sector_size == 4096)
43                 sdkp->capacity <<= 3;
44 diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
45 index 5591ed5..4afeaee 100644
46 --- a/include/scsi/scsi_device.h
47 +++ b/include/scsi/scsi_device.h
48 @@ -134,6 +134,7 @@ struct scsi_device {
49                                      * because we did a bus reset. */
50         unsigned use_10_for_rw:1; /* first try 10-byte read / write */
51         unsigned use_10_for_ms:1; /* first try 10-byte mode sense/select */
52 +       unsigned use_16_for_rw:1; /* Use read/write(16) over read/write(10) */
53         unsigned skip_ms_page_8:1;      /* do not use MODE SENSE page 0x08 */
54         unsigned skip_ms_page_3f:1;     /* do not use MODE SENSE page 0x3f */
55         unsigned use_192_bytes_for_3f:1; /* ask for 192 bytes from page 0x3f */
56 -- 
57 1.7.10.4
58