NVMETEST

NVME Test Program

User Guide

Version 2A4d

Copyright 2015-2020 Hale Landis. All rights reserved.

The example scripts (*.DSF files) are described in the SCRIPTS.HTM file.

Also see the CMD-SUM.HTM file.

TABLE OF CONTENTS

(Go To TOC)

INTRODUCTION

NVMETEST is a powerful test program for testing NVME devices.

NVMETEST accepts simple command input from the keyboard or script files to assemble NVME commands and execute those commands. The scripting language includes IF/ELSE, WHILE, subroutines, built-in and user defined variables (numeric and string) and many other powerful features.

NVMETEST is a DOS DPMI program. It requires a DPMI driver (the DPMI driver CWSDPMI.EXE is provided with NVMETEST).

NVMETEST is not shareware or freeware. NVMETEST is a commercial product and you or your company must have purchased a copy of the program in order to legally use the full function version of the program. There is a demonstration/free version of the program that has reduced function. The demonstration/free version of NVMETEST has no use or distribution restrictions but shall be used only to evaluate the program.

(Go To TOC)

REQUIREMENTS

NVMETEST requires the following basic system and test devices:

NVMETEST does not use the system BIOS - NVMETEST directly accesses the NVME device registers and takes full control of the NVME device. During startup NVMETEST resets the NVME device.

(Go To TOC)

INSTALLATION

Create a bootable DOS device (floppy disk or USB boot device) with no CONFIG.SYS or AUTOEXEC.BAT files. Place the NVMETEST.EXE and CWSDPMI.EXE files on the boot device.

Boot your system from the boot device. This insures that you are not loading some strange device drivers that may interfere with NVMETEST.

(Go To TOC)

RUNNING NVMETEST

To run NVMETEST, set up the test system and devices:

The method to start NVMETEST is by using the command line


   NVMETEST

When NVMETEST starts it will find the NVME device(s). If more than one NVME device is found NVMETEST will need to be restarted using the b:d:f command line option. During startup NVMETEST will reset and initialize the NVME device to be used. If startup initialization is successful testing will begin. The program will switch to "full screen" mode during testing. This screen shows the testing progress. NVMETEST also writes a detailed log file.

If you wish to record all your NVMETEST activities to a file, use the LOG command to open the NVMETEST.LOG file. When the log file is open all keyboard input and program output is recorded in the log file.

(Go To TOC)

COMMAND LINE OPTIONS

The NVMETEST command line syntax is:


   NVMETEST [options]

Except for the HELP and LOG=x options, the command line options are processed left to right. If an option is specified more than once, the last (rightmost) specification is used. Only the first LOG=x option is used, any addtional LOG=x options are ignored.

(Go To TOC)

[ HELP ]


HELP

If this option is found anywhere on the NVMETEST command line all other options are ignored and NVMETEST displays the command line help and returns to DOS.

(Go To TOC)

[ b:d:f ]


b:d:f

b:d:f is the PCI bus, device and function for an NVME device.

When this option is not specified NVMETEST will scan PCI buses 0 to 15 for supported NVME devices.

This option is not required if there is only one NVME device in the system.

If the desired NVME device is not found on PCI buses 0 to 15 then this option can be used to specify a PCI bus number up to 255.

(Go To TOC)

[ AV=n ]


AV=n

This option determines the size of the array variable memory area:

The default is AV=1.

Also see:  AVCLEAR AVDELETE AVFETCH AVNEW AVSTORE

(Go To TOC)

[ BAR0=n ]


BAR0=n

This option is ignored starting in version 2A3.

See the USECMB command.

Also see:  USECMB

(Go To TOC)

[ LOG=fileName ]


LOG=fileName
LOG=*n
LOG=NUL
LOG=NULL

NOTE: Only the first LOG=x option found on the command line is used, any additional LOG=x options are ignored.

The default log file name is ".\NVMETEST.LOG". Use this option to specify a different log file name.

LOG=*n can be use to generate unique log file names based on the date/time. The generated file name replaces the *n characters and all following charactes. The LOG=*n options are:

where

LOG=*n examples:


   LOG=*1          -- LOG=4E0B47AC.LOG
   LOG=*2          -- LOG=2C181452.LOG
   LOG=\logs\*3    -- LOG=\logs\1K25F33B.LOG
   LOG=dvt\test\*4 -- LOG=dvt\test\E17G4135.LOG

Use LOG=NUL or LOG=NULL to suppress generation of the log file.

(Go To TOC)

[ MPS=n ]


MPS=n

Specify the Memory Page Size (MPS). n=4 for 4096 bytes, n=8 for 8192 bytes. The default is 4 (4096 bytes). The device must support the specified MPS.

Please note:

(Go To TOC)

[ Nn=n ]


Nn=n

Set the built-in numeric variable OPT_Nn to a decimal or hex value.

Also see:  ASK Nn=n opt_n* Sn=string

(Go To TOC)

[ READONLY ]


READONLY

Places NVMETEST into read only mode. Commands that write data are not allowed. This option is in effect for the entire execution of NVMETEST and can not be turned off using the READOnly command.

Warning: While the READOnly option and the READOnly command can be used to disable write commands, be careful, some NVME Admin commands may write to the device media!

Also see:  READOnly

(Go To TOC)

[ SCRIPT=fileName ]


SCRIPT=fileName

Run the specified script file. See the SCRIPT FILES below.

(Go To TOC)

[ SCR=fileName ]


SCR=fileName

Same as 'SCRIPT=fileName'.

Also see:  SCRIPT=fileName

(Go To TOC)

[ SLIST=fileName ]


SLIST=fileName

Run the specified script list. See the SCRIPT LISTS below.

Also see the SLIST and SLOPTION commands.

(Go To TOC)

[ Sn=string ]


Sn=string

Set the built-in string variable STR_Sn to the string value. The value 'string' can be 0 to 32 characters and should be restricted to the character a-z, A-Z and 0-9.

Also see:  ASKSTR Nn=n STRx str_s*

(Go To TOC)

ENVIRONMENT VARIABLES

These DOS Environment variables must be set using the DOS SET command before NVMETEST is started.

SET NVMETEST=x

The DOS environment variable NVMETEST is used to control the NVMETEST screen size and the screen colors. This variable is set using the DOS SET command:


   SET NVMETEST=[size];[colors]

where size is the number of screen rows, usually 25, 43, etc, and colors is a list of seven foreground/background colors. There are seven types of messages or areas of the screen:

Each of these can be set to a different color by specifying a pair of characters for the foreground and background colors. The colors are:


   k or K - black
   b or B - blue
   g or G - green
   c or C - cyan
   r or R - red
   m or M - magenta
   y or Y - yellow
   w or W - white

The lower case character results in a low intensity color and a upper case character results in a high intensity color.

The NVMETEST default on a color monitor is:


   SET NVMETEST=25;wkckykgkwkWkMk

The NVMETEST default on a monochrome monitor is:


   SET NVMETEST=25;wkwkwkwkWkWkWk

The following example sets the screen size to 43 lines and changes the screen colors:


   set nvmedemo=43;WkCkYkGkWkkWMk

(Go To TOC)

USER INTERFACE

This section describes the normal user interface of NVMETEST. A script file may use an alternative user interface known as window mode, see the next section.

NVMETEST uses a full screen format for the output. The screen layout is:


   lines      use
   ---------  -----------------------------
    1         program identification line
    2 to n-2  scrolling output area
    n-1       status message
    n         prompt and input area

The user interface operates in one of two modes: normal mode and review mode. Commands are entered and executed in normal mode. In review mode, previous output is displayed.

In normal mode the following keys are used:


   BS    - move the cursor to the left and delete one character
   DEL   - delete the character at the cursor position
   DOWN  - recall commands in the command history buffer
   END   - move the cursor to the end of the line
   ENTER - completes the input
   HOME  - move the cursor to the begining of the line
   INS   - toggle insert/replace mode
   LEFT  - move the cursor left one character
   PGDN  - enter review mode
   PGUP  - enter review mode
   RIGHT - move the cursor right one character
   UP    - recall commands in the command history buffer
   CTRL-END - delete characters to right of cursor position

In review mode the following keys are used:


   DOWN  - scroll down one line
   ESC   - return to normal mode
   PGDN  - scroll down one screen
   PGUP  - scroll up one screen
   UP    - scroll up one line

(Go To TOC)

WINDOW INTERFACE

A script file can place NVMETEST into an alternative user interface mode known as window mode. In window mode the script can control what is displayed in all but the bottom two rows of the screen and the script can display simple menus to retrieve user input. In window mode the script can ask the user to select from a memnu of items and ask the user for numeric and Yes/No input.

When a script presents a menu of items and asks the user to select one of those items the following keys can be used:


   DOWN  - move up one item
   END   - go to the last item
   ENTER - select the item
   HOME  - go to the first item
   UP    - move down one item

In window mode the ASK and ASKYN commands operate the same as in normal mode except the PGUP and PGDN keys are ignored. See the ASK, ASKYN and WINdow command descriptions for more information.

In window mode all program messages continue to be logged to the NVMETEST log file (see the ECHO and LOG commands). The results of executing commands, especially device I/O commands, is not displayed. A script should allow the user to return to normal mode so that the current log file can be seen or so that review mode can be used.

See SCRIPT FILES below and also see the DEMO.DSF and EXAMPLE.DSF files for examples of window mode.

(Go To TOC)

MESSAGE LOGS

All NVMETEST messages belong to a message level. The ECHO and LOG commands can be used to control the message levels that are displayed and written to the log file.

There are nine message levels:

There are four message level control settings:

The keyboard message levels are controlled using the LOG KML command. The script file message levels are controlled by the LOG SML command. The ECHO, LOG MAXimum and LOG MINimum commands provide a simple method to control the message levels.

Setting a message level off does not affect the execution of a command that produces messages in that message level. For example, turning off informational (M) messages will not affect the result of executing a TAG command but the messages produced by the TAG command will not appear.

(Go To TOC)

COMMAND SUMMARY

Help, Exit/Quit Commands

Basic Commands

Advanced Commands

Queued Command Lists

Repeating and Automatic Commands

Device Option Commands

Data Compare and Generation Commands

Data Display and Trace Display Commands

Delay and Timing Commands

Script Commands

Message, Window and Log File Commands

String Commands

Low Level I/O Port Commands

Editor Commands

(Go To TOC)

COMMAND DESCRIPTION FORMAT

In the following command descriptions, words in UPPERCASE are entered as shown. Words in lower case represent variable data that is usually numeric. Words within brackets ([]) are optional. Ellipses (...) indicate that the previous word may be repeated one or more times. Case is ignored in commands ("ABC" is the same as "abc" or "aBc").

Command parameters are literal value, a numeric value, built-in or user defined variables or an expression. For example:


   ON                      - a literal
   COntinue                - a literal
   0                       - a numeric
   -5                      - a numeric
   io_result               - a built-in variable
   myvar                   - a user defined variable
   (4 + myvar * 3)         - an expression
   ((a1+b2)*(c3/d4)!=10)   - an expression

Numeric Values

Numeric values are entered as follows:

A number starting with a '-' is a negative number, for example, -2 or -0xff.

Recommendation: Use the '0' or '0x' prefix on all hex numbers. This will avoid the problem with certain numeric values being confused with a variable name.

Some NVMETEST commands have an 'lba' parameter. These values are signed 64-bit values.

An asterisk (*) can be used in place of any command parameter value. An asterisk leaves the value of the numeric parameter unchanged.

(Go To TOC)

VARIABLES

Variables are supported in the full version of NVMETEST. Variable names may be used as NVMETEST command parameters and may also be used in expressions. There are two basic type of variables:

Variable names are 1 to 10 characters. Variable names over 10 characters are truncated to 10 characters. For example "demo_version" is the same as "demo_versi". Variable names must start with an alphabetic character. Additional characters in a variable name may be alphabetic or numeric characters. Built-in variable names contain one or more underscore (_) characters. Variable names are not case sensitive.

Valid variable name examples:


   abc               (user defined)
   aBc               (same as abc)
   ABC               (same as abc)
   dev_tag           (built-in)
   Dev_Tag           (same as dev_tag)
   DEV_TAG           (same as dev_tag)
   thisisalon        (max length name)
   thisisalongname   (same as thisisalon)
   ThisIsALongOne    (same as thisisalon)

Invalid variable name examples:


   4me               (starts with a numeric character)
   _index            (starts with an underscore)
   loop$count        (invalid character $)

Built-in Variables

Built-in variables contain numeric or string data. These variables contain information describing the current program configuration, device configuration and status, and the results of NVMETEST and I/O commands.

All built-in variables are read-only. Except for the sub_param variables, built-in variables are global variables. The sub_param variables are local to each subroutine. The sub_param variables do not exist in the main part of a script.

Built-in Numeric Variables

Note: See the UDVAR command.

The following built-in numeric variables are defined:

         


   ac_code     - acCode for the most recent ASSERT that failed.

   bios_timer  - time of day, increments every 55ms, resets
               - to zero at midnight. Also see cmdt_timer.
   buf_blks    - current size of an I/O buffer in sectors
   buf_ptr     - I/O buffer pointer - 0 is PRP, 1-4 is SGLn
   buf_size    - total/max size of the NVMETEST I/O buffer in bytes.

     


   cmb_flag    - types of data in CMB: 0x00=none,
                    0x01=SQ, 0x02=CQ, 0x04=PRP, 0x08=SGL
   cmb_numbuf  - number of I/O buffers in CMB
   cmdt_avg    - CMDTime average command time in us (see note2).
   cmdt_cnt    - CMDTime number of commands (see note2).
   cmdt_cur    - CMDTime time for last command in us (see note1).
   cmdt_high   - CMDTime highest command time in us (see note2).
   cmdt_low    - CMDTime lowest command time in us (see note2).
   cmdt_timer  - CMDTime counter that increments every microsecond (see note1).
   cmdt_tot    - CMDTime total time in ms (see note2).

Note1: cmdt_cur and cmdt_timer are valid when the command timing feature configuration was successful. Also see bios_timer.

Note2: cmdt_avg, cmdt_high, cmdt_low and cmdt_tot are valid only when the command timing feature configuration was successful cmdt_cnt is greater than 0.

 


    cq_cid     - completion command ID for most recent command
    cq_dw0     - completion status dw0 for most recent command
    cq_dw1     - completion status dw1 for most recent command
    cq_dw2     - completion status dw2 for most recent command
    cq_dw3     - completion status dw3 for most recent command
    cq_en      - completion queue enty number for most recent command
    cq_qid     - completion queue ID for most recent command
    cq_status  - I/O status for most recent command or
                 0xffff=time out,
                 0xeeee=fused error,
                 0xdddd=no error no data,
                 0xcccc=admin command with SGL.

     


   crc_16       - result of the CRC16 command.

   dbp_offset   - current DPTR (PRP or SGL) offset
   demo_version - NVMETEST version.
                  The NVMETEST version is encoded as two or three ASCII characters,
                  0x0000xxyy or 0x00xxxxyy, where xxxx is the major version number and yy is the
                  minor version letter. Characters following the minor version letter are not
                  included. For example, version 1A2 is encoded as 0x00003141, and version 12B5
                  is encoded as 0x00313242.
                  See the pgm_version built-in string variable.

 


   dev_bs      - current device block size.
   dev_dto     - current driver time out in seconds
   dev_tag     - current device TAG state,
                 0=none/off, 1=full/on, 2=partial

   


   exp_err     - 0 if EXPEcterror is off, 1 if on

   fill_num    - current FILLNUM.

 


   io_errcode  - same as io_result
   io_lba      - LBA used by last command, not updated by QCx commands.
   io_result   - result of last I/O or data compare command,
                 this is the actual result, not affected by EXPEcterror,
                 0 = no error, 1 = I/O error, 2 = time out error,
                 4 = data compare error, 8 = ASSERT failed.
   io_sc       - sector count used by last R/W command, same as io_tl,
                 not updated by QCx commands.
   io_tl       - sector count used by last R/W command, same as io_sc,
                 not updated by QCx commands.

                 


   log_sml     - encoded current 'LOG SML x x' setting
   log_status  - not zero if the log file is full.

   max_lba     - maximum LBA (num_lba+1) - see below -
                    see ID and LBAIncr commands
   mdp_offset  - current MPTR offset
   meta_piat   - current PIAT (Application Tag) value.
   meta_pichk  - current PICHK value.
   meta_size   - number of metadata bytes in current format
   meta_type   - current metadata settings,
                 see METAdata command

   ns_fmtnum   - current Namespace format number (0-15)
   ns_id       - current Namespace ID
   num_bytes   - number of bytes processed by various commands.
   num_lba     - number of LBA (max_lba+1) - see above -
                    see ID and LBAIncr commands

Note: num_bytes is changed by several commands, the value should be saved in a user defined variable if it is needed. For example, see the READ command.

 


   opt_n0      - option N0=n (same as scr_param)
   opt_n1      - option N1=n
   opt_n2      - option N2=n
   opt_n3      - option N3=n
   opt_n4      - option N4=n
   opt_n5      - option N5=n
   opt_n6      - option N6=n
   opt_n7      - option N7=n
   opt_n8      - option N8=n
   opt_n9      - option N9=n

These variable can be assigned a non-zero value only by using the Nn=n command line options.

 


   pci_bus     - test device's PCI bus number (not valid if -1)
   pci_dev     - test device's PCI device number (not valid if -1)
   pci_fun     - test device's PCI function number (not valid if -1)

   


   qc_iops     - IOPS for QCGO/QCGOT
   qc_numio    - number of commands executed by QCGO/QCGOT
   qc_numsec   - execution time in seconds for QCGO/QCGOT
   que_bn      - even number buffer used by QCMDS added command

   


   rand_num    - 64-bit random number (a new value
                 each time rand_num is used).
   read_only   - current READONLY/READOnly state,
                 0 = readonly off, not 0 = readonly on.

   


   reg_cap     - NVME CAP register
   reg_vs      - NVME VS register
   reg_cc      - NVME CC register
   reg_csts    - NVME CSTS register
   reg_aqa     - NVME AQA register
   reg_cmbloc  - NVME CMBLOC register
   reg_cmbsz   - NVME CMBSZ register
   rep_num     - current repeat count (1, 2, 3, ... n)
                 during REPeat commands, value is 0 at
                 all other times.
   rep_prev    - ending repeat count for most recent REPeat command.

   


   run_id      - current Run ID, see RUNID and start_time

   run_time    - the number of seconds since NVMETEST started.

   


   scr_flag    - see SCRipt command
   scr_ln      - current script line number
   scr_param   - see SCRipt command (same as opt_n0)
   scr_run     - not zero if script running
   script_fla  - see SCRipt command
   script_ln   - current script line number
   script_par  - see SCRipt command (same as opt_n0)
   script_run  - not zero if script running

 


   sgl_sup     - value of Identify CNS=0 SGLS field

     


   slist_loop  - the number of SLIST loops completed.
   slist_sfn   - SLIST script file name (not the before or after script).
   slist_time  - The run time in minutes when the most recent SLIST loop
                 completed.
   slopt_loop  - SLOPTION LOOP n
   slopt_time  - SLOPTION TIME n

 


   sq_bn      - buffer number (DPTR buffer)
   sq_cid     - submission command ID for most recent command
   sq_dw0     - submission dw0 for most recent command
   sq_dw1     - submission dw1 for most recent command
   sq_dw2     - submission dw2 for most recent command
   sq_dw3     - submission dw3 for most recent command
   sq_dw4     - submission dw4 for most recent command
   sq_dw5     - submission dw5 for most recent command
   sq_dw6     - submission dw6 for most recent command
   sq_dw7     - submission dw7 for most recent command
   sq_dw8     - submission dw8 for most recent command
   sq_dw9     - submission dw9 for most recent command
   sq_dw10    - submission dw10 for most recent command
   sq_dw11    - submission dw11 for most recent command
   sq_dw12    - submission dw12 for most recent command
   sq_dw13    - submission dw13 for most recent command
   sq_dw14    - submission dw14 for most recent command
   sq_dw15    - submission dw15 for most recent command
   sq_en      - submission queue enty number for most recent command
   sq_qid     - submission queue ID for most recent command

   


   start_time  - initial Run ID (program start time), see RUNID and run_id
   str_result  - result of last STRx command.

 


   sub_param   - same as sub_param1.
   sub_param1  - first subroutine parameter.
   sub_param2  - second subroutine parameter.
   sub_param3  - third subroutine parameter.
   sub_param4  - fourth subroutine parameter.
   sub_param5  - fifth subroutine parameter.
   sub_param6  - sixth subroutine parameter.
   sub_param7  - seventh subroutine parameter.
   sub_param8  - eighth subroutine parameter.
   sub_param9  - nineth subroutine parameter.

Note: The sub_param variables are local to the current subroutine. They do not exist in the main part of a script.

 


   sub_return  - last subroutine's return value, see the RETURN
                 command.

Built-in String Variables

Built-in string variables are used in the 'text' parameter of the ASK, ASKYN, ASKSTR, SAY, STRSET, WLog and WRITEText commands. The STRx commands can perform various operations on the str_s* variables.

These variables have a numeric value of 0 at all times.

The following built-in string variables are defined:

                 


   cur_time    - Current date and time string.
   id_model    - Model number string.
   id_serial   - Serial number string.
   id_version  - Version number string.
   io_errmsg   - error message for most recent command
   log_name    - current log file name.
   pgm_version - NVMETEST version (see below).
   scr_name    - current script file name (same as script_nam).
   script_nam  - current script file name (same as scr_name).
   slist_sfn   - current slist file name.
   str_status  - NVME command status message (see STRSTATUS command)
   str_s0      - String variable 0
   str_s1      - String variable 1
   str_s2      - String variable 2
   str_s3      - String variable 3
   str_s4      - String variable 4
   str_s5      - String variable 5
   str_s6      - String variable 6
   str_s7      - String variable 7
   str_s8      - String variable 8
   str_s9      - String variable 9

The id_* variables are assigned a new value whenever an ID command is successful.

