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