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