The pgm_version variable contains the NVMETEST version, either two or three ASCII characters: "NX" or "NNX" where N or NN is the major version number and X is the minor version letter. For example, version 1A2 is encoded as "1A" and version 12B5 is encoded as "12B". Also see the demo_version built-in variable.

The str_s* can store strings of 0 to 96 characters. These string variables can be assigned values using the Sn=string command line options and by the ASKSTR and STRx commands. There is also an array of 100 string variables that are accessed using the STRAVC, STRAVF and STRAVS commands.

User Defined Numeric Variables

User defined variables are defined and given a value by the following commands:


   ASK
   ASKYN
   COPYBYtes
   FETCHBUF
   FETCHCDB
   INPCIByte and INPCIWord
   INPORTByte, INPORTWord and INPORTDword
   LOCAL
   SET
   WINdow ASK

A variable must be defined before it can be used in place of a numeric command parameter or within an expression.

There are two kinds of user defined variables, global and local:

The following rules determine when and how variables are defined:

New global variables are defined by

Existing global variables are updated by

New local variables are defined by

* Existing local variables are updated by

Some commands are able to create new variables or update existing variables. These commands are ASK, ASKYN, COPYBYtes, FETCHBUF, INPCIx, INPORTx, and WINdow ASK. If the variable used in these commands does not exist then a new global variable is created. If the variable exists, as a local variable in the current subroutine or as a global variable, then the existing variable is updated.

User defined global variables (created by the SET and AVNEW commands are not deleted when a script file ends.

Example of global and local variables used in a script file:


   ; main part begins here
   set a = 1         ; a is a global
   set a = 2         ; global a is updated
   local a = 3       ; global a is updated (warning message)
   fetchbuf a 0 0 1  ; global a is updated
   local b = 1       ; b is a global (warning message)
   local b = 2       ; global b is updated (warning message)
   set b = 3         ; global b is updated
   fetchbuf b 0 0 1  ; global b is updated
   call sub1
   quit
   ; main part ends here
   beginsub sub1
      set a = 4         ; global a is updated
      fetchbuf a 0 0 1  ; global a is updated
      local b = 1       ; local b replaces global b
      local b = 2       ; local b is updated
      set b = 3         ; local b is updated (warning message)
      fetchbuf b 0 0 1  ; local b is updated
      call sub2
      fetchbuf c 0 0 1  ; global c is updated
      local d = 1       ; d is a local
      fetchbuf d 0 0 1  ; local d is updated
   endsub sub1
   beginsub sub2
      set a = 5         ; global a is updated
      fetchbuf a 0 0 1  ; global a is updated
      local b = 1       ; local b replaces global b
      local b = 2       ; local b is updated
      set b = 3         ; local b is updated (warning message)
      fetchbuf b 0 0 1  ; local b is updated
      fetchbuf c 0 0 1  ; c is a global
      local d = 1       ; d is a local
      fetchbuf d 0 0 1  ; local d is updated
   endsub sub2

User Defined Array Variables

Array variables may be defined and accesed using the AVCLEAR, AVDELETE, AVFETCH, AVNEW and AVSTORE commands. Array variables can be allocated in the array variable memory area or overlay the I/O buffer. The size of the array variable memory area is set by the AV=n command line option.

Like all user defined global variables, array variables are not deleted when script file execution ends. A script file that uses array variable should either a) use the AVDELETE command to delete all array variables before creating them again, or b) have some flag the will tell the script file to bypass creating the array variables again.

Also see:  AV=n AVCLEAR AVDELETE AVFETCH AVNEW AVSTORE DUMPAV

Variable Names That Look Like Numbers Or Keywords

Special care must be taken with some variable names that can be interpreted as either a numeric variable or variable name. These variables names contain only the characters A, B, C D, E, and/or the character H and X. For example:


   A        - could be the variable "A" or the
              numeric value 10 (0xa).
   f0x      - could be the variable "f0x" or the
              numeric value 240 (0xf0).
   H0       - could be the variable "H0" or the
              numeric value 0 (0x0).

If the variable name is defined, the current value of that variable is used. To avoid this confusion, use the "0" or "0x" prefix on hex numbers.

User defined variable names are not restricted and may be the same as keywords used in some commands, such as, ON, OFf, DEFAULT, etc. This can cause confusion and incorrect execution of script files. To prevent confusion or incorrect execution:


   set on = 0
   tag on      ; turns tagging on ("on" is a keyword)
   tag (on)    ; turns tagging off ("on" is a variable)

   set xyz = 583
   tag xyz     ; "xyz" is an invalid keyword
   tag (xyz)   ; turns tagging on ("xyz" is a variable)

(Go To TOC)

EXPRESSIONS

An expression is enclosed within a pair of parenthesis. All operations within an expression use signed 64-bit integers. There is no error if the expression results in an overflow or underflow. Division by zero is not allowed. The result of an expression is a signed 64-bit integer.

The general format of an expresion is


   ( [operator] token [operator token] ... )

A token is either a constant numeric value or variable name or an expression. The valid operators are


   ~ !               - bitwise NOT, logical NOT
   * / %             - multiply, divide, remainder
   + -               - add, subtract
   & | ^             - bitwise AND, OR and XOR
   << >>             - unsigned bit shift left and right
   == != < <= > >=   - comparison
   && ||             - logical AND and OR

Operators are evaluated in the precedence shown above from the top down (~ and ! have the highest precedence). Parentheis can be used to change the order of evaluation.

The ~ and ! operators are valid only as prefix operators. The + and - operators may be used as prefix operators.

An expression that consists of only a variable name or only a numeric value is valid but will evaluate slower than the same variable name or numeric value not coded as an expression. For example:


   (0)     is the same as 0
   (myvar) is the same as myvar
   (-3)    is the same as -3

Some commands that have parameters, such as 'TAG ON' or 'TAG OFf', also accept an expression that is evaluated. In most commands 0 equals OFf and not 0 equals ON, however, some commands use additional values. In these commands this expression must be enclosed in parentheis (even if the expression is a single token).

Examples of valid expressions:


   (a*b+c/d)
   ( (a*b) + (c/d) )
   (!myvar)
   (((-3)+(g)))
   ( (xx << 4) & 0x30 != (y*4) || z == -5)

Examples of invalid expressions:


   a*b+c          missing "(" and ")"
   ((3*t)         missing ")"
   (*4)           invalid prefix operator
   ((a+b)(c/d))   missing operator
                  between ")" and "("

(Go To TOC)

TEXT STRING FORMATING

The ASK, ASKYN, SAY, WLog and WRITEText commands are able to create formated text strings containing the values of built-in and user defined variables. To include the current value of a variable place the variable name within brace characters in the text string:


   {varName}      - display variable in decimal,
                    or display a string variable.
   {#varName}     - display variable in decimal,
                    pad on left with spaces to a field width of #.
   {*varName}     - display variable in hex.
   {*#varName}    - display variable in hex,
                    pad on left with '0' to a field width of #.

The maximum length of a formated text string is about 200 characters.

Examples:


   set xyz = 127

   say The current value of xyz is ({xyz}) ({*xyz}H).

      Displays the message:

      "The current value of xyz is (127) (7FH)."

   say The current value of xyz is ({5xyz}) ({*5xyz}H).

      Displays the message:

      "The current value of xyz is (  127) (0007FH)."

   say Drive Model: {id_model}

      Displays a message like this:

      "Drive Model: SuperDupper Corp Really Fast Disk"

(Go To TOC)

FILE NAMES

Some NVMETEST commands have a fileName parameter - see the LOG NEW, READ, SCRipt, WRITE and WRITEText commands. The fileName parameter may be specified in three different formats:

For case 3, to include the current value of a variable place the variable name within brace characters in the text string:


   {varName}      - convert the variable to decimal.
   {*varName}     - convert the variable to hex.

See the individual commands for examples.

(Go To TOC)

SCRIPT FILES

The commercial/full version of NVMETEST supports script files. A script file is an easy method to have NVMETEST execute a series of commands in a "batch" mode. Create a script file with your favorite ASCII text editor. Use the SCR= command line option or the SCRipt command at the keyboard to load and execute a script file.

Script files can also be used to defined the equivalent of a new NVMETEST command. This is done by defining a subroutine in a script file and then using the subroutine name as if it was an NVMETEST command. The CAll command from the keyboard can also be used to execute the subroutine.

Most NVMETEST commands can be entered at the keyboard or executed from within a script file. However, many NVMETEST commands are valid only when executed via a script file, such as the IF, ELSE, RETURN and WHILE commands. These commands provide a powerful programming facility within a script file.

Script files can be included or appened to each other using the #INCLUDE or #NEXT directive.

Script files are described in detail, with examples, in the documentation file SCRIPTS.HTM.

(Go To TOC)

SCRIPT LISTS

The SLIST command line option and/or SLIST command are used to start the execution of a Script List. A Script List is a list of script files that are part of a larger testing sequence. For example, each script file might perform a test of a single NVME command sequence. Each script file can be preceeded by a "Before" script and followed by an "After" script.

For example:


   execute the Before script
   execute test script number 1
   execute the After script
   execute the Before script
   execute test script number 2
   execute the After script
   execute the Before script
   etc...

There is also a Script List example at


      www.ata-atapi.com/techsupp.html

The Before and After scripts can be used to verify the test device is operational, change logging options, etc. The Before and After scripts are optional.

Execution of the Script List continues until either:

Script List execution will continue with the next script if any type of QUit command is executed.

If a script executes a SCRipt command the new script file is executed as part of the before, test of after script that contained the SCRipt command.

All other script file execution rules are not affected by executing a script from within a script file list.

A Script List file contains one of more text lines. These lines are:

During the execution of a before or after script the slist_sfn built-in string variable contains the name of test that will run following the before script executes or the test that just ran when the after script executes.

A script list can be repeated based on a loop count and/or a max time. The SLOPTION command is used to set the loop count or max time. The slist_loop built-in variable contains the number of SLIST loops completed. The slist_time built-in variable contains the run time in minutes when the most recent SLIST loop completed.

See the SLIST.SL and TESTnn.DSF files for an example of an script list.

(Go To TOC)

COMMAND CLASSES

Commands that are supported only in the commercial/full version are marked with the symbol [FULL].

Commands that area Admin commands are marked with the symbol [ADMIN}. These commands use only buffers 0 and 1.

Commands that perform device I/O commands are marked with the symbol [DIO]. These commands use only buffers 0 and 1. These commands can be repeated using the REPeat command and by using the / and // commands. The QC* and QCMDS commands are marked with symbol [QUE] and uses buffers 2 to 127. The QC* commands do not support metadata formats.

Commands that may be used with the REPeat command are marked with the symbol [REP].

Commands that valid only within a script file are marked with the symbol [SCRIPT]. These commands can not be entered at the keyboard.

(Go To TOC)

COMMAND EXECUTION

NVMETEST commands are executed one at a time, however, some commands can be combined using the AFTERx and BEFORE comamnds. This can create powerful combinations of NVMETEST functions. The following commands can be used to set up these combinations of NVMETEST functions:


   AFTERERror                                ONERRor
   AFTERNOerror         EXPEcterror          ONESCkey
   BEFORE               LBAIncr              REPeat

For device I/O commands (see the commands flagged with symbol [DIO]) the following is the sequence of events for the execution of a single command.


   1) Get and process the command parameters. This is performed
      only for the first execution of a repeated command.
   2) If repeating, update the LBA. This may terminate
      the repeating.
   3) Execute the BEFORE commands in effect.
   4) Execute the device I/O command.
   5) Check the I/O command result and set up the
      AFTERx commands to be processed.
      If there was an I/O error,
         execute the AFTERERror commands in effect
      else
         execute the AFTERNOerror commands in effect.
   6) Apply EXPEcterror to the command result in step 4.
   7) Apply the ONERRor condition in effect. This may
      terminate the repeating.

For the COMPx commands the following is the sequence of events for the execution of a command. Note that these commands can not be repeated and that the only error reported by these commands is a data compare error.


   1) Get and process the command parameters.
   2) Execute the command.
   3) Check the command result and set up the
      AFTERx commands to be processed.
      If there was an error,
         execute the AFTERERror commands in effect
      else
         execute the AFTERNOerror commands in effect.
   4) Apply EXPEcterror to the command result from step 2.
   5) Apply the ONERRor condition in effect.

(Go To TOC)

COMMAND REFERENCE

(Go To TOC)

[ ABORT ]


ABORT qid cmdId

[ADMIN]

Abort the command with command ID cmdId on queue qid.

This command uses only buffers 0 and 1.

Note: See the CMDParam command for the values placed into command dwords 12, 13, 14 and 15.

Also see:  CMDParam io_*

(Go To TOC)

[ AER ]


AER

[ADMIN]

Add an Asynchronous Event Request to queue 0 (Admin queue).

These requests use cmdId values FFF8H to FFFFH.

During the execution of NVME commands completion of these cmdId values are reported.

This command uses only buffers 0 and 1.

Note: See the CMDParam command for the values placed into command dwords 10, 11, 12, 13, 14 and 15.

Also see:  CMDParam io_*

(Go To TOC)

[ AFTERx ]

See AFTERERror and AFTERNOerror below.

Also see:  AFTERERror AFTERNOerror BEFORE POP PUSH

(Go To TOC)

[ AFTERERror ]


AFTERERror

Display the current after error automatic commands.


AFTERERror OFf
AFTERERror ON
AFTERERror (n)

Disable or enable automatic commands following a device I/O command that ends with an error. These commands do not change the automatic commands that are selected.

For AFTERERror (n), a zero value is the same as OFf and a non zero value is the same as ON.

Warning: See "Variables that look like keywords" above.

The default is AFTERERror ON.

Also see:  AFTERNOerror BEFORE EXPEcterror


AFTERERror [+]command [-]command ...
AFTERERror NONE

Select automatic commands executed following a device I/O command that ends with an error.

If the automatic command name is prefixed with '+' (for example +Dump), that automatic command is enabled. If the automatic command name is prefixed with '-' (for example, -Dump), that automatic command is disabled.

Valid commands are SHOWPC, Dump, SHOWCH and Clear. NONE disables all commands.

When enabled the commands are executed in the order shown.

The CQUEues, QCGO, QCGOT and SETUP commands do not use AFTERERror.

Also see:  AFTERNOerror BEFORE EXPEcterror

(Go To TOC)

[ AFTERNOerror ]


AFTERNOerror

Display the current after no error automatic commands.


AFTERNOerror OFf
AFTERNOerror ON
AFTERNOerror (n)

Disable or enable automatic commands following a device I/O command that ends with no error. These commands do not change the automatic commands that are selected.

For AFTERNOerror (n), a zero value is the same as OFf and a non zero value is the same as ON.

Warning: See "Variables that look like keywords" above.

The default is AFTERNOerror ON.

Also see:  AFTERERror BEFORE EXPEcterror


AFTERNOerror [+]command [-]command ...
AFTERNOerror NONE

Select automatic commands executed following a device I/O command that ends with no error.

If the automatic command name is prefixed with '+' (for example +Dump), that automatic command is enabled. If the automatic command name is prefixed with '-' (for example, -Dump), that automatic command is disabled.

Valid commands are SHOWPC, COMPx, Dump, SHOWCH and Clear. NONE disables all commands.

The COMPUw command is not supported by AFTERNOerror.

When enabled the commands are executed in the order shown.

COMPx is performed only after read commands.

The CQUEues, QCGO, QCGOT and SETUP commands do not use AFTERNOerror.

Also see:  AFTERERror BEFORE EXPEcterror

(Go To TOC)

[ ASK ]


ASK varName [text]

[FULL]

See the description of "user defined variables" above.

Ask for input from the keyboard. The input is a single numeric value. The value is assigned to the user defined variable varName.

Either the optional message 'text' is displayed or the following message is displayed when the keyboard input is requested:


   ASK: Enter value for variable varName ? [cur-value]

See the section TEXT STRING FORMATING for the rules on how 'text' strings are used with this command.

Also see:  ASKYN ASKSTR SAYx WLog WRITEText

(Go To TOC)

[ ASKSTR ]


ASKSTR strVar [text]

[FULL]

Ask for string input from the keyboard.

The string entered is assigned to the built-in string variable strVar (str_s*). Leading and trailing spaces are removed from the string entered.

str_result is set to the length of the string entered.

Either the optional message 'text' is displayed or the following message is displayed when the keyboard input is requested:


   ASKSTR: Enter value for string strVar ?

See the section TEXT STRING FORMATING for the rules on how 'text' strings are used with this command.

Also see:  ASK ASKYN SAYx STRx WLog WRITEText str_s* Sn=string

(Go To TOC)

[ ASKYN ]


ASKYN varName [text]

[FULL]

See the description of "user defined variables" above.

Ask for Yes/No input from the keyboard. If the first character entered is y or Y, the user defined variable varName is set to 1. If the first character entered is n or N, the user defined variable varName is set to 0.

Either the optional message 'text' is displayed or the following message is displayed when the keyboard input is requested:


   ASK: Enter Y or N for variable varName ? [cur-value]

See the section TEXT STRING FORMATING for the rules on how 'text' strings are used with this command.

Also see:  ASK ASKSTR SAYx WLog WRITEText

(Go To TOC)

[ ASSERT ]


ASSERT testValue [acCode]

If testValue is zero (false), ac_code is set to acCode, io_result is set to 0x08, and ONERRor is invoked. If acCode is not specified it defaults to the script line number of the ASSERT command. acCode can be used to identify which ASSERT failed. If specified, acCode should be a non-zero value.

If testVal is not zero (true), ac_code is set to zero and execution continues at the next command.

Also see:  ac_code io_* ONERRor

(Go To TOC)

[ AVCLEAR ]


AVCLEAR arrayName

[FULL]

Clears the entire array to zero. Array variables that overlay the I/O buffer can not be cleared by this command.

Also see:  AV=n AVDELETE AVFETCH AVNEW AVSTORE DUMPAV

(Go To TOC)

[ AVDELETE ]


AVDELETE

[FULL]

Deletes all arrays.

Also see:  AV=n AVCLEAR AVFETCH AVNEW AVSTORE DUMPAV

(Go To TOC)

[ AVFETCH ]


AVFETCH varName arrayName index

[FULL]

Fetch the value of arrayName[index] into varName.

See AVNEW for the description of how signed and unsigned values are handled.

Also see:  AV=n AVCLEAR AVDELETE AVNEW AVSTORE DUMPAV

(Go To TOC)

[ AVNEW ]


AVNEW arrayName type size [BUFfer]

[FULL]

Create a new data array in array memory or can overlay buffer 0.

Array names are user defined global variable and are not deleted when a script ends.

The first index of an array that overlays buffer 0 starts at the first byte, word, dword or qword of buffer 0 (the current BUFPtr valus is not used). Arrays defined in buffer 0 can not be cleared to zero by the AVCLEAR command (see the FILLZero command).

'arrayName' is the name of the new array. The name follows the rules for user defined variables. The array name 'cmdt' as a special use with the CMDTime commands.

'type' is the data type of the array:

'size' is the number of elements in the array.

'BUFfer' indicates the array overlays the I/O buffer. BUFfer does not use BUFOff.

If the array does not overlay the I/O buffer the array values are cleared to zero when the array is created.

Fetch and store values in the array using the AVFETCH and AVSTORE commands. When signed values are fetched from a signed array the sign bit of the value fetched is extened to a full 64-bit signed value.

Example 1:


      AVNEW mydata BYTE 100
      AVSTORE mydata 50 -1
      AVSTORE mydata 60 1
      AVFETCH temp mydata 50
      // temp = -1 (a 64-bit value)
      AVFETCH temp mydata 60
      // temp = 1 (a 64-bit value)
      AVFETCH temp mydata 10
      // temp = 0 (a 64-bit value)

Example 2:


      // increment an array value
      AVNEW mydata BYTE 100
      AVFETCH temp mydata 75
      AVSTORE mydata 75 ( temp + 1 )

Example 3:


      // execute an IDENTIFY command
      ID
      // create a word array over the ID data
      AVNEW idData usword 256 BUFFER
      // fetch the value of ID word 54
      AVFETCH idword54 idData 54

Also see:  AV=n AVCLEAR AVDELETE AVFETCH AVSTORE CMDTime DUMPAV

(Go To TOC)

[ AVSTORE ]


AVSTORE arrayName index n

[FULL]

Store the value n into arrayName[index].

See AVNEW for the description of how signed and unsigned values are handled.

Also see:  AV=n AVCLEAR AVDELETE AVFETCH AVNEW DUMPAV

(Go To TOC)

[ BEFORE ]


BEFORE

Display the current before automatic commands.

Also see:  AFTERERror AFTERNOerror POP PUSH


BEFORE OFf
BEFORE ON
BEFORE (n)

Disable or enable automatic commands prior a device I/O command. These commands do not change the automatic commands that are selected.

For BEFORE (n), a zero value is the same as OFf and a non zero value is the same as ON.

Warning: See "Variables that look like keywords" above.

The default is BEFORE ON.

Also see:  AFTERx EXPEcterror


BEFORE [+]command [-]command ...
BEFORE NONE

Valid commands are Dump, SHOWCH, CLear and FILLx. NONE disables all commands.

When enabled the commands are executed in the order shown.

Select automatic commands executed prior to a device I/O command.

Dump displays only the first sector in the I/O buffer.

FILLx is performed only before write commands. The FILLUw command is not supported by BEFORE.

If the automatic command name is prefixed with '+' (for example +Dump), that automatic command is enabled. If the automatic command name is prefixed with '-' (for example, -Dump), that automatic command is disabled.

The CQUEues, QCGO, QCGOT and SETUP commands do not use BEFORE.

Also see:  AFTERx EXPEcterror

(Go To TOC)

[ BEGINSub ]


BEGINSub subName [type]

[FULL] [SCRIPT]

Define the beginning of a script file subroutine.

subName is the name of the subroutine and type is either PRIVate or PUBlic. If type is omitted, type defaults to PUBlic.

