요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
===================
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
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
IOP331 관점의 Doorbell과 Index Memory
1-45이 규격은 Areca RAID controller의 IOP331 adapter가 host driver와 통신하는 firmware interface를 정의한다. 문서에서 inbound와 outbound는 모두 IOP331 관점이다. Message 0은 InitThread message와 반환 code를 전달하고 Doorbell bit는 RS-232 emulation buffer의 생산·소비 상태를 알린다.
`inDoorBell.bit0`은 driver가 입력 data를 썼음을, `bit1`은 driver가 출력 data를 읽었음을 뜻한다. 반대로 `outDooeBell.bit0`은 IOP331 출력 data 준비, `bit1`은 IOP331이 입력 data를 읽었음을 뜻한다. 원문의 `outDooeBell`과 `zDRIVER` 표기는 그대로 보존했다.
Index Memory에서 `0xf00`은 RS232 request 출력 buffer, `0xe00`은 RS232 입력 scratch buffer다. `0xa00`은 `message_rwbuffer`이며 inbound일 때 driver에서 IOP331으로, outbound일 때 IOP331에서 driver로 이동한다.
IOP331 관점의 완료 신호입니다.
고정 offset별 buffer 용도입니다.
===================
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)
============ ==========================================
RS-232 buffer, PostQ와 BIOS request
46-120RS-232 emulation은 128-byte buffer를 쓴다. 첫 `uint32_t`가 1~124 범위의 data length이고 byte 4~127에 최대 124-byte payload를 둔다.
모든 SCSI command는 inbound PostQ로 보낸다. Request frame은 32-byte 정렬이어야 하며 queue word의 bit 0~26에는 `arcmsr_cdb` 실제 주소를, bit 27~31에는 flag를 싣는다. `bit31=0`은 256-byte frame, `1`은 512-byte frame이고 `bit30=0`은 normal, `1`은 BIOS request다. Bit 27~29는 reserved다.
Outbound queue reply도 bit 0~26으로 reply `arcmsr_cdb` 주소를 돌려준다. 이 reply 형식에서 bit31은 0이고 bit30은 BIOS handshake용이다. `bit28=0`이면 성공이므로 `AdapStatus`, `DevStatus`, `SenseData`를 무시하고, `bit28=1`이면 세 영역에서 error를 읽는다.
BIOS request의 내용은 PostQ request와 같지만 configuration space를 쓴다. Offset `0x78`에 bit30이 설정된 Request Frame을 두고 write-only offset `0x18`에 써서 IOP331 IRQ를 발생시킨다. Completion은 bit30을 0으로 돌리고 bit28을 error flag로 사용한다.
상위 flag와 하위 주소를 구분합니다.
오류와 BIOS handshake를 해석합니다.
Configuration space 예외 경로입니다.
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)
SGL 자리와 Message 0 code
121-182원문은 SGL entry 구조와 Message1 outbound diagnostic status code를 제목만 남기고 내용을 정의하지 않는다. 구현에서 빈 절을 임의로 보완하지 말고 firmware revision별 header를 확인해야 한다.
Message 0 code는 `0x00` NOP, `0x01` Get Config, `0x02` Set Config, `0x03` queued command 전체 reset, `0x04` background activity 정지, `0x05` cache flush, `0x06` background activity 재시작, `0x07` host command pending 확인, `0x08` controller time 설정이다.
Get Config는 outbound `0xa00`에서 signature `0x87974060`, request length `0x200`, queue 수 `0x100`, SDRAM 크기, IDE channel 수, vendor·model·firmware 문자열, device map과 `FirmwareVersion` DWORD를 반환한다. 마지막 값은 새 firmware capability 판별용이다.
Set Config는 inbound `0xa00`으로 signature `0x87974063`과 driver 전용 Request Frame 상위 32bit를 보낸다. Controller time packet은 `0xaa 0x55` signature 뒤에 year, month 1~12, date 1~31, hour 0~23, minute와 second 0~59를 둔다.
Firmware control code와 data 방향입니다.
고정 signature 뒤의 capability입니다.
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 command frame과 권한 범위
183-280Areca low-level command interface는 VT100 terminal과 상호 배타적이다. Transaction은 3-byte header `0x5E, 0x01, 0x61`, 가변 command block, 가변 return data 순서다.
Command block의 byte 0과 1은 little-endian length이며 이 두 byte 자체는 길이에서 제외된다. 길이는 2040 byte를 넘을 수 없다. Byte 2는 command code, byte 3 이후는 command별 data, 마지막 byte는 첫 length byte부터 마지막 data byte까지 더한 checksum이다.
`0x10`대 system-level command는 password를 검사하지 않으므로 end-user tool에 직접 노출하지 말고 별도로 통제된 utility에서 구현해야 한다. `0x20` 이상 command는 password를 항상 검사하며 먼저 password를 입력해 활성화해야 한다.
Enum은 OEM·identity·event `0x10`대, 조회 `0x20`대, controller 설정 `0x30`대, pass-through `0x40`대, RAID set `0x50`대, volume `0x60`대로 나뉜다. 제거된 `GUI_QUICK_CREATE` 주석과 실제 `GUI_GET_INFO_R=0x20` 재사용을 혼동하지 않는다.
Length와 checksum 범위입니다.
관리 대상과 인증 정책입니다.
Frame 처리 순서입니다.
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
};
OEM, 인증, event와 hardware monitor
281-413`GUI_SET_SERIAL(0x10)`은 password length `0x0f`, token `ArEcATecHnoLogY`, 16-byte serial을 받는다. `GUI_SET_VENDOR(0x11)`과 `GUI_SET_MODEL(0x12)`은 length `0x08`과 token `ArEcAvAr` 뒤에 각각 40-byte vendor, 8-byte model을 둔다.
`GUI_IDENTIFY(0x13)`은 `Areca RAID Subsystem ` 문자열을 반환한다. `GUI_CHECK_PASSWORD(0x14)`는 byte 3 길이만큼 password를 검사하고 `GUI_LOGOUT(0x15)`은 다음 command부터 검사를 강제한다. `GUI_HTTP(0x16)`은 HTTP proxy용 reserved interface다.
`GUI_SET_ETHERNET_ADDR(0x17)`은 OEM token 뒤에 6-byte MAC을 둔다. `GUI_SET_LOGO(0x18)`는 page 0~3과 magic `55 aa a5 5a`, page당 2000-byte `TITLE.JPG`를 전송한다. Page `0xff`는 logo를 지우며 page 0의 첫 2 byte는 실제 JPG 길이다.
`GUI_POLL_EVENT(0x19)`는 log 변경 여부를 확인하고 `GUI_GET_EVENT(0x1a)`는 page 0~3을 읽는다. `GUI_GET_HW_MONITOR(0x1b)` 응답은 fan·voltage·temperature·power 개수, RPM, voltage 원값과 측정값, 온도, power bit, UPS indicator 순서다.
고정 크기와 역할입니다.
예시 byte 배치입니다.
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
================ =============================================
RAID·volume·drive·system 정보 구조체
414-579제거된 `GUI_QUICK_CREATE`는 capacity, RAID level, stripe, spare, device mask를 받았지만 application은 `GUI_CREATE_RAIDSET`과 `GUI_CREATE_VOLUMESET` 조합을 사용해야 한다.
`GUI_GET_INFO_R(0x20)`은 `sGUI_RAIDSET`을 읽는다. 16-byte 이름, capacity, fail mask, 32개 device 배열, 현재·새 member 수, state, volume 수와 목록, free segment, raw stripe 8개와 reserved DWORD를 포함해 총 128 byte다.
`GUI_GET_INFO_V(0x21)`의 64-byte `sGUI_VOLUMESET`은 이름, 현재·확장 capacity, fail·stripe의 현재와 새 값, status, progress, `sSCSI_ATTR`, member 수·RAID level의 현재와 새 값, 소속 RAID set 번호를 담는다.
`GUI_GET_INFO_P(0x22)`의 128-byte `sGUI_PHY_DRV`는 40-byte model, 20-byte serial, 8-byte firmware, capacity, device·PIO·UDMA 상태, drive select, 소속 RAID 번호와 `sSCSI_ATTR`을 담는다. 소속 set이 없으면 `gpdRaidNumber=0xff`다.
`GUI_GET_INFO_S(0x23)`의 `sSYSTEM_INFO`에는 식별 문자열, local/current IP, tick·CPU·cache·memory·event 값, MAC, DHCP·beeper·ATA·ECC·rebuild 설정, 두 `sCOM_ATTR`, channel 수, 최대 volume/RAID set, Ethernet·RAID6 capability가 있다. `GUI_CLEAR_EVENT(0x24)`는 system event를 지운다.
Index와 반환 구조입니다.
Field를 기능별로 묶습니다.
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;
Beeper, password, interface와 통신 설정
580-685`GUI_CLEAR_EVENT(0x24)`는 event를 지운다. `GUI_MUTE_BEEPER(0x30)`는 현재 beeper만 음소거하고 `GUI_BEEPER_SETTING(0x31)`은 byte 3의 0/1로 비활성화·활성화한다.
`GUI_SET_PASSWORD(0x32)`는 최대 15자의 영숫자 password를 설정한다. `GUI_HOST_INTERFACE_MODE(0x33)`은 0 independent, 1 cluster이고 `GUI_REBUILD_PRIORITY(0x34)`는 0~3 low-to-high다. `GUI_MAX_ATA_MODE(0x35)`의 0~3은 133/100/66/33이다.
`GUI_RESET_CONTROLLER(0x36)` 응답의 VT100 화면은 버린다. `GUI_COM_PORT_SETTING(0x37)`은 COMA terminal 또는 COMB debug, 1200~115200 baud, data·stop bit, parity, flow control을 설정한다. Data는 반드시 8bit, flow control은 none을 써야 한다.
`GUI_NO_OPERATION(0x38)`은 상태 변화가 없다. `GUI_DHCP_IP(0x39)`는 byte 3으로 DHCP를 끄거나 켜고 byte 4~7에 local IPv4 address를 둔다.
Selector와 허용 값입니다.
고정 제약을 포함합니다.
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
================ =============================================
Pass-through disk와 device 식별
686-739`GUI_CREATE_PASS_THROUGH(0x40)`과 `GUI_MODIFY_PASS_THROUGH(0x41)`은 같은 payload를 쓴다. Byte 3은 device, 4는 SCSI channel 0/1, 5는 ID 0~15, 6은 LUN 0~7, 7은 tagged queue, 8은 cache, 9는 최대 속도다.
속도 selector 0~4는 SCSI에서 async/20/40/80/160이고 IDE에서는 33/66/100/133/150이다. 같은 숫자를 interface 종류 없이 해석하면 안 된다.
`GUI_DELETE_PASS_THROUGH(0x42)`는 byte 3 device를 삭제한다. `GUI_IDENTIFY_DEVICE(0x43)`은 byte 3에서 0이면 선택 device를 flash하고 1이면 선택하지 않으며 byte 4~7의 IDE mask를 쓴다. Response data는 없다.
Create와 modify의 공통 layout입니다.
동작을 구분합니다.
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
================ =============================================
RAID set 확장과 hot spare
740-800`GUI_CREATE_RAIDSET(0x50)`은 byte 3~6 device mask와 byte 7~22 이름으로 set을 만든다. 이름 첫 byte가 0이면 기본값이다. `GUI_DELETE_RAIDSET(0x51)`과 `GUI_ACTIVATE_RAIDSET(0x53)`은 byte 3의 raidset 번호를 삭제하거나 incomplete set을 활성화한다.
`GUI_EXPAND_RAIDSET(0x52)`은 raidset 번호, 확장 mask, volume별 3-byte tuple을 받는다. 첫 byte는 0 유지, 1 변경, `0xff` 종료이고 다음은 새 RAID level, 마지막은 stripe selector 0~5, 즉 4/8/16/32/64/128K다. Byte 11부터 각 volume에 반복한다.
`GUI_CREATE_HOT_SPARE(0x54)`와 `GUI_DELETE_HOT_SPARE(0x55)`는 byte 3~6 mask의 disk를 hot spare로 만들거나 해제한다.
Selector와 payload입니다.
Volume tuple 순회입니다.
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
================ =============================================
Volume 생성·수정·삭제와 consistency check
801-873`GUI_CREATE_VOLUME(0x60)`은 raidset 번호, 16-byte 이름, byte 20~27 block capacity, RAID level, stripe, channel·ID·LUN, tag·cache, interface별 speed, quick initialization flag를 받는다. 이름 첫 byte가 0이면 기본 이름이다.
`GUI_MODIFY_VOLUME(0x61)`은 volumeset 번호와 새 속성을 같은 위치에 둔다. 이름 첫 byte가 0이면 유지하고 capacity field는 reserved다. RAID level, stripe, channel, ID, LUN, tag, cache, speed를 갱신한다.
Stripe selector 0~5는 4/8/16/32/64/128K다. Speed 0~4는 SCSI에서 async/20/40/80/160, IDE에서 33/66/100/133/150이다.
`GUI_DELETE_VOLUME(0x62)`는 지정 volumeset을 삭제한다. `GUI_START_CHECK_VOLUME(0x63)`은 consistency check를 시작하고 `GUI_STOP_CHECK_VOLUME(0x64)`은 진행 중인 check를 중지한다.
생명 주기와 검사입니다.
Field 범위입니다.
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
================ =============================================
Return frame과 GUI status code
874-908응답은 request와 같은 header `0x5E, 0x01, 0x61`로 시작한다. 다음 2 byte는 low-byte 우선 length이며 length와 checksum byte 자체는 길이에서 제외한다.
Length가 1이면 payload는 status code다. `GUI_OK(0x41)`부터 RAID·volume 상태 이상, object 부재, parameter·command·password·space·checksum error와 password required를 `0x42`~`0x4d`로 표현한다. Length가 1보다 크면 command별 data block이다.
마지막 checksum은 length와 status 또는 data byte를 대상으로 계산한다. Parser는 header, length, payload 종류, checksum 순서로 검증한 뒤 status를 상위 error로 변환한다.
단일-byte 반환 code 전체입니다.
Length에 따라 payload를 구분합니다.
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
요약·해설
arcmsr_spec.rst:1-908Areca IOP331 firmware와 Linux arcmsr driver 사이의 queue, register, 관리 protocol을 byte와 bit 위치까지 추적하는 규격입니다.