--- /dev/null
+ARECA FIRMWARE SPEC
+===================
+
+Usage of IOP331 adapter
+=======================
+
+(All In/Out is in IOP331's view)
+
+1. Message 0
+------------
+
+- InitThread message and return code
+
+2. Doorbell is used for RS-232 emulation
+----------------------------------------
+
+inDoorBell
+    bit0
+       data in ready
+       zDRIVER DATA WRITE OK)
+    bit1
+       data out has been read
+       (DRIVER DATA READ OK)
+
+outDooeBell:
+    bit0
+       data out ready
+       (IOP331 DATA WRITE OK)
+    bit1
+       data in has been read
+       (IOP331 DATA READ OK)
+
+3. Index Memory Usage
+---------------------
+
+============   ==========================================
+offset 0xf00   for RS232 out (request buffer)
+offset 0xe00   for RS232 in  (scratch buffer)
+offset 0xa00   for inbound message code message_rwbuffer
+              (driver send to IOP331)
+offset 0xa00   for outbound message code message_rwbuffer
+              (IOP331 send to driver)
+============   ==========================================
+
+4. RS-232 emulation
+-------------------
+
+Currently 128 byte buffer is used:
+
+============   =====================
+1st uint32_t   Data length (1--124)
+Byte 4--127    Max 124 bytes of data
+============   =====================
+
+5. PostQ
+--------
+
+All SCSI Command must be sent through postQ:
+
+    (inbound queue port)
+       Request frame must be 32 bytes aligned:
+
+           #bit27--bit31
+               flag for post ccb
+           #bit0--bit26
+               real address (bit27--bit31) of post arcmsr_cdb
+
+               =====   ===================
+               bit31   ==  ===============
+                       0   256 bytes frame
+                       1   512 bytes frame
+                       ==  ===============
+               bit30   ==  ==============
+                       0   normal request
+                       1   BIOS request
+                       ==  ==============
+               bit29   reserved
+               bit28   reserved
+               bit27   reserved
+               =====   ===================
+
+    (outbount queue port)
+       Request reply:
+
+           #bit27--bit31
+                   flag for reply
+           #bit0--bit26
+                   real address (bit27--bit31) of reply arcmsr_cdb
+
+                   =====   =======================================================
+                   bit31   must be 0 (for this type of reply)
+                   bit30   reserved for BIOS handshake
+                   bit29   reserved
+                   bit28   ==  ===================================================
+                           0   no error, ignore AdapStatus/DevStatus/SenseData
+                           1   Error, error code in AdapStatus/DevStatus/SenseData
+                           ==  ===================================================
+                   bit27   reserved
+                   =====   =======================================================
+
+6. BIOS request
+---------------
+
+All BIOS request is the same with request from PostQ
+
+Except:
+
+Request frame is sent from configuration space:
+
+       ============   ==========================
+       offset: 0x78   Request Frame (bit30 == 1)
+       offset: 0x18   writeonly to generate
+                      IRQ to IOP331
+       ============   ==========================
+
+Completion of request::
+
+       (bit30 == 0, bit28==err flag)
+
+7. Definition of SGL entry (structure)
+--------------------------------------
+
+8. Message1 Out - Diag Status Code (????)
+-----------------------------------------
+
+9. Message0 message code
+------------------------
+
+======  =================================================================
+0x00    NOP
+0x01    Get Config
+       ->offset 0xa00 :for outbound message code message_rwbuffer
+       (IOP331 send to driver)
+
+       ===================== ==========================================
+       Signature             0x87974060(4)
+       Request len           0x00000200(4)
+       numbers of queue      0x00000100(4)
+       SDRAM Size            0x00000100(4)-->256 MB
+       IDE Channels          0x00000008(4)
+       vendor                40 bytes char
+       model                 8 bytes char
+       FirmVer               16 bytes char
+       Device Map            16 bytes char
+       FirmwareVersion       DWORD
+
+                             - Added for checking of
+                               new firmware capability
+       ===================== ==========================================
+0x02    Set Config
+       ->offset 0xa00 :for inbound message code message_rwbuffer
+       (driver send to IOP331)
+
+       ========================= ==================
+       Signature                 0x87974063(4)
+       UPPER32 of Request Frame  (4)-->Driver Only
+       ========================= ==================
+0x03    Reset (Abort all queued Command)
+0x04    Stop Background Activity
+0x05    Flush Cache
+0x06    Start Background Activity
+       (re-start if background is halted)
+0x07    Check If Host Command Pending
+       (Novell May Need This Function)
+0x08    Set controller time
+       ->offset 0xa00   for inbound message code message_rwbuffer
+       (driver to IOP331)
+
+       ======   ==================
+       byte 0   0xaa <-- signature
+       byte 1   0x55 <-- signature
+       byte 2   year (04)
+       byte 3   month (1..12)
+       byte 4   date (1..31)
+       byte 5   hour (0..23)
+       byte 6   minute (0..59)
+       byte 7   second (0..59)
+       ======   ==================
+======  =================================================================
+
+
+RS-232 Interface for Areca Raid Controller
+==========================================
+
+      The low level command interface is exclusive with VT100 terminal
+
+1. Sequence of command execution
+--------------------------------
+
+       (A) Header
+               3 bytes sequence (0x5E, 0x01, 0x61)
+
+       (B) Command block
+               variable length of data including length,
+               command code, data and checksum byte
+
+       (C) Return data
+               variable length of data
+
+2. Command block
+----------------
+
+       (A) 1st byte
+               command block length (low byte)
+
+       (B) 2nd byte
+               command block length (high byte)
+
+               .. Note:: command block length shouldn't > 2040 bytes,
+                         length excludes these two bytes
+
+       (C) 3rd byte
+               command code
+
+       (D) 4th and following bytes
+               variable length data bytes
+
+           depends on command code
+
+       (E) last byte
+           checksum byte (sum of 1st byte until last data byte)
+
+3. Command code and associated data
+-----------------------------------
+
+The following are command code defined in raid controller Command
+code 0x10--0x1? are used for system level management,
+no password checking is needed and should be implemented in separate
+well controlled utility and not for end user access.
+Command code 0x20--0x?? always check the password,
+password must be entered to enable these command::
+
+       enum
+       {
+               GUI_SET_SERIAL=0x10,
+               GUI_SET_VENDOR,
+               GUI_SET_MODEL,
+               GUI_IDENTIFY,
+               GUI_CHECK_PASSWORD,
+               GUI_LOGOUT,
+               GUI_HTTP,
+               GUI_SET_ETHERNET_ADDR,
+               GUI_SET_LOGO,
+               GUI_POLL_EVENT,
+               GUI_GET_EVENT,
+               GUI_GET_HW_MONITOR,
+               //    GUI_QUICK_CREATE=0x20, (function removed)
+               GUI_GET_INFO_R=0x20,
+               GUI_GET_INFO_V,
+               GUI_GET_INFO_P,
+               GUI_GET_INFO_S,
+               GUI_CLEAR_EVENT,
+               GUI_MUTE_BEEPER=0x30,
+               GUI_BEEPER_SETTING,
+               GUI_SET_PASSWORD,
+               GUI_HOST_INTERFACE_MODE,
+               GUI_REBUILD_PRIORITY,
+               GUI_MAX_ATA_MODE,
+               GUI_RESET_CONTROLLER,
+               GUI_COM_PORT_SETTING,
+               GUI_NO_OPERATION,
+               GUI_DHCP_IP,
+               GUI_CREATE_PASS_THROUGH=0x40,
+               GUI_MODIFY_PASS_THROUGH,
+               GUI_DELETE_PASS_THROUGH,
+               GUI_IDENTIFY_DEVICE,
+               GUI_CREATE_RAIDSET=0x50,
+               GUI_DELETE_RAIDSET,
+               GUI_EXPAND_RAIDSET,
+               GUI_ACTIVATE_RAIDSET,
+               GUI_CREATE_HOT_SPARE,
+               GUI_DELETE_HOT_SPARE,
+               GUI_CREATE_VOLUME=0x60,
+               GUI_MODIFY_VOLUME,
+               GUI_DELETE_VOLUME,
+               GUI_START_CHECK_VOLUME,
+               GUI_STOP_CHECK_VOLUME
+       };
+
+Command description
+^^^^^^^^^^^^^^^^^^^
+
+GUI_SET_SERIAL
+       Set the controller serial#
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x10
+       byte 3            password length (should be 0x0f)
+       byte 4-0x13       should be "ArEcATecHnoLogY"
+       byte 0x14--0x23   Serial number string (must be 16 bytes)
+       ================  =============================================
+
+GUI_SET_VENDOR
+       Set vendor string for the controller
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x11
+       byte 3            password length (should be 0x08)
+       byte 4-0x13       should be "ArEcAvAr"
+       byte 0x14--0x3B   vendor string (must be 40 bytes)
+       ================  =============================================
+
+GUI_SET_MODEL
+       Set the model name of the controller
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x12
+       byte 3            password length (should be 0x08)
+       byte 4-0x13       should be "ArEcAvAr"
+       byte 0x14--0x1B   model string (must be 8 bytes)
+       ================  =============================================
+
+GUI_IDENTIFY
+       Identify device
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x13
+                           return "Areca RAID Subsystem "
+       ================  =============================================
+
+GUI_CHECK_PASSWORD
+       Verify password
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x14
+       byte 3            password length
+       byte 4-0x??       user password to be checked
+       ================  =============================================
+
+GUI_LOGOUT
+       Logout GUI (force password checking on next command)
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x15
+       ================  =============================================
+
+GUI_HTTP
+       HTTP interface (reserved for Http proxy service)(0x16)
+
+GUI_SET_ETHERNET_ADDR
+       Set the ethernet MAC address
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x17
+       byte 3            password length (should be 0x08)
+       byte 4-0x13       should be "ArEcAvAr"
+       byte 0x14--0x19   Ethernet MAC address (must be 6 bytes)
+       ================  =============================================
+
+GUI_SET_LOGO
+       Set logo in HTTP
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x18
+       byte 3            Page# (0/1/2/3) (0xff --> clear OEM logo)
+       byte 4/5/6/7      0x55/0xaa/0xa5/0x5a
+       byte 8            TITLE.JPG data (each page must be 2000 bytes)
+
+                         .. Note:: page0 1st 2 byte must be
+                                   actual length of the JPG file
+       ================  =============================================
+
+GUI_POLL_EVENT
+       Poll If Event Log Changed
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x19
+       ================  =============================================
+
+GUI_GET_EVENT
+       Read Event
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x1a
+       byte 3            Event Page (0:1st page/1/2/3:last page)
+       ================  =============================================
+
+GUI_GET_HW_MONITOR
+       Get HW monitor data
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x1b
+       byte 3            # of FANs(example 2)
+       byte 4            # of Voltage sensor(example 3)
+       byte 5            # of temperature sensor(example 2)
+       byte 6            # of power
+       byte 7/8          Fan#0 (RPM)
+       byte 9/10         Fan#1
+       byte 11/12        Voltage#0 original value in ``*1000``
+       byte 13/14        Voltage#0 value
+       byte 15/16        Voltage#1 org
+       byte 17/18        Voltage#1
+       byte 19/20        Voltage#2 org
+       byte 21/22        Voltage#2
+       byte 23           Temp#0
+       byte 24           Temp#1
+       byte 25           Power indicator (bit0   power#0,
+                         bit1   power#1)
+       byte 26           UPS indicator
+       ================  =============================================
+
+GUI_QUICK_CREATE
+       Quick create raid/volume set
+
+       ================  ==============================================
+       byte 0,1          length
+       byte 2            command code 0x20
+       byte 3/4/5/6      raw capacity
+       byte 7            raid level
+       byte 8            stripe size
+       byte 9            spare
+       byte 10/11/12/13  device mask (the devices to create raid/volume)
+       ================  ==============================================
+
+    This function is removed, application like
+    to implement quick create function
+
+    need to use GUI_CREATE_RAIDSET and GUI_CREATE_VOLUMESET function.
+
+GUI_GET_INFO_R
+       Get Raid Set Information
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x20
+       byte 3            raidset#
+       ================  =============================================
+
+       ::
+
+           typedef struct sGUI_RAIDSET
+           {
+                   BYTE grsRaidSetName[16];
+                   DWORD grsCapacity;
+                   DWORD grsCapacityX;
+                   DWORD grsFailMask;
+                   BYTE grsDevArray[32];
+                   BYTE grsMemberDevices;
+                   BYTE grsNewMemberDevices;
+                   BYTE grsRaidState;
+                   BYTE grsVolumes;
+                   BYTE grsVolumeList[16];
+                   BYTE grsRes1;
+                   BYTE grsRes2;
+                   BYTE grsRes3;
+                   BYTE grsFreeSegments;
+                   DWORD grsRawStripes[8];
+                   DWORD grsRes4;
+                   DWORD grsRes5; //     Total to 128 bytes
+                   DWORD grsRes6; //     Total to 128 bytes
+           } sGUI_RAIDSET, *pGUI_RAIDSET;
+
+GUI_GET_INFO_V
+       Get Volume Set Information
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x21
+       byte 3            volumeset#
+       ================  =============================================
+
+       ::
+
+           typedef struct sGUI_VOLUMESET
+           {
+                   BYTE gvsVolumeName[16]; //     16
+                   DWORD gvsCapacity;
+                   DWORD gvsCapacityX;
+                   DWORD gvsFailMask;
+                   DWORD gvsStripeSize;
+                   DWORD gvsNewFailMask;
+                   DWORD gvsNewStripeSize;
+                   DWORD gvsVolumeStatus;
+                   DWORD gvsProgress; //     32
+                   sSCSI_ATTR gvsScsi;
+                   BYTE gvsMemberDisks;
+                   BYTE gvsRaidLevel; //     8
+                   BYTE gvsNewMemberDisks;
+                   BYTE gvsNewRaidLevel;
+                   BYTE gvsRaidSetNumber;
+                   BYTE gvsRes0; //     4
+                   BYTE gvsRes1[4]; //     64 bytes
+           } sGUI_VOLUMESET, *pGUI_VOLUMESET;
+
+GUI_GET_INFO_P
+       Get Physical Drive Information
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x22
+       byte 3            drive # (from 0 to max-channels - 1)
+       ================  =============================================
+
+       ::
+
+           typedef struct sGUI_PHY_DRV
+           {
+                   BYTE gpdModelName[40];
+                   BYTE gpdSerialNumber[20];
+                   BYTE gpdFirmRev[8];
+                   DWORD gpdCapacity;
+                   DWORD gpdCapacityX; //     Reserved for expansion
+                   BYTE gpdDeviceState;
+                   BYTE gpdPioMode;
+                   BYTE gpdCurrentUdmaMode;
+                   BYTE gpdUdmaMode;
+                   BYTE gpdDriveSelect;
+                   BYTE gpdRaidNumber; //     0xff if not belongs to a raid set
+                   sSCSI_ATTR gpdScsi;
+                   BYTE gpdReserved[40]; //     Total to 128 bytes
+           } sGUI_PHY_DRV, *pGUI_PHY_DRV;
+
+GUI_GET_INFO_S
+       Get System Information
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x23
+       ================  =============================================
+
+       ::
+
+           typedef struct sCOM_ATTR
+           {
+                   BYTE comBaudRate;
+                   BYTE comDataBits;
+                   BYTE comStopBits;
+                   BYTE comParity;
+                   BYTE comFlowControl;
+           } sCOM_ATTR, *pCOM_ATTR;
+           typedef struct sSYSTEM_INFO
+           {
+                   BYTE gsiVendorName[40];
+                   BYTE gsiSerialNumber[16];
+                   BYTE gsiFirmVersion[16];
+                   BYTE gsiBootVersion[16];
+                   BYTE gsiMbVersion[16];
+                   BYTE gsiModelName[8];
+                   BYTE gsiLocalIp[4];
+                   BYTE gsiCurrentIp[4];
+                   DWORD gsiTimeTick;
+                   DWORD gsiCpuSpeed;
+                   DWORD gsiICache;
+                   DWORD gsiDCache;
+                   DWORD gsiScache;
+                   DWORD gsiMemorySize;
+                   DWORD gsiMemorySpeed;
+                   DWORD gsiEvents;
+                   BYTE gsiMacAddress[6];
+                   BYTE gsiDhcp;
+                   BYTE gsiBeeper;
+                   BYTE gsiChannelUsage;
+                   BYTE gsiMaxAtaMode;
+                   BYTE gsiSdramEcc; //     1:if ECC enabled
+                   BYTE gsiRebuildPriority;
+                   sCOM_ATTR gsiComA; //     5 bytes
+                   sCOM_ATTR gsiComB; //     5 bytes
+                   BYTE gsiIdeChannels;
+                   BYTE gsiScsiHostChannels;
+                   BYTE gsiIdeHostChannels;
+                   BYTE gsiMaxVolumeSet;
+                   BYTE gsiMaxRaidSet;
+                   BYTE gsiEtherPort; //     1:if ether net port supported
+                   BYTE gsiRaid6Engine; //     1:Raid6 engine supported
+                   BYTE gsiRes[75];
+           } sSYSTEM_INFO, *pSYSTEM_INFO;
+
+GUI_CLEAR_EVENT
+       Clear System Event
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x24
+       ================  =============================================
+
+GUI_MUTE_BEEPER
+       Mute current beeper
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x30
+       ================  =============================================
+GUI_BEEPER_SETTING
+       Disable beeper
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x31
+       byte 3            0->disable, 1->enable
+       ================  =============================================
+
+GUI_SET_PASSWORD
+       Change password
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x32
+       byte 3            pass word length ( must <= 15 )
+       byte 4            password (must be alpha-numerical)
+       ================  =============================================
+
+GUI_HOST_INTERFACE_MODE
+       Set host interface mode
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x33
+       byte 3            0->Independent, 1->cluster
+       ================  =============================================
+
+GUI_REBUILD_PRIORITY
+       Set rebuild priority
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x34
+       byte 3            0/1/2/3 (low->high)
+       ================  =============================================
+
+GUI_MAX_ATA_MODE
+       Set maximum ATA mode to be used
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x35
+       byte 3            0/1/2/3 (133/100/66/33)
+       ================  =============================================
+
+GUI_RESET_CONTROLLER
+       Reset Controller
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x36
+                         * Response with VT100 screen (discard it)
+       ================  =============================================
+
+GUI_COM_PORT_SETTING
+       COM port setting
+
+       ================  =================================================
+       byte 0,1          length
+       byte 2            command code 0x37
+       byte 3            0->COMA (term port),
+                         1->COMB (debug port)
+       byte 4            0/1/2/3/4/5/6/7
+                         (1200/2400/4800/9600/19200/38400/57600/115200)
+       byte 5            data bit
+                         (0:7 bit, 1:8 bit   must be 8 bit)
+       byte 6            stop bit (0:1, 1:2 stop bits)
+       byte 7            parity (0:none, 1:off, 2:even)
+       byte 8            flow control
+                         (0:none, 1:xon/xoff, 2:hardware => must use none)
+       ================  =================================================
+
+GUI_NO_OPERATION
+       No operation
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x38
+       ================  =============================================
+
+GUI_DHCP_IP
+       Set DHCP option and local IP address
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x39
+       byte 3            0:dhcp disabled, 1:dhcp enabled
+       byte 4/5/6/7      IP address
+       ================  =============================================
+
+GUI_CREATE_PASS_THROUGH
+       Create pass through disk
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x40
+       byte 3            device #
+       byte 4            scsi channel (0/1)
+       byte 5            scsi id (0-->15)
+       byte 6            scsi lun (0-->7)
+       byte 7            tagged queue (1   enabled)
+       byte 8            cache mode (1   enabled)
+       byte 9            max speed (0/1/2/3/4,
+                         async/20/40/80/160 for scsi)
+                         (0/1/2/3/4, 33/66/100/133/150 for ide  )
+       ================  =============================================
+
+GUI_MODIFY_PASS_THROUGH
+       Modify pass through disk
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x41
+       byte 3            device #
+       byte 4            scsi channel (0/1)
+       byte 5            scsi id (0-->15)
+       byte 6            scsi lun (0-->7)
+       byte 7            tagged queue (1   enabled)
+       byte 8            cache mode (1   enabled)
+       byte 9            max speed (0/1/2/3/4,
+                         async/20/40/80/160 for scsi)
+                         (0/1/2/3/4, 33/66/100/133/150 for ide  )
+       ================  =============================================
+
+GUI_DELETE_PASS_THROUGH
+       Delete pass through disk
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x42
+       byte 3            device# to be deleted
+       ================  =============================================
+GUI_IDENTIFY_DEVICE
+       Identify Device
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x43
+       byte 3            Flash Method
+                         (0:flash selected, 1:flash not selected)
+       byte 4/5/6/7      IDE device mask to be flashed
+                         .. Note:: no response data available
+       ================  =============================================
+
+GUI_CREATE_RAIDSET
+       Create Raid Set
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x50
+       byte 3/4/5/6      device mask
+       byte 7-22         raidset name (if byte 7 == 0:use default)
+       ================  =============================================
+
+GUI_DELETE_RAIDSET
+       Delete Raid Set
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x51
+       byte 3            raidset#
+       ================  =============================================
+
+GUI_EXPAND_RAIDSET
+       Expand Raid Set
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x52
+       byte 3            raidset#
+       byte 4/5/6/7      device mask for expansion
+       byte 8/9/10       (8:0 no change, 1 change, 0xff:terminate,
+                         9:new raid level,
+                         10:new stripe size
+                         0/1/2/3/4/5->4/8/16/32/64/128K )
+       byte 11/12/13     repeat for each volume in the raidset
+       ================  =============================================
+
+GUI_ACTIVATE_RAIDSET
+       Activate incomplete raid set
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x53
+       byte 3            raidset#
+       ================  =============================================
+
+GUI_CREATE_HOT_SPARE
+       Create hot spare disk
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x54
+       byte 3/4/5/6      device mask for hot spare creation
+       ================  =============================================
+
+GUI_DELETE_HOT_SPARE
+       Delete hot spare disk
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x55
+       byte 3/4/5/6      device mask for hot spare deletion
+       ================  =============================================
+
+GUI_CREATE_VOLUME
+       Create volume set
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x60
+       byte 3            raidset#
+       byte 4-19         volume set name
+                         (if byte4 == 0, use default)
+       byte 20-27        volume capacity (blocks)
+       byte 28           raid level
+       byte 29           stripe size
+                         (0/1/2/3/4/5->4/8/16/32/64/128K)
+       byte 30           channel
+       byte 31           ID
+       byte 32           LUN
+       byte 33           1 enable tag
+       byte 34           1 enable cache
+       byte 35           speed
+                         (0/1/2/3/4->async/20/40/80/160 for scsi)
+                         (0/1/2/3/4->33/66/100/133/150 for IDE  )
+       byte 36           1 to select quick init
+       ================  =============================================
+
+GUI_MODIFY_VOLUME
+       Modify volume Set
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x61
+       byte 3            volumeset#
+       byte 4-19         new volume set name
+                         (if byte4 == 0, not change)
+       byte 20-27        new volume capacity (reserved)
+       byte 28           new raid level
+       byte 29           new stripe size
+                         (0/1/2/3/4/5->4/8/16/32/64/128K)
+       byte 30           new channel
+       byte 31           new ID
+       byte 32           new LUN
+       byte 33           1 enable tag
+       byte 34           1 enable cache
+       byte 35           speed
+                         (0/1/2/3/4->async/20/40/80/160 for scsi)
+                         (0/1/2/3/4->33/66/100/133/150 for IDE  )
+       ================  =============================================
+
+GUI_DELETE_VOLUME
+       Delete volume set
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x62
+       byte 3            volumeset#
+       ================  =============================================
+
+GUI_START_CHECK_VOLUME
+       Start volume consistency check
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x63
+       byte 3            volumeset#
+       ================  =============================================
+
+GUI_STOP_CHECK_VOLUME
+       Stop volume consistency check
+
+       ================  =============================================
+       byte 0,1          length
+       byte 2            command code 0x64
+       ================  =============================================
+
+4. Returned data
+----------------
+
+(A) Header
+    3 bytes sequence (0x5E, 0x01, 0x61)
+(B) Length
+    2 bytes
+    (low byte 1st, excludes length and checksum byte)
+(C)
+    status or data:
+
+       1) If length == 1 ==> 1 byte status code::
+
+               #define GUI_OK                    0x41
+               #define GUI_RAIDSET_NOT_NORMAL    0x42
+               #define GUI_VOLUMESET_NOT_NORMAL  0x43
+               #define GUI_NO_RAIDSET            0x44
+               #define GUI_NO_VOLUMESET          0x45
+               #define GUI_NO_PHYSICAL_DRIVE     0x46
+               #define GUI_PARAMETER_ERROR       0x47
+               #define GUI_UNSUPPORTED_COMMAND   0x48
+               #define GUI_DISK_CONFIG_CHANGED   0x49
+               #define GUI_INVALID_PASSWORD      0x4a
+               #define GUI_NO_DISK_SPACE         0x4b
+               #define GUI_CHECKSUM_ERROR        0x4c
+               #define GUI_PASSWORD_REQUIRED     0x4d
+
+       2) If length > 1:
+
+               data block returned from controller
+               and the contents depends on the command code
+
+(E) Checksum
+    checksum of length and status or data byte
+
 