PRIVate subroutines can be called only by using a CAll, ONERRor or ONESCkey command within a script file. PUBlic subroutines can be called by a CAll or ONERRor command within a script file and can also be called by entering a CAll command from the keyboard.

Subroutine names can be the same as NVMETEST commands. See the CAll command for an explanation of how a subroutine can replace an NVMETEST command.

Warning: Be careful when selecting subroutine names. Any NVMETEST command, including commands like QUit and Exit, can be replaced by a PUBlic subroutine of the same name.

Also see:  CAll ONERRor ONESCkey

(Go To TOC)

[ BLKSize ]


BLKSize [ sectSize [mdSize] ]

Display or set the sector size and metadata size for I/O queue commands.

The sector size must be 512, 1024, 2048, 4096 or 8192. The default is 512.

The metadata size must be 0 to 256. The default is 0;

WARNING: If the BLKSize and/or metadata size does not match the drive format then physical memory corruption will happen, the system will hang, and a power off/on cycle of the system will be required.

This sector size does not affect the size of sectors transferred by non-media access commands (such as ID).

Also see:  BLOCKSize COMPx FILLx ID TAG

(Go To TOC)

[ BLOCKSize ]


BLOCKSize [ sectSize [mdSize] ]

Same as the BLKSize command above.

Also see:  BLKSize COMPx FILLx ID TAG

(Go To TOC)

[ BReak ]


BReak

[FULL] [SCRIPT]

Exit from the current WHILE loop.

(Go To TOC)

[ BUFNum ]


BUFNum [n]

Display the current buffer number or switch to a different buffer number.

There are 128 buffers. Each buffer is 0.5Mbyte.

Buffer use by admin, single I/O and repeated single I/O commands.

Admin, single I/O and repeated I/O commands force a switch to buffer pair 0 and 1. Buffer 0 is used for data and buffer 1 is used for metadata. Buffer 0 is addressed by the DPTR and buffer 1 is addressed by the MPTR.

The FILLx and COMPx commands use only buffers 0 and 1. Other commands that access data in a buffer (such as Dump, FETCH*, STORE*, STRFBUF, STRSBUF, etc) use the current buffer.

Buffer use by Fused commands

NVMETEST allows any two commands to be fused. However the NVME specification indicates that the only valid commands are a Compare (CMPR) fused to a W (Write) command. A Compare (CMPR) command in the first position of a fused command pair will use buffers 2 and 3. The second command of the fused command pair will use buffers 0 and 1.

Both commands of an invalid fused command pair will both use buffers 0 and 1.

See the CMPR, FILLx, FUSED and COMPx commands.

Buffer use by the QC* commands

Buffers 2 to 127 are used by the QC* commands. The QC* commands do not support metadata so each of these buffers are used for data.

Also see:  BUFOff BUFPtr CMPR COMPx DUMPx FETCHBUF FILLx FUSED METAdata QCx SHOWx STORE STOREBUF STRFBUF STRSBUF

(Go To TOC)

[ BUFOff ]


BUFOff dbpOff mdpOff

Specify the address offset into the I/O buffers. The least significant bits of all buffer addresses default to 0. dbpOff and mdpOff default to 0.

dbpOff sets the least significant bits of the DPTR address for all buffers except buffer 1. mdpOff sets the least significant bits of the MPTR address only for buffer 1.

The offsets are used by all data transfer commands (Admin or I/O) and by the COMPx and FILLx commands. These offsets are not used by the Dump commands or other commands that fetch or store data in an I/O buffer.

Also see:  BUFNum BUFPtr DUMPx FETCHBUF METAdata QCx SHOWx STORE STOREBUF STRFBUF STRSBUF

(Go To TOC)

[ BUFPtr ]


BUFPtr
BUFPtr PRP
BUFPtr SGLn
BUFPtr (n)

Specify how the DPTR and MPTR fields of a command are used. The DPTR field can be used for PRP or SGL buffer addressing. The MPTR field can be used for direct buffer addressing or for SGL buffer addressing. SGLn is SGL1, SGL2, SGL3 or SGL4.

For 'BUFPtr (n)', a zero value is the same as PRP and 1 to 4 are the same as SGL1 to SGL4.

Attempting to execute Admin command with SGL should be rejected by the device with an error. If the device does not reject the command corruption of physical memory is possible.

See the buf_ptr variable.

PRP specifies that PRP is to be used for all commands. The PSDT field of a command is set to 0 (00b).

SGLn has several options:

When using SGL3 or SGL4 also see the SGLBB commmand to convert entry 1 of the SGL list to a SGL Bit Bucket.

The SGL list used contains 5 SGL entries. The list starts with the entry 3:

Also see:  BUFNum BUFOff buf_ptr DUMPx FETCHBUF QCx SGLBB SHOWx STORE STOREBUF STRFBUF STRSBUF

(Go To TOC)

[ CAll ]


CAll subName [ n1 n2 n3 n4 n5 n6 n7 n8 n9 ]
subName [ n1 n2 n3 n4 n5 n6 n7 n8 n9 ]

[FULL] [SCRIPT]

Call a script file subroutine and optionally pass one to nine parameters to the subroutine.

The values n1, n2, ..., n9 are assigned to the built-in variables sub_param1, sub_param2, ..., sub_param9 when the subroutine is entered. Any missing parameter values are set to 0.

The first format of the CAll command must be used within script files. The second format of the CAll command is not valid within a script file.

The first or second formats can be used from the keyboard to call PUBlic subroutines that were defined by the currently loaded script file. The second format makes a PUBlic subroutine appear to be an NVMETEST command.

Warning: Be careful when selecting subroutine names. Any NVMETEST command, including commands like QUit and Exit, can be replaced by a PUBlic subroutine of the same name.

Also see:  BEGINSub ENDSub SHOWSUb SCRipt

(Go To TOC)

[ CCQ ]


CCQ qid

[ADMIN]

Create a Completion queue with queue id qid. qid is 0x0001 to 0xffff. Completion queue 0x0000 is created at controller initialization.

Note: See the CMDParam command for the values placed into command dwords 12, 13, 14 and 15.

This command uses only buffers 0 and 1.

Also see:  CMDParam CSQ DCQ DSQ CQUEues io_* SHOWCQ SHOWSQ SHOWQUeues

(Go To TOC)

[ CLear ]


CLear

Clear the command history and low level trace buffers.

Also see:  SHOWx

(Go To TOC)

[ CMDParam ]


CMDParam
CMDParam dwOff n
CMDParam name value [name value] ...
CMDParam ZERO

[FULL]

Display or set values for NVME command dwords 2, 3 and 10 to 15.

dwOff is DW2, DW3 or DW10 to DW12.

The default is 'CMDParam ZERO' and all these dwords are set to zero.

'CMDParam name value' allows field values in DW12, DW13, DW14 and DW15 to be set by a name/value pair. For example, 'CMDParam LR 1' is equivalent to 'CMDParam DW12 0x80000000'. Multiple name/value pairs can be specified. For example:


   CMDParam LR 1 FUA 1
   // same as
   //   CMDParam DW12 0xc0000000
   CMDParam PRACT 1 DSM 0x66
   // same as
   //   CMDParam DW12 0x20000000
   //   CMDParam DW13 0x00000066

The field names/value pairs are:

Name Value DWn.bits
LR 0 or 1 12.31
FUA 0 or 1 12.30
PRACT 0 or 1 12.29
PRCHK 0 to 7 12.28-26
DSM 0 to FFH 13.7-0
LBRT 0 to FFFFFFFFH 14.31-0
LBATM 0 to FFFFH 15.31-16
LBAT 0 to FFFFH 15.15-0

Values specified by these commands are used in all NVME commands except:

The CMDParam values remain in effect until either a 'CMDParam ZERO' command or until a RESET command.

Note: Command dwords 0, 1 (see NSID) and 4 to 9 are controlled by the NVMETEST program (for example, NVMETEST must control I/O buffer addresses in order to prevent system corruption).

Also see:  NSID RESET VUCMDExec VUCMDParam

(Go To TOC)

[ CMDTime ]


CMDTime

[FULL]

Displays the current settings for the command timing facility.


CMDTime CONFIG

[FULL]

Configure the timers used by the command timing facility. Several seconds may be required to complete the configuration. The command timing facility is configured during NVMETEST start-up. Use this command only if the configuration failed during NVMETEST start-up.

Also see:  cmdt_*


CMDTime OFf
CMDTime ON
CMDTime (n)

[FULL]

Turn command timing on and off.

The command timing facility keeps four numbers: the number of commands executed, the total time required to perform those commands, the average command time, the minimum command time and the highest command time. The times do not include any NVMETEST command processing overhead. The execution time of all commands is counted, even comands that end with I/O or time out errors.

If an array named "cmdt" is defined then the individual command time are also stored into that array. The cmdt array must be the first array defined and it must be defined as "AVNEW CMDT DOWRD n" where n is the size of the array. See example below. If the array size is less than the number of commands executed then only the first n times are stored into the array.

CMDTime ON resets the number of command counter and the time values and enables command timing. Command timing remains in effect until a CMDTime OFf comand is executed.

CMDTime OFf displays the command time information and disables command timing.

For CMDTime (n), a zero value is the same as OFf and a non zero value is the same as ON.

Warning: See "Variables that look like keywords" above.

Also see the CMDT_* built-in variables.

Example 1: Measure the times for 1000 random single sector read commands.


   lbaincr random
   cmdtime on
   repeat 1000 r 1 1 0
   cmdtime off

Example 2: Same as above but also store times into cmdt array.


   avdelete
   avnew cmdt dword 1000
   lbaincr random
   cmdtime on
   repeat 1000 r 1 1 0
   cmdtime off
   avfetch time1 cmdt 0   // fetch first command time value
   avfesth time2 cmdt 999 // fetch last command time value

Also see:  AVCLEAR AVDELETE AVFETCH AVNEW AVSTORE

(Go To TOC)

[ CMPR ]


CMPR qid sc lba

[DIO] [REP]

Execute an NVME Compare command. This command uses only buffers 0 and 1.

qid is the queue id to use.

sc is the sector count to use.

lba is the starting LBA.

A CMPR command that is not part in the first position of a fused command pair will use buffer 0 for data and buffer 1 for metadata. See the LBAIncr and REPeat commands for methods this command can be repeated with random or other LBA values.

A CMPR command that is in the first position of a fused command pair will use buffer 2 for data and buffer 3 for metadata. The second command of the fused pair use buffer 0 for data and buffer 1 for metadata. Fused command pairs should NOT USE AFTERNOerror, BEFORE, TAG ON, or REPeat commands.

See examples below.

Note: See the CMDParam command for the values placed into command dwords 13, 14 and 15 of read/write commands.

Example 1: Execute CMPR over a range of sectors.


   // write LBA 0 to 39
   bufnum 0
   lbaincr tl
   tag on
   before fillz
   repeat 40 w 1 1 0
   // compare the data in LBA 0 to 39
   afternoerror compz
   repeat 40 cmpr 1 1 0

Example 2: A Fused CMPR and W that should not fail.


   // write LBA 0 to 39 with A5h data and lba tag
   bufnum 0
   lbaincr tl
   tag on
   fillp a5h
   before fillp
   repeat 40 w 1 1 0
   // loop do fused compare and write
   afternoerror off
   curlba = 0
   while ( curlba < 40 )
      // fill buffer 2 and 3 for CMPR command
      lbaset curlba
      fillnum 1
      fillp a5h
      copybuf dev_bs 0 2
      copybuf dev_bs 1 3
      // fill buffer 0 and 1 for CMPR command
      fillp 96h
      fused
      cmpr 1 1 curlba   // compare to a5h
      w 1 1 curlba      // write 96h
      incr curlba
   endwhile
   // verify that compare and writes updated the data to 96h
   afternoerror compp
   rep 40 r 1 1 0

Also see:  BUFNum CMDParam COMPx EXPEcterror FILLx FUSED io_* LBAIncr QCx R RWX REPeat

(Go To TOC)

[ COMPare ]


COMPare numBytes sectorOffset1 byteOffset1 sectorOffset2 byteOffset2

Compare data at one location in the current buffer to another location in the current buffer.

numBytes is the number of bytes to compare. numBytes is 0 to the current buffer size.

sectorOffset1 is 0 to one less than the maximum number of sectors that fit into the buffer.

byteOffset1 is 0 to one less than the size of a sector.

sectorOffset2 is 0 to two less than the maximum number of sectors that fit into the buffer.

byteOffset2 is 0 to one less than the size of a sector.

If there is a miscompare, only the first byte that does not compare is displayed.

See the io_result built-in variable.


   onerror cont
   compare 10 0 0 1 0
   if io_result
      say "! Compare Error !"
   endif
   onerror quit

Also see:  BLKSize COPY ID

(Go To TOC)

[ COMPBUffer ]


COMPBUffer numBytes bufNum1 bufNum2

Compare the first numBytes bytes in bufNum1 to bufNum2.

COMPBUffer does not use BUFOff.

Also see:  COPYBUffer

(Go To TOC)

[ COMPx ]


COMPx [numSect]

General information for the COMPx commands.

Compare operations are based on the BLKSize and metadata size of the device's current format.

COMPx commands operate only on buffers 0 and 1.

When testing fused commands DO NOT use the COMPx commands with BEFORE or AFTERNOerror. See the BUFNum and FUSED commands.

There are three methods to use the COMPx commands:

The COMPUw and FILLUw commands can not be used with BEFORE or AFTERNOerror. These commands are special versions of COMPx and FILLx commands for testing metadata.

If used without the 'numSect' parameter, a COMPx command will compare the data in the I/O buffer if the last device I/O read command read data into the I/O buffer.

A 'COMPx numSect' command forces data compare for the first numSect sectors in the I/O buffer.

The COMPx commands change the value of the io_result built-in variable.

The following table shows the results of a COMPx command.

TAG=x METAdata=x Buffer 0 Buffer 1
OFf N/A Compare pattern No compare
ON NONE Compare patter and tag No compare
ON DPTR Compare pattern and tag and metadata No compare
ON MPTR Compare pattern and tag Compare metadata

See COMPIncr, COMPOne, COMPPat, COMPRand, COMPStart, COMPTag, COMPWord and COMPZero below. Also see the FILLx commands (and the examples in the FILLx general description).

Also see:  AFTERx BEFORE BLKSize COMPx FILLx METAdata POP PUSH TAG

Some examples of COMPx commands...

Example 1: These commands show the 'normal' use of the COMPx (and FILLx) commands:


   BEFORE FILLRand         // fill buffer before write
   AFTERNOerror COMPRand   // compare data after read
   W 1 1 0                 // write a sector
   R 1 1 0                 // read a sector

Example 2: This is equivalent to example 1.


   FILLRand          // fill buffer
   W 1 1 0           // write a sector
   R 1 1 0           // read a sector
   COMPRand          // compare the data

Example 3: Will not compare data because NVMETEST knows that ID, commands transfer 'special' data that would not compare.


      AFTERNOerror COMPZero
      ID

Example 4: This would most likely generate a data compare error because it is unlikely a device would have Identify data that was 00H in each byte.


      ID
      COMPZero 1

(Go To TOC)

[ COMPIncr ]


COMPIncr [numSect]

See the general description of the COMPx commands above.

Compare sectors in the buffer with the incrementing byte pattern (00H, 01H, 02H, ..., FFH, 00H, ...). The last I/O command executed is used to determine the number of sectors and the size of each sector.

If TAG is FULL/ON/PARTIAL the sector tag data will also be verified.

Specify numSect (1 to current number of sectors in the I/O buffer) to force data compare even if the last device I/O command was not a read command.

Also see:  AFTERx BEFORE BLKSize COMPx FILLx METAdata POP PUSH TAG

(Go To TOC)

[ COMPOne ]


COMPOne [numSect]

See the general description of the COMPx commands above.

Compare sectors in the buffer with FFH bytes. The last I/O command executed is used to determine the number of sectors and the size of each sector.

If TAG is FULL/ON/PARTIAL the sector tag data will also be verified.

Specify numSect (1 to current number of sectors in the I/O buffer) to force data compare even if the last device I/O command was not a read command.

Also see:  AFTERx BEFORE BLKSize COMPx FILLx METAdata POP PUSH TAG

(Go To TOC)

[ COMPPat ]


COMPPat [numSect]

See the general description of the COMPx commands above.

Compare sectors in the buffer with the current pattern specified by the FILLPat command. The last I/O command executed is used to determine the number of sectors and the size of each sector.

If TAG is FULL/ON/PARTIAL the sector tag data will also be verified.

Specify numSect (1 to current number of sectors in the I/O buffer) to force data compare even if the last device I/O command was not a read command.

Also see:  AFTERx BEFORE BLKSize COMPx FILLx METAdata POP PUSH TAG

(Go To TOC)

[ COMPRand ]


COMPRand [numSect]

See the general description of the COMPx commands above.

Compare sectors in the buffer with a random data pattern. See the FILLRand command. The first 4 bytes of the sector are used as the expected data pattern. The last I/O command executed is used to determine the number of sectors and the size of each sector.

If TAG is FULL/ON/PARTIAL the sector tag data will also be verified.

Specify numSect (1 to current number of sectors in the I/O buffer) to force data compare even if the last device I/O command was not a read command.

Also see:  AFTERx BEFORE BLKSize COMPx FILLx METAdata POP PUSH TAG

(Go To TOC)

[ COMPStart ]


COMPStart [numSect]

See the general description of the COMPx commands above.

Compare sectors in the buffer with the Run ID (a 4 byte value). The last I/O command executed is used to determine the number of sectors and the size of each sector.

If TAG is FULL/ON/PARTIAL the sector tag data will also be verified.

Specify numSect (1 to current number of sectors in the I/O buffer) to force data compare even if the last device I/O command was not a read command.

Also see:  AFTERx BEFORE BLKSize COMPx FILLx METAdata POP PUSH TAG

(Go To TOC)

[ COMPTag ]


COMPTag [numSect]

See the general description of the COMPx commands above.

Compare only the sector tag data of the sectors in the buffer.

Specify numSect (1 to current number of sectors in the I/O buffer) to force data compare even if the last device I/O command was not a read command.

Also see:  AFTERx BEFORE BLKSize COMPx DUMPCT DUMPTAg FILLx METAdata POP PUSH TAG

(Go To TOC)

[ COMPUw ]


COMPUw [ numSect [ piHi piLo [expByte] ] ]

See the general description of the COMPx commands above.

Compare sectors in the buffer with all 00H or all FFH bytes or the value of expByte. If expByte is not specified then the first data byte of the sector is expected to be 00H or FFH and this value is the expByte default.

This compare is for use when attemting to read sectors that have been formatted but not written. SSD devices usually return all 00H or all FFH data when unwritten sectors are read.

Specify numSect (1 to current number of sectors in the I/O buffer) to force data compare even if the last device I/O command was not a read command.

piHi and piLo are the expected data for the PI metadata. These default to 0xffffffff if not specified.

If PI metadata is present (see the METAdata command) the PI data is compared to the piHi and piLo values. Other METAdata (not PI) is checked for all 00H or all FFH or the expByte value.

Examples:


   COMPUw         // last command SC and all FFH PI data
   COMPUw 3       // SC 3 and all FFH PI data
   COMPUw 3 0xAAAAAAAA 0xAAAAAAAA   // SC 3 and all AAH PI data

This command can not be used with the AFTERNOerror command.

Also see:  BLKSize COMPx FILLx FILLUw METAdata

(Go To TOC)

[ COMPWord ]


COMPWord [numSect]

See the general description of the COMPx commands above.

Compare sectors in the buffer with the incrementing word pattern (0000H, 0001H, ..., FFFFH, 0000H, ...). The last I/O command executed is used to determine the number of sectors and the size of each sector.

If TAG is FULL/ON/PARTIAL the sector tag data will also be verified.

Specify numSect (1 to current number of sectors in the I/O buffer) to force data compare even if the last device I/O command was not a read command.

Also see:  AFTERx BEFORE BLKSize COMPx FILLx METAdata POP PUSH TAG

(Go To TOC)

[ COMPZero ]


COMPZero [numSect]

See the general description of the COMPx commands above.

Compare sectors in the buffer with 00H bytes. The last I/O command executed is used to determine the number of sectors and the size of each sector.

If TAG is FULL/ON/PARTIAL the sector tag data will also be verified.

Specify numSect (1 to current number of sectors in the I/O buffer) to force data compare even if the last device I/O command was not a read command.

Also see:  AFTERx BEFORE BLKSize COMPx FILLx METAdata POP PUSH TAG

(Go To TOC)

[ COntinue ]


COntinue

[FULL] [SCRIPT]

Skip the remainder of the current WHILE loop and continue execution at the top of the WHILE.

(Go To TOC)

[ COPY ]


COPY numBytes frSectorOffset frByteOffset toSectorOffset toByteOffset

Copy data from one location in the current buffer to another location in the current buffer. An overlapping copy gives an undefined result.

numBytes is the number of bytes to copy. numBytes is 0 to the current buffer size.

frSectorOffset is 0 to one less than the maximum number of sectors that fit into the buffer.

frByteOffset is 0 to one less than the size of a sector.

toSectorOffset is 0 to two less than the maximum number of sectors that fit into the buffer.

toByteOffset is 0 to one less than the size of a sector.

Also see:  BLKSize COMPare ID

(Go To TOC)

[ COPYBUffer ]


COPYBUffer numBytes frBufNum toBufNum

Copies the first numBytes bytes in frBufNum to toBufNum.

Also see:  COMPBUffer

(Go To TOC)

[ COPYBYtes ]


COPYBYtes n1 n2 n3 n4 frVarName toVarName

[FULL]

Creates or updates a user defined variable by copying 1 to 4 bytes from frVarName into toVarName.

The resulting value in toVarName is:


   bits 63-32 are set to 0
   bits 31-24 are set to byte n1 of frVarName
   bits 23-16 are set to byte n2 of frVarName
   bits 15- 8 are set to byte n3 of frVarName
   bits  7- 0 are set to byte n4 of frVarName

