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:
Nikunj A Dadhania 2016-10-12 13:38:22 +05:30 committed by Alexey Kardashevskiy
parent c3e9fd097a
commit cd8b261a9e
2 changed files with 35 additions and 1 deletions

View File

@ -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

View File

@ -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