summaryrefslogtreecommitdiff
path: root/include/scsi.h
diff options
context:
space:
mode:
authorGabe Black <gabeblack@chromium.org>2012-10-29 05:23:54 +0000
committerTom Rini <trini@ti.com>2012-11-02 15:20:41 -0700
commit19d1d41e844ea8525f527fd5301aba9eb3006241 (patch)
treeb2b5b217b23f238a6ed843b9fa929799db295f2b /include/scsi.h
parentb7a21b70d0d3f94d7ab3ed84fbf68d2e2b7488bf (diff)
downloadu-boot-19d1d41e844ea8525f527fd5301aba9eb3006241.tar.gz
u-boot-19d1d41e844ea8525f527fd5301aba9eb3006241.tar.bz2
u-boot-19d1d41e844ea8525f527fd5301aba9eb3006241.zip
ahci: Make the AHCI code find the capacity of disks > 128 GB properly
In the structure returned by the ATA identify device command, there are two fields which describe the device capacity. One is a 32 bit data type which reports the number of sectors as a 28 bit LBA, and the other is a 64 bit data type which is for a 48 bit LBA. If the device doesn't support 48 bit LBAs, the small value is the only value with the correct size. If it supports more, if the number of sectors is small enough to fit into 28 bits, both fields reflect the correct value. If it's too large, the smaller field has 28 bits of 1s, 0xfffffff, and the other field has the correct value. The AHCI driver is implemented by attaching to the generic SCSI code and translating on the fly between SCSI binary data structures and AHCI data structures. It responds to requests to execute specific SCSI commands by executing the equivalent AHCI commands and then crafting a response which matches what a SCSI disk would send. The AHCI driver now considers both fields and chooses the correct one when implementing both the SCSI READ CAPACITY (10) and READ CAPACITY (16) commands. Signed-off-by: Gabe Black <gabeblack@chromium.org> Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'include/scsi.h')
-rw-r--r--include/scsi.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/include/scsi.h b/include/scsi.h
index 9681d198df..9da764bdcf 100644
--- a/include/scsi.h
+++ b/include/scsi.h
@@ -150,6 +150,8 @@ typedef struct SCSI_cmd_block{
#define SCSI_READ6 0x08 /* Read 6-byte (MANDATORY) */
#define SCSI_READ10 0x28 /* Read 10-byte (MANDATORY) */
#define SCSI_RD_CAPAC 0x25 /* Read Capacity (MANDATORY) */
+#define SCSI_RD_CAPAC10 SCSI_RD_CAPAC /* Read Capacity (10) */
+#define SCSI_RD_CAPAC16 0x9e /* Read Capacity (16) */
#define SCSI_RD_DEFECT 0x37 /* Read Defect Data (O) */
#define SCSI_READ_LONG 0x3E /* Read Long (O) */
#define SCSI_REASS_BLK 0x07 /* Reassign Blocks (O) */