If an n1 to n4 value is zero then zero is copied into the byte position of toVarName.

The bytes in frVarName are numbered as follows:


   5 = bits 63-56 (the most significant byte)
   6 = bits 55-48
   7 = bits 47-40
   8 = bits 39-32
   1 = bits 31-24
   2 = bits 23-16
   3 = bits 15- 8
   4 = bits  7- 0 (the least significant byte)

Examples:


   // bytes 5 6 7 8 1 2 3 4
   set x = 11223344aabbccddH

   // copy least significant 4 bytes
   copybytes 1 2 3 4 x y
      // sets y = 00000000aabbccddH

   // byte swap 32-bit number
   set y = 11223344aabbccddH
   copybytes 4 3 2 1 x y
      // sets y = 00000000ddccbbaaH

   // copy 2 bytes
   copybytes 2 1 0 0 x y
      // sets y = 00000000bbaa0000H

   // copy 2 bytes
   copybytes 7 0 8 0 x y
      // sets y = 0000000033004400H

   // byte swap a 64-bit number
   copybytes 4 3 2 1 x temp1
      // sets temp1 = 00000000ddccbbaaH
   copybytes 8 7 6 5 x temp2
      // sets temp2 = 0000000044332211H
   y = ( ( temp1 << 32 ) | temp2 )
      // sets y = ddccbbaa44332211H

(Go To TOC)

[ COPYREGS ]


COPYREGS

Copies the NVME Controller Registers into buffer 0. 8192 bytes are copied.

COPYREGS does not use BUFOff.

(Go To TOC)

[ CQUEues ]


CQUEues firstQid [ lastQid [incr] ]

[ADMIN]

Create one or more pairs of completion and submission queues starting with queue firstQid ending with queue lastQid.

lastQid defaults to firstQid. firstQid and lastQid may be 0x0001 to 0xffff.

incr can be used to create non-sequential qid's. incr defaults to 1.

This command uses only buffers 0 and 1.

Examples:


   // create a queue with QID of 3
   cqueues 3
   // create queues with QID of 1 to 7
   cqueues 1 7
   // create queues with QID of 5, 7 and 9.
   cqueues 5 9 2
   // create queues with QID 0xC000, 0xC003, 0xC006, 0xC009
   cqueues 0xc000 0xc009 3

Also see:  CMDParam CCQ CSQ DCQ DSQ io_* SHOWCQ SHOWSQ SHOWQUeues

(Go To TOC)

[ CRC16 ]


CRC16 numBytes [ numBytes2 ]

Compute the CRC16 over the first numBytes in buffer 0 and, if specified, the first numBytes2 in buffer 1. The result is placed into the variable crc_16.

CRC16 does not use BUFOff.

Also see:  crc_16

(Go To TOC)

[ CSQ ]


CSQ qid [cqid]

[ADMIN]

Create a Submissoin queue with queue id qid. qid is 0x0001 to 0xffff. cqid is the Completion queue id to pair with the new Submission queue. If cqid is not speicified it defaults to qid.

Submisson queue 0x0000 is created at controller initialization.

Note: See the CMDParam command for the values placed into command dwords 12, 13, 14 and 15.

This command uses only buffers 0 and 1.

Also see:  CMDParam CCQ DCQ DSQ CQUEues io_* SHOWCQ SHOWSQ SHOWQUeues

(Go To TOC)

[ DCQ ]


DCQ qid

[ADMIN]

qid is the queue id of the Completion to delete.

This command uses only buffers 0 and 1.

Note: See the CMDParam command for the values placed into command dwords 11, 12, 13, 14 and 15.

Also see:  CMDParam CCQ CSQ DSQ CQUEues io_* SHOWCQ SHOWSQ SHOWQUeues

(Go To TOC)

[ DECR ]


DECR varName [n]

[FULL]

If not specified, n defaults to 1.

If varName exists then this command is equivalent to


   SET varName = ( varName - n )

If varName does not exist then this commands is equivalent to


   SET varName = ( 0 - n )

Also see:  LOCAL SET

(Go To TOC)

[ DELAY ]


DELAY

Display the last delay times used.


DELAY n

Set the big delay time to n seconds and perform that delay. n is in seconds and may be a value from 0 to 600 (10 minutes).

Note: Use 'DELAY *' to use the previously set big delay time.

Warning: See "Variables that look like keywords" above.


DELAY MS n

Set the small delay time to n milliseconds and perform that delay. n is in milliseconds and may be a value from 0 to 10000 (10 seconds).

Note: Use 'DELAY MS *' to use the previously set small delay time.

Warning: See "Variables that look like keywords" above.


DELAY US n

Set the tiny delay time to n microseconds and perform that delay. n is in microseconds and may be a value from 0 to 10000 (10 milliseconds).

Note: Use 'DELAY US *' to use the previously set small delay time.

Warning: See "Variables that look like keywords" above.

(Go To TOC)

[ DOS ]


DOS COPy frFileName toFileName
DOS DELete fileName
DOS DIR [fileSpec]
DOS REName fileName newFileName

[FULL]

Execute a DOS file copy, file delete, directory listing or file rename operation.

See the section FILE NAMES above for the description of how file names can be specified.

For DIR if fileSpec is not specified the default is '*.*'. Wildcard file specifications valid only with DIR.

Failure of the DELete, DIR and REName commands will not cause a command error (script execution will not stop).

Failure of the COPy command will cause a command error (script execution will stop).

(Go To TOC)

[ DSQ ]


DSQ qid

[ADMIN]

qid is the queue id of the Submission queue to delete.

Note: See the CMDParam command for the values placed into command dwords 11, 12, 13, 14 and 15. This command uses only buffers 0 and 1.

Also see:  CMDParam CCQ CSQ DCQ CQUEues io_* SHOWCQ SHOWSQ SHOWQUeues

(Go To TOC)

[ DTO ]


DTO
DTO n

Display or change the current low level driver time out. The time out can be set to 2 to 60000 seconds. The default is 5 seconds.

Some commands use a longer time out.

The current time out value can be read from the dev_dto variable.

Also see:  dev_*

(Go To TOC)

[ DUMPx ]

See the various data dumping commands below.

Also see:  Dump DUMPAV DUMPCMb DUMPCQ DUMPCT DUMPDAta DUMPMEta DUMPREgs DUMPSQ DUMPTAg DUMPVAr SHOWx

(Go To TOC)

[ Dump ]


Dump

Display Dump command help.

Also see:  SHOWx


Dump DEC
Dump HEX

DEC and HEX select the format of the sector and byte offsets in the Dump and SHOW output, either decimal or hexadecimal. The default is HEX.

Also see:  SHOWx


Dump BUFfer byteOffset numBytes

Dump data from the current I/O buffer ignoring sector boundaries.

byteOffset is the offset into the buffer.

numBytes is the number of bytes to dump.

Also see:  SHOWx


Dump sectorOffset [ byteOffset [ numBytes ] ]

Dump data for one sector from the current I/O buffer.

sectorOffset is 0 to one less than the maximum number of sectors that fit into the I/O buffer.

byteOffset is 0 to one less than the size of a sectors plus the DPTR metadata size. The default is 0.

numBytes is the number of bytes to dump. The default is the currect sector size for the device, or following some I/O commands it is the number of bytes transferred by the I/O command. When sectorOffset is 0, numBytes will be adjusted to include the BUFOff setting.

Also see:  BLKSize Dump DUMPMEta ID METAdata


Dump Next

Continue the previous Dump sector command by incrementing sectorOffset by 1 and setting the byteOffset to 0.

Also see:  BLKSize Dump DUMPMEta ID METAdata

(Go To TOC)

[ DUMPAV ]


DUMPAV arrayName index number

[FULL]

Dump information and data values for 'arrayName' starting at 'index' for a maximum of 'number' values.

(Go To TOC)

[ DUMPCMb ]


DUMPCMb offset numBytes [fmt]

The SHOWDATA command will provide the valid offset values that can be used with this command.

There are three physical memory areas used by NVMETEST:

offset is the offset into the data area to dump. numBytes is the number of bytes to dump. fmt is 0 for memory dump format and not 0 for dword dump format (default).

Also see:  DUMPx DUMPDAta DUMPREgs SHOWx SHOWCMb SHOWDAta SHOWREgs USECMB

(Go To TOC)

[ DUMPCQ ]


DUMPCQ qid en
DUMPCQ qid 64

Dump entry en from Completion queue qid. If en is 64 the entire queue is dumped.

Also see:  DUMPSQ SHOWCMb SHOWCQ SHOWSQ SHOWQUeues USECMB

(Go To TOC)

[ DUMPCT ]


DUMPCT

Dump the NVMETEST sector tag data for sectors in the buffer. This command (used with AFTERNOerror) can be used with read data commands to scan a disk to look for sectors with incorrect tag data.

This command uses the BUFOff setting.

Also see:  DUMPTAg, BUFOff TAG.

(Go To TOC)

[ DUMPDAta ]


DUMPDAta offset numBytes [fmt]

The SHOWDATA command will provide the valid offset values that can be used with this command.

There are three physical memory areas used by NVMETEST:

offset is the offset into the data area to dump. numBytes is the number of bytes to dump. fmt is 0 for memory dump format and not 0 for dword dump format (default).

Also see:  DUMPx DUMPCMb DUMPREgs SHOWx SHOWCMb SHOWDAta SHOWREgs USECMB

(Go To TOC)

[ DUMPMEta ]


DUMPMEta sectorOffset [numSector]

Dump metadata as described by the METAdata command.

sectorOffset is the sector offset in the current buffer.

numSector is the number of sectors to display.

Also see:  Dump METAdata TAG

(Go To TOC)

[ DUMPREgs ]


DUMPREgs offset numBytes [fmt]

The SHOWDATA command will provide the valid offset values that can be used with this command.

There are three physical memory areas used by NVMETEST:

offset is the offset into the data area to dump. numBytes is the number of bytes to dump. fmt is 0 for memory dump format and not 0 for dword dump format (default).

Also see:  DUMPx DUMPCMb DUMPDAta SHOWx SHOWCMb SHOWDAta SHOWREgs

(Go To TOC)

[ DUMPSQ ]


DUMPSQ qid en
DUMPSQ qid 64

Dump entry en from Submission queue qid. If en is 64 the entire queue is dumped.

Also see:  DUMPCQ SHOWCMb SHOWCQ SHOWSQ SHOWQUeues USECMB

Also see:  BEGINSub ENDSub CAll

(Go To TOC)

[ DUMPTAg ]


DUMPTAg

Dump the NVMETEST sector tag LBA data for sectors in the current buffer. This command (used with AFTERNOerror) can be used with read data commands to scan a disk to look for sectors with incorrect LBA tag data.

This command uses the BUFOff setting.

Also see:  DUMPCT BUFOff TAG

(Go To TOC)

[ DUMPVAr ]


DUMPVAR
DUMPVAr *AV
DUMPVAr *BI
DUMPVAr *UD
DUMPVAr varName

[FULL]

Display builtin and user defined variable names and the current values.

If no parameter is specified all built-in, user defined, numeric array and non-nul string variables are displayed.

If 'AV' is sepcified all array variables are displayed.

If '*BI' is sepcified all built-in variables are displayed.

If '*UD' is specified all user defined variables are displayed.

varName can be one or more characters that are used to match against the built-in and user defined variable names. Any matching variable namess are displayed, including any that may be currently hidden by a local variable with the same name, and the currently active user defined local variables are displayed.

Examples:


   dumpva             ; display all
   dumpva *           ; display all user
   dumpva **          ; display all built-in
   dumpva ***         ; display all array
   dumpva ab          ; built-in and/or user matching 'ab'

Also see:  EE SAYx

(Go To TOC)

[ ECHO ]


ECHO
ECHO OFf
ECHO ON
ECHO (n)

Turn logging of the prompt messages and command lines during script file execution on and off. These messages begin with a '?' or '#' character.

For ECHO (n), a zero value is the same as OFf and a non zero value is the same as ON.

ECHO ON is equivalent to:


   LOG SML K *

ECHO OFF is equivalent to:


   LOG SML -K *

Warning: See "Variables that look like keywords" above.

Also see:  LOG

(Go To TOC)

[ EDITx ]

[FULL]

These commands invode the NVMETEST editor. See the EDIT, EDITKB, and EDITsf commands below.

The NVMETEST editor is also available as a stand alone program named AEDIT. See the AEDIT User Guide (AEDIT.HTM).

Also see:  Editor EDITKB EDITsf

(Go To TOC)

[ EDITKB ]


EDITKB
EDITKB [fileName]

[FULL]

Start the editor and read the Keyboard Buffer data into the buffer 0. If fileName is not specified the file name defaults to 'KBbuffer.DSF'. Buffer 0 will will be set to all 00H when the editor exits.

Also see:  Editor EDITsf

(Go To TOC)

[ EDITsf ]


EDITsf
EDITsf [fileName]

[FULL]

Start the editor to edit a file. The file is read into buffer 0. If fileName is not specified the file name defaults to 'default.DSF'. Buffer 0 will will be set to all 00H when the editor exits.

Also see:  Editor EDITKB

(Go To TOC)

[ EE ]


EE n

Evaluate expression n and display the result in decimal and hex. This command is an easy method to display the value of a variable or expression.


   x = 31
   ee x     // displays '31 0000.0000.0000.001F'
   ee (x+1) // displays '32 0000.0000.0000.0020'

Also see:  DUMPVAr SAYx

(Go To TOC)

[ ELSE ]


ELSE

[FULL] [SCRIPT]

Defines the beginning of the else part of an IF/ELSE/ENDIF command sequence. The ELSE part of this command sequence is optional.

(Go To TOC)

[ ENDIF ]


ENDIF

[FULL] [SCRIPT]

Defines the end of a IF/ELSE/ENDIF command sequence. The ELSE part of this command sequence is optional.

Also see:  IF ELSE

Also see:  IF ENDIF

(Go To TOC)

[ ENDSub ]


ENDSub [subName]

[FULL] [SCRIPT]

Defines the end of a script file subroutine. If the execution of a script reaches an ENDSUB command the ENDSUB command is equivalent to a "RETURN 0" command.

Also see:  RETurn

(Go To TOC)

[ ENDWHile ]


ENDWHile

[FULL] [SCRIPT]

Defines the end of a WHILE loop.

(Go To TOC)

[ EXit ]


EXit [n]

This command terminates NVMETEST.

The optional parameter n sets the DOS ERRORLEVEL when NVMETEST exits. The allowed values are 0 to 199 (200 to 255 are reserved for use by NVMETEST). The default for n is zero.

Also see:  QUit

(Go To TOC)

[ EXPEcterror ]


EXPEcterror [status]

The next device I/O command is expected to end with an error. When repeating an I/O command each repeated command is expected to end with an error.

EXPEcterror is reset at the end a single command or at the end of the repeat loop for repeated commands.

EXPEcterror does not apply to:

If 'status' is specified and the value is 0, EXPEcterror is disabled.

If 'status' is specified and it is a value from 1 to 7FFFH (NVME status is a 14-bit value, 1 to 7FFFH) and it must match the actual error status received from the drive.

See ONERRor for more information about the interaction of EXPEcterror and ONERRor commands.

The CQUEues, QCGO, QCGOT and SETUP commands do not use EXPEcterror.

Also see:  AFTERx exp_err ONERRor REPeat

(Go To TOC)

[ FETCHBUF ]


FETCHBUF varName [ BUFfer | sectorOffset ] byteOffset size
FETCHBUF varName [ BUFfer | sectorOffset ] byteOffset size BE
FETCHBUF varName [ BUFfer | sectorOffset ] byteOffset size LE

[FULL]

See the description of "user defined variables" above.

A value is fetched from the current buffer. The value may be 1 to 8 bytes in size. The first byte is fetched from the sector and byte offset defined by the sectorOffset and byteOffset parameters. The value is assigned to the user defined variable varName.

Use BE if the buffer data is in Big Endian format. Use LE if the buffer data is in Little Endian format. BE is the default.

If BUFfer is specified then byteOffset is the offset into the current buffer ignoring sector boundaries.

If BUFfer is not specified then sectorOffet is 0 to one less than the maximum number of sectors that fit into the buffer and byteOffset is 0 to one less than the size of a sector.


   // assume the buffer contains (in hex)
   // 11 22 33 44 55 66 77 88
   fetchbuf a 0 0 4
   // a is now 0x11223344
   fetchbuf a 0 1 2
   // a is now 0x2233
   fetchbuf a 0 0 4 LE
   // a is now 0x44332211
   fetchbuf a 0 1 2 LE
   // a is now 0x3322
   fetchbuf a 0 0 8
   // a is now 0x1122334455667788
   fetchbuf a 0 0 8 LE
   // a is now 0x8877665544332211

Also see:  BLKSize ID SET STORE STOREBUF

(Go To TOC)

[ FETCHCQ ]


FETCHCQ varName qid eNum dwNum

Fetch a DWORD from a completion queue entry.

The value fetched is assigned to the user define variable varName.

qid is the queue to fetch data from.

eNum is the entry number within the queue (0-63).

dwNum is the dword within the entry (0-3).

Also see:  FETCHSQ

(Go To TOC)

[ FETCHSQ ]


FETCHSQ varName qid eNum dwNum

Fetch a DWORD from a submission queue entry.

The value fetched is assigned to the user define variable varName.

qid is the queue to fetch data from.

eNum is the entry number within the queue (0-63).

dwNum is the dword within the entry (0-15).

Also see:  FETCHCQ

(Go To TOC)

[ FILLx ]


FILLx

General information for the FILLx commands.

FIll operations are based on the BLKSize and metadata size of the device's current format.

FILLx commands operate only on buffers 0 and 1.

When testing fused commands DO NOT use the FILLx commands with BEFORE or AFTERNOerror. See the BUFNum and FUSED commands.

There are two methods for using the FILLx commands:

The COMPUw and FILLUw commands can not be used with BEFORE or AFTERNOerror. These commands are special versions of COMPx and FILLx commands for testing metadata.

The following table shows the results of a FILLx command.

TAG=x METAdata=x Buffer 0 Buffer 1
OFf NONE Fill pattern no tag No change
ON NONE Fill pattern with tag No change
OFf DPTR Fill pattern no tag plus metadata No change
ON DPTR Fill pattern with tag plus metadata No change
OFf MPTR Fill pattern no tag Metadata
ON MPTR Fill pattern with tag Metadata

The command FILLTag updates only the sector tag data leaving all other bytes of the sector's data unchanged.

Normally these commands are used with the BEFORE command and only the sectors that are about to be written are filled with data.

When the FILLx commands are not used with the BEFORE command, use the FILLNUM command to limit the number of sectors in the buffer that are filled with data.

See FILLIncr, FILLOne, FILLPat, FILLRand, FILLStart, FILLTag, FILLWord and FILLZero below. Also see the COMPx commands (and the examples in the COMPx general description).

Also see:  AFTERx BEFORE BLKSize COMPx FILLx POP PUSH TAG

Example: The following command sequence will generate a data compare error because the data pattern (3 bytes) does not fit a whole number of times into a 512 byte sector:


   tag off
   fillpat 11h 22h 33h
   before fillpat
   afternoerror comppat
   w 1 100 0       // write 100 sectors
   r 1 100 0       // read 100 sectors with data compare
   lbai tl
   rep 100 r 1 1 0 // read again with data compare

Also see:  AFTERx BEFORE BLKSize BUFNum COMPx FILLx FUSED POP PUSH TAG

(Go To TOC)

[ FILLIncr ]


FILLIncr [sbv]

See the general information for the FILLx commands above.

Fill each sector of the buffer with the incrementing byte data pattern.

If sbv is specified (0 to 255) the first byte of each sector will have this value. If sbv is not specified the first byte of each sector will have a random value.

The most recent sbv value will be used by BEFORE FILLIncr.

If TAG is FULL/ON/PARTIAL the sector tag data will also be added.

Also see:  AFTERx BEFORE BLKSize COMPx FILLx POP PUSH TAG

(Go To TOC)

[ FILLNUM ]


FILLNUM n

See the general information for the FILLx commands above.

Specify the number of sectors to fill when a FILLx command is not used with the BEFORE command.

The default is to fill all the sectors in the buffer even if a following write command will not write those sectors.

For example:


   // no FILLNUM command has been previous used...
   FILLR    // fills all sectors in the buffer
   W 1 1 0    // but this command writes only the first sector
   // to fill and write only the one sector...
   FILLNUM 1
   FILLR
   W 1 1 0

Also see:  AFTERx BEFORE BLKSize COMPx FILLx POP PUSH TAG

(Go To TOC)

[ FILLOne ]


FILLOne

See the general information for the FILLx commands above.

Fill each sector of the buffer with FFH bytes.

If TAG is FULL/ON/PARTIAL the sector tag data will also be added.

Also see:  AFTERx BEFORE BLKSize COMPx FILLx POP PUSH TAG

(Go To TOC)

[ FILLPat ]


FILLPat

See the general information for the FILLx commands above.

Fill each sector of the buffer with the current data pattern.

If TAG is FULL/ON/PARTIAL the sector tag data will also be added.

NOTE: PUSH and POP DO NOT SAVE/RESTORE the FILLPat data pattern.

Also see:  AFTERx BEFORE BLKSize COMPx FILLx POP PUSH TAG


FILLPat n ...
FILLPat + n ...

Fill each sector of the buffer with a data pattern.

Specify each byte of the data pattern byte (in decimal or hex) separated by one or more spaces. If the first two characters are the plus sign followed by a space, the pattern is appended to the current pattern. By using the plus sign a pattern of up to current sector size of the device may be created.

If TAG is FULL/ON/PARTIAL the sector tag data will also be added.

NOTE: PUSH and POP DO NOT SAVE/RESTORE the FILLPat data pattern.

Also see:  AFTERx BEFORE BLKSize COMPx FILLx POP PUSH TAG

(Go To TOC)

[ FILLRand ]


FILLRand

