diff mbox

[v3] scsi: implement READ (16) command

Message ID 1476259702-20626-1-git-send-email-nikunj@linux.vnet.ibm.com
State Accepted
Headers show

Commit Message

Nikunj A Dadhania Oct. 12, 2016, 8:08 a.m. UTC
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>
---
 slof/fs/scsi-disk.fs    |  7 ++++++-
 slof/fs/scsi-support.fs | 29 +++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)

Comments

Alexey Kardashevskiy Oct. 12, 2016, 10:53 p.m. UTC | #1
On 12/10/16 19:08, Nikunj A Dadhania wrote:
> 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>

Thanks, applied.

> ---
>  slof/fs/scsi-disk.fs    |  7 ++++++-
>  slof/fs/scsi-support.fs | 29 +++++++++++++++++++++++++++++
>  2 files changed, 35 insertions(+), 1 deletion(-)
> 
> diff --git a/slof/fs/scsi-disk.fs b/slof/fs/scsi-disk.fs
> index 2f7d740..bcaa19e 100644
> --- a/slof/fs/scsi-disk.fs
> +++ b/slof/fs/scsi-disk.fs
> @@ -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
> diff --git a/slof/fs/scsi-support.fs b/slof/fs/scsi-support.fs
> index 3e65c87..adb12e3 100644
> --- a/slof/fs/scsi-support.fs
> +++ b/slof/fs/scsi-support.fs
> @@ -525,6 +525,35 @@ CONSTANT scsi-length-read-12
>  ;
>  
>  \ ***************************************************************************
> +\ 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
>  \               (read(6) removed because obsolete in some cases (USB))
>
diff mbox

Patch

diff --git a/slof/fs/scsi-disk.fs b/slof/fs/scsi-disk.fs
index 2f7d740..bcaa19e 100644
--- a/slof/fs/scsi-disk.fs
+++ b/slof/fs/scsi-disk.fs
@@ -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
diff --git a/slof/fs/scsi-support.fs b/slof/fs/scsi-support.fs
index 3e65c87..adb12e3 100644
--- a/slof/fs/scsi-support.fs
+++ b/slof/fs/scsi-support.fs
@@ -525,6 +525,35 @@  CONSTANT scsi-length-read-12
 ;
 
 \ ***************************************************************************
+\ 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
 \               (read(6) removed because obsolete in some cases (USB))