+++ /dev/null
-*******************************************************************************
-**                            ARECA FIRMWARE SPEC
-*******************************************************************************
-**     Usage of IOP331 adapter
-**     (All In/Out is in IOP331's view)
-**     1. Message 0 --> InitThread message and return code
-**     2. Doorbell is used for RS-232 emulation
-**             inDoorBell :    bit0 -- data in ready
-**                     (DRIVER DATA WRITE OK)
-**                             bit1 -- data out has been read
-**                     (DRIVER DATA READ OK)
-**             outDooeBell:    bit0 -- data out ready
-**                     (IOP331 DATA WRITE OK)
-**                             bit1 -- data in has been read
-**                     (IOP331 DATA READ OK)
-**     3. Index Memory Usage
-**     offset 0xf00 : for RS232 out (request buffer)
-**     offset 0xe00 : for RS232 in  (scratch buffer)
-**     offset 0xa00 : for inbound message code message_rwbuffer
-**                     (driver send to IOP331)
-**     offset 0xa00 : for outbound message code message_rwbuffer
-**                     (IOP331 send to driver)
-**     4. RS-232 emulation
-**             Currently 128 byte buffer is used
-**                     1st uint32_t : Data length (1--124)
-**                     Byte 4--127  : Max 124 bytes of data
-**     5. PostQ
-**     All SCSI Command must be sent through postQ:
-**     (inbound queue port)    Request frame must be 32 bytes aligned
-**     #bit27--bit31 => flag for post ccb
-**     #bit0--bit26  => real address (bit27--bit31) of post arcmsr_cdb
-**             bit31 :
-**                     0 : 256 bytes frame
-**                     1 : 512 bytes frame
-**             bit30 :
-**                     0 : normal request
-**                     1 : BIOS request
-**             bit29 : reserved
-**             bit28 : reserved
-**             bit27 : reserved
-**  ---------------------------------------------------------------------------
-**     (outbount queue port)   Request reply
-**     #bit27--bit31
-**             => flag for reply
-**     #bit0--bit26
-**             => real address (bit27--bit31) of reply arcmsr_cdb
-**                     bit31 : must be 0 (for this type of reply)
-**                     bit30 : reserved for BIOS handshake
-**                     bit29 : reserved
-**                     bit28 :
-**                     0 : no error, ignore AdapStatus/DevStatus/SenseData
-**                     1 : Error, error code in AdapStatus/DevStatus/SenseData
-**                     bit27 : reserved
-**     6. BIOS request
-**             All BIOS request is the same with request from PostQ
-**             Except :
-**                     Request frame is sent from configuration space
-**             offset: 0x78 : Request Frame (bit30 == 1)
-**             offset: 0x18 : writeonly to generate
-**                                     IRQ to IOP331
-**             Completion of request:
-**                     (bit30 == 0, bit28==err flag)
-**     7. Definition of SGL entry (structure)
-**     8. Message1 Out - Diag Status Code (????)
-**     9. Message0 message code :
-**             0x00 : NOP
-**             0x01 : Get Config
-**             ->offset 0xa00 :for outbound message code message_rwbuffer
-**             (IOP331 send to driver)
-**             Signature             0x87974060(4)
-**             Request len           0x00000200(4)
-**             numbers of queue      0x00000100(4)
-**             SDRAM Size            0x00000100(4)-->256 MB
-**             IDE Channels          0x00000008(4)
-**             vendor                40 bytes char
-**             model                  8 bytes char
-**             FirmVer               16 bytes char
-**             Device Map            16 bytes char
-**             FirmwareVersion DWORD <== Added for checking of
-**                                             new firmware capability
-**             0x02 : Set Config
-**             ->offset 0xa00 :for inbound message code message_rwbuffer
-**             (driver send to IOP331)
-**             Signature             0x87974063(4)
-**             UPPER32 of Request Frame  (4)-->Driver Only
-**             0x03 : Reset (Abort all queued Command)
-**             0x04 : Stop Background Activity
-**             0x05 : Flush Cache
-**             0x06 : Start Background Activity
-**                     (re-start if background is halted)
-**             0x07 : Check If Host Command Pending
-**                     (Novell May Need This Function)
-**             0x08 : Set controller time
-**             ->offset 0xa00 : for inbound message code message_rwbuffer
-**             (driver to IOP331)
-**             byte 0 : 0xaa <-- signature
-**             byte 1 : 0x55 <-- signature
-**             byte 2 : year (04)
-**             byte 3 : month (1..12)
-**             byte 4 : date (1..31)
-**             byte 5 : hour (0..23)
-**             byte 6 : minute (0..59)
-**             byte 7 : second (0..59)
-*******************************************************************************
-*******************************************************************************
-**             RS-232 Interface for Areca Raid Controller
-**      The low level command interface is exclusive with VT100 terminal
-**  --------------------------------------------------------------------
-**      1. Sequence of command execution
-**  --------------------------------------------------------------------
-**     (A) Header : 3 bytes sequence (0x5E, 0x01, 0x61)
-**     (B) Command block : variable length of data including length,
-**             command code, data and checksum byte
-**     (C) Return data : variable length of data
-**  --------------------------------------------------------------------
-**    2. Command block
-**  --------------------------------------------------------------------
-**     (A) 1st byte : command block length (low byte)
-**     (B) 2nd byte : command block length (high byte)
-**                note ..command block length shouldn't > 2040 bytes,
-**             length excludes these two bytes
-**     (C) 3rd byte : command code
-**     (D) 4th and following bytes : variable length data bytes
-**             depends on command code
-**     (E) last byte : checksum byte (sum of 1st byte until last data byte)
-**  --------------------------------------------------------------------
-**    3. Command code and associated data
-**  --------------------------------------------------------------------
-**     The following are command code defined in raid controller Command
-**     code 0x10--0x1? are used for system level management,
-**     no password checking is needed and should be implemented in separate
-**     well controlled utility and not for end user access.
-**     Command code 0x20--0x?? always check the password,
-**     password must be entered to enable these command.
-**     enum
-**     {
-**             GUI_SET_SERIAL=0x10,
-**             GUI_SET_VENDOR,
-**             GUI_SET_MODEL,
-**             GUI_IDENTIFY,
-**             GUI_CHECK_PASSWORD,
-**             GUI_LOGOUT,
-**             GUI_HTTP,
-**             GUI_SET_ETHERNET_ADDR,
-**             GUI_SET_LOGO,
-**             GUI_POLL_EVENT,
-**             GUI_GET_EVENT,
-**             GUI_GET_HW_MONITOR,
-**             //    GUI_QUICK_CREATE=0x20, (function removed)
-**             GUI_GET_INFO_R=0x20,
-**             GUI_GET_INFO_V,
-**             GUI_GET_INFO_P,
-**             GUI_GET_INFO_S,
-**             GUI_CLEAR_EVENT,
-**             GUI_MUTE_BEEPER=0x30,
-**             GUI_BEEPER_SETTING,
-**             GUI_SET_PASSWORD,
-**             GUI_HOST_INTERFACE_MODE,
-**             GUI_REBUILD_PRIORITY,
-**             GUI_MAX_ATA_MODE,
-**             GUI_RESET_CONTROLLER,
-**             GUI_COM_PORT_SETTING,
-**             GUI_NO_OPERATION,
-**             GUI_DHCP_IP,
-**             GUI_CREATE_PASS_THROUGH=0x40,
-**             GUI_MODIFY_PASS_THROUGH,
-**             GUI_DELETE_PASS_THROUGH,
-**             GUI_IDENTIFY_DEVICE,
-**             GUI_CREATE_RAIDSET=0x50,
-**             GUI_DELETE_RAIDSET,
-**             GUI_EXPAND_RAIDSET,
-**             GUI_ACTIVATE_RAIDSET,
-**             GUI_CREATE_HOT_SPARE,
-**             GUI_DELETE_HOT_SPARE,
-**             GUI_CREATE_VOLUME=0x60,
-**             GUI_MODIFY_VOLUME,
-**             GUI_DELETE_VOLUME,
-**             GUI_START_CHECK_VOLUME,
-**             GUI_STOP_CHECK_VOLUME
-**     };
-**    Command description :
-**     GUI_SET_SERIAL : Set the controller serial#
-**             byte 0,1        : length
-**             byte 2          : command code 0x10
-**             byte 3          : password length (should be 0x0f)
-**             byte 4-0x13     : should be "ArEcATecHnoLogY"
-**             byte 0x14--0x23 : Serial number string (must be 16 bytes)
-**      GUI_SET_VENDOR : Set vendor string for the controller
-**             byte 0,1        : length
-**             byte 2          : command code 0x11
-**             byte 3          : password length (should be 0x08)
-**             byte 4-0x13     : should be "ArEcAvAr"
-**             byte 0x14--0x3B : vendor string (must be 40 bytes)
-**      GUI_SET_MODEL : Set the model name of the controller
-**             byte 0,1        : length
-**             byte 2          : command code 0x12
-**             byte 3          : password length (should be 0x08)
-**             byte 4-0x13     : should be "ArEcAvAr"
-**             byte 0x14--0x1B : model string (must be 8 bytes)
-**      GUI_IDENTIFY : Identify device
-**             byte 0,1        : length
-**             byte 2          : command code 0x13
-**                               return "Areca RAID Subsystem "
-**      GUI_CHECK_PASSWORD : Verify password
-**             byte 0,1        : length
-**             byte 2          : command code 0x14
-**             byte 3          : password length
-**             byte 4-0x??     : user password to be checked
-**      GUI_LOGOUT : Logout GUI (force password checking on next command)
-**             byte 0,1        : length
-**             byte 2          : command code 0x15
-**      GUI_HTTP : HTTP interface (reserved for Http proxy service)(0x16)
-**
-**      GUI_SET_ETHERNET_ADDR : Set the ethernet MAC address
-**             byte 0,1        : length
-**             byte 2          : command code 0x17
-**             byte 3          : password length (should be 0x08)
-**             byte 4-0x13     : should be "ArEcAvAr"
-**             byte 0x14--0x19 : Ethernet MAC address (must be 6 bytes)
-**      GUI_SET_LOGO : Set logo in HTTP
-**             byte 0,1        : length
-**             byte 2          : command code 0x18
-**             byte 3          : Page# (0/1/2/3) (0xff --> clear OEM logo)
-**             byte 4/5/6/7    : 0x55/0xaa/0xa5/0x5a
-**             byte 8          : TITLE.JPG data (each page must be 2000 bytes)
-**                               note page0 1st 2 byte must be
-**                                     actual length of the JPG file
-**      GUI_POLL_EVENT : Poll If Event Log Changed
-**             byte 0,1        : length
-**             byte 2          : command code 0x19
-**      GUI_GET_EVENT : Read Event
-**             byte 0,1        : length
-**             byte 2          : command code 0x1a
-**             byte 3          : Event Page (0:1st page/1/2/3:last page)
-**      GUI_GET_HW_MONITOR : Get HW monitor data
-**             byte 0,1        : length
-**             byte 2                  : command code 0x1b
-**             byte 3                  : # of FANs(example 2)
-**             byte 4                  : # of Voltage sensor(example 3)
-**             byte 5                  : # of temperature sensor(example 2)
-**             byte 6                  : # of power
-**             byte 7/8        : Fan#0 (RPM)
-**             byte 9/10       : Fan#1
-**             byte 11/12              : Voltage#0 original value in *1000
-**             byte 13/14              : Voltage#0 value
-**             byte 15/16              : Voltage#1 org
-**             byte 17/18              : Voltage#1
-**             byte 19/20              : Voltage#2 org
-**             byte 21/22              : Voltage#2
-**             byte 23                 : Temp#0
-**             byte 24                 : Temp#1
-**             byte 25                 : Power indicator (bit0 : power#0,
-**                                              bit1 : power#1)
-**             byte 26                 : UPS indicator
-**      GUI_QUICK_CREATE : Quick create raid/volume set
-**         byte 0,1        : length
-**         byte 2          : command code 0x20
-**         byte 3/4/5/6    : raw capacity
-**         byte 7                      : raid level
-**         byte 8                      : stripe size
-**         byte 9                      : spare
-**         byte 10/11/12/13: device mask (the devices to create raid/volume)
-**             This function is removed, application like
-**             to implement quick create function
-**     need to use GUI_CREATE_RAIDSET and GUI_CREATE_VOLUMESET function.
-**      GUI_GET_INFO_R : Get Raid Set Information
-**             byte 0,1        : length
-**             byte 2          : command code 0x20
-**             byte 3          : raidset#
-**     typedef struct sGUI_RAIDSET
-**     {
-**             BYTE grsRaidSetName[16];
-**             DWORD grsCapacity;
-**             DWORD grsCapacityX;
-**             DWORD grsFailMask;
-**             BYTE grsDevArray[32];
-**             BYTE grsMemberDevices;
-**             BYTE grsNewMemberDevices;
-**             BYTE grsRaidState;
-**             BYTE grsVolumes;
-**             BYTE grsVolumeList[16];
-**             BYTE grsRes1;
-**             BYTE grsRes2;
-**             BYTE grsRes3;
-**             BYTE grsFreeSegments;
-**             DWORD grsRawStripes[8];
-**             DWORD grsRes4;
-**             DWORD grsRes5; //     Total to 128 bytes
-**             DWORD grsRes6; //     Total to 128 bytes
-**     } sGUI_RAIDSET, *pGUI_RAIDSET;
-**      GUI_GET_INFO_V : Get Volume Set Information
-**             byte 0,1        : length
-**             byte 2          : command code 0x21
-**             byte 3          : volumeset#
-**     typedef struct sGUI_VOLUMESET
-**     {
-**             BYTE gvsVolumeName[16]; //     16
-**             DWORD gvsCapacity;
-**             DWORD gvsCapacityX;
-**             DWORD gvsFailMask;
-**             DWORD gvsStripeSize;
-**             DWORD gvsNewFailMask;
-**             DWORD gvsNewStripeSize;
-**             DWORD gvsVolumeStatus;
-**             DWORD gvsProgress; //     32
-**             sSCSI_ATTR gvsScsi;
-**             BYTE gvsMemberDisks;
-**             BYTE gvsRaidLevel; //     8
-**             BYTE gvsNewMemberDisks;
-**             BYTE gvsNewRaidLevel;
-**             BYTE gvsRaidSetNumber;
-**             BYTE gvsRes0; //     4
-**             BYTE gvsRes1[4]; //     64 bytes
-**     } sGUI_VOLUMESET, *pGUI_VOLUMESET;
-**      GUI_GET_INFO_P : Get Physical Drive Information
-**             byte 0,1        : length
-**             byte 2          : command code 0x22
-**             byte 3          : drive # (from 0 to max-channels - 1)
-**     typedef struct sGUI_PHY_DRV
-**     {
-**             BYTE gpdModelName[40];
-**             BYTE gpdSerialNumber[20];
-**             BYTE gpdFirmRev[8];
-**             DWORD gpdCapacity;
-**             DWORD gpdCapacityX; //     Reserved for expansion
-**             BYTE gpdDeviceState;
-**             BYTE gpdPioMode;
-**             BYTE gpdCurrentUdmaMode;
-**             BYTE gpdUdmaMode;
-**             BYTE gpdDriveSelect;
-**             BYTE gpdRaidNumber; //     0xff if not belongs to a raid set
-**             sSCSI_ATTR gpdScsi;
-**             BYTE gpdReserved[40]; //     Total to 128 bytes
-**     } sGUI_PHY_DRV, *pGUI_PHY_DRV;
-**     GUI_GET_INFO_S : Get System Information
-**             byte 0,1        : length
-**             byte 2          : command code 0x23
-**     typedef struct sCOM_ATTR
-**     {
-**             BYTE comBaudRate;
-**             BYTE comDataBits;
-**             BYTE comStopBits;
-**             BYTE comParity;
-**             BYTE comFlowControl;
-**     } sCOM_ATTR, *pCOM_ATTR;
-**     typedef struct sSYSTEM_INFO
-**     {
-**             BYTE gsiVendorName[40];
-**             BYTE gsiSerialNumber[16];
-**             BYTE gsiFirmVersion[16];
-**             BYTE gsiBootVersion[16];
-**             BYTE gsiMbVersion[16];
-**             BYTE gsiModelName[8];
-**             BYTE gsiLocalIp[4];
-**             BYTE gsiCurrentIp[4];
-**             DWORD gsiTimeTick;
-**             DWORD gsiCpuSpeed;
-**             DWORD gsiICache;
-**             DWORD gsiDCache;
-**             DWORD gsiScache;
-**             DWORD gsiMemorySize;
-**             DWORD gsiMemorySpeed;
-**             DWORD gsiEvents;
-**             BYTE gsiMacAddress[6];
-**             BYTE gsiDhcp;
-**             BYTE gsiBeeper;
-**             BYTE gsiChannelUsage;
-**             BYTE gsiMaxAtaMode;
-**             BYTE gsiSdramEcc; //     1:if ECC enabled
-**             BYTE gsiRebuildPriority;
-**             sCOM_ATTR gsiComA; //     5 bytes
-**             sCOM_ATTR gsiComB; //     5 bytes
-**             BYTE gsiIdeChannels;
-**             BYTE gsiScsiHostChannels;
-**             BYTE gsiIdeHostChannels;
-**             BYTE gsiMaxVolumeSet;
-**             BYTE gsiMaxRaidSet;
-**             BYTE gsiEtherPort; //     1:if ether net port supported
-**             BYTE gsiRaid6Engine; //     1:Raid6 engine supported
-**             BYTE gsiRes[75];
-**     } sSYSTEM_INFO, *pSYSTEM_INFO;
-**     GUI_CLEAR_EVENT : Clear System Event
-**             byte 0,1        : length
-**             byte 2          : command code 0x24
-**      GUI_MUTE_BEEPER : Mute current beeper
-**             byte 0,1        : length
-**             byte 2          : command code 0x30
-**      GUI_BEEPER_SETTING : Disable beeper
-**             byte 0,1        : length
-**             byte 2          : command code 0x31
-**             byte 3          : 0->disable, 1->enable
-**      GUI_SET_PASSWORD : Change password
-**             byte 0,1        : length
-**             byte 2                  : command code 0x32
-**             byte 3                  : pass word length ( must <= 15 )
-**             byte 4                  : password (must be alpha-numerical)
-**     GUI_HOST_INTERFACE_MODE : Set host interface mode
-**             byte 0,1        : length
-**             byte 2                  : command code 0x33
-**             byte 3                  : 0->Independent, 1->cluster
-**      GUI_REBUILD_PRIORITY : Set rebuild priority
-**             byte 0,1        : length
-**             byte 2                  : command code 0x34
-**             byte 3                  : 0/1/2/3 (low->high)
-**      GUI_MAX_ATA_MODE : Set maximum ATA mode to be used
-**             byte 0,1        : length
-**             byte 2                  : command code 0x35
-**             byte 3                  : 0/1/2/3 (133/100/66/33)
-**      GUI_RESET_CONTROLLER : Reset Controller
-**             byte 0,1        : length
-**             byte 2          : command code 0x36
-**                            *Response with VT100 screen (discard it)
-**      GUI_COM_PORT_SETTING : COM port setting
-**             byte 0,1        : length
-**             byte 2                  : command code 0x37
-**             byte 3                  : 0->COMA (term port),
-**                                       1->COMB (debug port)
-**             byte 4                  : 0/1/2/3/4/5/6/7
-**                     (1200/2400/4800/9600/19200/38400/57600/115200)
-**             byte 5                  : data bit
-**                                     (0:7 bit, 1:8 bit : must be 8 bit)
-**             byte 6                  : stop bit (0:1, 1:2 stop bits)
-**             byte 7                  : parity (0:none, 1:off, 2:even)
-**             byte 8                  : flow control
-**                     (0:none, 1:xon/xoff, 2:hardware => must use none)
-**      GUI_NO_OPERATION : No operation
-**             byte 0,1        : length
-**             byte 2          : command code 0x38
-**      GUI_DHCP_IP : Set DHCP option and local IP address
-**             byte 0,1        : length
-**             byte 2          : command code 0x39
-**             byte 3          : 0:dhcp disabled, 1:dhcp enabled
-**             byte 4/5/6/7    : IP address
-**      GUI_CREATE_PASS_THROUGH : Create pass through disk
-**             byte 0,1        : length
-**             byte 2                  : command code 0x40
-**             byte 3                  : device #
-**             byte 4                  : scsi channel (0/1)
-**             byte 5                  : scsi id (0-->15)
-**             byte 6                  : scsi lun (0-->7)
-**             byte 7                  : tagged queue (1 : enabled)
-**             byte 8                  : cache mode (1 : enabled)
-**             byte 9                  : max speed (0/1/2/3/4,
-**                     async/20/40/80/160 for scsi)
-**                     (0/1/2/3/4, 33/66/100/133/150 for ide  )
-**      GUI_MODIFY_PASS_THROUGH : Modify pass through disk
-**             byte 0,1        : length
-**             byte 2                  : command code 0x41
-**             byte 3                  : device #
-**             byte 4                  : scsi channel (0/1)
-**             byte 5                  : scsi id (0-->15)
-**             byte 6                  : scsi lun (0-->7)
-**             byte 7                  : tagged queue (1 : enabled)
-**             byte 8                  : cache mode (1 : enabled)
-**             byte 9                  : max speed (0/1/2/3/4,
-**                                     async/20/40/80/160 for scsi)
-**                     (0/1/2/3/4, 33/66/100/133/150 for ide  )
-**      GUI_DELETE_PASS_THROUGH : Delete pass through disk
-**             byte 0,1        : length
-**             byte 2          : command code 0x42
-**             byte 3          : device# to be deleted
-**      GUI_IDENTIFY_DEVICE : Identify Device
-**             byte 0,1        : length
-**             byte 2          : command code 0x43
-**             byte 3          : Flash Method
-**                             (0:flash selected, 1:flash not selected)
-**             byte 4/5/6/7    : IDE device mask to be flashed
-**                           note .... no response data available
-**     GUI_CREATE_RAIDSET : Create Raid Set
-**             byte 0,1        : length
-**             byte 2          : command code 0x50
-**             byte 3/4/5/6    : device mask
-**             byte 7-22       : raidset name (if byte 7 == 0:use default)
-**      GUI_DELETE_RAIDSET : Delete Raid Set
-**             byte 0,1        : length
-**             byte 2          : command code 0x51
-**             byte 3          : raidset#
-**     GUI_EXPAND_RAIDSET : Expand Raid Set
-**             byte 0,1        : length
-**             byte 2          : command code 0x52
-**             byte 3          : raidset#
-**             byte 4/5/6/7    : device mask for expansion
-**             byte 8/9/10     : (8:0 no change, 1 change, 0xff:terminate,
-**                             9:new raid level,
-**                             10:new stripe size
-**                             0/1/2/3/4/5->4/8/16/32/64/128K )
-**             byte 11/12/13   : repeat for each volume in the raidset
-**      GUI_ACTIVATE_RAIDSET : Activate incomplete raid set
-**             byte 0,1        : length
-**             byte 2          : command code 0x53
-**             byte 3          : raidset#
-**      GUI_CREATE_HOT_SPARE : Create hot spare disk
-**             byte 0,1        : length
-**             byte 2          : command code 0x54
-**             byte 3/4/5/6    : device mask for hot spare creation
-**     GUI_DELETE_HOT_SPARE : Delete hot spare disk
-**             byte 0,1        : length
-**             byte 2          : command code 0x55
-**             byte 3/4/5/6    : device mask for hot spare deletion
-**     GUI_CREATE_VOLUME : Create volume set
-**             byte 0,1        : length
-**             byte 2          : command code 0x60
-**             byte 3          : raidset#
-**             byte 4-19       : volume set name
-**                             (if byte4 == 0, use default)
-**             byte 20-27      : volume capacity (blocks)
-**             byte 28                 : raid level
-**             byte 29                 : stripe size
-**                             (0/1/2/3/4/5->4/8/16/32/64/128K)
-**             byte 30                 : channel
-**             byte 31                 : ID
-**             byte 32                 : LUN
-**             byte 33                 : 1 enable tag
-**             byte 34                 : 1 enable cache
-**             byte 35                 : speed
-**             (0/1/2/3/4->async/20/40/80/160 for scsi)
-**             (0/1/2/3/4->33/66/100/133/150 for IDE  )
-**             byte 36                 : 1 to select quick init
-**
-**     GUI_MODIFY_VOLUME : Modify volume Set
-**             byte 0,1        : length
-**             byte 2          : command code 0x61
-**             byte 3          : volumeset#
-**             byte 4-19       : new volume set name
-**             (if byte4 == 0, not change)
-**             byte 20-27      : new volume capacity (reserved)
-**             byte 28                 : new raid level
-**             byte 29                 : new stripe size
-**             (0/1/2/3/4/5->4/8/16/32/64/128K)
-**             byte 30                 : new channel
-**             byte 31                 : new ID
-**             byte 32                 : new LUN
-**             byte 33                 : 1 enable tag
-**             byte 34                 : 1 enable cache
-**             byte 35                 : speed
-**             (0/1/2/3/4->async/20/40/80/160 for scsi)
-**             (0/1/2/3/4->33/66/100/133/150 for IDE  )
-**     GUI_DELETE_VOLUME : Delete volume set
-**             byte 0,1        : length
-**             byte 2          : command code 0x62
-**             byte 3          : volumeset#
-**     GUI_START_CHECK_VOLUME : Start volume consistency check
-**             byte 0,1        : length
-**             byte 2          : command code 0x63
-**             byte 3          : volumeset#
-**     GUI_STOP_CHECK_VOLUME : Stop volume consistency check
-**             byte 0,1        : length
-**             byte 2          : command code 0x64
-** ---------------------------------------------------------------------
-**    4. Returned data
-** ---------------------------------------------------------------------
-**     (A) Header          : 3 bytes sequence (0x5E, 0x01, 0x61)
-**     (B) Length          : 2 bytes
-**                     (low byte 1st, excludes length and checksum byte)
-**     (C) status or data  :
-**           <1> If length == 1 ==> 1 byte status code
-**             #define GUI_OK                    0x41
-**             #define GUI_RAIDSET_NOT_NORMAL    0x42
-**             #define GUI_VOLUMESET_NOT_NORMAL  0x43
-**             #define GUI_NO_RAIDSET            0x44
-**             #define GUI_NO_VOLUMESET          0x45
-**             #define GUI_NO_PHYSICAL_DRIVE     0x46
-**             #define GUI_PARAMETER_ERROR       0x47
-**             #define GUI_UNSUPPORTED_COMMAND   0x48
-**             #define GUI_DISK_CONFIG_CHANGED   0x49
-**             #define GUI_INVALID_PASSWORD      0x4a
-**             #define GUI_NO_DISK_SPACE         0x4b
-**             #define GUI_CHECKSUM_ERROR        0x4c
-**             #define GUI_PASSWORD_REQUIRED     0x4d
-**           <2> If length > 1 ==>
-**             data block returned from controller
-**             and the contents depends on the command code
-**     (E) Checksum        : checksum of length and status or data byte
-**************************************************************************