See the general information for the FILLx commands above.

Fill each sector of the buffer with a randomly generated 4 byte data pattern. The 4 byte pattern looks like this:


   1st byte = random data
   2nd byte = random data
   3rd byte = 1's complement of the 1st byte
   4th byte = 1's complement of the 2nd byte

If TAG is FULL/ON/PARTIAL the sector tag data will also be added.

Also see:  AFTERx BEFORE BLKSize COMPx FILLx POP PUSH TAG

(Go To TOC)

[ FILLStart ]


FILLStart

See the general information for the FILLx commands above.

Fill each sector of the buffer with the program Run ID (a 4 byte data pattern).

If TAG is FULL/ON/PARTIAL the sector tag data will also be added.

Also see:  AFTERx BEFORE BLKSize COMPx FILLx POP PUSH TAG

(Go To TOC)

[ FILLTag ]


FILLTag

See the general information for the FILLx commands above.

Fill each sector of the buffer with the sector tag data. Only the sector tag data is updated.

Example:


   lbaincr tl
   tag on            // use tags
   fillzero          // fill all with 00h plus tags
   w 1 1 0             // write lba 0
   before filltag    // fill (update) only tags
   repeat 9 w 1 1 0    // write lba 1 to 9
   afternoerror comptag
   repeat 10 r 1 1 0   // read lba 0-9 checking only the tags

Also see:  AFTERx BEFORE BLKSize COMPx FILLx POP PUSH TAG

(Go To TOC)

[ FILLUw ]


FILLUw dataByte metaByte piHi piLo

See the general information for the FILLx commands above.

dataByte is the data stored in all bytes of the user data of a sector.

metaByte is the data stored in all byte of the metadata of the sector. metaByte is ignored if the metadata is only PI.

piHi and piLo are 32-bit values stored in the PI part of the metadata. piHi and piLo are ignore if there is no PI in the metadata.

This command can not be used with the BEFORE command.

This command is most useful for setting up data for the CMPR command.

Also see:  BLKSize COMPx COMPUw CMPR FILLx METAdata

(Go To TOC)

[ FILLWord ]


FILLWord [swv]

See the general information for the FILLx commands above.

Fill each sector of the buffer with the incrementing word data pattern.

If sbw is specified (0 to 65535) the first word of each sector will have this value. If sbv is not specified the first word of each sector will have a random value.

The most recent sbw value will be used by BEFORE FILLWord.

If TAG is FULL/ON/PARTIAL the sector tag data will also be added.

Also see:  AFTERx BEFORE BLKSize COMPx FILLx POP PUSH TAG

(Go To TOC)

[ FILLZero ]


FILLZero

See the general information for the FILLx commands above.

Fill each sector of the buffer with 00H data.

If TAG is FULL/ON/PARTIAL the sector tag data will also be added.

Also see:  AFTERx BEFORE BLKSize COMPx FILLx POP PUSH TAG

(Go To TOC)

[ FLUSH ]


FLUSH qid

[DIO]

Execute a NVME Flush command.

qid is the queue id to use.

This command uses only buffers 0 and 1.

Note: See the CMDParam command for the values placed into command dwords 10, 11, 12, 13, 14 and 15.

Also see:  CMDParam

(Go To TOC)

[ FORMAT ]


FORMAT fmtParam

[ADMIN]

Execute a Format NVM command.

fmtParam is the contents of command DW10.

This command uses only buffers 0 and 1.

The time out for a FORMAT command is 8 times the current DTO setting.

(Go To TOC)

[ FUSED ]


FUSED

[FULL]

The next two commands are fused.

The next two commands must be on the same queue.

NVMETEST allows any two commands to be fused. However the NVME specification indicates that the only valid commands are a Compare (CMPR) fused to a W (Write) command. A Compare (CMPR) command in the first position of a fused command pair will use buffers 2 and 3. The second command of the fused command pair will use buffers 0 and 1.

Both commands of an invalid fused command pair will both use buffers 0 and 1.

See the CMPR, FILLx, FUSED and COMPx commands.

FUSED is reset by any RESET, the QCGO/QCGOT commands and the RWX command.

Also see:  BUFNum CMPR QCGO QCGOT RESET RWX.

(Go To TOC)

[ GF ]


GF dw10 [ dw11 [dw1] ]

[ADMIN]

Get feature number info. The feature number is in dw10. Some features also use a value in dw11. The feature data is read into cq_dw0 or for some features into buffer 0. Some features also use a value in command dword 11. If not specified the dw11 value defaults to zero.

The dw1 value (namespace id) defaults to the current ns_id value. This value is used only for the GF command and does not change the current NSID setting.

Note: See the CMDParam command for the values placed into command dwords 12, 13, 14 and 15.

This command uses only buffers 0 and 1.

Also see:  BUFNum CMDParam cq_* NSID ns_id SF

(Go To TOC)

[ GLP ]


GLP logPage numBytes [NOSHOW]

[ADMIN]

Read log page logPage into buffer 0. numBytes is the number of log page bytes to read (4 to 4096). numbytes should be a multiple of 4. If numBytes is not a multiple of 4 it is rounded down to the next lower multiple of 4.

Log pages 01H, 02H and 03H will be displayed if NOSHOW is not specified.

If the log page is 00H or greater than 03H use the Dump command to view the log page data in buffer 0.

Note: See the CMDParam command for the values placed into command dwords 11, 12, 13, 14 and 15.

This command uses only buffers 0 and 1.

GLP does not use BUFOff.

An GLP command that completes with no error and does not transfer data to the host is treated as a very serious error equivalent to an generic command error.

Also see:  BUFNum CMDParam

(Go To TOC)

[ HElp ]


HElp
HElp *
HElp x

With no parameter help for the HElp commands is displayed.

If '*' is specified a summary line is displayed for all commands.

If 'a' to 'z' is specified full help is displayed for all commands that begin with the specified character.

Also see:  HELPKB

(Go To TOC)

[ HELPKB ]


HELPKB
HELPKB ON
HELPKB OFf
HELPKB (n)

Enables or disables keyboard command prompting.

For HELPKB (n), a zero value is the same as OFf and a non zero value is the same as ON.

Warning: See "Variables that look like keywords" above.

Also see:  HElp

(Go To TOC)

[ ID ]


ID
ID dw10 [NOSHOW] [NOSET] [NSID n]

[ADMIN]

Execute an NVME Identify command and/or 1) display (show) the data and 2) update the max LBA variable. The ID data is read into buffer 0.

The parameter dw10 contains the CNTID (bits 31-16) and CNS (bits 7-0) values to use.

The NOSHOW parameter can be used to bypass the data display. The data for CNS=00H, 01H, 02H, 10H, 11H, 12H and 13H is formatted using the NVME specification field names. If NOSHOW is speicified use the Dump command to view the ID data in buffer 0.

The NOSET parameter can be used to bypass the built-in variable update.

The 'NSID n' parameter can be used to override the current default NSID which is set by the NSID command.

NOSHOW, NOSET and 'NSID n' can appear in any order following cns. Note: See the CMDParam command for the values placed into command dwords 11, 12, 13, 14 and 15.

An Identify command that completes with no error and does not transfer data to the host is treated as a very serious error equivalent to an generic command error.

Also see:  BUFNum BLKSize CMDParam io_* NSID REPeat SHOWx

(Go To TOC)

[ IF ]


IF n

[FULL] [SCRIPT]

Defines the beginning of an IF/ELSE/ENDIF command sequence. The ELSE part of this command sequence is optional.

If n is not zero then the IF part of the command is executed. If n is zero then the IF part of the command sequence is not executed and the optional ELSE part is executed.

Example without ELSE part:


   if ( lba & 1 )
      set nsect = 4
   endif

Example with ELSE part:


   if ( lba > 10000 )
      set nsect = ( lba & 0xf )
   else
      if ( lba > 100000 )
         set nsect = 32
      else
         set nsect = 4
      endif
   endif

Also see:  ELSE ENDIF

(Go To TOC)

[ INCR ]


INCR varName [n]

[FULL]

If not specified, n defaults to 1.

If varName exists then this command is equivalent to


   SET varName = ( varName + n )

If varName does not exist then this commands is equivalent to


   SET varName = ( 0 + n )

Also see:  LOCAL SET

(Go To TOC)

[ INPCIx ]    


INPCIByte
INPCIWord
INPCIByte offset [varName]
INPCIWord offset [varName]

[FULL]

See the description of "user defined variables" above.

Read an 8-bit value or a 16-bit value from the test device's PCI configuation space. offset is the configuration space offset (0000H to FFFFH).

If varName is not specified the value read is displayed. If varName is specified the value is assigned to the user defined variable varName.

Warning: Be careful when using these commands. Reading PCI configuration space incorrectly can cause system failures.

Also see:  OUTPCIx pci_*

(Go To TOC)

[ INPORTx ]      


INPORTByte
INPORTWord
INPORTDword
INPORTByte ioAddr [varName]
INPORTWord ioAddr [varName]
INPORTDword ioAddr [varName]

[FULL]

Note: This command can not be used to access any NVME host controller data.

See the description of "user defined variables" above.

Read an 8-bit value or a 16-bit value from a x86 I/O port. ioAddr is the I/O port address (0000H to FFFFH).

If varName is not specified the value read is displayed. If varName is specified the value is assigned to the user defined variable varName.

Warning: Be careful when using these commands. Reading some I/O ports incorrectly can cause system failures.

Also see:  OUTPORTx

(Go To TOC)

[ LBAIncr ]


LBAIncr Random [maxLba]
LBAIncr TL [maxLba]
LBAIncr -TL [maxLba]
LBAIncr n [maxLba]
LBAIncr -n [maxLba]

[FULL]

If maxLba is specified it changes the maximum LBA for all media access commands. See the max_lba variable.

All repeated R, RWX or W commands will access the LBA range that starts at the LBA specified in the R, RWX or W command and ends at max_lba.

Random: repCnt is the number of commands to execute in the LBA range from the LBA in the R, RWX or W command to max_lba and the sector count in the R, RWX or W command.

TL: The first command will use the sector count and LBA specified in the R, RWX or W command. The next command and all following commands will be at the previous command's LBA plus the previous command's sector count. Processing of commands in the LBA range will stop when either a) the repCnt is reached, or b) when the max_lba is reached.

-TL: The first command will be at max_lba minus the sector count of the R, RWX or W command plus 1 (max_lba-sc+1). The next command and all following commands will be at the previous command's LBA minus the previous command's sector count. Processing of commands in the LBA range will stop when either a) the repCnt is reached, or b) when the LBA specified in the R, RWX or W command is reached.

n: The first command will use the LBA and sector count specified in the R, RWX or W command. The next command and all following commands will be at the previous command's LBA plus n using the R, RWX or W command's sector count. Processing of commands in the LBA range will stop when either a) the repCnt is reached, or b) when the max_lba is reached. n may be a value from 0 to 65536.

-n: The first command will be at max_lba minus the sector count of the R, RWX or W command plus 1 (max_lba-sc+1). The next command and all following commands will be at the previous command's LBA minus n using the R, RWX or W command's sector count. Processing of commands in the LBA range will stop when either a) the repCnt is reached, or b) when the LBA specified in the R, RWX or W command is reached.

See the section "USING LBAIncr and REPeat COMMANDS" for many examples of LBAIncr and REPeat.

Also see the QCx commands.

Also see:  ID R REPeat RWX W QCx

(Go To TOC)

[ LBASet ]


LBASet lba

Set the starting LBA for COMPx or FILLx commands. Use this command when not using 'BEFORE FILLx' or 'AFTERNOerror COMPx' commands.

For example:


   TAG ON      // tag sectors
   LBASet 100  // start at LBA 100
   FILLNUM 5   // fill/tag LBA 100 to 104
   FILLRand    // use random data
   W 1 5 100   // write LBA 100 to 104
   R 1 5 102   // read LBA 100 to 104
   COMPRand 3  // compare LBA 102 to 104

Also see:  COMPx FILLx

(Go To TOC)

[ LOCAL ]


LOCAL varName [=] n

[FULL] [SCRIPT]

See the description of "user defined variables" above.

Creates a user defined variable local to the current subroutine and assigns the value n to it. LOCAL commands in the main part of a script are converted to SET commands.

Variable names must begin with an alphabetic character and must contain only alphabetic and numeric characters.

The equal sign is optional.

Examples:


   set a 1
   set b = 4
   LOCAL x ( a + 3 * b - 2 )
   Say X is now {x}

      Will display "X is now 11".

   set x = 3
   say X is now {x}
   local x = 4
   say X is now {x}

      Will display "X is now 3" followed by "X is now 4".

Also see:  ASK ASKYN FETCHBUF SET

(Go To TOC)

[ LOG ]


LOG

Display the current state of the log file (open or closed) and the current setting of logging message levels.


LOG DELete

Delete the current log file. If the file is currently closed, it will remain closed. If the file is open, it will be closed, deleted and re-opend.


LOG KML normal repeat
LOG SML normal repeat
LOG SMLRestore n

Set the logging message levels for keyboard (KML) and script file (SML) operations. See "Message Logging" above.

The normal and repeat parameters are a string of characters that control the message level(s) to be turned on or off. The characters in the string are processed one at a time from left to right. The valid characters are:


   * - do not change the setting. If * is used it must be the
       only character in the string.
   + - Turn on the message level indicated by the next
       character.
   - - Turn off the message level indicated by the next
       character.
   A - All messages. Note that '-A' is equivalent to 'N'.
   C - COMPx and FILLx informational messages.
   D - Dump command messages.
   E - I/O and data compare error messages.
   I - I/O start/done messages.
   K - Command prompt messages.
   M - Command informational messages.
   N - No messages. Note that '-N' is equivalent to 'A'.
   S - Show command messages.
   T - Command timing messages.

Note: Some NVMETEST error and some status messages can not be turned off.

The SCRipt command enables all script file logging (LOG SML A A).

The first script in a SLIST starts with all logging enabled (LOG SML A A).

The LOG SMRRestore can be used to restore the LOG SML setting from a previously saved value. The current LOG SML settings are encoded in the built-in variable log_sml. See example below.

Examples:


   LOG KML * N

   Do not change the current keyboard normal level but turn
   off all keyboard repeat message levels.

   LOG SML -I-KT -I-KT

   For scipt file operations, Turn off I/O start/done and command
   echo messages and turn on command timing messages.

   LOG KML NCDEIST NCDES

   is equivalent to LOG MINimun for keyboard operations.

   LOG SML A A

   is equivalent to LOG MAXimun for script file operations.

   LOG SML -K *

   is equivalent to ECHO OFF for script file operations.

   LOG SML A A                // current log level
   // ...                     // use the log level
   set saveloglvl = log_sml   // save current log level
   LOG SML N N                // change the log level
   // ...                     // use changed log level
   LOG SMLRestore saveloglvl  // restore previous log level

   allows parts of a script (such as a subroutine) to use a different
   log level.

Also see:  ECHO LOG log_sml


LOG MAXimum
LOG MINimum

Turn on full (MAXimum) message logging or turn on reduced (MINimum) message logging.

LOG MAXimum is equivalent to using these two commands:


   LOG KML A A
   LOG SML A A

LOG MINimum is equivalent to using these two commands:


   LOG KML NCDEIST NCDES
   LOG SML NCDEIST NCDES

Also see:  ECHO


LOG NEW fileName

Close the current log file, if one is open, and open a new log file with the name fileName. See the LOG=filename command line option.

See the section FILE NAMES above for the description of how file names can be specified.

LOG NEW also forces LOG MAXimum.

Examples:


   LOG NEW NEWLOG.TXT   ; file name is 'NEWLOG.TXT'

   SET X = 583
   LOG NEW (x+3)  ; file name is '586.LOG'

   SET Y = 8943
   SET Z = 26
   LOG NEW D{Y}.{*Z}H ; file name is 'D8943.1AH'

   LOG NEW *2   ; file name could be '2C181452.LOG'


LOG OFf
LOG ON
LOG (n)

Turn message logging to the current log file on and off.

LOG ON also forces LOG MAXimum.

For LOG (n), a zero value is the same as OFf and a non zero value is the same as ON.

Warning: See "Variables that look like keywords" above.

Also see:  WLog

(Go To TOC)

[ METAdata ]


METAdata
METAdata NONE
METAdata PIAT n

,h5 METAdata PICHK n


METAdata SET n
METAdata [ DPTR | MPTR ] [ PI | MD | PIMD | MDPI ]

Display or change the current metadata usage.

All METAdata values remain in effect until changed by another METAdata command.

The METAdata command is used with FILLx and COMPx settings to generate (FILLx) metadata before write commands and compare (COMPx) metadata after successful read commands.

METAdata with no parameters displays the current setting.

NONE disables all metadata options. NONE is equivalent to 'METAdata SET 0'.

'PIAT n' sets the PI Application Tag value. The default is 0. This value remains in effect until the next 'METAdata PIAT n' command. See the meta_piat variable.

'PICHK n' specifies the PI data fields to check when data is read: 0x01=check CRC, 0x02=check Application Tag, 0x04=check Reference Tag. The default is 0x07 (check all). This value remains in effect until the next 'METAdata PICHK n' command. See the meta_pichk variable.

'SET n' sets metadata options to the value n. Legal values of n are described below. 'SET 0x00', 'SET 0x10' and 'SET 0x20' are equivalent to 'SET NONE'. See the meta_type variable.

Valid use of DPTR or MPTR are shown in the table below. Any valid 'SET n' (n>0), DPTR or MPTR parameters enable metadata buffer fill before write commands and metadata compare after successful read commands.

Definitions:

Valid METAdata DPTR and MPTR parameter values:

DPTR buffer MPTR buffer METAdata command
PI + Data none METAdata DPTR PI
MD + Data none METAdata DPTR MD
PI + MD + Data none METAdata DPTR PIMD
MD + PI + Data none METAdata DPTR MDPI
Data PI METAdata MPTR PI
Data MD METAdata MPTR MD
Data PI + MD METAdata MPTR PIMD
Data MD + PI METAdata MPTR MDPI

meta_type variable values

The valid vaules of the meta_type variable are:

meta_pichk variable vaules

The valid vaules of the meta_type variable are:

Also see:  COMPx FILLx meta_*

(Go To TOC)

[ NSATTACH ]


NSATTACH nsid ctrl1 [ ctrl2 ... }

[ADMIN]

Attach one or more controllers to namespace nsid.

The ctrln parameters are placed into I/O buffer 0.

NSATTACH does not use BUFOff.

See the NVME specification description of this command.

Also see:  NSDETACH

(Go To TOC)

[ NSCREATE ]


NSCREATE nsze ncap flbas dps nmic

[ADMIN]

Create a new namespace using the specified parameters.

The nsze, ncap, flbas, dps and nmic parameters are place into I/O buffer 0.

NSCREATE does not use BUFOff.

See the NVME specification of this command.

Also see:  NSDELETE

(Go To TOC)

[ NSDELETE ]


NSDELETE nsid

[ADMIN]

Delete a namespace.

Also see:  NSCREATE

(Go To TOC)

[ NSDETACH ]


NSDETACH nsid ctrl1 [ ctrl2 ... }

[ADMIN]

Detach one or more controllers from namespace nsid.

The ctrln parameters are placed into I/O buffer 0.

NSDETACH does not use BUFOff.

See the NVME specification description of this command.

Also see:  NSATTACH

(Go To TOC)

[ NSID ]


NSID [nsid]

Display or change the Namespace ID used with I/O commands.

Some commands include a nsid parameter that overrides this setting.

The current Namespace ID is in variable ns_id.

Also see:  ns_id

(Go To TOC)

[ ONERRor ]


ONERRor

[FULL]

This command is valid in both keyboard mode and in script files.

Display the current setting of ONERRor.

The ONERRor default is QUit. ONERRor is reset to QUIT when a script ends execution and keyboard mode is entered. Also see the other ONESCkey options.

Also see:  AFTERx BEFORE BEGINSub CAll ENDSub EXPEcterror ONESCkey REPeat


ONERRor CAll subName [n1]

[FULL] [SCRIPT]

This command is valid only within script files.

ONERRor CAll is similar to placing IF, CAll and ENDIF commands after each device I/O or data compare command that calls the subroutine subName if there is an error. The optional value n1 is evaluted and saved at the time the ONERRor CAll command is executed. The value is then passed to the subroutine in the sub_param1 variable. The sub_param2, ..., sub_parm9 variables are set to 0 when the subroutine is called. If n1 is omitted, n1 is assumed to be 0.

The subroutine can return or exit with these results:

The ONERRor default is QUit. ONERRor is reset to QUIT when a script ends execution and keyboard mode is entered. Also see the other ONERRor options.

The best use of ONERRor CALL is to perform some cleanup or reporting function for the script and then continue script execution or end the script or SLIST execution with an EXit or QUit command.

Example:


      ONERRor CALL escsub 1
      // ...
      WHILE 1
         // ... Some I/O testing you would
         // ... like to stop using the ESC key.
      ENDWHILE
      // ...
      BEGINSUB escsub
         SAY ! I/O ERROR DETECTED, sub_param1={sub_param1} !
         // ... some cleanup here
         QUit
      ENDSUB

Also see:  AFTERx BEFORE BEGINSub CAll ENDSub EXPEcterror ONESCkey REPeat


ONERRor COntinue

[FULL]

This command is valid in both keyboard mode and in script files.

ONERRor COntinue actions during script file execution:

ONERRor COntinue actions when in keyboard mode:

The ONERRor default is QUit. ONERRor is reset to QUIT when a script ends execution and keyboard mode is entered. Also see the other ONERRor options.

Also see:  AFTERx BEFORE BEGINSub CAll ENDSub EXPEcterror ONESCkey REPeat


ONERRor NExt

[FULL]

This command is valid in both keyboard mode and in script files.

ONERRor Next actions during script file execution:

ONERRor NExt actions when in keyboard mode:

The ONERRor default is QUit. ONERRor is reset to QUIT when a script ends execution and keyboard mode is entered. Also see the other ONERRor options.

