scsi: implement READ (16) command
For disks bigger than 2TB(512B sector size), read-10 would fail as it is limited by the block address(4bytes). Add and use SCSI command READ(16) when max blocks is more than 0xFFFFFFFF. Signed-off-by: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com> Reviewed-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
This commit is contained in:
parent
c3e9fd097a
commit
cd8b261a9e
|
@ -82,7 +82,12 @@ CREATE cdb 10 allot
|
|||
>r rot r> ( block# #blocks addr len )
|
||||
2swap ( addr len block# #blocks )
|
||||
dup >r
|
||||
cdb scsi-build-read-10 ( addr len )
|
||||
cdb ( addr len block# #blocks cdb )
|
||||
max-block-num FFFFFFFF > IF
|
||||
scsi-build-read-16 ( addr len )
|
||||
ELSE
|
||||
scsi-build-read-10 ( addr len )
|
||||
THEN
|
||||
r> -rot ( #blocks addr len )
|
||||
scsi-dir-read cdb scsi-param-size 10
|
||||
retry-scsi-command
|
||||
|
|
|
@ -524,6 +524,35 @@ CONSTANT scsi-length-read-12
|
|||
scsi-length-read-12 to scsi-param-size \ update CDB length
|
||||
;
|
||||
|
||||
\ ***************************************************************************
|
||||
\ SCSI-Command: READ (16)
|
||||
\ Type: Block Command
|
||||
\ ***************************************************************************
|
||||
\ Forth Word: scsi-build-read-16 ( block# #blocks cdb -- )
|
||||
\ ***************************************************************************
|
||||
\ command code
|
||||
88 CONSTANT scsi-cmd-read-16
|
||||
|
||||
\ CDB structure
|
||||
STRUCT
|
||||
/c FIELD read-16>operation-code \ code: 88
|
||||
/c FIELD read-16>protect \ RDPROTECT, DPO, FUA, FUA_NV
|
||||
/x FIELD read-16>block-address \ lba
|
||||
/l FIELD read-16>length \ transfer length (32bits)
|
||||
/c FIELD read-16>group \ group number
|
||||
/c FIELD read-16>control
|
||||
CONSTANT scsi-length-read-16
|
||||
|
||||
: scsi-build-read-16 ( block# #blocks cdb -- )
|
||||
>r ( block# #blocks ) ( R: -- cdb )
|
||||
r@ scsi-length-read-16 erase \ 16 bytes CDB
|
||||
scsi-cmd-read-16 r@ read-16>operation-code c! ( block# #blocks )
|
||||
r@ read-16>length l! ( block# )
|
||||
r@ read-16>block-address x! ( )
|
||||
scsi-param-control r> read-16>control c! ( R: cdb -- )
|
||||
scsi-length-read-16 to scsi-param-size \ update CDB length
|
||||
;
|
||||
|
||||
\ ***************************************************************************
|
||||
\ SCSI-Command: READ with autodetection of required command
|
||||
\ read(10) or read(12) depending on parameter size
|
||||
|
|
Loading…
Reference in New Issue