Also see:  AFTERx BEFORE BEGINSub CAll ENDSub EXPEcterror ONESCkey REPeat


ONERRor EXit

[FULL]

This command is valid in both keyboard mode and in script files.

ONERRor EXit actions during script file execution

ONERRor EXit actions in keyboard mode:

The ONERRor default is QUit. ONERRor is reset to QUIT when a script ends execution and keyboard mode is entered. Also see the other ONERRor options.

Also see:  AFTERx BEFORE BEGINSub CAll ENDSub EXPEcterror ONESCkey REPeat


ONERRor QUit

[FULL]

This command is valid in both keyboard mode and in script files.

ONERRor QUit actions during script file execution

ONERRor QUit actions in keyboard mode:

The ONERRor default is QUit. ONERRor is reset to QUIT when a script ends execution and keyboard mode is entered. Also see the other ONERRor options.

Also see:  AFTERx BEFORE BEGINSub CAll ENDSub EXPEcterror ONESCkey REPeat


ONERRor Summary

The following tables show all the ONERRor actions.

Table 1: EXPEcterror Actions

I/O command EXPEcterror active Action
ends with no error no No ONERRor action is taken, execution continues.
ends with no error yes This is an 'error', see Table 2.
ends with an error no This is an 'error', see Table 2.
ends with an error yes - any error expected No ONERRor action is taken, execution continues.
ends with an error yes - error status match No ONERRor action is taken, execution continues.
ends with an error yes - error status mismatch This is an 'error', see Table 2.

Table 2: ONERRor Actions

ONERRor setting Script Action Keyboard Action
CAll The subroutine is called. If the subroutine ends with a RETurn, execution of the script file continues with the next command in the script file. Not valid
CONTinue Execution of the current script continues at the next command. Get next command from keyboard.
EXit NVMETEST terminates. NVMETEST terminates.
NExt If REPeat'ing, execution of the REPeat continues. If not REPeat'ing, script continues at the next command. If REPeat'ing, execution of the REPeat continues. If not REPeat'ing, get next command from keyboard.
QUit Current script stops and either keyboard mode is entered or the next script in an SLIST is executed. Get next command from keyboard.

Also see:  AFTERx BEFORE BEGINSub CAll ENDSub EXPEcterror ONESCkey REPeat

(Go To TOC)

[ ONESCkey ]


ONESCkey

[FULL]

This command is valid in both keyboard mode and in script files.

Display the current setting of ONESCkey.

The ONESCkey default is QUit. ONESCkey is reset to QUIT when a script ends execution and keyboard mode is entered. Also see the other ONESCkey options.

Also see:  BEGINSub CAll ENDSub ONERRor REPeat POP PUSH


ONESCkey CAll subName [n1]

[FULL] [SCRIPT]

This command is valid only within script files.

ONESCkey CAll is similar to placing IF, CAll and ENDIF commands after each device I/O command that calls the subroutine subName if the ESC key has been pressed. The optional value n1 is evaluted and saved at the time the ONESCkey CAll command is executed. The value is then passed to the subroutine in the sub_param1 variable. The sub_param2, through sub_parm9 variables are set to 0 when the subroutine is called. If n1 is omitted, n1 is assumed to be 0.

The subroutine can return or exit with these results:

The ONERRor default is QUit. ONERRor is reset to QUIT when a script ends execution and keyboard mode is entered. Also see the other ONERRor options.

The best use of ONESCkey CALL is to perform some cleanup or reporting function for the script and then continue script execution or end the script or SLIST execution with an EXit or QUit command.

Example:


      ONESCkey CALL escsub 1
      // ...
      WHILE 1
         // ... Some I/O testing you would
         // ... like to stop using the ESC key.
      ENDWHILE
      // ...
      BEGINSUB escsub
         SAY ! ESC KEY DETECTED, sub_param1={sub_param1} !
         // ... some cleanup here
         QUit
      ENDSUB

The ONESCkey default is QUit. ONESCkey is reset to QUIT when a script ends execution and keyboard mode is entered. Also see the other ONESCkey options.

Also see:  BEGINSub CAll ENDSub ONERRor REPeat POP PUSH


ONESCkey COntinue

[FULL]

This command is valid in both keyboard mode and in script files.

ONESCkey COntinue actions during script file execution:

ONESCkey COntinue actions when in keyboard mode:

The ONESCkey default is QUit. ONESCkey is reset to QUIT when a script ends execution and keyboard mode is entered. Also see the other ONESCkey options.

Also see:  BEGINSub CAll ENDSub ONERRor REPeat POP PUSH


ONESCkey NExt

[FULL]

This command is valid in both keyboard mode and in script files.

ONESCkey Next actions during script file execution:

ONESCkey NExt actions when in keyboard mode:

The ONESCkey default is QUit. ONESCkey is reset to QUIT when a script ends execution and keyboard mode is entered. Also see the other ONESCkey options.

Also see:  BEGINSub CAll ENDSub ONERRor REPeat POP PUSH


ONESCkey EXit

[FULL]

ONESCkey EXit actions during script file execution

ONESCkey EXit actions in keyboard mode:

The ONESCkey default is QUit. ONESCkey is reset to QUIT when a script ends execution and keyboard mode is entered. Also see the other ONESCkey options.

Also see:  BEGINSub CAll ENDSub ONERRor REPeat POP PUSH


ONESCkey QUit

[FULL]

ONESCkey QUit actions during script file execution

ONESCkey QUit actions in keyboard mode:

The ONESCkey default is QUit. ONESCkey is reset to QUIT when a script ends execution and keyboard mode is entered. Also see the other ONESCkey options.

Also see:  BEGINSub CAll ENDSub ONERRor REPeat POP PUSH


ONESCkey Summary

The following table shows all the ONESCkey actions.

ONESCkey setting Script Action Keyboard Action
CAll The subroutine is called. If the subroutine ends with a RETurn, execution of the script file continues with the next command in the script file. Not valid
CONTinue Execution of the current script continues at the next command. Get next command from keyboard.
EXit NVMETEST terminates. NVMETEST terminates.
NExt If REPeat'ing, execution of the REPeat continues. If not REPeat'ing, script continues at the next command. If REPeat'ing, execution of the REPeat continues. If not REPeat'ing, get next command from keyboard.
QUit Current script stops and either keyboard mode is entered or the next script in an SLIST is executed. Get next command from keyboard.

Also see:  BEGINSub CAll ENDSub ONERRor REPeat POP PUSH

(Go To TOC)

[ OPTNUMset ]


OPTNUMset OPT_Nn n

[FULL]

Change the value of a OPT_Nn built-in variable. Normally the value of these varaibles are set using the Nn=n command line options.

Also see:  Nn=n opt_n*

(Go To TOC)

[ OUTPCIx ]    


OUTPCIByte
OUTPCIWord
OUTPCIByte offset n
OUTPCIWord offset n

[FULL]

Write an 8-bit or 16-bit value to the test device's PCI configuration space. offset is the configuration space offset (0000H to FFFFH). The least significant 8 or 16 bits of the value n are written to the configuraton space offset.

Warning: Be careful when using these commands. Writing to PCI configuration space incorrectly can cause system failures.

Also see:  INPCIx pci_*

(Go To TOC)

[ OUTPORTx ]      


OUTPORTByte
OUTPORTWord
OUTPORTDword
OUTPORTByte ioAddr n
OUTPORTWord ioAddr n
OUTPORTDword ioAddr n

[FULL]

Note: This command can not be used to access any NVME host controller data.

Write an 8-bit, 16-bit or 32-bit value to a x86 I/O port. ioAddr is the I/O port address (0000H to FFFFH). The least significant 8, 16 or 32 bits of the value n are written to the I/O port.

Warning: Be careful when using these commands. Writing I/O ports incorrectly can cause system failures.

Also see:  INPORTx

(Go To TOC)

[ POP ]


POP

[FULL] [SCRIPT]

Restore (pop) the ONERRor, ONESCkey, AFTERx. BEFORE, COMPx, FILLx and TAG settings saved by the most recent PUSH command. Up to 8 PUSH commands can be in effect at one time. See the PUSH command.

NOTE: PUSH and POP DO NOT SAVE/RESTORE the FILLPat data pattern.

Also see:  PUSH

(Go To TOC)

[ PUSH ]


PUSH

[FULL] [SCRIPT]

Save (push) the current ONERRor, ONESCkey, AFTERx, BEFORE, COMPx, FILLx and TAG settings. Up to 8 PUSH commands can be in effect at one time. See the POP command.

NOTE: PUSH and POP DO NOT SAVE/RESTORE the FILLPat data pattern.

Also see:  POP

(Go To TOC)

[ QCx ]

Commands used to defined and execute a queued command list.

I/O queues must be created in sequential order (1, 2, 3, ...).

The QCx commands use only buffers 2 to 127.

The QCx commands do not support namespace formats with metadata.

The QCx commands use FILLWord and COMPWord with TAG ON.

Execution of QCx commands halts on the first command that results in an error. See the "USING THE QCx COMMANDS" for more information.

Also see:  COMPWord FILLWord NSID QCADD QCCLEAR QCGO QCGOT QCMAX RUNID SHOWQC

(Go To TOC)

[ QCADD ]


QCADD R minSc maxSc minLba maxLba
QCADD W minSc maxSc minLba maxLba

Add a LBA range to the queued command list for the current namespace ID. Within a namespace the LBA range can be thought of as a data file that is either read or written.

Up to 7 LBA ranges are supported. The first QCADD command (first LBA range) is assigned to I/O queue 1. The second QCADD command is assigned to I/O queue 2, etc. The I/O queues most be created in the order 1, 2, 3, ..., 7.

maxLba must be greater than (minLba+(2*maxSc)).

Each LBA range can have a unique NSID and Run ID.

The QC* commands use FILLWord and COMPWord with TAG ON.

Example 1: Using a single namespace and the default Run ID:


   nsid 3
   qcclear
   qcmax 6
   qcadd w 1 8      0  99999
   qcadd w 1 8 100000 199999
   qcadd w 1 8 200000 299999
   qcgo 999999999 tl

Example 2: Using a multiple namespaces


   qcclear
   qcmax 4
   nsid 2
   runid rand_num
   qcadd r 1 8 0 299999
   nsid 5
   runid rand_num
   qcadd r 1 8 0 299999
   nsid 7
   runid rand_num
   qcadd r 1 8 0 299999
   qcgo 999999999 tl

Also see:  NSID QCCLEAR QCGO QCGOT QCMAX RUNID SHOWQC

(Go To TOC)

[ QCCLEAR ]


QCCLEAR

Delete all LBA ranges in the queued command list.

Also see:  NSID QCCLEAR QCGO QCGOT QCMAX RUNID SHOWQC

(Go To TOC)

[ QCGO ]


QCGO repCnt Random [DC]
QCGO repCnt TL [DC]
QCGO repCnt -TL [DC]
QCGO repCnt n [DC]
QCGO repCnt -n [DC]

[DIO] [FULL] [QUE]

Start execution of commands in the queued command list.

Buffers 2 to 127 will be used as needed.

Random: repCnt is the number of commands to execute in each LBA range (queue) using a random LBA from minLba to maxLBa and a random sector count from minSc to maxSc.

TL: The first command for the LBA range (queue) will be at minLba using minSc. The next command and all following commands for the range will be at the previous command's LBA plus the previous command's sector count using a random sector count from minSc to maxSc. Processing of commands in the LBA range will stop when either a) the repCnt is reached, or b) when the maxLba is reached.

-TL: The first command for the range (queue) will be at (maxLBA-minSc+1) using minSc. The next command and all following commands for the range will be at the previous command's LBA minus the previous command's sector count using a random sector count from minSc to maxSc. Processing of commands in the LBA range will stop when either a) the repCnt is reached, or b) when the minLba is reached.

n: The first command for the LBA range (queue) will be at minLba using minSc. The next command and all following commands for the range will be at the previous command's LBA plus n using a random sector count from minSc to maxSc. Processing of commands in the LBA range will stop when either a) the repCnt is reached, or b) when the maxLba is reached. n may be a value from 0 to 65536.

-n: The first command for the LBA range (queue) will be at (maxLba-minSc+1) using minSc. The next command and all following commands for the range will be at the previous command's LBA minus n using a random sector count from minSc to maxSc. Processing of commands in the LBA range will stop when either a) the repCnt is reached, or b) when the minLba is reached. n may be a value from -65536 to 0.

DC enables data generation for write commands and data compare for read commands.

The QC* commands use FILLWord and COMPWord with TAG ON.

Even numbered buffers are used for data. The next odd numbered buffer is used for metadata (if any).

QCGO/QCGOT reset FUSED.

Note: See the CMDParam command for the values placed into command dwords 13, 14 and 15 of read/write commands.

See the BASIC0.DSF script for many examples of using the QCx commands. Also see the LBAIncr and REPeat commands.

Execution of QCx commands halts on the first command that results in an error. See the "USING THE QCx COMMANDS" for more information.

Also see:  BUFNum CMDParam LBAIncr NSID qc_* QCADD QCCLEAR QCGOT QCMAX REPeat RUNID SHOWQC

(Go To TOC)

[ QCGOT ]


QCGOT runTime Random [DC]
QCGOT runTime TL [DC]
QCGOT runTime -TL [DC]
QCGOT runTime n [DC]
QCGOT runTime -n [DC]

[DIO] [FULL] [QUE]

Same as QCGO except using run time in seconds instead of repCnt.

Execution of QCx commands halts on the first command that results in an error. See the "USING THE QCx COMMANDS" for more information.

Also see:  BUFNum CMDParam LBAIncr NSID qc_* QCADD QCCLEAR QCGO QCMAX REPeat RUNID SHOWQC

(Go To TOC)

[ QCMAX ]


QCMAX [n]

Display or change the maximum number of commands to keep active in each LBA range. Up to 8 commands is supported.

The default is 1.

Also see:  NSID QCCLEAR QCGO QCGOT QCMAX RUNID SHOWQC

(Go To TOC)

[ QCMDS ]


QCMDS
QCMDS BEGin qid
QCMDS EXEcute

[DIO] [FULL] [QUE]

Queue and execute commands on any valid submission queue.

The following rules apply to this command and commands that are queued using this command:

Using QCMDS


   1) Begin queuing commands by using the "QCMDS BEGin n" command.
   2) Use the normal admin or I/O commands (such as ID, GF, R, W, etc)
      to queue a command. Save the buffer number used by that command
      (see que_bn variable).
   3) For output commands, set up the data to be sent to the device in
      buffers 0 and 1. Then copy those buffers to the buffers assigned
      to the queued command (see que_bn variable and COPYBUffer).
   4) Use the "QCMDS EXEcute" command to ring the doorbell and have
      the device executed the queued command(s).
   5) For input commands, copy the data from the assigned buffer to buffers
      0 and 1 and perform any checking of that data.

Examples:


   // queue commands on admin queue
   qcmds begin 0
   id 1
   bufn1 = que_bn
   gf 0
   bufn2 = que_bn
   id 2
   bufn3 = que_bn
   glp 0 16
   bufn4 = que_bn
   qcmds execute
   if io_result
      say ! QCMDS ERROR !
   endif
   // using bufn1, bufn2, etc, access data buffers
   // to check or dump data


   // queue i/o commands on queue 1
   setup 1
   qcmds begin 1
   // write lba 0 with incr data pattern
   w 1 1 0
   bufn1 = que_bn
   fillincr
   copybuffer dev_bs 0 bufn1
   // read lba 0
   r 1 1 0
   bufn2 = que_bn
   qcmds execute
   if io_result
      say ! QCMDS I/O ERROR !
   endif
   // compare lba 0 data read
   copybuffer dev_bs bufn2 0
   compincr 1
   if io_result
      say ! QCMDS DC ERROR !
   endif

Also see:  COPYBUffer que_bn

(Go To TOC)

[ QUit ]


QUit [SLIST]

When used in keyboard mode (with or without SLIST) this command terminates NVMETEST (it is equivalent to the command "EXit 0").

When used in a script file that is not part of an SLIST this command terminates execution of the script file and NVMETEST returns to keyboard mode.

When used in a script file that is part of a script list (SLIST):

Also see:  EXit

(Go To TOC)

[ R ]


R qid sc lba

[DIO] [REP]

Execute a NVME read command.

qid is the queue id to use.

sc is the sector count to use.

lba is the starting LBA.

Buffer number 0 is used for data and buffer 1 is used for metadata (if any).

See the LBAIncr and REPeat commands for methods this command can be repeated with random or other LBA values.

Note: See the CMDParam command for the values placed into command dwords 13, 14 and 15 of read/write commands.

An Read command that completes with no error and does not transfer data to the host is treated as a very serious error equivalent to an generic command error.

Also see:  CMDParam EXPEcterror io_* LBAIncr QCx REPeat RWX W

(Go To TOC)

[ RANDSEED ]


RANDSEED n

Seed the random number generator. n is 0 to 32767.

Set n to 1 to reinitialize (this is the default when NVMETEST starts).

Use RANDSEED at the beginning of a script file so that the script generates the same sequence of events and/or data.

Also see:  rand_num

(Go To TOC)

[ READFile ]


READFile numBytes fileName [ offset [Check] ]

[FULL]

With or without the Check parameter data is read from file fileName into buffer 0. No more than numBytes are read from the file. If offset is specified, reading begins at that byte offset in the file.

Without the Check parameter the built-in variable num_bytes is set to the actual number of bytes read from the file.

With the Check parameter the built-in variable num_bytes is set to an result code:

READFile does not use BUFOff.

See the section FILE NAMES above for the description of how file names can be specified.

Also see:  WRITEFile

Examples:


   READFile 10 NEWLOG.TXT

      Read 10 bytes into the buffer from file NEWLOG.TXT.

   SET X = 583
   READFile (x) (x+3)

      Read 583 bytes into the buffer from file 586.BIN.

   SET Y = 8943
   SET Z = 26
   READFile 24 D{Y}.{*Z}H

      Read 24 bytes into the buffer from file D8943.1AH.

(Go To TOC)

[ READOnly ]


READOnly
READOnly OFf
READOnly ON
READOnly (n)

Display the current setting of readonly mode or turn readonly mode on or off.

READONLY ON places NVMETEST into read only mode. In this mode QCADD commands that write and the W command is not allowed.

For READOnly (n), a zero value is the same as OFf and a non zero value is the same as ON.

Note: The READOnly command does not effect the READONLY option (the READOnly ON command as no effect if the READONLY option was used on the NVMETEST command line).

Warning: While the READONLY option and READOnly command can be used to disable write commands, be careful, some NVME Admin commands may write to the device media!

Warning: See "Variables that look like keywords" above.

Also see:  READONLY

(Go To TOC)

[ REPeat ]


REPeat count command

[FULL]

Repeat an ID, R, RWX or W command count times. For R, RWX and W commands the current max_lba must be greater than the command's starting LBA plus 2 times the command's sector count.

The command will be repeated count times unless the LBAIncr command stops the repeating based on the LBA range allowed.

See the section "USING LBAIncr and REPeat COMMANDS" for many examples of LBAIncr and REPeat.

Also see:  CMDParam EXPEcterror ID LBAIncr ONERRor QCx R RWX W

(Go To TOC)

[ RESET ]


RESET
RESET DISABLE
RESET NSSR

{DIO]

Reset or disable the NVME controller.

The mandatory/default reset is done by setting EN=0/EN=1

NSSR uses the optional NSSR method for reset.

DISABLE leaves EN=0. Another RESET is requred to enable the controller.

All I/O queues are deleted and the Admin queue is reset. The Namespace ID is reset to 0x00000001. The BUFOff is reset to 0. FUSED is reset.

The time out for a RESET command is 4 times the current DTO setting.

This command uses only buffers 0 and 1.

Also see:  DTO NSID BUFOff SHOWREgs

(Go To TOC)

[ RETurn ]


RETurn [n]

[FULL] [SCRIPT]

Return from a subroutine.

The built-in variable sub_return is set to either 0 or to the value n.

Note: The command "return sub_return" is equivalent to the command "return 0".

Also see:  ENDSub

(Go To TOC)

[ RUNID ]


RUNID [n]

Display or change the current Run ID value (a 4 byte value). The default Run ID is the program start time (see start_time). The current Run ID is in the varable run_id.

Also see:  COMPx FILLx start_time run_id

(Go To TOC)

[ RWX ]


RWX qid sequence minSc maxSc lba

[DIO] [REP]

Pick a random sector count between minSc and maxSC and pick a random LBA and then execute a sequence of read or write commands.

When repeated the first sequence will use minLba and minSc. All additional repeats will use a random LBA from minLba to maxLba and a random sector count from minSc to maxSc.

qid is the queue id to use.

The current max_lba must be greater than (lba+(2*maxSc)).

sequence is one or more R or W characters indicating read or write command to execute. Each command in the sequence will be executed with the same sector count and starting lba.

Buffer number 0 is used for data and buffer 1 is used for metadata (if any).

RWX resets FUSED.

Note: See the CMDParam command for the values placed into command dwords 13, 14 and 15 of read/write commands.

Also see:  CMDParam EXPEcterror io_* LBAIncr QCx R REPeat W

(Go To TOC)

[ SAYx ]

[FULL]

See SAY, SAYFail and SAYPass below.

Also see:  SAY SAYFail SAYPass

(Go To TOC)

[ SAY ]


SAY text

[FULL]

See the section TEXT STRING FORMATING for the rules on how 'text' strings are used with this command.

SAY messages will display even if all message levels are turned off.

Note: The first character of the message text can be used to control the message color. The following characters will change the message color: '*', '>', '?', '#' and '!'.

Also see:  SAYFail SAYPass WLog WRITEText

Examples:


   SAY ! Display this message now !

      Will display "! Display this message now !"
      in the error message color.

   SAY max_lba is {max_lba} 0x{*max_lba} {*max_lba}H

      Will display "max_lba is 4098 0x1002 1002H"
      (assuming max_lba is 4098).

   


SAYFail
SAYPass

[FULL]

Displays a large block message with the word FAIL or PASS. These messages will display even if all message levels are turned off.

(Go To TOC)

[ SCRipt ]


SCRipt fileName [n]

[FULL]

Load and execute a script file.

The script file is read, compiled and executed. The new script replaces the current script.

See the section FILE NAMES above for the description of how file names can be specified.

The variables opt_n0 and scr_param receives the parameter 'n' value. If 'n' is not specified opt_n0 and scr_param are set to zero.

Execution of the script begins with the first command of the script, also known as the first line in the main part of the script file.

A script file contains a main part followed by zero, one or more subroutine definitions. The main part can have zero, one or more commands. The main part ends at the first BEGINSub command or at the end of the script file.

After the script file is loaded execution begins with the first line of the main part. If the main part exection ends with a BEGINSub or QUit command NVMETEST returns to keyboard mode and the PUBlic subroutines defined by the script file can be executed by using the CAll command from the keyboard.

Warning: A script file can define PUBlic subroutines that have the same name as any NVMETEST command. For commands enter at the keyboard this has the effect of replacing the NVMETEST command.

Loading a new script does not alter any of the command settings, such as the current ECHO, LBA or TAG, etc, setting. Loading a script does not alter any built-in or user defined variables, except the script_flag built-in variable.

The built-in variable script_flag counts the number of times any part of the script is executed using the SCRipt or CAll commands. The SCRipt command sets script_flag so that script_flag is zero only when the main part of a script is executing.

See the #INCLUDE and #NEXT directives and the Script File User Guide (SCRIPTS.HTM).

Also see:  BEGINSub CAll ENDSub SLIST #INCLUDE #NEXT

Examples:


   SCRIPT NEWLOG.TXT   ; script file name is 'NEWLOG.TXT'

   SET X = 583
   SCRIPT (x+3)  ; script file name is '586.DSF'

   SET Y = 8943
   SET Z = 26
   SCRIPT D{Y}.{*Z}H ; script name is 'D8943.1AH

(Go To TOC)

[ SET ]


SET varName [=] n
varName = n

[FULL]

See the description of "user defined variables" above.

Creates a global variable and assigns the value n to it. In a subroutine if varName is a local user defined variable the SET command is converted to a LOCAL command.

Variable names must begin with an alphabetic character and must contain only alphabetic and numeric characters.

In the first format (using SET) the equal sign is optional.

In the second format varName must not be the name of an NVMETEST command and the equal sign (=) is required.

Example:


   set a 1
   set b = 4
   SET x ( a + 3 * b - 2 )
   Say X is now {x}

      Will display "X is now 11"

This example is equivalent to the example above:


   a = 1
   b = 4
   x = ( a + 3 * b - 2 )
   Say X is now {x}

      Will display "X is now 11"

Also see:  ASK ASKYN FETCHBUF LOCAL

(Go To TOC)

[ SETUP ]


SETUP firstQid [ lastQid [incr] ]

[ADMIN]

Execute the recommended set up commands using the current NSID (start up default NSID is 0x00000001). These commands are two ID commands followed by the creation of one or more pairs of completion and submission queues starting with queue firstQid ending with queue lastQid.

lastQid defaults to firstQid. firstQid and lastQid may be 0x0001 to 0xffff.

incr can be used to create non-sequential qid's. incr defaults to 1.

SETUP is equivalent to these commands:

These setup commands use only buffers 0 and 1.

Also see:  CQUEues ID NSID

(Go To TOC)

[ SF ]


SF dw10 dw11 dw12 dw13 dw14 dw15 [dw1]

[ADMIN]

Set a feature using the NVME command values in dwords 10 to 15.

The dw1 value (namespace id) defaults to the current ns_id value. This value is used only for the SF command and does not change the current NSID setting.

Some features may return data in cq_dw0 at the end of this command.

This command uses only buffers 0 and 1.

Also see:  CMDParam cq_* GF NSID ns_id

(Go To TOC)

[ SGLBB ]


SGLBB n

If BUFPTR SGL3 or SGL4 is enabled, use SGLBB to replace the middle part of a data transfer with an SGL Bit Bucket entry for the next write or read command. SGLBB is active only once and only for the next write or read type command (Admin or I/O).

The parameter n is 0 to 128 and specifies both the size in bytes of the first part of the data transfer and the size of the SGL Bit Bucket. If n is zero insertion of SGL Bit Bucket is disabled.

If n is 1 to 128 a Bit Bucket entry is enabled and the data transfer and the layout of the data in the I/O buffer is altered as follows:

Example 1:


   // all 0x00 data except offsets 4-7 are 0xff
   fillz
   storebuf buf 4 4 0xFFFFFFFF
   // save for compare
   copybuf dev_bs 0 2
   // enable sgl4 and bit bucket with offset and length 4
   bufptr sgl4
   sglbb 4
   // do write (the bit bucket is ignored)
   w 1 1 0
   // read using prp
   bufptr prp
   r 1 1 0
   // compare - no error expected here
   compbuf dev_bs 0 2

Example 2:


   // all 0x00 data except offsets 4-7 are 0xff
   fillz
   storebuf buf 4 4 0xFFFFFFFF
   // write using PRP
   bufptr prp
   w 1 1 0
   // change offsets 4-7 to 0xA5A5A5A5
   storebuf buf 4 4 0xA5A5A5A5
   // save for compare
   copybuf dev_bs 0 2
   // enable sgl4 and bit bucket with offset and length 4
   bufptr sgl4
   sglbb 4
   // read - data at offsets 4-7 should not change
   r 1 1 0
   // compare - offsets 4-7 should still be 0xA5A5A5A5
   compbuf dev_bs 0 2

Also see:  BUFPtr

(Go To TOC)

[ SHOWx ]

See the various data display commands below.

Also see:  DUMPx SHOWAEr SHOWCH SHOWCMb SHOWCQ SHOWDAta SHOWPC SHOWQC SHOWQUeues SHOWREgs SHOWSQ

(Go To TOC)

[ SHOW ]


SHOW

Displays help for the SHOWx commands.

Also see:  DUMPx


SHOW DEC
SHOW HEX

DEC and HEX select the format of the sector and byte offsets in the Dump and SHOW output, either decimal or hexadecimal. The default is HEX.

Also see:  DUMPx

(Go To TOC)

[ SHOWAEr ]


SHOWAEr

Display the Asynchronous Event Requests that are in use.

Also see:  AER SHOWx

(Go To TOC)

[ SHOWCH ]


SHOWCH

Display the command history buffer.

Also see:  CLear SHOWx

(Go To TOC)

[ SHOWCMb ]


SHOWCMb

Display the current CMB usage.

Also see:  DUMPCMb SHOWDAta USECMB

(Go To TOC)

[ SHOWCQ ]


SHOWCQ qid
SHOWCQ qid en
SHOWCQ qid 64

Without an entry number (en) a summary of the entire queue is displayed.

If the entry number (en) is 0 to 63 that single entry is displayed.

If the entry number (en) is 64 the entire queue is displayed.

Example:


   r 1 1 0
   showcq cq_qid cq_en

Also see:  cq_* DUMPCQ DUMPSQ SHOWSQ USECMB

(Go To TOC)

[ SHOWDAta ]


SHOWDATA [ALLBUF]

The SHOWDATA command will provide the valid offset values that can be used with the DUMPCMb, DUMPDATA and DUMPREgs commands.

Use ALLBUF to display location information for all 128 buffers. Without ALLBUF only the first 4 and last 4 buffers are displayed.

There are three physical memory areas used by NVMETEST:

Also see:  DUMPx DUMPDAta DUMPREgs SHOWx SHOWREgs

(Go To TOC)

[ SHOWPC ]


SHOWPC

Display the previous command information.

(Go To TOC)

[ SHOWQC ]


SHOWQC

Display the queued command list.

Also see:  QCADD QCCLEAR QCGO QCGOT QCMAX SHOWQC

(Go To TOC)

[ SHOWQUeues ]


SHOWQUeues

Display the queues currently defined.

Also see:  CCQ CSQ DCQ DSQ CQUEues

(Go To TOC)

[ SHOWREgs ]


SHOWREgs

There are three physical memory areas used by NVMETEST:

Also see:  DUMPx DUMPDAta DUMPREgs SHOWx SHOWDAta

(Go To TOC)

[ SHOWSQ ]


SHOWSQ qid
SHOWSQ qid en
SHOWSQ qid 64

Without an entry number (en) a summary of the entire queue is displayed.

If the entry number (en) is 0 to 63 that single entry is displayed.

If the entry number (en) is 64 the entire queue is displayed.

Example:


   r 1 1 0
   showsq cs_qid sq_en

Also see:  sq_* DUMPCQ DUMPSQ SHOWCQ USECMB

(Go To TOC)

[ SHOWSUb ]


SHOWSUb

[FULL]

Displays the currently defined subroutine names and the type of each.

(Go To TOC)

[ SHUTDOWN ]


SHUTDOWN n

[DIO]

Write the value n (0 to 3) to the SHN field of the NVME CC register. No other bits of the NVME CC register are changed.

If n is 1 or 2, the command waits for SHST field of the NVME CSTS register to have the value 2.

The time out for a SHUTDOWN command is 4 times the current DTO setting.

NOTE: A RESET is required following a 'SHUTDOWN 1' or 'SHUTDOWN 2' command.

Also see:  DTO

(Go To TOC)

[ SLIST ]


SLIST fileName

[FULL]

Run the specified script list. See the SCRIPT LISTS above.

Also see:  SCRipt SLOPTION

(Go To TOC)

[ SLOPTION ]


SLOPTION [LOOP n] [TIME n]

[FULL]

Use this command before an SLIST commands to set the Script List repeat options.

SLOPTION with no parameters displays the current settings.

SLOPTION LOOP sets the maximum loop count. A value of zero means the loop count is not checked.

SLOPTION TIME sets the maximum run time in minutes. A value of zero means the max time is not checked.

Also see:  SCRipt SLIST slist_*

(Go To TOC)

[ SSS ]


SSS option

[FULL]

This command controls the single step script function. Use this command to debug script files. When this command is active and NVMETEST is executing a script file, NVMETEST will pause before executing the selected script command.

SSS with no parameter displays the current setting.

option is any combination of the following characters:


   A - pause before all commands.
   B - pause before IF commands.
   C - pause before CAll commands.
   I - pause before I/O commands.
   N - turn off SSS pause.
   R - pause before REPeat commands.
   W - pause before WHILE commands.

When NVMETEST pauses before a command:

Examples:


   SSS NA      // equivalent to SSS A
   SSS BCIRW   // equivalent to SSS A
   SSS AIWNB   // equivalent to SSS B
   SSS IN      // equivalent to SSS N

(Go To TOC)

[ STOREx ]

[FULL]

See STORE and STOREBUF below.

Also see:  STORE STOREBUF

(Go To TOC)

[ STORE ]


STORE [ BUFfer | sectorOffset ] byteOffset n ...

Store bytes of data into the current buffer.

n is one or more byte values to be stored into the buffer.

If BUFfer is specified then byteOffset is the offset into the current buffer ignoring sector boundaries.

If BUFfer is not specified then sectorOffet is 0 to one less than the maximum number of sectors that fit into the buffer and byteOffset is 0 to one less than the size of a sector.

Also see:  BLKSize FETCHBUF FILLx ID STOREBUF

(Go To TOC)

[ STOREBUF ]


STOREBUF [ BUFfer | sectorOffset ] byteOffset size value
STOREBUF [ BUFfer | sectorOffset ] byteOffset size value BE
STOREBUF [ BUFfer | sectorOffset ] byteOffset size value LE

[FULL]

Store a 1 to 8 byte value into the current buffer.

value is the value to store.

size is the number of bytes to place into the buffer. size is 1 t0 8.

Use BE if the buffer data is in Big Endian format. Use LE if the buffer data is in Little Endian format. BE is the default.

If BUFfer is specified then byteOffset is the offset into the current buffer ignoring sector boundaries.

If BUFfer is not specified then sectorOffet is 0 to one less than the maximum number of sectors that fit into the buffer and byteOffset is 0 to one less than the size of a sector.


   big = 0x1f2e.3d4c.5b6a.7988
   storebuf 0 0 2 big
   // buffer now contains 79 88 (in hex)
   storebuf 0 0 4 big
   // buffer now contains 5b 6a 79 88 (in hex)
   storebuf 0 0 8 big
   // buffer now contains 1f 2e 3d 4c 5b 6a 79 88 (in hex)
   storebuf 0 0 2 big LE
   // buffer now contains 88 79 (in hex)
   storebuf 0 0 4 big LE
   // buffer now contains 88 79 6a 5b (in hex)
   storebuf 0 0 8 big LE
   // buffer now contains 88 79 6a 5b 4c 3d 2e 1f (in hex)

Also see:  BLKSize FETCHBUF FILLx ID STORE

(Go To TOC)

[ STRx ]

[FULL]

See the STRAVC, STRAVF, STRAVS, STRCMP, STRCOMV, STRFBUF, STRFIND, STRLEN, STRLWR, STRPARSE, STRSBUF, STRSET, STRSTATUS, STRSUB and STRUPR commands below.

These commands perform variable operations on the built-in str_s* string variables or on the string array variables.

The STRx comands set the built-in variable str_result with the result of the command execution.

String array example:


   // store string str_s0 into string[12]
   strset str_s0 the quick brown fox
   stravs 12 str_s0
   // copy string[12] to string[22]
   stravc 12 22
   // fetch string[22] into str_s1
   stravf str_s1 22

(Go To TOC)

[ STRAVC ]


STRAVC fromAvNdx toAvNdx

[FULL]

Copy string array variable fromAvNdx to string array variable toAvNdx.

str_result is set to the length of the string.

Also see:  STRAVF STRAVS str_result

(Go To TOC)

[ STRAVF ]


STRAVF strVar avNdx

[FULL]

Fetch the string in string array variable avNdx into the string variable strVar. See example above.

str_result is set to the length of the string.

Also see:  STRAVC STRAVS str_result

(Go To TOC)

[ STRAVS ]


STRAVS avNdx strVar

[FULL]

Store the string in string variable strVar into the string array variable avNdx. See example above.

str_result is set to the length of the string.

Also see:  STRAVC STRAVS str_result

(Go To TOC)

[ STRCMP ]


STRCMP strVar1 strVar2

[FULL]

Compare two strings.

str_result is set to -1, 0 or 1.

Also see:  str_result

Examples:


   strset str_s5 model123
   strset str_s7 m123
   strcmp str_s5 str_s7
      // sets str_result=1
   strcmp str_s7 str_s5
      // sets str_result=-1
   strcmp str_s7 str_s7
      // sets str_result=0

(Go To TOC)

[ STRCONV ]


STRCONV varName strVar

[FULL]

See the description of "user defined variables" above.

The numeric character string is converted to a binary value and stored in the user defined variable. The numeric string follows the same rules as numeric parameters to NVMETEST commands.

varName will be defined if it does not exists.

str_result is set to 0 if the conversion was successful. str_resultis set to 1 if the conversion failed. varName is not defined or changed if the conversion fails.

Also see:  str_result

Examples:


   strset str_s6 123
   strset str_s7 -456
   strset str_s8 0x23
   strset str_s9 1M2N
   strconv x str_s6
      // sets str_result=0, sets x=123
   strconv x str_s7
      // sets str_result=0, sets x=-456
   strconv x str_s8
      // sets str_result=0, sets x=35
   strconv x str_s9
      // sets str_result=1, x is not changed

(Go To TOC)

[ STRFBUF ]


STRFBUF strVar [ BUFfer | sectorOffset ] byteOffset

[FULL]

Fetch a string from buffer 0.

STRFBUF does not use BUFOff.

Bytes are fetched buffer 0 until a NULL character (0x00) is fetched or 96 characters have been fetched.

If BUFfer is specified then byteOffset is the offset into the buffer 0 ignoring sector boundaries.

If BUFfer is not specified then sectorOffet is 0 to one less than the maximum number of sectors that fit into buffer 0 and byteOffset is 0 to one less than the size of a sector.

Also see:  str_result STRSBUF

(Go To TOC)

[ STRFIND ]


STRFIND strVar1 strVar2

[FULL]

str_result is set to the offset of string2 within string1. If string2 is not found str_result is set to -1.

Also see:  str_result

Examples:


   strset str_s3 this is a string
   strset str_s5 this
   strfind str_s3 str_s5
      // set str_result=0
   strset str_s5 a
   strfind str_s3 str_s5
      // set str_result=8
   strset str_s5 xyz
   strfind str_s3 str_s5
      // set str_result=-1

(Go To TOC)

[ STRLEN ]


STRLEN strVar

[FULL]

str_result is set to the length of the string.

Also see:  str_result

Examples:


   strset str_s3 this is a string
   strlen str_s3
      // sets str_result=16

(Go To TOC)

[ STRLWR ]


STRLWR strVar

[FULL]

Converts the string to lower case.

Examples:


   strset str_s3 AaBc12Xx
   strupr str_s3
      // sets str_result=8,
      // str_s3 is now "aabc12xx"

Also see:  str_result STRUPR

(Go To TOC)

[ STRPARSE ]


STRPARSE strVar1 strVar2 strVar3

[FULL]

Using the first character in string3 as a delimiter, copy characters from string2 to string1 up to but not including the delimiter character.

str_result is set to the length of string1.

Also see:  str_result

Examples:


   strset str_s4 1.02/A7-Q1
   strset str_s5 .
   strset str_s6 -
   strfind str_0 str_s5 str_s5
      // sets str_s0 to "1", str_result=1
   strfind str_0 str_s5 str_s6
      // sets str_s0 to "1.02/A7", str_result=7

Also see:  str_result STRSUB

(Go To TOC)

[ STRSBUF ]


STRSBUF [ BUFfer | sectorOffset ] byteOffset strVar

[FULL]

Store a string into buffer 0.

STRSBUF does not use BUFOff.

If BUFfer is specified then byteOffset is the offset into buffer 0 ignoring sector boundaries.

If BUFfer is not specified then sectorOffet is 0 to one less than the maximum number of sectors that fit into buffer 0 and byteOffset is 0 to one less than the size of a sector.

Also see:  str_result STRFBUF

(Go To TOC)

[ STRSET ]


STRSET strVar [text]

[FULL]

Set the string to a new value.

See the section TEXT STRING FORMATING for the rules on how 'text' strings are used with this command.

str_result is set to the length of the string.

Also see:  str_result ASKSTR Sn=string

Examples:


   set count = 3
   strset str_s5 too low
   strset str_s0 value{count1} is {str_s5}.
      // str_s0 is set to "value3 is too low.",
      // str_result=18
   strset str_s0 str_s5
      // str_s0 is set to "str_s5",
      // str_result=6
   strset str_s0 {str_s5}
      // str_s0 is set to "too low",
      // str_result=7

(Go To TOC)

[ STRSTATUS ]


STRSTATUS n

[FULL]

Convert the NMVE comamand status (0-0xFFFF) to a message string. Note that 0xFFFF indicates a command time out error. All other status values are a 15 bit number (0-0x7FFF). The result of this command is stored in the string variable str_status.

Also see:  cq_* str_s*

(Go To TOC)

[ STRSUB ]


STRSUB strVar1 strVar2 offset length

[FULL]

Sets string1 to the substring from string2.

offset is the starting offset of the substring (0 to 96), length is the length of the substring (0 to 96).

str_result is set to the length of string1 (may be less than length).

Also see:  str_result STRPARSE

Examples:


   strset str_s0 1234567890abcdefgh
   strsub str_s1 str_s0 0 3
      // sets str_s1 to "123", sets str_result=3
   strsub str_s1 str_s0 3 5
      // sets str_s1 to "45678", sets str_result=5
   strsub str_s1 str_s0 9 15
      // sets str_s1 to "0abcdefgh", sets str_result=9
   strsub str_s1 str_s0 9 0
      // sets str_s1 to "", sets str_result=0

(Go To TOC)

[ STRUPR ]


STRUPR strVar

[FULL]

Converts the string to upper case.

Also see:  str_result STRLWR

Examples:


   strset str_s3 AaBc12Xx
   strupr str_s3
      // sets str_result=8,
      // str_s3 is now "AABC12XX"

(Go To TOC)

[ TAG ]


TAG

Display the current setting of sector tagging or turn sector tagging on and off.

Also see:  COMPx DUMPCT DUMPTAg FILLx METAdata RUNID start_time run_id


TAG FULL
TAG ON
TAG NONE
TAG OFf
TAG PARTIAL
TAG (n)

The sector tag is the Run ID, LBA of the sector and the last write command's command number, sector count and starting LBA. This tag data is at offsets in each sector in the buffer:


   244-247 - one's complement of the Run ID
   248-251 - Run ID
   252-255 - LBA bits 31:0
   256-259 - LBA bits 63:32
   260-263 - one's complement of last write command number
   264-267 - last write command number
   268-271 - one's complement of last write sector count
   272-275 - last write sector count
   276-279 - last write starting LBA bits 31:0
   280-283 - last write starting LBA bits 63:32

FULL/ON uses all of the fields (offsets 244 to 283). PARTIAL uses only the Run ID and LBA fields (offsets 244 to 259).

When sector tagging is NONE/OFf the FILLx commands do not insert these fields into each sector's data in the buffer. When sector tagging is FULL/ON/PARTIAL the FILLx commands will insert the indicated fields into each sector's data in the buffer.

When sector tagging is NONE/OFf the COMPx commands do not expect these fields in each sector's data in the buffer. When sector tagging is FULL/ON/PARTIAL the COMPx commands will verify the indicated fields in each sector's data in the buffer. Note that COMPx with PARTIAL does NOT verify offsets 260 to 283 in each sector's data.

For 'TAG (n)', n=0 is the same as NONE/OFf, n=1 is the same as FULL/ON, and n=2 is the same as PARTIAL.

Warning: See "Variables that look like keywords" above.

Also see:  COMPx DUMPCT DUMPTAg FILLx METAdata RUNID start_time run_id

(Go To TOC)

[ UDVAR ]


UDVAR CLEANUP
UDVAR DELETEALL
UDVAR SAVE

[FULL]

The UDVAR command can be used to cleanup the list of current user defined variables. This is most useful in script files, especially in script files executed via the SLIST command. See the EDVT test scripts CONFIG0.DSF and BEFORE0.DSF as an example of UDVAR usage.

DELETEALL deletes ALL user defined variables. Use with care! The internal user defined variable index is set to 0.

CLEANUP deletes all user defined variables defined since either: a) the program started, or b) the most recent 'UDVAR SAVE' command. The internal user defined variable index is set back to most recent saved value.

SAVE saves the current user defined variable index. This index is internal to the program. It is incremented each time a user defined variable is defined.

The DUMPVAr command will show the current UDVAR saved location in the list of user defined variables.

Also see:  DUMPVAr

(Go To TOC)

[ USECMB ]


USECMB
USECMB NONE
USECMB (n)
USECMB ALL [TEST]
USECMB [SQ] [CQ] [PRP] [SGL] [BUFfer]

[FULL]

Relocate submission queues, completion queues, PRP lists, SGL lists and/or buffers 0 and 63 the Controller Memory Buffer (CMB). The CMB area can be addressed by PCI BAR 0, 2, 3, 4 or 5.

Usage is displayed if no parameter is specified.

USECMB NONE

NONE disables CMB use. NONE is the default when NVMETEST starts. The NVME controller will be disabled, the requested data areas are relocated from the CMB to the data area, the controller will be reset and the cmb_flag variable is set. If the reset after the relocation fails, NVMETEST will immediately terminate.

USECMB (n)

Valid values of n are the same as the values found in the cmb_flag variable.

USECMB x...

For SQ, CQ, PRP, SGL and/or BUFfer one or more of these parameters many be used to enable CMB use.

BUFfer relocates 2 to 64 buffers to CMB starting with buffers 0 and 1. Buffers 0 and 1 are the minimum number that can be moved. Buffers 2 to 127 are moved based on the size of the CMB. The possible number of buffers that can be moved is 2, 4, 8, 16, 32 or 64.

ALL is the same as specifing 'SQ CQ PRP SGL BUF'.

The CMB memory area is tested before the first use. TEST specifies to test the entire CMB memory as specified by the CMBLOC/CMBSZ registers otherwise only the section of the CMB that will actually be used is tested.

The CMB must meet the following NVMETEST requirements:

If these requirements are met then the NVME controller will be disabled, the requested areas are relocated to the CMB, and the controller will be reset and the cmb_flag variable is set. If the reset after the relocation fails, NVMETEST will immediately terminate.

Switching to or from CMB does not affect the BUFOff or BUFPtr settings.

Switching to/from CMB

If CMB is enabled then 'USECMB NONE' must be executed before a new 'USECMB x...' command can be executed.

Also see:  cmb_flag DUMPCMb DUMPDAta RESET SHOWDAta SHOWCMb

(Go To TOC)

[ VUCMDExec ]


VUCMDExec qid dataXferSize // qid = 0, cmd 00H to BFH
VUCMDExec qid // qid = 0, cmd C0H to FFH
VUCMDExec qid dataXferSize // qid != 0, cmd 00H to 7FH
VUCMDExec qid // qid != 0, cmd 80H to FFH

[ADMIN] [DIO] [FULL]

Execute a vendor unique command on queue qid.

The command to be executed is defined by the VUCMDParam command. VUCMDExec/VUCMDParam do not use the CMDParam values.

This command uses buffers 0 and 1.

dataXferSize is the number of data bytes to be transferred using the DPTR (PRP1/PRP2) data buffer pointer (this data is in buffer 0). dataXferSize must be a multiple of 4 (0, 4, 8, ...).

Note that command codes that have bits 1 and 0 set to 0 are non-data commands and are not allowed to transfer data.

dataXferSize usage is:

There are four types of VU commands based on queue number and command code...

Admin Queue (qid=0) VU Command Codes 00H to BFH

The command should follow the setup requirements for a regular Admin command. There is no default for dataXferSize - dataXferSize must be specified and must be a multiple of 4 (0, 4, 8, ...).

Admin Queue (qid=0) VU Command Codes C0H to FFH

The command should follow the setup requirements of a VU Admin command where DW10 is the data transfer size in DWORDs and DW11 is the metadata transfer size in DWORDs. The dataXferSize parameter is ignored.

If there is metadata and the metadata is transferred into the data buffer (DPTR/PRP1/PRP2/buffer0) then DW10 must be equal to the data size plus metadata size and DW11 should be zero. DW10 is a DWORD value.

If there is metadata and the metadata is transferred into the metadata buffer (MPTR/buffer1) then DW10 must be equal to the data size and DW11 must be equal to the metadata size. DW10 and DW11 are DWORD values. DW11 can not be greater than the Memory Page Size (MPS).

I/O Queue (qid!=0) VU Command Codes 00H to 7FH

The command should follow the setup requirements for a regular I/O command. There is no default for dataXferSize - dataXferSize must be specified and must be a multiple of 4 (0, 4, 8, ...).

I/O Queue (qid!=0) VU Command Codes 80H to FFh

The command should follow the setup requirements of a VU I/O command where DW10 is the data transfer size is DWORDs and DW11 is the metadata transfer size in DWORDs. The dataXferSize parameter is ignored.

If there is metadata and the metadata is transferred into the data buffer (DPTR/PRP1/PRP2/buffer0) then DW10 must be equal to the data size plus metadata size and DW11 should be zero.

If there is metadata and the metadata is transferred into the metadata buffer (MPTR/buffer1) then DW10 must be equal to the data size and DW11 must be equal to the metadata size. DW11 can not be greater than The Memory Page Size (MPS).

Also see:  buf_size io_* VUCMDParam

(Go To TOC)

[ VUCMDParam ]


VUCMDParam
VUCMDParam DW0 n
VUCMDParam DW1 n
VUCMDParam DW2 n
VUCMDParam DW3 n
VUCMDParam DW10 n
VUCMDParam DW11 n
VUCMDParam DW12 n
VUCMDParam DW13 n
VUCMDParam DW14 n
VUCMDParam DW15 n
VUCMDParam ZERO

[FULL]

Specify values for a NVME VU command's dword 0, 1, 2, 3 and 10-15.

VUCMDExec/VUCMDParam do not use the CMDParam values.

The VUCMDParam values remain in effect until either a 'VUCMDParam ZERO' command or until a RESET command.

Note: The cmdId value in dword 0 is controlled by the NVMETEST program. Command dwords 4 to 9 are controlled by the NVMETEST program (for example, NVMETEST must control I/O buffer addresses in order to prevent system corruption).

Also see:  CMDParam VUCMDExec

(Go To TOC)

[ W ]


W qid sc lba

[DIO] [REP]

Execute an NVME write command.

qid is the queue id to use.

sc is the sector count to use.

lba is the starting LBA.

Buffer number 0 is used for data and buffer 1 is used for metadata (if any).

See the LBAIncr and REPeat commands for methods this command can be repeated with random or other LBA values.

Note: See the CMDParam command for the values placed into command dwords 13, 14 and 15 of read/write commands.

Also see:  CMDParam EXPEcterror io_* LBAIncr QCx R RWX REPeat

(Go To TOC)

[ WHILE ]


WHILE n

[FULL] [SCRIPT]

Define the beginning of a WHILE loop. Commands within the WHILE loop are executed while the value of n is not zero.

Example:


   set x = 0
   while ( x < 100 )
      if ( x % 4 == 0 )
         say x is a multiple of 4
      endif
      if ( x == y )
         break;
      endif
      if ( x == z )
         continue
      endif
      say x is {x}
      set x = x + 1
   endwhile

Also see:  BReak COntinue ENDWHile

(Go To TOC)

[ WINdow ]


WINdow ASK varName

[FULL] [SCRIPT]

See the description of "user defined variables" above.

Asks the user to select a item (row) in the window area.

varName is the name of a user defined variable that will be set to a value between 0 and 9 indicating the item (row) that was selected by the user.

The user is allowed to highlight rows on the screen that have a '[' character as the left most character. To make the selection the enter key must be pressed. The value assigned to varName is based on the single character to the right of the '[' character:


   [n or [N sets varName to 0.
   [y or [Y sets varName to 1.
   [0       sets varName to 0.
   [1       sets varName to 1.
   [2 to [9 sets varName to 2 to 9.

Also see:  ASK ASKYN ASKSTR SAYx SET WINdow


WINdow CLEAR

[FULL] [SCRIPT]

Clears the window area of the screen and sets the row number to 1. The next SAY command will place data at this window location.

Also see:  SAY SAYFail SAYx WINdow


WINdow CLOSE

[FULL] [SCRIPT]

This command closes window mode. The normal output screen is restored when closed.

Also see:  SAY SAYFail SAYx WINdow


WINdow COLOR fb

[FULL] [SCRIPT]

Set the foreground and background colors for the window area of the screen. These colors are used until the next COLOR command.

fb is two characters. The first character sets the foreground color. The second character sets the background color. These characters are:


   k or K - black
   b or B - blue
   g or G - green
   c or C - cyan
   r or R - red
   m or M - magenta
   y or Y - yellow
   w or W - white

The lower case character results in a low intensity color and a upper case character results in a high intensity color.

The next SAY, SAYFail or SAYPass command will use these colors.

Also see:  SAY SAYFail SAYx WINdow


WINdow GOTO n

[FULL] [SCRIPT]

Sets the row number to row n of the window. The next SAY, SAYFail or SAYPass command will place data at this window location.

Also see:  SAY SAYFail SAYx WINdow


WINdow OPEN

[FULL] [SCRIPT]

This command opens the window area of the screen. The window area is all the lines on the screen except the bottom two lines (the status and input lines). The window area will remain open until the end of the current script file execution or until a WINdow CLOSE command.

While in window mode only the ASK, ASKYN, SAY, SAYFail and SAYPass commands send messages to the window area of the screen. The ASK and ASKYN commands use the bottom two lines of of the screen.

The windows area is cleared when opened and the row number is set to 1.

The normal output screen is restored when closed.

Also see:  SAY SAYFail SAYx WINdow

(Go To TOC)

[ WLog ]


WLog text

[FULL]

This command writes a message into the log file.

See the section TEXT STRING FORMATING for the rules on how 'text' strings are used with this command.

Also see:  SAYx WRITEText

Examples:


   WLog Display this message now!

      Will log the message "Display this message now!".

   WLog max_lba is {max_lba} 0x{*max_lba} {*max_lba}H

      Will log the message "max_lba is 4098 0x1002 1002H"
      (assuming max_lba is 4098).

(Go To TOC)

[ WRITEFile ]


WRITEFile numBytes fileName [Append]

[FULL]

The first numBytes of buffer 0 are written or appended to the file fileName.

WRITEFile does not use BUFOff.

The WRITE command sets the built-in variable num_bytes to the actual number of bytes written to the file.

See the section FILE NAMES above for the description of how file names can be specified.

Also see:  READFile

Examples:


   WRITE 10 NEWLOG.TXT

      Write 10 bytes from the buffer into file NEWLOG.TXT.

   SET X = 583
   WRITE (x) (x+3)

      Write 583 bytes from the buffer into file 586.BIN.

   SET Y = 8943
   SET Z = 26
   WRITE 24 D{Y}.{*Z}H

      Write 24 bytes from the buffer into file D8943.1AH.

(Go To TOC)

[ WRITEText ]


WRITEText fileName text

[FULL]

The text is written to specified file.

See the section FILE NAMES above for the description of how file names can be specified.

See the section TEXT STRING FORMATING for the rules on how 'text' strings are used with this command.

Also see:  SAYx WLog

Examples:


   WRITEText NEWLOG.TXT Display this message now!

      Will write the message "Display this message now!"
      to the file NEWLOG.TXT.

   SET X = 583
   WRITEText (x+3) max_lba is {max_lba} 0x{*max_lba} {*max_lba}H

      Will write the message
      "max_lba is 4098 0x1002 1002H"
      (assuming max_lba is 4098) to file 586.TXT.

   SET Y = 8943
   SET Z = 26
   WRITEText D{Y}.{*Z}H We have an error here.

      Will write the message "We have an error here."
      to file D8943.1AH.

(Go To TOC)

[ WUNC ]


WUNC qid sc lba

[DIO] [FULL] [REP]

Execute an NVME Write Uncorrectable command.

qid is the queue id to use.

sc is the sector count to use.

lba is the starting LBA.

Buffer number 0 is used for data and buffer 1 is used for metadata (if any).

See the LBAIncr and REPeat commands for methods this command can be repeated with random or other LBA values.

Note: See the CMDParam command for the values placed into command dwords 13, 14 and 15 of read/write commands.

Also see:  CMDParam EXPEcterror io_* LBAIncr QCx R RWX REPeat

(Go To TOC)

[ WZERO ]


WZERO qid sc lba

[DIO] [FULL] [REP]

Execute an NVME Write Zero command.

qid is the queue id to use.

sc is the sector count to use.

lba is the starting LBA.

Buffer number 0 is used for data and buffer 1 is used for metadata (if any).

See the LBAIncr and REPeat commands for methods this command can be repeated with random or other LBA values.

Note: See the CMDParam command for the values placed into command dwords 13, 14 and 15 of read/write commands.

Also see:  CMDParam EXPEcterror io_* LBAIncr QCx R RWX REPeat

(Go To TOC)

[ (EqSign) ]


(EqSign)

This command is a single equal sign character (=) entered at the keyboard.

Repeat the most recent NVMETEST command. This command is not allowed in a script file.

Also see:  (EqSignEqSign)

(Go To TOC)

[ (EqSignEqSign) ]


(EqSignEqSign)

This command is two equal sign characters (==) entered at the keyboard.

Clear the trace buffers and repeat the most recent NVMETTEST command. This command is not allowed in a script file.

(Go To TOC)

[ (Slash) ]


(Slash)

This command is a single slash character (/) entered at the keyboard.

Repeat the last device I/O command. See the commands marked with the symbol [DIO]. This command is not allowed in a script file.

Also see:  (SlashSlash)

(Go To TOC)

[ (SlashSlash) ]


(SlashSlash)

This command is two slash characters (==) entered at the keyboard.

Clear trace buffers and repea the last device I/O command. See the commands marked with the symbol [DIO]. This command is not allowed in a script file.

(Go To TOC)

[ #INCLUDE ]


#INCLUDE fileName

This directive tells the script file compiler to stop processing the current script file and begin processing the script file fileName. At the end of the included file processing returns to the file containing the #INCLUDE directive immediately following the #INCLUDE directive. This is the same #include found in some programming languages.

fileName is used as-is.

Use this to include a script file of common subroutines that are used by other script files.

Any files appended to the root script file are considered to be part of the root script file for line numbering and error messages.

See the SCRipt command and the Script File User Guide (SCRIPTS.HTM).

Also see:  SCRipt #NEXT

(Go To TOC)

[ #NEXT ]


#NEXT fileName

This directive tells the script file compiler to stop processing the current script file and begin processing the script file fileName. This is similar to but not the same as #INCLUDE found in some programming languages in that the compiler does not return to processing of the file that contains the #NEXT directive.

#NEXT can be used with #INCLUDE.

fileName is used as-is.

Use this to include a script file of common subroutines that are used by other script files.

Any files appended to the root script file are considered to be part of the root script file for line numbering and error messages.

See the SCRipt command and the Script File User Guide (SCRIPTS.HTM).

Also see:  SCRipt #INCLUDE

(Go To TOC)

USING THE QCx COMMANDS

The QCx commands (QCADD, QCCLEAR, QCGO, QCGOT and QCMAX) can be used to perform a sequential write or read of an LBA range. But remember that the actual execution order of the commands inside the drive is most likely to be very random.

QCx Command Example

The following example shows how to sequentially write an LBA range using 32 sector write (W) commands using four I/O queues:


   qcclear
   qcadd w 32 32 1000000 3000000 0 0   // on I/O queue 1
   qcadd w 32 32 1000032 3000000 0 1   // on I/O queue 2
   qcadd w 32 32 1000064 3000000 0 2   // on I/O queue 3
   qcadd w 32 32 1000096 3000000 0 3   // on I/O queue 4
   qcgo 99999999 128
   if io_result
      // inspect sq_* and cq_* for failing command's data
   endif

The resulting writes are:

Beyond the first write at LBA 1000000 by queue 1, the order these commands are sent to the drive is unknown and may appear to be random, and, the order the drive completes the commands in may also appear to be random.

QCx Command Error Handling

When a QCGO/QCGOT command ends the sq_* and cq_* variables contain information about the last command submitted and the last command to complete. This information is not normally very useful because the sq_* data and the cq_* will probably represent different commands and most likely is not the command information for the first failing command.

If there is an error reported by a QCGO/QCGOT command, submission of new commands on all queues is halted and the QCGO/QCGOT command waits for all outstanding commands on all queues to complete. Frequently some or all of the outstanding commands will also fail with an error. Usually the first error is the most important error to investigate. When a QCGO/QCGOT command ends due to an error, the sq_* and cq_* variables will describe the failing command. The sq_* and cq_* variables will be all zero if the QCGO/QCGOT command ends without an error.

Also see:  cq_* qc_* QCx sq_*

(Go To TOC)

USING LBAIncr and REPeat COMMANDS

The LBAIncr and REPeat commands are the most powerful commands in NVMETEST. These commands can be used to execute commands over the entire media or on only part of the media. Below are some examples of using these commands. These examples would also work with RWX and W commands. Assume that max_lba has been set by a successful ID command before any of these examples are executed. Also note that these examples use only I/O queue 1 but could use any of the currently defined I/O queues (1 to 7).

1) Read every sector reading 10 sectors at a time.


   lbaincr 10
   repeat 999999999 r 1 10 0

2) Read 10 sectors at random locations. Execute 15000 reads.


   lbaincr random
   repeat 15000 r 1 10 0

3) Read every sector from LBA 11000 to 19999 8 sectors at a time.


   lbaincr 8 20000
   repeat 99000 r 1 8 11000

4) Read 8 sectors at random locations within LBA 11000 to 19999. Execute 15000 reads.


   lbaincr random 20000
   repeat 15000 r 1 8 11000

5) Read 100 sectors, skip the next 50 sectors and repeat.


   lbaincr 150
   repeat 999999 r 1 100 0

6) Read all the sectors in decending LBA order.


   lbaincr -1
   repeat 99999999 r 1 1 0

7) Do overlapping reads in decending LBA order.


   lbaincr -10
   repeat 99999999 r 1 20 0

8) Using TL can make a script file smaller.


   lbaincr tl
   repeat 5000 r 1 1 0
   repeat 5000 r 1 2 0
   repeat 5000 r 1 3 0

   is equivalent to

   lbaincr 1
   repeat 5000 r 1 1 0
   lbaincr 2
   repeat 5000 r 1 2 0
   lbaincr 3
   repeat 5000 r 1 3 0

(Go To TOC)

Editor

Also see:  EDITx EDITKB EDITsf

The NVMETEST editor is also available as a stand alone program named AEDIT. See the AEDIT User Guide (AEDIT.HTM).

The NVMETEST editor may be used to edit any plain text file.

The editor inforces the basic file formatting rules required in NVMETEST script files. Those rules are:

Editor Screen Format

The top line of the screen shows the following information:

The bottom line of the screen shows the following information and/or error messages:

Editor Keys and Functions

AEDIT is a full screen editor. Characters typed are normally placed into the current line at the current cursor position. Only the keys 20H (space) to 7EH (~) are allowed.

The following keys invoke editor functions:

ALT-A

A a line following the current cursor position.

ALT-C

Copy the marked lines after the current cursor position. Use ALT-L to mark lines.

ALT-D

Delete the line at the current cursor position.

ALT-E

Move the cursor to the end of the file.

ALT-F

Enter a search string and find the next occurance of the string.

ALT-G

Find the next occurance of the search string.

ALT-H

Display ALT key help.

ALT-K

Delete the marked block of lines. Use ALT-L to mark lines.

ALT-L

Mark lines. Move the cursor to the first line to be marked and press ALT-L. If marking more than one line, move the cursor up or down to the last line to be marked and press ALT-L again. Then use the ALT-C, ALT-K or ALT-M keys to copy, delete or move the marked block of line(s). Also see ALT-U.

ALT-M

Move the marked block of lines after the current cursor position.

ALT-T

Move the cursor to the top of the file.

ALT-U

Unmark any marked lines.

ALT-X

Exit/quit the editor. Causes the ALT-X menu to be displayed. See below.

CTRL-L

Shift marked line(s) left.

CTRL-R

Shift marked line(s) right.

BS

Move the cursor left and delete a character.

CTRL-END

Delete all characters to the right of the cursor position.

DEL

Delete the character at the cursor position.

DOWN

Move the cursor down one line.

END

Move the cursor to the end of the current line.

ENTER

Move the cursor to the left side of the next line.

ESC

Undo any changes to the current line since the cursor arrived on the line.

HOME

Move the cursor to the left side of the current line.

INS

Toggle replace/inser mode.

LEFT

Move the cursor left.

PGDN

Move the cursor down 1/2 of the screen size.

PGUP

Move the cursor up 1/2 of the screen size.

RIGHT

Move the cursor right.

UP

Move the cursor up one line.

Editor ALT-X Menu

The ALT-X key (or running out of free memory) will cause the ALT-X menu to be displayed. Use this menu to:

(Go To TOC)

HISTORY

Versions not shown were test or skipped versions.

Version 2A4d

Version 2A4b and 2A4c

Version 2A4b

Version 2A4 and 2A4a

Version 2A3b

Version 2A3a

Version 2A2f

Version 2A2e

Version 2A2d

Version 2A2c

Version 2A2b

Version 2A2a

Version 2A2

(Go To TOC)

QUESTIONS OR PROBLEMS?

Technical support can be found at:


   http://www.ata-atapi.com/techsupp.html

-end-